- 06 Jun, 2026 15 commits
-
-
Mahmoud Aglan authored
Daily rewards: - Server now tracks streak, prevents double-claim, resets on missed day - GET endpoint returns current state (streak, claimed status, today's reward) - Updates profile daily_streak + last_daily_reward columns - Frontend fetches state from server instead of relying on local store Achievements: - New scene with category filters, progress bars, tier badges - POST check action recalculates all progress from player stats - game.php now tracks win_streak and checks achievements on game end - Rewards (coins/XP) auto-granted when achievement completes Challenges: - Claim tracking via economy_transactions prevents double-claims - Fixed column name (reason, not description) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Players can now fill all profile fields (bio, country, city, FIDE info) from their profile tab and apply for organizations with document proof. Also fixes avatar.php to use SERVICE_KEY for storage uploads. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Eliminate double polling: removed game.js own poller, use match-session's single 2s poll via handleLivePollData callback (halves network requests) - Send last_move (from/to/san/promotion) in game_state so opponent gets exact move data — fixes castling, en passant, promotion animations - Opponent moves now animate (piece slides) instead of board snap - Capture particles now fire on opponent's captures too - Castling sound+haptic plays for opponent's castles - Draw flow: sender sees "sent" confirmation, receiver sees accept/deny dialog (30s timeout), both sides see result via game_state merge - Emote dedup: timestamp tracking prevents repeated display on same emote - Emotes use correct emoji lookup (getEmojiForKey) instead of 3 hardcoded - Polling runs even during player's turn (emotes + draws must arrive anytime) - Game end detection covers draw result ('draw' + 'aborted') Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Draw offer now syncs: sender sees confirmation, receiver sees accept/deny dialog with 30s timeout - Emotes now show the correct emoji (was hardcoded to 3 mappings, now uses actual emote key lookup) - Emote dedup via timestamp tracking — no repeated display - game_state is now MERGED server-side instead of overwritten, so emotes don't wipe draw offers and vice versa - Polling runs regardless of whose turn it is (emotes/draws need to arrive during your own turn too) - Draw accept/decline response properly detected by offerer Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Apply radial-gradient mask for smooth vignette fade on all edges. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Replace shop tab with tournaments hub. Players can browse all tournaments, filter by status, register, and launch pending matches directly from the hub. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add chess piece upload UI to admin/branding.php (12 slots: white + black) - Fix loadPieceImages race condition in board renderer - Add tournament system module (Swiss, knockout, arena) - Add promo banner (1m×3m display) and video assets - Add 2-min display video script Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Fix: clicking friends tab now always shows friends scene (not notifications). Tab click resets to root when already active. - Friends list: sorted online-first, shows count, retry on error - Pending requests: fetches requester profiles (name, avatar, level) instead of showing raw UUIDs - Search: searches both username and display_name, debounced input - Online tab: auto-refreshes every 15s - Activity feed: timeAgo formatting, action icons - API: added 'profiles' action for batch profile lookups, search now matches display_name too Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The matches table requires these NOT NULL columns. Set match_type to 'tournament' and parse time_control string for clock values. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
PostgREST auto-decodes JSONB columns, so json_decode() fails when the value is already an array. Added is_array() checks before decoding. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- HUD badge on rank tab for pending tournament matches - Bracket API + horizontal scrollable bracket visualization (RTL) - Arena mode: join/seek/pair/play loop with live standings - Tournament lobby with countdown timer + player grid - Live tournament spectating with auto-refresh pairings - Format-specific tabs in tournament detail (bracket/arena) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Players can now play tournament matches from the app. Adds create-or-join API, realtime pairing notifications, auto-result reporting to Swiss API, and tournament-aware chess result screen. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 05 Jun, 2026 25 commits
-
-
Mahmoud Aglan authored
Categorized into Bullet, Blitz, Rapid, and Classical with Arabic labels: - Bullet: 1+0, 1+1, 2+1 - Blitz: 3+0, 3+2, 5+0, 5+3, 5+5 - Rapid: 10+0, 10+5, 15+10, 20+0, 30+0 - Classical: 45+45, 60+0, 90+30 Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Ad area now flex:1 (absorbs all dead space above the board). Hidden by default — only shown when an active campaign is loaded. Game UI pushed further down for thumb reach. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add ad banner slot in the dead space above the board - Move emote toggle button inline with player profile data - Emote panel now opens below player bar (no more fixed overlay) - Reduce top spacer to flex:0.4 so game sits near-center (slightly bottom-biased) - Add api/ads.php endpoint to serve active campaigns from ad_campaigns table - Ad system tracks impressions and filters by slot/game targeting Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Uses a flex:1 spacer div at the top of the layout instead of manipulating board container flex. On tall screens, dead space goes above the opponent bar — everything else stays packed at the bottom within thumb reach. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The justify-content:flex-end approach left dead space at top. Instead: keep flex:1 on board container (fills screen), use align-items:flex-end so the canvas sits at the bottom of its container. Emote button stays at fixed position off the board. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Portrait mobile games should have everything within thumb reach at the bottom. Removed flex:1 stretching and added justify-content:flex-end so the board, bars, and controls all stack from the bottom up. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Board content now aligns to bottom (thumb zone) instead of center. Emote button repositioned to fixed bottom-right, off the chess squares. Control buttons enlarged to 48px+ with safe-area padding. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Login: show brand logo via assetImg() instead of plain text, larger register link - Bot select: 44px back button, difficulty color bars, fallback initials when portrait fails - Chess board: raise max-width 400→500px, reduce padding — fills more screen - Chess controls: min-height 44px, better contrast (#e2e8f0), larger border-radius - Ludo board: raise cap 360→420px to fill available space - Ludo exit button: 44px circular touch target instead of rectangular - Tab bar items: min 44px touch targets with centered content - HUD bell button: 36→44px - Game menu: staggered entrance animation on buttons/chips - Fix 9px font in ludo panels → 10px minimum Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Ludo multiplayer: - Sync state to server on EVERY turn change (including no-valid-moves pass) - Use turn_count to detect stale vs fresh server state (prevents re-processing) - Non-host players poll at 1.5s and receive dice rolls + board state - Bot turns run only on host, results synced to server for other players - Fix double-encoding of game_state/positions in API - Play notification sound when turn returns to player Chess multiplayer: - Detect move type (check/capture/castle) from FEN diff on received moves - Show check highlight (red king square) for opponent's checking moves - Play correct SFX (check/capture/castle) instead of generic 'move' - Show last-move highlight squares for received moves - Skip polling during recovery to prevent SFX burst on reconnect - Track captured pieces from opponent's moves - Sync move list from server history Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Three critical multiplayer sync issues fixed: 1. Resign now notifies server (action:'resign') BEFORE ending locally. Opponent's polling detects status:'completed' + result and shows win. 2. Reconnect recovery completely rewritten: - Determines player color from match data (white_player_id vs userId) - Flips board correctly for black - Sets lastKnownMoveCount from server to prevent duplicate move processing - Detects if game already ended while disconnected (opponent resigned) - Restores canSelect with correct color check 3. sendLiveMove now includes clock times (white_time_remaining_ms, black_time_remaining_ms) so opponent sees accurate clocks. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Panel positions: - Forced direction:ltr on panel rows so Green=top-left, Yellow=top-right, Red=bottom-left, Blue=bottom-right — matching the board zones visually. (The page is RTL Arabic which was reversing element order.) Exit button: - Added exit button (✕) next to dice area - Single player: confirms then ends game as loss - Multiplayer: notifies server to replace player with bot, then exits - Confirmation dialog prevents accidental exits Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Problem 1: Reconnection reset board to starting position - engine.create() always starts fresh - FIX: if params.recovered, fetch match from server → engine.load(current_fen) - Also restores clock times + determines whose turn from FEN Problem 2: Opponent name stuck on 'جاري التحميل' - params.opponentId was undefined (not passed on reconnect or matchmaking) - FIX: if no opponentId in params, fetch match → get white/black_player_id → find opponent - Uses fetchAndRenderOpponent() helper to update avatar/name/level Problem 3: Other player can't see moves after reconnect - This was because board reset to start position - Now board loads current_fen from server → correct position displayed - Polling continues from correct move_count Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Emotes now pop up next to the player panel that sent them and gently float up in place before fading. Duration increased from 1.8s to 3s. Multiplayer sync unchanged — still uses sendEmote/onEmoteReceived. Bot emotes in ludo also use the new positioned animation. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Ludo: - Each panel shows: avatar (photo/bot
🤖 ), name, level - YOUR panel shows your profile photo + display_name + level - Bot panels show🤖 emoji with colored border matching their zone - Panel positions already match zone colors (Green TL, Yellow TR, Red BL, Blue BR) Chess: - Opponent bar: photo (bot portrait for bots, profile pic for humans) + name + level - YOUR bar: your profile photo + display_name + Lv.X - Gold border around your avatar, blue border around opponent's - Live mode: fetches opponent profile → updates avatar, name, level dynamically - Bot mode: shows Stockfish portrait + bot name + 'بوت' label Both games now feel player-centric — you always see WHO you're playing against with their real identity, not generic 'Opponent' or 'Bot 1' text. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Chess game scene: - Imports and calls matchLive.start(matchId, 'chess', callbacks) - Creates localStorage entry → browser refresh auto-resumes - matchLive.session.destroy() on endGame → clears recovery Ludo game scene: - Same pattern: matchLive.start(matchId, 'ludo', callbacks) - Clears session on endGame Now the flow works: 1. Player enters live game → matchLive.start() saves to localStorage 2. Player refreshes browser → engine boot finds recovery → verifies server → auto-rejoins 3. Game ends normally → matchLive.session.destroy() clears localStorage 4. Player goes to homepage after game → no recovery popup (correct) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Self-hosted Supabase Kong requires apikey param even for public bucket URLs. Without it, browsers get 401 when loading the image. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Supabase Storage requires both Authorization and apikey headers. The missing apikey caused "No API key found in request" → 500 on upload. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Standard Ludo board: Green(TL), Yellow(TR), Red(BL), Blue(BR) Player order: 0=Red(BL), 1=Green(TL), 2=Yellow(TR), 3=Blue(BR) Path is now CLOCKWISE: - Red enters from bottom center going UP - Green enters from left center going RIGHT - Yellow enters from top center going DOWN - Blue enters from right center going LEFT All positions recalculated from scratch: - SHARED_PATH: 52 squares going clockwise matching reference image - HOME_COLUMNS: each player's 6-square run toward center - HOME_BASES: pieces start in correct corners - START_SQUARES: [0, 13, 26, 39] with correct global positions - Center triangles: point toward center from each player's side - Home zones: correct corner colors - Panel positions: match board layout spatially Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Replace finfo_open with simpler mime_content_type(). Add global exception/error handlers that return JSON instead of HTML error pages. Include curl errors and storage HTTP codes in error responses for debugging. Remove fileinfo from Dockerfile (already bundled in PHP 8.3). Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Add upload_max_filesize=10M to PHP config (default 2M was rejecting compressed images). Add fileinfo extension explicitly. Improve error messages in avatar.php to report the actual failure reason. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Resize any image to 512x512 center-cropped JPEG at 82% quality before uploading. Handles huge photos from phone cameras that would fail or timeout on upload. Removes the 5MB size gate since compression brings all images to ~50-150KB. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The player order was wrong — Blue was assigned to Green's position and vice versa. On a standard Ludo board going clockwise from Red (top-left): Red(TL) → Green(BL) → Yellow(BR) → Blue(TR) Fixed: - COLORS order: red, green, yellow, blue (was red, blue, yellow, green) - HOME_BASES: matched to correct corners - HOME_COLUMNS: Green enters from left, Blue from right - HOME_ENTRY: correct global squares for each player - Center triangles: Red(top), Green(left), Yellow(bottom), Blue(right) - Home zone drawing: correct corner positions - Player panels: top row = Red(TL) + Blue(TR), bottom = Green(BL) + Yellow(BR) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-