镇念塔:保底

This commit is contained in:
luying
2021-08-17 14:41:15 +08:00
parent faaf3388c5
commit 5afbda8a12
2 changed files with 25 additions and 10 deletions
+24 -9
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 { BattleRecordModel } from './../db/BattleRecord';
import { TowerRecordModel } from './../db/TowerRecord'; import { TowerRecordModel } from './../db/TowerRecord';
import { RoleModel, RoleType } from './../db/Role'; 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 { STATUS } from '../consts/statusCode';
import { HangUpSpdUpRecModel } from '../db/HangUpSpdUpRec'; import { HangUpSpdUpRecModel } from '../db/HangUpSpdUpRec';
import { TowerTaskRecModel, TowerTaskRecType } from '../db/TowerTaskRec'; 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[]) { export async function refreshTasks(towerLv: number, batchCode: string, roleId: string, roleName: string, oldTasks:TowerTaskRecType[]) {
let needFloor = !oldTasks || oldTasks.length <= 0; // 首次刷新需要一个保底
let ridTaskIds: number[] = []; let ridTaskIds: number[] = [];
let positions = new Map<number, TowerTaskRecType> (); // 需要创建或更新 let positions = new Map<number, TowerTaskRecType> (); // 需要创建或更新
for(let i = 1; i <= TOWER_TASK_CONST.RAND_CNT; i++) { // TODO 改为系统参数表 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[] = []; let tasks: TowerTaskRecType[] = [];
for(let [ position, task ] of positions) { 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) { // 更新 if(task) { // 更新
tasks.push(await TowerTaskRecModel.updateTask(roleId, batchCode, position, taskId)); tasks.push(await TowerTaskRecModel.updateTask(roleId, batchCode, position, taskId));
} else { } else {
@@ -402,18 +410,25 @@ export async function refreshTasks(towerLv: number, batchCode: string, roleId: s
} }
ridTaskIds.push(taskId); 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 return tasks
} }
function randomTaskId(towerLv: number, oldTaskId: number, rids: number[]) { function randomTask(towerLv: number, oldQuality: number, rids: number[]) {
let dicTask = gameData.towerTask;
let oldQuality = dicTask.has(oldTaskId)? dicTask.get(oldTaskId).quality: 0;
let qualityRange = oldQuality + 1; let qualityRange = oldQuality + 1;
if(qualityRange >=5 ) qualityRange = 5;
let randomList: DicTowerTask[] = []; let randomList: DicTowerTask[] = [];
while(randomList.length <= 0) { // 如果这个品质范围里面没有,就降一品质再找 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)) { if(task.quality >= qualityRange && !rids.includes(task.taskId)) {
let { suitFloor: { min, max } } = task; let { suitFloor: { min, max } } = task;
let flag = max ? (towerLv >= min && towerLv <= max) : (towerLv >= min); 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(randomList.length <= 0) qualityRange--;
if(qualityRange == 0) return 0; if(qualityRange == 0) return null;
} }
let { dic } = getRandEelmWithWeight(randomList); let { dic } = getRandEelmWithWeight(randomList);
return dic.taskId; return dic;
} }
// /** // /**
+1 -1
View File
@@ -73,7 +73,7 @@ export default class TowerTaskRec extends BaseModel {
} }
public static async updateTask(roleId: string, batchCode: string, position: number, taskId: number) { 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; return recs;
} }