Files

93 lines
5.2 KiB
Markdown

# 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 点生命。
- **商人。** 以 10 枚硬币出售药剂(恢复 20 点生命),并以 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/<map>/events.json 人物、门、宝箱、可拾取物、怪物
├── scenes/ 每张地图一个场景
├── scenarios/rpg_demo/ 开场、地图入口和 events/*.scenario
├── characters/ 英雄、史莱姆和狼
├── items/rpg_demo/ 柴火、石头、蘑菇、药剂及其图标
├── shops/village_merchant.json
└── locale/ 七种语言的名称和剧本翻译
```
**地图**是叠在图块集上的多层图块编号网格,带有自己的名称、尺寸和缩放。森林地图还列出了它的随机遭遇:
```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` 一致。