UnityTowerDefense/Assets/_Project/Scripts/Gameplay/EnemyAbilities/NoBountyAbilityDefinition.cs
Matt F 4892d7253d First pass at full refactor to 2.0 design
Restructures the game around the cyclical run loop from Game Design Doc V2:
5 waves = a cycle, 3 cycles = a phase, each phase ends in a boss.

- New TD.Gameplay.Waves: WaveGroup / PhaseDefinition / RunDefinition author the
  run as draggable weighted pools; RunState owns phase/cycle position, the drawn
  wave slots, and the per-slot enemy buff sets. WaveManager's flat wave array is
  gone -- it now only runs the encounter RunState points at.
- New TD.Gameplay.EnemyUpgrades: the post-wave enemy-buff vote, with public
  live-replicated ballots so the HUD can show who voted for what.
- Inter-wave flow is now strictly sequential: draft -> vote -> build, each stage
  ending early once every player has acted.
- Enemy abilities inverted from per-instance random rolls to deterministic,
  stacking per-wave-slot sets. Six cards ship: Split (reworked), Flight, Blink,
  No Bounty, Gold Theft, Double Up.
- Tower upgrades are a two-step tree: a draft pick unlocks a node, gold converts
  an already-placed tower in place.
- Boss encounters flag their enemies and drive a boss HP bar.
- Player cap reduced to 3 via MatchRules.MaxPlayers.
- GoldConfig is now keyed by global encounter number rather than wave index.

Compiles clean; NOT yet verified in-engine. Editor wiring still required --
see Docs/2.0_Setup_Checklist.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 17:45:11 -07:00

34 lines
1.6 KiB
C#

// Assets/_Project/Scripts/Gameplay/EnemyAbilities/NoBountyAbilityDefinition.cs
using UnityEngine;
using TD.Core;
namespace TD.Gameplay.EnemyAbilities
{
/// <summary>
/// Killing these enemies pays little or nothing. The wave gets no harder to survive — it gets
/// harder to profit from.
/// </summary>
/// <remarks>
/// <b>Attacks the economy, not the maze.</b> Every other card makes a wave more dangerous;
/// this one makes clearing it worthless, which compounds instead across cycles — a wave that
/// pays nothing on cycle 1 also pays nothing on cycles 2 and 3, so the players who voted it in
/// are choosing to be poorer for the rest of the phase. That slow squeeze is the point, and
/// it's why the card reads as mild and isn't.
///
/// <para>Wave-completion and no-leak bonuses are untouched — those are paid per player by
/// <c>WaveManager</c>, not per kill, so a wave carrying this still rewards clearing it.</para>
/// </remarks>
[CreateAssetMenu(fileName = "NoBountyAbility", menuName = "TD/Enemy Abilities/No Bounty")]
public class NoBountyAbilityDefinition : EnemyAbilityDefinition
{
public override EnemyAbilityKind Kind => EnemyAbilityKind.NoBounty;
[Header("Bounty")]
[Tooltip("Fraction of the normal kill bounty these enemies still pay. 0 = nothing at all.")]
[Range(0f, 1f)]
public float BountyMultiplier = 0f;
public override int ServerModifyKillReward(EnemyAbility instance, int reward)
=> Mathf.FloorToInt(reward * BountyMultiplier);
}
}