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
|
||
});
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|