diff --git a/gm-server/app/service/users.ts b/gm-server/app/service/users.ts index e7803be33..5b26dbb18 100644 --- a/gm-server/app/service/users.ts +++ b/gm-server/app/service/users.ts @@ -25,7 +25,7 @@ import { ITID, COUNTER } from '@consts'; import Actor from '@pubUtils/actor'; import { ItemModel } from '@db/Item'; import { gameData } from '@pubUtils/data'; -import { calPlayerCeAndSave, getAllAttrStage } from '@pubUtils/playerCe'; +import { calPlayerCeAndSave } from '@pubUtils/playerCe'; /** * Test Service @@ -213,7 +213,7 @@ export default class GMUsers extends Service { try { for(let heroInfo of heroInfos) { let hero = await HeroModel.createHero(heroInfo); - await calPlayerCeAndSave(hero.roleId, [hero], HERO_SYSTEM_TYPE.STAR, getAllAttrStage()); + await calPlayerCeAndSave(heroInfo.roleId, [hero], HERO_SYSTEM_TYPE.INIT); } return ctx.service.utils.resResult(STATUS.SUCCESS, { uids }); } catch(e) { diff --git a/shared/consts/constModules/heroConst.ts b/shared/consts/constModules/heroConst.ts index dce66e9b8..780cf7f4e 100644 --- a/shared/consts/constModules/heroConst.ts +++ b/shared/consts/constModules/heroConst.ts @@ -1,6 +1,7 @@ //武将养成系统分类 export const HERO_SYSTEM_TYPE = { - STAR: 1, + INIT: 1, + STAR: 2, TRAIN: 5, STAGEUP:6, SKIN:7, @@ -10,7 +11,8 @@ export const HERO_SYSTEM_TYPE = { EQUIP_BASE: 11, RESTRENGTHEN: 12, JEWEL_ON: 13, - JEWEL_OFF: 14 + JEWEL_OFF: 14, + ADD_SKIN: 15 }; // 武将上限 diff --git a/shared/pubUtils/playerCe.ts b/shared/pubUtils/playerCe.ts index 987aba31c..39166bd47 100644 --- a/shared/pubUtils/playerCe.ts +++ b/shared/pubUtils/playerCe.ts @@ -27,7 +27,9 @@ export function calPlayerCe(globalCeAttr: CeAttr, hero: HeroType, type: number, let addSeidList = new Array(); let removeSeidList = new Array(); - if (type == HERO_SYSTEM_TYPE.STAR) { + if (type == HERO_SYSTEM_TYPE.INIT) { + reIncAttr = calHeroInitIncAttr(hero, addSeidList, removeSeidList); // args: 升的星盘 + } else if (type == HERO_SYSTEM_TYPE.STAR) { reIncAttr = calHeroStarIncAttr(hero, args, addSeidList); // args: 升的星盘 } else if (type == HERO_SYSTEM_TYPE.TRAIN) { reIncAttr = calHeroTrainIncAttr(hero); @@ -49,6 +51,8 @@ export function calPlayerCe(globalCeAttr: CeAttr, hero: HeroType, type: number, reIncAttr = calHeroCeWhenJewelOn(hero, args); } else if (type == HERO_SYSTEM_TYPE.JEWEL_OFF) {//宝石卸下 reIncAttr = calHeroCeWhenJewelOff(hero, args); + } else { + reIncAttr = hero.ceAttr; } addSeidEffect(reIncAttr, hero.ceAttr, addSeidList, removeSeidList); // 处理加值 @@ -71,9 +75,24 @@ export function calPlayerCe(globalCeAttr: CeAttr, hero: HeroType, type: number, //修改并下发战力 export async function calPlayerCeAndSave(roleId: string, heros: Array, type?: number, args?: Array) { + if(!heros.length) heros = await HeroModel.findByRole(roleId); + let incPlayerCe = 0; let pushHeros = new Array<{hid: number, ce: number, incHeroCe: number}>(); let role = await RoleModel.findByRoleId(roleId); + if(!role.globalCeAttr) role.globalCeAttr = new CeAttr(); + + let reIncAttr: CeAttr = {}; // role表属性增量 + + if (type == HERO_SYSTEM_TYPE.INIT) { + reIncAttr = calRoleInitIncAttr(heros, role.globalCeAttr); // 全局变量增 + } + + for (let attrName in reIncAttr) { + role.globalCeAttr[attrName].fixUp = reIncAttr[attrName].fixUp; + role.globalCeAttr[attrName].ratioUp = reIncAttr[attrName].ratioUp; + } + for (let hero of heros) { let incHeroCe = calPlayerCe(role.globalCeAttr, hero, type, args); incPlayerCe += incHeroCe; @@ -85,10 +104,46 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array, }); } role.ce += incPlayerCe; - await RoleModel.updateRoleInfo(roleId, role); + await RoleModel.updateRoleInfo(roleId, {globalCeAttr: role.globalCeAttr, ce: role.ce}); return {pushHeros, role} } +// 初始战力 +export function calHeroInitIncAttr(hero: HeroType, addSeidList: Array, removeSeidList: Array) { + let res1 = calHeroStarIncAttr(hero, getAllAttrStage(), addSeidList); + let hero1 = combineHeroCeAttr(hero, res1) + calHeroJobStageUpIncAttr(hero1, [0], addSeidList, removeSeidList); + + console.log(JSON.stringify(res1)); + return res1 +} + +export function calRoleInitIncAttr(heros: HeroType[], globalCeAttr: CeAttr) { + let args = new Array(); + for(let hero of heros) { + for(let skin of hero.skins) { + args.push(skin.id); + } + } + let res = calHeroAddSkin(args, globalCeAttr); + return res; +} + +// 将hero的ceAttr暂时更新,不更新在originalHero本体上 +function combineHeroCeAttr(originalHero: HeroType, result: CeAttr) { + let hero = deepCopy(originalHero); + if(!hero.ceAttr) hero.ceAttr = new CeAttr(); + for (let attrName in result) { + if(!result[attrName]) continue; + if(!hero.ceAttr[attrName]) hero.ceAttr[attrName] = new CeAttrData(); + for (let attrKey in result[attrName]) { + hero.ceAttr[attrName][attrKey] = parseInt(result[attrName][attrKey]||0); + } + } + delete hero._id; + return hero; +} + export function calHeroStarIncAttr (hero: HeroType, args: Array, addSeidList: Array) { let {star, starStage, quality, colorStar, colorStarStage, ceAttr} = hero; let res: CeAttr = {}; @@ -165,7 +220,7 @@ export function calHeroTrainIncAttr(hero: HeroType) { //进阶 export function calHeroJobStageUpIncAttr(hero: HeroType, args: Array, addSeidList: Array, removeSeidList: Array) { let res: CeAttr = {}; - let lastJob = gameData.job.get(args[0]); + let lastJob = gameData.job.get(args[0])||{seid:[]}; let currentJob = gameData.job.get(hero.job); for (let seid of currentJob.seid) { let index = _.findIndex(lastJob.seid, seid); diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index b268f2a61..8e797a170 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -269,7 +269,7 @@ export function getRefTime(now = new Date(), hour: number, day = 0) { * @param cnt 返回随机元素个数 */ export function getRandEelm(source: Array = [], cnt = 1): Array { - if (cnt > source.length) return []; + if (cnt > source.length || cnt == 0 ) return []; if (cnt === source.length) return source; let idxs = new Set(); diff --git a/web-server/app/service/Auth.ts b/web-server/app/service/Auth.ts index 4f87e2f38..08acd1d65 100644 --- a/web-server/app/service/Auth.ts +++ b/web-server/app/service/Auth.ts @@ -8,7 +8,7 @@ import { smsModel } from '@db/Sms'; import { Service } from 'egg'; import Counter from '@db/Counter'; import { getHeroInfoById } from 'app/pubUtils/gamedata'; -import { calPlayerCeAndSave, getAllAttrStage } from 'app/pubUtils/playerCe'; +import { calPlayerCeAndSave } from 'app/pubUtils/playerCe'; const _ = require('underscore'); /** @@ -149,7 +149,7 @@ export default class Auth extends Service { roleId, roleName: role.roleName, hid, hName, star, quality, job, serverId: role.serverId, skins:[{id: initialSkin, enable: true}] }); - await calPlayerCeAndSave(roleId, [hero], HERO_SYSTEM_TYPE.STAR, getAllAttrStage()); + await calPlayerCeAndSave(roleId, [hero], HERO_SYSTEM_TYPE.INIT); } return ctx.service.utils.resResult(STATUS.SUCCESS, { roleId: role.roleId }); }