diff --git a/game-server/app/servers/battle/handler/dailyBattleHandler.ts b/game-server/app/servers/battle/handler/dailyBattleHandler.ts index 412a79fab..eb2066fc6 100644 --- a/game-server/app/servers/battle/handler/dailyBattleHandler.ts +++ b/game-server/app/servers/battle/handler/dailyBattleHandler.ts @@ -2,9 +2,9 @@ import { Application, BackendSession } from 'pinus'; import { DailyRecordModel } from '../../../db/DailyRecord'; import { BattleRecordModel } from '../../../db/BattleRecord'; import { getGamedata } from '../../../pubUtils/gamedata'; -import { WAR_TYPE, GONGSHI } from '../../../consts/consts'; +import { WAR_TYPE, GOLD_COST_RATIO } from '../../../consts/consts'; import { STATUS } from '../../../consts/statusCode'; -import { resResult } from '../../../pubUtils/util'; +import { resResult, calculateNum } from '../../../pubUtils/util'; import { RoleModel } from '../../../db/Role'; import { getDailyNum } from '../../../services/dailyBattleService'; @@ -53,8 +53,7 @@ export class DailyBattleHandler { }); } } - let checkDailyResult = getDailyNum(refreshResult, timesPerDay, timesCanBuy); - + let checkDailyResult = await getDailyNum(refreshResult, timesPerDay, timesCanBuy); result.push({ type, name, ...checkDailyResult, wars @@ -84,7 +83,7 @@ export class DailyBattleHandler { let buyCost = 0; for(let i = 1; i <= count; i++) { let num = buyCount + i; - buyCost += eval(GONGSHI.DAILY_REFRESH_NUM_COST); + buyCost += calculateNum(GOLD_COST_RATIO.DAILY_REF_NUM, {num}, 50); } let {gold} = await RoleModel.findByRoleId(roleId); if(buyCost > gold) { @@ -94,7 +93,7 @@ export class DailyBattleHandler { let newDailyRecord = await DailyRecordModel.increseBuyCount(roleId, type, count); console.log(buyCost); - let checkDailyResult = getDailyNum(newDailyRecord, timesPerDay, timesCanBuy); + let checkDailyResult = await getDailyNum(newDailyRecord, timesPerDay, timesCanBuy); return resResult(STATUS.SUCCESS, { type, ...checkDailyResult, buyCost}); } } \ No newline at end of file diff --git a/game-server/app/servers/battle/handler/towerBattleHandler.ts b/game-server/app/servers/battle/handler/towerBattleHandler.ts index 21fd88046..cece1d7d9 100644 --- a/game-server/app/servers/battle/handler/towerBattleHandler.ts +++ b/game-server/app/servers/battle/handler/towerBattleHandler.ts @@ -1,14 +1,14 @@ import { STATUS } from './../../../consts/statusCode'; -import { TOWER_TASK_CONST, HANG_UP_CONSTS, GONGSHI } from './../../../consts/consts'; +import { HANG_UP_CONSTS, GOLD_COST_RATIO, TOWER_TASK_CONST } from './../../../consts/consts'; import { TowerTaskRecModel } from './../../../db/TowerTaskRec'; import { HangUpSpdUpRecModel } from './../../../db/HangUpSpdUpRec'; import { HangUpRecordModel } from './../../../db/HangUpRecord'; import { RoleModel } from './../../../db/Role'; import { TowerRecordModel } from './../../../db/TowerRecord'; import { Application, BackendSession } from 'pinus'; -import { getTaskById, getTaskIdByFloor, getTowerDataByLv } from '../../../pubUtils/gamedata'; -import { decodeArrayStr, decodeIdCntArrayStr, getRandEelm, resResult, shouldRefresh, getRandomWithWeight } from '../../../pubUtils/util'; -import { calcuHangUpReward, checkTaskConditions, checkHangUpSpdUpCnt } from '../../../services/battleService'; +import { getTaskById, getTowerDataByLv } from '../../../pubUtils/gamedata'; +import { decodeArrayStr, resResult, shouldRefresh, calculateNum } from '../../../pubUtils/util'; +import { calcuHangUpReward, checkTaskConditions, checkHangUpSpdUpCnt, createCurTasks, treatTask, getRemainTime } from '../../../services/battleService'; import { handleFixedReward, handleReward } from '../../../services/rewardService'; export default function(app: Application) { @@ -68,18 +68,27 @@ export class TowerBattleHandler { async checkHangUpRewards(msg: {}, session: BackendSession) { let roleId = session.get('roleId'); - const { timeReward, startTime, deltaTime } = await calcuHangUpReward(roleId); + const result = await calcuHangUpReward(roleId); + if(result.status == -1) { + return result.resResult + } + let {timeReward, startTime, deltaTime} = result.data; return resResult(STATUS.SUCCESS, {startTime, hangUpPassTime: deltaTime, rewards: timeReward.map(cur => {return {id: cur.gid, count: cur.count}})}); } async recHangUpRewards(msg: {}, session: BackendSession) { let roleId = session.get('roleId'); let roleName = session.get('roleName'); - const { timeReward, endLv, endTime, deltaTime, needReceiveGoods } = await calcuHangUpReward(roleId); + const result = await calcuHangUpReward(roleId); + if(result.status == -1) { + return result.resResult + } + let { timeReward, endLv, endTime, deltaTime, needReceiveGoods } = result.data; const goods = await handleReward(roleId, roleName, timeReward); await HangUpRecordModel.updateRec(roleId, roleName, endLv, endTime, needReceiveGoods); - return resResult(STATUS.SUCCESS, { endTime, hangUpPassTime: deltaTime, ...goods }); + + return resResult(STATUS.SUCCESS, { endTime, hangUpPassTime: deltaTime%HANG_UP_CONSTS.MAX_TIME, ...goods }); } async hangUpSpeedUp(msg: {speedUpCnt: number}, session: BackendSession) { @@ -89,7 +98,11 @@ export class TowerBattleHandler { return resResult(STATUS.WRONG_PARMS); } const curTime = new Date(); - const { timeReward, endLv, deltaTime, needReceiveGoods } = await calcuHangUpReward(roleId, true, msg.speedUpCnt, curTime); + const calResult = await calcuHangUpReward(roleId, true, msg.speedUpCnt, curTime); + if(calResult.status == -1) { + return calResult.resResult; + } + let { timeReward, endLv, deltaTime, needReceiveGoods } = calResult.data; let result = await checkHangUpSpdUpCnt(roleId, msg.speedUpCnt, curTime); if(result.status == -1) return result.resResult; @@ -117,11 +130,7 @@ export class TowerBattleHandler { for(let i = 1; i <= count; i++) { let num = HANG_UP_CONSTS.MAX_SPD_UP_CNT - originCnt + i; if(num < 0) num = i; - try { - gold += parseInt(eval(GONGSHI.TOWER_HANG_UP_SPEED_COST)); - } catch(e) { - gold += 0; - } + gold += calculateNum(GOLD_COST_RATIO.TOWER_HANG_SPDUP, {num}, 50); } return gold } @@ -129,33 +138,54 @@ export class TowerBattleHandler { async getTasks(msg: {}, session: BackendSession) { let roleId = session.get('roleId'); let roleName = session.get('roleName'); - let { towerLv } = await RoleModel.findByRoleId(roleId); + let curTime = new Date(); + let { towerLv, towerTaskReCnt = 0, towerTaskRefTime = curTime } = await RoleModel.findByRoleId(roleId); + let needRefresh = shouldRefresh(towerTaskRefTime, curTime, TOWER_TASK_CONST.REFRESH_TIME); + if(needRefresh) { + towerTaskReCnt = 0; + } + let costGold = calculateNum(GOLD_COST_RATIO.TPWER_TASK_REF, {num: towerTaskReCnt}, 200); let curTasks = await TowerTaskRecModel.getCurTasks(roleId); if (!curTasks || curTasks.length == 0) { - let taskIds = []; - const taskList = getTaskIdByFloor(towerLv)||[]; - const randomList = taskList.map(taskId => getTaskById(taskId)); - for(let i = 0; i < TOWER_TASK_CONST.RAND_CNT; i++) { - let list = randomList.filter(taskId => !taskIds.includes(taskId)); - console.log(taskIds, JSON.stringify(list)); - let {dic: tmp} = getRandomWithWeight(list); - if(tmp) { - taskIds.push(tmp.taskId); - } - } - - curTasks = await TowerTaskRecModel.createTasks(roleId, roleName, taskIds); + curTasks = await createCurTasks(towerLv, roleId, roleName); } - return resResult(STATUS.SUCCESS, { curTasks }); + let refRemainTime = getRemainTime(curTime); + + return resResult(STATUS.SUCCESS, { curTasks: treatTask(curTasks, curTime), refRemainTime, nextCostGold: costGold }); + } + + async refreshTasks(msg: {}, session: BackendSession) { + let roleId = session.get('roleId'); + let roleName = session.get('roleName'); + let curTime = new Date(); + let { towerLv, towerTaskReCnt = 0, towerTaskRefTime = curTime } = await RoleModel.findByRoleId(roleId); + let needRefresh = shouldRefresh(towerTaskRefTime, curTime, TOWER_TASK_CONST.REFRESH_TIME); + if(needRefresh) { + towerTaskReCnt = 0; + } + let costGold = calculateNum(GOLD_COST_RATIO.TPWER_TASK_REF, {num: towerTaskReCnt}, 200); + let {gold} = await RoleModel.findByRoleId(roleId); + if(costGold > gold) { + return resResult(STATUS.TOWER_GOLD_NOT_ENOUGH); + } + await RoleModel.increaseTowerRefCnt(roleId, needRefresh, curTime); + + await TowerTaskRecModel.refreshTask(roleId); // 刷掉旧的任务 + let curTasks = await createCurTasks(towerLv, roleId, roleName); // 刷出新的任务 + + let nextCostGold = calculateNum(GOLD_COST_RATIO.TPWER_TASK_REF, {num: towerTaskReCnt + 1}, 200); + return resResult(STATUS.SUCCESS, { curTasks: treatTask(curTasks, curTime), costGold, nextCostGold}); } async sendTaskHero(msg: {batchCode: string, tasks: Array<{taskCode: string, heroes: Array}>}, session: BackendSession) { let roleId = session.get('roleId'); + + const curTime = new Date(); const curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前一批的任务 if (!curTasks || curTasks.length == 0) { return resResult(STATUS.TOWER_TASK_NOT_FOUND); } - let usedHeroes = []; + let usedHeroes = [], tasks = []; const tasksCode = []; const taskMap = new Map() curTasks.forEach(task => { @@ -165,6 +195,9 @@ export class TowerBattleHandler { }); for (let task of msg.tasks) { let curTask = taskMap.get(task.taskCode); // 数据库中,这个任务的数据 + if(!curTask) { + return resResult(STATUS.TOWER_TASK_MISSING) + } let taskInfo = getTaskById(curTask.taskId); if (task.heroes.length > taskInfo.actorNeeded) { // 武将数,从策划表中读取 return resResult(STATUS.TOWER_TASK_MAX_HERO); @@ -178,14 +211,14 @@ export class TowerBattleHandler { return resResult(STATUS.TOWER_TASK_HERO_HAS_USED); } } + tasks.push({...task, completeTime: taskInfo.completeTime}) } - const curTime = new Date(); - const recs = await TowerTaskRecModel.sendHeroes(roleId, msg.batchCode, msg.tasks, curTime); + const recs = await TowerTaskRecModel.sendHeroes(roleId, msg.batchCode, tasks, curTime,); if (!recs || recs.length === 0) { return resResult(STATUS.TOWER_TASK_SEND_ERR); } - return resResult(STATUS.SUCCESS, { tasks: recs }); + return resResult(STATUS.SUCCESS, { tasks: treatTask(recs, curTime) }); } async settleTask(msg: {batchCode: string, taskCode: string}, session: BackendSession) { @@ -219,7 +252,7 @@ export class TowerBattleHandler { } } } - await TowerTaskRecModel.finishTask(msg.batchCode, compTasks); - return resResult(STATUS.SUCCESS, { compTasks, goods }); + const rec = await TowerTaskRecModel.finishTask(msg.batchCode, compTasks); + return resResult(STATUS.SUCCESS, { compTasks: treatTask(rec, curTime), goods }); } } diff --git a/game-server/app/services/battleService.ts b/game-server/app/services/battleService.ts index 4f2f78288..9af340a10 100644 --- a/game-server/app/services/battleService.ts +++ b/game-server/app/services/battleService.ts @@ -1,15 +1,17 @@ import { HeroModel } from './../db/Hero'; import { HangUpRecordModel } from './../db/HangUpRecord'; import { ChannelService } from 'pinus'; -import { HANG_UP_CONSTS } from './../consts/consts'; +import { HANG_UP_CONSTS, TOWER_TASK_CONST } from './../consts/consts'; import { BattleRecordModel } from './../db/BattleRecord'; import { TowerRecordModel } from './../db/TowerRecord'; import { RoleModel } from './../db/Role'; -import { getHeroInfoById, getJobInfoById, getTowerDataByLv } from "../pubUtils/gamedata" -import { decodeArrayStr, shouldRefresh, resResult, decodeStr, cal } from '../pubUtils/util'; +import { getHeroInfoById, getJobInfoById, getTowerDataByLv, getTaskById, getTaskIdByFloor } from "../pubUtils/gamedata" +import { decodeArrayStr, shouldRefresh, resResult, decodeStr, cal, getRandomWithWeight, getRefTime } from '../pubUtils/util'; import { handleFixedReward } from './rewardService'; import { STATUS } from '../consts/statusCode'; import { HangUpSpdUpRecModel } from '../db/HangUpSpdUpRec'; +import TowerTaskRec, { TowerTaskRecModel } from '../db/TowerTaskRec'; +import { PvpDefenseModel } from '../db/PvpDefense'; export async function checkTowerWar(roleId: string, battleId: number, heroes: Array) { const battleIdStr = `${battleId}`; @@ -114,6 +116,9 @@ export async function checkHangUpSpdUpCnt(roleId: string, cnt: number, curTime: export async function calcuHangUpReward(roleId: string, speedUp = false, speedUpCnt = 1, curTime = new Date()) { let { towerLv = 1, hangUpSpdUpCnt = 0, lastSpdUpTime } = await RoleModel.findByRoleId(roleId); + if(towerLv < HANG_UP_CONSTS.ENABLE_LV) { + return {status: -1, resResult: resResult(STATUS.TOWER_HANG_UP_NOT_START)} + } let towerInfo = getTowerDataByLv(towerLv - 1); // towerLv 是当前层,奖励计算按照已经通过的层,即上一层 let timeReward = []; // 奖励 @@ -175,12 +180,15 @@ export async function calcuHangUpReward(roleId: string, speedUp = false, speedUp } } return { - endLv: towerLv - 1, - startTime, - deltaTime, - endTime, - timeReward, - needReceiveGoods + status: 0, + data: { + endLv: towerLv - 1, + startTime, + deltaTime, + endTime, + timeReward, + needReceiveGoods + } }; } @@ -236,3 +244,45 @@ export async function checkTaskConditions(roleId: string, heroes: Array, return res; } +/** + * 创建新的派遣任务 + * @param towerLv 玩家层数 + * @param roleId 玩家id + * @param roleName 玩家名 + */ +export async function createCurTasks(towerLv: number, roleId: string, roleName: string) { + + let taskIds = []; + const taskList = getTaskIdByFloor(towerLv)||[]; + const randomList = taskList.map(taskId => getTaskById(taskId)); + for(let i = 0; i < TOWER_TASK_CONST.RAND_CNT; i++) { + let list = randomList.filter(cur => !taskIds.includes(cur.taskId)); + let {dic: tmp} = getRandomWithWeight(list); + if(tmp) { + taskIds.push(tmp.taskId); + } + } + + const curTasks = await TowerTaskRecModel.createTasks(roleId, roleName, taskIds); + return curTasks +} + +export function getRemainTime(curTime: Date) { + let nextTime = getRefTime(curTime, TOWER_TASK_CONST.REFRESH_TIME, 1); + return Math.floor((nextTime.getTime() - curTime.getTime())/1000); +} + +export function treatTask(recs: Array, curTime: Date) { + return recs.map(cur => { + let { heroes, batchCode, taskId, taskCode, status, completeTime} = cur; + let remainTime = 0; + if(status == 1) { + console.log(curTime.getTime(), completeTime.getTime()) + remainTime = Math.floor((completeTime.getTime() - curTime.getTime())/1000); + if(remainTime < 0) { + status = 2; remainTime = 0; + } + } + return { heroes, batchCode, taskId, taskCode, status, completeTime, remainTime } + }); +} \ No newline at end of file diff --git a/game-server/app/services/dailyBattleService.ts b/game-server/app/services/dailyBattleService.ts index ebf510364..3485e44f7 100644 --- a/game-server/app/services/dailyBattleService.ts +++ b/game-server/app/services/dailyBattleService.ts @@ -23,7 +23,7 @@ export async function checkDaily(roleId: string, battleId: number, inc: number) if(count + inc > curDaily.timesPerDay + buyCount ) { return { status: -1, resResult: resResult(STATUS.DAILY_TIMES_LACK) } } - let checkDailyResult = getDailyNum(curDaily, curDaily.timesPerDay, curDaily.timesCanBuy); + let checkDailyResult = await getDailyNum(dailyRecord, curDaily.timesPerDay, curDaily.timesCanBuy); return {status: 1, data: {type, ...checkDailyResult}}; } @@ -56,7 +56,7 @@ export async function checkDailyAndIncrease(roleId: string, battleId: number, in return { status: -1, resResult: resResult(STATUS.DAILY_TIMES_LACK) } } let result = await DailyRecordModel.increseDailyCount(roleId, type, inc); - let checkDailyResult = getDailyNum(result, curDaily.timesPerDay, curDaily.timesCanBuy); + let checkDailyResult = await getDailyNum(result, curDaily.timesPerDay, curDaily.timesCanBuy); return {status: 1, data: {type, ...checkDailyResult}}; } diff --git a/shared/consts/consts.ts b/shared/consts/consts.ts index 28d043950..1ca477967 100644 --- a/shared/consts/consts.ts +++ b/shared/consts/consts.ts @@ -178,5 +178,16 @@ export const FIX_SMS_CODE_TELS = ['18855953630', '13911134885', '15167549151', ' export const GONGSHI = { "TOWER_HANG_UP_SPEED_COST": "50", + "TOWER_TASK_REF_COST": "200", "DAILY_REFRESH_NUM_COST": "50*num" }; + +/** + * 计算元宝和次数相关的系数 + * 公式: 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 } +} \ No newline at end of file diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index a3a994230..618580dad 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -65,6 +65,8 @@ export const STATUS = { TOWER_TASK_SEND_ERR: { code: 20514, simStr: '任务派遣失败,请检查任务编号' }, TOWER_TASK_BATCH_NOT_FOUND: { code: 20515, simStr: '派遣编码错误' }, TOWER_GOLD_NOT_ENOUGH: { code: 20516, simStr: '元宝不足' }, + TOWER_TASK_MISSING: { code: 20517, simStr: '未找到该任务' }, + TOWER_HANG_UP_NOT_START: { code: 20518, simStr: '挂机尚未开启' }, // 共斗 20600 - 20699 COM_BATTLE_DUP_ENTER: { code: 20601, simStr: '不能重复加入' }, // 养成相关状态 30000 - 39999 diff --git a/shared/db/DailyRecord.ts b/shared/db/DailyRecord.ts index d1930fb13..d43e90989 100644 --- a/shared/db/DailyRecord.ts +++ b/shared/db/DailyRecord.ts @@ -19,7 +19,7 @@ export default class DailyRecord extends BaseModel { refTime: number; // 刷新时间 public static async getDailyRecordById(roleId: string, type: number, lean = true) { - const result = await DailyRecordModel.findOneAndUpdate({ roleId, type }, {}, {new: true, upsert: true}).select('type count buyCount refTime').lean(lean); + const result = await DailyRecordModel.findOneAndUpdate({ roleId, type }, {}, {new: true, upsert: true}).lean(lean); return result; } diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 19c46381f..824242404 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -90,26 +90,29 @@ export default class Role extends BaseModel { star: number; // 星级 }]; - @prop({ required: true, default: 1 }) + @prop({ required: true, default: 1 }) loginCnt: number; // 登录次数 @prop({ required: true }) createTime: Date; // 创建时间 @prop({ required: true }) loginTime: Date; // 更新 / 登录时间 + // 天梯相关 @prop({ required: true, default: 1 }) towerLv: number; // 天梯当前层数 - @prop({ required: true }) - eventStatus: number; // 奇遇开启状态, 0-未开启 1-开启了第一场事件 2-完全开启 - - // @prop({ required: false }) - // hangUpTime: Date; // 当前挂机开始时间 @prop({ required: true, default: HANG_UP_CONSTS.MAX_SPD_UP_CNT}) hangUpSpdUpCnt: number; // 挂机加速次数 @prop({ required: true, default: new Date()}) lastSpdUpTime: Date; // 最后一次挂机加速时间 + @prop({ required: true, default: 0}) + towerTaskReCnt: number; // 刷新派遣任务的次数,向上累加,消耗元宝和这个相关 + @prop({ required: true, default: new Date()}) + towerTaskRefTime: Date; // 刷新派遣任务的时间 + + @prop({ required: true }) + eventStatus: number; // 奇遇开启状态, 0-未开启 1-开启了第一场事件 2-完全开启 @prop({ required: true }) expeditionPoint: number; // 远征点数 @@ -188,27 +191,27 @@ export default class Role extends BaseModel { public static async addItems(roleId: string, field: string, id: number, cnt: number, lean = true) { -try { - let role = await RoleModel.findOne({roleId}).lean(lean); - let item = role?role[field]:[]; - let curItem = item.find(cur => cur.id == id); - if(!curItem) { - let addToSet = {}; - addToSet[field] = {id, count: cnt}; - let result = await RoleModel.findOneAndUpdate({roleId}, { $addToSet: addToSet }, { "new": true, "upsert": true}).lean(lean); - return result; - } else { - let condition = { roleId }; - condition[`${field}.id`] = id; - let update = {}; - update[`${field}.$.count`] = cnt; + try { + let role = await RoleModel.findOne({roleId}).lean(lean); + let item = role?role[field]:[]; + let curItem = item.find(cur => cur.id == id); + if(!curItem) { + let addToSet = {}; + addToSet[field] = {id, count: cnt}; + let result = await RoleModel.findOneAndUpdate({roleId}, { $addToSet: addToSet }, { "new": true, "upsert": true}).lean(lean); + return result; + } else { + let condition = { roleId }; + condition[`${field}.id`] = id; + let update = {}; + update[`${field}.$.count`] = cnt; - let result = await RoleModel.findOneAndUpdate(condition, { $inc: update }, { "new": true, "upsert": true}).lean(lean); - return result; + let result = await RoleModel.findOneAndUpdate(condition, { $inc: update }, { "new": true, "upsert": true}).lean(lean); + return result; + } + }catch(e) { + console.error(e) } -}catch(e) { - console.error(e) -} } public static async addCoin(roleId: string, cnt: number, lean = true) { @@ -239,6 +242,18 @@ try { ).lean(lean); return result; } + + // 刷新派遣任务次数增长 + public static async increaseTowerRefCnt(roleId: string, needRefresh: boolean, curTime: Date, lean = true) { + + let role = null; + if (needRefresh) { + role = await RoleModel.findOneAndUpdate({roleId}, {towerTaskReCnt: 0, towerTaskRefTime: curTime}, {new: true}).lean(lean); + } else { + role = await RoleModel.findOneAndUpdate({roleId}, {$inc: {towerTaskReCnt: 1}}, {new: true}).lean(lean); + } + return role; + } } export const RoleModel = getModelForClass(Role); diff --git a/shared/db/TowerTaskRec.ts b/shared/db/TowerTaskRec.ts index a3391c159..d8acab5f6 100644 --- a/shared/db/TowerTaskRec.ts +++ b/shared/db/TowerTaskRec.ts @@ -1,5 +1,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop } from '@typegoose/typegoose'; +import { getRefTime } from '../pubUtils/util'; +import { TOWER_TASK_CONST } from '../consts/consts'; function genCodeTmp(len) { const chars = '123456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijklmnopqrstuvwxyz'; @@ -11,13 +13,7 @@ function genCodeTmp(len) { return code; } -function getRefTime(curTime = new Date()) { - if (curTime.getHours() < 5) { - curTime.setDate(curTime.getDate() - 1); - } - curTime.setHours(5, 0, 0, 0); - return curTime; -} + /** * 天梯派遣记录表 @@ -34,6 +30,8 @@ export default class TowerTaskRec extends BaseModel { batchCode: string; // 本批派遣任务唯一标识 @prop({ required: true, default: 0}) status: number; // 派遣任务当前状态,0-可派遣,1-已派遣,2-已完成,3-已领取 + @prop({ required: true, default: 1}) + refreshStatus: number; // 派遣任务是否显示 0-不显示,被刷新掉了 1-显示 @prop({ required: true, type: Number, default: [] }) heroes: Array; // 此批派遣使用的全部武将 @@ -43,10 +41,13 @@ export default class TowerTaskRec extends BaseModel { taskCode: string; // 服务器生成的任务唯一编号 @prop({ required: false }) sendTime: Date; // 派遣时间 + @prop({ required: false }) + completeTime: Date; // 派遣结束时间 public static async getCurTasks(roleId: string, lean = true) { - const refTime = getRefTime(); - const recs = await TowerTaskRecModel.find({roleId, createdAt: {$gte: refTime}}).lean(lean); + let curTime = new Date(); + const refTime = getRefTime(curTime, TOWER_TASK_CONST.REFRESH_TIME); + const recs = await TowerTaskRecModel.find({roleId, createdAt: {$gte: refTime}, refreshStatus: 1}).sort({createdAt: 1}).lean(lean); return recs; } @@ -67,13 +68,14 @@ export default class TowerTaskRec extends BaseModel { return recs; } - public static async sendHeroes(_roleId: string, batchCode: string, tasks: Array<{taskCode:string, heroes: Array}>, sendTime: Date, lean = true) { + public static async sendHeroes(_roleId: string, batchCode: string, tasks: Array<{taskCode:string, heroes: Array, completeTime: number}>, sendTime: Date, lean = true) { let recs = new Array(); - const refTime = getRefTime(); - for (let task of tasks) { + let curTime = new Date(); + const refTime = getRefTime(curTime, TOWER_TASK_CONST.REFRESH_TIME); + for (let {taskCode, heroes, completeTime} of tasks) { const rec = await TowerTaskRecModel.findOneAndUpdate( - {batchCode, taskCode: task.taskCode, createdAt: {$gte: refTime}}, - {heroes: task.heroes, status: 1, sendTime}, + {batchCode, taskCode: taskCode, createdAt: {$gte: refTime}}, + {heroes: heroes, status: 1, sendTime, completeTime: new Date(sendTime.getTime() + completeTime * 1000)}, {new: true}).lean(lean); recs.push(rec); @@ -95,6 +97,15 @@ export default class TowerTaskRec extends BaseModel { return recs; } + // 刷掉旧任务 + public static async refreshTask(roleId: string, lean = true) { + let curTime = new Date(); + const refTime = getRefTime(curTime, TOWER_TASK_CONST.REFRESH_TIME); + console.log(refTime) + const recs = await TowerTaskRecModel.updateMany({roleId, createdAt: {$gte: refTime}, refreshStatus: 1}, {refreshStatus: 0}, {new: true}).lean(lean); + return recs; + } + public static async deleteAccount(roleId: string, lean = true) { let result = await TowerTaskRecModel.deleteMany({roleId}).lean(lean); return result||{}; diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index 97d64ca72..a047987b1 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -2,6 +2,7 @@ import { STATUS } from './../consts/statusCode'; import { getGamedata } from './gamedata'; import { HeroModel } from '../db/Hero'; + const moment = require('moment'); export function genCode(len) { @@ -177,7 +178,8 @@ export function deltaDays(preTime: Date, proTime: Date): number { * @param hour 几点刷新 * @param deltaDay 间隔几天刷新,默认每天刷新(deltaDay = 1) */ -export function shouldRefresh(preTime: Date, curTime: Date, hour: number, deltaDay = 1): boolean { +export function shouldRefresh(preTime: Date, now: Date, hour: number, deltaDay = 1): boolean { + let curTime = new Date(now.getTime()); let refeshTime = curTime.setHours(hour, 0, 0, 0); if (refeshTime - preTime.getTime() > deltaDay * 24 * 60 * 60 * 1000 && curTime.getTime() >= refeshTime) { return true; @@ -185,6 +187,21 @@ export function shouldRefresh(preTime: Date, curTime: Date, hour: number, deltaD return false; } +/** + * 获取 x天后的y点 + * @param curTime 现在时间 + * @param hour 几点刷新 + */ +export function getRefTime(now = new Date(), hour: number, day = 0) { + let curTime = new Date(now.getTime()); + if (curTime.getHours() < hour) { + curTime.setDate(curTime.getDate() - 1); + } + curTime.setHours(hour, 0, 0, 0); + curTime = new Date(curTime.getTime() + day * 24 * 60 * 60 * 1000); + return curTime; +} + export function getRandEelm(source: Array = [], cnt = 1): Array { if (cnt > source.length) return []; if (cnt === source.length) return source; @@ -265,4 +282,23 @@ export const cal = { d = Number(b.toString().replace(".", "")); return this.mul(c / d, Math.pow(10, f - e)); } -}; \ No newline at end of file +}; + +//计算公式 +export function calculateNum(ratio: {A: number, B: number}, params: {num: number}, defaultVal = 0) { + // result = a * num + b + try { + let {A, B} = ratio; + let {num} = params; + let result = A * num + B; + if(isNaN(result)) { + console.error('calculate wrong: ', A, B, num) + return defaultVal; + } else { + return result; + } + }catch(e) { + console.error(e); + return defaultVal; + } +} \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_gk_daily.json b/shared/resource/jsons/dic_zyz_gk_daily.json index 87e33a783..b3fe0af07 100644 --- a/shared/resource/jsons/dic_zyz_gk_daily.json +++ b/shared/resource/jsons/dic_zyz_gk_daily.json @@ -2,9 +2,9 @@ { "war_id": 3001, "dispatchJsonId": 3001, - "bg_img_id": 3001, + "bg_img_id": 501, "script_id": 0, - "fixReward": "&", + "fixReward": "10205&1|17001&10|17005&2|17006&3", "warType": 4, "gk_name": "每日&护送商人", "kingExp": 100, @@ -12,9 +12,9 @@ "turnLimted": 20, "forcedCharactor": "&", "fobiddenCharactor": "&", - "victoryInfoInUI": "马车到达安全地区", - "loseInfoInUI": "马车被抢\n我方全部阵亡", - "starInfoInUI": "1.我方无人阵亡;\n2.在5回合内获得胜利", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "马车被抢\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", "cost": 0, "iconInMap": "dengji1", "iconName": "新手", @@ -25,9 +25,9 @@ { "war_id": 3002, "dispatchJsonId": 3002, - "bg_img_id": 3002, + "bg_img_id": 501, "script_id": 0, - "fixReward": "&", + "fixReward": "10005&1|17002&10|17007&2|17008&3", "warType": 4, "gk_name": "每日&护送商人", "kingExp": 100, @@ -35,9 +35,9 @@ "turnLimted": 20, "forcedCharactor": "&", "fobiddenCharactor": "&", - "victoryInfoInUI": "马车到达安全地区", - "loseInfoInUI": "马车被抢\n我方全部阵亡", - "starInfoInUI": "1.我方无人阵亡;\n2.在5回合内获得胜利", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "马车被抢\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", "cost": 0, "iconInMap": "dengji2", "iconName": "普通", @@ -48,9 +48,9 @@ { "war_id": 3003, "dispatchJsonId": 3003, - "bg_img_id": 3003, + "bg_img_id": 501, "script_id": 0, - "fixReward": "&", + "fixReward": "16004&1|16005&10|15014&2|15015&3", "warType": 4, "gk_name": "每日&护送商人", "kingExp": 100, @@ -58,9 +58,9 @@ "turnLimted": 20, "forcedCharactor": "&", "fobiddenCharactor": "&", - "victoryInfoInUI": "马车到达安全地区", - "loseInfoInUI": "马车被抢\n我方全部阵亡", - "starInfoInUI": "1.我方无人阵亡;\n2.在5回合内获得胜利", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "马车被抢\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", "cost": 0, "iconInMap": "dengji3", "iconName": "困难", @@ -71,9 +71,9 @@ { "war_id": 3004, "dispatchJsonId": 3004, - "bg_img_id": 3004, + "bg_img_id": 501, "script_id": 0, - "fixReward": "&", + "fixReward": "31001&1|31002&10|17006&2|17006&3", "warType": 4, "gk_name": "每日&护送商人", "kingExp": 100, @@ -81,9 +81,9 @@ "turnLimted": 20, "forcedCharactor": "&", "fobiddenCharactor": "&", - "victoryInfoInUI": "马车到达安全地区", - "loseInfoInUI": "马车被抢\n我方全部阵亡", - "starInfoInUI": "1.我方无人阵亡;\n2.在5回合内获得胜利", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "马车被抢\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", "cost": 0, "iconInMap": "dengji4", "iconName": "恶梦", @@ -94,9 +94,9 @@ { "war_id": 3005, "dispatchJsonId": 3005, - "bg_img_id": 3005, + "bg_img_id": 501, "script_id": 0, - "fixReward": "&", + "fixReward": "31003&1|31004&30|31002&20|31002&20", "warType": 4, "gk_name": "每日&护送商人", "kingExp": 100, @@ -104,9 +104,9 @@ "turnLimted": 20, "forcedCharactor": "&", "fobiddenCharactor": "&", - "victoryInfoInUI": "马车到达安全地区", - "loseInfoInUI": "马车被抢\n我方全部阵亡", - "starInfoInUI": "1.我方无人阵亡;\n2.在5回合内获得胜利", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "马车被抢\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", "cost": 0, "iconInMap": "dengji5", "iconName": "地狱", @@ -114,6 +114,328 @@ "previousGk": 3004, "dailyType": 1 }, + { + "war_id": 3006, + "dispatchJsonId": 3006, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "10205&1|17001&10|17005&2|17006&3", + "warType": 4, + "gk_name": "每日&护送商人", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "马车被抢\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在6回合内获得胜利", + "cost": 0, + "iconInMap": "dengji5", + "iconName": "痛苦", + "recommendedPower": 10008, + "previousGk": 3005, + "dailyType": 1 + }, + { + "war_id": 3007, + "dispatchJsonId": 3007, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "10005&1|17002&10|17007&2|17008&3", + "warType": 4, + "gk_name": "每日&护送商人", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "马车被抢\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在7回合内获得胜利", + "cost": 0, + "iconInMap": "dengji6", + "iconName": "大师", + "recommendedPower": 10008, + "previousGk": 3006, + "dailyType": 1 + }, + { + "war_id": 3008, + "dispatchJsonId": 3008, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "16004&1|16005&10|15014&2|15015&3", + "warType": 4, + "gk_name": "每日&护送商人", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "马车被抢\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在8回合内获得胜利", + "cost": 0, + "iconInMap": "dengji7", + "iconName": "折磨", + "recommendedPower": 10008, + "previousGk": 3007, + "dailyType": 1 + }, + { + "war_id": 3009, + "dispatchJsonId": 3009, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "31001&1|31002&10|17006&2|17006&3", + "warType": 4, + "gk_name": "每日&护送商人", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "马车被抢\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在9回合内获得胜利", + "cost": 0, + "iconInMap": "dengji8", + "iconName": "折磨1", + "recommendedPower": 10008, + "previousGk": 3008, + "dailyType": 1 + }, + { + "war_id": 3010, + "dispatchJsonId": 3010, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "6005&1|6004&10|10001&2|10002&3", + "warType": 4, + "gk_name": "每日&城池守卫", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji1", + "iconName": "新手", + "recommendedPower": 10008, + "previousGk": 0, + "dailyType": 1 + }, + { + "war_id": 3011, + "dispatchJsonId": 3011, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "10206&1|1&10|2&2|3&3", + "warType": 4, + "gk_name": "每日&城池守卫", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji2", + "iconName": "普通", + "recommendedPower": 10008, + "previousGk": 3010, + "dailyType": 2 + }, + { + "war_id": 3012, + "dispatchJsonId": 3012, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "16004&1|16005&10|15014&2|15015&3", + "warType": 4, + "gk_name": "每日&城池守卫", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji3", + "iconName": "困难", + "recommendedPower": 10008, + "previousGk": 3011, + "dailyType": 2 + }, + { + "war_id": 3013, + "dispatchJsonId": 3013, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "31001&1|31002&10|17006&2|17006&3", + "warType": 4, + "gk_name": "每日&城池守卫", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji4", + "iconName": "恶梦", + "recommendedPower": 10008, + "previousGk": 3012, + "dailyType": 2 + }, + { + "war_id": 3014, + "dispatchJsonId": 3014, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "31003&1|31004&30|31002&20|31002&20", + "warType": 4, + "gk_name": "每日&城池守卫", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji5", + "iconName": "地狱", + "recommendedPower": 10008, + "previousGk": 3013, + "dailyType": 2 + }, + { + "war_id": 3020, + "dispatchJsonId": 3020, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "10001&1|10002&30|10003&20|10004&20", + "warType": 4, + "gk_name": "每日&保护矿产", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji1", + "iconName": "新手", + "recommendedPower": 10008, + "previousGk": 0, + "dailyType": 1 + }, + { + "war_id": 3021, + "dispatchJsonId": 3021, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "10206&1|17002&10|17007&2|17008&3", + "warType": 4, + "gk_name": "每日&保护矿产", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji2", + "iconName": "普通", + "recommendedPower": 10008, + "previousGk": 3020, + "dailyType": 3 + }, + { + "war_id": 3022, + "dispatchJsonId": 3022, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "16004&1|16005&10|15014&2|15015&3", + "warType": 4, + "gk_name": "每日&保护矿产", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji3", + "iconName": "困难", + "recommendedPower": 10008, + "previousGk": 3021, + "dailyType": 3 + }, + { + "war_id": 3023, + "dispatchJsonId": 3023, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "31001&1|31002&10|17006&2|17006&3", + "warType": 4, + "gk_name": "每日&保护矿产", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji4", + "iconName": "恶梦", + "recommendedPower": 10008, + "previousGk": 3022, + "dailyType": 3 + }, + { + "war_id": 3024, + "dispatchJsonId": 3024, + "bg_img_id": 501, + "script_id": 0, + "fixReward": "31003&1|31004&30|31002&20|31002&20", + "warType": 4, + "gk_name": "每日&保护矿产", + "kingExp": 100, + "lvLimted": 10, + "turnLimted": 20, + "forcedCharactor": "&", + "fobiddenCharactor": "&", + "victoryInfoInUI": "消灭所有敌军", + "loseInfoInUI": "\r\n我方全部阵亡", + "starInfoInUI": "1.我方无人阵亡;\r\n2.在5回合内获得胜利", + "cost": 0, + "iconInMap": "dengji5", + "iconName": "地狱", + "recommendedPower": 10008, + "previousGk": 3023, + "dailyType": 3 + }, { "war_id": 0, "dispatchJsonId": 0, diff --git a/shared/resource/jsons/dic_zyz_tower_tasks.json b/shared/resource/jsons/dic_zyz_tower_tasks.json index 776eb41ba..c1bfef49a 100644 --- a/shared/resource/jsons/dic_zyz_tower_tasks.json +++ b/shared/resource/jsons/dic_zyz_tower_tasks.json @@ -31,7 +31,7 @@ "bonus": "3&2|4&1", "bonusCondition": "3&1&1", "actorCnt": 1, - "completeTime": 50, + "completeTime": 500000, "suitFloor": 1, "weight": 1 },