feat: 통합 세력 장수/암행부 페이지 (#213)

- ag-grid 기반
- 컬럼 사용자 정의 기능 제공
  - 컬럼 재정렬, 고정, 정렬 기능
  - 컬럼 상태 저장, 불러오기
  - 마지막 컬럼 재 사용
- 아이콘, 장수명 클릭 시 특수 기능 제공
  - 기본 세력 장수/암행부에서는 '감찰부'
- 추가 컬럼
  - 최근 전투
  - 전투 수
  - 승리 수
  - 살상률
- API/Nation/GeneralList 추가

Co-authored-by: hide_d <hided62@gmail.com>
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/213
This commit is contained in:
2022-04-08 02:28:58 +09:00
parent c96f6d9381
commit a95b26551c
32 changed files with 3137 additions and 381 deletions
+22
View File
@@ -0,0 +1,22 @@
import bs from 'binary-search';
const connectMap: [number, string][] = [
[0, '안함'],
[50, '무관심'],
[100, '보통'],
[400, '가끔'],
[200, '자주'],
[800, '열심'],
[1600, '중독'],
[3200, '폐인'],
[6400, '경고'],
[12800, '헐...'],
]
export function formatConnectScore(connect: number) {
const idx = bs(connectMap, connect, ([key], needle) => key - needle);
if (idx >= 0) {
return connectMap[idx][1] ?? '?';
}
return connectMap[-(idx + 1)][1] ?? '?';
}
+17
View File
@@ -0,0 +1,17 @@
import bs from 'binary-search';
const defenceMap: [number,string][] = [
[0, "△"],
[60, "○"],
[80, "◎"],
[90, "☆"],
[999, "×"],
]
export function formatDefenceTrain(defenceTrain: number): string {
const idx = bs(defenceMap, defenceTrain, ([defenceKey], needle) => defenceKey - needle);
if(idx >= 0){
return defenceMap[idx][1]??'?';
}
return defenceMap[-(idx + 1)][1]??'?';
}
+50
View File
@@ -0,0 +1,50 @@
import bs from 'binary-search';
export const DexLevelMap: [number, string, string][] = [
[0, 'navy', 'F-'],
[350, 'navy', 'F'],
[1375, 'navy', 'F+'],
[3500, 'skyblue', 'E-'],
[7125, 'skyblue', 'E'],
[12650, 'skyblue', 'E+'],
[20475, 'seagreen', 'D-'],
[31000, 'seagreen', 'D'],
[44625, 'seagreen', 'D+'],
[61750, 'teal', 'C-'],
[82775, 'teal', 'C'],
[108100, 'teal', 'C+'],
[138125, 'limegreen', 'B-'],
[173250, 'limegreen', 'B'],
[213875, 'limegreen', 'B+'],
[260400, 'darkorange', 'A-'],
[313225, 'darkorange', 'A'],
[372750, 'darkorange', 'A+'],
[439375, 'tomato', 'S-'],
[513500, 'tomato', 'S'],
[595525, 'tomato', 'S+'],
[685850, 'darkviolet', 'Z-'],
[784875, 'darkviolet', 'Z'],
[893000, 'darkviolet', 'Z+'],
[1010625, 'gold', 'EX-'],
[1138150, 'gold', 'EX'],
[1275975, 'white', 'EX+'],
];
export type DexInfo = {
level: number,
name: string,
color: string,
}
export function formatDexLevel(dex: number): DexInfo {
const rawIdx = bs(DexLevelMap, dex, ([dexKey], needle) => dexKey - needle);
const level = rawIdx >= 0 ? rawIdx : -(rawIdx + 1);
const [, color, name] = DexLevelMap[level];
return {
level,
name,
color
};
}
+26
View File
@@ -0,0 +1,26 @@
import bs from 'binary-search';
const hornorMap: [number, string][] = [
[0, '전무'],
[640, '무명'],
[2560, '신동'],
[5760, '약간'],
[10240, '평범'],
[16000, '지역적'],
[23040, '전국적'],
[31360, '세계적'],
[40960, '유명'],
[45000, '명사'],
[51840, '호걸'],
[55000, '효웅'],
[64000, '영웅'],
[77440, '구세주'],
]
export function formatHonor(experience: number): string {
const idx = bs(hornorMap, experience, ([experienceKey], needle) => experienceKey - needle);
if (idx >= 0) {
return hornorMap[idx][1] ?? '?';
}
return hornorMap[-(idx + 1)][1] ?? '?';
}
+92
View File
@@ -0,0 +1,92 @@
export const OfficerLevelMapDefault: Record<number, string> = {
12: '군주',
11: '참모',
10: '제1장군',
9: '제1모사',
8: '제2장군',
7: '제2모사',
6: '제3장군',
5: '제3모사',
4: '태수',
3: '군사',
2: '종사',
1: '일반',
0: '재야',
}
export const OfficerLevelMapByNationLevel: Record<number, Record<number, string>> = {
7: {
12: '황제',
11: '승상',
10: '표기장군',
9: '사공',
8: '거기장군',
7: '태위',
6: '위장군',
5: '사도'
},
6: {
12: '왕',
11: '광록훈',
10: '좌장군',
9: '상서령',
8: '우장군',
7: '중서령',
6: '전장군',
5: '비서령'
},
5: {
12: '공',
11: '광록대부',
10: '안국장군',
9: '집금오',
8: '파로장군',
7: '소부'
},
4: {
12: '주목',
11: '태사령',
10: '아문장군',
9: '낭중',
8: '호군',
7: '종사중랑'
},
3: {
12: '주자사',
11: '주부',
10: '편장군',
9: '간의대부'
},
2: {
12: '군벌',
11: '참모',
10: '비장군',
9: '부참모'
},
1: {
12: '영주',
11: '참모'
},
0: {
12: '두목',
11: '부두목'
},
}
export function formatOfficerLevelText(officerLevel: number, nationLevel?: number) {
if (officerLevel < 5) {
return OfficerLevelMapDefault[officerLevel] ?? '???';
}
const nationMap = nationLevel === undefined
? OfficerLevelMapDefault
: (OfficerLevelMapByNationLevel[nationLevel] ?? OfficerLevelMapDefault);
return nationMap[officerLevel] ?? (OfficerLevelMapDefault[officerLevel] ?? '???');
}