跳到主要内容

地图文档

这是《冒险小世界:剑之试炼》4.2 版本的底层数据等的文档,供读者查阅。

适用版本

本文档仅适用于版本 Alpha 4.2_01。

本文的内容将始终服务于本地图的最高版本,这意味着本文档中的内容可能会随着地图更新而随时变动。对于更低版本,因为底层已全面更新,所以下文内容将有大半不再适用于旧版本,我们也不会提供文档支持。

机制

旁观区

本地图的旁观机制已经全面升级,采用 1.19.50 的旁观模式。

每个关卡都有一个独特的旁观区,已死亡的旁观玩家(含标签spectator的玩家)将被严格限制在这个区域内。这个旁观区比房间的正常大小要小一圈,以防止玩家贴墙透视。

这个区域内应包含重生点。

重生点

本地图各关都有自己独特的重生点。重生点通常设置在任务点入口或房间入口处,同时兼顾下面两种任务:

  1. 检查玩家是否靠近任务点或房间;
  2. 设置玩家的重生点。

应设定只有通过关卡后,才能将重生点设置到本关重生点处。这是因为,如果直接把重生点设置到本关区域时,会在重生后且关卡失败后,使玩家重新复活到本关判定区,从而造成严重问题。这也就意味着,当进行关卡时(比如 1-2),玩家实际会重生在 1-1 的重生点处。在多人模式下,可由旁观机制将超出区域限制的玩家拉回来。

关卡模板

在以下关卡模板中,以圆括号括起来的部分(content)代表该部分是需要修改的地方。此外,使用关卡模板时应注意灵活变通,在不同的关卡可能需增删代码,以适应关卡需求。

村庄关卡(0-Y/10-Y)

开始关卡

用于开始一段村庄关卡的剧情。通常在游戏后时间线中按照特定条件调用。

其中,调用的通用函数将设置为:

  • 剧情期间(data.levelCompleted = 0
  • 对话状态(锁定玩家视角,禁止与 NPC 交互,禁止 HUD,流逝时间线,存在多个玩家时施加隐身)
aw/levels/open/stage(Y)/start.mcfunction
# ===== 开始关卡 =====
# 0-(Y) | (剧情梗概)

# 设置关卡 ID
scoreboard players set level data (Y)

# 调用通用函数
function aw/lib/modify_data/levels/start_open

# 传送玩家
(tp @a ... facing ...)

# (其他功能)
(...)
完成关卡

用于完成一段村庄关卡的剧情。通常在游戏时时间线中在特定时间点下调用。

其中,调用的通用函数将设置为:

  • 剧情完成(data.levelCompleted = 1
  • 非对话状态(开放玩家视角,允许与 NPC 交互,允许 HUD,时间线停止流逝,解除隐身)
aw/levels/open/stage(Y)/complete.mcfunction
# ===== 完成关卡 =====
# 0-(Y) | (剧情梗概)

# 设置重生点
spawnpoint @a (本关重生点)

# 调用通用函数
function aw/lib/modify_data/levels/complete_open

游戏时时间线

用于在剧情期间(data.levelCompleted == 0)时调用的时间线循环函数。需要提前注册。

可通过time.timeline获取时间线的值,以在特定时间段执行命令。

其中,## [(时间点)] (模块):(功能)作为一个注释标签,用于声明在该剧情下的该时间点执行了什么额外命令,并在其他(模块)下完善具体功能。

aw/levels/open/stage(Y)/gaming.mcfunction
# ===== 关卡游戏时时间线 =====
# 0-(Y) | (剧情梗概)

# --- 剧情 ---
execute if score timeline time matches (时间点) run tellraw @a {"rawtext":[{"text":"* (人物颜色代码)(人物): §7(剧情)"}]}
## [(时间点2)] (模块):(功能)

# --- (模块) ---

## [(时间点2)] (功能)
execute if score timeline time matches (时间点2) run (...)

# --- 剧情结束 ---
execute if score timeline time matches (时间点) run function aw/levels/open/stage(Y)/complete


游戏后时间线

用于在剧情完成后(data.levelCompleted == 1)时调用的时间线循环函数。需要提前注册。

通常该时间线会处于非流逝状态。若需启用流逝状态,应在本关的完成关卡函数下声明启用时间流逝。

aw/levels/open/stage(Y)/after_gaming.mcfunction
# ===== 关卡游戏后时间线 =====
# 0-(Y) | (剧情梗概)

# --- 检查玩家进入下一个关卡 ---
execute positioned (下关重生点或特定地点) if entity @a[r=(区域)] run function aw/levels/open/stage((Y)+1)/start

章节开始关卡(X-0)

开始关卡

用于开始一段章节起始关卡的剧情。通常在上一章的最后一关的游戏后时间线中按照特定条件调用。

其中,调用的通用函数将设置为:

  • 剧情期间(data.levelCompleted = 0
  • 对话状态(锁定玩家视角,禁止与 NPC 交互,禁止 HUD,流逝时间线,存在多个玩家时施加隐身)
  • 补充玩家的箭和药水
  • 播放标题和音效
  • 清除所有的怪物、生成器、御风珠和带有aw:marker_type="name"实体属性的标记
aw/levels/chapter(X)/level0/start.mcfunction
# ===== 开始关卡 =====
# (X)-0 | (章节名)神殿

# --- 关卡参数 ---
## 关卡 ID
scoreboard players set chapter data (X)
scoreboard players set level data 0

# --- 玩家处理 ---

## 播放标题 | 应先于[调用通用函数]模块
titleraw @a title {"rawtext":[{"translate":"(章节颜色代码)§l((章节名),加空格) 神 殿"}]}
## 在剧情模式下传送玩家
execute if score storyMode settings matches 1 run (tp @a ...)

# --- 封闭各关卡出口 ---
## (X)-1
(fill ...)
## (X)-2
(fill ...)
## (...)

# --- 调用通用函数 ---
function aw/lib/modify_data/levels/start_chapter

# --- 生成章节名 ---
# 应后于[调用通用函数]模块
summon aw:marker -83 1 -2 0 0 aw:set_chapter_name "(章节颜色代码)(章节名)神殿"

完成关卡

用于完成一段章节起始关卡的剧情。通常在游戏时时间线中在特定时间点下调用,或者直接在纯战斗模式下无条件调用。

其中,调用的通用函数将设置为:

  • 剧情完成(data.levelCompleted = 1
  • 非对话状态(开放玩家视角,允许与 NPC 交互,允许 HUD,时间线停止流逝,解除隐身)
aw/levels/chapter(X)/level0/complete.mcfunction
# ===== 完成关卡 =====
# (X)-0 | (章节名)神殿

# 设置重生点
spawnpoint @a (本关重生点)

# 调用通用函数
function aw/lib/modify_data/levels/complete_chapter

游戏时时间线

用于在剧情期间(data.levelCompleted == 0)时调用的时间线循环函数。需要提前注册。

可通过time.timeline获取时间线的值,以在特定时间段执行命令。

其中,## [(时间点)] (模块):(功能)作为一个注释标签,用于声明在该剧情下的该时间点执行了什么额外命令,并在其他(模块)下完善具体功能。

aw/levels/chapter(X)/level0/gaming.mcfunction
# ===== 关卡游戏时时间线 =====
# (X)-0 | (章节名)神殿

# --- 剧情 ---

execute if score timeline time matches (时间点) run tellraw @a {"rawtext":[{"text":"* (人物颜色代码)(人物): §7(剧情)"}]}
## [(时间点2)] (模块):(功能)

# --- (模块) ---

## [(时间点2)] (功能)
execute if score timeline time matches (时间点2) run (...)

# --- 剧情结束 ---
## 纯战斗模式下直接跳过剧情
execute if score storyMode settings matches 0 run function aw/levels/chapter(X)/level0/complete
## [(时间点)] 结束剧情
execute if score timeline time matches (时间点) run function aw/levels/chapter(X)/level0/complete

游戏后时间线

用于在剧情完成后(data.levelCompleted == 1)时调用的时间线循环函数。需要提前注册。

通常该时间线会处于非流逝状态。然而,在玩家使用传声石结晶后,可能会使得时间线处于流逝状态(具体条件见函数aw/items/acoustic_stone_crystal.mcfunction)。

aw/levels/chapter(X)/level0/after_gaming.mcfunction
# ===== 关卡游戏后时间线 =====
# (X)-0 | (章节名)神殿

# --- 检查玩家进入下一个关卡 ---
execute positioned (下关重生点) positioned ~-1.2~-1~-1.2 as @a[dx=1.4,dy=3,dz=1.4,tag=!spectator,scores={deathState=0}] at @s run function aw/levels/chapter(X)/level1/start
execute positioned (下关重生点) positioned ~-1.2~-1~-1.2 as @e[dx=1.4,dy=3,dz=1.4,type=aw:wind_pearl] run kill @s

# --- 剧情 ---
execute if score timeline time matches (时间点) run tellraw @a {"rawtext":[{"text":"* (人物颜色代码)(人物): §7(剧情)"}]}
execute if score timeline time matches (时间点2).. run function aw/lib/modify_data/states/timeline/disable_time_lapse

常规关卡(X-Y)

开始关卡

用于启动并初始化一个关卡。通常在上一关的游戏后时间线中按照特定条件调用。

其中,调用的通用函数将设置为:

  • 关卡参数:
    • 关卡期间(data.levelCompleted = 0
    • 第 1 波(data.wave = 1
    • 补充玩家的箭和药水
    • 启用时间线
  • 玩家处理:
    • 自动播放标题为关卡号
    • 传送所有玩家到第一个进入的玩家处
    • 更改玩家游戏模式(不会在开发者模式下生效)
    • 回满血量
    • 如果多次失败,则提供 BUFF
    • 如果正处于对话状态(data.timeLapse != 0),则终止对话
  • 清除所有的怪物、御风珠
aw/levels/chapter(X)/level(Y)/start.mcfunction
# ===== 开始游戏 =====
# (X)-(Y) | 必须由初次进入的玩家执行

# --- 关卡参数 ---
## 关卡 ID
scoreboard players set level data (Y)
## 最大波数
scoreboard players set maxWave data (最大波数)

# --- 封闭关卡 ---
(fill ...)
(fill ...)

# --- 生成怪物 ---
function aw/levels/chapter(X)/level(Y)/waves/wave_1

# --- 调用通用函数 ---
# 必须由初次进入的玩家执行
function aw/lib/modify_data/levels/start_level

# --- 关卡特殊功能 ---
## (功能)
(...)

完成关卡

用于完成一个关卡。通常在本关的游戏时时间线中当怪物被清空时(data.monsterAmount == 0)调用。

其中,调用的通用函数将设置为:

  • 关卡参数
    • 关卡结束(data.levelCompleted = 1
    • 补充玩家的箭和药水
    • 启用时间线
    • 本关失败次数归零(data.failedCount.thisLevel = 0
  • 玩家处理:
    • 播放标题为已完成关卡,并播放音效
    • 复活已死亡的玩家,并移除他们的旁观身份(标签spectator
    • 回满血量
  • 清除所有的怪物、生成器和御风珠
aw/levels/chapter(X)/level(Y)/complete.mcfunction
# ===== 完成关卡 =====
# (X)-(Y)

# --- 调用通用函数 ---
function aw/lib/modify_data/levels/complete_level

# --- 设置重生点 ---
spawnpoint @a (本关重生点)

# --- 获得新物品 ---
function aw/system/controller/items
tellraw @a {"rawtext":[{"text":"§l§a(X)-(Y)已完成!§r\n§f你已获得 (带颜色的物品名) §f!"}]}

# --- 重新开放关卡 ---
(fill ...)
(fill ...)

# --- 关卡特殊功能 ---
# (功能)
(...)

下表是(带颜色的物品名)的可用格式。

稀有度物品颜色示例
普通§a[物品名]
稀有§b[物品名]
史诗§d[物品名]
传奇§e[物品名]
未完成关卡

用于使一个关卡失败。通常在本关的游戏时时间线中当不存在存活玩家(data.alivePlayerAmount == 0)调用。

其中,调用的通用函数将设置为:

  • 关卡参数
    • 回退关卡数(data.level -= 1
    • 关卡结束(data.levelCompleted = 1
    • 补充玩家的箭和药水
    • 启用时间线
    • 增加本关失败次数(data.failedCount.thisLevel += 1)和总失败次数(data.failedCount.allLevels += 1
  • 玩家处理:
    • 播放标题为关卡失败,并播放音效
    • 如果关卡失败达到一定次数,提示玩家将在下一局获得 BUFF
    • 复活已死亡的玩家,并移除他们的旁观身份(标签spectator
    • 回满血量
  • 清除所有的怪物、生成器和御风珠

注意:在重新开放关卡模块中,不宜开放出口。

aw/levels/chapter(X)/level(Y)/fail.mcfunction
# ===== 未完成关卡 =====
# (X)-(Y)

# --- 调用通用函数 ---
function aw/lib/modify_data/levels/fail_level

# --- 重新开放关卡 ---
(fill ...)

# --- 关卡特殊功能 ---
# (功能)
(...)

游戏时时间线

用于在游戏期间(data.levelCompleted == 0)时调用的时间线循环函数。需要提前注册。

通常该时间线会处于非流逝状态。若需启用流逝状态,应在本关的开始关卡函数下声明启用时间流逝。

大部分情况下,以下 3 个模块(检查怪物是否全部清除检查存活玩家数目阻止旁观模式的玩家出界)是必选的,在非特殊情况下应全部保留且不宜做过多更改。

aw/levels/chapter(X)/level(Y)/gaming.mcfunction
# ===== 关卡游戏时时间线 =====
# (X)-(Y)

# --- 检查怪物是否全部清除 ---
## 第 (m) 波 -> 第 ((m)+1) 波
execute unless entity @e[type=aw:spawner] if score wave data matches (m) if score monsterAmount data matches 0 run function aw/levels/chapter(X)/level(Y)/waves/wave_((m)+1)
## 第 (n) 波 -> 关卡完成
execute unless entity @e[type=aw:spawner] if score wave data matches (n) if score monsterAmount data matches 0 run function aw/levels/chapter(X)/level(Y)/complete

# --- 检查存活玩家数目 ---
# 如果存活玩家数目为 0,则触发关卡失败函数
execute if score alivePlayerAmount data matches 0 run function aw/levels/chapter(X)/level(Y)/fail

# --- 阻止旁观模式的玩家出界 ---
# 不处理正处于死亡状态的玩家
execute as @a[tag=spectator,scores={deathState=0}] at @s unless entity @s[(允许的长方体区域)] run function aw/lib/modify_data/out_of_border


若旁观区域无法使用一个长方体区域表达(例如 2-3),此时可在该关卡函数下新建一个events/spectator_area.mcfunction以作更复杂的区域检查。

aw/levels/chapter(X)/level(Y)/events/spectator_area.mcfunction
# ===== 旁观模式区域检查 =====

tag @s[(允许的区域1)] add inArea(X)(Y)
tag @s[(允许的区域2)] add inArea(X)(Y)
(...)
execute if entity @s[tag=!inArea(X)(Y)] run function aw/lib/modify_data/out_of_border
tag @s remove inArea(X)(Y)

此时阻止旁观模式的玩家出界模块应改为:

阻止旁观模式的玩家出界
# --- 阻止旁观模式的玩家出界 ---
# 不处理正处于死亡状态的玩家
execute as @a[tag=spectator,scores={deathState=0}] at @s run function aw/levels/chapter(X)/level(Y)/events/spectator_area

游戏后时间线

用于在剧情完成后(data.levelCompleted == 1)时调用的时间线循环函数。需要提前注册。

通常该时间线会处于非流逝状态。然而,在玩家使用传声石结晶后,可能会使得时间线处于流逝状态(具体条件见函数aw/items/acoustic_stone_crystal.mcfunction)。

注意检查玩家进入下一个关卡中有可能会出现跨章,例如 1-3 的下一关是 2-0 而不是 1-4。

aw/levels/chapter(X)/level(Y)/after_gaming.mcfunction
# ===== 关卡游戏后时间线 =====
# (X)-(Y)

# --- 检查玩家进入下一个关卡 ---
execute positioned (下关重生点) positioned ~-1.2~-1~-1.2 as @a[dx=1.4,dy=3,dz=1.4,tag=!spectator,scores={deathState=0}] at @s run function aw/levels/chapter(X)/level((Y)+1)/start
execute positioned (下关重生点) positioned ~-1.2~-1~-1.2 as @e[dx=1.4,dy=3,dz=1.4,type=aw:wind_pearl] run kill @s

# --- 剧情 ---
execute if score timeline time matches (时间点) run tellraw @a {"rawtext":[{"text":"* (人物颜色代码)(人物): §7(剧情)"}]}
execute if score timeline time matches (时间点2).. run function aw/lib/modify_data/states/timeline/disable_time_lapse

波潮数据

用于在被调用时召唤怪物生成器,并设置波潮数据。关卡不同波潮的数据应分别存储到该关卡的waves/wave_(波数).mcfunction内。

注意:部分怪物不分等级。详见怪物生成器

适用于第 1 波的模板:

aw/levels/chapter(X)/level(Y)/waves/wave_1.mcfunction
# ===== 第 1 波 =====

# --- 更新波数信息 ---
execute positioned -83 1 -2 run function aw/lib/modify_data/levels/wave_1

# --- 生成怪物生成器 ---

## (怪物)
summon aw:spawner (怪物位置) 0 0 aw:spawn_(怪物ID)_(怪物等级)
## (...)
(...)

# --- (功能) ---
(...)

适用于第 2 波及更高波的模板:

aw/levels/chapter(X)/level(Y)/waves/wave_(m).mcfunction
# ===== 第 (m) 波 =====

# --- 波潮完成通用函数 ---
function aw/lib/modify_data/levels/complete_wave

# --- 更新波数信息 ---
execute positioned -83 1 -2 run function aw/lib/modify_data/levels/wave_(m)

# --- 生成怪物生成器 ---

## (怪物)
summon aw:spawner (怪物位置) 0 0 aw:spawn_(怪物ID)_(怪物等级)
## (...)
(...)

# --- (功能) ---
(...)

关卡数据

各关重生点或检查点位置

X-0X-1X-2X-3X-4X-5
0-Y(村庄剧情)——-27 6 -48-26 1 -3736 1 -22-16 1 82-18 -3 99
1-Y-117 1 -6-117 2 16-126 5 52-137 12 33————
2-Y-79 19 26-75 19 60-72 1 69-143 -20 61————
3-Y-173 -20 30-188 -20 29-172 -20 11-163 -20 28-170 -14 23——
4-Y-173 18 -8-168 18 -20-156 8 -1-156 -11 14-141 -30 6——
5-Y-95 -30 -6——————————
6-Y-81 -30 -28-76 -30 -48-80 -18 -46-75 -36 -15-75 -38 22——
7-Y-87 -39 96-119 -16 103-161 -17 110-194 -17 97-225 -17 99-225 -47 44
10-Y(完结剧情)——-15 2 88-27 7 -48-16 1 82————

地图变量

玩家数据

变量名含义允许值默认值
deathCount.@s玩家当前死亡次数0-0
deathState.@s玩家当前死亡状态0:存活,1:刚刚死亡(还未记录死亡榜),2:长期死亡0
deathTime.@s玩家持续处于死亡状态的时长(单位:游戏刻)0-0
killCount.@s玩家击杀数0-0
isOnline.@s玩家是否在线0:刚进入游戏,1:在线1

active

变量名含义允许值默认值
active.sound音效播放器类型,按不同值播放不同的音效0:禁用,1-:启用0
active.timeline时间线是否启用0:禁用,1-:启用0

data

变量名含义允许值默认值
data.alivePlayerAmount存活的玩家人数0-实时判断
data.allowAcousticStoneCrystal是否启用传声石结晶0:禁用,1:启用0
data.allowArrowSupply是否允许补充箭0:不允许,1:允许0
data.allowHud是否允许显示 HUD0:禁用,1:启用1
data.allowNpcInteractionNPC 是否允许交互0:禁用,1:启用1
data.allowPotionSupply是否允许补充药水0:不允许,1:允许0
data.allowRemoveItemEntity是否允许移除掉落物实体0:不允许,1:允许1
data.chapter当前正在进行的章节数0:开始前&村庄,1-7:游戏章节,10:结束后的村庄0
data.client当前使用的客户端0:国际版,1:中国版0
data.failedCount.allLevels总失败次数0-0
data.failedCount.thisLevel本关的失败次数0-0
data.hasCheat是否有玩家启用了创造模式作弊0:无,1:有0
data.level当前正在进行的章节所属的关卡0-50
data.levelCompleted关卡是否完成0:进行中,1:已完成1
data.maxWave本关目前最大波数1-51
data.monsterAmount怪物数,在 4-4 排除守卫者0-实时判断
data.playerAmount玩家总人数0-实时判断
data.potionUsed是否有玩家使用过主药水或副药水0:没有,1:有0
data.timeLapse时间线是否启用时间流逝0:禁用,1-:启用0
data.wave本关目前所处波数1-51

settings

变量名含义允许值默认值
settings.developerMode开发者模式是否启用0:禁用,1:启用0
settings.difficulty地图难度1-41
settings.extraDifficulty额外地图难度,直接累加到地图难度(基础值)上-3-30
settings.storyMode剧情模式是否启用0:禁用,1:启用0

time

变量名含义允许值默认值
time.sound音效播放器,为 0 时触发特定音效(单位:游戏刻)0-0
time.tick每刻增加 1 分,每秒重置 1 次(单位:游戏刻)0-190
time.timeline时间线,到达特定值后触发命令或函数(单位:游戏刻)0-0
time.playedSecond玩家游玩的时长,仅限开始游戏后记录(单位:秒)0-0
time.playedMinute玩家游玩的时长,仅限开始游戏后记录(单位:分钟)0-0

标签型变量

变量名含义默认值
spectator玩家是否在游戏中死亡,成为旁观者false
outOfBorder玩家是否在旁观模式下出界false

人物名称

人物人物颜色代码
林乐(我)§f
田英§b
米云溪§c
张宇§e
其他 NPC§e

怪物生成器

怪物event定义aw:monster_type对应的 ID
僵尸aw:spawn_zombie_(1|2|3|4)1
小僵尸aw:spawn_zombie_baby_(1|2|3|4)2
尸壳aw:spawn_husk3
小尸壳aw:spawn_husk_baby4
僵尸猪灵aw:spawn_zombified_piglin_(1|2|3|4)5
溺尸aw:spawn_drowned_(1|2|3)6
三叉戟溺尸aw:spawn_drowned_trident7
骷髅aw:spawn_skeleton_(1|2|3|4)8
骷髅敢死队aw:spawn_skeleton_sword_(1|2)9
流浪者aw:spawn_stray_(1|2|3|4)10
蜘蛛aw:spawn_spider_(1|2|3|4)11
洞穴蜘蛛aw:spawn_cave_spider_(1|2|3|4)12
苦力怕aw:spawn_creeper_(energy|hard|normal|speed)13
守卫者aw:spawn_guardian14
猪灵aw:spawn_piglin_(1|2|3|4)15
猪灵蛮兵aw:spawn_piglin_brute16
疣猪兽aw:spawn_hoglin_(1|2|3|4)17
蠹虫aw:spawn_silverfish_(1|2|3|4)18
岩浆怪aw:spawn_creeper_(small|middle|large)19
恶魂aw:spawn_ghast20
女巫aw:spawn_witch21
骷髅王aw:spawn_skeleton_king22
远古守卫者aw:spawn_elder_guardian23
烈焰王aw:spawn_blaze_king24
唤魔法师aw:spawn_evoker25

当前已知问题 & Todo list

  • 双人下无camera时,会看到显示的玩家的脸
  • 召唤音效声音太大
  • 可考虑加强死亡buff机制
  • 像深渊之谜那样优化门的运行方式
  • 继续优化怪物生成特效,比如加上粒子和刷怪笼
  • 主动观战机制
  • 引入公告栏模板
  • 优化路线引导
  • 退出重进的玩家还需要重新设置重生点,否则在他们死亡后若重生点未设定正确可能会出问题
  • 在游戏状态下退出游戏后,回来后入口仍然紧锁