this.inherits(COMMAND); this.command = "biwu"; this.allow_busy = true; this.allow_state = true; this.allow_die = true; this.biwu_state = { allow_busy: false, allow_state: false, allow_die: false, allow_die: false }; const STATS = WORLD.STATS; this.regex = /^(emei|wudang|shaolin|huashan|xiaoyao|gaibang|shashou|none)?\s*(\d+)(?:\s+(ok))?$/; this.enter = function (me, fam, type, par) { if (!me.can_trans()) return; if (!WORLD.COMMANDS.events.check_command(this.biwu_state, me)) return; let index = parseInt(type); if (!(index > 0 && index < 11)) return me.notify('错误的对手编号。'); if (fam && me.family.id !== fam.toUpperCase()) return me.notify('你只能挑战自己门派的高手榜单。'); const top_key = fam ? "top_fam" : "top"; let top = me.query_temp(top_key, 999); if (top === index) { return me.notify('你不能挑战自己。'); // return me.send_commands('biwu recopy', '更新擂台使用的技能和装备属性'); } if (top <= index) return me.notify('你只能挑战积分比你高的对手。'); let max = Math.floor(me.query_temp("ex_jl", 0) / 40); let count = me.query_temp('top_c', 0); if (count >= max) return me.notify('你今天的挑战次数已经用尽,每日精力每消耗40增加一次挑战机会。'); if (!par) { me.notify(`当你每消耗40精力后,增加一次挑战机会,当前可挑战次数${count}/${max}`); if (count < max) { fam = fam ? (fam + " ") : ""; return me.send_commands('biwu ' + fam + type + " ok", '确定挑战'); } return; } if (me.state) return me.send('你正在' + me.state.title + "。"); if (me.status && me.status.length) return me.send('你需要清理掉自身的增益效果才可上擂台挑战。'); if (me.hp / me.max_hp < 0.9 || me.mp / me.max_mp < 0.9) return me.send('你先调整好自身的状态再来挑战吧。'); this.start_biwu(me, fam, index - 1); } this.start_biwu = function (me, fam, index) { let tops = STATS.TOPS; if (fam) tops = STATS['tops_' + fam.toUpperCase()]; if (!tops) return me.send('错误的对手,无法挑战。'); var npc = tops[index]; if (!npc) { return me.send(me, "错误的对手。"); } if (me.moveto('yz/leitai/leitai') === false) return; npc = this.create_npc(npc); let room = me.environment; me.die = challenge_end; npc.die = challenge_end; room.on_heart_beat = this.on_heart_beat; room.biwu_step = 0; me.auto_pfm = true; me.check_pfms = this.check_pfms; me.init_pfms = this.init_pfms; npc.fight_type = 0; room.item_changed(npc, true, npc.name + "跳上了擂台。"); npc.full(); me.add_temp('top_c', 1, UTIL.diff_time()); me.set_temp('biwu_fam', fam); me.call_interval(x => { me.send_message("\n挑战还有" + (3 - x) + "秒钟正式开始!", true); }, 1000, 3, function () { npc.do_kill(me); } ); me.send('{type:"dialog",dialog:"stats",close:true}'); } this.surrender = function (me) { // if (!me.fight_type) // return me.send('你还没开始战斗呢。'); let npc = me.environment.items[1]; if (npc.is_player) { npc = me.environment.items[0]; } me.end_fight(); npc.end_fight(); challenge_over(me, 2); challenge_fail(me); } this.on_heart_beat = function (dt) { this.biwu_step++; if (this.biwu_step < 60) return; if (!this.items.length) { return; } let me = this.items[0], npc = this.items[1]; if (npc && npc.is_player) { me = npc; npc = this.items[0]; } me.end_fight(); npc?.end_fight(); challenge_over(me, 2); challenge_fail(me); me.notify("挑战超时,自动离开擂台。"); } function challenge_end(killer) { if (this.on_die && this.on_die(killer) === false) { this.hp = 1; return false; } let me = killer, npc = this; if (this.is_player) { npc = killer, me = this; } if (me.hp <= 0) me.hp = 1; me.end_fight(); npc.end_fight(); if (killer === me) { challenge_over(me, 1, npc); challenge_success(me, npc); } else { challenge_over(me, 0, npc); challenge_fail(me, npc); // me.notify("挑战失败,你的积分保持不变。"); } } function challenge_over(me, result, npc) { me.environment.on_heart_beat = null; me.die = USER.prototype.die me.auto_pfm = false; me.auto_skills = null; me.check_pfms = USER.prototype.check_pfms; me.init_pfms = USER.prototype.init_pfms; let leitai = me.environment; if (result === 0) me.moveto('yz/leitai/ltx', null, me.name + "被" + npc.name + "一脚踢下了擂台。", 'fightend'); else if (result === 1) { me.moveto('yz/leitai/ltx', null, me.name + "走了下来。", 'fightend'); } else { me.moveto('yz/leitai/ltx', null, me.name + "被赶下来。", 'fightend'); } leitai.items.length = 0; me.clear_downside(true); } function challenge_fail(me, npc) { me.notify("挑战失败,擂台积分保持不变。"); me.remove_temp('biwu_fam'); } function challenge_success(me, npc) { const fam = me.query_temp('biwu_fam'); let top_key = fam ? "top_fam_sc" : "top_sc"; let sc = me.query_temp(top_key, 0); let target_sc = npc.score ?? 0; let add = Math.floor((target_sc - sc) / 2); if (add === 0) { add = 1; } if (add > 0) { sc += add; me.set_temp(top_key, sc); } else { add = 0; } if (fam) me.notify("挑战成功,当前" + me.family.name + "榜单积分" + sc + "。"); else me.notify("挑战成功,当前总榜积分" + sc + "。"); if (add > 0) WORLD.COMMANDS.biwu.updatePlayerStats(me, sc, fam); me.remove_temp('biwu_fam'); } const COPY_TEMPS = ["copy_pfm_sword",//"copy_pfm", "copy_pfm_unarmed", "jiuyang", "zyy"]; const COPY_PROPS = ["str", "con", "dex", "int", "gender", "max_mp", "exp", "pot", "kar", "per" , "name", "hp", "max_hp", "mp"]; this.create_npc = function (player, fam) { var npc = NPC.CLONE('pub/gaoshou1'); for (var i = 0; i < COPY_PROPS.length; i++) { npc[COPY_PROPS[i]] = player[COPY_PROPS[i]]; } npc.equipment = []; if (player.equipment) { var eqs = player.equipment; for (var i = 0; i < eqs.length; i++) { if (!eqs[i]) continue; var obj = eqs[i].clone(player); npc.equipment[obj.eq_type] = obj; if (obj.on_eq) obj.on_eq(npc); } } npc.skills = {}; if (player.skills) { for (var sk in player.skills) { let item = player.skills[sk]; npc.skills[sk] = { ...item }; } } npc.attack_count = 3; if (player.is_player) { npc.title = player.query_title("family"); npc.age = player.query_age(); npc.userid = player.id; npc.score = player.query_temp(fam ? 'top_fam_sc' : "top_sc", 0); npc.top_index = player.query_temp(fam ? 'top_fam' : "top", 0); npc.id = "top_" + (fam ? fam.toUpperCase() : "") + "_" + (npc.top_index - 1); } else { npc.title = player.title; npc.age = player.age; npc.userid = player.userid; npc.score = player.score; npc.top_index = player.top_index; } for (let key of COPY_TEMPS) { let value = player.query_temp(key); if (value) { npc.set_temp(key, value); } } npc.clear_prop(); npc.init(); npc.recount = this.recount; npc.recount(); npc.check_pfms = this.check_pfms; npc.init_pfms = this.init_pfms; if (npc.force_skill.on_relive) { npc.force_skill.on_relive(npc); } npc.hp = npc.max_hp; return npc; } this.recount = function () { this.max_hp = parseInt(this.con * 5 + (this.max_mp * this.query_force_rad() + this.query_prop("max_hp") + this.query_prop("con") * this.con) * (100 + this.query_prop("hp_per")) / 100); this.max_hp = this.max_hp; if (this.max_hp < 1) this.max_hp = 1; if (this.hp > this.max_hp) this.hp = this.max_hp; this.gjsd = 4000 - this.query_prop("gjsd"); if (this.gjsd > 500) { this.gjsd = parseInt(this.gjsd - (this.gjsd * this.query_prop("gjsd_per") / 100)); } if (this.gjsd < 500) this.gjsd = 500; this.gj = parseInt(this.str + (this.query_prop("gj") + this.query_prop("str") * this.str / 10) * (100 + this.query_prop("gj_per")) / 100); this.fy = parseInt(((this.str + this.con) / 10 + this.query_prop("fy") + this.query_prop("con") * this.con / 10) * (100 + this.query_prop("fy_per")) / 100); this.mz = parseInt((this.dex / 2 + this.query_prop("mz")) * (100 + this.query_prop("mz_per")) / 100); this.ds = parseInt((this.dex / 2 + this.query_prop("ds") + this.query_prop("dex") * this.dex / 10) * (100 + this.query_prop("ds_per")) / 100); this.zj = parseInt((this.str / 2 + this.query_prop("zj") + this.query_prop("str") * this.str / 10) * (100 + this.query_prop("zj_per")) / 100); this.bj = parseInt(this.dex / 10 + this.query_prop("bj_per")); if (this.parry_skill && this.parry_skill.on_recount_parry) { this.zj += this.parry_skill.on_recount_parry(this); } if (this.dodge_skill && this.dodge_skill.on_recount_dodge) { this.ds += this.dodge_skill.on_recount_dodge(this); } this.diff_sh_per = this.query_prop('diff_sh_per'); if (this.diff_sh_per > 80) { this.diff_sh_per = 80 + Math.sqrt((this.diff_sh_per - 80) * 4); if (this.diff_sh_per > 99.9999) this.diff_sh_per = 99.9999; } this.diff_sh_per += this.query_prop('diff_sh_per2'); } this.check_pfms = function (target) { if (!this.auto_skills) this.init_pfms() if (!this.equipment[0] && this.items[0] && this.random(3) === 0) { return this.equip(this.items[0]); } if (this.auto_eqs.length > 0 && this.random(3) === 1) { let eqs = []; for (var i = 0; i < this.auto_eqs.length; i++) { let obj = this.auto_eqs[i]; let key = "disobj_" + (obj.distype || obj.id); if (obj.distime && this.query_temp(key)) { continue; } eqs.push(obj); } if (eqs.length > 0) { let obj = eqs.random(); if (obj.on_use(this) !== false) { if (obj.distime) { this.set_temp("disobj_" + (obj.distype || obj.id), 1, obj.distime); } return; } } } return CHARACTER.prototype.check_pfms.call(this, target); } this.init_pfms = function () { CHARACTER.prototype.init_pfms.call(this); this.auto_eqs = []; for (var i = 1; i < this.equipment.length; i++) { if (this.equipment[i] && this.equipment[i].on_use) { this.auto_eqs.push(this.equipment[i]); } } } const TOPS = ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]; this.setStatsTitle = function (player, index, fam) { if (fam) return;//门派称号先不用 if (index < 10) { let title = "天下第" + TOPS[index]; player.add_title(title, "top"); player.notify('你的高手榜称号变动为【' + title + '】。'); } else player.add_title(null, "top"); } this.checkStats = function (player) { let top = player.query_temp("top"); if (top) { this.check_fams_stats(player, STATS.TOPS, top); } top = player.query_temp("top_fam"); if (top) { this.check_fams_stats(player, STATS['tops_' + player.family.id], top, player.family.id); } } this.check_fams_stats = function (player, tops, top, fam) { let npc = tops[top - 1]; if (!npc) return; let top_key = fam ? "top_fam" : "top"; if (npc.userid !== player.id) { for (let i = 0; i < tops.length; i++) { if (tops[i].userid === player.id) { player.set_temp(top_key, i + 1); return this.setStatsTitle(player, i, fam); } } player.remove_temp(top_key); this.setStatsTitle(player, 9999, fam); } } this.updateTopStats = function (top, index, fam) { let top_user = top.userid ? WORLD.getUser(top.userid) : null; let top_key = fam ? "top_fam" : "top"; if (index > 0) { top.top_index = index + 1; top.id = "top_" + (fam ? fam.toUpperCase() : "") + "_" + index; if (top_user) { top_user.set_temp(top_key, index + 1); this.setStatsTitle(top_user, index, fam); } } else { top.top_index = -1; if (top_user) { top_user.remove_temp(top_key); this.setStatsTitle(top_user, 10, fam); } } } this.checkTopindex = function (sc, tops) { let index = -1; for (let i = tops.length - 1; i >= 0; i--) { let item = tops[i]; if (item.score >= sc) return index; index = i; } return 0; } this.updatePlayerStats = function (player, sc, fam) { //玩家挑战没上榜不用管,挑战失败减分也不会下榜,因为没有记录以下的玩家 //这里只会上升不会下降 let tops = STATS.TOPS; let top_key = "top"; if (fam) { tops = STATS['tops_' + fam.toUpperCase()]; top_key = "top_fam"; } if (!tops) return; let index = this.checkTopindex(sc, tops); if (index < 0) { return; } let top = player.query_temp(top_key, 0); if (top > 0) { tops[top - 1].score = sc; if (top <= index + 1) return; tops.splice(top - 1, 1); } player.set_temp(top_key, index + 1); tops.splice(index, 0, this.create_npc(player, fam)); if (tops.length > 10) { this.updateTopStats(tops.splice(tops.length - 1)[0], -1, fam); } if (top == 0) { top = tops.length; } for (let i = index + 1; i < top; i++) { this.updateTopStats(tops[i], i, fam); } if (!fam) { this.setStatsTitle(player, index); // player.notify('恭喜你获得称号【' + "天下第" + TOPS[index] + '】'); } } this.biwu_watch = function (me) { }