Skip to content

自定义弹幕游戏 Boss ​

使用 PoopSkyServerEvents.customBoss 注册可在弹幕游戏中随机出现的 Boss。Boss 脚本必须放在服务端脚本目录

text
kubejs/server_scripts/poopsky_danmaku_bosses.js

添加一个 Boss ​

下面的示例注册一个从第 2 波开始出现、发射旋转弹幕的 Boss:

javascript
PoopSkyServerEvents.customBoss(event => {
    event.register('spiral_guardian')
        .baseHp(120)
        .bulletCount(18)
        .maxBounces(1)
        .attackInterval(12)
        .bulletSpeed(2.4)
        .weight(3)
        .minWave(2)
        .loot('minecraft:apple')
        .tick(ctx => {
            if (ctx.age % 12 === 0) {
                ctx.spawnCircle(18, 2.4, 1, ctx.rotation)
            }

            ctx.moveToPlayerX(0.35)
            ctx.rotation += 4
        })
})

event.register('spiral_guardian') 中的 ID 必须唯一,并且只能使用小写字母、数字、_、-、. 和 /。

设置属性 ​

方法作用默认值
.baseHp(value)设置基础生命值;每波原有的 +5 成长仍会叠加80
.bulletCount(value)设置每次攻击的弹幕数量20
.maxBounces(value)设置弹幕最多反弹次数0
.attackInterval(value)设置攻击间隔,单位为游戏 tick8
.bulletSpeed(value)设置弹幕速度2
.rotation(value)设置默认旋转角度0
.angleStep(value)设置每次攻击的旋转步长5
.weight(value)设置随机出现的权重;原生五种 Boss 各为 11
.minWave(value)设置最早出现波次1
.loot(itemId)添加击杀后从街机正面喷出的掉落;可重复调用无

baseHp、bulletCount、maxBounces、attackInterval、bulletSpeed、rotation 和 angleStep 都可以传入两个参数,令每局游戏在范围内随机取值。例如 .baseHp(100, 150)。

Boss 移动 ​

使用 .movement(type, amplitude, speed) 配置原生移动。type 可为:

  • left_right:左右移动
  • orbit:绕圈移动
  • random:随机移动

使用 .movementWave(wave[, randomMovement]) 设置从哪一波开始启用移动。randomMovement 为 true 时,会随机选择一种原生移动方式。

circularRotation() 或 circularRotation(startDelay, duration) 可配置环形旋转;它不能和 .rotation(...) 同时使用。

编写弹幕逻辑 ​

使用 .tick(callback) 设置每个游戏 tick 执行的逻辑。回调参数 ctx 可读取 age、wave、rotation、bossX、bossY、playerX、playerY;其中 rotation 可以直接改写。

已生成的属性可通过 baseHp、bulletCount、maxBounces、attackInterval、bulletSpeed、modifierRotation、angleStep 和 movementWave 读取。

ctx 提供以下方法:

  • spawnBullet(vx, vy, maxBounces):按速度向量发射一枚弹幕。
  • spawnCircle(count, speed, maxBounces, angleOffsetDegrees):环形发射弹幕。
  • spawnArc(count, speed, maxBounces, centerAngleDegrees, spreadDegrees):按扇形发射弹幕。
  • moveBy(x, y):移动 Boss。
  • setBossPosition(x, y):设置 Boss 位置。
  • moveToPlayerX(speed):让 Boss 向玩家的横向位置移动。

使用原生参数 ​

需要直接调用原生 Boss、TouhouGameState 或 Random 方法时,使用 .rawTick((boss, state, random) => {})。它与 .tick(...) 只能选择其一。

javascript
PoopSkyServerEvents.customBoss(event => {
    event.register('raw_circle')
        .rawTick((boss, state, random) => {
            if (random.nextInt(12) === 0) {
                const modifiers = boss.modifiers()
                state.spawnCircle(
                    state.getBossCenterX(),
                    state.getBossCenterY(),
                    modifiers.bulletCount(),
                    modifiers.bulletSpeed(),
                    modifiers.maxBounces(),
                    0,
                )
            }
        })
})