
/* 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.
 */

loguj_cios(string str, int player=0)
{
	if (!geteuid()) 
	{
		setuid();
		seteuid(getuid());
	}
	if (player) write_file(LOG_GRACZY, str);
}

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->remove_prop(RZ_SPECJAL);
}


mixed 
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(bron->query_wt());
    int zbr;
    int temp;
    int sila;
    mixed zbr_ac;
    // 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_ac = kogo->query_combat_object()->query_hitloc(lok_zbr)[3];
	if (pointerp(zbr_ac))
	{
		if (sizeof(zbr_ac)<=dts)
			throw("Dts poza oczekiwana wartoscia.");
		zbr=zbr_ac[dts];
	}
	else 
	zbr=zbr_ac;
    }
    else
    {
	int *ids = kogo->query_combat_object()->query_hitloc_id();
	int wyb = random (100) + 1;
	int a;
	temp = 0;

/// Ponizej troche zmienilem bo sie wykrzaczalo (Silvy 3.09.98)
	
	for(a = 0 ; a < sizeof(ids) ; a++)
	{
	    if(temp += kogo->query_combat_object()->query_hitloc(ids[a])[1] > wyb)
	    {
          	zbr = kogo->query_combat_object()->query_hitloc(ids[a])[3][dts];
		break;
	    }
	}
    }
    kto->add_prop(DT_OGLUSZANIE, dts);
    sila=random((F_PENMOD(pen,um) + F_STRENGTH_DAMAGE_MOD(str1) ) - F_AC_MOD(zbr));   
    return (sila>0) ? sila : zbr;
}

public int
trafil_szarza(object kto, object kogo, int czym)
{
    int wynik= kto->resolve_task(TASK_ROUTINE+100, 
		    ({ SKILL_WEIGHT, 70, TS_STR,
		       SKILL_WEIGHT, 150, RZ_SZARZA, 
		       SKILL_WEIGHT, 50, czym }), 
		kogo, ({ SKILL_WEIGHT, 40, TS_DEX, 
		       SKILL_WEIGHT, 120, SS_DEFENCE }));
    if (wynik<0) wynik=0;
		       
    loguj_cios(
    	sprintf("Szarza: \nKto: %-15s Kogo: %-15s\n Wynik: %d\n",
	   C(kto->query_real_name()), C(kogo->short(PL_BIE)), wynik),
	   !kogo->query_npc());
    return wynik;
}

mixed
trafil_ogluszanie(object kto, object kogo, int czym)
{
    object combat=kto->query_combat_object();
    object mlot=kto->query_weapon(czym);
    int skill= mlot->query_wt();
    int mod=F_TOHITMOD(mlot->query_tohit(), kto->query_skill(skill));
    mixed wynik = combat->cb_tohit(czym, mod, mlot->query_prop(OBJ_I_WEIGHT), kogo);
    
    loguj_cios(
    	sprintf("Ogluszanie: \tKto: %-28s Kogo: %-15s\n Wynik: %d\n",
		C(kto->query_real_name()), C(kogo->short(PL_BIE)), 
		wynik[0]), !kogo->query_npc());

    return wynik+({czym})+ ({combat});    
    
}
