diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index ec2116ca0..620f974e4 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -3,7 +3,7 @@ import { handleCost, addItems, unlockFigure, getCoinObject, getGoldObject } from import { resResult, deepCopy, parseGoodStr } from '../../../pubUtils/util'; import { STATUS } from '../../../consts/statusCode'; import { HeroModel, Connect, HeroSkin, HeroUpdate, EPlace, Talent } 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 } from '../../../consts'; +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'; import { gameData, getHeroExpByLv, getHeroStarByQuality, getHeroWakeByQuality, getHeroLvByExp, getMaxGradeByjobClass, getJobByGradeAndClass, getConnectLvByExp, getEquipByJobClassAndEPlace, getScollByStar, getExpByLv, getConnectMaxLv, getFriendShipByIdAndLv } from '../../../pubUtils/data'; @@ -14,7 +14,7 @@ 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, checkUnlockTalentCondition, initSkinTalent, updateSkinTalent } from '../../../services/roleService'; +import { addConnect, addConsumeToHero, calStarUpConsume, checkUnlockTalentCondition, initSkinTalent, updateSkinTalent } from '../../../services/roleService'; import { JewelModel, jewelUpdate } from '../../../db/Jewel'; import { HERO, REBORN } from '../../../pubUtils/dicParam'; import { createHero, createHeroes } from '../../../services/role/createHero'; @@ -187,7 +187,9 @@ export class HeroHandler { let update = { star: isUpStar ? oldStar + 1 : oldStar, starStage: isUpStar ? ABI_STAGE.START : newStarStage, - consumes: addConsumeToHero(hero.consumes, consumes) + } + if(CHECK_HERO_CONSUME) { + update['consumes'] = addConsumeToHero(hero.consumes, consumes) } @@ -237,7 +239,9 @@ export class HeroHandler { let update = { quality: hero.quality + 1, - consumes: addConsumeToHero(hero.consumes, material) + } + if(CHECK_HERO_CONSUME) { + update['consumes'] = addConsumeToHero(hero.consumes, material) } await SchoolModel.updateByHid(roleId, hid, { hid, star: update.quality }); @@ -556,9 +560,9 @@ export class HeroHandler { let roleId: string = session.get('roleId'); let { hid } = msg; - let hero = await HeroModel.findByHidAndRole(hid, roleId, 'consumes'); + let hero = await HeroModel.findByHidAndRole(hid, roleId, 'hid consumes star starStage quality'); if(!hero) return resResult(STATUS.HERO_NOT_FIND); - let consumes = hero.consumes||[]; + let { consumes} = calStarUpConsume(hero); return resResult(STATUS.SUCCESS, { previewGoods: consumes.filter(consume => consume.count > 0) }); } @@ -584,19 +588,24 @@ export class HeroHandler { } // 皮肤处理 - let { skins, skinId, consumes, ce, scrollActive } = hero; + let { skins, skinId, ce, scrollActive, quality, star, starStage } = hero; let dicHero = gameData.hero.get(skinId); let dicJob = getJobByGradeAndClass(dicHero.jobClass, 0); + let { consumes: consumesResult, newConsumes } = calStarUpConsume(hero); + let newSkins = initSkinTalent(skins); - let dicHeroScroll = getScollByStar(dicHero.quality, dicHero.initialStar, dicHero.quality, dicHero.initialColorStar); + let newQuality = quality >= 3? ( dicHero.quality >= 3? dicHero.quality: 3 ): quality; + let dicHeroScroll = getScollByStar(dicHero.quality, star, newQuality, dicHero.initialColorStar); let initInfo = HeroModel.getInitInfo(hid, { job: dicJob.jobid, skins: newSkins, skinId, ce, + star, starStage, colorStar: dicHero.initialColorStar, colorStarStage: 0, quality: newQuality, scrollActive: scrollActive, scrollId: scrollActive? dicHeroScroll.id: 0, scrollStar: scrollActive? dicHeroScroll.stars: 0, scrollQuality: scrollActive? dicHeroScroll.quality: 0, scrollColorStar: scrollActive? dicHeroScroll.colorstars: 0, + consumes: newConsumes }); // 天晶石 @@ -614,7 +623,7 @@ export class HeroHandler { let school = await SchoolModel.findByHid(roleId, hid); let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.REBIRTH, roleId, serverId, sid, hid, initInfo, { schoolId: school?.schoolId }); - let goods = await addItems(roleId, roleName, sid, consumes, ITEM_CHANGE_REASON.REBIRTH); + let goods = await addItems(roleId, roleName, sid, consumesResult, ITEM_CHANGE_REASON.REBIRTH); saveRebirthLog(session, hero); const heroResult = new HeroParam(curHero); diff --git a/game-server/app/services/roleService.ts b/game-server/app/services/roleService.ts index 9d0eff0f8..bb943c9b6 100644 --- a/game-server/app/services/roleService.ts +++ b/game-server/app/services/roleService.ts @@ -1,13 +1,13 @@ import { Channel, pinus } from 'pinus'; import { getRandValueByMinMax, getRandEelm, decodeIdCntArrayStr } from '../pubUtils/util'; -import { DEFAULT_HEROES, LINEUP_NUM, ROLE_SELECT, TALENT_RELATION_TYPE, TERAPH_RANDOM, SYSTEM_OPEN_ID, GuideUnloadNum } from "../consts"; +import { DEFAULT_HEROES, LINEUP_NUM, ROLE_SELECT, TALENT_RELATION_TYPE, TERAPH_RANDOM, SYSTEM_OPEN_ID, GuideUnloadNum, CHECK_HERO_CONSUME, ABI_STAGE } from "../consts"; import { DicTeraph } from '../pubUtils/dictionary/DicTeraph'; import { Teraph, RoleModel, RoleType, RoleUpdate } from '../db/Role'; import { SCHOOL } from '../pubUtils/dicParam'; -import { gameData, getHeroInitTalent } from '../pubUtils/data'; +import { gameData, getHeroInitTalent, getHeroStarByQuality } from '../pubUtils/data'; import { SchoolModel } from '../db/School'; import { SclResultInter, SclPosInter, RewardInter, ItemInter } from '../pubUtils/interface'; -import { Connect, HeroModel, HeroSkin, HeroUpdate, Talent } from '../db/Hero'; +import { Connect, HeroModel, HeroSkin, HeroType, HeroUpdate, Talent } from '../db/Hero'; import { SkinUpdate } from '../db/Skin'; import { Figure } from '../domain/dbGeneral'; import { pick } from 'underscore'; @@ -314,3 +314,44 @@ export async function checkServerIsOpen(serverId: number, ip: string, uid: numbe let serverTime = await getServerCreateTime(serverId); return serverTime <= nowSeconds(); } + +export function calStarUpConsume(hero: HeroType) { + let originConsumes = hero.consumes||[]; + if(CHECK_HERO_CONSUME) { + let dicHero = gameData.hero.get(hero.hid); + let dicJob = gameData.job.get(dicHero?.jobid); + if(dicHero && dicJob) { + let decrease = 0; + for(let star = dicHero.initialStar; star < hero.star; star++) { + let curDicHeroStar = getHeroStarByQuality(dicJob.job_class, dicHero.quality, star); + if(!curDicHeroStar) continue; + let max = star == hero.star ? hero.starStage: ABI_STAGE.END; + for (let i = 0; i < max; i++) { + decrease += curDicHeroStar.advanceUpFragmentNum; + } + } + for(let quality = dicHero.quality; quality < hero.quality; quality++) { + let curDicHeroQualityUp = gameData.heroQualityUp.get(quality); + if (!curDicHeroQualityUp) continue; + decrease += curDicHeroQualityUp.fragmentNum; + } + + return decreaseConsume(originConsumes, dicHero.pieceId, decrease); + } + } + return { consumes: originConsumes, newConsumes: [] }; +} + +// 从原始消耗里减去消耗 +function decreaseConsume(origin: Reward[], pieceId: number, decrease: number) { + let consumes: Reward[] = [], newConsumes: Reward[] = []; + for(let { id, count } of origin) { + if(id == pieceId) { + consumes.push({ id, count: count - decrease > 0? count - decrease: 0 }); + newConsumes.push({ id, count: decrease }); + } else { + consumes.push({ id, count }); + } + } + return { consumes, newConsumes }; +} \ No newline at end of file diff --git a/shared/consts/constModules/heroConst.ts b/shared/consts/constModules/heroConst.ts index 3f0e9eaea..85ed9ad50 100644 --- a/shared/consts/constModules/heroConst.ts +++ b/shared/consts/constModules/heroConst.ts @@ -58,3 +58,5 @@ export const HERO_INITIAL_QUALITY = { PURPLE: 2, ORANGE: 3 } + +export const CHECK_HERO_CONSUME = true; \ No newline at end of file