balance: 回调过度难度——精力消耗4(持续时间翻倍)/恢复8,初始HC170,怪物HP/速度适度降低至合理区间
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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 // 降低初始HC:200→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 十六进制)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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') }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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> | <span style="color:#94a3b8">HC 将重置为 150</span>`
|
statsEl.innerHTML = `最终KPI: <span style="color:#34d399">${kpi}%</span> | <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(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user