#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,
		   "snotling"  : 4,
		   
		]);

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"}),
		  "waz":   ({"ogon"}),]);


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");
}

emot_startu()
{
    switch(random(3))
    {
       case 0:
	  say(QCIMIE(this_player(), PL_MIA) +" zaczyna sie rozgladac wokol "+
 	     "glodnym wzrokiem.\n");
          write("Rozgladasz sie wokol zglodnialym wzrokiem...\n");
          break;
       case 1:
       	  command(TP, "przelknij");
       	  break;
       case 2: 
          command(TP, "oobliz sie");
          break;
    }
}


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);
}

int
czy_widzi(object ob)
{
  return CAN_SEE(this_player(), ob);
}

dodaj_trucizne(object komu, int pozywnosc)
{
   object tr;
   
   setuid();
   seteuid(getuid());
   
   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 posilku 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)
  {
  	if (sizeof(lok1))
  	   notify_fail("Z tego ciala mozesz jeszcze zjesc " + 
  	 	COMPOSITE_WORDS(lok1)+".\n");
  	else notify_fail(C(ob[0]->short(PL_MIA))+" jest niejadaln"+
  		ob[0]->koncowka("y","a","e")+".\n");
  	return 0;
  }
  
   
  set_alarm(1.0, 0.0, &zzeraj(TP, ob[0], lok));
  emot_startu();
  return 1;
 
}

usun_paraliz(object paraliz, object player)
{
	paraliz->remove_object();

}

 
wysw_koniec(object kto, object co, int pozywnosc, int koniec=0)
{
      set_this_player(kto);
      this_player()->eat_food(pozywnosc, 0);
      command(TP, "obliz sie");
      if (koniec)
      {
           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 "+
                     QIMIE(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();
            }
      }
      else
      	write("Obwieszczasz zjedzenie porcji glosnym, godnym prawdziwego ogra beknieciem.\n");
      	command(TP,"beknij");
} 
      
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 (!objectp(co))
    {
    	write("Rozgladasz sie wkolo zawiedzionym wzrokiem. Gdzie twoje jedzenie?\n");
    	return;
    }
    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");
    }
     
    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 = co->query_prop(OBJ_I_WEIGHT) * wspol / 100;
    
    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 (!sizeof(lok))
    {
      write(capitalize(co->short(PL_DOP)) + " przypominalo w smaku "+
            "trawe.\n");
      co->remove_object();
      return 1;
    }
    pom = min(pozywnosc/co->query_prop(CORPSE_I_ILE_CZESCI), 500);
    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) || this_player()->eat_food(pom=pom*3/5, 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]+" ");

    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");

    setuid();
    seteuid(getuid());
    
    paraliz=clone_object(PARALIZ);
    paraliz->move(TP);
    czas=(itof(pom)*(120.0-itof(TP->query_stat(SS_RACE))))/17.0/60.0;
    czas=MAX(itof(pom)/17.0, czas);
    set_alarm(czas, 0.0, &usun_paraliz(paraliz, TP));
    ile=random(ftoi(czas)/5);
    while(ile--)
    set_alarm(itof(random(ftoi(czas))), 0.0, 
            &command(TP, emocje_zjadania[random(sizeof(emocje_zjadania))]));

    set_alarm(czas, 0.0, &wysw_koniec(TP, co, pom, ktore_jedzenie==0 ));

    if (!ktore_jedzenie) co->remove_object();
    co->add_prop(CORPSE_I_NADGRYZIONY, ktore_jedzenie);

}
