config.yml 的 roguelike
随机地牢的 config.yml 就是一般副本的 config.yml,再加上两样东西:
type: roguelike # classic 一般副本(默认)/ roguelike 随机地牢
roguelike:
...
type 也可以写 rogue、随机地牢、随机;写错会提示并当成一般副本。
和一般副本不同的地方
| 设置 | 在随机地牢里 |
|---|---|
map | 不会用到(会提示):地图都在 rooms/ 里,起点房用 roguelike.start-room 指定 |
spawn | 不会用到(会提示):入口写在每个房间 room.yml 的 spawn |
time-limit | 默认 0(不限时);每层的时限用 roguelike.floor-time-limit |
prewarm | 预热的是起点房(开场秒开) |
lives.wipe-retries | 团灭时全员回到这间房的入口,房间继续打(不会重来整场) |
ranks | 有限层照通关时间评价;无限层改看 roguelike.ranks-by-floor |
environment | 每间房的默认环境,房间的 room.yml 可以只覆盖其中几项 |
scaling | 依人数加成照常有效,和楼层成长(floors.yml 的 scaling)相乘 |
其他设置(名称、人数、组队、门票、入场条件、冷却与次数、计分板、王条、音效、notify、规则、掉线……)意思都和一般副本一样。
roguelike 区块
下面是完整的写法与默认值,只写要改的就好:
roguelike:
start-room: start # 起点房的文件夹 rooms/start/(必须存在)
floors: 3 # 几层;infinite(或 无限 / -1)= 无限层,打到团灭为止
seed: random # random 每场不同 / daily 今天大家的地图顺序一样 / 数字 = 固定
keep-after-floor: 1 # 打完几层之后,失败 / 停服 / 当机都不再退门票(0 = 开场就不退)
floor-time-limit: 0 # 每一层的时限(0 = 不限);超过 = 挑战失败
enter-delay: 2s # 进房间后几秒才开始出怪(让玩家看清楚环境)
revive-on-room-clear: true # 房间清除时,等待复活的人立刻站起来
lives-refill: never # never 不补 / floor 每层开始时生命补满、出局的队友回来
retries-per-floor: false # true = lives.wipe-retries 每层重新计算
heal-on-floor-clear: true # 每打完一层全队补满血
retreat-every: 5 # 无限层:每 5 层出现「撤退之门」(带着奖励安全离开),0 = 不出现
end-rewards-on-fail: true # 失败 / 团灭也发 end.yml 的 rewards.end
ranks-by-floor: { S: 30, A: 20, B: 10 } # 无限层的评价:打完几层以上(都没达到 = C)
door:
choices: 2-3 # 每次出现几扇门(1~3)
choice: vote # vote 全队投票(票多者胜)/ leader 队长决定 / first 第一个投票的人决定
timeout: 45s # 战斗、精英、首领房清除后几秒内要选好
vote-timeout: 15s # 有人投了第一票之后,其他人还有几秒(战斗房后的倒数也会缩短到这么久)
idle-timeout: 5m # 商店、休息处、宝藏、事件房:没人投票时最多等多久(之后随机)
mystery-chance: 0 # 每扇门有几 % 概率显示成「? 未知」
show-room-name: false # 门上要不要显示房间名字(false = 只显示种类)
currency:
name: "魂晶"
symbol: "&d◆"
wallet: personal # personal 每人各自 / shared 全队共用一个钱包
start: 0 # 开场每人有多少
per-kill: 1 # 每杀一只怪
per-elite-kill: 3 # 精英房的怪、非首领房里标记 boss 的怪
per-boss-kill: 20 # 首领房里标记 boss 的怪
split: all # all 每个在场的人都拿 / killer 只有击杀者
room-clear: { combat: 5, elite: 15, boss: 40 } # 房间清除时每人拿多少(没写的种类 = 0)
floor-clear: 15 # 每打完一层每人拿多少
convert-to-money: 0 # 结束时剩下的魂晶 × 这个倍率存进 Vault(0 = 不换)
types: # 门与标题上每种房间的样子(全部可以省略)
combat: { item: IRON_SWORD, particle: CRIT }
elite: { item: WITHER_SKELETON_SKULL, particle: SOUL_FIRE_FLAME }
boss: { item: DRAGON_HEAD, particle: DRAGON_BREATH }
reward: { item: CHEST, particle: WAX_ON }
shop: { item: EMERALD, particle: HAPPY_VILLAGER }
rest: { item: CAMPFIRE, particle: CAMPFIRE_COSY_SMOKE }
event: { item: ENCHANTED_BOOK, particle: ENCHANT }
mystery: { item: ENDER_EYE, particle: PORTAL }
retreat: { item: WHITE_BANNER, particle: END_ROD }
| 键 | 默认 | 说明 |
|---|---|---|
start-room | start | 起点房的房间 ID(rooms/<ID>/ 一定要存在,否则不能开始)。只能用英文、数字、下划线、减号 |
floors | 3 | 几层。infinite、无限、-1 = 无限层。难度模式的 floors 会覆盖它 |
seed | random | 地图怎么随机,见 种子 |
keep-after-floor | 1 | 门票保底,见 门票什么时候不退 |
floor-time-limit | 0 | 每一层的时限(30s、5m、1m30s,数字 = 秒)。只算在房间里的时间,选祝福、换房间不算 |
enter-delay | 2s | 传送进房间后几秒才开始出怪、执行房间的 start.yml。房间的 room.yml 可以各自改 |
revive-on-room-clear | true | 房间清除时,正在等复活的人立刻站起来 |
lives-refill | never | floor = 每层开始时(第 2 层起)生命补满,出局的队友回到场上 |
retries-per-floor | false | true = lives.wipe-retries 的团灭重来次数每层重新算 |
heal-on-floor-clear | true | 每打完一层,活着的人补满血 |
retreat-every | 5 | 无限层:打完第 5、10、15…… 层后,下一层的门多一扇「撤退之门」。0 = 不出现 |
end-rewards-on-fail | true | 失败 / 无限层结束时也发 end.yml 的 rewards.end |
ranks-by-floor | S: 30, A: 20, B: 10 | 无限层的评价:打完的层数 ≥ 门槛就拿那个评价,都没达到 = C |
门 door
| 键 | 默认 | 说明 |
|---|---|---|
choices | 2-3 | 每次出现几扇门,1~3。floors.yml 的 doors 可以每层不同 |
choice | vote | vote(也可写 投票、多数决):全队投票;leader(队长):只有队长的票算数(队长不在 = 改成投票);first(第一个):第一个投票的人决定 |
timeout | 45s | 战斗、精英、首领房清除后的倒数。时间到 = 票最多的门;平手看队长投的那扇;没人投 = 随机 |
vote-timeout | 15s | 有人投了第一票之后,其他人还有几秒。起点、商店、休息处、宝藏、事件房清除后不倒数,等第一票才开始这个倒数;战斗、精英、首领房后面已经在 timeout 倒数时,第一票会把剩下的时间缩短成 vote-timeout(原本剩下的比较短就不变) |
idle-timeout | 5m | 上面那种房间一直没人投票时,最多等多久就随机选一扇 |
mystery-chance | 0 | 每扇门有几 % 概率显示成「? 未知」,进去才知道是什么房间(0~100) |
show-room-name | false | 门上显示房间名称(room.yml 的 name)。false = 只显示种类与说明 |
怎么投票(三种方式都可以):
- 走进门(水平 1.5 格、高度 2.5 格内)。单人时站约 0.5 秒才算,免得路过误选。
- 右键门上的全息字。
- 点聊天栏的门按钮,或输入
/cd door <1-3>。
活着的人和等复活的人都投了就马上决定;已经出局在旁观的人可以用指令投票,但不会等他。每次有人改票,门上的票数和全队的动作栏都会更新。
魂晶 currency
| 键 | 默认 | 说明 |
|---|---|---|
name / symbol | 魂晶 / &d◆ | 显示用的名称与符号 |
wallet | personal | personal 每人各自的钱包 / shared 全队共用一个 |
start | 0 | 开场每人有多少 |
per-kill | 1 | 杀一只一般的怪 |
per-elite-kill | 3 | 精英房的怪,或其他房间里标记 boss 的怪 |
per-boss-kill | 20 | 首领房里标记 boss 的怪 |
split | all | all 在场的每个人都拿一份 / killer 只有击杀者拿 |
room-clear | combat: 5, elite: 15, boss: 40 | 房间清除时每人拿多少,键是房间种类;没写的种类 = 0 |
floor-clear | 15 | 每打完一层每人拿多少 |
convert-to-money | 0 | 结束时剩下的魂晶 × 这个倍率存进 Vault(向下取整);0 = 不换 |
还有哪些方式拿到、花掉魂晶,见 魂晶。
门的样子 types
types: 底下的键可以是 combat、elite、boss、reward、shop、rest、event,以及 mystery(未知的门)、retreat(撤退之门):
| 键 | 说明 |
|---|---|
item | 门上方飘着的物品:直接写物品名称,或写成物品区块(例如 { material: PAPER, item-model: "ns:door" }) |
particle | 门下方的粒子圈。新旧版本的名称都可以(例如 HAPPY_VILLAGER / VILLAGER_HAPPY);写错 = 提示并改用 END_ROD |
name | 种类名称(门、标题、计分板的 {room_type}),不写 = lang.yml 的 rogue.type.<种类> |
description | 种类的说明:门上的第二行(show-room-name: false 时)、聊天按钮的提示,不写 = lang.yml 的 rogue.type-desc.<种类> |
内置的种类名称:
| 种类 | 名称 | 说明 |
|---|---|---|
start | &a✦ 起点 | 出发的地方 |
combat | &c⚔ 战斗 | 击败房间里的怪物 |
elite | &4☠ 精英 | 更强的敌人,打完可以选祝福 |
boss | &5♛ 首领 | 这一层的守护者 |
reward | &6✦ 宝藏 | 免费的魂晶与祝福 |
shop | &a⚖ 商店 | 用魂晶购买道具 |
rest | &b♨ 休息处 | 回复、强化祝福 |
event | &d? 事件 | 不知道会发生什么事 |
mystery | &8? 未知 | 进去才知道 |
retreat | &e⚑ 撤退 | 带着奖励离开(记录目前层数) |
难度模式:有限层与无限层
难度模式(modes)多了两个只有随机地牢才读的设置:
modes:
normal:
name: "&a挑战 3 层"
description: "打倒第 3 层的巫妖王就通关"
floors: 3
endless:
name: "&5无限深渊"
description: "打到团灭为止,挑战最高层数排行榜"
floors: infinite
lives: 3
# seed: daily
| 键 | 说明 |
|---|---|
floors | 这个模式打几层:1 以上的数字,或 infinite(无限、-1)。不写 = roguelike.floors |
seed | 这个模式的种子:random / daily / 数字。不写 = roguelike.seed |
排队、记录、排行榜都是照模式分开的。想同时有「挑战 3 层」与「无限深渊」,就写成两个模式,不要在同一个模式里切换。
记录的键:第一个模式(默认模式)用副本 ID(例如 abyss),其他模式用 副本#模式(例如 abyss#endless),PlaceholderAPI 的排行榜变量也是用这个键,见 变量与排行榜。
种子
种子决定这一场的楼层计划与每一步出现的门。同一个种子 + 同样的选门 = 同样的房间。
| 写法 | 效果 |
|---|---|
random(随机) | 每场不同(默认) |
daily(每日、每天) | 同一天、同一个模式,所有人的地图顺序都一样;每天的分界照主配置的 dungeon.reset-time |
数字,例如 42 | 固定(比赛、测试用) |
优先顺序:管理员指定的下一场种子(/cd admin rogue seed、/cd admin test ... seed=)→ 模式的 seed → roguelike.seed。
门票什么时候不退
一般副本失败时可以退门票(ticket.refund-on-fail)。随机地牢多了一条保底规则 keep-after-floor:
- 还没打完
keep-after-floor层:失败、管理员停止、停服、当机,都照一般副本的规则退还门票。 - 打完
keep-after-floor层之后:门票算用掉了,之后无论怎么结束都不再退。 keep-after-floor: 0:开场就不退。- 副本的「每日 / 每周次数」如果设成通关才算(
ticket.count-entry-on: clear),会在打完保底层数时算一次。
/cd admin test 的测试场永远不收门票、不算次数。
生命与复活
生命的写法和一般副本一样(lives:),随机地牢另外有这些行为:
- 和平阶段不扣命:房间已经清除、选门、选祝福、换房间的时候倒下,不扣生命、马上复活。
revive-on-room-clear: true:房间清除时,正在等复活的人立刻站起来。lives.wipe-retries:团灭时全员回到这间房的入口,房间继续打;retries-per-floor: true让次数每层重算。lives-refill: floor:每层开始时生命补满,出局旁观的队友回到场上。- 商店商品、祝福、事件选项可以用
lives +1 @self加命(见 脚本)。
全局设置
主配置 plugins/CloudDungeon/config.yml 的 roguelike: 是所有随机地牢共用的效能设置:
roguelike:
# 下一间房间先在背景贴好:all = 每扇门都先贴(换房不用等)/ chosen = 选了门才贴(省效能,换房要等几秒)
prefetch: all
# 服务器 TPS 低于这个值时暂停「先贴」(真的要进的房间照样马上贴)
prefetch-min-tps: 16
# 贴图队列里已经有这么多工作在排队时,先不排「先贴」
max-queued-prefetch: 8
# 等房间贴好最多几秒(超过就换一间同类型的房间)
paste-timeout: 30s
# 换房传送最多等几秒(没传过去的人再试一次,还是失败就请他离开副本)
teleport-timeout: 10s
| 键 | 默认 | 说明 |
|---|---|---|
prefetch | all | all:门一出现(或更早)就把每扇门后面的房间先贴好;chosen:选了门才贴。写错 = 改用 all |
prefetch-min-tps | 16 | TPS 低于这个值时不「先贴」;门已经出现、真的要进的房间照样马上贴 |
max-queued-prefetch | 8 | 贴图队列排了这么多工作时,先不排「先贴」 |
paste-timeout | 30s | 等一间房贴好最多几秒(最少 5 秒);超过就换一间同种类的房间;连续两次失败会停止这场,还没打完 keep-after-floor 层时退还门票(已经过了保底就不退,和管理员停止一样) |
teleport-timeout | 10s | 换房传送最多等几秒(最少 3 秒);没传过去的人再试一次,还是失败就请他离开副本 |
主配置的 world.wipe-on-start 建议保持 true:当机后残留在副本世界里的房间会在开服时清掉(validate 会提醒)。