奇遇本刷新机制调整
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
import { Application, BackendSession } from 'pinus';
|
||||
import { getGamedata } from '../../../pubUtils/gamedata';
|
||||
import EventRecord, { EventRecordModel } from '../../../db/EventRecord';
|
||||
import { EventRecordModel } from '../../../db/EventRecord';
|
||||
import { RoleModel } from '../../../db/Role';
|
||||
import { EVENT_STATUS, EVENT_RECORD_STATUS, EVENT_ANSWER_STATUS } from '../../../consts/consts';
|
||||
import { checkEvent, getEventTime, refreshEvent, checkEventStatus, getEventSuccessStatus, checkQuizParam, checkQuiz } from '../../../services/eventSercive';
|
||||
import { checkEvent, checkEventStatus, getEventSuccessStatus, getEvent, checkQuiz } from '../../../services/eventSercive';
|
||||
import { handleFixedReward } from '../../../services/rewardService';
|
||||
import { STATUS } from '../../../consts/statusCode';
|
||||
import { resResult } from '../../../pubUtils/util';
|
||||
@@ -21,21 +21,9 @@ export class EventBattleHandler {
|
||||
let roleId = session.get('roleId');
|
||||
let roleName = session.get('roleName');
|
||||
let eventStatus = session.get('eventStatus');
|
||||
|
||||
let now = new Date();
|
||||
let t = getEventTime(now);
|
||||
|
||||
let event: Array<EventRecord>;
|
||||
if (eventStatus == EVENT_STATUS.STARTING) {
|
||||
event = await EventRecordModel.getEventRecordByTime(roleId, 0);
|
||||
} else if( eventStatus == EVENT_STATUS.OPEN ) {
|
||||
|
||||
event = await EventRecordModel.getEventRecordByTime(roleId, t);
|
||||
if(event.length == 0) { // 刷新
|
||||
const num = 3; // 每次刷3个
|
||||
event = await refreshEvent(num, roleId, roleName, t);
|
||||
}
|
||||
}
|
||||
let event = await getEvent(eventStatus, roleId, roleName);
|
||||
|
||||
return resResult(STATUS.SUCCESS, { list: event });
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
import {Application, BackendSession} from 'pinus';
|
||||
import { RoleModel } from '../../../db/Role';
|
||||
import { getEventTime, refreshEvent } from '../../../services/eventSercive';
|
||||
import EventRecord, { EventRecordModel } from '../../../db/EventRecord';
|
||||
import { EVENT_STATUS, EVENT_RECORD_STATUS } from '../../../consts/consts';
|
||||
import { getEvent } from '../../../services/eventSercive';
|
||||
import { resResult } from '../../../pubUtils/util';
|
||||
import { STATUS } from '../../../consts/statusCode';
|
||||
|
||||
@@ -31,23 +29,7 @@ export class GmHandler {
|
||||
channel.add(roleId, sid);
|
||||
}
|
||||
|
||||
|
||||
|
||||
let now = new Date();
|
||||
let t = getEventTime(now);
|
||||
|
||||
let event: Array<EventRecord>;
|
||||
if (eventStatus == EVENT_STATUS.STARTING) {
|
||||
event = await EventRecordModel.getEventRecordByTime(roleId, 0);
|
||||
} else if( eventStatus == EVENT_STATUS.OPEN ) {
|
||||
|
||||
event = await EventRecordModel.getEventRecordByTime(roleId, t);
|
||||
if(event.length == 0) { // 刷新
|
||||
const num = 3; // 每次刷3个
|
||||
event = await refreshEvent(num, roleId, roleName, t);
|
||||
}
|
||||
}
|
||||
|
||||
let event = await getEvent(eventStatus, roleId, roleName);
|
||||
|
||||
let tsid = channel.getMember(roleId)['sid'];
|
||||
channelService.pushMessageByUids('onSpecialEvent', {
|
||||
|
||||
@@ -1,19 +1,25 @@
|
||||
import { Application, FrontendOrBackendSession } from 'pinus';
|
||||
import { getGamedata } from '../pubUtils/gamedata';
|
||||
import { EventRecordModel } from '../db/EventRecord';
|
||||
import EventRecord, { EventRecordModel } from '../db/EventRecord';
|
||||
import { RoleModel } from '../db/Role';
|
||||
import { genCode, decodeStrSingle, decodeStr, getRandomWithWeight } from '../pubUtils/util';
|
||||
import { EVENT_STATUS, EVENT_RECORD_STATUS, EVENT_TYPE, EVENT_RANDOM_TYPE_ONE_OPEN, EVENT_QUIZ_NUM, EVENT_ANSWER_STATUS } from '../consts/consts';
|
||||
import { STATUS } from '../consts/statusCode';
|
||||
import { stat } from 'fs';
|
||||
|
||||
import { EVENT_REFRESH_NUM } from '../consts/consts';
|
||||
|
||||
/**
|
||||
* 从关卡结算接口调用,保存战斗情况
|
||||
*
|
||||
* @param app
|
||||
* @param session
|
||||
* @param roleId
|
||||
* @param battleId
|
||||
* @param isSuccess
|
||||
* @param battleCode
|
||||
*/
|
||||
export async function setBattleStatus(app: Application, session: FrontendOrBackendSession, roleId: string, battleId: number , isSuccess: boolean, battleCode: string) {
|
||||
let now = new Date();
|
||||
let eventStatus = session.get('eventStatus');
|
||||
let refTime = eventStatus == EVENT_STATUS.OPEN? getEventTime(now): 0;
|
||||
console.log('***setBattleStatus', eventStatus, refTime)
|
||||
|
||||
|
||||
let { BATTLE_SUCCESS, BATTLE_FAIL } = EVENT_RECORD_STATUS;
|
||||
let result = await EventRecordModel.setBattleStatus(roleId, battleId, refTime, isSuccess?BATTLE_SUCCESS:BATTLE_FAIL, battleCode);
|
||||
@@ -21,6 +27,11 @@ export async function setBattleStatus(app: Application, session: FrontendOrBacke
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取刷新时间,12点时间或18点时间
|
||||
*
|
||||
* @param now
|
||||
*/
|
||||
export function getEventTime(now: Date) {
|
||||
let curTime = Number(now);
|
||||
let todayA = now.setHours(12, 0, 0, 0); // 每天12点
|
||||
@@ -37,13 +48,19 @@ export function getEventTime(now: Date) {
|
||||
return t
|
||||
}
|
||||
|
||||
/**
|
||||
* 从挑战结算接口调用,挑战完主线某一关,开始刷奇遇关卡
|
||||
*
|
||||
* @param app
|
||||
* @param session
|
||||
*/
|
||||
export async function startEvent(app: Application, session: FrontendOrBackendSession) {
|
||||
|
||||
// console.log('*******setEventStatus')
|
||||
let roleId = session.get('roleId');
|
||||
let roleName = session.get('roleName');
|
||||
let channelName = roleId;
|
||||
let event = await refreshEvent(1, roleId, roleName, 0); // 刷新初始的一件
|
||||
let event = await refreshEvent(1, roleId, roleName, 0, []); // 刷新初始的一件
|
||||
await RoleModel.setEventStatus(roleId, EVENT_STATUS.STARTING);
|
||||
session.set('eventStatus', EVENT_STATUS.STARTING);
|
||||
session.push('eventStatus', () => {});
|
||||
@@ -51,6 +68,13 @@ export async function startEvent(app: Application, session: FrontendOrBackendSes
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 从filter调用,用于每次检查时间,获取事件并推送
|
||||
*
|
||||
* @param app
|
||||
* @param session
|
||||
* @param isForce 即使不是12点和18点也强制刷新
|
||||
*/
|
||||
export async function checkEvent(app: Application, session: FrontendOrBackendSession, isForce:boolean = false) {
|
||||
|
||||
try {
|
||||
@@ -66,31 +90,15 @@ export async function checkEvent(app: Application, session: FrontendOrBackendSes
|
||||
let now = new Date();
|
||||
let t = getEventTime(now);
|
||||
|
||||
|
||||
let channel = app.get('channelService').getChannel(channelName, false);
|
||||
console.log('****channel', channelName, !!channel, eventTime, t, eventStatus)
|
||||
|
||||
if(!!channel && (eventTime < t || isForce)) { // 第一次登陆后可以刷新了
|
||||
|
||||
if (eventStatus == EVENT_STATUS.STARTING) {
|
||||
let event = await EventRecordModel.getEventRecordByTime(roleId, 0);
|
||||
let event = await getEvent(eventStatus, roleId, roleName);
|
||||
if (eventStatus == EVENT_STATUS.STARTING || eventStatus == EVENT_STATUS.OPEN) {
|
||||
pushEventMsg(app, roleId, channelName, { event }); // 推送
|
||||
session.set('getEventTime', t);
|
||||
session.push('getEventTime', () => {});
|
||||
} else if( eventStatus == EVENT_STATUS.OPEN ) {
|
||||
|
||||
let event = await EventRecordModel.getEventRecordByTime(roleId, t);
|
||||
|
||||
if(event.length == 0) { // 刷新
|
||||
const num = 3; // 每次刷3个
|
||||
event = await refreshEvent(num, roleId, roleName, t);
|
||||
}
|
||||
|
||||
console.log(event)
|
||||
// 推送
|
||||
pushEventMsg(app, roleId, channelName, { event });
|
||||
session.set('getEventTime', t);
|
||||
session.push('getEventTime', () => {});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -101,7 +109,57 @@ export async function checkEvent(app: Application, session: FrontendOrBackendSes
|
||||
}
|
||||
}
|
||||
|
||||
export async function refreshEvent(num: number, roleId: string, roleName: string, t) {
|
||||
/**
|
||||
* 获取当前的奇遇事件
|
||||
*
|
||||
* @param eventStatus
|
||||
* @param roleId
|
||||
* @param roleName
|
||||
*/
|
||||
export async function getEvent(eventStatus: number, roleId: string, roleName: string) {
|
||||
|
||||
let now = new Date();
|
||||
let curTime = getEventTime(now); // 这次的时间节点 0-12:前一天的18 12-18:12 18-24: 18
|
||||
let preTime = getEventTime(new Date(curTime - 1)); // 上一次的时间节点
|
||||
|
||||
let event: Array<EventRecord> = [];
|
||||
if (eventStatus == EVENT_STATUS.STARTING) {
|
||||
let result = await EventRecordModel.getEventRecordByTime(roleId, 0);
|
||||
for(let e of result) event.push(e);
|
||||
} else if( eventStatus == EVENT_STATUS.OPEN ) {
|
||||
let preEvents = await EventRecordModel.getEventRecordByTime(roleId, preTime); // 上次3个
|
||||
let curEvents = await EventRecordModel.getEventRecordByTime(roleId, curTime); // 这次3个
|
||||
|
||||
if(curEvents.length == 0) { // 这次3个没刷过,那就刷一下
|
||||
let {WAITING, BATTLE_SUCCESS, BATTLE_FAIL} = EVENT_RECORD_STATUS;
|
||||
let prePoint = preEvents.filter(cur => {
|
||||
return [WAITING, BATTLE_SUCCESS, BATTLE_FAIL].includes(cur.status);
|
||||
}).map(cur => cur.point);
|
||||
let result = await refreshEvent(EVENT_REFRESH_NUM, roleId, roleName, curTime, prePoint);
|
||||
for(let e of result) event.push(e);
|
||||
} else {
|
||||
for(let e of curEvents) event.push(e);
|
||||
}
|
||||
|
||||
for(let e of preEvents) {
|
||||
let index = event.findIndex(cur => cur.point == e.point);
|
||||
if(index == -1) event.push(e);
|
||||
}
|
||||
}
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 刷新事件
|
||||
*
|
||||
* @param num 刷多少事件
|
||||
* @param roleId
|
||||
* @param roleName
|
||||
* @param t 时间刷新时间,每天的12点或18点
|
||||
*/
|
||||
export async function refreshEvent(num: number, roleId: string, roleName: string, t: number, prePoint: Array<number>) {
|
||||
let event = new Array();
|
||||
let dicEvent = getGamedata('dic_zyz_event');
|
||||
let role = await RoleModel.findByRoleId(roleId);
|
||||
@@ -120,6 +178,7 @@ export async function refreshEvent(num: number, roleId: string, roleName: string
|
||||
});
|
||||
console.log(JSON.stringify(randomList));
|
||||
|
||||
let curPoint = new Array<number>();
|
||||
for(let i = 0; i < num; i++) {
|
||||
if(randomList.length == 0) { // 一轮刷新过,开始新的一轮,保证所有事件都能刷新一遍
|
||||
turn ++;
|
||||
@@ -129,7 +188,7 @@ export async function refreshEvent(num: number, roleId: string, roleName: string
|
||||
|
||||
let index = Math.floor(Math.random() * randomList.length);
|
||||
let dic = randomList[index];
|
||||
let point = randomPosition(dic.movePointArray);
|
||||
let point = randomPosition(dic.movePointArray, prePoint, curPoint);
|
||||
let question = dic.eventType == EVENT_TYPE.QUIZ?randomQuestion(EVENT_QUIZ_NUM): undefined;
|
||||
let eventCode = genCode(8);
|
||||
let data = await EventRecordModel.saveEventRecord(eventCode, {
|
||||
@@ -143,12 +202,12 @@ export async function refreshEvent(num: number, roleId: string, roleName: string
|
||||
}
|
||||
} else {
|
||||
let randomList = dicEvent;
|
||||
console.log('*********', randomList.length, num);
|
||||
let curPoint = new Array<number>();
|
||||
for(let i = 0; i < num; i++) {
|
||||
let {dic} = getRandomWithWeight(randomList);
|
||||
console.log(JSON.stringify(dic))
|
||||
// if(!dic) break;
|
||||
let point = randomPosition(dic.movePointArray);
|
||||
let point = randomPosition(dic.movePointArray, prePoint, curPoint);
|
||||
let eventCode = genCode(8);
|
||||
let question = dic.eventType == EVENT_TYPE.QUIZ?randomQuestion(EVENT_QUIZ_NUM): [];
|
||||
let data = await EventRecordModel.saveEventRecord(eventCode, {
|
||||
@@ -164,13 +223,36 @@ export async function refreshEvent(num: number, roleId: string, roleName: string
|
||||
return event;
|
||||
}
|
||||
|
||||
function randomPosition(positionStr: string) {
|
||||
/**
|
||||
* 随机出当前事件的位置
|
||||
*
|
||||
* @param positionStr
|
||||
*/
|
||||
function randomPosition(positionStr: string, prePoint: Array<number>, curPoint: Array<number>) {
|
||||
let positionArr = decodeStr('point', positionStr, '&');
|
||||
let index = Math.floor(Math.random() * positionArr.length);
|
||||
return positionArr[index]
|
||||
let range = positionArr.filter(point => {return !prePoint.includes(point) && !curPoint.includes(point)});
|
||||
if(range.length == 0) { // 如果位置总数不够,就不管prePoint里的
|
||||
range = positionArr.filter(point => {return !curPoint.includes(point)});
|
||||
}
|
||||
if(range.length == 0) { // 还是不够,那是配表的问题,直接报错
|
||||
throw new Error('event position not enough');
|
||||
}
|
||||
let index = Math.floor(Math.random() * range.length);
|
||||
let point = range[index];
|
||||
curPoint.push(point);
|
||||
|
||||
return point
|
||||
}
|
||||
|
||||
function pushEventMsg(app, roleId, channelName, msg ) {
|
||||
/**
|
||||
* 推送
|
||||
*
|
||||
* @param app
|
||||
* @param roleId
|
||||
* @param channelName
|
||||
* @param msg
|
||||
*/
|
||||
function pushEventMsg(app: Application, roleId: string, channelName: string, msg: any ) {
|
||||
console.log('***pushEventMsg', channelName)
|
||||
let channelService = app.get('channelService');
|
||||
|
||||
@@ -186,6 +268,12 @@ function pushEventMsg(app, roleId, channelName, msg ) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 领取奖励时检查状态是否正确
|
||||
*
|
||||
* @param type 事件类型
|
||||
* @param status 状态id
|
||||
*/
|
||||
export function checkEventStatus(type: number, status: number) {
|
||||
|
||||
let flag: boolean; // 检查状态是否正确
|
||||
@@ -207,7 +295,13 @@ export function checkEventStatus(type: number, status: number) {
|
||||
return flag
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 领取奖励时调用,领取的是胜利奖励还是失败奖励
|
||||
*
|
||||
* @param type
|
||||
* @param status
|
||||
* @param question
|
||||
*/
|
||||
export function getEventSuccessStatus(type: number, status: number, question: Array<{id: number, status: number}>) {
|
||||
let isSuccess: boolean, returnResult = 1; // 检查状态是否正确
|
||||
if(type == EVENT_TYPE.BATTLE) {
|
||||
@@ -247,6 +341,11 @@ export function checkQuizParam(param: Array<number>, database?: Array<{id: numb
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从题库中随机题目
|
||||
*
|
||||
* @param num 题目数量
|
||||
*/
|
||||
function randomQuestion(num: number) {
|
||||
let questions = getGamedata('Questions');
|
||||
let rid:Array<number> = [], result = [];
|
||||
@@ -262,6 +361,12 @@ function randomQuestion(num: number) {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对答案
|
||||
*
|
||||
* @param id
|
||||
* @param answer
|
||||
*/
|
||||
export function checkQuiz(id: number, answer: number) {
|
||||
let questions = getGamedata('Questions');
|
||||
let result = questions[id - 1];
|
||||
|
||||
Reference in New Issue
Block a user