xy-server/game/object/Ofuda.ts

437 lines
16 KiB
TypeScript
Raw Normal View History

2025-04-23 09:34:08 +08:00
import PlayerMgr from "../object/PlayerMgr";
import GoodsMgr from "../item/GoodsMgr";
import DB from "../utils/DB";
import SKDataUtil from "../gear/SKDataUtil";
import EquipMgr from "../object/EquipMgr";
import GameUtil from "../core/GameUtil";
import BangMgr from "../bang/BangMgr";
import SkillUtil from "../skill/core/SkillUtil";
import ChangeCard from "../object/ChangeCard";
import SKLogger from "../gear/SKLogger";
export default class Ofuda {
static shared = new Ofuda();
oflist: any[];
ofudalist: any[];
qianjunlist: any[];
zaiwulist: any[];
yvshoulist: any[]
pofuda_map: Map<number, any>;
constructor() {
this.oflist = [100321, 100322, 100323]; //待鉴定 千钧符 载物符 御兽符
this.ofudalist = []; //天策符列表
this.qianjunlist = []; //千钧符列表
this.zaiwulist = []; //载物符列表
this.yvshoulist = []; //御兽符列表
this.pofuda_map = new Map<number, any>(); //所有玩家的天策符
}
init() {
this.readDB();
}
readDB() {
let sql = `SELECT * FROM qy_ofuda`;
DB.query(sql, (error: any, rows: any) => {
for (let i = 0; i < rows.length; i++) {
if (rows[i].of_type == 1) {
this.qianjunlist.push({
ofudaid: rows[i].id, //天策符id
skillid: rows[i].skillid, //技能id
name: rows[i].name, //天策符名字
oftype: rows[i].of_type, //天策符类型
tier: rows[i].tier, //层数
})
}
if (rows[i].of_type == 2) {
this.zaiwulist.push({
ofudaid: rows[i].id, //天策符id
skillid: rows[i].skillid, //技能id
name: rows[i].name, //天策符名字
oftype: rows[i].of_type, //天策符类型
tier: rows[i].tier, //层数
})
}
if (rows[i].of_type == 3) {
this.yvshoulist.push({
ofudaid: rows[i].id, //天策符id
skillid: rows[i].skillid, //技能id
name: rows[i].name, //天策符名字
oftype: rows[i].of_type, //天策符类型
tier: rows[i].tier, //层数
})
}
this.ofudalist.push({
ofudaid: rows[i].id, //天策符id
skillid: rows[i].skillid, //技能id
name: rows[i].name, //天策符名字
oftype: rows[i].of_type, //天策符类型
tier: rows[i].tier, //层数
});
}
});
let starid = 0
let size = 1000
let psql = `SELECT roleid,ofuda_data FROM role_has_ofuda where id > ${starid} limit ${size}`;
let callback = (error: any, rows: any)=>{
for (let i = 0; i < rows.length; i++) {
let ofudalist = SKDataUtil.jsonBy(rows[i].ofuda_data);
if (ofudalist == null || ofudalist == undefined) {
continue;
}
for (let ofuda of ofudalist) {
if (ofuda == null || ofuda == undefined) {
continue;
}
//卸下所有天策符
// ofuda.usestate = 0;
let roleid = Number(ofuda.roleid); //如果不是int类型会读取不到
if (this.pofuda_map.has(roleid)) {//map里有没有这个key值
this.pofuda_map.get(roleid).push(ofuda)
} else {
let list = [];
list.push(ofuda)
this.pofuda_map.set(roleid, list);
}
}
}
if (rows.length == size){
starid = starid + size
psql = `SELECT roleid,ofuda_data FROM role_has_ofuda where id > ${starid} limit ${size}`;
DB.query(psql, callback);
}
}
DB.query(psql, callback);
}
getOfListByRoid(roleid: number) {
let ofudalist = [];
let list = this.pofuda_map.get(roleid);
if (list != undefined){
for (let ofuda of list) {
if (ofuda == null || ofuda == undefined) {
continue;
}
ofudalist.push(ofuda);
}
}
return ofudalist;
}
//天策符列表
getOfudaListByRoid(roleid: number) {
let player = PlayerMgr.shared.getPlayerByRoleId(roleid);
let list = this.getOfListByRoid(roleid);
player.send("s2c_own_ofuda", {list: SKDataUtil.toJson(list, "{}")})
}
//天演策列表
getOfudaList() {
return this.ofudalist;
}
//合成天策符
compoundOfuda(data: any) {
let ms1 = new Date().getMilliseconds();
let player = PlayerMgr.shared.getPlayerByRoleId(data.roleid);
let itemData = GoodsMgr.shared.getItemInfo(data.itemid);
let n = player.getBagItemNum(data.itemid);
if (n < (itemData.num * data.count)) {
player.send_notice("碎片数量不足!")
return;
}
let count = 0;
for (let i = 0; i < data.count; i++) {
let ofuda = Math.floor(Math.random() * this.oflist.length);
count += 10;
player.addBagItem(this.oflist[ofuda], 1, true);
}
player.addBagItem(data.itemid, -count, true);
let ms2 = new Date().getMilliseconds();
let time = ms2 - ms1;
SKLogger.info(`合成 - 处理时间${time}ms`)
}
//鉴定天策符
ahcOfuda(data: any) {
let ms1 = new Date().getMilliseconds();
let player = PlayerMgr.shared.getPlayerByRoleId(data.roleid);
let list = [];
let olist = [];
let itemid = 0;
if (data.ofudatype == 1) {
itemid = 100321 //待鉴定的千钧符
olist = this.qianjunlist;
}
if (data.ofudatype == 2) {
itemid = 100322 //待鉴定的载物符
olist = this.zaiwulist;
}
if (data.ofudatype == 3) {
itemid = 100323 //待鉴定的御兽符
olist = this.yvshoulist;
}
for (let i = 0; i < data.count; i++) {
let oid = Math.floor(Math.random() * olist.length);
let ofuda = olist[oid];
if (ofuda == undefined || ofuda == null) {
i--;
continue;
}
let ofudaid = Math.random().toString(16).substr(2); //生成天策符id
let addition = Math.floor(Math.random() * 10); //加成
if (addition == 0) {
addition = 1;
}
let grade = 1; //品阶
let skillid = ofuda.skillid;
if (ofuda.tier >= 3 && ofuda.tier < 5 && addition >= 8) {
grade = Math.round(Math.random() * 3);
} else if (ofuda.tier == 5 && addition >= 6) {
grade = Math.round(Math.random() * 3);
} else {
grade = Math.round(Math.random() * 2);
}
if (grade == 0) {
grade = 1;
}
if (grade == 2) {
skillid += 1;
} else if (grade == 3) {
skillid += 2;
}
if (skillid == 10205 || skillid == 10206 || skillid == 10207) {//千面符跳过
i--;
continue;
}
let obj = {
ofudatype: ofuda.oftype,
name: ofuda.name, //天策符名字
grade: grade,
addition: addition,
skillid: skillid,
}
list.push(obj);
let ofudaobj = {
roleid: player.roleid,
ofudaid: ofudaid, //天策符id
oftype: ofuda.oftype, //天策符类型
name: ofuda.name, //天策符名字
grade: grade, //天策符品阶
addition: addition, //加成
skillid: skillid, //技能id
tier: ofuda.tier, //层数
usestate: 0, //使用状态
}
if (this.pofuda_map.has(player.roleid)) {//map里有没有这个key值
this.pofuda_map.get(player.roleid).push(ofudaobj)
} else {
let list = [];
list.push(ofudaobj)
this.pofuda_map.set(player.roleid, list);
}
}
player.addBagItem(itemid, -data.count, true);
let ms2 = new Date().getMilliseconds();
let time = ms2 - ms1;
SKLogger.info(`鉴定 - 处理时间${time}ms`)
player.send('s2c_authenticate_ofuda', {
ofudainfo: SKDataUtil.toJson(list, "{}")
});
}
//分解天策符
resolveOfuda(data: any) {
let player = PlayerMgr.shared.getPlayerByRoleId(data.roleid);
let ofudalist = this.pofuda_map.get(data.roleid);
if (ofudalist == null || ofudalist == undefined) {
return;
}
for (let key in ofudalist) {
let ofuda = ofudalist[key];
if (ofuda == null || ofuda == undefined) {
continue;
}
if (data.ofudaid == ofuda.ofudaid && ofuda.roleid == data.roleid) {
if (ofuda.grade == 1) {
player.addBagItem(100320, 1, true);
}
if (ofuda.grade == 2) {
player.addBagItem(100320, 5, true);
}
if (ofuda.grade == 3) {
player.addBagItem(100320, 10, true);
}
delete ofudalist[key];
break;
}
}
this.getOfudaListByRoid(player.roleid);
}
//升级天演策
levelUp(data: any) {
let player = PlayerMgr.shared.getPlayerByRoleId(data.roleid);
if (player) {
if (player.jade < data.jade || player.bangscore < data.score) {
player.send_notice("仙玉或帮贡不足,升级失败")
return false;
}
if (data.level >= 150) {
player.send_notice("等级已达到上限!")
return false;
}
let bang = BangMgr.shared.getBang(player.bangid);
if (bang) {
let list = bang.rolelist;
for (let key in list) {
if (player.roleid == list[key].roleid) {
player.addMoney(GameUtil.goldKind.Jade, -data.jade, "天演策升级");
player.addMoney(GameUtil.goldKind.bang_Score, -data.score, "天演策升级");
list[key].ofudalevel += data.level;
DB.updateBangMemberOfuda(list[key].ofudalevel, player.roleid)
player.send_notice(`耗费[${-data.jade}]仙玉、[${-data.score}]帮贡,天演策等级提升到[${list[key].ofudalevel}]级`)
return true;
}
}
}
}
return false;
}
//装备天策符
useOfuda(data: any) {
let ms1 = new Date().getMilliseconds();
let player = PlayerMgr.shared.getPlayerByRoleId(data.roleid);
if (player) {
let ofudalist = this.pofuda_map.get(data.roleid);
if (ofudalist == null || ofudalist == undefined) {
return;
}
let ofuda = null;
for (let info of ofudalist) {
if (info == null || info == undefined) {
continue;
}
if (info.ofudaid == data.ofudaid) {
ofuda = info;
break;
}
}
if (ofuda == null) {
player.send_notice("你没有这个天策符");
return;
}
for (let key in ofudalist) {
let info = ofudalist[key];
if (info == null || info == undefined) {
continue;
}
//卸下通用位置的天策符
if (data.usestate == 3 && ofuda.oftype == info.oftype && data.usestate == info.usestate) {
info.usestate = 0;
break;
}
//根据层数和类型卸下天策符
if (ofuda.oftype == info.oftype && ofuda.tier == info.tier && data.usestate == info.usestate) {
info.usestate = 0;
}
//卸下相同的天策符 (相同的天策符只能装备一个)
if (ofuda.name == info.name && info.usestate > 0) {
info.usestate = 0;
}
}
//装备天策符
for (let key in ofudalist) {
let info = ofudalist[key];
if (info == null || info == undefined) {
continue;
}
if (ofuda.ofudaid == info.ofudaid && data.usestate == 1) { //第一个格子
info.usestate = 1;
player.calculateAttr();
//检查变身卡效果
ChangeCard.shared.checkCard(player.roleid);
break;
}
if (ofuda.ofudaid == info.ofudaid && data.usestate == 2) { //第二个格子
info.usestate = 2;
player.calculateAttr();
//检查变身卡效果
ChangeCard.shared.checkCard(player.roleid);
break;
}
if (ofuda.ofudaid == info.ofudaid && data.usestate == 3) { //通用位置
info.usestate = 3;
player.calculateAttr();
//检查变身卡效果
ChangeCard.shared.checkCard(player.roleid);
break;
}
}
let ms2 = new Date().getMilliseconds();
let time = ms2 - ms1;
SKLogger.info(`装备 - 处理时间${time}ms`)
}
}
//正在使用的天策符
inUseOfudaByRoleid(roleid: number) {
let ofuda_map = new Map<number, any>();
let ofudalist = this.pofuda_map.get(roleid);
if (ofudalist == null || ofudalist == undefined) {
return null;
}
for (let ofuda of ofudalist) {
if (ofuda == null || ofuda == undefined) {
continue;
}
if (ofuda.usestate > 0) {
ofuda_map.set(ofuda.skillid, ofuda);
}
}
return ofuda_map;
}
createOfuda(data: any){
let ofuda = null;
for(let info of this.ofudalist){
if(info.name == data.name){
ofuda = info;
}
}
if(ofuda == null || ofuda == undefined){
return null;
}
let skillId = ofuda.skillid;
if (data.grade == 2) {
skillId += 1;
}
if (data.grade == 3) {
skillId += 2;
}
let ofudaid = Math.random().toString(16).substr(2);
let ofudaobj = {
roleid: data.roleid,
ofudaid: ofudaid, //天策符id
oftype: ofuda.oftype, //天策符类型
name: data.name, //天策符名字
grade: data.grade, //天策符品阶
addition: data.addition, //加成
skillid: skillId, //技能id
tier: ofuda.tier, //层数
usestate: 0, //使用状态
}
return ofudaobj;
}
}