NPC = function () { this.hp = this.max_hp = 100; this.mp = this.max_mp = 100; this.str = this.con = this.dex = this.int = this.per = this.age = 20; this.family = FAMILIES.NONE; this.auto_pfm = true; } NPC.inherits(CHARACTER); NPC.prototype.set_chat_msg = function (items, chance) { if (items) { this.chat_msg = items; //this.chat_chance = chance || 10; } } NPC.prototype.do_chat_msg = function () { if (!this.is_fighting() && this.is_living && this.chat_msg) { this.do_say(this.chat_msg.random()); } } NPC.prototype.format_equipments = function (call3, str, eqcmd) { if (this.equipment && this.equipment.length) { var eqstr = []; for (var i = 0; i < this.equipment.length; i++) { var item = this.equipment[i]; if (!item) continue; eqstr.push("◆", item.color_name, "\n"); } if (eqstr.length) { return str.push(call3, "装备着:\n", eqstr.join("")); } } str.push(call3, "穿着一件布衣。\n"); } NPC.prototype.set_goods = function () { if (!arguments.length) return; this.sell_list = []; for (var i = 0; i < arguments.length; i++) { var item = arguments[i]; var obj = OBJ.CREATE(item); if (!obj) continue; obj.count = -1; this.sell_list.push(obj); } } NPC.prototype.query_commands = function (player) { if (this.json) return this.json; this.json = this.query_commands_json(player, false); return this.json; } NPC.prototype.query_commands_json = function (player, isyb) { var json = {}; json.type = "item"; json.desc = this.desc; json.id = this.id; json.name = this.name; json.commands = []; json.commands.push({ cmd: "look " + this.id, name: "查看" }); if (!this.no_fight) json.commands.push({ cmd: "fight " + this.id, name: "比试" }); json.commands.push({ cmd: "kill " + this.id, name: "击杀" }); if (this.on_master) { json.commands.push({ cmd: "bai " + this.id, name: "拜师" }); } if (this.on_checkskill || this.on_master) { json.commands.push({ cmd: "cha " + this.id, name: "学习" }); json.master = true; } if (this.sell_list) { json.commands.push({ cmd: "list " + this.id, name: "购买" }); json.trader = true; } if (this.question) { for (var cmd in this.question) { json.commands.push({ cmd: "ask " + this.id + " about " + cmd, name: "询问" + cmd }); } } if (this.actions) { for (var cmd in this.actions) { if (!this.actions[cmd].name) continue; json.commands.push({ cmd: cmd + " " + this.id, name: this.actions[cmd].name }); } } return JSON.stringify(json); } NPC.prototype.update_action = function (acts) { this.json = null; this.actions = acts; } var DIE_MSG = ["\n$N扑在地上挣扎了几下,腿一伸,口中喷出几口鲜血,死了!\n", "\n$N大叫一声倒在地上,挣扎了几下,死了!\n", "\n$N口中喷出几口鲜血,倒在地上,死了!\n"]; NPC.prototype.die = function (killer) { if (!this.environment) return; if (this.on_die && this.on_die(killer) == false) { this.hp = 1; return false; } this.hp = 0; this.clear_status(); this.send_room(DIE_MSG.random()); this.clear_follow(); var corpse = new CORPSE(); var isinfb = this.environment.is_fb(); corpse.init(this, isinfb); this.die_room = this.environment; this.environment.item_changed(corpse, true); this.environment.item_changed(this, false); if (isinfb && this.score && killer && killer.add_fbscore) { //副本分数 killer.add_fbscore(this.score); } if (!isinfb && !this.no_refresh && !this.master && !this.die_room.is_shadow) { this.call_out(this.relive, this.on_master ? 60000 : 300000); } this.on_died && this.on_died(killer, corpse); WORLD.auto_get(killer, corpse, this); if (killer && killer.attack_skill && killer.attack_skill.on_enemy_die) { killer.attack_skill.on_enemy_die(killer, this); } } NPC.prototype.relive = function () { if (!this.die_room) return; var room = ROOM.Get(this.die_room.path); var obj = room.find_obj_bypath(this.path); if (obj) return; obj = NPC.CLONE(this.path); room.item_changed(obj, true); this.die_room = null; this.equipment = null; this.items = null; this.skills = null; } NPC.prototype.destroy = function (msg) { if (this.environment) { this.environment.item_changed(this, false, msg); } this.clear_follow(); } NPC.prototype.heart_beat = function (dt) { if (!this.fight_type) { if (this.hp < this.max_hp) { this.add_hp(parseInt(this.max_hp / 2)); } if (this.mp < this.max_mp) { this.add_mp(parseInt(this.max_mp / 2)); } if (this.chat_msg) { if (this.random(10) > 8) this.send_message(this.chat_msg.random()); } this.on_heart_beat && this.on_heart_beat(dt); } else if (this.hp <= 0) { var eny = this.query_enemy(); if (!eny) { this.hp = 1; this.fight_type = 0; } } } NPC.CREATE = function (path, env, oncreate, count) { if (!path || !env) return; if (env.environment) env = env.environment; count = count || 1; let obj = null; for (let i = 0; i < count; i++) { obj = NPC.CLONE(path); env.item_changed(obj, true); if (oncreate) oncreate(obj); } return obj; } NPC.CLONE = function (path) { let base = NPC.GET(path); let item = Object.create(base); item.clone(); return item; } NPC.GET = function (path) { let base = WORLD.NPC_STROE.get(path); if (!base) { base = BASE.CREATE(__PATH.NPC, path); if (!base) throw new Error('没有人物' + path + "的定义。"); //这里会自己调用create方法存储到NPC_STROE,记住了吗 } return base; }