xy-server/game/core/RespondentsMgr.ts

169 lines
5.3 KiB
TypeScript
Raw Normal View History

2025-04-23 09:34:08 +08:00
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
});
}
}