diff --git a/docs/Component.md b/docs/Component.md new file mode 100644 index 0000000..37d0ad9 --- /dev/null +++ b/docs/Component.md @@ -0,0 +1,95 @@ +--- +마지막수정일: 2024-03-01 +--- + +# Component 구성 + +컴포넌트 구성과 역할을 설명합니다. + +## 객체 + +서버 내에 객체는 다음 그림과 같습니다. + +![구조](./threads.drawio.svg) + + +### MongoDB + +메인 DB는 MongoDB입니다. + +Collection은 다양하나, 게임 엔진에 필요한 값과 게임 엔진에 필요하지 않은 값이 분리됩니다. + +분리되는 예시는 다음과 같습니다. + +- 게임 내부 Collection + - 장수의 능력치 + - 장수의 금/쌀 + - 장수의 수비 켬/끔 여부 + - 도시의 현재 스탯 + - 국가의 금/쌀, 전략 수치 + - 국가의 게임 내 정책(세율, 지급률) + +- 게임 외부 Collection + - 장수의 메시지함 + - 국가의 방침 게시물 + - 국가의 회의록 + - 국가간 외교 메시지 + - 로그인 정보, 벌점 + - 유니크 경매장 진행상태 + + +### 게임 엔진 + +턴 실행과 관련된 게임 핵심 로직을 처리하는 엔진 컴포넌트이며, 게임 내부 Collection에 대한 쓰기 명령은 게임 엔진에서만 가능합니다. + +게임 엔진은 예외적인 경우에 게임 외부 Collection의 쓰기 명령을 할 수 있지만, 게임 내부에 영향을 주지 않는 경우여야만 합니다. 만약 예전에는 게임 외부 Collection에 기록되는 데이터였다 할지라도, 게임 엔진에서 다루기 시작한다면 게임 내부 Collection으로 이관됩니다. + +#### 명령 처리 순서 + +![명령처리순서](./engine_issue_port.drawio.svg) + +게임 엔진은 내부적으로 세개의 처리 큐를 가집니다. + +- 장수 처리 Queue: 턴마다 처리되는 장수 명령 처리 Queue입니다. +- NPC Action Queue: NPC의 명령을 처리하는 Queue입니다. + - NPC 명령 선택기의 입력 요청이 이곳에 쌓입니다. +- 유저 Action Queue: 유저의 명령을 처리합니다. + - API 처리기를 통해 전달됩니다. + +세개의 처리 큐는 장수 처리 Queue > NPC Action Queue > 유저 Action Queue 순의 우선순위를 가집니다. + +#### DB 반영 시점 + +MongoDB에 데이터가 기록되는 시점은 Queue의 아이템 하나를 해소했을 때 이루어집니다. +즉, 장수의 턴 하나가 완전히 실행되었을 때에만 DB에 반영된다고 할 수 있습니다. + +게임 엔진 내에서 변경되는 내용은 메모리 내의 저장소에만 담아두고, 처리를 마치는 시점에 변경된 내용을 정리하여 한번에 쓰기 작업을 수행하여 Transaction을 모사합니다. + + +### NPC 명령 선택기 + +NPC 명령 선택기는 NPC가 어떤 턴을 실행해야할지만을 연산하는 컴포넌트입니다. + +NPC의 실행턴보다 일정 시간 이전에 적절한 턴이 무엇인지 계산하고, 게임 엔진으로 결과값을 전송합니다. + +이때 명령의 규격은 일반 유저가 내리는 명령 규격과 유사한 형태를 갖습니다. + +> [!NOTE] +> +> 기존 삼모전 PHP에서는 명령 선택기가 게임 엔진과 동기적으로 구성되어있었습니다. + + + +### API 처리기 + +API 처리기는 유저의 명령을 받아 1차적으로 처리합니다. + +게임 외부 데이터에 대한 처리라면 읽기/쓰기를 모두 수행하며, 게임 내부 데이터이면 읽기 작업은 직접할 수 있습니다. + +턴 입력 등 쓰기 작업이 요구되는 경우라면 게임 엔진에 해당 작업을 요청하고, 작업이 끝날때까지 기다린 다음, 엔진으로부터 결과값을 받아 반환합니다. + +> [!WARNING] +> +> **어떠한 경우에도** 게임 내부 DB에 직접 쓰기를 해서는 안됩니다. +> +> 게임 엔진은 메모리 cache에 강력히 의존하므로, 내부 DB에 직접 쓰는 작업은 게임 엔진의 처리 결과를 훼손할 것입니다. diff --git a/docs/engine_issue_port.drawio.svg b/docs/engine_issue_port.drawio.svg new file mode 100644 index 0000000..246911a --- /dev/null +++ b/docs/engine_issue_port.drawio.svg @@ -0,0 +1,302 @@ + + + + + + + +
+
+
+ 장수a 01:23 +
+
+
+
+ + 장수a 01:23 + +
+
+ + + + +
+
+
+ 장수 처리 Queue +
+
+
+
+ + 장수 처리 Queue + +
+
+ + + + +
+
+
+ 장수b 04:59 +
+
+
+
+ + 장수b 04:59 + +
+
+ + + + +
+
+
+ ... +
+
+
+
+ + ... + +
+
+ + + + +
+
+
+ 장수z 59:59 +
+
+
+
+ + 장수z 59:59 + +
+
+ + + + +
+
+
+ 유저 Action Queue +
+
+
+
+ + 유저 Action Queue + +
+
+ + + + +
+
+
+ 장수b 턴1,4,7 +
+ 모병 신귀병 7000 +
+
+
+
+ + 장수b 턴1,4,7... + +
+
+ + + + +
+
+
+ NPC Action Queue +
+
+
+
+ + NPC Action Queue + +
+
+ + + + +
+
+
+ NPCa 세율 20% +
+
+
+
+ + NPCa 세율 20% + +
+
+ + + + +
+
+
+ NPCa 턴1 +
+ 출병 무위 +
+
+
+
+ + NPCa 턴1... + +
+
+ + + + +
+
+
+ NPCc 턴1 +
+ 귀환 +
+
+
+
+ + NPCc 턴1... + +
+
+ + + + +
+
+
+ 장수f 경매결과 +
+ 백마 획득 +
+
+
+
+ + 장수f 경매결과... + +
+
+ + + + +
+
+
+ 시스템 +
+ 적토마 잠금 +
+
+
+
+ + 시스템 +적토마 잠금 + +
+
+ + + + +
+
+
+ 국가a +
+ 세율 30% +
+
+
+
+ + 국가a... + +
+
+ + + + +
+
+
+ 장수x(국가b) +
+ 사령턴1 발령 +
+
+
+
+ + 장수x(국가b)... + +
+
+ + + + +
+
+
+ NPCd(국가a) +
+ 사령턴1 포상 +
+
+
+
+ + NPCd(국가a)... + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/docs/threads.drawio.svg b/docs/threads.drawio.svg new file mode 100644 index 0000000..6bf3fb9 --- /dev/null +++ b/docs/threads.drawio.svg @@ -0,0 +1,285 @@ + + + + + + + + +
+
+
+ MongoDB +
+ (게임 내부) +
+
+
+
+ + MongoDB... + +
+
+ + + + + +
+
+
+ MongoDB +
+ (게임 외부) +
+
+
+
+ + MongoDB... + +
+
+ + + + +
+
+
+ API 처리기 +
+
+
+
+ + API 처리기 + +
+
+ + + + +
+
+
+ 게임 엔진 +
+
+
+
+ + 게임 엔진 + +
+
+ + + + +
+
+
+ NPC 명령 선택기 +
+
+
+
+ + NPC 명령 선택기 + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ 변경된 +
+ 장수/도시/국가 +
+ 데이터 전달 +
+
+
+
+ + 변경된장수/도시/국가... + +
+
+ + + + +
+
+
+ NPC별 +
+ 턴 입력 +
+
+
+
+ + NPC별... + +
+
+ + + + +
+
+
+ NPC별 +
+ 턴 입력 요청 +
+
+
+
+ + NPC별... + +
+
+ + + + +
+
+
+ 턴 입력 요청 +
+ 게임 데이터 변경 요청 +
+
+
+
+ + 턴 입력 요청... + +
+
+ + + + +
+
+
+ 처리 결과 반환 +
+
+
+
+ + 처리 결과 반환 + +
+
+ + + + + +
+
+
+ Actor +
+
+
+
+ + Actor + +
+
+ + + + + + + + + + +
+
+
+ 특정 명령 처리 요구 +
+ (메시지 전송 등) +
+
+
+
+ + 특정 명령 처리 요구... + +
+
+ + + + + + + +
+
+
+ In-memory cache +
+
+
+
+ + In-memory cac... + +
+
+ + + +
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file