diff --git a/game-server/app/servers/battle/handler/dailyBattleHandler.ts b/game-server/app/servers/battle/handler/dailyBattleHandler.ts index 9697a62fd..00943a03c 100644 --- a/game-server/app/servers/battle/handler/dailyBattleHandler.ts +++ b/game-server/app/servers/battle/handler/dailyBattleHandler.ts @@ -77,7 +77,7 @@ export class DailyBattleHandler { if(vLv > 0) { timesCanBuy += 0; // 暂留,用于处理vip等级增加最大购买次数 } - if(buyCount + 1 > curDaily.timesCanBuy ) { + if(buyCount + count > timesCanBuy ) { return resResult(STATUS.DAILY_REFRESH_TIMES_LACK) } let buyCost = 0; diff --git a/game-server/app/servers/battle/handler/dungeonBattleHandler.ts b/game-server/app/servers/battle/handler/dungeonBattleHandler.ts new file mode 100644 index 000000000..30f70f66a --- /dev/null +++ b/game-server/app/servers/battle/handler/dungeonBattleHandler.ts @@ -0,0 +1,71 @@ +import { Application, BackendSession } from 'pinus'; +import { GOLD_COST_RATIO, DUNGEON_CONST } from '../../../consts/consts'; +import { STATUS } from '../../../consts/statusCode'; +import { resResult, calculateNum, shouldRefresh } from '../../../pubUtils/util'; +import { RoleModel } from '../../../db/Role'; + +export default function(app: Application) { + return new DungeonBattleHandler(app); +} + +export class DungeonBattleHandler { + constructor(private app: Application) { + } + + // 获取关卡列表 + async getData(msg: { }, session: BackendSession) { + let roleId = session.get('roleId'); + let { dungeonCnt = 0, dungeonBuyCnt = 0, dungeonRefTime } = await RoleModel.findByRoleId(roleId); + let curTime = new Date(); + if(shouldRefresh(dungeonRefTime, curTime, DUNGEON_CONST.REFRESH_TIME)) { + dungeonCnt = 0; dungeonBuyCnt = 0; + } + + let nextCostGold = calculateNum(GOLD_COST_RATIO.DUNGRON_BUY_NUM, {num: dungeonBuyCnt + 1 }, 50); + return resResult(STATUS.SUCCESS, { + nextCostGold, + battleCount: DUNGEON_CONST.MAX_CNT + dungeonBuyCnt - dungeonCnt, + buyCount: DUNGEON_CONST.MAX_BUY_CNT - dungeonBuyCnt + }); + } + + // 购买每日次数 + async buyNum(msg: { count: number }, session: BackendSession) { + let { count } = msg; + const roleId = session.get('roleId'); + let { dungeonCnt = 0, dungeonBuyCnt = 0, dungeonRefTime } = await RoleModel.findByRoleId(roleId); + let curTime = new Date(); + let needRefresh = shouldRefresh(dungeonRefTime, curTime, DUNGEON_CONST.REFRESH_TIME); + if(needRefresh) { + dungeonCnt = 0; dungeonBuyCnt = 0; + } + + let timesCanBuy = DUNGEON_CONST.MAX_BUY_CNT; + let { vLv } = await RoleModel.findByRoleId(roleId); + if(vLv > 0) { + timesCanBuy += 0; // 暂留,用于处理vip等级增加最大购买次数 + } + if(dungeonBuyCnt + count > timesCanBuy ) { + return resResult(STATUS.DUNGEON_REFRESH_TIMES_LACK) + } + let buyCost = 0; + for(let i = 1; i <= count; i++) { + let num = dungeonBuyCnt + i; + buyCost += calculateNum(GOLD_COST_RATIO.DUNGRON_BUY_NUM, {num}, 50); + } + let {gold} = await RoleModel.findByRoleId(roleId); + if(buyCost > gold) { + return resResult(STATUS.DAILY_REFRESH_GOLD_LACK); + } + await RoleModel.costGold(roleId, buyCost); + await RoleModel.buyCnt(roleId, needRefresh, count, curTime); + + let nextCostGold = calculateNum(GOLD_COST_RATIO.DUNGRON_BUY_NUM, {num: dungeonBuyCnt + count + 1 }, 50); + return resResult(STATUS.SUCCESS, { + costGold: buyCost, + nextCostGold, + battleCount: DUNGEON_CONST.MAX_CNT + dungeonBuyCnt + count - dungeonCnt, + buyCount: DUNGEON_CONST.MAX_BUY_CNT - dungeonBuyCnt - count + }); + } +} \ No newline at end of file diff --git a/game-server/app/servers/battle/handler/normalBattleHandler.ts b/game-server/app/servers/battle/handler/normalBattleHandler.ts index 7c78b9422..dba25cf70 100644 --- a/game-server/app/servers/battle/handler/normalBattleHandler.ts +++ b/game-server/app/servers/battle/handler/normalBattleHandler.ts @@ -15,6 +15,7 @@ import { HeroModel } from '../../../db/Hero'; import { RoleModel } from '../../../db/Role'; import { RScriptRecordModel } from '../../../db/RScriptRecord'; import { updateWarStar, checkBattleHeroes, roleLevelup } from '../../../services/normalBattleService'; +import { checkDungeonNum, checkDungeonAndIncrease } from '../../../services/dungeonService'; export default function(app: Application) { return new NormalBattleHandler(app); @@ -46,8 +47,9 @@ export class NormalBattleHandler { // 前置关卡是否挑战过 let previousGk = warInfo.previousGk; if(previousGk) { - let preBattle = await BattleRecordModel.getBattleRecordByIdAndStatus(roleId, previousGk, 1); - if(!preBattle) return resResult(STATUS.BATTLE_NEED_PREVIOUS_GK); + let {warStar} = await RoleModel.findByRoleId(roleId); + let preBattle = warStar.findIndex(cur => cur.id == previousGk); + if(preBattle == -1) return resResult(STATUS.BATTLE_NEED_PREVIOUS_GK); } let checkHeroes = await checkBattleHeroes(roleId, heroes); @@ -56,6 +58,7 @@ export class NormalBattleHandler { const battleCode = genCode(8); // 关卡唯一值 let dailyNum = {}; let towerData = {}; + let dungeonNum = {}; if(warInfo.warType == WAR_TYPE.DAILY) { let checkResult = await checkDaily(roleId, battleId, 1); if(checkResult.status == -1) { @@ -75,6 +78,12 @@ export class NormalBattleHandler { if(checkResult.status == -1) { return checkResult.resResult } + } else if (warInfo.warType == WAR_TYPE.MYSTERY || warInfo.warType == WAR_TYPE.MYSTERY_ELITE) { + let checkResult = await checkDungeonNum(roleId, 1); + if(checkResult.status == -1) { + return checkResult.resResult + } + dungeonNum = Object.assign(dungeonNum, checkResult.data); } const BattleRecord = await BattleRecordModel.updateBattleRecordByCode(battleCode, { @@ -91,7 +100,7 @@ export class NormalBattleHandler { return resResult(STATUS.SUCCESS, { - battleId, battleCode, status, apJson, dailyNum, towerData + battleId, battleCode, status, apJson, dailyNum, towerData, dungeonNum }); } @@ -176,10 +185,12 @@ export class NormalBattleHandler { let channelService = this.app.get('channelService'); + let warReward = new WarReward(roleId, roleName, battleId, isSuccess); + let dailyNum = {}; - let towerRec = null; let towerStatus = null; - let towerReward = null; + let dungeonNum = {}; + if(warInfo.warType == WAR_TYPE.DAILY) { let checkResult = await checkDailyAndIncrease(roleId, battleId, 1, false); if(checkResult.status == -1) { @@ -195,24 +206,27 @@ export class NormalBattleHandler { if(towerEndResult.status == -1) { return towerEndResult.resResult; } - towerRec = towerEndResult.data.newRec; towerStatus = towerEndResult.data.towerStatus; - towerReward = towerEndResult.data.towerReward; + if(towerEndResult.data.towerReward) + warReward.setFixReward(towerEndResult.data.towerReward) } + } else if (warInfo.warType == WAR_TYPE.MYSTERY || warInfo.warType == WAR_TYPE.MYSTERY_ELITE) { + let checkResult = await checkDungeonAndIncrease(roleId, 1, false); + if(checkResult.status == -1) { + return checkResult.resResult; + } + dungeonNum = Object.assign(dungeonNum, checkResult.data) } - let warReward = new WarReward(roleId, roleName, battleId, isSuccess); - if(isSuccess) { // 挑战胜利 // 是否首通 - let condition1 = await BattleRecordModel.getBattleRecordByIdAndStatus(roleId, battleId, 1); + let {warStar} = await RoleModel.findByRoleId(roleId); + let condition1 = warStar.find(cur => cur.id == battleId); if(!condition1) warReward.setCondition(0, true); // 是否首次3星 - if(star == 3) { - let condition2 = await BattleRecordModel.getBattleRecordByIdAndStar(roleId, battleId, 3); - if(!condition2) warReward.setCondition(1, true); + if(star == 3 && (!condition1 || condition1.star != 3)) { + warReward.setCondition(1, true); } - if(towerReward) warReward.setFixReward(towerReward); await updateWarStar(roleId, battleId, warInfo.warType, star); } @@ -226,20 +240,13 @@ export class NormalBattleHandler { let actordata = await roleLevelup(roleId, isSuccess?warInfo.kingExp:0);// 主公升级经验 - let curHeroes = []; - for(let hid of heroes) { - let hero = await HeroModel.findByHidAndRole(hid, roleId); - curHeroes.push(hero); - } - // 返回值: // towerStatus: false-本层未通过, true-本层已通过 return resResult(STATUS.SUCCESS, { - battleCode, battleId, status, towerStatus, + battleCode, battleId, status, ...reward, apJson, - dailyNum, - heroes: curHeroes, + towerStatus, dailyNum, dungeonNum, ...actordata }); } @@ -254,8 +261,9 @@ export class NormalBattleHandler { return resResult(STATUS.BATTLE_MISS_INFO); } // 校验是否三星通关过 - let condition1 = await BattleRecordModel.getBattleRecordByIdAndStar(roleId, battleId, 3); - if(!condition1) { + let { warStar } = await RoleModel.findByRoleId(roleId); + let curWar = warStar.find(cur => cur.id == battleId); + if(!curWar || curWar.star != 3) { return resResult(STATUS.BATTLE_SWEEP_CONDITION_STAR); } @@ -271,12 +279,19 @@ export class NormalBattleHandler { // 扫荡次数 let dailyNum = {}; + let dungeonNum = {}; if(warInfo.warType == WAR_TYPE.DAILY) { let checkResult = await checkDailyAndIncrease(roleId, battleId, count, true); if(checkResult.status == -1) { return checkResult.resResult } dailyNum = Object.assign(dailyNum, checkResult.data) + } else if(warInfo.warType == WAR_TYPE.MYSTERY|| warInfo.warType == WAR_TYPE.MYSTERY_ELITE) { + let checkResult = await checkDungeonAndIncrease(roleId, count, true); + if(checkResult.status == -1) { + return checkResult.resResult + } + dungeonNum = Object.assign(dungeonNum, checkResult.data) } // 发奖励 @@ -299,7 +314,7 @@ export class NormalBattleHandler { battleId, count, ...result, apJson, - dailyNum, + dailyNum, dungeonNum, ...actordata }); } diff --git a/game-server/app/services/dailyBattleService.ts b/game-server/app/services/dailyBattleService.ts index 3485e44f7..53fb5cfdc 100644 --- a/game-server/app/services/dailyBattleService.ts +++ b/game-server/app/services/dailyBattleService.ts @@ -72,5 +72,5 @@ export async function getDailyNum(dailyRecord: DailyRecord, timesPerDay?: number if(vLv > 0) { timesCanBuy += 0; // 暂留,用于处理vip等级增加最大购买次数 } - return {count: timesPerDay - count + buyCount, buyCount: timesCanBuy - buyCount} + return {battleCount: timesPerDay - count + buyCount, buyCount: timesCanBuy - buyCount} } \ No newline at end of file diff --git a/game-server/app/services/dungeonService.ts b/game-server/app/services/dungeonService.ts new file mode 100644 index 000000000..9f5e0e651 --- /dev/null +++ b/game-server/app/services/dungeonService.ts @@ -0,0 +1,55 @@ +/** + * 每日本相关 + */ + +import { resResult, shouldRefresh } from '../pubUtils/util'; +import { STATUS } from '../consts/statusCode'; +import { RoleModel } from '../db/Role'; +import { DUNGEON_CONST } from '../consts/consts'; + +// 检查秘境本次数checkBattle使用 +export async function checkDungeonNum(roleId: string, inc: number) { + let { dungeonCnt = 0, dungeonBuyCnt = 0, dungeonRefTime } = await RoleModel.findByRoleId(roleId); + let curTime = new Date(); + let needRefresh = shouldRefresh(dungeonRefTime, curTime, DUNGEON_CONST.REFRESH_TIME); + if(needRefresh) { + dungeonCnt = 0; dungeonBuyCnt = 0; + } + if(dungeonCnt + inc > DUNGEON_CONST.MAX_CNT + dungeonBuyCnt) { + return {status: -1, resResult: resResult(STATUS.DUNGEON_TIMES_LACK)} + } + await RoleModel.increaseDungeonCnt(roleId, needRefresh, 0, curTime); + + return { status: 0, data: { + battleCount: DUNGEON_CONST.MAX_CNT + dungeonBuyCnt - dungeonCnt, + buyCount: DUNGEON_CONST.MAX_BUY_CNT - dungeonBuyCnt + }}; +} + +/** + * 检查秘境本次数并添加,warEnd和warSweep使用 + * @param roleId + * @param inc 增加的次数 + * @param isRef 在计算之前是否检查每日的刷新 + */ + +export async function checkDungeonAndIncrease(roleId: string, inc: number, isRef: boolean) { + + let { dungeonCnt = 0, dungeonBuyCnt = 0, dungeonRefTime } = await RoleModel.findByRoleId(roleId); + let curTime = new Date(); + + let needRefresh = isRef && shouldRefresh(dungeonRefTime, curTime, DUNGEON_CONST.REFRESH_TIME); + if(needRefresh) { + dungeonCnt = 0; dungeonBuyCnt = 0; + } + + if(dungeonCnt + inc > DUNGEON_CONST.MAX_CNT + dungeonBuyCnt ) { + return { status: -1, resResult: resResult(STATUS.DUNGEON_TIMES_LACK) } + } + console.log('needRefresh', needRefresh); + await RoleModel.increaseDungeonCnt(roleId, needRefresh, inc, curTime); + return {status: 1, data: { + battleCount: DUNGEON_CONST.MAX_CNT + dungeonBuyCnt - dungeonCnt - inc, + buyCount: DUNGEON_CONST.MAX_BUY_CNT - dungeonBuyCnt + }}; +} \ No newline at end of file diff --git a/game-server/app/services/warRewardService.ts b/game-server/app/services/warRewardService.ts index bf7c0a63b..412934677 100644 --- a/game-server/app/services/warRewardService.ts +++ b/game-server/app/services/warRewardService.ts @@ -41,29 +41,35 @@ export class WarReward { } public setFixReward(reward: string) { - let last = this.fixReward.substr(this.fixReward.length - 1, 1); - if(this.fixReward.length && last == '&') { + let str = this.fixReward; + let last = str.substr(str.length-1, 1); + if(last == '&') str = str.substr(0, str.length - 1); + if(str.length) { this.fixReward += reward; } else { - this.fixReward += '&' + reward; + this.fixReward += '|' + reward; } } public setConditionReward(reward: string) { - let last = this.conditionReward.substr(this.fixReward.length - 1, 1); - if(last == '&') { + let str = this.conditionReward; + let last = str.substr(str.length-1, 1); + if(last == '&') str = str.substr(0, str.length - 1); + if(str.length) { this.conditionReward += reward; } else { - this.conditionReward += '&' + reward; + this.conditionReward += '|' + reward; } } public setRandomReward(reward: string) { - let last = this.randomReward.substr(this.fixReward.length - 1, 1); - if(last == '&') { + let str = this.randomReward; + let last = str.substr(str.length-1, 1); + if(last == '&') str = str.substr(0, str.length - 1); + if(str.length) { this.randomReward += reward; } else { - this.randomReward += '&' + reward; + this.randomReward += '|' + reward; } } diff --git a/shared/consts/consts.ts b/shared/consts/consts.ts index 7f2c630f9..02a0ba3b4 100644 --- a/shared/consts/consts.ts +++ b/shared/consts/consts.ts @@ -93,7 +93,8 @@ export const WAR_TYPE = { PVP: 9, // PVP GUILD_TIMER: 10, // 军团定时副本 GUILD_WEEKLY: 11, // 军团周副本 - MAIN_ELITE: 12 // 主线精英 + MAIN_ELITE: 12, // 主线精英 + MYSTERY_ELITE: 13 // 秘境精英 }; // 事件,是否开启保存随机记录方式 @@ -144,15 +145,21 @@ export const HANG_UP_CONSTS = { } export const TOWER_TASK_CONST = { - REFRESH_TIME: 5, - RAND_CNT: 8, - MAX_TASK_REF_CNT: 8, // 完成的派遣人数最多 - MAX_HEROES_NUM: 3, - COST_GOLD: 50 + REFRESH_TIME: 5, // 每天几点刷新 + RAND_CNT: 8, // 每次刷新多少个任务 + MAX_TASK_REF_CNT: 8, // 完成的派遣任务数最多多少个 + MAX_HEROES_NUM: 3, // 每个任务最大派遣武将数 + COST_GOLD: 50 // 每次刷新花费的元宝 } export const DAILY_CONST = { - REFRESH_TIME: 5 + REFRESH_TIME: 5 // 每天加点刷新 +} + +export const DUNGEON_CONST = { + REFRESH_TIME: 5, // 每天加点刷新 + MAX_CNT: 10, // 最大挑战次数 + MAX_BUY_CNT: 10 // 最大购买次数 } export const EXPEDITION_CONST = { @@ -198,7 +205,8 @@ export const GONGSHI = { * 公式: A * num + B */ export const GOLD_COST_RATIO = { - "TOWER_HANG_SPDUP": { "A": 0, "B": 50 }, - "TPWER_TASK_REF": { "A": 0, "B": 200 }, - "DAILY_REF_NUM": { "A": 50, "B": 0 } + "TOWER_HANG_SPDUP": { "A": 0, "B": 50 }, // 天梯挂机加速花费 + "TPWER_TASK_REF": { "A": 0, "B": 200 }, // 天梯派遣刷新花费 + "DAILY_REF_NUM": { "A": 50, "B": 0 }, // 每日购买次数花费 + "DUNGRON_BUY_NUM": { "A": 0, "B": 50 } // 秘境购买次数花费 } \ No newline at end of file diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index cba12fa12..95f468cf8 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -28,7 +28,7 @@ export const STATUS = { DAILY_WAR_NOT_FOUND: { code: 20201, simStr: '未找到该关卡' }, DAILY_TYPE_NOT_FOUND: { code: 20202, simStr: '未找到该类型' }, DAILY_TIMES_LACK: { code: 20203, simStr: '次数不足' }, - DAILY_REFRESH_TIMES_LACK: { code: 20203, simStr: '刷新次数不足' }, + DAILY_REFRESH_TIMES_LACK: { code: 20203, simStr: '购买次数不足' }, DAILY_REFRESH_GOLD_LACK: { code: 20204, simStr: '元宝不足' }, // 奇遇 20300 - 20399 EVENT_RECORD_NOT_FOUND: { code: 20301, simStr: '未找到记录' }, @@ -71,6 +71,9 @@ export const STATUS = { TOWER_REF_CNT_NOT_ENOUGH: { code: 20518, simStr: '派遣次数不足' }, // 共斗 20600 - 20699 COM_BATTLE_DUP_ENTER: { code: 20601, simStr: '不能重复加入' }, + // 秘境 20700 - 20799 + DUNGEON_REFRESH_TIMES_LACK: { code: 20701, simStr: '购买次数不足' }, + DUNGEON_TIMES_LACK: { code: 20701, simStr: '挑战次数不足' }, // 养成相关状态 30000 - 39999 // 社交相关状态 40000 - 49999 // 运营模块相关状态 50000 - 59999 diff --git a/shared/db/Hero.ts b/shared/db/Hero.ts index 734219983..88a17178c 100644 --- a/shared/db/Hero.ts +++ b/shared/db/Hero.ts @@ -110,6 +110,13 @@ export default class Hero extends BaseModel { return heroes; } + public static async updateCe(roleId: string, hid: number, ce: number, oldCe: number, historyCe: number, lean = true) { + let distance = ce - oldCe; + let historyDistance = ce > historyCe ?ce - historyCe: 0; + let result = await HeroModel.findOneAndUpdate({roleId, hid}, {$inc:{ce: distance, historyCe: historyDistance}}).lean(lean); + return result||{}; + } + public static async deleteAccount(roleId: string, lean = true) { let result = await HeroModel.deleteMany({roleId}).lean(lean); return result||{}; diff --git a/shared/db/PvpDefense.ts b/shared/db/PvpDefense.ts index c7551a516..8ac01bf55 100644 --- a/shared/db/PvpDefense.ts +++ b/shared/db/PvpDefense.ts @@ -71,6 +71,12 @@ export default class PvpDefense extends BaseModel { } + public static async updateCe(roleId: string, hid: number, ce: number, oldCe: number, lean = true) { + let distance = ce - oldCe; + const rec = await PvpDefenseModel.findOneAndUpdate({roleId, 'heroes.actorId': hid}, {$inc: {ce: distance}}).lean(lean); + return rec + } + public static async deleteAccount(roleId: string, lean = true) { let result = await PvpDefenseModel.deleteMany({roleId}).lean(lean); return result||{}; diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 1e5afd30e..5a29f70e9 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -3,6 +3,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop } from '@typegoose/typegoose'; import User from './User'; import { shouldRefresh } from '../pubUtils/util'; +import { HeroModel } from './Hero'; class TopHero { @prop({ required: true }) @@ -137,6 +138,13 @@ export default class Role extends BaseModel { @prop({ required: true, default: new Date() }) expeditionResetRefTime: Date; // 远征重置次数刷新时间 + // 秘境相关 + @prop({ required: true, default: 0 }) + dungeonCnt: number; // 秘境挑战次数 + @prop({ required: true, default: 0 }) + dungeonBuyCnt: number; // 秘境购买次数 + @prop({ required: true, default: new Date() }) + dungeonRefTime: Date; // 秘境刷新时间 public static async findByUid(uid: number, serverId: number, lean = true) { const role = await RoleModel.findOne({ 'userInfo.uid': uid, serverId }).lean(lean); @@ -285,6 +293,30 @@ export default class Role extends BaseModel { return role; } + + // 购买次数 + public static async buyCnt(roleId: string, needRefresh: boolean, inc: number, curTime: Date, lean = true) { console.log('&*&*&*&*&') + + let role = null; + if (needRefresh) { + role = await RoleModel.findOneAndUpdate({roleId}, {dungeonCnt: 0, dungeonRefTime: curTime, dungeonBuyCnt: inc}, {new: true}).lean(lean); + } else { + role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {dungeonBuyCnt: inc}}, {new: true}).lean(lean); + } + return role; + } + + // 增加次数 + public static async increaseDungeonCnt(roleId: string, needRefresh: boolean, inc: number, curTime: Date, lean = true) { + let role = null; + if (needRefresh) { + role = await RoleModel.findOneAndUpdate({roleId}, {dungeonCnt: inc, dungeonRefTime: curTime, dungeonBuyCnt: 0}, {new: true}).lean(lean); + } else { + role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {dungeonCnt: inc}}, {new: true}).lean(lean); + } + return role; + } + // 获取排行榜 public static async getRank(type: string, fields: Array, page = 1, limit = 100, lean = true) { let sortBy = {}; @@ -295,6 +327,42 @@ export default class Role extends BaseModel { const ranks = await RoleModel.find().select(fields.join(' ')).sort(sortBy).limit(limit).skip((page - 1) * limit).lean(lean); return ranks; } + + public static async updateSumCe(roleId: string, hid: number, ce: number, oldCe: number, lean = true) { + + let role = await RoleModel.findByRoleId(roleId); + let topFive = role?.topFive||new Array(); + let distance = ce - oldCe; + + topFive.sort((a, b) => {return b.ce - a.ce}); // 0-5,最大-最小 + let index = topFive.findIndex(cur => cur.hid == hid); + if(index == -1) { // 不在最强列表 + if(topFive.length < 5) { // 不满5人 + topFive.push({hid, ce}); + } else if(topFive.length == 5){ + if(ce > topFive[topFive.length - 1].ce) { // 跻身最强6人 + topFive.pop(); + topFive.push({hid, ce}); + } else { + topFive[index].ce = ce; + } + } else { + topFive.splice(5, topFive.length - 5); + } + } else { // 原来就是最强5人 + if(ce < topFive[topFive.length - 1].ce) { // 滑出最强 + let heroes = await HeroModel.getTopHero(roleId, 5); + topFive = heroes.map(cur => {return {hid: cur.hid, ce: cur.ce}}); + } else { + topFive[index].ce = ce; + } + } + + let topFiveCe = topFive.reduce((pre, cur) => { + return pre + cur.ce + }, 0); + await RoleModel.findOneAndUpdate({roleId}, { topFive, topFiveCe, $inc: {ce: distance} }).lean(lean); + } } export const RoleModel = getModelForClass(Role); diff --git a/shared/pubUtils/gamedata.ts b/shared/pubUtils/gamedata.ts index 08a55637e..cf4e6c2a3 100644 --- a/shared/pubUtils/gamedata.ts +++ b/shared/pubUtils/gamedata.ts @@ -3,7 +3,7 @@ import path = require('path'); import { ABI_TYPE } from '../consts/abilityConst'; let gamedata = {}; -const wars = ['dic_zyz_gk_main', 'dic_zyz_gk_mainElite', 'dic_zyz_gk_daily', 'dic_zyz_gk_event', 'dic_zyz_gk_tower', 'dic_zyz_gk_expedition']; // 关卡相关的表 +const wars = ['dic_zyz_gk_main', 'dic_zyz_gk_mainElite', 'dic_zyz_gk_daily', 'dic_zyz_gk_event', 'dic_zyz_gk_tower', 'dic_zyz_gk_expedition', 'dic_zyz_gk_dungeon','dic_zyz_gk_dungeonElite']; // 关卡相关的表 const allWarInfos = new Map(); const towerInfos = new Map(); const towerTaskInfos = new Map(); diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index f8b8c51df..8a3f053a2 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -333,38 +333,10 @@ export async function updateCe(roleId: string, hero: any ) { let ce = actor.calculateCE(); if(ce != oldCe) { // 更新总战力&最强五人战力 - let role = await RoleModel.findByRoleId(roleId); - let distance = ce - oldCe; - let historyDistance = ce > historyCe ?ce - historyCe: 0; - let topFive = role?.topFive||new Array(); - topFive.sort((a, b) => {return b.ce - a.ce}); // 0-5,最大-最小 - let index = topFive.findIndex(cur => cur.hid == hid); - if(index == -1) { // 不在最强列表 - if(topFive.length < 5) { // 不满5人 - topFive.push({hid, ce}); - } else if(topFive.length == 5){ - if(ce > topFive[topFive.length - 1].ce) { // 跻身最强6人 - topFive.pop(); - topFive.push({hid, ce}); - } else { - topFive[index].ce = ce; - } - } else { - topFive.splice(5, topFive.length - 5); - } - } else { // 原来就是最强5人 - if(ce < topFive[topFive.length - 1].ce) { // 滑出最强 - let heroes = await HeroModel.getTopHero(roleId, 5); - topFive = heroes.map(cur => {return {hid: cur.hid, ce: cur.ce}}); - } else { - topFive[index].ce = ce; - } - } - let topFiveCe = topFive.reduce((pre, cur) => { - return pre + cur.ce - }, 0); - await RoleModel.findOneAndUpdate({roleId}, { topFive, topFiveCe, $inc: {ce: distance} }); - await PvpDefenseModel.findOneAndUpdate({roleId, 'heroes.actorId': hid}, {$inc: {ce: distance}}); - await HeroModel.findOneAndUpdate({roleId, hid}, {$inc:{ce: distance, historyCe: historyDistance}}) + await RoleModel.updateSumCe(roleId, hid, ce, oldCe); + // 更新pvp防守阵容战力 + await PvpDefenseModel.updateCe(roleId, hid, ce, oldCe); + // 更新武将战力,历史最高战力 + await HeroModel.updateCe(roleId, hid, ce, oldCe, historyCe); } } \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_gk_dungeon.json b/shared/resource/jsons/dic_zyz_gk_dungeon.json new file mode 100644 index 000000000..34f382036 --- /dev/null +++ b/shared/resource/jsons/dic_zyz_gk_dungeon.json @@ -0,0 +1,40 @@ +[ + { + "war_id": 3001, + "dispatchJsonId": 3001, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "10205&1|17001&10|17005&2|17006&3", + "warType": 6, + "gk_name": "秘境&怒狼洞穴1", + "kingExp": 100, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "recommendedPower": 10008, + "previousGk": 127 + }, + { + "war_id": 3002, + "dispatchJsonId": 3002, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "10005&1|17002&10|17007&2|17008&3", + "warType": 6, + "gk_name": "秘境&怒狼洞穴2", + "kingExp": 100, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "recommendedPower": 10008, + "previousGk": 3001 + } +] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_gk_dungeonElite.json b/shared/resource/jsons/dic_zyz_gk_dungeonElite.json new file mode 100644 index 000000000..3166a0038 --- /dev/null +++ b/shared/resource/jsons/dic_zyz_gk_dungeonElite.json @@ -0,0 +1,40 @@ +[ + { + "war_id": 3010, + "dispatchJsonId": 3010, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "10205&1|17001&10|17005&2|17006&3", + "warType": 13, + "gk_name": "秘境&怒狼洞穴1", + "kingExp": 100, + "lvLimted": 10, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "recommendedPower": 10008, + "previousGk": 3001 + }, + { + "war_id": 3011, + "dispatchJsonId": 3011, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "10005&1|17002&10|17007&2|17008&3", + "warType": 13, + "gk_name": "秘境&怒狼洞穴2", + "kingExp": 100, + "lvLimted": 10, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "recommendedPower": 10008, + "previousGk": 3002 + } +] \ No newline at end of file diff --git a/web-server/typings/app/index.d.ts b/web-server/typings/app/index.d.ts new file mode 100644 index 000000000..7b891bb48 --- /dev/null +++ b/web-server/typings/app/index.d.ts @@ -0,0 +1,6 @@ +// This file is created by egg-ts-helper@1.25.8 +// Do not modify this file!!!!!!!!! + +import 'egg'; +export * from 'egg'; +export as namespace Egg; diff --git a/web-server/typings/app/service/index.d.ts b/web-server/typings/app/service/index.d.ts new file mode 100644 index 000000000..4b808972a --- /dev/null +++ b/web-server/typings/app/service/index.d.ts @@ -0,0 +1,21 @@ +// This file is created by egg-ts-helper@1.25.8 +// Do not modify this file!!!!!!!!! + +import 'egg'; +type AnyClass = new (...args: any[]) => any; +type AnyFunc = (...args: any[]) => T; +type CanExportFunc = AnyFunc> | AnyFunc>; +type AutoInstanceType : T> = U extends AnyClass ? InstanceType : U; +import ExportAuth from '../../../app/service/Auth'; +import ExportTest from '../../../app/service/Test'; +import ExportTurboCore from '../../../app/service/TurboCore'; +import ExportUtils from '../../../app/service/Utils'; + +declare module 'egg' { + interface IService { + auth: AutoInstanceType; + test: AutoInstanceType; + turboCore: AutoInstanceType; + utils: AutoInstanceType; + } +} diff --git a/web-server/typings/config/plugin.d.ts b/web-server/typings/config/plugin.d.ts new file mode 100644 index 000000000..910fc008f --- /dev/null +++ b/web-server/typings/config/plugin.d.ts @@ -0,0 +1,39 @@ +// This file is created by egg-ts-helper@1.25.8 +// Do not modify this file!!!!!!!!! + +import 'egg'; +import 'egg-onerror'; +import 'egg-session'; +import 'egg-i18n'; +import 'egg-watcher'; +import 'egg-multipart'; +import 'egg-security'; +import 'egg-development'; +import 'egg-logrotator'; +import 'egg-schedule'; +import 'egg-static'; +import 'egg-jsonp'; +import 'egg-view'; +import 'egg-view-nunjucks'; +import 'egg-cors'; +import 'egg-alinode'; +import { EggPluginItem } from 'egg'; +declare module 'egg' { + interface EggPlugin { + onerror?: EggPluginItem; + session?: EggPluginItem; + i18n?: EggPluginItem; + watcher?: EggPluginItem; + multipart?: EggPluginItem; + security?: EggPluginItem; + development?: EggPluginItem; + logrotator?: EggPluginItem; + schedule?: EggPluginItem; + static?: EggPluginItem; + jsonp?: EggPluginItem; + view?: EggPluginItem; + nunjucks?: EggPluginItem; + cors?: EggPluginItem; + alinode?: EggPluginItem; + } +} \ No newline at end of file