Files
wsmud/world/cmd/skill/lianxi.js
2026-05-26 16:41:20 +08:00

188 lines
6.4 KiB
JavaScript

this.inherits(COMMAND);
this.command = "lianxi";
this.allow_fight = false;
this.regex = /^(\w+)(?:\s+(\d+))?$/;
this.allow_state = true;
this.enter = function (me, skid, par) {
if (!me.skills) return;
if (!(me.pot > 0)) return me.send('你的潜能不足。');
if (me.state && me.state.id !== 'lianxi')
return me.send('你正在' + me.state.title + "。");
var skill = me.skills[skid];
if (!skill) return me.notify("你不会这个技能。");
var skill_base = SKILL.get(skid);
if (!skill_base) return me.notify("没有这个技能。");
if (skill_base.on_practice && skill_base.on_practice(me) === false) return;
if (skill_base.on_learn && skill_base.on_learn(me) === false) return;
if (skill_base.type == SKILL_TYPES.KNOWLEDGE) {
return me.notify(skill_base.color_name + "只能通过学习增加熟练度。");
}
var min_level = (skill_base.lianxi_level || 100);
if (skill.level < min_level) {
return me.notify("你的" + skill_base.query_color_name(me) + "等级不够" + min_level + ",无法练习。");
}
if (me.query_prop(skid)) return me.notify("你不能装备增加" + skill_base.color_name + "等级的道具练习。");
var max = me.skill_limit();
if (par) {
max = Math.min(par, max);
if (!(max > 0)) return me.send('错误的等级设置');
if (max <= me.query_skill(skid))
return me.notify("你的" + skill_base.query_color_name(me) + "已经练习到" + max + "级了。");
}
if (me.state) {
if (me.state.skill_base === skill_base)
return me.send('你正在练习' + skill_base.query_color_name(me) + "。");
for (let i = 0; i < me.state.queues.length; i++) {
if (me.state.queues[i].skid == skid) {
me.state.queues.splice(i, 1);
break;
}
}
me.state.queues.push({
skid: skid,
max_level: max
});
return me.send('已将' + skill_base.query_color_name(me) + "加入练习队列。");
}
if (!check_skill(me, skill_base, false)) return;
me.notify("<hic>你开始练习" + skill_base.query_color_name(me) + "。</hic>");
me.set_state({
id: "lianxi",
title: "练习技能",
max_level: max,
skill_base: skill_base,
queues: [],
sum_pot: 0,
stime: Date.now(),
on_enter: do_learn,
desc: "[\"你对" + skill_base.query_color_name(me) + "似乎有些心得。\"]",
on_stop: function (me, isauto) {
if (isauto) {
return to_next(me);
}
},
on_check: on_check
});
}
function on_check(me) {
let max_level = this.max_level;
let speed = count_speed(me);
let skill = this.skill_base;
let pot = skill.query_needexp(max_level, me) -
skill.query_needexp(me.query_skill(skill.id, 0), me);
let str = ['你正在练习', skill.query_color_name(me), '到', max_level, '级,当前练习速度', speed];
for (let item of this.queues) {
skill = SKILL.get(item.skid);
str.push('\n准备练习', skill.query_color_name(me), '到', item.max_level, '级');
pot += (skill.query_needexp(item.max_level, me) -
skill.query_needexp(me.query_skill(skill.id, 0), me));
}
str.push('\n<hic>预计耗时');
if (pot < me.pot) {
format_timespan(Math.floor(pot / speed) * 5, str);
str.push('练习完成');
} else {
format_timespan(Math.floor(me.pot / speed) * 5, str);
pot = me.pot;
str.push('潜能不足中断');
}
str.push(',已消耗', this.sum_pot, '/', Math.floor(pot), '潜能。');
str.push('</hic>\n点击练习其他武功可添加到队列。');
me.send(str.join(""));
}
function format_timespan(time, str) {
if (time < 60) return str.push('少于1分钟');
if (time > 86400) {
str.push(Math.floor(time / 86400), '天');
time = time % 86400;
}
if (time > 3600) {
str.push(Math.floor(time / 3600), '小时');
time = time % 3600;
}
str.push(Math.floor(time / 60), '分钟');
}
function to_next(me) {
let state = me.state;
if (state.queues.length > 0) {
let item = state.queues.shift();
var skill_base = SKILL.get(item.skid);
if (!skill_base) return me.notify("没有这个技能。");
state.max_level = item.max_level;
state.skill_base = skill_base;
me.send('你开始练习' + skill_base.query_color_name(me) + "。");
state.desc = "[\"你对" + skill_base.query_color_name(me) + "似乎有些心得。\"]";
me.send(`{type:"state",state:"你正在${state.title}",desc:${state.desc}}`);
return false;
}
if (me.query_setting('auto_work')) {
return WORLD.check_user_next(me);
}
}
function check_skill(me, skill, limit = true) {
var lv = me.query_skill(skill.id, 0);
if (limit && me.state && me.state.max_level && lv >= me.state.max_level) {
return me.notify_fail("你的"
+ skill.query_color_name(me) + "已经练习到" + me.state.max_level + "级了。");
}
var max_lv = me.skill_limit();
if (!(lv < max_lv)) {
return me.notify_fail("也许是缺乏实战经验,你觉得你的" + skill.query_color_name(me) + "已经到了瓶颈了。");
}
var ens = skill.can_enables;
if (ens && ens.length) {
for (var i = 0; i < ens.length; i++) {
if (lv >= me.query_skill(ens[i], 0)) {
me.notify("你的基本功火候未到,必须先打好基础才能继续提高。");
return false;
}
}
}
if (skill.do_practice && skill.do_practice(me, lv) == false) {
return false;
}
return true;
}
function do_learn(me) {
if (me.pot > 0) {
if (!check_skill(me, this.skill_base)) return false;
var exp = count_speed(me);
if (exp > me.pot) exp = me.pot;
me.pot -= exp;
this.sum_pot += exp;
return this.skill_base.add_exp(me, parseInt(exp));
}
return me.notify_fail("你的潜能不够,无法继续练习下去了。");
}
function count_speed(me) {
let pot = parseInt((me.int + me.query_prop("int")) * (100 + me.query_prop("lianxi_per")
+ me.family.query_temp('lianxi_per', 0)
+ WORLD.DATA.query_temp("lianxi_per", 0) + me.int) / 100);
return pot;
}