import { EGongFaType, EGongFaTypeZh, EShopType, ESuitType, EWuGongArrTypeZh, GameAbility, GameTotalType, ITEM_TYPE, PropType, TASK_TYPE } from "../const/GameEnum"; import { CONFIDANTE_TYPE, OFFLINE_PARAMS, TREASURE_TYPE } from "../const/GGameData"; import WuGongData from "../const/WuGongData"; import MathUtils from "../ExUtils/MathUtils"; import UIMgr from "../Mgr_UI/UIMgr"; import { TreasureDataProxy } from "./DataTypeProxy/TreasureDataProxy"; import { GameDataProxy } from "./DataTypeProxy/GameDataProxy"; import { BuildsDataProxy } from "./DataTypeProxy/BuildsDataProxy"; import { DateDataProxy } from "./DataTypeProxy/DateDataProxy"; import { IDataArray, IItemsData, ROLE_PARAMS } from "../const/GameInterface"; import MesMgr from "../MesEvent/MesMgr"; import { EGlobalEvent } from "../MesEvent/EGlobalEvent"; import { LocalDataMgr } from "./LocalDataMgr"; import { TaskDataProxy } from "./DataTypeProxy/TaskDataProxy"; import SceneDataMgr from "./SceneDataMgr"; import { Global } from "../Global"; import { TokenDataProxy } from "./DataTypeProxy/TokenDataProxy"; import { BagDataProxy } from "./DataTypeProxy/BagDataProxy"; import { ShopDataProxy } from "./DataTypeProxy/ShopDataProxy"; import Language from "../Language"; import SoulDataMgr from "./SoulDataMgr"; import GDUtils from "../ExCUtils/GDUtils"; import ResLoad from "../ResUrl/ResLoad"; import PlatformManager from "../Platform/PlatformManager"; import PlatformManagerProxy from "../Platform/PlatformManagerProxy"; import Base64 from "./Base/Base64"; import { ISuitEffect } from "../Mgr_CSV/CsvEnum"; import StringUtils from "../ExUtils/StringUtils"; export default class RoleDataMgr { private static _ins: RoleDataMgr = null; public static get Ins() { if (!this._ins) { this._ins = new RoleDataMgr(); this._ins.init(); } return this._ins; } private get _GameData() { return GameDataProxy.Ins; } private get _data() { return this._GameData.data; } attack_type: number = 0; attackWuGong: WuGongData = null; // 当前使用的攻击武功 defenseWuGong: WuGongData = null; // 当前使用的防御武功 speedWuGong: WuGongData = null; // 当前使用的轻功 attack: number = 0; defense: number = 0; speed: number = 0; fighting: number = 0; wugongs: { [key: number]: WuGongData[] } = {}; // 按武功种类分 attainments: { [key: number]: number } = {}; // 武功种类的属性 attackTimes: number = 0; private _craft: number = 0; // 技能 private _lucky: number = 0; // 幸运 private _weapon: IItemsData; private _armor: IItemsData; // private _myRedeemCodeCfg: string[] = []; suitInfo: { [key: number]: number } = {}; // 每种套装类型的激活数量 suitSkillCD: { [key: number]: number } = {}; // 每种套装技能的CD suitSkillProp: { [key: number]: number } = {}; // 每种套装技能效果值 skillplaying = false; // 技能是否正在播放 skillSuitCfg:ISuitEffect = null; // 当前已激活技能的套装 skillSuitDesc:string = ""; // 当前技能的描述 init() { for (let type = EGongFaType.剑法; type <= EGongFaType.内功; type++) { this.wugongs[type] = []; this.attainments[type] = 0; } for (let i = 0; i < this._data.wugongs.length; i++) { const tWugong = this._data.wugongs[i]; const WugongPoxy: WuGongData = new WuGongData(tWugong); this.wugongs[WugongPoxy.config.type].push(WugongPoxy); } // 排序武功 for (let type in this.wugongs){ this.order_wugongs(this.wugongs[type]); } // 套装信息初始化 for (let i = ESuitType.YinYang; i <= ESuitType.CuiYu; i++) { this.suitSkillCD[i] = 0; } this.initCraftLucky(); this.refreshAttackType(); this.refreshDefense(); this.refreshSpeed(); this.refreshSuit(); for (let type = EGongFaType.剑法; type <= EGongFaType.内功; type++) { this.refreshAttainment(type); } this.refreshFighting(); } initOfflineInfo(){ // 处理离线时间 this.offlineSeconds = DateDataProxy.Ins.getOfflinetime(); // 计算收益倍率 const multiplier = 1 + 0.01 * (TreasureDataProxy.Ins.getProp1(TREASURE_TYPE.OFFLINE) + LocalDataMgr.Confidante.getProp(CONFIDANTE_TYPE.离线收益)); // 增加挑战时间 LocalDataMgr.Pass.add_PlayedTime(Math.floor(0.3 * this.offlineSeconds * multiplier)); } rebuild(){ this._craft = 0; this._lucky = 0; this.attack_type = 0; this.attackTimes = 0; this._weapon = null; this._armor = null; this.attackWuGong = null; this.defenseWuGong = null; this.speedWuGong = null; this.wugongs = {}; this.attainments = {}; this.init(); } addStage(type:number) { ++this._data.stages[type]; MesMgr.event(EGlobalEvent.UP_GONGFA); UIMgr.Ins.ShowTipsUI(EGongFaTypeZh[type] + "精进+1"); } //#region 武功相关 // addWuGong() { // } // 获得武功 getWugong(type, id): WuGongData { for (const wugong of this.wugongs[type]) { if (wugong.id == id) { return wugong; } } return null; } // 是否已学 isLearned(id: number) { for (let i = 0; i < this._data.wugongs.length; i++) { if (id == this._data.wugongs[i].id) return true } return false; } // 学武功 learnWG(id:number) { if (this.isLearned(id)) return false; if(!TaskDataProxy.Ins.isCompleteAllTask()) { const taskConfig = TaskDataProxy.Ins.task.config; if(taskConfig.condition === TASK_TYPE.ADD_WUGONG && taskConfig.conditionId === id){ SceneDataMgr.Ins.refreshTaskProgress(); } } // const quest = Quest_Data.Instance; // // 更新任务进度 // if (quest.task) { // if (quest.task.needType === 7 && quest.task.needId === e) { // quest.task.update_num(1); // } // } const wg = {id: id, level: 1}; this._data.wugongs.push(wg); const WugongPoxy: WuGongData = new WuGongData(wg); this.wugongs[WugongPoxy.config.type].push(WugongPoxy); const wgname = Language.getValue(WugongPoxy.config.name); UIMgr.Ins.ShowTipsUI("学会武功:" + (WugongPoxy.config.quality > 1? GDUtils.GetHEXByQualityForStr(wgname, WugongPoxy.config.quality):wgname)); this.refreshWuGong(WugongPoxy.config.type); ConsoleEx.Log("学会功法:" + WugongPoxy.config.name); // this.order_wugongs() // t.levelUp_core() return true } /** * 对武功数组按ID排序 */ order_wugongs(wugong: WuGongData[]): void { wugong.sort((a, b) => b.value_keyAtt - a.value_keyAtt); } /** * 武功升级方法 * @param {EGongFaType} type 武学类型 * @param {number} id 武功ID */ levelUpWg(wgdata:WuGongData): void { // 执行升级核心逻辑 if(wgdata){ let oldattprop = wgdata.value_keyAtt; wgdata.upgrade(); this.refreshWuGong(wgdata.config.type); const gfcfg = Global.CsvMgr.GongFa_csv[wgdata.config.type]; // UIMgr.Ins.ShowTipsUI(`战力 +${this.fighting - oldfighting}`); UIMgr.Ins.ShowTipsUI(`${gfcfg.key_name} +${wgdata.value_keyAtt - oldattprop}`); UIMgr.Ins.ShowTipsUI(`${gfcfg.prop1} +${wgdata.config.overAll}`); (gfcfg.prop2 && gfcfg.prop2.length > 0) && UIMgr.Ins.ShowTipsUI(`${gfcfg.prop2} +${wgdata.config.overAll}`); } } /** * 指定id的武功是否可以升级 * @param {EGongFaType} type 武学类型 * @param type * @returns */ canUpgrade(type:EGongFaType, id: number): {res: number; data: WuGongData} { let wugong = this.getWugong(type, id); if (!wugong) return {res:-1, data:null}; // 检查武学等级是否满足升级条件 if (this.wuxue < wugong.levelUp_condition) { return {res:2, data:null}; // 武学等级不足 } if(!LocalDataMgr.Token.checkToken(PropType.eGold, wugong.levelUp_paycoin)){ // UIMgr.Ins.ShowTipsUI("铜钱不足!") return {res:1, data:null}; } return {res:0, data:wugong}; } /**指定类型的武功可否有可以升级的 */ canUpgradeByType(type:EGongFaType){ const wglist:WuGongData[] = this.wugongs[type]; for (let j = 0; j < wglist.length; j++) { const uplvres = this.canUpgrade(type, wglist[j].id); if (uplvres.res == 0) { return true; } } return false; } getGongFaArr(type:EGongFaType){ let maxValue: number = 0; let wuGong: WuGongData = null; const tList = this.wugongs[type] || []; for (let i = 0; i < tList.length; i++) { const wugong = tList[i]; if (wugong.value_keyAtt > maxValue) { maxValue = wugong.value_keyAtt; wuGong = wugong; } } return { maxValue, wuGong } } getCurrSuitSkillCD(): number { return this.skillSuitCfg !== null? this.suitSkillCD[this.skillSuitCfg.suit_type] : 9999; } private refreshSuit() { this.skillSuitCfg = null; // 套装信息初始化 for (let i = ESuitType.YinYang; i <= ESuitType.CuiYu; i++) { this.suitInfo[i] = 0; this.suitSkillProp[i] = 0; } if(this._weapon){ const wpcfg = Global.CsvMgr.Items_csv[this._weapon.id]; if(wpcfg && wpcfg.suittype > 0){ this.suitInfo[wpcfg.suittype]++; } } if(this._armor){ const arcfg = Global.CsvMgr.Items_csv[this._armor.id]; if(arcfg && arcfg.suittype > 0){ this.suitInfo[arcfg.suittype]++; } } if(this.attackWuGong){ const wgcfg = Global.CsvMgr.Items_csv[this.attackWuGong.id]; if(wgcfg && wgcfg.suittype > 0){ this.suitInfo[wgcfg.suittype]++; } } this.refreshSuitSkillInfo(); } private refreshSuitSkillInfo(){ let num = 0; this.skillSuitDesc = ""; for(const key in this.suitInfo){ const lv = this.suitInfo[key]; if(lv <= 0) { continue; } num > 0 && (this.skillSuitDesc += " "); const cfgs = Global.CsvMgr.Suit_eff_type_csv[key]; const suitname = GDUtils.GetHEXBySuitTypeForStr(cfgs[0].suit_name, Number(key)); // this.suitSkillProp[key] = 0; let effect = ""; let skillname = ""; if(lv <= cfgs.length - 1){ for(let i = 0; i < cfgs.length; i++){ const cfg = cfgs[i]; if(cfg.level <= lv){ this.suitSkillProp[key] += cfg.prop1; } } effect = StringUtils.format(cfgs[lv - 1].suit_effect, (this.suitSkillProp[key] * 100).toFixed(0)); }else if(lv == cfgs.length){ const cfg = cfgs[cfgs.length - 1]; skillname = cfg.suit_effect; const precfg = cfgs[cfgs.length - 2]; this.suitSkillProp[key] = precfg.prop1; effect = `${StringUtils.format(precfg.suit_effect, (this.suitSkillProp[key] * 100).toFixed(0))} ${skillname}`; this.skillSuitCfg = cfg; } this.skillSuitDesc += `${suitname}:${effect}`; ++num; } } refreshAttackType() { var e = this.attack_type; this.attack_type = EGongFaType.剑法; let oldsuit = false; let newsuit = false; if (this.weapon) { this.attack_type = this.weapon.att_type; } let oldwgid = 0; if(this.attackWuGong){ oldwgid = this.attackWuGong.id; this.attackWuGong.isUseing = false; oldsuit = Global.CsvMgr.Items_csv[oldwgid].suittype > 0; } const ArrObject = this.getGongFaArr(this.attack_type); let maxAttack = ArrObject.maxValue; this.attackWuGong = ArrObject.wuGong; this.attack = maxAttack; this.weapon && (this.attack += this.weapon.effect); this.attackWuGong && (this.attackWuGong.isUseing = true); let usenew = false; if (this.attackWuGong){ usenew = (oldwgid != 0 && oldwgid != this.attackWuGong.id); const wugongList = this.wugongs[this.attack_type]; if (usenew && wugongList && wugongList.length > 0){ const index = wugongList.indexOf(this.attackWuGong); if (index > -1) { // 从当前位置移除 wugongList.splice(index, 1); // 放到最前面 wugongList.unshift(this.attackWuGong); // 新启用的武功 MesMgr.event(EGlobalEvent.USENEW_WUGONG, oldwgid); // 套装武功相关 newsuit = Global.CsvMgr.Items_csv[this.attackWuGong.id].suittype > 0; } } } // 套装相关的武功有变化 if(oldsuit || newsuit){ this.refreshSuit(); } if (ResLoad.allDoen && e && (this.attack_type != e || usenew)) { //app.manager.toast.pop(f.GONGFA, "当前使用武学:" + EWuGongArrTypeZh[this.attack_type]); const wgname = Language.getValue(this.attackWuGong.config.name); UIMgr.Ins.ShowTipsUI("启用武功:" + (this.attackWuGong.config.quality > 1? GDUtils.GetHEXByQualityForStr(wgname, this.attackWuGong.config.quality):wgname)); } } refreshDefense() { const ArrObject = this.getGongFaArr(EGongFaType.内功); let maxDefense = ArrObject.maxValue; this.defenseWuGong = ArrObject.wuGong; this.defense = maxDefense; if (this.armor) { this.defense += this.armor.effect; } } refreshSpeed() { const ArrObject = this.getGongFaArr(EGongFaType.轻功); let maxSpeed = ArrObject.maxValue; this.speedWuGong = ArrObject.wuGong; this.speed = maxSpeed; } // 刷新战力 refreshFighting() { let old = this.fighting; let t = (this.attainments[this.attack_type] + 1e3) / 1e3 let n = this.attainments[this.attack_type]; this.fighting = Math.floor((this.attack * t + this.defense * (800 + this.attainments[EGongFaType.内功]) / 800) * (this.speed + this.attainments[EGongFaType.轻功] + 2100) / 2100 * .99) + this.attainments[EGongFaType.轻功] + n; MesMgr.event(EGlobalEvent.REFRESH_FIGHTING, old); // app.view.doAction(h.REFRESH_FIGHTING); // e && (this.fighting > e ? app.manager.toast.pop(f.FIGHTING, "战斗力 提高" + (this.fighting - e) + "点") : this.fighting < e && app.manager.toast.pop(f.FIGHTING, "战斗力 下降" + (e - this.fighting) + "点")); } // 刷新指定武功的属性值 refreshAttainment(type) { let conftype:CONFIDANTE_TYPE = CONFIDANTE_TYPE.剑法; switch (type) { case EGongFaType.剑法: conftype = CONFIDANTE_TYPE.剑法; break; case EGongFaType.刀法: conftype = CONFIDANTE_TYPE.刀法; break; case EGongFaType.枪法: conftype = CONFIDANTE_TYPE.枪法; break; case EGongFaType.轻功: conftype = CONFIDANTE_TYPE.轻功; break; case EGongFaType.内功: conftype = CONFIDANTE_TYPE.内功; break; default: break; } this.attainments[type] = LocalDataMgr.Confidante.getProp(conftype); for (const wugong of this.wugongs[type]) { this.attainments[type] += wugong.attainment; } } refreshWuGong(wgtype) { switch (wgtype) { case EGongFaType.剑法: case EGongFaType.刀法: case EGongFaType.枪法: this.refreshAttackType(); break; case EGongFaType.轻功: this.refreshSpeed(); break; case EGongFaType.内功: this.refreshDefense(); break; default: break; } this.refreshAttainment(wgtype); this.refreshFighting(); } // refreshEquip(item) { // if (item.config.type % 10 === this.attack_type) { // this.refreshAttackType(); // this.refreshFighting(); // } else if (item.config.type === ITEM_TYPE.ARMOR) { // this.refreshDefense(); // this.refreshFighting(); // } // } getWuGongLevel(wugongId) { const wugong = this._data.wugongs.find(w => w.id === wugongId); return wugong ? wugong.level : 0; } //#endregion //#region 商店相关 /** * 购买物品 * @param item 要购买的物品 * @returns 购买结果状态码: * 0 - 购买成功 * 1 - 银两不足 * 2 - 背包空间不足或其他限制 * 3 - 商品非法 * 5 - 特殊物品已达携带上限 */ buyGoods(id: number, shoptype: EShopType = EShopType.普通商店){ const cfg = Global.CsvMgr.Items_csv[id]; // 特殊类型物品(工具类)检查携带上限 if ((cfg.type === ITEM_TYPE.TOOL || cfg.type === ITEM_TYPE.TALISMAN) && BagDataProxy.Ins.getItemCount(id) > 0) { // ConsoleEx.Log("特殊唯一物品,携带上限已满") UIMgr.Ins.ShowTipsUI("特殊的唯一物品,携带上限已满") return 5; } // 检查背包空间 if (!BagDataProxy.Ins.haveSpace()) { // ConsoleEx.Log("背包满了") UIMgr.Ins.ShowTipsUI("背包满了") return 2; } // 商店安全检查 if (!ShopDataProxy.Ins.safety_check(id, shoptype)) { UIMgr.Ins.ShowTipsUI("道具不合法,请重进游戏") return 3; } // 计算折扣后价格并检查银两是否足够 const discountedPrice = (cfg.pricetype === 1)? Math.floor(cfg.price * ShopDataProxy.Ins.discount) : cfg.price; // const discountedPrice = Math.floor(cfg.price * ShopDataProxy.Ins.discount); if (!TokenDataProxy.Ins.checkToken(cfg.pricetype, discountedPrice)) { // ConsoleEx.Log("钱不够") const config = Global.CsvMgr.base_res_csv[cfg.pricetype]; const name = GDUtils.GetHEXByQualityForStr(config.name, config.quality) UIMgr.Ins.ShowTipsUI(`没有足够的${name}`); // UIMgr.Ins.ShowTipsUI("没有足够的铜钱") return 1; } // 执行购买操作 BagDataProxy.Ins.addItem(id); ShopDataProxy.Ins.buyGoods(id, shoptype); TokenDataProxy.Ins.subToken(cfg.pricetype, discountedPrice); // UIMgr.Ins.ShowTipsUI(`成功购买${cfg.name}`); return 0 } //#endregion getStage(stageType) { return this._data.stages[stageType] || 0; } // 每50攻击50次,有几率增加对应的武功造诣 addAttackTimes() { this.attackTimes++; if (this.attackTimes >= ROLE_PARAMS.STAGE_CHECK_INTERVAL) { this.attackTimes = 0; MathUtils.getRandom(ROLE_PARAMS.STAGE_TOTAL_WEIGHT(this.getStage(this.attack_type))) < ROLE_PARAMS.STAGE_UPGRADE_WEIGHT && this.addStage(this.attack_type); } } // 检查指定的兑换码是否已兑换 checkCode(code:string) { return this._data.redeemCode && this._data.redeemCode.indexOf(code) > -1; } // 指定的兑换码是否还能兑换 canRedeemCode(code:string):{code:number,awards:IDataArray} { const redemData = Global.CsvMgr.GetRedemData(); if(!this.checkCode(code)){ if(redemData && redemData.length > 0){ const platName = PlatformManager.PlatformInstance.platform; // const codedata = redemData.find(item => item.code === code && (("EPlatformType_" + item.platform) === platName || item.platform === "")); const codedata = redemData.find(item => item.code === code); if(codedata){ let loginState = PlatformManager.PlatformInstance.loginState; if (!loginState.uid && !!loginState.openid) { loginState.uid = Base64.encode(`${loginState.openid}_10086`) } if(codedata.openid === "" || codedata.openid === loginState.uid){ return { code: 1, awards: codedata.awards }; } } } return {code: -1, awards:null}; }else{ return {code: 0, awards:null}; } } // 兑换 redeemCode(code:string): boolean { const resdata = this.canRedeemCode(code); if(resdata.code === 0){ UIMgr.Ins.ShowTipsUI("兑换失败,请勿重复兑换"); } else if(resdata.code === 1){ this._data.redeemCode = this._data.redeemCode || []; this._data.redeemCode.push(code); GDUtils.DistributeRewards(resdata.awards) UIMgr.Ins.ShowTipsUI("兑换成功"); for(let i = 0; i < resdata.awards.length; i++) { const element = resdata.awards[i]; if (element.type === GameTotalType.TOKEN) { const config = Global.CsvMgr.base_res_csv[element.id]; const name = GDUtils.GetHEXByQualityForStr(`${config.name}+${element.num}`, config.quality) UIMgr.Ins.ShowTipsUI(`恭喜${name}`); }else if(element.type === GameTotalType.ABILITY){ if(element.id === GameAbility.SHOP_REFRESH_TIMES){ UIMgr.Ins.ShowTipsUI(`商店刷新次数+${element.num}`); } } } } else { UIMgr.Ins.ShowTipsUI("兑换失败,请检查兑换码是否正确"); } return resdata.code === 1; } initCraftLucky(){ this._craft += TreasureDataProxy.Ins.getProp1(TREASURE_TYPE.CRAFT); this._lucky += TreasureDataProxy.Ins.getProp1(TREASURE_TYPE.LUCKY); } refreshCraftLucky(){ let data:{craft: number; lucky: number} = LocalDataMgr.Bag.getItemCraftAndLucky(); this._craft = data.craft + TreasureDataProxy.Ins.getProp1(TREASURE_TYPE.CRAFT); this._lucky = data.lucky + TreasureDataProxy.Ins.getProp1(TREASURE_TYPE.LUCKY); } addCraft(value){ this._craft += value; this._craft <= 0 && (this._craft = 0); } addLucky(value){ this._lucky += value; this._lucky <= 0 && (this._lucky = 0); } get craft() { return this._craft; } get lucky() { return this._lucky; } get offlineSeconds() { return this._data.offline || 0; } set offlineSeconds(value:number) { this._data.offline = value; this._GameData.Save(); } // 武器 get weapon() { return this._weapon; } set weapon(value) { let oldsuit = false; let newsuit = false; if (this._weapon) { this._weapon.weared = false; oldsuit = Global.CsvMgr.Items_csv[this._weapon.id].suittype > 0; } this._weapon = value; this._data.weapon = value ? value.uuid : null; if (value) { value.weared = true; newsuit = Global.CsvMgr.Items_csv[this._weapon.id].suittype > 0; } // 套装相关的武器有变化 if(oldsuit || newsuit){ this.refreshSuit(); } this.refreshAttackType(); this.refreshFighting(); this._GameData.Save(); } // 防具 get armor() { return this._armor; } set armor(value) { let oldsuit = false; let newsuit = false; if (this._armor) { this._armor.weared = false; oldsuit = Global.CsvMgr.Items_csv[this._armor.id].suittype > 0; } this._armor = value; this._data.armor = value ? value.uuid : null; if (value) { value.weared = true; newsuit = Global.CsvMgr.Items_csv[this._armor.id].suittype > 0; } // 套装相关的防具有变化 if(oldsuit || newsuit){ this.refreshSuit(); } this.refreshDefense(); this.refreshFighting(); this._GameData.Save(); } get wuxue() { return this.attainments[EGongFaType.剑法] + this.attainments[EGongFaType.刀法] + this.attainments[EGongFaType.枪法]; } // 暴击率 get crit() { let e = this.getStage(this.attack_type); return Math.floor(1000 * e / (500 + e)) / 10 + (TreasureDataProxy.Ins.getProp1(TREASURE_TYPE.CRIT) + LocalDataMgr.Confidante.getProp(CONFIDANTE_TYPE.暴击率)); } // 是否暴击 get isCrit() { return MathUtils.getRandom(100) < this.crit; } // 建筑资源产生的离线收益 get offlineEarn() { let totalIncome = BuildsDataProxy.Ins.getTotalIncome(); const offlineBonus = 1 + 0.01 * TreasureDataProxy.Ins.getProp1(TREASURE_TYPE.OFFLINE); return Math.floor(0.3 * this.offlineSeconds * offlineBonus * totalIncome * 3 / 10); } // 御器离线收益 get offlineFight() { const offlineBonus = 1 + 0.01 * TreasureDataProxy.Ins.getProp1(TREASURE_TYPE.OFFLINE); return SoulDataMgr.Ins.unlock? Math.floor( this.offlineSeconds * this.fighting * offlineBonus * (0.01 * this.crit + 1) * SoulDataMgr.Ins.attackSpeed * 10 / 10 / SceneDataMgr.Ins.level.monster.totalHP * Number(SceneDataMgr.Ins.level.monster.config.bounty) * 0.3 * (40 + SceneDataMgr.Ins.level.config.index) / 40 ) : 0; } // 商店刷新次数的离线收益 get offlineTimes() { const offlineBonus = 1 + 0.01 * TreasureDataProxy.Ins.getProp1(TREASURE_TYPE.OFFLINE); const baseTimes = Math.min( 20 + Math.floor((this.offlineSeconds - OFFLINE_PARAMS.REWARD_TIME) / 20 / 60 * 5), OFFLINE_PARAMS.MAX_REFRESH_TIMES ); return Math.floor(baseTimes * offlineBonus); } }