Map updates and mod documentation
This commit is contained in:
1 parent
240df5d343
commit
6739c1d2e5
24 files changed
+829
-147
No files matched your search
+92
@@ -0,0 +1,92 @@
|
||||
# RPG Demo — 작은 타일맵 세계
|
||||
|
||||
RPG Demo는 짧고 완결된 타일맵 모험입니다. 잿빛 숲 옆의 마을, 촌장의 집, 그리고 동굴에 늑대가 사는 숲. 키보드로 걷고, 사람들과 말하고, 상자를 열고, 숲에서 물건을 모아 상인에게 팔고, 싸웁니다. 데이터 파일과 시나리오만으로 이루어져 있고 코드가 한 줄도 없어서, 타일맵 게임이 어떻게 조립되는지 보여 주는 살아 있는 예이기도 합니다.
|
||||
|
||||
이 데모에는 자기 게임 카드가 없습니다. **RPG Plus** 게임의 세계이며, RPG Plus가 이 모드를 포함하고 그 위에 지어 올립니다. **플레이 → RPG Plus → 새 게임**에서 시작하세요. RPG Plus의 짧은 갈림길 프롤로그를 지나면 이 마을에 도착합니다. 아래 스크린샷은 RPG Plus에서 찍었으므로, 그 안의 일부 사람과 물품은 그 게임이 추가한 것입니다.
|
||||
|
||||

|
||||
|
||||
## 하는 법
|
||||
|
||||
- **걷기**는 WASD 또는 방향키, **달리기**는 Shift.
|
||||
- 사람이나 물건을 마주 본 채 E 또는 F로 **말하기, 열기, 읽기**.
|
||||
- 문이나 길 끝에 발을 디디면 다음 맵으로 이동합니다.
|
||||
|
||||
이야기: 촌장이 마을 동쪽 동굴 옆에 자리 잡은 늑대를 쫓아 달라고 부탁합니다. 연못을 지나 숲길을 따라가고, 길을 막은 슬라임을 처리하고, 늑대와 마주 섭니다. 늑대가 쓰러지면 촌장이 감사를 전합니다 — 제 방식대로.
|
||||
|
||||
## 세계에 있는 것
|
||||
|
||||
- **맵 세 개.** 마을(32×18 타일), 촌장의 집, 잿빛 숲. 모두 Village Pack의 마을 타일셋으로 그려져 있습니다.
|
||||
- **사람들.** 촌장은 퀘스트를 주고 끝내고, 마을 사람들은 수다를 떨고, 표지판이 마을 이름을 알립니다. 문 하나는 잠겨 있습니다.
|
||||
- **상자.** 촌장의 집에 하나, 숲에 하나. 열린 상자는 열린 채로 남습니다.
|
||||
- **숲에서 채집.** 오솔길을 따라 땔감, 돌, 숲 버섯이 놓여 있습니다. 각 자리는 한 번만 챙길 수 있습니다. 버섯은 체력을 5 회복합니다.
|
||||
- **상인.** 엘릭서(체력 20 회복)를 동전 10 닢에 팔고, 땔감을 1 닢에, 돌을 2 닢에 삽니다.
|
||||
- **전투.** 오솔길의 슬라임과 동굴의 늑대는 맵에 보이며, 말을 걸면 싸움이 시작됩니다. 숲에서는 슬라임 한두 마리와의 랜덤 인카운터가 대략 48 걸음마다 일어납니다.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 모드 작성자를 위해: 어떻게 지어졌나
|
||||
|
||||
```filestree
|
||||
rpg_demo_game/
|
||||
├── maps/ rpg_village.json, rpg_elder_house.json, rpg_forest.json
|
||||
├── map_events/<map>/events.json 사람, 문, 상자, 줍는 아이템, 몬스터
|
||||
├── scenes/ 맵마다 장면 하나
|
||||
├── scenarios/rpg_demo/ 인트로, 맵 입구, events/*.scenario
|
||||
├── characters/ 영웅, 슬라임, 늑대
|
||||
├── items/rpg_demo/ 땔감, 돌, 버섯, 엘릭서와 그 아이콘
|
||||
├── shops/village_merchant.json
|
||||
└── locale/ 7개 언어의 이름과 시나리오 번역
|
||||
```
|
||||
|
||||
**맵**은 타일셋 위에 층으로 놓인 타일 번호 격자이며, 자체 이름, 크기, 확대 배율을 가집니다. 숲 맵은 랜덤 인카운터도 나열합니다:
|
||||
|
||||
```json
|
||||
"Encounters": {
|
||||
"Steps": 48,
|
||||
"Groups": ["rpg_slime", "rpg_slime,rpg_slime"]
|
||||
}
|
||||
```
|
||||
|
||||
**이벤트**는 타일 위에 놓인 무언가입니다. `"Trigger": "Touch"` 문은 순간이동을 하고, 몬스터는 시나리오를 실행하다가 자기 플래그가 세워지면 사라집니다:
|
||||
|
||||
```json
|
||||
{
|
||||
"Id": "wolf_boss",
|
||||
"X": 25,
|
||||
"Y": 8,
|
||||
"Sprite": "village/wolf",
|
||||
"Dir": "Left",
|
||||
"Scenario": "rpg_demo/events/wolf_boss",
|
||||
"Condition": "rpg_wolf_dead != 1"
|
||||
}
|
||||
```
|
||||
|
||||
**시나리오**는 대사를 말하고 싸움을 시작합니다. 이기면 플래그가 세워집니다:
|
||||
|
||||
```scenario
|
||||
ptext "동굴 옆에 늑대가 앉아 있다. 촌장네 염소를 보는 눈빛으로 당신을 훑어본다." key=rpg_demo/wolf/line1
|
||||
text "크르르." key=rpg_demo/wolf/line2
|
||||
action rpg.battle enemies=rpg_wolf,rpg_slime win_flag=rpg_wolf_dead
|
||||
end
|
||||
```
|
||||
|
||||
이 모드 시나리오의 대사는 러시아어로 쓰여 있습니다. 각 줄에는 `key=`가 붙고 번역은 `locale/scenarios_<lang>.properties`에서 오기 때문에, 게임은 인터페이스 언어로 보여 줍니다:
|
||||
|
||||
```properties
|
||||
rpg_demo/wolf/line1 = 동굴 옆에 늑대가 앉아 있다. 촌장네 염소를 보는 눈빛으로 당신을 훑어본다.
|
||||
```
|
||||
|
||||
나머지 조각들도 같은 방식입니다. 상자는 `action item.add`를 실행하고 플래그를 세운 뒤, 반대 `Condition`을 가진 열린 상자 이벤트로 바뀝니다. 상인은 `action trade.open shop=rpg_demo/village_merchant`를 실행합니다. 마을 첫 방문에서는 인트로 시나리오가 돌며 `action party.add id=rpg_hero`로 영웅을 파티에 넣습니다.
|
||||
|
||||
맵과 이벤트를 눈으로 보며 바꾸려면 RPG 편집 도구의 맵 편집기를 사용하세요.
|
||||
|
||||
## 문제가 생겼을 때
|
||||
|
||||
1. **문이 아무 반응이 없습니다.** `Touch` 문은 밟는 순간 작동합니다. `Action` 문은 마주 본 채 E 또는 F가 필요합니다.
|
||||
2. **몬스터나 상자가 돌아왔습니다.** 그 `Condition`은 시나리오가 세우는 것과 같은 플래그를 검사해야 합니다.
|
||||
3. **가게가 비어 있습니다.** trading 모드가 게임에 있어야 하고, 시나리오의 가게 id는 `shops/village_merchant.json`과 일치해야 합니다.
|
||||
Reference in new issue
Block a user