feat(诸子列传): 添加功能

This commit is contained in:
luying
2023-07-12 17:38:19 +08:00
parent b1af8ad204
commit 1eb6f76cce
25 changed files with 5475 additions and 71 deletions

View File

@@ -63,6 +63,47 @@ export enum ABI_TYPE {
ABI_BLOOD_REBOUND = 27,
/** 反击伤害 */
ABI_STRIKE_BACK = 28,
/** 加怒气值 */
ABI_GAIN_AP = 29,
/** 怒气提升效率 / 1000*/
ABI_RAGE_ADD_PERCENT = 30,
/** 格挡减伤提升效率 / 1000*/
ABI_BLOCK_ADD_PERCENT = 31,
/** 护盾 */
ABI_SHIELD = 32,
/** 竞技增伤 */
ABI_PVP_ADD = 33,
/** 竞技减伤 */
ABI_PVP_MINUS = 34,
/** 对魏增伤 */
ABI_WEI_ADD = 35,
/** 对魏减伤 */
ABI_WEI_MINUS = 36,
/** 对蜀增伤 */
ABI_SHU_ADD = 37,
/** 对蜀减伤 */
ABI_SHU_MINUS = 38,
/** 对吴增伤 */
ABI_WU_ADD = 39,
/** 对吴减伤 */
ABI_WU_MINUS = 40,
/** 对群增伤 */
ABI_OTHER_ADD = 41,
/** 对群减伤 */
ABI_OTHER_MINUS = 42,
ABI_MAX,
}
@@ -95,8 +136,35 @@ export const ABI_TYPE_SUB = [
ABI_TYPE.ABI_ACCEPT_TREATMENT_DECREASE,
ABI_TYPE.ABI_BLOOD_REBOUND,
ABI_TYPE.ABI_STRIKE_BACK,
ABI_TYPE.ABI_GAIN_AP,
ABI_TYPE.ABI_RAGE_ADD_PERCENT,
ABI_TYPE.ABI_BLOCK_ADD_PERCENT,
ABI_TYPE.ABI_SHIELD,
ABI_TYPE.ABI_PVP_ADD,
ABI_TYPE.ABI_PVP_MINUS,
ABI_TYPE.ABI_WEI_ADD,
ABI_TYPE.ABI_WEI_MINUS,
ABI_TYPE.ABI_SHU_ADD,
ABI_TYPE.ABI_SHU_MINUS,
ABI_TYPE.ABI_WU_ADD,
ABI_TYPE.ABI_WU_MINUS,
ABI_TYPE.ABI_OTHER_ADD,
ABI_TYPE.ABI_OTHER_MINUS
];
export const ABI_TYPE_PVP = [
ABI_TYPE.ABI_PVP_ADD,
ABI_TYPE.ABI_PVP_MINUS,
ABI_TYPE.ABI_WEI_ADD,
ABI_TYPE.ABI_WEI_MINUS,
ABI_TYPE.ABI_SHU_ADD,
ABI_TYPE.ABI_SHU_MINUS,
ABI_TYPE.ABI_WU_ADD,
ABI_TYPE.ABI_WU_MINUS,
ABI_TYPE.ABI_OTHER_ADD,
ABI_TYPE.ABI_OTHER_MINUS
]
export enum SEID_TYPE {
/**属性固定值加成(数值) */
FIX = 1,

View File

@@ -40,6 +40,8 @@ export enum HERO_SYSTEM_TYPE {
ARTIFACT_QUALITY = 37, // 宝物品质
ARTIFACT_TRANSFER = 38, // 宝物转换
ARTIFACT_REBUILD = 39, // 宝物重铸
AUTHOR_BOOK_STAR = 40, // 诸子列传升星
AUTHOR_BOOK_SUB_RESET = 41, // 诸子列传重置
};
// 武将上限
@@ -66,4 +68,10 @@ export const HERO_INITIAL_QUALITY = {
UR: 4,
}
export const CHECK_HERO_CONSUME = true;
export const CHECK_HERO_CONSUME = true;
// 诸子列传解锁条件
export enum AUTHOR_BOOK_LIMIT_TYPE {
ALL = 1, // 所有的进度解锁
ASSIGN = 2, // 指定的进度解锁
}

View File

@@ -39,6 +39,7 @@ export const CONSUME_TYPE = {
DRAWING: 17, // 图纸
VOUCHER: 18, // 代金券
ARTIFACT_GENERAL: 19, // 宝物通用
SPIRIT_STONE: 20, // 灵石
};
export enum ROLE_TERAPH {
@@ -155,6 +156,7 @@ const itid_array = [
{ id: 64, name: '宝物', table: 'artifact' },
{ id: 65, name: '宝物通用材料', table: 'item', type: CONSUME_TYPE.ARTIFACT_GENERAL },
{ id: 66, name: '活动限时材料', table: 'activityItem' },
{ id: 67, name: '灵石', table: 'item', type: CONSUME_TYPE.SPIRIT_STONE },
];
export const ITID = new Map<number, { id: number, name: string, table: string, type?: number, isCurrency?: boolean, equipJewel?: number }>();

View File

@@ -57,7 +57,7 @@ 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', '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', 'activityItems', 'customerLink', 'isClosePush', 'hasComment'];
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', 'activityItems', 'customerLink', 'isClosePush', 'hasComment', 'authorBook'];
export enum SURVEY_SELECT {
FIND = '-__v -_id -surveyName -roleIndex -reward -mailContent -receivedRole -createdAt -updatedAt'

View File

@@ -646,6 +646,10 @@ export const FILENAME = {
DIC_GK_GVGBATTLE: 'dic_zyz_gk_GVGBattle',
DIC_GVG_VESTIGE_PLAYER_RANK: 'dic_zyz_GVGVestigePlayerRank',
DIC_PUSH_MESSAGE: 'dic_zyz_pushMessage',
DIC_AUTHORS_BOOK: 'dic_zyz_authorsBook',
DIC_AUTHORS_BOOK_POINT: 'dic_zyz_authorsBookPoint',
DIC_AUTHORS_BOOK_SUB: 'dic_zyz_authorsBookSub',
DIC_AUTHORS_GOODID: 'dic_zyz_authorsGoodId',
}
export const WAR_RELATE_TABLES = [
@@ -1194,6 +1198,11 @@ export enum ITEM_CHANGE_REASON {
ACT_DRAGON_BOAT_BUY_COST = 187, // 购买龙舟挑战奖励
ACT_ENTERTAIN = 188, // 宴请百家奖励
ACT_ENTERTAIN_BUY_COST = 189, // 宴请百家奖励花费
AUTHOR_BOOK_STAR_UP = 190, // 诸子列传升星
AUTHOR_BOOK_STAR_RETURN = 191, // 诸子列传升星并发返回
AUTHOR_BOOK_SUB_RESET = 192, // 重置列传
DECOMPOSE_SPIRIT = 193, // 分解英灵
BUY_SPIRIT = 194, // 分解英灵
}
export enum TA_EVENT {

View File

@@ -533,6 +533,10 @@ export const STATUS = {
ROLE_SCHOOL_POSITION_UNLOCK_NOT_NEED: { code: 30605, simStr: '该位置已解锁' },
ROLE_SCROLL_REACH_MAX: { code: 30606, simStr: '已经升到可以升的最高等级' },
// 诸子列传 30700-30701
AUTHOR_BOOK_LOCK: { code: 30700, simStr: '诸子列传本篇解锁中' },
AUTHOR_BOOK_SUB_MAX: { code: 30701, simStr: '诸子列传条目已达到最大星级' },
// 好友30700-30799
FRIEND_MY_CNT_MAX: { code: 30700, simStr: '好友数量已达上限' },
FRIEND_THEY_CNT_MAX: { code: 30701, simStr: '玩家好友已满' },

59
shared/db/AuthorBook.ts Normal file
View File

@@ -0,0 +1,59 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, modelOptions } from '@typegoose/typegoose';
/**
* 诸子百家
**/
class Author {
@prop({ required: true, default: 0 })
subId: number; // 条目id
@prop({ required: true, default: 0 })
star: number; // 星级
}
@index({ roleId: 1, bookId: 1 })
export default class AuthorBook extends BaseModel {
@prop({ required: true, default: '' })
roleId: string; // 举报人的 roleId
@prop({ required: true, default: '' })
bookId: number; // 列传id
@prop({ required: true, default: '' })
progress: number; // 进度
@prop({ required: true, default: [], type: Author, _id: false })
authors: Author[];
public static async findByRoleId(roleId: string) {
let result: AuthorBookType[] = await AuthorBookModel.find({ roleId }).select('-_id -roleId').lean();
return result;
}
public static async findByBookId(roleId: string, bookId: number) {
let result: AuthorBookType = await AuthorBookModel.findOne({ roleId, bookId }).select('-_id').lean();
return result;
}
// 升星
public static async upStar(roleId: string, bookId: number, subId: number, star: number, addProgress: number, initAuthors: number[]) {
await AuthorBookModel.findOneAndUpdate({ roleId, bookId }, { $setOnInsert: { progress: 0, authors: initAuthors.map(subId => ({ subId, star: 0 })) } }, { upsert: true });
let result: AuthorBookType = await AuthorBookModel.findOneAndUpdate({ roleId, bookId, 'authors.subId': subId, 'authors.star': star }, { $inc: { progress: addProgress, 'authors.$.star': 1 } }, { new: true }).lean();
return result;
}
// 重置目录
public static async resetSub(roleId: string, bookId: number, subId: number, oldStar: number, incProgress: number) {
let result: AuthorBookType = await AuthorBookModel.findOneAndUpdate({ roleId, bookId, 'authors.subId': subId, 'authors.star': oldStar }, { $set: {'authors.$.star': 0}, $inc: { progress: incProgress } }, { new: true }).lean();
return result;
}
}
export const AuthorBookModel = getModelForClass(AuthorBook);
export interface AuthorBookType extends Pick<DocumentType<AuthorBook>, keyof AuthorBook> { }
export type AuthorBookParam = Partial<AuthorBookType>;

View File

@@ -136,6 +136,10 @@ import { DicGVGVestigePlayerRank, dicGVGVestigePlayerRank, loadGVGVestigePlayerR
import { dicGVGAreaPoint, loadGVGAreaPoint, dicGVGPointsByAreaId } from "./dictionary/DicGVGAreaPoint";
import { DicGVGBattleRankReward, dicGVGBattleRankReward, loadGVGBattleRankReward } from './dictionary/DicGVGBattleRankReward';
import { dicPushMessage, loadPushMessage } from './dictionary/DicPushMessage';
import { dicAuthorsBookGoodId, loadAuthorsBookGoodId } from "./dictionary/DicAuthorsBookGoodId";
import { dicAuthorsBookMaxProgress, dicAuthorsBookSubs, dicAuthorsBookSubStar, loadAuthorsBookSub } from "./dictionary/DicAuthorsBookSub";
import { dicAuthorsBookPoint, loadAuthorsBookPoint } from "./dictionary/DicAuthorsBookPoint";
import { dicAuthorsBook, loadAuthorsBook } from './dictionary/DicAuthorsBook';
export const gameData = {
daily: dicDaily,
@@ -346,7 +350,13 @@ export const gameData = {
gvgReviveGold: new Map<number|'max', number>(),
dicPushMessage: dicPushMessage,
guildQuitCd: new Array<{day: number, minute: number}>(),
trainIdByIndex: dicTrainIdByIndex
trainIdByIndex: dicTrainIdByIndex,
spirit: dicAuthorsBookGoodId,
authorBook: dicAuthorsBook,
authorBookSubStar: dicAuthorsBookSubStar,
authorBookSubs: dicAuthorsBookSubs,
authorBookPoint: dicAuthorsBookPoint,
authorBookMaxProgress: dicAuthorsBookMaxProgress
};
// 在此提供一些原先在gamedata中提供的方法以便更方便获取gameData数据
@@ -786,6 +796,10 @@ export function getRaceEventItems() {
return items;
}
export function getDicAuthorBookSub(bookId: number, subId: number, star: number) {
return gameData.authorBookSubStar.get(`${bookId}_${subId}_${star}`);
}
// export function getRaceEventItems(members: WoodenHorseMember[], items: { id: number, total: number, max: number }[]) {
// let result = new Array<RewardInter>();
// for (let { id, min, max } of items) {
@@ -1645,6 +1659,14 @@ function loadDatas(type?: string) {
loadGVGBattleRankReward();
if(type == undefined || type == 'loadPushMessage')
loadPushMessage();
if(type == undefined || type == 'loadAuthorsBookGoodId')
loadAuthorsBookGoodId();
if(type == undefined || type == 'loadAuthorsBookSub')
loadAuthorsBookSub();
if(type == undefined || type == 'loadAuthorsBookPoint')
loadAuthorsBookPoint();
if(type == undefined || type == 'loadAuthorsBook')
loadAuthorsBook();
console.log('loadDatas type: ', type||'all');
}

View File

@@ -0,0 +1,46 @@
// 列传内的条目
import {decodeArrayListStr, readFileAndParse} from '../util'
import { FILENAME } from '../../consts'
const _ = require('lodash');
export interface DicAuthorsBook {
// 列传id
readonly id: number;
// 限制条件
readonly limit: { type: number, bookId?: number, value: number }[];
}
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicAuthorsBookKeys: KeysEnum<DicAuthorsBook> = {
id: true,
limit: true,
}
export const dicAuthorsBook = new Map<number, DicAuthorsBook>();
export function loadAuthorsBook() {
dicAuthorsBook.clear();
let arr = readFileAndParse(FILENAME.DIC_AUTHORS_BOOK);
arr.forEach(o => {
o.limit = parseLimit(o.limit);
dicAuthorsBook.set(o.id, _.pick(o, Object.keys(DicAuthorsBookKeys)));
});
arr = undefined;
}
function parseLimit(str: string) {
let result: { type: number, bookId?: number, value: number }[] = [];
if (!str) return result;
let decodeArr = decodeArrayListStr(str);
for (let [ str1, str2, str3 ] of decodeArr) {
if (isNaN(parseInt(str1)) || isNaN(parseInt(str2)) || (str3 && isNaN(parseInt(str3)))) {
throw new Error('data table format wrong');
}
if(str3) {
result.push({ type: parseInt(str1), bookId: parseInt(str2), value: parseInt(str3) });
} else {
result.push({ type: parseInt(str1), value: parseInt(str2) });
}
}
return result
}

View File

@@ -0,0 +1,28 @@
// 英灵对应的物品表
import { parseGoodStr, readFileAndParse } from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
export interface DicAuthorsBookGoodId {
// id
readonly id: number;
// 对应物品表id
readonly goodId: number;
// 分解可得
readonly decomposeItem: RewardInter[];
// 英灵替换
readonly composeItem: RewardInter[];
}
export const dicAuthorsBookGoodId = new Map<number, DicAuthorsBookGoodId>();
export function loadAuthorsBookGoodId() {
dicAuthorsBookGoodId.clear();
let arr = readFileAndParse(FILENAME.DIC_AUTHORS_GOODID);
arr.forEach(o => {
o.decomposeItem = parseGoodStr(o.decomposeItem);
o.composeItem = parseGoodStr(o.composeItem)
dicAuthorsBookGoodId.set(o.goodId, o);
});
arr = undefined;
}

View File

@@ -0,0 +1,38 @@
// 列传的进度节点
import {decodeArrayListStr, readFileAndParse} from '../util'
import { FILENAME } from '../../consts'
export interface DicAuthorsBookPoint {
// 列传
readonly bookId: number;
// 进度节点
readonly value: number;
// 到这个节点可得的属性
readonly attr: { id: number, val: number }[]
}
export const dicAuthorsBookPoint = new Map<number, DicAuthorsBookPoint[]>();
export function loadAuthorsBookPoint() {
dicAuthorsBookPoint.clear();
let arr = readFileAndParse(FILENAME.DIC_AUTHORS_BOOK_POINT);
arr.forEach(o => {
o.attr = parseAttribute(o.attr);
if(!dicAuthorsBookPoint.has(o.id)) dicAuthorsBookPoint.set(o.id, []);
dicAuthorsBookPoint.get(o.id)?.push(o);
});
arr = undefined;
}
function parseAttribute(str: string) {
let result = new Array<{ id: number, val: number }>();
if (!str) return result;
let decodeArr = decodeArrayListStr(str);
for (let [id, val] of decodeArr) {
if (isNaN(parseInt(id)) || isNaN(parseInt(val))) {
throw new Error('data table format wrong');
}
result.push({ id: parseInt(id), val: parseInt(val) });
}
return result
}

View File

@@ -0,0 +1,71 @@
// 列传内的条目
import {decodeArrayListStr, parseNumberList, readFileAndParse} from '../util'
import { FILENAME } from '../../consts'
import { RewardInter } from '../interface';
const _ = require('lodash');
export interface DicAuthorsBookSub {
// 列传id
readonly bookId: number;
// 条目id
readonly subId: number;
// 星级
readonly star: number;
// 星级
readonly maxStar: number;
// 所需的英灵
readonly spirits: RewardInter[];
// 每升一颗星可以获得的进度
readonly value: number;
// 到这个节点可得的属性
readonly attr: { id: number, val: number }[]
}
type KeysEnum<T> = { [P in keyof Required<T>]: true };
const DicAuthorsBookSubKeys: KeysEnum<DicAuthorsBookSub> = {
bookId: true,
subId: true,
star: true,
maxStar: true,
spirits: true,
value: true,
attr: true,
}
export const dicAuthorsBookSubStar = new Map<string, DicAuthorsBookSub>();
export const dicAuthorsBookSubs = new Map<number, number[]>();
export const dicAuthorsBookMaxProgress = new Map<number, number>(); // bookId => maxProgress
export function loadAuthorsBookSub() {
dicAuthorsBookSubStar.clear();
dicAuthorsBookSubs.clear();
dicAuthorsBookMaxProgress.clear();
let arr = readFileAndParse(FILENAME.DIC_AUTHORS_BOOK_SUB);
arr.forEach(o => {
o.attr = parseAttribute(o.attr);
o.spirits = parseSpirit(o.goodsId);
dicAuthorsBookSubStar.set(`${o.bookId}_${o.subId}_${o.star}`, _.pick(o, Object.keys(DicAuthorsBookSubKeys)));
if(!dicAuthorsBookSubs.has(o.bookId)) dicAuthorsBookSubs.set(o.bookId, []);
if(dicAuthorsBookSubs.get(o.bookId).indexOf(o.subId) == -1) dicAuthorsBookSubs.get(o.bookId).push(o.subId);
if(!dicAuthorsBookMaxProgress.has(o.bookId)) dicAuthorsBookMaxProgress.set(o.bookId, 0);
dicAuthorsBookMaxProgress.set(o.bookId, dicAuthorsBookMaxProgress.get(o.bookId) + o.value);
});
arr = undefined;
}
function parseAttribute(str: string) {
let result = new Array<{ id: number, val: number }>();
if (!str) return result;
let decodeArr = decodeArrayListStr(str);
for (let [id, val] of decodeArr) {
if (isNaN(parseInt(id)) || isNaN(parseInt(val))) {
throw new Error('data table format wrong');
}
result.push({ id: parseInt(id), val: parseInt(val) });
}
return result
}
function parseSpirit(str: string): RewardInter[] {
let arr = parseNumberList(str);
return arr.map(id => ({ id, count: 1 }));
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
[
{
"id": 1,
"name": "列传1",
"image": 1,
"limit": "&",
"pointArr": "1&2&3&4&5&6&7&8"
},
{
"id": 2,
"name": "列传2",
"image": 2,
"limit": "&",
"pointArr": "9&10&11&12&13&14&15&16"
},
{
"id": 3,
"name": "列传3",
"image": 3,
"limit": "1&500",
"pointArr": "17&18&19&20&21&22&23&24"
},
{
"id": 4,
"name": "列传4",
"image": 4,
"limit": "2&3&800",
"pointArr": "25&26&27&28&29&30&31&32"
},
{
"id": 5,
"name": "列传5",
"image": 5,
"limit": "2&4&500",
"pointArr": "33&34&35&36&37&38&39&40"
}
]

View File

@@ -0,0 +1,322 @@
[
{
"id": 1,
"name": "寂灭破斩1",
"image": "zu1_1",
"bookId": 1,
"value": 100,
"attr": "2&101|3&101"
},
{
"id": 2,
"name": "寂灭破斩2",
"image": "zu1_2",
"bookId": 1,
"value": 200,
"attr": "2&102|3&102"
},
{
"id": 3,
"name": "反戈一击1",
"image": "zu1_3",
"bookId": 1,
"value": 300,
"attr": "2&103"
},
{
"id": 4,
"name": "反戈一击2",
"image": "zu1_4",
"bookId": 1,
"value": 400,
"attr": "2&104"
},
{
"id": 5,
"name": "反戈一击3",
"image": "zu1_5",
"bookId": 1,
"value": 500,
"attr": "2&105"
},
{
"id": 6,
"name": "固若金汤1",
"image": "zu1_6",
"bookId": 1,
"value": 600,
"attr": "2&106"
},
{
"id": 7,
"name": "固若金汤2",
"image": "zu1_7",
"bookId": 1,
"value": 700,
"attr": "2&107"
},
{
"id": 8,
"name": "喋血复仇",
"image": "zu1_8",
"bookId": 1,
"value": 1000,
"attr": "2&108"
},
{
"id": 9,
"name": "破釜沉舟",
"image": "zu2_1",
"bookId": 2,
"value": 100,
"attr": "3&101"
},
{
"id": 10,
"name": "风影突袭1",
"image": "zu2_2",
"bookId": 2,
"value": 200,
"attr": "3&102"
},
{
"id": 11,
"name": "风影突袭2",
"image": "zu2_3",
"bookId": 2,
"value": 300,
"attr": "3&103"
},
{
"id": 12,
"name": "奇兵突进1",
"image": "zu2_4",
"bookId": 2,
"value": 400,
"attr": "3&104"
},
{
"id": 13,
"name": "奇兵突进2",
"image": "zu2_5",
"bookId": 2,
"value": 500,
"attr": "3&105"
},
{
"id": 14,
"name": "贪狼之势1",
"image": "zu2_6",
"bookId": 2,
"value": 600,
"attr": "3&106"
},
{
"id": 15,
"name": "贪狼之势2",
"image": "zu2_7",
"bookId": 2,
"value": 700,
"attr": "3&107"
},
{
"id": 16,
"name": "贪狼之势3",
"image": "zu2_8",
"bookId": 2,
"value": 1000,
"attr": "3&108"
},
{
"id": 17,
"name": "冲锋陷阵1",
"image": "zu3_1",
"bookId": 3,
"value": 100,
"attr": "1&1001"
},
{
"id": 18,
"name": "冲锋陷阵2",
"image": "zu3_2",
"bookId": 3,
"value": 200,
"attr": "1&1002"
},
{
"id": 19,
"name": "召虎之姿",
"image": "zu3_3",
"bookId": 3,
"value": 300,
"attr": "1&1003"
},
{
"id": 20,
"name": "威震逍遥",
"image": "zu3_4",
"bookId": 3,
"value": 400,
"attr": "1&1004"
},
{
"id": 21,
"name": "镇魂箭雨1",
"image": "zu3_5",
"bookId": 3,
"value": 500,
"attr": "1&1005"
},
{
"id": 22,
"name": "镇魂箭雨2",
"image": "zu3_6",
"bookId": 3,
"value": 600,
"attr": "1&1006"
},
{
"id": 23,
"name": "追命散射1",
"image": "zu3_7",
"bookId": 3,
"value": 700,
"attr": "1&1007"
},
{
"id": 24,
"name": "追命散射2",
"image": "zu3_8",
"bookId": 3,
"value": 1000,
"attr": "1&1008"
},
{
"id": 25,
"name": "飞骑弓射1",
"image": "zu4_1",
"bookId": 4,
"value": 100,
"attr": "2&11"
},
{
"id": 26,
"name": "飞骑弓射2",
"image": "zu4_2",
"bookId": 4,
"value": 200,
"attr": "2&12"
},
{
"id": 27,
"name": "飞骑弓射3",
"image": "zu4_3",
"bookId": 4,
"value": 300,
"attr": "2&13"
},
{
"id": 28,
"name": "强弓劲弩1",
"image": "zu4_4",
"bookId": 4,
"value": 400,
"attr": "2&14"
},
{
"id": 29,
"name": "强弓劲弩2",
"image": "zu4_5",
"bookId": 4,
"value": 500,
"attr": "2&15"
},
{
"id": 30,
"name": "反曲长弓",
"image": "zu4_6",
"bookId": 4,
"value": 600,
"attr": "2&16"
},
{
"id": 31,
"name": "千里夺魂",
"image": "zu4_7",
"bookId": 4,
"value": 700,
"attr": "2&17"
},
{
"id": 32,
"name": "十胜天机1",
"image": "zu4_8",
"bookId": 4,
"value": 1000,
"attr": "2&18"
},
{
"id": 33,
"name": "十胜天机2",
"image": "zu5_1",
"bookId": 5,
"value": 100,
"attr": "1&1001|2&500"
},
{
"id": 34,
"name": "飞骑弓射3",
"image": "zu5_2",
"bookId": 5,
"value": 200,
"attr": "1&1002|2&500"
},
{
"id": 35,
"name": "十面埋伏1",
"image": "zu5_3",
"bookId": 5,
"value": 300,
"attr": "1&1001|2&501"
},
{
"id": 36,
"name": "十面埋伏2",
"image": "zu5_4",
"bookId": 5,
"value": 400,
"attr": "1&1002|2&501"
},
{
"id": 37,
"name": "逆命风流1",
"image": "zu5_5",
"bookId": 5,
"value": 500,
"attr": "1&1001|2&502"
},
{
"id": 38,
"name": "逆命风流2",
"image": "zu5_6",
"bookId": 5,
"value": 600,
"attr": "1&1002|2&502"
},
{
"id": 39,
"name": "逆命风流3",
"image": "zu5_7",
"bookId": 5,
"value": 700,
"attr": "1&1001|2&503"
},
{
"id": 40,
"name": "运筹帷幄1",
"image": "zu5_8",
"bookId": 5,
"value": 1000,
"attr": "1&1002|2&503"
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,612 @@
[
{
"id": 1,
"goodId": 110001,
"name": "曹操英灵",
"quality": 3,
"imageName": "caocao",
"authorsType": 1,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 2,
"goodId": 110002,
"name": "夏侯惇英灵",
"quality": 3,
"imageName": "xiahoudun",
"authorsType": 2,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 3,
"goodId": 110003,
"name": "张辽英灵",
"quality": 3,
"imageName": "zhangliao",
"authorsType": 3,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 4,
"goodId": 110004,
"name": "夏侯渊英灵",
"quality": 3,
"imageName": "xiahouyuan",
"authorsType": 4,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 5,
"goodId": 110005,
"name": "郭嘉英灵",
"quality": 3,
"imageName": "guojia",
"authorsType": 5,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 6,
"goodId": 110006,
"name": "典韦英灵",
"quality": 3,
"imageName": "dianwei",
"authorsType": 6,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 7,
"goodId": 110007,
"name": "庞德英灵",
"quality": 2,
"imageName": "pangde",
"authorsType": 7,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 8,
"goodId": 110008,
"name": "徐晃英灵",
"quality": 2,
"imageName": "xuhuang",
"authorsType": 8,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 9,
"goodId": 110009,
"name": "曹仁英灵",
"quality": 2,
"imageName": "caoren",
"authorsType": 9,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 10,
"goodId": 110010,
"name": "李典英灵",
"quality": 2,
"imageName": "lidian",
"authorsType": 10,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 11,
"goodId": 110011,
"name": "蔡琰英灵",
"quality": 1,
"imageName": "caiyan",
"authorsType": 1,
"decomposeItem": "40020&10",
"composeItem": "40020&20"
},
{
"id": 12,
"goodId": 110012,
"name": "贾诩英灵",
"quality": 2,
"imageName": "jiaxu",
"authorsType": 2,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 13,
"goodId": 110013,
"name": "许褚英灵",
"quality": 3,
"imageName": "xuchu",
"authorsType": 3,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 14,
"goodId": 110014,
"name": "乐进英灵",
"quality": 1,
"imageName": "yuejin",
"authorsType": 4,
"decomposeItem": "40020&10",
"composeItem": "40020&20"
},
{
"id": 15,
"goodId": 110015,
"name": "张飞英灵",
"quality": 3,
"imageName": "zhangfei",
"authorsType": 5,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 16,
"goodId": 110016,
"name": "关羽英灵",
"quality": 3,
"imageName": "guanyu",
"authorsType": 6,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 17,
"goodId": 110017,
"name": "赵云英灵",
"quality": 1,
"imageName": "zhaoyun",
"authorsType": 7,
"decomposeItem": "40020&10",
"composeItem": "40020&20"
},
{
"id": 18,
"goodId": 110018,
"name": "刘备英灵",
"quality": 3,
"imageName": "liubei",
"authorsType": 8,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 19,
"goodId": 110019,
"name": "黄忠英灵",
"quality": 3,
"imageName": "huangzhong",
"authorsType": 9,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 20,
"goodId": 110020,
"name": "诸葛亮英灵",
"quality": 3,
"imageName": "zhugeliang",
"authorsType": 10,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 21,
"goodId": 110021,
"name": "魏延英灵",
"quality": 3,
"imageName": "weiyan",
"authorsType": 1,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 22,
"goodId": 110022,
"name": "陈到英灵",
"quality": 2,
"imageName": "chendao",
"authorsType": 2,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 23,
"goodId": 110023,
"name": "关银屏英灵",
"quality": 2,
"imageName": "guanyinping",
"authorsType": 3,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 24,
"goodId": 110024,
"name": "马云禄英灵",
"quality": 2,
"imageName": "mayunlu",
"authorsType": 4,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 25,
"goodId": 110025,
"name": "马良英灵",
"quality": 2,
"imageName": "maliang",
"authorsType": 5,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 26,
"goodId": 110026,
"name": "张星彩英灵",
"quality": 4,
"imageName": "tongyongjunguan",
"authorsType": 6,
"decomposeItem": "40020&100",
"composeItem": "&"
},
{
"id": 27,
"goodId": 110027,
"name": "王平英灵",
"quality": 2,
"imageName": "wangping",
"authorsType": 7,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 28,
"goodId": 110028,
"name": "孙乾英灵",
"quality": 1,
"imageName": "sunqian",
"authorsType": 8,
"decomposeItem": "40020&10",
"composeItem": "40020&15"
},
{
"id": 29,
"goodId": 110029,
"name": "周泰英灵",
"quality": 3,
"imageName": "zhoutai",
"authorsType": 9,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 30,
"goodId": 110030,
"name": "孙策英灵",
"quality": 3,
"imageName": "sunce",
"authorsType": 10,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 31,
"goodId": 110031,
"name": "周瑜英灵",
"quality": 3,
"imageName": "zhouyu",
"authorsType": 1,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 32,
"goodId": 110032,
"name": "太史慈英灵",
"quality": 3,
"imageName": "taishici",
"authorsType": 2,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 33,
"goodId": 110033,
"name": "孙权英灵",
"quality": 2,
"imageName": "sunquan",
"authorsType": 3,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 34,
"goodId": 110034,
"name": "甘宁英灵",
"quality": 2,
"imageName": "ganning",
"authorsType": 4,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 35,
"goodId": 110035,
"name": "孙尚香英灵",
"quality": 3,
"imageName": "sunshangxiang",
"authorsType": 5,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 36,
"goodId": 110036,
"name": "小乔英灵",
"quality": 3,
"imageName": "xiaoqiao",
"authorsType": 6,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 37,
"goodId": 110037,
"name": "大乔英灵",
"quality": 3,
"imageName": "daqiao",
"authorsType": 7,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 38,
"goodId": 110038,
"name": "步练师英灵",
"quality": 3,
"imageName": "bulianshi",
"authorsType": 8,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 39,
"goodId": 110039,
"name": "吕布英灵",
"quality": 3,
"imageName": "lvbu",
"authorsType": 9,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 40,
"goodId": 110040,
"name": "张任英灵",
"quality": 3,
"imageName": "zhangren",
"authorsType": 10,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 41,
"goodId": 110041,
"name": "华佗英灵",
"quality": 3,
"imageName": "huatuo",
"authorsType": 1,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 42,
"goodId": 110042,
"name": "张角英灵",
"quality": 3,
"imageName": "zhangjiao",
"authorsType": 2,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 43,
"goodId": 110043,
"name": "高顺英灵",
"quality": 3,
"imageName": "gaoshun",
"authorsType": 3,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 44,
"goodId": 110044,
"name": "麹义英灵",
"quality": 2,
"imageName": "quyi",
"authorsType": 4,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 45,
"goodId": 110045,
"name": "李儒英灵",
"quality": 2,
"imageName": "liru",
"authorsType": 5,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 46,
"goodId": 110046,
"name": "庞舞英灵",
"quality": 2,
"imageName": "pangwu",
"authorsType": 6,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 47,
"goodId": 110047,
"name": "夏侯轻衣英灵",
"quality": 1,
"imageName": "xiahouqingyi",
"authorsType": 7,
"decomposeItem": "40020&10",
"composeItem": "40020&15"
},
{
"id": 48,
"goodId": 110048,
"name": "文丑英灵",
"quality": 1,
"imageName": "wenchou",
"authorsType": 8,
"decomposeItem": "40020&10",
"composeItem": "40020&15"
},
{
"id": 49,
"goodId": 110049,
"name": "颜良英灵",
"quality": 1,
"imageName": "yanliang",
"authorsType": 9,
"decomposeItem": "40020&10",
"composeItem": "40020&15"
},
{
"id": 50,
"goodId": 110050,
"name": "貂蝉英灵",
"quality": 3,
"imageName": "diaochan",
"authorsType": 10,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 51,
"goodId": 110051,
"name": "王越英灵",
"quality": 3,
"imageName": "wangyue",
"authorsType": 1,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 52,
"goodId": 110052,
"name": "董卓英灵",
"quality": 3,
"imageName": "dongzhuo",
"authorsType": 2,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 53,
"goodId": 110053,
"name": "童渊英灵",
"quality": 3,
"imageName": "tongyuan",
"authorsType": 3,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 54,
"goodId": 110054,
"name": "赵云英灵",
"quality": 1,
"imageName": "shaonianzhaoyun",
"authorsType": 4,
"decomposeItem": "40020&10",
"composeItem": "40020&15"
},
{
"id": 55,
"goodId": 110055,
"name": "夏侯轻衣英灵",
"quality": 1,
"imageName": "shaonianxiahouqingyi",
"authorsType": 5,
"decomposeItem": "40020&10",
"composeItem": "40020&15"
},
{
"id": 56,
"goodId": 110056,
"name": "潘璋英灵",
"quality": 1,
"imageName": "panzhang",
"authorsType": 6,
"decomposeItem": "40020&10",
"composeItem": "40020&15"
},
{
"id": 57,
"goodId": 110057,
"name": "凌统英灵",
"quality": 1,
"imageName": "lingtong",
"authorsType": 7,
"decomposeItem": "40020&10",
"composeItem": "40020&15"
},
{
"id": 58,
"goodId": 110058,
"name": "黄盖英灵",
"quality": 2,
"imageName": "huanggai",
"authorsType": 8,
"decomposeItem": "40020&20",
"composeItem": "40020&15"
},
{
"id": 59,
"goodId": 110059,
"name": "陈宫英灵",
"quality": 3,
"imageName": "chengong",
"authorsType": 9,
"decomposeItem": "40020&30",
"composeItem": "40020&50"
},
{
"id": 60,
"goodId": 110060,
"name": "马超英灵",
"quality": 4,
"imageName": "machao",
"authorsType": 10,
"decomposeItem": "40020&100",
"composeItem": "&"
},
{
"id": 61,
"goodId": 110061,
"name": "阿丽雅英灵",
"quality": 4,
"imageName": "aliya2",
"authorsType": 4,
"decomposeItem": "40020&100",
"composeItem": "&"
}
]

View File

@@ -0,0 +1,52 @@
[
{
"id": 1,
"name": "儒家",
"imageName": "touxiang_rujia"
},
{
"id": 2,
"name": "道家",
"imageName": "yinyangjia"
},
{
"id": 3,
"name": "墨家",
"imageName": "touxiang_mojia"
},
{
"id": 4,
"name": "法家",
"imageName": "touxiang_fajia"
},
{
"id": 5,
"name": "名家",
"imageName": "touxiang_mingjia"
},
{
"id": 6,
"name": "阴阳家",
"imageName": "touxiang_daojia"
},
{
"id": 7,
"name": "纵横家",
"imageName": "touxiang_zongheng"
},
{
"id": 8,
"name": "杂家",
"imageName": "touxiang_zajia"
},
{
"id": 9,
"name": "兵家",
"imageName": "touxiang_bingjia"
},
{
"id": 10,
"name": "医家",
"imageName": "touxiang_yijia"
}
]