#include <lib.h>
#include <medium.h>
#include <daemons.h>
#include <position.h>
#include "include/swim.h"

inherit LIB_VERB;

static void create() {
    verb::create();
    SetVerb("swim");
    SetRules("", "STR", "into STR");
    SetErrorMessage("Swim in which direction?");
    SetHelp("Syntax: <swim DIRECTION>\n"
            "        <swim into PLACE>\n\n"
            "Moves you towards the direction you specify, or into the place "
            "you specify.  The command \"swim into\" is synonymous with the "
            "\"enter\" command.\n\n"  
            "See also: fly, climb, enter, go, jump");
}

int StaminaCost(){
    int cost = 20;
    int bonus = this_player()->GetStatLevel("durability")/10;
    bonus += this_player()->GetStatLevel("strength")/20;
    bonus += this_player()->GetFood()/40;
    bonus += this_player()->GetDrink()/40;
    cost -= bonus;
    if(cost < 1) cost = 1;
    return cost;
}

mixed can_swim() {
    object env = environment(this_player());

    if( !env ) {
        return "You are nowhere to begin with!";
    }

    if(this_player()->GetPosition() == POSITION_SWIMMING) 
        return "You are already swimming.";

    if(env->CanSwim(this_player())) return this_player()->CanSwim();

    return "You can't swim here.";
}

mixed can_swim_str(string str) {
    object env = environment(this_player());
    int envpos = env->GetPosition();
    if( !env ) {
        return "You are nowhere.";
    }
    if( (int)this_player()->GetStaminaPoints() < 15 ){
        return "You are too tired to swim anywhere right now.";
    }
    if(env->CanSwim(this_player(), str)){
        if(envpos == POSITION_SWIMMING) return 1;
        return this_player()->CanSwim();
    }
    if(this_player()->GetPosition() != POSITION_SWIMMING &&
            envpos != POSITION_SWIMMING){
        return "You are not swimming.";
    }
    return 0;
}

mixed can_swim_into_str(string str) {
    object env = environment(this_player());
    int envpos = env->GetPosition();
    if( !env ) {
        return "You are nowhere.";
    }
    if( (int)this_player()->GetStaminaPoints() < 3 )
        return "You are too tired right now.";
    if((mixed)environment(this_player())->CanEnter(this_player(), str)){
        if(envpos == POSITION_SWIMMING) return 1;
        return this_player()->CanSwim();
    }
    if(this_player()->GetPosition() != POSITION_SWIMMING &&
            envpos != POSITION_SWIMMING){
        return "You are not swimming.";
    }
    return 0;
}

mixed do_swim() {
    return this_player()->eventSwim();
}

mixed do_swim_str(string str) {
    this_player()->AddStaminaPoints(-StaminaCost());
    return (mixed)environment(this_player())->eventGo(this_player(), str);
}

mixed do_swim_into_str(string str) {
    this_player()->AddStaminaPoints(-StaminaCost());
    return (mixed)environment(this_player())->eventEnter(this_player(), str);
}
