/* Pokoj pod woda
 */

inherit "/d/Imperium/std/room.c";
#include <macros.h>
#include <stdproperties.h> 

#define TP this_player()
#define TO this_object()
#define ENTP environment(TP)

#define LIVING_I_POD_WODA "_living_i_pod_woda"
// Prop okreslajacy ile czasu ktos jest juz pod woda
// 0-10 nie ma problemu
// >10 robi sie przykro - topimy sie
 
void
create_podwodny_room()
{
}



int
koniec()
{
    write("Nie mozesz zakonczyc gry, bedac pod woda.\n");
    return 1;
}        

void
create_imperium_room()
{
    create_podwodny_room();
    add_prop(ROOM_I_TYPE, ROOM_UNDER_WATER);
    add_prop(ROOM_I_INSIDE,1);

    set_alarm(10.0, 10.0, "mniej_powietrza");
}

void
mniej_powietrza()
{
    object *nurkujacy;
    int ile;
    int oddycha = 0;
    int i = 0;	
	
    nurkujacy = filter(all_inventory(this_object()),living);
	
    while(i < sizeof(nurkujacy))
    {
      if (nurkujacy[i]->query_wiz_level()) {oddycha = 1;}
      
      if(nurkujacy[i]->query_prop(MAGIC_I_BREATH_WATER))
      {
          nurkujacy[i]->catch_msg("Bez problemu oddychasz pod woda.\n");
          oddycha = 1;
      }
       
      if(!oddycha)
      {         
        ile = nurkujacy[i]->query_prop(LIVING_I_POD_WODA);        

        if(ile < 11)
        {
            switch(ile)
            {
                 case 0:
                 case 1:
                 case 2:
                 case 3:
                 nurkujacy[i]->catch_msg("Jestes pod woda. Zapas powietrza "+
                     "starczy ci jeszcze na troche.\n");
                 break;
                 case 4:
                 case 5:
                 case 6:
                 nurkujacy[i]->catch_msg("Przebywanie pod woda staje sie coraz "+
                     "trudniejsze. Pomysl o wyplynieciu na powierzchnie.\n");
                 break;
                 case 7:
                 case 8:
                 case 9:
                 nurkujacy[i]->catch_msg("W twych plucach braknie juz tlenu. "+
                     "Lepiej wyplyn natychmiast.\n");
                 break;
                 case 10:
                 nurkujacy[i]->catch_msg("Czujesz ze za chwile pluca pekna ci z "+
                    "braku tlenu. Wyplyn natychmiast!\n");           
                 break;
            }    
            nurkujacy[i]->add_prop(LIVING_I_POD_WODA, ile + 1);   
        }
        else
        {
            nurkujacy[i]->catch_msg("Dusisz sie! Nie masz czym oddychac! Niemal czujesz jak "+
                "pekaja ci pluca!\n");
            nurkujacy[i]->heal_hp(-(ile - 10)*100);
            if(nurkujacy[i]->query_hp() <= 0) 
              nurkujacy[i]->do_die(this_object());
        }           
      }   
     i += 1;
    }
}

void
leave_inv(object ob, object to)
{
    if(!to) return;
    
    ob->remove_prop(LIVE_M_MOUTH_BLOCKED);
    
    if(!function_exists("create_podwodny_room",to))
        ob->remove_prop(LIVING_I_POD_WODA);
    ::leave_inv(ob,to);
    
}        

zgas_plonace(object ob)
{
   object *inv;
   int i;
   
   inv=all_inventory(ob);
   
   for (i=0;i<sizeof(inv);i++)
      {
         if (inv[i]->query_prop(OBJ_I_HAS_FIRE))
            {
               ob->catch_msg("Woda szybko gasi " + inv[i]->short(ob,PL_BIE) + ".\n");
               tell_room(TO,"Woda szybko gasi " + QSHORT(inv[i],PL_BIE) + " " +
                  "trzymana przez " + QIMIE(ob,PL_BIE)+ ".\n",ob);
               inv[i]->extinguish_me();
               inv[i]->remove_prop(OBJ_I_HAS_FIRE);
            }
      }
}

void
enter_inv(object ob, object from)
{
    ::enter_inv(ob,from);
    if (living(ob))
       {
         set_alarm(0.5,0.0,&zgas_plonace(ob));
         ob->add_prop(LIVE_M_MOUTH_BLOCKED,"Zamiast glosu z ust wydobywa ci sie "+
           "kilka babelkow.\n");
       }
}        

int
woda()
{
    if(this_player()->query_skill(103) > random(50)) 
       return 0;                 // plywanie
    write("Nie udaje ci sie tam przeplynac.\n");
    say(QCIMIE(this_player(),PL_MIA)+" usiluje gdzies przeplynac, ale "+
      this_player()->koncowka("jego","jej")+" umiejetnosci plywackie "+
      "sa zbyt male.\n");
    this_player()->add_fatigue(-10);
    return 1;
}

int
oblicz_trud(int waga)
{
   return waga/7000;
}

int
plyn(string str)
{
   mixed oblist;
   object ob=0;
   string gdzie;
   int num;
   
   notify_fail("Przeplyn z <kim> <gdzie> ?\n");
   
   if (!str) return 0;
   
   if (!sscanf(str, "%s na %s",str,gdzie)) return 0;
   
   if ((num=member_array(gdzie,query_exit_cmds()))==-1) return 0;
   
   parse_command(str,ENTP, "'z' %l:"+PL_NAR,oblist);
   
   if (!sizeof(oblist)) return 0;
   
   if (!oblist[0]) return notify_fail("Przeplynac mozesz tylko z jedna osoba!\n");
   
   if (oblist[0]==1) ob=oblist[1];
    else if (oblist[0]<0) ob=oblist[-(oblist[0])];
    
   if (!ob) return 0;
   
   if (!CAN_SEE(TP,ob)) return 0;
   
   if (ob->query_prop(LIVING_I_POD_WODA)<8) 
      return notify_fail("Nie wyglada na to, by " + ob->short(TP,PL_MIA) + 
      	" topil" + ob->koncowka("","a","o","i","y") + " sie.\n");
   
   TP->add_fatigue(-(10+oblicz_trud(ob->weight())));
   if (TP->query_skill(103)<20+random(60)+oblicz_trud(ob->weight()))
      {
         
         write("Nie udaje ci sie tam przeplynac.\n");
         ob->catch_msg(TP->short(ob,PL_MIA) + " sprobowal" + 
         TP->koncowka("","a","o")+ " przeplynac z toba " +
          "na " + gdzie + ", ale " + TP->query_zaimek(PL_CEL,0) + " sie nie udalo.\n");
         tell_room(TO,QCIMIE(TP,PL_MIA) + " sprobowal" + 
         TP->koncowka("","a","o")+ " przeplynac z " +
         QIMIE(ob,PL_NAR) + " na " + gdzie + ", ale " + TP->query_zaimek(PL_CEL,0) +
         " sie nie udalo.\n", ({ob,TP}));
         return 1;
      }
   tell_room(TO,QCIMIE(TP,PL_MIA) + " wraz z " + QIMIE(ob,PL_MIA) + " plyna na " +
   gdzie + ".\n", ({ob,TP}) );
   TP->move_living("M",query_exit_rooms()[num],1);
   ob->move_living("M",query_exit_rooms()[num],1);
   
   write("Udalo ci sie wraz z " + ob->short(TP,PL_NAR) + " przeplynac na " + gdzie + ".\n");
   ob->catch_msg(TP->short(ob,PL_MIA) + " pomogl" + TP->koncowka("","a","o") + 
    " ci przeplynac na " + gdzie + ".\n");
   
   return 1;
}

void
init()
{
    ::init();
    add_action("koniec","zakoncz");
    add_action(plyn,"przeplyn");
}