#include <nomic_system.h> inherit "/std/room/basic_room"; inherit "/std/room/inherit/council_base"; void create() { ::create(); } /* create() */ /** * This method lists the current set of rules from the specified area. * @return 1 on success, 0 on failure */ int do_list_rules() { class nomic_rule* rules; class nomic_rule rule; string ret; int cur_type; rules = NOMIC_HANDLER->query_all_nomic_rules(query_council_area()); if (!sizeof(rules)) { add_failed_mess("There are no rules, oh no! Lawlessness!\n"); return 0; } rules = sort_array(rules, (: $1->id - $2->id :) ); ret = ""; cur_type = -1; foreach (rule in rules) { if (rule->type != cur_type) { switch (rule->type) { case NOMIC_TYPE_IMMUTABLE : ret += "%^BOLD%^Immutable Rules%^RESET%^\n"; break; case NOMIC_TYPE_CITIZEN : ret += "%^BOLD%^Citizen Rules%^RESET%^\n"; break; case NOMIC_TYPE_GENERAL : ret += "%^BOLD%^General Rules%^RESET%^\n"; break; } cur_type = rule->type; } ret += NOMIC_HANDLER->rule_as_string(0, rule); ret += "\n"; } write("$P$Nomic rules$P$" + ret); return 1; } /* do_list_rules() */ /** * This method lists the current set of rules from the specified area. * @return 1 on success, 0 on failure */ int do_list_one_rule(int num) { class nomic_rule rule; string ret; rule = NOMIC_HANDLER->query_nomic_rule(query_council_area(), num); if (!rule) { add_failed_mess("There is no rule number " + num + ".\n"); return 0; } ret = ""; switch (rule->type) { case NOMIC_TYPE_IMMUTABLE : ret += "%^BOLD%^Immutable Rules%^RESET%^\n"; break; case NOMIC_TYPE_CITIZEN : ret += "%^BOLD%^Citizen Rules%^RESET%^\n"; break; case NOMIC_TYPE_GENERAL : ret += "%^BOLD%^General Rules%^RESET%^\n"; break; } ret += NOMIC_HANDLER->rule_as_string(0, rule); ret += "\n"; write("$P$Nomic rules$P$" + ret); return 1; } /* do_list_rules() */ /** * This lists all the new rules up for discussion or whatever by the * magistrates. * @return 1 on success, 0 on failure */ int do_list_single_motion(int num) { class nomic_motion* rules; class nomic_motion rule; int is_mag; string ret; rules = NOMIC_HANDLER->query_all_motions(query_council_area()); is_mag = NOMIC_HANDLER->is_magistrate_of(query_council_area(), this_player()->query_name()); if (!is_mag) { rules = filter(rules, (: $1->state == NOMIC_STATE_CITIZEN_VOTE :)); } if (!sizeof(rules)) { add_failed_mess("No motion to look at or vote on.\n"); return 0; } ret = ""; foreach (rule in rules) { if (rule->identifier == num) { ret += NOMIC_HANDLER->motion_as_string(0, query_council_area(), rule, 0); ret += "\n"; } } if (ret == "") { add_failed_mess("The motion " + num + " was not found.\n"); return 0; } write("$P$New Nomic Rules$P$" + ret); return 1; } /* do_list_single_motion() */ /** * This lists all the new rules up for discussion or whatever by the * magistrates. * @return 1 on success, 0 on failure */ int do_list_motions(int brief) { class nomic_motion* rules; class nomic_motion rule; int is_mag; string ret; rules = NOMIC_HANDLER->query_all_motions(query_council_area()); is_mag = NOMIC_HANDLER->is_magistrate_of(query_council_area(), this_player()->query_name()); if (!is_mag) { rules = filter(rules, (: $1->state == NOMIC_STATE_CITIZEN_VOTE :)); } if (!sizeof(rules)) { add_failed_mess("No motion to look at or vote on.\n"); return 0; } ret = ""; foreach (rule in rules) { ret += NOMIC_HANDLER->motion_as_string(0, query_council_area(), rule, brief); ret += "\n"; } write("$P$New Nomic Rules$P$" + ret); return 1; } /* do_list_motions() */ /** * This method allows the person to make a comment on a current rule. * Comments are only allowed by magistrates and only in the first two * phases. * @param num the id of the rule to comment on * @return 1 on success, 0 on failure */ int do_comment_on(int num) { class nomic_motion rule; int is_mag; rule = NOMIC_HANDLER->query_motion(query_council_area(), num); is_mag = NOMIC_HANDLER->is_magistrate_of(query_council_area(), this_player()->query_name()); if (!rule || !is_mag && rule->state != NOMIC_STATE_CITIZEN_VOTE) { add_failed_mess("Could not find the motion " + num + ".\n"); return 0; } write("You are commenting on:\n" + NOMIC_HANDLER->motion_as_string(0, query_council_area(), rule) + "\n"); this_player()->do_edit("", "finish_comment_on", this_object(), 0, rule); return 1; } /* do_comment_on() */ /** @ignore yes */ void finish_comment_on(string comment, class nomic_motion rule) { if (!comment) { write("Aborting comment.\n"); return ; } if (NOMIC_HANDLER->comment_on_motion(query_council_area(), rule->identifier, comment, this_player()->query_name())) { write("Succeeded in making a comment on the rule.\n"); } else { write("Could not make a comment on the rule for some reason.\n"); } } /* finish_comment_on() */ /** * This method allows the person to amend a new rule. * Amendments are only allowed by magistrates and only during the discusion * phase. * @param num the id of the rule to comment on * @return 1 on success, 0 on failure */ int do_amend_motion(int num) { class nomic_motion rule; int is_mag; is_mag = NOMIC_HANDLER->is_magistrate_of(query_council_area(), this_player()->query_name()); if (!is_mag) { add_failed_mess("You cannot amend rules.\n"); return 0; } rule = NOMIC_HANDLER->query_motion(query_council_area(), num); if (!rule) { add_failed_mess("Could not find the motion " + num + ".\n"); return 0; } if (rule->state != NOMIC_STATE_COUNCIL_REVIEW) { add_failed_mess("You cannot amend the motion " + num + ".\n"); return 0; } if (rule->motion_type != NOMIC_MOTION_TYPE_RULE_ADD && rule->motion_type != NOMIC_MOTION_TYPE_RULE_AMEND) { add_failed_mess("You cannot amend the motion " + num + ".\n"); return 0; } write("You are adding an amendment to:\n" + NOMIC_HANDLER->motion_as_string(0, query_council_area(), rule) + "\n\nWARNING! Ammending the motion replaces the current text.\n"); this_player()->do_edit("", "finish_amend_motion", this_object(), 0, rule); return 1; } /* do_amend_motion() */ /** @ignore yes */ void finish_amend_motion(string amendment, class nomic_motion rule) { if (!amendment) { write("Aborting amendment.\n"); return ; } if (NOMIC_HANDLER->amend_motion(query_council_area(), rule->identifier, amendment, this_player()->query_name())) { write("Succeeded in adding an amendment to the motion.\n"); } else { write("Could not add an amendment to the rule for some reason.\n"); } } /* finish_amend_motion() */ /** * This method will handle voting on the specific new nomic rule. * @param num the rule number to vote on * @param vote their vote * @return 1 on success, 0 on failure */ int do_vote_on(int num, string vote) { class nomic_motion rule; int is_mag; int vote_id; rule = NOMIC_HANDLER->query_motion(query_council_area(), num); is_mag = NOMIC_HANDLER->is_magistrate_of(query_council_area(), this_player()->query_name()); if (!rule || (!is_mag && rule->state != NOMIC_STATE_CITIZEN_VOTE)) { add_failed_mess("Could not find the motion " + num + ".\n"); return 0; } if (rule->state != NOMIC_STATE_CITIZEN_VOTE && rule->state != NOMIC_STATE_COUNCIL_VOTE) { add_failed_mess("The rule is not in a state that you can vote on.\n"); return 0; } switch (vote) { case "yes" : vote_id = NOMIC_VOTE_YES; break; case "no" : vote_id = NOMIC_VOTE_NO; break; case "abstain" : vote_id = NOMIC_VOTE_ABSTAIN; break; default : add_failed_mess("Unknown type of vote, must be one of yes, no or " "abstain.\n"); return 0; } if (NOMIC_HANDLER->has_voted_for_motion(query_council_area(), num, this_player()->query_name())) { add_failed_mess("You have already voted for this rule!\n"); return 0; } else if (NOMIC_HANDLER->vote_for_motion(query_council_area(), num, vote_id, this_player()->query_name())) { add_succeeded_mess(({ "$N $V for " + vote + " in motion id " + num + ".\n", "$N $V for a motion.\n" })); return 1; } add_failed_mess("Could not vote for the rule for some reason.\n"); return 0; } /* do_vote_on() */ /** * This method adds an amendment to a current rule. * @param num the number of the current rule * @return 1 on success, 0 on failure */ int do_amend_current_rule(int num) { class nomic_rule rule; rule = NOMIC_HANDLER->query_nomic_rule(query_council_area(), num); if (!rule) { add_failed_mess("The rule " + num + " does not exist.\n"); return 0; } if (!NOMIC_HANDLER->is_magistrate_of(query_council_area(), this_player()->query_name())) { add_failed_mess("You cannot do this until you are a magistrate.\n"); return 0; } if (!NOMIC_HANDLER->query_can_change_rule(query_council_area(), rule)) { add_failed_mess("You cannot change that rule.\n"); return 0; } write("What amendment would you like to make to the rule:\n" + NOMIC_HANDLER->rule_as_string(0, rule) + "\n"); this_player()->do_edit("", "amend_current_rule", this_object(), 0, rule); return 1; } /* do_amend_current_rule() */ /** @ignore yes */ void amend_current_rule(string str, class nomic_rule rule) { if (!str) { write("Aborting the addition of an amendment.\n"); return ; } write("Adding the amendment:\n" + str + "\nTo the rule:\n" + NOMIC_HANDLER->rule_as_string(0, rule) + "\nAre you sure you wish to do this? "); input_to("amend_current_rule_check", 0, rule, str); } /* amend_current_rule() */ /** @ignore yes */ void amend_current_rule_check(string str, class nomic_rule rule, string amend) { str = lower_case(str); if (!strlen(str) || str[0] != 'y') { write("Aborting the addition of an amendment.\n"); return 0; } if (!NOMIC_HANDLER->add_amend_rule_motion(query_council_area(), rule->id, amend, this_player()->query_name())) { write("Cannot add the rule amendment.\n"); } else { write("Added a motion to amend the rule.\n"); } } /* amend_current_rule_check() */ /** * This method removes a current rule. * @param num the number of the current rule * @return 1 on success, 0 on failure */ int do_remove_current_rule(int num) { class nomic_rule rule; rule = NOMIC_HANDLER->query_nomic_rule(query_council_area(), num); if (!rule) { add_failed_mess("The rule " + num + " does not exist.\n"); return 0; } if (!NOMIC_HANDLER->is_magistrate_of(query_council_area(), this_player()->query_name())) { add_failed_mess("You cannot do this until you are a magistrate.\n"); return 0; } if (!NOMIC_HANDLER->query_can_change_rule(query_council_area(), rule)) { add_failed_mess("You cannot change that rule.\n"); return 0; } write("Would you like to remove the rule:\n" + NOMIC_HANDLER->rule_as_string(0, rule) + "\nYou must be sure about removing this. Do you wish to " "remove the rule? "); input_to("remove_current_rule_check", 0, rule); return 1; } /* do_remove_current_rule() */ /** @ignore yes */ void remove_current_rule_check(string str, class nomic_rule rule) { str = lower_case(str); if (!strlen(str) || str[0] != 'y') { write("Aborting the removal of the rule.\n"); return 0; } if (!NOMIC_HANDLER->add_remove_rule_motion(query_council_area(), rule->id, this_player()->query_name())) { write("Cannot remove the rule.\n"); } else { write("Added a motion to remove the rule.\n"); } } /* remove_current_rule_check() */ /** * This method creates a new rule. * @param type the type of the new rule * @return 1 on success, 0 on failure */ int do_create_motion(string type) { int type_no; type_no = NOMIC_HANDLER->query_type_number(type); if (type_no == NOMIC_ERROR || type_no == NOMIC_TYPE_IMMUTABLE) { add_failed_mess("The type " + type + " is invalid.\n"); return 0; } if (!NOMIC_HANDLER->is_magistrate_of(query_council_area(), this_player()->query_name())) { add_failed_mess("You cannot do this until you are a magistrate.\n"); return 0; } write("What rule would you like to create?\n"); this_player()->do_edit("", "create_motion", this_object(), 0, type_no); return 1; } /* do_create_motion() */ /** @ignore yes */ void create_motion(string str, int type_no) { if (!str) { write("Aborting the creation of the rule.\n"); return ; } write("Adding the motion of type " + NOMIC_HANDLER->query_type_name(type_no) + ":\n" + str + "\nAre you sure you wish to do this? "); input_to("create_motion_check", 0, type_no, str); } /* create_motion() */ /** @ignore yes */ void create_motion_check(string str, int type_no, string motion) { str = lower_case(str); if (!strlen(str) || str[0] != 'y') { write("Aborting the creation of the rule.\n"); return 0; } if (!NOMIC_HANDLER->add_create_rule_motion(query_council_area(), type_no, motion, this_player()->query_name())) { write("Cannot create the rule.\n"); } else { write("Added a motion to create the rule.\n"); } } /* create_motion_check() */ /** * This method transmogrifies a current rule. * @param num the number of the current rule * @return 1 on success, 0 on failure */ int do_transmogrify_current_rule(int num, string new_type) { class nomic_rule rule; int new_type_no; if (!NOMIC_HANDLER->is_magistrate_of(query_council_area(), this_player()->query_name())) { add_failed_mess("You cannot do this until you are a magistrate.\n"); return 0; } rule = NOMIC_HANDLER->query_nomic_rule(query_council_area(), num); if (!rule) { add_failed_mess("The rule " + num + " does not exist.\n"); return 0; } if (!NOMIC_HANDLER->query_can_change_rule(query_council_area(), rule)) { add_failed_mess("You cannot change that rule.\n"); return 0; } new_type_no = NOMIC_HANDLER->query_type_number(new_type); if (new_type_no == NOMIC_ERROR || new_type_no == NOMIC_TYPE_IMMUTABLE) { add_failed_mess("The type " + new_type + " is not valid.\n"); return 0; } write("Would you like to transmogrify the rule:\n" + NOMIC_HANDLER->rule_as_string(0, rule) + "\nYou must be sure about transmogrifying this. Do you wish to " "transmogrify the rule? "); input_to("transmogrify_current_rule_check", 0, rule, new_type_no); return 1; } /* do_transmogrify_current_rule() */ /** @ignore yes */ void transmogrify_current_rule_check(string str, class nomic_rule rule, int new_type_no) { str = lower_case(str); if (!strlen(str) || str[0] != 'y') { write("Aborting the removal of the rule.\n"); return 0; } if (!NOMIC_HANDLER->add_move_rule_type_motion(query_council_area(), rule->id, new_type_no, this_player()->query_name())) { write("Cannot transmogrify the rule.\n"); } else { write("Added a motion to transmogrify the rule.\n"); } } /* transmogrify_current_rule_check() */ /** @ignore yes */ void init() { ::init(); add_command("list", "[rules]", (: do_list_rules() :) ); add_command("list", "rule <number>", (: do_list_one_rule($4[0]) :) ); add_command("list", "motion <number'motion id'>", (: do_list_single_motion($4[0]) :)); add_command("list", "motions", (: do_list_motions(1) :)); add_command("list", "motions {verbose|brief}", (: do_list_motions($4[0] == "brief") :)); add_command("comment", "on <number'motion id'>", (: do_comment_on($4[0]) :) ); add_command("amend", "motion <number'motion id'>", (: do_amend_motion($4[0]) :) ); add_command("vote", "{yes|no|abstain} for <number'motion id'>", (: do_vote_on($4[1], $4[0]) :)); add_command("motion", "amend rule <number'rule id'>", (: do_amend_current_rule($4[0]) :) ); add_command("motion", "create new rule <string'type'>", (: do_create_motion($4[0]) :) ); add_command("motion", "remove rule <number'rule id'>", (: do_remove_current_rule($4[0]) :) ); add_command("motion", "move rule <number'rule id'> to <string'type'>", (: do_transmogrify_current_rule($4[0], $4[1]) :) ); } /* init() */