165 lines
5.3 KiB
TypeScript
165 lines
5.3 KiB
TypeScript
import { ResLogin } from "../protocols/user/PtlLogin";
|
|
import { HeroShared } from "../public/hero";
|
|
import { FightControl } from "./fightCntrol";
|
|
import { joinFightData } from "./fightType";
|
|
|
|
export function countAttr(from: joinFightData) {
|
|
Object.values(from.roles).forEach(role => {
|
|
role.attr = HeroShared.getHeroBasicAttr(role, from.player);
|
|
});
|
|
}
|
|
|
|
export async function test() {
|
|
|
|
new FightControl([formatNpcData(1), formatNpcData(1)]);
|
|
// let players = await G.mongodb.collection('user').find().toArray();
|
|
// let heros = await G.mongodb.collection('hero').find().toArray();
|
|
// new FightControl(Array(2).fill(1).map(() => {
|
|
|
|
// let obj = {};
|
|
// let roles = Array(6).fill(1).map(() => {
|
|
// let hero = G.mongodb.conversionIdObj(heros.random());
|
|
// return Object.assign(hero, {
|
|
// attr: HeroShared.getHeroBasicAttr(hero, players.random())
|
|
// });
|
|
|
|
// });
|
|
// roles.forEach((r, p) => obj[p + 1] = r);
|
|
// return {
|
|
// player: players.random(),
|
|
// roles: obj
|
|
// };
|
|
// }));
|
|
}
|
|
|
|
export function fixValue(val: number, min?: number, max?: number) {
|
|
if (min && val < min) val = min;
|
|
if (max && val > max) val = max;
|
|
return val;
|
|
}
|
|
|
|
export function getSkillConf(skillid: string | number) {
|
|
// if(G.config.debug) console.log(skillid)
|
|
let v = null;
|
|
if (G.gc.skill_atk[skillid]) {
|
|
v = G.gc.skill_atk[skillid];
|
|
} else if (G.gc.skill_buff[skillid]) {
|
|
v = G.gc.skill_buff[skillid];
|
|
} else if (G.gc.skill_passive[skillid]) {
|
|
v = G.gc.skill_passive[skillid];
|
|
} else if (G.gc.skill_afteratk[skillid]) {
|
|
v = G.gc.skill_afteratk[skillid];
|
|
}
|
|
if (!v) {
|
|
return console.error('###没有这个技能-->', skillid);
|
|
}
|
|
return JSON.parse(JSON.stringify(v));
|
|
}
|
|
|
|
export function randomSkill(skillObj: k_v<number>) {
|
|
let randomArr = [];
|
|
for (let key in skillObj) {
|
|
let num = skillObj[key] * 100;
|
|
randomArr = randomArr.concat(Array(num).fill(key));
|
|
}
|
|
var randomValue = randomArr[Math.floor(Math.random() * randomArr.length)];
|
|
return randomValue;
|
|
|
|
}
|
|
|
|
export function randNumber(under?: number, over?: number) {
|
|
switch (arguments.length) {
|
|
case 0:
|
|
case 1:
|
|
return Math.random();
|
|
case 2:
|
|
return Math.random() * (over - under) + under;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
export function isDropBuff(buff_type: number) {
|
|
return buff_type == 2 || buff_type == 3;
|
|
|
|
}
|
|
|
|
/**格式化npc配置为战斗数据 */
|
|
export function formatNpcData(npcId: string | number, fixData: Partial<ResLogin['gud']> = {}, lv?: number): joinFightData {
|
|
return createNpc(npcId, fixData, lv);
|
|
}
|
|
|
|
function randomName(name: string) {
|
|
let f = Math.random() >= .5;
|
|
let b = Math.random() >= .5;
|
|
|
|
return (f ? Object.values(G.gc.name).random().qian : '') + name + (b ? Object.values(G.gc.name).random().hou : '');
|
|
}
|
|
|
|
export function createNpc(npcId: string | number, fixData: Partial<ResLogin['gud']> = {}, lv?: number) {
|
|
let npcConf = G.gc.npc[npcId];
|
|
let npcList = npcConf.npclist;
|
|
let dataArr = npcList.split('#').map(str => {
|
|
let ops = str.split('_');
|
|
return {
|
|
heroId: ops[0],
|
|
lv: lv || Number(ops[1]),
|
|
countId: ops[2]
|
|
};
|
|
});
|
|
const data: joinFightData = {
|
|
player: {
|
|
lv: dataArr[0].lv,
|
|
head: {
|
|
id: dataArr[0].heroId,
|
|
time: -1
|
|
},
|
|
uid: `npc_${npcId}`,
|
|
ghName: npcConf.ghname,
|
|
name: G.gc.hero[dataArr[0].heroId].name,
|
|
npcname: npcConf.npcname,
|
|
isNpc: true
|
|
},
|
|
roles: Object.fromEntries(dataArr.map((d, i) => [i + 1, function () {
|
|
d['skin'] = (npcConf.skin?.[i] || '');
|
|
let { id, atk, def, mindps, maxdps, hp, speed, ...ops } = G.gc.armyattr[d.countId];
|
|
let buff = HeroShared.getHeroBasicAttr({ heroId: d.heroId, lv: d.lv });
|
|
|
|
buff.hp = Math.floor(((Math.pow(d.lv + 20, 2) * (d.lv / 5 + 1)) - (d.lv + 3) * 100) * hp);
|
|
buff.atk = Math.floor(atk);
|
|
buff.def = Math.floor((Math.pow(d.lv + 14, 2) - 190) * def);
|
|
buff.speed = Math.floor(d.lv * 1.4 * speed);
|
|
buff.mindps = Math.floor(Math.pow(d.lv + 1, 1.8) * 7.5 * mindps);
|
|
buff.maxdps = Math.floor(Math.pow(d.lv + 1, 1.8) * 9 * mindps);
|
|
|
|
Object.assign(buff, ops);
|
|
|
|
for (let k in buff) {
|
|
if (k.indexOf('pro') == -1) continue;
|
|
let buffKey = k.replace('pro', '');
|
|
if (buff[buffKey]) {
|
|
buff[buffKey] += buff[buffKey] * buff[k];
|
|
buff[k] = 0;
|
|
}
|
|
}
|
|
|
|
HeroShared.amendAttr(buff);
|
|
|
|
buff.maxHp = buff.hp;
|
|
return {
|
|
attr: buff,
|
|
...d,
|
|
lv: (npcConf.npcLv ? npcConf.npcLv[i] : 0) || d.lv,
|
|
isBoss: !!npcConf.isboss,
|
|
trueLv: d.lv || (npcConf.npcLv ? npcConf.npcLv[i] : 0)
|
|
};
|
|
|
|
}()]))
|
|
};
|
|
|
|
data.player.power = Object.values(data.roles).map(role => HeroShared.computeHeroZhanLi(role.attr)).reduce((a, b) => a + b);
|
|
|
|
Object.assign(data.player, fixData);
|
|
|
|
return data;
|
|
} |