自定义弹幕游戏 Boss
使用 PoopSkyServerEvents.customBoss 注册可在弹幕游戏中随机出现的 Boss。Boss 脚本必须放在服务端脚本目录
kubejs/server_scripts/poopsky_danmaku_bosses.js添加一个 Boss
下面的示例注册一个从第 2 波开始出现、发射旋转弹幕的 Boss:
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) | 设置攻击间隔,单位为游戏 tick | 8 |
.bulletSpeed(value) | 设置弹幕速度 | 2 |
.rotation(value) | 设置默认旋转角度 | 0 |
.angleStep(value) | 设置每次攻击的旋转步长 | 5 |
.weight(value) | 设置随机出现的权重;原生五种 Boss 各为 1 | 1 |
.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(...) 只能选择其一。
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,
)
}
})
})