Merge branch 'feature/equips'

This commit is contained in:
luying
2022-02-18 18:39:44 +08:00
91 changed files with 17562 additions and 53014 deletions
+1 -1
View File
@@ -131,7 +131,7 @@ export const GUILD_ROUTE_OPERATE = [
{ route: 'guild.donateHandler.donate', operate: GUILD_OPERATE.DONATE, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF },
{ route: 'guild.donateHandler.receiveBox', operate: GUILD_OPERATE.DONATE, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF },
{ route: 'guild.guildRefineHandler.getRefine', operate: GUILD_OPERATE.REFINE, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF },
{ route: 'guild.guildRefineHandler.refineEquip', operate: GUILD_OPERATE.REFINE, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF },
{ route: 'guild.guildRefineHandler.refine', operate: GUILD_OPERATE.REFINE, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF },
{ route: 'guild.guildRefineHandler.assistRefine', operate: GUILD_OPERATE.ASSIST_REFINE, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF },
{ route: 'guild.guildTrainHandler.getTrainInstance', operate: GUILD_OPERATE.TRAIN, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF },
{ route: 'guild.guildTrainHandler.getTrainReports', operate: GUILD_OPERATE.TRAIN, type: GUILD_AUTH_CHECK_TYPE.CHECK_SELF },
+8
View File
@@ -21,6 +21,14 @@ export enum HERO_SYSTEM_TYPE {
TITLE = 18, // 爵位
TERAPH = 19, // 神像强化
TERAPH_UP = 20, // 神像升级
COMPOSE_EQUIP = 21, // 合成装备
EQUIP_STRENGTH = 22, // 装备强化
EQUIP_QUALITY = 23, // 装备升品
EQUIP_STAR = 24, // 装备升星
EQUIP_JEWEL = 25, // 装备装上or卸下天晶石
EQUIP_STONE = 26, // 装备装上or卸下地玉石
JEWEL_RESET_RANDSE = 27, // 天晶石洗练
JEWEL_QUENCH = 28, // 天晶石淬炼
};
// 武将上限
+21 -24
View File
@@ -36,6 +36,7 @@ export const CONSUME_TYPE = {
GIFT_PACKAGE: 14, // 礼包
AP: 15, // 回复体力道具
DICE: 16, // 骰子
DRAWING: 17, // 图纸
};
export enum ROLE_TERAPH {
@@ -92,16 +93,17 @@ export const ITEM_TABLE = {
ITEM: 'item',
ROLE: 'role',
HERO: 'hero',
SKIN: 'skin'
SKIN: 'skin',
JEWEL: 'jewel',
}
const itid_array = [
{ id: 1, name: '神兵', table: 'equip', type: EQUIP_TYPE.WEAPON, equipJewel: JEWEL_TYPE.WEAPON },
{ id: 2, name: '宝甲', table: 'equip', type: EQUIP_TYPE.CLOTHES, equipJewel: JEWEL_TYPE.CLOTHES },
{ id: 3, name: '冠冕', table: 'equip', type: EQUIP_TYPE.SHOES, equipJewel: JEWEL_TYPE.CAP },
{ id: 4, name: '行具', table: 'equip', type: EQUIP_TYPE.CAP, equipJewel: JEWEL_TYPE.SHOES },
{ id: 5, name: '典籍', table: 'equip', type: EQUIP_TYPE.BOOK, equipJewel: JEWEL_TYPE.BOOK },
{ id: 6, name: '饰品', table: 'equip', type: EQUIP_TYPE.ACCESSORY, equipJewel: JEWEL_TYPE.ACCESSORY },
{ id: 1, name: '神兵', table: 'equip', type: EQUIP_TYPE.WEAPON, equipJewel: JEWEL_TYPE.WEAPON }, //
{ id: 2, name: '宝甲', table: 'equip', type: EQUIP_TYPE.CLOTHES, equipJewel: JEWEL_TYPE.CLOTHES }, //
{ id: 3, name: '冠冕', table: 'equip', type: EQUIP_TYPE.SHOES, equipJewel: JEWEL_TYPE.CAP }, //
{ id: 4, name: '行具', table: 'equip', type: EQUIP_TYPE.CAP, equipJewel: JEWEL_TYPE.SHOES }, //
{ id: 5, name: '典籍', table: 'equip', type: EQUIP_TYPE.BOOK, equipJewel: JEWEL_TYPE.BOOK }, //
{ id: 6, name: '饰品', table: 'equip', type: EQUIP_TYPE.ACCESSORY, equipJewel: JEWEL_TYPE.ACCESSORY }, //
{ id: 24, name: '消耗品', table: 'item', type: CONSUME_TYPE.CONSUME },
@@ -117,22 +119,22 @@ const itid_array = [
{ id: 27, name: '货币', table: 'role', isCurrency: true },
{ id: 28, name: '藏宝图', table: 'item', type: CONSUME_TYPE.BLUEPRT },
{ id: 29, name: '礼器', table: 'equip', type: EQUIP_TYPE.ACCESSORY },
{ id: 30, name: '宝甲', table: 'equip', type: EQUIP_TYPE.CLOTHES },
{ id: 31, name: '名驹', table: 'equip', type: EQUIP_TYPE.SHOES },
{ id: 32, name: '典籍', table: 'equip', type: EQUIP_TYPE.BOOK },
{ id: 33, name: '神兵', table: 'equip', type: EQUIP_TYPE.WEAPON },
{ id: 29, name: '礼器', table: 'equip', type: EQUIP_TYPE.ACCESSORY }, //
{ id: 30, name: '宝甲', table: 'equip', type: EQUIP_TYPE.CLOTHES }, //
{ id: 31, name: '名驹', table: 'equip', type: EQUIP_TYPE.SHOES }, //
{ id: 32, name: '典籍', table: 'equip', type: EQUIP_TYPE.BOOK }, //
{ id: 33, name: '神兵', table: 'equip', type: EQUIP_TYPE.WEAPON }, //
{ id: 34, name: '代币', table: 'item', type: CONSUME_TYPE.POINT },
{ id: 53, name: '武将招募券', table: 'item', type: CONSUME_TYPE.POINT },
{ id: 39, name: '时装', table: 'skin', type: CONSUME_TYPE.SKIN },
{ id: 40, name: '装备碎片', table: 'item', type: CONSUME_TYPE.PIECE },
{ id: 41, name: '图纸', table: 'item', type: CONSUME_TYPE.CONSUME },
{ id: 41, name: '图纸', table: 'item', type: CONSUME_TYPE.DRAWING },
{ id: 42, name: '神兵宝石', table: 'item', type: CONSUME_TYPE.JEWEL },
{ id: 43, name: '宝甲宝石', table: 'item', type: CONSUME_TYPE.JEWEL },
{ id: 44, name: '免冠宝石', table: 'item', type: CONSUME_TYPE.JEWEL },
{ id: 45, name: '足具宝石', table: 'item', type: CONSUME_TYPE.JEWEL },
{ id: 46, name: '礼器宝石', table: 'item', type: CONSUME_TYPE.JEWEL },
{ id: 47, name: '典籍宝石', table: 'item', type: CONSUME_TYPE.JEWEL },
{ id: 46, name: '礼器宝石', table: 'item', type: CONSUME_TYPE.JEWEL }, //
{ id: 47, name: '典籍宝石', table: 'item', type: CONSUME_TYPE.JEWEL }, //
{ id: 48, name: '灵玄石', table: 'item', type: CONSUME_TYPE.JEWEL },
{ id: 49, name: '玩家好感道具', table: 'item', type: CONSUME_TYPE.FRIEND_FAVOUR },
{ id: 50, name: '形象', table: 'role', type: CONSUME_TYPE.HEAD },
@@ -141,6 +143,10 @@ const itid_array = [
{ id: 55, name: '回复体力道具', table: 'item', type: CONSUME_TYPE.AP },
{ id: 56, name: '骰子', table: 'item', type: CONSUME_TYPE.DICE },
{ id: 58, name: '主公经验', table: 'role' },
{ id: 59, name: '武器天晶石', table: 'jewel' },
{ id: 60, name: '衣服天晶石', table: 'jewel' },
{ id: 61, name: '头饰天晶石', table: 'jewel' },
{ id: 62, name: '行具天晶石', table: 'jewel' },
];
export const ITID = new Map<number, { id: number, name: string, table: string, type?: number, isCurrency?: boolean, equipJewel?: number }>();
@@ -205,15 +211,6 @@ export enum QUALITY_TYPE {
export const GOOD_QUALITY = [QUALITY_TYPE.BLUE, QUALITY_TYPE.PURPLE, QUALITY_TYPE.ORANGE, QUALITY_TYPE.RED, QUALITY_TYPE.GOLD];
export const COM_BTL_QUALITY = [QUALITY_TYPE.BLUE, QUALITY_TYPE.PURPLE, QUALITY_TYPE.ORANGE, QUALITY_TYPE.RED];
// 各品质随机属性条数 quality => number
export const RANDOM_SE_COUNT = new Map<number, number>([
[QUALITY_TYPE.BLUE, 0],
[QUALITY_TYPE.PURPLE, 1],
[QUALITY_TYPE.ORANGE, 2],
[QUALITY_TYPE.RED, 3],
[QUALITY_TYPE.GOLD, 4]
]);
export enum HERO_QUALITY_TYPE {
BLUE = 1, // 蓝将
+1 -1
View File
@@ -49,4 +49,4 @@ export enum FRIEND_SHIP_SELECT {
GET_FRIEND_VALUE = 'friendValue friendLv'
}
export const ENTERY_ROLE_PICK = ['roleId', 'roleName', 'serverId', 'ce', 'topLineupCe', 'coin', 'lv', 'exp', 'vLv', 'gold', 'heros', 'equips', 'consumeGoods', 'title', 'teraphs', 'showLineup', 'heads', 'head', 'frames', 'frame', 'spines', 'spine', 'hasGuild', 'guildCode', 'todayZeroPoint', 'apJson', 'skins', 'totalPay', 'guide', 'hasInit', 'renameCnt', 'totalCost', 'guildName'];
export const ENTERY_ROLE_PICK = ['roleId', 'roleName', 'serverId', 'ce', 'topLineupCe', 'coin', 'lv', 'exp', 'vLv', 'gold', 'heros', 'jewels', 'consumeGoods', 'title', 'teraphs', 'showLineup', 'heads', 'head', 'frames', 'frame', 'spines', 'spine', 'hasGuild', 'guildCode', 'todayZeroPoint', 'apJson', 'skins', 'totalPay', 'guide', 'hasInit', 'renameCnt', 'totalCost', 'guildName'];
+15 -2
View File
@@ -38,6 +38,7 @@ export const COUNTER = {
GM_GROUP: { name: 'gmgroup', def: 1 },
HID: { name: 'hid', def: 10000 },
EID: { name: 'eid', def: 1 },
JEWEL_ID: { name: 'jid', def: 1 },
ROLE: { name: 'role', def: 1 },
ACTIVITY: { name: 'aid', def: 1 },
ACTIVITY_GROUP: { name: 'agid', def: 1 },
@@ -485,6 +486,15 @@ export const FILENAME = {
DIC_GUILD_WISH_REWARD: 'dic_army_wishReward',
DIC_API: 'dic_api',
DIC_SERVER_CONST: 'server_const',
DIC_EQUIP: 'dic_zyz_equip',
DIC_EQUIP_SUIT: 'dic_zyz_equipSuit',
DIC_EQUIP_STRENGTH: 'dic_zyz_equipStrength',
DIC_EQUIP_QUALITY: 'dic_zyz_equipQuality',
DIC_EQUIP_STAR: 'dic_zyz_equipStar',
DIC_EQUIP_QUALITY_EXTRA: 'dic_zyz_equipQuality_extra',
DIC_JEWEL: 'dic_zyz_jewel',
DIC_STONE: 'dic_zyz_stone',
DIC_JEWEL_CONDITION: 'dic_zyz_jewel_condition',
}
export const WAR_RELATE_TABLES = [
@@ -699,10 +709,10 @@ export const GACHA_TO_FLOOR = new Map([
export enum GACHA_CONTENT_TYPE {
HERO = 1, // 武将 param为武将品质
HERO_PIECE = 2, // 武将碎片 武将品质
BLUEPRT = 3, // 藏宝图 藏宝图品质
// BLUEPRT = 3, // 藏宝图 藏宝图品质
JEWEL = 4, // 宝石 宝石等级
TERAPH_MATERIAL = 5, // 强化神像用的材料 材料物品id
SUIT_PAPER = 6, // 套装图纸
// SUIT_PAPER = 6, // 套装图纸
}
export const GACHA_OCCUPY_HID = 9999; // 抽卡里占位的武将
@@ -925,6 +935,9 @@ export enum ITEM_CHANGE_REASON {
GET_HERO_UNLOCK_SKIN = 134, // 获得武将解锁皮肤
AP_RECOVERY = 135, // 自然恢复体力
LV_UP = 136, // 升级恢复
EQUIP_QUALITYUP = 137, // 装备升品
EQUIP_STARUP = 138, // 装备升星
COMPOSE_STONE = 139, // 合成地玉石
}
export enum TA_EVENT {
+26 -4
View File
@@ -194,6 +194,7 @@ export const STATUS = {
GUILD_PAY_CONDITION: { code: 20932, simStr: '充值金额不足' },
GUILD_USER_IS_LEADER: { code: 20933, simStr: '该成员已经是团长' },
GUILD_DONATE_LV_NOT_ENOUGH: { code: 20934, simStr: '捐献所等级不足' },
GUILD_EQUIP_PRODUCE_LV_NOT_ENOUGH: { code: 20935, simStr: '炼器堂等级不足' },
GUILD_SCRIPT_IS_OPENED_TODAY: { code: 20950, simStr: '今日已开启过演武场' },
GUILD_SCRIPT_NOT_OPENED: { code: 20951, simStr: '演武场未开启' },
@@ -208,7 +209,7 @@ export const STATUS = {
GUILD_TRAIN_LEVEL_IS_COMPLETE: { code: 20960, simStr: '试炼已经进阶' },
GUILD_BUY_TRAIN_COUNT_REACH_MAX: { code: 20961, simStr: '训练场购买挑战次数以达到上线' },
GUILD_TRAIN_IS_RESETED: { code: 20962, simStr: '军团训练场已经重置' },
GUILD_NOT_REFINE_THE_EQUIP: { code: 20963, simStr: '军团不能研发次装备' },
GUILD_CANNOT_REFINE_THIS: { code: 20963, simStr: '军团不能兑换此图纸' },
GUILD_LIGHT_UP_THE_SCIENCETREE: { code: 20964, simStr: '军团已经点亮此科技' },
GUILD_SCIENCETREE_IS_RUNNING: { code: 20965, simStr: '军团正在进行研发,不能点亮' },
GUILD_IS_ASSISTED_SCIENCETREE: { code: 20966, simStr: '玩家已经协助过该科技树' },
@@ -221,6 +222,7 @@ export const STATUS = {
GUILD_TRAIN_BOX_IS_GOT: { code: 20973, simStr: '玩家已经领取该试炼宝箱' },
GUILD_SCRIPT_ENCOURGE_NOT_ENOUGH: { code: 20974, simStr: '鼓舞次数达到上限' },
GUILD_CANNOT_INVITE: { code: 20975, simStr: '该玩家已经加入军团或该玩家不同服' },
GUILD_REFINE_CNT_MAX: { code: 20976, simStr: '兑换此图纸品质达到上限' },
GUILD_LOT_NOT_FOUND: { code: 21001, simStr: '拍品未找到' },
LOT_OFFER_SERIAL: { code: 21002, simStr: '不能连续出价' },
@@ -300,16 +302,36 @@ export const STATUS = {
EQUIP_HOLE_NOT_FIND: { code: 30504, simStr: '装备孔不存在' },
EQUIP_HOLE_IS_DUG: { code: 30505, simStr: '装备已经打过孔' },
EQUIP_HOLE_IS_NOT_DUG: { code: 30506, simStr: '装备未打过孔' },
JEWEL_IS_NOT_FIND: { code: 30507, simStr: '宝石不存在' },
JEWEL_IS_NOT_FIND: { code: 30507, simStr: '天晶石不存在' },
EQUIP_NOT_FILL_HOLE: { code: 30508, simStr: '未穿戴宝石' },
EQUIP_NOT_EQUIPED_HERO: { code: 30509, simStr: '装备不能被该武将穿戴' },
EQUIP_LEVEL_LIMIT: { code: 30510, simStr: '装备穿戴等级限制' },
EQUIP_NOT_MATCH_JEWEL: { code: 30511, simStr: '装备不能镶嵌该宝石' },
EQUIP_NOT_MATCH_JEWEL: { code: 30511, simStr: '装备不能镶嵌该天晶石' },
EQUIP_QUENCH_ERR: { code: 30512, simStr: '该装备不能再淬火或材料不足' },
EQUIP_REFINE_ERR: { code: 30513, simStr: '该装备等级不足或材料不足' },
EQUIP_RESTRENGTHEN_NOT_PREVIEW: { code: 30514, simStr: '该装备未预览洗练值' },
EQUIP_QUENCH_MAX: { code: 30515, simStr: '该装备不能再淬火' },
EQUIP_DECOMPOSE_IS_UPLIMIT: { code: 30516, simStr: '装备分解数量已达上限' },
EQUIP_DECOMPOSE_IS_UPLIMIT: { code: 30516, simStr: '分解数量已达上限' },
EQUIP_HAS_COMPOSE: { code: 30517, simStr: '该装备已合成' },
EQUIP_QUALITY_MAX: { code: 30518, simStr: '该装备已升品到最高' },
EQUIP_STAR_MAX: { code: 30519, simStr: '该装备已升星到最高' },
EQUIP_QUALITY_NOT_ENOUGH: { code: 30520, simStr: '该装备品质不足' },
EQUIP_QUALITYSTAGE_IS_MAX: { code: 30521, simStr: '该装备已到该品质下最高,请升品' },
EQUIP_STARSTAGE_IS_MAX: { code: 30522, simStr: '该装备已到该星级下最高,请升星' },
JEWEL_HAS_SUIT: { code: 30523, simStr: '该装备已镶嵌该天晶石了' },
JEWEL_NOT_SUIT: { code: 30524, simStr: '该装备未镶嵌天晶石' },
STONE_HAS_SUIT: { code: 30525, simStr: '该装备该槽已镶嵌相同的地玉石了' },
STONE_NOT_SUIT: { code: 30526, simStr: '该装备该槽未镶嵌地玉石' },
STONE_CANNOT_SUIT: { code: 30527, simStr: '该装备不可装备该地玉石' },
JEWEL_NOT_FOUND: { code: 30528, simStr: '未找到该天晶石' },
JEWEL_HAVE_NO_RANDSE: { code: 30529, simStr: '天晶石上无随机属性' },
JEWEL_DUPLICATE_LOCK: { code: 30530, simStr: '随机属性不可重复锁定' },
JEWEL_NOT_PREVIEW: { code: 30531, simStr: '该天晶石未预览洗练值' },
JEWEL_HAS_CHOOSEN_QUENCH: { code: 30532, simStr: '每个天晶石只能选择一个词条淬炼' },
JEWEL_NOT_CHOOSEN_QUENCH: { code: 30533, simStr: '请选择一个淬炼词条' },
JEWEL_HAVE_NO_CUR_RANDSE: { code: 30534, simStr: '该天晶石上未找到该属性' },
JEWEL_IS_EQUIPED: { code: 30535, simStr: '该天晶石被装备中无法分解' },
//全局养成30600-30699
ROLE_REACH_MAX_TITLE_LEVEL: { code: 30600, simStr: '玩家已达到最高的爵位' },
ROLE_TERAPH_NOT_STRENGTHEN: { code: 30601, simStr: '材料不足或玩家神像不能强化' },
+5 -12
View File
@@ -143,9 +143,9 @@ export default class ComBattleTeam extends BaseModel {
@prop({ required: true })
blueprtId: number;
// 藏宝图品质
// 藏宝图品阶,用来匹配
@prop({ required: true })
quality: number;
lv: number;
// 战斗状态 0:未开始,1:已开始,2:胜利,3:失败
@prop({ required: true, default: 0 })
@@ -166,10 +166,6 @@ export default class ComBattleTeam extends BaseModel {
@prop({ required: true, default: 1 })
roleCnt: number;
// 藏宝图等级所处范围,用来匹配
@prop({ required: true, default: 1 })
lvRange: number;
// 单个 boss 血量状态
@prop({ required: false, type: BossHp, default: [] })
bossHpArr: BossHp[];
@@ -293,9 +289,9 @@ export default class ComBattleTeam extends BaseModel {
return team;
}
public static async getOtherTeamByQualityAndSt(roleId: string, qualityArr: number[], status: number, lvRange: number, ce = 0, pub = true, cntLmt = 2, lean = true) {
public static async getOtherTeamByLvAndSt(roleId: string, lv: number, status: number, ce = 0, pub = true, cntLmt = 2, lean = true) {
const curTime = new Date(Date.now() - 10 * 60 * 1000); // 10分钟之前
const team: ComBattleTeamType[] = await ComBattleTeamModel.find({quality: {$in: qualityArr}, status, lvRange, ceLimit: {$lte: ce}, pub, roleCnt: {$lte: cntLmt}, roleIds: {$nin: [roleId]}, updatedAt: {$gte: curTime}}).lean(lean);
const team: ComBattleTeamType[] = await ComBattleTeamModel.find({ lv, status, ceLimit: {$lte: ce}, pub, roleCnt: {$lte: cntLmt}, roleIds: {$nin: [roleId]}, updatedAt: {$gte: curTime}}).lean(lean);
return team;
}
@@ -314,11 +310,8 @@ export default class ComBattleTeam extends BaseModel {
return teams;
}
public static async getAssistTeamsByTime(roleId: string, qualityArr?: number[], time?: Date, isAssist?: boolean, lean = true) {
public static async getAssistTeamsByTime(roleId: string, time?: Date, isAssist?: boolean, lean = true) {
let query = {roleIds: roleId, status: {$in: [0, 1, 2]}}; // 失败不计入助战
if (qualityArr) {
query = Object.assign(query, {quality: {$in: qualityArr}});
}
if (time) {
query = Object.assign(query, {createdAt: {$gte: time}});
}
-234
View File
@@ -1,234 +0,0 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
import { COUNTER } from '../consts';
import { CounterModel } from './Counter';
import { HeroModel } from './Hero';
import { RoleModel } from './Role';
import { SearchEquipParam } from '../domain/backEndField/search';
export class RandSe {
@prop({ required: true })
id: number; // 随机属性位置id
@prop({ required: true })
seid: number; // 随机属性池id
@prop({ required: true })
rand: number; // 随机属性内需要随机的值
@prop({ required: true })
locked: boolean; // 洗炼是否锁定
}
export class Holes {
@prop({ required: true })
id: number; // 孔的id
@prop({ required: true })
isOpen: boolean; // 是否开孔
@prop({ required: true })
jewel: number; // 装备的宝石id
}
export class RandMain {
@prop({ required: true })
id: number; // 随机属性位置id
@prop({ required: true })
rand: number; // 随机属性内需要随机的值,扩大100倍
}
@index({ roleId: 1, hid: 1, id: 1 })
@index({ seqId: 1 })
@modelOptions({ schemaOptions: { id: false } })
export default class Equip extends BaseModel {
@prop({ required: true })
roleId: string; // 角色 id
@prop({ required: true })
roleName: string; // 角色名称
@prop({ required: true })
seqId: number; // 装备表自增 id
@prop({ required: true })
id: number; // 装备 id
@prop({ required: true })
name: string; // 装备名称
@prop({ required: false, default: 0 })
hid: number; // 装备此装备的武将 id
@prop({ required: false, default: 0 })
ePlaceId: number; // 武将装备的部位
@prop({ required: false, default: 1 })
count: number; // 装备数量
@prop({ required: true, default: 1 })
quality: number; // 品质
@prop({ required: true, default: 0 })
suitId: number; // 套装id
@prop({ required: true, default: 0 })
randRange: number; // 固定属性随机值 // TODO 废弃字段,客户端改完之前暂时保留
@prop({ required: false, type: RandMain, default: [], _id: false })
randMain: RandMain[]; // 主属性随机
@prop({ required: true, default: 0 })
grade: number; // 品相等级
@prop({ required: false, type: RandSe, default: [], _id: false })
randSe: RandSe[]; // 强化随机属性
@prop({ required: true, type: Holes, default: [], _id: false })
holes: Holes[];
@prop({ required: false, type: RandSe, default: [], _id: false })
previewRandSe: RandSe[]; // 强化随机属性预览
public static async findbyRole(roleId: string, lean = true) {
const equips: EquipType[] = await EquipModel.find({ roleId }).lean(lean);
return equips;
}
public static async findbySeqId(seqId: number, select?: string ) {
const equip: EquipType = await EquipModel.findOne({ seqId }).select(select).lean();
return equip;
}
public static async createEquip(equipInfo: equipUpdate, lean = true) {
const seqId = await CounterModel.getNewCounter(COUNTER.EID);
const doc = new EquipModel();
const update = Object.assign(doc.toJSON(), seqId, equipInfo);
const equip: EquipType = await EquipModel.findOneAndUpdate({ seqId }, update, { upsert: true, new: true }).lean(lean);
if (equipInfo.hid > 0) {
await HeroModel.findOneAndUpdate(
{ roleId: equipInfo.roleId, hid: equipInfo.hid, 'ePlace.id': equipInfo.ePlaceId },
{ $set: { 'ePlace.$.equip': equip._id } },
{ new: true }).lean(lean);
}
return equip;
}
public static async createEquips(roleId: string, equipInfos: equipUpdate[]) {
let result: EquipType[] = [];
for(let equipInfo of equipInfos) {
let equip = await this.createEquip(equipInfo);
result.push(equip);
}
await RoleModel.increaseEquip(roleId, result.length);
return result;
}
public static async putOnOrOff(equipId: string, hid: number, lean = true) {
const equip: EquipType = await EquipModel.findOneAndUpdate({ _id: equipId }, { hid }, { new: true }).lean(lean);
return equip;
}
public static async findNotWearEquips(roleId: string) {
const equips: EquipType[] = await EquipModel.find({ roleId, hid: 0 }).lean();
return equips;
}
public static async deleteAccount(roleId: string) {
let result = await EquipModel.deleteMany({ roleId });
return result;
}
public static async deleteEquips(roleId: string, ids: Array<number>) {
let equips = await EquipModel.getEquips(roleId, ids);
await EquipModel.deleteMany({ roleId, seqId: { $in: ids } });
await RoleModel.findOneAndUpdate({ roleId }, { $inc: { equipCount: -1 * ids.length } }, { new: true });
return equips;
}
public static async getEquipsByID(ids: Array<string>) {
let result = await EquipModel.find({ _id: { $in: ids } });
return result;
}
public static async getEquips(roleId: string, ids: Array<number>) {
let result: EquipType[] = await EquipModel.find({ roleId, seqId: { $in: ids } });
return result;
}
public static async getEquip(seqId: number) {
let equip: EquipType = await EquipModel.findOne({ seqId });
return equip;
}
public static async updateEquipInfo(seqId: number, equipUpdate: equipUpdate, lean = true) {
delete equipUpdate._id;
let result: EquipType = await EquipModel.findOneAndUpdate({ seqId }, { $set: equipUpdate }, { new: true }).lean(lean);
return result;
}
public static async lock(roleId: string, seqId: number, id: number, lock: boolean) {
let result: EquipType = await EquipModel.findOneAndUpdate({ roleId, seqId, 'randSe.id': id }, { $set: { 'randSe.$.locked': lock } }, { new: true, upsert: false }).select('seqId id randSe').lean();
return result;
}
public static async updateEquipInfobyObjectId(_id: string, equipUpdate: equipUpdate, lean = true) {
delete equipUpdate._id;
let result: EquipType = await EquipModel.findOneAndUpdate({ _id }, { $set: equipUpdate }, { new: true }).lean(lean);
return result;
}
public static async getEquipByObjectId(_id: string) {
let equip: EquipType = await EquipModel.findOne({ _id });
return equip;
}
public static async findByField(field: string, value?: number | string, select?: string) {
let searchObj = {};
if (field != 'all') {
if (field == 'roleName') {
searchObj['roleName'] = { $regex: new RegExp(value.toString(), 'i') }
} else {
searchObj[field] = value;
}
}
//.select('uid tel username')
const user: EquipType[] = await EquipModel.find(searchObj).select(select).lean();
return user;
}
public static async findListByHidAndRole(roleId: string, hid: number, select?: string) {
let result: EquipType[] = await EquipModel.find({ roleId, hid }).select(select).lean();
return result;
}
public static async getEquipsByIds(roleId: string, ids: Array<number>) {
let result = await EquipModel.find({ roleId, id: { $in: ids } });
return result;
}
private static getSearchObj(form: SearchEquipParam) {
let searchObj = {};
if(form.roleId) searchObj['roleId'] = form.roleId;
if(form.roleName) searchObj['roleName'] = { $regex: new RegExp(form.roleName.toString(), 'i') };
if(form.id) searchObj['id'] = form.id;
return searchObj
}
public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', form: SearchEquipParam = {}) {
let searchObj = this.getSearchObj(form);
let sort = {};
if(sortField && sortOrder) {
if(sortOrder == 'ascend') {
sort[sortField] = 1;
} else if (sortOrder == 'descend') {
sort[sortField] = -1;
}
}
const result: EquipType[] = await EquipModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
return result;
}
public static async countByCondition(form: SearchEquipParam = {}) {
let searchObj = this.getSearchObj(form);
const result = await EquipModel.count(searchObj);
return result;
}
}
export const EquipModel = getModelForClass(Equip);
export interface EquipType extends Pick<DocumentType<Equip>, keyof Equip> {
id: number;
};
export type equipUpdate = Partial<EquipType>; // 将所有字段变成可选项
+1 -1
View File
@@ -7,7 +7,7 @@ import { reduceCe } from '../pubUtils/util';
import { gameData } from '../pubUtils/data';
import { SearchGuildParam } from '../domain/backEndField/search';
class Structure {
export class Structure {
@prop({ required: true })
id: number;
@prop({ required: true })
+1 -1
View File
@@ -3,7 +3,7 @@ import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoos
export class ScienceTree {
@prop({ required: true })
id: number;
id: number;
@prop({ required: true })
endTime: number;//科技树研发成功结束事件,时间戳,小于当前时间,说明开发完成
@prop({ required: true, default: [], type: String, _id: false})
+41 -25
View File
@@ -1,8 +1,8 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, Ref, mongoose, DocumentType } from '@typegoose/typegoose';
import Equip, { } from './Equip';
// import Equip, { } from './Equip';
import { CounterModel } from './Counter';
import { COUNTER, EQUIP_TYPE, HERO_CE_RATIO } from '../consts';
import { COUNTER, HERO_CE_RATIO } from '../consts';
import { reduceCe } from '../pubUtils/util';
import Skin from './Skin';
import { SearchHeroParam } from '../domain/backEndField/search';
@@ -71,30 +71,46 @@ export class HeroSkin {
enable: boolean;
}
export class Stone {
@prop({ required: true })
id: number;
@prop({ required: true })
stone: number;
}
export class EPlace {
@prop({ required: true })
id: number;
@prop({ ref: Equip, type: mongoose.Schema.Types.ObjectId })
equip: Ref<Equip>;
@prop({ required: true })
lv: number;
equipId: number;
@prop({ required: true })
refineLv: number;
}
lv: number = 1;
@prop({ required: true })
quality: number = 1;
@prop({ required: true })
qualityStage: number = 0;
@prop({ required: true })
star: number = 0;
@prop({ required: true })
starStage: number = 0;
@prop({ required: true, type: Stone, _id: false })
stones: Stone[];
@prop({ required: true })
jewel: number = 0;
// 初始化
function getInitialEplace() {
let ePlace = new Array<EPlace>();
for (let i = EQUIP_TYPE.START; i <= EQUIP_TYPE.END; i++) {
let p = new EPlace();
p.id = i;
p.equip = null;
p.lv = 0;
p.refineLv = 1;
ePlace.push(p);
getInitialStone? () {
let result: Stone[] = [];
for(let id = 1; id <= 3; id++) {
result.push({ id, stone: 0 });
}
return result;
}
return ePlace;
constructor(id: number, equipId: number) {
this.id = id;
this.equipId = equipId;
this.stones = this.getInitialStone();
}
}
@index({ roleId: 1, hid: 1 })
@@ -167,7 +183,7 @@ export default class Hero extends BaseModel {
@prop({ required: true, type: HeroSkin, default: [], _id: false })
skins: HeroSkin[]; // 皮肤
@prop({ required: true, type: EPlace, default: getInitialEplace(), _id: false })
@prop({ required: true, type: EPlace, default: [], _id: false })
ePlace: EPlace[]; // 武将装备引用数组
public static async findByRole(roleId: string, sort: { field: string, sortBy: number }[] = [], select?: string, getters = false) {
@@ -189,6 +205,11 @@ export default class Hero extends BaseModel {
return hero;
}
public static async checkEquipByQuality(roleId: string, quality: number) {
const result = await HeroModel.exists({ roleId, 'ePlace.quality': { $gte: quality } });
return result;
}
public static async findMapByHidRange(hids: Array<number>, roleId: string, select?: string, getters = false) {
const hero = await HeroModel.findByHidRange(hids, roleId, select, getters);
let map = new Map<number, HeroType>();
@@ -207,11 +228,6 @@ export default class Hero extends BaseModel {
return hero;
}
public static async findByHidAndRoleWithEquip(hid: number, roleId: string, lean = true) {
const hero: HeroType = await HeroModel.findOne({ hid, roleId }).populate('ePlace.equip').lean(lean);
return hero;
}
public static async addEquip(roleId: string, hid: number, ePlaceId: number, equipId: string) {
const hero: HeroType = await HeroModel.findOneAndUpdate(
{ roleId, hid, 'ePlace.id': ePlaceId },
+5
View File
@@ -45,6 +45,11 @@ export default class Item extends BaseModel {
return items;
}
public static async findbyRoleAndGid(roleId: string, id: number, lean = true) {
const items: ItemType = await ItemModel.findOne({ roleId, id }).select('id count type').lean(lean);
return items;
}
public static async increaseItem(roleId: string, id: number, count: number, itemInfo: { roleId: string, roleName: string, id: number, itemName: string, type: number, hid?: number }) {
const doc = new ItemModel();
const setOnInsert = Object.assign(doc.toJSON(), itemInfo);
+193
View File
@@ -0,0 +1,193 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
// import { COUNTER } from '../consts';
// import { CounterModel } from './Counter';
import { SearchJewelParam } from '../domain/backEndField/search';
import { RoleModel } from './Role';
import { CounterModel } from './Counter';
import { COUNTER } from '../consts';
import { HeroModel } from './Hero';
export class RandSe {
@prop({ required: true })
id: number; // 随机属性位置id
@prop({ required: true })
seid: number; // 随机属性池id
@prop({ required: true })
rand: number; // 随机属性内需要随机的值
@prop({ required: true })
locked: boolean = false; // 洗炼是否锁定
@prop({ required: false, default: false })
quenched: boolean = false; // 是否淬炼了
@prop({ required: false, default: 0 })
quenchCnt: number = 0; // 淬炼次数
constructor(id: number, seid: number, rand: number) {
this.id = id;
this.seid = seid;
this.rand = rand;
}
}
@index({ roleId: 1, hid: 1, id: 1 })
@index({ seqId: 1 })
@modelOptions({ schemaOptions: { id: false } })
export default class Jewel extends BaseModel {
@prop({ required: true })
roleId: string; // 角色 id
@prop({ required: true })
roleName: string; // 角色名称
@prop({ required: true })
seqId: number; // 装备表自增 id
@prop({ required: true })
id: number; // 装备 id
@prop({ required: true })
name: string; // 装备名称
@prop({ required: false, default: 0 })
hid: number; // 装备此装备的武将 id
@prop({ required: false, default: 0 })
ePlaceId: number; // 武将装备的部位
@prop({ required: false, type: RandSe, default: [], _id: false })
randSe: RandSe[]; // 强化随机属性
@prop({ required: false, type: RandSe, default: [], _id: false })
previewRandSe: RandSe[]; // 强化随机属性预览
public static async findbyRole(roleId: string, lean = true) {
const jewels: JewelType[] = await JewelModel.find({ roleId }).lean(lean);
return jewels;
}
public static async findbyRoleAndHids(roleId: string, hids: number[]) {
const jewels: JewelType[] = await JewelModel.find({ roleId, hid: { $in: hids } }).lean();
return jewels;
}
public static async findMapbyRoleAndHids(roleId: string, hids: number[]) {
const jewels = await JewelModel.findbyRoleAndHids(roleId, hids);
let map = new Map<number, JewelType>();
for(let jewel of jewels) {
map.set(jewel.seqId, jewel);
}
return map;
}
public static async findbySeqId(seqId: number, select?: string ) {
const jewel: JewelType = await JewelModel.findOne({ seqId }).select(select).lean();
return jewel;
}
public static async findbySeqIds(seqIds: number[], select?: string ) {
const jewel: JewelType[] = await JewelModel.find({ seqId: { $in: seqIds } }).select(select).lean();
return jewel;
}
public static async createJewel(jewelInfo: jewelUpdate) {
const seqId = await CounterModel.getNewCounter(COUNTER.JEWEL_ID);
const doc = new JewelModel();
const update = Object.assign(doc.toJSON(), seqId, jewelInfo);
const jewel: JewelType = await JewelModel.findOneAndUpdate({ seqId }, update, { upsert: true, new: true }).lean();
if (jewelInfo.hid > 0) {
await HeroModel.findOneAndUpdate(
{ roleId: jewelInfo.roleId, hid: jewelInfo.hid, 'ePlace.id': jewelInfo.ePlaceId },
{ $set: { 'ePlace.$.jewel': seqId } },
{ new: true }).lean();
}
return jewel;
}
public static async createJewels(roleId: string, jewelInfos: jewelUpdate[]) {
let result: JewelType[] = [];
for(let jewelInfo of jewelInfos) {
let jewel = await this.createJewel(jewelInfo);
result.push(jewel);
}
await RoleModel.increaseJewel(roleId, result.length);
return result;
}
public static async putOnOrOff(seqId: number, hid: number, ePlaceId: number) {
let rec: JewelType = await JewelModel.findOneAndUpdate({ seqId }, { $set: { hid, ePlaceId } }, { new: true }).lean();
return rec;
}
public static async lock(seqId: number, id: number, lock: boolean) {
let result: JewelType = await JewelModel.findOneAndUpdate({ seqId, 'randSe.id': id }, { $set: { 'randSe.$.locked': lock } }, { new: true }).select('seqId id randSe').lean();
return result;
}
public static async chooseQuench(seqId: number, id: number) {
let result: JewelType = await JewelModel.findOneAndUpdate({ seqId, 'randSe.id': id }, { $set: { 'randSe.$.quenched': true } }, { new: true }).lean();
return result;
}
public static async quench(seqId: number, isSuccess: boolean, rand: number) {
if(isSuccess) {
let result: JewelType = await JewelModel.findOneAndUpdate({ seqId, 'randSe.quenched': true }, { $set: { 'randSe.$.rand': rand } }, { new: true }).lean();
return result;
} else {
let result: JewelType = await JewelModel.findOneAndUpdate({ seqId, 'randSe.quenched': true }, { $inc: { 'randSe.$.quenchCnt': 1 } }, { new: true }).lean();
return result;
}
}
public static async updateInfo(seqId: number, update: jewelUpdate) {
let result: JewelType = await JewelModel.findOneAndUpdate({ seqId }, { $set: update }, {new: true}).lean();
return result;
}
public static async deleteBySeqIds(roleId: string, seqIds: number[]) {
let jewels = await JewelModel.findbySeqIds(seqIds);
await JewelModel.deleteMany({ roleId, seqId: { $in: seqIds } });
await RoleModel.increaseJewel(roleId, -1 * seqIds.length);
return jewels;
}
public static async deleteAccount(roleId: string) {
let result = await JewelModel.deleteMany({ roleId });
return result;
}
private static getSearchObj(form: SearchJewelParam) {
let searchObj = {};
if(form.roleId) searchObj['roleId'] = form.roleId;
if(form.roleName) searchObj['roleName'] = { $regex: new RegExp(form.roleName.toString(), 'i') };
if(form.id) searchObj['id'] = form.id;
return searchObj
}
public static async findByCondition(page: number, pageSize: number, sortField: string = 'updatedAt', sortOrder: string = 'descend', form: SearchJewelParam = {}) {
let searchObj = this.getSearchObj(form);
let sort = {};
if(sortField && sortOrder) {
if(sortOrder == 'ascend') {
sort[sortField] = 1;
} else if (sortOrder == 'descend') {
sort[sortField] = -1;
}
}
const result: JewelType[] = await JewelModel.find(searchObj).limit(pageSize).skip((page - 1) * pageSize).sort(sort).lean({ getters: true, virtuals: true });
return result;
}
public static async countByCondition(form: SearchJewelParam = {}) {
let searchObj = this.getSearchObj(form);
const result = await JewelModel.count(searchObj);
return result;
}
}
export const JewelModel = getModelForClass(Jewel);
export interface JewelType extends Pick<DocumentType<Jewel>, keyof Jewel> {
id: number;
};
export type jewelUpdate = Partial<JewelType>; // 将所有字段变成可选项
+3 -4
View File
@@ -215,7 +215,7 @@ export default class Role extends BaseModel {
@prop({ required: true, default: [] })
payRecord: PayRecord[]; // 支付记录
@prop({ required: true, default: 0 })
equipCount: number; // 装备数量
jewelCount: number; // 装备数量
@prop({ required: true, default: 0 })
coin: number; // 总铜钱
@@ -710,12 +710,11 @@ export default class Role extends BaseModel {
}
// 装备上限
public static async increaseEquip(roleId: string, count: number) {
const role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $inc: { equipCount: count } }, { new: true }).lean();
public static async increaseJewel(roleId: string, count: number) {
const role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $inc: { jewelCount: count } }, { new: true }).lean();
return role;
}
// 支付记录
public static async increaseTotalPay(roleId: string, price: number) {
const role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $inc: { totalPay: price } }, { new: true }).lean();
+16 -2
View File
@@ -28,6 +28,12 @@ class WishGood {
donateNames: string[];
}
class RefineRecord {
@prop({ required: true })
quality: number;
@prop({ required: true })
count: number;
}
@index({ roleId: 1 })
export default class UserGuild extends BaseModel {
@@ -64,7 +70,7 @@ export default class UserGuild extends BaseModel {
@prop({ required: true, type: Number, default: [] })
receivedActive: number[];
@prop({ required: true, default: new Date(), select: false })
@prop({ required: true, select: false })
refTimeDaily: Date;
//练兵场
@prop({ required: true, default: 0 })
@@ -94,7 +100,8 @@ export default class UserGuild extends BaseModel {
@prop({ required: true, default: 0 })
wishDntCnt: number;//今天许愿池捐献次数
@prop({ required: true, default: new Date() })
// 演武台
@prop({ required: true })
refBossTime: Date;
@prop({ required: true, default: 0 })
@@ -103,6 +110,13 @@ export default class UserGuild extends BaseModel {
@prop({ required: true, default: 0 })
bossChallengeCnt: number;//今天挑战演舞台次数
// 炼器堂
@prop({ required: true, type: RefineRecord })
refineCnt: RefineRecord[];
@prop({ required: true })
refRefineTime: Date;
public static async getMyGuild(roleId: string, select?: string) {
const myGuild: UserGuildType = await UserGuildModel.findOne({ roleId, status: USER_GUILD_STATUS.ON })
+6
View File
@@ -24,6 +24,12 @@ export interface SearchEquipParam {
id?: number;
}
export interface SearchJewelParam {
roleId?: string;
roleName?: string;
id?: number;
}
export interface SearchItemParam {
roleId?: string;
roleName?: string;
@@ -1,2 +1,29 @@
import { ComBattleTeamParam } from './../../db/ComBattleTeam';
export type MemComBtlTeam = ComBattleTeamParam & { bossCurHp: number; curRnd: number; bossHp: number };
import { COM_TEAM_STATUS } from '../../consts';
import { getBossHpByBlueprtId, getDicBlueprtById } from '../../pubUtils/data';
import { transBossHpArr } from '../../services/battleService';
import ComBattleTeam from './../../db/ComBattleTeam';
export class MemComBtlTeam extends ComBattleTeam {
bossCurHp: number;
curRnd: number;
bossHp: number;
constructor(teamCode: string, pub: boolean, blueprtId: number, capId: string, ceLimit: number) {
super();
const { lv } = getDicBlueprtById(blueprtId);
this.lv = lv;
const { bossHpSum, bossHpArr } = getBossHpByBlueprtId(blueprtId);
this.bossHpArr = transBossHpArr(bossHpArr);
this.teamCode = teamCode;
this.pub = pub;
this.blueprtId = blueprtId;
this.status = COM_TEAM_STATUS.DEFAULT;
this.capId = capId;
this.ceLimit = ceLimit;
this.curRnd = 0;
this.roleCnt = 1;
this.timeout = false;
this.bossCurHp = bossHpSum;
this.bossHp = bossHpSum;
this.blacklist = [];
}
};
+101
View File
@@ -2,6 +2,9 @@ import { RoleType } from "../../db/Role";
import { FriendShipType } from "../../db/FriendShip";
import * as friendUtil from '../../pubUtils/friendUtil'
import { FRIEND_RELATION_TYPE } from "../../consts";
import { EPlace, HeroType, Stone } from "../../db/Hero";
import { JewelType, RandSe } from "../../db/Jewel";
import { reduceCe } from "../../pubUtils/util";
export class FriendParams {
roleId: string;
@@ -118,4 +121,102 @@ export class BlackListParam extends FriendParams {
setOnline(isOnline: boolean) {
this.isOnline = isOnline;
}
}
export class HeroDetailJewelRandSeParam {
id: number;
seid: number;
rand: number;
constructor(randSe: RandSe) {
this.id = randSe.id;
this.seid = randSe.seid;
this.rand = randSe.rand;
}
}
export class HeroDetailJewelParam {
seqId: number;
id: number;
randSe: HeroDetailJewelRandSeParam[] = [];
constructor(jewel: JewelType) {
this.seqId = jewel.seqId;
this.id = jewel.id;
for(let randSe of jewel.randSe) {
this.randSe.push(new HeroDetailJewelRandSeParam(randSe));
}
}
}
export class HeroDetailEplaceParam {
id: number;
equipId: number;
lv: number;
quality: number;
star: number;
stone: Stone[];
jewelId: number;
jewel: HeroDetailJewelParam = null;
constructor(equip: EPlace) {
this.id = equip.id;
this.equipId = equip.equipId;
this.lv = equip.lv;
this.quality = equip.quality;
this.star = equip.star;
this.stone = equip.stones;
this.jewelId = equip.jewel;
}
setJewel(jewel: JewelType) {
this.jewel = new HeroDetailJewelParam(jewel);
}
}
export class HeroDetailParam {
roleId: string;
hid: number;
ce: number;
lv: number;
star: number;
colorStar: number;
quality: number;
job: number;
skinId: number;
ePlace: HeroDetailEplaceParam[] = [];
attributes: {
hp: number;
atk: number;
def: number;
mdef: number;
}
constructor(hero: HeroType) {
this.roleId = hero.roleId;
this.hid = hero.hid;
this.ce = reduceCe(hero.ce);
this.lv = hero.lv;
this.star = hero.star;
this.colorStar = hero.colorStar;
this.quality = hero.quality;
this.job = hero.job;
this.skinId = hero.skinId;
for(let equip of hero.ePlace) {
this.ePlace.push(new HeroDetailEplaceParam(equip));
}
}
setAttributes(attributes: {hp: number, atk: number, def: number, mdef: number}) {
this.attributes = attributes;
}
setJewels(jewels: Map<number, JewelType>) {
for(let eplaceParam of this.ePlace) {
if(jewels.has(eplaceParam.jewelId)) {
eplaceParam.setJewel(jewels.get(eplaceParam.jewelId));
}
}
}
}
+120 -115
View File
@@ -1,12 +1,9 @@
import { dicHero, dicMyHeroes, loadHero } from "./dictionary/DicHero";
import { dicGoods, blueprtWithQuality, blueprtWithQualityAndStar, dicJewel, figureCondition, loadGoods } from "./dictionary/DicGoods";
import { dicBlueprtCompose, loadBlueprtCompose } from "./dictionary/DicBlueprtCompose";
import { dicBlueprtPossibility, loadBlueprtPossibility } from "./dictionary/DicBlueprtPossibility";
import { dicHero, loadHero } from "./dictionary/DicHero";
import { dicGoods, figureCondition, loadGoods } from "./dictionary/DicGoods";
import { dicDaily, loadDaily } from "./dictionary/DicDaily";
import { dicEvent, dicEventList, loadEvent } from "./dictionary/DicEvent";
import { dicExpedition, DicExpedition, loadExpedition } from "./dictionary/DicExpedition";
import { dicExpeditionPoint, loadExpeditionPoint } from "./dictionary/DicExpeditionPoint";
import { dicFuncSwitch, loadFuncSwitch } from "./dictionary/DicFuncSwitch";
import { dicHeroSkill, loadHeroSkill } from "./dictionary/DicHeroSkill";
import { dicJob, jobClassAndgrades, jobClassMaxGrades, loadJob } from "./dictionary/DicJob";
import { dicKingExp, maxPlayerLv, loadKingExp } from "./dictionary/DicKingExp";
@@ -18,7 +15,7 @@ import { dicTowerTask, loadTowerTask } from "./dictionary/DicTowerTask";
import { dicWar, dicWarPvp, dicDailyWarByType, loadWar } from "./dictionary/DicWar";
import { dicWarJson, loadWarJson } from "./dictionary/DicWarJson";
import { dicXunbao, loadXunbao } from "./dictionary/DicXunbao";
import { AUCTION_TIME, CONSUME_TYPE, ITID, SPECIAL_ATTR } from "../consts";
import { AUCTION_TIME } from "../consts";
import { dicFashions, dicFashionsByHeroId, loadFashions } from "./dictionary/DicFashions";
import { friendShips, friendShipHidAandIds, loadFriendShip } from "./dictionary/DicFriendShip";
import { maxFriendShipLv, dicFriendShipLevelMap, loadFriendShipLevel } from "./dictionary/DicFriendShipLevel";
@@ -26,10 +23,6 @@ import { dicHeroQualityUp, loadHeroQualityUp } from "./dictionary/DicHeroQuality
import { dicHeroStar, loadHeroStar } from "./dictionary/DicHeroStar";
import { dicHeroWake, loadHeroWake } from "./dictionary/DicHeroWake";
import { dicRandomEffectPool, loadRandomEffectPool } from './dictionary/DicRandomEffectPool';
import { dicStrengthenCost, loadStrengthenCost } from './dictionary/DicStrengthenCost';
import { dicRefine, loadRefine } from './dictionary/DicRefine';
import { dicHeroEquip, loadHeroEquip } from './dictionary/DicHeroEquip';
import { dicSuit, dicSuitByTypeAndLv, loadSuit } from './dictionary/DicSuit';
import { dicTitle, loadTitle } from './dictionary/DicTitle';
import { dicTeraph, loadTeraph } from './dictionary/DicTeraph';
import { dicSchool, loadSchool } from './dictionary/DicSchool';
@@ -87,8 +80,6 @@ import { dicServerName, loadServerName } from "./dictionary/DicServerName";
import { dicAp, loadAp, dicApMaxLevel } from './dictionary/DicAp';
import { dicApBuy, dicApMaxBuyTimes, loadApBuy } from "./dictionary/DicApBuy";
import { dicKingExpRatio, loadKingExpRatio } from './dictionary/DicKingExpRatio';
import { dicQuenchByQuality, dicQuenchRangeByQuality, dicQuenchRangeByQualityAndGrade, loadQuenchQuality } from './dictionary/DicQuenchQuality';
import { dicQuenchConsume, loadQuenchConsume } from './dictionary/DicQuenchConsume';
import { dicHoliday, loadHoliday } from './dictionary/DicHoliday';
import { dicExpeditionSubAttr, loadExpeditionSubAttr } from './dictionary/DicExpeditionSubAttr';
import { dicAuctionPool, loadAuctionReward } from './dictionary/DicAuctionReward';
@@ -100,16 +91,22 @@ import { dicApiById, dicApiByUrl, loadApi } from './dictionary/DicApi';
import { dicServerConst, loadServerConst } from './dictionary/DicServerConst';
import { pick } from "underscore";
import _ = require("underscore");
import { dicEquipById, dicEquipIdByJobClassAndEplace, loadEquip } from "./dictionary/DicEquip";
import { dicBlueprt, dicBlueprtByLv, dicJewel, loadJewel } from "./dictionary/DicJewel";
import { dicStone, loadStone } from './dictionary/DicStone';
import { dicEquipStrength, loadEquipStrength } from "./dictionary/DicEquipStrength";
import { dicEquipQuality, dicEquipQualityIdByEquipIdAndPoint, loadEquipQuality } from "./dictionary/DicEquipQuality";
import { dicEquipStar, dicEquipStarIdByEquipId, loadEquipStar } from './dictionary/DicEquipStar';
import { dicEquipQualityExtra, loadEquipQualityExtra } from './dictionary/DicEquipQualityExtra';
import { dicEquipSuit, dicEquipSuitByJobClass, loadEquipSuit } from "./dictionary/DicEquipSuit";
import { dicJewelCondition, loadJewelCondition } from './dictionary/DicJewelCondition';
export const gameData = {
blurprtCompose: dicBlueprtCompose,
blueprtPossibility: dicBlueprtPossibility,
daily: dicDaily,
event: dicEvent,
eventList: dicEventList,
expedition: dicExpedition,
expeditionPoint: dicExpeditionPoint,
funcsSwitch: dicFuncSwitch,
goods: dicGoods,
hero: dicHero,
heroQualityUp: dicHeroQualityUp,
@@ -132,9 +129,6 @@ export const gameData = {
xunbao: dicXunbao,
btlBossHpSum: new Map<number, number>(),
btlBossHp: new Map<number, Array<{ dataId: number, hp: number, actorId: number }>>(),
blueprtToWar: new Map<number, number>(),
blueprt: blueprtWithQuality,
blueprtWithQualityAndStar: blueprtWithQualityAndStar,
fashion: dicFashions,
fashionBySkinId: dicFashionsByHeroId,
friendShips: friendShips,
@@ -142,12 +136,6 @@ export const gameData = {
maxFriendShipLv: maxFriendShipLv,
friendShipLevelMap: dicFriendShipLevelMap,
randomEffectPool: dicRandomEffectPool,
strengthenCost: dicStrengthenCost,
refine: dicRefine,
jewels: dicJewel,
dicHeroEquip: dicHeroEquip,
suit: dicSuit,
suitByTypeAndLv: dicSuitByTypeAndLv,
title: dicTitle,
teraphs: dicTeraph,
school: dicSchool,
@@ -204,7 +192,6 @@ export const gameData = {
shop: dicShop,
shopItem: dicShopItem,
shopList: dicShopList,
dicMyHeroes: dicMyHeroes,
rank: dicRank,
generalRankReward: dicRankReward,
taskType: dicTaskType,
@@ -234,10 +221,6 @@ export const gameData = {
apBuy: dicApBuy,
apMaxBuyTimes: dicApMaxBuyTimes,
kingExpRaio: dicKingExpRatio,
quenchRangeByQuality: dicQuenchRangeByQuality,
quenchRangeByQualityAndGrade: dicQuenchRangeByQualityAndGrade,
quenchConsume: dicQuenchConsume,
quenchByQuality: dicQuenchByQuality,
equipAttributeRatio: new Map<number, number>(),
ceRatio: new Array<{type: number, val: number}>(),
holiday: dicHoliday,
@@ -249,6 +232,21 @@ export const gameData = {
apiById: dicApiById,
apiByUrl: dicApiByUrl,
serverConst: dicServerConst,
equipById: dicEquipById,
equipIdByJobAndEPlace: dicEquipIdByJobClassAndEplace,
jewel: dicJewel,
stone: dicStone,
equipStrengthenCost: dicEquipStrength,
equipQuality: dicEquipQuality,
equipQualityIdByEquipIdAndPoint: dicEquipQualityIdByEquipIdAndPoint,
equipStar: dicEquipStar,
equipStarIdByEquipId: dicEquipStarIdByEquipId,
equipQualityExtra: dicEquipQualityExtra,
equipSuit: dicEquipSuit,
equipSuitByJobClass: dicEquipSuitByJobClass,
jewelCondition: dicJewelCondition,
blueprt: dicBlueprt,
blueprtByLv: dicBlueprtByLv,
};
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
@@ -341,21 +339,6 @@ export function getBossHpByWarId(warId: number) {
return { bossHpSum, bossHpArr };
}
export function getWarIdByBlueprtId(blueprtId: number) {
let warId = gameData.blueprtToWar.get(blueprtId);
if (!warId) {
let blueprt = gameData.goods.get(blueprtId);
if (blueprt) {
const { specialAttr } = blueprt;
warId = specialAttr.get(SPECIAL_ATTR.WAR_ID);
if (warId)
gameData.blueprtToWar.set(blueprtId, warId);
}
}
return warId;
}
export function getBossHpByBlueprtId(blueprtId: number) {
let { dispatchJsonId } = getWarByBlueprtId(blueprtId);
let bossHpInfo = getBossHpByWarId(dispatchJsonId);
@@ -363,8 +346,8 @@ export function getBossHpByBlueprtId(blueprtId: number) {
}
export function getWarByBlueprtId(blueprtId: number) {
let warId = getWarIdByBlueprtId(blueprtId);
return gameData.war.get(warId);
let dicBlueprt = getDicBlueprtById(blueprtId);
return gameData.war.get(dicBlueprt.gkId);
}
export function getRewardByBlueprtId(blueprtId: number) {
@@ -380,7 +363,7 @@ function parseComBtlLvRange() {
}
export function comBtlRanges() {
return Array.from(gameData.comBtlLvRange.keys());
return Array.from(gameData.blueprtByLv.keys());
}
@@ -409,14 +392,6 @@ export function getGoodById(gid: number) {
return gameData.goods.get(gid);
}
export function getJewelById(gid: number) {
return gameData.jewels.get(gid);
}
export function getHeroEquipByClassId(classId: number) {
return gameData.dicHeroEquip.get(classId);
}
export function getHeroJob(jobId: number) {
const job = gameData.job.get(jobId);
return job;
@@ -442,16 +417,6 @@ export function getScollByStar(quality: number, star: number, curQuality: number
return heroScroll;
}
export function getSuit(id: number) {
const suitInfo = gameData.suit.get(id);
return suitInfo;
}
export function getFuncsSwitch(id: number) {
const funcInfo = gameData.funcsSwitch.get(id);
return funcInfo;
}
export function getPLvByScore(score: number) {
let lv = 0;
for (let { teamLv, topLineupMin, topLineupMax } of gameData.pvpTeamLevel) {
@@ -749,50 +714,10 @@ export function getDicApByLv(level: number) {
}
}
export function getDicSuitByTypeAndLv(suitType: number, starLevel: number) {
return gameData.suitByTypeAndLv.get(`${suitType}_${starLevel}`);
}
export function getQuenchGradeByValue(quality: number, value: number) {
let dicQuench = gameData.quenchByQuality.get(quality)||[];
let grade = 0;
for(let [_grade, { singleRatioMin, singleRatioMax }] of dicQuench) {
if((value >= singleRatioMin && value < singleRatioMax) || (value == singleRatioMin && value == singleRatioMax) ) {
grade = _grade;
}
}
return grade;
}
export function getWishPoolReward(id: number) {
let dicGoods = gameData.goods.get(id);
if(!dicGoods) return false;
let dicItid = ITID.get(dicGoods.itid);
let starLevel = 0;
if(dicItid.type == CONSUME_TYPE.PIECE) {
starLevel = dicGoods.equipLvl;
}
// console.log('*****', dicGoods.itid, starLevel, dicGoods.quality)
return gameData.guildWishReward.get(`${dicGoods.itid}_${starLevel}_${dicGoods.quality}`);
}
/**
* 根绝品质和品相获得上下限,当grade为0,获取该品质下全阶的上下限
* @param quality 品质
* @param grade 品相
* @returns {{ min: number, max: number }}
*/
export function getQuenchByQualityAndGrade(quality: number, grade: number) {
if(grade == 0) { // 这个品质的上下限
return gameData.quenchRangeByQuality.get(quality);
} else { // 该品质该品相的上下限
return gameData.quenchRangeByQualityAndGrade.get(`${quality}_${grade}`);
}
}
export function getQuenchConsume(lvLimited: number, quality: number) {
return gameData.quenchConsume.get(`${lvLimited}_${quality}`);
return gameData.guildWishReward.get(`${dicGoods.itid}_${dicGoods.quality}`);
}
/**
@@ -834,6 +759,86 @@ function splitTime(str: string) {
return { hour: parseInt(arr[0]), minute: parseInt(arr[1]), seconds: parseInt(arr[2]) }
}
export function getEquipByJobClassAndEPlace(jobClass: number, ePlaceId: number) {
let equipId = gameData.equipIdByJobAndEPlace.get(`${jobClass}_${ePlaceId}`);
return gameData.equipById.get(equipId);
}
export function getEquipQualityIdByEquipIdAndPoint(equipId: number, quality: number, point: number) {
let equipQualityId = gameData.equipQualityIdByEquipIdAndPoint.get(`${equipId}_${quality}_${point}`);
return equipQualityId?gameData.equipQuality.get(equipQualityId): null;
}
export function getNextEquipQuality(equipId: number, quality: number, point: number) {
let equipQuality = getEquipQualityIdByEquipIdAndPoint(equipId, quality, point);
if(equipQuality) {
let nextId = equipQuality.id + 1;
let nextEquipQuality = gameData.equipQuality.get(nextId);
if(nextEquipQuality && nextEquipQuality.equipId == equipQuality.equipId) {
return nextEquipQuality
}
}
return null
}
export function getEquipStarIdByEquipId(equipId: number, star: number) {
let equipStarId = gameData.equipStarIdByEquipId.get(`${equipId}_${star}`);
return equipStarId?gameData.equipStar.get(equipStarId): null;
}
export function getNextEquipStar(equipId: number, star: number) {
let equipStar = getEquipStarIdByEquipId(equipId, star);
if(equipStar) {
let nextId = equipStar.id + 1;
let nextEquipStar = gameData.equipStar.get(nextId);
if(nextEquipStar && nextEquipStar.equipId == equipStar.equipId) {
return nextEquipStar;
}
}
return null;
}
export function getPreEquipStar(equipId: number, star: number) {
let equipStar = getEquipStarIdByEquipId(equipId, star);
if(equipStar) {
let nextId = equipStar.id - 1;
let nextEquipStar = gameData.equipStar.get(nextId);
if(nextEquipStar && nextEquipStar.equipId == equipStar.equipId) {
return nextEquipStar;
}
}
return null;
}
export function getEquipStarMainAttrByStage(equipId: number, star: number, starStage: number) {
if(starStage == 0) {
let preEquipStar = getPreEquipStar(equipId, star);
if(!preEquipStar || preEquipStar.equipId != equipId) {
return [];
} else {
return preEquipStar.mainAttr.get(preEquipStar.count);
}
} else {
let equipStar = getEquipStarIdByEquipId(equipId, star);
return equipStar.mainAttr.get(starStage);
}
}
export function getEquipSuitByHero(hid: number) {
let dicHero = gameData.hero.get(hid);
let equipSuitId = gameData.equipSuitByJobClass.get(dicHero.jobClass);
return gameData.equipSuit.get(equipSuitId);
}
export function getJewelConditionByLvAndSeId(lv: number, randSeId: number) {
return gameData.jewelCondition.get(`${lv}_${randSeId}`);
}
export function getDicBlueprtById(id: number) {
let jewel = gameData.blueprt.get(id);
return gameData.jewel.get(jewel);
}
// 初始加载
function initDatas() {
parseDicParam();
@@ -907,13 +912,10 @@ function treatTaskGroup() {
function loadDatas() {
loadHero();
loadGoods();
loadBlueprtCompose();
loadBlueprtPossibility();
loadDaily();
loadEvent();
loadExpedition();
loadExpeditionPoint();
loadFuncSwitch();
loadHeroSkill();
loadJob();
loadKingExp();
@@ -932,10 +934,6 @@ function loadDatas() {
loadHeroStar();
loadHeroWake();
loadRandomEffectPool();
loadStrengthenCost();
loadRefine();
loadHeroEquip();
loadSuit();
loadTitle();
loadTeraph();
loadSchool();
@@ -986,8 +984,6 @@ function loadDatas() {
loadAp();
loadApBuy();
loadKingExpRatio();
loadQuenchQuality();
loadQuenchConsume();
loadEquipAttributeRatio();
loadHoliday();
loadExpeditionSubAttr();
@@ -999,6 +995,15 @@ function loadDatas() {
loadGuildWishReward();
loadApi();
loadServerConst();
loadEquip();
loadEquipStrength();
loadEquipQuality();
loadEquipStar();
loadEquipSuit();
loadEquipQualityExtra();
loadJewel();
loadStone();
loadJewelCondition();
}
// 重载dicParam
+2 -1
View File
@@ -66,7 +66,8 @@ export const ARMY = {
export const TREASURE = {
CAPTAIN_DROP: 5, // 普通套装图纸队长必掉落次数
TEAMMATE_DROP: 10, // 普通套装图纸队员必掉落次数
TREASURE_ASSIST_LIMITED: '1&1&999|2&21&999|3&41&999|4&61&999|5&81&999|6&100&999', // 协助寻宝星级开启玩家等级限制
TREASURE_ASSIST_LIMITED: '1&1&999|2&20&999|3&30&999|4&40&999|5&50&999|6&60&999|7&70&999|8&80&999|9&90&999', // 协助寻宝星级开启玩家等级限制
TREASURE_ASSIST_TIME: 6, // 协助寻宝总次数
};
export const FRIEND = {
FRIEND_CLOSEPOINT_ADD: 5, // 每赠送/领取一次增加的亲密度
@@ -5,22 +5,30 @@ import { RewardInter } from '../interface';
const _ = require('lodash');
export interface DicArmyDevelopConsume {
// 科技树唯一id
readonly id: number;
// 目标品质
readonly quality: number;
readonly starLevel: number;
readonly prePositions: Array<number>;
readonly honourConsume: Array<RewardInter>;
// 相同品质下细分等级
readonly qualityLevel: number;
// 前置点需求
readonly prePositions: number[];
// 图纸最多张数
readonly max: number;
// 需要的功勋
readonly honourConsume: RewardInter[];
// 研发需要的资金
readonly fundConsume: number;
// 研发需要的时间
readonly timeConsume: number;
}
const DicArmyDevelopConsumeKeys: KeysEnum<DicArmyDevelopConsume> = {
id: true,
quality: true,
starLevel: true,
qualityLevel: true,
prePositions: true,
max: true,
honourConsume: true,
fundConsume: true,
timeConsume: true
@@ -1,29 +0,0 @@
// 藏宝图合成表
import { readFileAndParse, parseGoodStr } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicBlueprtCompose {
// 品质
readonly quality: number;
// 消耗的寻宝币数量
readonly coinNum: RewardInter[];
// 消耗的藏宝图的数量
readonly blueprtNum: number;
// 目标品质
readonly targetQuality: number;
}
export const dicBlueprtCompose = new Map<number, DicBlueprtCompose>();
export function loadBlueprtCompose() {
dicBlueprtCompose.clear();
let arr = readFileAndParse(FILENAME.DIC_BLUEPRT_COMPOSE);
arr.forEach(o => {
o.coinNum = parseGoodStr(o.coinNum);
dicBlueprtCompose.set(o.quality, o);
});
arr = undefined;
}
@@ -1,38 +0,0 @@
// 藏宝图掉落率
import { decodeArrayListStr, readFileAndParse } from '../util'
import { FILENAME } from '../../consts'
export interface DicBlueprtPossibility {
// 君主等级下限
readonly min: number;
// 君主等级上限
readonly max: number;
// 掉落概率
readonly possibility: Array<{id: number, weight: number}>;
}
export const dicBlueprtPossibility = new Array<DicBlueprtPossibility>();
export function loadBlueprtPossibility() {
dicBlueprtPossibility.splice(0, dicBlueprtPossibility.length);
let arr = readFileAndParse(FILENAME.DIC_BLUEPRT_POSSIBILITY);
arr.forEach(o => {
o.possibility = parsePossibility(o.possibility);
dicBlueprtPossibility.push(o);
});
}
function parsePossibility(str: string) {
let result = new Array<{id: number, weight: number}>();
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [id, weight] of decodeArr) {
if(isNaN(parseInt(id)) || isNaN(parseInt(weight))) {
throw new Error('data table format wrong');
}
result.push({id: parseInt(id), weight: parseInt(weight)});
}
return result
}
+54
View File
@@ -0,0 +1,54 @@
// 装备表
import { readFileAndParse, decodeArrayListStr, parseGoodStr } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicEquip {
// (key) 装备的id
readonly id: number;
// 装备的位置(武器、衣甲、帽冠、行具)
readonly eplaceId: number;
// 装备名
readonly name: string;
// 匹配的武将的职业的大类
readonly jobClass: number;
// 套装id
readonly suitId: number;
// 属性提升
readonly attribute: {id: number, num: number}[];
// 属性成长加成提升
readonly attributeUp: {id: number, num: number}[];
// 合成消耗
readonly composeMaterial: RewardInter[];
}
export const dicEquipById = new Map<number, DicEquip>();
export const dicEquipIdByJobClassAndEplace = new Map<string, number>();
export function loadEquip() {
dicEquipById.clear();
dicEquipIdByJobClassAndEplace.clear();
let arr = readFileAndParse(FILENAME.DIC_EQUIP);
arr.forEach(o => {
o.attribute = parseAttr(o.attribute);
o.attributeUp = parseAttr(o.attributeUp);
o.composeMaterial = parseGoodStr(o.composeMaterial);
dicEquipById.set(o.id, o);
dicEquipIdByJobClassAndEplace.set(`${o.jobClass}_${o.eplaceId}`, o.id);
});
arr = undefined;
}
function parseAttr(str: string) {
let result = new Array<{id: number, num: number}>();
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [id, num] of decodeArr) {
if(isNaN(parseInt(id)) || isNaN(parseInt(num))) {
throw new Error('data table format wrong');
}
result.push({id: parseInt(id), num: parseInt(num)});
}
return result
}
@@ -0,0 +1,56 @@
// 装备升品表
import { readFileAndParse, parseGoodStr, decodeArrayListStr } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicEquipQuality {
// id
readonly id: number;
// 装备id
readonly equipId: number;
// 装备品质
readonly quality: number;
// 装备的武将职业大类
readonly jobClass: number;
// 装备栏id
readonly eplaceId: number;
// 升星的点
readonly point: number;
// 一共有多少点
readonly count: number;
// 消耗
readonly consume: RewardInter[];
// 属性提升
readonly attribute: {id: number, num: number}[];
}
export const dicEquipQuality = new Map<number, DicEquipQuality>();
export const dicEquipQualityIdByEquipIdAndPoint = new Map<string, number>(); // equipId&point => id
export function loadEquipQuality() {
dicEquipQuality.clear();
dicEquipQualityIdByEquipIdAndPoint.clear();
let arr = readFileAndParse(FILENAME.DIC_EQUIP_QUALITY);
arr.forEach(o => {
o.consume = parseGoodStr(o.consume);
o.attribute = parseAttr(o.attribute);
dicEquipQualityIdByEquipIdAndPoint.set(`${o.equipId}_${o.quality}_${o.point}`, o.id);
dicEquipQuality.set(o.id, o);
});
arr = undefined;
}
function parseAttr(str: string) {
let result = new Array<{id: number, num: number}>();
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [id, num] of decodeArr) {
if(isNaN(parseInt(id)) || isNaN(parseInt(num))) {
throw new Error('data table format wrong');
}
result.push({id: parseInt(id), num: parseInt(num)});
}
return result
}
@@ -0,0 +1,29 @@
// 装备升品表
import { readFileAndParse } from '../util'
import { FILENAME } from '../../consts';
export interface DicEquipQualityExtra {
// id
readonly id: number;
// 品质
readonly quality: number;
// 限制星级
readonly star: number;
// 天晶石
readonly jewelCnt: number;
// 地玉石
readonly stoneCnt: number;
}
export const dicEquipQualityExtra = new Map<number, DicEquipQualityExtra>();
export function loadEquipQualityExtra() {
dicEquipQualityExtra.clear();
let arr = readFileAndParse(FILENAME.DIC_EQUIP_QUALITY_EXTRA);
arr.forEach(o => {
dicEquipQualityExtra.set(o.quality, o);
});
arr = undefined;
}
@@ -0,0 +1,74 @@
// 装备升品表
import { readFileAndParse, parseGoodStr, decodeArrayListStr } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicEquipStar {
// id
readonly id: number;
// 装备id
readonly equipId: number;
// 装备星级
readonly star: number;
// 装备的武将职业大类
readonly jobClass: number;
// 装备栏id
readonly eplaceId: number;
// 一共有多少点
readonly count: number;
// 主属性
readonly mainAttr: Map<number, {id: number, num: number}[]>;
// 次级属性
readonly subAttr: {id: number, num: number}[];
// 一次升点消耗
readonly mainConsume: RewardInter[];
// 升星消耗
readonly subConsume: RewardInter[];
}
export const dicEquipStar = new Map<number, DicEquipStar>();
export const dicEquipStarIdByEquipId = new Map<string, number>(); // equipId&point => id
export function loadEquipStar() {
dicEquipStar.clear();
dicEquipStarIdByEquipId.clear();
let arr = readFileAndParse(FILENAME.DIC_EQUIP_STAR);
arr.forEach(o => {
o.mainConsume = parseGoodStr(o.mainConsume);
o.subConsume = parseGoodStr(o.subConsume);
o.mainAttr = parseAttrMap(o.mainAttr);
o.subAttr = parseAttr(o.subAttr);
dicEquipStarIdByEquipId.set(`${o.equipId}_${o.star}`, o.id);
dicEquipStar.set(o.id, o);
});
arr = undefined;
}
function parseAttrMap(str: string) {
let result = new Map<number, {id: number, num: number}[]>();
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let i = 0; i < decodeArr.length; i++) {
let [id, num] = decodeArr[i];
if(isNaN(parseInt(id)) || isNaN(parseInt(num))) {
throw new Error('data table format wrong');
}
result.set(i + 1, [{id: parseInt(id), num: parseInt(num)}]);
}
return result
}
function parseAttr(str: string) {
let result = new Array<{id: number, num: number}>();
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [id, num] of decodeArr) {
if(isNaN(parseInt(id)) || isNaN(parseInt(num))) {
throw new Error('data table format wrong');
}
result.push({id: parseInt(id), num: parseInt(num)});
}
return result
}
@@ -0,0 +1,26 @@
// 装备强化表
import { readFileAndParse, parseGoodStr } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicEquipStrength {
// id
readonly id: number;
// 等级,1级升2级,读2级数据
readonly lv: number;
// 消耗
readonly consume: RewardInter[];
}
export const dicEquipStrength = new Map<number, DicEquipStrength>();
export function loadEquipStrength() {
dicEquipStrength.clear();
let arr = readFileAndParse(FILENAME.DIC_EQUIP_STRENGTH);
arr.forEach(o => {
o.consume = parseGoodStr(o.consume);
dicEquipStrength.set(o.lv, o);
});
arr = undefined;
}
@@ -0,0 +1,43 @@
// 装备套装表
import { readFileAndParse, parseNumberList, decodeArrayListStr } from '../util'
import { FILENAME } from '../../consts'
export interface DicEquipSuit {
// id
readonly id: number;
// 匹配的武将的职业的大类
readonly jobClass: number;
// 套装内含的装备编号
readonly equips: number[];
// 按星级可解锁的属性
readonly effect: { star: number, seid: number }[];
}
export const dicEquipSuit = new Map<number, DicEquipSuit>();
export const dicEquipSuitByJobClass = new Map<number, number>();
export function loadEquipSuit() {
dicEquipSuit.clear();
dicEquipSuitByJobClass.clear();
let arr = readFileAndParse(FILENAME.DIC_EQUIP_SUIT);
arr.forEach(o => {
o.equips = parseNumberList(o.equips);
o.effect = parseEffect(o.effect);
dicEquipSuit.set(o.id, o);
dicEquipSuitByJobClass.set(o.jobClass, o.id);
});
arr = undefined;
}
function parseEffect(str: string) {
let result = new Array<{star: number, seid: number}>();
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [star, seid] of decodeArr) {
if(isNaN(parseInt(star)) || isNaN(parseInt(seid))) {
throw new Error('data table format wrong');
}
result.push({star: parseInt(star), seid: parseInt(seid)});
}
return result
}
@@ -1,28 +0,0 @@
// 开启功能表
import { readFileAndParse } from '../util';
import { FILENAME } from '../../consts';
export interface DicFuncSwitch {
// 功能id
readonly id: number;
// 描述
readonly desc: string;
// 条件
readonly conditionType: number;
// 参数
readonly param: number;
// 客户端指令
readonly script: string;
}
export const dicFuncSwitch = new Map<number, DicFuncSwitch>();
export function loadFuncSwitch() {
dicFuncSwitch.clear();
let arr = readFileAndParse(FILENAME.DIC_FUNC_SWITCH);
arr.forEach(o => {
dicFuncSwitch.set(o.id, o);
});
arr = undefined;
}
+5 -159
View File
@@ -1,69 +1,31 @@
// 物品表
import { decodeArrayListStr, readFileAndParse, parseGoodStr, parseNumberList, decodeArrayStr } from '../util'
import { FILENAME, IT_TYPE, ABI_TYPE, GOOD_TYPE } from '../../consts'
import { decodeArrayListStr, readFileAndParse, parseGoodStr, } from '../util'
import { FILENAME, } from '../../consts'
import { RewardInter } from '../interface';
const _ = require('lodash');
import { findWhere } from 'underscore';
export interface SpecialMaterial {
readonly ids: number[];
readonly count: number;
}
export interface DicGoods {
// 物品id
readonly good_id: number;
// 物品名
readonly name: string;
// 等级限制
readonly lvLimited: number;
// 星级
readonly equipLvl: number;
// 职业限制
readonly jobLimited: number[];
// 武将限制
readonly charLimited: number[];
// 合成装备需要的碎片数
readonly pieces: number;
// 对应的碎片id
readonly pieceId: number;
// 合成材料
readonly composeMaterial: Array<RewardInter>;
// 特殊材料
readonly specialMaterial: SpecialMaterial;
// 分解所得
readonly decomposeItem: Array<RewardInter>;
// 物品品质
readonly quality: number;
// 洞数
readonly hole: number;
// 随机属性范围
readonly randomEffect: Array<number>;
// 类型id
readonly itid: number;
// 物品类型
readonly goodType: number;
// 分解所得
readonly decomposeItem: Array<RewardInter>;
// 将魂对应武将id
readonly hid: number;
// 属性
readonly goodsAbility: Map<number, number>;
// 强化属性
readonly goodsAbilityUp: Map<number, number>;
// 套装id
readonly suitId: number;
// 特殊属性
readonly specialAttr: Map<number, number>;
// 属性外加的值,经验,好感
readonly value: number;
readonly count?: number;
readonly nextJewelId?: number;
readonly specialCount?: number;
readonly nextSpecialId?: number;
// 对应的装备id
readonly equipId?: number;
// 解锁条件
readonly condition: { id: number, type: number, params: number[] }[];
// 时间限制
@@ -78,65 +40,30 @@ type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicGoodsKeys: KeysEnum<DicGoods> = {
good_id: true,
name: true,
lvLimited: true,
pieces: true,
composeMaterial: true,
specialMaterial: true,
decomposeItem: true,
quality: true,
hole: true,
randomEffect: true,
itid: true,
goodType: true,
hid: true,
goodsAbility: true,
goodsAbilityUp: true,
suitId: true,
specialAttr: true,
value: true,
pieceId: true,
count: true,
nextJewelId: true,
specialCount: true,
nextSpecialId: true,
equipId: true,
condition: true,
timeLimit: true,
image_id: true,
gift: true,
jobLimited: true,
charLimited: true,
equipLvl: true
}
export const dicJewel = new Map<number, DicGoods>();
export const dicGoods = new Map<number, DicGoods>();
export const blueprtWithQuality = new Map<number, Array<number>>();
export const blueprtWithQualityAndStar = new Map<string, Array<number>>();
export const figureCondition = new Map<number, { params: number[], id: number, gid: number }[]>(); // type => {params, id, gid}
export function loadGoods() {
dicJewel.clear();
dicGoods.clear();
blueprtWithQuality.clear();
blueprtWithQualityAndStar.clear();
figureCondition.clear();
let arr = readFileAndParse(FILENAME.DIC_GOODS);
arr.forEach(o => {
o.goodsAbility = parseAbility(o);
o.goodsAbilityUp = parseAbilityUp(o);
o.composeMaterial = parseGoodStr(o.composeMaterial);
o.decomposeItem = parseGoodStr(o.decomposeItem);
o.specialAttr = parseSpecialAttr(o.specialAttr);
o.specialMaterial = parseSpecialMaterial(o.specialMaterial);
o.randomEffect = parseNumberList(o.randomEffect);
o.timeLimit = o.timelimit;
if (o.goodType == IT_TYPE.EQUIP_PIECE) {
let good = findWhere(arr, { pieceId: o.good_id });
if (!!good)
o.equipId = good.good_id;
}
let condition = parseConditionStr(o.condition);
for (let { id, type, params } of condition) {
let mapArr = figureCondition.get(type) || new Array<{ params: number[], id: number, gid: number }>();
@@ -144,93 +71,12 @@ export function loadGoods() {
figureCondition.set(type, mapArr);
}
o.condition = condition;
o.jobLimited = parseNumberList(o.jobLimited);
o.charLimited = parseNumberList(o.charLimited);
dicGoods.set(o.good_id, _.pick(o, Object.keys(DicGoodsKeys)));
if (o.itid == IT_TYPE.BLUEPRT) {
let arr = blueprtWithQualityAndStar.get(`${o.quality}_${o.equipLvl}`) || new Array<number>();
arr.push(o.good_id);
blueprtWithQualityAndStar.set(`${o.quality}_${o.equipLvl}`, arr);
let arr2 = blueprtWithQuality.get(o.quality) || new Array<number>();
arr.push(o.good_id);
blueprtWithQuality.set(o.quality, arr2);
} else if (o.goodType == GOOD_TYPE.JEWEL) {
let material = o.composeMaterial[0];
if (!!material && !!material.id) {
let lastJewel = findWhere(arr, { good_id: material.id });
if (!!lastJewel) {
lastJewel.count = material.count;
lastJewel.nextJewelId = o.good_id;
if (!!o.specialMaterial.ids[0]) {
lastJewel.specialCount = o.specialMaterial.count;
lastJewel.nextSpecialId = o.specialMaterial.ids[0];
}
dicJewel.set(lastJewel.good_id, _.pick(lastJewel, Object.keys(DicGoodsKeys)));
}
} else {
dicJewel.set(o.good_id, _.pick(o, Object.keys(DicGoodsKeys)));
}
}
});
arr = undefined;
}
function parseSpecialAttr(str: string) {
let specialAttr = new Map<number, number>();
if (str) {
let decodeArr = decodeArrayListStr(str);
for (let [type, count] of decodeArr) {
if (isNaN(parseInt(type)) || isNaN(parseInt(count))) {
throw new Error('data table format wrong');
}
specialAttr.set(parseInt(type), parseInt(count));
}
}
return specialAttr;
}
function parseAbility(json) {
let map = new Map<number, number>();
map.set(ABI_TYPE.ABI_HP, json.hp || 0);
map.set(ABI_TYPE.ABI_ATK, json.atk || 0);
map.set(ABI_TYPE.ABI_DEF, json.def || 0);
map.set(ABI_TYPE.ABI_MDEF, json.mdef || 0);
map.set(ABI_TYPE.ABI_DAMAGE_INCREASE, json.damageIncrease || 0);
map.set(ABI_TYPE.ABI_DAMAGE_DECREASE, json.damageDecrease || 0);
map.set(ABI_TYPE.ABI_PHYSICAL_DAMAGE_DECREASE, json.atkDecrease || 0);
map.set(ABI_TYPE.ABI_MAGIC_DAMAGE_DECREASE, json.matkDecrease || 0);
return map
}
function parseAbilityUp(json) {
let map = new Map<number, number>();
map.set(ABI_TYPE.ABI_HP, json.hp_up || 0);
map.set(ABI_TYPE.ABI_ATK, json.atk_up || 0);
map.set(ABI_TYPE.ABI_DEF, json.def_up || 0);
map.set(ABI_TYPE.ABI_MDEF, json.mdef_up || 0);
map.set(ABI_TYPE.ABI_DAMAGE_INCREASE, json.damageIncrease_up || 0);
map.set(ABI_TYPE.ABI_DAMAGE_DECREASE, json.damageDecrease_up || 0);
return map
}
function parseSpecialMaterial(str: string) {
let specialAttr = { ids: new Array<number>(), count: 0 }
if (!str) return specialAttr;
let decodeArr = decodeArrayStr(str);
if (decodeArr.length >= 2) {
let ids = parseNumberList(decodeArr[0]);
let count = parseInt(decodeArr[1]);
if (isNaN(count)) return specialAttr;
specialAttr.ids = ids;
specialAttr.count = count;
}
return specialAttr;
}
// 解析物品 {"type": number, "param": number} 格式
export function parseConditionStr(str: string) {
let result = new Array<{ id: number, type: number, params: number[] }>();
@@ -8,8 +8,6 @@ export interface DicGuildWishReward {
readonly id: number;
// itid
readonly itid: number;
// 装备星级
readonly starLevel: number;
// 品质
readonly quality: number;
// 功勋奖励
@@ -24,7 +22,7 @@ export function loadGuildWishReward() {
arr.forEach(o => {
if(o.starLevel == '&') o.starLevel = 0;
dicGuildWishReward.set(`${o.itid}_${o.starLevel}_${o.quality}`, o);
dicGuildWishReward.set(`${o.itid}_${o.quality}`, o);
});
arr = undefined;
}
-5
View File
@@ -37,17 +37,12 @@ export interface DicHero {
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicHeroKeys: KeysEnum<DicHero> = {heroId: true, name: true, quality: true, camp: true, jobClass: true, jobid: true, skill: true, pieceId: true, initialStars: true, pieceCount: true, baseAbilityArr: true, baseAbilityUpArr: true, initialSkin: true, recruit: true, face_id: true};
export const dicMyHeroes = new Array<number>();
export const dicHero = new Map<number, DicHero>();
export function loadHero() {
dicMyHeroes.splice(0, dicMyHeroes.length);
dicHero.clear();
let arr = readFileAndParse(FILENAME.DIC_HERO);
arr.forEach(o => {
if(o.heroId > 0 && o.heroId <= 300) {
dicMyHeroes.push(o.heroId);
}
o.baseAbilityArr = parseBaseAbilityArr(o);
o.baseAbilityUpArr = parseBaseAbilityUpArr(o);
o.recruit = parseInt(o.recruit) == 1;
@@ -1,27 +0,0 @@
// 藏宝图合成表
import { readFileAndParse, parseNumberList } from '../util'
import { FILENAME } from '../../consts'
const _ = require('lodash');
export interface DicHeroEquip {
readonly itId: number;
readonly classId: Array<number>;
}
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicHeroEquipKeys: KeysEnum<DicHeroEquip> = {
itId: true,
classId: true
}
export const dicHeroEquip = new Map<number, DicHeroEquip>();
export function loadHeroEquip() {
dicHeroEquip.clear();
let arr = readFileAndParse(FILENAME.DIC_HERO_EQUIP);
arr.forEach(o => {
o.classId = parseNumberList(o.classId);
dicHeroEquip.set(o.itId, _.pick(o, Object.keys(DicHeroEquipKeys)));
});
arr = undefined;
}
+50
View File
@@ -0,0 +1,50 @@
// 天晶石表
import { readFileAndParse, parseGoodStr, parseNumberList } from '../util'
import { FILENAME } from '../../consts';
import { RewardInter } from '../interface';
export interface DicJewel {
// 物品id
readonly good_id: number;
// 天晶石名
readonly name: string;
// 装备栏id
readonly eplaceId: number;
// itid
readonly itid: number;
// 天晶石阶
readonly lv: number;
// 天晶石品质
readonly quality: number;
// 天晶石属性条数
readonly effectCount: number;
// 套装效果
readonly randomEffect: number[];
// 对应藏宝图id
readonly mapGoodId: number;
// 淬炼消耗
readonly quenchConsume: RewardInter[];
// 寻宝关卡id
readonly gkId: number;
}
export const dicJewel = new Map<number, DicJewel>();
export const dicBlueprt = new Map<number, number>();
export const dicBlueprtByLv = new Map<number, number[]>();
export function loadJewel() {
dicJewel.clear();
let arr = readFileAndParse(FILENAME.DIC_JEWEL);
arr.forEach(o => {
o.randomEffect = parseNumberList(o.randomEffect);
o.quenchConsume = parseGoodStr(o.quenchConsume);
dicJewel.set(o.good_id, o);
dicBlueprt.set(o.mapGoodId, o.good_id);
if(!dicBlueprtByLv.has(o.lv)) {
dicBlueprtByLv.set(o.lv, []);
}
dicBlueprtByLv.get(o.lv).push(o.mapGoodId);
});
arr = undefined;
}
@@ -0,0 +1,29 @@
// 天晶石表
import { readFileAndParse } from '../util'
import { FILENAME } from '../../consts';
export interface DicJewelCondition {
// id
readonly id: number;
// 天晶石品质
readonly jewelLv: number;
// 属性词条id
readonly randSeId: number;
// 需要的地玉石的数量
readonly stoneCnt: number;
// 需要的地玉石的品质之和
readonly stoneLv: number;
}
export const dicJewelCondition = new Map<string, DicJewelCondition>();
export function loadJewelCondition() {
dicJewelCondition.clear();
let arr = readFileAndParse(FILENAME.DIC_JEWEL_CONDITION);
arr.forEach(o => {
dicJewelCondition.set(`${o.jewelLv}_${o.randSeId}`, o);
});
arr = undefined;
}
@@ -1,27 +0,0 @@
import { readFileAndParse, parseGoodStr } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicQuenchConsume {
// id
readonly id: number;
// 等级
readonly equipLvl: number;
// 品质
readonly quality: number;
// 淬火一次的消耗
readonly unitConsume: RewardInter[];
}
export const dicQuenchConsume = new Map<string, RewardInter[]>(); // equipLvl&quality => dic
export function loadQuenchConsume() {
dicQuenchConsume.clear();
let arr = readFileAndParse(FILENAME.DIC_QUENCH_CONSUME);
arr.forEach(o => {
o.unitConsume = parseGoodStr(o.unitconsume);
dicQuenchConsume.set(`${o.equipLvl}_${o.quality}`, o.unitConsume);
});
arr = undefined;
}
@@ -1,63 +0,0 @@
import { readFileAndParse } from '../util'
import { FILENAME } from '../../consts'
export interface DicQuenchQuality {
// id
readonly id: number;
// 装备品质
readonly quality: number;
// 品相
readonly grade: number;
// 单属性最小值
readonly singleRatioMin: number;
// 单属性最大值
readonly singleRatioMax: number;
// 初始是否可以随机出
readonly initialAvailable: number;
// 暴击率
readonly critProbability: number;
// 暴击效果
readonly critEffect: number;
}
export const dicQuenchRangeByQualityAndGrade = new Map<string, { min: number, max: number, randMin: number, randMax: number }>();
export const dicQuenchRangeByQuality = new Map<number, { min: number, max: number, randMin: number, randMax: number }>(); // quality => {}
export const dicQuenchByQuality = new Map<number, Map<number, DicQuenchQuality>>(); // quality => grade => dic
export function loadQuenchQuality() {
dicQuenchByQuality.clear();
dicQuenchRangeByQuality.clear();
dicQuenchRangeByQualityAndGrade.clear();
let arr = readFileAndParse(FILENAME.DIC_QUENCH_QUALITY);
arr.forEach(o => {
if(o.initialAvailable == 1) {
}
if(!dicQuenchRangeByQuality.has(o.quality)) {
dicQuenchRangeByQuality.set(o.quality, { min: o.singleRatioMin, max: o.singleRatioMax, randMin: o.singleRatioMin, randMax: o.singleRatioMax });
} else {
if(o.singleRatioMin < dicQuenchRangeByQuality.get(o.quality).min) {
dicQuenchRangeByQuality.get(o.quality).min = o.singleRatioMin;
}
if(o.singleRatioMax > dicQuenchRangeByQuality.get(o.quality).max) {
dicQuenchRangeByQuality.get(o.quality).max = o.singleRatioMax;
}
if(o.singleRatioMin < dicQuenchRangeByQuality.get(o.quality).randMin && o.initialAvailable == 1) {
dicQuenchRangeByQuality.get(o.quality).randMin = o.singleRatioMin;
}
if(o.singleRatioMax > dicQuenchRangeByQuality.get(o.quality).randMax && o.initialAvailable == 1) {
dicQuenchRangeByQuality.get(o.quality).randMax = o.singleRatioMax;
}
}
dicQuenchRangeByQualityAndGrade.set(`${o.quality}_${o.grade}`, { min: o.singleRatioMin, max: o.singleRatioMax, randMin: o.singleRatioMin, randMax: o.singleRatioMax });
if(!dicQuenchByQuality.has(o.quality)) {
dicQuenchByQuality.set(o.quality, new Map<number, DicQuenchQuality>());
}
dicQuenchByQuality.get(o.quality).set(o.grade, o);
});
arr = undefined;
}
@@ -1,5 +1,5 @@
// 武将特技表
import { readFileAndParse, parseNumberList } from '../util'
import { readFileAndParse, decodeArrayListStr, parseNumberList } from '../util'
import { FILENAME } from '../../consts'
export interface DicRandomEffectPool {
@@ -16,6 +16,10 @@ export interface DicRandomEffectPool {
readonly Min: number;
// 随机最大值
readonly Max: number;
// 分割
readonly gap: number;
// 分割
readonly rate: {min: number, max: number, weight: number}[];
}
@@ -26,8 +30,23 @@ export function loadRandomEffectPool() {
let arr = readFileAndParse(FILENAME.DIC_RANDOM_EFFECT_POOL);
arr.forEach(o => {
o.gainValueArr = parseNumberList(o.gainValue)
o.rate = parseRate(o.count);
o.gainValueArr = parseNumberList(o.gainvalue);
dicRandomEffectPool.set(o.id, o);
});
arr = undefined;
}
function parseRate(str: string) {
let result: {min: number, max: number, weight: number}[] = [];
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [min, max, weight] of decodeArr) {
if(isNaN(parseInt(min)) || isNaN(parseInt(max)) || isNaN(parseInt(weight))) {
throw new Error('data table format wrong');
}
result.push({min: parseInt(min), max: parseInt(max), weight: parseInt(weight) });
}
return result
}
-34
View File
@@ -1,34 +0,0 @@
// 武将特技表
import { readFileAndParse, parseGoodStr } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicRefine {
// 精炼id
readonly id: number;
// 精炼等级
readonly level: number;
// 精炼次数
readonly count: number;
// 等级限制
readonly levelLimited: number;
// 提高属性百分比
readonly upPercent: number;
// 材料
readonly consume: Array<RewardInter>;
}
export const dicRefine = new Map<number, DicRefine>();
export function loadRefine() {
dicRefine.clear();
let arr = readFileAndParse(FILENAME.DIC_REFINE);
arr.forEach(o => {
o.consume = parseGoodStr(o.consume)
dicRefine.set(o.id, o);
});
arr = undefined;
}
+51
View File
@@ -0,0 +1,51 @@
// 地玉石表
import { readFileAndParse, parseGoodStr, decodeArrayListStr } from '../util'
import { FILENAME } from '../../consts';
import { RewardInter } from '../interface';
export interface DicStone {
// 物品id
readonly good_id: number;
// 地玉石名
readonly name: string;
// 装备栏id
readonly eplaceId: number;
// itid
readonly itid: number;
// 地玉石阶
readonly lv: number;
// 地玉石品质
readonly quality: number;
// 合成消耗
readonly composeMaterial: RewardInter[];
// 属性提升
readonly attribute: {id: number, num: number}[];
}
export const dicStone = new Map<number, DicStone>();
export function loadStone() {
dicStone.clear();
let arr = readFileAndParse(FILENAME.DIC_STONE);
arr.forEach(o => {
o.composeMaterial = parseGoodStr(o.composeMaterial);
o.attribute = parseAttr(o.attribute);
dicStone.set(o.good_id, o);
});
arr = undefined;
}
function parseAttr(str: string) {
let result = new Array<{id: number, num: number}>();
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [id, num] of decodeArr) {
if(isNaN(parseInt(id)) || isNaN(parseInt(num))) {
throw new Error('data table format wrong');
}
result.push({id: parseInt(id), num: parseInt(num)});
}
return result
}
@@ -1,22 +0,0 @@
// 强化消耗表
import {readFileAndParse} from '../util'
import { FILENAME } from '../../consts'
export interface DicStrengthenCost {
// 等级
readonly level: number;
// 消耗铜钱
readonly costCoin: number;
}
export const dicStrengthenCost = new Map<number, number>();
export function loadStrengthenCost() {
dicStrengthenCost.clear();
let arr = readFileAndParse(FILENAME.DIC_STRENGTHEN_COST);
arr.forEach(o => {
dicStrengthenCost.set(o.level, o.costCoin);
});
arr = undefined;
}
+10 -10
View File
@@ -30,17 +30,17 @@ export interface DicEquipProduceBase {
readonly id: number;
// 等级
readonly level: number;
// 可以研发的品质
readonly quality: number;
// 开启炼器及研发等级
readonly levelProduce: number;
// 可研发的碎片的品质
readonly qualityProduce: number[];
readonly levelProduce: number[];
}
const DicEquipProduceKeys: KeysEnum<DicEquipProduceBase> = {
id: true,
level: true,
quality: true,
levelProduce: true,
qualityProduce: true
};
// 演武台
@@ -130,7 +130,7 @@ export interface DicWishPoolBase {
readonly id: number;
// 等级
readonly level: number;
readonly wishGoodsEquips: Array<{quality: number, count: number}>;
readonly wishgoodsDrawings: Array<{quality: number, count: number}>;
readonly wishGoodsHeros: Array<{quality: number, count: number}>;
readonly consume: number;
}
@@ -138,7 +138,7 @@ export interface DicWishPoolBase {
const DicWishPoolKeys: KeysEnum<DicWishPoolBase> = {
id: true,
level: true,
wishGoodsEquips: true,
wishgoodsDrawings: true,
wishGoodsHeros: true,
consume: true,
};
@@ -194,7 +194,7 @@ export function loadStructure() {
let arrEquip = readFileAndParse(FILENAME.DIC_GUILD_EQUIP_PRODUCE_BASE);
arrEquip.forEach(o => {
setStructureConsume(o);
o.qualityProduce = parseNumberList(o.qualityProduce);
o.levelProduce = parseNumberList(o.levelProduce);
dicEquipPriduceBase.set(o.level, _.pick(o, Object.keys(DicEquipProduceKeys)));
});
arrEquip = undefined;
@@ -239,9 +239,9 @@ export function loadStructure() {
let arrWishPool = readFileAndParse(FILENAME.DIC_GUILD_WISH_POOL_BASE);
arrWishPool.forEach(o => {
setStructureConsume(o);
o.wishGoodsEquips = o.wishgoodsEquip.split('|').map(wishGoodsEquip=>{
let wishGoodsEquips = wishGoodsEquip.split('&');
return {quality: parseInt(wishGoodsEquips[0]), count: parseInt(wishGoodsEquips[1])};
o.wishgoodsDrawings = o.wishgoodsDrawing.split('|').map(wishgoodsDrawing=>{
let wishgoodsDrawings = wishgoodsDrawing.split('&');
return {quality: parseInt(wishgoodsDrawings[0]), count: parseInt(wishgoodsDrawings[1])};
});
o.wishGoodsHeros = o.wishgoodsHero.split('|').map(wishGoodsHero=>{
let wishGoodsHeros = wishGoodsHero.split('&');
-50
View File
@@ -1,50 +0,0 @@
// 镇念塔表
import { decodeArrayListStr, readFileAndParse, parseNumberList } from '../util'
import { FILENAME } from '../../consts';
export interface DicSuit {
// 套装id
readonly id: number;
// 套装类型,相同suitType效果可跨级用
readonly suitType: number;
// 星级,相同suitType starLevel较高的套装可覆盖较低的效果
readonly starLevel: number;
// 包含关卡
readonly name: string;
// 总件数
readonly totalCount: number;
// 套装效果
readonly effect: Array<{ count: number, seid: number }>;
readonly tireInfo: Array<number>;
}
export const dicSuit = new Map<number, DicSuit>();
export const dicSuitByTypeAndLv = new Map<string, DicSuit>();
export function loadSuit() {
dicSuit.clear();
dicSuitByTypeAndLv.clear();
let arr = readFileAndParse(FILENAME.DIC_SUIT);
arr.forEach(o => {
o.effect = parseSuitEffect(o.effect);
o.tireInfo = parseNumberList(o.tireInfo);
dicSuit.set(o.id, o);
dicSuitByTypeAndLv.set(`${o.suitType}_${o.starLevel}`, o);
});
arr = undefined;
}
function parseSuitEffect(str: string) {
let result = new Array<{ count: number, seid: number }>();
if (!str) return result;
let decodeArr = decodeArrayListStr(str);
for (let [count, seid] of decodeArr) {
if (isNaN(parseInt(count)) || isNaN(parseFloat(seid))) {
throw new Error('data table format wrong');
}
result.push({ count: parseInt(count), seid: parseFloat(seid) });
}
return result
}
+44 -61
View File
@@ -2,20 +2,19 @@
import { HeroModel, HeroType, } from '../db/Hero';
import { ItemModel } from '../db/Item';
import { EquipModel, RandSe, Holes, RandMain, equipUpdate } from './../db/Equip';
import { gameData, getQuenchByQualityAndGrade, getQuenchGradeByValue } from './data';
import { RANDOM_SE_COUNT, ITID, CURRENCY_BY_TYPE, CURRENCY_TYPE, ROLE_SELECT, FIGURE_UNLOCK_CONDITION, CONSUME_TYPE, HERO_SYSTEM_TYPE, TASK_TYPE, ITEM_CHANGE_REASON } from '../consts';
import { getRandValueByMinMax, getRandEelm } from './util';
import { gameData } from './data';
import { ITID, CURRENCY_BY_TYPE, CURRENCY_TYPE, ROLE_SELECT, FIGURE_UNLOCK_CONDITION, CONSUME_TYPE, HERO_SYSTEM_TYPE, ITEM_CHANGE_REASON } from '../consts';
import { getRandValueByMinMax, getRandEelm, getRandEelmWithWeight, getDecimalCnt } from './util';
import { findWhere } from 'underscore';
import { RoleModel, RoleType, } from '../db/Role';
import { Figure } from '../domain/dbGeneral';
import { getTimeFun } from './timeUtil';
import { reCalAllHeroCe } from './playerCe';
import { checkTaskWithEquip } from './taskUtil';
// import { checkTask, checkTaskWithHeroes, checkTaskWithEquip, accomplishTask } from './taskUtil';
import { SkinModel, } from '../db/Skin';
import { TaskListReturn } from '../domain/roleField/task';
import { JewelModel, jewelUpdate, RandSe, } from '../db/Jewel';
/**
* 只插入皮肤,不管那么多的
@@ -80,76 +79,60 @@ export async function addBag(roleId: string, roleName: string, data: { id: numbe
}
export async function addEquips(roleId: string, roleName: string, weapons: { id: number, hid?: number }[], reason: number) {
let equipInfos: equipUpdate[] = [];
for(let weapon of weapons) {
let info = await getAddEquipInfo(roleId, roleName, weapon);
equipInfos.push(info);
export async function addJewels(roleId: string, roleName: string, jewels: { id: number, }[], reason: number) {
let jewelInfo: jewelUpdate[] = [];
for(let jewel of jewels) {
let info = await getAddJewelInfo(roleId, roleName, jewel);
jewelInfo.push(info);
}
const equips = await EquipModel.createEquips(roleId, equipInfos);
const jewelResult = await JewelModel.createJewels(roleId, jewelInfo);
let pushMessages: TaskListReturn[] = [];
// 任务
for(let equip of equips) {
let pushMessage = await checkTaskWithEquip(roleId, TASK_TYPE.EQUIP_SUIT, equip);
if(reason == ITEM_CHANGE_REASON.EQUIP_COMPOSE) {
let pm = await checkTaskWithEquip(roleId, TASK_TYPE.EQUIP_COMPOSE_SUIT, equip);
pushMessages.push(...pm);
}
pushMessages.push(...pushMessage);
}
// TODO 修改任务
// for(let equip of jewelResult) {
// let pushMessage = await checkTaskWithEquip(roleId, TASK_TYPE.EQUIP_SUIT, equip);
// if(reason == ITEM_CHANGE_REASON.EQUIP_COMPOSE) {
// let pm = await checkTaskWithEquip(roleId, TASK_TYPE.EQUIP_COMPOSE_SUIT, equip);
// pushMessages.push(...pm);
// }
// pushMessages.push(...pushMessage);
// }
return { equips: equips.map(equip => {
return { ...equip, inc: 1, reason }
return { jewels: jewelResult.map(jewel => {
return { ...jewel, count: 1, inc: 1, reason }
}), pushMessages }
}
export async function getAddEquipInfo(roleId: string, roleName: string, weapon: { id: number, hid?: number }) {
let { id, hid = 0 } = weapon;
let { name, quality, suitId, hole, randomEffect, itid, goodsAbility } = gameData.goods.get(id);
let { type } = ITID.get(itid);
export async function getAddJewelInfo(roleId: string, roleName: string, jewel: { id: number, }) {
let { id, } = jewel;
let { name, randomEffect, effectCount } = gameData.jewel.get(id);
// 随机属性
let randomNum = RANDOM_SE_COUNT.get(quality);
let randomResult: number[] = getRandEelm(randomEffect, randomNum);
let randomResult: number[] = getRandEelm(randomEffect, effectCount);
let randSe: Array<RandSe> = randomResult.map((id: number, i: number) => {
let random = gameData.randomEffectPool.get(id)
let rand = 0;
if (random.id > 0) rand = getRandValueByMinMax(random.Min, random.Max, 0);
return {
id: i + 1,
seid: random.id,
rand,
locked: false
};
let randSe: Array<RandSe> = randomResult.map((id: number, index: number) => {
return getJewelRandSe(index + 1, id);
});
let randRange = 0;
return { roleId, roleName, id, name, randSe };
}
// 淬火品相
let randMain: RandMain[] = [];
let grade = 0;
for(let [ attrId, attrValue ] of goodsAbility) {
if(attrValue > 0) {
let { randMin, randMax } = getQuenchByQualityAndGrade(quality, grade);
let rand = getRandValueByMinMax(randMin, randMax, 0);
// console.log(quality, grade, rand)
grade = getQuenchGradeByValue(quality, rand);
randMain.push({
id: attrId,
rand
});
}
/**
* 天晶石已知词条随机值
* @param id 词条位置,第几条
* @param seid 词条id
* @returns
*/
export function getJewelRandSe(id: number, seid: number) {
let dicRandom = gameData.randomEffectPool.get(seid)
let rand = 0;
if (dicRandom.id > 0) {
let randRange = getRandEelmWithWeight(dicRandom.rate);
let randResult = getRandValueByMinMax(randRange.dic.min, randRange.dic.max, getDecimalCnt(dicRandom.gap));
let n = Math.floor((randResult - dicRandom.Min)/dicRandom.gap);
rand = dicRandom.Min + n * dicRandom.gap;
}
let holes = new Array<Holes>();
for (let i = 0; i < hole; i++) {
holes.push({ id: i + 1, isOpen: false, jewel: 0 });
}
return { roleId, roleName, id, name, quality, suitId, randRange, ePlaceId: type, randSe, holes, hid, grade, randMain };
return new RandSe(id, dicRandom.id, rand);
}
/**
+182 -210
View File
@@ -5,13 +5,12 @@
import { HERO_SYSTEM_TYPE, ABI_TYPE, HERO_CE_RATIO, LINEUP_NUM } from '../consts';
import { cal, deepCopy, getAllAttrStage, reduceCe } from './util';
import { HeroModel, HeroType, HeroUpdate, CeAttrData } from '../db/Hero';
import { HeroModel, HeroType, HeroUpdate, CeAttrData, EPlace, Stone } from '../db/Hero';
import { RoleModel, RoleType, RoleUpdate, CeAttrDataRole } from '../db/Role';
import { AttributeCal } from '../domain/roleField/attribute';
import { ABI_STAGE, SEID_TYPE } from '../consts';
import { gameData, getJobByGradeAndClass, getHeroWakeByQuality, getHeroStarByQuality, getFriendShipById, getSchoolRateByStar, getScollByStar, getTeraph, getDicSuitByTypeAndLv } from './data';
import { gameData, getJobByGradeAndClass, getHeroWakeByQuality, getHeroStarByQuality, getFriendShipById, getSchoolRateByStar, getScollByStar, getTeraph, getEquipQualityIdByEquipIdAndPoint, getEquipStarIdByEquipId, getEquipSuitByHero, getEquipStarMainAttrByStage, getJewelConditionByLvAndSeId } from './data';
import { DicSe } from './dictionary/DicSe';
import { EquipType } from '../db/Equip';
import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
import { SchoolModel } from '../db/School';
import { ABI_TYPE_MAIN, ABI_JOB_STAGE, ABI_STAGE_TO_TYPE } from '../consts/constModules/abilityConst'
@@ -19,16 +18,16 @@ import { PvpDefenseModel } from '../db/PvpDefense';
import { findIndex } from 'underscore';
import { GuildModel } from '../db/Guild';
import { DicJob } from './dictionary/DicJob';
import { DicSuit } from './dictionary/DicSuit';
import { saveCeChangeLog } from './logUtil';
import { JewelType } from '../db/Jewel';
// 修改并下发战力
export async function calPlayerCeAndSave(type: number, roleId: string, originHero: HeroType, update: HeroUpdate, args?: Array<number>) {
export async function calPlayerCeAndSave(type: number, roleId: string, originHero: HeroType, update: HeroUpdate, args?: Array<number>, params?: any) {
let role = await RoleModel.findByRoleId(roleId);
let { attr: roleAttrs = [], serverId } = role;
let heroAttrs = calPlayerCe(originHero, update, type, args); // 根据操作计算attr的增加
let heroAttrs = await calPlayerCe(originHero, update, type, args, params); // 根据操作计算attr的增加
let newAttr = new AttributeCal();
newAttr.setLv(update.lv||originHero.lv);
@@ -138,7 +137,7 @@ async function reCalRoleAttr(type: number, heros: Array<HeroType>, role: RoleTyp
}
// 计算单个武将战力
export function calPlayerCe(hero: HeroType, update: HeroUpdate, type: number, args: Array<number> = []) {
export async function calPlayerCe(hero: HeroType, update: HeroUpdate, type: number, args: Array<number> = [], params) {
let heroAttrs: CeAttrData[] = []; // {"hp": {"base": number, "fixUp": number, "ratioUp": number}}
let addSeidList = new Array<number>();
@@ -166,20 +165,27 @@ export function calPlayerCe(hero: HeroType, update: HeroUpdate, type: number, ar
case HERO_SYSTEM_TYPE.CONNECT:
heroAttrs = calHeroConectIncAttr(hero, update, args[0]);
break;
case HERO_SYSTEM_TYPE.EQUIP:
heroAttrs = calEquipPutOnOffIncAttr(hero, args, addSeidList, removeSeidList);
case HERO_SYSTEM_TYPE.COMPOSE_EQUIP:
heroAttrs = calComposeEquipIncAttr(hero, update, args[0]);
break;
case HERO_SYSTEM_TYPE.EQUIP_BASE:
heroAttrs = calHeroEquipIncAttr(hero);
case HERO_SYSTEM_TYPE.EQUIP_STRENGTH:
heroAttrs = calEquipStrengthIncAttr(hero, update, args);
break;
case HERO_SYSTEM_TYPE.RESTRENGTHEN:
heroAttrs = calRestrengthenIncAttr(hero, args.shift(), args, addSeidList, removeSeidList);
case HERO_SYSTEM_TYPE.EQUIP_QUALITY:
heroAttrs = calEquipQualityIncAttr(hero, update, args);
break;
case HERO_SYSTEM_TYPE.JEWEL_ON:
heroAttrs = calHeroCeWhenJewelOnOrOff(hero, args[0], args[1]);
case HERO_SYSTEM_TYPE.EQUIP_STAR:
heroAttrs = calEquipStarIncAttr(hero, update, args, addSeidList, removeSeidList);
break;
case HERO_SYSTEM_TYPE.JEWEL_OFF:
heroAttrs = calHeroCeWhenJewelOnOrOff(hero, 0, args[0]);
case HERO_SYSTEM_TYPE.EQUIP_JEWEL:
heroAttrs = calEquipPutOnOrOffJewelIncAttr(hero, update, args, params, addSeidList, removeSeidList);
break;
case HERO_SYSTEM_TYPE.EQUIP_STONE:
heroAttrs = calEquipPutOnOrOffStoneIncAttr(hero, update, args, params, addSeidList, removeSeidList);
break;
case HERO_SYSTEM_TYPE.JEWEL_RESET_RANDSE:
case HERO_SYSTEM_TYPE.JEWEL_QUENCH:
heroAttrs = calJewelResetRandSeIncAttr(hero, args, params, addSeidList, removeSeidList);
break;
case HERO_SYSTEM_TYPE.SCROLL:
heroAttrs = calHeroCeScrollIncAttr(hero, update);
@@ -603,183 +609,175 @@ export function calHeroFavourUpIncAttr(originHero: HeroType, update: HeroUpdate)
return heroAttrs;
}
/**
* 穿脱, removeSeidList原来身上穿着的所有装备的seid,包括套装的
* @param {HeroType} hero 武将
* @param {number[]} seids args 原来穿着的装备的seid
* @param {number[]} addSeidList 用于更新被动
* @param {number[]} removeSeidList 用于更新被动
*/
export function calEquipPutOnOffIncAttr(hero: HeroType, seids: Array<number>, addSeidList: Array<number>, removeSeidList: Array<number>) {
// 计算身上所有装备的战力值(特技相关以外)
let heroAttrs = calHeroEquipIncAttr(hero);
// 计算被动技能
let resultSeid = calEquipSeids(hero);
for(let seid of resultSeid) {
addSeidList.push(seid);
}
for (let seid of seids) {
removeSeidList.push(seid)
}
return heroAttrs
}
/**
* 计算一个武将身上的所有被动seid
* @param {HeroType} hero 武将,equip需要populate
*/
export function calEquipSeids(hero: HeroType) {
let seids: number[] = [];
// 计算被动技能
let { ePlace } = hero;
let suits = new Map<number, Map<number, { dic: DicSuit, count: number }>>(); // suitType => starLevel => DicSuit
for (let { equip } of ePlace) {
if (equip) {
let e = <EquipType>equip;
if (!!e.randSe) {
for (let { seid, rand } of e.randSe) {
seids.push(seid, rand);
}
}
if (e.suitId > 0) {
let { suitType, starLevel } = gameData.suit.get(e.suitId);
if (!suits.has(suitType)) {
suits.set(suitType, new Map<number, { dic: DicSuit, count: number }>());
}
for(let lv = 1; lv <= starLevel; lv++) {
let dicSuit = getDicSuitByTypeAndLv(suitType, lv); // 计算同type的低阶套装
if(dicSuit) {
if(!suits.get(suitType).has(lv)) {
suits.get(suitType).set(lv, { dic: dicSuit, count: 0 });
}
suits.get(suitType).get(lv).count ++;
}
}
}
export function calComposeEquipIncAttr(hero: HeroType, update: HeroUpdate, eplaceId: number) {
let { attr: heroAttrs } = hero;
let newEquip = update.ePlace.find(cur => cur.id == eplaceId);
if(newEquip) {
let dicEquip = gameData.equipById.get(newEquip.equipId);
for(let attr of dicEquip.attribute) {
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: attr.num * HERO_CE_RATIO } });
}
}
for(let [ _suitType, map ] of suits) {
let effectSeid = new Map<number, { starLevel: number, seid: number }>(); // count => { starLevel, seid }
for(let [ starLevel, { dic: { effect }, count } ] of map) {
for(let { count: effectCount, seid} of effect) {
if(count >= effectCount ) { // 生效
if(!effectSeid.has(effectCount) || effectSeid.get(effectCount).starLevel < starLevel) { // 没有同数量效果
effectSeid.set(effectCount, { starLevel, seid });
}
}
}
}
for(let [_count, { seid }] of effectSeid) {
seids.push(seid, 0);
}
}
return seids;
}
/**
* 装备,装备栏升级,装备精炼等涉及到值的
* @param {HeroType} hero 装备更新过的武将
*/
export function calHeroEquipIncAttr(hero: HeroType) {
let { ePlace, attr: heroAttrs } = hero;
let setMap = new Map<number, number>();
for (let { equip, lv, refineLv } of ePlace) {
if (equip) {
let e = <EquipType>equip;
let dicGoods = gameData.goods.get(e.id);
let { goodsAbility, goodsAbilityUp } = dicGoods;
let dicRefine = gameData.refine.get(refineLv);
let jewel = new Map<number, number>();
for (let { jewel: jewelId } of e.holes) {
if (jewelId > 0) {
let g = gameData.goods.get(jewelId);
if (g) {
let jGoods = g.goodsAbility;
jGoods.forEach((value, key) => {
if (!jewel.has(key)) {
jewel.set(key, value);
} else {
jewel.set(key, jewel.get(key) + value);
}
})
}
}
}
let randMainMap = new Map<number, number>();
for(let {id, rand} of (e.randMain||[])) {
randMainMap.set(id, rand);
}
for (let i = ABI_TYPE.ABI_HP; i < ABI_TYPE.ABI_MAX; i++) {
// console.log('***', i);
let value1 = goodsAbility.get(i) || 0 * (HERO_CE_RATIO + e.randRange);
// console.log('基础值', value1);
let valueup = goodsAbilityUp.get(i) || 0;
// console.log('成长', lv, valueup);
let valueRefine = dicRefine ? dicRefine.upPercent : 0;
// console.log('精炼', dicRefine?dicRefine.upPercent:0 );
let valueJewel = jewel.get(i) || 0;
// console.log('宝石', valueJewel);
let valueGrade = randMainMap.get(i)||0;
// console.log('品相', valueGrade)
let attr = (value1 + lv * valueup) * valueGrade * (HERO_CE_RATIO + valueRefine) + valueJewel * HERO_CE_RATIO * HERO_CE_RATIO;
if(attr >= 0) {
// console.log('装备战力:', i, attr);
if(setMap.has(i)) {
setMap.set(i, setMap.get(i) + Math.floor(attr / HERO_CE_RATIO));
} else {
setMap.set(i, Math.floor(attr / HERO_CE_RATIO));
}
}
}
}
}
for (let i = ABI_TYPE.ABI_HP; i < ABI_TYPE.ABI_MAX; i++) {
let attr = setMap.get(i)||0;
updateHeroAttr(heroAttrs, i, { set: { equipUp: attr } })
}
hero.attr = heroAttrs;
return heroAttrs;
}
/**
* 洗炼
* @param {HeroType} hero 更新过的武将
* @param {number} ePaceId 更新的栏位id
* @param {number[]} seids 移除的seid
* @param {number[]} addSeidList 用于更新被动
* @param {number[]} removeSeidList 用于更新被动
*/
export function calRestrengthenIncAttr(hero: HeroType, ePaceId: number, seids: Array<number>, addSeidList: Array<number>, removeSeidList: Array<number>) {
export function calEquipStrengthIncAttr(hero: HeroType, update: HeroUpdate, eplaceIds: number[]) {
let { attr: heroAttrs, ePlace: oldEplace } = hero;
let { ePlace: newEplace } = update;
for(let eplaceId of eplaceIds) {
let oldEquip = oldEplace.find(cur => cur.id == eplaceId);
let newEquip = newEplace.find(cur => cur.id == eplaceId);
if(newEquip && oldEquip) {
let dicEquip = gameData.equipById.get(oldEquip.equipId);
for(let attr of dicEquip.attributeUp) {
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: attr.num * (newEquip.lv - oldEquip.lv) * HERO_CE_RATIO } });
}
}
}
return heroAttrs
}
let { attr: heroAttrs } = hero;
let { ePlace } = hero;
export function calEquipQualityIncAttr(hero: HeroType, update: HeroUpdate, eplaceIds: number[]) {
let { attr: heroAttrs, ePlace: oldEplace } = hero;
let { ePlace: newEplace } = update;
for(let eplaceId of eplaceIds) {
let oldEquip = oldEplace.find(cur => cur.id == eplaceId);
let newEquip = newEplace.find(cur => cur.id == eplaceId);
if(newEquip && oldEquip) {
let dicOldEquipQuality = getEquipQualityIdByEquipIdAndPoint(oldEquip.equipId, oldEquip.quality, oldEquip.qualityStage);
let dicNewEquipQuality = getEquipQualityIdByEquipIdAndPoint(newEquip.equipId, newEquip.quality, newEquip.qualityStage);
for(let attr of dicOldEquipQuality.attribute) {
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: -1 * attr.num * HERO_CE_RATIO } });
}
for(let attr of dicNewEquipQuality.attribute) {
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: attr.num * HERO_CE_RATIO } });
}
}
}
return heroAttrs
}
let curPlace = ePlace.find(cur => cur.id == ePaceId);
if (curPlace && curPlace.equip) {
let e = <EquipType>curPlace.equip;
for (let { seid, rand } of e.randSe) {
addSeidList.push(seid, rand);
export function calEquipStarIncAttr(hero: HeroType, update: HeroUpdate, eplaceIds: number[], addSeidList: number[], removeSeidList: number[]) {
// 升星本身的属性加成
let { hid, attr: heroAttrs, ePlace: oldEplace } = hero;
let { ePlace: newEplace } = update;
for(let eplaceId of eplaceIds) {
let oldEquip = oldEplace.find(cur => cur.id == eplaceId);
let newEquip = newEplace.find(cur => cur.id == eplaceId);
if(newEquip && oldEquip) {
let dicOldEquipStar = getEquipStarIdByEquipId(oldEquip.equipId, oldEquip.star);
let dicNewEquipStar = getEquipStarIdByEquipId(newEquip.equipId, newEquip.star);
// 主属性
for(let attr of getEquipStarMainAttrByStage(oldEquip.equipId, oldEquip.star, oldEquip.starStage)) {
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: -1 * attr.num * HERO_CE_RATIO } });
}
for(let attr of getEquipStarMainAttrByStage(newEquip.equipId, newEquip.star, newEquip.starStage)) {
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: attr.num * HERO_CE_RATIO } });
}
for(let attr of dicOldEquipStar.subAttr) {
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: -1 * attr.num * HERO_CE_RATIO } });
}
for(let attr of dicNewEquipStar.subAttr) {
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: attr.num * HERO_CE_RATIO } });
}
}
}
for (let seid of seids) {
removeSeidList.push(seid)
// 套装属性
calEquipSuitIncAttr(hid, oldEplace, newEplace, addSeidList, removeSeidList);
return heroAttrs;
}
function calEquipSuitIncAttr(hid: number, oldEplace: EPlace[], newEplace: EPlace[], addSeidList: number[], removeSeidList: number[]) {
let dicEquipSuit = getEquipSuitByHero(hid);
let oldSuitStars: number[] = [], newSuitStars: number[] = [];
for(let equipId of dicEquipSuit.equips) {
let oldEquip = oldEplace.find(cur => cur.equipId == equipId);
oldSuitStars.push(oldEquip? oldEquip.star: 0);
let newEquip = newEplace.find(cur => cur.equipId == equipId);
newSuitStars.push(newEquip? newEquip.star: 0);
}
let oldStar = Math.min(...oldSuitStars);
let newStar = Math.min(...newSuitStars);
for(let { star, seid } of dicEquipSuit.effect) {
if(oldStar >= star) removeSeidList.push(seid);
if(newStar >= star) addSeidList.push(seid, 0);
}
}
export function calEquipPutOnOrOffJewelIncAttr(hero: HeroType, update: HeroUpdate, eplaceIds: number[], params: { oldJewel: JewelType, newJewel: JewelType }, addSeidList: number[], removeSeidList: number[]) {
let { attr: heroAttrs, ePlace: oldEplace } = hero;
let { ePlace: newEplace } = update;
for(let eplaceId of eplaceIds) {
let oldEquip = oldEplace.find(cur => cur.id == eplaceId);
setRandSeToSeidList(params.oldJewel, oldEquip, removeSeidList);
let newEquip = newEplace.find(cur => cur.id == eplaceId);
setRandSeToSeidList(params.newJewel, newEquip, addSeidList);
}
return heroAttrs
return heroAttrs;
}
function setRandSeToSeidList(jewel: JewelType, equip: EPlace, list: number[]) {
if(equip && jewel) {
for(let { id, seid, rand } of jewel.randSe) {
if(isRandSeUnLock(jewel.id, id, equip.stones)) {
list.push(seid, rand);
}
}
}
}
function isRandSeUnLock(jewelId: number, randSeId: number, stones: Stone[]) {
let dicJewel = gameData.jewel.get(jewelId);
let dicJewelCondition = getJewelConditionByLvAndSeId(dicJewel.lv, randSeId);
let stoneCnt = 0, stoneLv = 0;
for(let { stone } of stones) {
let dicStone = gameData.stone.get(stone);
if(dicStone) {
stoneCnt++;
stoneLv += dicStone.lv;
}
}
return stoneCnt >= dicJewelCondition.stoneCnt && stoneLv >= dicJewelCondition.stoneLv;
}
export function calEquipPutOnOrOffStoneIncAttr(hero: HeroType, update: HeroUpdate, eplaceIds: number[], params: { jewel: JewelType }, addSeidList: number[], removeSeidList: number[]) {
let { attr: heroAttrs, ePlace: oldEplace } = hero;
let { ePlace: newEplace } = update;
for(let eplaceId of eplaceIds) {
let oldEquip = oldEplace.find(cur => cur.id == eplaceId);
updateHeroAttrOfStone(heroAttrs, oldEquip, -1);
setRandSeToSeidList(params.jewel, oldEquip, removeSeidList);
let newEquip = newEplace.find(cur => cur.id == eplaceId);
updateHeroAttrOfStone(heroAttrs, newEquip, 1);
setRandSeToSeidList(params.jewel, newEquip, addSeidList); // 地玉石阶数变化可能导致属性词条解锁变化
}
return heroAttrs;
}
function updateHeroAttrOfStone(heroAttrs: CeAttrData[], equip: EPlace, ratio: number) {
for(let { stone } of equip.stones) {
let dicStone = gameData.stone.get(stone);
if(dicStone) {
for(let attr of dicStone.attribute) {
updateHeroAttr(heroAttrs, attr.id, { inc: { fixUp: ratio * attr.num * HERO_CE_RATIO } });
}
}
}
}
export function calJewelResetRandSeIncAttr(hero: HeroType, eplaceIds: number[], params: { oldJewel: JewelType, newJewel: JewelType }, addSeidList: number[], removeSeidList: number[]) {
let { attr: heroAttrs, ePlace } = hero;
for(let eplaceId of eplaceIds) {
let equip = ePlace.find(cur => cur.id == eplaceId);
setRandSeToSeidList(params.oldJewel, equip, removeSeidList);
setRandSeToSeidList(params.newJewel, equip, addSeidList);
}
return heroAttrs;
}
// 添加技能增加的被动属性
@@ -824,6 +822,7 @@ function addSeidEffect(heroAttrs: CeAttrData[], addSeidList: Array<number>, remo
// 获取dic_zyz_se内容
function addSeid(effectList: Array<any>, seidId: number, rand: number, seidValue = new Array<number>()) {
console.log('##### addSeid', effectList, seidId, rand, seidValue)
let curSeid: DicSe | DicRandomEffectPool = gameData.se.get(seidId);
if (!curSeid) curSeid = gameData.randomEffectPool.get(seidId);
if (!curSeid) { console.log("seidId not found:" + seidId); return; }
@@ -836,40 +835,13 @@ function addSeid(effectList: Array<any>, seidId: number, rand: number, seidValue
return;
}
let seid: DicSe | DicRandomEffectPool = deepCopy(curSeid);
console.log('#####', seid)
if (curSeid.index > 0) {
seid.gainValueArr[curSeid.index - 1] = rand;
}
effectList.push(seid);
}
/**
* 带上宝石
* @param {HeroType} hero 武将数据
* @param {number} id 带上的宝石
* @param {number} oldId 脱下的宝石
*/
function calHeroCeWhenJewelOnOrOff(hero: HeroType, id: number, oldId: number) {
let { attr: heroAttrs } = hero;
let { goodsAbility } = gameData.goods.get(id)||{ goodsAbility: new Map<number, number>() };
let { goodsAbility: oldGoodsAbility } = gameData.goods.get(oldId)||{ goodsAbility: new Map<number, number>() };
let allIds: number[] = [];
for(let [ id ] of goodsAbility) {
allIds.push(id);
}
for(let [ id ] of oldGoodsAbility) {
if(allIds.indexOf(id) == -1) allIds.push(id);
}
for(let id of allIds) {
let value = goodsAbility.get(id)||0;
let oldValue = oldGoodsAbility.get(id)||0;
updateHeroAttr(heroAttrs, id, { inc: { equipUp: (value - oldValue) * HERO_CE_RATIO } })
}
hero.attr = heroAttrs;
return heroAttrs;
}
/**
* 全局加成,百家学宫
* @param role 角色
+2 -2
View File
@@ -15,7 +15,6 @@ import { reduceCe, resResult } from "./util";
import { calculatetopLineup, } from "./playerCe";
import { GuildModel, GuildType } from "../db/Guild";
import { PvpDefenseModel } from "../db/PvpDefense";
import { EquipModel } from '../db/Equip';
import { ActionPointModel } from '../db/ActionPoint';
import { BattleDropModel } from '../db/BattleDrop';
import { BattleRecordModel } from '../db/BattleRecord';
@@ -101,6 +100,7 @@ import { HeroShowParam } from '../domain/roleField/hero';
import { saveCeChangeLog } from "./logUtil";
import { ActivityInRemote } from "../domain/activityField/activityField";
import { AttributeCal } from "../domain/roleField/attribute";
import { JewelModel } from "../db/Jewel";
// 储存在内存中的初始数据
export function getInitRoleInfo() {
@@ -418,7 +418,7 @@ export async function deletRole(roleId: string) {
await ChatInfoModel.updateMany({ 'recentPrivateChats.targetRoleId': roleId }, { $pull: { recentPrivateChats: { targetRoleId: roleId } } });
await DailyRecordModel.deleteMany({ roleId });
await DungeonFirstModel.deleteMany({ roleId });
await EquipModel.deleteMany({ roleId });
await JewelModel.deleteMany({ roleId });
await EquipPrintDropModel.deleteMany({ roleId });
await EventRecordModel.deleteMany({ roleId });
await ExpeditionPointModel.deleteMany({ roleId });
+71 -72
View File
@@ -6,7 +6,6 @@ import { RoleType, RoleModel } from '../db/Role';
import { TaskParam, TaskListReturn } from '../domain/roleField/task';
import { getZeroPoint } from './timeUtil';
import { HeroType } from '../db/Hero';
import { EquipType, EquipModel } from '../db/Equip';
import { ItemInter } from './interface';
import { DailyChallengesData } from '../domain/activityField/dailyChallengesField';
import { splitString } from './util';
@@ -130,10 +129,10 @@ export async function checkTaskWithHero(roleId: string, taskType: number, hero:
pushMessage = await checkTask(roleId, taskType, 1, true, { favourLv: hero.favourLv, oldLv: args[0] })
}
else if (taskType == TASK_TYPE.EQUIP_BY_HERO) {
// arg[0] 1:穿上 -1:脱下
let { ePlace } = hero;
let count = ePlace.filter(cur => cur.equip).length;
pushMessage = await checkTask(roleId, taskType, args[0], true, { count, isPutOn: args[0], oldCount: args[1] });
// // arg[0] 1:穿上 -1:脱下
// let { ePlace } = hero;
// let count = ePlace.filter(cur => cur.equip).length;
// pushMessage = await checkTask(roleId, taskType, args[0], true, { count, isPutOn: args[0], oldCount: args[1] });
}
else if (taskType == TASK_TYPE.EQUIP_STRENGTHEN) {
// args: 依次为原先的装备的强化等级
@@ -149,61 +148,61 @@ export async function checkTaskWithHero(roleId: string, taskType: number, hero:
}
export async function checkTaskWithEquip(roleId: string, taskType: number, equip: EquipType, args: number[] = []) {
let pushMessage = new Array<TaskListReturn>();
if (taskType == TASK_TYPE.EQUIP_QUALITY) {
// args[0] 1:装上 -1:脱下
let dicGood = gameData.goods.get(equip.id);
pushMessage = await checkTask(roleId, taskType, args[0], true, { quality: dicGood.quality })
}
else if (taskType == TASK_TYPE.EQUIP_JEWEL) {
// args[0] 原来镶嵌了多少宝石
let { holes } = equip;
let jewelCount = holes.filter(cur => cur.jewel > 0).length;
if (jewelCount > 0 && args[0] <= 0) { // 原来没有,镶嵌上了
pushMessage = await checkTask(roleId, taskType, 1, true, {});
} else if (jewelCount <= 0 && args[0] > 0) { // 原来镶嵌着,现在没了
pushMessage = await checkTask(roleId, taskType, -1, true, {});
}
}
else if (taskType == TASK_TYPE.EQUIP_COMPOSE_SUIT) {
let dicGood = gameData.goods.get(equip.id);
if (dicGood.suitId) {
pushMessage = await checkTask(roleId, taskType, 1, true, {});
}
}
else if (taskType == TASK_TYPE.EQUIP_SUIT) {
let dicGood = gameData.goods.get(equip.id);
if (dicGood.suitId) {
let suit = gameData.suit.get(dicGood.suitId);
let equips = await EquipModel.getEquipsByIds(roleId, suit.tireInfo);
let everyEquip = new Map<number, number>();
for (let equip of equips) {
if (everyEquip.has(equip.id)) {
everyEquip.set(equip.id, everyEquip.get(equip.id) + 1);
} else {
everyEquip.set(equip.id, 1);
}
}
let minCount = 0, curCount = 0;
for (let id of suit.tireInfo) {
let count = everyEquip.get(id) || 0;
if (minCount > count) minCount = count;
if (id == equip.id) curCount = count;
}
if (curCount == minCount) {
pushMessage = await checkTask(roleId, taskType, 1, true, {});
}
}
}
else if (taskType == TASK_TYPE.EQUIP_JEWEL_SUM) {
// args[0] 原来镶嵌了多少宝石
let { holes } = equip;
let jewelCount = holes.filter(cur => cur.jewel > 0).length;
pushMessage = await checkTask(roleId, taskType, jewelCount - args[0], true, {});
}
return pushMessage
}
// export async function checkTaskWithEquip(roleId: string, taskType: number, equip: EquipType, args: number[] = []) {
// let pushMessage = new Array<TaskListReturn>();
// if (taskType == TASK_TYPE.EQUIP_QUALITY) {
// // args[0] 1:装上 -1:脱下
// let dicGood = gameData.goods.get(equip.id);
// pushMessage = await checkTask(roleId, taskType, args[0], true, { quality: dicGood.quality })
// }
// else if (taskType == TASK_TYPE.EQUIP_JEWEL) {
// // args[0] 原来镶嵌了多少宝石
// let { holes } = equip;
// let jewelCount = holes.filter(cur => cur.jewel > 0).length;
// if (jewelCount > 0 && args[0] <= 0) { // 原来没有,镶嵌上了
// pushMessage = await checkTask(roleId, taskType, 1, true, {});
// } else if (jewelCount <= 0 && args[0] > 0) { // 原来镶嵌着,现在没了
// pushMessage = await checkTask(roleId, taskType, -1, true, {});
// }
// }
// else if (taskType == TASK_TYPE.EQUIP_COMPOSE_SUIT) {
// let dicGood = gameData.goods.get(equip.id);
// if (dicGood.suitId) {
// pushMessage = await checkTask(roleId, taskType, 1, true, {});
// }
// }
// else if (taskType == TASK_TYPE.EQUIP_SUIT) {
// let dicGood = gameData.goods.get(equip.id);
// if (dicGood.suitId) {
// let suit = gameData.suit.get(dicGood.suitId);
// let equips = await EquipModel.getEquipsByIds(roleId, suit.tireInfo);
// let everyEquip = new Map<number, number>();
// for (let equip of equips) {
// if (everyEquip.has(equip.id)) {
// everyEquip.set(equip.id, everyEquip.get(equip.id) + 1);
// } else {
// everyEquip.set(equip.id, 1);
// }
// }
// let minCount = 0, curCount = 0;
// for (let id of suit.tireInfo) {
// let count = everyEquip.get(id) || 0;
// if (minCount > count) minCount = count;
// if (id == equip.id) curCount = count;
// }
// if (curCount == minCount) {
// pushMessage = await checkTask(roleId, taskType, 1, true, {});
// }
// }
// }
// else if (taskType == TASK_TYPE.EQUIP_JEWEL_SUM) {
// // args[0] 原来镶嵌了多少宝石
// let { holes } = equip;
// let jewelCount = holes.filter(cur => cur.jewel > 0).length;
// pushMessage = await checkTask(roleId, taskType, jewelCount - args[0], true, {});
// }
// return pushMessage
// }
export async function checkTaskWithArgs(roleId: string, taskType: number, args: number[]) {
let pushMessage = new Array<TaskListReturn>();
@@ -217,18 +216,18 @@ export async function checkTaskWithArgs(roleId: string, taskType: number, args:
}
}
else if (taskType == TASK_TYPE.EQUIP_JEWEL_STAGE) {
// args 装上的, 卸下的
let [putOnJewel, putOffJewel] = args;
if (putOnJewel > 0) {
let dicGood = gameData.goods.get(putOnJewel);
let push = await checkTask(roleId, taskType, 1, true, { stage: dicGood.lvLimited });
pushMessage.push(...push);
}
if (putOffJewel > 0) {
let dicGood = gameData.goods.get(putOffJewel);
let push = await checkTask(roleId, taskType, -1, true, { stage: dicGood.lvLimited });
pushMessage.push(...push);
}
// // args 装上的, 卸下的
// let [putOnJewel, putOffJewel] = args;
// if (putOnJewel > 0) {
// let dicGood = gameData.goods.get(putOnJewel);
// let push = await checkTask(roleId, taskType, 1, true, { stage: dicGood.lvLimited });
// pushMessage.push(...push);
// }
// if (putOffJewel > 0) {
// let dicGood = gameData.goods.get(putOffJewel);
// let push = await checkTask(roleId, taskType, -1, true, { stage: dicGood.lvLimited });
// pushMessage.push(...push);
// }
}
else if (taskType == TASK_TYPE.CHAT) {
// args[0] 聊天type 1-系统 2-世界 3-军团 4-组队 5-私聊
+6 -1
View File
@@ -180,7 +180,7 @@ export function shouldRefreshWeek(preTime: Date, now: Date, day: number = 1, hou
*/
export function getRandEelm<T>(source: Array<T> = [], cnt = 1): Array<T> {
if (cnt == 0) return [];
if (cnt >= source.length) return source;
if (cnt >= source.length) return sortArrRandom(source);
let idxs = new Set();
while (1) {
@@ -337,6 +337,11 @@ export const cal = {
}
};
export function getDecimalCnt(num: number) {
let str = num.toString();
return str.split('.')[1]? str.split('.')[1].length: 0;
}
//计算公式
// export function calculateNum(ratio: { A: number, B: number }, params: { num: number }, defaultVal = 0) {
// // result = a * num + b
@@ -2,265 +2,151 @@
{
"id": 1,
"quality": 1,
"starLevel": 1,
"levelMin": 1,
"levelMax": 20,
"qualityLevel": 1,
"preposition": "&",
"honourConsume": "40005&40",
"max": 1,
"honourConsume": "40005&70",
"fundConsume": 0,
"timeConsume": 0
},
{
"id": 2,
"quality": 2,
"starLevel": 1,
"levelMin": 1,
"levelMax": 20,
"preposition": "&",
"quality": 1,
"qualityLevel": 2,
"preposition": "1&",
"max": 2,
"honourConsume": "40005&70",
"fundConsume": 19000,
"timeConsume": 1200
},
{
"id": 3,
"quality": 3,
"starLevel": 1,
"levelMin": 1,
"levelMax": 20,
"preposition": "2&",
"honourConsume": "40005&100",
"quality": 1,
"qualityLevel": 3,
"preposition": "2&3",
"max": 3,
"honourConsume": "40005&70",
"fundConsume": 27000,
"timeConsume": 1800
},
{
"id": 4,
"quality": 4,
"starLevel": 1,
"levelMin": 1,
"levelMax": 20,
"preposition": "3&",
"honourConsume": "40005&140",
"quality": 2,
"qualityLevel": 1,
"preposition": "1&",
"max": 1,
"honourConsume": "40005&70",
"fundConsume": 40000,
"timeConsume": 2700
},
{
"id": 5,
"quality": 1,
"starLevel": 2,
"levelMin": 21,
"levelMax": 40,
"preposition": "&",
"quality": 2,
"qualityLevel": 2,
"preposition": "2&4",
"max": 2,
"honourConsume": "40005&70",
"fundConsume": 0,
"timeConsume": 0
"fundConsume": 40000,
"timeConsume": 2700
},
{
"id": 6,
"quality": 2,
"starLevel": 2,
"levelMin": 21,
"levelMax": 40,
"preposition": "2&",
"honourConsume": "40005&110",
"qualityLevel": 3,
"preposition": "3&5",
"max": 3,
"honourConsume": "40005&70",
"fundConsume": 31000,
"timeConsume": 2700
},
{
"id": 7,
"quality": 3,
"starLevel": 2,
"levelMin": 21,
"levelMax": 40,
"preposition": "3&6",
"honourConsume": "40005&160",
"qualityLevel": 1,
"preposition": "4&",
"max": 1,
"honourConsume": "40005&70",
"fundConsume": 45000,
"timeConsume": 4800
},
{
"id": 8,
"quality": 4,
"starLevel": 2,
"levelMin": 21,
"levelMax": 40,
"preposition": "4&7",
"honourConsume": "40005&210",
"quality": 3,
"qualityLevel": 2,
"preposition": "5&7",
"max": 2,
"honourConsume": "40005&70",
"fundConsume": 60000,
"timeConsume": 7200
},
{
"id": 9,
"quality": 1,
"starLevel": 3,
"levelMin": 41,
"levelMax": 60,
"preposition": "&",
"honourConsume": "40005&100",
"fundConsume": 0,
"timeConsume": 0
"quality": 3,
"qualityLevel": 3,
"preposition": "6&8",
"max": 3,
"honourConsume": "40005&70",
"fundConsume": 40000,
"timeConsume": 2700
},
{
"id": 10,
"quality": 2,
"starLevel": 3,
"levelMin": 41,
"levelMax": 60,
"preposition": "6&",
"honourConsume": "40005&170",
"quality": 4,
"qualityLevel": 1,
"preposition": "7&",
"max": 1,
"honourConsume": "40005&70",
"fundConsume": 48000,
"timeConsume": 5400
},
{
"id": 11,
"quality": 3,
"starLevel": 3,
"levelMin": 41,
"levelMax": 60,
"preposition": "7&10",
"honourConsume": "40005&230",
"quality": 4,
"qualityLevel": 2,
"preposition": "8&10",
"max": 2,
"honourConsume": "40005&70",
"fundConsume": 66000,
"timeConsume": 8400
},
{
"id": 12,
"quality": 4,
"starLevel": 3,
"levelMin": 41,
"levelMax": 60,
"preposition": "8&11",
"honourConsume": "40005&300",
"qualityLevel": 3,
"preposition": "9&11",
"max": 3,
"honourConsume": "40005&70",
"fundConsume": 86000,
"timeConsume": 10800
},
{
"id": 13,
"quality": 1,
"starLevel": 4,
"levelMin": 61,
"levelMax": 80,
"preposition": "&",
"honourConsume": "40005&170",
"fundConsume": 0,
"timeConsume": 0
"quality": 5,
"qualityLevel": 1,
"preposition": "10&",
"max": 1,
"honourConsume": "40005&70",
"fundConsume": 40000,
"timeConsume": 2700
},
{
"id": 14,
"quality": 2,
"starLevel": 4,
"levelMin": 61,
"levelMax": 80,
"preposition": "10&",
"honourConsume": "40005&280",
"quality": 5,
"qualityLevel": 2,
"preposition": "11&13",
"max": 2,
"honourConsume": "40005&70",
"fundConsume": 84000,
"timeConsume": 10800
},
{
"id": 15,
"quality": 3,
"starLevel": 4,
"levelMin": 61,
"levelMax": 80,
"preposition": "11&14",
"honourConsume": "40005&400",
"quality": 5,
"qualityLevel": 3,
"preposition": "12&14",
"max": 3,
"honourConsume": "40005&70",
"fundConsume": 115000,
"timeConsume": 16800
},
{
"id": 16,
"quality": 4,
"starLevel": 4,
"levelMin": 61,
"levelMax": 80,
"preposition": "12&15",
"honourConsume": "40005&540",
"fundConsume": 150000,
"timeConsume": 25200
},
{
"id": 17,
"quality": 1,
"starLevel": 5,
"levelMin": 81,
"levelMax": 99,
"preposition": "&",
"honourConsume": "40005&270",
"fundConsume": 0,
"timeConsume": 0
},
{
"id": 18,
"quality": 2,
"starLevel": 5,
"levelMin": 81,
"levelMax": 99,
"preposition": "14&",
"honourConsume": "40005&450",
"fundConsume": 130000,
"timeConsume": 18000
},
{
"id": 19,
"quality": 3,
"starLevel": 5,
"levelMin": 81,
"levelMax": 99,
"preposition": "15&18",
"honourConsume": "40005&600",
"fundConsume": 184000,
"timeConsume": 28800
},
{
"id": 20,
"quality": 4,
"starLevel": 5,
"levelMin": 81,
"levelMax": 99,
"preposition": "16&19",
"honourConsume": "40005&900",
"fundConsume": 240000,
"timeConsume": 36000
},
{
"id": 21,
"quality": 1,
"starLevel": 6,
"levelMin": 100,
"levelMax": 100,
"preposition": "&",
"honourConsume": "40005&400",
"fundConsume": 0,
"timeConsume": 0
},
{
"id": 22,
"quality": 2,
"starLevel": 6,
"levelMin": 100,
"levelMax": 100,
"preposition": "18&",
"honourConsume": "40005&700",
"fundConsume": 190000,
"timeConsume": 32400
},
{
"id": 23,
"quality": 3,
"starLevel": 6,
"levelMin": 100,
"levelMax": 100,
"preposition": "19&22",
"honourConsume": "40005&1000",
"fundConsume": 280000,
"timeConsume": 46800
},
{
"id": 24,
"quality": 4,
"starLevel": 6,
"levelMin": 100,
"levelMax": 100,
"preposition": "20&23",
"honourConsume": "40005&1350",
"fundConsume": 380000,
"timeConsume": 64800
}
]
+20 -30
View File
@@ -3,9 +3,8 @@
"id": 1,
"structureId": 2,
"level": 1,
"starProduce": 1,
"levelProduce": 19,
"qualityProduce": "1&2&3&4",
"quality": 1,
"levelProduce": "1&2&3",
"consume": 50000,
"buildWords": "&",
"imageName": "jttubiao_2"
@@ -14,9 +13,8 @@
"id": 2,
"structureId": 2,
"level": 2,
"starProduce": 2,
"levelProduce": 19,
"qualityProduce": "1&2&3&4",
"quality": 2,
"levelProduce": "1&2",
"consume": 125000,
"buildWords": "&",
"imageName": "jttubiao_2"
@@ -25,9 +23,8 @@
"id": 3,
"structureId": 2,
"level": 3,
"starProduce": 3,
"levelProduce": 39,
"qualityProduce": "1&2",
"quality": 2,
"levelProduce": "1&2&3",
"consume": 350000,
"buildWords": "&",
"imageName": "jttubiao_2"
@@ -36,9 +33,8 @@
"id": 4,
"structureId": 2,
"level": 4,
"starProduce": 3,
"levelProduce": 39,
"qualityProduce": "3&4",
"quality": 3,
"levelProduce": "1&2",
"consume": 800000,
"buildWords": "&",
"imageName": "jttubiao_2"
@@ -47,9 +43,8 @@
"id": 5,
"structureId": 2,
"level": 5,
"starProduce": 4,
"levelProduce": 59,
"qualityProduce": "1&2",
"quality": 3,
"levelProduce": "1&2&3",
"consume": 1700000,
"buildWords": "&",
"imageName": "jttubiao_2"
@@ -58,9 +53,8 @@
"id": 6,
"structureId": 2,
"level": 6,
"starProduce": 4,
"levelProduce": 59,
"qualityProduce": "3&4",
"quality": 4,
"levelProduce": "1&2",
"consume": 3500000,
"buildWords": "&",
"imageName": "jttubiao_2"
@@ -69,9 +63,8 @@
"id": 7,
"structureId": 2,
"level": 7,
"starProduce": 5,
"levelProduce": 79,
"qualityProduce": "1&2",
"quality": 4,
"levelProduce": "1&2&3",
"consume": 6125000,
"buildWords": "&",
"imageName": "jttubiao_2"
@@ -80,9 +73,8 @@
"id": 8,
"structureId": 2,
"level": 8,
"starProduce": 5,
"levelProduce": 79,
"qualityProduce": "3&4",
"quality": 5,
"levelProduce": "1&",
"consume": 9125000,
"buildWords": "&",
"imageName": "jttubiao_2"
@@ -91,9 +83,8 @@
"id": 9,
"structureId": 2,
"level": 9,
"starProduce": 6,
"levelProduce": 99,
"qualityProduce": "1&2",
"quality": 5,
"levelProduce": "2&",
"consume": 13625000,
"buildWords": "&",
"imageName": "jttubiao_2"
@@ -102,9 +93,8 @@
"id": 10,
"structureId": 2,
"level": 10,
"starProduce": 6,
"levelProduce": 100,
"qualityProduce": "3&4",
"quality": 5,
"levelProduce": "3&",
"consume": 99999999,
"buildWords": "&",
"imageName": "jttubiao_2"
+20 -40
View File
@@ -3,120 +3,100 @@
"id": 1,
"structureId": 5,
"level": 1,
"wishgoodsEquip": "2&2",
"wishgoodsDrawing": "2&2",
"wishgoodsHero": "&",
"consume": 50000,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
},
{
"id": 2,
"structureId": 5,
"level": 2,
"wishgoodsEquip": "2&2|3&2",
"wishgoodsDrawing": "2&2|3&2",
"wishgoodsHero": "&",
"consume": 125000,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
},
{
"id": 3,
"structureId": 5,
"level": 3,
"wishgoodsEquip": "2&2|3&2",
"wishgoodsDrawing": "2&2|3&2",
"wishgoodsHero": "&",
"consume": 350000,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
},
{
"id": 4,
"structureId": 5,
"level": 4,
"wishgoodsEquip": "2&2|3&2",
"wishgoodsDrawing": "2&2|3&2",
"wishgoodsHero": "1&2",
"consume": 800000,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
},
{
"id": 5,
"structureId": 5,
"level": 5,
"wishgoodsEquip": "2&2|3&2|4&1",
"wishgoodsDrawing": "2&2|3&2|4&1",
"wishgoodsHero": "1&2",
"consume": 1700000,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
},
{
"id": 6,
"structureId": 5,
"level": 6,
"wishgoodsEquip": "2&2|3&2|4&2",
"wishgoodsDrawing": "2&2|3&2|4&2",
"wishgoodsHero": "1&2|2&1",
"consume": 3500000,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
},
{
"id": 7,
"structureId": 5,
"level": 7,
"wishgoodsEquip": "2&4|3&2|4&2",
"wishgoodsDrawing": "2&4|3&2|4&2",
"wishgoodsHero": "1&2|2&1",
"consume": 6125000,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
},
{
"id": 8,
"structureId": 5,
"level": 8,
"wishgoodsEquip": "2&8|3&2|4&2",
"wishgoodsDrawing": "2&8|3&2|4&2",
"wishgoodsHero": "1&2|2&1",
"consume": 9125000,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
},
{
"id": 9,
"structureId": 5,
"level": 9,
"wishgoodsEquip": "2&8|3&4|4&2",
"wishgoodsDrawing": "2&8|3&4|4&2",
"wishgoodsHero": "1&3|2&1|3&1",
"consume": 13625000,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
},
{
"id": 10,
"structureId": 5,
"level": 10,
"wishgoodsEquip": "2&8|3&4|4&4",
"wishgoodsDrawing": "2&8|3&4|4&4",
"wishgoodsHero": "1&3|2&1|3&1",
"consume": 99999999,
"buildWords": "&",
"imageID": "jttubiao_5",
"__EMPTY": 0,
"__EMPTY_1": 0
"imageID": "jttubiao_5"
}
]
+24 -51
View File
@@ -2,7 +2,6 @@
{
"id": 1,
"itid": 25,
"starLevel": "&",
"quality": 1,
"honourReward": 40,
"__EMPTY": 0,
@@ -13,7 +12,6 @@
{
"id": 2,
"itid": 25,
"starLevel": "&",
"quality": 2,
"honourReward": 80,
"__EMPTY": 0,
@@ -24,7 +22,6 @@
{
"id": 3,
"itid": 25,
"starLevel": "&",
"quality": 3,
"honourReward": 200,
"__EMPTY": 0,
@@ -34,8 +31,7 @@
},
{
"id": 4,
"itid": 40,
"starLevel": 1,
"itid": 41,
"quality": 1,
"honourReward": 20,
"__EMPTY": 0,
@@ -45,8 +41,7 @@
},
{
"id": 5,
"itid": 40,
"starLevel": 1,
"itid": 41,
"quality": 2,
"honourReward": 50,
"__EMPTY": 0,
@@ -56,8 +51,7 @@
},
{
"id": 6,
"itid": 40,
"starLevel": 1,
"itid": 41,
"quality": 3,
"honourReward": 70,
"__EMPTY": 0,
@@ -67,8 +61,7 @@
},
{
"id": 7,
"itid": 40,
"starLevel": 1,
"itid": 41,
"quality": 4,
"honourReward": 80,
"__EMPTY": 0,
@@ -78,8 +71,7 @@
},
{
"id": 8,
"itid": 40,
"starLevel": 2,
"itid": 41,
"quality": 1,
"honourReward": 40,
"__EMPTY": 0,
@@ -89,8 +81,7 @@
},
{
"id": 9,
"itid": 40,
"starLevel": 2,
"itid": 41,
"quality": 2,
"honourReward": 80,
"__EMPTY": 0,
@@ -100,8 +91,7 @@
},
{
"id": 10,
"itid": 40,
"starLevel": 2,
"itid": 41,
"quality": 3,
"honourReward": 90,
"__EMPTY": 0,
@@ -111,8 +101,7 @@
},
{
"id": 11,
"itid": 40,
"starLevel": 2,
"itid": 41,
"quality": 4,
"honourReward": 110,
"__EMPTY": 0,
@@ -122,8 +111,7 @@
},
{
"id": 12,
"itid": 40,
"starLevel": 3,
"itid": 41,
"quality": 1,
"honourReward": 70,
"__EMPTY": 0,
@@ -133,8 +121,7 @@
},
{
"id": 13,
"itid": 40,
"starLevel": 3,
"itid": 41,
"quality": 2,
"honourReward": 100,
"__EMPTY": 0,
@@ -144,8 +131,7 @@
},
{
"id": 14,
"itid": 40,
"starLevel": 3,
"itid": 41,
"quality": 3,
"honourReward": 130,
"__EMPTY": 0,
@@ -155,8 +141,7 @@
},
{
"id": 15,
"itid": 40,
"starLevel": 3,
"itid": 41,
"quality": 4,
"honourReward": 140,
"__EMPTY": 0,
@@ -166,8 +151,7 @@
},
{
"id": 16,
"itid": 40,
"starLevel": 4,
"itid": 41,
"quality": 1,
"honourReward": 120,
"__EMPTY": 0,
@@ -177,8 +161,7 @@
},
{
"id": 17,
"itid": 40,
"starLevel": 4,
"itid": 41,
"quality": 2,
"honourReward": 160,
"__EMPTY": 0,
@@ -188,8 +171,7 @@
},
{
"id": 18,
"itid": 40,
"starLevel": 4,
"itid": 41,
"quality": 3,
"honourReward": 190,
"__EMPTY": 0,
@@ -199,8 +181,7 @@
},
{
"id": 19,
"itid": 40,
"starLevel": 4,
"itid": 41,
"quality": 4,
"honourReward": 210,
"__EMPTY": 0,
@@ -210,8 +191,7 @@
},
{
"id": 20,
"itid": 40,
"starLevel": 5,
"itid": 41,
"quality": 1,
"honourReward": 150,
"__EMPTY": 0,
@@ -221,8 +201,7 @@
},
{
"id": 21,
"itid": 40,
"starLevel": 5,
"itid": 41,
"quality": 2,
"honourReward": 200,
"__EMPTY": 0,
@@ -232,8 +211,7 @@
},
{
"id": 22,
"itid": 40,
"starLevel": 5,
"itid": 41,
"quality": 3,
"honourReward": 220,
"__EMPTY": 0,
@@ -243,8 +221,7 @@
},
{
"id": 23,
"itid": 40,
"starLevel": 5,
"itid": 41,
"quality": 4,
"honourReward": 240,
"__EMPTY": 0,
@@ -254,8 +231,7 @@
},
{
"id": 24,
"itid": 40,
"starLevel": 6,
"itid": 41,
"quality": 1,
"honourReward": 170,
"__EMPTY": 0,
@@ -265,8 +241,7 @@
},
{
"id": 25,
"itid": 40,
"starLevel": 6,
"itid": 41,
"quality": 2,
"honourReward": 230,
"__EMPTY": 0,
@@ -276,8 +251,7 @@
},
{
"id": 26,
"itid": 40,
"starLevel": 6,
"itid": 41,
"quality": 3,
"honourReward": 260,
"__EMPTY": 0,
@@ -287,8 +261,7 @@
},
{
"id": 27,
"itid": 40,
"starLevel": 6,
"itid": 41,
"quality": 4,
"honourReward": 330,
"__EMPTY": 0,
File diff suppressed because it is too large Load Diff
+34 -118
View File
@@ -1,99 +1,31 @@
[
{
"itid": 1,
"info": "短刀(神兵)"
"info": "神兵"
},
{
"itid": 2,
"info": "长兵(神兵)"
"info": "宝甲"
},
{
"itid": 3,
"info": "奇门(神兵)"
"info": "冠冕"
},
{
"itid": 4,
"info": "弓弩(神兵)"
"info": "行具"
},
{
"itid": 5,
"info": "剑(神兵)"
"info": "典籍"
},
{
"itid": 6,
"info": "法器(神兵)"
},
{
"itid": 7,
"info": "备用(神兵)"
},
{
"itid": 8,
"info": "备用(神兵)"
},
{
"itid": 9,
"info": "头盔(冠冕)"
},
{
"itid": 10,
"info": "发冠(冠冕)"
},
{
"itid": 11,
"info": "头巾(冠冕)"
},
{
"itid": 12,
"info": "重铠(宝甲)"
},
{
"itid": 13,
"info": "轻甲(宝甲)"
},
{
"itid": 14,
"info": "布衣(宝甲)"
},
{
"itid": 15,
"info": "兵书(典籍)"
},
{
"itid": 16,
"info": "杂记(典籍)"
},
{
"itid": 17,
"info": "经典(典籍)"
},
{
"itid": 18,
"info": "马(行具)"
},
{
"itid": 19,
"info": "鞋(行具)"
},
{
"itid": 20,
"info": "车(行具)"
},
{
"itid": 21,
"info": "佩饰(礼器)"
},
{
"itid": 22,
"info": "钟鼎(礼器)"
},
{
"itid": 23,
"info": "印章(礼器)"
"info": "饰品"
},
{
"itid": 24,
"info": "使用类物品(如宝箱)"
"info": "礼包"
},
{
"itid": 25,
@@ -111,41 +43,21 @@
"itid": 28,
"info": "藏宝图"
},
{
"itid": 29,
"info": "礼器"
},
{
"itid": 30,
"info": "宝甲"
},
{
"itid": 31,
"info": "名驹"
},
{
"itid": 32,
"info": "典籍"
},
{
"itid": 33,
"info": "神兵"
},
{
"itid": 34,
"info": "代币"
},
{
"itid": 35,
"info": "消耗类物品(经验书)"
"info": "经验书"
},
{
"itid": 36,
"info": "消耗类物品(好感道具)"
"info": "名望道具"
},
{
"itid": 38,
"info": "消耗类物品(材料类)"
"info": "材料"
},
{
"itid": 39,
@@ -157,7 +69,7 @@
},
{
"itid": 41,
"info": "图纸"
"info": "套装图纸"
},
{
"itid": 42,
@@ -177,27 +89,23 @@
},
{
"itid": 46,
"info": "礼器宝石"
"info": "饰品宝石"
},
{
"itid": 47,
"info": "典籍宝石"
},
{
"itid": 48,
"info": "灵玄石"
},
{
"itid": 49,
"info": "玩家好感道具"
"info": "好感道具"
},
{
"itid": 50,
"info": "形象"
"info": "头像"
},
{
"itid": 51,
"info": "形象框"
"info": "头像框"
},
{
"itid": 52,
@@ -205,26 +113,34 @@
},
{
"itid": 53,
"info": "武将招募令"
},
{
"itid": 54,
"info": "礼包"
"info": "招募令"
},
{
"itid": 55,
"info": "烧肉(体力道具)"
"info": "体力道具"
},
{
"itid": 56,
"info": "普通骰子"
},
{
"itid": 57,
"info": "天机骰子"
"info": "活动道具"
},
{
"itid": 58,
"info": "实体化经验"
},
{
"itid": 59,
"info": "武器天晶"
},
{
"itid": 60,
"info": "衣甲天晶"
},
{
"itid": 61,
"info": "冠冕天晶"
},
{
"itid": 62,
"info": "行具天晶"
}
]
+310
View File
@@ -0,0 +1,310 @@
[
{
"id": 1,
"name": "步兵武器",
"jobClass": 1,
"eplaceId": 1,
"suitId": 1,
"attribute": "2&10",
"attributeUp": "2&10",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 2,
"name": "步兵衣甲",
"jobClass": 1,
"eplaceId": 2,
"suitId": 1,
"attribute": "4&20",
"attributeUp": "4&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 3,
"name": "步兵冠冕",
"jobClass": 1,
"eplaceId": 3,
"suitId": 1,
"attribute": "5&20",
"attributeUp": "5&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 4,
"name": "步兵行具",
"jobClass": 1,
"eplaceId": 4,
"suitId": 1,
"attribute": "1&50",
"attributeUp": "1&50",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 5,
"name": "枪兵武器",
"jobClass": 2,
"eplaceId": 1,
"suitId": 2,
"attribute": "2&10",
"attributeUp": "2&10",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 6,
"name": "枪兵衣甲",
"jobClass": 2,
"eplaceId": 2,
"suitId": 2,
"attribute": "4&20",
"attributeUp": "4&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 7,
"name": "枪兵冠冕",
"jobClass": 2,
"eplaceId": 3,
"suitId": 2,
"attribute": "5&20",
"attributeUp": "5&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 8,
"name": "枪兵行具",
"jobClass": 2,
"eplaceId": 4,
"suitId": 2,
"attribute": "1&50",
"attributeUp": "1&50",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 9,
"name": "骑兵武器",
"jobClass": 3,
"eplaceId": 1,
"suitId": 3,
"attribute": "2&10",
"attributeUp": "2&10",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 10,
"name": "骑兵衣甲",
"jobClass": 3,
"eplaceId": 2,
"suitId": 3,
"attribute": "4&20",
"attributeUp": "4&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 11,
"name": "骑兵冠冕",
"jobClass": 3,
"eplaceId": 3,
"suitId": 3,
"attribute": "5&20",
"attributeUp": "5&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 12,
"name": "骑兵行具",
"jobClass": 3,
"eplaceId": 4,
"suitId": 3,
"attribute": "1&50",
"attributeUp": "1&50",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 13,
"name": "弓兵武器",
"jobClass": 4,
"eplaceId": 1,
"suitId": 4,
"attribute": "2&10",
"attributeUp": "2&10",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 14,
"name": "弓兵衣甲",
"jobClass": 4,
"eplaceId": 2,
"suitId": 4,
"attribute": "4&20",
"attributeUp": "4&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 15,
"name": "弓兵冠冕",
"jobClass": 4,
"eplaceId": 3,
"suitId": 4,
"attribute": "5&20",
"attributeUp": "5&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 16,
"name": "弓兵行具",
"jobClass": 4,
"eplaceId": 4,
"suitId": 4,
"attribute": "1&50",
"attributeUp": "1&50",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 17,
"name": "游侠武器",
"jobClass": 5,
"eplaceId": 1,
"suitId": 5,
"attribute": "2&10",
"attributeUp": "2&10",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 18,
"name": "游侠衣甲",
"jobClass": 5,
"eplaceId": 2,
"suitId": 5,
"attribute": "4&20",
"attributeUp": "4&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 19,
"name": "游侠冠冕",
"jobClass": 5,
"eplaceId": 3,
"suitId": 5,
"attribute": "5&20",
"attributeUp": "5&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 20,
"name": "游侠行具",
"jobClass": 5,
"eplaceId": 4,
"suitId": 5,
"attribute": "1&50",
"attributeUp": "1&50",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 21,
"name": "策士武器",
"jobClass": 6,
"eplaceId": 1,
"suitId": 6,
"attribute": "2&10",
"attributeUp": "2&10",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 22,
"name": "策士衣甲",
"jobClass": 6,
"eplaceId": 2,
"suitId": 6,
"attribute": "4&20",
"attributeUp": "4&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 23,
"name": "策士冠冕",
"jobClass": 6,
"eplaceId": 3,
"suitId": 6,
"attribute": "5&20",
"attributeUp": "5&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 24,
"name": "策士行具",
"jobClass": 6,
"eplaceId": 4,
"suitId": 6,
"attribute": "1&50",
"attributeUp": "1&50",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 25,
"name": "医者武器",
"jobClass": 7,
"eplaceId": 1,
"suitId": 7,
"attribute": "2&10",
"attributeUp": "2&10",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 26,
"name": "医者衣甲",
"jobClass": 7,
"eplaceId": 2,
"suitId": 7,
"attribute": "4&20",
"attributeUp": "4&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 27,
"name": "医者冠冕",
"jobClass": 7,
"eplaceId": 3,
"suitId": 7,
"attribute": "5&20",
"attributeUp": "5&20",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
},
{
"id": 28,
"name": "医者行具",
"jobClass": 7,
"eplaceId": 4,
"suitId": 7,
"attribute": "1&50",
"attributeUp": "1&50",
"composeMaterial": "31002&200",
"imageId": "qingtongjian&bintiejian&wenshijian&jinggangjian&songwenjian"
}
]
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,37 @@
[
{
"id": 1,
"quality": 1,
"star": 2,
"jewelCnt": 0,
"stoneCnt": 0
},
{
"id": 2,
"quality": 2,
"star": 4,
"jewelCnt": 1,
"stoneCnt": 0
},
{
"id": 3,
"quality": 3,
"star": 6,
"jewelCnt": 1,
"stoneCnt": 1
},
{
"id": 4,
"quality": 4,
"star": 8,
"jewelCnt": 1,
"stoneCnt": 2
},
{
"id": 5,
"quality": 5,
"star": 12,
"jewelCnt": 1,
"stoneCnt": 3
}
]
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,502 @@
[
{
"id": 1,
"lv": 1,
"consume": "&"
},
{
"id": 2,
"lv": 2,
"consume": "31002&4000"
},
{
"id": 3,
"lv": 3,
"consume": "31002&6000"
},
{
"id": 4,
"lv": 4,
"consume": "31002&8000"
},
{
"id": 5,
"lv": 5,
"consume": "31002&10000"
},
{
"id": 6,
"lv": 6,
"consume": "31002&12000"
},
{
"id": 7,
"lv": 7,
"consume": "31002&14000"
},
{
"id": 8,
"lv": 8,
"consume": "31002&16000"
},
{
"id": 9,
"lv": 9,
"consume": "31002&18000"
},
{
"id": 10,
"lv": 10,
"consume": "31002&20000"
},
{
"id": 11,
"lv": 11,
"consume": "31002&22000"
},
{
"id": 12,
"lv": 12,
"consume": "31002&24000"
},
{
"id": 13,
"lv": 13,
"consume": "31002&26000"
},
{
"id": 14,
"lv": 14,
"consume": "31002&28000"
},
{
"id": 15,
"lv": 15,
"consume": "31002&30000"
},
{
"id": 16,
"lv": 16,
"consume": "31002&32000"
},
{
"id": 17,
"lv": 17,
"consume": "31002&34000"
},
{
"id": 18,
"lv": 18,
"consume": "31002&36000"
},
{
"id": 19,
"lv": 19,
"consume": "31002&38000"
},
{
"id": 20,
"lv": 20,
"consume": "31002&40000"
},
{
"id": 21,
"lv": 21,
"consume": "31002&42000"
},
{
"id": 22,
"lv": 22,
"consume": "31002&44000"
},
{
"id": 23,
"lv": 23,
"consume": "31002&46000"
},
{
"id": 24,
"lv": 24,
"consume": "31002&48000"
},
{
"id": 25,
"lv": 25,
"consume": "31002&50000"
},
{
"id": 26,
"lv": 26,
"consume": "31002&52000"
},
{
"id": 27,
"lv": 27,
"consume": "31002&54000"
},
{
"id": 28,
"lv": 28,
"consume": "31002&56000"
},
{
"id": 29,
"lv": 29,
"consume": "31002&58000"
},
{
"id": 30,
"lv": 30,
"consume": "31002&60000"
},
{
"id": 31,
"lv": 31,
"consume": "31002&62000"
},
{
"id": 32,
"lv": 32,
"consume": "31002&64000"
},
{
"id": 33,
"lv": 33,
"consume": "31002&66000"
},
{
"id": 34,
"lv": 34,
"consume": "31002&68000"
},
{
"id": 35,
"lv": 35,
"consume": "31002&70000"
},
{
"id": 36,
"lv": 36,
"consume": "31002&72000"
},
{
"id": 37,
"lv": 37,
"consume": "31002&74000"
},
{
"id": 38,
"lv": 38,
"consume": "31002&76000"
},
{
"id": 39,
"lv": 39,
"consume": "31002&78000"
},
{
"id": 40,
"lv": 40,
"consume": "31002&80000"
},
{
"id": 41,
"lv": 41,
"consume": "31002&82000"
},
{
"id": 42,
"lv": 42,
"consume": "31002&84000"
},
{
"id": 43,
"lv": 43,
"consume": "31002&86000"
},
{
"id": 44,
"lv": 44,
"consume": "31002&88000"
},
{
"id": 45,
"lv": 45,
"consume": "31002&90000"
},
{
"id": 46,
"lv": 46,
"consume": "31002&92000"
},
{
"id": 47,
"lv": 47,
"consume": "31002&94000"
},
{
"id": 48,
"lv": 48,
"consume": "31002&96000"
},
{
"id": 49,
"lv": 49,
"consume": "31002&98000"
},
{
"id": 50,
"lv": 50,
"consume": "31002&100000"
},
{
"id": 51,
"lv": 51,
"consume": "31002&102000"
},
{
"id": 52,
"lv": 52,
"consume": "31002&104000"
},
{
"id": 53,
"lv": 53,
"consume": "31002&106000"
},
{
"id": 54,
"lv": 54,
"consume": "31002&108000"
},
{
"id": 55,
"lv": 55,
"consume": "31002&110000"
},
{
"id": 56,
"lv": 56,
"consume": "31002&112000"
},
{
"id": 57,
"lv": 57,
"consume": "31002&114000"
},
{
"id": 58,
"lv": 58,
"consume": "31002&116000"
},
{
"id": 59,
"lv": 59,
"consume": "31002&118000"
},
{
"id": 60,
"lv": 60,
"consume": "31002&120000"
},
{
"id": 61,
"lv": 61,
"consume": "31002&122000"
},
{
"id": 62,
"lv": 62,
"consume": "31002&124000"
},
{
"id": 63,
"lv": 63,
"consume": "31002&126000"
},
{
"id": 64,
"lv": 64,
"consume": "31002&128000"
},
{
"id": 65,
"lv": 65,
"consume": "31002&130000"
},
{
"id": 66,
"lv": 66,
"consume": "31002&132000"
},
{
"id": 67,
"lv": 67,
"consume": "31002&134000"
},
{
"id": 68,
"lv": 68,
"consume": "31002&136000"
},
{
"id": 69,
"lv": 69,
"consume": "31002&138000"
},
{
"id": 70,
"lv": 70,
"consume": "31002&140000"
},
{
"id": 71,
"lv": 71,
"consume": "31002&142000"
},
{
"id": 72,
"lv": 72,
"consume": "31002&144000"
},
{
"id": 73,
"lv": 73,
"consume": "31002&146000"
},
{
"id": 74,
"lv": 74,
"consume": "31002&148000"
},
{
"id": 75,
"lv": 75,
"consume": "31002&150000"
},
{
"id": 76,
"lv": 76,
"consume": "31002&152000"
},
{
"id": 77,
"lv": 77,
"consume": "31002&154000"
},
{
"id": 78,
"lv": 78,
"consume": "31002&156000"
},
{
"id": 79,
"lv": 79,
"consume": "31002&158000"
},
{
"id": 80,
"lv": 80,
"consume": "31002&160000"
},
{
"id": 81,
"lv": 81,
"consume": "31002&162000"
},
{
"id": 82,
"lv": 82,
"consume": "31002&164000"
},
{
"id": 83,
"lv": 83,
"consume": "31002&166000"
},
{
"id": 84,
"lv": 84,
"consume": "31002&168000"
},
{
"id": 85,
"lv": 85,
"consume": "31002&170000"
},
{
"id": 86,
"lv": 86,
"consume": "31002&172000"
},
{
"id": 87,
"lv": 87,
"consume": "31002&174000"
},
{
"id": 88,
"lv": 88,
"consume": "31002&176000"
},
{
"id": 89,
"lv": 89,
"consume": "31002&178000"
},
{
"id": 90,
"lv": 90,
"consume": "31002&180000"
},
{
"id": 91,
"lv": 91,
"consume": "31002&182000"
},
{
"id": 92,
"lv": 92,
"consume": "31002&184000"
},
{
"id": 93,
"lv": 93,
"consume": "31002&186000"
},
{
"id": 94,
"lv": 94,
"consume": "31002&188000"
},
{
"id": 95,
"lv": 95,
"consume": "31002&190000"
},
{
"id": 96,
"lv": 96,
"consume": "31002&192000"
},
{
"id": 97,
"lv": 97,
"consume": "31002&194000"
},
{
"id": 98,
"lv": 98,
"consume": "31002&196000"
},
{
"id": 99,
"lv": 99,
"consume": "31002&198000"
},
{
"id": 100,
"lv": 100,
"consume": "31002&200000"
}
]
@@ -0,0 +1,44 @@
[
{
"id": 1,
"jobClass": 1,
"equips": "1&2&3&4",
"effect": "4&10011|8&10013|12&80003"
},
{
"id": 2,
"jobClass": 2,
"equips": "5&6&7&8",
"effect": "4&20011|8&10012|12&80023"
},
{
"id": 3,
"jobClass": 3,
"equips": "9&10&11&12",
"effect": "4&60032|8&60034|12&80002"
},
{
"id": 4,
"jobClass": 4,
"equips": "13&14&15&16",
"effect": "4&10011|8&10013|12&80003"
},
{
"id": 5,
"jobClass": 5,
"equips": "17&18&19&20",
"effect": "4&20011|8&10012|12&80023"
},
{
"id": 6,
"jobClass": 6,
"equips": "21&22&23&24",
"effect": "4&60032|8&60034|12&80002"
},
{
"id": 7,
"jobClass": 7,
"equips": "25&26&27&28",
"effect": "4&60032|8&60034|12&80002"
}
]
+1 -1
View File
@@ -25,7 +25,7 @@
"count": "1&5",
"free": "1&1",
"cost": "22002&1",
"percent": "4&5|5&15|6&15|7&10|8&10|9&15|10&10|13&5|14&10|15&5",
"percent": "4&5|5&15|6&15|7&15|8&15|9&15|10&10|11&10",
"floorReward": 1,
"indirectId": 2
},
+542
View File
@@ -0,0 +1,542 @@
[
{
"id": 1,
"good_id": 80001,
"name": "一阶武器天晶",
"eplaceId": 1,
"itId": 59,
"lv": 1,
"quality": 1,
"effectCount": 2,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068&80054&80089",
"mapGoodId": 33001,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6001
},
{
"id": 2,
"good_id": 80002,
"name": "二阶武器天晶",
"eplaceId": 1,
"itId": 59,
"lv": 2,
"quality": 1,
"effectCount": 2,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068&80054&80089",
"mapGoodId": 33002,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6002
},
{
"id": 3,
"good_id": 80003,
"name": "三阶武器天晶",
"eplaceId": 1,
"itId": 59,
"lv": 3,
"quality": 2,
"effectCount": 2,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068&80054&80089",
"mapGoodId": 33003,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6003
},
{
"id": 4,
"good_id": 80004,
"name": "四阶武器天晶",
"eplaceId": 1,
"itId": 59,
"lv": 4,
"quality": 2,
"effectCount": 2,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068&80054&80089",
"mapGoodId": 33004,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6004
},
{
"id": 5,
"good_id": 80005,
"name": "五阶武器天晶",
"eplaceId": 1,
"itId": 59,
"lv": 5,
"quality": 3,
"effectCount": 3,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068&80054&80089",
"mapGoodId": 33005,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6005
},
{
"id": 6,
"good_id": 80006,
"name": "六阶武器天晶",
"eplaceId": 1,
"itId": 59,
"lv": 6,
"quality": 3,
"effectCount": 3,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068&80054&80089",
"mapGoodId": 33006,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6006
},
{
"id": 7,
"good_id": 80007,
"name": "七阶武器天晶",
"eplaceId": 1,
"itId": 59,
"lv": 7,
"quality": 4,
"effectCount": 4,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068&80054&80089",
"mapGoodId": 33007,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6007
},
{
"id": 8,
"good_id": 80008,
"name": "八阶武器天晶",
"eplaceId": 1,
"itId": 59,
"lv": 8,
"quality": 4,
"effectCount": 4,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068&80054&80089",
"mapGoodId": 33008,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6008
},
{
"id": 9,
"good_id": 80009,
"name": "九阶武器天晶",
"eplaceId": 1,
"itId": 59,
"lv": 9,
"quality": 5,
"effectCount": 4,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068&80054&80089",
"mapGoodId": 33009,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6009
},
{
"id": 10,
"good_id": 80011,
"name": "一阶衣甲天晶",
"eplaceId": 2,
"itId": 60,
"lv": 1,
"quality": 1,
"effectCount": 2,
"randomEffect": "60032&60034&80001&80012&80033&80047&80075",
"mapGoodId": 33010,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6010
},
{
"id": 11,
"good_id": 80012,
"name": "二阶衣甲天晶",
"eplaceId": 2,
"itId": 60,
"lv": 2,
"quality": 1,
"effectCount": 2,
"randomEffect": "60032&60034&80001&80012&80033&80047&80075",
"mapGoodId": 33011,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6011
},
{
"id": 12,
"good_id": 80013,
"name": "三阶衣甲天晶",
"eplaceId": 2,
"itId": 60,
"lv": 3,
"quality": 2,
"effectCount": 2,
"randomEffect": "60032&60034&80001&80012&80033&80047&80075",
"mapGoodId": 33012,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6012
},
{
"id": 13,
"good_id": 80014,
"name": "四阶衣甲天晶",
"eplaceId": 2,
"itId": 60,
"lv": 4,
"quality": 2,
"effectCount": 2,
"randomEffect": "60032&60034&80001&80012&80033&80047&80075",
"mapGoodId": 33013,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6013
},
{
"id": 14,
"good_id": 80015,
"name": "五阶衣甲天晶",
"eplaceId": 2,
"itId": 60,
"lv": 5,
"quality": 3,
"effectCount": 3,
"randomEffect": "60032&60034&80001&80012&80033&80047&80075",
"mapGoodId": 33014,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6014
},
{
"id": 15,
"good_id": 80016,
"name": "六阶衣甲天晶",
"eplaceId": 2,
"itId": 60,
"lv": 6,
"quality": 3,
"effectCount": 3,
"randomEffect": "60032&60034&80001&80012&80033&80047&80075",
"mapGoodId": 33015,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6015
},
{
"id": 16,
"good_id": 80017,
"name": "七阶衣甲天晶",
"eplaceId": 2,
"itId": 60,
"lv": 7,
"quality": 4,
"effectCount": 4,
"randomEffect": "60032&60034&80001&80012&80033&80047&80075",
"mapGoodId": 33016,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6016
},
{
"id": 17,
"good_id": 80018,
"name": "八阶衣甲天晶",
"eplaceId": 2,
"itId": 60,
"lv": 8,
"quality": 4,
"effectCount": 4,
"randomEffect": "60032&60034&80001&80012&80033&80047&80075",
"mapGoodId": 33017,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6017
},
{
"id": 18,
"good_id": 80019,
"name": "九阶衣甲天晶",
"eplaceId": 2,
"itId": 60,
"lv": 9,
"quality": 5,
"effectCount": 4,
"randomEffect": "60032&60034&80001&80012&80033&80047&80075",
"mapGoodId": 33018,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6018
},
{
"id": 19,
"good_id": 80021,
"name": "一阶冠冕天晶",
"eplaceId": 3,
"itId": 61,
"lv": 1,
"quality": 1,
"effectCount": 2,
"randomEffect": "60032&40035&80001&80019&80033&80047&80082",
"mapGoodId": 33019,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6019
},
{
"id": 20,
"good_id": 80022,
"name": "二阶冠冕天晶",
"eplaceId": 3,
"itId": 61,
"lv": 2,
"quality": 1,
"effectCount": 2,
"randomEffect": "60032&40035&80001&80019&80033&80047&80082",
"mapGoodId": 33020,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6020
},
{
"id": 21,
"good_id": 80023,
"name": "三阶冠冕天晶",
"eplaceId": 3,
"itId": 61,
"lv": 3,
"quality": 2,
"effectCount": 2,
"randomEffect": "60032&40035&80001&80019&80033&80047&80082",
"mapGoodId": 33021,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6021
},
{
"id": 22,
"good_id": 80024,
"name": "四阶冠冕天晶",
"eplaceId": 3,
"itId": 61,
"lv": 4,
"quality": 2,
"effectCount": 2,
"randomEffect": "60032&40035&80001&80019&80033&80047&80082",
"mapGoodId": 33022,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6022
},
{
"id": 23,
"good_id": 80025,
"name": "五阶冠冕天晶",
"eplaceId": 3,
"itId": 61,
"lv": 5,
"quality": 3,
"effectCount": 3,
"randomEffect": "60032&40035&80001&80019&80033&80047&80082",
"mapGoodId": 33023,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6023
},
{
"id": 24,
"good_id": 80026,
"name": "六阶冠冕天晶",
"eplaceId": 3,
"itId": 61,
"lv": 6,
"quality": 3,
"effectCount": 3,
"randomEffect": "60032&40035&80001&80019&80033&80047&80082",
"mapGoodId": 33024,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6024
},
{
"id": 25,
"good_id": 80027,
"name": "七阶冠冕天晶",
"eplaceId": 3,
"itId": 61,
"lv": 7,
"quality": 4,
"effectCount": 4,
"randomEffect": "60032&40035&80001&80019&80033&80047&80082",
"mapGoodId": 33025,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6025
},
{
"id": 26,
"good_id": 80028,
"name": "八阶冠冕天晶",
"eplaceId": 3,
"itId": 61,
"lv": 8,
"quality": 4,
"effectCount": 4,
"randomEffect": "60032&40035&80001&80019&80033&80047&80082",
"mapGoodId": 33026,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6026
},
{
"id": 27,
"good_id": 80029,
"name": "九阶冠冕天晶",
"eplaceId": 3,
"itId": 61,
"lv": 9,
"quality": 5,
"effectCount": 4,
"randomEffect": "60032&40035&80001&80019&80033&80047&80082",
"mapGoodId": 33027,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6027
},
{
"id": 28,
"good_id": 80031,
"name": "一阶行具天晶",
"eplaceId": 4,
"itId": 62,
"lv": 1,
"quality": 1,
"effectCount": 2,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068",
"mapGoodId": 33028,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6028
},
{
"id": 29,
"good_id": 80032,
"name": "二阶行具天晶",
"eplaceId": 4,
"itId": 62,
"lv": 2,
"quality": 1,
"effectCount": 2,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068",
"mapGoodId": 33029,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6029
},
{
"id": 30,
"good_id": 80033,
"name": "三阶行具天晶",
"eplaceId": 4,
"itId": 62,
"lv": 3,
"quality": 2,
"effectCount": 2,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068",
"mapGoodId": 33030,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6030
},
{
"id": 31,
"good_id": 80034,
"name": "四阶行具天晶",
"eplaceId": 4,
"itId": 62,
"lv": 4,
"quality": 2,
"effectCount": 2,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068",
"mapGoodId": 33031,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6031
},
{
"id": 32,
"good_id": 80035,
"name": "五阶行具天晶",
"eplaceId": 4,
"itId": 62,
"lv": 5,
"quality": 3,
"effectCount": 3,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068",
"mapGoodId": 33032,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6032
},
{
"id": 33,
"good_id": 80036,
"name": "六阶行具天晶",
"eplaceId": 4,
"itId": 62,
"lv": 6,
"quality": 3,
"effectCount": 3,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068",
"mapGoodId": 33033,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6033
},
{
"id": 34,
"good_id": 80037,
"name": "七阶行具天晶",
"eplaceId": 4,
"itId": 62,
"lv": 7,
"quality": 4,
"effectCount": 4,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068",
"mapGoodId": 33034,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6034
},
{
"id": 35,
"good_id": 80038,
"name": "八阶行具天晶",
"eplaceId": 4,
"itId": 62,
"lv": 8,
"quality": 4,
"effectCount": 4,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068",
"mapGoodId": 33035,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6035
},
{
"id": 36,
"good_id": 80039,
"name": "九阶行具天晶",
"eplaceId": 4,
"itId": 62,
"lv": 9,
"quality": 5,
"effectCount": 4,
"randomEffect": "60031&10033&80002&80005&80026&80040&80061&80068",
"mapGoodId": 33036,
"quenchConsume": "31001&500",
"successConsume": "17057&100",
"gkId": 6036
}
]
@@ -0,0 +1,184 @@
[
{
"id": 1,
"jewelLv": 1,
"randSeId": 1,
"stoneCnt": 0,
"stoneLv": 0
},
{
"id": 2,
"jewelLv": 1,
"randSeId": 2,
"stoneCnt": 1,
"stoneLv": 1
},
{
"id": 3,
"jewelLv": 2,
"randSeId": 1,
"stoneCnt": 0,
"stoneLv": 0
},
{
"id": 4,
"jewelLv": 2,
"randSeId": 2,
"stoneCnt": 1,
"stoneLv": 2
},
{
"id": 5,
"jewelLv": 3,
"randSeId": 1,
"stoneCnt": 0,
"stoneLv": 0
},
{
"id": 6,
"jewelLv": 3,
"randSeId": 2,
"stoneCnt": 1,
"stoneLv": 3
},
{
"id": 7,
"jewelLv": 4,
"randSeId": 1,
"stoneCnt": 0,
"stoneLv": 0
},
{
"id": 8,
"jewelLv": 4,
"randSeId": 2,
"stoneCnt": 1,
"stoneLv": 4
},
{
"id": 9,
"jewelLv": 5,
"randSeId": 1,
"stoneCnt": 0,
"stoneLv": 0
},
{
"id": 10,
"jewelLv": 5,
"randSeId": 2,
"stoneCnt": 1,
"stoneLv": 5
},
{
"id": 11,
"jewelLv": 5,
"randSeId": 3,
"stoneCnt": 2,
"stoneLv": 10
},
{
"id": 12,
"jewelLv": 6,
"randSeId": 1,
"stoneCnt": 0,
"stoneLv": 0
},
{
"id": 13,
"jewelLv": 6,
"randSeId": 2,
"stoneCnt": 1,
"stoneLv": 6
},
{
"id": 14,
"jewelLv": 6,
"randSeId": 3,
"stoneCnt": 2,
"stoneLv": 12
},
{
"id": 15,
"jewelLv": 7,
"randSeId": 1,
"stoneCnt": 0,
"stoneLv": 0
},
{
"id": 16,
"jewelLv": 7,
"randSeId": 2,
"stoneCnt": 1,
"stoneLv": 7
},
{
"id": 17,
"jewelLv": 7,
"randSeId": 3,
"stoneCnt": 2,
"stoneLv": 14
},
{
"id": 18,
"jewelLv": 7,
"randSeId": 4,
"stoneCnt": 3,
"stoneLv": 21
},
{
"id": 19,
"jewelLv": 8,
"randSeId": 1,
"stoneCnt": 0,
"stoneLv": 0
},
{
"id": 20,
"jewelLv": 8,
"randSeId": 2,
"stoneCnt": 1,
"stoneLv": 8
},
{
"id": 21,
"jewelLv": 8,
"randSeId": 3,
"stoneCnt": 2,
"stoneLv": 16
},
{
"id": 22,
"jewelLv": 8,
"randSeId": 4,
"stoneCnt": 3,
"stoneLv": 24
},
{
"id": 23,
"jewelLv": 9,
"randSeId": 1,
"stoneCnt": 0,
"stoneLv": 0
},
{
"id": 24,
"jewelLv": 9,
"randSeId": 2,
"stoneCnt": 1,
"stoneLv": 9
},
{
"id": 25,
"jewelLv": 9,
"randSeId": 3,
"stoneCnt": 2,
"stoneLv": 18
},
{
"id": 26,
"jewelLv": 9,
"randSeId": 4,
"stoneCnt": 3,
"stoneLv": 27
}
]
File diff suppressed because it is too large Load Diff
@@ -29,83 +29,48 @@
},
{
"id": 5,
"name": "适用等级蓝色藏宝图",
"type": 3,
"name": "随机一阶地玉",
"type": 4,
"param": "1&",
"count": 4
},
{
"id": 6,
"name": "适用等级紫色藏宝图",
"type": 3,
"name": "随机二级地玉",
"type": 4,
"param": "2&",
"count": 3
},
{
"id": 7,
"name": "适用等级橙色藏宝图",
"type": 3,
"name": "随机三级地玉",
"type": 4,
"param": "3&",
"count": 2
},
{
"id": 8,
"name": "适用等级红色藏宝图",
"type": 3,
"name": "随机四级地玉",
"type": 4,
"param": "4&",
"count": 1
},
{
"id": 9,
"name": "随机一级宝石",
"type": 4,
"param": "1&",
"count": 4
},
{
"id": 10,
"name": "随机二级宝石",
"type": 4,
"param": "2&",
"count": 3
},
{
"id": 11,
"name": "随机三级宝石",
"type": 4,
"param": "3&",
"count": 2
},
{
"id": 12,
"name": "随机四级宝石",
"type": 4,
"param": "4&",
"count": 1
},
{
"id": 13,
"name": "适用等级的套装图纸",
"type": 6,
"param": "&",
"count": 1
},
{
"id": 14,
"name": "武将碎片 * 5",
"type": 2,
"param": "0&",
"count": 5
},
{
"id": 15,
"id": 10,
"name": "武将碎片 *10",
"type": 2,
"param": "0&",
"count": 10
},
{
"id": 16,
"id": 11,
"name": "强化神像素材",
"type": 5,
"param": "17054&",
+398
View File
@@ -0,0 +1,398 @@
[
{
"id": 1,
"good_id": 60001,
"name": "一阶赤焰钻",
"eplaceId": 1,
"itId": 42,
"lv": 1,
"quality": 1,
"composeMaterial": "&",
"attribute": "2&100"
},
{
"id": 2,
"good_id": 60002,
"name": "二阶赤焰钻",
"eplaceId": 1,
"itId": 42,
"lv": 2,
"quality": 1,
"composeMaterial": "60001&3",
"attribute": "2&400"
},
{
"id": 3,
"good_id": 60003,
"name": "三阶赤焰钻",
"eplaceId": 1,
"itId": 42,
"lv": 3,
"quality": 2,
"composeMaterial": "60002&3",
"attribute": "2&900"
},
{
"id": 4,
"good_id": 60004,
"name": "四阶赤焰钻",
"eplaceId": 1,
"itId": 42,
"lv": 4,
"quality": 2,
"composeMaterial": "60003&3",
"attribute": "2&1600"
},
{
"id": 5,
"good_id": 60005,
"name": "五阶赤焰钻",
"eplaceId": 1,
"itId": 42,
"lv": 5,
"quality": 3,
"composeMaterial": "60004&3",
"attribute": "2&2500"
},
{
"id": 6,
"good_id": 60006,
"name": "六阶赤焰钻",
"eplaceId": 1,
"itId": 42,
"lv": 6,
"quality": 3,
"composeMaterial": "60005&3",
"attribute": "2&3600"
},
{
"id": 7,
"good_id": 60007,
"name": "七阶赤焰钻",
"eplaceId": 1,
"itId": 42,
"lv": 7,
"quality": 4,
"composeMaterial": "60006&3|17056&9",
"attribute": "2&4900"
},
{
"id": 8,
"good_id": 60008,
"name": "八阶赤焰钻",
"eplaceId": 1,
"itId": 42,
"lv": 8,
"quality": 4,
"composeMaterial": "60007&3|17056&9",
"attribute": "2&6400"
},
{
"id": 9,
"good_id": 60009,
"name": "九阶赤焰钻",
"eplaceId": 1,
"itId": 42,
"lv": 9,
"quality": 5,
"composeMaterial": "60008&3|17056&9",
"attribute": "2&8000"
},
{
"id": 10,
"good_id": 60011,
"name": "一阶暗芒皓",
"eplaceId": 2,
"itId": 43,
"lv": 1,
"quality": 1,
"composeMaterial": "&",
"attribute": "4&60"
},
{
"id": 11,
"good_id": 60012,
"name": "二阶暗芒皓",
"eplaceId": 2,
"itId": 43,
"lv": 2,
"quality": 1,
"composeMaterial": "60011&3",
"attribute": "4&240"
},
{
"id": 12,
"good_id": 60013,
"name": "三阶暗芒皓",
"eplaceId": 2,
"itId": 43,
"lv": 3,
"quality": 2,
"composeMaterial": "60012&3",
"attribute": "4&540"
},
{
"id": 13,
"good_id": 60014,
"name": "四阶暗芒皓",
"eplaceId": 2,
"itId": 43,
"lv": 4,
"quality": 2,
"composeMaterial": "60013&3",
"attribute": "4&960"
},
{
"id": 14,
"good_id": 60015,
"name": "五阶暗芒皓",
"eplaceId": 2,
"itId": 43,
"lv": 5,
"quality": 3,
"composeMaterial": "60014&3",
"attribute": "4&1500"
},
{
"id": 15,
"good_id": 60016,
"name": "六阶暗芒皓",
"eplaceId": 2,
"itId": 43,
"lv": 6,
"quality": 3,
"composeMaterial": "60015&3",
"attribute": "4&2160"
},
{
"id": 16,
"good_id": 60017,
"name": "七阶暗芒皓",
"eplaceId": 2,
"itId": 43,
"lv": 7,
"quality": 4,
"composeMaterial": "60016&3|17056&9",
"attribute": "4&2940"
},
{
"id": 17,
"good_id": 60018,
"name": "八阶暗芒皓",
"eplaceId": 2,
"itId": 43,
"lv": 8,
"quality": 4,
"composeMaterial": "60017&3|17056&9",
"attribute": "4&3840"
},
{
"id": 18,
"good_id": 60019,
"name": "九阶暗芒皓",
"eplaceId": 2,
"itId": 43,
"lv": 9,
"quality": 5,
"composeMaterial": "60018&3|17056&9",
"attribute": "4&4800"
},
{
"id": 19,
"good_id": 60021,
"name": "一阶昆仑玉",
"eplaceId": 3,
"itId": 44,
"lv": 1,
"quality": 1,
"composeMaterial": "&",
"attribute": "5&60"
},
{
"id": 20,
"good_id": 60022,
"name": "二阶昆仑玉",
"eplaceId": 3,
"itId": 44,
"lv": 2,
"quality": 1,
"composeMaterial": "60021&3",
"attribute": "5&240"
},
{
"id": 21,
"good_id": 60023,
"name": "三阶昆仑玉",
"eplaceId": 3,
"itId": 44,
"lv": 3,
"quality": 2,
"composeMaterial": "60022&3",
"attribute": "5&540"
},
{
"id": 22,
"good_id": 60024,
"name": "四阶昆仑玉",
"eplaceId": 3,
"itId": 44,
"lv": 4,
"quality": 2,
"composeMaterial": "60023&3",
"attribute": "5&960"
},
{
"id": 23,
"good_id": 60025,
"name": "五阶昆仑玉",
"eplaceId": 3,
"itId": 44,
"lv": 5,
"quality": 3,
"composeMaterial": "60024&3",
"attribute": "5&1500"
},
{
"id": 24,
"good_id": 60026,
"name": "六阶昆仑玉",
"eplaceId": 3,
"itId": 44,
"lv": 6,
"quality": 3,
"composeMaterial": "60025&3",
"attribute": "5&2160"
},
{
"id": 25,
"good_id": 60027,
"name": "七阶昆仑玉",
"eplaceId": 3,
"itId": 44,
"lv": 7,
"quality": 4,
"composeMaterial": "60026&3|17056&9",
"attribute": "5&2940"
},
{
"id": 26,
"good_id": 60028,
"name": "八阶昆仑玉",
"eplaceId": 3,
"itId": 44,
"lv": 8,
"quality": 4,
"composeMaterial": "60027&3|17056&9",
"attribute": "5&3840"
},
{
"id": 27,
"good_id": 60029,
"name": "九阶昆仑玉",
"eplaceId": 3,
"itId": 44,
"lv": 9,
"quality": 5,
"composeMaterial": "60028&3|17056&9",
"attribute": "5&4800"
},
{
"id": 28,
"good_id": 60031,
"name": "一阶风灵石",
"eplaceId": 4,
"itId": 45,
"lv": 1,
"quality": 1,
"composeMaterial": "&",
"attribute": "1&200"
},
{
"id": 29,
"good_id": 60032,
"name": "二阶风灵石",
"eplaceId": 4,
"itId": 45,
"lv": 2,
"quality": 1,
"composeMaterial": "60031&3",
"attribute": "1&800"
},
{
"id": 30,
"good_id": 60033,
"name": "三阶风灵石",
"eplaceId": 4,
"itId": 45,
"lv": 3,
"quality": 2,
"composeMaterial": "60032&3",
"attribute": "1&1800"
},
{
"id": 31,
"good_id": 60034,
"name": "四阶风灵石",
"eplaceId": 4,
"itId": 45,
"lv": 4,
"quality": 2,
"composeMaterial": "60033&3",
"attribute": "1&3200"
},
{
"id": 32,
"good_id": 60035,
"name": "五阶风灵石",
"eplaceId": 4,
"itId": 45,
"lv": 5,
"quality": 3,
"composeMaterial": "60034&3",
"attribute": "1&5000"
},
{
"id": 33,
"good_id": 60036,
"name": "六阶风灵石",
"eplaceId": 4,
"itId": 45,
"lv": 6,
"quality": 3,
"composeMaterial": "60035&3",
"attribute": "1&7200"
},
{
"id": 34,
"good_id": 60037,
"name": "七阶风灵石",
"eplaceId": 4,
"itId": 45,
"lv": 7,
"quality": 4,
"composeMaterial": "60036&3|17056&9",
"attribute": "1&9800"
},
{
"id": 35,
"good_id": 60038,
"name": "八阶风灵石",
"eplaceId": 4,
"itId": 45,
"lv": 8,
"quality": 4,
"composeMaterial": "60037&3|17056&9",
"attribute": "1&12800"
},
{
"id": 36,
"good_id": 60039,
"name": "九阶风灵石",
"eplaceId": 4,
"itId": 45,
"lv": 9,
"quality": 5,
"composeMaterial": "60038&3|17056&9",
"attribute": "1&16000"
}
]