Claude/new session zvx1pd - #388
Closed
Magenzuki1 wants to merge 58 commits into
Closed
Conversation
Standalone HTML/CSS/JS gacha-style game: 60 bananas (50 base + 10 secret) across 6 rarities plus a hidden secret tier, weighted random harvesting with a discreet pity system, a coin shop with escalating upgrade prices, a collection tracker with masked "???" cards for undiscovered bananas, stats page, and localStorage autosave with a confirmed reset. No backend required. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…be5n Add Banana Collector web game
- New "Pub" tab in the game: placeholder ad slot + a rewarded-ad button (5/day quota, +50 coins) with a clearly marked integration point for real AdSense (web) / AdMob (mobile) SDKs later. - New GitHub Actions workflow to publish banana-collector/ to GitHub Pages independently from the existing docs pipeline (manual one-time step still required: enable Pages with source "GitHub Actions"). - New banana-collector-app/ folder with a Capacitor project scaffold (package.json, capacitor.config.json, README) to wrap the same web code into iOS/Android app shells once native toolchains and store developer accounts are available. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…be5n Add ad tab, GitHub Pages deploy workflow, and Capacitor mobile scaffold
GitHub added this starter workflow automatically when Pages was enabled with source "GitHub Actions". It builds the whole repo (including the unrelated documentation content) as a Jekyll site and deploys it to the same GitHub Pages target as deploy-banana-collector.yml, silently overwriting the game's deployment on every push to main. Only the banana-collector workflow should own that Pages deployment. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…be5n Remove auto-generated Jekyll Pages workflow
- Banana coin values cut roughly in half to two-thirds across every rarity tier, so harvesting alone earns coins more slowly. - Shop upgrade prices raised (higher base price and steeper per-level multiplier) so improvements feel like a real investment. - Rewarded-ad payout raised from 50 to 300 coins, making the ad tab a meaningfully faster way to earn coins than grinding harvests alone. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…be5n Rebalance economy: lower harvest payouts, pricier shop, richer ad reward
Google requires a visible privacy policy before it will review an AdSense / Ad Placement API (H5 Games Ads) application. Adds a static privacy.html covering the two things this site actually does: localStorage-only save data (no server, no account) and third-party ad cookies once ads are enabled, with a link out to Google's own ad privacy controls. Linked from the game's Pub tab. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…be5n Add privacy policy page for ad monetization setup
Loads the AdSense verification/loader script (client=ca-pub-9149527152507322) in the game's <head> so Google can verify site ownership during the AdSense review. No ad units are served yet — this only unlocks the review step; actual ad placements come after approval. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…be5n Add Google AdSense site verification script
- Rare-and-above and secret bananas (38 total) no longer pair the 🍌 glyph with a second unrelated emoji (e.g. 🍌🥷). Each now renders as one fused character: worn accessories (headband, hat, visor, cape, crown, glasses...) are drawn in CSS and layered directly onto the same banana glyph, and aura-type bananas (fire, ice, cosmic, ghost, radioactive...) get a themed color filter + glow instead of a bolted-on icon. New bananaIconHTML() helper in ui.js drives all four render spots (last-banana card, both collection grids, epic overlay). - Harvest coin values raised roughly 60% from the last rebalance across every rarity tier (still below the original pre-nerf values). Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…be5n Fuse banana icons into single visuals, raise harvest coin values
- New "Mini-jeux" tab with two arcade additions, reusing the coin
economy and the fused-icon rendering system:
- Attrape les bananes: 30-second reflex round, catch falling
bananas (miss the rotten ones), coins scale with net score, best
score tracked and shown on the menu card.
- Roue de la fortune: one free daily spin on a 6-segment wheel for
a coin bonus (50 to 1000), resets at midnight like the ad quota.
- Replaced the formulaic hue-rotate(i*41+17) applied to all 22
commune/peu-commune bananas with curated per-banana filters and
small CSS accessories (spots, stripes, a tiny bow, a market price
tag...), matching the same technique already used for rare+
bananas. Fixes visibly incoherent results (e.g. "Banane rouge"
picking up a clashing green background) since arbitrary hue
rotation on the emoji glyph isn't safe for every angle.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…be5n Add two mini-games, fix incoherent commune/peu-commune banana colors
…jungle levels - Roue de la fortune: each of the 6 segments now displays its coin value directly on the wheel (radial labels that spin with the disc and land upright once it stops), instead of relying on color alone. - Attrape les bananes: restructured into 3 sequential 10s levels within one round. Each level raises spawn rate, fall speed, and rotten-banana odds over the last, with a jungle backdrop (leaf decorations, darkening green gradient per level) and a brief "Niveau N !" banner between levels. Total round length and scoring are unchanged — only the pacing is staged instead of continuous. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…be5n Show prize amounts on the wheel; split catch game into 3 speeding-up jungle levels
…vest card - Achievements: 18 milestones (rarity-tier sets, roll counts, secret bananas, mini-game scores, streak, combat) shown in the Statistiques tab, each granting a one-time coin reward via toast on unlock. - Daily login streak: escalating coin bonus (20 up to 150) on first visit each day, shown as a banner on load. - Combat: new "L'Arène des Ananas" tab. Pick a discovered banana as champion (attack/defense derived from its rarity), fight a auto-resolved single-round battle against one of 6 pineapple enemies with a win-chance formula from both sides' stats. Wins pay coins and unlock the next enemy; losses pay a small consolation and cost nothing. No separate stat system for the player to manage. - Shop: 3 new upgrades — auto-harvest (passive periodic roll), a coin multiplier applied to every coin source (harvest, ads, wheel, catch game, combat, achievements, streak), and extra daily ad slots. - Harvest reveal: replaced the small compact card with a large "hero" card (bigger glowing icon, rarity pill, actual coins earned) used only for the just-harvested banana; the compact collection-grid cards are unchanged. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…nbe5n Add achievements, daily streak, combat arena, shop upgrades, hero harvest card
…yle catalog - Collection doubled from 50 to 100 normal bananas (10 secret stay as the bonus tier): +12 commune, +10 peu commune, +10 rare, +8 épique, +6 légendaire, +4 mythique, all with unique names and, where relevant, worn accessories. - Replaced every accessory's raw inline background/clip-path/ border-radius with a small typed shape catalog defined once in CSS (band, peak-up/down/out-left/out-right, orb, ring, bubble) — each shape now has a built-in gradient sheen, soft rounded corners, and a drop shadow instead of reading as a flat rectangle or line. bananaIconHTML() picks the shape by `type` and colors it via --deco-color-a/-b; every existing decorated banana (rare and up, plus the accessory-bearing commune/peu-commune ones) was rewritten onto this system, not just the new bananas. - "Collection : X / 50" references updated to the new 100 total. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0129hLZ31V7ZdXCF3YhYZKgC
…nbe5n Add 50 more bananas, replace flat accessory shapes with a polished style catalog
… stages - Synthesized SFX via Web Audio API (sounds.js), no external audio files; respects a new mute toggle and never plays on page-load-only toasts. - Daily quests system: 3+ random quests/day from a pool of 9, tracked progress, auto-granted coin rewards, new "Quêtes" tab. - Two new shop items: Stratège de combat (+4% win chance/level) and Quête bonus (+1 daily quest/level). - Arena expanded from 6 pineapple-only stages to 60 stages across 10 fruit families (Ananas, Pomme, Clémentine, Poire, Fraise, Raisin, Pastèque, Kiwi, Mangue, Fruit du Dragon), each family stronger than the last — the first Pomme (stage 7) already outclasses the Roi Ananas boss. - PVE stage list now groups by family instead of one flat row; enemy glow color and icon size scale smoothly across all 60 stages.
…nbe5n Add sound effects, daily quests, new shop items, and expand PVE to 60 stages
…nbe5n Set custom domain bananacollector.fr for GitHub Pages
Ids were previously derived only from position in BANANA_DEFS (id: i + 1), recomputed on every load. Freezing them as an explicit field is a prerequisite for the upcoming Marché/PVP features, which will store banana_id references in an external database — a future reorder/insert in data.js would otherwise silently corrupt every stored reference. Behavior is unchanged: ids still run 1..110 in the same order as before.
…nbe5n Pin banana ids explicitly in data.js
Prerequisite infrastructure for the upcoming Marché (marketplace) and async PVP Arena: players can now optionally create a pseudo/password account (no real email required) to link their coin balance and inventory to a shared Supabase backend. Solo gameplay (harvesting, shop, mini-games, solo PVE arena) is completely unaffected and keeps working 100% offline without an account — this is strictly additive. - Supabase schema: profiles, player_bananas, wallet_ledger tables with RLS restricting every player to their own rows; a public_profiles view exposes only id+username for the future marketplace/matchmaking. - Pseudo/password signup via a synthesized internal email (RFC 2606 .invalid domain) + a handle_new_user trigger that creates the profile row atomically with the auth account. - Local-first sync (cloud.js): solo coin/inventory changes stay instant and offline-friendly; a debounced push reconciles against a wallet_ledger cursor so a stale local push can never clobber a server-side event (e.g. a future PVP attack) that landed in between. - A daily-value cap on future marketplace listings (schema only for now) bounds the damage a tampered local save could otherwise do to other real players once the marketplace ships. - New account UI: header button + modal (reusing the existing .modal pattern) for signup/login/logout, degrading gracefully with a clear message if the Supabase library fails to load (e.g. blocked by an ad blocker) — the rest of the game is unaffected either way.
…nbe5n Add optional player accounts with Supabase backend (Phase A)
Players with an account (from Phase A) can now list duplicate bananas for sale and buy listings from other players, backed by atomic Supabase RPCs so two buyers can never race the same listing and a seller can never oversell inventory they don't have. - Supabase: listings table + create_listing/cancel_listing/buy_listing RPCs, all security-definer and row-locked. Listing reserves the quantity immediately (restored on cancel); the daily market-value cap from Phase A now actually gates create_listing. Self-purchase is blocked. Verified end-to-end at the database level (partial buy, cancel refund, self-purchase block, cap enforcement, insufficient funds) since this sandbox can't reach the real Supabase client API. - cloud.js: wrapper functions for the new RPCs plus listing/username lookups (joined client-side against the public_profiles view, since PostgREST embedding doesn't apply to views). - New "🏪 Marché" tab (gated behind login, consistent with the existing tab-panel pattern): browse/buy active listings, and a sell view with a duplicate picker + "my listings" history with cancel. Local coins/inventory are mirrored immediately after each successful action, matching the plan's local-first design — no "while offline" case exists for inventory since only the player's own online actions ever change it.
…nbe5n Add the Marché (marketplace) — Phase B
Final piece of the Marché + PVP feature: players with an account can now set a 5-banana defense team (also used to attack) that defends even while they're offline, following the same single-roll auto-resolved combat philosophy as the existing solo arena. - Supabase: banana_catalog (a minimal id/rarity/value mirror of data.js, since combat math must run server-side and the DB has no other way to know a banana's stats), banana_combat_stats()/ team_power() ported line-for-line from bananaCombatStats() and fightFruitEnemy() in app.js, defense_teams, combat_log (doubles as the "while you were away" report feed), and the set_defense_team/ find_opponent/attack_player/mark_combat_log_seen RPCs. Matchmaking excludes teamless players, weights by team power, and has a 10-minute per-target cooldown to blunt farming. - Caught and fixed a real bug before shipping: combat_log originally stored one "coins_transferred" number, but a loss pays the attacker and defender two DIFFERENT amounts (20% lost vs 8% recovered) — split into attacker_delta/defender_delta so the defender's report shows the right figure. Verified with real win/loss fights, self-attack blocked, matchmaking band + cooldown exclusion, and report acknowledgement, all directly against the database (this sandbox can't reach the real Supabase client API). - New PVP sub-tab inside the existing "⚔️ Combat" tab (the solo 60-stage arena is untouched, just moved under a "🍍 Arène solo" toggle): multi-select team picker, "pendant ton absence" report cards, find opponent + attack flow. Local coins update immediately from the attacker's own delta; SFX/confetti reused from the solo arena. While testing, found a real player (magenzuki) had already created an account against the Phase A/B deploy with a legitimate ~151k-coin save synced correctly — left entirely untouched, only my own throwaway test accounts were cleaned up.
…nbe5n Add the async PVP Arena — Phase C
Diagnosed a real user report: PVP worked from a fresh account/browser but not from their main one. Verified the backend RPCs work correctly against their real data (tested set_defense_team with their actual owned bananas via direct SQL impersonation) — the server side was never the problem. The likely cause: browsers aggressively cache these unversioned <script>/<link> URLs, so after 3 rapid deploys (Phases A/B/C, each touching cloud.js heavily) an existing session can easily end up running a stale mix of files where newer HTML calls CLOUD functions an older cached cloud.js doesn't have yet. Append ?v=__CACHEBUST__ to every local script/style URL (not the external AdSense/Supabase CDN scripts, which manage their own caching correctly already) and have the deploy workflow stamp the real commit SHA into that placeholder before upload, so every deploy forces a fresh fetch of the exact files it shipped — no more manual hard-refresh dance for future updates.
…nbe5n Fix stale-cache bug behind "PVP doesn't work" report
Diagnosed against real player data: two accounts had both actually harvested real coins/bananas locally, but wallet_ledger was completely empty and one account's defense_teams row was still null despite them believing they'd saved a team. Root cause: local coins/inventory were only pushed to Supabase on a 4s-debounced timer after certain actions (or on tab-hide) — a player who logs in and immediately tries to buy/sell/set a team can hit the server before that first push ever fires, so it still sees a stale (often empty) balance/inventory and correctly-but-confusingly rejects the action. - signUp/signIn/init now push the local balance and inventory immediately (not debounced) right after linking, so a fresh or returning account is never out of sync with the server for even a few seconds. - Belt and suspenders: opening the Marché or PVP tab also pushes immediately before rendering, in case a long-idle logged-in session drifted since its last sync. Also, per user request: cancelled listings are now filtered out of "Mes annonces" for good instead of lingering there forever.
…nbe5n Fix false "insufficient funds"/"nobody found" from sync lag
Renames 100 existing banana ids in place (name + new image, ids kept frozen for the Marché/PVP Supabase references) and appends 5 brand-new bananas at ids 111-115, per the append-only id rule. A few names that referenced copyrighted characters or a real public figure were swapped for generic equivalents, and two internal name collisions with bananas whose old name/art was kept unchanged were resolved by renaming the new entry instead. ui.js now renders an <img> for any banana with an `image` field, with the existing emoji+CSS-deco system as fallback for untouched bananas. Also inserted the 5 new ids into the banana_catalog table in Supabase so PVP team-power calculations account for them.
…nbe5n Replace 100 banana visuals/names with new artwork, add 5 new bananas
The first extraction (cropped from an AI poster collage) left visible cell numbers and slight edge bleed. The user resent the 25 Commune bananas as a clean grid with no baked-in text, evenly separated by white gutters, so re-extracted by detecting the gutter bands directly instead of guessing fixed crop fractions. Same id mapping as before, just better source art.
…nbe5n Replace Commune-tier banana artwork with cleaner source images
…n sources
Same treatment as the Commune tier: re-extracted from clean grids the
user provided (no baked-in numbers/text), using row/column gutter or
content-blob detection instead of the original poster's guessed crop
fractions.
- Peu commune (ids 25-44): 19 of 20 re-extracted; id 38 ("Banane
veloutée") keeps its original art since this source grid had no
distinct velvety-textured candidate. Id 29's art changed from a
spotted pattern to a plain peeled banana, so renamed from "Banane
léopard" to "Banane pelée" to match.
- Rare (ids 45-64): straightforward 4x5 grid on a transparent-alpha
source, direct 1:1 mapping.
- Épique (ids 65-80, 112-115): 5x5 grid with several duplicate/alternate
poses (two "pharaoh-style" headdresses, three gold-samurai variants,
two Potter and two baby poses); picked the best-fitting/prettiest
version per name per the user's "no duplicates, take the nicest"
instruction.
- Légendaire (ids 81-90) and Mythique (ids 93-97, row 1 of 2): direct
grid mapping, no duplicates to resolve.
Verified via Playwright: all 105 image-backed bananas render with no
broken images after this swap.
…nbe5n Replace Peu commune/Rare/Épique/Légendaire/Mythique artwork with clean sources
Chaque emplacement de l'équipe de défense/attaque (5 combattants) a maintenant sa propre liste déroulante au lieu d'une grille de bananes cliquables, avec les stats ATK/DEF affichées dans chaque option et les bananes déjà choisies ailleurs désactivées pour éviter les doublons.
La suppression précédente n'avait touché que la table Supabase banana_catalog, jamais lue par le jeu : la Collection affichait donc toujours les 10 bananes concernées (démoniaque, divine, dimensionnelle, éternité, créatrice, invisible, présidentielle, multivers, ultime, infinie). Elles sont maintenant retirées de data.js, avec les compteurs de rareté et les tables de valeurs mis à jour en conséquence (Légendaire 12→10, Mythique 8→5, Secrète 10→5).
Le gain de victoire dans l'Arène PVE passe de enemy.reward à enemy.reward * 0.75. Le gain de défaite (auparavant 20% de enemy.reward) devient 8% du nouveau gain de victoire. L'aperçu de récompense affiché avant le combat suit désormais la même valeur réduite.
Nouvel onglet "🏆 Classement" avec 3 catégories consultables sans connexion : avancement de la collection, victoires/défaites en Arène PVP, et progression dans l'Arène des Fruits (PVE). Le joueur connecté est mis en surbrillance dans le tableau. Côté Supabase (migration phase_d_leaderboard) : nouvelles colonnes pve_stage/pve_wins/pve_losses sur profiles (la progression PVE n'était jusqu'ici jamais synchronisée hors ligne), une fonction sync_local_pve pour la pousser comme le solde/l'inventaire, et une fonction get_leaderboard (SECURITY DEFINER) qui agrège collection/PVP/PVE de tous les comptes cloud en une seule requête publique.
Arène PVP en listes déroulantes, rééquilibrage PVE, classement, nettoyage bananes
La suppression des 10 bananes sans image de data.js (commit bbb0927) cassait tout l'affichage (en-tête, collection, arène) pour tout navigateur ayant déjà collecté l'une d'elles : BANANAS_BY_ID[id] devient undefined et la moindre lecture de .rarity/.secret plante, laissant les compteurs statiques ("Collection : 0 / 100") et les grilles vides. loadState() nettoie désormais ces références orphelines (discovered, counts, lastBananaId, rarestId) au chargement.
Le bouton "Réinitialiser la sauvegarde" ne remettait à zéro que l'état local : un compte cloud lié gardait son ancien solde/inventaire/PVE en base, laissant le classement figé après un reset. Ajoute resetCloudProgress() (RPC reset_cloud_progress côté Supabase) appelé avant le reset local quand le compte est lié. Le classement affichait un total de 105 bananes (normales + secrètes mélangées) au lieu des 100 normales attendues, incohérent avec le reste du jeu qui distingue toujours les deux. get_leaderboard() retourne désormais collection_count et secret_count séparément (filtrés via banana_catalog.rarity, ce qui exclut aussi toute ligne fantôme de player_bananas). Ajoute enfin un rafraîchissement automatique du classement (toutes les 15s) tant que l'onglet reste ouvert, arrêté en le quittant.
harvest() ne déclenchait jamais CLOUD.scheduleSync() : une banane récoltée en solo ne remontait vers Supabase (donc vers le classement) qu'au prochain passage sur Marché/PVP ou à la mise en arrière-plan de l'onglet. La récolte est pourtant la source principale de nouvelles bananes — elle est maintenant traitée comme une action pertinente au même titre qu'un achat/une vente/un combat.
- "Accueil" renommé en "🎲 Tirage". - "🗂️ Progression" regroupe Collection / Quêtes / Mini-jeux. - "💰 Économie" regroupe Boutique / Marché / Pub. - "📋 Bilan" regroupe Classement / Statistiques. - "⚔️ Combat" inchangé. Chaque groupe garde ses sections d'origine intactes (mêmes ids, mêmes fonctions de rendu), simplement présentées comme des sous-onglets internes plutôt que des onglets de premier niveau, sur le même principe que Combat (Solo/PVP) déjà en place.
L'ancien fichier était mal recadré (chiffre "1" visible dans un coin, banane tronquée sur le bord). Remplacé par une version propre et bien cadrée du même visuel.
Même souci que la Banane agent secret : ancien fichier mal recadré (chiffre visible dans un coin, banane tronquée). Remplacé par une version propre du même visuel.
Cette secrète avait été retirée de data.js faute d'image (elle utilisait un simple effet CSS opacity). Elle revient avec une illustration dédiée (id 106, valeur 4800, cohérente avec l'ancienne donnée). La ligne banana_catalog correspondante est réinsérée côté Supabase pour que le classement la compte correctement.
Même souci que les précédentes : ancien fichier mal recadré. Remplacé par une version propre du même visuel.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.