From 8da723ab4b523fb7d655e870e0758f3a1877dd6c Mon Sep 17 00:00:00 2001 From: luying Date: Tue, 20 Oct 2020 16:15:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A5=87=E9=81=87=E6=9C=AC=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../battle/handler/eventBattleHandler.ts | 20 +- .../app/servers/gm/handler/gmHandler.ts | 22 +-- game-server/app/services/eventSercive.ts | 173 ++++++++++++++---- shared/consts/consts.ts | 2 + 4 files changed, 147 insertions(+), 70 deletions(-) diff --git a/game-server/app/servers/battle/handler/eventBattleHandler.ts b/game-server/app/servers/battle/handler/eventBattleHandler.ts index ce2a6c71b..90a706f4e 100644 --- a/game-server/app/servers/battle/handler/eventBattleHandler.ts +++ b/game-server/app/servers/battle/handler/eventBattleHandler.ts @@ -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; - 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 }); } diff --git a/game-server/app/servers/gm/handler/gmHandler.ts b/game-server/app/servers/gm/handler/gmHandler.ts index 7a48a1416..520cf674b 100644 --- a/game-server/app/servers/gm/handler/gmHandler.ts +++ b/game-server/app/servers/gm/handler/gmHandler.ts @@ -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; - 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', { diff --git a/game-server/app/services/eventSercive.ts b/game-server/app/services/eventSercive.ts index 7a6014a14..c429ef473 100644 --- a/game-server/app/services/eventSercive.ts +++ b/game-server/app/services/eventSercive.ts @@ -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 = []; + 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) { 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(); 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(); 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, curPoint: Array) { 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, database?: Array<{id: numb } } +/** + * 从题库中随机题目 + * + * @param num 题目数量 + */ function randomQuestion(num: number) { let questions = getGamedata('Questions'); let rid:Array = [], 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]; diff --git a/shared/consts/consts.ts b/shared/consts/consts.ts index 8253b3264..a4bd0dd06 100644 --- a/shared/consts/consts.ts +++ b/shared/consts/consts.ts @@ -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 = {