#include <poison_types.h>

/* wspolczynniki jadalnosci, w zaleznosci od rasy
 * 10 - sredni
 * 18 - maksymalny
 * 2  - minimalny
 */
#define CORPSE_AS_HITLOCATIONS "_co_sie_da_zjesc_"


string *emocje_zjadania=({"zachrumkaj","zakrztus sie","czknij","przelknij","beknij"});

mapping rasy = ([  "halfling"  : 17,
		   "halflinka" : 18,
		   "mezczyzna" : 10,
		   "kobieta"   : 12,
		   "czlowiek"  : 10,
		   "ogr"       : 7,
		   "ogrzyca"   : 8,
		   "ork"       : 5,
		   "orczyca"   : 6,
		   "elf"       : 15,
		   "elfka"     : 16,
		   "goblin"    : 3,
		   "goblinka"  : 4,
		   "krasnolud" : 7,
		   "krasnoludka" : 9,
		   "dziecko"   : 12,
		   "smoczy ogr": 7,
		   "troll"     : 6,
		]);

string *hitloc = ({"korpus","lewa lape","prawa lape","lewa lape","prawa lape"});

string *std = ({"pozostale mieso","lewa noge","prawa noge", "lewa reke","prawa reke",});
string *zwierzeta = ({"los","szczur","wilk","niedzwiedz","wilczyca","sarna", 
		"mysz","jaszczur", "kozica", "niedzwiedzica", "niedzwiadek",
		"lis", "sarna", "kon", "dziki kot", "zubr","jednorozec", 
		"jelen", "borsuk" });


mapping inne = ([ "zajac": ({"korpus","uszy","lapy"}) ]);


string *co_do_zjedzenia(object ob)
{
	string rasa=ob->query_prop(CORPSE_M_RACE)[0];
	string *hitloki=ob->query_prop(CORPSE_AS_HITLOCATIONS);
	int j=ob->query_prop(CORPSE_I_NADGRYZIONY);
	if (j<1)
	{
		if (member_array(rasa, m_indices(rasy))>-1)
			hitloki=std;
		else
		if (member_array(rasa, zwierzeta)>-1)
			hitloki=hitloc;
		else 
		hitloki=inne[rasa];
		ob->add_prop(CORPSE_I_ILE_CZESCI, sizeof(hitloki));
		return hitloki;
	}
	return hitloki;
}
			
int
czy_cialo(object ob)
{
  return sizeof(ob->query_prop(CORPSE_M_RACE)) && (ob->query_decay()>3);
}

command(object kto, string co)
{
	kto->add_prop(EMOT_JEDZENIA, 1);
	if (!kto->command(co)) write("Wykonujesz: "+co+", ale jestes wizem, wiec tego nie widzisz.\n");
}

int
czy_widzi(object ob)
{
  return CAN_SEE(this_player(), ob);
}

dodaj_trucizne(object komu, int pozywnosc)
{
   object tr = clone_object(OBJ+"ogry_poison");
   tr->set_damage(({POISON_FATIGUE, 
     100 - komu->query_stat(SS_RACE),
     POISON_HP, 50 - komu->query_stat(SS_RACE)/2}));
   tr -> move(komu);
   tr -> start_poison();
   tr = clone_object(OBJ + "ogry_szczatki");
   tr -> set_prop( OBJ_I_WEIGHT, pozywnosc *
      ( 100-komu->query_stat(SS_RACE) ) );
   tr -> move(environment(komu));
   set_alarm (3.0, 0.0, &command(komu, "pierdnij"));
 return 1;
}

zzeraj(object kto, object co, int trucizna=0);


int
do_zjedz(string s)
{
  int pom, wspol, k, pozywnosc, emax, i, j, koniec = 0, trucizna=0;
  string lok, *lok1;
  object tr, *tmp, *ob = 
  	filter(all_inventory(environment(this_player())), &czy_cialo());
  setuid();
  seteuid(getuid());
  
  if (!s || s=="" || !ob || !sizeof(ob))
  {
    notify_fail("Slucham?\n");
    return 0;
  }
  
  if (this_player()->query_attack())
  {
    notify_fail("Niestety nie mozna jednoczesnie spozywac posileku i walczyc "+
    		".\n");
    return 0;
  }
  
  
  if (!(parse_command(s, ob, "%s 'z' %i:"+PL_DOP, lok, ob) || parse_command(s, ob, "%i:"+PL_BIE, ob)))
  {
     notify_fail("Co chcesz zjesc ?\n");
     return 0;
  }
  ob = NORMAL_ACCESS (ob, 0, 0);
 
 
  if (!(i = sizeof(ob)))
  {
    notify_fail("Co chcesz zjesc ?\n");
    return 0;
  }
  if (i>1)
  {
  	notify_fail("Ktore konkretnie cialo chcesz zjesc?\n");
  	return 0;
  }
  
  if (lok && lok!="" && (i=member_array(lok, lok1=co_do_zjedzenia(ob[0])))==-1)
  {
  	notify_fail("Z tego ciala mozesz jeszcze zjesc " + 
  	 	COMPOSITE_WORDS(lok1)+".\n");
  	return 0;
  }
  
   
  set_alarm(0.30, 0.0, &zzeraj(TP, ob[0], lok));
  say(QCIMIE(this_player(), PL_MIA) +" zaczyna sie rozgladac wokol "+
 	"glodnym wzrokiem.\n");
  write("Rozgladasz sie wokol zglodnialym wzrokiem...\n");
  return 1;
 
}

usun_paraliz(object paraliz, object player)
{
	paraliz->remove_object();
	command(player, "obliz sie");
}

 
wysw_koniec(object kto, object co, int pozywnosc)
{
      set_this_player(kto);
      if (TP->query_stat(SS_RACE)<100 && random(2))
      {
	    write("Niedojedzone czesci ciala wypadaja ci z ust na podloze.\n");
            say("Niedojedzone czesci "+co->short(PL_DOP)+" wypadaja z ust "+
                QCIMIE(this_player(), PL_DOP)+" na podloze.\n");
            dodaj_trucizne(TP, pozywnosc);
            co->remove_object();
      }
      else
      {
           write("Jako dobry ogr nie pozostawiles niczego drobnym "+
             "podjadaczom, ktorzy mogliby czychac na twoj posilek.\n");
           set_alarm(3.0, 0.0, &command(TP, "beknij przecia"));
           co->remove_object();
       }
}

zzeraj(object kto, object co, string co_je=0)
{
    int ktora_lokacja, ktore_jedzenie, pozywnosc, pom, wspol, ile;
    string *lok, *lok1, rasa;
    object *tmp, paraliz;	
    float czas;
    set_this_player(kto);
    if (co_je=="") co_je=0;
    if (sizeof(tmp=filter(all_inventory(co), &czy_widzi())))
    {
       write("Fachowymi ruchami wytrzasasz "+
         "z "+co->short(PL_DOP)+" ");
       say(QCIMIE(this_player(),PL_MIA)+
         " fachowymi ruchami wytrzasa "+
         "z "+co->short(PL_DOP)+" ");
       tmp->move(environment(co));
       write (COMPOSITE_DEAD(tmp, PL_BIE)+".\n");
       say (COMPOSITE_DEAD(tmp, PL_BIE)+".\n");
    }
     
    pozywnosc = co->query_prop(OBJ_I_WEIGHT) / 4 * 
                (100+this_player()->query_stat(SS_RACE))/100 + 1;
    if ( !(wspol=rasy[rasa=co->query_prop(CORPSE_M_RACE)[0]]))
    {
       if (member_array(rasa, zwierzeta+m_indices(inne))>-1)
       	    wspol = 15;
       else
       { 
       write(C(co->short(PL_MIA))+" nie nadaje sie do jedzenia.\n");
       return;
       }
    }
       	    
    pozywnosc = pozywnosc * wspol / 1000;

    lok=co_do_zjedzenia(co);
    if (!lok) 
    {
    	write(C(co->short(PL_MIA))+" nie nadaje sie do jedzenia.\n");
	return;
    }
    ktora_lokacja=(member_array(co_je, lok));
    if (ktora_lokacja==-1) ktora_lokacja=sizeof(lok)-1;
    
/*    if (ktore_jedzenie=co->query_prop(CORPSE_I_NADGRYZIONY))
    {
      pozywnosc = pozywnosc - pozywnosc / co->query_prop(CORPSE_I_ILE_CZESCI); 
    }
*/
/*    if (this_player()->eat_food(pozywnosc, 1))
    {
       say(QCIMIE(this_player(), PL_MIA) + " pozera w calosci "+
         co->short(PL_BIE)+(koniec?", niekiedy odrzucajac na bok "+
            "jakies szczatki.\n":".\n"));
         
       write("Pozerasz "+co->short(PL_BIE)+(koniec?". Z twoich ust "+
          "wypadaja niekiedy jakiesz szczatki.\n": ".\n"));
       if (wspol > 10)
         write ("Z prawdziwa przyjemoscia spozyl"+
                this_player()->koncowka("es ","as ") + co->short(PL_BIE) +
                ".\n");
       else
         write(capitalize(co->short(PL_MIA)) + " bylo dosc zylaste i "+
              "niezbyt smaczne.\n");
       this_player()->eat_food(pozywnosc, 0);
       koniec = 1;
       co->remove_object();
    }
   else    */
   {  
     if (!sizeof(lok))
     {
       write(capitalize(co->short(PL_DOP)) + " przypominalo w smaku "+
             "trawe.\n");
       co->remove_object();
       return 1;
     }
     pom = pozywnosc/co->query_prop(CORPSE_I_ILE_CZESCI);
     if (co->query_prop(CORPSE_I_NADGRYZIONY))
       ktore_jedzenie = co->query_prop(CORPSE_I_NADGRYZIONY);
     else ktore_jedzenie=sizeof(lok);
  
     if (this_player()->eat_food(pom, 1))
     {
       write("Odrywasz ");
       say(QCIMIE(this_player(), PL_MIA)+" z wielka wprawa odrywa ");
     }
     else
     {
       write(capitalize(co->short(PL_MIA)) + " stanowi zbyt duze wyzwanie "+
             "dla twojego nieposkromionego glodu.\n");
       say(QCIMIE(this_player(), PL_MIA)+ " spojrzal glodnym wzrokiem na "+
         co->short(PL_BIE)+".\n");
       
       return 1;
     }
     ktore_jedzenie--;
     write (lok[ktora_lokacja]+" ");
     say(lok[ktora_lokacja]+" ");
     this_player()->eat_food(pom, 0);
     co->add_prop(CORPSE_I_NADGRYZIONY, ktore_jedzenie);
     if (!ktora_lokacja) lok=lok[1..-1];
     else lok=lok[0..(ktora_lokacja-1)]+lok[ktora_lokacja+1..-1];
     co->add_prop(CORPSE_AS_HITLOCATIONS, lok);
     
     write("po czym zaczynasz przezuwac wyrwane kawalki miesa.\n");
     say("po czym zaczyna przezuwac wyrwane kawalki miesa.\n");
     
     paraliz=clone_object(PARALIZ);
     paraliz->move(TP);
     czas=5.0+30.0/itof(TP->query_stat(SS_RACE)+1);
     set_alarm(czas, 0.0, &usun_paraliz(paraliz, TP));
     ile=random(ftoi(czas)/3);
     while(ile--)
       set_alarm(itof(random(ftoi(czas))), 0.0, 
             &command(TP, emocje_zjadania[random(sizeof(emocje_zjadania))]));

     if (ktore_jedzenie==0)
     {
     	set_alarm(czas, 0.0, &wysw_koniec(TP, co, pozywnosc));
        return 1;
     }

     co->add_prop(CORPSE_I_NADGRYZIONY, ktore_jedzenie);
   }
}
