# RPG Demo — 작은 타일맵 세계 RPG Demo는 짧고 완결된 타일맵 모험입니다. 잿빛 숲 옆의 마을, 촌장의 집, 그리고 동굴에 늑대가 사는 숲. 키보드로 걷고, 사람들과 말하고, 상자를 열고, 숲에서 물건을 모아 상인에게 팔고, 싸웁니다. 데이터 파일과 시나리오만으로 이루어져 있고 코드가 한 줄도 없어서, 타일맵 게임이 어떻게 조립되는지 보여 주는 살아 있는 예이기도 합니다. 이 데모에는 자기 게임 카드가 없습니다. **RPG Plus** 게임의 세계이며, RPG Plus가 이 모드를 포함하고 그 위에 지어 올립니다. **플레이 → RPG Plus → 새 게임**에서 시작하세요. RPG Plus의 짧은 갈림길 프롤로그를 지나면 이 마을에 도착합니다. 아래 스크린샷은 RPG Plus에서 찍었으므로, 그 안의 일부 사람과 물품은 그 게임이 추가한 것입니다. ![밤의 잿빛 숲 옆 마을: 집들, 가로등이 켜진 자갈 광장, 마을 사람들, 연못, 그리고 길 위의 영웅.](assets/village.jpg) ## 하는 법 - **걷기**는 WASD 또는 방향키, **달리기**는 Shift. - 사람이나 물건을 마주 본 채 E 또는 F로 **말하기, 열기, 읽기**. - 문이나 길 끝에 발을 디디면 다음 맵으로 이동합니다. 이야기: 촌장이 마을 동쪽 동굴 옆에 자리 잡은 늑대를 쫓아 달라고 부탁합니다. 연못을 지나 숲길을 따라가고, 길을 막은 슬라임을 처리하고, 늑대와 마주 섭니다. 늑대가 쓰러지면 촌장이 감사를 전합니다 — 제 방식대로. ## 세계에 있는 것 - **맵 세 개.** 마을(32×18 타일), 촌장의 집, 잿빛 숲. 모두 Village Pack의 마을 타일셋으로 그려져 있습니다. - **사람들.** 촌장은 퀘스트를 주고 끝내고, 마을 사람들은 수다를 떨고, 표지판이 마을 이름을 알립니다. 문 하나는 잠겨 있습니다. - **상자.** 촌장의 집에 하나, 숲에 하나. 열린 상자는 열린 채로 남습니다. - **숲에서 채집.** 오솔길을 따라 땔감, 돌, 숲 버섯이 놓여 있습니다. 각 자리는 한 번만 챙길 수 있습니다. 버섯은 체력을 5 회복합니다. - **상인.** 엘릭서(체력 20 회복)를 동전 10 닢에 팔고, 땔감을 1 닢에, 돌을 2 닢에 삽니다. - **전투.** 오솔길의 슬라임과 동굴의 늑대는 맵에 보이며, 말을 걸면 싸움이 시작됩니다. 숲에서는 슬라임 한두 마리와의 랜덤 인카운터가 대략 48 걸음마다 일어납니다. ![잿빛 숲: 늑대가 있는 동굴로 가는 오솔길, 상자, 돌, 버섯, 그리고 길을 막은 슬라임.](assets/forest.jpg) ![상인의 가게: 왼쪽에 물품, 선택한 엘릭서의 가격과 구매 버튼, 오른쪽에 내 가방. RPG Plus는 이 가게에 물품을 더 추가합니다.](assets/shop.jpg) ![슬라임과의 전투: 왼쪽 아래 영웅, 위에 슬라임, 오른쪽에 전투 기록.](assets/battle.jpg) ## 모드 작성자를 위해: 어떻게 지어졌나 ```filestree rpg_demo_game/ ├── maps/ rpg_village.json, rpg_elder_house.json, rpg_forest.json ├── map_events//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_.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`과 일치해야 합니다.