feat(武将): 重生体验优化 ca13e8be3 至 4ee246e78

This commit is contained in:
luying
2023-08-29 16:29:19 +08:00
parent 878d80f069
commit 820bfe170a
8 changed files with 155 additions and 9 deletions

View File

@@ -1,8 +1,8 @@
import { Application, BackendSession, ChannelService, HandlerService, } from 'pinus';
import { handleCost, addItems, unlockFigure, getCoinObject, getGoldObject } from '../../../services/role/rewardService';
import { resResult, deepCopy, parseGoodStr } from '../../../pubUtils/util';
import { resResult, deepCopy, parseGoodStr, swapFields } from '../../../pubUtils/util';
import { STATUS } from '../../../consts/statusCode';
import { HeroModel, Connect, HeroSkin, HeroUpdate, EPlace, Talent } from '../../../db/Hero';
import { HeroModel, Connect, HeroSkin, HeroUpdate, EPlace, Talent, HeroType } from '../../../db/Hero';
import { CURRENCY_BY_TYPE, CURRENCY_TYPE, CONSUME_TYPE, HERO_GROW_MAX, HERO_SYSTEM_TYPE, ABI_STAGE, DEBUG_MAGIC_WORD, HERO_INITIAL_QUALITY, REDIS_KEY, TASK_TYPE, ITEM_CHANGE_REASON, CHECK_HERO_CONSUME } from '../../../consts';
import { RoleModel } from '../../../db/Role';
import { ItemModel } from '../../../db/Item';
@@ -14,13 +14,13 @@ import { PvpDefenseModel } from '../../../db/PvpDefense';
import { checkTask, checkTaskInHeroGiveFavor, checkTaskInHeroQUalityUp, checkTaskInHeroStarUp, checkTaskInHeroTrain, checkTaskInHeroWakeUp } from '../../../services/task/taskService';
import { isNumber, pick } from 'underscore';
import { updateEplaces } from '../../../services/equipService';
import { addConnect, addConsumeToHero, calStarUpConsume, checkUnlockTalentCondition, initSkinTalent, updateSkinTalent } from '../../../services/roleService';
import { JewelModel, jewelUpdate } from '../../../db/Jewel';
import { addConnect, addConsumeToHero, calStarUpConsume, checkUnlockTalentCondition, getHeroNewEplace, initSkinTalent, updateSkinTalent } from '../../../services/roleService';
import { JewelModel, JewelType, jewelUpdate } from '../../../db/Jewel';
import { HERO, REBORN } from '../../../pubUtils/dicParam';
import { createHero, createHeroes } from '../../../services/role/createHero';
import { CheckMeterial } from '../../../services/role/checkMaterial';
import { HeroParam } from '../../../domain/roleField/hero';
import { calculateCeWithHero } from '../../../services/playerCeService';
import { calculateCeWithHero, calculateCeWithHeroes, calculateCeWithRole } from '../../../services/playerCeService';
import { SchoolModel } from '../../../db/School';
import { SkinModel } from '../../../db/Skin';
import { RoleCeModel } from '../../../db/RoleCe';
@@ -810,6 +810,74 @@ export class HeroHandler {
return resResult(STATUS.SUCCESS, { preHid, curHero: pick(curHero, ['hid', 'subHid', 'subActorId']) });
}
/**
* 重生 武将等级、装备养成、职业进阶上养成度对换,升星、羁绊不对换,双方的职业天赋树均重置
* @param msg
* @param session
*/
public async heroReborn(msg: { originHid: number, targetHid: number }, session: BackendSession) {
const roleId: string = session.get('roleId');
const roleName: string = session.get('roleName');
const sid: string = session.get('sid');
const serverId: number = session.get('serverId');
const { originHid, targetHid } = msg;
let dbHeros = await HeroModel.findByHidsAndRole(roleId, [originHid, targetHid]);
if (dbHeros.length != 2) return resResult(STATUS.HERO_NOT_FIND);
const heroMap = dbHeros.reduce((map, obj) => { map.set(obj.hid, obj); return map; }, new Map<number, HeroType>());
let originHero = heroMap.get(originHid);
let targetHero = heroMap.get(targetHid);
swapFields(originHero || {}, targetHero || {}, ['lv', 'job', 'jobStage']);
if (originHero.skins || originHero.skins.length > 0) originHero.skins.forEach((cur) => { cur.talent = [], cur.usedTalentPoint = 0; });
if (targetHero.skins || targetHero.skins.length > 0) targetHero.skins.forEach((cur) => { cur.talent = [], cur.usedTalentPoint = 0; });
let tempOriginEPlace = [], tempTargetEPlace = []
if (originHero.ePlace || targetHero.ePlace.length > 0) tempOriginEPlace = getHeroNewEplace(originHero, targetHero?.ePlace || []);
if (targetHero.ePlace || originHero.ePlace.length > 0) tempTargetEPlace = getHeroNewEplace(targetHero, originHero?.ePlace || []);
originHero.ePlace = tempOriginEPlace;
targetHero.ePlace = tempTargetEPlace;
let jewels: JewelType[] = [];
let curJewels: jewelUpdate[] = [];
for (let { jewel } of originHero.ePlace) {
if (jewel == 0) continue;
let result = await JewelModel.updateInfo(jewel, { hid: targetHid });
if (!result) return resResult(STATUS.HERO_NOT_FIND);
jewels.push(result);
curJewels.push({ seqId:result.seqId, hid:result.hid});
}
for (let { jewel } of targetHero.ePlace) {
if (jewel == 0) continue;
let result = await JewelModel.updateInfo(jewel, { hid: originHid });
if (!result) return resResult(STATUS.HERO_NOT_FIND);
jewels.push(result);
curJewels.push({ seqId:result.seqId, hid:result.hid});
}
let heroesRet: HeroType[] = [];
for (let hero of [originHero, targetHero]) {
let result = await HeroModel.updateHeroInfo(roleId, hero.hid, { ...pick(hero, ['lv', 'job', 'jobStage', 'ePlace', 'skins']) });
if (!result) return resResult(STATUS.HERO_NOT_FIND);
heroesRet.push(result);
}
let artifacts = await ArtifactModel.findbyHids(roleId, [originHid, targetHid]);
// 战力重算
let { heroes } = await calculateCeWithHeroes(HERO_SYSTEM_TYPE.REBORN_CAL, roleId, serverId, sid, heroesRet, { jewels, heroes: heroesRet, artifacts });
let curHeroes = [];
for (let hero of (heroes || [])) {
const heroResult = new HeroParam(hero);
curHeroes.push({ ...pick(heroResult, ['seqId', 'hid', 'ce', 'lv', 'job', 'jobStage', 'ePlace', 'talent', 'usedTalentPoint', 'totalTalentPoint']) });
}
return resResult(STATUS.SUCCESS, { curHeroes, curJewels })
}
// ! debug接口 一键全武将
public async debugGetAllHeroes(msg: { magicWord: string }, session: BackendSession) {
let roleId: string = session.get('roleId');
@@ -919,4 +987,4 @@ export class HeroHandler {
}
}
}
}