战力:整理

This commit is contained in:
luying
2022-03-29 18:08:50 +08:00
parent 3496d664e8
commit ef731fc979

View File

@@ -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<number, GlobalMainAttr|GlobalSubAttr> = new Map(); // attrId => GlobalAttr
heroAttrs: Map<string, HeroMainAttr|HeroSubAttr> = new Map(); // hid+attrId => HeroAttr
heroAttrsByHid: Map<number, string[]> = new Map(); // hid => [hid+attrId]
equipAttrs: Map<string, EquipMainAttr|EquipSubAttr> = new Map(); // hid+eplaceId+attrId => EquipAttr
equipAttrsByHid: Map<number, string[]> = new Map(); // hid => [hid+eplaceId+attrId]
equipAttrsByHidAndEplace: Map<string, { hid: number, eplaceId: number, keys: string[]}> = new Map(); // hid+eplaceId =>[hid+eplaceId+attrId]
equipAttrsByHidAndAttrId: Map<string, { hid: number, attrId: number, keys: string[]}> = new Map(); // hid+attrId =>[hid+eplaceId+attrId]
heroLv: Map<number, number> = new Map();
heroHistoryCe: Map<number, number> = new Map();
heroObjectId: Map<number, string> = new Map();
equipLv: Map<string, number> = new Map(); // hid+eplaceId => lv
originCes: Map<number, number> = new Map(); // hid => ce
resultCes: Map<number, number> = new Map(); // hid => ce
schoolAttrs: Map<string, { hid: number, attrId: number, ce: number }> = new Map(); // hid + attr => ratio
schoolAttrsByAttrId: Map<number, string[]> = new Map(); // attrId => hid + attr
schoolAttrsByHid: Map<number, string[]> = new Map(); // hid => hid + attr
scrollAttrs: Map<string, { hid: number, attrId: number, ce: number }> = new Map(); // hid + attr => ratio
scrollAttrsByAttrId: Map<number, string[]> = new Map(); // attrId => hid + attr
scrollAttrsByHid: Map<number, string[]> = 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<number, { id: number, val: number }[]>(); // 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<number, number[]>(); // 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<number, number>();
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<number, GlobalMainAttr|GlobalSubAttr> = new Map(); // attrId => GlobalAttr
// 武将
heroAttrs: Map<string, HeroMainAttr|HeroSubAttr> = new Map(); // hid+attrId => HeroAttr
heroAttrsByHid: Map<number, string[]> = new Map(); // hid => [hid+attrId]
heroLv: Map<number, number> = new Map();
heroHistoryCe: Map<number, number> = new Map();
heroObjectId: Map<number, string> = new Map();
// 装备
equipAttrs: Map<string, EquipMainAttr|EquipSubAttr> = new Map(); // hid+eplaceId+attrId => EquipAttr
equipAttrsByHid: Map<number, string[]> = new Map(); // hid => [hid+eplaceId+attrId]
equipAttrsByHidAndEplace: Map<string, { hid: number, eplaceId: number, keys: string[]}> = new Map(); // hid+eplaceId =>[hid+eplaceId+attrId]
equipAttrsByHidAndAttrId: Map<string, { hid: number, attrId: number, keys: string[]}> = new Map(); // hid+attrId =>[hid+eplaceId+attrId]
equipLv: Map<string, number> = new Map(); // hid+eplaceId => lv
// 百家学宫
schoolAttrs: Map<string, { hid: number, attrId: number, ce: number }> = new Map(); // hid + attr => ratio
schoolAttrsByAttrId: Map<number, string[]> = new Map(); // attrId => hid + attr
schoolAttrsByHid: Map<number, string[]> = new Map(); // hid => hid + attr
// 名将谱
scrollAttrs: Map<string, { hid: number, attrId: number, ce: number }> = new Map(); // hid + attr => ratio
scrollAttrsByAttrId: Map<number, string[]> = new Map(); // attrId => hid + attr
scrollAttrsByHid: Map<number, string[]> = 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;