diff --git a/game-server/app/services/battleService.ts b/game-server/app/services/battleService.ts index ab1a76fbc..fb8566a8c 100644 --- a/game-server/app/services/battleService.ts +++ b/game-server/app/services/battleService.ts @@ -5,7 +5,7 @@ import { HANG_UP_CONSTS, TOWER_TASK_CONST, REDIS_KEY, TASK_TYPE, TIME_OUTPUT_TYP import { BattleRecordModel } from './../db/BattleRecord'; import { TowerRecordModel } from './../db/TowerRecord'; import { RoleModel, RoleType } from './../db/Role'; -import { shouldRefresh, resResult, cal, getRandEelmWithWeight, calculateNum, genCode } from '../pubUtils/util'; +import { shouldRefresh, resResult, cal, getRandEelmWithWeight, calculateNum, genCode, getRandEelm } from '../pubUtils/util'; import { STATUS } from '../consts/statusCode'; import { HangUpSpdUpRecModel } from '../db/HangUpSpdUpRec'; import { TowerTaskRecModel, TowerTaskRecType } from '../db/TowerTaskRec'; @@ -378,6 +378,8 @@ export async function checkTaskConditions(roleId: string, heroes: number[], cond } export async function refreshTasks(towerLv: number, batchCode: string, roleId: string, roleName: string, oldTasks:TowerTaskRecType[]) { + let needFloor = !oldTasks || oldTasks.length <= 0; // 首次刷新需要一个保底 + let ridTaskIds: number[] = []; let positions = new Map (); // 需要创建或更新 for(let i = 1; i <= TOWER_TASK_CONST.RAND_CNT; i++) { // TODO 改为系统参数表 @@ -394,7 +396,13 @@ export async function refreshTasks(towerLv: number, batchCode: string, roleId: s let tasks: TowerTaskRecType[] = []; for(let [ position, task ] of positions) { - let taskId = randomTaskId(towerLv, task?task.taskId: 0, ridTaskIds); + let dicOldTask = task? gameData.towerTask.get(task.taskId): null; + + let dicTask = randomTask(towerLv, dicOldTask?dicOldTask.quality: 0, ridTaskIds); + if(!dicTask) break; // 任务池没有可刷新了 + + let { taskId, quality } = dicTask; + if(quality == 4 || quality == 5) needFloor = false; if(task) { // 更新 tasks.push(await TowerTaskRecModel.updateTask(roleId, batchCode, position, taskId)); } else { @@ -402,18 +410,25 @@ export async function refreshTasks(towerLv: number, batchCode: string, roleId: s } ridTaskIds.push(taskId); } + + + if(needFloor) { // 塞一个保底 + let dicTask = randomTask(towerLv, 3, ridTaskIds); + if(dicTask) { + let index = Math.floor(Math.random() * tasks.length); + tasks[index] = await TowerTaskRecModel.updateTask(roleId, batchCode, tasks[index].position, dicTask.taskId); + } + } + return tasks } -function randomTaskId(towerLv: number, oldTaskId: number, rids: number[]) { - let dicTask = gameData.towerTask; - let oldQuality = dicTask.has(oldTaskId)? dicTask.get(oldTaskId).quality: 0; +function randomTask(towerLv: number, oldQuality: number, rids: number[]) { let qualityRange = oldQuality + 1; - if(qualityRange >=5 ) qualityRange = 5; let randomList: DicTowerTask[] = []; while(randomList.length <= 0) { // 如果这个品质范围里面没有,就降一品质再找 - for (let [_id, task] of dicTask) { + for (let [_id, task] of gameData.towerTask) { if(task.quality >= qualityRange && !rids.includes(task.taskId)) { let { suitFloor: { min, max } } = task; let flag = max ? (towerLv >= min && towerLv <= max) : (towerLv >= min); @@ -423,12 +438,12 @@ function randomTaskId(towerLv: number, oldTaskId: number, rids: number[]) { } } if(randomList.length <= 0) qualityRange--; - if(qualityRange == 0) return 0; + if(qualityRange == 0) return null; } let { dic } = getRandEelmWithWeight(randomList); - return dic.taskId; + return dic; } // /** diff --git a/shared/db/TowerTaskRec.ts b/shared/db/TowerTaskRec.ts index 349fa4259..54205bf54 100644 --- a/shared/db/TowerTaskRec.ts +++ b/shared/db/TowerTaskRec.ts @@ -73,7 +73,7 @@ export default class TowerTaskRec extends BaseModel { } public static async updateTask(roleId: string, batchCode: string, position: number, taskId: number) { - const recs: TowerTaskRecType = await TowerTaskRecModel.findOneAndUpdate({ roleId, batchCode, position, status: TOWER_TASK_STATUS.WAITING }, { $set: { taskId } }).lean(); + const recs: TowerTaskRecType = await TowerTaskRecModel.findOneAndUpdate({ roleId, batchCode, position, status: TOWER_TASK_STATUS.WAITING }, { $set: { taskId } }, { new: true }).lean(); return recs; }