You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
610 lines
17 KiB
610 lines
17 KiB
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<string, Map<string, any>> = new Map<string, Map<string, any>>();
|
|
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<string, any> = new Map<string, any>();
|
|
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<string, any>) {
|
|
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<T>(tableName: TableNames) {
|
|
return Array.from(this._tableMap.get(tableName).values()) as T[];
|
|
}
|
|
|
|
/**获取表数据(根据id获取一条数据) -通用*/
|
|
getTableData<T>(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<ITableItemPool>(TableNames.itemPool);
|
|
// return list.find(x => x.shopType == shopType && x.poolType == poolType);
|
|
// }
|
|
// /**根据商店类型,池子类型和参数获取道具池数据 */
|
|
// getItemPoolDataByTypeAndPar(shopType: number, poolType: number, par: number): ITableItemPool {
|
|
// let list = this.getTableList<ITableItemPool>(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<ITableItemPool>(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,
|
|
}
|
|
|
|
|
|
|