feat(共鸣系统): 新增

This commit is contained in:
zhangxk
2023-10-09 15:11:54 +08:00
parent cd87b9e74c
commit 53a0b0f340
18 changed files with 1195 additions and 14 deletions

View File

@@ -43,6 +43,7 @@ export enum HERO_SYSTEM_TYPE {
AUTHOR_BOOK_STAR = 40, // 诸子列传升星
AUTHOR_BOOK_SUB_RESET = 41, // 诸子列传重置
REBORN_CAL = 42, //重生计算
RESONANCE_CAL = 43, //共鸣重新计算战力
};
// 武将上限

View File

@@ -695,6 +695,7 @@ export const FILENAME = {
DIC_ROUGE_TECH_LEVEL: "dic_rougeTechLevel",
DIC_GUILD_HP_RATIO: "dic_army_hpRatio",
DIC_SPIRIT_COMPOSE: "dic_zyz_spiritCompose",
DIC_RESONANCE: "dic_zyz_resonance",
}
export const WAR_RELATE_TABLES = [
@@ -1286,6 +1287,7 @@ export enum ITEM_CHANGE_REASON {
NOVEMBER_REWARD = 207, // 辜月集会奖励
NOVEMBER_COST = 208, // 辜月集会购买消耗
EXCHANGE_SPIRIT = 209, // 将灵合成
RESONANCE_LOCK_POSITION = 210, // 共鸣解锁阵位消耗
}
export enum TA_EVENT {
@@ -1431,4 +1433,34 @@ export enum BOSS_HP_RATIO_TYPE {
BOSS_RATIO = 1, // 演武台按开服天数
CITY_RATIO = 2, // 诸侯混战按开服天数
CITY_PLAYER_RATIO = 3, // 最低玩家人数
}
export enum RESONANCE_SORT_TYPE {
LV = 1, //先等级后后战力
JOBSTAGE = 2, //职阶
CONNECT = 3, //羁绊
EQUIP_LV = 4, //装备强化
EQUIP_QUALITY = 5, //装备升品
EQUIP_STAR = 6, //装备精炼
JEWEL = 7, //天晶
STONE = 8, //地玉
}
export enum FRIENDSHIP_INDEX {
ONE = 1, // 羁绊1
TWO = 2, // 羁绊2
THREE = 3, // 羁绊3
}
export enum EQUIP_EPLACEID {
WEAPON_ID = 1, // 武器id
CLOTHES_ID = 2, // 衣甲
HAT_ID = 3, // 帽子
SHOE_ID = 4, // 鞋子
}
export enum EQUIP_STONE {
ONE = 1, // 1
TWO = 2, // 2
THREE = 3, // 3
}

View File

@@ -789,7 +789,7 @@ export const STATUS = {
ORDER_STATUS_ERROR: { code: 70018, simStr: '订单状态错误' },
PAY_NOT_OPEN: { code: 70019, simStr: '支付功能暂未开启' },
// 稷下学宫 相关状态 80000 - 89999
// 稷下学宫 相关状态 80000 - 81000
SHOP_NO_BUY: { code: 80001, simStr: '商店不可购买' },
COIN_NOT_ENOUGH: { code: 80002, simStr: '试炼币不足' },
REWARD_NO_CHOOSE: { code: 80003, simStr: '奖励不可选择' },
@@ -827,6 +827,28 @@ export const STATUS = {
ROUGE_SCORE_HAS_RECEIVED: { code: 80107, simStr: '已领取' },
ROUGE_COLLECT_NOT_ENOUGH: { code: 80108, simStr: '该图鉴条件未达成' },
ROUGE_TECH_NOT_UNLOCKED: { code: 80109, simStr: '对应科技点未解锁' },
// 共鸣系统 相关状态 81000 - 81100
RESONANCE_NO_START: { code: 81000, simStr: '共鸣系统未开启' },
RESONANCE_POSITION_LOCK: { code: 81001, simStr: '该阵位已开启' },
RESONANCE_POSITION_NOT_FOUND: { code: 81002, simStr: '该阵位不存在' },
RESONANCE_POSITION_LV_NOT_ENOUGH: { code: 81003, simStr: '解锁该阵位等级不足' },
RESONANCE_POSITION_LOCK_FAIL: { code: 81004, simStr: '解锁该阵位失败' },
RESONANCE_POSITION_UNLOCK: { code: 81005, simStr: '该阵位未解锁' },
RESONANCE_POSITION_EXIST_HID: { code: 81006, simStr: '该阵位已有武将' },
RESONANCE_PUT_POSITION_EXIST_LV: { code: 81007, simStr: '武将存在等级养成维度,请先重生' },
RESONANCE_PUT_POSITION_EXIST_JOBSTAGE: { code: 81008, simStr: '武将存在职阶养成维度,请先重生' },
RESONANCE_PUT_POSITION_EXIST_TALENT: { code: 81009, simStr: '武将存在天赋养成维度,请先重生' },
RESONANCE_PUT_POSITION_EXIST_CONNECT: { code: 81009, simStr: '武将存在羁绊养成维度,请先重生' },
RESONANCE_PUT_POSITION_EXIST_EQUIP: { code: 81010, simStr: '武将存在装备养成维度,请先重生' },
RESONANCE_PUT_POSITION_FAIL: { code: 81011, simStr: '武将上阵失败' },
RESONANCE_PUT_NOT_POSITION: { code: 81011, simStr: '武将数量不足,不可上阵' },
RESONANCE_NOT_PUT_POSITION: { code: 81011, simStr: '该武将未在阵中' },
RESONANCE_OFF_POSITION_FAIL: { code: 81011, simStr: '该武将下阵失败' },
}
export const PAY_37_CALLBACK_CODE = {

View File

@@ -362,6 +362,20 @@ export default class Hero extends BaseModel {
const result = await HeroModel.count(searchObj);
return result;
}
public static async bulkWriteUpdate(updateArr: HeroUpdate[]) {
if (updateArr.length == 0) return;
await HeroModel.bulkWrite(updateArr.map((param) => {
const { roleId, hid } = param;
return { updateOne: { filter: { roleId, hid }, update: { $set: param }, upsert: true } }
}))
}
public static async getHidCountByRoleId(roleId:string){
let result: number = await HeroModel.countDocuments({roleId});
return result;
}
}
export const HeroModel = getModelForClass(Hero);

122
shared/db/Resonance.ts Normal file
View File

@@ -0,0 +1,122 @@
import BaseModel from './BaseModel';
import { getModelForClass, prop, DocumentType, index } from '@typegoose/typegoose';
import { HeroSkin } from './Hero';
export class ResonanceEplaceStone {
@prop({ required: true })
id: number; // 孔的id
@prop({ required: true })
stone: number; // 装备的宝石id未装备为0
}
export class ResonanceEplace {
@prop({ required: true })
id: number; // 装备栏idid固定部位
@prop({ required: true })
equipId: number; // 装备表id
@prop({ required: true })
lv: number; // 强化等级
@prop({ required: true })
quality: number; // 品质
@prop({ required: true })
qualityStage: number; // 升品之前的小点
@prop({ required: true })
star: number; // 星级
@prop({ required: true })
starStage: number; // 升星级之前的小点
@prop({ required: true, type: ResonanceEplaceStone, _id: false })
stones: ResonanceEplaceStone[]; // 地玉石初始的时候就有3个槽是否解锁靠star判断
@prop({ required: true })
jewel: number; // 天晶石的seqId具体状态去jewel表查
}
export class ResonanceConnection {
@prop({ required: true })
shipId: number; // 羁绊编号
@prop({ required: true })
level: number;
@prop({ required: true })
exp: number;
}
export class ResonanceTalent {
@prop({ required: true })
id: number; // 天赋表id
@prop({ required: true })
level: number; // 天赋等级
}
@index({ roleId: 1, position: 1, hid: 1 })
export default class Resonance extends BaseModel {
@prop({ required: true })
roleId: string;
@prop({ required: true })
position: number; // 上阵位置,前6(6是鸣主配在系统参数表)不存通过计算获得已解锁未上阵仅有positon
@prop({ required: true })
hid: number; // 武将id
@prop({ required: true })
seqId: number; // 武将表自增id
@prop({ required: true })
lv: number; //武将等级
@prop({ required: true })
exp: number; //
@prop({ required: true })
jobStage: number; // 职阶
// @prop({ required: true, type: ResonanceTalent, _id: false })
// talent: ResonanceTalent[] // 天赋
// @prop({ required: true })
// usedTalentPoint: number; // 已使用的天赋点数
@prop({ required: true })
skinId: number; // 当前皮肤idfashions表的heroId字段
@prop({ required: true, type: HeroSkin, default: [], _id: false })
skins: HeroSkin[]; // 皮肤
@prop({ required: true, type: ResonanceConnection, _id: false })
connections: ResonanceConnection[] // 羁绊
@prop({ required: true, type: ResonanceEplace, _id: false })
ePlace: ResonanceEplace[] // 所有装备栏
@prop({ required: true })
ce: number // 战力
public static async findByRoleId(roleId: string, lean = true) {
let result: ResonanceType[] = await ResonanceModel.find({ roleId }).lean(lean);
return result;
}
public static async findByPosition(roleId: string, position: number, lean = true) {
let result: ResonanceType = await ResonanceModel.findOne({ roleId, position }).lean(lean);
return result
}
public static async findByPositionAndHid(roleId: string, position: number, hid: number, lean = true) {
let result: ResonanceType = await ResonanceModel.findOne({ roleId, position, hid }).lean(lean);
return result
}
public static async updateByPosition(roleId: string, position: number, param: ResonancePara, lean = true) {
let result: ResonanceType = await ResonanceModel.findOneAndUpdate({ roleId, position }, { $set: param }, { new: true, upsert: true }).lean(lean);
return result;
}
public static async deletePosition(roleId: string, position: number) {
let result = await ResonanceModel.deleteMany({ roleId, position });
return result;
}
}
export const ResonanceModel = getModelForClass(Resonance);
export interface ResonanceType extends Pick<DocumentType<Resonance>, keyof Resonance> { };
export type ResonancePara = Partial<ResonanceType>; // 将所有字段变成可选项

View File

@@ -0,0 +1,114 @@
import BaseModel from './BaseModel';
import { getModelForClass, prop, DocumentType, index } from '@typegoose/typegoose';
import { HeroSkin } from './Hero';
export class ResonanceHistoryEplaceStone {
@prop({ required: true })
id: number; // 孔的id
@prop({ required: true })
stone: number; // 装备的宝石id未装备为0
}
export class ResonanceHistoryEplace {
@prop({ required: true })
id: number; // 装备栏idid固定部位
@prop({ required: true })
equipId: number; // 装备表id
@prop({ required: true })
lv: number; // 强化等级
@prop({ required: true })
quality: number; // 品质
@prop({ required: true })
qualityStage: number; // 升品之前需要的次数
@prop({ required: true })
star: number; // 星级
@prop({ required: true })
starStage: number; // 升星级之前的小点
@prop({ required: true, type: ResonanceHistoryEplaceStone, _id: false })
stones: ResonanceHistoryEplaceStone[]; // 地玉石初始的时候就有3个槽是否解锁靠star判断
@prop({ required: true })
jewel: number; // 天晶石的seqId具体状态去jewel表查
}
export class ResonanceHistoryConnection {
@prop({ required: true })
shipId: number; // 羁绊编号
@prop({ required: true })
level: number;
@prop({ required: true })
exp: number;
}
@index({ roleId: 1, position: 1, hid: 1, time: 1 })
export default class ResonanceHistory extends BaseModel {
@prop({ required: true })
roleId: string;
@prop({ required: true })
position: number; // 上阵位置,前6(6是鸣主配在系统参数表)不存通过计算获得已解锁未上阵仅有positon
@prop({ required: true })
hid: number; // 武将id
@prop({ required: true })
seqId: number; // 武将表自增id
@prop({ required: true })
lv: number; //武将等级
@prop({ required: true })
exp: number; //
@prop({ required: true })
jobStage: number; // 职阶
@prop({ required: true })
skinId: number; // 当前皮肤idfashions表的heroId字段
@prop({ required: true, type: HeroSkin, default: [], _id: false })
skins: HeroSkin[]; // 皮肤
@prop({ required: true, type: ResonanceHistoryConnection, _id: false })
connections: ResonanceHistoryConnection[] // 羁绊
@prop({ required: true, type: ResonanceHistoryEplace, _id: false })
ePlace: ResonanceHistoryEplace[] // 所有装备栏
@prop({ required: true })
ce: number // 战力
@prop({ required: true, default: () => new Date() })
time: Date;
// public static async findByRoleId(roleId: string, lean = true) {
// let result: ResonanceHistoryType[] = await ResonanceHistoryModel.find({ roleId }).select({ '_id': -1 }).lean(lean);
// return result;
// }
// public static async findByPosition(roleId: string, position: number, lean = true) {
// let result: ResonanceHistoryType = await ResonanceHistoryModel.findOne({ roleId, position }).select({ '_id': -1 }).lean(lean);
// return result
// }
// public static async findByPositionAndHid(roleId: string, position: number, hid: number, lean = true) {
// let result: ResonanceHistoryType = await ResonanceHistoryModel.findOne({ roleId, position, hid }).select({ '_id': -1 }).lean(lean);
// return result
// }
public static async updateByPosition(roleId: string, position: number, param: ResonanceHistoryPara, lean = true) {
delete param._id;
let result: ResonanceHistoryType = await ResonanceHistoryModel.findOneAndUpdate({ roleId, position }, { $set: param }, { new: true, upsert: true }).lean(lean);
return result;
}
// public static async deletePosition(roleId: string, position: number) {
// let result = await ResonanceHistoryModel.deleteMany({ roleId, position });
// return result;
// }
}
export const ResonanceHistoryModel = getModelForClass(ResonanceHistory);
export interface ResonanceHistoryType extends Pick<DocumentType<ResonanceHistory>, keyof ResonanceHistory> { };
export type ResonanceHistoryPara = Partial<ResonanceHistoryType>; // 将所有字段变成可选项

View File

@@ -0,0 +1,35 @@
// import { ResonanceConnection, ResonanceEplace, ResonancePara, ResonanceTalent } from "../../db/Resonance";
// import { gameData } from "../../pubUtils/data";
// export class ReturnResonanceParam {
// positon: number; // 上阵位置,从1开始(6为鸣主配系统参数表)已解锁未上阵仅有positon
// hid: number; // 武将id
// seqId: number; // 武将表自增 id
// lv: number; //武将等级
// jobStage: number; // 职阶
// skinId: number
// talent: ResonanceTalent[]; // 天赋
// usedTalentPoint: number;
// totalTalentPoint: number;
// connections: ResonanceConnection[]; // 羁绊
// ePlace: ResonanceEplace[];
// ce: number; //战力
// constructor(hero: ResonancePara, job: number) {
// this.positon = hero.positon;
// this.hid = hero.hid;
// this.seqId = hero.seqId;
// this.lv = hero.lv;
// this.ePlace = hero.ePlace;
// this.jobStage = hero.jobStage;
// this.totalTalentPoint = gameData.talentPointOfJob.get(job) || 0;
// this.connections = hero.connections;
// this.talent = hero.talent || [];
// this.usedTalentPoint = hero.usedTalentPoint || 0;
// this.ce = hero.ce;
// }
// }

View File

@@ -15,7 +15,7 @@ import { dicWar, dicWarPvp, dicDailyWarByType, loadWar, dicHeroIdByWar, dicComBa
import { dicWarJson, loadWarJson } from "./dictionary/DicWarJson";
import { AUCTION_TIME, BOSS_HP_RATIO_TYPE } from "../consts";
import { dicFashions, dicFashionsByHeroId, loadFashions } from "./dictionary/DicFashions";
import { friendShips, friendShipsByLv, friendShipsMax, loadFriendShip } from "./dictionary/DicFriendShip";
import { friendShipByIndex, friendShips, friendShipsByLv, friendShipsMax, loadFriendShip } from "./dictionary/DicFriendShip";
import { dicHeroQualityUp, loadHeroQualityUp } from "./dictionary/DicHeroQualityUp";
import { dicHeroStar, loadHeroStar } from "./dictionary/DicHeroStar";
import { dicHeroWake, loadHeroWake } from "./dictionary/DicHeroWake";
@@ -174,6 +174,7 @@ import { dicRougeCharaCardPlan, loadRougeCharaCardPlan } from "./dictionary/DicR
import { dicRougeHolyCardPlan, loadRougeHolyCardPlan } from "./dictionary/DicRougeHolyCardPlan";
import { dicBossHpRatio, loadBossHpRatio } from "./dictionary/DicBossHpRatio";
import { dicSpiritCompose, loadSpiritCompose } from "./dictionary/DicSpiritCompose";
import { dicResonance, loadResonance } from "./dictionary/DicResonance";
export const gameData = {
daily: dicDaily,
@@ -207,6 +208,7 @@ export const gameData = {
friendShips: friendShips,
friendShipsByLv: friendShipsByLv,
friendShipsMax: friendShipsMax,
friendShipByIndex: friendShipByIndex,
randomEffectPool: dicRandomEffectPool,
randomEffectPoolByGroupAndLv: dicRandomEffectPoolByGroupAndLv,
title: dicTitle,
@@ -436,6 +438,8 @@ export const gameData = {
bossHpRatio: dicBossHpRatio,
spiritCompose: dicSpiritCompose,
spiritByQuality: dicSpiritByQuality,
resonance: dicResonance,
};
// 在此提供一些原先在gamedata中提供的方法以便更方便获取gameData数据
@@ -1384,9 +1388,9 @@ export function getRougeEffectTypeKind(effectTypes: number[]) {
}
export function getBossHpRatio(type: BOSS_HP_RATIO_TYPE, day: number) {
let arr = gameData.bossHpRatio.get(type)||[];
let arr = gameData.bossHpRatio.get(type) || [];
let bossHpRatio = 1;
for(let { serverOpen, ratio } of arr) {
for (let { serverOpen, ratio } of arr) {
bossHpRatio = ratio;
if (serverOpen != -1 && serverOpen >= day) break;
}
@@ -1807,9 +1811,10 @@ function loadDatas(type?: string) {
if (type == undefined || type == 'loadRougeTechLevel') loadRougeTechLevel();
if (type == undefined || type == 'loadBossHpRatio') loadBossHpRatio();
if (type == undefined || type == 'loadSpiritCompose') loadSpiritCompose();
if (type == undefined || type == 'loadResonance') loadResonance();
console.log('loadDatas type: ', type || 'all');
}
// 后台调用重载资源

View File

@@ -478,3 +478,10 @@ export const ROUGELIKE = {
SELECT_HOLLYCARD_WEIGHT: 30, // 选择的圣物卡后该特性卡权重减少比例(%
RANDOM_HOLLYCARD_WEIGHT: 10, // 随机出的圣物卡后该特性卡权重减少比例(%
};
export const RESONANCE = {
START_MAIN_WARId: 301, //共鸣系统开启
HOSTER: 6, //鸣主
JEWEL: 1,// 共灵阵是否包括共灵天晶镶嵌(1:包括 0不包括)
STONE: 1, // 共灵阵是否包括共灵地玉镶嵌(1:包括 0不包括)
}

View File

@@ -16,16 +16,21 @@ export interface DicFriendShip {
// 羁绊武将ID
readonly hids: Array<number>;
// 属性加成
readonly attributes: Array<{id: number, number: number}>
readonly attributes: Array<{ id: number, number: number }>
// 升到这一级所需的羁绊值
readonly shipExp: number;
readonly index: number;
}
export const friendShips = new Map<string, { level: number, shipExp: number }[]>();
export const friendShipsByLv = new Map<string, DicFriendShip>();
export const friendShipsMax = new Map<string, number>();
export const friendShipByIndex = new Map<string, number>();
export function loadFriendShip() {
friendShips.clear();
friendShipByIndex.clear();
let arr = readFileAndParse(FILENAME.DIC_FRIEND_SHIP);
arr.forEach(o => {
@@ -33,32 +38,35 @@ export function loadFriendShip() {
o.hids = parseNumberList(o.memberId);
let key1 = `${o.actorId}_${o.shipId}`;
let shipSumValue = 0;
if(!friendShips.has(key1)) {
if (!friendShips.has(key1)) {
friendShips.set(key1, []);
shipSumValue = 0;
}
shipSumValue += o.shipExp;
friendShips.get(key1).push({ level: o.level, shipExp: shipSumValue });
if(!friendShipsMax.has(key1) || friendShipsMax.get(key1) < o.level) {
if (!friendShipsMax.has(key1) || friendShipsMax.get(key1) < o.level) {
friendShipsMax.set(key1, o.level);
}
let key2 = `${o.actorId}_${o.shipId}_${o.level}`;
friendShipsByLv.set(key2, o);
let newKey = `${o.actorId}_${o.index}`;
if (!friendShipByIndex.has(newKey)) friendShipByIndex.set(newKey, o.shipId);
});
arr = undefined;
}
function parseAttribute(str: string) {
let result = new Array<{id: number, number: number}>();
if(!str) return result;
let result = new Array<{ id: number, number: number }>();
if (!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [id, number] of decodeArr) {
if(isNaN(parseInt(id)) || isNaN(parseInt(number))) {
for (let [id, number] of decodeArr) {
if (isNaN(parseInt(id)) || isNaN(parseInt(number))) {
throw new Error('data table format wrong');
}
result.push({id: parseInt(id), number: parseInt(number)});
}
result.push({ id: parseInt(id), number: parseInt(number) });
}
return result
}

View File

@@ -0,0 +1,26 @@
import { parseGoodStr, readFileAndParse } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicResonance {
readonly id: number;
readonly name: string;
readonly openLimit: number;
readonly openConsume: RewardInter[];
}
export const dicResonance = new Map<number, DicResonance>();
export function loadResonance() {
dicResonance.clear();
let arr = readFileAndParse(FILENAME.DIC_RESONANCE);
arr.forEach(o => {
o.openConsume = parseGoodStr(o.openConsume);
dicResonance.set(o.id, o);
});
arr = undefined;
}

View File

@@ -1,5 +1,6 @@
// 一些通用的interface定义
import { ResonanceConnection, ResonanceEplace, ResonanceTalent } from "../db/Resonance";
import { RougelikeCardPara } from "../db/RougelikeCard";
import { RougelikeCharaPara } from "../db/RougelikeChara";
import { RougelikeCollectionType } from "../db/RougelikeCollection";
@@ -206,4 +207,19 @@ export interface CommonReward {
export interface SlotCard {
index: number; //卡槽标记
cardCode: string; //安装的特性卡唯一code
}
export interface ReturnResonanceParam {
positon: number; // 上阵位置,从1开始(6为鸣主配系统参数表)已解锁未上阵仅有positon
hid?: number; // 武将id
seqId?: number; // 武将表自增 id
lv?: number; //武将等级
exp?: number;
jobStage?: number; // 职阶
talent?: ResonanceTalent[]; // 天赋
usedTalentPoint?: number;
totalTalentPoint?: number;
connections?: ResonanceConnection[]; // 羁绊
ePlace?: ResonanceEplace[];
ce?: number; //战力
}

View File

@@ -0,0 +1,122 @@
[
{
"id": 1,
"name": "共鸣阵1",
"openLimit": 60,
"openConsume": "31002&50"
},
{
"id": 2,
"name": "共鸣阵2",
"openLimit": 61,
"openConsume": "31002&50"
},
{
"id": 3,
"name": "共鸣阵3",
"openLimit": 62,
"openConsume": "31002&50"
},
{
"id": 4,
"name": "共鸣阵4",
"openLimit": 63,
"openConsume": "31002&50"
},
{
"id": 5,
"name": "共鸣阵5",
"openLimit": 64,
"openConsume": "31002&50"
},
{
"id": 6,
"name": "共鸣阵6",
"openLimit": 65,
"openConsume": "31002&50"
},
{
"id": 7,
"name": "共鸣阵7",
"openLimit": 66,
"openConsume": "31002&50"
},
{
"id": 8,
"name": "共鸣阵8",
"openLimit": 67,
"openConsume": "31002&50"
},
{
"id": 9,
"name": "共鸣阵9",
"openLimit": 68,
"openConsume": "31002&50"
},
{
"id": 10,
"name": "共鸣阵10",
"openLimit": 69,
"openConsume": "31002&50"
},
{
"id": 11,
"name": "共鸣阵11",
"openLimit": 70,
"openConsume": "31002&50"
},
{
"id": 12,
"name": "共鸣阵12",
"openLimit": 71,
"openConsume": "31002&50"
},
{
"id": 13,
"name": "共鸣阵13",
"openLimit": 72,
"openConsume": "31002&50"
},
{
"id": 14,
"name": "共鸣阵14",
"openLimit": 73,
"openConsume": "31002&50"
},
{
"id": 15,
"name": "共鸣阵15",
"openLimit": 74,
"openConsume": "31002&50"
},
{
"id": 16,
"name": "共鸣阵16",
"openLimit": 75,
"openConsume": "31002&50"
},
{
"id": 17,
"name": "共鸣阵17",
"openLimit": 76,
"openConsume": "31002&50"
},
{
"id": 18,
"name": "共鸣阵18",
"openLimit": 77,
"openConsume": "31002&50"
},
{
"id": 19,
"name": "共鸣阵19",
"openLimit": 78,
"openConsume": "31002&50"
},
{
"id": 20,
"name": "共鸣阵20",
"openLimit": 79,
"openConsume": "31002&50"
}
]