跳到主要内容

脚本:动作、条件、变量、触发

随机地牢里,一般副本的脚本写法、动作、条件、变量全部照用,另外多了这一页的东西。

clear 在随机地牢里的意思
  • 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 扇门的种类 / 第二行(房间名称或种类说明,未知的门 = ???)/ 票数

「自己」= 收到这一行的玩家;没有的话是触发者。

房间自己的脚本里,room 变量是房间 ID

在房间的 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-enterroom-startroom:房间 ID;room-type:种类{room}(房间 ID)、{room_type}(种类)、{floor}无
room-clearroom-end同上同上无
floor-start—floor:第几层{floor}无
floor-clearfloor-endfloor{floor}无
card-pickcardcard:祝福 ID;rarity:稀有度{card}、{card_name}、{stacks}、{rarity}、{rarity_name}拿到祝福的人
shop-buybuyitem:商品 ID{item}、{item_name}、{price}买的人
trigger.yml
第五层:
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(失败、无限层结束)事件也照常触发。