Balatro-Multiplayer / Balatro-Multiplayer/BalatroMultiplayerAPI

Ban-pick: weighted tuple pool policy per gamemode (Botlatro generation parity)

Ouverte
#13 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Lua
Étoiles
7
Forks
3
Merge moyen
4 h 42 min
PR mergées (30 j)
4

Description

The ban-pick engine's default pool is a uniform random sample of every installed deck Back — including modded decks — with no exclusions, no weights, and no stake dimension. Botlatro (the Discord matchmaking bot) already runs real pool policy for its tuple-ban queues; this issue is about giving consumer mods the same power in-game, per mod and per gamemode.

## Reference: what Botlatro's generation enforces (`src/utils/TupleBans.ts`)

- Allowed stakes: a fixed subset (White/Green/Black/Purple/Gold — 5 of 8).
- Allowed decks: `decks` table minus per-queue `banned_decks` minus match-step bans.
- Weighted roulette-wheel selection via per-queue `deck_mults` / `stake_mults`.
- Occurrence caps in the generated list (9 tuples): max 4 of any stake (`< (tupleCount-1)/2`), max 3 of any deck (`< (tupleCount-3)/2`), no duplicate (deck, stake) pairs.
- White-stake guarantee: if the final slot is reached with zero whites, it is forced white — every list contains at least one.
- All of it is data-driven (DB tables) so moderators tune weights/bans live, without a deploy.

## Proposal

1. **A reusable weighted-tuple pool helper in the API** (opt-in, e.g. `MPAPI.BanPick.build_weighted_pool(policy)`), implementing the constraints above and returning `{ key, stake }` items. The engine already supports everything downstream of it: pool items may be `{ key, stake, ... }` tables, and `config.decorate_tile(card, item)` renders stake stickers — no engine changes needed.
2. **Policy comes from the consumer, per gamemode** — each mod passes its own policy into `BP.start` via `build_pool`, exactly like `schedule`/`decorate_tile` today. PvP and Speedrun configure independently.
3. **Policy data should be server-deliverable** (gamemode config in the match/lobby payload, keyed by `modId + gameMode`) so allowed lists/weights can be tuned like the bot's DB-backed mults — without shipping mod updates. Client-side defaults as fallback.

## Notes

- Sampling differs today: the in-game default samples decks without replacement (each deck once); tuple pools intentionally allow one deck at multiple stakes. Both remain valid choices per gamemode — the helper covers the tuple case, the current default stays for plain drafts.
- Related: the low-rated-player pool veto (see linked issue) depends on this — its mercy rule ("force white stakes into the reroll") only has meaning against a weighted tuple pool.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Piste de recherche

Commencez par localiser le point d’entrée BP.start du moteur de ban-pick, son pool par défaut actuel et l’intégration de build_pool/decorate_tile. Utilisez src/utils/TupleBans.ts comme référence comportementale pour la génération de tuples pondérés et les contraintes. La tâche est terminée lorsque les politiques des consumers fonctionnent par mod et gamemode, avec une configuration livrable par le serveur et des valeurs par défaut côté client comme décrit.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
lua
Domaine
api
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.