282 lines
8.0 KiB
JavaScript
282 lines
8.0 KiB
JavaScript
|
||
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"
|
||
];
|