Files
mod_rpg_demo_game/docs/ko.md
T

6.0 KiB

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 걸음마다 일어납니다.

잿빛 숲: 늑대가 있는 동굴로 가는 오솔길, 상자, 돌, 버섯, 그리고 길을 막은 슬라임.

상인의 가게: 왼쪽에 물품, 선택한 엘릭서의 가격과 구매 버튼, 오른쪽에 내 가방. RPG Plus는 이 가게에 물품을 더 추가합니다.

슬라임과의 전투: 왼쪽 아래 영웅, 위에 슬라임, 오른쪽에 전투 기록.

모드 작성자를 위해: 어떻게 지어졌나

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개 언어의 이름과 시나리오 번역

맵은 타일셋 위에 층으로 놓인 타일 번호 격자이며, 자체 이름, 크기, 확대 배율을 가집니다. 숲 맵은 랜덤 인카운터도 나열합니다:

"Encounters": {
  "Steps": 48,
  "Groups": ["rpg_slime", "rpg_slime,rpg_slime"]
}

이벤트는 타일 위에 놓인 무언가입니다. "Trigger": "Touch" 문은 순간이동을 하고, 몬스터는 시나리오를 실행하다가 자기 플래그가 세워지면 사라집니다:

{
  "Id": "wolf_boss",
  "X": 25,
  "Y": 8,
  "Sprite": "village/wolf",
  "Dir": "Left",
  "Scenario": "rpg_demo/events/wolf_boss",
  "Condition": "rpg_wolf_dead != 1"
}

시나리오는 대사를 말하고 싸움을 시작합니다. 이기면 플래그가 세워집니다:

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에서 오기 때문에, 게임은 인터페이스 언어로 보여 줍니다:

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과 일치해야 합니다.