inherit "/cmd/std/command_driver";

#include "mith.h"
#include "ryc_zak.h"
#include "funkcje.h"
#include <wa_types.h>
/* 
 * Trudnosc specjala - w tej chwili wartosc jest taka jaka mi przyszla
 * jaka mi przyszla do glowy :)) Alvin musi sie tym zajac :)
 * Zreszta innymi wartosciami liczbowymi tez...
 */
#define TRUDNOSC 300
#define ZMECZENIE(ob) (100 - (ob)->query_fatigue() * 100 / (ob)->query_max_fatigue())
#define OBCIAZENIE(ob) ((ob)->query_encumberance_weight())

// Prototypes
void
trafienie(object gracz, object cel, object bron);

void
spell_attack(object gracz, object cel)
{
    int zmeczenie;
    int obciazenie;
    float czas_o;
    int thit;
    object bron = gracz->query_specjal_mlot();

    set_this_player(gracz);
    TP->remove_prop(RZ_TEMP);
    /* 
     * Tak, Alvin zgadzam sie z Toba ze resolve task jest bardzo fajny,
     * ale ja w tej chwili nie mam pojecia ktora z tych wartosci bedzie
     * miala jaki wplyw na koncowy sukces... zapewne Ty tez ;))))
     * W kazdym razie wiem ze pod uwage brane sa: :))))
     * Rycerz:               Przeciwnik:
     * Sk. specjala          Zrecznosc
     * Um. w mlotach         Uniki
     * Zrecznosc             -Obciazenie
     * To hit broni          -Zmeczenie
     * -Obciazenie
     * -Zmeczenie
     */
    thit = bron->query_hit() * 3 - 20;
    if(TP->resolve_task(TRUDNOSC + ZMECZENIE(gracz) - ZMECZENIE(cel) +
			OBCIAZENIE(gracz) - OBCIAZENIE(cel) - thit,
			({SKILL_WEIGHT, 50, RZ_MLOT, SKILL_WEIGHT, 30, 
			      SS_WEP_WARHAMMER, SKILL_WEIGHT, 20, SS_DEX,
			      }),
			cel,
			({SKILL_WEIGHT, 50, SS_DEX, SKILL_WEIGHT, 50,
			      SS_DEFENCE})) > 0)
    {
	trafienie(TP, cel, bron);
    }
    else
    {
	if(random(100) < cel->query_skill(SS_DEFENCE))
	{
	    gracz->catch_msg("Bierzesz zamach bla bla bla... a cel robi unik...\n");
	    if(interactive(cel))
	        cel->catch_msg("Bierze zamach a Ty robisz unik...\n");
	        
	}
	else
	{
	    gracz->catch_msg("Bierzesz zamach ale nie trafiasz ;)\n");
	    if(interactive(cel))
	        cel->catch_msg("Bierze zamach ale nie trafia...\n");
	}
    }
    /*
     * Obliczanie zmeczenia
     * od 5 - 10 (w zasadzie 9) w zaleznosci od obciazenia...
     */
    zmeczenie = 5 + 5 * OBCIAZENIE(TP) / 100;
    TP->add_fatigue(-zmeczenie);
    /*
     * Czas oczekiwania na mozliwosc wykonania nastepnego ciosu
     * 15 - 25 s w zaleznosci od zmeczenia i obciazenia.
     */
    zmeczenie = ZMECZENIE(TP);
    zmeczenie = (zmeczenie - 30 > 0) ? (zmeczenie - 30) : 0;
    obciazenie = OBCIAZENIE(TP);
    obciazenie = obciazenie - 40 > 0 ? obciazenie - 40 : 0;
    czas_o = 15.0 + 10.0 * itof(zmeczenie + obciazenie) / 130.0;
    TP->add_prop(RZ_SPECJAL, set_alarm(czas_o, 0.0, "gotow_ponownie", TP));
    return;
}

void
trafienie(object gracz, object cel, object bron)
{
    int hit_loc;
    object co = cel->query_combat_object();
    object cotp = gracz->query_combat_object();
    mixed *hitlocs = ({});
    int *hitlocs_ids;
    int trafienie_w;
    int a;
    int ac;
    int pen;
    int dam;
    
    if(cel->query_humanoid())
    {
	ac = co->query_hitloc(A_HEAD)[3][2];
	pen = gracz->query_weapon(W_RIGHT)->query_pen();
	if(!pen)
	    pen = gracz->query_weapon(W_BOTH)->query_pen();
	dam = 100; // Do zaimplementowania dopiero...
	if(dam >= cel->query_hp())
	{
	    gracz->catch_msg("Opis zabijasz kogos.\n");
	    if(interactive(cel))
	    {
	        cel->catch_msg("Opis ktos Cie zabija.\n");
	    }
	    cotp->tell_watcher("Ktos kogos zabija.\n", cel);
	    cel->do_die();
	    return;
	}
	switch(dam * 100 / cel->query_hp())
	{
	    case 0..9:
	    gracz->catch_msg("Trafiles kogos lekko.\n");
	    if(interactive(cel))
	    	cel->catch_msg("Trafil cie ktos lekko.\n");
	    cotp->tell_watcher("Ktos kogos trafil lekko.\n",cel);
	    break;
	
	    case 10..29:
	    gracz->catch_msg("Trafiles kogos srednio.\n");
	    if(interactive(cel))
	    	cel->catch_msg("Trafil cie ktos srednio.\n");
	    cotp->tell_watcher("Ktos kogos trafil srednio.\n",cel);
	    break;
	    
	    case 30..59:
	    gracz->catch_msg("Trafiles kogos mocno.\n");
	    if(interactive(cel))
	    	cel->catch_msg("Trafil cie ktos mocno.\n");
	    cotp->tell_watcher("Ktos kogos trafil mocno.\n",cel);
	    break;
	    
	    default:
	    gracz->catch_msg("Trafiles kogos bardzo mocno.\n");
	    if(interactive(cel))
	    	cel->catch_msg("Trafil cie ktos bardzo mocno.\n");
	    cotp->tell_watcher("Ktos kogos trafil bardzo mocno.\n",cel);
	    break;
	}
	cel->heal_hp(-dam);    
    }
    else
    {
	hitlocs_ids = co->query_hitloc_id();
	{
	    int trafienie_w = random(100) + 1;
	    int b = 0;
	    for(a = 0 ; a < sizeof(hitlocs_ids) ; a++)
	    {
		if(trafienie_w <= co->query_hitloc(hitlocs_ids[a])[1] + b)
		    break;
		b += co->query_hitloc(hitlocs_ids[a])[1];
	    }
	    write(co->query_hitloc(hitlocs_ids[a])[2]+"\n");
	}
    }
    return;
}

void
gotow_ponownie(object gracz)
{
    gracz->remove_prop(RZ_SPECJAL);
    gracz->catch_msg("Jestes gotowy do wykonania kolejnego zamachu.\n");
    return;
}
