战力:操作细节
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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'])
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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, // 名将谱
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user