Files
ZYZ/game-server/app/services/eventSercive.ts
2020-10-16 14:54:28 +08:00

217 lines
7.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Application, FrontendOrBackendSession } from 'pinus';
import { getGamedata } from '../pubUtils/gamedata';
import { EventRecordModel } from '../db/EventRecord';
import { RoleModel } from '../db/Role';
import { genCode, decodeStrSingle, decodeStr } from '../pubUtils/util';
import { EVENT_STATUS, EVENT_RECORD_STATUS, EVENT_TYPE } from '../consts/consts';
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);
await checkEvent(app, session, true);
return result;
}
export function getEventTime(now: Date) {
let curTime = Number(now);
let todayA = now.setHours(12, 0, 0, 0); // 每天12点
let todayB = now.setHours(18, 0, 0, 0); // 每天18点
let yesterdayA = todayA - 86400000; // 前一天12点
let t = 0;
if(curTime < todayA) {
t = yesterdayA;
} else if (curTime >= todayA && curTime < todayB) {
t = todayA;
} else if (curTime >= todayB) {
t = todayB;
}
return t
}
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); // 刷新初始的一件
await RoleModel.setEventStatus(roleId, EVENT_STATUS.STARTING);
session.set('eventStatus', EVENT_STATUS.STARTING);
session.push('eventStatus', () => {});
pushEventMsg(app, roleId, channelName, { event }); // 推送
}
export async function checkEvent(app: Application, session: FrontendOrBackendSession, isForce:boolean = false) {
try {
let roleId = session.get('roleId');
if(roleId) {
let roleName = session.get('roleName');
let channelName = roleId;
let eventStatus = session.get('eventStatus')||EVENT_STATUS.WAITING;
let eventTime = session.get('getEventTime')||0;
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);
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', () => {});
}
}
}
return;
}catch(err) {
console.log(err.stack);
throw err
}
}
export async function refreshEvent(num: number, roleId: string, roleName: string, t) {
let event = new Array();
let dicEvent = getGamedata('dic_zyz_event');
let role = await RoleModel.findByRoleId(roleId);
dicEvent = dicEvent.filter(cur => { // 筛选适合等级
let { suitLevel } = cur;
suitLevel = decodeStrSingle('eventSuitLevel', suitLevel);
return suitLevel.min <= role.lv && suitLevel.max >= role.lv
});
let historyRecord = await EventRecordModel.getHostoryEventRecord(roleId);
let {history, turn} = historyRecord;
let randomList = dicEvent.filter(cur => {
return history.find(ccur => {
return ccur.eventId != cur.eventID;
});
});
console.log(JSON.stringify(randomList));
for(let i = 0; i < num; i++) {
if(randomList.length == 0) { // 一轮刷新过,开始新的一轮,保证所有事件都能刷新一遍
turn ++;
randomList = [...dicEvent];
}
if(randomList.length == 0) break; // 如果还是为0pass
let index = Math.floor(Math.random() * randomList.length);
let dic = randomList[index];
let position = randomPosition(dic.position);
let question = dic.eventType == EVENT_TYPE.QUIZ?randomQuestion(): undefined;
let eventCode = genCode(8);
let data = await EventRecordModel.saveEventRecord(eventCode, {
roleId, refTime: t, eventId: dic.eventID,
roleName, turn, type: dic.eventType, battleId: dic.warId||0, quality: dic.quality,
status: EVENT_RECORD_STATUS.WAITING,
position, question
});
event.push(data);
randomList.splice(index, 1);
}
return event;
}
function randomPosition(positionStr: string) {
let positionArr = decodeStr('position', positionStr);
let index = Math.floor(Math.random() * positionArr.length);
return positionArr[index]
}
function pushEventMsg(app, roleId, channelName, msg ) {
console.log('***pushEventMsg', channelName)
let channelService = app.get('channelService');
let param = { msg };
let channel = channelService.getChannel(channelName, false);
if(!!channel) {
let tsid = channel.getMember(roleId)['sid'];
channelService.pushMessageByUids('onSpecialEvent', param, [{
uid: roleId,
sid: tsid
}]);
}
}
export function checkEventStatus(type: number, status: number) {
let flag: boolean; // 检查状态是否正确
if(type == EVENT_TYPE.BATTLE) {
if(status == EVENT_RECORD_STATUS.BATTLE_SUCCESS) {
flag = true;
} else if (status == EVENT_RECORD_STATUS.BATTLE_FAIL) {
flag = true;
} else {
flag = false;
}
} else {
if(status == EVENT_RECORD_STATUS.WAITING) {
flag = true;
} else {
flag = false;
}
}
return flag
}
export function getEventSuccessStatus(type: number, status: number, question: {id: number, answer: number}) {
let isSuccess: boolean; // 检查状态是否正确
if(type == EVENT_TYPE.BATTLE) {
if(status == EVENT_RECORD_STATUS.BATTLE_SUCCESS) {
isSuccess = true;
} else if (status == EVENT_RECORD_STATUS.BATTLE_FAIL) {
isSuccess = false;
}
} else if(type == EVENT_TYPE.BOX) {
isSuccess = true;
} else if (type == EVENT_TYPE.QUIZ) {
isSuccess = checkQuiz(question)
}
return isSuccess
}
function randomQuestion() {
let questions = getGamedata('Questions');
let index = Math.floor(Math.random() * questions.length);
let result = questions[index];
let {id, question, a1, a2, a3, a4, correct} = result;
return {id, question, answer: [a1, a2, a3, a4], correct};
}
function checkQuiz(obj: {id: number, answer: number }) {
let {id, answer} = obj;
let questions = getGamedata('Questions');
let result = questions[id - 1];
return !!result && result.correct == answer;
}