脚本:动作、条件、变量、触发
随机地牢里,一般副本的脚本写法、动作、条件、变量全部照用,另外多了这一页的东西。
clear(以及win、complete、end通关)= 这间房清除,不是整场通关。房间的clear-when: script就是靠它。fail= 整场挑战失败(和一般副本一样)。- 要直接结算整场(有限层 = 通关,无限层 = 撤退)用
rogue finish。 - 一般的
heal只能写血量点数(例如heal 8),写heal 50%会直接补满血;按百分比回血请用rogue heal 50%。
这些动作、条件、变量只在随机地牢里有效。用在一般副本里时:
- 动作会在后台提示一次(「只能用在随机地牢」)并跳过那一行,
/cd admin validate也会列出来; - 条件不会提示,整行会被当成普通的运算式来算;
- 变量照原样保留。
动作
每个动作都有简写,也可以用完整写法(和 DungeonPlus 兼容的 $动作{参数=值;…} 写法,例如 $room{operation=next;value=shop})。
room:房间
| 写法 | 作用 |
|---|---|
room clear | 这间房清除(和 clear 一样)。完整写法 $room{operation=clear} |
room next <种类或房间ID> | 下一次的门换成这个种类 / 这间房(只用一次),例如 room next shop。完整写法 $room{operation=next;value=shop} |
room door open / room door close | 打开 / 关上 room.yml 的 door 障碍 |
floor:楼层
| 写法 | 作用 |
|---|---|
floor next | 这间房和这一层直接算打完(层奖励、选祝福照常) |
floor goto <层数> | 下一扇门通往第 N 层的第 1 间(不算打完中间的层;测试用)。有限层不能超过总层数 |
card:祝福
没写 @对象 时:有触发者 = @self,没有 = 副本里所有人。
| 写法 | 作用 |
|---|---|
card give <祝福> [层数] [@对象] | 给祝福,例如 card give sharp_blade 2 @self、card give random:rare+ @self。完整写法 $card{operation=give;id=sharp_blade;stacks=2} |
card remove <祝福ID / curse / random / tag=标签> [层数] [@对象] | 拿掉几层(拿到 0 = 整张移除);curse = 最新的一个诅咒 |
card upgrade <祝福ID / random> [@对象] | 那张祝福 +1 层 |
card draft [choices=3] [pool=main] [rarity=rare+] [nonblocking=true] [@对象] | 对象各选一张祝福。pool 卡池、rarity 只抽这个稀有度(rare+ = 以上);nonblocking=true = 选完之前门照常出现 |
card reroll +<次数> [@对象] | 多给免费重抽次数 |
<祝福> 的写法(random、random:rare+、random:tag=fire……)见 祝福的写法。
coins:魂晶
没写 @对象 时:有触发者 = @self,没有 = @dungeon。
| 写法 | 作用 |
|---|---|
coins give <数量> [@对象] | 给魂晶;加上 gain=true 会套用祝福的魂晶加成。也可以简写成 coins +10 |
coins take <数量> [@对象] | 扣魂晶;有任何一个对象不够,就谁都不扣,这一串脚本停下来。也可以简写成 coins -10。完整写法 $coins{operation=take;amount=30} |
coins set <数量> [@对象] | 设成这个数量 |
全队共用钱包(wallet: shared)时只会对钱包动一次。coins take 停下来的特性很适合做「付钱才能……」:
- "coins take 30 @self"
- "card give random:epic @self" # 魂晶不够的话不会执行到这里
shop:商店
| 写法 | 作用 |
|---|---|
shop open [@对象] | 打开商店(不在商店房也可以,摆这一层的货) |
shop refresh [@对象] | 免费刷新商品(refresh-cost: 0 也可以刷新) |
没写对象 = @self。
rogue:其他
| 写法 | 作用 |
|---|---|
rogue finish | 直接结算整场:有限层 = 通关,无限层 = 撤退 |
rogue heal <数量或百分比> [@对象] | 回血:4 = 4 点,50% = 最大生命的一半,不写 = 补满 |
rogue damage <数量或百分比> [@对象] [lethal=true] | 扣血:默认最少留 1 点,lethal=true 才会打死 |
rogue scale [health=*1.5] [damage=*1.2] [level=+5] [amount=*1.2] | 这间房之后生出的怪变强(换房间就恢复)。只写数字 = 倍率(level 是加几级)。MythicMobs 的怪在 scaling.mythic: level(默认)时只吃 level 与 amount |
rogue seed | 在后台印出这一场的种子 |
rogue heal / rogue damage 没写对象时:有触发者 = @self,没有 = 副本里所有人;只作用在还活着的人身上(倒下、旁观、掉线的不算)。
条件
可以用在 if、怪物组、触发组的 condition、祝福的 requires、选项的 requires:
| 条件 | 意思 |
|---|---|
floor >= 5 | 目前是第几层(>、>=、<、<=、==、!=;只写数字 = 等于) |
room-type shop | 目前的房间是这个种类(只能写一个种类,见下方) |
room combat_hall | 目前的房间是这间(房间 ID) |
card <祝福ID> [层数] | 有这张祝福(至少几层,默认 1)。card tag=fire 2 = 有这个标签的祝福合计至少 2 层 |
coins >= 30 | 魂晶 |
curses >= 1 | 诅咒的总层数(一张叠了 3 层的诅咒算 3) |
rooms-left <= 0 | 这一层在目前这间之后还剩几间(含首领房) |
infinite | 这一场是无限层 |
条件前面加 ! 是反过来,例如 !infinite。
room-type 只认一个种类:room-type shop rest 只会检查 shop,room-type shop,rest 永远不成立。要写「商店或休息处」,就用条件区块写两行再加 any: true:
- if:
- "room-type shop"
- "room-type rest"
any: true
then:
- "message &a这里可以补给"
谁要符合:
card:写@self只看触发者;没写 = 在场的每个人都要有。coins、curses:只看触发者。没有触发者时(例如room-enter、floor-start这类没有触发者的触发),个人钱包的魂晶与诅咒都当成0,不会逐一检查在场的人;全队共用钱包时coins看全队的钱包。
{floor} >= 5、{coins} >= 30 这种变量写法也可以。
变量
脚本、计分板、菜单文字都能用(在随机地牢以外保持原文):
| 变量 | 内容 |
|---|---|
{floor} | 目前是第几层 |
{floors} | 总层数(无限层 = ∞) |
{floor_name} | 这一层的名称(floors.yml 的 names) |
{floors_cleared} | 打完了几层 |
{room} | 目前房间的名称(房间自己的脚本里是房间 ID,见下方) |
{room_id} | 目前房间的 ID |
{room_type} | 目前房间的种类名称(含颜色;房间自己的脚本里是种类键,见下方) |
{room_icon} | 种类名称前面的图示,例如 ⚔ |
{room_index} | 这一层的第几间 |
{rooms} | 这一层一共几间(含首领房) |
{rooms_cleared} | 这一场清除了几间房 |
{rooms_total} | 清除了几间(加上正在打的这间) |
{coins} | 自己的魂晶 |
{coins:<玩家>} | 某位队员的魂晶 |
{currency} / {currency_symbol} | 魂晶的名称 / 符号 |
{cards} | 自己有几张祝福(计分板与菜单里的 {cards} 是祝福清单,张数用 {card_count}) |
{card:<祝福ID>} | 自己这张祝福有几层 |
{curses} | 自己诅咒的总层数(一张叠了 3 层的诅咒算 3) |
{rerolls} | 自己还剩几次免费重抽 |
{best_floor} | 自己在这个模式的最高层数 |
{seed} | 这一场的种子 |
{mode_id} | 难度模式 ID |
{scale_health} / {scale_damage} / {scale_level} | 这一层的怪物成长倍率 |
{scale_pct} | 这一层怪物血量多了几 % |
{door_type:<n>} / {door_name:<n>} / {door_votes:<n>} | 第 n 扇门的种类 / 第二行(房间名称或种类说明,未知的门 = ???)/ 票数 |
「自己」= 收到这一行的玩家;没有的话是触发者。
在房间的 start.yml、房间 end.yml 的 clear:、room-enter / room-clear 触发、祝福的 on-room-enter / on-room-clear 里,{room} 是房间 ID(例如 boss_warden),{room_type} 是种类的英文键(例如 boss)。在这些地方写 欢迎来到 {room} 会显示成 ID,房间名称请直接写在文字里。计分板与其他脚本里的 {room}、{room_type} 才是名称与带颜色的种类名称。
房间的坐标照编辑模式看到的写,{point:<点位>} 也是编辑模式的坐标;插件会自动换算到这间房实际的位置。
触发种类
trigger.yml 多了六种,写在根目录 = 整场有效,写在房间里 = 只在那间房有效:
| 种类 | 别名 | 参数(都可以省略) | 可以用的变量 | 触发者 |
|---|---|---|---|---|
room-enter | room-start | room:房间 ID;room-type:种类 | {room}(房间 ID)、{room_type}(种类)、{floor} | 无 |
room-clear | room-end | 同上 | 同上 | 无 |
floor-start | — | floor:第几层 | {floor} | 无 |
floor-clear | floor-end | floor | {floor} | 无 |
card-pick | card | card:祝福 ID;rarity:稀有度 | {card}、{card_name}、{stacks}、{rarity}、{rarity_name} | 拿到祝福的人 |
shop-buy | buy | item:商品 ID | {item}、{item_name}、{price} | 买的人 |
第五层:
type: floor-start
floor: 5
script:
- "title &c第五层||&7从这里开始,怪物会越来越强"
传说祝福:
type: card-pick
rarity: legendary
script:
- "message &6{self} 获得了传说祝福 {card_name}!"
进商店:
type: room-enter
room-type: shop
script:
- "message &a商人:欢迎光临,看看有什么需要的?"
room-enter 在房间标题出现时触发(enter-delay 之前);要等怪物出来之后再做的事,写在房间的 start.yml。
其他通用设置(once、cooldown、condition、auto-start)和一般副本的 触发组 一样。根目录的触发整场有效,once: true 就是整场只触发一次。
范例
付钱许愿(script.yml):
付钱许愿:
- if: "coins >= 30"
then:
- "coins take 30 @self"
- "card give random:epic @self"
- "message &d{self} 的愿望实现了"
else:
- "message &c魂晶不够 @self"
事件选项:以血换力(room.yml 的 event.options):
blood:
name: "&c以血换力"
description: ["&7失去 30% 生命", "&7获得一张稀有以上的祝福"]
actions: ["rogue damage 30% @self"]
card: "random:rare+"
下一扇门固定是商店(例如某个触发、某张祝福):
- "room next shop"
- "message &a你感觉到前方有商人的气息……"
开发者事件
给其他插件监听的事件都在 dev.cloudplugins.dungeon.api.DungeonEvent 里(主线程触发),用法见 开发者 API:
| 事件 | 什么时候 | 主要方法 |
|---|---|---|
FloorStart | 新的一层开始 | getFloor()、isInfinite()、getMaxFloors()(无限 = −1)、getSeed() |
FloorClear | 一层打完 | getFloor()、getFloorMillis() |
RoomEnter | 进入房间 | getRoomId()、getRoomType()、getFloor()、getRoomIndex() |
RoomClear | 房间清除 | 同上 + getReason() |
CardOffer | 祝福选项显示之前 | getPlayer()、getCardIds()(可以修改)、getKind() |
CardPick | 拿到祝福(可以取消) | getPlayer()、getCardId()、getStacks()、getSource() |
ShopPurchase | 商店购买(可以取消) | getPlayer()、getGoodsId()、getPrice()、getCurrency() |
RogueEnd | 整场结束 | getResult()(CLEAR / RETREAT / FAIL / ENDLESS / STOPPED)、getFloorsCleared()、getRoomsCleared()、getMillis() |
随机地牢结束时,一般副本的 Clear(通关、撤退)与 Fail(失败、无限层结束)事件也照常触发。