diff --git a/packages/logic/src/domain/entities.ts b/packages/logic/src/domain/entities.ts new file mode 100644 index 0000000..df279e1 --- /dev/null +++ b/packages/logic/src/domain/entities.ts @@ -0,0 +1,80 @@ +// 도메인 기본 엔티티: 서비스/DB에 의존하지 않는 공통 모델. + +export type GeneralId = number; +export type CityId = number; +export type NationId = number; + +export type ColorCode = string; + +export interface StatBlock { + leadership: number; + strength: number; + intelligence: number; +} + +export type TriggerValue = boolean | number | string; + +export interface GeneralTriggerState { + // Trigger 시스템에서 사용하는 확장 슬롯. + flags: Record; + counters: Record; + modifiers: Record; + meta: Record; +} + +export interface General { + id: GeneralId; + name: string; + nationId: NationId; + cityId: CityId; + troopId: number; + stats: StatBlock; + experience: number; + dedication: number; + officerLevel: number; + injury: number; + gold: number; + rice: number; + crew: number; + train: number; + age: number; + npcState: number; + triggerState: TriggerState; + meta: Record; +} + +export interface City { + id: CityId; + name: string; + nationId: NationId; + level: number; + population: number; + populationMax: number; + agriculture: number; + agricultureMax: number; + commerce: number; + commerceMax: number; + security: number; + securityMax: number; + supplyState: number; + frontState: number; + defence: number; + defenceMax: number; + wall: number; + wallMax: number; + meta: Record; +} + +export interface Nation { + id: NationId; + name: string; + color: ColorCode; + capitalCityId: CityId | null; + chiefGeneralId: GeneralId | null; + gold: number; + rice: number; + power: number; + level: number; + typeCode: string; + meta: Record; +} diff --git a/packages/logic/src/index.ts b/packages/logic/src/index.ts index cb0ff5c..6d6cccb 100644 --- a/packages/logic/src/index.ts +++ b/packages/logic/src/index.ts @@ -1 +1,2 @@ -export {}; +export * from './domain/entities'; +export * from './ports/world'; diff --git a/packages/logic/src/ports/world.ts b/packages/logic/src/ports/world.ts new file mode 100644 index 0000000..bb2c6d5 --- /dev/null +++ b/packages/logic/src/ports/world.ts @@ -0,0 +1,55 @@ +// 도메인 로직이 DB에 직접 접근하지 않도록 하는 인터페이스. + +import type { + City, + CityId, + General, + GeneralId, + Nation, + NationId, +} from '../domain/entities'; + +export interface GeneralRepository { + getById(id: GeneralId): Promise; + listByNation(nationId: NationId): Promise; + save(general: GeneralType): Promise; +} + +export interface CityRepository { + getById(id: CityId): Promise; + listByNation(nationId: NationId): Promise; + save(city: CityType): Promise; +} + +export interface NationRepository { + getById(id: NationId): Promise; + listAll(): Promise; + save(nation: NationType): Promise; +} + +export interface WorldStateReader< + GeneralType extends General = General, + CityType extends City = City, + NationType extends Nation = Nation +> { + getGeneralById(id: GeneralId): Promise; + getCityById(id: CityId): Promise; + getNationById(id: NationId): Promise; +} + +export interface WorldStateWriter< + GeneralType extends General = General, + CityType extends City = City, + NationType extends Nation = Nation +> { + saveGeneral(general: GeneralType): Promise; + saveCity(city: CityType): Promise; + saveNation(nation: NationType): Promise; +} + +export interface WorldStateRepository< + GeneralType extends General = General, + CityType extends City = City, + NationType extends Nation = Nation +> extends WorldStateReader, + WorldStateWriter {}