
#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 500
#define ZMECZENIE(ob) (100 - (ob)->query_fatigue() * 100 / (ob)->query_max_fatigue())
#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);
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(TP->query_prop(RZ_SPECJAL))
    {
        notify_fail("Musisz chwile odpoczac zanim bedziesz mogl wykonac " +
                    "nastepny zamach.\n");
        return 0;
    }
    if(!TP->query_skill(RZ_MLOT))
    {
        notify_fail("Musisz znac przynajmniej podstawy wykonywania tego " +
                    "ataku!\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 = 10.0 - itof((random(TP->QS(RZ_MLOT) / 2) + TP->QS(RZ_MLOT) / 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;
    int obciazenie;
    int volume;
    float czas_o;
    int thit;
    int norm;
    // Debug begin
    int ilosc_sukcesow = 0;
    int licznik;
    // Debug end

    set_this_player(gracz);
    TP->remove_prop(RZ_TEMP);

    /*
     * Przy okreslaniu sukcesu brane pod uwage sa:
     * Rycerz:               Przeciwnik:
     * Sk. specjala          Zrecznosc
     * Um. w mlotach         Uniki
     * Zrecznosc             -Obciazenie
     * To hit broni          -Zmeczenie
     * -Obciazenie
     * -Zmeczenie
     * W efekcie koncowym powinno byc kolo 70% szansy na trafienie
     * rownego przeciwnika...
     */

    // tohit broni moze miec wartosc od 0 nawet do 120... ale w przypadku
    // mlota nie powinna przekroczyc 60, 70...
    thit = bron->query_hit() * 3;

    // znormalizowana wartosc modyfikatora wynikajacego ze
    // zmeczenia, obciazenia i zaladowania gracza i jego celu
    // przyjmuje wartosci od -40 do 40
    // ale w normalnych warunkach nie powinna specjalnie odbiegac od 0
    norm = fixnorm(2 * ZMECZENIE(gracz) + OBCIAZENIE(gracz) + VOLUME(gracz) + 50,
                   2 * ZMECZENIE(cel) + OBCIAZENIE(cel) + VOLUME(cel) + 50);
//     dump_array(norm+"\nzm:" + ZMECZENIE(gracz) + " ob:"+ OBCIAZENIE(gracz) + 
//             " vol:" + VOLUME(gracz) + "\nprzeciwnik:\nzm:" + ZMECZENIE(cel)
//             + " ob:" + OBCIAZENIE(cel) + " vol:" + VOLUME(cel));
    
    //    for(licznik = 0 ; licznik < 500 ; licznik++) // Do spr. balansu
    if(TP->resolve_task(TRUDNOSC + norm - 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)
        //  dump_array("Prawdopodobienstwo:" + (ilosc_sukcesow * 100 / 500));
    {
        trafienie(gracz, cel, bron);
    }
    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 = 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();
    object zbroja;
    mixed hitlocs = ({}), hit_result;
    int *hitlocs_ids;
    int trafienie_w;
    int a, ac, wcpen, dam, percent_dam;
    int skill = (gracz->query_skill(RZ_MLOT) + 
                 gracz->query_skill(SS_WEP_WARHAMMER)) / 2;
    
    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...
    //dump_array("wcpen przed:" + wcpen);
    wcpen += (wcpen * ((gracz->query_skill(RZ_MLOT) * 3) + gracz->query_stat(SS_OCCUP) +
                      gracz->query_skill(SS_WEP_WARHAMMER)) * 19) / (5 * 100 * 7);
    //dump_array("wc_pen po:" + wcpen);
    //dump_array("hp przed:" + cel->query_hp());
    if(cel->query_humanoid())
        hit_result = CO(cel)->cb_hit_me(wcpen, W_BLUDGEON, 0 /*???*/, gracz, -1,
                                        A_HEAD);
    else
        hit_result = CO(cel)->cb_hit_me(wcpen, W_BLUDGEON, 0 /*???*/, gracz, -1);
    //dump_array("hp po:" + cel->query_hp());
    percent_dam = hit_result[0];
    dam = hit_result[3];
    zbroja = hit_result[4];
    //dump_array(hit_result);

    /*
     * Opisy trafien...
     */
    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 ochydne 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 ochydne " +
                   "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->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");
            }
            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");
            }
            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");
            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");
            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, probojac 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, probojac sie " +
                   "otrzasnac.\n");
            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, a " +
                   cel->koncowka("on sam", "ona sama", "ono samo") + " " +
                   "proboje utrzymac rownowage, ledwo stojac na nogach.\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. Cala " +
                   "twoja twarz pokrywa 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, a " +
                   cel->koncowka("on sam", "ona sama", "ono samo") + " z trudem " +
                   "proboje utrzymac rownowage, ledwo stojac na nogach.\n");
            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 ochydne 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 ochydne " +
                   "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->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");
            }
            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");
            }
            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");
            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");
            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");
            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");
            break;
        }
    }
}

void
nietrafienie(object gracz, object cel, object bron)
{
    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");
                  
    }
    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;
}


