
dodaj_paraliz(object komu, int czas);

int
oglusz(string str)
{
    object *oblist, cel;
    object mlot=TP->query_weapon(W_RIGHT) || TP->query_weapon(W_BOTH);
    float czas;
    
    // Mor : okey Silvy jest wybor celu...
    // w tej chwili nie podanie argumentu powoduje ogluszenie osoby
    // z ktora walczy sie w tej chwili...
    // Podanie innego celu niz obecny powoduje zmiane atakowanej osoby
    // na cel (sprawdzane jest oczywiscie czy rycerz z nim walczy)
    if(stringp(str))
    {
	oblist = parse_this(str, "%l:" + PL_BIE);
	
	if(!sizeof(oblist))
	{
	    notify_fail("Kogo chcesz ogluszyc?\n");
	    return 0;
	}
	
	if(sizeof(oblist) > 1)
	{
	    notify_fail("Mozesz ogluszac jedna osobe na raz.\n");
	    return 0;
	}
	cel = oblist[0];
    }
    else // Nie podano celu
    {
	cel = TP->query_attack();
    }
    
    if (member_array (TP, cel->query_enemy(-1)) == -1)
    {
	notify_fail("Tego ciosu mozesz uzywac tylko podczas "
		    +"walki.\n");
	return 0;
    }
    
    if (this_player()->query_prop(RZ_SPECJAL))
    {
	notify_fail("Musisz chile odpoczac, zanim bedzesz mogl znow"
		    +" uzyc ciosu specjalnego.\n");
	return 0;
    }
    
    if (!mlot)
    {
	notify_fail("Musisz dzierzyc mlot, aby moc kogos ogluszyc.\n");
	return 0;
    }
    if (!(mlot->query_wt() == W_WARHAMMER))
    {
	notify_fail("Oglszac mozesz tylko i wylacznie mlotem, rytualna "
		    +"bronia Rycerzy Zakonu Sigmara.\n");
	return 0;
    }
    if (!TP->query_skill(RZ_OGLUSZANIE))
    {
	notify_fail("Nie znasz nawet podstaw tej techniki walki.\n");
	return 0;
    }
    if (TP->query_prop(RZ_TEMP))
    {
	// Mor: Ten opis powinien dotyczyc wszystkich specjali
	// ow prop jest sprawdzany przy kazdym (Silvy popraw to bo nic nie moge wymyslec)
	notify_fail("Wlasnie sie przygotowujesz do zadania ciosu.\n");
	return 0;
    }
    
    
    czas = (400.0 - 3.0 * itof(TP->query_skill(RZ_OGLUSZANIE))) / 100.0;
    if (cel != TP->query_attack())
	TP->attack_object(cel);
    
    write("Koncentrujesz sie, wypatrujac okazji do zadania "
	  +"przeciwnikowi ogluszajacego ciosu..\n");
    TP->add_prop(RZ_TEMP, set_alarmv(czas, 0.0, "oglusz_go",
				     ({this_player(), cel, mlot})));
    return 1;
}

void
oglusz_go(object kto, object kogo, object mlot)
{
    string opis = mlot->short(PL_NAR);

    kto->remove_prop(RZ_TEMP);

    if (mlot != kto->query_weapon(W_RIGHT) && mlot != kto->query_weapon(W_BOTH))
    {
	kto->catch_msg("Nie mozesz zmieniac broni podczas "
		       +"przygotowywania sie do zadania ciosu.\n");
	return;
    }

    if (!present(kogo,environment(kto)))
    {
	kto->catch_msg("Osoby, ktora chciales ogluszyc nie ma kolo"
		       +" ciebie.\n");
	return;
    }

    if (!kto->query_attack() && kto!=kogo->query_attack())
    {
	kto->catch_msg("Ogluszac mozesz tylko podczas walki.\n");
	return;
    }
        
    if (!mlot)
    {
   	kto->catch_msg("Aby moc ogluszac przeciwnika, musisz dzierzyc"
		       +" mlot.\n");
	return;
    }

    kto->add_prop(RZ_SPECJAL, set_alarm(PRZERWA, 0.0, "usun_specjala", kto));
    
    if (trafil (kto, kogo, mlot->query_wt(), RZ_OGLUSZANIE))
    {
	int efekt, czas;
	efekt = sila_ciosu(kto, kogo, RZ_OGLUSZANIE, A_HEAD);
	if (efekt == 0)
	{
	    target("niespodzianie uderza cie " + opis + " w glowe, "
		   +"nie wyrzadzajac ci jednak zadnej szkody.",
		   ({kogo}));
	    all2act("niespodziewanie uderza ",({kogo}),PL_BIE," " +
	            opis + " w glowe, nie wyrzadzajac "
	            + kogo->query_zaimek(PL_CEL) + " zadnej szkody.");
	    actor("Uderzasz ", ({kogo}), PL_BIE, " w glowe, nie " +
	          "wyrzadzajac "+kogo->query_zaimek(PL_CEL)
	          +" zadnej szkody.");

			return;
	}
	target("niespodzianie uderza cie " + opis + " mocno w glowe.",
	       ({kogo}));
	all2act("niespodziewanie uderza", ({kogo}) ,PL_BIE," " +
	        opis + " mocno w glowe.");
	actor("Uderzasz",({kogo}),PL_BIE," mocno w glowe, ");
	kto->catch_msg("ogluszasz go za " + efekt);
	kogo->add_prop(P_OGL, kogo->query_prop(P_OGL) + efekt);

	if (!kogo->query_prop(P_HEAL_OGL))
	    kogo->add_prop(P_HEAL_OGL, set_alarm(60.0, 60.0, "heal_ogluszenie", kogo));

	if (kogo->query_hp() <= kogo->query_prop(P_OGL))
	{
	    kogo->catch_msg("Robi ci sie ciemno przed oczyma.\n");
	    actor("", ({kogo}), PL_MIA, " pada na ziemie nieprzytomny.");
	    tell_room(environment(kogo), QCIMIE(kogo,PL_MIA)
		      +" pada na ziemie nieprzytomny.\n",({kto,kogo}));
	    czas = 20 - kogo->query_fatigue() * 10 / kogo->query_max_fatigue();
	    kto->stop_fight(kogo);
	    dodaj_paraliz(kogo,czas);
	}
	return;
    }
    target("niespodziewanie zamierza sie na ciebie "+
	   mlot->koncowka("swoim ","swoja ")+opis+", ale haniebnie chybia",
	   ({kogo}));
    all2act("niespodziwewanie zamierza sie na ",({kogo}),PL_BIE," "+opis
            +" ale haniebnie chybia.");
    actor("Zamierzasz sie na ",({kogo}),PL_BIE," ale chybiasz.");
    return;
}

dodaj_paraliz(object komu, int czas)
{
    object p, cialo, *inv;
    int tmp, s;

    setuid();
    seteuid(getuid());
    p = clone_object(RYCERZ+"paraliz");
    p->set_stop_object(p);
    p->set_stop_fun("stop_paralize");
    p->set_stop_message("Odzyskujesz przytomnosc.\n");
    p->set_fail_message("Jestes ogluszony, dopoki nie "
			+"odzyskasz przytomnosci nie mozesz nic robic.");
    if (czas>20) czas = 20;
    p->set_remove_time(czas);
    komu->stop_fight(komu->query_attack());
    p->move(komu, 1);
    komu->add_prop(RZ_O_PARALIZ, p);

    remove_alarm(komu->query_prop(P_HEAL_OGL)); // Zatrzymanie leczenia
    komu->remove_prop(P_HEAL_OGL);              // punktow ogluszenia

    cialo = clone_object(RZ_TEMP_CIALO);        // Zastapienie obiektu gracza
    cialo->move(environment(komu), 1);          // kontenerem z jego rzeczami
    cialo->ustaw_cialo(komu);
    komu->add_prop(RZ_O_CIALO, cialo);
    
    inv = all_inventory(komu);
    s = sizeof(inv);
    for (tmp = 0 ; tmp < s ; tmp++)
    {
	if ( !inv[tmp]->query_prop(OBJ_M_NO_GET) && !inv[tmp]->query_no_show()
	     && !inv[tmp]->query_prop(OBJ_M_NO_STEAL) )
	    inv[tmp]->move(cialo, 1);
    }    
    
    komu->move(RZ_OGL_ROOM, 1);
}

void
heal_ogluszenie(object komu)
{
    int heal = F_HEAL_FORMULA(komu->query_stat(SS_CON), -komu->query_intoxicated());
    
    heal = heal >= 0 ? heal : 0;
    
    if (heal > komu->query_prop(P_OGL))
    {
	remove_alarm(komu->query_prop(P_HEAL_OGL));
	komu->remove_prop(P_OGL);
	komu->remove_prop(P_HEAL_OGL);
	return;
    }

    komu->add_prop(P_OGL, komu->query_prop(P_OGL) - heal);
}
