Files
test1/game/towers/OutsourceTower.ts

83 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type Phaser from 'phaser'
import { TowerBase } from './TowerBase'
import type { EnemyBase } from '../enemies/EnemyBase'
/**
* 外包程序员 — 30 HC最便宜但最差
* 攻击:扔出 Bug随机概率丢空低伤害攻速慢
* 特殊技能"甲方爸爸"5% 概率扔出的 Bug 反弹打到自己,瞬间精力归零(摸鱼)
* 特色:便宜、量多凑数,是前期过渡塔
*/
export class OutsourceTower extends TowerBase {
constructor(scene: Phaser.Scene, gridX: number, gridY: number) {
// cost=30, range=2, damage=8, speed=0.7
super(scene, gridX, gridY, 30, 2, 8, 0.7, 'tower-outsource')
}
attack(target: EnemyBase): void {
// 5% 概率 Bug 反弹(精力归零)
if (Math.random() < 0.05) {
this.stamina = 0
this.showMessage('Bug反弹精力归零', '#ef4444')
return
}
// 30% 概率丢空miss
if (Math.random() < 0.3) {
this.showMessage('Miss环境问题', '#9ca3af')
return
}
this.fireBug(target)
}
private fireBug(target: EnemyBase): void {
const bugEmojis = ['🐛', '🔥', '💥', '❌']
const sym = bugEmojis[Math.floor(Math.random() * bugEmojis.length)]
const bullet = this.scene.add.text(this.px, this.py, sym, {
fontSize: '14px',
}).setOrigin(0.5, 0.5).setDepth(13)
// 外包子弹走曲线(不走直线,歪歪扭扭)
const midX = (this.px + target.x) / 2 + (Math.random() - 0.5) * 60
const midY = (this.py + target.y) / 2 + (Math.random() - 0.5) * 60
this.scene.tweens.add({
targets: bullet,
x: midX, y: midY,
duration: 200,
ease: 'Sine.easeOut',
onComplete: () => {
this.scene.tweens.add({
targets: bullet,
x: target.x, y: target.y,
duration: 200,
ease: 'Sine.easeIn',
onComplete: () => {
bullet.destroy()
if (!target.isDead) {
target.takeDamage(this.attackDamage)
const g = this.scene.add.graphics()
g.fillStyle(0xef4444, 0.4)
g.fillCircle(target.x, target.y, 10)
g.setDepth(15)
this.scene.time.delayedCall(200, () => g.destroy())
}
},
})
},
})
}
private showMessage(msg: string, color: string): void {
const txt = this.scene.add
.text(this.px, this.py - 28, msg, {
fontFamily: 'VT323, monospace', fontSize: '13px',
color, backgroundColor: '#1c1917', padding: { x: 3, y: 1 },
}).setOrigin(0.5, 1).setDepth(20)
this.scene.tweens.add({
targets: txt, y: this.py - 50, alpha: 0,
duration: 1000, onComplete: () => txt.destroy(),
})
}
}