
#include "mith.h"
#include "ryc_zak.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 550
#define ZMECZENIE(ob) (100 - ((ob)->query_fatigue()+1) * 100 / ((ob)->query_max_fatigue()+1))
#define OBCIAZENIE(ob) ((ob)->query_encumberance_weight())
#define VOLUME(ob) ((ob)->query_encumberance_volume())
#define QS(a) query_skill(a)
#define CO(ob) ob->query_combat_object()

// Prototypes
void trafienie(object gracz, object cel, object bron, int efekt);
void nietrafienie(object gracz, object cel, object bron);
void mlot_attack(object gracz, object cel, object bron);
int fixnorm(int offence, int defence);

/*
 * Wywolywane kiedy gracz wpisze komende
 */
int
mlot(string str)
{
    object bron;
    object cel;
    float czas;

    bron = TP->query_weapon(W_BOTH);
    if(!objectp(bron))
    {
        notify_fail("Musisz dzierzyc obureczny mlot zeby moc " +
                    "wykonac ten atak!\n");
        return 0;
    }
    if(!bron->query_wt() == W_WARHAMMER)
    {
        notify_fail("Musisz dzierzyc obureczny mlot zeby " +
                    "wykonac ten atak!\n");
        return 0;    
    }
    if(!objectp(TP->query_attack()))
    {
        notify_fail("Tego ataku mozesz uzyc tylko w walce!\n");
        return 0;
    }
    else
        cel = TP->query_attack();
    
    if (obiekt_no_attack(TP, cel)) return 0; // Niestety, wszystko jest 
    	// jako .h, wiec nie mozna wkleic tego tutaj. Uzywamy w zwiazku 
    	// z tym funkcji zdeklarowanej w szarzy. Dziala, ale niezbyt zgodne z 
    	// idea czystego programowania. ( jak kto bedzie tej funkcji szukal...

    if(TP->query_prop(RZ_SPECJAL))
    {
        notify_fail("Musisz chwile odpoczac zanim bedziesz mogl wykonac " +
                    "nastepny zamach.\n");
        return 0;
    }
    if(!TP->query_skill(SS_WEP_WARHAMMER))
    {
        notify_fail("Musisz znac przynajmniej podstawy walki mlotem!\n"); 
        return 0;
    }
    
    if(TP->query_prop(RZ_TEMP))
    {
        notify_fail("Wlasnie jestes w trakcie przygotowan do zadania ciosu!" +
                    "\n");
        return 0;
    }

    write("Przygotowujesz sie do wykonania morderczego zamachu swoim " +
          bron->short(TP, PL_NAR) + ".\n");

    czas = 13.3 - itof((random(TP->QS(SS_WEP_WARHAMMER) / 2) + TP->QS(SS_WEP_WARHAMMER) / 2) * 6) / 100.0;
    TP->add_prop(RZ_TEMP, set_alarm(czas, 0.0, "zamach_mlotem", TP, cel,
                                    bron));
    return 1;
}

/*
 * Wywolywana alarmem kiedy skonczy sie czas oczekiwania
 */
void
zamach_mlotem(object gracz, object cel, object bron)
{
    set_this_player(gracz);
    if(!(TP->query_attack() == cel))
    {
        write("Nie atakujesz juz osoby ktora chciales uderzyc mlotem.\n");
        TP->remove_prop(RZ_TEMP);
        return; 
    }
    if(TP->query_weapon(W_BOTH) != bron)
    {
        write("Nie mozesz zmieniac broni podczas wykonywania zamachu mlotem!\n");
        TP->remove_prop(RZ_TEMP);
        return;
    }
    mlot_attack(gracz, cel, bron);
}


void
mlot_attack(object gracz, object cel, object bron)
{
    int zmeczenie, obciazenie, volume, thit, norm, efekt;
    float czas_o;
    // Debug begin
    int ilosc_sukcesow = 0;
    int licznik;
    string str;
    // Debug end

    set_this_player(gracz);
    TP->remove_prop(RZ_TEMP);

    thit = bron->query_hit() * 5;

    /* Znormalizowana wartosc modyfikatora wynikajacego ze zmeczenia,
     * obciazenia i zaladowania gracza i jego celu. Przyjmuje wartosci
     * od -50 do 50, ale w normalnych warunkach nie powinna specjalnie
     * odbiegac od 0.
     */
/* Stary:
    norm = fixnorm(2 * ZMECZENIE(gracz) + OBCIAZENIE(gracz) + VOLUME(gracz) + 50,
                   ZMECZENIE(cel) + 2 * OBCIAZENIE(cel) + VOLUME(cel) + 50);
*/
  norm = fixnorm(2 * ZMECZENIE(gracz) + OBCIAZENIE(gracz) + VOLUME(gracz),
                   ZMECZENIE(cel) + 2 * OBCIAZENIE(cel) + VOLUME(cel));

     efekt = gracz->resolve_task(TRUDNOSC + norm - thit,
           ({ SKILL_WEIGHT, 60, SS_WEP_WARHAMMER, SKILL_WEIGHT, 40, TS_STR }),
      cel, ({ SKILL_WEIGHT, 90, SS_DEFENCE, SKILL_WEIGHT, 20, TS_DEX }));
      
     str=sprintf("Miazdzenie: Kto: %-30sKogo: %s\nMlot: %-5d Sila: %-5d ToHit: %-10dUniki: %-5d Dex: %-10dEfekt: %d\n",
  		C(gracz->query_real_name()), C(cel->query_real_name()), 
  		gracz->query_skill(SS_WEP_WARHAMMER), gracz->query_stat(SS_STR),
  		bron->query_hit(), cel->query_skill(SS_DEFENCE), 
  		cel->query_stat(SS_DEX), efekt);
    setuid();
    seteuid(getuid());
    write_file(LOG_CIOSOW, str);
        
    if (efekt > 0)
    {
        trafienie(gracz, cel, bron, efekt);
    }
    else
    {
        nietrafienie(gracz, cel, bron);
    }

    /*
     * 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 = 20.0 + 13.3 * 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 efekt)
{
    int hit_loc;
    object co = cel->query_combat_object();
    object cotp = gracz->query_combat_object();
    object zbroja;
    mixed hitlocs = ({}), hit_result;
    int *hitlocs_ids;
    int trafienie_w;
    int a, ac, wcpen, dam, percent_dam;
    int skill = gracz->query_skill(SS_WEP_WARHAMMER);
    
    wcpen = bron->query_pen();
    /*
     * Humanoidy :
     */
    wcpen = F_PENMOD(wcpen, skill);
    wcpen += F_STRENGTH_DAMAGE_MOD(gracz->query_stat(SS_STR));
    // Tutaj zwiekszamy pena o dodatkowa wartosc... zalezna od skilla
    // i gildiowego stata... wedlug wyliczen Alvina i Mithandira
    // powinno to byc okolo 20 / 7 normalnego ataku po zmodyfikowaniu
    // o odpowiednia wielkosc wynikajaca z mniejszego prawdopodobienstwa
    // sukcesu : 26 / 7 czyli dodaje do 19 / 7 wczesniejszego pena... 
    // ( zmienilem na 12/7)
    wcpen += (wcpen * (((gracz->query_stat(SS_OCCUP) + skill * 4) * 12) / (500 * 7)));
    wcpen += (efekt * 2);
    if(cel->query_humanoid())
        hit_result = cel->hit_me(wcpen, W_BLUDGEON, 0, gracz, -1,
                                        A_HEAD);
    else
        hit_result = cel->hit_me(wcpen, W_BLUDGEON, 0, gracz, -1);

    //dump_array("hp po:" + cel->query_hp());

    if(intp(hit_result)) return;

    percent_dam = hit_result[0];
    dam = hit_result[3];
    zbroja = hit_result[4];
    //dump_array(hit_result);
    write_file(LOG_CIOSOW,
    	sprintf("Procent obrazen: %-5dObrazenia: %-10dHP: %-5dWCPen: %d\n",
    	percent_dam, dam, cel->query_hp(), wcpen));
    /*
     * Opisy trafien...
     */
    
    if((!bron)||(!cel)||(!gracz)) return;

    if(cel->query_humanoid()) //Humanoidy...
    {
        if(!cel->query_hp())
        {
            gracz->catch_msg("Bierzesz potezny zamach " + QSHORT(bron, PL_NAR) +
                   ". Przez twoja twarz przechodzi grymas wysilku, gdy wkladasz " +
                   "w cios wszystkie dostepne ci sily. Z " +
                   "zadziwiajaca latwoscia uderzasz " + QIMIE(cel, PL_BIE) +
                   " w glowe. Slychac ohydne chrupniecie pekajacej czaszki, " +
                   "a w powietrze wylatuja okruchy kosci zmieszane z kropelkami " +
                   "krwi, tworzac prawdziwie makabryczny widok. " + 
                   QCIMIE(cel, PL_MIA) + " pada martw" + cel->koncowka("y","a","e")+
                   " na ziemie.\n");
            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + ". Przez " + 
                   gracz->koncowka("jego", "jej", "jego") + " twarz przechodzi " +
                   "grymas wysilku, gdy wklada w cios wszystkie dostepne sily. " +
                   "Uderzenie trafia w twa glowe. " +
                   "Czujesz, ze ziemia usuwa ci sie spod nog, a przed twoimi " +
                   "oczami zalega ciemnosc...\n");
            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + ". Przez " + 
                   gracz->koncowka("jego", "jej", "jego") + " twarz przechodzi " +
                   "grymas wysilku, gdy wklada w cios wszystkie dostepne sily." +
                   " Z zadziwiajaca latwoscia uderza " +
                   QIMIE(cel, PL_BIE) + " w glowe. Slychac przy tym ohydne " +
                   "chrupniecie pekajacej czaszki, " +
                   "a w powietrze wylatuja okruchy kosci zmieszane z kropelkami " +
                   "krwi, tworzac prawdziwie makabryczny widok. " + 
                   QCIMIE(cel, PL_MIA) + " pada martw" + cel->koncowka("y","a","e")+
                   " na ziemie.\n", cel);
             
            cel->do_die(gracz);
            return;
        }
        
        if(percent_dam <= 0) // Nie zadano obrazen...
        {
            if(objectp(zbroja)) // Jesli byla zbroja
            {
                gracz->catch_msg("Wykonujesz silny zamach " + 
                       QSHORT(bron, PL_NAR) + " i trafiasz " + QIMIE(cel, PL_BIE) +
                       " w glowe, jednak caly impet ciosu zostaje wyparowany " +
                       "przez " + QSHORT(zbroja, PL_BIE) + ".\n");
                if(interactive(cel))
                    cel->catch_msg(QCIMIE(gracz, PL_MIA) + " wykonuje silny " +
                       "zamach " + QSHORT(bron, PL_NAR) + " i trafia cie " +
                       " w glowe, jednak caly impet ciosu zostaje wyparowany " +
                       "przez " + QSHORT(zbroja, PL_BIE) + ".\n");
                cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " wykonuje silny " +
                       "zamach " + QSHORT(bron, PL_NAR) + " i trafia " +
                       QIMIE(cel, PL_BIE) + " w glowe, jednak caly impet ciosu " +
                       "zostaje wyparowany przez " + QSHORT(zbroja, PL_BIE) +
                       ".\n", cel);
            }
            else // Nie bylo zbroi (hehehe to sie chyba moze zdazyc raz na tysiac)
            {
                gracz->catch_msg("Wykonujesz silny zamach " + 
                       QSHORT(bron, PL_NAR) + " i trafiasz " + QIMIE(cel, PL_BIE) +
                       " w glowe, nie powodujac jednak wiekszych " +
                       "obrazen.\n");
                if(interactive(cel))
                    cel->catch_msg(QCIMIE(gracz, PL_MIA) + " wykonuje silny " +
                       "zamach " + QSHORT(bron, PL_NAR) + " i trafia cie " +
                       "w glowe, nie powodujac jednak wiekszych " +
                       "obrazen.\n");
                cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " wykonuje silny " +
                       "zamach " + QSHORT(bron, PL_NAR) + " i trafia " +
                       QIMIE(cel, PL_BIE) + " w glowe, nie powodujac jednak " +
                       " wiekszych obrazen.\n", cel);
            }
            return;
        }

        switch(percent_dam)
        {
            case 0..7:
            gracz->catch_msg("Bierzesz mocny zamach " + QSHORT(bron, PL_NAR) +
                   ", mierzac w glowe " + QIMIE(cel, PL_DOP) + ", lecz muskasz " +
                   cel->koncowka("go", "ja", "go") + " zaledwie, " +
                   "pozostawiajac nieznaczne zadrapania.\n");
            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze mocny zamach " + 
                   QSHORT(bron, PL_NAR) + ", mierzac w twoja glowe, lecz " +
                   "muska cie zaledwie, pozostawiajac nieznaczne zadrapania.\n");
            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze mocny zamach " + 
                   QSHORT(bron, PL_NAR) + ", mierzac w glowe " + 
                   QIMIE(cel, PL_DOP) + ", lecz muska "+ 
                   cel->koncowka("go", "ja", "go") + " zaledwie, pozostawiajac " +
                   "nieznaczne zadrapania.\n", cel);
            break;
        
            case 8..24:
            gracz->catch_msg("Bierzesz mocny zamach " + QSHORT(bron, PL_NAR) +
                   " i z powodzeniem trafiasz " + QIMIE(cel, PL_BIE) +
                   ", pozostawiajac na " + cel->koncowka("jego", "jej", "jego") +
                   " glowie krwawiaca rane.\n");
            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze mocny zamach " + 
                   QSHORT(bron, PL_NAR) + " i z powodzeniem trafia cie, " +
                   "pozostawiajac na twojej glowie krwawiaca rane.\n");
            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze mocny zamach " + 
                   QSHORT(bron, PL_NAR) + " i z powodzeniem trafia " +
                   QIMIE(cel, PL_BIE) + " pozostawiajac na " +
                   cel->koncowka("jego", "jej", "jego") + " glowie " +
                   "krwawiaca rane.\n", cel);
            break;
            
            case 25..49:
                gracz->catch_msg("Bierzesz potezny zamach " + QSHORT(bron, PL_NAR) +
                   " i z latwoscia trafiasz " + QIMIE(cel, PL_BIE) +
                   ", pozostawiajac na " + cel->koncowka("jego", "jej", "jego") +
                   " glowie duza, krwawiaca rane. " + QCIMIE(cel, PL_MIA) +
                   " chwieje sie na nogach przez chwile, probujac sie otrzasnac.\n");

            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + " i z latwoscia trafia cie, " +
                   " pozostawiajac na twojej glowie duza, krwawiaca rane. " +
                   "Lekko chwiejesz sie, probujac odzyskac rownowage.\n");

            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + " i z latwoscia trafia " +
                   QIMIE(cel, PL_BIE) + ", pozostawiajac na " + 
                   cel->koncowka("jego", "jej", "jego") + " glowie duza, " +
                   "krwawiaca rane. " + QCIMIE(cel, PL_MIA) +
                   " chwieje sie jeszcze przez chwile, probujac sie " +
                   "otrzasnac.\n", cel);
            break;
            
            default:
                gracz->catch_msg("Bierzesz potezny zamach " + QSHORT(bron, PL_NAR) +
                   ". Z ogromna sila i zadziwiajaca " + 
                   "latwoscia uderzasz " + QIMIE(cel, PL_BIE) + " w glowe. Niemalze " +
                   "natychmiast " + cel->koncowka("jego", "jej", "jego") +
                   " twarz zalewa strumien krwi.\n");
            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + ". " +
                   "W chwile potem z ogromna sila trafia cie w glowe, a ty niemal " +
                   "tracisz swiadomosc. Z trudem udaje ci sie " +
                   "utrzymac na nogach. " +
                   "Twoja twarz zalewa krew.\n");
            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + ". " +
                   "Z ogromna sila i zadziwiajaca latwoscia uderza " +
                   QIMIE(cel, PL_BIE) + " w glowe. Niemalze " +
                   "natychmiast twarz " + gracz->koncowka("jego", "jej", "jego") +
                   " przeciwni" + cel->koncowka("ka", "czki", "ka") + 
                   " zalewa strumien krwi.\n", cel);
            break;
        }
    }
    else // Niehumanoidy... 
    {
    if(!cel->query_hp())
        {
            gracz->catch_msg("Bierzesz potezny zamach " + QSHORT(bron, PL_NAR) +
                   ". Przez twoja twarz przechodzi grymas wysilku, gdy wkladasz " +
                   "w cios wszystkie dostepne ci sily. Z " +
                   "zadziwiajaca latwoscia uderzasz " + QIMIE(cel, PL_BIE) +
                   " w glowe. Slychac ohydne chrupniecie pekajacej czaszki, " +
                   "a w powietrze wylatuja okruchy kosci zmieszane z kropelkami " +
                   "krwi, tworzac prawdziwie makabryczny widok. " + 
                   QCIMIE(cel, PL_MIA) + " pada martw" + cel->koncowka("y","a","e")+
                   " na ziemie.\n");
            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + ". Przez " + 
                   gracz->koncowka("jego", "jej", "jego") + " twarz przechodzi " +
                   "grymas wysilku, gdy wklada w cios wszystkie dostepne sily. " +
                   "Uderzenie trafia w twa glowe. " +
                   "Czujesz, ze ziemia usuwa ci sie spod nog, a przed twoimi " +
                   "oczami zalega ciemnosc...\n");
            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + ". Przez " + 
                   gracz->koncowka("jego", "jej", "jego") + " twarz przechodzi " +
                   "grymas wysilku, gdy wklada w cios wszystkie dostepne sily. " +
                   " Z zadziwiajaca latwoscia uderza " +
                   QIMIE(cel, PL_BIE) + " w glowe. Slychac przy tym ohydne " +
                   "chrupniecie pekajacej czaszki, " +
                   "a w powietrze wylatuja okruchy kosci zmieszane z kropelkami " +
                   "krwi, tworzac prawdziwie makabryczny widok. " + 
                   QCIMIE(cel, PL_MIA) + " pada martw" + cel->koncowka("y","a","e")+
                   " na ziemie.\n", cel);
             
            cel->do_die(gracz);
            return;
        }
        
        if(percent_dam <= 0) // Nie zadano obrazen...
        {
            if(objectp(zbroja)) // Jesli byla zbroja
            {
                gracz->catch_msg("Wykonujesz silny zamach " + 
                       QSHORT(bron, PL_NAR) + " i trafiasz " + QIMIE(cel, PL_BIE) +
                       " w glowe, jednak caly impet ciosu zostaje wyparowany " +
                       "przez " + QSHORT(zbroja, PL_BIE) + ".\n");
                if(interactive(cel))
                    cel->catch_msg(QCIMIE(gracz, PL_MIA) + " wykonuje silny " +
                       "zamach " + QSHORT(bron, PL_NAR) + " i trafia cie " +
                       " w glowe, jednak caly impet ciosu zostaje wyparowany " +
                       "przez " + QSHORT(zbroja, PL_BIE) + ".\n");
                cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " wykonuje silny " +
                       "zamach " + QSHORT(bron, PL_NAR) + " i trafia " +
                       QIMIE(cel, PL_BIE) + " w glowe, jednak caly impet ciosu " +
                       "zostaje wyparowany przez " + QSHORT(zbroja, PL_BIE) +
                       ".\n", cel);
            }
            else // Nie bylo zbroi (hehehe to sie chyba moze zdazyc raz na tysiac)
            {
                gracz->catch_msg("Wykonujesz silny zamach " + 
                       QSHORT(bron, PL_NAR) + " i trafiasz " + QIMIE(cel, PL_BIE) +
                       " w glowe, nie powodujac jednak wiekszych " +
                       "obrazen.\n");
                if(interactive(cel))
                    cel->catch_msg(QCIMIE(gracz, PL_MIA) + " wykonuje silny " +
                       "zamach " + QSHORT(bron, PL_NAR) + " i trafia cie " +
                       "w glowe, nie powodujac jednak wiekszych " +
                       "obrazen.\n");
                cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " wykonuje silny " +
                       "zamach " + QSHORT(bron, PL_NAR) + " i trafia " +
                       QIMIE(cel, PL_BIE) + " w glowe, nie powodujac jednak " +
                       " wiekszych obrazen.\n", cel);
            }
            return;
        }

        switch(percent_dam)
        {
            case 0..7:
            gracz->catch_msg("Bierzesz mocny zamach " + QSHORT(bron, PL_NAR) +
                   ", mierzac w glowe " + QIMIE(cel, PL_DOP) + ", lecz muskasz " +
                   cel->koncowka("go", "ja", "go") + " zaledwie, " +
                   "pozostawiajac nieznaczne zadrapania.\n");
            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze mocny zamach " + 
                   QSHORT(bron, PL_NAR) + ", mierzac w twoja glowe, lecz " +
                   "muska cie zaledwie, pozostawiajac nieznaczne zadrapania.\n");
            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze mocny zamach " + 
                   QSHORT(bron, PL_NAR) + ", mierzac w glowe " + 
                   QIMIE(cel, PL_DOP) + ", lecz muska "+ 
                   cel->koncowka("go", "ja", "go") + " zaledwie, pozostawiajac " +
                   "nieznaczne zadrapania.\n", cel);
            break;
        
            case 8..24:
            gracz->catch_msg("Bierzesz mocny zamach " + QSHORT(bron, PL_NAR) +
                   " i z powodzeniem trafiasz " + QIMIE(cel, PL_BIE) +
                   ", pozostawiajac na " + cel->koncowka("jego", "jej", "jego") +
                   " glowie krwawiaca rane.\n");
            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze mocny zamach " + 
                   QSHORT(bron, PL_NAR) + " i z powodzeniem trafia cie, " +
                   "pozostawiajac na twojej glowie krwawiaca rane.\n");
            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze mocny zamach " + 
                   QSHORT(bron, PL_NAR) + " i z powodzeniem trafia " +
                   QIMIE(cel, PL_BIE) + " pozostawiajac na " +
                   cel->koncowka("jego", "jej", "jego") + " glowie " +
                   "krwawiaca rane.\n", cel);
            break;
            
            case 25..49:
                gracz->catch_msg("Bierzesz potezny zamach " + QSHORT(bron, PL_NAR) +
                   " i z latwoscia trafiasz " + QIMIE(cel, PL_BIE) +
                   ", pozostawiajac na " + cel->koncowka("jego", "jej", "jego") +
                   " glowie duza, krwawiaca rane.\n");

            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + " i z latwoscia trafia cie, " +
                   " pozostawiajac na twojej glowie duza, krwawiaca rane. " +
                   "Lekko chwiejesz sie, probujac odzyskac rownowage.\n");

            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + " i z latwoscia trafia " +
                   QIMIE(cel, PL_BIE) + ", pozostawiajac na " + 
                   cel->koncowka("jego", "jej", "jego") + " glowie duza, " +
                   "krwawiaca rane.\n", cel);
            break;
            
            default:
                gracz->catch_msg("Bierzesz potezny zamach " + QSHORT(bron, PL_NAR) +
                   ". Z ogromna sila i zadziwiajaca " + 
                   "latwoscia uderzasz " + QIMIE(cel, PL_BIE) + " w glowe, powodujac "+
                   "rozlegle obrazenia.\n");
            if(interactive(cel))
                cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + ". " +
                   "W chwile potem z ogromna sila trafia cie w glowe, a ty niemal " +
                   "tracisz swiadomosc.\n");
            cotp->tell_watcher(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " + 
                   QSHORT(bron, PL_NAR) + ". " +
                   "Z ogromna sila i zadziwiajaca latwoscia uderza " +
                   QIMIE(cel, PL_BIE) + " w glowe, powodujac rozlegle obrazenia.\n", cel);
            break;
        }
    }
}

void
nietrafienie(object gracz, object cel, object bron)
{
    if((!bron)||(!cel)||(!gracz)) return;

    if(random(100) < cel->query_skill(SS_DEFENCE))
    {
        gracz->catch_msg("Bierzesz potezny zamach swoim " +
              bron->short(gracz, PL_NAR) + ", jednak " + QIMIE(cel, PL_MIA)
              + " wykonuje zreczny unik i cios przeszywa powietrze.\n");
        if(interactive(cel))
            cel->catch_msg(QCIMIE(gracz, PL_MIA) + " bierze potezny zamach " +
                "swoim " + bron->short(cel, PL_NAR) + ", udaje " +
                "ci sie jednak wykonac unik i cios przeszywa powietrze.\n");
        gracz->query_combat_object()->tell_watcher(QCIMIE(gracz, PL_MIA) +
              " bierze potezny zamach swoim " + QSHORT(bron, PL_NAR) +
              ", jednak " + QIMIE(cel, PL_MIA) + " wykonuje zreczny unik " +
              "i cios przeszywa powietrze.\n", cel);
                  
    }
    else
    {
        gracz->catch_msg("Wykonujesz potezny zamach " + QSHORT(bron, PL_NAR) +
               ", mierzac w glowe " + QIMIE(cel, PL_DOP) + ", lecz nie udaje ci " +
               "sie " + cel->koncowka("go", "jej", "go") + " trafic.\n");
        if(interactive(cel))
            cel->catch_msg(QCIMIE(gracz, PL_MIA) + " wykonuje potezny zamach " +
                 QSHORT(bron, PL_NAR) + ", mierzac w twoja glowe, lecz nie " + 
                 "udaje " + gracz->koncowka("mu", "jej", "mu") + " sie ciebie " +
                 "trafic.\n");
        gracz->query_combat_object()->tell_wather(QCIMIE(gracz, PL_MIA) +
              " wykonuje potezny zamach " + QSHORT(bron, PL_NAR) + ", mierzac " +
              "w glowe " + QIMIE(gracz, PL_DOP) + ", lecz nie udaje " +
              gracz->koncowka("mu", "jej", "mu") + " sie trafic.\n");
    }
}

void
gotow_ponownie(object gracz)
{
    gracz->remove_prop(RZ_SPECJAL);
    gracz->catch_msg("Jestes gotowy do wykonania kolejnego zamachu.\n");
    return;
}

int
fixnorm(int offence, int defence)
{
    if(offence + defence == 0)
        return 0;

    return ((offence * 100) / (offence + defence)) - 50;
}


