xy-server/game/core/RespondentsMgr.ts
2025-04-23 09:34:08 +08:00

169 lines
5.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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