// Pinkfish
// Started Wed May 30 21:37:15 PDT 2001
inherit "/std/room/inherit/voting_room";
inherit "/std/room/furniture/commercial";
#include <money.h>
#define BOARD_TAG "poll data"
#define POLL_DATA_MAXIMUM_RESULTS 10
private int _allow_open_voting;
private string* _finished_votes;
void finish_vote(string type, string description, string* choices,
mapping votes, string* voted);
void create() {
voting_room::create();
commercial::create();
_finished_votes = ({ });
} /* create() */
void setup() {
set_name( "poll" );
set_short( "opinion poll" );
add_adjective( ({ "opinion" } ));
set_long( "A box with a bunch of pieces paper sitting on it. It seems "
"to be keeping a tally of something.\n");
set_allowed_positions(({"sitting", "lying", "kneeling", "meditating"}));
set_allowed_room_verbs((["sitting" : "sits" ]));
set_weight(2000);
set_value(240000);
set_commercial_size(2);
set_commercial_type("misc");
set_shop_use_types(({ "poll add", "poll vote" }));
set_completion_action((: finish_vote :));
set_no_elections(1);
set_vote_conditions((: is_open_for("poll vote", $1->query_name()) :));
add_help_file("poll_data");
}
/** @ignore yes */
int load_me() {
if (!query_commercial_id()) {
setup_new_commercial_id();
}
set_save_file(query_save_dir() + query_commercial_id());
if (!_finished_votes) {
_finished_votes = ({ });
}
} /* do_load() */
int do_show_results() {
string ret;
string result;
ret = "";
foreach (result in _finished_votes) {
ret += result + "\n\n";
}
write("$P$Vote Archive$P$" + ret);
add_succeeded_mess("");
return 1;
}
int do_create_vote(string choices) {
if (!is_open_for("poll add", this_player()->query_name())) {
add_failed_mess("Unable to add a vote.\n");
return 0;
}
return ::do_create_vote(choices);
} /* do_create_vote() */
void finish_vote(string type, string description, string* choices,
int* votes, string* voted)
{
string ret;
int i;
ret = "Vote finished at " + ctime(time()) + ":\n";
ret += "$I$3= " + description + "\n\n";
ret += "$I$0=Results:\n$I$3= ";
for (i = 0; i < sizeof(choices); i++) {
ret += choices[i] + ": " + votes[i] + "\n";
}
if (!_finished_votes) {
_finished_votes = ({ ret });
} else {
_finished_votes += ({ ret });
}
if (sizeof(_finished_votes) > POLL_DATA_MAXIMUM_RESULTS) {
_finished_votes = _finished_votes[0..POLL_DATA_MAXIMUM_RESULTS];
}
save_room();
}
int do_set_duration(int hours) {
if (hours <= 0) {
add_failed_mess("The duration must be positive.\n");
return 0;
}
set_vote_duration(hours * 60 * 60);
add_succeeded_mess("Set the vote duration to " + hours + " hours.\n");
return 1;
} /* do_set_duration() */
int do_delete_vote(int id) {
if (!::delete_vote(id)) {
add_failed_mess("Cannot delete the vote id #" + id + ".\n");
return 0;
}
add_succeeded_mess("Deleted the vote id#" + id + ".\n");
return 1;
} /* do_delete_vote() */
int do_end_vote(int id) {
if ( !query_our_votes()[ id ] ) {
add_failed_mess("Cannot end the vote id #" + id + ".\n");
return 0;
}
end_vote(id);
add_succeeded_mess("Finished the vote id#" + id + ".\n");
return 1;
} /* do_delete_vote() */
string query_main_status() {
string ret;
ret = "Vote duration: " + (query_vote_duration() / (60 * 60)) +
" hours\n";
return ret;
} /* query_main_status() */
void init() {
commercial::init();
voting_room::init();
voting_room::init_add_vote();
add_command("results", "of votes", (: do_show_results() :));
if (environment()->is_allowed(this_player()->query_name())) {
add_command("set", "vote duration <number'hours'> on <direct:object>",
(: do_set_duration($4[0]) :));
add_command("delete", "vote <number'vote id'>",
(: do_delete_vote($4[0]) :));
add_command("finish", "vote <number'vote id'>",
(: do_end_vote($4[0]) :));
}
} /* init() */