/* shadow dla wilkolakow
 * by: Levis
 */

inherit "/std/guild/guild_occ_sh.c";
inherit "/cmd/std/command_driver.c";
#include "defs.h"

private int slash;
private int ktory_cios;
private int rage;
private int cast_spell;
static int heal_alarm_id;
       int heal_times;


void
garou_healing()
{
	shadow_who->heal_hp(F_HEAL_FORMULA(shadow_who->query_stat(SS_CON) + shadow_who->query_skill(SS_GAROU_CZARY) + shadow_who->query_stat(SS_OCCUP) / 2, 100));
//	shadow_who->catch_msg("Twe cialo zdaje sie regenerowac!\n");
	heal_times -= 1;
	if(!heal_times)
	{
		remove_alarm(heal_alarm_id);
		shadow_who->catch_msg("Czujesz iz krew w twych zylach plynie duzo wolniej niz przedtem..\n");
	}
}

int
query_heal()
{
	if(heal_times) return 1;
	return 0;
}


// tutaj i bedzie czasem przez jaki sie leczymy, podane w minutach
void
set_heal(int i)
{
	heal_times = i*10;
	heal_alarm_id = set_alarm(2.0, 2.0, &garou_healing());
}


void
set_cast(int i)
{
	cast_spell = i;
}

int
query_cast()
{
	return cast_spell;
}

void
set_rage(int i)
{
	rage = i;
}

int
query_rage()
{
	return rage;
}


void
set_slash(int i)
{
	slash = i;
}

int
query_slash()
{
	return slash;
}

int
query_cios()
{
	return ktory_cios;
}


int
query_garou()
{
	return 1;
}

// badziewia

public mixed
query_guild_trainer_race()
{
    return GUILD_TRAIN;
}

int
query_guild_tax_race()
{
    return GUILD_RACE_TAX;
}

string
query_guild_name_race()
{
    return GUILD_RACE_NAME;
}

string
query_guild_style_race()
{
    return GUILD_STYLE;
}

public mixed
query_guild_trainer_lay()
{
    return GUILD_TRAIN;
}

int
query_guild_tax_lay()
{
    return GUILD_LAY_TAX;
}

string
query_guild_name_lay()
{
    return GUILD_LAY_NAME;
}

string
query_guild_style_lay()
{
    return GUILD_STYLE;
}

public mixed
query_guild_trainer_occ()
{
    return GUILD_TRAIN;
}

int
query_guild_tax_occ()
{
    return GUILD_OCC_TAX;
}

string
query_guild_name_occ()
{
    return GUILD_OCC_NAME;
}

string
query_guild_style_occ()
{
    return GUILD_STYLE;
}

int
query_guild_not_allow_join_occ(object player, string type,string style, string name)
{
    return ::query_guild_not_allow_join_occ(player, type, style, name);
}

// przechodzimy do hardcore

/* Funkcja przydatna do znalezenia broni przeciwnika */
mixed
query_wep(object wielder)
{
    object right,left,both;

    right = wielder->query_weapon(W_RIGHT);
    left  = wielder->query_weapon(W_LEFT);
    both = wielder->query_weapon(W_BOTH);

    if (objectp(both))
        return both;

    if (objectp(right))
        return right;
    if (objectp(left))
        return left;

    return 0;
}

static void
tell_watcher(string str, object enemy)
{
   object me,*ob;
   int i;

   me = shadow_who;
   ob = FILTER_LIVE(all_inventory(environment(me))) - ({ me });
   ob -= ({ enemy });
   for (i = 0; i < sizeof(ob); i++)
   if (!ob[i]->query_option(OPT_BLOOD) && CAN_SEE_IN_ROOM(ob[i]))
      {
      if (CAN_SEE(ob[i], me))
         ob[i]->catch_msg(str);
      else
         tell_object(ob[i], "Ktos trafil kogos.\n");
   }
}

void
remove_garou_shadow(object kogo)
{
    kogo->remove_autoshadow(MASTER_SH);
    MASTER_ENG->dodaj_do_wyjebania(kogo);
    MASTER_ENG->logowanie(kogo);
}

static int
query_guild_keep_player(object shadow_who)
{
    setuid();
    seteuid(getuid());

    if(MASTER_ENG->query_wypierdol(shadow_who))
    {
        set_alarm(2.0, 0.0, &remove_garou_shadow(shadow_who));

        return 1;
    }

    if(!MASTER_ENG->query_czlonek(shadow_who))
    {
        remove_garou_shadow(shadow_who);
        return 0;
    }
    MASTER_ENG->logowanie(shadow_who);
    return 1;
}

public string
query_guild_title_occ()
{
    string title;

    setuid();
    seteuid(getuid());

    return MASTER_ENG->query_title(shadow_who);
}

void
add_soul()
{
    object item;

    setuid();
    seteuid(getuid());

    shadow_who->add_cmdsoul(MASTER_SOUL);
    shadow_who->update_hooks();
/*
    if (!present("garou_guild_item", shadow_who))
    {
        item = clone_object(MASTER_ITEM);
        item->move(shadow_who);
    }
*/
}


public int
prevent_enter(object ob)
{
        if(this_player() != shadow_who)
        {
            if(interactive(this_player()))
            {
                write("Nie wydaje ci sie by to bylo dobrym pomyslem.\n");
                return 1;
            }
        }

        if(((function_exists("create_object", ob) == "/std/armour") ||
           (function_exists("create_object", ob) == "/std/weapon") )&& MASTER_OB(ob) != "/d/Imperium/obj/gem")
        {
            write("Nie utrzymasz tego w swych lapach.\n");

            return 1;
        }

    return shadow_who->prevent_enter(ob);
}



/// to co tygryski lubia
public string
cr_attack_desc(int aid)
{
	if(shadow_who->query_prop(GAROU_CLAWS_BLESS) > 90)
	switch(aid)
    {
        case W_RIGHT:return ("adamantytowymi pazurami prawej lapy");
        case W_LEFT:return ("adamantytowymi pazurami lewej lapy");
        case W_BOTH:return "atakujac jednoczesnie obiema lapami";
        case W_FOOTR:return ("prawa lapa");
        case W_FOOTL:return ("lewa lapa");
    }
	if(shadow_who->query_prop(GAROU_CLAWS_BLESS) > 75)
	switch(aid)
    {
        case W_RIGHT:return ("mithrylowymi pazurami prawej lapy");
        case W_LEFT:return ("mithrylowymi pazurami lewej lapy");
        case W_BOTH:return "atakujac jednoczesnie obiema lapami";
        case W_FOOTR:return ("prawa lapa");
        case W_FOOTL:return ("lewa lapa");
    }
	if(shadow_who->query_prop(GAROU_CLAWS_BLESS) > 55)
	switch(aid)
    {
        case W_RIGHT:return ("srebrnymi pazurami prawej lapy");
        case W_LEFT:return ("srebrnymi pazurami lewej lapy");
        case W_BOTH:return "atakujac jednoczesnie obiema lapami";
        case W_FOOTR:return ("prawa lapa");
        case W_FOOTL:return ("lewa lapa");
    }
	switch(aid)
    {
        case W_RIGHT:return ("pazurami prawej lapy");
        case W_LEFT:return ("pazurami lewej lapy");
        case W_BOTH:return "atakujac jednoczesnie obiema lapami";
        case W_FOOTR:return ("prawa lapa");
        case W_FOOTL:return ("lewa lapa");
    }
    return shadow_who->cr_attack_desc(aid);
}


public void
cr_reset_attack(int aid)
{
        int wchit, wcpen, uskill, claws_bonus;
        claws_bonus = (shadow_who->query_prop(GAROU_CLAWS_BLESS) /3 * 2 );

        if (!sizeof(shadow_who->query_ua_attack(aid)))
        {
            wchit = W_HAND_HIT;
            wcpen = W_HAND_PEN;

            if (uskill = shadow_who->query_skill(SS_UNARM_COMBAT))
            {
                wchit += F_UNARMED_HIT(uskill, shadow_who->query_stat(SS_DEX));
                wcpen += F_UNARMED_PEN(uskill, shadow_who->query_stat(SS_STR));
            }

            if (uskill < 1)
                uskill = -1;

            switch(aid)
            {
            case W_RIGHT:
                (shadow_who->query_combat_object())->cb_add_attack(wchit+5, wcpen+10+claws_bonus, W_SLASH, 15, aid, uskill + 6);
                break;
            case W_LEFT:
                (shadow_who->query_combat_object())->cb_add_attack(wchit+5, wcpen+10+claws_bonus, W_SLASH, 15, aid, uskill + 6);
                break;
            case W_BOTH:
                (shadow_who->query_combat_object())->cb_add_attack(0, 0, W_SLASH, 0, aid, uskill + 6);
                break;
            case W_FOOTR:
                (shadow_who->query_combat_object())->cb_add_attack(wchit, wcpen, W_BLUDGEON, 15, aid, uskill);
                break;
            case W_FOOTL:
                (shadow_who->query_combat_object())->cb_add_attack(wchit, wcpen, W_BLUDGEON, 15, aid, uskill);
                break;
            }
        }
}

wield(object wep)
{
    return "Nie mozesz dobyc " + wep->query_short() + " w swych lapach!\n";
}

/* Bonus do AC
 * MAX:
 *       pokryte srebrzysta sierscia cialo
 *       pokryte nadzwyczaj twarda skora cialo
 * MIN:
 */


public void
cr_reset_hitloc(int hid)
{
	int ac_bless_bonus;
	ac_bless_bonus = shadow_who->query_prop(GAROU_DEFENCE_BLESS) / 2;

 if(ac_bless_bonus >= 43)
 {
    if (!sizeof(shadow_who->query_ua_hitloc(hid)))
        {
            switch(hid)
            {
            case A_HEAD:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 15, "pokryta srebrzysta sierscia wilcza glowe", hid);
                break;
            case A_L_ARM:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 0, "lewe ramie", hid);
                break;
            case A_R_ARM:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 0, "prawe ramie", hid);
                break;
            case A_TORSO:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 85, "pokryte srebrzysta sierscia cialo", hid);
                break;
            case A_LEGS:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 0, "nogi", hid);
                break;
            }
       }
 }
 else if(ac_bless_bonus >= 25 && ac_bless_bonus < 43)
 {
    if (!sizeof(shadow_who->query_ua_hitloc(hid)))
        {
            switch(hid)
            {
            case A_HEAD:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 15, "pokryta nadzwyczaj twarda skora wilcza glowe", hid);
                break;
            case A_L_ARM:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 0, "lewe ramie", hid);
                break;
            case A_R_ARM:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 0, "prawe ramie", hid);
                break;
            case A_TORSO:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 85, "pokryte nadzwyczaj twarda skora cialo", hid);
                break;
            case A_LEGS:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 0, "nogi", hid);
                break;
            }
       }
 }
 else
 {
    if (!sizeof(shadow_who->query_ua_hitloc(hid)))
        {
            switch(hid)
            {
            case A_HEAD:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 15, "wilcza glowe", hid);
                break;
            case A_L_ARM:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 0, "lewe ramie", hid);
                break;
            case A_R_ARM:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 0, "prawe ramie", hid);
                break;
            case A_TORSO:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 85, "wlochate cialo", hid);
                break;
            case A_LEGS:
                (shadow_who->query_combat_object())->cb_add_hitloc(10 + ac_bless_bonus, 0, "nogi", hid);
                break;
            }
       }
 }
}


void
update_garou_form()
{
/*
        cr_reset_attack(W_LEFT);
        cr_reset_attack(W_RIGHT);
        cr_reset_attack(W_FOOTR);
        cr_reset_attack(W_FOOTL);
*/
        cr_reset_hitloc(A_HEAD);
        cr_reset_hitloc(A_L_ARM);
        cr_reset_hitloc(A_R_ARM);
        cr_reset_hitloc(A_TORSO);
        cr_reset_hitloc(A_LEGS);
}



/*
 * Function name:   query_not_attack_me
 * Description:     The intended victim may force a fail when attacked.
 *                  If fail, the cause must produce explanatory text himself.
 * Arguments:       who: The attacker
 *                  aid: The attack id
 * Returns:         True if the attacker fails hitting us, false otherwise.
 */
public int
query_not_attack_me(object who, int aid)
{
	int defence_skill, bless;
	int whole;
	int to_hit,	offence_skill;
	object bron_wroga;
	mixed result;
	object combat = who->query_combat_object();
    bron_wroga = query_wep(who);
    switch(bron_wroga->query_wt())
    {
		case W_POLEARM: offence_skill = who->query_skill(SS_WEP_POLEARM); break;
		case W_SWORD: offence_skill = who->query_skill(SS_WEP_SWORD); break;
		case W_CLUB: offence_skill = who->query_skill(SS_WEP_CLUB); break;
		case W_WARHAMMER: offence_skill = who->query_skill(SS_WEP_WARHAMMER); break;
		case W_KNIFE: offence_skill = who->query_skill(SS_WEP_KNIFE); break;
		default: offence_skill = who->query_skill(SS_UNARM_COMBAT); break;
	}

	defence_skill = shadow_who->query_skill(SS_DEFENCE);
	bless = shadow_who->query_prop("_garou_defence_bless");

	whole = defence_skill + bless;
	to_hit = (whole - offence_skill*1 + random(30) + random(100/3));
    result = combat->cb_tohit(-1, to_hit, bron_wroga->query_prop(OBJ_I_WEIGHT), who);
    if (result[0] > 0) return 0;
    if(objectp(bron_wroga))
    {
		shadow_who->catch_msg("Widzisz jak " + QIMIE(who, PL_MIA) + " wprowadza zbyt wolny cios "+
	                      bron_wroga->koncowka("swoim", "swoja") + " " + bron_wroga->query_short(PL_BIE) +
	                      " i odruchowo unikasz go zrecznie utrzymujac rownowage ciala.\n");
        who->catch_msg("Starasz sie uderzyc " + QIMIE(shadow_who, PL_DOP) + " " + bron_wroga->koncowka("swoim", "swoja") +
                       " " + bron_wroga->query_short(PL_BIE) + " lecz widzac ruchy swego wroga, zdajesz sobie sprawe ze "+
                       "bron twa nie dosiegnie celu. " + QCIMIE(shadow_who, PL_MIA) + " odruchowo unika twego zbyt powolnie "+
                       "zadanego ciosu.\n");
        tell_watcher(QCIMIE(who, PL_MIA) + " unosi " + bron_wroga->koncowka("swoj", "swoja") + " " + bron_wroga->query_short(PL_BIE) +
                 " wysoko ponad glowe i stara sie uderzyc " + QIMIE(shadow_who, PL_DOP) + " jednak " + shadow_who->koncowka("ten", "ta") +
                 " bez problemu unika zbyt wolno zadanego ciosu.\n", who);
	    return 1;
	}
	else
	{
		shadow_who->catch_msg(QCIMIE(who, PL_MIA) + " stara sie ciebie uderzyc jednak ku jego zaskoczeniu, bez problemu unikasz tego smiesznego ciosu.\n");
		who->catch_msg("Starasz sie uderzyc " + QIMIE(who, PL_DOP) + " jednak zbyt wolny cios, konczy sie unikiem twego wroga.\n");
		tell_watcher(QCIMIE(who, PL_MIA) + " stara sie uderzyc " + QIMIE(shadow_who, PL_DOP) + " jednak " + shadow_who->koncowka("ten", "ta") + " bez problemu unika ciosu.\n", who);
		return 1;
	}

}

public mixed
query_guild_skill_name(int type)
{
  if (type == SS_GAROU_SLASH) return "atak pazurami";
  if (type == SS_GAROU_SZAL)  return "szalenstwo";
  if (type == SS_GAROU_CZARY) return "szamanstwo";
}

public string
garou_stat()
{
	return MASTER_ENG->garou_stat(shadow_who->query_real_name());
}
