Adding the bones of the drafting system by removing the wall and siege towers from the base set and adding them temporarily as choices for the draft. Also adding Project_Context and Project_Roadmap documents to use with Claude
This commit is contained in:
parent
1d03689dad
commit
3ceebed8f6
22 changed files with 1060 additions and 431 deletions
59
Assets/_Project/Scripts/Gameplay/Draft/DraftOption.cs
Normal file
59
Assets/_Project/Scripts/Gameplay/Draft/DraftOption.cs
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
// Assets/_Project/Scripts/Gameplay/Draft/DraftOption.cs
|
||||
using UnityEngine;
|
||||
|
||||
namespace TD.Gameplay.Draft
|
||||
{
|
||||
/// <summary>
|
||||
/// Base class for one authored draft choice. The draft system offers a player a
|
||||
/// weighted-random selection of these between waves; the player picks one and the
|
||||
/// server applies its effect.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para><b>One asset per choice.</b> Concrete subclasses (e.g.
|
||||
/// <see cref="NewTowerDraftOption"/>) carry the payload and implement
|
||||
/// <see cref="ServerApply"/>. New choice types (systemic upgrade, builder ability,
|
||||
/// relic quest, enemy debuff) are added as new subclasses — the draft spine
|
||||
/// (<see cref="DraftService"/>, <see cref="PlayerDraft"/>, HUD) is type-agnostic.</para>
|
||||
///
|
||||
/// <para><b>Identity.</b> Options live in <see cref="DraftPool"/> and are referenced
|
||||
/// over the network by their pool index (<c>DraftOptionId</c>) — the same
|
||||
/// stable-within-a-match index pattern used by the tower catalog.</para>
|
||||
///
|
||||
/// <para><b>Server-only logic.</b> <see cref="IsValidFor"/> and
|
||||
/// <see cref="ServerApply"/> run on the server and operate on the target player's
|
||||
/// per-player components (deck, gold, etc.). The ScriptableObject holds no per-player
|
||||
/// state, so a single asset is shared across all players and matches.</para>
|
||||
/// </remarks>
|
||||
public abstract class DraftOption : ScriptableObject
|
||||
{
|
||||
[Header("Presentation")]
|
||||
[Tooltip("Name shown on the draft card.")]
|
||||
public string DisplayName;
|
||||
|
||||
[Tooltip("Short description shown on the draft card.")]
|
||||
[TextArea(2, 4)]
|
||||
public string Description;
|
||||
|
||||
[Tooltip("Icon shown on the draft card. Optional for placeholder content.")]
|
||||
public Sprite Icon;
|
||||
|
||||
[Header("Generation")]
|
||||
[Tooltip("Relative draw weight. Higher = offered more often. Rarer rewards use " +
|
||||
"lower weights. Must be > 0.")]
|
||||
[Min(0.0001f)]
|
||||
public float Weight = 1f;
|
||||
|
||||
/// <summary>
|
||||
/// Server-only: can this option validly be OFFERED to the given player right now?
|
||||
/// Lets the generator skip options that would be a no-op (e.g. a tower the player
|
||||
/// already owns). Default true; override when an option has prerequisites.
|
||||
/// </summary>
|
||||
public virtual bool IsValidFor(ulong clientId) => true;
|
||||
|
||||
/// <summary>
|
||||
/// Server-only: apply this option's effect to the given player. Returns false if
|
||||
/// it could not be applied (caller treats as a no-op and logs).
|
||||
/// </summary>
|
||||
public abstract bool ServerApply(ulong clientId);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue