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

281
world/task/boss_task.js Normal file
View File

@@ -0,0 +1,281 @@
this.inherits(TASK);
this.id = "boss";
const BOSSTASK = this;
this.startup = function () {
// this.call_out(this.run, this.random(100000));//this.random(600000)+600000
this.check_time();
}
this.stop = function () {
if (this.time_handler) clearTimeout(this.time_handler);
if (this.boss && this.boss.length) {
for (var i = 0; i < this.boss.length; i++) {
this.boss[i].destroy(this.boss[i].name + "离开了。");
}
this.boss.length = 0;
this.boss = null;
}
this.time_handler = null;
}
this.check_time = function () {
var dt = new Date();
var week = dt.getDay();
var hour = dt.getHours();
if (hour == 21) {
var min = dt.getMinutes();
this.next_time = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(), hour, (parseInt((min + 5) / 5)) * 5, 20);
} else if (hour == 20) {
this.next_time = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(), 21, 0, 20);
} else {
this.next_time = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(), hour + 1, 6 + this.random(50), 20);
}
this.time_handler = this.call_out(this.run, this.next_time - dt);
}
this.quickly = false;
this.boss = null;
this.boss_count = 1;
this.quick = function () {
if (this.quickly) this.quickly = false;
else this.quickly = true;
this.stop();
this.check_time();
}
const BOSS_LEVELS = ["", "武士", "武师", "宗师", "武圣", "武帝", "武神"];
this.run = function () {
this.stop();
this.check_time();
const list = this.check_users();
this.boss = [];
for (var i = 0; i < list.length; i++) {
if (!list[i]) continue;
let level = i + 1;
let bs = this.create_boss(level);
if (!bs) return console.log("boss 创建失败");
this.boss.push(bs);
bs.event_id = 'boss' + level;
var rm = ROOM.RANDOM(); //ROOM.Get("yz/nanmen");
rm.item_changed(bs, true);
let desc = '听说' + bs.name + '出现在' + rm.long_name + '一带';
let msg = '{"type":"msg","ch":"rumor","content":"' + desc + '。"}';
for (var j = 0; j < list[i].length; j++) {
list[i][j].send(msg);
}
EVENTS.add(this.create_event(bs.event_id, level, desc, rm));
}
}
this.create_event = function (evtid, level, desc, rm) {
return {
id: evtid,
name: BOSS_LEVELS[level] + "BOSS挑战",
desc: desc + ",你可以前往尝试挑战,根据你造成的伤害可获得丰厚奖励。",
time: 0,
grade: level,
command: "前往挑战",
check: (me) => me.level === level,
on_command: function (me) {
if (me.state) return me.send('你正在' + me.state.title + "。");
if (me.query_temp("bcc", 0) >= 5)
return me.send('你今日的BOSS挑战次数已满。');
if (!me.can_trans()) return;
if (rm.is_full(1))
return me.send('那里人太多了,你过不去。');
me.moveto(rm.path, me.name + "离开了。", me.name + "走了过来。");
return true;
}
}
}
this.check_users = function () {
var list = [];
for (var i = 0; i < WORLD.USERS.length; i++) {
var user = WORLD.USERS[i];
if (!user.level) continue;
if (user.level > 5 && this.create_boss2(user)) continue;
if (!user.socket) continue;
if (user.query_temp("bcc", 0) >= 5) continue;
var lv = user.level - 1;
if (lv > 4) {
lv = 4;
}
if (!list[lv]) list[lv] = [];
list[lv].push(user);
}
return list;
}
this.create_boss = function (player_level) {
var max_level = this.boss_levels[WORLD.DATA.query_temp("fb_index", 0)];
if (player_level) {
var boss_max = this.level_max[player_level][1];
var boss_min = this.level_max[player_level][0];
if (max_level > boss_max) max_level = boss_max;
} else {
boss_max = 0;
boss_min = 0;
}
var level = this.random(max_level - boss_min) + boss_min;
if (!this.paths[level]) return console.log(level, max_level, " boss 创建失败");
var diff_level = this.levels[level];
var boss = NPC.CLONE(this.paths[level]);
if (!boss) return;
boss.boss_index = level;
boss.min_fbindex = this.boss_min_fb[level];
var sk_level = (level + 1) * 100;
if (diff_level > 300) {
sk_level = (level + 1) * 130;
}
for (var item in boss.skills) {
boss.skills[item].level = sk_level;
}
boss.diff_level = diff_level;
boss.hp = boss.max_hp = diff_level * diff_level * 500;
boss.mp = boss.max_mp = boss.max_hp / 2;
boss.prop = {};
boss.level = player_level || this.player_levels[level];
if (diff_level >= 500) boss.level = 5;
boss.init();
boss.recount();
boss.pfm_rate = 1;
boss.recount();
boss.record_damage = true;
boss.on_died = this.on_died;
boss.on_enter = null;
boss.on_kill = this.on_kill;
boss.no_fight = true;
boss.no_refresh = true;
boss.on_die = null;
return boss;
}
this.on_kill = function (me) {
if (me.level > this.level) {
if (this.family == FAMILIES.MONSTER) {
return me.notify_fail(this.name + "目露凶光狠狠的瞪着你。");
}
return me.notify_fail(this.name + "对你拱手说道:这位" + me.call() + ",不知" + this.callme() + "有何得罪之处?");
}
}
function create_finish_event(boss) {
return {
id: boss.event_id,
name: BOSS_LEVELS[boss.level] + "BOSS挑战",
desc: boss.name + "被击败了,解锁快速领取可直接领取基础掉落,并增加一次参与次数",
time: BOSSTASK.next_time.getTime(),
grade: boss.level,
command: "领取",
check: (me) => me.level === boss.level,
on_command: function (me, par) {
BOSSTASK.boss_auto_drops(me, boss, par);
}
}
}
this.on_died = function (me, corpse) {
if (!this.is_party_boss)
EVENTS.add(create_finish_event(this));
if (!this.damages) return;
corpse.no_alloc = true;
corpse.clear_items = clear_items.bind(this);
corpse.query_items = query_items.bind(this);
corpse.query_damage = query_damage.bind(this);
}
function query_damage() {
var str = [];
for (var key in this.damages) {
var user = WORLD.getUser(key);
if (user) {
str.push(user.name);
str.push("");
str.push(this.damages[key]);
str.push("==");
str.push(parseInt(this.damages[key] * 100 / this.max_hp));
str.push("%\n");
}
}
return str.join("");
}
const BOSS_DROPS = {
lv1_0: [
"st/st_red#0", "st/st_gre#0", "st/st_blu#0", "st/st_yel#0"],
};
function query_items(me) {
if (!this.damages) return;
var sh = this.damages[me.id];
if (!(sh > 1)) return;
if (!this.user_items) this.user_items = {};
if (this.user_items[me.id]) return this.user_items[me.id];
if (me.query_temp("bcc", 0) >= 5) return;
sh = parseInt(sh * 100 / this.max_hp);
if (sh < 1) {
this.user_items[me.id] = [OBJ.CREATE('money/silver', 1 + me.random(10))];
return this.user_items[me.id];
}
if (sh > 100) sh = 80;
var lv = this.diff_level - 20;
if (lv < 0) lv = 0;
var drops = [
{
obj: "st/xuanjing",
min: 1,
max: 10
}, {
obj: BOSS_DROPS.lv1_0,
odds: 5000 + lv * 10 + sh * 10
}
];
me.add_temp("bcc", 1, UTIL.diff_time());
var items = OBJ.create_by_odds(drops);
this.user_items[me.id] = items;
return items;
}
function clear_items(me) {
if (this.user_items) {
this.user_items[me.id].length = 0;
}
}
this.levels = [
3, 5, 10, 12, 20, 40
];
this.player_levels = [
1, 1, 1, 2, 2, 2,
3, 3, 3, 3
];
this.level_max = [
[0, 99], [0, 3], [0, 4], [0, 4], [0, 4], [0, 4]
];
this.boss_levels = [
3, 3, 3, 3, 3,
3, 3, 3, 4, 4];
this.boss_min_fb = [
1, 4, 6, 7
];
this.paths = [
"yz/lm/zhao", "bj/ao/aobai", "bj/tdh/chen", "bj/shenlong/hong"
];