/* -*- LPC -*- */ /* * $Id: debate.c,v 1.9 2001/05/31 00:55:23 presto Exp $ */ #include <tasks.h> #define EFFECT "/std/effects/religious/theological_debate" #define HANDLER "/obj/handlers/philosophies" #define DEBATE_MULT 4 inherit "/cmds/base"; mapping _debaters; void create() { _debaters = ([ ]); } /* create() */ mixed cmd(object * indirect_obs, string indir_match, string dir_match, mixed *args, string pattern) { int bonus; string topic; string type; string needed; object target; if (sizeof((int *)this_player()->effects_matching("debating"))) { return notify_fail("You are already engaged in a debate.\n"); } if (_debaters[this_player()]) { tell_object(_debaters[this_player()][0], this_player()->the_short() + " withdraws their debating " "challenge from you.\n"); map_delete(_debaters, this_player()); } target = indirect_obs[0]; if (target == this_player()) { return notify_fail("Debating with yourself? Which one of your " "personalities are you trying to outwit?\n"); } if (userp(target) && !interactive(target)) { return notify_fail("How can you debate anything with a net-dead " "statue?\n"); } topic = args[0]; if (_debaters[target] && _debaters[target][0] == this_player()) { if ((_debaters[target][0] == this_player()) && (_debaters[target][1] == topic)) { write("You accept " + (string) target->the_short() + "'s challenge to debate " + topic + ".\n"); say((string) this_player()->the_short() + " accepts " + (string) target->the_short() + "'s challenge to debate " + topic + ".\n", target); tell_object(target, (string) this_player()->the_short() + " accepts your challenge to debate " + topic + ".\n"); map_delete(_debaters, target); this_player()->add_effect(EFFECT, target); target->add_effect(EFFECT, this_player()); return 1; } } if (!HANDLER->query_philosophy(topic)) { return notify_fail("You cannot debate \"" + topic + "\". You can " + "debate " + query_multiple_short((string *) HANDLER-> query_philosophy_names ()) + ".\n"); } type = (string) HANDLER->query_philosophy_type(topic); bonus = (int) HANDLER->query_philosophy_bonus(topic); needed = (string) HANDLER->query_philosophy_needed(topic); if (this_player()->query_skill_bonus(type + ".points") < bonus) { return notify_fail(needed + " is not sufficient to debate " + topic + " at the moment.\n"); } if (this_player()->query_specific_gp(type) < bonus) { return notify_fail("You are too tired to debate " + topic + " at the moment.\n"); } this_player()->adjust_gp(-(bonus * DEBATE_MULT)); /* if (environment(this_player()) != environment(target)) { tell_object(_debaters[i - 1], "Your challenge is ignored.\n"); } */ write("You challenge " + (string) target->the_short() + " to a debate on " + topic + ".\n"); say((string) this_player()->one_short() + " challenges " + (string) target->one_short() + " to a debate on " + topic + ".\n", target); tell_object(target, (string) this_player()->one_short() + " challenges you to a debate on " + topic + ".\n"); _debaters[this_player()] = ({ target, topic }); call_out("answer_challenge", 5, this_player(), target, topic); return 1; } /* cmd() */ void answer_challenge(object challenger, object target, string topic) { int bonus; int diff; string type; if (!challenger) { return; } if (!target) { return; } if (environment(challenger) != environment(target)) { return; } if (!_debaters[challenger]) { return; } if ((_debaters[challenger][0] != target) || (_debaters[challenger][1] != topic)) { return; } if (pk_check(challenger, target)) { tell_object(target, "Use \"debate " + topic + " with " + (string) challenger->query_name() + "\" to accept the challenge.\n"); return; } type = (string) HANDLER->query_philosophy_type(topic); bonus = (int) target->query_skill_bonus(type + ".points"); /* Query the challenger last as it'll be (s)he who is awarded a level. */ diff = (int) target->query_skill_bonus(type + ".points") / 3; switch ((int) TASKER->perform_task(challenger, type + ".points", 2 * diff, TM_COMMAND)) { case AWARD: tell_object(challenger, "You feel " + (string) HANDLER->query_philosophy_needed(topic) + " surge for a moment.\n"); case SUCCEED: tell_object(target, "You find yourself accepting " + (string) challenger->the_short() + "'s challenge to debate " + topic + ".\n"); tell_room(environment(target), (string) target->the_short() + " accepts " + (string) challenger->the_short() + "'s challenge to debate " + topic + ".\n", ({ target, challenger })); tell_object(challenger, (string) target->the_short() + " accepts your challenge to debate " + topic + ".\n"); map_delete(_debaters, target); this_player()->add_effect(EFFECT, target); target->add_effect(EFFECT, this_player()); return; default: if (userp(target)) { tell_object(target, "Use \"debate " + topic + " with " + (string) challenger->query_name() + "\" to accept the challenge.\n"); } } } /* answer_challenge() */ mapping query_debaters() { return _debaters; } mixed *query_patterns() { return ({ "<word'topic'> with <indirect:living'person'>", (: cmd($1, $2, $3, $4, $5) :) }); } /* query_patterns() */