balance: 回调过度难度——精力消耗4(持续时间翻倍)/恢复8,初始HC170,怪物HP/速度适度降低至合理区间

This commit is contained in:
Cloud Bot
2026-03-24 09:02:02 +00:00
parent 4fec1ebe9d
commit 6843d2b74c
8 changed files with 17 additions and 16 deletions

View File

@@ -470,7 +470,7 @@ function PuaPanel({ gameReady, hc, waveStarted }: { gameReady: boolean; hc: numb
// ── 主游戏页面 ──────────────────────────────────────────────────────────────── // ── 主游戏页面 ────────────────────────────────────────────────────────────────
export default function GamePage() { export default function GamePage() {
const gameRef = useRef<{ destroy: (removeCanvas: boolean) => void } | null>(null) const gameRef = useRef<{ destroy: (removeCanvas: boolean) => void } | null>(null)
const [hc, setHc] = useState(150) const [hc, setHc] = useState(170)
const [selectedTower, setSelectedTower] = useState<TowerType | null>(null) const [selectedTower, setSelectedTower] = useState<TowerType | null>(null)
const [gameReady, setGameReady] = useState(false) const [gameReady, setGameReady] = useState(false)
const [waveStarted, setWaveStarted] = useState(false) const [waveStarted, setWaveStarted] = useState(false)

View File

@@ -12,10 +12,10 @@ export const HUD_HEIGHT = 60
export const WAVES_PER_MAP = 5 export const WAVES_PER_MAP = 5
// 游戏初始数值 // 游戏初始数值
export const INITIAL_HC = 150 // 降低初始HC200→150提高前期资源压力 export const INITIAL_HC = 170 // 初始资源150→170
export const INITIAL_KPI = 100 export const INITIAL_KPI = 100
export const STAMINA_MAX = 100 export const STAMINA_MAX = 100
export const STAMINA_REGEN = 5 // 每秒恢复量 export const STAMINA_REGEN = 8 // 摸鱼恢复速度5→8/s减少卡顿感
export const COFFEE_COST = 10 // 瑞幸咖啡 HC 成本 export const COFFEE_COST = 10 // 瑞幸咖啡 HC 成本
// 颜色常量Phaser 使用 0x 十六进制) // 颜色常量Phaser 使用 0x 十六进制)

View File

@@ -15,8 +15,8 @@ export class BossVP extends EnemyBase {
speedMultiplier: number = 1.0, speedMultiplier: number = 1.0,
hpMultiplier: number = 1.0 hpMultiplier: number = 1.0
) { ) {
// HP: 800→1200, speed: 40→55, kpiDamage: 30→40, hcReward: 150→100 // HP: 900, speed: 45, kpiDamage: 35, hcReward: 120
super(scene, pathPoints, 1200, 55, 40, 100, 'enemy-boss', speedMultiplier, hpMultiplier) super(scene, pathPoints, 900, 45, 35, 120, 'enemy-boss', speedMultiplier, hpMultiplier)
this.onDestroyTower = onDestroyTower this.onDestroyTower = onDestroyTower
const bossSize = this.cellW * 1.3 const bossSize = this.cellW * 1.3
this.imageSprite.setDisplaySize(bossSize, bossSize) this.imageSprite.setDisplaySize(bossSize, bossSize)

View File

@@ -9,8 +9,9 @@ export class FreshGraduate extends EnemyBase {
speedMultiplier: number = 1.0, speedMultiplier: number = 1.0,
hpMultiplier: number = 1.0 hpMultiplier: number = 1.0
) { ) {
// HP: 30→50, speed: 120→145, kpiDamage: 2→3, hcReward: 10→8 // HP: 40, speed: 130, kpiDamage: 2.5→取整3不行用整数2, hcReward: 9
super(scene, pathPoints, 50, 145, 3, 8, 'enemy-fresh', speedMultiplier, hpMultiplier) // kpiDamage 用浮点:在 GameManager.reduceKPI 里用 Math.max(0, kpi - amount)
super(scene, pathPoints, 40, 130, 2, 9, 'enemy-fresh', speedMultiplier, hpMultiplier)
} }
getQuote(): string { return getRandomQuote('FreshGraduate') } getQuote(): string { return getRandomQuote('FreshGraduate') }
} }

View File

@@ -9,9 +9,9 @@ export class OldEmployee extends EnemyBase {
speedMultiplier: number = 1.0, speedMultiplier: number = 1.0,
hpMultiplier: number = 1.0 hpMultiplier: number = 1.0
) { ) {
// HP: 150→240, speed: 50→65, kpiDamage: 8→12, hcReward: 30→22, shield: 3→4 // HP: 180, speed: 55, kpiDamage: 10, hcReward: 25, shield: 3
super(scene, pathPoints, 240, 65, 12, 22, 'enemy-old', speedMultiplier, hpMultiplier) super(scene, pathPoints, 180, 55, 10, 25, 'enemy-old', speedMultiplier, hpMultiplier)
this.shieldCount = 4 this.shieldCount = 3
this.imageSprite.setDisplaySize(this.cellW * 0.85, this.cellW * 0.85) this.imageSprite.setDisplaySize(this.cellW * 0.85, this.cellW * 0.85)
} }

View File

@@ -10,8 +10,8 @@ export class TroubleMaker extends EnemyBase {
speedMultiplier: number = 1.0, speedMultiplier: number = 1.0,
hpMultiplier: number = 1.0 hpMultiplier: number = 1.0
) { ) {
// HP: 80→130, speed: 80→100, kpiDamage: 5→7, hcReward: 20→15 // HP: 100, speed: 85, kpiDamage: 6, hcReward: 18
super(scene, pathPoints, 130, 100, 7, 15, 'enemy-trouble', speedMultiplier, hpMultiplier) super(scene, pathPoints, 100, 85, 6, 18, 'enemy-trouble', speedMultiplier, hpMultiplier)
} }
protected override onDeath(): void { protected override onDeath(): void {

View File

@@ -98,7 +98,7 @@ export abstract class TowerBase {
const target = this.findTarget(enemies) const target = this.findTarget(enemies)
if (target && this.attackCooldown <= 0) { if (target && this.attackCooldown <= 0) {
this.attack(target) this.attack(target)
this.stamina -= 8 // 精力消耗:5→8更快进入摸鱼状态 this.stamina -= 4 // 精力消耗:8→4持续战斗时间翻倍
// 应用 PUA 攻速倍率(倍率越高冷却越短) // 应用 PUA 攻速倍率(倍率越高冷却越短)
this.attackCooldown = 1000 / (this.attackSpeed * this._puaSpeedMult) this.attackCooldown = 1000 / (this.attackSpeed * this._puaSpeedMult)
this.updateStaminaBar() this.updateStaminaBar()

View File

@@ -93,7 +93,7 @@ export class MapTransitionModal {
// KPI & 说明 // KPI & 说明
const statsEl = document.createElement('div') const statsEl = document.createElement('div')
statsEl.innerHTML = `最终KPI: <span style="color:#34d399">${kpi}%</span> &nbsp;|&nbsp; <span style="color:#94a3b8">HC 将重置为 150</span>` statsEl.innerHTML = `最终KPI: <span style="color:#34d399">${kpi}%</span> &nbsp;|&nbsp; <span style="color:#94a3b8">HC 将重置为 170</span>`
statsEl.style.cssText = ` statsEl.style.cssText = `
font-size: 20px; font-size: 20px;
color: #e2e8f0; color: #e2e8f0;
@@ -131,7 +131,7 @@ export class MapTransitionModal {
// 倒计时提示HC 重置提醒) // 倒计时提示HC 重置提醒)
const countdownEl = document.createElement('div') const countdownEl = document.createElement('div')
countdownEl.id = 'mt-countdown' countdownEl.id = 'mt-countdown'
countdownEl.textContent = isFinalMap ? '3秒后返回主菜单...' : '3秒后进入下一关HC重置为150...' countdownEl.textContent = isFinalMap ? '3秒后返回主菜单...' : '3秒后进入下一关HC重置为170...'
countdownEl.style.cssText = ` countdownEl.style.cssText = `
font-size: 16px; font-size: 16px;
color: #6b7280; color: #6b7280;
@@ -157,7 +157,7 @@ export class MapTransitionModal {
const el = document.getElementById('mt-countdown') const el = document.getElementById('mt-countdown')
if (el) el.textContent = isFinalMap if (el) el.textContent = isFinalMap
? `${remaining}秒后返回主菜单...` ? `${remaining}秒后返回主菜单...`
: `${remaining}秒后进入下一关HC重置为150...` : `${remaining}秒后进入下一关HC重置为170...`
} }
const interval = setInterval(tick, 1000) const interval = setInterval(tick, 1000)
this.autoCloseTimer = setTimeout(() => { this.autoCloseTimer = setTimeout(() => {