战力:操作细节

This commit is contained in:
luying
2022-03-28 20:28:47 +08:00
parent 14b28921af
commit 1ccb66e3eb
7 changed files with 267 additions and 63 deletions

View File

@@ -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);

View File

@@ -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'])
});
}

View File

@@ -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<number, HeroUpdate>, 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;

View File

@@ -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<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
scrollAttrs: Map<string, { hid: number, attrId: number, ce: number }> = new Map(); // hid + attr => ratio
scrollAttrsByAttrId: Map<number, string[]> = 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<number, { id: number, val: number }[]>(); // 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<number, number[]>(); // 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);
}

View File

@@ -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);

View File

@@ -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, // 名将谱

View File

@@ -23,8 +23,10 @@ export interface DicJob {
readonly trainingConsume: Array<RewardInter>;
// 升阶消耗
readonly upGradeConsume: Array<RewardInter>;
// 每阶升级属性
// 每阶升级属性 stage => {}
readonly ceAttr: Map<number, {id: number, attr: number}>;
// 次级属性基础 attr => value attr1
readonly baseSubAttr: {id: number, val: number}[];
// 一共有多少阶升级
readonly maxStage: number;
// 到这一阶能获得多少天赋点
@@ -32,7 +34,7 @@ export interface DicJob {
}
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicJobKeys: KeysEnum<DicJob> = {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<DicJob> = {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<number, DicJob>();
export const jobClassMaxGrades = new Map<number, {grade:number, jobid:number}>();
@@ -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
}
}
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
}