
inherit "/std/creature.c";
inherit "/std/combat/unarmed.c";

#include <pl.h>
#include <stdproperties.h>
#include <wa_types.h>
#include <macros.h>


void next_please();
void disappear();


void
create_creature()
{
    ustaw_odmiane_rasy(({"winorosl", "winorosli", "winorosli", "winorosl", 
                  "winorosla", "winorosli"}),
                ({"winorosle", "winorosli", "winoroslom", "winorosle",
                  "winoroslami", "winoroslach"}), PL_ZENSKI);
                  
    dodaj_przym ("paskudny", "paskudni");
    dodaj_przym ("zmutowany", "zmutowani");

    set_long ("Long.\n");
    
    set_stats(({60 + random(30), 40 + random(20), 60 + random(30), 
              10, 10, 130}));
    
    add_prop (NPC_I_NO_FEAR, 1);
    add_prop (NPC_I_NO_RUN_AWAY, 1);
    add_prop (OBJ_I_WEIGHT, 10000);
    add_prop (OBJ_I_VOLUME, 30000);
    add_prop (LIVE_I_NEVERKNOWN, 1);

        
    set_hitloc_unarmed (0, ({20, 20, 20}), 50, "lodyge");
    set_hitloc_unarmed (1, ({10, 10, 10}), 30, "liscie");
    set_hitloc_unarmed (2, ({5, 5, 5}), 20, "przyssawki");
}


mixed
hit_me(int wcpen, int dt, int tohit, object attacker, int attack_id, int target_hitloc = -1)
{
    /*
     * Przy innych typach obrazen niz ciete mialo nie byc w ogole obrazen...
     * ale wydalo mi sie to nierozsadne wiec postanowilem "zaledwie" zmniejszyc
     * wcpen przy innych broniach o 2/3.
     * Jest to z jednej strony bardziej fair, a z drugiej trudniejsze dla graczy
     * do rozgryzienia.
     */
    if (dt != W_SLASH)
    {
        return ::hit_me (wcpen / 3 , dt, tohit, attacker, attack_id, target_hitloc);
    }
    return ::hit_me (wcpen , dt, tohit, attacker, attack_id, target_hitloc);
}

/*
 * Ow monstrum zawsze wykonuje specjalny atak, polegajacy na duszeniu ofiary.
 * Komunikaty nie sa wyswietlone co runda, lecz po przekroczeniu, jakiegos
 * poziomu obrazen.
 */
int
special_attack(object ob)
{
    int hp_lev_bef, hp_lev_aft;

    switch ( (ob->query_hp() * 100) / ob->query_max_hp() )
    {
    case 0..6:
	hp_lev_bef = 0;
	break;
	
    case 7..15:
	hp_lev_bef = 1;
	break;

    case 16..25:
	hp_lev_bef = 2;
	break;

    case 26..37:
	hp_lev_bef = 3;
	break;

    case 38..50:
	hp_lev_bef = 4;
	break;

    case 51..64:
	hp_lev_bef = 5;
	break;

    case 65..70:
	hp_lev_bef = 6;
	break;

    case 71..90:
	hp_lev_bef = 7;
	break;

    default:
	hp_lev_bef = 8;
    }

    ob->hit_me(100, MAGIC_DT, 0, this_object(), -1, A_HEAD);

    if(ob->query_hp() == 0)
    {
	ob->catch_msg("Giniesz uduszony przez " + QIMIE(this_object(), PL_BIE) + 
		      ".\n");
	ob->tell_watcher(QCIMIE(ob, PL_MIA) + " ginie uduszony przez " + 
			 QIMIE(this_object(), PL_BIE) + ".\n");

	ob->do_die(this_object());

	set_alarm (3.0, 0.0, &next_please() );
	
	return 1;
    }

    switch ( (ob->query_hp() * 100) / ob->query_max_hp() )
    {
    case 0..6:
	hp_lev_aft = 0;
	break;
	
    case 7..15:
	hp_lev_aft = 1;
	break;

    case 16..25:
	hp_lev_aft = 2;
	break;

    case 26..37:
	hp_lev_aft = 3;
	break;

    case 38..50:
	hp_lev_aft = 4;
	break;

    case 51..64:
	hp_lev_aft = 5;
	break;

    case 65..70:
	hp_lev_aft = 6;
	break;

    case 71..90:
	hp_lev_aft = 7;
	break;

    default:
	hp_lev_aft = 8;
    }

    if ( hp_lev_bef > hp_lev_aft )
    {
	/*
	 * Opisy sa stopniowane od 0 - ledwo zywy, do 7 - praktycznie nietkniety
	 * Wszystkie powinny miec forme pierwszego.
	 */
	 switch ( hp_lev_aft )
	{
	case 0:
	    ob->catch_msg("Szybko tracisz sily i robi ci sie ciemno przed oczami.\n");
	    ob->tell_watcher(QCIMIE(ob, PL_MIA) + " szybko traci sily i nie pociagnie " +
			 "juz dlugo.\n");
	    break;
	    
	case 1:
	    ob->catch_msg("Przed oczami wiruja ci czerwone plamy. Zaczynasz miec juz dosc.\n");
	    ob->tell_watcher(QCIMIE(ob, PL_MIA) + " chyba zaczyna miec dosc, nie wyglada "+
	                    "najzdrowiej.\n");
	    break;

	case 2:
	    ob->catch_msg("Rozgladasz sie z przerazeniem naokolo, probujac ujrzec cos "
			+ "w nadchodzacym mroku przed oczyma.\n");
	    ob->tell_watcher(QCIMIE(ob, PL_MIA) + " rozglada sie naokolo z wyrazem okropnego "
			+ "przerazenia na twarzy.\n");
	    break;

	case 3:
	    ob->catch_msg("Juz nie zwracasz uwagi na otoczenie. W glowie "
			+ "pulsuje tylko jedna mysl: POWIETRZE!.\n");
	    ob->tell_watcher(QCIMIE(ob, PL_MIA) + " blednie jak sciana z braku powietrza.\n");
	    break;

	case 4:
	    ob->catch_msg("Zaczynasz odczuwac zawroty glowy. Coraz trudniej ci oddychac.\n");
	    ob->tell_watcher(QCIMIE(ob, PL_MIA) + " zaczyna ciezko i glosno oddychac.\n");
	    break;

	case 5:
	    ob->catch_msg("Slabosc powoli przechodzi w duze zmeczenie, ale nadal odczuwasz "
			+ "na sobie ow mocny nacisk winorosli.\n");
	    ob->tell_watcher(QCIMIE(ob, PL_MIA) + " zdaje sie byc bardzo zmeczony.\n");
	    break;

	case 6:
	    ob->catch_msg("Zaczynasz slabnac, a dlawiacy ucisk na szyi wcale nie ustaje.\n");
	    ob->tell_watcher(QCIMIE(ob, PL_MIA) + " zaczyna slabnac.\n");
	    break;

	case 7:
	    ob->catch_msg("Powoli zaczyna ci brakowac powietrza, ale to jeszcze "+
	                  "nic groznego.\n");
            ob->tell_watcher(QCIMIE(ob, PL_CEL) + " zaczyna powoli brakowac powietrza.\n"); 
	    break;

	default:
	    ob->catch_msg("Zglos laskawie blad w tej glupiej winorosli.\n");
	}
    }
    return 1;
}

void
next_please()
{
    object *inv = all_inventory ( environment() );
    int a, tmp = sizeof(inv);

    for ( a = 0 ; a < tmp ; a++ )
	if ( interactive (inv[a]) && !inv[a]->query_ghost() )
	{
	    inv[a]->catch_msg(QCIMIE(this_object(), PL_MIA) + " skonczywszy z " +
			      "jedna ofiara rzuca sie na ciebie!\n");
	    this_object()->attack_object ( inv[a] );
	    tell_room ( environment(), QCIMIE(this_object(), PL_MIA) +
			"skonczywszy z jedna ofiara rzuca sie na " + 
			QIMIE(inv[a], PL_BIE), inv[a] );
	    return;
	}

    set_alarm(10.0 + itof(random (10)), 0.0, &disappear() );
}

void
disappear()
{
    if (this_object()->query_attack())
	return;
    environment()->jest_winorosl();
    remove_object();
}
