镇念塔:保底
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user