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

View File

@@ -0,0 +1,43 @@
this.inherits(COMMAND);
this.command = "checkskill";
this.allow_busy = true;
this.allow_state = true;
this.allow_die = true;
this.regex = /^(\w+)(?:\s(\w+))?$/;
const num_reg = /^\d+$/;
this.enter = function (player, skid, from) {
var skill_base = SKILL.get(skid);
if (!skill_base) {
return player.send("没有这个技能。");
}
// if (skill_base.is_custom && !player.create_for(skid)) {
// return player.send('你只能查看公开的技能信息。');
// }
var target = player;
if (from == "help" || num_reg.test(from)) {
let lv = parseInt(from);
return player.send(skill_base.query_desc(player, lv > 0 && lv < 3000 ? lv : 1000));
} else if (from) {
target = player.find_obj(from, player.environment);
if (!target && player.user_level > 1) {
target = WORLD.getUser(from);
}
if (!target) player.send("没有这个人。");
if (player.user_level < 1 && !target.is(player.query_temp("master")) && target.master !== player.id) {
if (!target.on_checkskill || !target.on_checkskill(player)) {
return player.notify("你只能查看自己师父的技能。");
}
}
}
var obj = {};
obj.type = "dialog";
obj.dialog = "skills";
if (skill_base.is_custom)
obj.is_custom = 1;
obj.id = skid;
if (!target.skills) target.skills = {};
obj.desc = skill_base.query_desc(target, target.query_skill(skid, 1000));
return player.send(JSON.stringify(obj));
}

73
world/cmd/skill/enable.js Normal file
View File

@@ -0,0 +1,73 @@
this.inherits(COMMAND);
this.command = "enable";
this.regex = /^(\w+?)\s+(.+?)$/;
this.allow_fight = false;
this.enter = function (me, base, skill, no_sent) {
if (!me.skills) return me.notify("你还不会任何技能。");
var baseskill = me.skills[base];
if (!baseskill) return me.notify("你还不会这个基本技能。");
var baseskill_base = SKILL.get(base);
if (!baseskill_base || baseskill_base.type !== SKILL_TYPES.BASE) {
return me.notify("没有这个基本技能。");
}
var old_skill;
if (baseskill.enable_skill) {
old_skill = me.skills[baseskill.enable_skill];
if (!old_skill) return me.notify("技能错误,装备失败。");
old_skill[base] = false;
old_skill = SKILL.get(baseskill.enable_skill);
if (old_skill) {
old_skill.disenable(me, base, me.query_skill(baseskill.enable_skill));
//me.notify('{type:"dialog",dialog:"skills",id:"' + base + '",enable:false}');
}
baseskill.enable_skill = null;
} else {
if (skill == "none") return;
}
if (WEAPON_SKILLS[base]) {
me.remove_status("weapon", true);
} else {
me.remove_status(base, true);
}
if (skill && skill !== "none") {
var sp_skill = me.skills[skill];
var sp_skill_base = SKILL.get(skill);
if (!sp_skill) {
me.remove_status(base, true);
me.init_skill();
me.recount();
return me.notify("你不会这个技能。");
}
if (!sp_skill_base || sp_skill_base.enable(me, base, me.query_skill(skill)) !== true)
return false;
baseskill.enable_skill = skill;
sp_skill[base] = true;
me.notify("你决定使用" + sp_skill_base.query_color_name(me) + "做为" + baseskill_base.color_name + "的特殊技能。");
if (me.is_player)
me.notify('{type:"dialog",dialog:"skills",id:"' + base + '",enable:"' + skill + '"}');
else
me.notify('{type:"dialog",dialog:"skills","from":"' + me.id + '",id:"' + base + '",enable:"' + skill + '"}');
} else {
baseskill.enable_skill = null;
me.notify("你决定取消使用" + old_skill.query_color_name(me) + "做为" + baseskill_base.color_name + "的特殊技能。");
if (me.is_player)
me.notify('{type:"dialog",dialog:"skills",id:"' + base + '",enable:false}');
else
me.notify('{type:"dialog",dialog:"skills","from":"' + me.id + '",id:"' + base + '",enable:false}');
}
if (!no_sent) {
me.init_skill();
me.recount();
me.notify_hp();
}
}
const WEAPON_SKILLS = {
"sword": 4,
"blade": 5,
"staff": 7, "club": 8, "whip": 9
};

115
world/cmd/skill/fangqi.js Normal file
View File

@@ -0,0 +1,115 @@
this.inherits(COMMAND);
this.command = "fangqi";
this.allow_fight = false;
this.regex = /^(\w+)(?:\s+(\w+))?$/;
this.enter = function (me, skillid, sid) {
if (!me.skills) return me.notify("你还不会任何技能。");
var skill = me.skills[skillid];
if (!skill) return me.notify("你还不会这个技能。");
var skill_base = SKILL.get(skillid);
if (!skill_base) return me.notify("没有这个技能。");
if (skill_base.grade < 1 || skill_base.type === SKILL_TYPES.KNOWLEDGE) {
return me.notify("基础和知识技能不能遗忘。");
}
if (!sid) {
if (skill.ref) {
return me.notify("你需要先取消融合才可以遗忘技能。");
}
if (skill.addin && skill.addin.length > 0) {
return me.notify("你需要先取消进阶才可以遗忘技能。");
}
}
let up_count = 0;
if (skill_base.source_skill) {
up_count += (skill_base.grade === 4 ? 50 : 100);
}
var level = skill.level;
var exp = (100 + level) * (level - 100) / 2 * (skill_base.query_grade(me) + 1) * 5;
if (skill_base.type !== SKILL_TYPES.KNOWLEDGE) {
if (!sid) {
let str = "。";
if (up_count > 0) {
str = ",直接遗忘会退还" + up_count + "份<hiz>门派进阶残页</hiz>。";
}
let befroe = me.master ? "dc " + me.id + " " : "";
me.send("是否确认重置" + skill_base.query_color_name(me) + "100级后的潜能全部返还" + str);
return me.send_commands(befroe + 'fangqi ' + skillid + " ok", '直接遗忘',
befroe + 'fangqi ' + skillid + " 100", "重置到100级",
befroe + 'fangqi ' + skillid + " 3000", "重置到3000级");
} else if (sid !== 'ok') {
let reset_level = parseInt(sid);
if (!(reset_level >= 100)) return me.notify('输入等级错误。');
return this.reset_skill(me, skill, skill_base, reset_level);
}
}
exp = parseInt(exp);
if (me.remove_skill(skillid)) {
me.notify('{type:"dialog",dialog:"skills","from":"' + me.id + '",remove:"' + skillid + '"}');
if (level > 100 && skill_base.type !== SKILL_TYPES.KNOWLEDGE) {
me.pot += exp;
me.notify("<hic>你遗忘的技能" + skill_base.query_color_name(me) + "转化为" + exp + "点潜能。</hic>");
} else {
me.notify("<hic>你已遗忘技能" + skill_base.query_color_name(me) + "。</hic>");
exp = 0;
}
if (up_count > 0) {
let obj = me.add_obj('book/up', up_count);
me.send('你获得' + obj.unit_name(up_count) + "。")
}
if (me.master) return;
WORLD.add_recover_obj(me, {
id: skillid,
name: skill_base.color_name,
up_count: up_count,
addin: skill.addin,
level: level,
pot: exp
}, 3);
}
}
this.reset_skill = function (me, skill, skill_base, level) {
if (skill_base.type === SKILL_TYPES.KNOWLEDGE) return me.notify_fail('知识类技能无法重置。');
if (skill.level <= level) return me.notify("你的" + skill_base.query_color_name(me) + "不用重置等级。");
let exp = (100 + skill.level) * (skill.level - 100) / 2 * (skill_base.query_grade(me) + 1) * 5;
if (level > 100) {
exp -= (100 + level) * (level - 100) / 2 * (skill_base.query_grade(me) + 1) * 5;
}
me.pot += exp;
let curr_level = me.query_skill(skill_base.id, 0);
me.notify("<hic>你的" + skill_base.query_color_name(me)
+ "重置为" + level + "级,返回" + exp + "点潜能。</hic>");
// console.log(curr_level);
me.add_score(-skill_base.query_score(curr_level, me));
skill_base.release_prop(me, curr_level);
skill.level = level;
skill.exp = 0;
curr_level = me.query_skill(skill_base.id, 0);
// console.log(curr_level);
me.add_score(skill_base.query_score(curr_level, me));
skill_base.attach_prop(me, curr_level);
me.recount();
var str = ['{type:"dialog",dialog:"skills",item:'];
skill_base.item_to_json(str, skill, me);
str.push("}");
me.notify(str.join(""));
return true;
}

51
world/cmd/skill/fenpei.js Normal file
View File

@@ -0,0 +1,51 @@
this.inherits(COMMAND);
this.command = "fenpei";
this.allow_fight = false;
this.enter = function (me) {
var fen = me.query_temp("fenpei");
if (!fen) return me.notify("你目前没有可以分配的先天属性。");
if (fen <= 0) return me.notify("你目前的可分配属性是"+fen+",无法分配。");
me.notify("请说出你的先天属性每项15-30总计" + fen + ",比如:10 0 0 10");
me.wait_input = readnumber;
}
function readnumber(me, cmd) {
var fen = me.query_temp("fenpei");
if (!cmd) return me.notify("请说出你要增加的先天属性,总计" + fen +",比如:10 0 0 10");
var ss = cmd.split(' ');
if (ss.length != 5) return me.notify("请说出你要增加的先天属性,总计" + fen +",比如:10 0 0 10");
var str = parseInt(ss[1]);
var con = parseInt(ss[2]);
var dex = parseInt(ss[3]);
var int = parseInt(ss[4]);
if (str + con + dex + int != fen) return me.notify("四项总计需要是" + fen+",请重新调整");
if (str < 0 || con < 0 || dex < 0 || int < 0) return me.notify("单项的值需要大于0");
me.set_temp("re_str", str);
me.set_temp("re_con", con);
me.set_temp("re_dex", dex);
me.set_temp("re_int", int);
me.notify("增加先天属性设置为臂力:" + str + ",根骨:" + con + ",身法:" + dex + ",悟性:" + int + ",是否确认?");
me.send_commands("ok", "确认", "cancle", "重新设置");
me.wait_input = checkResult;
}
function checkResult(me, str) {
if (str == "ok") {
me.str +=( me.query_temp("re_str") || 0);
me.con += (me.query_temp("re_con") || 0);
me.int += (me.query_temp("re_int") || 0);
me.dex += (me.query_temp("re_dex") || 0);
me.recount();
me.notify("属性调整完成");
me.remove_temp("fenpei");
me.wait_input = null;
me.remove_temp("re_dex");
me.remove_temp("re_con");
me.remove_temp("re_int");
me.remove_temp("re_dex");
} else {
var fen = me.query_temp("fenpei");
if (!fen) return;
me.wait_input = readnumber;
me.notify("请说出你要增加的先天属性(臂力 根骨 身法 悟性),总计" + fen +",比如:10 0 0 10");
}
}

188
world/cmd/skill/lianxi.js Normal file
View File

@@ -0,0 +1,188 @@
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;
}

101
world/cmd/skill/sbook.js Normal file
View File

@@ -0,0 +1,101 @@
this.inherits(COMMAND);
this.command = "sbook";
this.allow_busy = true;
this.allow_state = true;
this.regex = /^(\w+)(?:\s+(\w+))?$/;
this.enter = function (me, arg, isok) {
if (!arg) return this.render_books(me);
if (arg === 'clear') return this.clear_base(me);
if (arg.length < 4) return this.check_books(me, arg);
const book = me.find_obj(arg);
if (!book || !book.path.startsWith('book/book#'))
return me.send('你要存储什么秘籍?');
var skill = SKILL.get(book.skill);
if (!skill) return me.send('没有这个武功可以存储。');
if (skill.type === SKILL_TYPES.BASE) {
me.send('基础武功不用保存。');
if (this.has_base(me)) {
me.send_commands('sbook clear', '取出已有的基础秘籍');
}
return;
}
if (!isok) {
me.send('将武功秘籍存储到你的书架,后续直接从书架中学习。');
me.send_commands('sbook ' + arg + " ok", '确定存储');
}
else {
if (!me.books) me.books = [];
if (me.books.indexOf(book.skill) > -1)
return me.send('你的书架上已经有' + skill.color_name + "了。");
me.books.push(book.skill);
me.send('<hic>你将' + book.unit_name(1) + '存放到书架。</hic>');
me.remove_obj(book, 1);
me.send(`{"type":"dialog","dialog":"skills","book":["${skill.name}",${skill.grade},${me.books.length - 1}]}`);
}
}
this.check_books = function (me, arg) {
let index = parseInt(arg);
if (!(index >= 0 && index < me.books.length))
return me.send('你要查看哪本秘籍? ');
let skill = SKILL.get(me.books[index]);
if (!skill)
return me.send('没有这本秘籍。 ');
let desc = "一本武功秘籍,里面记载了" + skill.color_name + "的练习方法。";
var cond = skill.condition_tostring();
if (cond) {
desc = desc + "\n学习条件\n" + cond;
} else {
desc = desc + "\n学习条件无" + cond;
}
me.send(desc);
}
this.render_books = function (me) {
let str = ['{"type":"dialog","dialog":"skills",'];
let books = me.books ?? [];
str.push("books:[");
for (let i = 0; i < books.length; i++) {
if (i > 0) str.push(',');
let skill = SKILL.get(books[i]);
str.push('["', skill.name, '",', skill.grade, ']')
}
str.push(']}');
me.send(str.join(""));
}
this.clear_base = function (me) {
let books = me.books ?? [];
for (let i = 0; i < books.length; i++) {
let skill = SKILL.get(books[i]);
if (skill.type === SKILL_TYPES.BASE) {
let obj = me.add_obj('book/book#' + skill.id);
me.send('你取出' + obj.unit_name(1) + "。");
books.splice(i, 1);
i--;
}
}
this.render_books(me);
}
this.has_base = function (me) {
let books = me.books ?? [];
for (let sk of books) {
let skill = SKILL.get(sk);
if (skill.type === SKILL_TYPES.BASE)
return true;
}
return false;
}
const COMBINED = [10, 10, 30, 50, 100, 200, 500];
this.split_book = function (me, book) {
let books = me.books ?? [];
if (books.indexOf(book.skill) < 0) return me.notify('你只能把已经存放到书架的' + book.color_name + "拆分为秘籍残页。");
let skill = SKILL.get(book.skill);
if (skill.grade < 1) return me.notify('基础功法和知识类秘籍不能拆分。');
let count = COMBINED[skill.grade];
if (!me.remove_obj(book, 1)) return me.notify('拆分失败。');
let obj = me.add_obj('book/bc#' + skill.id, count);
me.send('你将' + book.color_name + "拆分为" + obj.unit_name(count) + "。");
}

View File

@@ -0,0 +1,59 @@
this.inherits(COMMAND);
this.command = "skgroup";
this.allow_fight = false;
this.enter = function (me, par) {
let index = parseInt(par);
if (!(index >= 0 && index < 3)) return;
let cur_index = this.cur_eqs(me);
if (cur_index < 0) return me.send('装备错误。');
let eqs = me.sk_groups[index];
if (!eqs) return me.send('当前正在装备该技能组。');
me.sk_groups[index] = null;
this.save_eqgroup(me, cur_index);
const enable_command = WORLD.COMMANDS.enable.enter;
for (let i = 0; i < SK_TYPES.length; i++) {
let sk_type = SK_TYPES[i];
let skill = me.skills[sk_type];
if (!skill) continue;
let enable_skill = eqs[i];
if (!enable_skill && !skill.enable_skill) continue;
if (enable_skill && skill.enable_skill === enable_skill) continue;
enable_command(me, sk_type, enable_skill, true);
}
me.send(`{type:"dialog",dialog:"skills",sk_group:${index}}`);
me.init_skill();
me.recount();
me.notify_hp();
}
this.enable_one = function (me, base, skill) {
}
const SK_TYPES = [
"force", "unarmed", "dodge", "parry", "sword",
"blade", "throwing", "staff", "club", "whip"
];
this.cur_eqs = function (me) {
for (let i = 0; i < me.sk_groups.length; i++) {
if (!me.sk_groups[i])
return i;
}
return -1;
}
this.save_eqgroup = function (me, index) {
let eqs = [];
for (let sk of SK_TYPES) {
let skill = me.skills[sk];
if (skill && skill.enable_skill) {
eqs.push(skill.enable_skill);
} else {
eqs.push("");
}
}
me.sk_groups[index] = eqs;
}

View File

@@ -0,0 +1,10 @@
this.inherits(COMMAND);
this.command = "stopstate";
this.allow_busy = true;
this.allow_state = true;
this.enter = function (player) {
if (player.state) {
if (player.state.no_stop) return player.notify(player.state.no_stop);
}
player.set_state(null);
}

141
world/cmd/skill/study.js Normal file
View File

@@ -0,0 +1,141 @@
this.inherits(COMMAND);
this.command = "study";
this.allow_fight = false;
this.enter = function (me, bookid) {
if (!bookid) return me.notify("你要学习什么技能?");
if (bookid.length < 4) return this.study_from_books(me, bookid);
var target = me.find_obj(bookid);
if (!target) return me.notify("你身上没有这本书。");
if (!target.path.startsWith('book/book') && !target.path.startsWith('book/chao')
&& !target.is('sp/new/ksforce')
&& !target.is('sp/new/ksunarmed') && !target.is('book/zc'))
return me.notify("你不能从" + target.color_name + "里学到任何东西。");
if (!target.skill) return me.notify("你不能从" + target.color_name + "里学到任何东西。");
var skill = SKILL.get(target.skill);
if (!skill) return me.notify("没有这个技能。");
this.study_skill(me, skill, target);
}
this.study_from_books = function (me, bindex) {
let books = me.books;
if (me.master) {
let user = WORLD.getUser(me.master);
if (!user) return me.send('你没有书架。');
books = user.books;
}
if (!books) return me.send('你要学哪个武功?');
let index = parseInt(bindex);
if (!(index >= 0 && index < books.length))
return me.send('你要学哪个武功?');
var skill = SKILL.get(books[index]);
if (!skill) return me.notify("书架上没有这个武功秘籍。");
var target = { color_name: skill.color_name, max_level: 100, };
this.study_skill(me, skill, target);
}
this.study_skill = function (me, skill, target) {
if (skill.is_custom && !me.create_for(skill.id)) return me.notify('这是别人自创的武功,目前无法学习。');
if (!checkSkillCount(me, skill.id)) return;
if (!me.skills) me.skills = {};
if (me.skills[skill.id + "2"]) return me.notify("你已经学会了的" + skill.color_name + "的进阶武功,不用再学习了。");
// if (skill.do_learn && skill.do_learn(me, lv) == false) return false;
if (me.query_skill(skill.id) === 0 && skill.do_learn(me) == false) return;
if (check_skill(me, target, skill) == false) return;
if (me.query_prop(skill.id)) return me.notify("你不能装备增加" + skill.color_name + "等级的道具读书。");
me.notify("<hic>你开始认真研读" + target.color_name + "。</hic>");
me.set_state({
id: "study",
title: "读书",
target: target,
skill_base: skill,
stime: Date.now(),
on_enter: do_learn,
no_move: "读书要专心,不要乱跑。",
desc: "[\"你对" + skill.color_name + "似乎有些心得。\"]",
on_stop: function (me, isauto) {
if (isauto) {
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, book, skill) {
var lv = me.query_skill(skill.id, 0);
if (book.max_level <= lv)
return me.notify_fail("这本书上的内容对你来说太浅了。");
if (skill.type != SKILL_TYPES.KNOWLEDGE) {
var max_lv = me.skill_limit();
if (lv >= max_lv) {
return me.notify_fail("也许是缺乏实战经验,你无法理解" + book.color_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("也许是基本功火候未到,你对" + book.color_name + "上面的内容无法理解。");
return false;
}
}
}
}
// this.on_study = function (me, skill, lv) {
// return true;
// }
// if (book.on_study && book.on_study(me, skill, lv) == false) {
// return false;
// }
return true;
}
function do_learn(me) {
if (check_skill(me, this.target, this.skill_base) == false) return false;
var exp = parseInt((me.int + me.query_prop("int")) * (100 + me.query_prop("study_per")) / 100) * 2;
if (!(exp > 0)) exp = me.int;
this.skill_base.add_exp(me, exp);
var lv = me.query_skill(this.skill_base.id, 0);
if (this.target.max_level <= lv) {
me.set_skill(this.skill_base.id, this.target.max_level);
var one_score = this.skill_base.query_one_score(me);
me.add_score(one_score * (this.target.max_level - lv));
me.send('{type:"dialog",dialog:"skills",id:"' + this.skill_base.id + '",level:' + this.target.max_level + ',exp:0}');
}
}

View File

@@ -0,0 +1,6 @@
this.inherits(COMMAND);
this.command = "xiulian";
this.allow_fight = false;
this.enter = function (me) {
}

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;
}