779 lines
33 KiB
TypeScript
779 lines
33 KiB
TypeScript
import GameUtil from "../core/GameUtil";
|
||
import PlayerMgr from "./PlayerMgr";
|
||
import Player from "./Player";
|
||
import SKDataUtil from "../gear/SKDataUtil";
|
||
import SKLogger from "../gear/SKLogger";
|
||
|
||
import Equip from "./Equip";
|
||
import {EAttrTypeL1, EEquipPos, EEquipType, MsgCode} from "../role/EEnum";
|
||
import DB from "../utils/DB";
|
||
|
||
|
||
|
||
export default class EquipMgr {
|
||
static shared = new EquipMgr();
|
||
shenbingData: any;
|
||
xianqiData: any;
|
||
equipDBTimer: any;
|
||
xinshouData: any;
|
||
highData: any;
|
||
highAttrData: any;
|
||
lianhuaData: any;
|
||
equipObjs: any;
|
||
shopObjs: any;
|
||
lianhuaArr: any;
|
||
// uuidMap: Map<string,any>;
|
||
|
||
constructor() {
|
||
this.shenbingData = null;
|
||
this.xianqiData = null;
|
||
this.equipDBTimer = null;
|
||
// this.uuidMap = new Map<string, any>();
|
||
}
|
||
|
||
launch() {
|
||
this.shenbingData = GameUtil.require_ex('../../conf/prop_data/prop_shenbing');
|
||
this.xianqiData = GameUtil.require_ex('../../conf/prop_data/prop_xianqi');
|
||
let conf = GameUtil.game_conf.baldric;
|
||
for (let key in conf) {
|
||
this.xianqiData[key] = conf[key];
|
||
}
|
||
this.xinshouData = GameUtil.require_ex('../../conf/prop_data/prop_xinshou_equip');
|
||
this.highData = GameUtil.require_ex('../../conf/prop_data/prop_high_equip');
|
||
this.highAttrData = GameUtil.require_ex('../../conf/prop_data/prop_high_equip_attr');
|
||
this.lianhuaData = GameUtil.require_ex('../../conf/prop_data/prop_lianhua');
|
||
this.equipObjs = {};
|
||
this.shopObjs = {};
|
||
this.lianhuaArr = {};
|
||
for (let index = 0; index < 10; index++) {
|
||
this.lianhuaArr[index + 1] = [];
|
||
}
|
||
for (let key in this.lianhuaData) {
|
||
if (this.lianhuaData.hasOwnProperty(key)) {
|
||
let info = this.lianhuaData[key];
|
||
for (let index = 0; index < 10; index++) {
|
||
if (info[`pos${index + 1}`].length > 0) {
|
||
info.key = key;
|
||
this.lianhuaArr[index + 1].push(info);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// let callback = (ret: any, item: any) => {
|
||
// if (ret == MsgCode.SUCCESS) {
|
||
// for (let key in item) {
|
||
// this.uuidMap.set(item[key].EquipID, item[key].EquipID);
|
||
// }
|
||
// }
|
||
// callback = null;
|
||
// }
|
||
// DB.equipKey(callback);
|
||
SKLogger.debug('装备模块加载完毕!');
|
||
}
|
||
|
||
addEquip(equip: any) {
|
||
this.equipObjs[equip.EquipID] = equip;
|
||
}
|
||
|
||
delEquip(equipid: any) {
|
||
delete this.equipObjs[equipid];
|
||
}
|
||
|
||
getEquipByID(equipid: any) {
|
||
return this.equipObjs[equipid];
|
||
}
|
||
|
||
getXianQiBy(equipId: string) {
|
||
return this.xianqiData[equipId];
|
||
}
|
||
|
||
sellEquip(equipid: any) {
|
||
let equip = this.equipObjs[equipid];
|
||
if (equip) {
|
||
equip.state = 2;
|
||
this.shopObjs[equip.EquipID] = equip;
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
buyEquip(equipid: any) {
|
||
let equip = this.shopObjs[equipid];
|
||
if (equip) {
|
||
equip.state = 1;
|
||
delete this.shopObjs[equipid];
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
getSellList(): any {
|
||
let list = [];
|
||
for (const key in this.shopObjs) {
|
||
if (this.shopObjs.hasOwnProperty(key)) {
|
||
const equip = this.shopObjs[key];
|
||
list.push({
|
||
Shape: equip.Shape,
|
||
EquipID: equip.EquipID,
|
||
EIndex: equip.EIndex,
|
||
EName: equip.EName,
|
||
OwnerRoleId: equip.OwnerRoleId
|
||
});
|
||
}
|
||
}
|
||
return SKDataUtil.toJson(list,"[]");
|
||
}
|
||
|
||
save() {
|
||
for (let key in this.equipObjs) {
|
||
if (this.equipObjs.hasOwnProperty(key)) {
|
||
let equip = this.equipObjs[key];
|
||
equip.save();
|
||
}
|
||
}
|
||
}
|
||
// 获得佩饰基础属性-4条
|
||
getBaldricBaseAttr(pos: number, level: number): any[] {
|
||
// 基础属性:戒指・右同戒指・左
|
||
if (pos == 12) {
|
||
pos = 10;
|
||
}
|
||
let attr = this.lianhuaArr[pos];
|
||
let result: any[] = [];
|
||
if (attr == null) {
|
||
return result;
|
||
}
|
||
let factor = 0;
|
||
if (level == 1) factor = 0.3;
|
||
if (level == 2) factor = 0.5;
|
||
for (let index = 0; index < 4; index++) {
|
||
let info = attr[Math.floor(Math.random() * attr.length)];
|
||
let valuearr = info[`pos${pos}`].split(',');
|
||
let deltaValue = Number(valuearr[1]) - Number(valuearr[0]);
|
||
let randValue = Math.random() * deltaValue * 0.2 + deltaValue * factor;
|
||
let type = GameUtil.attrEquipTypeStr[info.key];
|
||
let fvalue = Number(valuearr[0]) + randValue;
|
||
let value = parseInt(String(fvalue));
|
||
let item: any = {};
|
||
item[type] = value;
|
||
result.push(item);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
getLianhuaData(pos: any, level: any):any[]{
|
||
let lianhualist = [];
|
||
for(let i = 0; i < 6; i++){
|
||
let arr = this.lianhuaArr[pos];
|
||
let cnt = Math.floor(Math.random() * 5) + 1;
|
||
let lianhuaAttr = [];
|
||
let factor = 0;
|
||
if (level == 1) factor = 0.3;
|
||
if (level == 2) factor = 0.5;
|
||
for (let index = 0; index < cnt; index++) {
|
||
if (!arr) {
|
||
SKLogger.warn(`$警告:${pos},${level}`);
|
||
continue;
|
||
}
|
||
let info = arr[Math.floor(Math.random() * arr.length)];
|
||
let valuearr = info[`pos${pos}`].split(',');
|
||
let deltaValue = Number(valuearr[1]) - Number(valuearr[0]);
|
||
let randValue = Math.random() * deltaValue * 0.5 + deltaValue * factor;
|
||
let fvalue = Number(valuearr[0]) + randValue;
|
||
let attrtype = GameUtil.attrEquipTypeStr[info.key];
|
||
let oneinfo: any = {};
|
||
oneinfo[attrtype] = parseInt(String(fvalue));
|
||
lianhuaAttr.push(oneinfo);
|
||
}
|
||
lianhualist.push(lianhuaAttr)
|
||
}
|
||
return lianhualist;
|
||
}
|
||
|
||
/**翅膀炼化数据 */
|
||
getWingLianhuaData(): any[] {
|
||
|
||
let arr = ['PhyDef', 'VoidRate', 'AtkPercent', 'HpPer', 'Basecon', 'Wakan', 'Power', 'Agility'];
|
||
|
||
let cnt = 5;
|
||
|
||
let lianhuaAttr = [];
|
||
let factor = 0.8;
|
||
for (let index = 0; index < cnt; index++) {
|
||
|
||
let info = arr[Math.floor(Math.random() * arr.length)];
|
||
let valuearr1 = GameUtil.random(20, 40);
|
||
//值2
|
||
let valuearr2 = GameUtil.random(1, 20);
|
||
|
||
let deltaValue = valuearr1 - valuearr2;
|
||
let randValue = Math.random() * deltaValue * 0.5 + deltaValue * factor;
|
||
let fvalue = valuearr2 + randValue;
|
||
let attrtype = GameUtil.attrEquipTypeStr[info];
|
||
|
||
let oneinfo: any = {};
|
||
oneinfo[attrtype] = parseInt(String(fvalue));
|
||
lianhuaAttr.push(oneinfo);
|
||
}
|
||
return lianhuaAttr;
|
||
|
||
}
|
||
|
||
//超级九彩
|
||
getMaxLianhuaData(pos: any, level: any):any[]{
|
||
let arr = this.lianhuaArr[pos];
|
||
let cnt = 5;
|
||
let count = 0;
|
||
let kattr = 0;
|
||
let lianhuaAttr = [];
|
||
let factor = 0.8;
|
||
for (let index = 0; index < cnt; index++) {
|
||
if (!arr) {
|
||
SKLogger.warn(`$警告:${pos},${level}`);
|
||
continue;
|
||
}
|
||
let info = arr[Math.floor(Math.random() * arr.length)];
|
||
let valuearr = info[`pos${pos}`].split(',');
|
||
let deltaValue = Number(valuearr[1]) - Number(valuearr[0]);
|
||
let randValue = Math.random() * deltaValue * 0.5 + deltaValue * factor;
|
||
let fvalue = Number(valuearr[0]) + randValue;
|
||
let attrtype = GameUtil.attrEquipTypeStr[info.key];
|
||
if(kattr == 0){
|
||
kattr = attrtype;
|
||
}
|
||
count++;
|
||
if(count <= 3 && attrtype != kattr){
|
||
cnt++;
|
||
count--;
|
||
continue;
|
||
}
|
||
let oneinfo: any = {};
|
||
oneinfo[attrtype] = parseInt(String(fvalue));
|
||
lianhuaAttr.push(oneinfo);
|
||
}
|
||
return lianhuaAttr;
|
||
}
|
||
|
||
getBaldricRecast(equip: Equip): any {
|
||
let data = this.xianqiData[equip.Type];
|
||
if (data == null) {
|
||
return null;
|
||
}
|
||
let result = this.getEquipArr(data, equip.EquipType);
|
||
return result;
|
||
}
|
||
|
||
/**info
|
||
* type 装备类型,0:新手装备,1:高级装备,2:神兵,3:仙器
|
||
* resid 对应表里的Type,默认0
|
||
* grade 等级,默认0
|
||
* ower 装备角色
|
||
* pos 装备位置
|
||
*/
|
||
getRecastData(info: any) {
|
||
let p = info.role;
|
||
let dataAttr = null;
|
||
if (info.type == 1) {
|
||
dataAttr = this.highData;
|
||
}
|
||
else if (info.type == 3 || info.type == 5) {
|
||
dataAttr = this.xianqiData;
|
||
}
|
||
else {
|
||
//return;
|
||
return null;
|
||
}
|
||
// let recastInfo = null;
|
||
// let baseInfo: any = {};
|
||
let datalist = [];
|
||
for (let key in dataAttr) {
|
||
if (dataAttr.hasOwnProperty(key)) {
|
||
let data = dataAttr[key];
|
||
if (data.OwnerRoleId && data.OwnerRoleId > 0 && data.OwnerRoleId != p.resid) {
|
||
continue;
|
||
}
|
||
if ((data.Race == p.race || data.Race == 9) && (data.Sex == p.sex || data.Sex == 9) && (data.Index == info.pos || info.pos == 0) && data.Type != info.resid) {
|
||
if (info.grade != 0 && info.grade != data.Grade) {
|
||
continue;
|
||
}
|
||
// for(let i = 0; i < 4; i++){
|
||
// if(data.Race == 1){
|
||
// if(data.Index == 1){ //武器
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 4);
|
||
// baseInfo[GameUtil.attrEquipRenHuShi[rand]] = this.getValueForRecast(GameUtil.attrEquipRenHuShi[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 8);
|
||
// baseInfo[GameUtil.attrEquipWeapon[rand]] = this.getValueForRecast(GameUtil.attrEquipWeapon[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// if(data.Index == 3 || data.Index == 4){ //衣服或帽子
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 4);
|
||
// baseInfo[GameUtil.attrEquipRenHuShi[rand]] = this.getValueForRecast(GameUtil.attrEquipRenHuShi[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 12);
|
||
// baseInfo[GameUtil.attrEquipKangXing[rand]] = this.getValueForRecast(GameUtil.attrEquipKangXing[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// }
|
||
// if(data.Race == 2){ //仙族
|
||
// if(data.Index == 1){ //武器
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 4);
|
||
// baseInfo[GameUtil.attrEquipXianHuShi[rand]] = this.getValueForRecast(GameUtil.attrEquipXianHuShi[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 8);
|
||
// baseInfo[GameUtil.attrEquipWeapon[rand]] = this.getValueForRecast(GameUtil.attrEquipWeapon[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// if(data.Index == 3 || data.Index == 4){ //衣服或帽子
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 4);
|
||
// baseInfo[GameUtil.attrEquipXianHuShi[rand]] = this.getValueForRecast(GameUtil.attrEquipXianHuShi[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 12);
|
||
// baseInfo[GameUtil.attrEquipKangXing[rand]] = this.getValueForRecast(GameUtil.attrEquipKangXing[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// }
|
||
// if(data.Race == 3){ //魔族
|
||
// if(data.Index == 1){ //武器
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 4);
|
||
// baseInfo[GameUtil.attrEquipMoHuShi[rand]] = this.getValueForRecast(GameUtil.attrEquipMoHuShi[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 8);
|
||
// baseInfo[GameUtil.attrEquipWeapon[rand]] = this.getValueForRecast(GameUtil.attrEquipWeapon[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// if(data.Index == 3 || data.Index == 4){ //衣服或帽子
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 4);
|
||
// baseInfo[GameUtil.attrEquipMoHuShi[rand]] = this.getValueForRecast(GameUtil.attrEquipMoHuShi[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 12);
|
||
// baseInfo[GameUtil.attrEquipKangXing[rand]] = this.getValueForRecast(GameUtil.attrEquipKangXing[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// }
|
||
// if(data.Race == 4){ //鬼族
|
||
// if(data.Index == 1){ //武器
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 3);
|
||
// baseInfo[GameUtil.attrEquipGuiHuShi[rand]] = this.getValueForRecast(GameUtil.attrEquipGuiHuShi[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 8);
|
||
// baseInfo[GameUtil.attrEquipWeapon[rand]] = this.getValueForRecast(GameUtil.attrEquipWeapon[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// if(data.Index == 3 || data.Index == 4){ //衣服或帽子
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 3);
|
||
// baseInfo[GameUtil.attrEquipGuiHuShi[rand]] = this.getValueForRecast(GameUtil.attrEquipGuiHuShi[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 12);
|
||
// baseInfo[GameUtil.attrEquipKangXing[rand]] = this.getValueForRecast(GameUtil.attrEquipKangXing[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// }
|
||
// if(data.Race == 5){ //龙族
|
||
// if(data.Index == 1){ //武器
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 4);
|
||
// baseInfo[GameUtil.attrEquipLong[rand]] = this.getValueForRecast(GameUtil.attrEquipLong[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 8);
|
||
// baseInfo[GameUtil.attrEquipWeapon[rand]] = this.getValueForRecast(GameUtil.attrEquipWeapon[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// if(data.Index == 3 || data.Index == 4){ //衣服或帽子
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 4);
|
||
// baseInfo[GameUtil.attrEquipLong[rand]] = this.getValueForRecast(GameUtil.attrEquipLong[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 12);
|
||
// baseInfo[GameUtil.attrEquipKangXing[rand]] = this.getValueForRecast(GameUtil.attrEquipKangXing[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// }
|
||
// if(data.Race == 9){
|
||
// if(data.Index == 2){ //项链
|
||
// if(i > 1){
|
||
// let rand = Math.floor(Math.random() * 6);
|
||
// baseInfo[GameUtil.attrEquipTorque[rand]] = this.getValueForRecast(GameUtil.attrEquipTorque[rand],data.Grade);
|
||
// }else{
|
||
// let rand = Math.floor(Math.random() * 12);
|
||
// baseInfo[GameUtil.attrEquipKangXing[rand]] = this.getValueForRecast(GameUtil.attrEquipKangXing[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// if(data.Index == 5){ //鞋
|
||
// if(i < 2){
|
||
// let rand = Math.floor(Math.random() * 14);
|
||
// baseInfo[GameUtil.attrEquipShose[rand]] = this.getValueForRecast(GameUtil.attrEquipShose[rand],data.Grade);
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
//recastInfo = data;
|
||
//break
|
||
datalist.push(data);
|
||
}
|
||
}
|
||
}
|
||
// if (recastInfo == null) {
|
||
// return null;
|
||
// }
|
||
// let result = this.getEquipArr(recastInfo, baseInfo, info.type);
|
||
// return result;
|
||
if (datalist.length == 0) {
|
||
return null;
|
||
}
|
||
let recastdata = datalist[Math.floor(Math.random() * datalist.length)];
|
||
let result = this.getEquipArr(recastdata, info.type);
|
||
return result;
|
||
}
|
||
|
||
/**info
|
||
* type 装备类型,0:新手装备,1:高级装备,2:神兵,3:仙器, 4:翅膀
|
||
* resid 对应表里的Type,默认0
|
||
* index 装备位置,默认0
|
||
* grade 等级,默认0
|
||
*/
|
||
getEquipRes(info: any, resData: any, player: Player): any {
|
||
if (info.resid && info.resid != 0) {
|
||
let result = resData[info.resid];
|
||
if (result) {
|
||
return result;
|
||
}
|
||
}
|
||
let datalist = [];
|
||
for (let key in resData) {
|
||
if (resData.hasOwnProperty(key)) {
|
||
let data = resData[key];
|
||
if (player) {
|
||
if (data.OwnerRoleId && data.OwnerRoleId > 0 && data.OwnerRoleId != player.resid) {
|
||
continue;
|
||
}
|
||
if ((data.Race == player.race || data.Race == 9) && (data.Sex == player.sex || data.Sex == 9) && (data.Index == info.index || info.index == 0)) {
|
||
if (info.grade != 0 && info.grade != data.Grade) {
|
||
continue;
|
||
}
|
||
datalist.push(data);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (datalist.length > 0) {
|
||
return datalist[Math.floor(Math.random() * datalist.length)];
|
||
}
|
||
else {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
getXianQiList(info: any): any[] {
|
||
let player = PlayerMgr.shared.getPlayerByRoleId(info.roleid);
|
||
if (player == null) {
|
||
return null;
|
||
}
|
||
info.type = 3;
|
||
info.grade = 1;
|
||
let list = [];
|
||
for (let index = 0; index < 5; index++) {
|
||
info.index = index + 1;
|
||
list.push(this.getEquipData(info));
|
||
}
|
||
return list;
|
||
}
|
||
|
||
makeEquipAttr(equipInfo: any) {
|
||
if (equipInfo.resid == null) {
|
||
equipInfo.resid = 0;
|
||
}
|
||
if (equipInfo.grade == null) {
|
||
equipInfo.grade = 1;
|
||
}
|
||
let equipAttr: any = this.getEquipData(equipInfo);
|
||
if (!equipAttr) {
|
||
SKLogger.warn(`装备属性生成失败:${equipInfo.resid}`);
|
||
return null;
|
||
}
|
||
|
||
equipAttr.EquipID = this.getEquipID();
|
||
return equipAttr;
|
||
}
|
||
|
||
getEquipID() {
|
||
let flag = true;
|
||
let uuid: string = "";
|
||
let count = 0;
|
||
// while (flag) {
|
||
uuid = SKDataUtil.primaryKey() + SKDataUtil.rolePrimaryKey(10);
|
||
// // 判断主键是否存在,不存在则返回
|
||
// let value = this.uuidMap.get(uuid);
|
||
// if (value == undefined || value == null) {
|
||
// flag = false;
|
||
// this.uuidMap.set(uuid, uuid);
|
||
// }
|
||
// // 连续五次重复自动根据随机数加字符生成主键
|
||
// else if(count > 5){
|
||
// flag = false;
|
||
// uuid = Math.random().toString(16).substr(2);
|
||
// this.uuidMap.set(uuid, uuid);
|
||
// SKLogger.info(`生成UUID失败本次生成主键:${uuid}`);
|
||
// }
|
||
// }
|
||
return uuid;
|
||
}
|
||
|
||
getEquipData(info: any): any {
|
||
let player = null;
|
||
if (info.roleid != null) {
|
||
player = PlayerMgr.shared.getPlayerByRoleId(info.roleid);
|
||
if (player == null) {
|
||
SKLogger.warn(`装备数据:玩家${info.roleid}不存在`);
|
||
return null;
|
||
}
|
||
}
|
||
let equipInfo = null;
|
||
// 装备类型,0:新手装备,1:高级装备,2:神兵,3:仙器 4:翅膀, 5:配饰
|
||
if (info.type == EEquipType.XinShou) { //新手装备
|
||
equipInfo = this.getEquipRes(info, this.xinshouData, player);
|
||
} else if (info.type == EEquipType.HIGH) {//高级装备
|
||
equipInfo = this.getEquipRes(info, this.highData, player);
|
||
} else if (info.type == EEquipType.ShenBing) {//神兵
|
||
equipInfo = this.getEquipRes(info, this.shenbingData, player);
|
||
} else if (info.type == EEquipType.XianQi) {//仙器
|
||
equipInfo = this.getEquipRes(info, this.xianqiData, player);
|
||
} else if (info.type == EEquipType.WING) { // 翅膀
|
||
equipInfo = this.getEquipRes(info, this.xianqiData, player);
|
||
} else if (info.type == EEquipType.BALDRIC) { // 佩饰
|
||
equipInfo = this.getEquipRes(info, this.xianqiData, player);
|
||
} else {
|
||
SKLogger.warn(`$警告:获得装备数据类型错误:${info.type}`);
|
||
}
|
||
if (!equipInfo) {
|
||
return null;
|
||
}
|
||
let result = this.getEquipArr(equipInfo, info.type);
|
||
return result;
|
||
}
|
||
|
||
getHighRndRange(rangestr: any) {
|
||
if (rangestr == null) {
|
||
return 1;
|
||
}
|
||
if (rangestr.endsWith(';')) {
|
||
rangestr = rangestr.substr(0, rangestr.length - 1);
|
||
}
|
||
let rangelist = rangestr.split(';');
|
||
let rndvalue = Math.random() * 100;//用来计算阶梯概率
|
||
if (rangelist.length == 0) {
|
||
return 1;
|
||
}
|
||
let rangevaluelist = [];//每条记录里存三个数,最小,最大,阶梯概率
|
||
for (const valuestr of rangelist) {
|
||
if (valuestr.split(',').length != 3) {
|
||
return 1;
|
||
}
|
||
rangevaluelist.push(valuestr.split(','));
|
||
}
|
||
let minrndvalue = 1;//当前概率的最小值
|
||
let maxrndvalue = 100;//当前概率的最大值
|
||
let startvalue = 0;//阶梯概率初始位置
|
||
for (let index = 0; index < rangevaluelist.length; index++) {
|
||
let v = Number(rangevaluelist[index][2]);
|
||
if (rndvalue >= startvalue && rndvalue <= startvalue + v) {
|
||
minrndvalue = Number(rangevaluelist[index][0]);
|
||
maxrndvalue = Number(rangevaluelist[index][1]);
|
||
break;
|
||
}
|
||
startvalue += v;
|
||
}
|
||
return minrndvalue + Math.floor(Math.random() * (maxrndvalue - minrndvalue));
|
||
}
|
||
|
||
getHighBaseArr(lib: any, factor: any) { //获得高级装备的基础属性
|
||
let baseAttr: any = {};
|
||
let libarr = lib.split(',');
|
||
for (const lib of libarr) {
|
||
if (this.highAttrData[lib] == null) {
|
||
continue;
|
||
}
|
||
let basestr = this.highAttrData[lib].BaseAttr;
|
||
if (!baseAttr) {
|
||
continue;
|
||
}
|
||
if (basestr.endsWith(';')) {
|
||
basestr = basestr.substr(0, basestr.length - 1);
|
||
}
|
||
let baselist = basestr.split(';');
|
||
if (baselist.length == 0) {
|
||
continue;
|
||
}
|
||
let curbase = baselist[Math.floor(Math.random() * baselist.length)];
|
||
let curbasearr = curbase.split(',');
|
||
if (curbasearr.length != 3) {
|
||
continue;
|
||
}
|
||
let curkey = curbasearr[0];
|
||
let curminvalue = Number(curbasearr[1]);
|
||
let curmaxvalue = Number(curbasearr[2]);
|
||
let rndrange = this.getHighRndRange(this.highAttrData[lib].RndRange);
|
||
let curvalue = curminvalue + Math.floor(rndrange * (curmaxvalue - curminvalue) / 100);
|
||
baseAttr[GameUtil.attrEquipTypeStr[curkey]] = Math.floor(curvalue * factor);
|
||
}
|
||
return baseAttr;
|
||
}
|
||
// 获得装备属性
|
||
getEquipArr(equipInfo: any, type: number): any {
|
||
let result: any = {};
|
||
result['BaseAttr'] = '{}';
|
||
result['Shuxingxuqiu'] = '{}';
|
||
result['BaseScore'] = 0;
|
||
result['EDesc'] = '';
|
||
result['Detail'] = '';
|
||
result['Dynamic'] = 0;
|
||
result['Grade'] = 0;
|
||
result['EIndex'] = 0;
|
||
result['JiLv'] = 0;
|
||
result['MaxEmbedGemCnt'] = 0;
|
||
result['MaxEndure'] = 0;
|
||
result['EName'] = '';
|
||
result['NeedGrade'] = 0;
|
||
result['NeedRei'] = 0;
|
||
result['NextType'] = 0;
|
||
result['Overlap'] = 0;
|
||
result['Quan'] = '';
|
||
result['Race'] = 0;
|
||
result['Rarity'] = 0;
|
||
result['RndRange'] = '';
|
||
result['RndWeight'] = 0;
|
||
result['Sex'] = 0;
|
||
result['Shape'] = '';
|
||
result['Type'] = 0;
|
||
result['OwnerRoleId'] = 0;
|
||
result['EquipType'] = type;
|
||
if (type == EEquipType.HIGH) {
|
||
if (equipInfo.AttrLib && equipInfo.AttrFactor) {
|
||
result['BaseAttr'] = SKDataUtil.toJson(this.getHighBaseArr(equipInfo.AttrLib, equipInfo.AttrFactor),"{}");
|
||
}
|
||
} else if (type == EEquipType.BALDRIC) {
|
||
result['BaseAttr'] = SKDataUtil.toJson(this.getBaldricBaseAttr(equipInfo.Index, equipInfo.Grade - 1),"{}");
|
||
} else {
|
||
// if (baseData) {
|
||
// result['BaseAttr'] = SKDataUtil.toJson(baseData,"{}");
|
||
// }
|
||
if (equipInfo.BaseAttr) {
|
||
let baseInfo: any = {};
|
||
let baseAttr = equipInfo.BaseAttr.split(';');
|
||
for (const item of baseAttr) {
|
||
let itemAttr = item.split(':');
|
||
if (itemAttr.length == 2 && GameUtil.attrEquipTypeStr[itemAttr[0]] != null) {
|
||
baseInfo[GameUtil.attrEquipTypeStr[itemAttr[0]]] = itemAttr[1];
|
||
}
|
||
}
|
||
result['BaseAttr'] = SKDataUtil.toJson(baseInfo,"{}");
|
||
}
|
||
}
|
||
if (equipInfo.Shuxingxuqiu) {
|
||
let xuqiuinfo: any = {};
|
||
let xuqiuarr = equipInfo.Shuxingxuqiu.split(':');
|
||
if (xuqiuarr.length == 2 && GameUtil.attrEquipTypeStr[xuqiuarr[0]] != null) {
|
||
xuqiuinfo[GameUtil.attrEquipTypeStr[xuqiuarr[0]]] = xuqiuarr[1];
|
||
}
|
||
result['Shuxingxuqiu'] = SKDataUtil.toJson(xuqiuinfo,"{}");
|
||
}
|
||
if (equipInfo.NeedAttr) {
|
||
let xuqiuinfo: any = {};
|
||
let xuqiuarr = equipInfo.NeedAttr.split(':');
|
||
if (xuqiuarr.length == 2 && GameUtil.attrEquipTypeStr[xuqiuarr[0]] != null) {
|
||
xuqiuinfo[GameUtil.attrEquipTypeStr[xuqiuarr[0]]] = xuqiuarr[1];
|
||
}
|
||
result['Shuxingxuqiu'] = SKDataUtil.toJson(xuqiuinfo,"{}");
|
||
}
|
||
equipInfo.BaseScore && (result['BaseScore'] = equipInfo.BaseScore);
|
||
equipInfo.Desc && (result['EDesc'] = equipInfo.Desc);
|
||
equipInfo.Detail && (result['Detail'] = equipInfo.Detail);
|
||
equipInfo.Dynamic && (result['Dynamic'] = equipInfo.Dynamic);
|
||
equipInfo.Grade && (result['Grade'] = equipInfo.Grade);
|
||
equipInfo.Index && (result['EIndex'] = equipInfo.Index);
|
||
equipInfo.JiLv && (result['JiLv'] = equipInfo.JiLv);
|
||
equipInfo.MaxEmbedGemCnt && (result['MaxEmbedGemCnt'] = equipInfo.MaxEmbedGemCnt);
|
||
equipInfo.MaxEndure && (result['MaxEndure'] = equipInfo.MaxEndure);
|
||
equipInfo.Name && (result['EName'] = equipInfo.Name);
|
||
equipInfo.NeedGrade && (result['NeedGrade'] = equipInfo.NeedGrade);
|
||
equipInfo.NeedRei && (result['NeedRei'] = equipInfo.NeedRei);
|
||
equipInfo.NextType && (result['NextType'] = equipInfo.NextType);
|
||
equipInfo.Overlap && (result['Overlap'] = equipInfo.Overlap);
|
||
equipInfo.Quan && (result['Quan'] = equipInfo.Quan);
|
||
equipInfo.Race && (result['Race'] = equipInfo.Race);
|
||
equipInfo.Rarity && (result['Rarity'] = equipInfo.Rarity);
|
||
equipInfo.RndRange && (result['RndRange'] = equipInfo.RndRange);
|
||
equipInfo.RndWeight && (result['RndWeight'] = equipInfo.RndWeight);
|
||
equipInfo.Sex && (result['Sex'] = equipInfo.Sex);
|
||
equipInfo.Shape && (result['Shape'] = equipInfo.Shape);
|
||
equipInfo.Type && (result['Type'] = equipInfo.Type);
|
||
equipInfo.OwnerRoleId && (result['OwnerRoleId'] = equipInfo.OwnerRoleId);
|
||
return result;
|
||
}
|
||
|
||
getInsertData(equipArr: any, roleid: any): any {
|
||
if (!equipArr) {
|
||
return null;
|
||
}
|
||
let fieldstr = 'EquipID, EquipType, BaseAttr, Grade, EIndex, Shuxingxuqiu, Type, GemCnt, LianhuaAttr, RoleID, create_time, pos, BaseScore';
|
||
let valuestr = `'${equipArr.EquipID}', ${equipArr.EquipType}, '${equipArr.BaseAttr}', ${equipArr.Grade}, ${equipArr.EIndex}, '${equipArr.Shuxingxuqiu}', ${equipArr.Type}, 0, '{}', ${roleid}, NOW(), ${EEquipPos.BAG}, ${equipArr.BaseScore}`;
|
||
let data: any = {};
|
||
data.fieldstr = fieldstr;
|
||
data.valuestr = valuestr;
|
||
return data;
|
||
}
|
||
getValueForRecast(key: any,grade: any){
|
||
let Numerical = GameUtil.equipTypeNumerical; //不用进行百分比计算的属性
|
||
let score = 15; //一阶属性上限
|
||
if(key < 12){ // 如果是抗性属性
|
||
score = 30;
|
||
}
|
||
if(grade > 1){ //仙器品阶
|
||
if(key < 12){ //抗性
|
||
score = 30 + ((grade - 1) * 5);
|
||
}else{
|
||
score = 15 + ((grade - 1) * 3);
|
||
}
|
||
}
|
||
for(let zhi in Numerical){
|
||
if(key == Numerical[zhi]){
|
||
if(Numerical[zhi] == EAttrTypeL1.ATK){ //攻击
|
||
score = 3000;
|
||
if(grade > 1){
|
||
score = 3000 + ((grade - 1) * 1000);
|
||
}
|
||
}
|
||
if(Numerical[zhi] == EAttrTypeL1.HP_MAX || Numerical[zhi] == EAttrTypeL1.MP_MAX ){ //气血和发力
|
||
score = 5040;
|
||
if(grade > 1){
|
||
score = 5040 + ((grade - 1) * 1050);
|
||
}
|
||
}
|
||
if(Numerical[zhi] == EAttrTypeL1.SPD){ // 速度
|
||
score = 87;
|
||
if(grade > 1){
|
||
score = 87 + ((grade - 1) * 40);
|
||
}
|
||
}
|
||
let rand = Math.floor(GameUtil.random((score / 2),score))
|
||
if(rand == 0){
|
||
rand = 1;
|
||
}
|
||
return rand;
|
||
}
|
||
}
|
||
let rand = Math.floor(GameUtil.random((score / 2),score)) * 10 + Math.floor(Math.random() * 10);
|
||
if(rand == 0){
|
||
rand = 1;
|
||
}
|
||
return rand;
|
||
}
|
||
} |