feat(宝物): 添加宝物系统

This commit is contained in:
luying
2022-12-07 10:55:30 +08:00
parent b684307818
commit a83deeff5f
46 changed files with 15656 additions and 54 deletions

View File

@@ -157,6 +157,8 @@ export const PUSH_ROUTE = {
ITEM_UPDATE: 'onItemUpdate',
JEWEL_DEL: 'onJewelDel',
JEWEL_ADD: 'onJewelAdd',
ARTIFACT_DEL: 'onArtifactDel',
ARTIFACT_ADD: 'onArtifactAdd',
HEAD_CHANGE: 'onHeadChange',
TASK_UPDATE: 'onTaskUpdate',
ACTIVITY_TASK_UPDATE: 'onActivityTaskUpdate',

View File

@@ -34,6 +34,12 @@ export enum HERO_SYSTEM_TYPE {
RE_CAL = 31, // 重新计算
TALENT_LV = 32, // 天赋升级
TALENT_RESET = 33, // 天赋重置
PUT_ARTIFACT = 34, // 装备宝物
PUT_OFF_ARTIFACT = 35, // 卸下宝物
ARTIFACT_LV = 36, // 宝物等级
ARTIFACT_QUALITY = 37, // 宝物品质
ARTIFACT_TRANSFER = 38, // 宝物转换
ARTIFACT_REBUILD = 39, // 宝物重铸
};
// 武将上限

View File

@@ -38,6 +38,7 @@ export const CONSUME_TYPE = {
DICE: 16, // 骰子
DRAWING: 17, // 图纸
VOUCHER: 18, // 代金券
ARTIFACT_GENERAL: 19, // 宝物通用
};
export enum ROLE_TERAPH {
@@ -96,6 +97,7 @@ export const ITEM_TABLE = {
HERO: 'hero',
SKIN: 'skin',
JEWEL: 'jewel',
ARTIFACT: 'artifact',
}
const itid_array = [
@@ -148,7 +150,9 @@ const itid_array = [
{ id: 60, name: '衣服天晶石', table: 'jewel' },
{ id: 61, name: '头饰天晶石', table: 'jewel' },
{ id: 62, name: '行具天晶石', table: 'jewel' },
{ id: 63, name: '代金券', table: 'item', type: CONSUME_TYPE.VOUCHER }
{ id: 63, name: '代金券', table: 'item', type: CONSUME_TYPE.VOUCHER },
{ id: 64, name: '宝物', table: 'artifact' },
{ id: 65, name: '宝物通用材料', table: 'item', type: CONSUME_TYPE.ARTIFACT_GENERAL },
];
export const ITID = new Map<number, { id: number, name: string, table: string, type?: number, isCurrency?: boolean, equipJewel?: number }>();

View File

@@ -61,6 +61,7 @@ export enum MAIL_TYPE {
GUILD_MAIL = 31, // 军团邮件
REBATE = 32, // 返利邮件
GROUP_SHOP_REFUND = 33, // 退费
ARTIFACT_OVER = 34, // 退费
};
export const SEND_NAME = '系统';

View File

@@ -19,7 +19,7 @@ export enum ROLE_SELECT {
export enum HERO_SELECT {
ENTRY = '-_id -attr -__v',
HERO_DETAIL = 'roleId roleName hid hName ce lv star colorStar quality job skins attr ePlace skinId connections subHid',
HERO_DETAIL = 'roleId roleName hid hName ce lv star colorStar quality job skins attr ePlace skinId connections artifact subHid',
// 排行榜中lineup字段
RANK_LINEUP = 'seqId roleId hid star colorStar lv quality job ce updatedAt skinId'
}
@@ -57,8 +57,12 @@ 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', 'jewels', 'consumeGoods', 'title', 'teraphs', 'showLineup', 'heads', 'head', 'frames', 'frame', 'spines', 'spine', 'hasGuild', 'guildCode', 'todayZeroPoint', 'apJson', 'skins', 'totalPay', 'guide', 'hasInit', 'renameCnt', 'totalCost', 'guildName', 'isVip', 'createTime', 'ipLocation'];
export const ENTERY_ROLE_PICK = ['roleId', 'roleName', 'serverId', 'ce', 'topLineupCe', 'coin', 'lv', 'exp', 'vLv', 'gold', 'heros', 'jewels', 'artifacts', 'consumeGoods', 'title', 'teraphs', 'showLineup', 'heads', 'head', 'frames', 'frame', 'spines', 'spine', 'hasGuild', 'guildCode', 'todayZeroPoint', 'apJson', 'skins', 'totalPay', 'guide', 'hasInit', 'renameCnt', 'totalCost', 'guildName', 'isVip', 'createTime', 'ipLocation'];
export enum SURVEY_SELECT {
FIND = '-__v -_id -surveyName -roleIndex -reward -mailContent -receivedRole -createdAt -updatedAt'
}
}
export enum ARTIFACT_SELECT {
ENTRY = '-_id -__v -roleId -roleName -createdAt -updatedAt -status'
}

View File

@@ -53,6 +53,7 @@ export const COUNTER = {
CITY_ACTIVITY: { name: 'cityAct', def: 1 },
RACE_ACTIVITY: { name: 'raceAct', def: 1 },
HIDDEN_DATA: { name: 'hiddendata', def: 1 },
ARTIFACT_ID: { name: 'artid', def: 1 },
};
export const DEFAULT_HEROES = [19, 53,];
@@ -558,6 +559,11 @@ export const FILENAME = {
DIC_LADDER_MATCH: 'dic_zyz_ladderMatch',
DIC_GK_BRANCH_ELITE: 'dic_zyz_gk_branchElite',
DIC_GENERAL_GOODS: 'dic_zyz_general_goods',
DIC_ARTIFACT: 'dic_zyz_artifact',
DIC_ARTIFACT_LV_PLAN: 'dic_zyz_artifactLvPlan',
DIC_ARTIFACT_QUALITY_PLAN: 'dic_zyz_artifactQualityPlan',
DIC_ARTIFACT_QUALITY: 'dic_zyz_artifactQuality',
DIC_ARTIFACT_SEID: 'dic_zyz_artifactSeid',
}
export const WAR_RELATE_TABLES = [
@@ -763,7 +769,7 @@ export enum TASK_TYPE {
JEWEL_QUENCH_SUCCESS = 107, // 天晶淬炼成功
COM_BATTLE_LV = 108, // 军团寻宝
GUILD_REFINE = 109, // 军团兑换
EQUIP_STAR_UP_CNT_SUM = 110, // 装备总共升星x次
EQUIP_STAR_UP_CNT_SUM = 110, // 装备总共升星x次
BATTLE_MAIN_START = 111, // 挑战主线x次
BATTLE_TOWER_START = 112, // 挑战镇念塔x次
BATTLE_VESTIGE_START = 113, // 挑战遗迹x次
@@ -773,12 +779,15 @@ export enum TASK_TYPE {
COM_BATTLE_WIN = 117, // 寻宝胜利x次
BATTLE_EXPEDITION_START = 118, // 挑战远征x次
BATTLE_DUNGEON_START = 119, // 挑战秘境x次
GUILD_GOLD_DONATE = 120, // 军团元宝捐献x次
GUILD_GOLD_DONATE = 120, // 军团元宝捐献x次
LADDER_CNT = 121, // 名将擂台挑战x次
LADDER_SUCCESS_CNT = 122, // 名将擂台挑战胜利x次
LADDER_RANK = 123, // 名将擂台排名
CONNECT_ONE_HERO_MAX_LV = 124, // 羁绊最高等级的那一级达到x级
CONNECT_ONE_HERO_SUM_LV = 125, // 单个武将全部羁绊到达
ARTIFACT_LV = 127, // 强化X件宝物至X级
ARTIFACT_QUALITY_EQUIP = 128, // 穿戴X件品质为X的宝物
ARTIFACT_COMPOSE = 129, // 合成X次宝物
}
// 任务累积类型
@@ -1048,6 +1057,11 @@ export enum ITEM_CHANGE_REASON {
ACT_GROUP_SHOP_BUY = 153, // 团购
ACT_TURNTABLE_RECEIVE_BOX = 154, // 活动 幸运转盘领取宝箱
ACT_BIND_PHONE = 155, // 活动 绑定手机奖励
ARTIFACT_DECOMPOSE = 156, // 宝物分解
ARTIFACT_LV = 157, // 宝物升级
ARTIFACT_QUALITY = 158, // 宝物升品
ARTIFACT_TRANSFER = 159, // 宝物转换
ARTIFACT_REBUILD = 160, // 宝物重铸
}
export enum TA_EVENT {

View File

@@ -388,6 +388,17 @@ export const STATUS = {
JEWEL_LOCKED_CANNOT_INHERIT: { code: 30536, simStr: '该天晶石锁定中,无法进行继承' },
JEWEL_HAS_EQUPED: { code: 30537, simStr: '天晶石已经被装备' },
JEWEL_CANNOT_INHERIT: { code: 30538, simStr: '不能继承给类型不同或比自己低阶的天晶石' },
ARTIFACT_IS_NOT_FIND: { code: 30539, simStr: '宝物不存在' },
ARTIFACT_IS_NOT_EQUIPED: { code: 30540, simStr: '宝物未装备中' },
ARTIFACT_LV_MAX: { code: 30541, simStr: '宝物已升到最大' },
ARTIFACT_IS_EQUIPED: { code: 30542, simStr: '宝物被装备中' },
ARTIFACT_CAN_NOT_STRENGTHEN: { code: 30543, simStr: '作为材料的宝物不可被强化' },
ARTIFACT_MATERIAL_QUALITY_ERR: { code: 30544, simStr: '作为材料的宝物品质错误' },
ARTIFACT_MATERIAL_GROUP_ERR: { code: 30545, simStr: '作为材料的宝物必须和目标宝物同名' },
ARTIFACT_TYPE_ERR: { code: 30546, simStr: '未找到该宝物的该形态' },
ARTIFACT_TYPE_SAME: { code: 30547, simStr: '该宝物已经是该形态了' },
ARTIFACT_HAS_NO_STRENGTH: { code: 30548, simStr: '选择的宝物未强化过无法重铸' },
ARTIFACT_CANNOT_DECOMPOSE: { code: 30549, simStr: '选择的宝物不可分解' },
//全局养成30600-30699
ROLE_REACH_MAX_TITLE_LEVEL: { code: 30600, simStr: '玩家已达到最高的爵位' },

119
shared/db/Artifact.ts Normal file
View File

@@ -0,0 +1,119 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
import { CounterModel } from './Counter';
import { COUNTER } from '../consts';
import { RoleModel } from './Role';
/**
* 宝物
*/
@modelOptions({ schemaOptions: { id: false } })
@index({ roleId: 1, seqId: 1, id: 1 })
@index({ roleId: 1, quality: 1 })
@index({ batchCode: 1 })
@index({ status: 1 })
export default class Artifact extends BaseModel {
// 主键: artifact不同形态的宝物分开词条
@prop({ required: true })
seqId: number; // 唯一id
@prop({ required: true })
roleId: string; // 玩家id
@prop({ required: true })
roleName: string; // 玩家名
@prop({ required: true })
id: number; // 物品id
@prop({ required: true })
artifactId: number; // 宝物id
@prop({ required: true, default: 0 })
lv: number; // 强化等级
@prop({ required: true })
quality: number; // 品质 1-5 蓝紫橙红金
@prop({ required: true })
qualityStage: number; // 品质+n0开始
@prop({ required: true, default: 0 })
hid: number; // 装备的武将
@prop({ required: true })
batchCode: string; // 一键合成批处理
@prop({ required: true, default: 1 })
status: number; // 装备 1-生成 0-被合成删除
public static async findbySeqIds(roleId: string, seqIds: number[], select?: string) {
const result: ArtifactModelType[] = await ArtifactModel.find({ roleId, seqId: { $in: seqIds }, status: 1 }).select(select).lean();
return result;
}
public static async findbySeqId(roleId: string, seqId: number, select?: string) {
const result: ArtifactModelType = await ArtifactModel.findOne({ roleId, seqId, status: 1 }).select(select).lean();
return result;
}
public static async findbyRole(roleId: string, select = '') {
const result: ArtifactModelType[] = await ArtifactModel.find({ roleId, status: 1 }).select(select).lean();
return result;
}
public static async createArtifact(artifactInfo: ArtifactModelUpdate) {
const seqId = await CounterModel.getNewCounter(COUNTER.ARTIFACT_ID);
const doc = new ArtifactModel();
const update = Object.assign(doc.toJSON(), seqId, artifactInfo);
delete update._id;
const artifact: ArtifactModelType = await ArtifactModel.findOneAndUpdate({ seqId }, update, { upsert: true, new: true }).lean();
return artifact;
}
public static async createArtifacts(roleId: string, artifactInfos: ArtifactModelUpdate[]) {
let result: ArtifactModelType[] = [];
for (let artifactInfo of artifactInfos) {
let artifact = await this.createArtifact(artifactInfo);
result.push(artifact);
}
await RoleModel.increaseArtifact(roleId, result.length);
return result;
}
public static async putOnOrOff(roleId: string, seqId: number, hid: number) {
let rec: ArtifactModelType = await ArtifactModel.findOneAndUpdate({ seqId }, { $set: { hid } }, { new: true }).lean();
return rec;
}
public static async deleteBySeqIds(roleId: string, seqIds: number[]) {
let result: ArtifactModelType[] = await ArtifactModel.findbySeqIds(roleId, seqIds);
let delResult: { n: number, nModified: number, ok: number } = await ArtifactModel.updateMany({ roleId, seqId: { $in: seqIds } }, { $set: { status: 0 } });
await RoleModel.increaseArtifact(roleId, -1 * delResult.nModified);
return result;
}
public static async updateInfoBySeqId(roleId: string, seqId: number, update: ArtifactModelUpdate) {
let rec: ArtifactModelType = await ArtifactModel.findOneAndUpdate({ roleId, seqId }, { $set: update }, { new: true }).lean();
return rec;
}
public static async findByQuality(roleId: string, quality: number) {
let result: ArtifactModelType[] = await ArtifactModel.find({ roleId, quality, status: 1, hid: 0, qualityStage: 0 }).lean();
return result;
}
public static async findByBatchCode(batchCode: string) {
let result: ArtifactModelType[] = await ArtifactModel.find({ batchCode, status: 1 }).lean();
return result;
}
}
export const ArtifactModel = getModelForClass(Artifact);
export interface ArtifactModelType extends Pick<DocumentType<Artifact>, keyof Artifact> { }
export type ArtifactModelUpdate = Partial<ArtifactModelType>; // 将所有字段变成可选项

View File

@@ -161,7 +161,10 @@ export default class Hero extends BaseModel {
ePlace: EPlace[]; // 武将装备引用数组
@prop({ required: true, type: Reward, default: [], _id: false })
consumes: Reward[]; // 武将装备引用数组
consumes: Reward[]; // 消耗
@prop({ required: true, default: 0 })
artifact: number; // 宝物
@prop({ required: true, default: 0 })
subHid: number; // 副将

View File

@@ -56,7 +56,7 @@ export default class LadderMatch extends BaseModel {
public static async findByRoleIdAndInclude(roleId: string) {
const result: LadderMatchType = await LadderMatchModel.findOne({ roleId })
.populate('role', 'roleId roleName head frame spine heads frames spines title lv updatedAt')
.populate('defense.heroes.hero', 'hid skinId quality star colorStar lv skins job subHid')
.populate('defense.heroes.hero', 'hid skinId quality star colorStar lv skins job artifact subHid')
.lean();
return result;
}
@@ -78,7 +78,7 @@ export default class LadderMatch extends BaseModel {
public static async updateByRoleIdAndInclude(roleId: string, params: LadderUpdateInter) {
const defense: LadderMatchType = await LadderMatchModel.findOneAndUpdate({ roleId }, { $set: params}, { new: true })
.populate('role', 'roleId roleName head frame spine heads frames spines title lv updatedAt')
.populate('defense.heroes.hero', 'hid skinId quality star colorStar lv skins job subHid')
.populate('defense.heroes.hero', 'hid skinId quality star colorStar lv skins job artifact subHid')
.lean();
return defense;
}
@@ -98,7 +98,7 @@ export default class LadderMatch extends BaseModel {
public static async lock(serverId: number, roleId: string, rank: number) {
const defense: LadderMatchType = await LadderMatchModel.findOneAndUpdate({ serverId, roleId, rank, locked: 0 }, { $set: { locked: 1 }}, { new: true })
.populate('role', 'roleId roleName head frame spine heads frames spines title lv updatedAt')
.populate('defense.heroes.hero', 'hid skinId quality star colorStar lv skins job subHid')
.populate('defense.heroes.hero', 'hid skinId quality star colorStar lv skins job artifact subHid')
.lean();
return defense;
}

View File

@@ -191,6 +191,8 @@ export default class Role extends BaseModel {
jewelCount: number; // 装备数量
@prop({ required: true })
equipStarSum: number; // 装备上的星级的数量
@prop({ required: true, default: 0 })
artifactCount: number; // 宝物数量
@prop({ required: true, default: 0 })
coin: number; // 总铜钱
@@ -737,6 +739,12 @@ export default class Role extends BaseModel {
return role;
}
// 宝物上限
public static async increaseArtifact(roleId: string, count: number) {
const role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $inc: { artifactCount: 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();

View File

@@ -1,5 +1,6 @@
import { mongoose, prop, Ref } from "@typegoose/typegoose";
import { LADDER_STATUS } from "../../consts";
import { ArtifactModelType } from "../../db/Artifact";
import Hero, { HeroType, Talent } from '../../db/Hero';
import { LadderMatchType } from "../../db/LadderMatch";
import { LadderMatchRecType } from "../../db/LadderMatchRec";
@@ -56,6 +57,15 @@ export class LadderOppPlayerInDB {
rank: number;
}
class HeroArtifact {
@prop({ required: true })
artifactId: number;
@prop({ required: true })
lv: number;
}
// ladderMatchRec
export class LadderOppPlayerHeroInfo {
@prop({ required: true })
@@ -70,6 +80,8 @@ export class LadderOppPlayerHeroInfo {
colorStar: number; // 彩星
@prop({ required: true })
lv: number; // 等级
@prop({ required: true, type: HeroArtifact, _id: false })
artifact: HeroArtifact[] = []; // 等级
setByWarJson(warJson: DicWarJson) {
this.hid = warJson.actorId;
@@ -96,6 +108,10 @@ export class LadderOppPlayerHeroInfo {
this.colorStar = hero.colorStar;
this.lv = hero.lv;
}
setArtifact(artifact: ArtifactModelType) {
if(artifact) this.artifact.push({ artifactId: artifact.artifactId, lv: artifact.lv });
}
}
// ladderMatchRec
@@ -343,8 +359,9 @@ export class LadderOppDetailHeroReturn {
spine: string = ''; // 动画
talent: Talent[] = [];
subHid: number = 0; // 副将
artifact: HeroArtifact[] = [];
constructor(warJson: DicWarJson, defensHero: LadderDefenseHero) {
constructor(warJson: DicWarJson, defensHero: LadderDefenseHero, artifacts: ArtifactModelType[]) {
this.dataId = warJson.dataId;
this.relation = warJson.relation;
this.dirction = warJson.dirction;
@@ -373,6 +390,8 @@ export class LadderOppDetailHeroReturn {
if(skin) this.talent = skin.talent;
this.job = hero.job;
this.subHid = hero.subHid;
let artifact = artifacts.find(cur => cur.seqId == hero.artifact);
if(artifact) this.artifact.push({ artifactId: artifact.artifactId, lv: artifact.lv });
}
}
}
@@ -405,7 +424,7 @@ export class LadderOppDetailReturn {
}
}
setByPlayer(ladderMatch: LadderMatchType, warJsons: DicWarJson[]) {
setByPlayer(ladderMatch: LadderMatchType, warJsons: DicWarJson[], artifacts: ArtifactModelType[]) {
this.isRobot = false;
let role = <RoleType>ladderMatch.role;
this.title = role.title;
@@ -415,7 +434,7 @@ export class LadderOppDetailReturn {
for(let hero of heroes) {
let warJson = warJsons.find(cur => cur.dataId == hero.dataId);
if(warJson) {
let obj = new LadderOppDetailHeroReturn(warJson, hero);
let obj = new LadderOppDetailHeroReturn(warJson, hero, artifacts);
this.heroes.push(obj);
this.defCe += hero.ce;
}

View File

@@ -3,6 +3,7 @@ import { DicWarJson } from '../pubUtils/dictionary/DicWarJson';
import Hero, { HeroType } from '../db/Hero';
import { nowSeconds } from '../pubUtils/timeUtil';
import { DicHero } from '../pubUtils/dictionary/DicHero';
import { ArtifactModelType } from '../db/Artifact';
class Talent {
@@ -11,6 +12,16 @@ class Talent {
@prop({ required: true })
level: number; // 激活等级
}
class HeroArtifact {
@prop({ required: true })
artifactId: number;
@prop({ required: true })
lv: number;
}
// 从玩家数据中覆盖warjson的部分字段
export class PvpHeroInfo {
@prop({ required: true })
@@ -44,8 +55,10 @@ export class PvpHeroInfo {
@prop({ required: true, _id: false })
attribute?: string; // 属性
@prop({ required: true, _id: false, type: HeroArtifact })
artifact?: HeroArtifact[] = []; // 宝物
setHeroInfo(hero: HeroType) {
setHeroInfo(hero: HeroType, artifact: ArtifactModelType) {
this.actorId = hero.hid;
this.skinId = hero.skinId;
this.actorName = hero.hName;
@@ -57,6 +70,7 @@ export class PvpHeroInfo {
let skin = hero.skins?.find(cur => cur.enable);
if(skin) this.talent = skin.talent;
this.subHid = hero.subHid;
if(artifact) this.artifact.push({ artifactId: artifact.artifactId, lv: artifact.lv })
}
setRobotInfo(dicHero: DicHero, lv: number) {
@@ -150,6 +164,9 @@ export class PvpEnemies extends Enemies {
talent: Talent[];
@prop({ required: true })
subHid: number;
@prop({ required: true, type: () => HeroArtifact, _id: false })
artifact: HeroArtifact[] = []; // 宝物
// score: 这个武将的军功
constructor(warjson: DicWarJson, heroInfo: PvpHeroInfo, score: number, ce: number) {
@@ -162,6 +179,7 @@ export class PvpEnemies extends Enemies {
this.talent = heroInfo.talent;
this.job = heroInfo.job;
this.subHid = heroInfo.subHid;
this.artifact = heroInfo.artifact||[];
}
}

View File

@@ -4,6 +4,7 @@ import * as friendUtil from '../../pubUtils/friendUtil'
import { FRIEND_RELATION_TYPE } from "../../consts";
import { Connect, EPlace, HeroType, Stone, Talent } from "../../db/Hero";
import { JewelType, RandSe } from "../../db/Jewel";
import { ArtifactModelType } from "../../db/Artifact";
export class FriendParams {
roleId: string;
@@ -201,6 +202,7 @@ export class HeroDetailParam {
school: number;
};
subHid: number = 0;
artifacts: {artifactId: number, lv: number }[] = []
constructor(hero: HeroType) {
this.roleId = hero.roleId;
@@ -239,4 +241,8 @@ export class HeroDetailParam {
setRole(title: number, scroll: number, teraph: number, school: number) {
this.role = { title, scroll, teraph, school };
}
setArtifact(artifact: ArtifactModelType) {
this.artifacts.push({ artifactId: artifact.artifactId, lv: artifact.lv });
}
}

View File

@@ -1,4 +1,5 @@
import { ArtifactModelType } from '../../db/Artifact';
import { Connect, EPlace, HeroSkin, HeroType, HeroUpdate, Talent } from '../../db/Hero';
import { JewelSe, JewelType, RandSe } from '../../db/Jewel';
import { gameData } from '../../pubUtils/data';
@@ -60,6 +61,7 @@ export class HeroParam {
skins: HeroSKinParam[] = []; // 皮肤
ePlace: EPlace[]; // 武将装备引用数组
artifact: number = 0;
talent: Talent[] = [];
usedTalentPoint: number = 0;
totalTalentPoint: number = 0;
@@ -93,6 +95,7 @@ export class HeroParam {
}
}
this.ePlace = hero.ePlace;
this.artifact = hero.artifact;
}
}
@@ -124,3 +127,27 @@ export class JewelParam {
}
}
}
export class ArtifactParam {
seqId: number; // 唯一id
artifactId: number; // 宝物id
id: number; // 物品id
lv: number; // 强化等级
hid: number; // 装备的武将
count: number;
inc: number; // 增减数量固定1
reason: number; // 来源id
constructor(artifact: ArtifactModelType, isPush?: boolean, reason?: number) {
this.seqId = artifact.seqId;
this.artifactId = artifact.artifactId;
this.id = artifact.id;
this.lv = artifact.lv;
this.hid = artifact.hid;
if(isPush) {
this.count = 1;
this.inc = 1;
this.reason = reason;
}
}
}

View File

@@ -1,3 +1,4 @@
import { ArtifactModelType } from "../../db/Artifact";
import { Connect, EPlace, HeroType } from "../../db/Hero";
import { JewelType } from "../../db/Jewel";
import { HeroScore } from "../battleField/pvp";
@@ -56,6 +57,8 @@ export class TaskParamInter {
jewels?: JewelType[]; // 天晶石
skinId?: number; // 皮肤id
artifacts?: ArtifactModelType[]; // 宝物
skipTower?: boolean;
debugInfo?: {condition: number};
};

View File

@@ -110,6 +110,13 @@ import { dicLadderMatch, loadLadderMatch } from "./dictionary/DicLadderMatch";
import { dicLadderDifficultRatio, loadLadderDifficultRatio } from "./dictionary/DicLadderDifficultRatio";
import { dicLadderRankReward, loadLadderRankReward } from "./dictionary/DicLadderRankReward";
import { dicGeneralGoods, loadGeneralGoods } from "./dictionary/DicGeneralGoods";
import { dicArtifact, dicArtifactByGid, dicArtifactByGidAndType, dicArtifactsByGroup, loadArtifact } from "./dictionary/DicArtifact";
import { DicArtifactLvPlan, dicArtifactLvPlan, loadArtifactLvPlan } from "./dictionary/DicArtifactLvPlan";
import { dicArtifactQuality, dicArtifactQualityById, loadArtifactQuality } from "./dictionary/DicArtifactQuality";
import { dicArtifactQualityPlan, loadArtifactQualityPlan } from "./dictionary/DicArtifactQualityPlan";
import { dicArtifactSeid, loadArtifactSeid } from "./dictionary/DicArtifactSeid";
import { DicArtifact } from "./dictionary/DicArtifact";
import { DicArtifactQuality } from "./dictionary/DicArtifactQuality";
export const gameData = {
daily: dicDaily,
@@ -277,6 +284,15 @@ export const gameData = {
comBattleRewardTime: new Array<{from: string, to: string}>(),
comBattleReward: dicComBattleReward,
relationGoods: dicGeneralGoods,
artifact: dicArtifact,
artifactByGid: dicArtifactByGid,
artifactByGidAndType: dicArtifactByGidAndType,
artifactLvPlan: dicArtifactLvPlan,
artifactQuality: dicArtifactQuality,
artifactQualityById: dicArtifactQualityById,
artifactQualityPlan: dicArtifactQualityPlan,
artifactSeid: dicArtifactSeid,
artifactByGroupAndQuality: dicArtifactsByGroup,
};
// 在此提供一些原先在gamedata中提供的方法以便更方便获取gameData数据
@@ -991,6 +1007,64 @@ export function getShopType(shop: number, type: number) {
return gameData.shopType.get(key)||null;
}
export function getDefArtifactByGid(gid: number): DicArtifact {
let artifactId = gameData.artifactByGid.get(gid);
return gameData.artifact.get(artifactId);
}
export function getDicArtifactQualityByStage(quality: number, qualityStage: number): DicArtifactQuality {
let uniqId = gameData.artifactQuality.get(`${quality}_${qualityStage}`);
return gameData.artifactQualityById.get(uniqId);
}
export function getNextArtifactQuality(quality: number, qualityStage: number): DicArtifactQuality {
let dicArtifactQuality = getDicArtifactQualityByStage(quality, qualityStage);
if(!dicArtifactQuality) return null;
return gameData.artifactQualityById.get(dicArtifactQuality.nextId);
}
export function getNextArtifact(artifactId: number): (DicArtifact&DicArtifactQuality) {
let dicArtifact = gameData.artifact.get(artifactId);
if(!dicArtifact) return null;
let dicNextArtifactQuality = getNextArtifactQuality(dicArtifact.quality, dicArtifact.qualityStage);
if(!dicNextArtifactQuality) return null;
let dicNextArtifact = getArtifactByGroupAndQuality(dicArtifact.group, dicArtifact.type, dicNextArtifactQuality.quality, dicNextArtifactQuality.qualityStage);
if(!dicNextArtifact) return null;
return {...dicNextArtifact, ...dicNextArtifactQuality}
}
export function getArtifactStageZero(artifactId: number): (DicArtifact&DicArtifactQuality) {
let dicArtifact = getArtifactWithQuality(artifactId);
if(!dicArtifact) return null;
let dicZeroArtifact = gameData.artifactByGroupAndQuality.get(`${dicArtifact.group}_${dicArtifact.type}_${dicArtifact.quality}_${0}`);
if(!dicZeroArtifact) return null;
let dicZeroArtifactQuality = getDicArtifactQualityByStage(dicArtifact.quality, dicArtifact.qualityStage);
if(!dicZeroArtifactQuality) return null;
return {...dicZeroArtifact, ...dicZeroArtifactQuality}
}
export function getArtifactByGroupAndQuality(group: string, type: number, quality: number, qualityStage: number): DicArtifact {
return gameData.artifactByGroupAndQuality.get(`${group}_${type}_${quality}_${qualityStage}`);
}
export function getDicArtifactLvByPlanId(planId: number, lv: number): DicArtifactLvPlan {
let map = gameData.artifactLvPlan.get(planId);
return map?.get(lv);
}
export function getArtifactByGidAndType(goodId: number, type: number): DicArtifact {
let artifactId = gameData.artifactByGidAndType.get(`${goodId}_${type}`);
return gameData.artifact.get(artifactId);
}
export function getArtifactWithQuality(artifactId: number): (DicArtifact&DicArtifactQuality) {
let dicArtifact = gameData.artifact.get(artifactId);
if(!dicArtifact) return null;
let dicArtifactQuality = getDicArtifactQualityByStage(dicArtifact.quality, dicArtifact.qualityStage);
if(!dicArtifactQuality) return null;
return {...dicArtifact, ...dicArtifactQuality}
}
// 初始加载
function initDatas() {
parseDicParam();
@@ -1180,6 +1254,11 @@ function loadDatas() {
loadLadderDifficultRatio();
loadLadderRankReward();
loadGeneralGoods();
loadArtifact();
loadArtifactLvPlan();
loadArtifactQuality();
loadArtifactQualityPlan();
loadArtifactSeid();
}
// 重载dicParam

View File

@@ -178,6 +178,8 @@ export const BAG = {
BAG_EQUIP_UPLIMITED: 500, // 背包中装备数量上限
BAG_GOODS_UPLIMITED: 4294967295, // 背包中可叠加的道具数量上限
BAG_RESOLVE_UPLIMITED: 500, // 背包中一键分解的上限
BAG_ARTIFACT_UPLIMITED: 500, // 背包中宝物数量上限
BAG_ARTIFACT_DECOMPOSE_UPLIMITED: 500, // 背包中宝物一键分解的上限
};
export const ATTRIBUTE = {
ATTRIBUTE_EQUIP_RATIO: '1&1|2&3|4&2|5&2', // 装备的基础属性系数
@@ -358,3 +360,10 @@ export const MINIGAME = {
MINIGAME_ARCHER_RANGE: '0&100|29&80|69&60|104&40|143&20|177&0', // 射箭小游戏圈数积分
MINIGAME_FLIPCARD_TYPE: 'baihe|guyuan|hongdou|huasheng|lianzi|nuomi|yimi|zao', // 翻牌游戏资源
};
export const JEWEL = {
JEWELQUALITY: '0&1|25&2|50&3|75&4|100&5', // 天晶词条颜色修改
};
export const ARTIFACT = {
TRANSFER_COST: '31002&100', // 宝物转换形态消耗
REBUILD_COST: '31002&100', // 宝物重铸消耗
};

View File

@@ -0,0 +1,73 @@
// 物品表
import { readFileAndParse, parseNumberList, } from '../util'
import { FILENAME, } from '../../consts'
const _ = require('lodash');
export interface DicArtifact {
// 宝物idt其中形态1和goodId必须一致
readonly artifactId: number;
// 宝物名
readonly name: string;
// 物品表id不同品质&品阶的同名宝物的物品id不同
readonly goodId: number;
// 同名宝物比如史记可以直接写shiji不过要当心多音词注意唯一性
readonly group: string;
// 形态
readonly type: number;
// 是否是初始形态,用于服务器获取
readonly isDefaultType: boolean;
// 品质每个宝物id直接对应一种品质
readonly quality: number;
// 品阶每个宝物id直接对应一种品阶
readonly qualityStage: number;
// 专属职业
readonly jobClass: number;
// 专属武将
readonly hid: number;
// 词条seid&seid
readonly seids: number[];
// 等级配置方案
readonly lvAttrPlan: number;
// 升品配置方案
readonly qualityAttrPlan: number;
}
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicArtifactKeys: KeysEnum<DicArtifact> = {
artifactId: true,
name: true,
goodId: true,
group: true,
type: true,
isDefaultType: true,
quality: true,
qualityStage: true,
jobClass: true,
hid: true,
seids: true,
lvAttrPlan: true,
qualityAttrPlan: true,
}
export const dicArtifact = new Map<number, DicArtifact>();
export const dicArtifactByGid = new Map<number, number>();
export const dicArtifactByGidAndType = new Map<string, number>();
export const dicArtifactsByGroup = new Map<string, DicArtifact>();
export function loadArtifact() {
dicArtifact.clear();
dicArtifactByGid.clear();
dicArtifactByGidAndType.clear();
dicArtifactsByGroup.clear();
let arr = readFileAndParse(FILENAME.DIC_ARTIFACT);
arr.forEach(o => {
o.seids = parseNumberList(o.seids);
if(o.isDefaultType) dicArtifactByGid.set(o.goodId, o.artifactId);
dicArtifactByGidAndType.set(`${o.goodId}_${o.type}`, o.artifactId);
dicArtifact.set(o.artifactId, _.pick(o, Object.keys(DicArtifactKeys)));
dicArtifactsByGroup.set(`${o.group}_${o.type}_${o.quality}_${o.qualityStage}`, o);
});
arr = undefined;
}

View File

@@ -0,0 +1,54 @@
// 物品表
import { readFileAndParse, parseGoodStr, decodeArrayListStr, } from '../util'
import { FILENAME, } from '../../consts'
import { RewardInter } from '../interface';
const _ = require('lodash');
export interface DicArtifactLvPlan {
// 方案id
planId: number;
// 等级
lv: number;
// 升到这级需要消耗什么id&count
consumes: RewardInter[];
// 这级的属性
attr: {id: number, attr: number}[];
}
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicArtifactLvPlanKeys: KeysEnum<DicArtifactLvPlan> = {
planId: true,
lv: true,
consumes: true,
attr: true,
}
export const dicArtifactLvPlan = new Map<number, Map<number, DicArtifactLvPlan>>(); // planId => lv => dic
export function loadArtifactLvPlan() {
dicArtifactLvPlan.clear();
let arr = readFileAndParse(FILENAME.DIC_ARTIFACT_LV_PLAN);
arr.forEach(o => {
o.consumes = parseGoodStr(o.consumes);
o.attr = parseAttr(o.attr);
if(!dicArtifactLvPlan.has(o.planId)) {
dicArtifactLvPlan.set(o.planId, new Map());
}
dicArtifactLvPlan.get(o.planId)?.set(o.lv, _.pick(o, Object.keys(DicArtifactLvPlanKeys)));
});
arr = undefined;
}
function parseAttr(str: string) {
let result = new Array<{id: number, attr: number}>();
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [id, attr] of decodeArr) {
if(isNaN(parseInt(id)) || isNaN(parseInt(attr))) {
throw new Error('data table format wrong');
}
result.push({id: parseInt(id), attr: parseInt(attr)});
}
return result
}

View File

@@ -0,0 +1,66 @@
// 物品表
import { readFileAndParse, parseGoodStr, } from '../util'
import { FILENAME, } from '../../consts'
import { RewardInter } from '../interface';
const _ = require('lodash');
export interface DicArtifactQuality {
// 唯一id品质+品阶=唯一
uniqId: number;
// 品质key1
quality: number;
// 品阶key2
qualityStage: number;
// 这个品质下最大的等级
maxLv: number;
// 合成相关
// 可以合成到他这个品质的uniqId即原料的品质+品阶
previousId: number;
// 下一阶uniqId
nextId: number;
// 作为狗粮的宝物品质uniqId
materialId: number;
// 作为狗粮的宝物的数量
materialCnt: number;
// 作为狗粮的是否需要同名 1-是 0-不是
materialGroup: number;
// 是否可以分解 1-是 0-不是
canDecompose: number;
// 是否可以一键合成 1-是 0-不是
canComposeAll: number;
// 这个品质可以替换的通用道具id&count。分解同样用这个字段不可分解填&
generalItem: RewardInter[];
}
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicArtifactQualityKeys: KeysEnum<DicArtifactQuality> = {
uniqId: true,
quality: true,
qualityStage: true,
maxLv: true,
previousId: true,
nextId: true,
materialId: true,
materialCnt: true,
materialGroup: true,
canDecompose: true,
canComposeAll: true,
generalItem: true,
}
export const dicArtifactQuality = new Map<string, number>(); // quality+qualityStage
export const dicArtifactQualityById = new Map<number, DicArtifactQuality>(); // uniqId
export function loadArtifactQuality() {
dicArtifactQuality.clear();
dicArtifactQualityById.clear();
let arr = readFileAndParse(FILENAME.DIC_ARTIFACT_QUALITY);
arr.forEach(o => {
o.generalItem = parseGoodStr(o.generalItem);
dicArtifactQualityById.set(o.uniqId, _.pick(o, Object.keys(DicArtifactQualityKeys)));
dicArtifactQuality.set(`${o.quality}_${o.qualityStage}`, o.uniqId);
});
arr = undefined;
}

View File

@@ -0,0 +1,44 @@
// 物品表
import { readFileAndParse, decodeArrayListStr, } from '../util'
import { FILENAME, } from '../../consts'
const _ = require('lodash');
export interface DicArtifactQualityPlan {
// 方案id
planId: number;
// 这级的属性
attr: {id: number, attr: number}[];
}
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicArtifactQualityPlanKeys: KeysEnum<DicArtifactQualityPlan> = {
planId: true,
attr: true,
}
export const dicArtifactQualityPlan = new Map<number, DicArtifactQualityPlan>();
export function loadArtifactQualityPlan() {
dicArtifactQualityPlan.clear();
let arr = readFileAndParse(FILENAME.DIC_ARTIFACT_QUALITY_PLAN);
arr.forEach(o => {
o.attr = parseAttr(o.attr);
dicArtifactQualityPlan.set(o.planId, _.pick(o, Object.keys(DicArtifactQualityPlanKeys)));
});
arr = undefined;
}
function parseAttr(str: string) {
let result = new Array<{id: number, attr: number}>();
if(!str) return result;
let decodeArr = decodeArrayListStr(str);
for(let [id, attr] of decodeArr) {
if(isNaN(parseInt(id)) || isNaN(parseInt(attr))) {
throw new Error('data table format wrong');
}
result.push({id: parseInt(id), attr: parseInt(attr)});
}
return result
}

View File

@@ -0,0 +1,36 @@
// 物品表
import { readFileAndParse, } from '../util'
import { FILENAME, } from '../../consts'
const _ = require('lodash');
export interface DicArtifactQuality {
// 对应的se表的id
seid: number;
// 解锁的品质
quality: number;
// 生效的职业0表示全生效
jobClass: number;
// 生效的武将
hid: number;
}
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicArtifactSeidKeys: KeysEnum<DicArtifactQuality> = {
seid: true,
quality: true,
jobClass: true,
hid: true,
}
export const dicArtifactSeid = new Map<number, DicArtifactQuality>(); // seid => dic
export function loadArtifactSeid() {
dicArtifactSeid.clear();
let arr = readFileAndParse(FILENAME.DIC_ARTIFACT_SEID);
arr.forEach(o => {
dicArtifactSeid.set(o.seid, _.pick(o, Object.keys(DicArtifactSeidKeys)));
});
arr = undefined;
}

View File

@@ -745,6 +745,15 @@ export function addToMap<T>(map: Map<T, number>, id: T, value: number) {
}
}
export function arrToMap<T>(arr: T[], getKey: (obj: T) => number): Map<number, T> {
let map = new Map();
for(let obj of arr) {
let key = getKey(obj);
map.set(key, obj);
}
return map;
}
// /**
// * 计算最强阵容战力
// * @param role

View File

@@ -236,5 +236,12 @@
"sendName": "您忠诚的小跟班",
"content": "亲爱的主公,在诸位百家传人的火热购买下,糜氏集市折上加折!您购买的%d最终达成%d折现退还您%d元宝请查收",
"time": 720
},
{
"id": 34,
"title": "&",
"sendName": "您忠诚的小跟班",
"content": "亲爱的主公,您的背包中宝物数量已满,请及时清理背包哦。溢出装备已通过邮件发放,请查收",
"time": 2160
}
]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,152 @@
[
{
"uniqId": 1,
"name": "蓝",
"quality": 1,
"qualityStage": 0,
"maxLv": 20,
"previousId": 0,
"materialId": 0,
"materialCnt": 0,
"materialGroup": 0,
"canDecompose": 0,
"canComposeAll": 1,
"generalItem": "&",
"nextId": 2
},
{
"uniqId": 2,
"name": "紫",
"quality": 2,
"qualityStage": 0,
"maxLv": 40,
"previousId": 1,
"materialId": 1,
"materialCnt": 2,
"materialGroup": 1,
"canDecompose": 0,
"canComposeAll": 1,
"generalItem": "&",
"nextId": 3
},
{
"uniqId": 3,
"name": "橙",
"quality": 3,
"qualityStage": 0,
"maxLv": 60,
"previousId": 2,
"materialId": 2,
"materialCnt": 2,
"materialGroup": 1,
"canDecompose": 1,
"canComposeAll": 0,
"generalItem": "82002&1",
"nextId": 4
},
{
"uniqId": 4,
"name": "橙+1",
"quality": 3,
"qualityStage": 1,
"maxLv": 60,
"previousId": 3,
"materialId": 3,
"materialCnt": 1,
"materialGroup": 0,
"canDecompose": 1,
"canComposeAll": 0,
"generalItem": "82002&2",
"nextId": 5
},
{
"uniqId": 5,
"name": "橙+2",
"quality": 3,
"qualityStage": 2,
"maxLv": 60,
"previousId": 4,
"materialId": 3,
"materialCnt": 2,
"materialGroup": 0,
"canDecompose": 1,
"canComposeAll": 0,
"generalItem": "82002&3",
"nextId": 6
},
{
"uniqId": 6,
"name": "红",
"quality": 4,
"qualityStage": 0,
"maxLv": 80,
"previousId": 5,
"materialId": 5,
"materialCnt": 2,
"materialGroup": 1,
"canDecompose": 1,
"canComposeAll": 0,
"generalItem": "82003&1",
"nextId": 7
},
{
"uniqId": 7,
"name": "红+1",
"quality": 4,
"qualityStage": 1,
"maxLv": 80,
"previousId": 6,
"materialId": 6,
"materialCnt": 1,
"materialGroup": 0,
"canDecompose": 1,
"canComposeAll": 0,
"generalItem": "82003&2",
"nextId": 8
},
{
"uniqId": 8,
"name": "红+2",
"quality": 4,
"qualityStage": 2,
"maxLv": 80,
"previousId": 7,
"materialId": 6,
"materialCnt": 2,
"materialGroup": 0,
"canDecompose": 1,
"canComposeAll": 0,
"generalItem": "82003&3",
"nextId": 9
},
{
"uniqId": 9,
"name": "红+3",
"quality": 4,
"qualityStage": 3,
"maxLv": 80,
"previousId": 8,
"materialId": 6,
"materialCnt": 2,
"materialGroup": 0,
"canDecompose": 1,
"canComposeAll": 0,
"generalItem": "82003&4",
"nextId": 10
},
{
"uniqId": 10,
"name": "金",
"quality": 5,
"qualityStage": 0,
"maxLv": 100,
"previousId": 9,
"materialId": 9,
"materialCnt": 2,
"materialGroup": 1,
"canDecompose": 1,
"canComposeAll": 0,
"generalItem": "&",
"nextId": 0
}
]

View File

@@ -0,0 +1,632 @@
[
{
"id": 1,
"planId": 101,
"attr": "1&452|2&120|4&86|5&68"
},
{
"id": 2,
"planId": 102,
"attr": "1&1130|2&300|4&215|5&170"
},
{
"id": 3,
"planId": 103,
"attr": "1&2260|2&600|4&430|5&340"
},
{
"id": 4,
"planId": 104,
"attr": "1&3616|2&960|4&688|5&544"
},
{
"id": 5,
"planId": 105,
"attr": "1&4972|2&1320|4&946|5&748"
},
{
"id": 6,
"planId": 106,
"attr": "1&6780|2&1800|4&1290|5&1020"
},
{
"id": 7,
"planId": 107,
"attr": "1&9040|2&2400|4&1720|5&1360"
},
{
"id": 8,
"planId": 108,
"attr": "1&12204|2&3240|4&2322|5&1836"
},
{
"id": 9,
"planId": 109,
"attr": "1&15820|2&4200|4&3010|5&2380"
},
{
"id": 10,
"planId": 110,
"attr": "1&20340|2&5400|4&3870|5&3060"
},
{
"id": 11,
"planId": 201,
"attr": "1&432|2&126|4&80|5&74"
},
{
"id": 12,
"planId": 202,
"attr": "1&1080|2&315|4&200|5&185"
},
{
"id": 13,
"planId": 203,
"attr": "1&2160|2&630|4&400|5&370"
},
{
"id": 14,
"planId": 204,
"attr": "1&3456|2&1008|4&640|5&592"
},
{
"id": 15,
"planId": 205,
"attr": "1&4752|2&1386|4&880|5&814"
},
{
"id": 16,
"planId": 206,
"attr": "1&6480|2&1890|4&1200|5&1110"
},
{
"id": 17,
"planId": 207,
"attr": "1&8640|2&2520|4&1600|5&1480"
},
{
"id": 18,
"planId": 208,
"attr": "1&11664|2&3402|4&2160|5&1998"
},
{
"id": 19,
"planId": 209,
"attr": "1&15120|2&4410|4&2800|5&2590"
},
{
"id": 20,
"planId": 210,
"attr": "1&19440|2&5670|4&3600|5&3330"
},
{
"id": 21,
"planId": 301,
"attr": "1&420|2&134|4&78|5&72"
},
{
"id": 22,
"planId": 302,
"attr": "1&1050|2&335|4&195|5&180"
},
{
"id": 23,
"planId": 303,
"attr": "1&2100|2&670|4&390|5&360"
},
{
"id": 24,
"planId": 304,
"attr": "1&3360|2&1072|4&624|5&576"
},
{
"id": 25,
"planId": 305,
"attr": "1&4620|2&1474|4&858|5&792"
},
{
"id": 26,
"planId": 306,
"attr": "1&6300|2&2010|4&1170|5&1080"
},
{
"id": 27,
"planId": 307,
"attr": "1&8400|2&2680|4&1560|5&1440"
},
{
"id": 28,
"planId": 308,
"attr": "1&11340|2&3618|4&2106|5&1944"
},
{
"id": 29,
"planId": 309,
"attr": "1&14700|2&4690|4&2730|5&2520"
},
{
"id": 30,
"planId": 310,
"attr": "1&18900|2&6030|4&3510|5&3240"
},
{
"id": 31,
"planId": 401,
"attr": "1&414|2&136|4&74|5&76"
},
{
"id": 32,
"planId": 402,
"attr": "1&1035|2&340|4&185|5&190"
},
{
"id": 33,
"planId": 403,
"attr": "1&2070|2&680|4&370|5&380"
},
{
"id": 34,
"planId": 404,
"attr": "1&3312|2&1088|4&592|5&608"
},
{
"id": 35,
"planId": 405,
"attr": "1&4554|2&1496|4&814|5&836"
},
{
"id": 36,
"planId": 406,
"attr": "1&6210|2&2040|4&1110|5&1140"
},
{
"id": 37,
"planId": 407,
"attr": "1&8280|2&2720|4&1480|5&1520"
},
{
"id": 38,
"planId": 408,
"attr": "1&11178|2&3672|4&1998|5&2052"
},
{
"id": 39,
"planId": 409,
"attr": "1&14490|2&4760|4&2590|5&2660"
},
{
"id": 40,
"planId": 410,
"attr": "1&18630|2&6120|4&3330|5&3420"
},
{
"id": 41,
"planId": 501,
"attr": "1&406|2&128|4&76|5&84"
},
{
"id": 42,
"planId": 502,
"attr": "1&1015|2&320|4&190|5&210"
},
{
"id": 43,
"planId": 503,
"attr": "1&2030|2&640|4&380|5&420"
},
{
"id": 44,
"planId": 504,
"attr": "1&3248|2&1024|4&608|5&672"
},
{
"id": 45,
"planId": 505,
"attr": "1&4466|2&1408|4&836|5&924"
},
{
"id": 46,
"planId": 506,
"attr": "1&6090|2&1920|4&1140|5&1260"
},
{
"id": 47,
"planId": 507,
"attr": "1&8120|2&2560|4&1520|5&1680"
},
{
"id": 48,
"planId": 508,
"attr": "1&10962|2&3456|4&2052|5&2268"
},
{
"id": 49,
"planId": 509,
"attr": "1&14210|2&4480|4&2660|5&2940"
},
{
"id": 50,
"planId": 510,
"attr": "1&18270|2&5760|4&3420|5&3780"
},
{
"id": 51,
"planId": 601,
"attr": "1&374|2&138|4&70|5&90"
},
{
"id": 52,
"planId": 602,
"attr": "1&935|2&345|4&175|5&225"
},
{
"id": 53,
"planId": 603,
"attr": "1&1870|2&690|4&350|5&450"
},
{
"id": 54,
"planId": 604,
"attr": "1&2992|2&1104|4&560|5&720"
},
{
"id": 55,
"planId": 605,
"attr": "1&4114|2&1518|4&770|5&990"
},
{
"id": 56,
"planId": 606,
"attr": "1&5610|2&2070|4&1050|5&1350"
},
{
"id": 57,
"planId": 607,
"attr": "1&7480|2&2760|4&1400|5&1800"
},
{
"id": 58,
"planId": 608,
"attr": "1&10098|2&3726|4&1890|5&2430"
},
{
"id": 59,
"planId": 609,
"attr": "1&13090|2&4830|4&2450|5&3150"
},
{
"id": 60,
"planId": 610,
"attr": "1&16830|2&6210|4&3150|5&4050"
},
{
"id": 61,
"planId": 701,
"attr": "1&386|2&130|4&72|5&92"
},
{
"id": 62,
"planId": 702,
"attr": "1&965|2&325|4&180|5&230"
},
{
"id": 63,
"planId": 703,
"attr": "1&1930|2&650|4&360|5&460"
},
{
"id": 64,
"planId": 704,
"attr": "1&3088|2&1040|4&576|5&736"
},
{
"id": 65,
"planId": 705,
"attr": "1&4246|2&1430|4&792|5&1012"
},
{
"id": 66,
"planId": 706,
"attr": "1&5790|2&1950|4&1080|5&1380"
},
{
"id": 67,
"planId": 707,
"attr": "1&7720|2&2600|4&1440|5&1840"
},
{
"id": 68,
"planId": 708,
"attr": "1&10422|2&3510|4&1944|5&2484"
},
{
"id": 69,
"planId": 709,
"attr": "1&13510|2&4550|4&2520|5&3220"
},
{
"id": 70,
"planId": 710,
"attr": "1&17370|2&5850|4&3240|5&4140"
},
{
"id": 71,
"planId": 1101,
"attr": "1&4520|2&1200|4&860|5&680"
},
{
"id": 72,
"planId": 1102,
"attr": "1&6780|2&1800|4&1290|5&1020"
},
{
"id": 73,
"planId": 1103,
"attr": "1&10170|2&2700|4&1935|5&1530"
},
{
"id": 74,
"planId": 1104,
"attr": "1&14690|2&3900|4&2795|5&2210"
},
{
"id": 75,
"planId": 1105,
"attr": "1&20340|2&5400|4&3870|5&3060"
},
{
"id": 76,
"planId": 1106,
"attr": "1&27120|2&7200|4&5160|5&4080"
},
{
"id": 77,
"planId": 1107,
"attr": "1&35030|2&9300|4&6665|5&5270"
},
{
"id": 78,
"planId": 1108,
"attr": "1&45200|2&12000|4&8600|5&6800"
},
{
"id": 79,
"planId": 1201,
"attr": "1&4320|2&1260|4&800|5&740"
},
{
"id": 80,
"planId": 1202,
"attr": "1&6480|2&1890|4&1200|5&1110"
},
{
"id": 81,
"planId": 1203,
"attr": "1&9720|2&2835|4&1800|5&1665"
},
{
"id": 82,
"planId": 1204,
"attr": "1&14040|2&4095|4&2600|5&2405"
},
{
"id": 83,
"planId": 1205,
"attr": "1&19440|2&5670|4&3600|5&3330"
},
{
"id": 84,
"planId": 1206,
"attr": "1&25920|2&7560|4&4800|5&4440"
},
{
"id": 85,
"planId": 1207,
"attr": "1&33480|2&9765|4&6200|5&5735"
},
{
"id": 86,
"planId": 1208,
"attr": "1&43200|2&12600|4&8000|5&7400"
},
{
"id": 87,
"planId": 1301,
"attr": "1&4200|2&1340|4&780|5&720"
},
{
"id": 88,
"planId": 1302,
"attr": "1&6300|2&2010|4&1170|5&1080"
},
{
"id": 89,
"planId": 1303,
"attr": "1&9450|2&3015|4&1755|5&1620"
},
{
"id": 90,
"planId": 1304,
"attr": "1&13650|2&4355|4&2535|5&2340"
},
{
"id": 91,
"planId": 1305,
"attr": "1&18900|2&6030|4&3510|5&3240"
},
{
"id": 92,
"planId": 1306,
"attr": "1&25200|2&8040|4&4680|5&4320"
},
{
"id": 93,
"planId": 1307,
"attr": "1&32550|2&10385|4&6045|5&5580"
},
{
"id": 94,
"planId": 1308,
"attr": "1&42000|2&13400|4&7800|5&7200"
},
{
"id": 95,
"planId": 1401,
"attr": "1&4140|2&1360|4&740|5&760"
},
{
"id": 96,
"planId": 1402,
"attr": "1&6210|2&2040|4&1110|5&1140"
},
{
"id": 97,
"planId": 1403,
"attr": "1&9315|2&3060|4&1665|5&1710"
},
{
"id": 98,
"planId": 1404,
"attr": "1&13455|2&4420|4&2405|5&2470"
},
{
"id": 99,
"planId": 1405,
"attr": "1&18630|2&6120|4&3330|5&3420"
},
{
"id": 100,
"planId": 1406,
"attr": "1&24840|2&8160|4&4440|5&4560"
},
{
"id": 101,
"planId": 1407,
"attr": "1&32085|2&10540|4&5735|5&5890"
},
{
"id": 102,
"planId": 1408,
"attr": "1&41400|2&13600|4&7400|5&7600"
},
{
"id": 103,
"planId": 1501,
"attr": "1&4060|2&1280|4&760|5&840"
},
{
"id": 104,
"planId": 1502,
"attr": "1&6090|2&1920|4&1140|5&1260"
},
{
"id": 105,
"planId": 1503,
"attr": "1&9135|2&2880|4&1710|5&1890"
},
{
"id": 106,
"planId": 1504,
"attr": "1&13195|2&4160|4&2470|5&2730"
},
{
"id": 107,
"planId": 1505,
"attr": "1&18270|2&5760|4&3420|5&3780"
},
{
"id": 108,
"planId": 1506,
"attr": "1&24360|2&7680|4&4560|5&5040"
},
{
"id": 109,
"planId": 1507,
"attr": "1&31465|2&9920|4&5890|5&6510"
},
{
"id": 110,
"planId": 1508,
"attr": "1&40600|2&12800|4&7600|5&8400"
},
{
"id": 111,
"planId": 1601,
"attr": "1&3740|2&1380|4&700|5&900"
},
{
"id": 112,
"planId": 1602,
"attr": "1&5610|2&2070|4&1050|5&1350"
},
{
"id": 113,
"planId": 1603,
"attr": "1&8415|2&3105|4&1575|5&2025"
},
{
"id": 114,
"planId": 1604,
"attr": "1&12155|2&4485|4&2275|5&2925"
},
{
"id": 115,
"planId": 1605,
"attr": "1&16830|2&6210|4&3150|5&4050"
},
{
"id": 116,
"planId": 1606,
"attr": "1&22440|2&8280|4&4200|5&5400"
},
{
"id": 117,
"planId": 1607,
"attr": "1&28985|2&10695|4&5425|5&6975"
},
{
"id": 118,
"planId": 1608,
"attr": "1&37400|2&13800|4&7000|5&9000"
},
{
"id": 119,
"planId": 1701,
"attr": "1&3860|2&1300|4&720|5&920"
},
{
"id": 120,
"planId": 1702,
"attr": "1&5790|2&1950|4&1080|5&1380"
},
{
"id": 121,
"planId": 1703,
"attr": "1&8685|2&2925|4&1620|5&2070"
},
{
"id": 122,
"planId": 1704,
"attr": "1&12545|2&4225|4&2340|5&2990"
},
{
"id": 123,
"planId": 1705,
"attr": "1&17370|2&5850|4&3240|5&4140"
},
{
"id": 124,
"planId": 1706,
"attr": "1&23160|2&7800|4&4320|5&5520"
},
{
"id": 125,
"planId": 1707,
"attr": "1&29915|2&10075|4&5580|5&7130"
},
{
"id": 126,
"planId": 1708,
"attr": "1&38600|2&13000|4&7200|5&9200"
}
]

View File

@@ -0,0 +1,37 @@
[
{
"seid": 6201411,
"artifactName": "龙雀刀",
"quality": 1,
"jobClass": 1,
"hid": 0
},
{
"seid": 1000001051,
"artifactName": "龙雀刀",
"quality": 2,
"jobClass": 1,
"hid": 0
},
{
"seid": 6201511,
"artifactName": "龙雀刀",
"quality": 3,
"jobClass": 1,
"hid": 0
},
{
"seid": 1000002051,
"artifactName": "龙雀刀",
"quality": 4,
"jobClass": 1,
"hid": 0
},
{
"seid": 5601311,
"artifactName": "龙雀刀",
"quality": 5,
"jobClass": 1,
"hid": 0
}
]

View File

@@ -1058,5 +1058,35 @@
"content": 0,
"condition": "level&",
"sumType": 1
},
{
"id": 127,
"name": "宝物",
"info": "强化X件宝物至X级",
"param": "count&lv&",
"string": "数量&等级",
"content": 0,
"condition": "count",
"sumType": 1
},
{
"id": 128,
"name": "宝物",
"info": "穿戴X件品质为X的宝物",
"param": "count&quality&",
"string": "数量&品质",
"content": 0,
"condition": "count",
"sumType": 1
},
{
"id": 129,
"name": "宝物",
"info": "合成X次宝物",
"param": "count&",
"string": "次数&",
"content": 0,
"condition": "count",
"sumType": 2
}
]