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

@@ -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 }));
}