init: add workspace files

This commit is contained in:
2026-05-26 16:41:20 +08:00
commit f4f2393f72
1041 changed files with 67405 additions and 0 deletions

279
world/cmd/skill/xue.js Normal file
View File

@@ -0,0 +1,279 @@
this.inherits(COMMAND);
this.command = "xue";
this.allow_state = true;
this.allow_fight = false;
this.regex = /^(?:(\d+)\s)?(\w+)\s+from\s+(.+?)$/;
this.enter = function (me, par, sk, target) {
if (!sk) return me.notify("你要学习什么技能?");
target = me.find_obj(target, me.environment);
if (!target) return me.notify("你要跟谁学习技能?");
if (!me.skills) me.skills = {};
var skill_base = SKILL.get(sk);
if (!skill_base) return me.notify("没有这个技能。");
if (skill_base.grade !== skill_base.query_grade(me)
&& skill_base.type !== SKILL_TYPES.KNOWLEDGE)
return me.notify('你的' + skill_base.query_color_name(me) + "已经进阶,不能再通过学习提升等级了。");
if (target.is_player) {
if (!me.master ||
me.master !== target.id
|| skill_base.type !== SKILL_TYPES.BASE) {
return me.notify(me.name + "不能向" + target.name + "请教" + skill_base.color_name + "");
}
} else {
if (target.on_teach) {
if (target.on_teach(me, sk) === false) return;
} else {
if (target.master == me.id) {
if (target.on_master_learn && target.on_master_learn(me, sk) == false) return;
} else {
if (!target.is(me.query_temp("master")))
return me.notify(target.name + "对你说道:请教?这怎么敢当!");
}
}
}
if (BAN_SKILLS[sk]) return me.send(skill_base.color_name + '不能通过学习升级。');
if (!target.skills[sk]) return me.notify(target.name + "不会这个技能。");
if (target.skills[sk].disable) return me.notify("这个技能暂时不能学习,请联系管理员处理。");
if (me.skills[sk + "2"]) return me.notify("你已经学会了的" + skill_base.color_name + "的进阶武功,不用再学习了。");
const skill_level = me.query_skill(sk, 0);
if (skill_level === 0 && skill_base.do_learn(me) == false) return;
if (check_skill(me, skill_base, target, false) == false) {
return;
}
if (target.is(me.query_temp("master"))) {
if (skill_base.grade > 3 && skill_level === 0) {
if (me.query_temp('sm_level', 0) < 2 && me.query_temp("gongji", 0) < 5000) {
return me.notify(target.name + "对你说道:你对本门的贡献还不够,还需要多加努力。");
}
}
}
if (!checkSkillCount(me, sk)) return;
var max = skill_base.type === SKILL_TYPES.KNOWLEDGE ? 0 : me.skill_limit();
if (par) {
max = parseInt(par);
if (!(max > 0)) return me.send('错误的等级设置');
if (max <= skill_level)
return me.notify("你的" + skill_base.query_color_name(me) + "已经学习到" + max + "级了。");
}
if (me.state) {
if (me.state.id !== 'learn')
return me.notify('你正在' + me.state.title + "。");
if (me.state.skill_base.id === sk)
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 == sk) {
me.state.queues.splice(i, 1);
break;
}
}
me.state.queues.push({
skid: sk,
max_level: max
});
return me.send('已将' + skill_base.query_color_name(me) + "加入学习队列。");
}
me.notify("<hic>你开始向" + target.name + "请教有关「" + skill_base.name + "」的疑问。</hic>");
me.set_state({
id: "learn",
title: "学习" + skill_base.name,
target: target,
max_level: max,
skill_base: skill_base,
queues: [],
on_enter: do_learn,
no_move: "你在听师父讲解,还是不要乱走的好。",
desc: "[\"你听了" + target.name + "的指导,似乎有些心得。\"]",
on_stop: function (me, isauto) {
if (isauto) {
return to_next(me);
}
},
on_check: on_check
});
}
const BAN_SKILLS = {
linshuijing: true,
guanshanjue: true
};
function on_check(me) {
let speed = count_speed(me);
let skill = this.skill_base;
let target_lv = Math.min(me.skill_limit(), this.target.query_skill(skill.id, 0));
if (skill.type === SKILL_TYPES.KNOWLEDGE)
target_lv = this.target.query_skill(skill.id, 0);
let max_level = this.max_level || target_lv;
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), ',当前学习速度', speed];
for (let item of this.queues) {
skill = SKILL.get(item.skid);
let maxlv = item.max_level || target_lv;
str.push('\n准备学习', skill.query_color_name(me), '到', maxlv, '级');
pot += (skill.query_needexp(maxlv, 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);
} else {
format_timespan(Math.floor(me.pot / speed) * 5, str);
str.push(',潜能不足。');
}
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.notify("<hic>你开始向" + state.target.name
+ "请教有关「" + skill_base.name + "」的疑问。</hic>");
return false;
}
if (me.query_setting('auto_work')) {
return WORLD.check_user_next(me);
}
}
function checkSkillCount(me, sk) {
var count = 0;
for (var skid in me.skills) {
if (skid == sk) return true;
var skill_base = SKILL.get(skid);
if (skill_base && skill_base.type == SKILL_TYPES.SKILL) {
count++;
}
}
if (count >= 50) return me.notify_fail('你的技能数量已经达到上限(基础武功和知识类武功外的其他技能不能超过50个)。');
return true;
}
function check_skill(me, skill, master, limit = true) {
var lv = me.query_skill(skill.id, 0);
if (lv >= master.query_skill(skill.id, 0)) {
me.notify("这项技能你的程度已经不输你师父了。");
return false;
}
if (limit && me.state && me.state.max_level && lv >= me.state.max_level) {
return me.notify_fail("你的" + skill.color_name + "学习完毕。");
}
if (skill.type != SKILL_TYPES.KNOWLEDGE) {
var max_lv = me.skill_limit();
if (lv >= max_lv) {
return me.notify_fail("也许是缺乏实战经验,你对" + master.name + "的讲解总是无法领会。");
}
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("也许是基本功火候未到,你对" + master.name + "的讲解总是无法领会。");
return false;
}
}
}
}
// if (skill.do_learn(me, lv) == false) {
// return false;
// }
return true;
}
function do_learn(me) {
var master = this.target;
if (!me.is_here(master) || !master.is_living()) {
return false;
}
if (me.pot <= 0) {
me.notify("你的潜能不够,无法继续学习下去了。");
return false;
}
var skill = me.skills[this.skill_base.id];
var lv = 0;
if (skill) {
lv = skill.level;
}
if (lv >= master.query_skill(this.skill_base.id, 0)) {
me.notify("这项技能你的程度已经不输你师父了。");
return false;
}
if (check_skill(me, this.skill_base, master) == false) {
return false;
}
var exp = count_speed(me);
if (lv < 300) {
exp = exp * 5;
if (this.skill_base.type == SKILL_TYPES.KNOWLEDGE) {
exp = exp * 2;
}
} else {
if (this.skill_base.type == SKILL_TYPES.KNOWLEDGE) {
exp = exp * 10;
}
}
if (master.do_teach) {
return master.do_teach(me, this.skill_base, lv);
}
if (exp > me.pot)
return me.notify_fail("你的潜能不够,无法继续学习下去了。");
if (this.skill_base.type === SKILL_TYPES.KNOWLEDGE) {
let diff = me.query_prop('haoranqi');
let diff_pot = exp;
if (diff > 0) {
diff_pot = parseInt(exp - exp * diff / 100);
}
me.pot -= diff_pot;
} else {
me.pot -= exp;
}
this.skill_base.add_exp(me, exp);
}
function count_speed(me) {
let pot = parseInt((me.int + me.query_prop("int")) *
(100 + me.query_prop("study_per") + me.family.query_temp('study_per', 0)
+ WORLD.DATA.query_temp("study_per", 0) + me.int) / 100) * 3;
return pot;
}