shangshan.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 281 行
C
281 行
#include <ansi.h>inherit NPC;#define MAX_PAWN 50inherit F_VENDOR;void create(){ set_name("上杉桂和", ({ "shangshan guihe", "shangshan" })); set("gender", "男性" ); set("age", 29); set("title", "当铺老板"); set("long", "据说是上杉彬作的亲戚。\n"); set("combat_exp", 5000); set("attitude", "friendly"); set("per",30); set("no_arrest",1); set_skill("unarmed",200); set_skill("dodge",200); setup(); carry_object("/clone/misc/cloth")->wear();}void init(){ add_action("do_value", "value"); add_action("do_pawn", "pawn"); add_action("do_sell", "sell"); add_action("do_redeem", "redeem");}string value_string(int value){ if( value < 1 ) value = 1; else if( value < 100 ) return chinese_number(value) + "文钱"; else return chinese_number(value/100) + "两" + (value%100? "又" + chinese_number(value%100) + "文钱": "");}void pay_player(object who, int amount){ object ob; if( amount < 1 ) amount = 1; if( amount/10000 ) { ob = new(GOLD_OB); ob->set_amount(amount/10000); ob->move(who); amount %= 10000; } if( amount/100 ) { ob = new(SILVER_OB); ob->set_amount(amount/100); ob->move(who); amount %= 100; } if( amount ) { ob = new(COIN_OB); ob->set_amount(amount); ob->move(who); }}int do_value(string arg){ object ob; int value; if( !arg || !(ob = present(arg, this_player())) ) return notify_fail("你要拿什麽物品给当铺估价?\n"); if( ob->query("money_id") ) return notify_fail("这是「钱」,你没见过吗?\n"); if (ob->query("ownmake")) return notify_fail("这样的宝物我可买不起。\n"); if (ob->query("food_supply")) return notify_fail("剩菜剩饭留给您自己用吧。\n"); if (ob->query("liquid/remaining")) return notify_fail("剩菜剩饭留给您自己用吧。\n"); value = ob->query("value"); if( !value ) return notify_fail("这样东西并不值很多钱。\n"); if( !value || value < 30) printf("%s一文不值。\n", ob->query("name")); else printf("%s价值%s。\n如果你要典当(pawn),可以拿到%s。\n如果卖断(sell),可以拿到%s。\n", ob->query("name"), value_string(value), value_string(value * 25 / 100), value_string(value * 80 / 100)); return 1;}int do_pawn(string arg){ object ob; string term, *terms; string data; int value, pawn_count, i; int rvalue; mapping pawn; object me; me = this_player(); pawn = me->query("pawn"); if( !arg || !(ob = present(arg, this_player())) ) { write("你目前典当的物品有:\n"); if( !mapp(pawn) || !sizeof(pawn) ) write("\t没有任何典当的物品。\n"); else { terms = keys(pawn); for(i=0; i<sizeof(terms); i++) printf("%-3s: %-15s 赎银:%s\n", terms[i], pawn[terms[i]], value_string(((int)me->query("vpawn/"+terms[i]))* 3/4)); } return 1; } if( ob->query("money_id") ) return notify_fail("你要当「钱」?\n"); if( ob->query("equipped") || ob->query("no_drop") ) return notify_fail("这样可当不了!\n"); if( ob->query("no_pawn") ) return notify_fail("这个东西当不了!\n"); if (ob->query("food_supply")) return notify_fail("剩菜剩饭留给您自己用吧。\n"); if (ob->query("liquid/remaining")) return notify_fail("剩菜剩饭留给您自己用吧。\n"); if (ob->query("ownmake")) return notify_fail("这样的宝物我可买不起。\n"); value = ob->query("value"); if( !value ) return notify_fail("这样东西并不值很多钱。\n"); if( !value || value < 30) return notify_fail("这样东西并不值很多钱。\n"); if( !(value/4) ) return notify_fail("这样东西并不值很多钱。\n"); if( mapp(pawn) && sizeof(pawn)) { terms = keys(pawn); if(sizeof(terms) > MAX_PAWN) return notify_fail("你已典当太多物品了。\n"); for(i=0; i<sizeof(terms); i++) { pawn_count = i; if(!((int) me->query("vpawn/" + sprintf("%d", i)))) break; else pawn_count = i+1; } } else pawn_count = 0; term = ob->query("name"); data = base_name(ob)+ ".c"; me->set("pawn/"+ sprintf("%d",pawn_count), term); me->set("vpawn/"+sprintf("%d",pawn_count), ob->query("value")); me->set("fpawn/"+sprintf("%d",pawn_count), data); me->save(); message_vision("$N把身上的" + ob->query("name") + "拿出来典当了" + value_string(value * 25 / 100) + "。\n", this_player()); pay_player(this_player(), value * 25 / 100 ); destruct(ob); return 1;}int do_sell(string arg){ object ob; int value; if( !arg || !(ob = present(arg, this_player())) ) return notify_fail("你要卖断什麽物品?\n"); if( ob->query("money_id") ) return notify_fail("你要卖「钱」?\n"); value = ob->query("value"); if( !value ) return notify_fail("这样东西不值钱。\n");if( ob->query("no_pawn") ) return notify_fail("这个东西当不了!\n"); message_vision("$N把身上的" + ob->query("name") + "卖掉。\n", this_player()); pay_player(this_player(), value * 80 / 100); destruct(ob); return 1;}void pay_him(object who, int amount){ object ob; object cash, tencash, gold, silver, coin; tencash = present("tenthousand-cash_money", who); cash = present("thousand-cash_money", who); gold = present("gold_money",who); silver = present("silver_money",who); coin = present("coin_money",who); if(tencash) destruct(tencash); if(cash) destruct(cash); if(gold) destruct(gold); if(silver) destruct(silver); if(coin) destruct(coin); if( amount < 1 ) amount = 1; if( amount/10000 ) { ob = new(GOLD_OB); ob->set_amount(amount/10000); ob->move(who); amount %= 10000; } if( amount/100 ) { ob = new(SILVER_OB); ob->set_amount(amount/100); ob->move(who); amount %= 100; } if( amount ) { ob = new(COIN_OB); ob->set_amount(amount); ob->move(who); }}int affordable(object me, int amount){ int total; object cash, tencash, gold, silver, coin; tencash = present("tenthousand-cash_money", me); cash = present("thousand-cash_money", me); gold = present("gold_money",me); silver = present("silver_money",me); coin = present("coin_money",me); total = 0; if( tencash) total += tencash->value(); if( cash) total += cash->value(); if( gold ) total += gold->value(); if( silver ) total += silver->value(); if( coin ) total += coin->value(); if( total < amount ) return 0; return total;}int do_redeem(string arg){ int num; int amount; string ob_file; object ob; object me; int afford; if( !arg || sscanf(arg, "%d", num)!=1 ) return notify_fail("指令格式:redeem <物品标号>\n"); me = this_player(); amount = (int) me->query("vpawn/" + sprintf("%d", num)); if( !amount ) return notify_fail("有这个物品标号吗?\n"); amount = amount * 3 /4; if( afford = affordable(me, amount) ) { pay_him(me, afford-amount); ob_file = me->query("fpawn/"+sprintf("%d",num)); ob = new(ob_file); ob->move(me); me->delete("pawn/"+sprintf("%d",num)); me->delete("vpawn/"+sprintf("%d",num)); me->delete("fpawn/"+sprintf("%d",num)); me->save(); message_vision("$N赎回了$n。\n", me, ob); return 1; } else return notify_fail("你的钱不够。\n");}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?