天梯派遣刷新逻辑

This commit is contained in:
luying
2020-11-11 17:09:54 +08:00
parent 7fa9fe99ee
commit 76e8157ad3
7 changed files with 126 additions and 89 deletions
@@ -7,8 +7,8 @@ import { RoleModel } from './../../../db/Role';
import { TowerRecordModel } from './../../../db/TowerRecord';
import { Application, BackendSession } from 'pinus';
import { getTaskById, getTowerDataByLv } from '../../../pubUtils/gamedata';
import { decodeArrayStr, resResult, shouldRefresh, calculateNum } from '../../../pubUtils/util';
import { calcuHangUpReward, checkTaskConditions, checkHangUpSpdUpCnt, createCurTasks, treatTask, getRemainTime, getTasksReward } from '../../../services/battleService';
import { decodeArrayStr, resResult, shouldRefresh, calculateNum, getRefTime, genCode } from '../../../pubUtils/util';
import { calcuHangUpReward, checkTaskConditions, checkHangUpSpdUpCnt, createCurTasks, treatTask, getRemainTime, getTasksReward, getTaskStatus, getDoingOrWaitingTasks } from '../../../services/battleService';
import { handleFixedReward, handleReward } from '../../../services/rewardService';
export default function(app: Application) {
@@ -137,17 +137,23 @@ export class TowerBattleHandler {
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);
let { towerLv, towerTaskRefTime } = await RoleModel.findByRoleId(roleId);
let curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前显示中的任务
const 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) {
curTasks = await createCurTasks(towerLv, roleId, roleName);
const batchCode = genCode(8);
await RoleModel.resetTowerCnt(roleId, curTime); // 重置派遣次数
let {waitingTaskCode, doingTaskCode} = getDoingOrWaitingTasks(curTasks, curTime);
await TowerTaskRecModel.hideTask(roleId, waitingTaskCode); // 隐藏没有在做的任务
await TowerTaskRecModel.updateBatchCode(roleId, doingTaskCode, batchCode); // 更新留下来的旧任务的batchCode
await createCurTasks(towerLv, batchCode, roleId, roleName, doingTaskCode.length); // 新建任务
curTasks = await TowerTaskRecModel.getCurTasks(roleId);
}
let refRemainTime = getRemainTime(curTime);
let costGold = TOWER_TASK_CONST.COST_GOLD;
return resResult(STATUS.SUCCESS, { curTasks: treatTask(curTasks, curTime), refRemainTime, nextCostGold: costGold });
}
@@ -156,36 +162,34 @@ export class TowerBattleHandler {
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 { towerLv, towerTaskCnt = 0 } = await RoleModel.findByRoleId(roleId);
if(TOWER_TASK_CONST.MAX_TASK_REF_CNT <= towerTaskCnt) { // 每派遣一个任务加一,最多8个完成任务
return resResult(STATUS.TOWER_REF_CNT_NOT_ENOUGH);
}
let costGold = calculateNum(GOLD_COST_RATIO.TPWER_TASK_REF, {num: towerTaskReCnt}, 200);
let costGold = TOWER_TASK_CONST.COST_GOLD;
let {gold} = await RoleModel.findByRoleId(roleId);
if(costGold > gold) {
return resResult(STATUS.TOWER_GOLD_NOT_ENOUGH);
}
await RoleModel.increaseTowerRefCnt(roleId, needRefresh, curTime);
// tmp: 将刷掉的旧任务的奖励发送到邮件中
let oldReward = await getTasksReward(roleId, curTime);
console.log(JSON.stringify(oldReward));
await TowerTaskRecModel.refreshTask(roleId); // 刷掉旧的任务
// 只刷掉当前面板上没有做派遣的任务
const batchCode = genCode(8);
let curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前显示中的任务
let {waitingTaskCode, doingTaskCode} = getDoingOrWaitingTasks(curTasks, curTime);
await TowerTaskRecModel.hideTask(roleId, waitingTaskCode); // 隐藏没有在做的任务
await TowerTaskRecModel.updateBatchCode(roleId, doingTaskCode, batchCode); // 更新留下来的旧任务的batchCode
await createCurTasks(towerLv, batchCode, roleId, roleName, 0);
curTasks = await TowerTaskRecModel.getCurTasks(roleId);
let curTasks = await createCurTasks(towerLv, roleId, roleName); // 刷出新的任务
let nextCostGold = calculateNum(GOLD_COST_RATIO.TPWER_TASK_REF, {num: towerTaskReCnt + 1}, 200);
let refRemainTime = getRemainTime(curTime);
return resResult(STATUS.SUCCESS, { curTasks: treatTask(curTasks, curTime), costGold, nextCostGold, refRemainTime});
return resResult(STATUS.SUCCESS, { curTasks: treatTask(curTasks, curTime), costGold, nextCostGold:costGold, refRemainTime});
}
async sendTaskHero(msg: {batchCode: string, tasks: Array<{taskCode: string, heroes: Array<number>}>}, session: BackendSession) {
let roleId = session.get('roleId');
const curTime = new Date();
const curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前一批的任务
let curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前一批的任务
if (!curTasks || curTasks.length == 0) {
return resResult(STATUS.TOWER_TASK_NOT_FOUND);
}
@@ -203,7 +207,7 @@ export class TowerBattleHandler {
return resResult(STATUS.TOWER_TASK_MISSING)
}
let taskInfo = getTaskById(curTask.taskId);
if (task.heroes.length > taskInfo.actorNeeded) { // 武将数,从策划表中读取
if (task.heroes.length == taskInfo.actorNeeded) { // 武将数,从策划表中读取
return resResult(STATUS.TOWER_TASK_MAX_HERO);
}
if (tasksCode.indexOf(task.taskCode) === -1) {
@@ -222,9 +226,11 @@ export class TowerBattleHandler {
if (!recs || recs.length === 0) {
return resResult(STATUS.TOWER_TASK_SEND_ERR);
}
await RoleModel.increaseTowerCnt(roleId, tasks.length)
let refRemainTime = getRemainTime(curTime);
return resResult(STATUS.SUCCESS, { tasks: treatTask(recs, curTime), refRemainTime });
curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前显示中的任务
return resResult(STATUS.SUCCESS, { tasks: treatTask(curTasks, curTime), refRemainTime });
}
async settleTask(msg: {batchCode: string, taskCode: string}, session: BackendSession) {
@@ -234,7 +240,7 @@ export class TowerBattleHandler {
let allFlag = !msg.taskCode;
const curTime = new Date();
const curTasks = await TowerTaskRecModel.getCurTasks(roleId);
let curTasks = await TowerTaskRecModel.getCurTasks(roleId);
if (!curTasks || curTasks.length == 0) {
return resResult(STATUS.TOWER_TASK_NOT_FOUND);
}
@@ -258,10 +264,12 @@ export class TowerBattleHandler {
}
}
}
const rec = await TowerTaskRecModel.finishTask(msg.batchCode, compTasks);
await TowerTaskRecModel.finishTask(msg.batchCode, compTasks);
await TowerTaskRecModel.showTask(roleId, msg.batchCode, compTasks.length);
let refRemainTime = getRemainTime(curTime);
return resResult(STATUS.SUCCESS, { compTasks: treatTask(rec, curTime), goods, refRemainTime });
curTasks = await TowerTaskRecModel.getCurTasks(roleId); // 当前显示中的任务
return resResult(STATUS.SUCCESS, { compTasks: treatTask(curTasks, curTime), goods, refRemainTime });
}
+50 -19
View File
@@ -6,12 +6,13 @@ import { BattleRecordModel } from './../db/BattleRecord';
import { TowerRecordModel } from './../db/TowerRecord';
import { RoleModel } from './../db/Role';
import { getHeroInfoById, getJobInfoById, getTowerDataByLv, getTaskById, getGamedata } from "../pubUtils/gamedata"
import { decodeArrayStr, shouldRefresh, resResult, decodeStr, cal, getRandomWithWeight, getRefTime, decodeStrSingle } from '../pubUtils/util';
import { decodeArrayStr, shouldRefresh, resResult, decodeStr, cal, getRandomWithWeight, getRefTime, decodeStrSingle, genCode } 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';
import { Document } from 'mongoose';
export async function checkTowerWar(roleId: string, battleId: number, heroes: Array<number>) {
const battleIdStr = `${battleId}`;
@@ -250,10 +251,10 @@ export async function checkTaskConditions(roleId: string, heroes: Array<number>,
* @param towerLv 玩家层数
* @param roleId 玩家id
* @param roleName 玩家名
* @param hideNum 隐藏的任务数量
*/
export async function createCurTasks(towerLv: number, roleId: string, roleName: string) {
export async function createCurTasks(towerLv: number, batchCode: string, roleId: string, roleName: string, hideNum: number) {
let taskIds = [];
let randomList = [];
let dicTask = getGamedata('dic_zyz_search');
for(let task of dicTask) {
@@ -264,16 +265,25 @@ export async function createCurTasks(towerLv: number, roleId: string, roleName:
randomList.push(task);
}
}
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);
let returnTasks = new Array();
let showNum = TOWER_TASK_CONST.RAND_CNT - hideNum;
const arr = [{refreshStatus: 0, num: hideNum}, {refreshStatus: 1, num: showNum}];
for(let {refreshStatus, num} of arr) {
let taskIds = [];
for(let i = 0; i < num; 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, batchCode, taskIds, refreshStatus);
if(refreshStatus == 1) {
returnTasks = curTasks;
}
}
const curTasks = await TowerTaskRecModel.createTasks(roleId, roleName, taskIds);
return curTasks
return returnTasks;
}
export function getRemainTime(curTime: Date) {
@@ -284,18 +294,39 @@ export function getRemainTime(curTime: Date) {
export function treatTask(recs: Array<any>, 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 }
let getStatusResult = getTaskStatus(status, completeTime, curTime);
return { heroes, batchCode, taskId, taskCode, completeTime, ...getStatusResult }
});
}
// 刷新任务,正在进行中的部分保留,没有进行中的刷掉
export function getDoingOrWaitingTasks (taskList: Array<any>, curTime: Date) {
let doingTaskCode = new Array<string>(), waitingTaskCode = new Array<string>();
for(let task of taskList) {
let {status} = getTaskStatus(task.status, task.completeTime, curTime);
if(status == 1||status == 2) {
doingTaskCode.push(task.taskCode);
} else if(status == 0|| status == 3) {
waitingTaskCode.push(task.taskCode);
}
}
return {doingTaskCode, waitingTaskCode}
}
export function getTaskStatus(status: number, completeTime: Date, curTime: Date) {
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 {status, remainTime}
}
export async function getTasksReward(roleId: string, curTime: Date) {
let oldTasks = await TowerTaskRecModel.getCurTasks(roleId);
let goods = [];