init: add workspace files
This commit is contained in:
415
world/extends/skill/family.js
Normal file
415
world/extends/skill/family.js
Normal file
@@ -0,0 +1,415 @@
|
||||
FAMILY.prototype.init = function () {
|
||||
if (!this.def_npcs) return;
|
||||
for (let item of this.def_npcs) {
|
||||
let rm = ROOM.Get(item[1]);
|
||||
if (!rm) throw new Error('房间' + item[1] + "不存在");
|
||||
let npc = NPC.CLONE(item[0]);
|
||||
if (!npc) throw new Error('npc ' + item[0] + "不存在");
|
||||
rm.items.push(npc);
|
||||
rm.max_item_count = 100;
|
||||
npc.environment = rm;
|
||||
if (npc.is(this.boss_path) && !this.boss) {
|
||||
this.boss = npc;
|
||||
}
|
||||
npc.on_died = this.on_npc_die;
|
||||
npc.relive = this.on_famnpc_relive;
|
||||
}
|
||||
}
|
||||
FAMILY.UPDATE_NPC = function (path) {
|
||||
for (let key in FAMILIES) {
|
||||
let fam = FAMILIES[key];
|
||||
if (!fam.def_npcs) continue;
|
||||
fam.update_npc(path);
|
||||
}
|
||||
}
|
||||
FAMILY.prototype.update_npc = function (path) {
|
||||
for (let item of this.def_npcs) {
|
||||
let spath = item[0];
|
||||
if (spath.startsWith(path)) {
|
||||
let rm = ROOM.Get(item[1]);
|
||||
if (!rm) continue;
|
||||
let npc = rm.find_obj_bypath(spath);
|
||||
npc.destroy();
|
||||
npc = NPC.CREATE(spath, rm);
|
||||
if (npc.is(this.boss_path)) {
|
||||
this.boss = npc;
|
||||
}
|
||||
npc.on_died = this.on_npc_die;
|
||||
npc.relive = this.on_famnpc_relive;
|
||||
}
|
||||
}
|
||||
}
|
||||
FAMILY.prototype.on_famnpc_relive = function () {
|
||||
if (!this.die_room) return;
|
||||
this.die_room.item_changed(this, true);
|
||||
this.die_room = null;
|
||||
|
||||
if (this.equipment && this.items[0] && !this.equipment[0]) {
|
||||
this.equip(this.items[0]);
|
||||
}
|
||||
}
|
||||
FAMILY.prototype.on_npc_die = function (me) {
|
||||
//这里的this是被击杀的NPC
|
||||
var fam = FAMILIES[this.family.id];
|
||||
if (!me) return;
|
||||
var fam2 = FAMILIES[me.family.id];
|
||||
if (fam == fam2) {
|
||||
me.notify("<cyn>你残害同门,门派功绩减少。</cyn>");
|
||||
me.add_temp("gongji", -1);
|
||||
return;
|
||||
}
|
||||
if (!fam || !fam2 || fam == FAMILIES.NONE || fam2 == FAMILIES.NONE) return;
|
||||
|
||||
me.add_temp("killer_" + fam.id, 1, 600000);//十分钟门派仇恨
|
||||
me.notify("<red>你击杀了" + fam.name + "的弟子,对方门派在10分钟内可以对你发出追杀令。</red>");
|
||||
if (fam.battle_family || fam2.battle_family) {
|
||||
return;
|
||||
}
|
||||
fam.check_battle(this, me);
|
||||
}
|
||||
|
||||
|
||||
FAMILY.prototype.check_battle = function (npc, killer, target) {
|
||||
// if (!killer) return;
|
||||
var to_fam = killer ? killer.family : target;
|
||||
if (!to_fam || !to_fam.can_battle || !this.can_battle) return;
|
||||
|
||||
if (this.battle_family || to_fam.battle_family) return;
|
||||
if (this.query_temp("battle") ||
|
||||
to_fam.query_temp("battle")
|
||||
|| !this.boss || !to_fam.boss) return;
|
||||
this.battle_family = to_fam.id;
|
||||
to_fam.battle_family = this.id;
|
||||
if (killer) {
|
||||
if (npc !== this.boss) {
|
||||
this.on_kill(npc, killer);
|
||||
} else if (this.first_npc) {
|
||||
this.first_npc
|
||||
.do_command("chat",
|
||||
killer.family.name + "欺人太甚,门下弟子" + killer.name + "击杀我派" +
|
||||
npc.name + "," + this.name + "众弟子听令,对" + killer.family.name + "弟子格杀勿论!");
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
to_fam.on_battle(this);
|
||||
}
|
||||
|
||||
|
||||
this.begin_attack(to_fam);
|
||||
to_fam.begin_attack(this);
|
||||
npc.send_fam("<hiy>\n你的门派和" + to_fam.name + "的战斗开始了,请回门派防守或者进攻对方门派。\n战斗时间30分钟,结束条件是对方或己方掌门被击杀。</hiy>");
|
||||
|
||||
to_fam.send("<hiy>\n你的门派和" + this.name + "的战斗开始了,请回门派防守或者进攻对方门派。\n战斗时间30分钟,结束条件是对方或己方掌门被击杀。</hiy>");
|
||||
|
||||
|
||||
}
|
||||
|
||||
FAMILY.prototype.begin_attack = function (fam) {
|
||||
|
||||
this.battle_score = 0;
|
||||
this.set_temp("battle", 1, 3600000);
|
||||
this.call_out(this.battle_over, 30 * 60000, "timeout");
|
||||
|
||||
this.area.rooms[0].create_copy(this.id, 0);
|
||||
|
||||
this.area.notify_update();
|
||||
|
||||
this.create_guards();
|
||||
this.create_npcs();
|
||||
|
||||
EVENTS.add(this.create_event());
|
||||
}
|
||||
FAMILY.prototype.create_event = function (rm) {
|
||||
let target_fam = FAMILIES[this.battle_family];
|
||||
return {
|
||||
id: this.id + "_bat",
|
||||
name: "门派战争",
|
||||
desc: "你的门派正在和" + target_fam.name + "发生战争,击杀对方弟子会获得丰厚奖励。",
|
||||
time: Date.now() + 30 * 60000,
|
||||
grade: 2,
|
||||
command: "进入战场",
|
||||
check: (me) => me.family === this,
|
||||
on_command: function (me) {
|
||||
me.do_command('goto', 'fam3');
|
||||
}
|
||||
}
|
||||
}
|
||||
FAMILY.prototype.get_room = function (rm) {
|
||||
return rm.query_copy(this.id);
|
||||
}
|
||||
FAMILY.prototype.create_guards = function () {
|
||||
if (!this.boss_guard) return;
|
||||
|
||||
var boss_room = this.get_room(ROOM.Get(this.boss_guard[0]));
|
||||
var npc = NPC.CLONE("pub/menpai");
|
||||
npc.init_from(this, 5);
|
||||
npc.name = this.boss.name;
|
||||
npc.desc = this.boss.desc;
|
||||
npc.title = "<ora>" + this.boss.title + "</ora>";
|
||||
|
||||
npc.age = this.boss.age;
|
||||
npc.gender = this.boss.gender;
|
||||
this.npcs.push(npc);
|
||||
boss_room.item_changed(npc, true);
|
||||
|
||||
this.battle_boss = npc;
|
||||
for (var i = 0; i < this.boss_guard.length; i++) {
|
||||
for (var j = 0; j < 2; j++) {
|
||||
npc = NPC.CLONE("pub/menpai");
|
||||
npc.init_from(this, i == 0 ? 4 : 3);
|
||||
var rm = this.get_room(ROOM.Get(this.boss_guard[i]));
|
||||
|
||||
this.npcs.push(npc);
|
||||
rm.item_changed(npc, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
FAMILY.prototype.remove_npcs = function (npc) {
|
||||
this.npcs.remove(npc);
|
||||
if (this.battle_boss) {
|
||||
this.battle_boss.remove_status("boss");
|
||||
}
|
||||
}
|
||||
FAMILY.prototype.create_npc = function (level) {
|
||||
var npc = NPC.CLONE("pub/menpai");
|
||||
npc.init_from(this, level);
|
||||
return npc;
|
||||
}
|
||||
// let rm = null;
|
||||
// if (lv === 2 && this.guard_rooms) {
|
||||
// rm = ROOM.Get(this.guard_rooms.random());
|
||||
// }
|
||||
// if (!rm) rm = this.area.rooms.random();
|
||||
FAMILY.prototype.create_npcs = function () {
|
||||
if (this.npcs.length < 27) {
|
||||
let count = 27 - this.npcs.length;
|
||||
for (let i = 0; i < count; i++) {
|
||||
let lv = i > 15 ? 2 : (i < 8 ? 0 : 1);
|
||||
let rm = this.get_room(this.area.rooms.random());
|
||||
let npc = this.create_npc(lv);
|
||||
this.npcs.push(npc);
|
||||
rm.item_changed(npc, true);
|
||||
}
|
||||
if (this.battle_boss) {
|
||||
this.battle_boss.add_status({
|
||||
id: "boss",
|
||||
name: "号令",
|
||||
prop: {
|
||||
hp_per: 30,
|
||||
// gj_per: 30,
|
||||
fy_per: 30,
|
||||
ds_per: 30,
|
||||
mz_per: 30
|
||||
},
|
||||
no_clear: true,
|
||||
override: 1,
|
||||
count: count,
|
||||
max_count: 100,
|
||||
duration: 0,
|
||||
desc: "当你的门派还有NPC存活时,增加你的属性"
|
||||
});
|
||||
}
|
||||
}
|
||||
this.create_handler = this.call_out(this.create_npcs, 200000);
|
||||
}
|
||||
FAMILY.prototype.battle_over = function (suc_type) {
|
||||
if (!this.battle_family) return;
|
||||
var fam = FAMILIES[this.battle_family];
|
||||
if (!fam) return;
|
||||
this.battle_family = null;
|
||||
if (this.create_handler) clearTimeout(this.create_handler);
|
||||
for (var i = 0; i < this.npcs.length; i++) {
|
||||
if (this.npcs[i].hp > 0) {
|
||||
this.npcs[i].send_room("$N急匆匆的走掉了。");
|
||||
this.npcs[i].destroy();
|
||||
}
|
||||
}
|
||||
this.npcs.length = 0;
|
||||
if (suc_type == "suc") {
|
||||
COMMAND.DO("sys", "" + this.name + "和" + fam.name + "的战斗结束了," + this.name + "获得了最终胜利,接下来的一小时" + this.name + "所有弟子练功效率提高50%。");
|
||||
|
||||
this.add_battle_status(50);
|
||||
EVENTS.add(this.finish_event(50, fam));
|
||||
} else if (suc_type == "die") {
|
||||
this.send("<hir>由于你的门派掌门被击杀,和" + fam.name + "的战斗失败了。</hir>");
|
||||
} else if (suc_type == "fail") {
|
||||
this.send("<hir>由于你的门派掌门被击杀,和" + fam.name + "的战斗失败了。</hir>");
|
||||
} else {
|
||||
if (this.battle_score > fam.battle_score) {
|
||||
this.send("<hiy>和" + fam.name + "的战斗结束了,你的门派占得优势,接下来的一小时" + this.name + "所有弟子练功效率提高20%。</hiy>");
|
||||
this.add_battle_status(20);
|
||||
EVENTS.add(this.finish_event(20, fam));
|
||||
|
||||
} else {
|
||||
this.send("<hiy>和" + fam.name + "的战斗结束了,你的门派没有取得优势。</hiy>");
|
||||
EVENTS.add(this.finish_event(0, fam));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
if (FAMILIES.SHASHOU.query_temp('ss_target') === this.id) {
|
||||
let sc = 0;
|
||||
if (suc_type === 'suc') sc = 0;
|
||||
else if (suc_type === 'fail') sc = 50;
|
||||
else sc = this.battle_score > fam.battle_score ? 0 : 20;
|
||||
EVENTS.remove(FAMILIES.SHASHOU.id + "_bat");
|
||||
EVENTS.add(FAMILIES.SHASHOU.finish_event(sc, this));
|
||||
FAMILIES.SHASHOU.remove_temp('ss_target');
|
||||
if (sc > 0) {
|
||||
FAMILIES.SHASHOU.add_battle_status(sc);
|
||||
FAMILIES.SHASHOU.send("<hiy>和"
|
||||
+ this.name + "的战斗结束了,你的门派占得优势,接下来的一小时所有弟子练功效率提高" + sc + "%。</hiy>");
|
||||
} else {
|
||||
FAMILIES.SHASHOU.send("<hiy>和"
|
||||
+ this.name + "的战斗结束了,你的门派没有取得优势。</hiy>");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// console.log(this.name, "战斗结束,清理NPC:", this.npcs.length);
|
||||
if (this.battle_boss)
|
||||
this.battle_boss.destroy();
|
||||
this.battle_boss = null;
|
||||
this.area.notify_update();
|
||||
this.call_out(this.clear_room, 300000);//300秒后清理战场副本
|
||||
EVENTS.remove(this.id + "_bat");
|
||||
}
|
||||
|
||||
FAMILY.prototype.clear_room = function () {
|
||||
const rm = this.area.rooms[0];
|
||||
rm.clear_by_area(rm.parent, this.id);
|
||||
}
|
||||
|
||||
FAMILY.prototype.finish_event = function (suc, target_fam) {
|
||||
let msg = suc > 0 ? "你的门派占得优势,所有弟子获得鼓舞,练功效率+" +
|
||||
suc + "%。" : "你的门派没有取得优势。";
|
||||
return {
|
||||
id: this.id + "_settle",
|
||||
name: "门派战争",
|
||||
desc: "你的门派和" + target_fam.name + "战斗结束了," + msg,
|
||||
time: this.temp["battle"].e,
|
||||
grade: 2,
|
||||
command: "领取战利品",
|
||||
check: (me) => me.family === this,
|
||||
on_command: (me) => {
|
||||
// if (!suc) return me.send('你所在的门派没有在战争中取得优势,请再接再厉。');
|
||||
this.battle_settle(me)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
FAMILY.prototype.add_battle_status = function (t) {
|
||||
this.battle_gift = t;
|
||||
this.add_temp("lianxi_per", t, 3600000);
|
||||
this.add_temp("study_per", t, 3600000);
|
||||
this.add_temp("dazuo_per", t, 3600000);
|
||||
|
||||
}
|
||||
FAMILY.prototype.on_login = function (me) {
|
||||
if (this.first_npc && me.id == this.first_npc.userid) {
|
||||
if (!this.is_init_first)
|
||||
this.init_dadizi(this.first_npc, me);
|
||||
this.send('{type:"msg",ch:"fam",content:"' + this.first_npc.title + me.name + '上线了。",uid:0,name:"",fam:"' + this.name + '"}');
|
||||
}
|
||||
}
|
||||
FAMILY.prototype.set_dadizi = function (id, name) {
|
||||
this.tops = {};
|
||||
|
||||
if (this.boss)
|
||||
this.boss.do_command("fam", '本门弟子' + name + '表现突出,提升为' + this.top_name + '。');
|
||||
|
||||
this.is_init_first = false;
|
||||
WORLD.DATA.set_temp(this.id + "_top", id);
|
||||
WORLD.DATA.set_temp(this.id + "_top_name", name);
|
||||
if (this.first_npc) {
|
||||
if (this.first_npc.environment.is_shadow) {
|
||||
var rm = ROOM.Get(this.first_npc.environment.path);
|
||||
var npc = rm.find_obj_bypath('pub/dadizi#' + this.id);
|
||||
if (npc) {
|
||||
this.first_npc = npc;
|
||||
} else {
|
||||
this.first_npc = null;
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.init_dadizi(this.first_npc, WORLD.getUser(id));
|
||||
this.area.notify_update();
|
||||
}
|
||||
}
|
||||
FAMILY.prototype.init_dadizi = function (npc, me) {
|
||||
this.first_npc = npc;
|
||||
npc.name = WORLD.DATA.query_temp(this.id + "_top_name") || this.top_name;
|
||||
npc.title = this.top_name;
|
||||
npc.userid = WORLD.DATA.query_temp(this.id + "_top");
|
||||
if (!me) return;
|
||||
npc.level = me.level;
|
||||
var copy_prop = ["str", "con", "dex", "int", "gender", "max_mp", "exp", "pot", "kar", "per"
|
||||
, "name", "skills", "hp", "max_hp", "mp"];
|
||||
for (var i = 0; i < copy_prop.length; i++) {
|
||||
npc[copy_prop[i]] = me[copy_prop[i]];
|
||||
}
|
||||
npc.equipment = [];
|
||||
if (me.equipment) {
|
||||
var eqs = me.equipment;
|
||||
for (var i = 0; i < eqs.length; i++) {
|
||||
if (!eqs[i]) continue;
|
||||
var obj = eqs[i].clone(me);
|
||||
npc.equipment[obj.eq_type] = obj;
|
||||
}
|
||||
}
|
||||
npc.max_hp = npc.hp = npc.max_hp * 2;
|
||||
npc.age = me.query_age();
|
||||
npc.clear_prop();
|
||||
npc.init();
|
||||
npc.recount();
|
||||
npc.auto_skills = null;
|
||||
npc.environment && npc.environment.item_changed(npc, true);
|
||||
this.is_init_first = true;
|
||||
this.first_npc_exp = npc.exp;
|
||||
}
|
||||
FAMILY.prototype.send_channel = function (me, msg) {
|
||||
|
||||
var msg = '{type:"msg",ch:"fam",content:"' + msg + '",fam:"' + this.name + '", name:"' + (me ? me.name : "门派管理") + '" }';
|
||||
this.send(msg);
|
||||
}
|
||||
FAMILY.SAVE = function () {
|
||||
var obj = {};
|
||||
for (var key in FAMILIES) {
|
||||
var fam = FAMILIES[key];
|
||||
if (fam.tops) {
|
||||
obj[key + "_tops"] = fam.tops;
|
||||
}
|
||||
obj.temp = fam.temp;
|
||||
}
|
||||
return JSON.stringify(obj);
|
||||
}
|
||||
FAMILY.LOAD = function (str) {
|
||||
var obj = JSON.toObject(str);
|
||||
if (!obj) return;
|
||||
for (var key in FAMILIES) {
|
||||
var fam = FAMILIES[key];
|
||||
if (obj[key + "_tops"]) {
|
||||
fam.tops = obj[key + "_tops"];
|
||||
}
|
||||
fam.temp = obj.temp;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
const TITLES = ['入门弟子', '弟子', '执事', '护法', '长老', '供奉'];
|
||||
|
||||
FAMILY.prototype.query_task_title = function (me) {
|
||||
let level = me.query_temp('sm_level', 0);
|
||||
return me.family.name + TITLES[level];
|
||||
}
|
||||
|
||||
FAMILY.prototype.query_job_title = function (level) {
|
||||
return TITLES[level];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user