✨ feat(共鸣系统): 添加下发鸣主数据
This commit is contained in:
@@ -30,7 +30,7 @@ export class HeroHandler {
|
|||||||
// if (!await getStartLimt(roleId)) return resResult(STATUS.RESONANCE_NO_START);
|
// if (!await getStartLimt(roleId)) return resResult(STATUS.RESONANCE_NO_START);
|
||||||
const resonances = await refreshResonanceData(roleId, serverId, sid);
|
const resonances = await refreshResonanceData(roleId, serverId, sid);
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, { resonanceDatas: resonances })
|
return resResult(STATUS.SUCCESS, resonances)
|
||||||
}
|
}
|
||||||
|
|
||||||
async unlockPosition(msg: { position: number }, session: BackendSession) {
|
async unlockPosition(msg: { position: number }, session: BackendSession) {
|
||||||
@@ -77,11 +77,11 @@ export class HeroHandler {
|
|||||||
let dbHeroes = await HeroModel.findByHidAndRole(hid, roleId);
|
let dbHeroes = await HeroModel.findByHidAndRole(hid, roleId);
|
||||||
if (!dbHeroes) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
|
if (!dbHeroes) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
|
||||||
|
|
||||||
let { lv = 1, exp = 0, jobStage = 0, skinId, skins = [], connections = [], ePlace = [], seqId, ce } = dbHeroes;
|
let { lv = 1, exp = 0, job = 0, jobStage = 0, skinId, skins = [], connections = [], ePlace = [], seqId, ce } = dbHeroes;
|
||||||
|
|
||||||
//检测养成维度
|
//检测养成维度
|
||||||
if (lv > 1) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_LV);
|
if (lv > 1) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_LV);
|
||||||
if (jobStage) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_JOBSTAGE);
|
// if (jobStage) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_JOBSTAGE);
|
||||||
if (skins.find(cur => (cur?.usedTalentPoint || 0) > 0)) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_TALENT);
|
if (skins.find(cur => (cur?.usedTalentPoint || 0) > 0)) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_TALENT);
|
||||||
if (connections.length > 0) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_CONNECT);
|
if (connections.length > 0) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_CONNECT);
|
||||||
// if (ePlace.length > 0) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_EQUIP);
|
// if (ePlace.length > 0) return resResult(STATUS.RESONANCE_PUT_POSITION_EXIST_EQUIP);
|
||||||
@@ -100,12 +100,12 @@ export class HeroHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let result = await ResonanceModel.updateByPosition(roleId, position, { hid, seqId, lv, exp, jobStage, skinId, skins, connections, ePlace, ce });
|
let result = await ResonanceModel.updateByPosition(roleId, position, { hid, seqId, lv, exp, job, jobStage, skinId, skins, connections, ePlace, ce });
|
||||||
if (!result) return resResult(STATUS.RESONANCE_PUT_POSITION_FAIL);
|
if (!result) return resResult(STATUS.RESONANCE_PUT_POSITION_FAIL);
|
||||||
|
|
||||||
const resonances = await refreshResonanceData(roleId, serverId, sid);
|
const resonances = await refreshResonanceData(roleId, serverId, sid);
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, { resonanceDatas: resonances })
|
return resResult(STATUS.SUCCESS, resonances)
|
||||||
}
|
}
|
||||||
|
|
||||||
async heroOffPosition(msg: { position: number, hid: number }, session: BackendSession) {
|
async heroOffPosition(msg: { position: number, hid: number }, session: BackendSession) {
|
||||||
@@ -120,7 +120,7 @@ export class HeroHandler {
|
|||||||
let dbHero = await HeroModel.findByHidAndRole(hid, roleId);
|
let dbHero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||||
if (!dbHero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
|
if (!dbHero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
|
||||||
|
|
||||||
let { lv = 1, exp = 0, jobStage = 0, skinId, skins = [], connections = [], ePlace = [], seqId } = dbResonance;
|
let { lv = 1, exp = 0, job = 0, jobStage = 0, skinId, skins = [], connections = [], ePlace = [], seqId } = dbResonance;
|
||||||
for (let obj of dbHero.skins) {
|
for (let obj of dbHero.skins) {
|
||||||
let newSkin = skins.find(cur => cur.id == obj.id);
|
let newSkin = skins.find(cur => cur.id == obj.id);
|
||||||
if (newSkin) {
|
if (newSkin) {
|
||||||
@@ -143,7 +143,7 @@ export class HeroHandler {
|
|||||||
tempEPlace.stones = obj.stones;
|
tempEPlace.stones = obj.stones;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let heroResult = await HeroModel.updateHeroInfo(roleId, hid, { lv, exp, jobStage, skinId, skins: dbHero.skins, connections, ePlace });
|
let heroResult = await HeroModel.updateHeroInfo(roleId, hid, { lv, exp, job, jobStage, skinId, skins: dbHero.skins, connections, ePlace });
|
||||||
if (!heroResult) return resResult(STATUS.RESONANCE_OFF_POSITION_FAIL);
|
if (!heroResult) return resResult(STATUS.RESONANCE_OFF_POSITION_FAIL);
|
||||||
|
|
||||||
// 重新计算战力
|
// 重新计算战力
|
||||||
@@ -164,8 +164,8 @@ export class HeroHandler {
|
|||||||
const resonances = await refreshResonanceData(roleId, serverId, sid);
|
const resonances = await refreshResonanceData(roleId, serverId, sid);
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
curHero: { ...pick(new HeroParam(curHero), ['hid', 'seqId', 'lv', 'exp', 'jobStage', 'skinId', 'skins', 'talent', 'usedTalentPoint', 'totalTalentPoint', 'connections', 'ePlace', 'ce']) },
|
curHero: { ...pick(new HeroParam(curHero), ['hid', 'seqId', 'lv', 'exp', 'job', 'jobStage', 'skinId', 'skins', 'talent', 'usedTalentPoint', 'totalTalentPoint', 'connections', 'ePlace', 'ce']) },
|
||||||
resonanceDatas: resonances,
|
...resonances,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { HeroParam } from "../../domain/roleField/hero";
|
|||||||
import { gameData, getEquipByJobClassAndEPlace } from "../../pubUtils/data";
|
import { gameData, getEquipByJobClassAndEPlace } from "../../pubUtils/data";
|
||||||
import { ReturnResonanceParam } from "../../pubUtils/interface";
|
import { ReturnResonanceParam } from "../../pubUtils/interface";
|
||||||
import { calculateCeWithHeroes } from "../playerCeService";
|
import { calculateCeWithHeroes } from "../playerCeService";
|
||||||
import { initSkinTalent } from "../roleService";
|
import { getNewJob, initSkinTalent } from "../roleService";
|
||||||
import { pick } from 'underscore';
|
import { pick } from 'underscore';
|
||||||
import * as util from 'util';
|
import * as util from 'util';
|
||||||
|
|
||||||
@@ -19,22 +19,24 @@ import * as util from 'util';
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
export async function refreshResonanceData(roleId: string, serverId: number, sid: string) {
|
export async function refreshResonanceData(roleId: string, serverId: number, sid: string) {
|
||||||
let resonances: ReturnResonanceParam[] = [];
|
let resonanceDatas: ReturnResonanceParam[] = [];
|
||||||
|
let resonanceLv = {}, resonanceJob = {}, resonanceCon = [], resonanceEquip = [];
|
||||||
|
|
||||||
let dbHeroes: HeroType[] = await HeroModel.findByRole(roleId, [{ field: 'ce', sortBy: -1 }]);
|
let dbHeroes: HeroType[] = await HeroModel.findByRole(roleId, [{ field: 'ce', sortBy: -1 }]);
|
||||||
if (dbHeroes.length < LINEUP_NUM) return resonances;
|
if (dbHeroes.length < LINEUP_NUM) return { resonanceDatas };
|
||||||
|
|
||||||
|
|
||||||
let { dbResonanceMap, newPositionArr } = await getResonanceDataMap(roleId);
|
let { dbResonanceMap, newPositionArr } = await getResonanceDataMap(roleId);
|
||||||
for (let position of newPositionArr) {
|
for (let position of newPositionArr) {
|
||||||
resonances.push({ position });
|
resonanceDatas.push({ position });
|
||||||
}
|
}
|
||||||
if (dbResonanceMap.size == 0) return resonances;
|
if (dbResonanceMap.size == 0) return { resonanceDatas };
|
||||||
|
|
||||||
let dbJewelMap = await getJewelDataMap(dbHeroes);
|
let dbJewelMap = await getJewelDataMap(dbHeroes);
|
||||||
|
|
||||||
// 武将等级
|
// 武将等级
|
||||||
let topLineHero: HeroType = sortData(dbResonanceMap, dbHeroes, RESONANCE_SORT_TYPE.LV);
|
let topLineHero: HeroType = sortData(dbResonanceMap, dbHeroes, RESONANCE_SORT_TYPE.LV);
|
||||||
|
resonanceLv = { hid: topLineHero.hid, lv: topLineHero.lv };
|
||||||
for (let [hid] of dbResonanceMap) {
|
for (let [hid] of dbResonanceMap) {
|
||||||
let hero = dbHeroes.find(cur => cur.hid == hid);
|
let hero = dbHeroes.find(cur => cur.hid == hid);
|
||||||
hero.lv = topLineHero.lv;
|
hero.lv = topLineHero.lv;
|
||||||
@@ -43,10 +45,12 @@ export async function refreshResonanceData(roleId: string, serverId: number, sid
|
|||||||
|
|
||||||
// 职业(职阶、天赋)
|
// 职业(职阶、天赋)
|
||||||
topLineHero = sortData(dbResonanceMap, dbHeroes, RESONANCE_SORT_TYPE.JOBSTAGE);
|
topLineHero = sortData(dbResonanceMap, dbHeroes, RESONANCE_SORT_TYPE.JOBSTAGE);
|
||||||
|
resonanceJob = { hid: topLineHero.hid, job: topLineHero.job, jobStage: topLineHero.jobStage };
|
||||||
for (let [hid] of dbResonanceMap) {
|
for (let [hid] of dbResonanceMap) {
|
||||||
let hero = dbHeroes.find(cur => cur.hid == hid);
|
let hero = dbHeroes.find(cur => cur.hid == hid);
|
||||||
let preJobStage = hero.jobStage;
|
let preJobStage = hero.jobStage;
|
||||||
hero.jobStage = topLineHero.jobStage;
|
hero.jobStage = topLineHero.jobStage;
|
||||||
|
hero.job = getNewJob(hero, topLineHero.job);
|
||||||
|
|
||||||
if (preJobStage != hero.jobStage) {
|
if (preJobStage != hero.jobStage) {
|
||||||
//天赋树置空
|
//天赋树置空
|
||||||
@@ -57,6 +61,7 @@ export async function refreshResonanceData(roleId: string, serverId: number, sid
|
|||||||
// 羁绊1, 2, 3
|
// 羁绊1, 2, 3
|
||||||
for (let index = 1; index <= FRIENDSHIP_INDEX.THREE; index++) {
|
for (let index = 1; index <= FRIENDSHIP_INDEX.THREE; index++) {
|
||||||
topLineHero = sortData(dbResonanceMap, dbHeroes, RESONANCE_SORT_TYPE.CONNECT, index);
|
topLineHero = sortData(dbResonanceMap, dbHeroes, RESONANCE_SORT_TYPE.CONNECT, index);
|
||||||
|
resonanceCon.push({ hid: topLineHero.hid, index, level: topLineHero.connections[index]?.level || 0 });
|
||||||
for (let [hid] of dbResonanceMap) {
|
for (let [hid] of dbResonanceMap) {
|
||||||
let hero = dbHeroes.find(cur => cur.hid == hid);
|
let hero = dbHeroes.find(cur => cur.hid == hid);
|
||||||
const topDicShipId = gameData.friendShipByIndex.get(`${topLineHero.hid}_${index}`);
|
const topDicShipId = gameData.friendShipByIndex.get(`${topLineHero.hid}_${index}`);
|
||||||
@@ -70,6 +75,8 @@ export async function refreshResonanceData(roleId: string, serverId: number, sid
|
|||||||
shipData.exp = topShipData.exp;
|
shipData.exp = topShipData.exp;
|
||||||
shipData.level = topShipData.level;
|
shipData.level = topShipData.level;
|
||||||
}
|
}
|
||||||
|
let tempCon = resonanceCon.find(cur => cur.index == index);
|
||||||
|
tempCon.level = topShipData.level;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,6 +85,7 @@ export async function refreshResonanceData(roleId: string, serverId: number, sid
|
|||||||
|
|
||||||
//装备强化
|
//装备强化
|
||||||
topLineHero = sortData(dbResonanceMap, dbHeroes, RESONANCE_SORT_TYPE.EQUIP_LV, id);
|
topLineHero = sortData(dbResonanceMap, dbHeroes, RESONANCE_SORT_TYPE.EQUIP_LV, id);
|
||||||
|
resonanceEquip.push({ hid: topLineHero.hid, id, lv: topLineHero.ePlace.find(cur => cur.id == id)?.lv || 0 });
|
||||||
for (let [hid] of dbResonanceMap) {
|
for (let [hid] of dbResonanceMap) {
|
||||||
let hero = dbHeroes.find(cur => cur.hid == hid);
|
let hero = dbHeroes.find(cur => cur.hid == hid);
|
||||||
const topLineHeroEplace = topLineHero.ePlace.find(cur => cur.id == id);
|
const topLineHeroEplace = topLineHero.ePlace.find(cur => cur.id == id);
|
||||||
@@ -169,7 +177,7 @@ export async function refreshResonanceData(roleId: string, serverId: number, sid
|
|||||||
for (let [hid] of dbResonanceMap) {
|
for (let [hid] of dbResonanceMap) {
|
||||||
let hero = dbHeroes.find(cur => cur.hid == hid);
|
let hero = dbHeroes.find(cur => cur.hid == hid);
|
||||||
// console.log('-x-x--x-x-x-x-x-x-x-x-x-55 hero', util.inspect(hero, { depth: null }));
|
// console.log('-x-x--x-x-x-x-x-x-x-x-x-55 hero', util.inspect(hero, { depth: null }));
|
||||||
updateHeroes.push({ ...pick(hero, ['roleId', 'hid', 'lv', 'exp', 'jobStage', 'connections', 'skins', 'jobStage', 'ePlace']) })
|
updateHeroes.push({ ...pick(hero, ['roleId', 'hid', 'lv', 'exp', 'job', 'jobStage', 'connections', 'skins', 'jobStage', 'ePlace']) })
|
||||||
newHeroes.push(hero);
|
newHeroes.push(hero);
|
||||||
newHeroIds.push(hid);
|
newHeroIds.push(hid);
|
||||||
}
|
}
|
||||||
@@ -183,10 +191,10 @@ export async function refreshResonanceData(roleId: string, serverId: number, sid
|
|||||||
const { hid } = hero;
|
const { hid } = hero;
|
||||||
const heroResult = new HeroParam(hero);
|
const heroResult = new HeroParam(hero);
|
||||||
if (!dbResonanceMap.has(hid)) continue;
|
if (!dbResonanceMap.has(hid)) continue;
|
||||||
resonances.push({ position: dbResonanceMap.get(hid).position, ...pick(heroResult, ['hid', 'seqId', 'lv', 'exp', 'jobStage', 'talent', 'usedTalentPoint', 'totalTalentPoint', 'connections', 'ePlace', 'ce']) });
|
resonanceDatas.push({ position: dbResonanceMap.get(hid).position, ...pick(heroResult, ['hid', 'seqId', 'lv', 'exp', 'job', 'jobStage', 'talent', 'usedTalentPoint', 'totalTalentPoint', 'connections', 'ePlace', 'ce']) });
|
||||||
}
|
}
|
||||||
|
|
||||||
return resonances;
|
return { resonanceDatas, resonanceLv, resonanceJob, resonanceCon, resonanceEquip };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -206,7 +214,10 @@ export function sortData(dbResonanceMap: Map<number, ResonanceType>, heroes: Her
|
|||||||
case RESONANCE_SORT_TYPE.JOBSTAGE:
|
case RESONANCE_SORT_TYPE.JOBSTAGE:
|
||||||
{
|
{
|
||||||
heroes.sort((a, b) => {
|
heroes.sort((a, b) => {
|
||||||
if (a.jobStage !== b.jobStage) {
|
if (a.job != b.job) {
|
||||||
|
return b.job - a.job;
|
||||||
|
}
|
||||||
|
else if (a.jobStage !== b.jobStage) {
|
||||||
return b.jobStage - a.jobStage;
|
return b.jobStage - a.jobStage;
|
||||||
} else {
|
} else {
|
||||||
return b.ce - a.ce;
|
return b.ce - a.ce;
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ export default class Resonance extends BaseModel {
|
|||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
exp: number; //
|
exp: number; //
|
||||||
|
|
||||||
|
@prop({ required: true })
|
||||||
|
job: number; //
|
||||||
|
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
jobStage: number; // 职阶
|
jobStage: number; // 职阶
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,9 @@ export default class ResonanceHistory extends BaseModel {
|
|||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
exp: number; //
|
exp: number; //
|
||||||
|
|
||||||
|
@prop({ required: true })
|
||||||
|
job: number; //
|
||||||
|
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
jobStage: number; // 职阶
|
jobStage: number; // 职阶
|
||||||
|
|
||||||
|
|||||||
@@ -215,6 +215,7 @@ export interface ReturnResonanceParam {
|
|||||||
seqId?: number; // 武将表自增 id
|
seqId?: number; // 武将表自增 id
|
||||||
lv?: number; //武将等级
|
lv?: number; //武将等级
|
||||||
exp?: number;
|
exp?: number;
|
||||||
|
job?: number;
|
||||||
jobStage?: number; // 职阶
|
jobStage?: number; // 职阶
|
||||||
talent?: ResonanceTalent[]; // 天赋
|
talent?: ResonanceTalent[]; // 天赋
|
||||||
usedTalentPoint?: number;
|
usedTalentPoint?: number;
|
||||||
|
|||||||
Reference in New Issue
Block a user