Files
wsmud/world/extends/stats.js
2026-05-26 16:41:20 +08:00

233 lines
6.1 KiB
JavaScript

const STATS = WORLD.STATS;
STATS.load_tops = function (tops, defname = '武林高手', key = "") {
tops = tops ?? new Array(10).fill({ path: "pub/gaoshou1" });
const ary = [];
for (let i = 0; i < tops.length; i++) {
let item = tops[i];
let npc;
npc = NPC.CLONE("pub/gaoshou1");
npc.name = defname;
if (item.userid) {
this.loadTopUser(item, npc);
} else {
npc.score = 10 - i;
}
npc.top_index = i + 1;
npc.id = "top_" + key + "_" + i;
ary.push(npc);
}
return ary;
}
STATS.loadTopUser = function (data, npc) {
npc.title = data.title;
npc.name = data.name;
for (let i = 0; i < COPY_PROPS.length; i++) {
npc[COPY_PROPS[i]] = data[COPY_PROPS[i]];
}
npc.skills = data.skills;
if (data.eq) {
npc.equipment = [];
for (let i = 0; i < data.eq.length; i++) {
let item = data.eq[i];
if (!item) continue;
let obj = OBJ.CREATE(item[0]);
if (!obj) continue;
obj.load_db(item);
npc.equipment[i] = obj;
}
}
npc.userid = data.userid;
npc.temp = data.temp;
npc.clear_prop();
npc.init();
npc.recount();
}
STATS.checkStats = function (player) {
this.updateScore(player);
WORLD.COMMANDS.biwu.checkStats(player);
}
const COPY_PROPS = ["str", "con", "dex", "int", "gender", "max_mp", "exp", "pot", "kar", "per"
, "hp", "max_hp", "mp", 'age', 'score'];
STATS.saveTops = function (tops) {
let str = ["["];
for (let i = 0; i < tops.length; i++) {
let top = tops[i];
if (top.userid) {
str.push("{userid:\"");
str.push(top.userid);
str.push("\",name:\"");
str.push(top.name);
str.push("\",title:\"");
str.push(top.title);
str.push("\"");
for (let j = 0; j < COPY_PROPS.length; j++) {
str.push(",");
str.push(COPY_PROPS[j]);
str.push(":");
str.push(top[COPY_PROPS[j]]);
}
if (top.skills) {
str.push(",skills:");
str.push(JSON.stringify(top.skills));
}
if (top.equipment) {
str.push(",eq:[");
for (let j = 0; j < top.equipment.length; j++) {
if (j > 0) str.push(",");
if (top.equipment[j]) top.equipment[j].save_db(str);
else str.push("null");
}
str.push("]");
}
if (top.temp) {
str.push(",temp:", JSON.stringify(top.temp));
}
str.push("}");
} else {
str.push('{ path: "pub/gaoshou1"}');
}
if (i !== this.TOPS.length - 1) str.push(",");
}
str.push("]");
return str.join("");
}
STATS.saveWeapon = function () {
return JSON.stringify(this.WEAPON);
}
STATS.saveScore = function () {
return JSON.stringify(this.SCORE);
}
STATS.updateEqitem = function (me, wea, ary) {
let score = wea.query_score();
if (!score) return;
let cur_index = -1;
let new_index = -1;
for (let i = ary.length - 1; i >= 0; i--) {
let item = ary[i];
if (item.user === me.id) {
if (wea.id === item.id || score > item.score) {
cur_index = i;
} else {
return;
}
}
if (score > item.score) {
new_index = i;
}
}
if (cur_index === -1 && new_index === -1) return;
if (cur_index === -1) {//新上榜的
let item = {
id: wea.id,
user: me.id,
score: score,
name: me.name,
desc: wea.get_desc(me),
wname: wea.color_name
};
ary.splice(new_index, 0, item);
if (ary.length > 15)
ary.length = 15;
return item;
}
let item = ary[cur_index];
item.wname = wea.color_name;
item.desc = wea.get_desc(me);
item.id = wea.id;
item.user = me.id;
item.name = me.name;
item.score = score;
if (cur_index === new_index
|| new_index - cur_index === 1) {
return item;
}
if (new_index === -1) {//掉出去,放最后
ary.splice(cur_index, 1);
ary.push(item);
} else if (cur_index > new_index) { //提升了
ary.splice(cur_index, 1);
ary.splice(new_index, 0, item);
} else {
ary.splice(new_index, 0, item);
ary.splice(cur_index, 1);
}
}
STATS.updateWeapon = function (me, wea) {
//if (wea.eq_type !== EQUIP_TYPE.WEAPON) return;
if (!WORLD.is_server(me)) return;
let eqs = this.EQ_STATS[wea.eq_type];
this.updateEqitem(me, wea, eqs);
}
STATS.updateScoreItem = function (me, ary) {
let score = me.score;
let cur_index = -1;
let new_index = -1;
for (let i = ary.length - 1; i >= 0; i--) {
let item = ary[i];
if (item.id === me.id) {
cur_index = i;
}
if (score > item.score) {
new_index = i;
}
}
if (cur_index === -1 && new_index === -1) return;
if (cur_index === -1) {//新上榜的
let item = { id: me.id, score: score, name: me.color_name || me.name };
ary.splice(new_index, 0, item);
if (ary.length > 30)
ary.length = 30;
return;
}
let item = ary[cur_index];
item.score = score;
item.name = me.color_name || me.name;
if (cur_index === new_index
|| new_index - cur_index === 1) {
return;
}
if (new_index === -1) {//掉出去,放最后
ary.splice(cur_index, 1);
ary.push(item);
} else if (cur_index > new_index) { //提升了
ary.splice(cur_index, 1);
ary.splice(new_index, 0, item);
} else {
ary.splice(new_index, 0, item);
ary.splice(cur_index, 1);
}
}
STATS.updateScore = function (me) {
if (!WORLD.is_server(me)) return;
let ary = this.SCORE;
this.updateScoreItem(me, ary);
let fam = this.SC_STATS[me.family.id];
if (!fam) return;
this.updateScoreItem(me, fam);
}