From ef731fc979136a1d2b052a54a41ae7c2119aeb19 Mon Sep 17 00:00:00 2001 From: luying Date: Tue, 29 Mar 2022 18:08:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=98=E5=8A=9B=EF=BC=9A=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game-server/app/services/role/calCe.ts | 667 +++++++++++++------------ 1 file changed, 344 insertions(+), 323 deletions(-) diff --git a/game-server/app/services/role/calCe.ts b/game-server/app/services/role/calCe.ts index 127271d3f..e6ffb73ab 100644 --- a/game-server/app/services/role/calCe.ts +++ b/game-server/app/services/role/calCe.ts @@ -9,174 +9,32 @@ import { gameData, getEquipQualityIdByEquipIdAndPoint, getEquipStarAttrByStage, import { DicRandomEffectPool } from "../../pubUtils/dictionary/DicRandomEffectPool"; import { DicSe } from "../../pubUtils/dictionary/DicSe"; import { addToMap, deepCopy } from "../../pubUtils/util"; - export class CalCe { roleId: string; - globalAttrs: Map = new Map(); // attrId => GlobalAttr - heroAttrs: Map = new Map(); // hid+attrId => HeroAttr - heroAttrsByHid: Map = new Map(); // hid => [hid+attrId] - equipAttrs: Map = new Map(); // hid+eplaceId+attrId => EquipAttr - equipAttrsByHid: Map = new Map(); // hid => [hid+eplaceId+attrId] - equipAttrsByHidAndEplace: Map = new Map(); // hid+eplaceId =>[hid+eplaceId+attrId] - equipAttrsByHidAndAttrId: Map = new Map(); // hid+attrId =>[hid+eplaceId+attrId] - heroLv: Map = new Map(); - heroHistoryCe: Map = new Map(); - heroObjectId: Map = new Map(); - equipLv: Map = new Map(); // hid+eplaceId => lv originCes: Map = new Map(); // hid => ce resultCes: Map = new Map(); // hid => ce - schoolAttrs: Map = new Map(); // hid + attr => ratio - schoolAttrsByAttrId: Map = new Map(); // attrId => hid + attr - schoolAttrsByHid: Map = new Map(); // hid => hid + attr - scrollAttrs: Map = new Map(); // hid + attr => ratio - scrollAttrsByAttrId: Map = new Map(); // attrId => hid + attr - scrollAttrsByHid: Map = new Map(); // hid => hid + attr + data: CalCeData; constructor(roleId: string) { this.roleId = roleId; } - private getGlobalAttrById(attrId: number) { - if(!this.globalAttrs.has(attrId)) { - if(ABI_TYPE_MAIN.indexOf(attrId) != -1) { - let obj = new GlobalMainAttr(attrId); - this.globalAttrs.set(attrId, obj); - } else { - let obj = new GlobalSubAttr(attrId); - this.globalAttrs.set(attrId, obj); - } - } - return this.globalAttrs.get(attrId); + public setRoleCe(roleCe: RoleCeType) { + this.data = new CalCeData(roleCe) + this.originCes = this.calHeroCe(); } - - private getHeroAttrsByHid(hid: number) { - let keys = this.heroAttrsByHid.get(hid); - return keys.map(key => this.heroAttrs.get(key)); - } - - private getHeroAttrByHidAndId(hid: number, attrId: number) { - let key = `${hid}_${attrId}`; - if(!this.heroAttrs.has(key)) { - if(ABI_TYPE_MAIN.indexOf(attrId) != -1) { - let obj = new HeroMainAttr(hid, attrId); - this.heroAttrs.set(key, obj); - } else { - let obj = new HeroSubAttr(hid, attrId); - this.heroAttrs.set(key, obj); - } - - if(!this.heroAttrsByHid.has(hid)) { - this.heroAttrsByHid.set(hid, []); - } - this.heroAttrsByHid.get(hid).push(key); - } - return this.heroAttrs.get(key); - } - - private getEquipAttrByHidAndId(hid: number, eplaceId: number, attrId: number) { - let key = `${hid}_${eplaceId}_${attrId}`; - if(!this.equipAttrs.has(key)) { - if(ABI_TYPE_MAIN.indexOf(attrId) != -1) { - let obj = new EquipMainAttr(hid, attrId); - this.equipAttrs.set(key, obj); - } else { - let obj = new EquipSubAttr(hid, attrId); - this.equipAttrs.set(key, obj); - } - - if(!this.equipAttrsByHid.has(hid)) { - this.equipAttrsByHid.set(hid, []); - } - this.equipAttrsByHid.get(hid).push(key); - let key2 = `${hid}_${eplaceId}`; - if(!this.equipAttrsByHidAndEplace.has(key2)) { - this.equipAttrsByHidAndEplace.set(key2, { hid, eplaceId, keys: []}); - } - this.equipAttrsByHidAndEplace.get(key2).keys.push(key); - } - return this.equipAttrs.get(key); - } - - private getEquipAttrsByHidAndEplace(hid: number, eplaceId: number) { - let key2 = `${hid}_${eplaceId}`; - if(!this.equipAttrsByHidAndEplace.has(key2)) return [] - let { keys } = this.equipAttrsByHidAndEplace.get(key2); - return keys.map(key => this.equipAttrs.get(key)); - } - - 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 }); - if(!this.schoolAttrsByAttrId.has(attrId)) { - this.schoolAttrsByAttrId.set(attrId, []); - } - this.schoolAttrsByAttrId.get(attrId).push(key); - if(!this.schoolAttrsByHid.has(attrId)) { - this.schoolAttrsByHid.set(hid, []); - } - this.schoolAttrsByHid.get(hid).push(key); - } else { - this.schoolAttrs.get(key).ce = value; - } - } - - private getSchoolAttrsByHid(hid: number) { - let keys = this.schoolAttrsByHid.get(hid)||[]; - return keys.map(key => this.schoolAttrs.get(key)); - } - - private calSchoolAttrsToGlobal(attrId: number) { - let keys = this.schoolAttrsByAttrId.get(attrId)||[]; - let schoolResult = 0; - for(let key of keys) { - let { ce } = this.schoolAttrs.get(key); - schoolResult += ce; - } - let globalAttr = this.getGlobalAttrById(attrId); - 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); - if(!this.scrollAttrsByHid.has(attrId)) { - this.scrollAttrsByHid.set(hid, []); - } - this.scrollAttrsByHid.get(hid).push(key); - } else { - this.scrollAttrs.get(key).ce = value; - } - } - - private getScrollAttrsByHid(hid: number) { - let keys = this.scrollAttrsByHid.get(hid)||[]; - return keys.map(key => this.scrollAttrs.get(key)); - } - - 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 getRoleCeTable() { + return this.data.getRoleCeTable(this.roleId); } public calHeroCe() { let ces = new Map(); // hid => [{attrId, val}] - for(let [hid, keys] of this.heroAttrsByHid) { - let lv = this.heroLv.get(hid)||1; + for(let [hid, keys] of this.data.heroAttrsByHid) { + let lv = this.data.heroLv.get(hid)||1; for(let key of keys) { - let { attrId, mainBase = 0, subBase = 0, job = 0, starUp = 0, connect = 0, favour = 0, talent = 0, equipQuality = 0, equipStrength = 0, equipStar = 0, equipSuit = 0, jewel = 0, stone = 0 } = this.heroAttrs.get(key); - let { school = 0, teraph = 0, title = 0, scroll = 0, skin = 0 } = this.getGlobalAttrById(attrId); + let { attrId, mainBase = 0, subBase = 0, job = 0, starUp = 0, connect = 0, favour = 0, talent = 0, equipQuality = 0, equipStrength = 0, equipStar = 0, equipSuit = 0, jewel = 0, stone = 0 } = this.data.heroAttrs.get(key); + let { school = 0, teraph = 0, title = 0, scroll = 0, skin = 0 } = this.data.getGlobalAttrById(attrId); let val = 0; if(ABI_TYPE_MAIN.indexOf(attrId)) { // {[hp1 + lv * hp2 + hp3 * ( 1 + hp4 )] * (1 + hp5 ) + [( hp6 + hp7 ) * ( 1 + hp8 )] } * ( 1 + hp9 ) + hp10 + hp11 @@ -210,93 +68,14 @@ export class CalCe { if(ce != originCe) { heroCe.set(hid, { inc: ce - originCe, origin: originCe, ce }); roleInc += ce - originCe; - this.setHistoryCe(hid, ce); + this.data.setHistoryCe(hid, ce); } } return { heroCe, roleInc } } - private setHistoryCe(hid: number, ce: number) { - let historyCe = this.heroHistoryCe.get(hid)||0; - if(ce > historyCe) { - this.heroHistoryCe.set(hid, ce); - } - } - - public getRoleCeTable() { - let globalAttrs: AttrCell[] = []; - for(let [_, globalAttr] of this.globalAttrs) { - globalAttrs.push(globalAttr.getGlobalAttr()); - } - let heroAttrs: HeroAttr[] = []; - for(let [hid, keys] of this.heroAttrsByHid) { - let lv = this.heroLv.get(hid); - let historyCe = this.heroHistoryCe.get(hid)||0; - let objectId = this.heroObjectId.get(hid); - let attrs: AttrCell[] = []; - for(let key of keys) { - let heroAttr = this.heroAttrs.get(key); - attrs.push(heroAttr.getHeroAttrCell()); - } - heroAttrs.push({ - hid, lv, attrs, historyCe, objectId - }); - } - let equipAttrs: EquipAttr[] = []; - for(let [key2, { hid, eplaceId, keys }] of this.equipAttrsByHidAndEplace) { - let lv = this.equipLv.get(key2); - let attrs: AttrCell[] = []; - for(let key of keys) { - let equipAttr = this.equipAttrs.get(key); - attrs.push(equipAttr.getEquipAttrCell()); - } - equipAttrs.push({ - hid, eplaceId, lv, attrs - }); - } - let schoolAttrs: SchoolAttr[] = []; - for(let [_, { hid, attrId, ce }] of this.schoolAttrs) { - schoolAttrs.push({ hid, attrId, value: ce }); - } - return { - roleId: this.roleId, globalAttrs, heroAttrs, equipAttrs, schoolAttrs - } - } - - public setRoleCe(roleCe: RoleCeType) { - if(roleCe) { - for(let globalAttr of roleCe.globalAttrs) { - let obj = this.getGlobalAttrById(globalAttr.attrId); - obj.setByRoleCe(globalAttr); - } - for(let {hid, lv, attrs, historyCe, objectId } of roleCe.heroAttrs) { - this.heroLv.set(hid, lv); - this.heroHistoryCe.set(hid, historyCe); - this.heroObjectId.set(hid, objectId); - for(let cell of attrs) { - let obj = this.getHeroAttrByHidAndId(hid, cell.attrId); - obj.setByRoleCe(cell); - } - } - for(let { hid, eplaceId, lv, attrs } of roleCe.equipAttrs) { - this.equipLv.set(`${hid}_${eplaceId}`, lv); - for(let cell of attrs) { - let obj = this.getEquipAttrByHidAndId(hid, eplaceId, cell.attrId); - obj.setByRoleCe(cell); - } - } - for(let { hid, attrId, value } of roleCe.schoolAttrs) { - this.setSchoolAttrs(hid, attrId, value); - } - for(let { hid, attrId, value } of roleCe.scrollAttrs) { - this.setScrollAttrs(hid, attrId, value); - } - } - this.originCes = this.calHeroCe(); - } - public setResultHero(hero: HeroType) { - this.heroObjectId.set(hero.hid, hero._id); + this.data.setResultHero(hero); } public getResultCeArr() { @@ -315,7 +94,7 @@ export class CalCe { if(arr[i]) { let { hid, ce } = arr[i]; topLineup.push({ - hid, ce, hero: this.heroObjectId.get(hid) + hid, ce, hero: this.data.heroObjectId.get(hid) }); topLineupCe += ce; } @@ -323,66 +102,26 @@ export class CalCe { return { topLineup, topLineupCe }; } - private clearRoleAttr(field: string) { - for(let globalAttr of this.globalAttrs) { - globalAttr[field] = 0; - } - } - - private clearHeroAttrByHid(hid: number, field: string) { - let heroAttrs = this.getHeroAttrsByHid(hid); - for(let heroAttr of heroAttrs) { - heroAttr[field] = 0; - } - } - - private clearEquipAttrByHidAndEplace(hid: number, eplaceId: number, field: string) { - let equipAttrs = this.getEquipAttrsByHidAndEplace(hid, eplaceId); - for(let equipAttr of equipAttrs) { - let originNum = equipAttr[field]||0; - let heroAttr = this.getHeroAttrByHidAndId(hid, equipAttr.attrId); - if(heroAttr && heroAttr[field]) { - heroAttr[field] -= originNum; - } - equipAttr[field] = 0; - } - } - - private clearSchoolAttr(hid: number) { - let schoolAttrs = this.getSchoolAttrsByHid(hid); - for(let schoolAttr of schoolAttrs) { - schoolAttr.ce = 0; - this.calSchoolAttrsToGlobal(schoolAttr.attrId); - } - } - - private clearScrollAttr(hid: number) { - let scrollAttrs = this.getScrollAttrsByHid(hid); - for(let scrollAttr of scrollAttrs) { - scrollAttr.ce = 0; - this.calScrollAttrsToGlobal(scrollAttr.attrId); - } - } // 武将基础&成长 public setHeroBase(hid: number, skinId: number) { - this.clearHeroAttrByHid(hid, 'mainBase'); + this.data.clearHeroAttrByHid(hid, 'mainBase'); let dicHero = gameData.hero.get(skinId); for(let [attrId, value] of dicHero.baseAbilityArr) { - let heroAttr = this.getHeroAttrByHidAndId(hid, attrId); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId); heroAttr.mainBase = value; } } // 武将等级 public setHeroLv(hid: number, lv: number) { - this.heroLv.set(hid, lv); + this.data.heroLv.set(hid, lv); } // 星级相关 public setHeroStar(hid: number, job: number, quality: number, star: number, starStage: number, colorStar: number, colorStarStage: number) { - this.clearHeroAttrByHid(hid, 'starUp'); + this.data.clearHeroAttrByHid(hid, 'starUp'); let dicJob = gameData.job.get(job); let jobClass = dicJob.job_class; const isWake = colorStar > 0; // 是否觉醒,只要激活了觉醒,彩星就会 > 1 @@ -398,47 +137,47 @@ export class CalCe { } else { value = dicPreStar?.ceAttr.get(stage)||0; } - let heroAttr = this.getHeroAttrByHidAndId(hid, attrId); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId); heroAttr.starUp = value; }; } // 职业基础 public setJob(hid: number, job: number, jobStage: number) { - this.clearHeroAttrByHid(hid, 'job'); - this.clearHeroAttrByHid(hid, 'subBase'); + this.data.clearHeroAttrByHid(hid, 'job'); + this.data.clearHeroAttrByHid(hid, 'subBase'); 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); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); heroAttr.job = attr; } else { if(dicLastJob) { let { id, attr } = dicLastJob.ceAttr.get(i); - let heroAttr = this.getHeroAttrByHidAndId(hid, id); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); heroAttr.job = attr; } } } for(let { id, val } of dicJob.baseSubAttr) { - let heroAttr = this.getHeroAttrByHidAndId(hid, id); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); heroAttr.subBase = val; } } // 好感度 public setFavour(hid: number, favourLv: number, connections: Connect[]) { - this.clearHeroAttrByHid(hid, 'favour'); + this.data.clearHeroAttrByHid(hid, 'favour'); 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); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); heroAttr.favour = add; } } @@ -446,14 +185,14 @@ export class CalCe { // 羁绊 public setConnection(hid: number, shipId: number, connections: Connect[]) { - this.clearHeroAttrByHid(hid, 'connect'); + this.data.clearHeroAttrByHid(hid, '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); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); heroAttr.connect = val; } } @@ -463,24 +202,24 @@ export class CalCe { public setAddSkin(skinId: number) { let addSkin = gameData.fashion.get(skinId); for (let { id, number: val } of addSkin.globalAttr) { - let globalAttr = this.getGlobalAttrById(id); + let globalAttr = this.data.getGlobalAttrById(id); globalAttr.skin += val; } } // 天赋 public setTalent(hid: number, skins: HeroSkin[]) { - this.clearHeroAttrByHid(hid, 'talent'); + this.data.clearHeroAttrByHid(hid, 'talent'); 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); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId); heroAttr.talent = val; } } - private getTalentSeid(talent: Talent[]) { + public getTalentSeid(talent: Talent[]) { let seids = new Map(); // id, seids for(let { id, level } of talent) { let dicHeroTalent = gameData.heroTalent.get(id); @@ -507,11 +246,11 @@ export class CalCe { // 装备升品 public setEquipQuality(hid: number, eplaceId: number, equipId: number, quality: number, qualityStage: number) { - this.clearEquipAttrByHidAndEplace(hid, eplaceId, 'equipQuality'); + this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'equipQuality'); let dicEquipQuality = getEquipQualityIdByEquipIdAndPoint(equipId, quality, qualityStage); for(let { id, num } of dicEquipQuality.attribute) { - let equipAttr = this.getEquipAttrByHidAndId(hid, eplaceId, id); - let heroAttr = this.getHeroAttrByHidAndId(hid, id); + let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); heroAttr.equipQuality += num - equipAttr.equipQuality; equipAttr.equipQuality = num; } @@ -519,11 +258,11 @@ export class CalCe { // 装备强化 public setEquipStrength(hid: number, eplaceId: number, equipId: number, lv: number) { - this.clearEquipAttrByHidAndEplace(hid, eplaceId, 'equipStrengthen'); + this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'equipStrengthen'); let dicEquipStrenth = getEquipStrenthenAttr(equipId, lv); for(let { id, num } of dicEquipStrenth.attr) { - let equipAttr = this.getEquipAttrByHidAndId(hid, eplaceId, id); - let heroAttr = this.getHeroAttrByHidAndId(hid, id); + let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); heroAttr.equipStrength = num - equipAttr.equipStrengthen; equipAttr.equipStrengthen = num; } @@ -531,13 +270,13 @@ export class CalCe { // 装备精炼(升星) public setEquipStar(hid: number, eplaceId: number, equipId: number, star: number, starStage: number) { - this.clearEquipAttrByHidAndEplace(hid, eplaceId, 'equipStar'); + this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'equipStar'); let dicEquipStar = getEquipStarAttrByStage(equipId, star, starStage); if(dicEquipStar) { let { mainAttr, subAttr } = dicEquipStar; for(let { id, num } of [...mainAttr, ...subAttr]) { - let equipAttr = this.getEquipAttrByHidAndId(hid, eplaceId, id); - let heroAttr = this.getHeroAttrByHidAndId(hid, id); + let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); heroAttr.equipStar = num - equipAttr.equipStar; equipAttr.equipStar = num; } @@ -546,7 +285,7 @@ export class CalCe { // 装备套装 public setEquipSuit(hid: number, ePlace: EPlace[]) { - this.clearHeroAttrByHid(hid, 'equipSuit'); + this.data.clearHeroAttrByHid(hid, 'equipSuit'); let dicEquipSuit = getEquipSuitByHero(hid); let suitStars: number[] = []; for(let equipId of dicEquipSuit.equips) { @@ -562,14 +301,14 @@ export class CalCe { let { ratioUp } = this.addSeidEffect(seids); for(let [attrId, val] of ratioUp) { - let heroAttr = this.getHeroAttrByHidAndId(hid, attrId); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId); heroAttr.equipSuit = val; } } // 天晶 public setJewel(hid: number, eplaceId: number, stones: Stone[], jewel: JewelType) { - this.clearEquipAttrByHidAndEplace(hid, eplaceId, 'jewel'); + this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'jewel'); let seids: number[] = []; if(jewel) { for(let { id, seid, rand } of jewel.randSe) { @@ -580,14 +319,14 @@ export class CalCe { } let { ratioUp } = this.addSeidEffect(seids); for(let [attrId, val] of ratioUp) { - let equipAttr = this.getEquipAttrByHidAndId(hid, eplaceId, attrId); - let heroAttr = this.getHeroAttrByHidAndId(hid, attrId); + let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, attrId); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, attrId); heroAttr.jewel += val - equipAttr.jewel; equipAttr.jewel = val; } } - private isRandSeUnLock(jewelId: number, randSeId: number, stones: Stone[]) { + public isRandSeUnLock(jewelId: number, randSeId: number, stones: Stone[]) { let dicJewel = gameData.jewel.get(jewelId); let dicJewelCondition = getJewelConditionByLvAndSeId(dicJewel.lv, randSeId); let stoneCnt = 0, stoneLv = 0; @@ -603,13 +342,13 @@ export class CalCe { // 地玉 public setStone(hid: number, eplaceId: number, stones: Stone[]) { - this.clearEquipAttrByHidAndEplace(hid, eplaceId, 'stone'); + this.data.clearEquipAttrByHidAndEplace(hid, eplaceId, 'stone'); for(let { stone } of stones) { let dicStone = gameData.stone.get(stone); if(dicStone) { for(let { id, num } of dicStone.attribute) { - let equipAttr = this.getEquipAttrByHidAndId(hid, eplaceId, id); - let heroAttr = this.getHeroAttrByHidAndId(hid, id); + let equipAttr = this.data.getEquipAttrByHidAndId(hid, eplaceId, id); + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); heroAttr.stone += num - equipAttr.stone; equipAttr.stone = num; } @@ -620,21 +359,21 @@ export class CalCe { // 爵位 public setTitle(title: number) { - this.clearRoleAttr('title'); + this.data.clearRoleAttr('title'); let dicTitle = gameData.title.get(title)||{ mainAttrValue: new Map(), assiAttrValue: new Map() }; for(let [attrId, value] of dicTitle.mainAttrValue) { - let globalAttr = this.getGlobalAttrById(attrId); + let globalAttr = this.data.getGlobalAttrById(attrId); globalAttr.title = value; } for(let [attrId, value] of dicTitle.assiAttrValue) { - let globalAttr = this.getGlobalAttrById(attrId); + let globalAttr = this.data.getGlobalAttrById(attrId); globalAttr.title = value; } } // 神像相关 public setTeraph(teraphs: Teraph[]) { - this.clearRoleAttr('teraph'); + this.data.clearRoleAttr('teraph'); let teraphOfAttrId = new Map(); for(let teraph of teraphs) { for(let [attrId, value] of teraph.attr) { // 主属性 @@ -646,38 +385,38 @@ export class CalCe { } } for(let [attrId, value] of teraphOfAttrId) { - let globalAttr = this.getGlobalAttrById(attrId); + let globalAttr = this.data.getGlobalAttrById(attrId); globalAttr.teraph = value; } } // 名将谱 public setScroll(hid: number, scrollStar: number, scrollQuality: number, scrollColorStar: number) { - this.clearScrollAttr(hid); + this.data.clearScrollAttr(hid); 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); + this.data.setScrollAttrs(hid, attrId, value); + this.data.calScrollAttrsToGlobal(attrId); } } } // 百家学宫 public setSchool(isPutOn: boolean, hid: number, schoolId: number, star: number, colorStar: number, quality: number) { - this.clearSchoolAttr(hid); + this.data.clearSchoolAttr(hid); let dicSchool = gameData.school.get(schoolId); let dicSchoolRate = getSchoolRateByStar(star, colorStar, quality); for (let attrId of dicSchool.upAttribute) { if(ABI_TYPE_MAIN.includes(attrId)) { // 主属性 - this.setSchoolAttrs(hid, attrId, isPutOn?dicSchoolRate.mainAttrAPerent: 0); + this.data.setSchoolAttrs(hid, attrId, isPutOn?dicSchoolRate.mainAttrAPerent: 0); } else { - this.setSchoolAttrs(hid, attrId, isPutOn?dicSchoolRate.assiAttrAddValue: 0); + this.data.setSchoolAttrs(hid, attrId, isPutOn?dicSchoolRate.assiAttrAddValue: 0); } - this.calSchoolAttrsToGlobal(attrId); + this.data.calSchoolAttrsToGlobal(attrId); } } @@ -735,6 +474,288 @@ export class CalCe { } } +class CalCeData { + // 全局 + globalAttrs: Map = new Map(); // attrId => GlobalAttr + // 武将 + heroAttrs: Map = new Map(); // hid+attrId => HeroAttr + heroAttrsByHid: Map = new Map(); // hid => [hid+attrId] + heroLv: Map = new Map(); + heroHistoryCe: Map = new Map(); + heroObjectId: Map = new Map(); + // 装备 + equipAttrs: Map = new Map(); // hid+eplaceId+attrId => EquipAttr + equipAttrsByHid: Map = new Map(); // hid => [hid+eplaceId+attrId] + equipAttrsByHidAndEplace: Map = new Map(); // hid+eplaceId =>[hid+eplaceId+attrId] + equipAttrsByHidAndAttrId: Map = new Map(); // hid+attrId =>[hid+eplaceId+attrId] + equipLv: Map = new Map(); // hid+eplaceId => lv + // 百家学宫 + schoolAttrs: Map = new Map(); // hid + attr => ratio + schoolAttrsByAttrId: Map = new Map(); // attrId => hid + attr + schoolAttrsByHid: Map = new Map(); // hid => hid + attr + // 名将谱 + scrollAttrs: Map = new Map(); // hid + attr => ratio + scrollAttrsByAttrId: Map = new Map(); // attrId => hid + attr + scrollAttrsByHid: Map = new Map(); // hid => hid + attr + + constructor(roleCe: RoleCeType) { + if(roleCe) { + for(let globalAttr of roleCe.globalAttrs) { + let obj = this.getGlobalAttrById(globalAttr.attrId); + obj.setByRoleCe(globalAttr); + } + for(let {hid, lv, attrs, historyCe, objectId } of roleCe.heroAttrs) { + this.heroLv.set(hid, lv); + this.heroHistoryCe.set(hid, historyCe); + this.heroObjectId.set(hid, objectId); + for(let cell of attrs) { + let obj = this.getHeroAttrByHidAndId(hid, cell.attrId); + obj.setByRoleCe(cell); + } + } + for(let { hid, eplaceId, lv, attrs } of roleCe.equipAttrs) { + this.equipLv.set(`${hid}_${eplaceId}`, lv); + for(let cell of attrs) { + let obj = this.getEquipAttrByHidAndId(hid, eplaceId, cell.attrId); + obj.setByRoleCe(cell); + } + } + for(let { hid, attrId, value } of roleCe.schoolAttrs) { + this.setSchoolAttrs(hid, attrId, value); + } + for(let { hid, attrId, value } of roleCe.scrollAttrs) { + this.setScrollAttrs(hid, attrId, value); + } + } + } + + public getGlobalAttrById(attrId: number) { + if(!this.globalAttrs.has(attrId)) { + if(ABI_TYPE_MAIN.indexOf(attrId) != -1) { + let obj = new GlobalMainAttr(attrId); + this.globalAttrs.set(attrId, obj); + } else { + let obj = new GlobalSubAttr(attrId); + this.globalAttrs.set(attrId, obj); + } + } + return this.globalAttrs.get(attrId); + } + + public clearRoleAttr(field: string) { + for(let globalAttr of this.globalAttrs) { + globalAttr[field] = 0; + } + } + + public getHeroAttrsByHid(hid: number) { + let keys = this.heroAttrsByHid.get(hid); + return keys.map(key => this.heroAttrs.get(key)); + } + + public getHeroAttrByHidAndId(hid: number, attrId: number) { + let key = `${hid}_${attrId}`; + if(!this.heroAttrs.has(key)) { + if(ABI_TYPE_MAIN.indexOf(attrId) != -1) { + let obj = new HeroMainAttr(hid, attrId); + this.heroAttrs.set(key, obj); + } else { + let obj = new HeroSubAttr(hid, attrId); + this.heroAttrs.set(key, obj); + } + + if(!this.heroAttrsByHid.has(hid)) { + this.heroAttrsByHid.set(hid, []); + } + this.heroAttrsByHid.get(hid).push(key); + } + return this.heroAttrs.get(key); + } + + public clearHeroAttrByHid(hid: number, field: string) { + let heroAttrs = this.getHeroAttrsByHid(hid); + for(let heroAttr of heroAttrs) { + heroAttr[field] = 0; + } + } + + public getEquipAttrByHidAndId(hid: number, eplaceId: number, attrId: number) { + let key = `${hid}_${eplaceId}_${attrId}`; + if(!this.equipAttrs.has(key)) { + if(ABI_TYPE_MAIN.indexOf(attrId) != -1) { + let obj = new EquipMainAttr(hid, attrId); + this.equipAttrs.set(key, obj); + } else { + let obj = new EquipSubAttr(hid, attrId); + this.equipAttrs.set(key, obj); + } + + if(!this.equipAttrsByHid.has(hid)) { + this.equipAttrsByHid.set(hid, []); + } + this.equipAttrsByHid.get(hid).push(key); + let key2 = `${hid}_${eplaceId}`; + if(!this.equipAttrsByHidAndEplace.has(key2)) { + this.equipAttrsByHidAndEplace.set(key2, { hid, eplaceId, keys: []}); + } + this.equipAttrsByHidAndEplace.get(key2).keys.push(key); + } + return this.equipAttrs.get(key); + } + + public getEquipAttrsByHidAndEplace(hid: number, eplaceId: number) { + let key2 = `${hid}_${eplaceId}`; + if(!this.equipAttrsByHidAndEplace.has(key2)) return [] + let { keys } = this.equipAttrsByHidAndEplace.get(key2); + return keys.map(key => this.equipAttrs.get(key)); + } + + public clearEquipAttrByHidAndEplace(hid: number, eplaceId: number, field: string) { + let equipAttrs = this.getEquipAttrsByHidAndEplace(hid, eplaceId); + for(let equipAttr of equipAttrs) { + let originNum = equipAttr[field]||0; + let heroAttr = this.getHeroAttrByHidAndId(hid, equipAttr.attrId); + if(heroAttr && heroAttr[field]) { + heroAttr[field] -= originNum; + } + equipAttr[field] = 0; + } + } + + public setSchoolAttrs(hid: number, attrId: number, value: number) { + let key = `${hid}_${attrId}`; + if(!this.schoolAttrs.has(key)) { + this.schoolAttrs.set(key, { hid, attrId, ce: value }); + if(!this.schoolAttrsByAttrId.has(attrId)) { + this.schoolAttrsByAttrId.set(attrId, []); + } + this.schoolAttrsByAttrId.get(attrId).push(key); + if(!this.schoolAttrsByHid.has(attrId)) { + this.schoolAttrsByHid.set(hid, []); + } + this.schoolAttrsByHid.get(hid).push(key); + } else { + this.schoolAttrs.get(key).ce = value; + } + } + + public getSchoolAttrsByHid(hid: number) { + let keys = this.schoolAttrsByHid.get(hid)||[]; + return keys.map(key => this.schoolAttrs.get(key)); + } + + public calSchoolAttrsToGlobal(attrId: number) { + let keys = this.schoolAttrsByAttrId.get(attrId)||[]; + let schoolResult = 0; + for(let key of keys) { + let { ce } = this.schoolAttrs.get(key); + schoolResult += ce; + } + let globalAttr = this.getGlobalAttrById(attrId); + globalAttr.school = schoolResult; + } + + public clearSchoolAttr(hid: number) { + let schoolAttrs = this.getSchoolAttrsByHid(hid); + for(let schoolAttr of schoolAttrs) { + schoolAttr.ce = 0; + this.calSchoolAttrsToGlobal(schoolAttr.attrId); + } + } + + public 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); + if(!this.scrollAttrsByHid.has(attrId)) { + this.scrollAttrsByHid.set(hid, []); + } + this.scrollAttrsByHid.get(hid).push(key); + } else { + this.scrollAttrs.get(key).ce = value; + } + } + + public 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 clearScrollAttr(hid: number) { + let scrollAttrs = this.getScrollAttrsByHid(hid); + for(let scrollAttr of scrollAttrs) { + scrollAttr.ce = 0; + this.calScrollAttrsToGlobal(scrollAttr.attrId); + } + } + + public getScrollAttrsByHid(hid: number) { + let keys = this.scrollAttrsByHid.get(hid)||[]; + return keys.map(key => this.scrollAttrs.get(key)); + } + + public setHistoryCe(hid: number, ce: number) { + let historyCe = this.heroHistoryCe.get(hid)||0; + if(ce > historyCe) { + this.heroHistoryCe.set(hid, ce); + } + } + + public setResultHero(hero: HeroType) { + this.heroObjectId.set(hero.hid, hero._id); + } + + public getRoleCeTable(roleId: string) { + let globalAttrs: AttrCell[] = []; + for(let [_, globalAttr] of this.globalAttrs) { + globalAttrs.push(globalAttr.getGlobalAttr()); + } + let heroAttrs: HeroAttr[] = []; + for(let [hid, keys] of this.heroAttrsByHid) { + let lv = this.heroLv.get(hid); + let historyCe = this.heroHistoryCe.get(hid)||0; + let objectId = this.heroObjectId.get(hid); + let attrs: AttrCell[] = []; + for(let key of keys) { + let heroAttr = this.heroAttrs.get(key); + attrs.push(heroAttr.getHeroAttrCell()); + } + heroAttrs.push({ + hid, lv, attrs, historyCe, objectId + }); + } + let equipAttrs: EquipAttr[] = []; + for(let [key2, { hid, eplaceId, keys }] of this.equipAttrsByHidAndEplace) { + let lv = this.equipLv.get(key2); + let attrs: AttrCell[] = []; + for(let key of keys) { + let equipAttr = this.equipAttrs.get(key); + attrs.push(equipAttr.getEquipAttrCell()); + } + equipAttrs.push({ + hid, eplaceId, lv, attrs + }); + } + let schoolAttrs: SchoolAttr[] = []; + for(let [_, { hid, attrId, ce }] of this.schoolAttrs) { + schoolAttrs.push({ hid, attrId, value: ce }); + } + return { + roleId, globalAttrs, heroAttrs, equipAttrs, schoolAttrs + } + } +} + abstract class GlobalAllAttr { attrId: number; school: number = 0;