镇念塔:保底

This commit is contained in:
luying
2021-08-17 14:41:10 +08:00
parent faaf3388c5
commit 5afbda8a12
2 changed files with 25 additions and 10 deletions

View File

@@ -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<number, TowerTaskRecType> (); // 需要创建或更新
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;
}
// /**

View File

@@ -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;
}