Gauntlet Mode โ Implementation blueprint mapping GDD mechanics to existing Tekton Dash systems
All terms used in Gauntlet mode โ categorized by whether they're new, adapted, or already implemented in Tekton Dash.
A grid cell hit by the Candy Cannon that becomes impassable. Players stepping onto or pushed into a sticky cell are trapped. Remains until cleansed or round ends. Rendered as Layer 2 overlay (pink translucent mesh, ID 17).
TILE_STICKY = 17 โ GridMap Layer 21-second warning before cannon impact. Target cell glows pink/candy color with a shadow preview and charge-up sound. Uses temporary overlay tile (ID 18) on Layer 2, animated alpha 0โ1 over 0.8s, then replaced by Sticky Cell on impact.
TILE_TELEGRAPH = 18 โ rpc("sync_telegraph")Central NPC occupying a permanent 3ร3 zone at arena center. Fires volleys of 5 candy shots every 5 seconds, creating sticky cells. Static body โ cannot be grabbed, thrown, or interacted with. Not a Tekton โ it's a dedicated hazard entity.
CandyCannonController โ candy_cannon.tscnA batch of 5 simultaneous cannon shots fired at different target cells. One volley fires every 5 seconds (36 total over 3 minutes = 180 impacts). Each shot in a volley has an independent impact size roll (1ร1, 1ร2, or 2ร2).
_fire_volley() โ cannon_interval = 5.0The footprint of each cannon shot. Three sizes: 1ร1 (single cell), 1ร2 (two adjacent), 2ร2 (four cells square). Distribution changes per phase โ early favors 1ร1, endgame favors 2ร2.
phase_weights[phase_idx]["2x2"]Player state when standing on a sticky cell. Cannot move normally. Escape only via Cleanser power-up. Players can be trapped by stepping onto sticky, being pushed into sticky, or direct cannon hit. Trapped players keep their score but are out of active play.
trapped_players: Dict โ rpc("sync_trapped")Power-up earned by completing 2 missions. Allows 5 cells of movement through sticky candy, cleansing traversed cells back to walkable. Inventory limit: 1. Cannot activate while stunned. 0.3s activation delay.
player_cleansers[peer_id] โ GoalsCycleManager signalWhen two players activate Smack simultaneously (within 0.5s) and are in range of each other. Both get stunned for 1.0s, no push occurs, both smack bars are consumed. Server-authoritative timestamp comparison.
clash detection โ 0.5s window, server authority3-second window after Smack activation where the player model turns pink. If a target enters range during this window, the smack triggers. If no target is hit within 3s, energy is consumed with no effect.
smack_charged[player_id] โ 3.0s windowTargeting rules preventing the cannon from feeling random/cheap. No same-player twice in a row, 2ร2 never directly on player, path validation ensures escape routes exist (except final 30s). Uses AStar pathfinding.
last_targeted_player_id โ EnhancedGridMap.initialize_astar()Cannon targeting strategy (25% chance) that places sticky cells on pathfinding bottlenecks โ narrow corridors between sticky regions. Forces players to reroute. Calculated using EnhancedGridMap neighbor analysis.
_get_route_blocking_target() โ 25% weight20ร20 cell arena with 391 playable cells (400 minus 3ร3 NPC zone). Players spawn at outer edges/corners. Target: 80% sticky coverage by round end (313 cells), leaving ~78 safe cells.
ARENA_SIZE = 20 โ gauntlet.tscnGauntlet-specific melee push. Adapts existing try_push() from Attack Mode but replaces boost-meter gating with 8s auto-refill cooldown, adds 3s charged window, sticky landing trap, and clash detection. Push distance: 3 cells.
Three escalation phases in Gauntlet: Open Arena (0โ60s), Route Pressure (60โ120s), Survival Endgame (120โ180s). Adapts StopNGoManager's Go/Stop phase pattern but uses time-elapsed triggers instead of cycle signals.
enum Phase { OPEN_ARENA, ROUTE_PRESSURE, SURVIVAL_ENDGAME }Extends BotStrategicPlanner with Gauntlet-specific logic: telegraph awareness, sticky path planning, safe-zone pathfinding. Adapts existing bot movement heuristics to factor in shrinking arena.
BotStrategicPlanner โ new evaluate_gauntlet()Existing player state toggled via PowerUpManager when boost bar is full. In Gauntlet, not used directly โ replaced by Smack mechanic. The push physics from try_push() are reused but the activation logic differs.
Existing 1.5s movement disable after being push-attacked. Gauntlet's Smack uses a shorter 1.0s stun, but the underlying apply_stagger() function is reused with a duration parameter.
3ร3 pattern-matching tile collection system. Reused as-is from GoalManager + GoalsCycleManager. In Gauntlet, completing every 2 missions also triggers Cleanser unlock (new hook on existing signal).
GoalManager โ GoalsCycleManager.goal_count_updatedGridMap's Y=2 layer used for visual overlays (safe zones in Stop N Go, freeze in Freemode, highlights). Gauntlet uses it for Sticky Cell and Telegraph meshes. No conflict โ modes are mutually exclusive.
GridMap.set_cell_item(Vector3i(x, 2, z), id)Player push mechanic in PlayerMovementManager. Pushes target 3 cells backward. Gauntlet's Smack wraps this with direction-based push, sticky landing detection, and clash rules.
PlayerMovementManager.try_push(target, direction)Camera shake effect triggered via RPC. Used on cannon impact with "medium" intensity. Already implemented system-wide.
player.rpc("trigger_screen_shake", "medium")Arc-tween projectile from Tekton NPC. Candy Cannon reuses this exact visual pattern (spawn_projectile_rpc) โ creating a mesh, arc-tweening position, then freeing on arrival.
tekton.gd โ spawn_projectile_rpc(target, duration)Server-authoritative state sync via @rpc("authority", "call_local", "reliable"). All Gauntlet state changes (sticky, phase, trap, cleanser) use this identical pattern.
Global match timer from GoalsCycleManager. Gauntlet passes 180s duration. System handles countdown, HUD timer, and match-end trigger.
goals_cycle_manager.start_match(180.0)Handles power-up tiles, inventory, and effects. Gauntlet restricts certain powerups (like Stop N Go restrictions) and adds Cleanser as a new inventory slot via the existing signal/slot system.
SpecialTilesManager.inventory โ mode-based restrictionsHow GauntletManager slots into the existing manager tree, following the StopNGoManager pattern exactly.
How each GDD feature maps to existing systems โ showing what's reused vs what's new.
| GDD Feature | Existing System | Reuse | New Work |
|---|---|---|---|
| Game Mode Registration | GameMode.gd + LobbyManager | Direct | Add enum + strings |
| 20ร20 Arena | StopNGoManager._setup_arena() | Heavy | Custom layout, same API |
| Tile Collection / Scoring | GoalsCycleManager | Direct | Reuse as-is |
| Mission System | GoalManager + goals_cycle_manager | Direct | Same 3ร3 pattern matching |
| Timed Match | GoalsCycleManager.start_match() | Direct | Pass 180s duration |
| Player Movement | PlayerMovementManager | Direct | No changes |
| Powerup System | SpecialTilesManager | Partial | Cleanser = new type |
| Smack Mechanic | PlayerMovementManager.try_push() | Adapt | Modified push rules |
| Candy Cannon NPC | tekton.gd + TektonController | Pattern | New NPC, reuses projectile |
| Sticky Cells | StopNGoManager safe zone overlay | Pattern | New tile type, same layer |
| Telegraph VFX | VFXManager / animation.gd | Pattern | New animations, same system |
| HUD | StopNGoManager._setup_hud() | Direct | Mode-specific labels |
| Network Sync | RPC patterns | Direct | Same patterns |
| Lobby Settings | LobbyManager signal/sync | Direct | Gauntlet settings |
| Bot AI | BotController + BotStrategicPlanner | Adapt | Cannon avoidance strategy |
Three escalation phases that control cannon intensity and impact size distribution.
Deep-dive into the four new systems and how they integrate.
| Feature | Implementation |
|---|---|
| Visual | Layer 2 overlay โ transparent candy-pink mesh (ID 17) |
| Movement Block | PlayerMovementManager.simple_move_to() โ add sticky check alongside wall check |
| Trap on Step | GauntletManager._check_player_on_sticky() in _process() |
| Trap on Push | PlayerMovementManager.try_push() โ check landing cell |
| Cleanser Bypass | Temporary flag (like is_invisible wall bypass) |
| Network Sync | main.rpc("sync_grid_item", x, 2, z, 17) |
| Property | Current Attack Mode | Gauntlet Smack |
|---|---|---|
| Charge Source | Boost bar fills to 100 | 8s auto-refill cooldown |
| Activation | Toggle is_attack_mode | 3s charged window (pink model) |
| Push Distance | 3 cells backward | 3 cells in push direction |
| Stagger Duration | 1.5s apply_stagger() | 1.0s stun |
| Sticky Landing | N/A | Trapped on first sticky cell |
| Clash Rule | N/A | Both stunned, no push, bars consumed |
| Property | Value |
|---|---|
| Unlock Trigger | GoalsCycleManager.goal_count_updated โ count % 2 == 0 |
| Storage | GauntletManager.player_cleansers[peer_id] = 1 |
| Effect | 5 cells movement through sticky โ crossed cells become passable |
| Sync | rpc("sync_cleanser_state", peer_id, count) |
| Clear Sticky | main.rpc("sync_grid_item", x, 2, z, -1) |
| Inventory Limit | 1 per player |
| Roll % | Target Strategy | Purpose |
|---|---|---|
| 60% | Near a player (not same as last) | Direct pressure |
| 25% | Route-blocking bottleneck | Cut escape paths |
| 10% | Random non-sticky area | Spread coverage |
| 5% | Previously sticky / chaos | Unpredictability |
Core mode logic, phases, sticky cells, cleanser, smack
Cannon targeting, volley fire, telegraph
3D arena environment scene
Candy Cannon NPC (3ร3, static)
Add GAUNTLET = 3 enum, string mappings
Mode list, gauntlet settings, area mapping
Manager init, arena setup branch, start branch
Sticky check in move + push
Cleanser grant on 2nd goal
Gauntlet powerup restrictions
Add TILE_STICKY (17) and TILE_TELEGRAPH (18)
All sync follows existing RPC patterns โ no new networking paradigms needed.
| Data | Sync Method | Existing Pattern |
|---|---|---|
| Sticky Cells | main.rpc("sync_grid_item", x, 2, z, 17) | Safe zone / freeze overlay |
| Telegraph | rpc("sync_telegraph", targets_array) | StopNGoManager.sync_phase() |
| Phase Changes | rpc("sync_gauntlet_phase", idx, elapsed) | StopNGoManager.sync_phase() |
| Trap State | player.rpc("sync_trapped", true) | player.rpc("sync_stop_freeze") |
| Cleanser Grant | rpc("sync_cleanser", peer_id, count) | goals_cycle_manager.sync_goal_count() |
| Smack State | player.rpc("sync_smack_state", charged) | player.rpc("sync_modulate") |
| Cannon NPC | Static scene โ no movement sync needed | |
game_mode.gd, lobby_manager.gd, main.gd
gauntlet_manager._setup_arena(), 20ร20 grid
StopNGoManager._spawn_mission_tiles() pattern
5s interval, 5 shots, 1ร1 only
Layer 2 overlay, movement block, trap detection
Warning glow โ impact transition
1ร2 and 2ร2 shapes, phase weights
Modified push with cooldown/charge
Unlock tracking, sticky bypass
Player proximity, route blocking, anti-unfairness
Cannon avoidance, sticky path planning
VFX, SFX, HUD animations, 3D scene
GridMap Layer 2 used by freeze/safe overlays. Mitigated: Gauntlet mode is exclusive โ no freeze/safe tiles exist.
400 cells + overlays. Mitigated: Existing 23ร12 and 14ร14 arenas work fine; 20ร20 comparable.
Cannon could seal all paths. Mitigated: AStar pathfinding check before each volley.
IDs 17โ18 might exist. Mitigated: Verify max ID in .tres before adding.
Network latency affects clash detection. Mitigated: Server-authoritative timestamp, 0.5s window.