feat(game): 新增3个角色、修复实习生攻击特效、加速开发子弹、每波结束自动进入下一波
This commit is contained in:
82
game/towers/OutsourceTower.ts
Normal file
82
game/towers/OutsourceTower.ts
Normal file
@@ -0,0 +1,82 @@
|
||||
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(),
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user