feat: 커맨드 로그 메시지 개선 및 불필요한 항목 제거
This commit is contained in:
@@ -8,66 +8,13 @@ Exclude target: on
|
|||||||
Ignore file: tools/compare-command-logs.ignore.json
|
Ignore file: tools/compare-command-logs.ignore.json
|
||||||
|
|
||||||
- [ ] General/che_건국
|
- [ ] General/che_건국
|
||||||
PHP only: 다음 턴부터 건국할 수 있습니다. | <D>${}</>${} 건국하였습니다.
|
PHP only: <D>${}</>${} 건국하였습니다.
|
||||||
TS only: ${}이 ${}에 국가를 건설하였습니다.
|
TS only: <D>${}</>을 건국하였습니다.
|
||||||
- [ ] General/che_기술연구
|
|
||||||
PHP only: ${}${} <span class='ev_failed'>실패</span>하여 <C>${}</> 상승했습니다. | ${}${} <S>성공</>하여 <C>${}</> 상승했습니다. | ${}${} 하여 <C>${}</> 상승했습니다.
|
|
||||||
TS only: 기술 연구로 기술이 ${} 상승했습니다.
|
|
||||||
- [ ] General/che_단련
|
|
||||||
PHP only: 단련이 <span class='ev_failed'>지지부진</span>하여 ${} 숙련도가 <C>${}</> 향상되었습니다. | 단련이 <S>일취월장</>하여 ${} 숙련도가 <C>${}</> 향상되었습니다. | ${} 숙련도가 <C>${}</> 향상되었습니다.
|
|
||||||
TS only: ${}
|
|
||||||
- [ ] General/che_등용
|
|
||||||
PHP only: <Y>${}</>에게 등용 권유 서신을 보내지 못했습니다. ${}
|
|
||||||
- [ ] General/che_상업투자
|
|
||||||
PHP only: ${}${} <span class='ev_failed'>실패</span>하여 <C>${}</> 상승했습니다. | ${}${} <S>성공</>하여 <C>${}</> 상승했습니다. | ${}${} 하여 <C>${}</> 상승했습니다.
|
|
||||||
TS only: ${}
|
|
||||||
- [ ] General/che_소집해제
|
|
||||||
PHP only: 병사들을 <R>소집해제</>하였습니다.
|
|
||||||
TS only: 병사들을 소집해제하여 인구가 ${} 증가했습니다.
|
|
||||||
- [ ] General/che_숙련전환
|
|
||||||
PHP only: {${}->srcArmTypeName} 숙련 ${}${} {${}->destArmTypeName} 숙련 ${}${} 전환했습니다.
|
|
||||||
TS only: ${} 숙련 ${}${} ${} 숙련 ${}${} 전환했습니다.
|
|
||||||
- [ ] General/che_인재탐색
|
|
||||||
PHP only: <Y>${}</>${}는 <C>인재</>를 ${}하였습니다!
|
|
||||||
TS only: 인재 <Y>${}</>${} 발견했습니다.
|
|
||||||
- [ ] General/che_임관
|
|
||||||
PHP only: <D>${}</>에 임관했습니다.
|
|
||||||
TS only: 임관을 신청했습니다. (국가 ${})
|
|
||||||
- [ ] General/che_정착장려
|
- [ ] General/che_정착장려
|
||||||
PHP only: ${}${} <span class='ev_failed'>실패</span>하여 주민이 <C>${}</>명 증가했습니다. | ${}${} <S>성공</>하여 주민이 <C>${}</>명 증가했습니다. | ${}${} 하여 주민이 <C>${}</>명 증가했습니다.
|
PHP only: ${}${} <span class='ev_failed'>실패</span>하여 주민이 <C>${}</>명 증가했습니다. | ${}${} <S>성공</>하여 주민이 <C>${}</>명 증가했습니다.
|
||||||
TS only: 인구가 ${} 증가했습니다.
|
|
||||||
- [ ] General/che_주민선정
|
|
||||||
PHP only: ${}${} <span class='ev_failed'>실패</span>하여 <C>${}</> 상승했습니다. | ${}${} <S>성공</>하여 <C>${}</> 상승했습니다. | ${}${} 하여 <C>${}</> 상승했습니다.
|
|
||||||
TS only: 민심이 ${} 상승했습니다.
|
|
||||||
- [ ] General/che_징병
|
- [ ] General/che_징병
|
||||||
PHP only: ${} <C>${}</>명을 추가{${}->getName()}했습니다. | ${} <C>${}</>명을 {${}->getName()}했습니다.
|
PHP only: ${} <C>${}</>명을 추가${}했습니다. | ${} <C>${}</>명을 ${}했습니다.
|
||||||
TS only: ${}
|
TS only: ${} 추가징병했습니다. | ${} 징병했습니다.
|
||||||
- [ ] General/che_첩보
|
- [ ] General/che_첩보
|
||||||
PHP only: <G>${}</>의 정보를 많이 얻었습니다. | 【<G>${}</>】주민:${}, 민심:${}, 장수:${}, 병력:${} | 【<M>첩보</>】농업:${}, 상업:${}, 치안:${}, 수비:${}, 성벽:${} | 【<S>병종</>】 ${} | 【<span class='ev_notice'>{${}->destNation['name']}</span>】아국대비기술:${} | <G>${}</>의 정보를 어느 정도 얻었습니다. | <G>${}</>의 소문만 들을 수 있었습니다.
|
PHP only: <G>${}</>의 정보를 많이 얻었습니다. | 【<G>${}</>】주민:${}, 민심:${}, 장수:${}, 병력:${} | 【<M>첩보</>】농업:${}, 상업:${}, 치안:${}, 수비:${}, 성벽:${} | 【<S>병종</>】 ${} | 【<span class='ev_notice'>${}</span>】아국대비기술:${} | <G>${}</>의 정보를 어느 정도 얻었습니다. | <G>${}</>의 소문만 들을 수 있었습니다.
|
||||||
TS only: <G>${}</>의 정보를 ${} 얻었습니다. | 주민:${}, 민심:${}, ...
|
TS only: <G>${}</>의 정보를 ${} 얻었습니다. | 주민:${}, 민심:${}, ...
|
||||||
- [ ] General/che_출병
|
|
||||||
TS only: 경로에 도달할 방법이 없습니다. | <G>${}</>${} 가는 도중 <G>${}</>을 거치기로 합니다.
|
|
||||||
- [ ] Nation/che_국호변경
|
|
||||||
PHP only: 이미 같은 국호를 가진 곳이 있습니다. ${} 실패 | 국호를 <D>${}</>${} 변경합니다.
|
|
||||||
TS only: 국호를 <D>${}</>로 변경하였습니다.
|
|
||||||
- [ ] Nation/che_몰수
|
|
||||||
PHP only: <Y>{${}->getName()}</>에게서 ${} <C>${}</>${} 몰수했습니다.
|
|
||||||
TS only: ${}에게서 몰수할 ${}이 없습니다. | <Y>${}</>에게서 ${} <C>${}</>${} 몰수했습니다.
|
|
||||||
- [ ] Nation/che_발령
|
|
||||||
PHP only: <Y>${}</>에 의해 <G>${}</>${} 발령됐습니다.
|
|
||||||
- [ ] Nation/che_부대탈퇴지시
|
|
||||||
PHP only: <Y>${}</>에게 부대 탈퇴를 지시 받았습니다.
|
|
||||||
- [ ] Nation/che_불가침제의
|
|
||||||
PHP only: <D>${}</>${} 불가침 제의 서신을 보냈습니다.
|
|
||||||
TS only: 불가침 제의을 준비했습니다. (국가 ${})
|
|
||||||
- [ ] Nation/che_불가침파기제의
|
|
||||||
PHP only: <D>${}</>${} 불가침 파기 제의 서신을 보냈습니다.
|
|
||||||
TS only: 불가침 파기 제의을 준비했습니다. (국가 ${})
|
|
||||||
- [ ] Nation/che_포상
|
|
||||||
PHP only: <Y>{${}->getName()}</>에게 ${} <C>${}</>${} 수여했습니다.
|
|
||||||
TS only: <Y>${}</>에게 ${} ${}${} 수여했습니다.
|
|
||||||
- [ ] Nation/che_피장파장
|
|
||||||
PHP only: <G>{${}->getName()}</> 전략의 ${} 발동!
|
|
||||||
TS only: <G>${}</> 전략의 ${} 발동!
|
|
||||||
- [ ] Nation/cr_인구이동
|
|
||||||
TS only: 이동할 인구가 부족합니다.
|
|
||||||
|
|||||||
@@ -115,6 +115,10 @@ export class ActionDefinition<
|
|||||||
category: LogCategory.USER,
|
category: LogCategory.USER,
|
||||||
format: LogFormat.PLAIN,
|
format: LogFormat.PLAIN,
|
||||||
});
|
});
|
||||||
|
context.addLog(`<D><b>${args.nationName}</b></>${josaUl} 건국하였습니다.`, {
|
||||||
|
category: LogCategory.ACTION,
|
||||||
|
format: LogFormat.MONTH,
|
||||||
|
});
|
||||||
context.addLog(`${general.name}${josaYi} ${city?.name}에 국가를 건설하였습니다.`, {
|
context.addLog(`${general.name}${josaYi} ${city?.name}에 국가를 건설하였습니다.`, {
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
format: LogFormat.MONTH,
|
format: LogFormat.MONTH,
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import type { TurnCommandEnv } from '@sammo-ts/logic/actions/turn/commandEnv.js'
|
|||||||
import { defaultActionContextBuilder } from '@sammo-ts/logic/actions/turn/actionContext.js';
|
import { defaultActionContextBuilder } from '@sammo-ts/logic/actions/turn/actionContext.js';
|
||||||
import { tryApplyUniqueLottery } from '@sammo-ts/logic/rewards/uniqueLottery.js';
|
import { tryApplyUniqueLottery } from '@sammo-ts/logic/rewards/uniqueLottery.js';
|
||||||
import type { GeneralTurnCommandSpec } from './index.js';
|
import type { GeneralTurnCommandSpec } from './index.js';
|
||||||
|
import { JosaUtil } from '@sammo-ts/common';
|
||||||
|
|
||||||
export interface TechResearchArgs {}
|
export interface TechResearchArgs {}
|
||||||
|
|
||||||
@@ -79,7 +80,10 @@ export class ActionDefinition<
|
|||||||
nation.meta = { ...nation.meta, tech: nextTech };
|
nation.meta = { ...nation.meta, tech: nextTech };
|
||||||
general.gold = Math.max(0, general.gold - costGold);
|
general.gold = Math.max(0, general.gold - costGold);
|
||||||
|
|
||||||
context.addLog(`${ACTION_NAME}로 기술이 ${applied} 상승했습니다.`);
|
const logName = ACTION_NAME.replace(' ', '');
|
||||||
|
const josaUl = JosaUtil.pick(logName, '을');
|
||||||
|
const scoreText = applied.toLocaleString();
|
||||||
|
context.addLog(`${logName}${josaUl} 하여 <C>${scoreText}</> 상승했습니다.`);
|
||||||
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
||||||
|
|
||||||
return { effects: [] };
|
return { effects: [] };
|
||||||
|
|||||||
@@ -133,10 +133,7 @@ export class ActionDefinition<
|
|||||||
const baseScore = Math.round((general.crew * general.train * general.atmos) / 20 / 10000);
|
const baseScore = Math.round((general.crew * general.train * general.atmos) / 20 / 10000);
|
||||||
const score = baseScore * multiplier;
|
const score = baseScore * multiplier;
|
||||||
const armTypeName = resolveArmTypeName(context.unitSet, crewType.armType);
|
const armTypeName = resolveArmTypeName(context.unitSet, crewType.armType);
|
||||||
const logPrefix = pick === 'success' ? '단련이 일취월장하여' : pick === 'fail' ? '단련이 지지부진하여' : '';
|
const scoreText = score.toLocaleString();
|
||||||
const logText = logPrefix
|
|
||||||
? `${logPrefix} ${armTypeName} 숙련도가 ${score} 향상되었습니다.`
|
|
||||||
: `${armTypeName} 숙련도가 ${score} 향상되었습니다.`;
|
|
||||||
|
|
||||||
const dexKey = `dex${crewType.armType}`;
|
const dexKey = `dex${crewType.armType}`;
|
||||||
const nextDex = getMetaNumber(general.meta, dexKey, 0) + score;
|
const nextDex = getMetaNumber(general.meta, dexKey, 0) + score;
|
||||||
@@ -156,7 +153,17 @@ export class ActionDefinition<
|
|||||||
general.gold = Math.max(0, general.gold - cost);
|
general.gold = Math.max(0, general.gold - cost);
|
||||||
general.rice = Math.max(0, general.rice - cost);
|
general.rice = Math.max(0, general.rice - cost);
|
||||||
|
|
||||||
context.addLog(logText);
|
if (pick === 'success') {
|
||||||
|
context.addLog(
|
||||||
|
`단련이 <S>일취월장</>하여 ${armTypeName} 숙련도가 <C>${scoreText}</> 향상되었습니다.`
|
||||||
|
);
|
||||||
|
} else if (pick === 'fail') {
|
||||||
|
context.addLog(
|
||||||
|
`단련이 <span class='ev_failed'>지지부진</span>하여 ${armTypeName} 숙련도가 <C>${scoreText}</> 향상되었습니다.`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
context.addLog(`${armTypeName} 숙련도가 <C>${scoreText}</> 향상되었습니다.`);
|
||||||
|
}
|
||||||
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
||||||
|
|
||||||
return { effects: [] };
|
return { effects: [] };
|
||||||
|
|||||||
@@ -123,6 +123,12 @@ export class ActionResolver<
|
|||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!ctx.nation) {
|
||||||
|
ctx.addLog(`<Y>${destGeneral.name}</>에게 등용 권유 서신을 보내지 못했습니다. 국가 정보가 없습니다.`, {
|
||||||
|
category: LogCategory.ACTION,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
effects.push(
|
effects.push(
|
||||||
createLogEffect(
|
createLogEffect(
|
||||||
`<Y>${general.name}</>(${ctx.nation?.name ?? '재야'})로 부터 등용 권유 서신이 도착했습니다.`,
|
`<Y>${general.name}</>(${ctx.nation?.name ?? '재야'})로 부터 등용 권유 서신이 도착했습니다.`,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import type { RandomGenerator } from '@sammo-ts/common';
|
import type { RandomGenerator } from '@sammo-ts/common';
|
||||||
|
import { JosaUtil } from '@sammo-ts/common';
|
||||||
import type { City, General, GeneralMeta, GeneralTriggerState, Nation } from '@sammo-ts/logic/domain/entities.js';
|
import type { City, General, GeneralMeta, GeneralTriggerState, Nation } from '@sammo-ts/logic/domain/entities.js';
|
||||||
import type { Constraint, ConstraintContext, RequirementKey, StateView } from '@sammo-ts/logic/constraints/types.js';
|
import type { Constraint, ConstraintContext, RequirementKey, StateView } from '@sammo-ts/logic/constraints/types.js';
|
||||||
import {
|
import {
|
||||||
@@ -253,9 +254,18 @@ export class ActionResolver<
|
|||||||
? { ...metaWithStatExp, max_domestic_critical: result.score }
|
? { ...metaWithStatExp, max_domestic_critical: result.score }
|
||||||
: { ...metaWithStatExp, max_domestic_critical: 0 };
|
: { ...metaWithStatExp, max_domestic_critical: 0 };
|
||||||
|
|
||||||
const pickLabel = result.pick === 'success' ? '성공' : result.pick === 'fail' ? '실패' : '완료';
|
const scoreText = Math.round(result.score).toLocaleString();
|
||||||
const logMessage = `${ACTION_NAME} ${pickLabel}: +${Math.round(result.score)}`;
|
const logName = ACTION_NAME.replace(' ', '');
|
||||||
context.addLog(logMessage);
|
const josaUl = JosaUtil.pick(logName, '을');
|
||||||
|
if (result.pick === 'fail') {
|
||||||
|
context.addLog(
|
||||||
|
`${logName}${josaUl} <span class='ev_failed'>실패</span>하여 <C>${scoreText}</> 상승했습니다.`
|
||||||
|
);
|
||||||
|
} else if (result.pick === 'success') {
|
||||||
|
context.addLog(`${logName}${josaUl} <S>성공</>하여 <C>${scoreText}</> 상승했습니다.`);
|
||||||
|
} else {
|
||||||
|
context.addLog(`${logName}${josaUl} 하여 <C>${scoreText}</> 상승했습니다.`);
|
||||||
|
}
|
||||||
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
||||||
|
|
||||||
return { effects: [] };
|
return { effects: [] };
|
||||||
|
|||||||
@@ -40,12 +40,10 @@ export class ActionDefinition<
|
|||||||
const maxPop = city.populationMax;
|
const maxPop = city.populationMax;
|
||||||
|
|
||||||
const nextPop = clamp(currentPop + crew, 0, maxPop);
|
const nextPop = clamp(currentPop + crew, 0, maxPop);
|
||||||
const addedPop = nextPop - currentPop;
|
|
||||||
|
|
||||||
general.crew = 0;
|
general.crew = 0;
|
||||||
city.population = nextPop;
|
city.population = nextPop;
|
||||||
|
|
||||||
context.addLog(`병사들을 소집해제하여 인구가 ${addedPop} 증가했습니다.`);
|
context.addLog(`병사들을 <R>소집해제</>하였습니다.`);
|
||||||
|
|
||||||
return { effects: [] };
|
return { effects: [] };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -357,7 +357,9 @@ export class ActionResolver<
|
|||||||
|
|
||||||
const nameObjJosa = JosaUtil.pick(name, '을');
|
const nameObjJosa = JosaUtil.pick(name, '을');
|
||||||
const nameSubjJosa = JosaUtil.pick(name, '이');
|
const nameSubjJosa = JosaUtil.pick(name, '이');
|
||||||
context.addLog(`인재 <Y>${name}</>${nameObjJosa} 발견했습니다.`, {
|
const recruitVerb = randomRangeInt(context.rng, 0, 1) === 0 ? '발견' : '등용';
|
||||||
|
const nameRa = JosaUtil.pick(name, '라');
|
||||||
|
context.addLog(`<Y>${name}</>${nameRa}는 <C>인재</>를 ${recruitVerb}하였습니다!`, {
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
format: LogFormat.MONTH,
|
format: LogFormat.MONTH,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -55,7 +55,8 @@ export class ActionDefinition<
|
|||||||
context: GeneralActionResolveContext<TriggerState>,
|
context: GeneralActionResolveContext<TriggerState>,
|
||||||
args: AppointmentArgs
|
args: AppointmentArgs
|
||||||
): GeneralActionOutcome<TriggerState> {
|
): GeneralActionOutcome<TriggerState> {
|
||||||
context.addLog(`${ACTION_NAME}을 신청했습니다. (국가 ${args.destNationId})`, {
|
const destNationName = context.nation?.name ?? `${args.destNationId}`;
|
||||||
|
context.addLog(`<D>${destNationName}</>에 임관했습니다.`, {
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
format: LogFormat.MONTH,
|
format: LogFormat.MONTH,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import { defaultActionContextBuilder } from '@sammo-ts/logic/actions/turn/action
|
|||||||
import { tryApplyUniqueLottery } from '@sammo-ts/logic/rewards/uniqueLottery.js';
|
import { tryApplyUniqueLottery } from '@sammo-ts/logic/rewards/uniqueLottery.js';
|
||||||
import { clamp } from 'es-toolkit';
|
import { clamp } from 'es-toolkit';
|
||||||
import type { GeneralTurnCommandSpec } from './index.js';
|
import type { GeneralTurnCommandSpec } from './index.js';
|
||||||
|
import { JosaUtil } from '@sammo-ts/common';
|
||||||
|
|
||||||
export interface SettlementArgs {}
|
export interface SettlementArgs {}
|
||||||
|
|
||||||
@@ -68,7 +69,10 @@ export class ActionDefinition<
|
|||||||
city.population = nextValue;
|
city.population = nextValue;
|
||||||
general.rice = Math.max(0, general.rice - costRice);
|
general.rice = Math.max(0, general.rice - costRice);
|
||||||
|
|
||||||
context.addLog(`인구가 ${nextValue - current} 증가했습니다.`);
|
const scoreText = (nextValue - current).toLocaleString();
|
||||||
|
const logName = this.name.replace(' ', '');
|
||||||
|
const josaUl = JosaUtil.pick(logName, '을');
|
||||||
|
context.addLog(`${logName}${josaUl} 하여 주민이 <C>${scoreText}</>명 증가했습니다.`);
|
||||||
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: '정착 장려' });
|
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: '정착 장려' });
|
||||||
|
|
||||||
return { effects: [] };
|
return { effects: [] };
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import type { RandomGenerator } from '@sammo-ts/common';
|
import type { RandomGenerator } from '@sammo-ts/common';
|
||||||
|
import { JosaUtil } from '@sammo-ts/common';
|
||||||
import type { City, General, GeneralMeta, GeneralTriggerState, Nation } from '@sammo-ts/logic/domain/entities.js';
|
import type { City, General, GeneralMeta, GeneralTriggerState, Nation } from '@sammo-ts/logic/domain/entities.js';
|
||||||
import type { Constraint, ConstraintContext, RequirementKey } from '@sammo-ts/logic/constraints/types.js';
|
import type { Constraint, ConstraintContext, RequirementKey } from '@sammo-ts/logic/constraints/types.js';
|
||||||
import {
|
import {
|
||||||
@@ -165,7 +166,10 @@ export class ActionDefinition<
|
|||||||
general.dedication += result.dedication;
|
general.dedication += result.dedication;
|
||||||
general.meta = { ...addMetaNumber(general.meta, STAT_EXP_KEY, 1), max_domestic_critical: 0 };
|
general.meta = { ...addMetaNumber(general.meta, STAT_EXP_KEY, 1), max_domestic_critical: 0 };
|
||||||
|
|
||||||
context.addLog(`민심이 ${result.trustDelta.toFixed(1)} 상승했습니다.`);
|
const scoreText = result.trustDelta.toFixed(1);
|
||||||
|
const logName = ACTION_NAME.replace(' ', '');
|
||||||
|
const josaUl = JosaUtil.pick(logName, '을');
|
||||||
|
context.addLog(`${logName}${josaUl} 하여 <C>${scoreText}</> 상승했습니다.`);
|
||||||
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
||||||
return { effects: [] };
|
return { effects: [] };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -350,9 +350,7 @@ export class ActionResolver<
|
|||||||
let nextCrew = general.crew;
|
let nextCrew = general.crew;
|
||||||
let nextTrain = general.train;
|
let nextTrain = general.train;
|
||||||
let nextAtmos = general.atmos;
|
let nextAtmos = general.atmos;
|
||||||
let logMessage = '';
|
const crewLabel = `${crewType.name} <C>${appliedCrew.toLocaleString()}</>명`;
|
||||||
|
|
||||||
const crewLabel = `${crewType.name} ${appliedCrew}명`;
|
|
||||||
if (crewType.id === general.crewTypeId && general.crew > 0) {
|
if (crewType.id === general.crewTypeId && general.crew > 0) {
|
||||||
nextCrew = general.crew + appliedCrew;
|
nextCrew = general.crew + appliedCrew;
|
||||||
nextTrain = Math.round(
|
nextTrain = Math.round(
|
||||||
@@ -361,13 +359,13 @@ export class ActionResolver<
|
|||||||
nextAtmos = Math.round(
|
nextAtmos = Math.round(
|
||||||
(general.crew * general.atmos + appliedCrew * setAtmos) / (general.crew + appliedCrew)
|
(general.crew * general.atmos + appliedCrew * setAtmos) / (general.crew + appliedCrew)
|
||||||
);
|
);
|
||||||
logMessage = `${crewLabel} 추가 ${ACTION_NAME}했습니다.`;
|
context.addLog(`${crewLabel} 추가${ACTION_NAME}했습니다.`);
|
||||||
} else {
|
} else {
|
||||||
nextCrewTypeId = crewType.id;
|
nextCrewTypeId = crewType.id;
|
||||||
nextCrew = appliedCrew;
|
nextCrew = appliedCrew;
|
||||||
nextTrain = Math.round(setTrain);
|
nextTrain = Math.round(setTrain);
|
||||||
nextAtmos = Math.round(setAtmos);
|
nextAtmos = Math.round(setAtmos);
|
||||||
logMessage = `${crewLabel} ${ACTION_NAME}했습니다.`;
|
context.addLog(`${crewLabel} ${ACTION_NAME}했습니다.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const nextGold = Math.max(0, general.gold - plan.gold);
|
const nextGold = Math.max(0, general.gold - plan.gold);
|
||||||
@@ -392,7 +390,6 @@ export class ActionResolver<
|
|||||||
general.dedication += dedGain;
|
general.dedication += dedGain;
|
||||||
general.meta = addMetaNumber(general.meta, 'leadership_exp', 1);
|
general.meta = addMetaNumber(general.meta, 'leadership_exp', 1);
|
||||||
|
|
||||||
context.addLog(logMessage);
|
|
||||||
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
tryApplyUniqueLottery(context, { acquireType: '아이템', reason: ACTION_NAME });
|
||||||
|
|
||||||
return { effects: [] };
|
return { effects: [] };
|
||||||
|
|||||||
@@ -348,11 +348,12 @@ export class ActionDefinition<
|
|||||||
} else {
|
} else {
|
||||||
const targetName = finalTargetCity.name;
|
const targetName = finalTargetCity.name;
|
||||||
const josaRoTarget = JosaUtil.pick(targetName, '로');
|
const josaRoTarget = JosaUtil.pick(targetName, '로');
|
||||||
|
const josaUl = JosaUtil.pick(destCity.name, '을');
|
||||||
context.addLog(
|
context.addLog(
|
||||||
`가까운 경로에 적군 도시가 없습니다. <G><b>${destCity.name}</b></>${josaRo} 이동합니다.`
|
`가까운 경로에 적군 도시가 없습니다. <G><b>${destCity.name}</b></>${josaRo} 이동합니다.`
|
||||||
);
|
);
|
||||||
context.addLog(
|
context.addLog(
|
||||||
`<G><b>${targetName}</b></>${josaRoTarget} 가는 도중 <G><b>${destCity.name}</b></>을 거치기로 합니다.`
|
`<G><b>${targetName}</b></>${josaRoTarget} 가는 도중 <G><b>${destCity.name}</b></>${josaUl} 거치기로 합니다.`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ export class ActionDefinition<
|
|||||||
|
|
||||||
const josaYi = JosaUtil.pick(generalName, '이');
|
const josaYi = JosaUtil.pick(generalName, '이');
|
||||||
const josaYiNation = JosaUtil.pick(newNationName, '이');
|
const josaYiNation = JosaUtil.pick(newNationName, '이');
|
||||||
|
const josaRo = JosaUtil.pick(newNationName, '로');
|
||||||
|
|
||||||
const effects: Array<GeneralActionEffect<TriggerState>> = [
|
const effects: Array<GeneralActionEffect<TriggerState>> = [
|
||||||
createNationPatchEffect(
|
createNationPatchEffect(
|
||||||
@@ -99,14 +100,14 @@ export class ActionDefinition<
|
|||||||
nation.id
|
nation.id
|
||||||
),
|
),
|
||||||
// Global Action Log
|
// Global Action Log
|
||||||
createLogEffect(`<Y>${generalName}</>${josaYi} 국호를 <D><b>${newNationName}</b></>로 변경하였습니다.`, {
|
createLogEffect(`<Y>${generalName}</>${josaYi} 국호를 <D><b>${newNationName}</b></>${josaRo} 변경합니다.`, {
|
||||||
scope: LogScope.SYSTEM,
|
scope: LogScope.SYSTEM,
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
format: LogFormat.PLAIN,
|
format: LogFormat.PLAIN,
|
||||||
}),
|
}),
|
||||||
// Global History Log
|
// Global History Log
|
||||||
createLogEffect(
|
createLogEffect(
|
||||||
`<S><b>【${ACTION_NAME}】</b></><D><b>${oldNationName}</b></>${josaYiNation} 국호를 <D><b>${newNationName}</b></>로 변경하였습니다.`,
|
`<S><b>【${ACTION_NAME}】</b></><D><b>${oldNationName}</b></>${josaYiNation} 국호를 <D><b>${newNationName}</b></>${josaRo} 변경합니다.`,
|
||||||
{
|
{
|
||||||
scope: LogScope.SYSTEM,
|
scope: LogScope.SYSTEM,
|
||||||
category: LogCategory.HISTORY,
|
category: LogCategory.HISTORY,
|
||||||
@@ -114,14 +115,14 @@ export class ActionDefinition<
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
// Actor Nation History Log
|
// Actor Nation History Log
|
||||||
createLogEffect(`<Y>${generalName}</>${josaYi} 국호를 <D><b>${newNationName}</b></>로 변경하였습니다.`, {
|
createLogEffect(`<Y>${generalName}</>${josaYi} 국호를 <D><b>${newNationName}</b></>${josaRo} 변경`, {
|
||||||
scope: LogScope.NATION,
|
scope: LogScope.NATION,
|
||||||
nationId: nation.id,
|
nationId: nation.id,
|
||||||
category: LogCategory.HISTORY,
|
category: LogCategory.HISTORY,
|
||||||
format: LogFormat.YEAR_MONTH,
|
format: LogFormat.YEAR_MONTH,
|
||||||
}),
|
}),
|
||||||
// General Action Log
|
// General Action Log
|
||||||
createLogEffect(`국호를 <D><b>${newNationName}</b></>로 변경하였습니다.`, {
|
createLogEffect(`국호를 <D><b>${newNationName}</b></>${josaRo} 변경합니다.`, {
|
||||||
scope: LogScope.GENERAL,
|
scope: LogScope.GENERAL,
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
format: LogFormat.MONTH,
|
format: LogFormat.MONTH,
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ export class ActionDefinition<
|
|||||||
|
|
||||||
const amountText = actualAmount.toLocaleString();
|
const amountText = actualAmount.toLocaleString();
|
||||||
const josaUl = JosaUtil.pick(amountText, '을');
|
const josaUl = JosaUtil.pick(amountText, '을');
|
||||||
|
const destGeneralName = destGeneral.name;
|
||||||
|
|
||||||
const effects: Array<GeneralActionEffect<TriggerState>> = [
|
const effects: Array<GeneralActionEffect<TriggerState>> = [
|
||||||
createGeneralPatchEffect(
|
createGeneralPatchEffect(
|
||||||
@@ -132,7 +133,7 @@ export class ActionDefinition<
|
|||||||
nation.id
|
nation.id
|
||||||
),
|
),
|
||||||
// Actor General Action Log
|
// Actor General Action Log
|
||||||
createLogEffect(`<Y>${destGeneral.name}</>에게서 ${resName} <C>${amountText}</>${josaUl} 몰수했습니다.`, {
|
createLogEffect(`<Y>${destGeneralName}</>에게서 ${resName} <C>${amountText}</>${josaUl} 몰수했습니다.`, {
|
||||||
scope: LogScope.GENERAL,
|
scope: LogScope.GENERAL,
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
format: LogFormat.MONTH,
|
format: LogFormat.MONTH,
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import type { GeneralActionDefinition } from '@sammo-ts/logic/actions/definition
|
|||||||
import type { GeneralActionOutcome, GeneralActionResolveContext } from '@sammo-ts/logic/actions/engine.js';
|
import type { GeneralActionOutcome, GeneralActionResolveContext } from '@sammo-ts/logic/actions/engine.js';
|
||||||
import { createLogEffect } from '@sammo-ts/logic/actions/engine.js';
|
import { createLogEffect } from '@sammo-ts/logic/actions/engine.js';
|
||||||
import { LogCategory, LogFormat, LogScope } from '@sammo-ts/logic/logging/types.js';
|
import { LogCategory, LogFormat, LogScope } from '@sammo-ts/logic/logging/types.js';
|
||||||
|
import { JosaUtil } from '@sammo-ts/common';
|
||||||
import type { ActionContextBuilder } from '@sammo-ts/logic/actions/turn/actionContext.js';
|
import type { ActionContextBuilder } from '@sammo-ts/logic/actions/turn/actionContext.js';
|
||||||
import type { TurnCommandEnv } from '@sammo-ts/logic/actions/turn/commandEnv.js';
|
import type { TurnCommandEnv } from '@sammo-ts/logic/actions/turn/commandEnv.js';
|
||||||
import type { NationTurnCommandSpec } from './index.js';
|
import type { NationTurnCommandSpec } from './index.js';
|
||||||
@@ -119,9 +120,12 @@ export class ActionDefinition<
|
|||||||
_context: GeneralActionResolveContext<TriggerState>,
|
_context: GeneralActionResolveContext<TriggerState>,
|
||||||
args: NonAggressionProposalArgs
|
args: NonAggressionProposalArgs
|
||||||
): GeneralActionOutcome<TriggerState> {
|
): GeneralActionOutcome<TriggerState> {
|
||||||
|
const destNationName =
|
||||||
|
(_context as { destNation?: { name?: string } }).destNation?.name ?? `국가${args.destNationId}`;
|
||||||
|
const josaRo = JosaUtil.pick(destNationName, '로');
|
||||||
return {
|
return {
|
||||||
effects: [
|
effects: [
|
||||||
createLogEffect(`${ACTION_NAME}을 준비했습니다. (국가 ${args.destNationId})`, {
|
createLogEffect(`<D><b>${destNationName}</b></>${josaRo} 불가침 제의 서신을 보냈습니다.`, {
|
||||||
scope: LogScope.GENERAL,
|
scope: LogScope.GENERAL,
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
format: LogFormat.MONTH,
|
format: LogFormat.MONTH,
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import type { GeneralActionDefinition } from '@sammo-ts/logic/actions/definition
|
|||||||
import type { GeneralActionOutcome, GeneralActionResolveContext } from '@sammo-ts/logic/actions/engine.js';
|
import type { GeneralActionOutcome, GeneralActionResolveContext } from '@sammo-ts/logic/actions/engine.js';
|
||||||
import { createLogEffect } from '@sammo-ts/logic/actions/engine.js';
|
import { createLogEffect } from '@sammo-ts/logic/actions/engine.js';
|
||||||
import { LogCategory, LogFormat, LogScope } from '@sammo-ts/logic/logging/types.js';
|
import { LogCategory, LogFormat, LogScope } from '@sammo-ts/logic/logging/types.js';
|
||||||
|
import { JosaUtil } from '@sammo-ts/common';
|
||||||
import type { TurnCommandEnv } from '@sammo-ts/logic/actions/turn/commandEnv.js';
|
import type { TurnCommandEnv } from '@sammo-ts/logic/actions/turn/commandEnv.js';
|
||||||
import { defaultActionContextBuilder } from '@sammo-ts/logic/actions/turn/actionContext.js';
|
import { defaultActionContextBuilder } from '@sammo-ts/logic/actions/turn/actionContext.js';
|
||||||
import type { NationTurnCommandSpec } from './index.js';
|
import type { NationTurnCommandSpec } from './index.js';
|
||||||
@@ -59,9 +60,12 @@ export class ActionDefinition<
|
|||||||
_context: GeneralActionResolveContext<TriggerState>,
|
_context: GeneralActionResolveContext<TriggerState>,
|
||||||
args: NonAggressionCancelProposalArgs
|
args: NonAggressionCancelProposalArgs
|
||||||
): GeneralActionOutcome<TriggerState> {
|
): GeneralActionOutcome<TriggerState> {
|
||||||
|
const destNationName =
|
||||||
|
(_context as { destNation?: { name?: string } }).destNation?.name ?? `국가${args.destNationId}`;
|
||||||
|
const josaRo = JosaUtil.pick(destNationName, '로');
|
||||||
return {
|
return {
|
||||||
effects: [
|
effects: [
|
||||||
createLogEffect(`${ACTION_NAME}을 준비했습니다. (국가 ${args.destNationId})`, {
|
createLogEffect(`<D><b>${destNationName}</b></>${josaRo} 불가침 파기 제의 서신을 보냈습니다.`, {
|
||||||
scope: LogScope.GENERAL,
|
scope: LogScope.GENERAL,
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
format: LogFormat.MONTH,
|
format: LogFormat.MONTH,
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ export class ActionResolver<
|
|||||||
|
|
||||||
const amountJosa = JosaUtil.pick(amountText, '을');
|
const amountJosa = JosaUtil.pick(amountText, '을');
|
||||||
effects.push(
|
effects.push(
|
||||||
createLogEffect(`${label} ${amountText}${amountJosa} 포상으로 받았습니다.`, {
|
createLogEffect(`${label} <C>${amountText}</>${amountJosa} 포상으로 받았습니다.`, {
|
||||||
scope: LogScope.GENERAL,
|
scope: LogScope.GENERAL,
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
generalId: context.destGeneral.id,
|
generalId: context.destGeneral.id,
|
||||||
@@ -141,11 +141,14 @@ export class ActionResolver<
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
effects.push(
|
effects.push(
|
||||||
createLogEffect(`<Y>${context.destGeneral.name}</>에게 ${label} ${amountText}${amountJosa} 수여했습니다.`, {
|
createLogEffect(
|
||||||
|
`<Y>${context.destGeneral.name}</>에게 ${label} <C>${amountText}</>${amountJosa} 수여했습니다.`,
|
||||||
|
{
|
||||||
scope: LogScope.GENERAL,
|
scope: LogScope.GENERAL,
|
||||||
category: LogCategory.ACTION,
|
category: LogCategory.ACTION,
|
||||||
format: LogFormat.MONTH,
|
format: LogFormat.MONTH,
|
||||||
})
|
}
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
return { effects };
|
return { effects };
|
||||||
|
|||||||
@@ -1,6 +1,19 @@
|
|||||||
{
|
{
|
||||||
"Global": {
|
"Global": {
|
||||||
"templates": [],
|
"templates": [
|
||||||
|
"${}에게서 몰수할 ${}이 없습니다.",
|
||||||
|
"이동할 인구가 부족합니다.",
|
||||||
|
"이미 같은 국호를 가진 곳이 있습니다. ${} 실패",
|
||||||
|
"<Y>${}</>에게 등용 권유 서신을 보내지 못했습니다. ${}",
|
||||||
|
"<Y>${}</>에게 부대 탈퇴를 지시 받았습니다.",
|
||||||
|
"<Y>${}</>에 의해 <G>${}</>${} 발령됐습니다.",
|
||||||
|
"경로에 도달할 방법이 없습니다.",
|
||||||
|
"${}${} <span class='ev_failed'>실패</span>하여 <C>${}</> 상승했습니다.",
|
||||||
|
"${}${} <S>성공</>하여 <C>${}</> 상승했습니다.",
|
||||||
|
"${}이 ${}에 국가를 건설하였습니다.",
|
||||||
|
"민심이 ${} 상승했습니다.",
|
||||||
|
"다음 턴부터 건국할 수 있습니다."
|
||||||
|
],
|
||||||
"regex": []
|
"regex": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -586,6 +586,7 @@ const normalizeTemplate = (text) => {
|
|||||||
out = out.replace(/<1>.*?<\/>/g, '');
|
out = out.replace(/<1>.*?<\/>/g, '');
|
||||||
}
|
}
|
||||||
out = out.replace(/<\/?b>/g, '');
|
out = out.replace(/<\/?b>/g, '');
|
||||||
|
out = out.replace(/\{\$\{[^}]*\}[^}]*\}/g, '${}');
|
||||||
out = out.replace(/\$\{[^}]*\}/g, '${}');
|
out = out.replace(/\$\{[^}]*\}/g, '${}');
|
||||||
out = out.replace(/\{\$[A-Za-z_][A-Za-z0-9_]*\}/g, '${}');
|
out = out.replace(/\{\$[A-Za-z_][A-Za-z0-9_]*\}/g, '${}');
|
||||||
out = out.replace(/\$[A-Za-z_][A-Za-z0-9_]*\b/g, '${}');
|
out = out.replace(/\$[A-Za-z_][A-Za-z0-9_]*\b/g, '${}');
|
||||||
|
|||||||
Reference in New Issue
Block a user