import { assetManager, Enum } from "cc"; import { JsonAsset } from "cc"; import { AssetManager } from "cc"; import { Singleton } from "../../mx/tools/Singleton"; /** * 配置表名称 */ export enum TableNames { /**章节表 */ Chapter = "Chapter", /**章节怪物表 */ Chapter_monster = "Chapter_monster", /**章节怪物权重表 */ Chapter_weight = "Chapter_weight", /**常量表 */ Const = "const", /**道具表 */ Item = "Item", /**转盘表 */ Lottery = "Lottery", /**怪物表 */ Monster = "Monster", /**怪物表2 */ Monster2 = "Monster2", // /**武器表 */ // weapon = "Weapon", /**武器表2 */ Weapon2 = "Weapon2", Weapon3 = "Weapon3", Weapon4 = "Weapon4", /**武器等级表 */ Weapon_Level = "Weapon_Level", /**技能表 */ Skill = "Skill", Box = 'Box', Shop = 'Shop', Sign = 'sign', Role = 'Role', Character = 'Character', CDK = 'CDK', Task = 'Task', TaskReward = 'TaskReward', // /**抽卡花费 */ // Wheel_cost = 'Wheel_cost', // /**抽卡权重 */ // Wheel_weight = 'Wheel_weight', // /**支付表 */ // Pay = "Pay", // /**商城直购表 */ // ShopBuy = "ShopBuy", // /**连续礼包表 */ // ContinueBag = "ContinueBag", // /**首充表 */ // FirstBag = "FirstBag", // /**月卡表 */ // MonthCard = "MonthCard", // /**基金表 */ // Fund = "Fund", /**章节宝箱表 */ Chapter_chest = "Chapter_chest", /**限制活动表 */ LimitActivity = "LimitActivity", // /**新年签到表 */ // NewYearSign = "NewYearSign", /**新功能表 */ NewFun = "NewFun", //副本表 Replica = "Replica", // //新机制表 // Playmode = "Playmode", /**目标任务表 */ TargetTask = "TarTask", // /**角色皮肤表 */ // RoleSkin = "Skin", // /**地图障碍物表 */ // Obstacle = "Obstacle", // /**章节剧情表 */ // StoryComic = "StoryComic", // /**宠物表 */ // Pet = "Pet", // /**宠物升级表 */ // PetUp = "PetUp", // /**宠物升级属性表 */ // PetUpAttr = "PetUpAttr", // /**宠物池抽奖表 */ // PetPool = "PetPool", /**技能成本表 */ SkillCost = "Const_weight", /**技能池 */ SkillPool = "Skill_pool", /**技能池使用表 */ SkillPoolUse = "skill_pool_use", // /** 丧尸工厂表 */ // zombieTab = "zombie", // GreatGift = "Gift", // Playmode = 'playMode', /**俄罗斯方块方块表 */ BattleCube = 'BattleCube', /** * TetriWaveWeight */ TetriWaveWeight = 'TetriWaveWeight', /**副本等级表 */ ReplicaLevel = 'ReplicaLevel', //副本等级表 } /** * 配置表数据 */ export class ConfigTableData extends Singleton { private _tableMap: Map> = new Map>(); private _loadTableCount = 0; loadConfig(onprogress: Function, callback: Function) { this._loadTableCount = 0; let max = Object.keys(TableNames).length; for (let k in TableNames) { let v = TableNames[k]; this.loadTable(v, () => { this._loadTableCount++; //console.log(`load table ${v} success`); if (onprogress) onprogress(this._loadTableCount, max); if (this._loadTableCount == Object.keys(TableNames).length) { if (callback) callback(); } }) } } private loadTable(tableName: string, callback?: Function) { let loadFun = (bundle: AssetManager.Bundle) => { if (bundle == null) { if (callback) callback(); } else { let res = bundle.get("config/" + tableName, JsonAsset); if (res) { this.onTableLoaded(tableName, res.json); if (callback) callback(); return; } bundle.load("config/" + tableName, JsonAsset, (err, asset) => { if (err) { console.log(`load table ${tableName} err:`, err); } else if (asset?.json != null) { this.onTableLoaded(tableName, asset.json); } else { console.log(`load table ${tableName} err: asset or json is null (remote 404?)`); } if (callback) callback(); }) } } let bundle = assetManager.getBundle("first"); if (bundle) { loadFun(bundle); } else { assetManager.loadBundle("first", (err, bundle) => { if (err) { console.log(`load bundle first err:`, err); loadFun(null); } else { loadFun(bundle); } }) } } private onTableLoaded(tableName, json) { let data: Map = new Map(); for (let i = 0; i < json.length; i++) { data.set(json[i].id + "", json[i]); } this._tableMap.set(tableName, data); } /** * 用热更新/Bin 解压后的数据覆盖 _tableMap。 * 键为表名字符串(与 TableNames 枚举值、bundle 内 config 文件名一致),值为行对象数组(每行需含 id)。 */ applyHotUpdateTables(tables: Record) { if (!tables || typeof tables !== 'object') return; for (const tableName of Object.keys(tables)) { const json = tables[tableName]; if (Array.isArray(json)) { this.onTableLoaded(tableName, json); } } } /**获取表数据键值对(key为id)-通用 */ getTableMap(tableName: string) { return this._tableMap.get(tableName); } /**获取表数据列表-通用 */ getTableList(tableName: TableNames) { return Array.from(this._tableMap.get(tableName).values()) as T[]; } /**获取表数据(根据id获取一条数据) -通用*/ getTableData(tableName: TableNames, id: number) { let table = this._tableMap.get(tableName); if (table) { return table.get(id + "") as T; } return null; } /**获取配置的常量值(必须具有常量表const,否则会返回0) */ getConst(id: number) { let d: ITableConst = this._tableMap.get(TableNames.Const)?.get(id + ""); if (d) { let arr = (d.constValue + "").split("|"); return Number(arr[0]); } else return 0; } getConstArray(id: number) { let d: ITableConst = this._tableMap.get(TableNames.Const)?.get(id + ""); if (d) { return d.constgroup; } else return []; } getConstString(id: number) { let d: ITableConst = this._tableMap.get(TableNames.Const)?.get(id + ""); if (d) { return d.constString; } else return ""; } /**获取常量配置 */ getConstData(id: number): ITableConst { return this._tableMap.get(TableNames.Const)?.get(id + ""); } /**获取技能常量配置 */ getSkillCostData(id: number): ITableConst_weight { return this._tableMap.get(TableNames.SkillCost)?.get(id + ""); } /**获取道具数据 */ getItemData(itemid: number): ITableItem { return this._tableMap.get(TableNames.Item)?.get(itemid + ""); } ///在这里添加具体表数据的获取方法 // /**获取道具池数据 */ // getItemPoolData(id: number): ITableItemPool { // return this._tableMap.get(TableNames.itemPool)?.get(id + ""); // } // /**根据商店类型和池子类型获取道具池数据 */ // getItemPoolDataByType(shopType: number, poolType: number): ITableItemPool { // let list = this.getTableList(TableNames.itemPool); // return list.find(x => x.shopType == shopType && x.poolType == poolType); // } // /**根据商店类型,池子类型和参数获取道具池数据 */ // getItemPoolDataByTypeAndPar(shopType: number, poolType: number, par: number): ITableItemPool { // let list = this.getTableList(TableNames.itemPool); // return list.find(x => x.shopType == shopType && x.poolType == poolType && x.par == par); // } // /**根据商店类型和任务ID获取道具池数据 */ // getItemPoolDataByShopTypeAndTaskID(shopType: number, taskID: number): ITableItemPool { // let list = this.getTableList(TableNames.itemPool); // return list.find(x => x.shopType == shopType && x.par == taskID); // } // /**获取道具池权重列表 */ // getItemPoolList(id: number) { // let list: IItemPoolData[] = []; // let data = this.getItemPoolData(id); // let str = data.pool; // let arr = str.split("-"); // for (let i = 0; i < arr.length; i++) { // let [id, num, weight] = arr[i].split("|"); // list.push({ id: +id, num: +num, weight: +weight }); // } // return list; // } } /**道具池权重列表数据结构 */ export interface IItemPoolData { /**编号 */ id: number; /**数量 */ num: number; /**权重 */ weight: number; } // //宝箱等级表 export interface IBoxLevelData { /**编号 */ id: number; /**等级 */ level: number; /**经验值 */ exp: number; /**类型 */ type: number; /**消耗 */ consume: number; /**数量 */ amount: number; /**碎片 */ fragment: string; } //签到表 export interface ISignData { /**编号 */ id: number; /**奖励 */ reward: string; } //商店物品表 export interface IShopItemData { /**编号 */ id: number; /**武器ID */ weapon_id: number; /**碎片ID */ frag: number; /**名称 */ name: string; /**数量 */ quantity: number; /**类型 */ type: number; /**价格 */ price: number; /**权重 */ weight: number; } export enum MsgType { /**普通文字 */ text = 1, /**心理思考 */ os = 2, /**红包 */ redBag = 3, /**领取红包 */ redBag2 = 4, /**图片 */ img = 5, /**选项 */ opt = 6, /**选项回复 */ opt2 = 7, } /** * 剧情逻辑帧步骤类型 */ export enum StoryStepType { /**主动画播完结束本步骤 */ mainSpine = 1, /**主音频播完结束本步骤 */ mainAudio = 2, /**指定时间结束本步骤 */ time = 3, /**点击按钮结束本步骤 */ btn = 4, /**滑动组件结束本步骤 */ slide = 5, /**拖拽类型 */ drag = 6, /**自定义互动游戏类型 */ game = 9, } /**技能常量配置类型 */ export enum SkillCostType { /**非主动刷新——障碍物/技能权重 */ skillCostType_1001 = 1001, /**非主动刷新——刷新品质权重 */ skillCostType_1002 = 1002, /**非主动刷新——2个紫色技能保底阈值 */ skillCostType_1003 = 1003, /**非主动刷新——紫色权重最小值 */ skillCostType_1004 = 1004, /**非主动刷新——紫色脸黑控制,X次开始加权,每次加权值y,保底值z */ skillCostType_1005 = 1005, /**非主动刷新,每日首次登录增加权重,紫色增加,橙色增加 */ skillCostType_1006 = 1006, /**非主动刷新——橙色权重最小值 */ skillCostType_1007 = 1007, /**非主动刷新——橙色脸黑控制,X次开始加权,每次加权值y,保底值z */ skillCostType_1008 = 1008, /**非主动刷新——连续失败增加权重 紫色,橙色 */ skillCostType_1009 = 1009, /**非主动刷新——最小紫色出现间隔,橙色出现间隔 */ skillCostType_1010 = 1010, /**非主动刷新——前2关品质额外加权 */ skillCostType_1011 = 1011, /**非主动刷新——技能组对应时间 */ skillCostType_1021 = 1021, /**武器下限检测 宝箱数量,技能数量|宝箱数量,技能数量 */ skillCostType_1031 = 1031, /**武器上限检测 同武器技能数最多多少 */ skillCostType_1032 = 1032, /**主动刷新——前X次必出紫 */ skillCostType_1100 = 1100, /**主动刷新——障碍物/技能权重 */ skillCostType_1101 = 1101, /**主动刷新——刷新品质权重 */ skillCostType_1102 = 1102, /**主动刷新——2个紫色技能保底阈值 */ skillCostType_1103 = 1103, /**主动刷新——紫色权重最小值 */ skillCostType_1104 = 1104, /**主动刷新——紫色脸黑控制,X次开始加权,每次加权值y,保底值z */ skillCostType_1105 = 1105, /**主动刷新,每日首次登录增加权重,紫色增加,橙色增加 */ skillCostType_1106 = 1106, /**主动刷新——橙色权重最小值 */ skillCostType_1107 = 1107, /**主动刷新——橙色脸黑控制,X次开始加权,每次加权值y,保底值z */ skillCostType_1108 = 1108, /**主动刷新——连续失败增加权重 紫色,橙色 */ skillCostType_1109 = 1109, /**主动刷新——最小紫色出现间隔,橙色出现间隔 */ skillCostType_1110 = 1110, /**主动刷新——前2关品质额外加权 */ skillCostType_1111 = 1111, /**主动刷新——技能组对应时间 */ skillCostType_1121 = 1121, /**危险系数修正 0.5-2 */ skillCostType_1201 = 1201, /**DPS修正系数(开方) */ skillCostType_1202 = 1202, /**攻击单位少于X个不计算 */ skillCostType_1203 = 1203, /**DPS计算时间(每15秒) */ skillCostType_1204 = 1204, /**技能分T级范围 */ skillCostType_1205 = 1205, /**开启宝箱消耗银币数组 */ skillCostType_1206 = 1206, /**锤子银币消耗 */ skillCostType_1207 = 1207, /**波次结算银币 */ skillCostType_1208 = 1208, /*** 波次预警提前时间20s(第1关)*/ skillCostType_1209 = 1209, /*** 波次预警提前时间15s(大于1关)*/ skillCostType_1210 = 1210, /*** 抖音怪物血量系数*/ skillCostType_1211 = 1211, /*** 微信怪物血量系数*/ skillCostType_1212 = 1212, /*** boss波次结算银币*/ skillCostType_1213 = 1213, /**波次预警提前时间(鸭鸭副本)*/ skillCostType_1214 = 1214, /**前4关,重复挑战怪物血量系数 */ skillCostType_1215 = 1215, } //role // { // "id": 1, // "stage": 1, // "initial_att": 10, // "initial_crt": 0, // "initial_cd": 0, // "coefficient_att": 1, // "coefficient_crt": 20, // "coefficient_cd": 50, // "initial_coin1": 200, // "initial_coin2": 200, // "initial_coin3": 200, // "coefficient_coin1": 75, // "coefficient_coin2": 30, // "coefficient_coin3": 30 // }, //玩家等级表 export interface IRoleLevelData { /**编号 */ id: number; /**等级 */ stage: number; /**经验值 */ initial_att: number; initial_crt: number; initial_cd: number; coefficient_att: number; coefficient_crt: number; coefficient_cd: number; /**初始金币1 */ initial_coin1: number; /**初始金币2 */ initial_coin2: number; /**初始金币3 */ initial_coin3: number; /**金币1系数 */ coefficient_coin1: number; /**金币2系数 */ coefficient_coin2: number; /**金币3系数 */ coefficient_coin3: number; } //角色升级奖励 export interface IRoleLevelUpData { /**编号 */ id: number; /**等级 */ level: number; /**类型 */ type: number; /**等级 */ rank: string; /**道具ID */ prop_id: number; /**数量 */ num: number; } export interface ICdkData { /**编号 */ id: number; /**CDK */ CDK: string; /**奖励 */ reward: string; } export interface ITaskData { /**编号 */ id: number; /**描述 */ desc: string; /**类型 */ type: number; /**频率 */ freq: number; /**参数 */ parameter: string; /**奖励 */ reward: number; /**位置 */ location: number; } export interface ITaskRewardData { /**编号 */ id: number; /**类型 */ type: number; /**奖励 */ points: number; /**名称 */ name: string; /**道具ID */ Item_id: number; /**数量 */ quantity: number; } /**技能乘区类型 */ export enum SkillMultiplyType { /**暴击率 */ CritRate = 1, /**暴击伤害 */ CritDamage = 2, /**伤害 */ Damage = 3, /**CD */ CD = 4, /**范围 */ Range = 5, /**数量 */ Number = 6, /**连发 */ Fire = 7, /**穿透 */ Penetration = 8, /**伤害倍数1 */ DamageMultiple1 = 9, /**伤害倍数2 */ DamageMultiple2 = 10, /**伤害倍数3 */ DamageMultiple3 = 11, }