From 20828f9194712290764c899fd14a2d670dd6daf2 Mon Sep 17 00:00:00 2001 From: luying Date: Fri, 16 Oct 2020 18:57:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E5=A5=87=E9=81=87?= =?UTF-8?q?=E6=9C=AC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game-server/app.ts | 2 +- .../battle/handler/eventBattleHandler.ts | 15 +- game-server/app/services/eventSercive.ts | 128 ++++++++++++------ shared/consts/consts.ts | 1 + shared/db/EventRecord.ts | 6 +- shared/pubUtils/util.ts | 2 +- 6 files changed, 102 insertions(+), 52 deletions(-) diff --git a/game-server/app.ts b/game-server/app.ts index 39d83285a..a837ba81d 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -131,7 +131,7 @@ export function globalErrorHandler(err: Error, msg: any, resp: any, } // app configure -app.configure('production|development', function () { +app.configure('production|development|local', function () { app.set(RESERVED.ERROR_HANDLER, errorHandler); app.set(RESERVED.GLOBAL_ERROR_HANDLER, globalErrorHandler); app.globalAfter((err: Error, routeRecord: RouteRecord, msg: any, session: FrontendOrBackendSession, resp: any, cb: HandlerCallback) => { diff --git a/game-server/app/servers/battle/handler/eventBattleHandler.ts b/game-server/app/servers/battle/handler/eventBattleHandler.ts index c86e649b1..5ede904b4 100644 --- a/game-server/app/servers/battle/handler/eventBattleHandler.ts +++ b/game-server/app/servers/battle/handler/eventBattleHandler.ts @@ -3,7 +3,7 @@ import { getGamedata } from '../../../pubUtils/gamedata'; import EventRecord, { EventRecordModel } from '../../../db/EventRecord'; import { RoleModel } from '../../../db/Role'; import { EVENT_STATUS, EVENT_RECORD_STATUS } from '../../../consts/consts'; -import { checkEvent, getEventTime, refreshEvent, checkEventStatus, getEventSuccessStatus } from '../../../services/eventSercive'; +import { checkEvent, getEventTime, refreshEvent, checkEventStatus, getEventSuccessStatus, checkQuizParam } from '../../../services/eventSercive'; import { handleFixedReward } from '../../../services/rewardService'; export default function(app: Application) { @@ -44,8 +44,8 @@ export class EventBattleHandler { } // 获取关卡列表 - async receiveEventReward(msg: { eventId: number, eventCode: string, answer: number }, session: BackendSession) { - const {eventId, eventCode, answer} = msg; + async receiveEventReward(msg: { eventId: number, eventCode: string, answer: Array<{id: number, answer: number}> }, session: BackendSession) { + const {eventId, eventCode, answer = []} = msg; let roleId = session.get('roleId'); let roleName = session.get('roleName'); let eventStatus = session.get('eventStatus'); @@ -55,11 +55,14 @@ export class EventBattleHandler { return { code: 202, data: '未找到记录' } } let { status, type, eventId: dataEventId, question } = event; - let flag = checkEventStatus(type, status); - if(!flag) { + + if(!checkEventStatus(type, status)) { return { code: 202, data: '状态错误' } } - let isSuccess = getEventSuccessStatus(type, status, {id:question?question.id:0, answer}); + if(!checkQuizParam(answer, question)) { + return { code: 202, data: '参数错误' } + } + let isSuccess = getEventSuccessStatus(type, status, answer); if(dataEventId != eventId) { return { code: 202, data: '事件id错误' } diff --git a/game-server/app/services/eventSercive.ts b/game-server/app/services/eventSercive.ts index 0a26e5e06..3e897309c 100644 --- a/game-server/app/services/eventSercive.ts +++ b/game-server/app/services/eventSercive.ts @@ -2,8 +2,8 @@ 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'; +import { genCode, decodeStrSingle, decodeStr, getRandomWithWeight } from '../pubUtils/util'; +import { EVENT_STATUS, EVENT_RECORD_STATUS, EVENT_TYPE, EVENT_RANDOM_TYPE_ONE_OPEN, EVENT_QUIZ_NUM } from '../consts/consts'; export async function setBattleStatus(app: Application, session: FrontendOrBackendSession, roleId: string, battleId: number , isSuccess: boolean, battleCode: string) { @@ -108,35 +108,56 @@ export async function refreshEvent(num: number, roleId: string, roleName: string 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; + if(EVENT_RANDOM_TYPE_ONE_OPEN) { + 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]; + console.log(JSON.stringify(randomList)); + + for(let i = 0; i < num; i++) { + if(randomList.length == 0) { // 一轮刷新过,开始新的一轮,保证所有事件都能刷新一遍 + turn ++; + randomList = [...dicEvent]; + } + if(randomList.length == 0) break; // 如果还是为0,pass + + 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(EVENT_QUIZ_NUM): 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); + } + } else { + let randomList = dicEvent; + console.log('*********', randomList.length, num); + for(let i = 0; i < num; i++) { + let {dic} = getRandomWithWeight(randomList); + console.log(JSON.stringify(dic)) + // if(!dic) break; + let position = randomPosition(dic.position); + let eventCode = genCode(8); + let question = dic.eventType == EVENT_TYPE.QUIZ?randomQuestion(EVENT_QUIZ_NUM): []; + let data = await EventRecordModel.saveEventRecord(eventCode, { + roleId, refTime: t, eventId: dic.eventID, + roleName, type: dic.eventType, battleId: dic.warId||0, quality: dic.quality, + status: EVENT_RECORD_STATUS.WAITING, + position, question + }); + event.push(data) } - if(randomList.length == 0) break; // 如果还是为0,pass - 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; } @@ -185,7 +206,7 @@ export function checkEventStatus(type: number, status: number) { } -export function getEventSuccessStatus(type: number, status: number, question: {id: number, answer: number}) { +export function getEventSuccessStatus(type: number, status: number, answer: Array<{id: number, answer: number}>) { let isSuccess: boolean; // 检查状态是否正确 if(type == EVENT_TYPE.BATTLE) { if(status == EVENT_RECORD_STATUS.BATTLE_SUCCESS) { @@ -196,22 +217,47 @@ export function getEventSuccessStatus(type: number, status: number, question: {i } else if(type == EVENT_TYPE.BOX) { isSuccess = true; } else if (type == EVENT_TYPE.QUIZ) { - isSuccess = checkQuiz(question) + isSuccess = checkQuiz(answer) } 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}; +export function checkQuizParam(param: Array<{id: number, answer: number }>, database?: Array<{id: number}>) { + + if(database) { + let flag = true; + for(let {id} of database) { + let index = param.findIndex(cur => cur.id == id); + if(index == -1) flag = false; break; + } + return flag + } else { + return true + } } -function checkQuiz(obj: {id: number, answer: number }) { - let {id, answer} = obj; +function randomQuestion(num: number) { let questions = getGamedata('Questions'); - let result = questions[id - 1]; - return !!result && result.correct == answer; -} \ No newline at end of file + let rid:Array = [], result = []; + while(num > 0) { + let index = Math.floor(Math.random() * questions.length); + let {id, question, a1, a2, a3, a4, correct} = questions[index]; + if(rid.includes(id)) continue; + rid.push(id); + result.push({id, question, answer: [a1, a2, a3, a4], correct}); + num--; + } + return result; +} + +function checkQuiz(arr: Array<{id: number, answer: number }>) { + let flag = true; + let questions = getGamedata('Questions'); + for(let {id, answer} of arr) { + let result = questions[id - 1]; + if(!result || result.correct != answer) { + flag = false; + } + } + return flag +} diff --git a/shared/consts/consts.ts b/shared/consts/consts.ts index 7aeef4d85..00552695a 100644 --- a/shared/consts/consts.ts +++ b/shared/consts/consts.ts @@ -101,3 +101,4 @@ export const WAR_JSON_ATTRIBUTE_TYPE = { "17": "ap" // 怒气 }; +export const EVENT_QUIZ_NUM = 3; \ No newline at end of file diff --git a/shared/db/EventRecord.ts b/shared/db/EventRecord.ts index 72e0d7be4..b761d6be4 100644 --- a/shared/db/EventRecord.ts +++ b/shared/db/EventRecord.ts @@ -40,8 +40,8 @@ export default class EventRecord extends BaseModel { turn: number; // 随机的轮数,保证每个event_id都能随机到一次再进行下一轮 @prop({ required: true }) position: {x:number, y: number}; // 位置 - @prop({ required: true }) - question: Question; // 题库id + @prop({ required: true, type: Question, default: [] }) + question: Array; // 题库id public static async getEventRecordByTime(roleId: string, refTime: number, lean=true ) { @@ -60,7 +60,7 @@ export default class EventRecord extends BaseModel { return {history: result, turn}; } - public static async saveEventRecord(eventCode: string, params: {roleId: string, refTime: number, eventId: number, roleName:string, turn?: number, type: number, quality: number, battleId?: number, status: number, position: {x:number, y:number}, question?: any } , lean=true ) { + public static async saveEventRecord(eventCode: string, params: {roleId: string, refTime: number, eventId: number, roleName:string, turn?: number, type: number, quality: number, battleId?: number, status: number, position: {x:number, y:number}, question: Array } , lean=true ) { let doc = new EventRecordModel(); let update = Object.assign(doc.toJSON(), params, {eventCode}); let data = await EventRecordModel.findOneAndUpdate({eventCode}, { $set: update }, {upsert: true, new: true}).select('eventCode eventId type quality status battleId position question').lean(lean); diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index 5990ff1e7..b26f15c6b 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -1,4 +1,4 @@ -import { STATUS } from './../consts/statusCode'; +// import { STATUS } from './../consts/statusCode'; import { getGamedata } from './gamedata'; import { HeroModel } from '../db/Hero';