
/* 
 * File:	quest.c
 * Autor:	Elvaron
 * Date:
 * Last Update:	25.11.97 by Kylo
 * Opis:	Funkcje przydatne przy questach
 *
 * 30.12.97  Poprawka uniemozliwiajaca ponowne wziecie questa.
 *           Drobne poprawki w funkcji logujacej.
 *                (Elvaron) 
 */
 
/*
 * Troche funkcji przydatnych przy 
 * kodowaniu questow.
 * Made by Elvaron.
 */
inherit "/std/act/seqaction";

#pragma strict_types
#pragma save_binary

#include <macros.h>

 
 mixed *komendy;
 int pozycja=0;
 mixed temp_seq=({0,0});
 
 int bi,gr;

 int bit;
 int group;
 string reget;
 string busy="W tej chwili jestem zajety ale przyjdz za chwilke.";
 string juz_rozm="'Wlasnie o tym mowie!";
 string gone="'Ups. Tak go zanudzilem ze sobie poszedl.";
 string not_get="Nie brales tego zadania.";
 string not_done="Nie wykonales zadania.";
 string znowu_zrobil="Dziekuje ze znowu nam pomogles";
 object aplikant=0;
 int zajety=0; 
 int qexp=0;
// Tablica z propami 
 string *propy=({""});
 string sprop; 
 string logfile;

// Dodane przez Kyla
// Ilosc istniejacych odpowiedzi
int nr_odp=0;
// Tablica z odpowiedziami
// Odpowiedz nr 0 - teksty przy dawaniu Questa
mixed *odpowiedzi=({""});
// odpowiedz dla niecierpliwych
string niecierpliwy="'Spokojnie zaraz do tego dojdziemy.";
 int quest_is_open(object gracz)
 {
  return 1;
 }

 void next_time(string str)
 {
   znowu_zrobil=str;
 }
 void set_logfile(string str)
 {
  logfile=str;
 }

 void set_odszedl(string str)
 {
  gone=str;
 }

 void set_niewzial(string str)
 {
  not_get=str;
 }
 
 void set_niewykonal(string str)
 {
  not_done=str;
 }
 
 
 void set_qexp(int i)
 {
  qexp=i;
 }

 void set_prop_name(string str)
 {
  propy[0]=str;
 }

 void set_hint_bit(int grupa, int bitt)
 {
     gr = grupa;
     bi = bitt;
 }    
 
 void set_done_prop_name(string str)
 {
  sprop=str;
 }
 
 int czy_gracz_moze_wziac_questa(object ob)
 {
  return 1;
 } 

 void set_questbit(int gr,int b)
 {
  bit=b;
  group=gr;
 }
 
 void set_zajety(string str)
 {
  busy=str;
 }
 
 void set_namolny(string str)
 { 
  juz_rozm=str;
 }
 
 void zrobiony(string str)
 {
  reget=str;
 }

 void set_quest(mixed *str)
 {
     odpowiedzi[0]=str;     
 } 
 
 string give_quest()
 {
  int i;
   if(this_player()==aplikant) {
     command(juz_rozm);
     return "";
   }
   if(zajety!=0) {
       command("powiedz do "+OB_NAME(this_player())+" "+busy);
       return "";
   }
   if(!quest_is_open(this_player())) return "";

   if(this_player()->test_bit("Imperium",group,bit)) {
       command("powiedz do "+OB_NAME(this_player())+" "+reget);
       return "";
   }
   if(!czy_gracz_moze_wziac_questa(this_player())) return "";
   
   aplikant=this_player(); 
   zajety=1;
   temp_seq[0]=seq_query("_mon_chat");
   temp_seq[1]=seq_query("_mon_ran_act");   
   seq_delete("_mon_chat");
   seq_delete("_mon_ran_act");
   komendy=odpowiedzi[0];      
  set_alarm(komendy[pozycja],0.0,"query_talk",0);
  return "";
 }

void query_talk(int nr_propa)
{    
    string prop;  
    if(!present(aplikant,environment(this_object()))) 
    {
        command(gone);
        seq_new("_mon_chat");
        seq_addfirst("_mon_chat",temp_seq[0]);
        seq_new("_mon_ran_act");
        seq_addfirst("_mon_ran_act",temp_seq[1]);
        pozycja=0;
        zajety=0;
        aplikant=0;
        return;
    }

    if(pozycja<sizeof(komendy)-2) 
    {
        pozycja++;
        if(komendy[pozycja][0]=='\'') 
	    command("powiedz do "+OB_NAME(aplikant)+" "+komendy[pozycja][1..]);   
        else 
	    command(komendy[pozycja]);   
        pozycja++;
        set_alarm(komendy[pozycja],0.0,"query_talk",nr_propa);
        return;
    } 

    if(pozycja=sizeof(komendy)-2) 
    {
        pozycja++;
        command(komendy[pozycja]);   
        seq_new("_mon_chat");
        seq_addfirst("_mon_chat",temp_seq[0]);
        seq_new("_mon_ran_act");
        seq_addfirst("_mon_ran_act",temp_seq[1]);
        pozycja=0;
        zajety=0;
	prop=propy[nr_propa];
	if(prop)
            aplikant->add_prop(prop,1);
            aplikant->set_bit(gr,bi);
        aplikant=0;
    }
}

 void congratulations(object ob)
 {
 return;
 }
 
 int calc_exp(object ob)
 {
   return qexp;
 }

 string done_quest()
 {
    if(this_player()==aplikant)
    {
        command(niecierpliwy);
    }
   if(zajety!=0) {
       command("powiedz do "+OB_NAME(this_player())+" "+busy);
       return "";
   }
   if(this_player()->test_bit("Imperium",group,bit)) {
       command("powiedz do "+OB_NAME(this_player())+" "+znowu_zrobil);
       return "";
   }
 if(!this_player()->query_prop(propy[0])) {
   command("powiedz do "+OB_NAME(this_player())+" "+not_get);   
   return "";
 } 
 if(!this_player()->query_prop(sprop)) {
   command("powiedz do "+OB_NAME(this_player())+" "+not_done);   
   return "";
 }   
 write_file(logfile,ctime(time())+": "+this_player()->query_name()+
     ", "+calc_exp(this_player())+" xp\n");
 congratulations(this_player());
 this_player()->set_bit(group,bit);
 this_player()->add_exp(calc_exp(this_player()));
 return "";
}

/*
 * Nazwa funkcji: add_odpowiedz()
 * Opis:          Dodaje kolejne odpowiedzi (tematy)
 * Argumenty:     pierwszy argument analogiczny jak w funkcji set_quest
 *   		  tematy numerowane sa kolejo (od 1) 
 * Zwraca:	  Nic nie zwraca
 */

void 
add_odpowiedz(mixed *tekst,string prop)
{
    mixed *temp_array_mixed=({""});
    string *temp_array_string=({""});
    temp_array_mixed[0]=tekst;
    temp_array_string[0]=prop;
    nr_odp++;
    odpowiedzi+=temp_array_mixed;
    propy+=temp_array_string;
}

/*
 * Nazwa funkcji: czy_odpowiedziec_graczowi()
 * Opis:          Przeznaczona do ewentualnego przykrycia funkcja
 *		  sprawdza czy nalezy graczowi udzielic odpowiedzi
 * Argumenty:     gracz,numer tematu 
 *   		  tematy numerowane sa kolejo (od 1) zgodnie z wywolywaniem
 *                add_odpowiedz (temat nr 0 to dawanie questa)
 * Zwraca:	  0 gdy graczowi nie odpowiadac
 *                1 gdy graczowi odpowiadac
 */

int 
czy_odpowiedziec_graczowi(object gracz,int temat)
{
    return 1;
}
// koniec funkcji czy_odpowiedziec_graczowi()

/*
 * Nazwa funkcji: odpowiedz()
 * Opis:          NPC odpowiada graczowi na temat podanym numerze
 *                przerobka funkcji give_quest
 * Argumenty:     numer tematu 
 *   		  tematy numerowane sa kolejo (od 1) zgodnie z wywolywaniem
 *                add_odpowiedz (temat nr 0 to dawanie questa)
 * Zwraca:	  pusty string (wymaganie VBFC)
 */

string 
odpowiedz(int temat)
{
    int i;
    if(this_player()==aplikant) 
    {
        command(niecierpliwy);
        return "";
    }
    if(zajety!=0) 
    {
        command("powiedz do "+OB_NAME(this_player())+" "+busy);
        return "";
    }
    if(((temat<1) || (temat>nr_odp+1)) && (nr_odp>1))
    {    
        command("powiedz do "+OB_NAME(this_player())+ " zglos buga. ");
	return "";
    }
    // Sprawdzamy czy odpowiedziec temu graczowi
    if(!czy_odpowiedziec_graczowi(this_player(),temat))
        return "";
	   
    aplikant=this_player(); 
    zajety=1;
    temp_seq[0]=seq_query("_mon_chat");
    temp_seq[1]=seq_query("_mon_ran_act");   
    seq_delete("_mon_chat");
    seq_delete("_mon_ran_act");
    komendy=odpowiedzi[temat];      
    set_alarm(komendy[pozycja],0.0,"query_talk",temat);
    return "";
}
// koniec funkcji odpowiedz()



