📄 dagou.c
字号:
// dagou.c 打狗阵法// By lichen@xkx.us// For trying to make a dagou zhen. When perform dagou, increase temp damage.// Suggestion: Zhenfa can be created in multiple rooms. Maybe we can use// OOD to do it. I believe it will be more fun than making zhenfa as perform// or skill.#include <ansi.h>// Define requirement is 4 dai gbdizi// maximum number of people in 打狗阵 is 6 people// minimum number of people in 打狗阵 is 2 people#define REQUIRE 4#define MAX_INARRAY 6#define MIN_INARRAY 2inherit F_DBASE;inherit F_SSERVER;string *ran_msg = ({ "高叫:“老爷、太太、施舍口冷饭!”", "叫道:“老爷太太行行好,赏赐乞儿一文钱。”", "唱道:“天堂有路你不走哪!”", "唱道:“地狱无门你闯进来!”", "唱道:“施舍化子一碗饭哪!”",});string *ran_color = ({ HIC, HIG, HIY, HIR, HIM });private string location(string direct);void check_fight(object leader);private void reset_effect(object *inarray, int partner, int ori_effect, int skill);private void remove_effect(object inarray, int skill);void random_msg(object leader);int perform(object me){ int skill, ori_effect; int partner, num; int user_num; object victim, weapon; object leader, *obj, *inarray, env; object *user_list; string id; leader = 0; inarray = ({0, 0 , 0, 0, 0, 0, 0}); if( me->query("family/family_name") != "丐帮" ) return notify_fail("你不是丐帮弟子,使用不了打狗阵。\n"); if( (int)me->query_temp("dagou") ) return notify_fail("你已经在参与打狗阵法了。\n"); if( !victim ) victim = offensive_target(me); if( !victim || !victim->is_character() || !me->is_fighting(victim) ) return notify_fail("打狗阵法只能对战斗中的对手使用。\n"); if( victim->query("family/family_name") == "丐帮" ) return notify_fail("你怎么可以对同门使用打狗阵?\n"); if( me->query_skill_mapped("staff") != "dagou-bang" || !objectp(weapon = me->query_temp("weapon")) || (string)weapon->query("skill_type") != "staff" ) return notify_fail("你必须使用打狗棒法才能加入打狗阵。\n"); env = environment(me); obj = all_inventory(env); num = sizeof(obj); partner = 0; // check how many users are in 打狗阵. If there are someone in the 打狗阵, // then get leader and victim. for( int i = 0; i < num; i++ ) { if( obj[i]->query_temp("dagou") ) { if( !leader ) { if( obj[i]->query_temp("dagou/is_leader") == -1 ) leader = obj[i]->query_temp("dagou/data"); else leader = obj[i]; victim = leader->query_temp("dagou/data")[0][MAX_INARRAY]; } partner++; } } // If in the room there is no one take part in 打狗阵, then set this user // as leader. If any other 4dai or above gb dizi here are fighting the same // victim, then these gb dizi set_temp("dagou", pointer to the leader ). the // leader set_temp("dagou") 4 variables. First one is "leader"(indicate he is // the leader of the array, second one is a pointer point to all people in // array(打狗阵), third one is total staff skill of all people who join the // arraym, the forth is the number of people who join the array. if( partner == 0 ) { inarray[0] = me; inarray[MAX_INARRAY] = victim; message_vision( HIR"$N忽然高声叫道:各位丐帮兄弟,结打狗阵!帮我对付$n!\n" NOR, me, victim); user_list = users(); user_num = sizeof(user_list); // Let all 4 dai(or above) gb dizi who are in the same area know that someone is using 打狗阵. // It is to increase the interaction between gb dizi. // 正所谓:一方有难,百方支援。 while( user_num-- ) { if( !environment(user_list[user_num]) ) continue; if( user_list[user_num]->query("family/family_name") != "丐帮" ) continue; if( environment(user_list[user_num]) == env ) continue; if( !living(user_list[user_num]) ) continue; if( location(file_name(env)) == location(file_name(environment(user_list[user_num]))) ) tell_object( user_list[user_num], HIG"你隐隐约约地听到在远处" + me->query("name") + "好象在发动打狗阵对付" + victim->query("name") + "。" + "\n听方向好象是" + env->query("short") + "。\n\n"NOR ); else tell_object( user_list[user_num], HIG"你隐隐约约地听到在远处杀声震天,好象有丐帮弟子在发动打狗阵!\n\n"NOR ); } partner = 1; skill = me->query_skill("staff"); for( int i=0; i < num; i++) { if( obj[i] == me ) continue; if( !living(obj[i]) ) continue; if( !obj[i]->is_character() || obj[i]->is_corpse() ) continue; if( !obj[i]->is_fighting(victim) ) continue; if( obj[i]->query_skill_mapped("staff") != "dagou-bang" ) continue; if( !objectp(weapon = obj[i]->query_temp("weapon")) || (string)weapon->query("skill_type") != "staff" ) continue;// if( obj[i]->query("rank") < REQUIRE ) continue; if( !obj[i]->is_fighting(victim) ) continue; if( (int)obj[i]->query_temp("dagou") ) continue; inarray[partner] = obj[i]; message_vision( HIR "$N一边长声唱道:“各路的弟兄来讨饭哟,啊哟哎唷哟……”" + "一边包围着$n。\n" NOR, inarray[partner], victim ); skill += inarray[partner]->query_skill("staff"); partner++; if( partner == MAX_INARRAY ) break; } me->set_temp("dagou/is_leader", 1); me->set_temp("dagou/data", ({ inarray, skill, partner }) ); skill = (int)(skill / (partner*3)); if( partner > 1 ) { for( int i = 0; i < partner; i++ ) { inarray[i]->add_temp("apply/dodge", skill ); if( i > 0 ) { inarray[i]->set_temp("dagou/is_leader", -1); inarray[i]->set_temp("dagou/data", me ); } } } call_out("random_msg", 5, me); me->start_call_out( (: call_other, __FILE__, "check_fight", me :), 1); } else if( partner >= MAX_INARRAY ) return notify_fail("打狗阵法只能由二人至六人参与。\n"); else { inarray = leader->query_temp("dagou/data")[0]; skill = leader->query_temp("dagou/data")[1]; ori_effect = (int)(skill / (partner*3)); if(partner == 1) leader->add_temp("apply/dodge", ori_effect ); me->add_temp("apply/dodge", ori_effect ); inarray[partner] = me; partner += 1; skill += me->query_skill("staff"); leader->set_temp("dagou/data", ({ inarray, skill, partner }) ); reset_effect(inarray, partner, ori_effect, skill); me->fight_ob(victim); victim->fight_ob(me); me->set_temp("dagou/is_leader", -1); me->set_temp("dagou/data", leader); message_vision( HIR "$N一边长声唱道:“老爷太太行行好,赏赐乞儿一文钱。”" + "一边加入打狗阵,包围$n。\n" NOR, me, victim ); for( int i = 0; i < partner-1; i++ ) tell_object(inarray[i], HIG"\n你看见有人加入打狗阵,不由得精神为之一振。\n"NOR); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -