final_realms_fluffos_v1/
final_realms_fluffos_v1/bin/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/ChangeLog.old/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/Win32/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/simuls/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/clone/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/command/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/data/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/etc/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/master/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/log/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/compiler/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/efuns/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/operators/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/u/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/tmp/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/windows/
final_realms_fluffos_v1/lib/baseobs/guilds/
final_realms_fluffos_v1/lib/baseobs/misc/
final_realms_fluffos_v1/lib/baseobs/races/shadows/
final_realms_fluffos_v1/lib/cmds/god/
final_realms_fluffos_v1/lib/cmds/handlers/
final_realms_fluffos_v1/lib/cmds/handlers/cmds/
final_realms_fluffos_v1/lib/d/heaven/
final_realms_fluffos_v1/lib/d/heaven/heaven/ave/
final_realms_fluffos_v1/lib/d/mudlib/
final_realms_fluffos_v1/lib/d/newbie/
final_realms_fluffos_v1/lib/d/newbie/docs/
final_realms_fluffos_v1/lib/d/newbie/drow/armour/
final_realms_fluffos_v1/lib/d/newbie/drow/items/
final_realms_fluffos_v1/lib/d/newbie/drow/mobs/
final_realms_fluffos_v1/lib/d/newbie/drow/oldmobs/
final_realms_fluffos_v1/lib/d/newbie/drow/weapons/
final_realms_fluffos_v1/lib/d/newbie/duergar/weapons/
final_realms_fluffos_v1/lib/d/newbie/dwarf/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/cafe/
final_realms_fluffos_v1/lib/d/newbie/elf/chars/equip/
final_realms_fluffos_v1/lib/d/newbie/elf/items/armours/
final_realms_fluffos_v1/lib/d/newbie/elf/items/obj/
final_realms_fluffos_v1/lib/d/newbie/elf/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/quick_fix/
final_realms_fluffos_v1/lib/d/newbie/gnome/armour/
final_realms_fluffos_v1/lib/d/newbie/gnome/buildings/
final_realms_fluffos_v1/lib/d/newbie/gnome/items/
final_realms_fluffos_v1/lib/d/newbie/gnome/npcs/clones/
final_realms_fluffos_v1/lib/d/newbie/gnome/rooms/northrooms/
final_realms_fluffos_v1/lib/d/newbie/gnome/weapons/
final_realms_fluffos_v1/lib/d/newbie/goblin/armour/
final_realms_fluffos_v1/lib/d/newbie/goblin/items/
final_realms_fluffos_v1/lib/d/newbie/grads/log/
final_realms_fluffos_v1/lib/d/newbie/grads/npcs/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/cave1/
final_realms_fluffos_v1/lib/d/newbie/grads/temp/
final_realms_fluffos_v1/lib/d/newbie/guests/weapons/
final_realms_fluffos_v1/lib/d/newbie/half-elf/items/
final_realms_fluffos_v1/lib/d/newbie/half-elf/newroomss/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/castle/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/drows/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/savannah/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/secret/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/town/
final_realms_fluffos_v1/lib/d/newbie/halfling/
final_realms_fluffos_v1/lib/d/newbie/halfling/misc/
final_realms_fluffos_v1/lib/d/newbie/halfling/rooms/cave/
final_realms_fluffos_v1/lib/d/newbie/human/
final_realms_fluffos_v1/lib/d/newbie/human/armour/
final_realms_fluffos_v1/lib/d/newbie/human/monsters/
final_realms_fluffos_v1/lib/d/newbie/human/obj/
final_realms_fluffos_v1/lib/d/newbie/human/weapons/
final_realms_fluffos_v1/lib/d/newbie/lizard/armour/
final_realms_fluffos_v1/lib/d/newbie/lizard/items/
final_realms_fluffos_v1/lib/d/newbie/lizard/underwater/
final_realms_fluffos_v1/lib/d/newbie/lizard/weapons/
final_realms_fluffos_v1/lib/d/newbie/logs/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/rooms/
final_realms_fluffos_v1/lib/d/newbie/newelf/
final_realms_fluffos_v1/lib/d/newbie/newelf/chars/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/recopied/
final_realms_fluffos_v1/lib/d/newbie/newelf/obj/
final_realms_fluffos_v1/lib/d/newbie/newelf/quest_docs./
final_realms_fluffos_v1/lib/d/newbie/newken/
final_realms_fluffos_v1/lib/d/newbie/newken/chars/
final_realms_fluffos_v1/lib/d/newbie/newken/misc/
final_realms_fluffos_v1/lib/d/newbie/newken/npcs/
final_realms_fluffos_v1/lib/d/newbie/newken/obj/
final_realms_fluffos_v1/lib/d/newbie/newliz/
final_realms_fluffos_v1/lib/d/newbie/newliz/cave/
final_realms_fluffos_v1/lib/d/newbie/newliz/npcs/
final_realms_fluffos_v1/lib/d/newbie/orc/items/misc/
final_realms_fluffos_v1/lib/d/newbie/orc/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/orc/tower/
final_realms_fluffos_v1/lib/d/vehicle/
final_realms_fluffos_v1/lib/doc/
final_realms_fluffos_v1/lib/doc/driver/
final_realms_fluffos_v1/lib/doc/driver/concepts/
final_realms_fluffos_v1/lib/doc/driver/driver/
final_realms_fluffos_v1/lib/doc/driver/efuns/arrays/
final_realms_fluffos_v1/lib/doc/driver/efuns/bitstrings/
final_realms_fluffos_v1/lib/doc/driver/efuns/communication/
final_realms_fluffos_v1/lib/doc/driver/efuns/core/
final_realms_fluffos_v1/lib/doc/driver/efuns/debugging/
final_realms_fluffos_v1/lib/doc/driver/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/driver/efuns/interactive/
final_realms_fluffos_v1/lib/doc/driver/efuns/mappings/
final_realms_fluffos_v1/lib/doc/driver/efuns/objects/
final_realms_fluffos_v1/lib/doc/driver/efuns/security/
final_realms_fluffos_v1/lib/doc/driver/efuns/strings/
final_realms_fluffos_v1/lib/doc/driver/efuns/system/
final_realms_fluffos_v1/lib/doc/driver/efuns/types/
final_realms_fluffos_v1/lib/doc/driver/lpc/constructs/
final_realms_fluffos_v1/lib/doc/driver/lpc/types/
final_realms_fluffos_v1/lib/doc/driver/platforms/
final_realms_fluffos_v1/lib/doc/lpc/
final_realms_fluffos_v1/lib/doc/mail/
final_realms_fluffos_v1/lib/doc/man/
final_realms_fluffos_v1/lib/doc/man/html/
final_realms_fluffos_v1/lib/doc/man/html/applies/
final_realms_fluffos_v1/lib/doc/man/html/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/html/driver/
final_realms_fluffos_v1/lib/doc/man/html/efuns/
final_realms_fluffos_v1/lib/doc/man/html/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/html/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/html/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/html/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/html/efuns/general/
final_realms_fluffos_v1/lib/doc/man/html/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/
final_realms_fluffos_v1/lib/doc/man/local/applies/
final_realms_fluffos_v1/lib/doc/man/local/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/local/applies/master/
final_realms_fluffos_v1/lib/doc/man/local/concepts/
final_realms_fluffos_v1/lib/doc/man/local/defines/
final_realms_fluffos_v1/lib/doc/man/local/driver/
final_realms_fluffos_v1/lib/doc/man/local/efuns/
final_realms_fluffos_v1/lib/doc/man/local/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/local/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/local/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/local/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/local/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/local/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/local/efuns/general/
final_realms_fluffos_v1/lib/doc/man/local/efuns/interactive/
final_realms_fluffos_v1/lib/doc/man/local/efuns/internals/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/local/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/objects/
final_realms_fluffos_v1/lib/doc/man/local/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/efuns/sockets/
final_realms_fluffos_v1/lib/doc/man/local/efuns/strings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/system/
final_realms_fluffos_v1/lib/doc/man/local/historical/
final_realms_fluffos_v1/lib/doc/man/local/lfun/QC/
final_realms_fluffos_v1/lib/doc/man/local/lfun/events/
final_realms_fluffos_v1/lib/doc/man/local/lfun/monster/
final_realms_fluffos_v1/lib/doc/man/local/lfun/properties/
final_realms_fluffos_v1/lib/doc/man/local/lpc/
final_realms_fluffos_v1/lib/doc/man/local/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/local/lpc/types/
final_realms_fluffos_v1/lib/doc/man/local/standards/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/basic/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/intermediate/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/concepts/
final_realms_fluffos_v1/lib/doc/man/mudos/driver/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/general/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mixed/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/types/
final_realms_fluffos_v1/lib/doc/races/
final_realms_fluffos_v1/lib/doc/races/old_race/
final_realms_fluffos_v1/lib/global/virtual/
final_realms_fluffos_v1/lib/global/wiz_backup/
final_realms_fluffos_v1/lib/net/config/
final_realms_fluffos_v1/lib/net/daemon/chars/
final_realms_fluffos_v1/lib/net/inherit/
final_realms_fluffos_v1/lib/net/intermud3/
final_realms_fluffos_v1/lib/net/intermud3/cmds/
final_realms_fluffos_v1/lib/net/intermud3/save/
final_realms_fluffos_v1/lib/net/intermud3/services/
final_realms_fluffos_v1/lib/net/obj/
final_realms_fluffos_v1/lib/net/old/
final_realms_fluffos_v1/lib/net/old/intermud/
final_realms_fluffos_v1/lib/net/old/intermud/adm/
final_realms_fluffos_v1/lib/net/old/intermud/services/
final_realms_fluffos_v1/lib/net/old/intermud/udp/
final_realms_fluffos_v1/lib/net/virtual/
final_realms_fluffos_v1/lib/obj/b_day/
final_realms_fluffos_v1/lib/obj/chars/
final_realms_fluffos_v1/lib/obj/handlers/lists/
final_realms_fluffos_v1/lib/obj/handlers/useless/
final_realms_fluffos_v1/lib/obj/monsters/
final_realms_fluffos_v1/lib/obj/roomgen/
final_realms_fluffos_v1/lib/obj/soul/
final_realms_fluffos_v1/lib/obj/vegetation/
final_realms_fluffos_v1/lib/obj/weapons/oldsys/
final_realms_fluffos_v1/lib/open/
final_realms_fluffos_v1/lib/players/g/
final_realms_fluffos_v1/lib/releasefiles/d/heaven/
final_realms_fluffos_v1/lib/releasefiles/d/mudlib/
final_realms_fluffos_v1/lib/releasefiles/d/newbie/
final_realms_fluffos_v1/lib/releasefiles/doc/
final_realms_fluffos_v1/lib/releasefiles/players/g/
final_realms_fluffos_v1/lib/releasefiles/save/
final_realms_fluffos_v1/lib/releasefiles/save/environ/
final_realms_fluffos_v1/lib/releasefiles/save/roomgen/
final_realms_fluffos_v1/lib/releasefiles/secure/
final_realms_fluffos_v1/lib/releasefiles/w/
final_realms_fluffos_v1/lib/releasefiles/w/god/
final_realms_fluffos_v1/lib/room/
final_realms_fluffos_v1/lib/save/
final_realms_fluffos_v1/lib/save/environ/
final_realms_fluffos_v1/lib/save/roomgen/
final_realms_fluffos_v1/lib/scripts/
final_realms_fluffos_v1/lib/secure/crerem/
final_realms_fluffos_v1/lib/secure/dom/
final_realms_fluffos_v1/lib/secure/log/
final_realms_fluffos_v1/lib/secure/misc/
final_realms_fluffos_v1/lib/std/adnd/
final_realms_fluffos_v1/lib/std/commands/shadows/
final_realms_fluffos_v1/lib/std/creator/
final_realms_fluffos_v1/lib/std/curses/
final_realms_fluffos_v1/lib/std/curses/old_sys/
final_realms_fluffos_v1/lib/std/curses/shadows/
final_realms_fluffos_v1/lib/std/dom/
final_realms_fluffos_v1/lib/std/effects/
final_realms_fluffos_v1/lib/std/effects/healing/
final_realms_fluffos_v1/lib/std/effects/other/
final_realms_fluffos_v1/lib/std/effects/poisons/
final_realms_fluffos_v1/lib/std/environ/
final_realms_fluffos_v1/lib/std/guilds/
final_realms_fluffos_v1/lib/std/guilds/priests/samples/
final_realms_fluffos_v1/lib/std/guilds/wizards/
final_realms_fluffos_v1/lib/std/living/baldy/
final_realms_fluffos_v1/lib/std/living/divstuff/
final_realms_fluffos_v1/lib/std/paran/
final_realms_fluffos_v1/lib/std/poisons/
final_realms_fluffos_v1/lib/std/poisons/shadows/
final_realms_fluffos_v1/lib/std/poisons/weapons/
final_realms_fluffos_v1/lib/std/race_groups/
final_realms_fluffos_v1/lib/std/room/
final_realms_fluffos_v1/lib/std/room/old/
final_realms_fluffos_v1/lib/std/rooms/
final_realms_fluffos_v1/lib/std/shadows/
final_realms_fluffos_v1/lib/std/shadows/test_shad/
final_realms_fluffos_v1/lib/std/socket/
final_realms_fluffos_v1/lib/std/spells/
final_realms_fluffos_v1/lib/std/vaults/
final_realms_fluffos_v1/lib/tmp/
final_realms_fluffos_v1/lib/w/
final_realms_fluffos_v1/lib/w/god/
final_realms_fluffos_v1/old/
final_realms_fluffos_v1/win32/
/****************************************************************************
*                     Voting room                        *
*                                        *
*                   Khelben, 1997                        *
*                                        *
*****************************************************************************/            

/*
mapping vote_data
([ "subject" : limited,   //The vote is free (0) or I must choose btw some
              //candidates(1)
           info      //Some usefull info
            ({ candidate1: ({ votes }) , candidate2: ({ votes }) , ... }),
               flag1   //0 All the people 
                         //1 Only some races
                         //2 Only some groups
                         //3 Only some race-groups
               ({ flag races, groups.... })
               flag2   //0 All the people can vote
                          //1 Only people over 5 days old can vote
                          //x Only people over level x can vote.
])

*/

inherit "/std/room.c";

#define LOGFILE "/save/vote_data"

#define TIME 432000  // 5 days of play

mapping vote_data;
string *vote_list = ({ });


int do_help(string str);
int have_power(object ob);
int dofinish(string str);
int result(string str);
int do_list(string str);
int can_vote(string str);
int vote(string str);
int get_vote(string str, mixed tmp);
int add_subject(string sub, int limited, string info, string *candidates,
                int flag1, string *whoflag1, int flag2);
void do_resume(string sub, int limited, string info, string *candidates, 
               int flag1, string *whoflag1, int flag2);


void restore_function() 
{
   if( !sizeof(vote_data) )   
      restore_object(LOGFILE, 1);
}


void create()
{
   ::create();
   vote_data = ([ ]);
   restore_function();
}

void save_function() 
{
   if( sizeof(vote_data) )   
      save_object(LOGFILE);
}


void dest_me()
{
   save_function();
   destruct(this_object());
}

void init()
{
   add_action("vote","vote");
   add_action("do_list","list");
   add_action("result","result");   
   add_action("dofinish","finish");
   add_action("do_help","help");
   add_action("new_votation","newvote");
   add_action("resume","resume");
   
   ::init();
}   

void event_enter(object who, string mess)
{
   int i;
   
   for( i=0; i<sizeof(vote_list); i++ )
   {
      if(who->query_property(vote_list[i]))   //Subjects removed from votations.
         who->remove_property(vote_list[i]);  //Removing properties.
   }
}

int do_help(string str)
{
string helpinmortal = "\n\n"
"**********************************************************************\n"+
"*                                                                    *\n"+
"*     This is a vote room. Available commands are:                   *\n"+
"*                                                                    *\n"+
"*          list            : For seeing all the actual votations.    *\n"+
"*          list <subject>  : Who can you vote.                       *\n"+
"*          vote <subject>  : You need help about this?.              *\n"+
"*          resume <subject>: Give information about a votation.      *\n"+
"*          result <subject>: See the actuals results.                *\n"+
"*          finish <subject>: Finish a votation and log it.           *\n"+
"*          newvote         : Runs a program for add a new votation.  *\n"+    
"*                                                                    *\n"+
"*              If you find any bug, mail Khelben.                    *\n"+
"*                                                                    *\n"+
"**********************************************************************\n\n";

string help = "\n\n"
"**********************************************************************\n"+
"*                                                                    *\n"+
"*     This is a vote room. Available commands are:                   *\n"+
"*                                                                    *\n"+
"*          list          : For seeing all the actual votations.      *\n"+
"*          list <subject>: Who can you vote.                         *\n"+
"*          vote <subject>: You need help about this?.                *\n"+
"*                                                                    *\n"+
"*              If you find any bug, mail Khelben.                    *\n"+
"*                                                                    *\n"+
"**********************************************************************\n\n";

   if(str != "vote")
      return 0;
   if(have_power(TP))
      write(helpinmortal);
   else
      write(help);   
   return 1;
}

int have_power(object ob)
{
   if( ob->query_lord() )
      return 1;
   if( (string)ob->query_name() == "khelben" )
      return 1;

   return 0;
}

int dofinish(string str)
{
   int i;
   mixed tmp;
   string list="", *key;

   restore_function();
   if(!have_power(TP))
   {
      write("Only immortals can finish the votations.\n");
      return 1;
   }
   if(!str)
   {
      write("The actual votings are:\n");
      key = keys(vote_data);
      write("\n");
      for (i=0; i<sizeof(key); i++)
      {
         list += key[i];
         list += " : ";
         list += vote_data[key[i]][1];
         list += ".\n";
      }
      list += "\n\nPLEASE, choose one of the above.\n";
      this_player()->more_string(list);
    }  
    else
    {
       tmp = vote_data[str];
       if(tmp)
       {
          list += "The results for '"+tmp[1]+"' are: \n\n";
          for(i=0;i<sizeof(tmp[2]); i++)
          {
             list += tmp[2][i][0]+" : ";
             list += tmp[2][i][1]+".\n";
          }
          list += "\nFinished by "+this_player()->query_cap_name();
          list += " at "+ctime(time())+".\n";
          log_file(str+"_VOTATION", list);
          write("Votation '"+str+"' finished and logged at /log/"+str+".\n");
          vote_list += ({ tmp[1] });
          map_delete(vote_data,str);
       }       
       else
       {
          write("We are not voting '"+str+"'.\n");
          return 1;
       }
    }
    save_function();
    return 1;
}    
    
int result(string str)
{
   int i;
   mixed tmp;
   string list="", *key;

   if(!have_power(TP))
   {
      write("Only immortals can see the results.\n");
      return 1;
   }

   if(!str)
   {
      write("The actual votings are:\n");
      key = keys(vote_data);
      write("\n");
      for (i=0; i<sizeof(key); i++)
      {
         list += key[i];
         list += " : ";
         list += vote_data[key[i]][1];
         list += ".\n";
      }
      list += "\n\nPLEASE, choose one of the above.\n";
    }  
    else
    {
       tmp = vote_data[str];
       if(tmp)
       {
          list += "The results for "+tmp[1]+" are: \n\n";
          for(i=0;i<sizeof(tmp[2]); i++)
          {
             list += tmp[2][i][0]+" : ";
             list += tmp[2][i][1]+".\n";
          }
       }       
       else
       {
          write("We are not voting '"+str+"'.\n");
          return 1;
       }
    }
    
    this_player()->more_string(list);
    return 1;
}

int do_list(string str)
{
   int i;
   mixed tmp;
   string list="", *key;

   if(!str)
   {
      write("The actual votings are:\n");
      key = keys(vote_data);
      write("\n");
      for (i=0; i<sizeof(key); i++)
      {
         list += key[i];
         list += " : ";
         list += vote_data[key[i]][1];
         list += ".\n";
      }
    }  
    else
    {
       tmp = vote_data[str];
       if(tmp && tmp[0]==1)
       {
          list += "The candidates for "+tmp[1]+" are: \n";
          for(i=0;i<sizeof(tmp[2]); i++)
             list += tmp[2][i][0]+".\n";
       }       
       else
          list += "You have free vote!.\n";
    }
    
    this_player()->more_string(list);
    return 1;
}


int can_vote(string str)
{
   mixed tmp;
   string aux;

   if( !vote_data[str] )
   {
      write("There is not any votation about '"+str+"'.\n");
      return 1;
   }
   tmp = allocate(6);
   tmp = vote_data[str];
   if( TP->query_property(str) )
   {
      write("You already voted about this!.\n");
      return 0;
   }
   if ( tmp[5] == 1 )
   {
      if( TP->query_time_on() < TIME )
      {
         write("Sorry, you must be over 5 days old for voting about "+
               str+".\n");
         return 0;
      }
   }
   if( tmp[5] > 1 )
   {
      if( TP->query_level() < tmp[5] )
      {
         write("Sorry, you must be over level "+tmp[5]+" for voting about "+
               str+".\n");
         return 0;
      }
   }
   switch(tmp[3])
   {
      case 1 :
                 aux = TP->query_race();
                 break;

      case 2:
               aux = TP->query_group();
               break;
              
      case 3:
               aux = TP->query_race_group();
               break;
      
      default:
               aux = "";
               break;
   }
   if(aux != "")
   {
      if( member_array(aux, tmp[4]) == -1 )
      {
         write("Sorry, "+str+" votation is restricted. You cannot vote "+
               "about it.\n");
         return 0;
      }
   }
   
   return 1;
}

int vote(string str)
{
   mixed tmp;
   int i;
   string list;

   restore_function();
   
   if( !vote_data[str] )
   {
      write("There is not any votation about '"+str+"'.\n");
      return 1;
   }
   if( can_vote(str) )
   {
      write("Ok, voting about '"+str+"'.\n");
      tmp = allocate(6);
      tmp = vote_data[str];
      if( tmp[0] ==  1 )
         do_list(str);
      write("Type your vote: ");
      input_to("get_vote",0,tmp);
   }
   save_function();
   return 1;
}

int get_vote(string str, mixed tmp)
{
   int i,enc=0;
   mixed tmpaux;

   while( i<sizeof(tmp[2]) && !enc)
   {
      if( tmp[2][i][0] == str )
      {
         tmp[2][i][1] += 1;
         enc = 1;
      }
      i += 1;
   }
   if( tmp[0] == 0 && !enc)
   {
      tmpaux = allocate(2);
      tmpaux[0] = str;
      tmpaux[1] = 0;
      tmp[2] += ({ tmpaux });
   }         
   if( tmp[0] == 1 && !enc)
   {
      write("Wrong vote! Try again.\n");
      return 0;
   }
   vote_data[tmp[1]] = tmp;
   TP->add_property(tmp[1],1);  //Mark him: he voted.
   return 1;
}         
                 
int add_subject(string sub, int limited, string info, string *candidates, 
        int flag1, string *whoflag1, int flag2)
{
   mixed tmp;
   mixed tmpaux;
   int i;
   
   restore_function();
   if( vote_data[sub] )
   { 
      write("That subject is already on votation.\n");
      return 1;
   }
   tmp = allocate(6);
   tmp[0] = limited;
   tmp[1] = info;
   
   if( limited == 1 )   //If there is a finite number of candidates      
   {
      if( !tmp[2] )
         tmp[2] = ({ });
      for (i=0; i<sizeof(candidates); i++)
      {
         tmpaux = allocate(2);
         tmpaux[0]=candidates[i];
         tmpaux[1]=10;
         tmp[2] += ({ tmpaux });
      }
   }
   else
   {
      tmp[2] = ({ });
   } 
   tmp[3] = flag1;
   tmp[4] = ({ });
   for(i=0;i<sizeof(whoflag1); i++)
      tmp[4] += ({ whoflag1[i] });   
   tmp[5] = flag2;      
          
   vote_data[sub] = tmp;      

   write("Added a votation.\n");
   save_function();
   return 1;
}         

int new_votation()
{
   
   string sub, info, *candidates, *whoflag1;
   int limited, flag1, flag2;  

   if(!have_power(TP))
   {
      write("Sorry, you cannot start a new votation.\n");
      return 1;
   }
   write("Introduce the subject of the votation (no whitespaces please): ");
   input_to("new1", sub, limited, info, candidates, flag1, whoflag1, flag2);
   return 1;
}

int new1(string str, string sub, int limited, string info, 
         string *candidates, int flag1, string *whoflag1, int flag2)
{
   if( vote_data[sub] )
   { 
      write("That subject is already on votation.\n");
      return 1;
   }   
   sub = str;
   write("Now you must introduce information about '"+str+"' votation. "+
         "For example: 'We are voting for choosing a guildmaster'.\n");
   write("Info: ");
   input_to("new2", sub, limited, info, candidates, flag1, whoflag1, flag2);
   return 1;
}

int new2(string str, string sub, int limited, string info, 
         string *candidates, int flag1, string *whoflag1, int flag2)
{
   info = str;
   input_to("new3", sub, limited, info, candidates, flag1, whoflag1, flag2);   
   write("Ok, now you must enter a number. Enter '0' if the vote is free, "+
         "or enter '1' if there are some candidates.\n");
   write("Enter the number: ");         
   input_to("new3", sub, limited, info, candidates, flag1, whoflag1, flag2);

   return 1;
}

int new3(string str, string sub, int limited, string info, 
         string *candidates, int flag1, string *whoflag1, int flag2)
{
   if(str != "0" && str != "1")
   {
      write("Sorry, you must enter '0' or '1'.\n");
      return 1;
   }
   limited = to_int(str);
   write("DEBUG: "+sub+"   "+info+"    lim = "+limited+".\n");
   if(limited == 0)
   {
      candidates = ({ });
      write("Now you must introduce another number:\n"+
            "0 -> all the people can vote\n"+
            "1 -> only some races can vote\n"+
            "2 -> only some groups can vote\n"+
            "3 -> only some race-groups can vote\n"+
            "Introduce your choose: ");
      input_to("new5", sub, limited, info, candidates, flag1, whoflag1, flag2);       
   }
   else
   {
      write("Now introduce the list of candidates. Finish with a "+
            "white line.\n");
      candidates = ({ });
      write("Candidate:   ");
      input_to("new4", sub, limited, info, candidates, flag1, whoflag1, flag2);
   }       
   
   return 1;
}

int new4(string str, string sub, int limited, string info, 
         string *candidates, int flag1, string *whoflag1, int flag2)
{   
   if(str == "")
   {
      write("Now you must introduce another number:\n"+
            "0 -> all the people can vote\n"+
            "1 -> only some races can vote\n"+
            "2 -> only some groups can vote\n"+
            "3 -> only some race-groups can vote\n"+
            "Introduce your choose: ");
      input_to("new5", sub, limited, info, candidates, flag1, whoflag1, flag2);         
   }      
   else
   {
      candidates += ({ str });
      write("Candidate:   ");
      input_to("new4", sub, limited, info, candidates, flag1, whoflag1, flag2);
   }
   return 1;
}

int new5(string str, string sub, int limited, string info, 
         string *candidates, int flag1, string *whoflag1, int flag2)
{
   string aux;
   
   flag1 = to_int(str);
   if (flag1 == 0)
   {
      write("\nWe are finishing. The last choose is: \n"+
            "0 -> All the people can vote.\n"+
            "1 -> Only people over 5 days can vote.\n"+
            "x -> Only people over level x can vote.\n"
            "Introduce your choose: ");
      input_to("new7", sub, limited, info, candidates, flag1, whoflag1, flag2);
   }      
   else
   {
      switch(aux)
      { 
         case 1:  aux="races";break;
         case 2:  aux="groups";break;
         default: aux="race-groups";break;
      }
      whoflag1 = ({ });
      write("Ok, you have limited the votation to some "+aux+" only. "+
            "Now you must introduce those "+aux+". Finish with a "+
            "white line.\n"+
            "Only can vote:  ");
      input_to("new6", sub, limited, info, candidates, flag1, whoflag1, flag2);            
   }
   return 1;
}

int new6(string str, string sub, int limited, string info, 
         string *candidates, int flag1, string *whoflag1, int flag2)
{   
   if(str == "")
   {
      write("\nWe are finishing. The last choose is: \n"+
            "0 -> All the people can vote.\n"+
            "1 -> Only people over 5 days can vote.\n"+
            "x -> Only people over level x can vote.\n"+
            "Introduce your choose: ");
      input_to("new7", sub, limited, info, candidates, flag1, whoflag1, flag2);   
   }      
   else
   {
      whoflag1 += ({ str });
      write("Only can vote:   ");
      input_to("new6", sub, limited, info, candidates, flag1, whoflag1, flag2);
   }
   return 1;
}

int new7(string str, string sub, int limited, string info, 
         string *candidates, int flag1, string *whoflag1, int flag2)
{
   flag2 = to_int(str);
   do_resume(sub, limited, info, candidates, flag1, whoflag1, flag2);
   write("Do you want add this votation? (y/n) ");
   input_to("new8", sub, limited, info, candidates, flag1, whoflag1, flag2);   
   return 1;
}

int new8(string str, string sub, int limited, string info, 
         string *candidates, int flag1, string *whoflag1, int flag2)
{
   if(str == "y")
   {
      add_subject(sub, limited, info, candidates, flag1, whoflag1, flag2);
      write("Ok, votation added.\n\n");
   }
   else
      write("Ok, votation not added.\n\n");
      
   return 1;
}

void do_resume(string sub, int limited, string info, string *candidates, 
               int flag1, string *whoflag1, int flag2)
{
   string str="";
   int i;
   
   str += "\n\n\nAdding ";
   str += sub;
   str += " votation \n";
   str += "Information: "+info+".\n";
   if ( limited == 0 )
      str +="Free candidates.\n";
   else
   {
      str +="The candidates are:\n";
      for(i=0;i<sizeof(candidates);i++)
         str += candidates[i]+"\n";
      str += "\n";
   }
   switch(flag1)
   {
      case 1:  str += "Only the following races can vote:\n";
               break;
      case 2:  str += "Only the following groups can vote:\n";
               break;
      case 3:  str += "Only the following race-groups can vote:\n";
               break;
      default: break;
   }
   if( flag1 > 0 )
   {
      for(i=0;i<sizeof(candidates);i++)
         str += whoflag1[i]+"\n";
      str += "\n";
   }
   switch(flag2)
   {
      case 0:  str += "All the people can vote.\n\n";
               break;
      case 1:  str += "Only people over 5 days can vote.\n\n";
                 break;
      default: str += "Only people over level "+flag2+" can vote.\n\n";
               break;
   }
   tell_object(TP, str);
}

int resume(string str)
{
   mixed tmp;
   int i;
   string *candidates = ({ });
   
   tmp = allocate(6);
   
   tmp = vote_data[str];
   if(!tmp)
   {
      write("Not a valid votation.\n");
      return 1;
   }
   else
   {
      for(i=0;i<sizeof(tmp[2]);i++)
         candidates += ({ (string)tmp[2][i][0] });
      do_resume(str, tmp[0], tmp[1],candidates,tmp[3],tmp[4],tmp[5]);
   }
   return 1;
}