
/* Przesnioslem tutaj funkcje liczace, i dostosowalem je tak, aby mogly byc
 * uzywane z obydwoma specjalami. Zmiany polegaly na dostawieniu to i tam 
 * argumentu do funkcji z numerem skilla, i na przeniesieniu modyfikatorow 
 * do miejsca wywolania. Np: zamiast mnozyc obrazenia do szarzy w tym miejscu
 * razy dwa, mnozymy w szarzy.
 */

void usun_specjala(object komu)
{
    komu->catch_msg("Uspokajasz sie i koncentrujesz. Znowu mozesz myslec"
    	+" swobodnie, a cialo twoje gotowe jest do kolejnego wysilku.\n");
//    komu->add_prop(RZ_SPECJAL,0);    
    komu->remove_prop(RZ_SPECJAL);
}


int 
sila_ciosu(object kto, object kogo, int spec, int lok_zbr)
{
    int str1 = kto->query_stat(SS_STR);
    object bron = (kto->query_weapon(W_RIGHT) || kto->query_weapon(W_BOTH));
    int pen;
    int *dt = allocate(4);
    int dts= 0;
    int specjal = kto->query_skill(spec);
    int con = kogo->query_stat(SS_CON);
    int um = kto->query_skill(kto->query_weapon(W_RIGHT)->query_wt()
			      || kto->query_weapon(W_BOTH)->query_wt());
    int zbr;
    int temp;
    
    // Mor: tutaj dorobilem losowy wybor damage type
    temp = bron->query_dt();
    if(temp >= W_CLUB)
    {
	dt[2] = 1;
	dt[3]++;
	temp -= 4;
    }
    if(temp >= W_SLASH)
    {
	dt[1] = 1;
	dt[3]++;
	temp -= 2;
    }
    if(temp >= W_IMPALE)
    {
	dt[0] = 1;
	dt[3]++;
    }
    dt[3] = random(dt[3]) + 1;
    temp = 0;
    while(temp < dt[3])
    {
	if(dt[dts])
	    temp++;
	dts++;
    }
    dts--;
    switch(dts)
    {
    case 0:
	dt[3] = W_IMPALE;
	break;
	
    case 1:
	dt[3] = W_SLASH;
	break;

    case 2:
	dt[3] = W_CLUB;
	break;
	
    default:
	throw("Damage type poza oczekiwana wartoscia.");
    }
    pen = bron->query_modified_pen()[dts];
    // Mor: tutaj dodalem branie ac dla hitlokacji z combat objecta
    // oraz losowy wybor hitlokacji dla niehumanoidow...
    if(kogo->query_humanoid())
    {
	zbr = kogo->query_combat_object()->query_hitloc(lok_zbr)[3][dts];
    }
    else
    {
	int *ids = kogo->query_combat_object()->query_hitloc_id();
	int wyb = random (100) + 1;
	int a;
	temp = 0;
	
	for(a = 0 ; a < sizeof(ids) ; a++)
	{
	    if(temp += kogo->query_combat_object()->query_hitloc(ids[a])[1] > wyb)
		break;
	}
	zbr = kogo->query_combat_object()->query_hitloc(ids[a])[3][dts];
    }
    return MAX(random(((F_PENMOD(pen,um) + (specjal + str1)/2 ) - (con + zbr))), 0);   
}

public int
trafil(object kto, object kogo, int czym, int jaki_skill)
{
/*
	Atakujacy			Broniacy
	
	dex				dex
	skill w specjalu		skill w unikach
	wypoczecie			wypoczecie
	skill w broni			-obciazenie
	-obciazenie
*/

//A: Trzeba by pomyslec, czy chcemy to wszystko  rownych proporcjach
//A: Poza tym proponuje uzyc resolve_task
//M: resolve_task jest fajny, ale jeszze bardziej komplikuje... 
//M: Proporcje sa dobre... :) Przedtem bylo tu mnozenie, ale sie przy 0 
// kopalo..

    int zr1 = kto->query_stat(SS_DEX);
    int zr2 = kogo->query_stat(SS_DEX);
    int skill = kto->query_skill(jaki_skill);
    int zm1 = kto->query_fatigue() * 100 / kto->query_max_fatigue();
    int zm2 = kogo->query_fatigue() * 100 / kogo->query_max_fatigue();
    int obc1 = kto->query_encumberance_weight();
    int obc2 = kogo->query_encumberance_weight();
    int uniki = kogo->query_skill(SS_DEFENCE);
    int atak = kto->query_skill(czym);
    return (((zr1+skill+zm1+atak-obc1) - (zr2+zm2+uniki-obc2) - 50 + random(100)) > 0);
}
