66 lines
2.0 KiB
TypeScript
66 lines
2.0 KiB
TypeScript
import type Phaser from 'phaser'
|
||
import { TowerBase } from './TowerBase'
|
||
import type { EnemyBase } from '../enemies/EnemyBase'
|
||
|
||
export class SeniorDevTower extends TowerBase {
|
||
constructor(scene: Phaser.Scene, gridX: number, gridY: number) {
|
||
super(scene, gridX, gridY, 120, 5, 30, 1.0, 'tower-senior')
|
||
}
|
||
|
||
attack(target: EnemyBase): void {
|
||
this.fireCodeBullet(target)
|
||
}
|
||
|
||
private fireCodeBullet(target: EnemyBase): void {
|
||
// 随机代码符号作为子弹
|
||
const symbols = ['</>', '{}', '=>', '??', '&&', '||', '++', '!=']
|
||
const sym = symbols[Math.floor(Math.random() * symbols.length)]
|
||
|
||
const bullet = this.scene.add.text(this.px, this.py, sym, {
|
||
fontFamily: 'monospace',
|
||
fontSize: '13px',
|
||
color: '#86efac',
|
||
stroke: '#14532d',
|
||
strokeThickness: 2,
|
||
}).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)
|
||
// 子弹速度 1200px/s,比原来快 2.4 倍
|
||
const duration = (dist / 1200) * 1000
|
||
|
||
this.scene.tweens.add({
|
||
targets: bullet,
|
||
x: target.x,
|
||
y: target.y,
|
||
duration,
|
||
ease: 'Linear',
|
||
onComplete: () => {
|
||
bullet.destroy()
|
||
if (!target.isDead) {
|
||
target.takeDamage(this.attackDamage)
|
||
target.addDOT(10, 3000)
|
||
// DOT 命中:绿色代码粒子爆散
|
||
for (let i = 0; i < 4; i++) {
|
||
const p = this.scene.add.text(
|
||
target.x, target.y,
|
||
['bug', 'err', '!!!', '???'][i],
|
||
{ fontFamily: 'monospace', fontSize: '10px', color: '#22c55e' }
|
||
).setOrigin(0.5, 0.5).setDepth(15)
|
||
const angle = (i / 4) * Math.PI * 2
|
||
this.scene.tweens.add({
|
||
targets: p,
|
||
x: target.x + Math.cos(angle) * 22,
|
||
y: target.y + Math.sin(angle) * 22,
|
||
alpha: 0,
|
||
duration: 400,
|
||
onComplete: () => p.destroy(),
|
||
})
|
||
}
|
||
}
|
||
},
|
||
})
|
||
}
|
||
}
|