/**************************************************************************** * 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; }