Skip to content

Hoop Dynasty - Role Assignment

Roles define a player’s declared function within the team’s offensive system. They are implemented as role tags — a sub-category of the tag system that sits alongside Specialisation, IQ, Behavioral, and Durability tags on the player dossier.

Role tags serve two functions:

  1. Simulation input — they bias the possession generator’s scoring function toward the play types associated with the role.
  2. Morale input — when a player’s actual touch volume falls below their role expectation for long enough, a morale pressure signal fires.

Role tags follow the same model as other tag categories (see 6-player-attributes-and-tags.md):

  • Discrete labels attached to a player card
  • No cap — a player can hold any number of role tags their attributes and archetype justify
  • Assigned automatically in V1; manually overridable in a later phase
  • Mutable: a role tag can be added or removed (e.g. via a Development Card, or when a player’s attributes shift significantly)

The vocabulary is derived from the offensive play types the simulation supports. Each role tag is the declaration that this player is a primary candidate for the associated play type family.

Role TagPrimary play type(s)Key attribute cluster
ball-handlerIsolation, drive-and-kick, transition initiation — general primary handlerBall Handling, Passing, Speed
pick-and-roll-handlerPick-and-roll (ball side)Ball Handling, Passing, Three-Point / Finishing
pick-and-roll-screenerPick-and-roll → roll to rimStrength, Finishing, Offensive Rebounding
pick-and-pop-screenerPick-and-roll → pop to perimeterStrength, Three-Point, catch-and-shoot tag
handoff-screenerHandoff actionsSpeed, Strength, Ball Handling
isolation-scorerIsolationMid-Range, Ball Handling, Finishing
post-anchorPost-upStrength, Close Range, Finishing
floor-spacerCatch-and-shoot, spot-upThree-Point; catch-and-shoot or spot-up-shooter specialisation tag
cutterOff-ball cut, drive-and-kick recipientSpeed, Finishing
transition-initiatorFast break, push-paceSpeed, Ball Handling, Passing

Note: Defensive roles are not defined here. Defensive role assignment belongs to a dedicated defensive scheme design session.


Role tags add a weight bonus to the possession generator’s scoring function for their associated play types:

option_score(play_type) =
scheme_weight(play_type)
+ play_type_recency_score(...)
+ player_fit(primary_candidate, play_type) // includes role tag boost
+ heat_modifier(primary_candidate)
- fatigue_penalty(primary_candidate)
+ matchup_exploit(primary_candidate, defender)

The role tag boost is applied inside player_fit. It is a positive scalar added when the evaluated play type matches one of the player’s role tags. The boost does not lock the play type to that player — other players can still score higher on the same play type if their attributes, Heat, and matchup advantages outweigh the role boost.

This is a soft bias, not a hard assignment. The role declares intent; the scoring function resolves it each possession.


In V1, role tags are assigned automatically at Roster Construction (Chapter 5 of the off-season — see 9-off-season.md).

Assignment function:

assign_role_tags(
player, // attributes, archetype, specialisation tags
roster, // all players currently on the roster
scheme // active offensive scheme (biases role priority)
) → role_tag_set // set of role tags assigned to this player
  • The function evaluates each role tag against the player’s attribute cluster and existing specialisation tags.
  • A role tag is assigned if the player scores above a threshold on the relevant attribute cluster for that role.
  • Multiple role tags can be assigned — there is no cap.
  • Conflicts (two players assigned the same primary role, e.g. two ball-handler tags on a 5-player roster) are flagged as a scheme fit warning visible during Roster Construction, but not prevented. The coach is informed; the decision is theirs.

Manual override (later phase): The coach will be able to manually assign or remove role tags during Roster Construction and at the between-game decision slot. The assignment function result is the starting point; the coach can edit from it. This requires no structural change to the tag model.


A player whose actual touch volume falls significantly below their role expectation for long enough accumulates morale pressure. This is detected by the role mismatch function, evaluated after each game.

role_mismatch(
player, // role tags, behavioral tags (high-maintenance, team-first, etc.)
touches_this_game, // possessions where this player was the primary candidate
role_touch_expectation, // expected touch floor derived from role tags (see below)
games_left_until_crisis, // from previous evaluation (starts at null)
streak_length, // consecutive games below expectation
morale_current // current morale value
) → updated_games_left_until_crisis

The function returns an updated games_left_until_crisis value. When games_left_until_crisis reaches 0, a morale pressure narrative event fires (see 3-game-loop.md morale system).

Each role tag carries a priority tier that sets the expected touch floor:

Priority tierRole tagsExpected touches/game (floor)
Primaryball-handler, isolation-scorer, post-anchor, pick-and-roll-handler6+
Supportingpick-and-roll-screener, pick-and-pop-screener, handoff-screener, cutter, transition-initiator3+
Spacingfloor-spacer2+ (touch floor is lower; spacing value is presence, not initiation)

A player with multiple role tags uses the expectation of their highest-priority role.

Behavioral tags modify the function’s sensitivity:

TagEffect on mismatch function
high-maintenancegames_left_until_crisis decrements faster — less patient
team-firstgames_left_until_crisis decrements slower — more patient
veteran-leaderMismatch function suspended while morale ≥ 10 (Stable or above)
confidence-dependentgames_left_until_crisis decrements faster; morale cost on trigger is amplified

V1 uses a simple linear decrement: games_left_until_crisis starts at a fixed value (e.g. 5) when the first below-expectation game occurs, decrements by 1 per consecutive game below expectation (modified by behavioral tags), and resets to null when a game meets expectation. The “patience” value becoming compounded (incorporating morale history, season context, relationship tags) is an explicit later-phase improvement — the function signature supports it from day one.


QuestionNotes
Defensive role tagsResolved. See 13-defensive-schemes.md.
Role tag manual override UXHow the coach interacts with role tags mid-season (between-game decision slot). Not yet designed.
Role conflict resolutionWhen two players share a primary role (e.g. two ball-handler tags), the scheme fit warning is shown. Should the simulation penalise the scheme fit score? Deferred.
Touch counting methodWhat counts as a touch? Primary candidate in a possession? Ball handler in the action chain? Definition needs to be consistent with the attribution engine.