diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index 5a8bbfb0a..adfe95257 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -348,6 +348,7 @@ export class HeroHandler { //重算战力并下发 let update = { + job: hero.job, jobStage: newJobStage, consumes: addConsumeToHero(hero.consumes, consumes) } @@ -442,7 +443,7 @@ export class HeroHandler { consumes: addConsumeToHero(hero.consumes, consumes) } //重算战力并下发 - let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.CONNECT, roleId, serverId, sid, hero.hid, update, { shipId }); + let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.CONNECT, roleId, serverId, sid, hero.hid, update, { shipId, hero }); // 任务 await checkTask(serverId, roleId, sid, TASK_TYPE.HERO_CONNECT, { connectLv: level }) return resResult(STATUS.SUCCESS, { curHero: pick(curHero, ['hid', 'connections']) }); @@ -519,17 +520,8 @@ export class HeroHandler { } let isFavourLvUp = oldLv == newLv; - // //重算战力并下发 - // if (oldLv != newLv) { - // await unlockFigure(sid, roleId, [{ type: FIGURE_UNLOCK_CONDITION.HERO_FAVOR, paramHid: hero.hid, paramFavourLv: hero.favourLv }]); - // hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.FAVOUR, sid, roleId, hero, update, [oldLv]); - // // 任务 - // await checkTask(serverId, roleId, sid, TASK_TYPE.HERO_FAVOUR_LV, { hero, oldFavourLv: oldLv }); - // } else { - // hero = await HeroModel.updateHeroInfo(roleId, hero.hid, update); - // } - let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.FAVOUR, roleId, serverId, sid, hero.hid, update, { isFavourLvUp }); + let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.FAVOUR, roleId, serverId, sid, hero.hid, update, { isFavourLvUp, hero }); if(isFavourLvUp) { await unlockFigure(sid, roleId, [{ type: FIGURE_UNLOCK_CONDITION.HERO_FAVOR, paramHid: curHero.hid, paramFavourLv: curHero.favourLv }]); await checkTask(serverId, roleId, sid, TASK_TYPE.HERO_FAVOUR_LV, { hero: curHero, oldFavourLv: oldLv }); // 任务 @@ -639,10 +631,6 @@ export class HeroHandler { scrollColorStar: scrollActive? dicHeroScroll.colorstars: 0, }); - let calHeroCe = new CalHeroCe(hid, initInfo); - let heroAttr = calHeroCe.cal(HERO_SYSTEM_TYPE.REBIRTH); - // await HeroModel.updateHeroInfo(roleId, hid, { ...initInfo, attr: heroAttr }); - // 天晶石 let curJewels: jewelUpdate[] = []; for(let { jewel, id } of hero.ePlace) { @@ -656,7 +644,7 @@ export class HeroHandler { } } - let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.REBIRTH, roleId, serverId, sid, hid, {...initInfo, attr: heroAttr}); + let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.REBIRTH, roleId, serverId, sid, hid, initInfo, { }); let goods = await addItems(roleId, roleName, sid, consumes, ITEM_CHANGE_REASON.REBIRTH); const heroResult = new HeroParam(curHero); diff --git a/game-server/app/servers/role/handler/roleHandler.ts b/game-server/app/servers/role/handler/roleHandler.ts index 741e8ebe4..f4a38ced1 100644 --- a/game-server/app/servers/role/handler/roleHandler.ts +++ b/game-server/app/servers/role/handler/roleHandler.ts @@ -7,7 +7,7 @@ import { handleCost, addItems, getGoldObject, getCoinObject } from '../../../ser import { getTitle, getTeraph, gameData, getScollByStar, getFriendLvByExp, getHeroExpByLv, getExpByLv } from '../../../pubUtils/data'; import { SCHOOL, SCROLL, EXTERIOR, SCRIPT } from '../../../pubUtils/dicParam'; import { getAtrrNameById } from '../../../consts/constModules/abilityConst' -import { findIndex } from 'underscore'; +import { findIndex, pick } from 'underscore'; import { SclResultInter, SclPosInter } from '../../../pubUtils/interface'; import { SchoolModel } from '../../../db/School'; import { getTeraphStrengthenResult, getSchoolList } from '../../../services/roleService' @@ -285,13 +285,13 @@ export class RoleHandler { let { hid } = msg; - let curHero = await HeroModel.findByHidAndRole(hid, roleId, 'hid lv star colorStar quality scrollId scrollActive scrollStar scrollColorStar scrollQuality favour favourLv connections attr ce'); - if (!curHero) return resResult(STATUS.HERO_NOT_FIND); + let hero = await HeroModel.findByHidAndRole(hid, roleId, 'hid lv star colorStar quality scrollId scrollActive scrollStar scrollColorStar scrollQuality favour favourLv connections attr ce'); + if (!hero) return resResult(STATUS.HERO_NOT_FIND); let dicHero = gameData.hero.get(hid); if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); - let { star, colorStar, quality, scrollId, scrollActive, scrollStar, scrollColorStar, scrollQuality, favour, favourLv } = curHero; + let { star, colorStar, quality, scrollId, scrollActive, scrollStar, scrollColorStar, scrollQuality, favour, favourLv } = hero; let update = { scrollActive, scrollId, scrollStar, scrollColorStar, scrollQuality, favour, favourLv @@ -318,23 +318,13 @@ export class RoleHandler { let dicHeroScroll = getScollByStar(dicHero.quality, update.scrollStar, update.scrollQuality, update.scrollColorStar); update.scrollId = dicHeroScroll ? dicHeroScroll.id : 0; - let hero = await HeroModel.updateHeroInfo(roleId, hid, update); - await calculateCeWithHero(HERO_SYSTEM_TYPE.SCROLL, roleId, serverId, sid, hid, update); + let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.SCROLL, roleId, serverId, sid, hid, update); // 任务 await checkTaskInActiveScroll(serverId, roleId, sid, scrollActive, hero); return resResult(STATUS.SUCCESS, { - curHero: { - hid: hero.hid, - scrollActive: hero.scrollActive, - scrollId: hero.scrollId, - scrollStar: hero.scrollStar, - scrollColorStar: hero.scrollColorStar, - scrollQuality: hero.scrollQuality, - favour: hero.favour, - favourLv: hero.favourLv, - } + curHero: pick(curHero, ['hid', 'scrollActive', 'scrollId', 'scrollStar', 'scrollColorStar', 'scrollQuality', 'favour', 'favourLv']) }); } diff --git a/game-server/app/services/playerCeService.ts b/game-server/app/services/playerCeService.ts index bfb83c7bb..5b49b18e3 100644 --- a/game-server/app/services/playerCeService.ts +++ b/game-server/app/services/playerCeService.ts @@ -19,7 +19,6 @@ import { PvpDefenseModel } from '../db/PvpDefense'; import { saveCeChangeLog } from '../pubUtils/logUtil'; import { JewelType } from '../db/Jewel'; import { SchoolModel } from '../db/School'; -import { HasJustId } from 'mongoose'; interface Param { isInitRole?: boolean, @@ -54,7 +53,7 @@ export async function calculateWithRole(type: HERO_SYSTEM_TYPE, roleId: string, } export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serverId: number, sid: string, heroUpdates: Map, roleUpdate: RoleUpdate, roleIncUpdate: RoleUpdate, param: Param = {}) { - let calCe = new CalCe(); + let calCe = new CalCe(roleId); let roleCe = await RoleCeModel.findByRoleId(roleId); calCe.setRoleCe(roleCe); switch (type) { @@ -98,13 +97,62 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve } case HERO_SYSTEM_TYPE.COLORSTAR: // 4. 觉醒 { - for(let [hid, { colorStar, colorStarStage }] of heroUpdates) { - let { hero: { star, starStage, quality, job }, isUpStar } = param; + for(let [hid, { quality, colorStar, colorStarStage }] of heroUpdates) { + let { hero: { star, starStage, job }, isUpStar } = param; await treatHeroStar(calCe, roleId, hid, star, starStage, quality, colorStar, colorStarStage, job, isUpStar); } break; } - case HERO_SYSTEM_TYPE.SCHOOL: // 放百家学宫 + case HERO_SYSTEM_TYPE.TRAIN: // 5. 训练 + case HERO_SYSTEM_TYPE.STAGEUP: // 6. 职业进阶 + { + for(let [hid, { job, jobStage }] of heroUpdates) { + calCe.setJob(hid, job, jobStage); + } + break; + } + case HERO_SYSTEM_TYPE.SKIN: // 7. 穿皮肤 + { + let { hero: { quality, star, starStage, colorStar, colorStarStage } } = param; + for(let [hid, { skinId, job, ePlace }] of heroUpdates) { + calCe.setHeroBase(hid, skinId); + calCe.setHeroStar(hid, job, quality, star, starStage, colorStar, colorStarStage); + + // let eplaceIds = newEplace.map(cur => cur.id); + // calEquipStrengthIncAttr(originHero, update, eplaceIds); + // calEquipQualityIncAttr(originHero, update, eplaceIds); + // calEquipStarIncAttr(originHero, update, eplaceIds, addSeidList, removeSeidList); + // // 天赋点 + // calHeroTalent(originHero, update, addSeidList, removeSeidList); + } + // TODO 装备 + break; + } + case HERO_SYSTEM_TYPE.FAVOUR: // 8. 好感度 + { + let { hero: { connections }, isFavourLvUp } = param; + if(isFavourLvUp) { + for(let [hid, { favourLv }] of heroUpdates) { + calCe.setFavour(hid, favourLv, connections); + } + } + break; + } + case HERO_SYSTEM_TYPE.CONNECT: // 9. 羁绊 + { + for(let [ hid, { connections } ] of heroUpdates) { + let { shipId } = param; + calCe.setConnection(hid, shipId, connections); + } + break; + } + case HERO_SYSTEM_TYPE.ADD_SKIN: // 15. 第一次获得皮肤 + { + let { skinId } = param; + calCe.setAddSkin(skinId); + break; + } + case HERO_SYSTEM_TYPE.SCHOOL: // 16. 放百家学宫 { let { schoolId, schoolHid, preSchoolHid, hero } = param; if(preSchoolHid) { @@ -116,6 +164,44 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve } break; } + case HERO_SYSTEM_TYPE.SCROLL: // 17. 名将谱 + { + for(let [hid, { scrollStar, scrollQuality, scrollColorStar }] of heroUpdates) { + calCe.setScroll(hid, scrollStar, scrollQuality, scrollColorStar); + } + break; + } + case HERO_SYSTEM_TYPE.TITLE: // 18. 爵位 + { + let { title } = roleUpdate; + calCe.setTitle(title); + break; + } + case HERO_SYSTEM_TYPE.TERAPH: // 19. 神像 + case HERO_SYSTEM_TYPE.TERAPH_UP: // 20. 神像进阶 + { + let { teraphs } = roleUpdate; + calCe.setTeraph(teraphs); + break; + } + case HERO_SYSTEM_TYPE.REBIRTH: // 29. 重生 + { + for(let [hid, { skinId, lv, quality, star, starStage, colorStar, colorStarStage, job, jobStage, }] of heroUpdates) { + calCe.setHeroBase(hid, skinId); + calCe.setHeroLv(hid, lv); + calCe.setHeroStar(hid, job, quality, star, starStage, colorStar, colorStarStage); + calCe.setJob(hid, job, jobStage); + // TODO 装备 + } + break; + } + case HERO_SYSTEM_TYPE.TALENT: // 30. 天赋 + { + for(let [hid, { skins }] of heroUpdates) { + calCe.setTalent(hid, skins); + } + break; + } } let { heroCe, roleInc } = calCe.getCeInc(); // 计算战力,获得有变化的武将战力 let changeHids: number[] = []; @@ -133,7 +219,7 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve pushHeros.push({ hid, ce, incHeroCe: inc }); changeHids.push(hid); } else { - let hero = await HeroModel.updateHeroInfo(roleId, param.hid, heroUpdate); + let hero = await HeroModel.updateHeroInfo(roleId, hid, heroUpdate); heroes.push(hero); } } @@ -202,7 +288,7 @@ async function updateRank(roleId: string, serverId: number, topLineupCe: number, export async function getSumCe(roleId: string, num: number) { let roleCe = await RoleCeModel.findByRoleId(roleId); - let calCe = new CalCe(); + let calCe = new CalCe(roleId); calCe.setRoleCe(roleCe); let arr = calCe.getResultCeArr(); let ce = 0; diff --git a/game-server/app/services/role/calCe.ts b/game-server/app/services/role/calCe.ts index 04bf89412..00771ee45 100644 --- a/game-server/app/services/role/calCe.ts +++ b/game-server/app/services/role/calCe.ts @@ -1,10 +1,10 @@ -import { ABI_STAGE, ABI_STAGE_TO_TYPE, ABI_TYPE_MAIN, LINEUP_NUM, SEID_TYPE } from "../../consts"; -import { HeroType, HeroUpdate } from "../../db/Hero"; +import { ABI_STAGE, ABI_STAGE_TO_TYPE, ABI_TYPE_MAIN, LINEUP_NUM, SEID_TYPE, TALENT_RELATION_TYPE } from "../../consts"; +import { Connect, HeroSkin, HeroType, HeroUpdate, Talent } from "../../db/Hero"; import { RoleUpdate, Teraph } from "../../db/Role"; import { AttrCell, EquipAttr, HeroAttr, RoleCeType, SchoolAttr } from "../../db/RoleCe"; import { TopHero } from "../../domain/dbGeneral"; import { AttributeCal } from "../../domain/roleField/attribute"; -import { gameData, getHeroStarByQuality, getHeroWakeByQuality, getSchoolRateByStar, getTeraph } from "../../pubUtils/data"; +import { gameData, getFriendShipById, getHeroStarByQuality, getHeroWakeByQuality, getJobByGradeAndClass, getSchoolRateByStar, getScollByStar, getTeraph } from "../../pubUtils/data"; import { DicRandomEffectPool } from "../../pubUtils/dictionary/DicRandomEffectPool"; import { DicSe } from "../../pubUtils/dictionary/DicSe"; import { addToMap, deepCopy } from "../../pubUtils/util"; @@ -25,6 +25,12 @@ export class CalCe { resultCes: Map = new Map(); // hid => ce schoolAttrs: Map = new Map(); // hid + attr => ratio schoolAttrsByAttrId: Map = new Map(); // attrId => hid + attr + scrollAttrs: Map = new Map(); // hid + attr => ratio + scrollAttrsByAttrId: Map = new Map(); // attrId => hid + attr + + constructor(roleId: string) { + this.roleId = roleId; + } private getGlobalAttrById(attrId: number) { if(!this.globalAttrs.has(attrId)) { @@ -41,7 +47,6 @@ export class CalCe { private getHeroAttrByHidAndId(hid: number, attrId: number) { let key = `${hid}_${attrId}`; - console.log('$$$$$$$$ getHeroAttrByHidAndId', hid, attrId) if(!this.heroAttrs.has(key)) { if(ABI_TYPE_MAIN.indexOf(attrId) != -1) { let obj = new HeroMainAttr(hid, attrId); @@ -56,7 +61,6 @@ export class CalCe { } this.heroAttrsByHid.get(hid).push(key); } - console.log('$$$$$$$$ heroAttrsByHid', this.heroAttrsByHid) return this.heroAttrs.get(key); } @@ -84,7 +88,7 @@ export class CalCe { return this.equipAttrs.get(key); } - private setSchoolRate(hid: number, attrId: number, value: number) { + private setSchoolAttrs(hid: number, attrId: number, value: number) { let key = `${hid}_${attrId}`; if(!this.schoolAttrs.has(key)) { this.schoolAttrs.set(key, { hid, attrId, ce: value }); @@ -108,6 +112,30 @@ export class CalCe { globalAttr.school = schoolResult; } + private setScrollAttrs(hid: number, attrId: number, value: number) { + let key = `${hid}_${attrId}`; + if(!this.scrollAttrs.has(key)) { + this.scrollAttrs.set(key, { hid, attrId, ce: value }); + if(!this.scrollAttrsByAttrId.has(attrId)) { + this.scrollAttrsByAttrId.set(attrId, []); + } + this.scrollAttrsByAttrId.get(attrId).push(key); + } else { + this.scrollAttrs.get(key).ce = value; + } + } + + private calScrollAttrsToGlobal(attrId: number) { + let keys = this.scrollAttrsByAttrId.get(attrId)||[]; + let result = 0; + for(let key of keys) { + let { ce } = this.scrollAttrs.get(key); + result += ce; + } + let globalAttr = this.getGlobalAttrById(attrId); + globalAttr.scroll = result; + } + public calHeroCe() { let ces = new Map(); // hid => [{attrId, val}] for(let [hid, keys] of this.heroAttrsByHid) { @@ -201,9 +229,6 @@ export class CalCe { } public setRoleCe(roleCe: RoleCeType) { - console.log('&&&&&&&& setRoleCe', roleCe) - - this.roleId = roleCe.roleId; if(roleCe) { for(let globalAttr of roleCe.globalAttrs) { let obj = this.getGlobalAttrById(globalAttr.attrId); @@ -226,11 +251,13 @@ export class CalCe { } } for(let { hid, attrId, value } of roleCe.schoolAttrs) { - this.setSchoolRate(hid, attrId, value); + this.setSchoolAttrs(hid, attrId, value); + } + for(let { hid, attrId, value } of roleCe.scrollAttrs) { + this.setScrollAttrs(hid, attrId, value); } } this.originCes = this.calHeroCe(); - console.log('############ setRoleCe', this.originCes) } public setResultHero(hero: HeroType) { @@ -300,13 +327,98 @@ export class CalCe { // 职业基础 public setJob(hid: number, job: number, jobStage: number) { const dicJob = gameData.job.get(job); + let lastJob = getJobByGradeAndClass(dicJob.job_class, dicJob.grade - 1); + let dicLastJob = lastJob? gameData.job.get(lastJob.jobid): null; for(let i = 1; i <= dicJob.maxStage; i++) { if(jobStage >= i) { let { id, attr } = dicJob.ceAttr.get(i); let heroAttr = this.getHeroAttrByHidAndId(hid, id); heroAttr.job = attr; + } else { + if(dicLastJob) { + let { id, attr } = dicLastJob.ceAttr.get(i); + let heroAttr = this.getHeroAttrByHidAndId(hid, id); + heroAttr.job = attr; + } } } + for(let { id, val } of dicJob.baseSubAttr) { + let heroAttr = this.getHeroAttrByHidAndId(hid, id); + heroAttr.base = val; + } + } + + // 好感度 + public setFavour(hid: number, favourLv: number, connections: Connect[]) { + let currentFiendShipLevel = gameData.friendShipLevelMap.get(favourLv); + let add = currentFiendShipLevel.add; + + for (let {shipId, level} of connections) { + let dicHeroFriendShip = getFriendShipById(shipId, level); + for (let { id } of dicHeroFriendShip.attributes) { + let heroAttr = this.getHeroAttrByHidAndId(hid, id); + heroAttr.favour = add; + } + } + } + + // 羁绊 + public setConnection(hid: number, shipId: number, connections: Connect[]) { + let connect = connections.find(cur => cur.shipId == shipId); + let level = connect?.level||0; + + let currentShip = getFriendShipById(shipId, level); + if (currentShip) { + for (let { id, number: val } of currentShip.attributes) { + let heroAttr = this.getHeroAttrByHidAndId(hid, id); + heroAttr.connect = val; + } + } + } + + // 第一次获得皮肤 + public setAddSkin(skinId: number) { + let addSkin = gameData.fashion.get(skinId); + for (let { id, number: val } of addSkin.globalAttr) { + let globalAttr = this.getGlobalAttrById(id); + globalAttr.skin += val; + } + } + + // 天赋 + public setTalent(hid: number, skins: HeroSkin[]) { + let skin = skins.find(cur => cur.enable); + let seids = this.getTalentSeid(skin.talent); + let { ratioUp } = this.addSeidEffect(seids); + for(let [attrId, val] of ratioUp) { + let heroAttr = this.getHeroAttrByHidAndId(hid, attrId); + heroAttr.talent = val; + } + } + + private getTalentSeid(talent: Talent[]) { + let seids = new Map(); // id, seids + for(let { id, level } of talent) { + let dicHeroTalent = gameData.heroTalent.get(id); + for(let { type, ids} of dicHeroTalent.relation) { + if(type == TALENT_RELATION_TYPE.REPLACE) { + for(let id of ids) { + seids.delete(id); + } + } + } + for(let { lv, seid } of dicHeroTalent.level) { + if(level >= lv) { + if(!seids.has(id)) seids.set(id, []); + seids.get(id).push(seid); + } + } + } + let result: number[] = []; + for(let [_, ids] of seids) { + result.push(...ids); + } + return result; } // 爵位 @@ -340,18 +452,30 @@ export class CalCe { } } + // 名将谱 + public setScroll(hid: number, scrollStar: number, scrollQuality: number, scrollColorStar: number) { + let dicHero =gameData.hero.get(hid); + let dicHeroScroll = getScollByStar(dicHero.quality, scrollStar, scrollQuality, scrollColorStar); + + if(dicHeroScroll) { + for(let [attrId, value] of dicHeroScroll.ceAttr) { + this.setScrollAttrs(hid, attrId, value); + this.calScrollAttrsToGlobal(attrId); + } + } + } + // 百家学宫 public setSchool(isPutOn: boolean, hid: number, schoolId: number, star: number, colorStar: number, quality: number) { let dicSchool = gameData.school.get(schoolId); let dicSchoolRate = getSchoolRateByStar(star, colorStar, quality); - console.log('#### setSchool', star, colorStar, quality, dicSchoolRate) for (let attrId of dicSchool.upAttribute) { if(ABI_TYPE_MAIN.includes(attrId)) { // 主属性 - this.setSchoolRate(hid, attrId, isPutOn?dicSchoolRate.mainAttrAPerent: 0); + this.setSchoolAttrs(hid, attrId, isPutOn?dicSchoolRate.mainAttrAPerent: 0); } else { - this.setSchoolRate(hid, attrId, isPutOn?dicSchoolRate.assiAttrAddValue: 0); + this.setSchoolAttrs(hid, attrId, isPutOn?dicSchoolRate.assiAttrAddValue: 0); } this.calSchoolAttrsToGlobal(attrId); } diff --git a/game-server/app/services/role/rewardService.ts b/game-server/app/services/role/rewardService.ts index 099631081..eef4db82c 100644 --- a/game-server/app/services/role/rewardService.ts +++ b/game-server/app/services/role/rewardService.ts @@ -24,7 +24,7 @@ import { JewelModel, JewelType, jewelUpdate, RandSe } from '../../db/Jewel'; import { updateEplaces } from '../equipService'; import { combineItems, getCoinEventProperties, getGoldEventProperties, sortItems } from './util'; import { nowSeconds } from '../../pubUtils/timeUtil'; -import { calculateCeWithHero } from '../playerCeService'; +import { calculateCeWithHero, calculateWithRole } from '../playerCeService'; @@ -358,7 +358,7 @@ export async function addSkin(roleId: string, roleName: string, sid: string, ski if(skin.hid && !hero) hero = await HeroModel.findByHidAndRole(skin.hid, roleId); let condition = { type: FIGURE_UNLOCK_CONDITION.GET_SKIN, paramSkinId: skinId }; await unlockFigure(sid, roleId, [condition]); // 解锁头像 - await calculateCeWithHero(HERO_SYSTEM_TYPE.ADD_SKIN, roleId, hero.serverId, sid, skin.hid, {}, { skinId }); // 全局加成 + await calculateWithRole(HERO_SYSTEM_TYPE.ADD_SKIN, roleId, hero.serverId, sid, {}, { skinId }); // 全局加成 if (hero) { // 有武将的,将皮肤链接到武将上 let curSkin = hero.skins.find(cur => cur.id == skinId); diff --git a/shared/consts/constModules/heroConst.ts b/shared/consts/constModules/heroConst.ts index 866d86a9f..c1ff1c2b7 100644 --- a/shared/consts/constModules/heroConst.ts +++ b/shared/consts/constModules/heroConst.ts @@ -10,11 +10,11 @@ export enum HERO_SYSTEM_TYPE { SKIN =7, // 皮肤 FAVOUR =8, // 好感 CONNECT =9, // 羁绊 - EQUIP = 10, // 装备穿脱 - EQUIP_BASE = 11, // 装备栏升级,装备精炼等 - RESTRENGTHEN = 12, // 洗练 - JEWEL_ON = 13, // 穿宝石 - JEWEL_OFF = 14, // 脱宝石 + // EQUIP = 10, // 装备穿脱 + // EQUIP_BASE = 11, // 装备栏升级,装备精炼等 + // RESTRENGTHEN = 12, // 洗练 + // JEWEL_ON = 13, // 穿宝石 + // JEWEL_OFF = 14, // 脱宝石 ADD_SKIN = 15, // 第一次获取皮肤(全局) SCHOOL = 16, // 百家学宫 SCROLL = 17, // 名将谱 diff --git a/shared/pubUtils/dictionary/DicJob.ts b/shared/pubUtils/dictionary/DicJob.ts index 5e5cbf501..31a8305fe 100644 --- a/shared/pubUtils/dictionary/DicJob.ts +++ b/shared/pubUtils/dictionary/DicJob.ts @@ -23,8 +23,10 @@ export interface DicJob { readonly trainingConsume: Array; // 升阶消耗 readonly upGradeConsume: Array; - // 每阶升级属性 + // 每阶升级属性 stage => {} readonly ceAttr: Map; + // 次级属性基础 attr => value attr1 + readonly baseSubAttr: {id: number, val: number}[]; // 一共有多少阶升级 readonly maxStage: number; // 到这一阶能获得多少天赋点 @@ -32,7 +34,7 @@ export interface DicJob { } type KeysEnum = { [P in keyof Required]: true }; -const DicJobKeys: KeysEnum = {jobid: true, name: true, grade: true, unlockLevel: true, job_class: true, type: true, trainingConsume: true, upGradeConsume: true, ceAttr: true, maxStage: true, talentPoint: true}; +const DicJobKeys: KeysEnum = {jobid: true, name: true, grade: true, unlockLevel: true, job_class: true, type: true, trainingConsume: true, upGradeConsume: true, ceAttr: true, maxStage: true, talentPoint: true, baseSubAttr: true}; export const dicJob = new Map(); export const jobClassMaxGrades = new Map(); @@ -54,6 +56,7 @@ export function loadJob() { o.maxStage = o.trainingConsume.length; o.upGradeConsume = parseGoodStr(o.upGradeConsume); o.ceAttr = parseCeAttr(o.maxStage, o.attr); + o.baseSubAttr = parseAttribute(o.baseSecondAttr||''); dicJob.set(o.jobid, _.pick(o, Object.keys(DicJobKeys))); let jobClass = jobClassMaxGrades.get(o.job_class); if (!jobClass || jobClass.grade < o.grade) { @@ -93,4 +96,17 @@ function parseCeAttr(maxStage: number, str: string) { result.set(i, { id: parseInt(id), attr: parseFloat(attr) }); } return result -} \ No newline at end of file +} + +function parseAttribute(str: string) { + let result = new Array<{ id: number, val: number }>(); + if (!str) return result; + let decodeArr = decodeArrayListStr(str); + for (let [id, val] of decodeArr) { + if (isNaN(parseInt(id)) || isNaN(parseInt(val))) { + throw new Error('data table format wrong'); + } + result.push({ id: parseInt(id), val: parseInt(val) }); + } + return result +}