Guardian Cards - UQcsse3200/2026-studio-3 GitHub Wiki

Guardian Cards

This page documents the Sprint 2 Guardian card set implemented by Team 6 Member 1.

Task: #160 — Guardian Cards and Card Library Standards

Related pages:

The Guardian set is attack-forward. It draws on the archive guardians' combat techniques: wide sweeping strikes, single-target punishment, suppression of enemy offence, and breaking through armour. The four cards are intended to give the player different offensive answers rather than four numerical variants of Strike.

The Four Cards

ID Name Cost Type Rarity Target Effects
warding_sweep Warding Sweep 2 ATTACK COMMON ALL_ENEMIES DAMAGE 4
sentinels_rebuke Sentinel's Rebuke 1 ATTACK UNCOMMON SINGLE_ENEMY DAMAGE 4, FEEBLE 1 (2 turns)
wardens_judgement Warden's Judgement 2 ATTACK UNCOMMON SINGLE_ENEMY DAMAGE 9
unseal_the_breach Unseal the Breach 1 ATTACK UNCOMMON SINGLE_ENEMY SUNDER 3, DAMAGE 2

All four card definitions are stored in cards.json.

Artwork is stored under source/core/assets/images/cards/ using the matching card ID as the filename.

Card Descriptions

Warding Sweep

Cost: 2 Target: ALL_ENEMIES Effect: Deal 4 damage to all enemies.

The set's area-damage option. Against a single enemy it is strictly worse than Warden's Judgement for the same cost; from two enemies onward it pulls ahead. This is the intended trade-off — the player is asked to read the encounter before committing the energy.

Compared with Strike: Strike is cheap single-target pressure. Warding Sweep costs more and hits everything, which matters against the multi-enemy encounters in the archive.

Sentinel's Rebuke

Cost: 1 Target: SINGLE_ENEMY Effects: Deal 4 damage, apply 1 Feeble for 2 turns.

A cheap tempo card combining immediate damage with suppression of enemy offence. FEEBLE reduces the target's damage output by 25% while active; the value field is not a stack count and does not scale the reduction.

This is the set's defensive-by-offence option: rather than gaining Block, the player reduces the incoming damage at its source.

Provisional. See Status duration integration below. The 2-turn duration does not currently expire.

Warden's Judgement

Cost: 2 Target: SINGLE_ENEMY Effect: Deal 9 damage.

The set's single-target damage payoff, using only the confirmed-working DAMAGE effect. It exists as the reliable high-damage option that carries no integration dependency — if every status-effect mechanic in the set were unavailable, this card still functions exactly as described.

Compared with Strike, it trades energy efficiency for burst: the player spends 2 energy and one card to remove a dangerous single target quickly.

Unseal the Breach

Cost: 1 Target: SINGLE_ENEMY Effects: Reduce the enemy's armour by 3, then deal 2 damage.

The set's armour-break option, and the card that introduces SUNDER.

Effect order matters here. takeDamage() resolves block → armour → health, so if DAMAGE resolved first it would be absorbed by the armour that SUNDER is about to remove. The effects array is therefore ordered [SUNDER, DAMAGE]: the armour is stripped first, and the 2 damage then lands on health. The card description reads damage-first for flavour, but resolution is armour-first.

Set Design

Card Main Role
Warding Sweep Area damage
Sentinel's Rebuke Cheap damage plus enemy-offence suppression
Warden's Judgement Single-target burst
Unseal the Breach Armour removal

A useful interaction within the set is Unseal the Breach into Warden's Judgement: strip the target's armour for 1 energy, then land 9 damage directly on health the following turn.

Sentinel's Rebuke covers the opposite situation — when the player cannot remove a threat quickly, reducing its output is the cheaper answer.

SUNDER Effect

SUNDER was introduced for Unseal the Breach.

Property Behaviour
Duration Instant effect
usesDuration() false
duration Must be 0
Valid target SINGLE_ENEMY
Effect value Amount of armour removed
Writes to CombatStatsComponent.armour — the same field Team 7's armour uses
Clamping setArmour() clamps at 0; armour cannot go negative

SUNDER is handled in both combat paths: BattleController.applyEnemyEffects() and Team1EnemyStateAdapter.applyEnemyEffects(). It is present in Team1EnemyStateAdapter.validatedEnemyEffects.

Known limitation: clearArmour() and resetBlock() have no production call sites, so armour removed by SUNDER does not currently return at end of turn. The reduction is effectively permanent, which is stronger than intended. This resolves once Team 3 wires the turn events.

Upgrade constraint: isCompatibleWithTarget() is called only from validateUpgradeEffect(), and for non-SELF targets it accepts only DAMAGE or effects where usesDuration() is true. SUNDER satisfies neither, so it cannot appear in an upgrade card's effects without a whitelist change. Base cards are unaffected.

Status Duration Integration

updateStatusEffects() in CombatStatsComponent has no production caller anywhere in source/core/src/main — verified 15 September 2026. A TODO at CombatStatsComponent.java:340 records that it still needs wiring to Team 3's turn event.

Consequence: POISON, VULNERABLE and FEEBLE durations do not tick down. Any card whose balance depends on a status expiring should be treated as provisional. Within this set that is Sentinel's Rebuke, whose Feeble is currently permanent for the rest of combat.

This is tracked as Team 7's #161.

Testing

GuardianCardsIntegrationTest covers JSON loading, field values, effects array order and CardValidator acceptance for all four cards. It deliberately does not cover combat resolution, which belongs to Team 5's effect-resolution tests.

The complete core test suite was run from source/:

./gradlew :core:test --rerun-tasks

Result: BUILD SUCCESSFUL, 878 tests.

Artwork

The four Guardian cards follow the shared Team 6 art standard — 1024 × 768, 4:3 landscape, illustration-only pixel art, no baked UI. See Card Art Specification.

Current Status

Implemented on task/guardian-cards. All four cards have configuration, artwork and test coverage in place.

Remaining work:

  • SUNDER behaviour re-check once Team 3 wires turn events
  • Sentinel's Rebuke balance re-check once #161 lands
  • final shared art consistency review with Member 4
  • merge into the Team 6 Sprint 2 feature branch

Implementation

Branch: task/guardian-cards

Card configuration: source/core/assets/configs/cards.json

Artwork: source/core/assets/images/cards/