feat(game): 新增3个角色、修复实习生攻击特效、加速开发子弹、每波结束自动进入下一波

This commit is contained in:
Cloud Bot
2026-03-24 07:47:41 +00:00
parent 300f4c432f
commit c8b8c7109f
9 changed files with 392 additions and 66 deletions

72
game/towers/OpsTower.ts Normal file
View File

@@ -0,0 +1,72 @@
import type Phaser from 'phaser'
import { TowerBase } from './TowerBase'
import type { EnemyBase } from '../enemies/EnemyBase'
/**
* 运营专员 — 90 HC
* 攻击:发射数据大屏图表,范围溅射(命中目标周围的怪也受少量伤害)
* 特殊技能"增长黑客"20% 概率命中时使目标掉落双倍 HC
*/
export class OpsTower extends TowerBase {
constructor(scene: Phaser.Scene, gridX: number, gridY: number) {
super(scene, gridX, gridY, 90, 3, 18, 1.2, 'tower-ops')
}
attack(target: EnemyBase): void {
this.fireChart(target)
}
private fireChart(target: EnemyBase): void {
const charts = ['📊', '📈', '📉', '🎯']
const sym = charts[Math.floor(Math.random() * charts.length)]
const bullet = this.scene.add.text(this.px, this.py, sym, {
fontSize: '15px',
}).setOrigin(0.5, 0.5).setDepth(13)
const dx = target.x - this.px
const dy = target.y - this.py
const dist = Math.sqrt(dx * dx + dy * dy)
this.scene.tweens.add({
targets: bullet,
x: target.x, y: target.y,
duration: (dist / 1000) * 1000,
ease: 'Linear',
onComplete: () => {
bullet.destroy()
if (target.isDead) return
// 主目标伤害
target.takeDamage(this.attackDamage)
// 增长黑客20% 双倍 HC 奖励(通过 hcRewardBonus 标记)
if (Math.random() < 0.2) {
target.hcRewardBonus = true
const tag = this.scene.add.text(target.x, target.y - 20, '双倍HC!', {
fontFamily: 'VT323, monospace', fontSize: '13px', color: '#fbbf24',
}).setOrigin(0.5, 1).setDepth(20)
this.scene.tweens.add({
targets: tag, y: target.y - 40, alpha: 0,
duration: 900, onComplete: () => tag.destroy(),
})
}
// 范围溅射:命中半径 1.5 格内的其他怪物
const splashR = this.cellW * 1.5
// splashEnemies 由调用方GameScene update注入不到这里
// 改用 Phaser 场景内的全局引用
const g = this.scene.add.graphics()
g.lineStyle(2, 0x8b5cf6, 0.7)
g.strokeCircle(target.x, target.y, splashR)
g.fillStyle(0x8b5cf6, 0.1)
g.fillCircle(target.x, target.y, splashR)
g.setDepth(12)
this.scene.tweens.add({
targets: g, alpha: 0, duration: 350,
onComplete: () => g.destroy(),
})
},
})
}
}