Back to Home

Changelog

Recent updates, fixes, and enhancements across Galactic Shockball League.

Last updated: Jan 4, 2026, 11:09 PM

2026-1-4

Fixed (Performance)

  • Training Mini-Game Load Times: Optimized database queries and configuration loading to reduce training start time from 15-20 seconds to <100ms for players with extensive training history.

2026-1-1

Fixed (Performance)

  • Match Scheduler Timeout: Increased Prisma transaction timeout from 10s to 20s and database connection pool from 20 to 40 to prevent timeout errors on match saves.
  • League Dashboard: Reduced page load time from ~3 seconds to <500ms by lazy-loading standings calculations after initial render.
  • League Matches Page: Added "Recent Matches (Last 6 Days)" section for quick access to current games, plus pagination with 30-item default page size.

2025-12-14

Added

  • Hype System: New time-based XP multiplier system helps new players progress faster. Rookie players (0-30 days) earn 1.35× XP, Rising Stars (30-60 days) earn 1.20× XP, and Established/Veteran players earn baseline 1.0× with no penalty. The system includes UI display on player cards.

2025-12-12

Simulation (V2)
  • Foul Probability Bug: Fixed a downstream issue from the RNG correction that was affecting foul calculations in tackles. Tackles were resulting in fouls far more often than intended due to incorrect RNG value range. This fix restores intended foul frequency based on player stats and randomness.
  • Injury Probability Bug: Fixed a downstream issue from the RNG correction that was affecting injury probability calculations during tackles. Note: do not expect to see injuries just yet as injuries require a wide strength differential which is why you haven't seen any/many.
  • Commentary Description Consistency: Updated foul event commentary to use engine-generated descriptions for consistency between simulation events and replay commentary.

2025-12-11

Fixed

  • Simulation Default Version Reset Bug: Fixed issue where the default simulation version for new competitions was being reset to v1 due to seed file overwriting admin setting.
  • Friendly Challenge Default Version Bug: Fixed issue where Friendly Challenge form did not pre-select the global simulation version, causing challenges to default to v1 instead of the current global default.
Simulation Engine (V2)
  • Evaded Tackle Counting Bug: Fixed issue where evaded tackles were incorrectly logged as successful tackles in match statistics, ensuring accurate tracking in Teams & Energy panel and team statistics.

2025-12-10

Fixed

Simulation Engine (V2)
  • RNG Probability Bug Fix: Fixed critical issue in SeededRandom where values were offset by +0.5, causing probability checks < 50% to fail and reducing "chaos" events (injuries, tipped passes).
  • Zero Advance Weight Fix: Fixed issue where players with pass_frequency + shoot_frequency >= 10 could never advance, preventing all tackle opportunities. Added situational override to allow tactical advancing when appropriate.
  • Stat Enrichment: Updated match simulation to use enriched player stats (XP/Levels) ensuring full data is available during gameplay calculations.

2025-12-08

Fixed

  • Match Simulation Timeout: Increased ORM's interactive transaction timeout from 5000ms to 10000ms to prevent timeouts during match simulations and sporadic network issues.
  • Match Replay Tackle Event: Fixed issue where Tackle events in Match Replay View Metrics were only showing tackled player stats, now correctly shows both tackler and tackled player stats, as well as energy and wall bonus.

2025-12-06

Added

  • Match Replay Tackle Event Tackle event View Metrics now shows both tackler and tackled palyer stats for deeper analysis.

Fixed

  • Re-upload Avatar Fix: Fixed issue where users were required to re-upload their avatar.
Simulation Engine (V2)
  • Tackle Resolution Fix: Tackle resolution system now correctly ties severity to player skill. Removed adaptive bonus formula that allowed low-skill players to produce disproportionately powerful tackles. Tackle outcomes now determined solely by stat differences and randomness, restoring skill-driven gameplay.

2025-12-01

Added

  • Roadmap Page - Added new Roadmap page to the website (/roadmap) showing the current roadmap for the game.
  • Mark User as Deceased - Admins can mark users as deceased from /admin/users, which terminates contracts, removes player from lineups/presets, and displays "In Memoriam" ribbon on trading cards.
  • Require re-assignment of Team Owner when setting owner to deceased - When a team owner is marked as deceased, the team owner role is removed and the team owner must be re-assigned to a new user.

Fixed

  • Match Replay Historical Players - Fixed issue where players who left a team (contract terminated, deceased, etc.) were not appearing in historical match replays; now includes all players who participated via match stats
  • SWC Name Change Login Bug - Fixed authentication failure when users change their character name in SWC; previous security check incorrectly treated legitimate name changes as security violations. Users can now log in after changing their SWC name.
  • Caddy Maintenance Page During Deployments - Added handle_errors directive to show maintenance page when upstream container is unavailable (not just when it returns errors); also removed 500 from maintenance trigger so application errors show proper messages instead of misleading "Deployment in Progress" page.

2025-11-26

Added

  • Team Standings UI Component - Added Team Standings component to League page (/league) below the existing cards, filterable by All, Conference, or Division.

Fixed

  • Beta Season v1→v2 Match Rollback - Fixed issue where 10 Beta Season matches were run as v1 instead of v2; added rollback script to reset matches to v2
  • Beta Season v1→v2 Match Re-run - Fixed issue where 10 Beta Season matches were run as v1 instead of v2; added re-run script to re-run matches as v2
  • League View - Fixed incorrect League Highlights card
  • League Matches Table - Change default Sort Order of Team Matches to show oldest matches first
  • Stun Effect Visuals - Fixed issue where stun effect visuals were not being cleared post-goal resets.

2025-11-25

Added

  • Team Statistics Filter - Added dropdown selector to Team Statistics on /team/me allowing users to filter stats by Exhibition, Season competitions (e.g., Beta Season), or All Time; defaults to current season competition if available

Fixed

  • Manager Delegation Input Visibility - Fixed contract amount input field being nearly invisible in dark mode by using proper theme-aware UI components
  • Matchmaking Algorithm - Fixed issue where matches were being scheduled with gaps due to the matchmaking algorithm (now uses Circle Method)
  • Broken HelpDoc links - Fixed broken hyperlinks to some pages throughout the helpDocs.
  • Dashboard Match Type Label - Fixed issue where exhibition matches were incorrectly labeled as "League Match Tomorrow" instead of "Exhibition Match Tomorrow" (now intelligently detects which)

2025-11-23

Fixed

  • Next15 Cookie loading - Fixed issue where cookie loading was not working correctly in Next15
Simulation Engine (V2)
  • Defender Dead Zone Fix - Defenders now correctly enter tackle range (targeting 8 units) instead of getting stuck at the edge (12 units)
    • Updated positioning logic to ensure defenders can close the final gap to attempt tackles
    • Fixes issue where defenders would track ball carriers without engaging in V2 matches

2025-11-21

Added

  • Trading Card Holographic Effects - Added CSS-based 3D tilt and holographic visual effects to player trading cards with glare and foil layers that respond to mouse movement; effects scale with player rarity (superstar/star/prospect) and respect accessibility preferences

2025-11-20

Fixed

  • Training Minigame - Fixed regression where game failed to start due to premature canvas check introduced in energy glitch fix

2025-11-19

Added

  • Exhibition Mode - Added "Exhibitions" view to League Dashboard allowing users to view exhibition matches separately from league competitions; player statistics now filter correctly based on competition type (FRIENDLY vs LEAGUE)

Fixed

  • Team Stats Accuracy - Included deflected shots (rebounds) in team save statistics and corrected save attribution to guards
  • Replay Score Display - Fixed issue where Replay Header score could be incorrect (e.g., 1-9 instead of 2-9) by improving score calculation logic to handle missing score data in event logs
  • Training Energy Glitch - Fixed bug where energy was consumed for training sessions that failed to initialize; implemented pre-flight validation to prevent energy deduction before safe start
Simulation Engine (V2)
  • Foul Stun Mechanics - Fixed simulation engine issue where foul stuns could be overwritten or cleared prematurely, and updated replay visualization to correctly show foul-induced stuns.

2025-11-11

Added

  • League Calendar Card - Added upcoming matches calendar card to league dashboard showing next 7 days of scheduled matches
  • League Matches Filtering - Added Team, Division, and Conference filter dropdowns to League Matches page for easier match discovery
  • Sortable Match Columns - Made Date, Division, and Status columns sortable in League Matches table
  • Team Schedule Tab - Added Schedule tab to team pages displaying team-specific calendar view of matches and events

Changed

  • League Matches Table - Improved match display with date/time formatting, better team layout (teams on sides with "vs" in middle), and clickable team names linking to team pages
  • League Matches Layout - Removed Competition column from matches table (redundant since viewing within a specific league)

Fixed

  • Match Replay Table Sorting - Fixed infinite re-render loop causing page freeze when sorting Match Data tab tables in Match Replay
  • League Competition Views - Fixed duplicate key errors when displaying League Competitions with teams from multiple conferences
  • Players Statistics View - Fixed Prisma serialization errors preventing Statistics tab from loading; implemented in-memory data joining and fixed column sorting
  • League Competition Match Generation - Fixed bug where matches were not being generated correctly for League Competitions

2025-11-09

Changed

Team Management
  • Lineup Presets - Removed 3-preset limit, improved save/update behavior with clearer button labels, and fixed preset persistence after updates
Simulation Engine (V2)
  • Pass Frequency Respect - Pass frequency of 0 now fully respected (no forced minimum pass weights)
  • Pass Fatigue System - Recent passes reduce pass likelihood (40% reduction per pass in last 3 turns, naturally limits excessive chains)
  • Enhanced Situational Awareness - Players strongly prefer advancing when they have open paths to goal instead of passing

Fixed

  • Database Connection Pool Exhaustion - Increased Prisma connection pool from 5 to 20 connections to prevent timeout failures under moderate load
    • Addresses Nov 7-8 production incident where users experienced 502/503 errors and forced logouts
    • Increased pool timeout from 10s to 30s to accommodate complex queries

2025-11-06

Changed

Simulation Engine (V2)
  • Conditional Guard Movement - Guards now adjust positioning based on opponent threat
    • Guards can move forward when opponents are not threatening the goal
    • Guards automatically retreat when opponents approach the goal
    • Creates more dynamic defensive positioning that responds to game state
  • Backward Passes for Possession Retention - Players can now pass backwards when tactically advantageous
    • Backward passes allowed when forward options are heavily defended or backward teammate has significantly better positioning
    • Forward passes remain preferred when options are comparable
    • Enables more realistic tactical play and better possession retention under pressure
  • Wing Lane Discipline - Left and right wings now maintain designated lanes with tactical flexibility
    • Left wings prefer left lane (y: 5-20), right wings prefer right lane (y: 40-55)
    • Wings can tactically cross over when ball carrier is on opposite side and support is needed
    • Prevents wing clustering by detecting when both wings are in same area and prioritizing width creation
    • Defensive phase allows looser lane discipline (marking opponents takes priority over lane position)

2025-11-05

Fixed

  • Add cache busting to Division/Conference images
Simulation Engine (V2)
  • Guard Wandering Regression - Fixed guards wandering too far forward, leaving goals exposed
    • Tightened positioning limits by low awareness, medium, high
    • Added defensive third safety constraint preventing guards from exceeding boundary
  • Tackle Decision Logic Enhancement - Tackle Frequency is now the primary factor in tackle attempts
    • Players with high Tackle Frequency will attempt tackles regardless of Aggression stat
    • Makes Tackle Frequency playstyle setting more impactful and consistent
    • Aggression now acts as a secondary modifier rather than equal partner in tackle decisions
Simulation Engine (V1 & V2)
  • Automatic Shooting in Goal Zone - Players now automatically shoot when very close to goal instead of running into the goal without shooting
    • Prevents players from advancing past the goal line without attempting a shot
    • Fixes issue where ball carriers would "hang out" in the goal zone waiting to be tackled
  • Stunned Player Blocking Fix - Fixed bug where stunned guards block shots, and stuns reset after goals
    • Stunned guards cannot block regardless of position (fixes issue where stunned players could still intercept shots)
    • Stuns clear when goals are scored to allow clean gameplay reset after scoring

2025-11-03

Fixed

  • Player Energy Recovery in Scheduled Matches - Fixed intermittent bug where some players started matches with low energy
    • Bug affected players who trained before a match but didn't log in before the scheduled match ran
    • Scheduled matches now properly calculate energy recovery (1 point per 6 minutes) instead of using stale values
    • Example: Player with 9.7 hours between training and match started at 4% energy instead of 100%
    • Most players were unaffected because logging in between activities updated energy correctly

2025-11-02

Changed

Simulation Engine (V2)
  • Guard Positioning Discipline - Guards now use Awareness stat for defensive positioning intelligence
    • High-awareness guards maintain strict defensive positioning near goal
    • Low-awareness guards may wander forward and leave goal exposed
    • Makes Awareness a critical stat for guards in V2 matches

2025-11-01

Added

  • Audio Accessibility for Training Mini-Game - Vision-impaired users can now play with audio guidance
    • Positional audio tones change frequency based on bar position (low/medium/high pitch for miss/good/perfect zones)
    • Haptic vibration feedback on mobile devices when entering perfect zone
    • Toggle controls with optional visual bar hiding for audio-only mode
    • Uses Web Audio API with 30% default volume (users control via device volume)
    • Improved to continuous proximity-based frequency gradient (200Hz → 1000Hz) for anticipation instead of reactive feedback,
    • fixed mid-game toggle bug when audio is toggled off/on

Changed

Simulation Engine (V2)
  • Tackle Range Adjustment - Balanced tackle frequency based on community feedback
    • tackle range adjusted from 8 units to 12 units (V1 unchanged at 20 units)
    • Addresses community reports of too few tackles in V2 (8 was overcorrection from 20)
    • Updated documentation to distinguish V2 and V1 tackle mechanics

Changed

  • Major Framework Updates - Upgraded to latest stable versions
    • Next.js 14.1.0 → 15.5.6, React 18 → 19.2.0, pixi.js 7.4.3 → 8.14.0
    • GitHub Actions updated: checkout@v5, setup-node@v6, docker/build-push-action@v6, ssh-action@v1.2.2
    • Updated react-markdown to v10, removed @types/bcryptjs (now has built-in types)
  • Galaxy Map Enhancements - Improved zoom/pan UX with smooth inertial scrolling
    • Territory borders now use Catmull-Rom Bezier curves for organic, rounded shapes
    • Smoother animation with spring physics (0.12 damping factor)
  • Dependabot Configuration - Automated dependency updates now grouped by version type (minor/patch together, major separate)

2025-10-31

Fixed

  • Team Venue images not being editable in /team/me view.
  • Fixed player avatar upload in production (missing SPACES_* env vars) and caching issues with timestamped filenames
  • Fixed team venue and logo image uploads not displaying immediately after upload (cache busting + path revalidation)
  • Fixed admin league edit navigation 404 error from leagues grid
  • Migrated all avatar display/update code from swcAvatarUrl to avatarBlob (15+ files) with backward-compatible JWT sessions

2025-10-30

Changed

  • Image Infrastructure Migration - All images now served from unified CDN for improved reliability and performance
    • Player avatars, team logos/venues, league/conference images consolidated to single source
    • Eliminates external image loading failures and improves page load times
    • Enhanced WebGL support for galaxy map team logo rendering

2025-10-29

Added

  • Interactive Galaxy Map Visualization - Dashboard map showing teams positioned on home planets
    • Smooth pan/zoom with team markers displaying logos and division color borders
    • Hover to enlarge (6x scale), click for team details popup with owner/manager/division/conference/faction info
    • Conference/Division filtering sidebar (desktop) and bottom sheet (mobile) with real-time map updates
    • Division territory overlay layer showing division-color-coded regions for each division (convex hull with padding)

Fixed

  • Galaxy map orientation (north/south inversion corrected)
  • Image proxy caching increased to 7 days to reduce external API rate limit errors (429)
  • Team popup accessibility warning and broken external image loading
  • Automatic background download of external team logos to blob storage to eliminate rate limiting
  • Duplicate logo downloads prevented with in-memory locking and debounce mechanisms
  • Team popup links in the galaxy map now correctly navigate to player pages (using Player ID) and division/conference pages
  • Conference images now display in galaxy map filter sidebar with proper vertical alignment

2025-10-28

Added

  • Match Replay Data Export and API - Access structured match data for external analysis
    • New API endpoint /api/v1/data/matches/{id}/replay-data with turn-by-turn events, player stats, and detailed context metrics
    • 304 Not Modified caching (free, doesn't count against rate limits) using If-Modified-Since header
    • Match Data Tab in replay UI with sortable, paginated tables for player statistics and event log
    • CSV Export System with separate exports for player stats only or events only
    • Shots Tracking - New database field with historical backfill from match events, tracked in v1/v2 simulation engines
    • Comprehensive OpenAPI documentation with example responses

Fixed

  • Player Statistics Accuracy - Teams & Energy panel now correctly aggregates stats from events
    • Passes: Only counts completed passes (not all attempts)
    • Blocks: Counts saves from SHOT events with save outcomes
    • Added INTERCEPTION event support for block counting
  • Admin Matches List - Added pagination (50 per page) and fixed sorting to show recent matches first

Documentation

  • Created future story: "Track Pass Attempts vs Completed Passes"

2025-10-27

Fixed

Simulation Engine (V2)
  • Player roster tracking: Benched players no longer incorrectly positioned or acting during matches
  • Energy loading: Player energy values now properly load from database instead of defaulting to 100%
  • Movement calculation: Player movement now correctly based on Speed stat with position role modifiers
    • Centers fastest, Guards moderate, Wings balanced
    • Movement speed increased ~11% (Speed/9 vs Speed/10) to prevent slow advancement causing excessive long-distance shots
  • Shot selection: Further penalized 40+ unit shots to discourage half-field shooting attempts
    • 40-45 units: 0.05× weight multiplier
    • 45-55 units: 0.02× weight multiplier
    • 55+ units: 0.005× weight multiplier (virtually eliminated)
  • Guard blocking range: Dynamic range scales with Speed and Blocking stats
    • Elite guards (high stats in both) can cover significantly wider angles
    • Players can't block beyond what they can physically reach
Simulation Engine (V1 & V2)
  • Guard blocking positioning: Guards must now be between shooter and goal to attempt blocks
    • Prevents unrealistic blocks from penalty box (behind goal)
    • Guards must be closer to goal than shooter and within blocking range of shot path
    • V1: Fixed 15 unit blocking range for all guards
    • V2: Dynamic range based on player stats (see V2 section above)
    • Creates tactical advantage when shooting with guard out of position
  • Stun mechanics persistence: Stunned players correctly remain stunned through goals and restarts
    • Stun effects (tackle cooldown timers) no longer cleared on goal/restart events
    • Reflects realistic recovery time needed after hard tackles
  • Substitution timing: Players no longer substitute during critical game moments
    • Both teams' substitutions suspended when ball in attacking/defensive zones (within 35 units of either goal)
    • Substitutions only occur in neutral middle third of field (x: 35-65)
    • Prevents immersion-breaking scenarios (guards subbed before shots, attackers pulled during scoring chances)

2025-10-25

Added

  • Simulation Versioning System - Multiple simulation versions can coexist for competitive stability and continuous innovation
    • Competition version lock-in: Each competition selects and locks simulation version for entire season
    • Match version stamping: Every match records which simulation version was used
    • Admin UI control to set system-wide default simulation version
    • Competition creation includes simulation version selector (defaults to GlobalConfig setting)
    • Exhibition match creation allows version selection for testing
    • Comprehensive documentation system (/docs/sim-versions/) with v1/v2 mechanics comparison
    • Version-specific test suites validate unique mechanics for each version
    • All existing matches and competitions automatically stamped as v1 for backward compatibility
    • Enables teams to test new simulation versions in practice matches without affecting competitive play

2025-10-22

Added

  • Contract Termination System - Two-way mutual agreement process for terminating player contracts
    • Team Owners/Managers can initiate termination for active contracts
    • Players can initiate termination of their own active contracts
    • Dashboard notifications display pending termination requests for both parties
    • 7-day response window with automatic acceptance if no response received
    • Players become free agents upon contract termination
    • Global activity feed tracks CONTRACT_TERMINATED events
  • Last Training Activity Column - Team Owners/Managers can now see when players last trained on the Team Contracts page
    • Displays relative time format (e.g., "1 week ago", "2 days ago", "4 hours ago", "Never")

Fixed

  • Match Replay Avatar Caching - Fixed excessive bandwidth consumption (~1GB) during match replay viewing
    • Modified Caddy reverse proxy configuration to exclude image API endpoints (/api/images/*, /api/team/images/*) from blanket no-cache rule
    • Player avatar images now properly cache with long-term headers (Cache-Control: public, max-age=31536000, immutable)
    • Eliminates avatar flickering and continuous reloading during replay playback
    • Reduces match replay bandwidth consumption by ~95% (from ~1GB to <50MB)
    • Special thanks to Kaire Nat-Sa for discovering and reporting this issue!

Security

  • Added GitHub Dependabot configuration for automated dependency updates and security vulnerability monitoring (npm, Docker, GitHub Actions)

2025-10-21

Changed

  • Exhibition Matches (/league/friendlies) now uses server-side pagination (10 items per page) with independent pagination for upcoming and completed matches, and scroll-to-section behavior to maintain user context during navigation.

2025-10-20

Added

  • Public Data API (v1) for external access to match schedules, results, and game information
    • RESTful endpoints at /api/v1/data/matches/upcoming and /api/v1/data/matches/recent
    • API key authentication system with bcrypt hashing and rate limiting (100 requests/hour per key)
    • Rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) included in all responses
    • Competition Type Filtering: competitionType query parameter supports ALL (default), FRIENDLY, DIVISION, CONFERENCE, LEAGUE
    • HTTP Conditional Requests (RFC 7232) support using If-Modified-Since header
      • Clients can send cached timestamp to check for data freshness
      • Server returns 304 Not Modified when data unchanged (no body, saves bandwidth)
      • 304 responses are FREE — don't count against rate limits (inspired by Eve Online ESI API pattern)
      • Match data freshness tracked via MATCH_DATA_LAST_MODIFIED in GlobalConfig
      • Automatically updated when scheduled cron processes matches (every 15 minutes)
      • Enables efficient polling for real-time updates without burning API quota
      • Last-Modified and Cache-Control: public, max-age=900 headers included in all responses
      • Rate limit headers accurately reflect usage after each request
    • Comprehensive Swagger/OpenAPI documentation at /api-docs with interactive "Try it out" functionality
    • Admin interface at /admin/api-keys for API key lifecycle management and usage monitoring
    • Public data filtering layer ensures no private Team Owner/Manager information is exposed
    • Designed for third-party integrations: stats sites, betting services, fan apps, Discord bots, mobile apps, and more
    • Note: API provides read-only access to public game data; betting operations are managed externally by third parties to maintain neutrality

2025-10-19

Added

  • In-depth simulation mechanics documentation for Passing, Shooting, Tackling, and Advancing
  • Playstyle Preferences documentation explaining how Pass/Shoot/Tackle Frequency sliders influence simulation action selection
  • Table of Contents with anchor links

Changed

  • Shot deflection commentary now credits guard (e.g., "Guard deflects Shooter's shot — creates a rebound")
  • Playstyle Frequencies UI improved: Changed from 0-100 to 0-10 discrete scale with tick marks, "Less Often"/"More Often" labels, and enhanced slider thumb

Fixed

  • Stats Tracking Bugs (Story 6.4):
    • Goals now generate both GOAL and SHOT events for accurate shot statistics
    • Saves now generate both SAVE and SHOT events for accurate shot statistics
    • Block stats now correctly credited to guard instead of shooter
    • Team shot totals now include all shot attempts including goals
  • DevOps:
    • Add a prune command for all unused Docker images (as opposed to only dangling)

2025-10-14

Added

  • Stunned player restrictions in match simulation:
    • Stunned players cannot make tackles while stunned
  • Trading card jersey number customization:
    • Players can now edit their jersey number (0-99) in the trading card customization modal

Changed

  • Remove TradingCard CRT-scanline effect filter layer
  • Calendar event display in Month/Week views:
    • Team names now show as first-letter acronyms for compact display
    • Match type badges show as single letters: "E" (Exhibition) or "L" (League)

Fixed

  • Calendar data caching optimization:
    • Month navigation now works correctly (added missing date prop to BigCalendar component)
  • Back button for Match Replay now works correctly in new tab
  • Prevent Recent Activities dashboard event duplication

2025-10-13

Added

  • Training focus privacy controls (outcome from 1st Poll):
    • Training focuses and active boosts now only visible to player owner and teammates
    • Non-teammates see only skill levels and XP progress
  • Stunned player restrictions in match simulation:
    • Stunned players cannot receive passes during stun duration (cooldown period after being tackled)
    • Stunned players cannot be substituted out while stunned, even with low energy
  • Match replay navigation:
    • Added Exit button to match replay interface for easy navigation back to previous page

Changed

  • Match replay commentary UI:
    • Commentary section now uses full available viewport height and compact layout for better space utilization
    • Scroll position preserved when switching between Commentary and Teams & Energy tabs
  • Exhibition matches (/league/friendlies) team names are now clickable links to team pages

Fixed

  • Training minigame energy exploit prevention:
    • Users can no longer refresh/reset during minigame to avoid energy costs
  • Players table Name column sorting on /league/players route now works correctly
  • Removed non-functional "View Match Details" button from Next Match section on /team/me (route doesn't exist for upcoming matches)
  • TimeZoneDisplay component prevented from breaking minification with invalid HTML nesting
  • Broken minigame for Safari browser fixed
  • Missing scroll for Teams & Energy panel in Match Replay

2025-10-12

Added

  • League Calendar UI component:
    • Full calendar view (/calendar) with Month, Week, Day, and Agenda views showing matches and custom events
    • Dashboard calendar card with upcoming events preview
    • Admin calendar management (/admin/calendar) for creating/editing custom events (CUSTOM, TEAM_FORMATION_DEADLINE, COMPETITION_START, COMPETITION_END, MAINTENANCE)
    • Timezone-aware display with user's local timezone indicator
    • Server-side caching with 5-minute TTL and smart invalidation for ~75% performance improvement

Fixed

  • Timezone consistency across entire application:
    • Admin match management page now displays times in user's local timezone (was showing raw toLocaleString())
    • Challenge accepted messages now show match date in user's timezone
    • Context card "Match Tomorrow" notification uses timezone-aware display
    • League matches list displays dates in user's local timezone
    • Competition detail match times show in user's timezone (both user and admin views)
    • Replay event timestamps use consistent 24-hour format
    • All date/time displays now use TimeZoneDisplay component or formatTimeWithZones() utility for consistency

2025-10-11

Added

  • Team player limits and substitute queue capacity controls:
    • Enforced maximum of 18 players per team with atomic validation to prevent race conditions
    • Limited substitute queues to 3 players per position (Center, Left Wing, Right Wing, Guard)
    • Contract offers automatically expire when teams reach capacity to prevent impossible scenarios
    • UI capacity indicators show "X/18 players" and "X/3 substitutes" with visual warnings when approaching limits
    • Comprehensive validation across player creation, contract acceptance, and team management flows
  • Energy substitution improvements for strategic rotation:
    • Benched players now show real-time energy recovery in match replays (TURN_UPDATE events include all players, not just active)
    • Multiple substitution capability: players can return to play after recovering to 60%+ energy (or their endurance-based max, whichever is lower), enabling continuous rotation
    • Outgoing players added to end of substitution queue for strategic rotation instead of one-time substitutions
    • Bench recovery rate increased from 2 to 3 energy per turn to prevent team-wide exhaustion
    • Enhanced performance penalties for very low energy (<10%): severe penalties incentivize substitutions
    • Lineup page energy tooltips now explain performance impact at different energy levels
    • Active player position badges (C, LW, RW, G) in Teams & Energy panel with accurate substitution tracking
  • Match Replay Data Display and Statistics Enhancement:
    • Goals (G) and Blocks (B) statistics now tracked and displayed in Teams & Energy panel
    • Game Summary component shows collapsible overview of goals (with scorer names and turns), shots, and fouls
    • Team Statistics Overview component displays match record, goals scored/conceded, and performance metrics on team management page
    • Info tooltip with player statistics legend (S, P, T, F, G, B abbreviations) next to Teams & Energy panel header
    • Player avatars now display inline within match commentary text for all involved players
    • Enhanced commentary includes goal scorer names and turn numbers for key events

Changed

  • Team management page (/team/me) layout improvements:
    • Team header (logo, name, venue, owner/manager, stadium) moved above tabs for persistent visibility
    • Team Statistics and Next Match sections moved above tabs to be always visible
  • Match commentary filtering:
    • Zero-unit advance events (< 0.5 units) now filtered from commentary to reduce noise
  • Admin matches view:
    • Recent Completed Matches now displays with newest matches at the bottom (chronological order)

Fixed

  • Critical energy system bugs affecting match simulation:
    • CRITICAL: Fixed currentEnergy: 0 being treated as falsy - Changed || to ?? operator to preserve 0 as valid energy value
    • CRITICAL: Fixed energy recovery reducing players above their endurance cap (e.g., 100% → 60% for 12 endurance) - Recovery now never reduces current energy, only caps gains at endurance * 5
    • CRITICAL: Fixed substitution rotation lockup where players couldn't be substituted back in after match begins - Players are no longer removed from team rosters during substitution, preventing "player not found" errors that blocked rotation
  • SECURITY: Poll duplicate voting vulnerability:
    • Removed anonymous polling feature that allowed unlimited duplicate votes due to userId: null bypassing duplicate detection
  • Player avatar consistency in match replay:
    • ReplayArena now uses getUserAvatarUrl helper for consistent avatar rendering across lineup and review contexts
  • Dark mode styling for challenge notifications:
    • All friendly challenge notification elements now properly styled with dark mode classes for readability
  • Save rebound events now include guard in playersInvolved array for proper stat tracking
  • Match commentary "View metrics" functionality:
    • Players can now see the "View metrics" behind why a tackle was resisted

2025-10-09

Fixed

  • Player energy display and substitution timing issues in match simulation:
    • Fixed energy synchronization bug where substitute players entering game had stale currentEnergy values
    • Fixed substitution event context to show actual low energy (<20) that triggered substitution instead of post-substitution values
    • Changed substitution threshold check to use canonical Map energy value instead of potentially stale player.currentEnergy
    • Eliminated impossible energy jumps (1% → 87% in 4 turns) through proper energy synchronization
    • Substitute players now correctly display high energy (95-100%) when resting on bench
    • Fixed critical "stuck ball" bug where ball carrier wasn't transferred when player with ball was substituted due to low energy
    • Fixed inaccurate Turn 0 energy display by logging initial player energy in MATCH_START event context
    • Fixed stale energy display by logging all active players' energy in TURN_UPDATE events every turn
    • Removed unreliable fallback logic in energy inference - now prioritizes per-turn energy snapshots from TURN_UPDATE events
    • Fixed substitute energy reset bug where players always entered at 100% regardless of recovery time - now preserves naturally recovered energy (e.g., player subbed out at 10% who rested 30 turns re-enters at 70%, not 100%)
    • CRITICAL: Fixed energy reset bug where players at 0 energy would jump to 99 the next turn - Changed || to ?? in reducePlayerEnergy to properly handle 0 as a valid energy value (not falsy)
    • Energy now flows naturally: deplete 1-5/turn while playing, recover 2/turn while resting on bench, capped at 0-100
    • Added 13 comprehensive energy validation and regression tests to prevent future regressions

Changed

  • Gameplay realism improvements:
    • Players actively carrying the ball cannot be substituted mid-possession - they complete their action (pass/shot/advance) before being eligible for substitution
    • This prevents unrealistic scenarios like swapping a player mid-dribble in basketball

2025-10-08

Fixed

  • Player count integrity violations in match simulation:
    • Fixed bug where substitutions could result in more than 4 players per side on field
    • Consolidated 4 separate player tracking systems into single source of truth architecture
    • SimulationEngine now delegates to GameState for player arrays instead of maintaining duplicates
    • Eliminated synchronization bugs between player tracking systems
    • Fixed energy recovery for substituted players while resting on bench

Changed

  • Dark mode toggle relocated from top navigation to Settings page for reduced screen real-estate usage
  • Recent Match Results cards now properly support dark mode with theme-aware styling
  • Public page (/) now always displays in light mode while preserving user theme preference on authenticated pages

2025-10-06

Added

  • Dark mode toggle functionality:
    • Desktop dark mode toggle with sun/moon icons in top navigation
    • Mobile dark mode toggle in floating top-right corner (replaces role badge)
    • Comprehensive dark mode styling across most components and pages

Changed

  • Role badge relocated to Settings page for better organization

2025-10-04

Added

  • Admin user list pagination, search, and filtering:
    • Search by name with real-time filtering
    • Filter by role or team
  • Editable custom Trading Card filters:
    • Players can now customize which stats and information appear on their trading cards

Fixed

  • XP calculation truncation bug:
    • Fixed systematic XP loss due to Math.floor() truncation in passive XP calculations
    • Converted XP storage from BIGINT to DOUBLE to support fractional XP accumulation
    • Players now receive exact fractional XP amounts (e.g., 0.4 XP) instead of losing partial XP
    • Resolves 5 reported cases where players lost XP due to truncation, especially with multi-skill training
    • Comprehensive testing added for edge cases including 8-10 focused skills scenarios
  • Passive XP display text bug:
    • Fixed bug where display of XP/hour was rounding to 1 decimal place, and always showing 0.3 for more than 6 skills focused. Now, rounding to 2 decimal places and showing the correct XP/hour for each skill.
  • Training minigame XP boost calculation:
    • Only perfect minigame scores (800 points) now receive the maximum 4x XP boost
    • Previously, any score 700+ received 4x boost; now 700-799 scores receive 3.5x boost
  • Team manager/owner links returning 404 errors on team pages:
    • Fixed broken navigation links to manager and owner profiles
  • Player playstyle frequency settings validation:
    • Players can now correctly set playstyle frequencies to zero values
  • Duplicate player activities for skill/attribute level-ups:
    • Implemented deduplication logic to prevent multiple activity entries for the same level-up event
  • Team Manager permissions for contracts and friendlies:
    • Team managers can now properly offer player contracts and schedule friendly matches
  • Friendly match acceptance notifications:
    • Fixed issue where friendly match acceptances displayed as "Admin xyz accepts..." instead of showing the actual accepting user's name

2025-10-03

Fixed

  • Excessive XP gain bug:
    • Players were able to gain XP at a rate of 10 XP/hour per skill when all 10 skills were focused simultaneously.
    • This was due to a bug in the XP system that allowed players to gain XP at a rate of 10 XP/hour per skill when all 10 skills were focused simultaneously.
  • Character creation min-maxing exploit:
    • Players could previously drop skills to level 0 during character creation to gain excessive budget points (43 points refund).
    • This allowed boosting other skills to level 20+ during creation, then cheaply fixing the sacrificed skill post-creation.
    • Fixed by setting minimum skill level to 5 during character creation, reducing maximum refund to 7 points.
    • Exploit advantage reduced from 39:1 XP ratio to 3:1 XP ratio - much more fair while preserving build flexibility.

2025-10-02

Added

  • Image Upload System with blob storage:
    • File upload support for team logos and venue images and player avatars (PNG, JPG, GIF, WebP up to 2MB)
    • Tabbed interface allowing choice between URL input and file upload
    • Backward compatible with existing URL-based images (blob storage takes priority, URLs as fallback)

2025-10-01

Fixed

  • Removed auto-refresh functionality from Players, Teams, Conferences, and Matches pages to prevent pagination and filter state from resetting.
  • Fixed team league membership display to show correct League hierarchy (Team→Division→Conference→League) instead of relying on active Competition status.
  • Enhanced team logo display with graceful fallback to placeholder when external images are blocked by CORS or mixed content policies.

Removed

  • Recent League Activity section from the League Dashboard page, including the non-functional "View All Activity" button.

2025-09-30

Added

  • Dashboard "Recent Activities" renamed "Your Activities":
    • now displays both Training Sessions and Skill/Attribute Level-Up events

Changed

  • Training session display now shows XP boost information instead of legacy points

2025-09-28

Added

  • Long-Term Player Progression System (XP-based):
    • Migrated player skills and attributes from integer values to Experience Points (XP) system
    • Skills and attributes now use BigInt XP values with calculated 0-100 levels using formula: level = floor(sqrt(XP / cost_factor))
    • Added trainingFocus field allowing players to select one skill/attribute for passive XP gain over time
    • Added lastXpUpdateTime field for just-in-time XP accrual calculations
    • Training mini-games now apply temporary percentage-based XP boost multipliers (1.5x to 4.0x based on performance)
    • Passive XP gain system provides continuous skill growth for focused skills at configurable rates (by Admin)
    • Active training boosts stack with passive XP gain for accelerated progression
    • Match simulation integration ensures XP values are converted to skill levels before gameplay calculations
    • UI displays calculated skill levels with XP progress bars showing advancement within current level
    • Global configuration system for tuning XP rates, boost multipliers, and progression balance (by Admin)
  • Distributed Passive Training System:
    • Players can now focus multiple skills simultaneously for passive XP gain
    • Total XP pool (2 XP/hour) is distributed evenly across all focused skills
    • Visual XP distribution indicator shows current allocation and rates
    • Strategic choice between specialization vs balanced development

Changed

  • Database schema migration converts existing integer skill values to equivalent XP amounts
  • Training system now provides temporary boosts instead of direct skill increases
  • Player creation and setup forms updated to work with XP conversion system
  • All player data enrichment functions now calculate skill levels from XP values
  • Training minigame UI improvements:
    • Removed non-functional passive training focus dropdown from training interface
    • Replaced misleading "Training Points Earned" with clear boost information
    • Updated training completion messages to explain boost mechanics
  • Database schema: migrated from single trainingFocus to multiple trainingFocuses (JSON array)
  • Player stat cards now support multiple training focuses with toggle functionality

2025-09-27

Added

  • Skill and Attribute Limits enforcement:
    • All player skills and attributes are now clamped to 0-100 range
    • Training system applies limits to both skill improvements and decay calculations
    • Training UI disables options for skills already at maximum value (100)
  • Player Injury System:
    • Players who receive MINOR or SERIOUS injuries during match simulations are persisted after the match ends.
    • An injuryRecoveryDate is automatically set in the database (3 days for minor, 7 for serious).
    • Players are automatically healed when their recovery date passes.
  • Injury status is now displayed on Player Trading Cards:
    • A text indicator (MINOR/SERIOUS) appears below the jersey number.
    • A tooltip shows the full injury status and the date of recovery.

Changed

  • Expanded GAME_RULES.md with new sections and images for "Player Creation", "Player Management", and the "Training Minigame".
  • The "Create a Team" button was removed from the Dashboard to reduce redundancy.
  • The public player profile page (/player/[id]) layout was adjusted to match the personal player page, preventing UI overlap.

Fixed

  • "League Highlights" will no longer be displayed on the league page if no matches have been completed.

2025-09-25

Added

  • Help system created with quicktip components implemented on Create Player, Player, and Dashboard pages
  • Public Rules & Guidebook page added with commit hash tagging
  • Public Changelog page added
  • Dashboard reminders linking to Rules and Changelog resources

Changed

  • Footer information links now include Rules & Guidebook and Changelog

Fixed

  • Player energy displays now refresh consistently across team, player, and training views

2025-09-24

Added

  • Team Manager Delegation and Ownership Transfer system with offer-based workflow
    • Team owners can delegate management responsibilities to any user
    • Team owners can transfer full ownership to another user
    • Recipients receive dashboard notifications to accept/reject offers
    • Contract terms include salary amount and duration (1-3 seasons) for manager roles
    • Staff Contracts table shows pending delegation and ownership offers
    • Manager role includes lineup, contracts, and preset management permissions
    • Atomic transactions ensure data consistency during role transfers

2025-09-23

Added

  • Database backup and restore scripts for production data management

Fixed

  • Training mini-game display and interaction issues:
    • Fixed "Decreased" skill results showing empty values instead of numeric changes
    • Fixed rapid clicking allowing multiple inputs per round causing "Invalid Game" errors

2025-09-21

Fixed

  • Mobile responsiveness issues across multiple components:
    • Player Setup: Fixed overflow with skill controls and cost indicator positioning
    • Player Dashboard: Resolved team info overflow with responsive layout and text truncation
    • Conferences Table: Fixed pagination controls overflow on mobile
    • Recent Match Results: Implemented horizontal scrolling instead of element compression
    • Bottom Navigation: Improved text readability and spacing

Changed

  • Standardized Create Player form cost indicator colors: green for decrements, yellow for increments
  • Recent Match Results now uses horizontal scroll with 700px minimum width

2025-09-20

Removed

  • Division rank field and index from database schema and all UI components
  • Beta Signup functionality completely removed from the application:
    • BetaSignup database table and migration
    • Beta signup form, pages, and server actions
    • Admin beta signups management interface
    • Beta signup email templates and confirmation functionality
    • Navigation links and middleware routes for beta signup

Changed

  • Replaced "Signup for Beta" buttons with "Create Your Player" buttons that trigger SWC authentication
  • Updated landing page FAQ to reflect new player account creation process
  • Removed beta-specific language from FAQ answers

2025-09-19

Added

  • Overall Rating (OVR) column to Players table with sortable functionality
  • Enhanced seed data with predefined SWC names, avatars, teams, and league structure
  • Admin user "Tholme So" with ADMIN role

Changed

  • Consolidated breadcrumb navigation on Conference and Division detail pages
  • Enhanced Conference detail page styling with larger images
  • Reordered Division Summary to appear above Division Cards
  • Made team names clickable links in Divisions table

Removed

  • Redundant "Back" buttons from Conference and Division detail pages
  • "Actions" columns from Divisions and Players tables
  • "Browse and Filter" section from Conferences view

Fixed

  • Conference routing issue
  • OVR column sorting functionality