weapon.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 313 行
C
313 行
#include <ansi.h>#include <weapon.h>inherit M_WEAPON;inherit F_GEMS;string *du=({"ice_poison","ill_dongshang","ill_fashao","ill_kesou","ill_shanghan","ill_zhongshu","xx_poison","cold_poison","flower_poison","rose_poison","x2_poison","sanpoison","scorpion_poison","qx_snake_poison","anqi_poison","yf_poison","nx_poison","chilian_poison","yufeng_poison","insect_poison",});void init_sockets(object me){ set("max_sockets", 3); if (me->query("combat_exp") > 10000000) add("max_sockets", 1); if (me->query("combat_exp") < 10000000 && (int)query("sockets/max",1)>=3) set("sockets/max",3); if (me->query("combat_exp") < 20000000 && (int)query("sockets/max",1)>=4) set("sockets/max",4); if ((int)query("sockets/max",1)>5) set("sockets/max",5); if (me->query("diablo/weapon/id") != query("id")) return; set("sockets", me->query("diablo/weapon/sockets")); set_weapon_desc();}void setup(){ init_sockets(this_player()); ::setup();}void spec_prop(object me, string socket, int socket_level, int mode){int i; if (!valid_gem(socket, socket_level)) return; if (me->query("diablo/weapon/id") != query("id")) return; if (query("weapon_prop/damage") < 20) return; switch (socket) { case "ruby": break; case "topaz": break; case "sapphire": break; case "emerald": break; case "amethyst": if (mode == 1) message_vision(MAG + query("name") + MAG"发出柔和的光芒围绕着$N,激发了$P的战斗力!\n"NOR, me); else message_vision(MAG"随着紫色光芒慢慢的散去,$N的战斗力又复原了。\n"NOR, me); me->add_temp("apply/attack", 30 * socket_level * mode); break; case "diamond": if (mode == 1) message_vision(HIW"只见一道白光直透" + query("name") + HIW",威力猛然大增!\n"NOR, me); else message_vision(HIW"白光渐渐隐入了" + query("name") + HIW"。\n"NOR, me); me->add_temp("apply/damage", query("weapon_prop/damage") * socket_level * mode /16); break; case "skull": break; } return;}int wield(){ int i, sockets, ret; object me = environment(); if (!(ret = ::wield())) return 0; sockets = query("sockets/max"); for (i = 1; i <= sockets; i++) spec_prop(me, query(sprintf("sockets/socket%d", i)), query(sprintf("sockets/socket%d_level", i)), 1); return ret;}int unequip(){ int i, sockets, ret; object me = environment(); if (!(ret = ::unequip())) return 0; sockets = query("sockets/max"); for (i = 1; i <= sockets; i++) spec_prop(me, query(sprintf("sockets/socket%d", i)), query(sprintf("sockets/socket%d_level", i)), -1); return ret;}string spec_effect(object me, object victim, int damage_bonus, string socket, int socket_level){ int damage; string msg = ""; object weapon; if (!valid_gem(socket, socket_level)) return msg; if (random(100) + me->query_temp("apply/magic") < 70) return msg; if (me->query("diablo/weapon/id") != query("id")) return msg; switch (socket) { case "ruby": msg = HIR"一道红光猛的击中了$n,$p只觉得浑身一阵巨痛!\n"NOR; damage = damage_bonus * socket_level / 7;if (damage < 1) damage =1;if (damage > 300 * socket_level / 7) damage = 300 * socket_level / 7;if (damage > (int)victim->query("qi")/7) damage=(int)victim->query("qi")/7;if ((int)victim->query("qi")+50 > damage) victim->receive_wound("qi", damage); if (wizardp(me)) tell_object(me, sprintf("气血受伤:%d\n", damage)); break; case "topaz": msg = HIY"一道黄光猛的击中了$n,$p只觉得意思越来越模糊!\n"NOR; damage = damage_bonus * socket_level / 15; if (damage > 300 * socket_level / 15) damage = 300 * socket_level / 15;if (damage < 1) damage =1;if (damage > (int)victim->query("jing")/5) damage=(int)victim->query("jing")/5;if ((int)victim->query("jing")+50 > damage){ victim->receive_damage("jing", damage); victim->receive_wound("jing", random(damage));} if (wizardp(me)) tell_object(me, sprintf("jing damage is: %d\n", damage)); break; case "sapphire": if (!victim->is_busy()) msg = HIB"一道奇异的蓝光包围着$n,$p只觉天旋地转,身体无法动弹!\n"NOR; victim->start_busy(random(socket_level) + 1); break; case "emerald": if (!victim->query_condition("emerald_poison")) { msg = HIG"$n只见一道绿气迅速的从伤口渗入了$p的经脉!\n"NOR; victim->apply_condition("emerald_poison", victim->query_condition("emerald_poison") + random(5) + 3); victim->set("emerald_poison", socket_level); victim->apply_condition("snake_poison", victim->query_condition("snake_poison") + random(5) + 3); victim->apply_condition("zhizhu_poison", victim->query_condition("zhizhu_poison") + random(5) + 3); victim->apply_condition("wugong_poison", victim->query_condition("wugong_poison") + random(5) + 3); victim->apply_condition("xiezi_poison", victim->query_condition("xiezi_poison") + random(5) + 3); victim->apply_condition("chanchu_poison", victim->query_condition("chanchu_poison") + random(5) + 3); } break; case "amethyst": break; case "diamond": if (objectp(weapon = victim->query_temp("weapon"))) { if (random(query("weapon_prop/damage")) > weapon->query("weapon_prop/damage") / 2 && random(me->query("str")) > victim->query("str") / 2 && random(6)==0) { if (query("skill_type") == "sword" || query("skill_type") == "blade" || query("skill_type") == "axe") { message_vision(HIW"只听见「哐」地一声轻响,$N手中的" + weapon->query("name") + HIW"已经被" + query("name") + HIW"削为两截!\n"NOR, victim); weapon->unequip(); weapon->move(environment(victim)); weapon->set("name", "断掉的" + weapon->query("name")); weapon->set("value", 0); weapon->set("weapon_prop", 0); victim->reset_action(); }; if (query("skill_type") == "staff" || query("skill_type") == "hammer" || query("skill_type") == "club") { message_vision(HIW "$N只觉得手中" + weapon->query("name") + HIW"把持不定,脱手飞出!\n" NOR, victim); weapon->unequip(); weapon->move(environment(victim)); victim->reset_action(); }; if (query("skill_type") == "whip") { message_vision(HIW"只听见「唰」地一声轻响,$N手中的" + weapon->query("name") + HIW"已经被" + query("name") + HIW"卷为两截!\n"NOR, victim ); weapon->unequip(); weapon->move(environment(victim)); weapon->set("name", "断掉的" + weapon->query("name")); weapon->set("value", 0); weapon->set("weapon_prop", 0); victim->reset_action(); }; }else if (random(3)==0){ damage = damage_bonus * socket_level / 8; if ((int)victim->query("qi")+100 > damage) victim->receive_damage("qi", damage); if ((int)victim->query("jing")+100 > damage) victim->receive_damage("jing", random(damage)); message_vision(HIW"只见白光一闪,$N被划出了很长的一道伤口!\n"NOR, victim);} } break; case "skull": msg = WHT"忽然间,$n只觉鬼哭狼嚎声不绝于耳,三魂六魄都给吸了出去!\n"NOR; damage = damage_bonus * socket_level / 15;if (damage > 300 * socket_level / 15)damage = 300 * socket_level / 15; if (victim->query("qi") < damage) damage = victim->query("qi"); if (damage > 0) {if ((int)victim->query("qi")+100 > damage){if (damage > (int)victim->query("qi")/5) damage=(int)victim->query("qi")/5; victim->receive_damage("qi", damage); me->add("qi", damage/2);} if (me->query("qi") > me->query("eff_qi")) me->set("qi", me->query("eff_qi")); if (wizardp(me)) tell_object(me, sprintf("suck qi: %d\n", damage)); } damage = damage_bonus * socket_level / 25; if (victim->query("neili") < damage) damage = victim->query("neili"); if (damage > 0) {if ((int)victim->query("neili")+100 > damage){if (damage > (int)victim->query("qi")/5) damage=(int)victim->query("qi")/5; victim->add("neili", -damage); me->add("neili", damage/2);} if (me->query("neili") > me->query("max_neili") * 2) me->set("neili", me->query("max_neili") * 2); if (wizardp(me)) tell_object(me, sprintf("suck neili: %d\n", damage)); } break; case "windjade": if (!victim->is_busy()) { msg = GRN"飞舞在空中的无形之利刃包围着$n,$p只觉寸步难行!\n"NOR; victim->start_busy(3); victim->add_temp("apply/dodge", -(6 * socket_level)); } break; case "firejade": msg = RED"一道火光一闪,划过了$n,$p只觉得伤口一阵烫痛!\n"NOR; damage = damage_bonus * socket_level / 8;if (damage < 1) damage =1;if (damage > 300 * socket_level / 8) damage = 300 * socket_level / 8;if (damage > (int)victim->query("qi")/8) damage=(int)victim->query("qi")/8;if ((int)victim->query("qi")+10 > damage) victim->receive_wound("qi", damage); victim->add_temp("apply/defense", -(6 * socket_level)); break; case "icejade": msg = CYN"冲天的寒气突然包围了$n,$p只觉得全身都冻僵了!\n"NOR; damage = damage_bonus * socket_level / 8;if (damage < 1) damage =1;if (damage > 300 * socket_level / 8) damage = 300 * socket_level / 8;if (damage > (int)victim->query("qi")/8) damage=(int)victim->query("qi")/8;if ((int)victim->query("qi")+10 > damage) victim->receive_damage("qi", damage);if ((int)victim->query("jing")+10 > damage) victim->receive_damage("jing", damage); victim->add_temp("apply/attack", -(6 * socket_level)); break; case "thunderjade": msg = MAG"一道闪电一闪而过击中了$n,$p只觉得全身又痛又麻!\n"NOR; damage = damage_bonus * socket_level / 8;if (damage < 1) damage =1;if (damage > 300 * socket_level / 8) damage = 300 * socket_level / 8;if (damage > (int)victim->query("qi")/8) damage=(int)victim->query("qi")/8; victim->add("neili", -damage);if ((int)victim->query("jing")+10 > damage) victim->receive_wound("jing", damage); break; case "earthjade": if (!victim->is_busy()) msg = YEL"黄色的烟雾从地上出现包围了$n,$p只觉气血一阵逆流!\n"NOR; victim->start_busy(random(socket_level) + 1);victim->apply_condition(du[random(sizeof(du))], socket_level*3); break; } return msg;}mixed hit_ob(object me, object victim, int damage_bonus){ int i, sockets; string msg = ""; sockets = query("sockets/max"); for (i = 1; i <= sockets; i++) msg += spec_effect(me, victim, damage_bonus,query(sprintf("sockets/socket%d", i)), query(sprintf("sockets/socket%d_level", i))); return msg;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?