import DB from "../utils/DB"; import Launch from "./Launch"; import SKLogger from "../gear/SKLogger"; import * as schedule from "node-schedule"; import PlayerMgr from "../object/PlayerMgr"; import SKDataUtil from "../gear/SKDataUtil"; import {MsgCode} from "../role/EEnum"; import GameConf from "../../conf/GameConf"; export default class RespondentsMgr { static shared = new RespondentsMgr(); respondents: any = [];// 答题数据 atPresent: any = {};// 当前问题 schedule: any;// 定时器 missNum: number = 0;// 错过次数 base: number = 0.35;// 经验基数 correct_exp: number = 15000;// 正确经验 mistake_exp: number = 12500;// 错误经验 constructor() { this.respondents = []; } init() { this.readDB(); if(GameConf.respondents){ //答题数据每30分钟执行一次 schedule.scheduleJob("0 0/30 * * * ? ", () => { this.getExam(); }) } } readDB() { // 查询数据库 答题数据 let sql = `SELECT ename, ea, eb, ec, ed, ekeys FROM exam_items `; let self = this; this.respondents = []; DB.query(sql, (error:any, rows:any) => { if(error){ let info = DB.errorInfo(error); SKLogger.warn(`答题数据:读档错误[${info}]`); return; } for (let i = 0; i < rows.length; i++) { this.respondents.push(rows[i]); } SKLogger.info(`答题模块加载完毕!`); let className:string= self.constructor.name; Launch.shared.complete(className); }); } /** * 开始随机抽取一道题 进行本期的试卷题 */ getExam(){ // 随即生成一个随即数 如果大于5 生成一次文曲星 if (Math.floor(Math.random() * 10) + 1 > 5 || this.missNum > 3){ // 清空数据缓存 this.missNum = 0; this.atPresent = {}; // 随机取出 一道题 let data = this.respondents[Math.floor(Math.random() * this.respondents.length)]; // 封装数据 let content: any = {}; content.scale = 6; // 打开文曲星窗口 data.type = MsgCode.SUCCESS; content.msg = SKDataUtil.toJson(data,"{}"); // 将当前试卷存起来 this.atPresent = data; // 通知所有玩家答题 PlayerMgr.shared.broadcast('s2c_game_chat', content); // let strRichText = `${data.ename}`; // PlayerMgr.shared.broadcast('s2c_game_chat', { // resid: 3005, // msg: strRichText, // scale: 0 // }); // 生成一个定时器 this.schedule = schedule.scheduleJob("0/59 * * * * ? ", () => { this.shutDownExam(); }) }else { this.missNum += 1; } } /** * 玩家答题 */ getAnswer(data: any){ let exp: number = 10; let present = this.atPresent; let player = PlayerMgr.shared.getPlayerByRoleId(data.roleId); if (player){ // 取出答案 let ekeys = present.ekeys; // 玩家答案 let answer = data.answer; // 回答正确 if (ekeys == answer){ //计算回答正确的奖励 exp = player.level * this.correct_exp + player.relive * this.correct_exp; }else { //计算回答错误的奖励 exp = player.level * this.mistake_exp + player.relive * this.mistake_exp; } // 发放奖励 player.addExp(Math.floor(exp * this.base)); // 发放当前出战宠物奖励 if (player.curPet){ player.curPet.addExp(Math.floor(exp * this.base)) } // 关闭文曲星 player.send("s2c_close_exam",{ roleId: data.roleId, type: MsgCode.FAILED }) let msgData: any = {}; msgData.msg = answer; msgData.teamid = player.teamid; msgData.name = player.name; msgData.resid = player.resid; msgData.roleid = player.roleid; msgData.onlyid = player.onlyid; msgData.relive = player.relive; PlayerMgr.shared.broadcast('s2c_game_chat', msgData); } } shutDownExam(){ // 关闭定时器 this.schedule.cancel(); // 获取试卷 let data = this.atPresent // 清空试卷 this.atPresent = {}; // 定义对象 let content: any = {}; // 通知类型 content.scale = 6; // 封装答题数据 content.msg = SKDataUtil.toJson({"type": MsgCode.FAILED},"{}"); // 通知所有玩家关闭文曲星 PlayerMgr.shared.broadcast('s2c_game_chat', content); // 公布本题答案 let strRichText = `文曲星君: 现在公布本期谜题答案为 ${data.ekeys}。聪明的你答对了吗?`; PlayerMgr.shared.broadcast('s2c_screen_msg', { strRichText: strRichText, bInsertFront: 0 }); } }