// 游戏工具类 import * as path from "path"; import * as os from "os"; import PartnerConfigMgr from "../object/PartnerConfigMgr"; import Player from "../object/Player"; import SKLogger from "../gear/SKLogger"; import SKDataUtil from "../gear/SKDataUtil"; import GameConf from "../../conf/GameConf"; import {EAttrCalType, EAttrTypeL1, EAttrTypeL2, EEquipType, EMagicType, ERaceType, ESexType, ESkillType} from "../role/EEnum"; import ServerConf from "../../conf/ServerConf"; import SnowFlack53 from "../gear/SnowFlake53"; import GTimer from "../common/GTimer"; export default class GameUtil { // REDIS服务是否开启 static redisEnabled: boolean = true; // 游戏配置 static game_conf: any; // 本地IP地址 static localIP: string; // 服务器配置 static serverConf: ServerConf; // 服务器类型 static serverType: string; // 网络类型 static netType: string; // 服务器索引 static serverId: number; // 服务器名称 static serverName: string; // 世界时间控制 static gameTime: number = 0; // 游戏帧时间 static frameTime: number; // 30分钟后销毁战斗数据 static battleSkipTime: number = 30 * 60 * 1000; // 每5分钟保存一次玩家数据 static savePlayerTime: number = 5 * 60 * 1000; // 是否关服 static isClose: boolean = false; // 在线玩家人数 static online: number = 0; // 保存玩家人数 static saveCount: number = 0; // 保存玩家总数 static saveTotal: number = 0; // 机器人总数 static robotCount: number = 0; // 存档失败纪录 static saveFailed: any[] = []; // 坐骑技能升级道具 static horseSkillUpItemId: number = 10607; // 丹书密卷 // 坐骑洗炼道具 static horseRefiningItemId: number = 10608; // 净露玉瓶 // 炼化锁消耗仙玉 static lockJade = [10, 20, 30]; static limitPartnerLevel = 35; private static snowFlake53: SnowFlack53; static attrToBaseAttr: any = { [EAttrTypeL1.HP_ADD]: { cal: EAttrCalType.ADD_PERCENT, target: EAttrTypeL1.HP, }, [EAttrTypeL1.SPD_ADD]: { cal: EAttrCalType.ADD_PERCENT, target: EAttrTypeL1.SPD, }, [EAttrTypeL1.MP_ADD]: { cal: EAttrCalType.ADD_PERCENT, target: EAttrTypeL1.MP, }, [EAttrTypeL1.ATK_ADD]: { cal: EAttrCalType.ADD_PERCENT, target: EAttrTypeL1.ATK, }, [EAttrTypeL1.HP_PERC]: { cal: EAttrCalType.PERCENT, target: EAttrTypeL1.HP, }, [EAttrTypeL1.MP_PERC]: { cal: EAttrCalType.PERCENT, target: EAttrTypeL1.MP, }, [EAttrTypeL1.ATK_PERC]: { cal: EAttrCalType.PERCENT, target: EAttrTypeL1.ATK, }, [EAttrTypeL1.SPD_PERC]: { cal: EAttrCalType.PERCENT, target: EAttrTypeL1.SPD, }, } // 界面图标是否展示 0:展示 1:不展示 static iconList = {"vip": 0,"dream": 0,"lock": 1,"fytz": 0,"kac": 1, "tie": 0, "au": GameConf.accumulative, "level":0, "sign":0, "special": 0}; static flagGoods = ["1003010", "1003020", "1003030", "1003040", "1003050", "1003060", "1003070", "1003080", "1003090", "100320", "100321", "100322", "100323"]; static firstLevelCode = [65665, 65666, 65667, 65668, 65669]; static attrTypeL1Text = { 'DHUNLUAN': EAttrTypeL1.K_CONFUSION, // 抗混乱 'DFENGYIN': EAttrTypeL1.K_SEAL, // 抗封印 'DHUNSHUI': EAttrTypeL1.K_SLEEP, // 抗昏睡 'DDU': EAttrTypeL1.K_POISON, // 抗毒 'DFENG': EAttrTypeL1.K_WIND, // 抗风 'DHUO': EAttrTypeL1.K_FIRE, // 抗火 'DSHUI': EAttrTypeL1.K_WATER, // 抗水 'DLEI': EAttrTypeL1.K_THUNDER, // 抗雷 'DGUIHUO': EAttrTypeL1.K_WILDFIRE, // 抗鬼火 'DYIWANG': EAttrTypeL1.K_FORGET, // 抗遗忘 'DSANSHI': EAttrTypeL1.K_BLOODRETURN, // 抗三尸 'DZHENSHE': EAttrTypeL1.K_DETER, // 抗震慑 'DWULI': EAttrTypeL1.K_PHY_GET, // 抗物理 'PXISHOU': EAttrTypeL1.PHY_GET, // 物理吸收 'PMINGZHONG': EAttrTypeL1.PHY_HIT, // 命中 'PSHANBI': EAttrTypeL1.PHY_DODGE, // 闪避 'PLIANJI': EAttrTypeL1.PHY_COMBO, //连击 'PLIANJILV': EAttrTypeL1.PHY_COMBO_PROB, //连击率 'PKUANGBAO': EAttrTypeL1.PHY_DEADLY, //狂暴 'PPOFANG': EAttrTypeL1.PHY_BREAK, //破防 'PPOFANGLV': EAttrTypeL1.PHY_BREAK_PROB, //破防率 'PFANZHEN': EAttrTypeL1.PHY_REBOUND, //反震 'PFANZHENLV': EAttrTypeL1.PHY_REBOUND_PROB, //反震率 'ADEFEND': EAttrTypeL1.DEFEND_ADD, //加防 'ASPD': EAttrTypeL1.SPD_ADD, //加速 'AATK': EAttrTypeL1.ATK_ADD, //加攻 'AHP': EAttrTypeL1.HP_ADD, //加血 'AMP': EAttrTypeL1.MP_ADD, //加蓝 'AMEIHUO': EAttrTypeL1.CHARM_ADD, //加强魅惑 'HDHUNLUAN': EAttrTypeL1.HK_CONFUSION, // 忽视抗混乱 'HDFENGYIN': EAttrTypeL1.HK_SEAL, // 忽视抗封印 'HDHUNSHUI': EAttrTypeL1.HK_SLEEP, // 忽视抗昏睡 'HDDU': EAttrTypeL1.HK_POISON, // 忽视抗毒 'HDFENG': EAttrTypeL1.HK_WIND, // 忽视抗风 'HDHUO': EAttrTypeL1.HK_FIRE, // 忽视抗火 'HDSHUI': EAttrTypeL1.HK_WATER, // 忽视抗水 'HDLEI': EAttrTypeL1.HK_THUNDER, // 忽视抗雷 'HDGUIHUO': EAttrTypeL1.HK_WILDFIRE, // 忽视抗鬼火 'HDYIWANG': EAttrTypeL1.HK_FORGET, // 忽视抗遗忘 'HDSANSHI': EAttrTypeL1.HK_BLOODRETURN, // 忽视抗三尸 'HDZHENSHE': EAttrTypeL1.HK_DETER, // 忽视抗震慑 'HDWULI': EAttrTypeL1.HK_PHY_GET, // 忽视抗物理 'HP': EAttrTypeL1.HP, // 生命值 'MAXHP': EAttrTypeL1.HP_MAX, // 最在生命值 'MP': EAttrTypeL1.MP, // 魔法值 'MAXMP': EAttrTypeL1.MP_MAX, // 最大魔法值 'ATK': EAttrTypeL1.ATK, // 攻击力 'SPD': EAttrTypeL1.SPD, // 速度 'PHP': EAttrTypeL1.HP_PERC, // 生命百分比 'PMP': EAttrTypeL1.MP_PERC, // 魔法百分比 'PATK': EAttrTypeL1.ATK_PERC, // 攻击百分比 'PSPD': EAttrTypeL1.SPD_PERC, // 速度百分比 'SHUIKBPRE': EAttrTypeL1.KB_WATER, // 水狂暴率 'LEIKBPRE': EAttrTypeL1.KB_THUNDER, // 雷狂暴率 'HUOKBPRE': EAttrTypeL1.KB_FIRE, // 火狂暴率 'FENGKBPRE': EAttrTypeL1.KB_WIND, // 风狂暴率 'SANSHIKBPRE': EAttrTypeL1.KB_BLOODRETURN, // 三尸狂暴率 'GUIHUOKBPRE': EAttrTypeL1.KB_WILDFIRE, // 鬼火狂暴率 'SHUIKB': EAttrTypeL1.Q_WATER, // 水狂暴 'LEIKB': EAttrTypeL1.Q_THUNDER, // 雷狂暴 'HUOKB': EAttrTypeL1.Q_FIRE, // 火狂暴 'FENGKB': EAttrTypeL1.Q_WIND, // 风狂暴 'SANSHIKB': EAttrTypeL1.Q_BLOODRETURN, // 三尸狂暴 'GUIHUOKB': EAttrTypeL1.Q_WILDFIRE, // 鬼火狂暴 } static attrTypeStrL1: any = { [EAttrTypeL1.K_CONFUSION]: 'DHUNLUAN', // 抗混乱 [EAttrTypeL1.K_SEAL]: 'DFENGYIN', // 抗封印 [EAttrTypeL1.K_SLEEP]: 'DHUNSHUI', // 抗昏睡 [EAttrTypeL1.K_POISON]: 'DDU', // 抗毒 [EAttrTypeL1.K_WIND]: 'DFENG', // 抗风 [EAttrTypeL1.K_FIRE]: 'DHUO', // 抗火 [EAttrTypeL1.K_WATER]: 'DSHUI', // 抗水 [EAttrTypeL1.K_THUNDER]: 'DLEI', // 抗雷 [EAttrTypeL1.K_WILDFIRE]: 'DGUIHUO', // 抗鬼火 [EAttrTypeL1.K_FORGET]: 'DYIWANG', // 抗遗忘 [EAttrTypeL1.K_BLOODRETURN]: 'DSANSHI', // 抗三尸 [EAttrTypeL1.K_DETER]: 'DZHENSHE', // 抗震慑 [EAttrTypeL1.K_PHY_GET]: 'DWULI', // 抗物理 [EAttrTypeL1.PHY_GET]: 'PXISHOU', // 物理吸收 [EAttrTypeL1.PHY_HIT]: 'PMINGZHONG', // 命中 [EAttrTypeL1.PHY_DODGE]: 'PSHANBI', // 闪避 [EAttrTypeL1.PHY_COMBO]: 'PLIANJI', //连击 [EAttrTypeL1.PHY_COMBO_PROB]: 'PLIANJILV', //连击率 [EAttrTypeL1.PHY_DEADLY]: 'PKUANGBAO', //狂暴 [EAttrTypeL1.PHY_BREAK]: 'PPOFANG', //破防 [EAttrTypeL1.PHY_BREAK_PROB]: 'PPOFANGLV', //破防率 [EAttrTypeL1.PHY_REBOUND]: 'PFANZHEN', //反震 [EAttrTypeL1.PHY_REBOUND_PROB]: 'PFANZHENLV', //反震率 [EAttrTypeL1.DEFEND_ADD]: 'ADEFEND', //加防 [EAttrTypeL1.SPD_ADD]: 'ASPD', //加速 [EAttrTypeL1.ATK_ADD]: 'AATK', //加攻 [EAttrTypeL1.HP_ADD]: 'AHP', //加血 [EAttrTypeL1.MP_ADD]: 'AMP', //加蓝 [EAttrTypeL1.CHARM_ADD]: 'AMEIHUO', //加强魅惑 [EAttrTypeL1.HK_CONFUSION]: 'HDHUNLUAN', // 忽视抗混乱 [EAttrTypeL1.HK_SEAL]: 'HDFENGYIN', // 忽视抗封印 [EAttrTypeL1.HK_SLEEP]: 'HDHUNSHUI', // 忽视抗昏睡 [EAttrTypeL1.HK_POISON]: 'HDDU', // 忽视抗毒 [EAttrTypeL1.HK_WIND]: 'HDFENG', // 忽视抗风 [EAttrTypeL1.HK_FIRE]: 'HDHUO', // 忽视抗火 [EAttrTypeL1.HK_WATER]: 'HDSHUI', // 忽视抗水 [EAttrTypeL1.HK_THUNDER]: 'HDLEI', // 忽视抗雷 [EAttrTypeL1.HK_WILDFIRE]: 'HDGUIHUO', // 忽视抗鬼火 [EAttrTypeL1.HK_FORGET]: 'HDYIWANG', // 忽视抗遗忘 [EAttrTypeL1.HK_BLOODRETURN]: 'HDSANSHI', // 忽视抗三尸 [EAttrTypeL1.HK_DETER]: 'HDZHENSHE', // 忽视抗震慑 [EAttrTypeL1.HK_PHY_GET]: 'HDWULI', // 忽视抗物理 ///////////////////////////////////////// [EAttrTypeL1.HP]: 'HP', [EAttrTypeL1.HP_MAX]: 'MAXHP', [EAttrTypeL1.MP]: 'MP', [EAttrTypeL1.MP_MAX]: 'MAXMP', [EAttrTypeL1.ATK]: 'ATK', [EAttrTypeL1.SPD]: 'SPD', [EAttrTypeL1.HP_PERC]: 'PHP', [EAttrTypeL1.MP_PERC]: 'PMP', [EAttrTypeL1.ATK_PERC]: 'PATK', [EAttrTypeL1.SPD_PERC]: 'PSPD', [EAttrTypeL1.KB_WATER]: 'SHUIKBPRE', [EAttrTypeL1.KB_THUNDER]: 'LEIKBPRE', [EAttrTypeL1.KB_FIRE]: 'HUOKBPRE', [EAttrTypeL1.KB_WIND]: 'FENGKBPRE', [EAttrTypeL1.KB_BLOODRETURN]: 'SANSHIKBPRE', [EAttrTypeL1.KB_WILDFIRE]: 'GUIHUOKBPRE', [EAttrTypeL1.Q_WATER]: 'SHUIKB', [EAttrTypeL1.Q_THUNDER]: 'LEIKB', [EAttrTypeL1.Q_FIRE]: 'HUOKB', [EAttrTypeL1.Q_WIND]: 'FENGKB', [EAttrTypeL1.Q_BLOODRETURN]: 'SANSHIKB', [EAttrTypeL1.Q_WILDFIRE]: 'GUIHUOKB', } static mapType: any = { Unknow: 0, Map: 1, Instance: 2, } static attrEquipTypeStr: any = { 'FatalRate': EAttrTypeL1.PHY_DEADLY, // 致命(狂暴)%        'HitRate': EAttrTypeL1.PHY_HIT, // 命中%        'PhyDefNef': EAttrTypeL1.PHY_BREAK, // 破防程度%      'PhyDefNefRate': EAttrTypeL1.PHY_BREAK_PROB, // 破防概率%      'AdAtkEhan': EAttrTypeL1.ATK_ADD, // 加强攻击%      'CureEhan': EAttrTypeL1.CURE_EHAN, // 加强治愈%      'SweepEhan': EAttrTypeL1.SWEEP_EHAN, // 加强横扫%      'BreakEhan': EAttrTypeL1.BREAK_EHAN, // 加强破甲%      'ThudEhan': EAttrTypeL1.THUD_EHAN, // 加强震击%      'Atk': EAttrTypeL1.ATK, //攻击(原数增加) 'AdSpd': EAttrTypeL1.SPD_ADD, // 加速%      'AdSpdEhan': EAttrTypeL1.SPD_ADD_EHAN, // 加强加速%      'HpMax': EAttrTypeL1.HP_MAX, // 增加气血上限         'MpMax': EAttrTypeL1.MP_MAX, // 增加法力上限         'HpPercent': EAttrTypeL1.HP_ADD, // 气血%        'MpPercent': EAttrTypeL1.MP_ADD, // 法力%        'AtkPercent': EAttrTypeL1.ATK_PERC, //攻击百分比 'HpPer': EAttrTypeL1.HP_PERC, //气血百分比 'Speed': EAttrTypeL1.SPD, // 速度 (原数增加)      'RainDef': EAttrTypeL1.K_WATER, // 抗水法%       'ThunderDef': EAttrTypeL1.K_THUNDER, // 抗雷法%       'FireDef': EAttrTypeL1.K_FIRE, // 抗火法%       'WindDef': EAttrTypeL1.K_WIND, // 抗风法%       'RainDefNeg': EAttrTypeL1.HK_WATER, // 忽视水%       'ThunderDefNeg': EAttrTypeL1.HK_THUNDER, // 忽视雷%       'FireDefNeg': EAttrTypeL1.HK_FIRE, // 忽视火%       'WindDefNeg': EAttrTypeL1.HK_WIND, // 忽视风%       'SealDef': EAttrTypeL1.K_SEAL, // 抗封印%       'DisorderDef': EAttrTypeL1.K_CONFUSION, // 抗混乱%       'SleepDef': EAttrTypeL1.K_SLEEP, // 抗昏睡%       'PoisonDef': EAttrTypeL1.K_POISON, // 抗中毒%       'SealDefNeg': EAttrTypeL1.HK_SEAL, // 忽视封印%      'DisorderDefNeg': EAttrTypeL1.HK_CONFUSION, // 忽视混乱%      'SleepDefNeg': EAttrTypeL1.HK_SLEEP, // 忽视昏睡%      'PoisonDefNeg': EAttrTypeL1.HK_POISON, // 忽视毒%       'ForgetDef': EAttrTypeL1.K_FORGET, // 抗遗忘%       'GfireDef': EAttrTypeL1.K_WILDFIRE, // 抗鬼火%       'SanshiDef': EAttrTypeL1.K_BLOODRETURN, // 抗三尸%       'ForgetDefNeg': EAttrTypeL1.HK_FORGET, // 忽视遗忘%      'GfireDefNeg': EAttrTypeL1.HK_WILDFIRE, // 忽视鬼火%      'SanshiDefNeg': EAttrTypeL1.HK_BLOODRETURN, // 忽视三尸%      'ShockDefNeg': EAttrTypeL1.HK_DETER, // 忽视抗震慑%         'CharmEhan': EAttrTypeL1.CHARM_ADD, // 加强魅惑%      'PhyDef': EAttrTypeL1.PHY_GET, // 物理吸收%      'AdDefEhan': EAttrTypeL1.DEFEND_ADD, //加强加防% 'ShockDef': EAttrTypeL1.K_DETER, //抗震慑% 'HitCombo': EAttrTypeL1.PHY_COMBO, //连击次数 'HitComboProb': EAttrTypeL1.PHY_COMBO_PROB, //连击率 'VoidRate': EAttrTypeL1.PHY_DODGE, //躲闪% 'Basecon': EAttrTypeL2.GENGU, // 根骨 'Wakan': EAttrTypeL2.LINGXING, // 灵性 'Power': EAttrTypeL2.LILIANG, // 力量 'Agility': EAttrTypeL2.MINJIE, // 敏捷 'RainFatalRate': EAttrTypeL1.KB_WATER, 'ThunderFatalRate': EAttrTypeL1.KB_THUNDER, 'FireFatalRate': EAttrTypeL1.KB_FIRE, 'WindFatalRate': EAttrTypeL1.KB_WIND, 'SanshiFatalRate': EAttrTypeL1.KB_BLOODRETURN, 'GfireFatalRate': EAttrTypeL1.KB_WILDFIRE, 'RainFatalHurt': EAttrTypeL1.Q_WATER, 'ThunderFatalHurt': EAttrTypeL1.Q_THUNDER, 'FireFatalHurt': EAttrTypeL1.Q_FIRE, 'WindFatalHurt': EAttrTypeL1.Q_WIND, 'SanshiFatalHurt': EAttrTypeL1.Q_BLOODRETURN, 'GfireFatalHurt': EAttrTypeL1.Q_WILDFIRE, 'Kgold': EAttrTypeL1.S_GOLD, 'Kwood': EAttrTypeL1.S_WOOD, 'Kwater': EAttrTypeL1.S_WATER, 'Kfire': EAttrTypeL1.S_FIRE, 'Kearth': EAttrTypeL1.S_SOIL, } //抗性重铸属性 static attrEquipKangXing: any = { '0': EAttrTypeL1.K_WATER, // 抗水法%       '1': EAttrTypeL1.K_THUNDER, // 抗雷法%       '2': EAttrTypeL1.K_FIRE, // 抗火法%       '3': EAttrTypeL1.K_WIND, // 抗风法%       '4': EAttrTypeL1.K_SEAL, // 抗封印%       '5': EAttrTypeL1.K_CONFUSION, // 抗混乱%       '6': EAttrTypeL1.K_SLEEP, // 抗昏睡%       '7': EAttrTypeL1.K_POISON, // 抗中毒%       '8': EAttrTypeL1.K_FORGET, // 抗遗忘%       '9': EAttrTypeL1.K_WILDFIRE, // 抗鬼火%       '10': EAttrTypeL1.K_BLOODRETURN, // 抗三尸%       '11': EAttrTypeL1.K_DETER, //抗震慑%       } //武器重铸属性 static attrEquipWeapon: any = { '0': EAttrTypeL1.PHY_DEADLY, // 致命(狂暴)%        '1': EAttrTypeL1.PHY_HIT, // 命中%        '2': EAttrTypeL1.PHY_BREAK, // 破防程度%      '3': EAttrTypeL1.PHY_BREAK_PROB, // 破防概率%      '4': EAttrTypeL1.ATK, //攻击(原数增加) '5': EAttrTypeL1.HP_MAX, // 增加气血上限         '6': EAttrTypeL1.MP_MAX, // 增加法力上限         } //人族重铸属性 static attrEquipRenHuShi: any = { '1': EAttrTypeL1.HK_SEAL, // 忽视封印%      '2': EAttrTypeL1.HK_CONFUSION, // 忽视混乱%      '3': EAttrTypeL1.HK_SLEEP, // 忽视昏睡%      '0': EAttrTypeL1.HK_POISON, // 忽视毒%       } //仙族重铸属性 static attrEquipXianHuShi: any = { '1': EAttrTypeL1.HK_WATER, // 忽视水%       '2': EAttrTypeL1.HK_THUNDER, // 忽视雷%       '3': EAttrTypeL1.HK_FIRE, // 忽视火%       '0': EAttrTypeL1.HK_WIND, // 忽视风%       } //鬼族重铸属性 static attrEquipGuiHuShi: any = { '1': EAttrTypeL1.HK_FORGET, // 忽视遗忘%      '2': EAttrTypeL1.HK_WILDFIRE, // 忽视鬼火%      '0': EAttrTypeL1.HK_BLOODRETURN, // 忽视三尸%      } //魔族重铸属性 static attrEquipMoHuShi: any = { '1': EAttrTypeL1.HK_DETER, // 忽视抗震慑%         '2': EAttrTypeL1.SPD_ADD_EHAN, // 加强加速%      '3': EAttrTypeL1.DEFEND_ADD, //加强加防% '0': EAttrTypeL1.CHARM_ADD, // 加强魅惑%      } //龙族重铸属性 static attrEquipLong: any = { '1': EAttrTypeL1.CURE_EHAN, // 加强治愈%      '2': EAttrTypeL1.SWEEP_EHAN, // 加强横扫%      '3': EAttrTypeL1.BREAK_EHAN, // 加强破甲%      '0': EAttrTypeL1.THUD_EHAN, // 加强震击%      } //项链重铸属性 static attrEquipTorque: any = { '1': EAttrTypeL1.SPD_ADD_EHAN, // 加强加速%      '2': EAttrTypeL1.HP_MAX, // 增加气血上限         '3': EAttrTypeL1.MP_MAX, // 增加法力上限         '4': EAttrTypeL1.HP_ADD, // 气血%        '5': EAttrTypeL1.MP_ADD, // 法力%        '6': EAttrTypeL1.SPD, // 速度 (原数增加)      '0': EAttrTypeL1.ATK_PERC, //攻击百分比 } //鞋子重铸属性 static attrEquipShose: any = { '1': EAttrTypeL1.K_WATER, // 抗水法%       '2': EAttrTypeL1.K_THUNDER, // 抗雷法%       '3': EAttrTypeL1.K_FIRE, // 抗火法%       '4': EAttrTypeL1.K_WIND, // 抗风法%       '5': EAttrTypeL1.K_SEAL, // 抗封印%       '6': EAttrTypeL1.K_CONFUSION, // 抗混乱%       '13': EAttrTypeL1.SPD, // 速度 (原数增加)      '7': EAttrTypeL1.K_SLEEP, // 抗昏睡%       '8': EAttrTypeL1.K_POISON, // 抗中毒%       '9': EAttrTypeL1.K_FORGET, // 抗遗忘%       '0': EAttrTypeL1.SPD_ADD_EHAN, // 加强加速%      '10': EAttrTypeL1.K_WILDFIRE, // 抗鬼火%       '11': EAttrTypeL1.K_BLOODRETURN, // 抗三尸%       '12': EAttrTypeL1.K_DETER, //抗震慑% } // 不需要进行百分百计算的 static equipTypeNumerical = [ EAttrTypeL1.ATK, // 攻击力 EAttrTypeL1.SPD, // 速度 EAttrTypeL1.DEFEND_ADD, // 加防 EAttrTypeL1.PHY_COMBO, // 连击 EAttrTypeL1.HP_MAX, // 最大生命值 EAttrTypeL1.MP_MAX, // 最大魔法值 EAttrTypeL1.BONE, // 根骨 EAttrTypeL1.SPIRIT, // 灵性 EAttrTypeL1.STRENGTH, // 力量 EAttrTypeL1.DEXTERITY, // 敏捷 EAttrTypeL1.GOLD, // 金 EAttrTypeL1.WOOD, // 木 EAttrTypeL1.WATER, // 水 EAttrTypeL1.FIRE, // 火 EAttrTypeL1.SOIL, // 土 ]; static defineSkill: any = { [ERaceType.HUMEN]: { [ESexType.MALE]: { [ESkillType.JieDaoShaRen]: 0, [ESkillType.MiHunZui]: 0, [ESkillType.ZuoBiShangGuan]: 0, [ESkillType.ShiXinKuangLuan]: 0, [ESkillType.BaiRiMian]: 0, [ESkillType.SiMianChuGe]: 0, }, [ESexType.FEMALE]: { [ESkillType.HeDingHongFen]: 0, [ESkillType.MiHunZui]: 0, [ESkillType.ZuoBiShangGuan]: 0, [ESkillType.WanDuGongXin]: 0, [ESkillType.BaiRiMian]: 0, [ESkillType.SiMianChuGe]: 0, } }, [ERaceType.SKY]: { [ESexType.MALE]: { [ESkillType.FengLeiYongDong]: 0, [ESkillType.DianShanLeiMing]: 0, [ESkillType.JiaoLongChuHai]: 0, [ESkillType.XiuLiQianKun]: 0, [ESkillType.TianZhuDiMie]: 0, [ESkillType.JiuLongBingFeng]: 0, }, [ESexType.FEMALE]: { [ESkillType.LieHuoJiaoYang]: 0, [ESkillType.DianShanLeiMing]: 0, [ESkillType.JiaoLongChuHai]: 0, [ESkillType.JiuYinChunHuo]: 0, [ESkillType.TianZhuDiMie]: 0, [ESkillType.JiuLongBingFeng]: 0, } }, [ERaceType.DEMON]: { [ESexType.MALE]: { [ESkillType.TianWaiFeiMo]: 0, [ESkillType.ShouWangShenLi]: 0, [ESkillType.XiaoHunShiGu]: 0, [ESkillType.QianKunJieSu]: 0, [ESkillType.MoShenFuShen]: 0, [ESkillType.YanLuoZhuiMing]: 0, }, [ESexType.FEMALE]: { [ESkillType.MoShenHuTi]: 0, [ESkillType.ShouWangShenLi]: 0, [ESkillType.XiaoHunShiGu]: 0, [ESkillType.HanQingMoMo]: 0, [ESkillType.MoShenFuShen]: 0, [ESkillType.YanLuoZhuiMing]: 0, } }, [ERaceType.GHOST]: { [ESexType.MALE]: { [ESkillType.XueShaZhiGu]: 0, [ESkillType.LuoRiRongJin]: 0, [ESkillType.ShiXinFeng]: 0, [ESkillType.XiXingDaFa]: 0, [ESkillType.XueHaiShenChou]: 0, [ESkillType.MengPoTang]: 0, }, [ESexType.FEMALE]: { [ESkillType.QinSiBingWu]: 0, [ESkillType.LuoRiRongJin]: 0, [ESkillType.ShiXinFeng]: 0, [ESkillType.QianNvYouHun]: 0, [ESkillType.XueHaiShenChou]: 0, [ESkillType.MengPoTang]: 0, } }, [ERaceType.DRAGON]: { [ESexType.MALE]: { [ESkillType.NiLin]: 0, [ESkillType.LingXvYvFeng]: 0, [ESkillType.FeiJvJiuTian]: 0, [ESkillType.PeiRanMoYv]: 0, [ESkillType.ZeBeiWanWu]: 0, [ESkillType.FengLeiWanJun]: 0, [ESkillType.ZhenTianDongDi]: 0, }, [ESexType.FEMALE]: { [ESkillType.NiLin]: 0, [ESkillType.BaiLangTaoTian]: 0, [ESkillType.CangHaiHengLiu]: 0, [ESkillType.PeiRanMoYv]: 0, [ESkillType.ZeBeiWanWu]: 0, [ESkillType.FengLeiWanJun]: 0, [ESkillType.ZhenTianDongDi]: 0, } }, } static robotDefineSkill: any = { [ERaceType.HUMEN]: { [ESexType.MALE]: { [ESkillType.ShiXinKuangLuan]: 0, [ESkillType.BaiRiMian]: 0, [ESkillType.SiMianChuGe]: 0, }, [ESexType.FEMALE]: { [ESkillType.WanDuGongXin]: 0, [ESkillType.BaiRiMian]: 0, [ESkillType.SiMianChuGe]: 0, } }, [ERaceType.SKY]: { [ESexType.MALE]: { [ESkillType.XiuLiQianKun]: 0, [ESkillType.TianZhuDiMie]: 0, [ESkillType.JiuLongBingFeng]: 0, }, [ESexType.FEMALE]: { [ESkillType.JiuYinChunHuo]: 0, [ESkillType.TianZhuDiMie]: 0, [ESkillType.JiuLongBingFeng]: 0, } }, [ERaceType.DEMON]: { [ESexType.MALE]: { [ESkillType.QianKunJieSu]: 0, [ESkillType.MoShenFuShen]: 0, [ESkillType.YanLuoZhuiMing]: 0, }, [ESexType.FEMALE]: { [ESkillType.HanQingMoMo]: 0, [ESkillType.MoShenFuShen]: 0, [ESkillType.YanLuoZhuiMing]: 0, } }, [ERaceType.GHOST]: { [ESexType.MALE]: { [ESkillType.XiXingDaFa]: 0, [ESkillType.XueHaiShenChou]: 0, [ESkillType.MengPoTang]: 0, }, [ESexType.FEMALE]: { [ESkillType.QianNvYouHun]: 0, [ESkillType.XueHaiShenChou]: 0, [ESkillType.MengPoTang]: 0, } }, [ERaceType.DRAGON]: { [ESexType.MALE]: { [ESkillType.ZeBeiWanWu]: 0, [ESkillType.FeiJvJiuTian]: 0, [ESkillType.ZhenTianDongDi]: 0, }, [ESexType.FEMALE]: { [ESkillType.CangHaiHengLiu]: 0, [ESkillType.ZeBeiWanWu]: 0, [ESkillType.ZhenTianDongDi]: 0, } }, } // 成长值 static growPre: any = { [ERaceType.HUMEN]: { [EAttrTypeL2.GENGU]: 1.2, [EAttrTypeL2.LINGXING]: 1, [EAttrTypeL2.LILIANG]: 1, [EAttrTypeL2.MINJIE]: 0.8, }, [ERaceType.SKY]: { [EAttrTypeL2.GENGU]: 1, [EAttrTypeL2.LINGXING]: 1.3, [EAttrTypeL2.LILIANG]: 0.7, [EAttrTypeL2.MINJIE]: 1, }, [ERaceType.DEMON]: { [EAttrTypeL2.GENGU]: 1.1, [EAttrTypeL2.LINGXING]: 0.6, [EAttrTypeL2.LILIANG]: 1.3, [EAttrTypeL2.MINJIE]: 1.2, }, [ERaceType.GHOST]: { [EAttrTypeL2.GENGU]: 1.2, [EAttrTypeL2.LINGXING]: 1, [EAttrTypeL2.LILIANG]: 0.95, [EAttrTypeL2.MINJIE]: 0.85, }, [ERaceType.DRAGON]: { [EAttrTypeL2.GENGU]: 1.3, [EAttrTypeL2.LINGXING]: 1, [EAttrTypeL2.LILIANG]: 1.5, [EAttrTypeL2.MINJIE]: 1.1, }, } // 基础一级属性 static baseAttr: any = { [ERaceType.HUMEN]: { [EAttrTypeL1.HP]: 360, [EAttrTypeL1.MP]: 300, [EAttrTypeL1.ATK]: 70, [EAttrTypeL1.SPD]: 8, }, [ERaceType.SKY]: { [EAttrTypeL1.HP]: 270, [EAttrTypeL1.MP]: 350, [EAttrTypeL1.ATK]: 80, [EAttrTypeL1.SPD]: 9, }, [ERaceType.DEMON]: { [EAttrTypeL1.HP]: 330, [EAttrTypeL1.MP]: 210, [EAttrTypeL1.ATK]: 80, [EAttrTypeL1.SPD]: 10, }, [ERaceType.GHOST]: { [EAttrTypeL1.HP]: 300, [EAttrTypeL1.MP]: 390, [EAttrTypeL1.ATK]: 60, [EAttrTypeL1.SPD]: 10, }, [ERaceType.DRAGON]: { [EAttrTypeL1.HP]: 300, [EAttrTypeL1.MP]: 240, [EAttrTypeL1.ATK]: 80, [EAttrTypeL1.SPD]: 10, }, } // 1转修正 static reliveFixAttr1 = { [ERaceType.HUMEN]: { [ESexType.MALE]: { [EAttrTypeL1.K_CONFUSION]: 10, [EAttrTypeL1.K_SEAL]: 10, [EAttrTypeL1.K_SLEEP]: 10, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_POISON]: 10, [EAttrTypeL1.K_SEAL]: 10, [EAttrTypeL1.K_SLEEP]: 10, }, }, [ERaceType.SKY]: { [ESexType.MALE]: { [EAttrTypeL1.K_THUNDER]: 10, [EAttrTypeL1.K_WATER]: 10, [EAttrTypeL1.K_WIND]: 10, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_THUNDER]: 10, // 抗混乱 [EAttrTypeL1.K_WATER]: 10, // 抗封印 [EAttrTypeL1.K_FIRE]: 10, // 抗昏睡 }, }, [ERaceType.DEMON]: { [ESexType.MALE]: { [EAttrTypeL1.HP]: 8.2, [EAttrTypeL1.MP]: 8.2, [EAttrTypeL1.SPD]: 6.15, }, [ESexType.FEMALE]: { [EAttrTypeL1.HP]: 8.2, [EAttrTypeL1.MP]: 8.2, [EAttrTypeL1.K_DETER]: 9.2, }, }, [ERaceType.GHOST]: { [ESexType.MALE]: { [EAttrTypeL1.K_WILDFIRE]: 10, [EAttrTypeL1.K_FORGET]: 10, [EAttrTypeL1.K_BLOODRETURN]: 10, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_WILDFIRE]: 10, [EAttrTypeL1.K_FORGET]: 10, [EAttrTypeL1.K_PHY_GET]: 15.3, }, }, [ERaceType.DRAGON]: { [ESexType.MALE]: { [EAttrTypeL1.HP]: 8.2, [EAttrTypeL1.PHY_GET]: 10, [EAttrTypeL1.HK_PHY_GET]: 5, }, [ESexType.FEMALE]: { [EAttrTypeL1.HP]: 8.2, [EAttrTypeL1.PHY_GET]: 10, [EAttrTypeL1.HK_PHY_GET]: 5, }, } } // 2转修正 static reliveFixAttr2 = { [ERaceType.HUMEN]: { [ESexType.MALE]: { [EAttrTypeL1.K_CONFUSION]: 15, [EAttrTypeL1.K_SEAL]: 15, [EAttrTypeL1.K_SLEEP]: 15, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_POISON]: 15, [EAttrTypeL1.K_SEAL]: 15, [EAttrTypeL1.K_SLEEP]: 15, }, }, [ERaceType.SKY]: { [ESexType.MALE]: { [EAttrTypeL1.K_THUNDER]: 15, [EAttrTypeL1.K_WATER]: 15, [EAttrTypeL1.K_WIND]: 15, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_THUNDER]: 15, // 抗混乱 [EAttrTypeL1.K_WATER]: 15, // 抗封印 [EAttrTypeL1.K_FIRE]: 15, // 抗昏睡 }, }, [ERaceType.DEMON]: { [ESexType.MALE]: { [EAttrTypeL1.HP]: 12.3, [EAttrTypeL1.MP]: 12.3, [EAttrTypeL1.SPD]: 9.23, }, [ESexType.FEMALE]: { [EAttrTypeL1.HP]: 12.3, [EAttrTypeL1.MP]: 12.3, [EAttrTypeL1.K_DETER]: 13.8, }, }, [ERaceType.GHOST]: { [ESexType.MALE]: { [EAttrTypeL1.K_WILDFIRE]: 15, [EAttrTypeL1.K_FORGET]: 15, [EAttrTypeL1.K_BLOODRETURN]: 15, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_WILDFIRE]: 15, [EAttrTypeL1.K_FORGET]: 15, [EAttrTypeL1.K_PHY_GET]: 23, }, }, [ERaceType.DRAGON]: { [ESexType.MALE]: { [EAttrTypeL1.HP]: 16, [EAttrTypeL1.PHY_GET]: 16.8, [EAttrTypeL1.HK_PHY_GET]: 15.1, }, [ESexType.FEMALE]: { [EAttrTypeL1.HP]: 16.3, [EAttrTypeL1.PHY_GET]: 18, [EAttrTypeL1.HK_PHY_GET]: 16.8, }, } } // 转生修正3 static reliveFixAttr3 = { [ERaceType.HUMEN]: { [ESexType.MALE]: { [EAttrTypeL1.K_CONFUSION]: 20, [EAttrTypeL1.K_SEAL]: 20, [EAttrTypeL1.K_SLEEP]: 20, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_POISON]: 20, [EAttrTypeL1.K_SEAL]: 20, [EAttrTypeL1.K_SLEEP]: 20, }, }, [ERaceType.SKY]: { [ESexType.MALE]: { [EAttrTypeL1.K_THUNDER]: 20, [EAttrTypeL1.K_WATER]: 20, [EAttrTypeL1.K_WIND]: 20, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_THUNDER]: 20, // 抗混乱 [EAttrTypeL1.K_WATER]: 20, // 抗封印 [EAttrTypeL1.K_FIRE]: 20, // 抗昏睡 }, }, [ERaceType.DEMON]: { [ESexType.MALE]: { [EAttrTypeL1.HP]: 16.4, [EAttrTypeL1.MP]: 16.4, [EAttrTypeL1.SPD]: 12.3, }, [ESexType.FEMALE]: { [EAttrTypeL1.HP]: 16.4, [EAttrTypeL1.MP]: 16.4, [EAttrTypeL1.K_DETER]: 18.5, }, }, [ERaceType.GHOST]: { [ESexType.MALE]: { [EAttrTypeL1.K_WILDFIRE]: 20, [EAttrTypeL1.K_FORGET]: 20, [EAttrTypeL1.K_BLOODRETURN]: 20, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_WILDFIRE]: 20, [EAttrTypeL1.K_FORGET]: 20, [EAttrTypeL1.K_PHY_GET]: 30.6, }, }, [ERaceType.DRAGON]: { [ESexType.MALE]: { [EAttrTypeL1.HP]: 21.4, [EAttrTypeL1.PHY_GET]: 21.4, [EAttrTypeL1.HK_PHY_GET]: 25.4, }, [ESexType.FEMALE]: { [EAttrTypeL1.HP]: 21.4, [EAttrTypeL1.PHY_GET]: 21.4, [EAttrTypeL1.HK_PHY_GET]: 25.6, }, } } // 转生修正4 static reliveFixAttr4 = { [ERaceType.HUMEN]: { [ESexType.MALE]: { [EAttrTypeL1.K_CONFUSION]: 25, [EAttrTypeL1.K_SEAL]: 25, [EAttrTypeL1.K_SLEEP]: 25, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_POISON]: 25, [EAttrTypeL1.K_SEAL]: 25, [EAttrTypeL1.K_SLEEP]: 25, }, }, [ERaceType.SKY]: { [ESexType.MALE]: { [EAttrTypeL1.K_THUNDER]: 25, [EAttrTypeL1.K_WATER]: 25, [EAttrTypeL1.K_WIND]: 25, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_THUNDER]: 25, // 抗混乱 [EAttrTypeL1.K_WATER]: 25, // 抗封印 [EAttrTypeL1.K_FIRE]: 25, // 抗昏睡 }, }, [ERaceType.DEMON]: { [ESexType.MALE]: { [EAttrTypeL1.HP]: 22.4, [EAttrTypeL1.MP]: 22.4, [EAttrTypeL1.SPD]: 24.3, }, [ESexType.FEMALE]: { [EAttrTypeL1.HP]: 22.4, [EAttrTypeL1.MP]: 22.4, [EAttrTypeL1.K_DETER]: 24.5, }, }, [ERaceType.GHOST]: { [ESexType.MALE]: { [EAttrTypeL1.K_WILDFIRE]: 25, [EAttrTypeL1.K_FORGET]: 25, [EAttrTypeL1.K_BLOODRETURN]: 25, }, [ESexType.FEMALE]: { [EAttrTypeL1.K_WILDFIRE]: 25, [EAttrTypeL1.K_FORGET]: 25, [EAttrTypeL1.K_PHY_GET]: 42.6, }, }, [ERaceType.DRAGON]: { [ESexType.MALE]: { [EAttrTypeL1.HP]: 25, [EAttrTypeL1.PHY_GET]: 25, [EAttrTypeL1.HK_PHY_GET]: 50, }, [ESexType.FEMALE]: { [EAttrTypeL1.HP]: 25, [EAttrTypeL1.PHY_GET]: 25, [EAttrTypeL1.HK_PHY_GET]: 50, }, }, } static attrToBtlAttr: any = { [EAttrTypeL1.ATK]: [EAttrTypeL1.ATK_ADD], [EAttrTypeL1.K_PHY_GET]: [EAttrTypeL1.DEFEND_ADD, EAttrTypeL1.PHY_GET], [EAttrTypeL1.SPD]: [EAttrTypeL1.SPD_ADD], } static atkSkills = [ EMagicType.PHYSICS, //物理 EMagicType.CHAOS, //混乱 EMagicType.TOXIN, //毒 EMagicType.SLEEP, //昏睡 EMagicType.SEAL, //封印 EMagicType.WIND, //风法 EMagicType.FIRE, //火法 EMagicType.THUNDER, //雷法 EMagicType.WATER, //水法 EMagicType.FRIGHTEN, //震慑 EMagicType.THREE_CORPSE, //三尸 EMagicType.CHARM, //魅惑 EMagicType.GHOST_FIRE, //鬼火 EMagicType.FORGET, //遗忘 EMagicType.SUB_DEFENSE, // 减防 ] static skillActOn: any = { All: 0, Enemy: 1, Self: 2, } static defSkills: any = [ EMagicType.SPEED, //加速 EMagicType.DEFENSE, //加防 EMagicType.ATTACK, //加攻 EMagicType.HIDING, //隐身 ] static debuffSkills: any = [ EMagicType.CHAOS, //混乱 EMagicType.TOXIN, //毒 EMagicType.SLEEP, //昏睡 EMagicType.SEAL, //封印 EMagicType.CHARM, //魅惑 EMagicType.FORGET, //遗忘 EMagicType.SUB_DEFENSE, // 减防 ] static buffSkillType: any = { //法系id [EMagicType.PHYSICS]: 0, //物理 [EMagicType.CHAOS]: 2, //混乱 [EMagicType.TOXIN]: 0, //毒 [EMagicType.SLEEP]: 0, //昏睡 [EMagicType.SEAL]: 0, //封印 [EMagicType.WIND]: 0, //风法 [EMagicType.FIRE]: 0, //火法 [EMagicType.THUNDER]: 0, //雷法 [EMagicType.WATER]: 0, //水法 [EMagicType.SPEED]: 1, //加速 [EMagicType.DEFENSE]: 1, //加防 [EMagicType.ATTACK]: 1, //加攻 [EMagicType.FRIGHTEN]: 0, //震慑 [EMagicType.THREE_CORPSE]: 0, //三尸 [EMagicType.CHARM]: 2, //魅惑 [EMagicType.GHOST_FIRE]: 0, //鬼火 [EMagicType.FORGET]: 2, //遗忘 [EMagicType.SUB_DEFENSE]: 2, // 减防 } // 抗性列表 static skillTypeKangXing: any = { [EMagicType.CHAOS]: EAttrTypeL1.K_CONFUSION, [EMagicType.SEAL]: EAttrTypeL1.K_SEAL, [EMagicType.SLEEP]: EAttrTypeL1.K_SLEEP, [EMagicType.TOXIN]: EAttrTypeL1.K_POISON, [EMagicType.WIND]: EAttrTypeL1.K_WIND, [EMagicType.FIRE]: EAttrTypeL1.K_FIRE, [EMagicType.WATER]: EAttrTypeL1.K_WATER, [EMagicType.THUNDER]: EAttrTypeL1.K_THUNDER, [EMagicType.GHOST_FIRE]: EAttrTypeL1.K_WILDFIRE, [EMagicType.FORGET]: EAttrTypeL1.K_FORGET, [EMagicType.THREE_CORPSE]: EAttrTypeL1.K_BLOODRETURN, [EMagicType.FRIGHTEN]: EAttrTypeL1.K_DETER, [EMagicType.PHYSICS]: EAttrTypeL1.K_PHY_GET, } // 忽视列表 static skillTypeStrengthen: any = { [EMagicType.CHAOS]: EAttrTypeL1.HK_CONFUSION, // 忽视抗混乱 [EMagicType.TOXIN]: EAttrTypeL1.HK_POISON, [EMagicType.SLEEP]: EAttrTypeL1.HK_SLEEP, [EMagicType.SEAL]: EAttrTypeL1.HK_SEAL, [EMagicType.WIND]: EAttrTypeL1.HK_WIND, [EMagicType.FIRE]: EAttrTypeL1.HK_FIRE, [EMagicType.THUNDER]: EAttrTypeL1.HK_THUNDER, [EMagicType.WATER]: EAttrTypeL1.HK_WATER, [EMagicType.GHOST_FIRE]: EAttrTypeL1.HK_WILDFIRE, [EMagicType.FORGET]: EAttrTypeL1.HK_FORGET, [EMagicType.THREE_CORPSE]: EAttrTypeL1.HK_BLOODRETURN, [EMagicType.FRIGHTEN]: EAttrTypeL1.HK_DETER, [EMagicType.PHYSICS]: EAttrTypeL1.HK_PHY_GET, } static wuXingStrengthen: any = { [EAttrTypeL1.GOLD]: EAttrTypeL1.WOOD, // 金 [EAttrTypeL1.WOOD]: EAttrTypeL1.SOIL, // 木 [EAttrTypeL1.WATER]: EAttrTypeL1.FIRE, // 水 [EAttrTypeL1.FIRE]: EAttrTypeL1.GOLD, // 火 [EAttrTypeL1.SOIL]: EAttrTypeL1.WATER, // 土 } static WuXingKeStrengthen: any = { [EAttrTypeL1.S_GOLD]: EAttrTypeL1.GOLD, //强力克金 [EAttrTypeL1.S_WOOD]: EAttrTypeL1.WOOD, //强力克木 [EAttrTypeL1.S_WATER]: EAttrTypeL1.WATER, //强力克水 [EAttrTypeL1.S_FIRE]: EAttrTypeL1.FIRE, //强力克火 [EAttrTypeL1.S_SOIL]: EAttrTypeL1.SOIL, //强力克土 } // 战斗回合类型 static BtlActionType: any = { Initiative: 1, // 主动 Passive: 2, // 被动 } static buffType = { None: 0, //无buff Loop: 1, //循环伤害 Once: 2, // 一次计算 } // 战斗回合内 响应 static btlRespone: any = { NoThing: 0, // 无响应 Defense: 1, // 防御 Dodge: 2, // 闪避 CriticalHit: 3, // 暴击 Catched: 4, // 被抓 NoCatch: 5, // 不能被抓 CatchFail: 6, // 捕捉失败 Protect: 7, BeProtected: 8, //被保护 SummonBack: 9, Summon: 10, SummonFaild: 11, PoFang: 12, } static skillEffect = { cnt: 1, // 人数 round: 0, // 回合 hurt: 0, //伤害 hurtpre: 0, //伤害百分比 hppre: 0, // 加血百分比 mppre: 0, // 加蓝百分比 smppre: 0, // 法力减少- hit: 0, // 命中增加+ spd: 0, // 速度增加+ atk: 0, // 攻击增加+ kongzhi: 0, // 控制抗性+ fashang: 0, // 法伤抗性+ fangyu: 0, // 防御+ hp: 0, // 增加血量 maxhp:0,//最大生命值 aihp: 0, // 智能回血(用于吸血类技能) skongzhi: 0, // 减少控制抗性 yinshen: 0, // 隐身 attrtype: 0, //五行 attrnum: 0, //五行数值 rate: 0, //几率 } static wuXing = { Gold: 1, Wood: 2, Water: 3, Fire: 4, Earth: 5, } static actType = { Skill: 1, Item: 2, Summon: 3, // 召唤 RunAway: 4, // 逃跑 Protect: 5, // 保护 Catch: 6, //捕捉 SummonBack: 7, //召还 } static ENpcKind = { ERole: 1, EThing: 2, EBomb: 3 } //人物转职后的等级表 static reliveLimit: any = { [1]: { level: 100, tolevel: 80, price: 100, }, [2]: { level: 120, tolevel: 100, price: 100, }, [3]: { level: 140, tolevel: 120, price: 100, }, [4]: { level: 180, tolevel: 150, price: 100, }, } static cantPKMaps = [ 1011, // 长安 1201, // 监狱 1002, // 天宫 1000, // 皇宫 1206, // 金銮殿 1012, // 地府 1202, // 白骨洞 1203, // 斜月三星洞 1208, // 兜率宫 1013, // 兰若寺 1014, // 灵兽村 3002, // 帮派 4001, // 家 ]; // 帮派聊天充值总额限制 static limitBangChatCharge = 30; // 世界聊天等级限制 static limitWorldChatLevel = 80; // 世界聊天充值总额限制 static limitWorldChatCharge = 30; // 世界铃铛充值总额限制 static bellMsg = 500; static limitPetNum = 100; static limitMail = 20; // 创建帮会充值金额总额限制 static limitGreateBangChargeCount = 1000; // 创建帮会个数限值 static limitChildBangCount = 9999; // 创建帮会仙玉费用 static ChildBangCost = 300000; static limitBroadcastList: string[] = [ 'qq', 'QQ', '微信', '君羊', '君.羊', '龙马服', '残端', '私服', '无线', '裙', '号', ] static addLimitWord(text: string) { if (text && text.length > 0) { if (this.limitBroadcastList.indexOf(text) == -1) this.limitBroadcastList.push(text); } } // 开启背包消耗金额 static bagPrice = 500; // 背包默认空间 static limitBagKindNum = 100; // 仓库默认空间 static limitLockerKindNum = 100; // 宠物锁技能消耗金额 static petLockSkillJade = 1000; static shenBingBroke: number[] = [ 5000, 2500, 1000, 500, ] static equipPos: any = { UNKNOW: 1, USE: 2, BAG: 3, BANK: 4, } // 强杀等级限制 static PKLevelLimit = 90; static petGrade: any = { Normal: 0, High: 1, Special: 2, Shen: 3, SSR: 4, } static goldKind: any = { Money: 0, // 银两 Jade: 1, // 仙玉 BindJade: 2, // 绑定仙玉 SLDH_Score: 3, // 水路大会积分 Goods: 4, // 道具 arena_Score: 5,//竞技场积分 bang_Score: 6,//帮贡 shi_Score: 7,//师贡 di_Score: 8,//地宫积分 xiu_Score: 9,//除魔积分 guo_Score: 10,//郭氏积分 } static titleType: any = { IMGTitle: 0, //图片类称谓 CommonTitle: 1, //普通文字称谓,如帮派类称谓 BroTitle: 2, //结拜类称谓 CoupleTitle: 3, //夫妻类称谓 } static titleBangType: any = { NoTitle: 0, ShuiLuZhanShen: 86, Shancaitongzi: 43, Couple: 200, Brother: 201, BangZhu: 227, // 帮主 FuBangZhu: 226, // 副帮主 ZuoHuFa: 225, // 左护法 YouHuFa: 224, // 右护法 ZhangLao: 223, // 长老 TangZhu: 222, // 堂主 BangZhong: 221, // 帮众 } static bangPost = { Unknow: 0, // 未知 BangZhu: 1, // 帮主 FuBangZhu: 2, // 副帮主 ZuoHuFa: 3, // 左护法 YouHuFa: 4, // 右护法 ZhangLao: 5, // 长老 TangZhu: 6, // 堂主 BangZhong: 7, // 帮众 } static relationType = { Brother: 0, // 结拜 Couple: 1, // 结婚 } static relationTypeMembersCount = { [GameUtil.relationType.Brother]: 5, [GameUtil.relationType.Couple]: 2, } static lingHouMinMoney = 2000; static LingHouRetMoney = 10000; static brotherMoney = 1000000; static schemeUseMoney = 10000000; static prop_data: any = {}; static catch_data: any = {}; static starList = [ 10051, 10052, 10053, 10054, 10055, 10056, 10057, 10058, 10059, 10060, 10061, 10062, ]; static limitWordList: string[] = [ '系统', '官方', '测试', 'gm', 'Gm', 'GM', '管理', '内测', '内部', '技术', '公告', '公测', '垃圾', '毛泽东', '周恩来', '刘少奇', '习近平', '李克强', '朱德', '丁磊', '你妈', '买号', '卖号', '收号', '出号', '号', '共产党' ] static numchar: string[] = [ 'q', 'Q', 'O', '0', 'X', '微','员', '一', '二', '三', '四', '五', '六', '七', '八', '九', '零', '〇', '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⁰', '¹', '²', '³', '⁴', '⁵', '⁶', '⁷', '⁸', '⁹', '₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉', '⑴', '⑵', '⑶', '⑷', '⑸', '⑹', '⑺', '⑻', '⑼', '⒈', '⒉', '⒊', '⒋', '⒌', '⒍', '⒎', '⒏', '⒐', 'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ', '❶', '❷', '❸', '❹', '❺', '❻', '❼', '❽', '❾', '➊', '➋', '➌', '➍', '➎', '➏', '➐', '➑', '➒', '➓', '⓵', '⓶', '⓷', '⓸', '⓹', '⓺', '⓻', '⓼', '⓽','⑨','①','②','⑤','③','④','⑧', '㈠', '㈡', '㈢', '㈣', '㈤', '㈥', '㈦', '㈧', '㈨', '壹', '贰', '叁', '叄', '肆', '伍', '陆', '柒', '捌', '扒', '玖', '伞', '溜', '君', '羊', '久', '巴', '玉', '仙', '裙', '群', '西', '游','峮', '1', '2', '3', '4', '5', '6', '7', '8', '9','无限钰','亲民服','新区峮','➀','➁','➂','➄','➃','➅','➆' ] static fdump(obj: any) { let t = 0; let repeat = (str: any, n: any) => { return new Array(n).join(str); } let adump = (object: any) => { t++; if (object && typeof object === "object") { for (const key in object) { if (object.hasOwnProperty(key)) { const value = object[key]; if (value && typeof value === "object") { let isa = Array.isArray(value); console.log(repeat('\t', t), key + ':' + (isa ? '[' : '{')); adump(value); t--; console.log(repeat('\t', t), isa ? ']' : '}'); } else { console.log(repeat('\t', t), key + ':' + value); } } } } else { console.log(repeat('\t', t), object); } } adump(obj); } static dump(...args: any[]) { for (const arg of args) { this.fdump(arg); } } static seed_index: number = 10000; static buff_index: number = 10000; static getAutoAddId(): number { GameUtil.seed_index++; return GameUtil.seed_index; } static getAutoBuffId(): number { GameUtil.buff_index++; return GameUtil.buff_index; } static random(min: number, max: number): number { return Math.floor(Math.random() * (max - min + 1) + min); } static getFlag(nNum: number, nIndex: number): number { if (nIndex < 0 || nIndex > 31) return 0; let nRet = (nNum >> nIndex) & 1; return nRet; } static setFlag(nNum: any, nIndex: number, bValue: number): number { if (nIndex < 0 || nIndex > 31) return null; if (bValue != 0 && bValue != 1) return null; let bFlag = GameUtil.getFlag(nNum, nIndex); if (bFlag > bValue) { nNum -= (1 << nIndex); } if (bFlag < bValue) { nNum += (1 << nIndex); } return nNum; } static EPlayerFlag = { EBanSpeak: 1, } static checkLimitWord = function (msg: any): boolean { for (let k = 0; k < msg.length; k++) { let msgchar: any = msg[k]; if (msgchar == "["){ return true; } if (GameUtil.numchar.indexOf(msgchar) != -1) { return false; } } for (let i = 0; i < GameUtil.limitBroadcastList.length; i++) { const fword = GameUtil.limitBroadcastList[i]; let exp = "[" + fword.split('').join("].*[") + "]"; let reg = new RegExp(exp, 'im'); if (reg.test(msg)) { return false; } } return true; } static serverState: any = { lower: 1, // 流畅 high: 2, // 拥堵 close: 3, // 关闭 } static MonkeyPos: any = [ // 1007 大唐边境 {mapid: 1007, x: 133, y: 27}, {mapid: 1007, x: 21, y: 111}, {mapid: 1007, x: 76, y: 97}, {mapid: 1007, x: 5, y: 65}, {mapid: 1007, x: 165, y: 95}, // 1011 长安 {mapid: 1011, x: 256, y: 51}, {mapid: 1011, x: 71, y: 5}, {mapid: 1011, x: 253, y: 74}, {mapid: 1011, x: 176, y: 130}, {mapid: 1011, x: 73, y: 138}, {mapid: 1011, x: 106, y: 125}, {mapid: 1011, x: 7, y: 67}, {mapid: 1011, x: 32, y: 69}, {mapid: 1011, x: 2, y: 107}, {mapid: 1011, x: 28, y: 138}, // 1004 大唐境内 {mapid: 1004, x: 137, y: 90}, {mapid: 1004, x: 141, y: 22}, {mapid: 1004, x: 88, y: 6}, {mapid: 1004, x: 4, y: 74}, // 1010 东海渔村 {mapid: 1010, x: 115, y: 63}, {mapid: 1010, x: 52, y: 45}, {mapid: 1010, x: 113, y: 97}, {mapid: 1010, x: 75, y: 108}, {mapid: 1010, x: 24, y: 103}, {mapid: 1010, x: 94, y: 133}, // 1006 万寿山 {mapid: 1006, x: 80, y: 149}, {mapid: 1006, x: 84, y: 149}, {mapid: 1006, x: 88, y: 149}, {mapid: 1006, x: 92, y: 149}, {mapid: 1006, x: 96, y: 148}, {mapid: 1006, x: 96, y: 144}, {mapid: 1006, x: 91, y: 144}, {mapid: 1006, x: 84, y: 144}, {mapid: 1006, x: 78, y: 144}, {mapid: 1006, x: 66, y: 139}, {mapid: 1006, x: 72, y: 139}, {mapid: 1006, x: 76, y: 139}, {mapid: 1006, x: 82, y: 139}, {mapid: 1006, x: 66, y: 134}, {mapid: 1006, x: 75, y: 134}, {mapid: 1006, x: 86, y: 134}, {mapid: 1006, x: 92, y: 134}, {mapid: 1006, x: 15, y: 131}, {mapid: 1006, x: 9, y: 35}, // 1015 蟠桃园 {mapid: 1015, x: 41, y: 12}, {mapid: 1015, x: 5, y: 19}, {mapid: 1015, x: 76, y: 56}, {mapid: 1015, x: 102, y: 66}, {mapid: 1015, x: 43, y: 67}, {mapid: 1015, x: 9, y: 125}, {mapid: 1015, x: 4, y: 48}, // 1016 御马监 {mapid: 1016, x: 9, y: 16}, {mapid: 1016, x: 137, y: 40}, {mapid: 1016, x: 141, y: 65}, {mapid: 1016, x: 78, y: 90}, {mapid: 1016, x: 86, y: 34}, // 1014 灵兽村 {mapid: 1014, x: 8, y: 97}, {mapid: 1014, x: 2, y: 60}, {mapid: 1014, x: 148, y: 16}, {mapid: 1014, x: 140, y: 6}, {mapid: 1014, x: 88, y: 99}, // 1017 傲来国 {mapid: 1017, x: 8, y: 28}, {mapid: 1017, x: 8, y: 77}, {mapid: 1017, x: 10, y: 75}, {mapid: 1017, x: 1, y: 72}, {mapid: 1017, x: 34, y: 112}, {mapid: 1017, x: 32, y: 97}, {mapid: 1017, x: 100, y: 80}, {mapid: 1017, x: 56, y: 63}, {mapid: 1017, x: 68, y: 33}, {mapid: 1017, x: 9, y: 8}, {mapid: 1017, x: 27, y: 6}, {mapid: 1017, x: 43, y: 6}, {mapid: 1017, x: 59, y: 6}, {mapid: 1017, x: 113, y: 6}, {mapid: 1017, x: 142, y: 20}, {mapid: 1017, x: 97, y: 37}, {mapid: 1017, x: 137, y: 54}, // 1008 白骨山 {mapid: 1008, x: 105, y: 64}, {mapid: 1008, x: 10, y: 40}, {mapid: 1008, x: 48, y: 13}, // 1005 方寸山 {mapid: 1005, x: 14, y: 20}, {mapid: 1005, x: 49, y: 55}, {mapid: 1005, x: 59, y: 70}, // 1019 平顶山 {mapid: 1019, x: 182, y: 7}, {mapid: 1019, x: 121, y: 2}, {mapid: 1019, x: 147, y: 19}, {mapid: 1019, x: 178, y: 9}, {mapid: 1019, x: 15, y: 82}, {mapid: 1019, x: 2, y: 62}, {mapid: 1019, x: 2, y: 29}, {mapid: 1019, x: 29, y: 3}, {mapid: 1019, x: 47, y: 124}, {mapid: 1019, x: 191, y: 97}, {mapid: 1019, x: 191, y: 40}, {mapid: 1019, x: 175, y: 58}, {mapid: 1019, x: 177, y: 77}, {mapid: 1019, x: 146, y: 64}, // 1003 北俱芦洲 {mapid: 1003, x: 23, y: 69}, {mapid: 1003, x: 51, y: 74}, {mapid: 1003, x: 84, y: 6}, {mapid: 1003, x: 135, y: 22}, {mapid: 1003, x: 139, y: 5}, {mapid: 1003, x: 139, y: 45}, {mapid: 1003, x: 139, y: 62}, {mapid: 1003, x: 138, y: 80}, ]; static require_ex(file: string): any { if (GameUtil.prop_data[file]) { return GameUtil.prop_data[file]; } let data = GameUtil.reloadfile(file); if (data == null) { SKLogger.warn(`加载配置文件错误:${file}`); } else { GameUtil.prop_data[file] = data; } return data; } // 重新加载配置文件 static reloadPropData() { let errorlist = []; for (let filename in GameUtil.prop_data) { let fieldata = GameUtil.reloadfile(filename); if (fieldata) { if (GameUtil.prop_data[filename]) { let data = GameUtil.prop_data[filename]; for (const datakey in data) { if (data.hasOwnProperty(datakey)) { data[datakey] = fieldata[datakey]; } } } else { GameUtil.prop_data[filename] = fieldata; } } else { errorlist.push(filename); } } SKLogger.info('热更新完成'); if (errorlist.length > 0) { for (let filename of errorlist) { SKLogger.warn(`文件加载错误:[${filename}]`); } } return errorlist; } static reloadfile(filename: any): any { let full_path = path.join(__dirname, filename); let old = require.cache[require.resolve(full_path)]; if (old != null || old != undefined) { GameUtil.catch_data[full_path] = old; } require.cache[require.resolve(full_path)] = undefined; let ret_data = null; try { let data = require(require.resolve(full_path)); if (data) { ret_data = data; } else { require.cache[full_path] = GameUtil.catch_data[full_path]; ret_data = null; } } catch (error) { console.error('load json ERROR, filename:' + full_path); console.error(error.message); require.cache[full_path] = GameUtil.catch_data[full_path]; ret_data = null; } delete GameUtil.catch_data[full_path]; return ret_data; } static serviceType = { Gate: 1, Game: 2, IM: 3, } static getPartnerJson(pPartner: any): string { if (null == pPartner) { return '{}'; } let stLevelInfo = PartnerConfigMgr.shared.GetPower(pPartner.id, pPartner.relive, pPartner.level); if (null == stLevelInfo) return '{}'; let stData: any = { id: pPartner.id, level: pPartner.level, exp: pPartner.exp, resid: pPartner.resid, name: pPartner.name, race: pPartner.race, dingwei: pPartner.dingwei, relive: pPartner.relive, mapZiZhi: pPartner.mapZiZhi, skill_list: pPartner.skill_list, livingtype: pPartner.living_type }; for (var it2 in stLevelInfo.Attribute) { stData[it2] = stLevelInfo.Attribute[it2]; } let strJson = SKDataUtil.toJson(stData, "{}"); return strJson; } static getMapLen(mapTmp: any): number { let nCnt = 0; for (const it in mapTmp) nCnt++; return nCnt; } static numToString(nNum: number, nLen: number): string { return (Array(nLen).join('0') + nNum).slice(-nLen); } static getTime() { let nTime = Math.floor(Date.now() / 1000); let nLocalTime = nTime + 28800; return nLocalTime; } static changeNumToRange(fData: number, fMin: number, fMax: number): number { fData = Math.max(fData, fMin); fData = Math.min(fData, fMax); return fData; } static isVectorEqual(vec1: any, vec2: any): boolean { if (vec1.length != vec2.length) return false; for (var it in vec1) { if (vec1[it] != vec2[it]) return false; } return true; } static isDataInVecter(stData: any, vecData: any): boolean { for (let it in vecData) { if (stData == vecData[it]) return true; } return false; } static getAttribute(stData: any, strKey: any, stDefault: any): any { if (stData.hasOwnProperty(strKey) == false) return stDefault; return stData[strKey]; } static getDistance(stPosA: any, stPosB: any): number { let nXDis = Math.abs(stPosA.x - stPosB.x); let nYDis = Math.abs(stPosA.y - stPosB.y); let nDis = Math.pow(nXDis * nXDis + nYDis * nYDis, 0.5); return nDis; } static getDefault(value: any, valid?: any): any { if (typeof (value) == "undefined") { return valid; } return value; } static atribKey_IntToString(nKey: any): any { for (let it in GameUtil.attrEquipTypeStr) { if (GameUtil.attrEquipTypeStr[it] == nKey) return it; } return ''; } static getMapDataByIndex(mapData: any, nIndex: number): any { if (nIndex < 0 || nIndex >= this.getMapLen(mapData)) return null; let nCnt = -1; for (let it in mapData) { nCnt++; if (nCnt == nIndex) return mapData[it]; } return null; } static givePlayerPrize(player: Player, strItem: string, count: number, is: boolean = true) { if (player == null) return; if (strItem == 'exp') { player.addExp(count); } else if (strItem == 'petexp') { if (player.curPet) { player.curPet.addExp(count); } } else if (strItem == 'money') { player.addMoney(0, count, '高级藏宝图'); } else { player.addItem(parseInt(strItem), count, is, '高级藏宝图'); } } static zhenbukuiMap: any = [ // 1007 大唐边境 //{ mapid: 1016, x: 75, y: 49 }, //测试用地点,在御马监小马仙附近 {mapid: 1007, x: 148, y: 44}, {mapid: 1007, x: 100, y: 24}, {mapid: 1007, x: 109, y: 5}, {mapid: 1007, x: 44, y: 14}, {mapid: 1007, x: 84, y: 104}, {mapid: 1007, x: 29, y: 83}, // 1011 长安 {mapid: 1011, x: 49, y: 36}, {mapid: 1011, x: 143, y: 66}, {mapid: 1011, x: 122, y: 34}, {mapid: 1011, x: 223, y: 34}, {mapid: 1011, x: 239, y: 113}, {mapid: 1011, x: 143, y: 84}, {mapid: 1011, x: 40, y: 9}, // 1004 大唐境内 {mapid: 1004, x: 124, y: 74}, {mapid: 1004, x: 120, y: 49}, {mapid: 1004, x: 119, y: 37}, {mapid: 1004, x: 38, y: 47}, {mapid: 1004, x: 70, y: 14}, // 1010 东海渔村 {mapid: 1010, x: 129, y: 47}, {mapid: 1010, x: 141, y: 34}, {mapid: 1010, x: 60, y: 22}, {mapid: 1010, x: 24, y: 9}, {mapid: 1010, x: 41, y: 53}, {mapid: 1010, x: 82, y: 89}, {mapid: 1010, x: 42, y: 103}, {mapid: 1010, x: 114, y: 114}, // 1006 万寿山 {mapid: 1006, x: 56, y: 73}, {mapid: 1006, x: 98, y: 48}, {mapid: 1006, x: 93, y: 8}, {mapid: 1006, x: 18, y: 30}, {mapid: 1006, x: 109, y: 94}, {mapid: 1006, x: 74, y: 136}, // 1015 蟠桃园 {mapid: 1015, x: 70, y: 30}, {mapid: 1015, x: 37, y: 26}, {mapid: 1015, x: 14, y: 57}, {mapid: 1015, x: 39, y: 76}, {mapid: 1015, x: 53, y: 103}, {mapid: 1015, x: 14, y: 120}, {mapid: 1015, x: 90, y: 58}, // 1016 御马监 {mapid: 1016, x: 34, y: 63}, {mapid: 1016, x: 112, y: 63}, {mapid: 1016, x: 96, y: 23}, {mapid: 1016, x: 68, y: 23}, {mapid: 1016, x: 37, y: 26}, // 1014 灵兽村 {mapid: 1014, x: 50, y: 36}, {mapid: 1014, x: 14, y: 55}, {mapid: 1014, x: 64, y: 58}, {mapid: 1014, x: 113, y: 64}, {mapid: 1014, x: 117, y: 42}, {mapid: 1014, x: 138, y: 12}, // 1017 傲来国 {mapid: 1017, x: 57, y: 11}, {mapid: 1017, x: 20, y: 10}, {mapid: 1017, x: 33, y: 42}, {mapid: 1017, x: 56, y: 64}, {mapid: 1017, x: 80, y: 71}, {mapid: 1017, x: 93, y: 90}, {mapid: 1017, x: 44, y: 103}, {mapid: 1017, x: 12, y: 74}, {mapid: 1017, x: 98, y: 29}, {mapid: 1017, x: 133, y: 51}, // 1008 白骨山 {mapid: 1008, x: 80, y: 13}, {mapid: 1008, x: 79, y: 52}, {mapid: 1008, x: 57, y: 70}, {mapid: 1008, x: 36, y: 70}, {mapid: 1008, x: 30, y: 10}, // 1005 方寸山 {mapid: 1005, x: 34, y: 22}, {mapid: 1005, x: 24, y: 65}, {mapid: 1005, x: 48, y: 48}, {mapid: 1005, x: 68, y: 78}, {mapid: 1005, x: 94, y: 89}, {mapid: 1005, x: 101, y: 28}, // 1019 平顶山 {mapid: 1019, x: 154, y: 91}, {mapid: 1019, x: 112, y: 104}, {mapid: 1019, x: 101, y: 60}, {mapid: 1019, x: 78, y: 39}, {mapid: 1019, x: 28, y: 22}, {mapid: 1019, x: 32, y: 55}, {mapid: 1019, x: 110, y: 17}, // 1003 北俱芦洲 {mapid: 1003, x: 24, y: 37}, {mapid: 1003, x: 61, y: 42}, {mapid: 1003, x: 102, y: 48}, {mapid: 1003, x: 120, y: 17}, {mapid: 1003, x: 87, y: 23}, ]; static attrTypeL1Name: any = { // 抗控制 [EAttrTypeL1.K_CONFUSION]: '抗混乱', [EAttrTypeL1.K_SEAL]: '抗封印', [EAttrTypeL1.K_SLEEP]: '抗昏睡', [EAttrTypeL1.K_FORGET]: '抗遗忘', // 法术抗性 [EAttrTypeL1.K_WIND]: '抗风', [EAttrTypeL1.K_THUNDER]: '抗雷', [EAttrTypeL1.K_WATER]: '抗水', [EAttrTypeL1.K_FIRE]: '抗火', [EAttrTypeL1.K_WILDFIRE]: '抗鬼火', [EAttrTypeL1.K_BLOODRETURN]: '抗三尸', [EAttrTypeL1.K_POISON]: '抗毒', [EAttrTypeL1.K_DETER]: '抗震慑', // 忽视抗性(强法) [EAttrTypeL1.HK_SEAL]: '忽视抗封印', [EAttrTypeL1.HK_CONFUSION]: '忽视抗混乱', [EAttrTypeL1.HK_SLEEP]: '忽视抗昏睡', [EAttrTypeL1.HK_FORGET]: '忽视抗遗忘', [EAttrTypeL1.HK_WIND]: '忽视抗风', [EAttrTypeL1.HK_THUNDER]: '忽视抗雷', [EAttrTypeL1.HK_WATER]: '忽视抗水', [EAttrTypeL1.HK_FIRE]: '忽视抗火', [EAttrTypeL1.HK_WILDFIRE]: '忽视抗鬼火', [EAttrTypeL1.HK_BLOODRETURN]: '忽视抗三尸', [EAttrTypeL1.HK_POISON]: '忽视抗毒', [EAttrTypeL1.HK_DETER]: '忽视抗震慑', [EAttrTypeL1.K_PHY_GET]: '抗物理', [EAttrTypeL1.HK_PHY_GET]: '忽视抗物理', // 物理属性 [EAttrTypeL1.PHY_GET]: '物理吸收', [EAttrTypeL1.PHY_BREAK]: '破防程度', [EAttrTypeL1.PHY_BREAK_PROB]: '破防率', [EAttrTypeL1.PHY_HIT]: '命中率', [EAttrTypeL1.PHY_DODGE]: '闪躲率', [EAttrTypeL1.PHY_COMBO]: '连击', [EAttrTypeL1.PHY_COMBO_PROB]: '连击率', [EAttrTypeL1.PHY_DEADLY]: '狂暴', // 法术也会反震 [EAttrTypeL1.PHY_REBOUND]: '反震程度', [EAttrTypeL1.PHY_REBOUND_PROB]: '反震率', [EAttrTypeL1.DEFEND_ADD]: '加强防御', [EAttrTypeL1.SPD_ADD]: '加速', [EAttrTypeL1.ATK_ADD]: '加攻', [EAttrTypeL1.HP_ADD]: '加血', [EAttrTypeL1.MP_ADD]: '加法', [EAttrTypeL1.CHARM_ADD]: '加强魅惑', [EAttrTypeL1.HP_MAX]: '增加气血上限', [EAttrTypeL1.MP_MAX]: '增加法力上限', [EAttrTypeL1.ATK]: '攻击', [EAttrTypeL1.SPD]: '速度', [EAttrTypeL1.HP]: '气血', [EAttrTypeL1.MP]: '法力', [EAttrTypeL1.CURE_EHAN]: '加强治愈', [EAttrTypeL1.SWEEP_EHAN]: '加强横扫', [EAttrTypeL1.BREAK_EHAN]: '加强破甲', [EAttrTypeL1.THUD_EHAN]: '加强震击', [EAttrTypeL1.HP_PERC]: '气血百分比', [EAttrTypeL1.MP_PERC]: '法力百分比', [EAttrTypeL1.ATK_PERC]: '攻击百分比', [EAttrTypeL1.SPD_PERC]: '速度百分比', [EAttrTypeL1.KB_WATER]: '水系狂暴率', [EAttrTypeL1.KB_THUNDER]: '雷系狂暴率', [EAttrTypeL1.KB_FIRE]: '火系狂暴率', [EAttrTypeL1.KB_WIND]: '风系狂暴率', [EAttrTypeL1.KB_BLOODRETURN]: '三尸狂暴率', [EAttrTypeL1.KB_WILDFIRE]: '鬼火狂暴率', [EAttrTypeL1.Q_WATER]: '水狂暴', [EAttrTypeL1.Q_THUNDER]: '雷狂暴', [EAttrTypeL1.Q_FIRE]: '火狂暴', [EAttrTypeL1.Q_WIND]: '风狂暴', [EAttrTypeL1.Q_BLOODRETURN]: '三尸狂暴', [EAttrTypeL1.Q_WILDFIRE]: '鬼火狂暴', // 五行(百分比值)(只有宝宝出生有五行,人使用道具改变五行值,法术改变五行值) [EAttrTypeL1.GOLD]: '金', [EAttrTypeL1.WOOD]: '木', [EAttrTypeL1.WATER]: '水', [EAttrTypeL1.FIRE]: '火', [EAttrTypeL1.SOIL]: '土', // 强力克五行 [EAttrTypeL1.S_GOLD]: '强力克金', [EAttrTypeL1.S_WOOD]: '强力克木', [EAttrTypeL1.S_WATER]: '强力克水', [EAttrTypeL1.S_FIRE]: '强力克火', [EAttrTypeL1.S_SOIL]: '强力克土', [EAttrTypeL1.SLEEP_EHAN]: '加强昏睡', [EAttrTypeL1.DETER_EHAN]: '加强震慑', [EAttrTypeL1.WILDFIRE]: '加强鬼火', [EAttrTypeL1.TOXIN_EHAN]: '加强毒', [EAttrTypeL1.SPD_ADD_EHAN]: '加强加速', [EAttrTypeL1.DEFEND_ADD_EHAN]: '加强加防', [EAttrTypeL1.BLOODRETURN_EHAN]: '加强三尸', [EAttrTypeL1.ICE_EHAN]: '加强冰', [EAttrTypeL1.SEAL_EHAN]: '加强封印', [EAttrTypeL1.CHAOS_EHAN]: '加强混乱', [EAttrTypeL1.WIND_EHAN]: '加强风', [EAttrTypeL1.FIRE_EHAN]: '加强火', [EAttrTypeL1.WATER_EHAN]: '加强水', [EAttrTypeL1.THUNDER_EHAN]: '加强雷', [EAttrTypeL1.FORGET_EHAN]: '加强遗忘', [EAttrTypeL1.BONE]: '根骨', [EAttrTypeL1.SPIRIT]: '灵性', [EAttrTypeL1.STRENGTH]: '力量', [EAttrTypeL1.DEXTERITY]: '敏捷', }; // 属性2名称 static attrTypeL2Name: any = { [EAttrTypeL2.GENGU]: '根骨', [EAttrTypeL2.LINGXING]: '灵性', [EAttrTypeL2.LILIANG]: '力量', [EAttrTypeL2.MINJIE]: '敏捷', } static launch() { // SKRedisUtil.launch(); this.snowFlake53 = new SnowFlack53(BigInt(this.serverId - 1000 + 1)); this.game_conf = SKDataUtil.readJson("../../conf/json/game_conf.json"); SKLogger.isDebug = GameConf.isDebug; SKLogger.info(`[${GameConf.channel}:${SKLogger.isDebug ? `调试` : `正式`}]读取游戏全局配置完成!`); } static getReliveText(relive: number, level: number): string { let prefix = ""; if (relive > 3) { prefix = "飞升"; } else { prefix = `${relive}转`; } let result = `${prefix}${level}级`; return result; } static sex: any = ["未知","男","女"]; static race: any = ["未知","人","仙","魔","鬼","龙"]; static getRoleRaceText(race: number, sex: number): string { return GameUtil.race[race] + GameUtil.sex[sex]; } static getRandomArrayElements(arr: any, count: number) { let shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index; while (i-- > min) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(min); } /** * 装备评分计算 * @param race 种族 * @param equip 装备 */ static getEquipScore(baseAttr: any, lianhuaAttr: any, type: number, grade: number, sex: number, race: number, baseScore: number, gemCnt: any): number { let score = 0; // 佩饰 if (type == EEquipType.BALDRIC) { score = this.getBasicsListAttrScore(race, sex, baseAttr); score += baseScore + baseScore * 0.5 * grade; } // 翅膀 或 仙器 或 神器 或 高级装备 或 新手装备 else if (type == EEquipType.WING || type == EEquipType.XianQi || type == EEquipType.ShenBing || type == EEquipType.HIGH || type == EEquipType.XinShou) { // 宝石评分 if (JSON.stringify(gemCnt) != '{}'){ score += this.gemCalculate(gemCnt); } // 炼化评分 if (JSON.stringify(lianhuaAttr) != '{}'){ score += this.getBasicsListAttrScore(race, sex, lianhuaAttr); } score += this.calculate(baseAttr,race, sex, true); score += baseScore + baseScore * 0.5 * grade; } // 其他装备 else { score += baseScore + baseScore * 0.5 * grade; } if (isNaN(score)){ score = 0; } return Math.floor(score); } // 数组对象类型属性评分计算[{}] static getBasicsListAttrScore(race: number, sex: number, baseAttr: any): number { let score = 0; // 查看当前属性是否有值 if (baseAttr.length > 0) { // 有值则遍历取值 for (let base of baseAttr) { // 计算属性值 score += this.calculate(base,race,sex,false); } } return Math.floor(score); } // 计算属性值 static calculate(base: any, race: number, sex: number,flag :boolean): number{ let score = 0; // 当前属性 for (let key in base) { let key_ = parseInt(key); let value = parseInt(base[key]); // 判断当前属性值是否不用计算百分百比 if (this.equipTypeNumerical.indexOf(key_) != -1) { value = value / 100; }else { if (flag){ value = value / 10; } } // 获取装备属性每点分数 let grade = this.getScore(race, sex, key_); score += value * grade; } return Math.floor(score); } // 计算宝石属性评分 static gemCalculate(gemCnt: any): number{ let score = 0; for (let key in gemCnt) { // 宝石编号 let key_ = parseInt(key); // 镶嵌数量 let value = parseInt(gemCnt[key]); // 根据宝石编号获取当前宝石单个分数 let grade = this.gemBasicsScore[key_]; score += grade * value; } return Math.floor(score); } // 角色属性分数:15分 通用属性忽视抗抗连击率:10分 角色基础属性分数:5分 static getScore(race: number, sex: number, key: number): number { let grade = 5; let roleAttrScore: any = this.roleAttrScore[race]; // 判断是否为通用装备 if (roleAttrScore != undefined) { if (sex != 9) { let value = roleAttrScore[sex][key]; if (value == undefined) { value = this.roleBasicsAttrScore[key]; if (value != undefined) { grade = 10; } } else { grade = value; } } else { grade = 5; } } else { let value = this.roleBasicsAttrScore[key]; if (value != undefined) { grade = 10; } } return grade; } // 角色基础属性分数 static roleBasicsAttrScore: any = { [EAttrTypeL2.GENGU]: 5, [EAttrTypeL2.LINGXING]: 5, [EAttrTypeL2.LILIANG]: 5, [EAttrTypeL2.MINJIE]: 5, } // 角色属性分数 static roleAttrScore: any = { [ERaceType.HUMEN]: { // 人族 (男) [ESexType.MALE]: { // key 属性, value 每点属性分数 [EAttrTypeL1.K_SEAL_CONFUSION_SLEEP_FORGET_LIMIT]: 15, [EAttrTypeL1.HK_CONFUSION]: 15, [EAttrTypeL1.HK_SEAL]: 15, [EAttrTypeL1.HK_SLEEP]: 15, }, // 人族 (女) [ESexType.FEMALE]: { // key 属性, value 每点属性分数 [EAttrTypeL1.HK_POISON]: 15, [EAttrTypeL1.BONE]: 15, }, }, [ERaceType.SKY]: { // 仙族 (男) [ESexType.MALE]: { // key 属性, value 每点属性分数 [EAttrTypeL1.SPIRIT]: 15, [EAttrTypeL1.Q_WIND]: 15, [EAttrTypeL1.Q_FIRE]: 15, [EAttrTypeL1.Q_WATER]: 15, [EAttrTypeL1.Q_THUNDER]: 15, [EAttrTypeL1.KB_WIND]: 15, [EAttrTypeL1.KB_FIRE]: 15, [EAttrTypeL1.KB_WATER]: 15, [EAttrTypeL1.KB_THUNDER]: 15, [EAttrTypeL1.HK_WIND]: 15, [EAttrTypeL1.HK_FIRE]: 15, [EAttrTypeL1.HK_WATER]: 15, [EAttrTypeL1.HK_THUNDER]: 15, }, // 仙族 (女) [ESexType.FEMALE]: { // key 属性, value 每点属性分数 [EAttrTypeL1.SPIRIT]: 15, [EAttrTypeL1.Q_WIND]: 15, [EAttrTypeL1.Q_FIRE]: 15, [EAttrTypeL1.Q_WATER]: 15, [EAttrTypeL1.Q_THUNDER]: 15, [EAttrTypeL1.KB_WIND]: 15, [EAttrTypeL1.KB_FIRE]: 15, [EAttrTypeL1.KB_WATER]: 15, [EAttrTypeL1.KB_THUNDER]: 15, [EAttrTypeL1.HK_WIND]: 15, [EAttrTypeL1.HK_FIRE]: 15, [EAttrTypeL1.HK_WATER]: 15, [EAttrTypeL1.HK_THUNDER]: 15, }, }, [ERaceType.DEMON]: { // 魔族 (男) [ESexType.MALE]: { [EAttrTypeL1.Q_BLOODRETURN]: 15, [EAttrTypeL1.KB_BLOODRETURN]: 15, [EAttrTypeL1.HK_BLOODRETURN]: 15, [EAttrTypeL1.HK_DETER]: 15, }, // 魔族 (女) [ESexType.FEMALE]: { [EAttrTypeL1.Q_BLOODRETURN]: 15, [EAttrTypeL1.KB_BLOODRETURN]: 15, [EAttrTypeL1.HK_BLOODRETURN]: 15, [EAttrTypeL1.HK_DETER]: 15, }, }, [ERaceType.GHOST]: { // 鬼族 (男) [ESexType.MALE]: { [EAttrTypeL1.HK_WILDFIRE]: 15, [EAttrTypeL1.KB_WILDFIRE]: 15, [EAttrTypeL1.Q_WILDFIRE]: 15, }, // 鬼族 (女) [ESexType.FEMALE]: { [EAttrTypeL1.HK_WILDFIRE]: 15, [EAttrTypeL1.KB_WILDFIRE]: 15, [EAttrTypeL1.Q_WILDFIRE]: 15, }, }, } // 宝石分数 static gemBasicsScore: any = { // 红宝石基础分数: 70分 每增加一个等级增加5分 30025: 70, 30026: 75, 30027: 80, 30028: 85, 30029: 90, 30030: 95, 30104: 100, // 绿宝石基础分数: 65分 每增加一个等级增加5分 30013: 65, 30014: 70, 30015: 75, 30016: 80, 30017: 85, 30018: 90, 30102: 95, // 蓝宝石基础分数: 65分 每增加一个等级增加5分 30019: 65, 30020: 70, 30021: 75, 30022: 80, 30023: 85, 30024: 90, 30103: 95, // 紫宝石基础分数: 65分 每增加一个等级增加5分 30001: 65, 30002: 70, 30003: 75, 30004: 80, 30005: 85, 30006: 90, 30100: 95, // 橙宝石基础分数: 65分 每增加一个等级增加5分 30007: 65, 30008: 70, 30009: 75, 30010: 80, 30011: 85, 30012: 90, 30101: 95, } // Map转数组 static mapToArray(entries: any, size: number) { let list = []; for (let i = 0; i < size; i++) { let data = entries.next().value; list.push(data[1]) } return list; }; // 清空属性表 static clearAllAttr(attr1: { [key: string]: number }) { for (let key in EAttrTypeL1) { let value = SKDataUtil.numberBy(key); if (isNaN(value)) { continue; } attr1[value] = 0; } } /** * 生成签到数据 * flag: 0:未签到、1:签到、2:补签 */ static getDaySignIn(): any{ let data: any = {}; // 当前月天数 let day = GTimer.getMonthDay(); // 当前月份 let month = GTimer.getCurMonth(); let list: any = []; for (let i = 0; i < day; i++) { list.push({day: i + 1, flag: 0}) } data[month] = list; return SKDataUtil.toJson(data,"{}"); } //阿拉伯数字转中文数字 noToChinese(num: any) { if (!/^\d*(\.\d*)?$/.test(num)) { alert("Number is wrong!"); return "Number is wrong!"; } let AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九"); let BB = new Array("", "十", "百", "千", "万", "亿", "点", ""); let a: any = ("" + num).replace(/(^0*)/g, "").split("."), k = 0, re = ""; for (let i = a[0].length - 1; i >= 0; i--) { switch (k) { case 0: re = BB[7] + re; break; case 4: if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0])) re = BB[4] + re; break; case 8: re = BB[5] + re; BB[7] = BB[5]; k = 0; break; } if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re; if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re; k++; } if (a.length > 1) //加上小数部分(如果有小数部分) { re += BB[6]; for (let i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)]; } return re; }; static getIPAdress(): string { var interfaces = os.networkInterfaces(); for (var devName in interfaces) { var iface = interfaces[devName]; for (var i = 0; i < iface.length; i++) { var alias = iface[i]; if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) { return alias.address; } } } return "127.0.0.1"; } static nextId(): number { if (this.snowFlake53 == null) { throw new Error("服务器没有正常启动!"); } return this.snowFlake53.nextId(); } }