169 lines
5.3 KiB
TypeScript
169 lines
5.3 KiB
TypeScript
|
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 = `<color=#0096ff >${data.ename}</c ></c >`;
|
|||
|
// 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 = `<color=#04EB5C >文曲星君</c >: <color=#ffffff >现在公布本期谜题答案为 </c ><color=#F09600 >${data.ekeys}</color >。聪明的你答对了吗?</c >`;
|
|||
|
PlayerMgr.shared.broadcast('s2c_screen_msg', {
|
|||
|
strRichText: strRichText,
|
|||
|
bInsertFront: 0
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|