@@ -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 . floo r ( Math . random ( ) * positionArr . length ) ;
return positionArr [ index ]
let range = positionArr . filte r ( 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 ] ;