奇遇本刷新机制调整

This commit is contained in:
luying
2020-10-20 16:15:21 +08:00
parent 16085ca55d
commit 8da723ab4b
4 changed files with 147 additions and 70 deletions

View File

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

View File

@@ -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', {

View File

@@ -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-1812 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];

View File

@@ -42,6 +42,8 @@ export const WAR_TYPE = {
// 事件,是否开启保存随机记录方式
export const EVENT_RANDOM_TYPE_ONE_OPEN = false;
// 奇遇事件每次刷新几个
export const EVENT_REFRESH_NUM = 3;
// 存于用户Role表事件开启状态
export const EVENT_STATUS = {