跳到主要内容

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 区块​

下面是完整的写法与默认值,只写要改的就好:

config.yml
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-roomstart起点房的房间 ID(rooms/<ID>/ 一定要存在,否则不能开始)。只能用英文、数字、下划线、减号
floors3几层。infinite、无限、-1 = 无限层。难度模式的 floors 会覆盖它
seedrandom地图怎么随机,见 种子
keep-after-floor1门票保底,见 门票什么时候不退
floor-time-limit0每一层的时限(30s、5m、1m30s,数字 = 秒)。只算在房间里的时间,选祝福、换房间不算
enter-delay2s传送进房间后几秒才开始出怪、执行房间的 start.yml。房间的 room.yml 可以各自改
revive-on-room-cleartrue房间清除时,正在等复活的人立刻站起来
lives-refillneverfloor = 每层开始时(第 2 层起)生命补满,出局的队友回到场上
retries-per-floorfalsetrue = lives.wipe-retries 的团灭重来次数每层重新算
heal-on-floor-cleartrue每打完一层,活着的人补满血
retreat-every5无限层:打完第 5、10、15…… 层后,下一层的门多一扇「撤退之门」。0 = 不出现
end-rewards-on-failtrue失败 / 无限层结束时也发 end.yml 的 rewards.end
ranks-by-floorS: 30, A: 20, B: 10无限层的评价:打完的层数 ≥ 门槛就拿那个评价,都没达到 = C

门 door​

键默认说明
choices2-3每次出现几扇门,1~3。floors.yml 的 doors 可以每层不同
choicevotevote(也可写 投票、多数决):全队投票;leader(队长):只有队长的票算数(队长不在 = 改成投票);first(第一个):第一个投票的人决定
timeout45s战斗、精英、首领房清除后的倒数。时间到 = 票最多的门;平手看队长投的那扇;没人投 = 随机
vote-timeout15s有人投了第一票之后,其他人还有几秒。起点、商店、休息处、宝藏、事件房清除后不倒数,等第一票才开始这个倒数;战斗、精英、首领房后面已经在 timeout 倒数时,第一票会把剩下的时间缩短成 vote-timeout(原本剩下的比较短就不变)
idle-timeout5m上面那种房间一直没人投票时,最多等多久就随机选一扇
mystery-chance0每扇门有几 % 概率显示成「? 未知」,进去才知道是什么房间(0~100)
show-room-namefalse门上显示房间名称(room.yml 的 name)。false = 只显示种类与说明

怎么投票(三种方式都可以):

  • 走进门(水平 1.5 格、高度 2.5 格内)。单人时站约 0.5 秒才算,免得路过误选。
  • 右键门上的全息字。
  • 点聊天栏的门按钮,或输入 /cd door <1-3>。

活着的人和等复活的人都投了就马上决定;已经出局在旁观的人可以用指令投票,但不会等他。每次有人改票,门上的票数和全队的动作栏都会更新。

魂晶 currency​

键默认说明
name / symbol魂晶 / &d◆显示用的名称与符号
walletpersonalpersonal 每人各自的钱包 / shared 全队共用一个
start0开场每人有多少
per-kill1杀一只一般的怪
per-elite-kill3精英房的怪,或其他房间里标记 boss 的怪
per-boss-kill20首领房里标记 boss 的怪
splitallall 在场的每个人都拿一份 / killer 只有击杀者拿
room-clearcombat: 5, elite: 15, boss: 40房间清除时每人拿多少,键是房间种类;没写的种类 = 0
floor-clear15每打完一层每人拿多少
convert-to-money0结束时剩下的魂晶 × 这个倍率存进 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: 是所有随机地牢共用的效能设置:

plugins/CloudDungeon/config.yml
roguelike:
# 下一间房间先在背景贴好:all = 每扇门都先贴(换房不用等)/ chosen = 选了门才贴(省效能,换房要等几秒)
prefetch: all
# 服务器 TPS 低于这个值时暂停「先贴」(真的要进的房间照样马上贴)
prefetch-min-tps: 16
# 贴图队列里已经有这么多工作在排队时,先不排「先贴」
max-queued-prefetch: 8
# 等房间贴好最多几秒(超过就换一间同类型的房间)
paste-timeout: 30s
# 换房传送最多等几秒(没传过去的人再试一次,还是失败就请他离开副本)
teleport-timeout: 10s
键默认说明
prefetchallall:门一出现(或更早)就把每扇门后面的房间先贴好;chosen:选了门才贴。写错 = 改用 all
prefetch-min-tps16TPS 低于这个值时不「先贴」;门已经出现、真的要进的房间照样马上贴
max-queued-prefetch8贴图队列排了这么多工作时,先不排「先贴」
paste-timeout30s等一间房贴好最多几秒(最少 5 秒);超过就换一间同种类的房间;连续两次失败会停止这场,还没打完 keep-after-floor 层时退还门票(已经过了保底就不退,和管理员停止一样)
teleport-timeout10s换房传送最多等几秒(最少 3 秒);没传过去的人再试一次,还是失败就请他离开副本

主配置的 world.wipe-on-start 建议保持 true:当机后残留在副本世界里的房间会在开服时清掉(validate 会提醒)。