Last updated: Nov 24, 2025, 7:21 AM
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
swcAvatarUrltoavatarBlob(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-datawith turn-by-turn events, player stats, and detailed context metrics - 304 Not Modified caching (free, doesn't count against rate limits) using
If-Modified-Sinceheader - 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
- New API endpoint
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
v1for 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!
- Modified Caddy reverse proxy configuration to exclude image API endpoints (
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/upcomingand/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:
competitionTypequery parameter supportsALL(default),FRIENDLY,DIVISION,CONFERENCE,LEAGUE - HTTP Conditional Requests (RFC 7232) support using
If-Modified-Sinceheader- 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_MODIFIEDin GlobalConfig - Automatically updated when scheduled cron processes matches (every 15 minutes)
- Enables efficient polling for real-time updates without burning API quota
Last-ModifiedandCache-Control: public, max-age=900headers included in all responses- Rate limit headers accurately reflect usage after each request
- Comprehensive Swagger/OpenAPI documentation at
/api-docswith interactive "Try it out" functionality - Admin interface at
/admin/api-keysfor 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
- RESTful endpoints at
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/playersroute 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
- Full calendar view (
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
TimeZoneDisplaycomponent orformatTimeWithZones()utility for consistency
- Admin match management page now displays times in user's local timezone (was showing raw
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: 0being 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
- CRITICAL: Fixed
- SECURITY: Poll duplicate voting vulnerability:
- Removed anonymous polling feature that allowed unlimited duplicate votes due to
userId: nullbypassing duplicate detection
- Removed anonymous polling feature that allowed unlimited duplicate votes due to
- Player avatar consistency in match replay:
- ReplayArena now uses
getUserAvatarUrlhelper for consistent avatar rendering across lineup and review contexts
- ReplayArena now uses
- 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
playersInvolvedarray 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
currentEnergyvalues - 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
- Fixed energy synchronization bug where substitute players entering game had stale
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
BIGINTtoDOUBLEto 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
- Fixed systematic XP loss due to
- 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
trainingFocusfield allowing players to select one skill/attribute for passive XP gain over time - Added
lastXpUpdateTimefield 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
trainingFocusto multipletrainingFocuses(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
injuryRecoveryDateis 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.mdwith 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 & Guidebookpage added with commit hash tagging - Public
Changelogpage 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