63 lines
2.0 KiB
TypeScript
63 lines
2.0 KiB
TypeScript
import type Phaser from 'phaser'
|
|
import { TowerBase } from './TowerBase'
|
|
import { GameManager } from '../GameManager'
|
|
import type { EnemyBase } from '../enemies/EnemyBase'
|
|
|
|
export class InternTower extends TowerBase {
|
|
private selfDestroyTimer: number = 0
|
|
private readonly SELF_DESTROY_INTERVAL = 1000
|
|
private destroyed: boolean = false
|
|
public onSelfDestroy?: (tower: InternTower) => void
|
|
|
|
constructor(scene: Phaser.Scene, gridX: number, gridY: number) {
|
|
super(scene, gridX, gridY, 50, 1, 15, 1.5, 'tower-intern')
|
|
}
|
|
|
|
override update(delta: number, enemies: EnemyBase[]): void {
|
|
if (this.destroyed) return
|
|
super.update(delta, enemies)
|
|
this.selfDestroyTimer += delta
|
|
if (this.selfDestroyTimer >= this.SELF_DESTROY_INTERVAL) {
|
|
this.selfDestroyTimer -= this.SELF_DESTROY_INTERVAL
|
|
if (Math.random() < 0.01) {
|
|
GameManager.getInstance().addHC(25)
|
|
this.showMessage('实习生跑路!+25HC', '#22C55E')
|
|
this.destroyed = true
|
|
this.onSelfDestroy?.(this)
|
|
this.destroy()
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
attack(target: EnemyBase): void {
|
|
if (Math.random() < 0.05 && target.hp < 500) {
|
|
target.takeDamage(9999)
|
|
this.showMessage('整顿职场!秒杀!', '#A3E635')
|
|
} else {
|
|
target.takeDamage(this.attackDamage)
|
|
}
|
|
this.showMeleeEffect(target)
|
|
}
|
|
|
|
private showMeleeEffect(target: EnemyBase): void {
|
|
const g = this.scene.add.graphics()
|
|
g.fillStyle(0x22c55e, 0.6)
|
|
g.fillCircle(target.x, target.y, 12)
|
|
g.setDepth(15)
|
|
this.scene.time.delayedCall(150, () => g.destroy())
|
|
}
|
|
|
|
private showMessage(msg: string, color: string): void {
|
|
const txt = this.scene.add
|
|
.text(this.px, this.py - 30, msg, {
|
|
fontFamily: 'VT323, monospace', fontSize: '14px',
|
|
color, backgroundColor: '#052e16', padding: { x: 4, y: 2 },
|
|
}).setOrigin(0.5, 1).setDepth(20)
|
|
this.scene.tweens.add({
|
|
targets: txt, y: this.py - 55, alpha: 0,
|
|
duration: 1200, onComplete: () => txt.destroy(),
|
|
})
|
|
}
|
|
}
|