120 lines
5.2 KiB
Markdown
120 lines
5.2 KiB
Markdown
# Game Configuration Panel
|
|
|
|
## Summary
|
|
|
|
Add a configuration panel above the "Commencer une partie" button on the homepage, allowing players to customize game generation parameters before starting.
|
|
|
|
## Parameters
|
|
|
|
### Films vus (toggle on/off)
|
|
|
|
- **Visible only** for authenticated users
|
|
- Default: off
|
|
- When enabled: all actors in the grid (main actor + hint actors) must appear in at least one film marked as watched by the user
|
|
- When disabled: no filtering, any actor can appear
|
|
|
|
### Paramètres des indices (checkboxes)
|
|
|
|
Three checkboxes controlling which hint types can appear in the grid:
|
|
|
|
- **Film** (default: checked) — hint shows a film the actor appeared in
|
|
- **Rôle** (default: checked) — hint shows a character name the actor played
|
|
- **Récompense** (default: checked) — hint shows an award the actor received
|
|
|
|
**Constraint:** at least one must remain checked. The UI prevents unchecking the last one.
|
|
|
|
### Récompenses (multi-select checkboxes)
|
|
|
|
- **Visible only** when "Récompense" is checked
|
|
- Lists all `AwardType` entities that have 5+ distinct actors in the database
|
|
- A "Toutes les récompenses" option at the top that toggles all
|
|
- Default: all checked (= "Toutes" checked)
|
|
- Unchecking an individual item unchecks "Toutes"; rechecking all rechecks "Toutes"
|
|
- Selected AwardType IDs are sent as `award_types[]` in the form POST
|
|
|
|
## UI Layout
|
|
|
|
```
|
|
┌─────────────────────────────────┐
|
|
│ Films vus [ toggle ] │ ← auth users only
|
|
├─────────────────────────────────┤
|
|
│ Paramètres des indices │
|
|
│ │
|
|
│ ☑ Film ☑ Rôle ☑ Récompense│
|
|
│ │
|
|
│ Récompenses : │ ← visible if Récompense checked
|
|
│ ┌───────────────────────┐ │
|
|
│ │ ☑ Toutes les récomp. │ │
|
|
│ │ ☑ Academy Awards │ │
|
|
│ │ ☑ Golden Globes │ │
|
|
│ │ ☑ César │ │
|
|
│ │ ... │ │
|
|
│ └───────────────────────┘ │
|
|
├─────────────────────────────────┤
|
|
│ [ Commencer une partie ] │
|
|
│ │
|
|
│ Connectez-vous pour importer...│
|
|
└─────────────────────────────────┘
|
|
```
|
|
|
|
## Form Fields
|
|
|
|
All parameters are fields within the existing start game `<form>`:
|
|
|
|
| Field name | Type | Value |
|
|
|---|---|---|
|
|
| `watched_only` | hidden + checkbox | `"1"` if checked, absent otherwise |
|
|
| `hint_film` | checkbox | `"1"` if checked |
|
|
| `hint_character` | checkbox | `"1"` if checked |
|
|
| `hint_award` | checkbox | `"1"` if checked |
|
|
| `award_types[]` | checkbox (multiple) | Array of AwardType IDs |
|
|
|
|
## Backend Changes
|
|
|
|
### HomepageController
|
|
|
|
- Query `AwardTypeRepository::findWithMinActors(5)` to get eligible AwardType list
|
|
- Pass to template for rendering the multi-select
|
|
|
|
### GameController (POST /game/start)
|
|
|
|
- Extract config parameters from the Request
|
|
- Pass config to `GameGridProvider::generate()`
|
|
|
|
### GameGridProvider::generate()
|
|
|
|
Receives a config array/object with:
|
|
|
|
- `watchedOnly` (bool) — filter actors to those in user's watched films
|
|
- `hintTypes` (array) — subset of `['film', 'character', 'award']` based on checked boxes
|
|
- `awardTypeIds` (array|null) — list of selected AwardType IDs, null = all
|
|
|
|
Generation logic changes:
|
|
|
|
- **Actor selection:** if `watchedOnly` is true, only pick actors with a MovieRole in a film watched by the authenticated user
|
|
- **Hint selection:** only use hint types present in `hintTypes`
|
|
- **Award hints:** only pick awards whose AwardType ID is in `awardTypeIds`
|
|
- **Retry mechanism:** if generation fails (cannot find a valid hint for every row), retry up to 5 times. After 5 failures, redirect to homepage with a flash error message explaining the grid could not be generated with the chosen parameters.
|
|
|
|
### AwardTypeRepository
|
|
|
|
New method: `findWithMinActors(int $minActors): array` — returns AwardType entities having at least `$minActors` distinct actors.
|
|
|
|
## Frontend Changes
|
|
|
|
### Stimulus controller: `game-config`
|
|
|
|
Registered on the config panel container. Handles:
|
|
|
|
1. **Award section visibility:** show/hide the AwardType checkbox list when "Récompense" is toggled
|
|
2. **Minimum one hint type:** prevent unchecking the last remaining hint checkbox
|
|
3. **"Toutes les récompenses" toggle:** check/uncheck all AwardType checkboxes; sync state when individual items change
|
|
|
|
### CSS (in app.css)
|
|
|
|
- **Toggle switch:** CSS-only using `appearance: none` on checkbox, `::before` pseudo-element for the sliding circle, `--orange` when active, `--border` when inactive
|
|
- **Hint checkboxes:** `accent-color: var(--orange)`
|
|
- **AwardType list:** border `var(--border)`, `border-radius: var(--radius-sm)`, `max-height: 150px`, `overflow-y: auto`
|
|
- **Section labels:** `color: var(--text-muted)`, `font-size: 13px`, `text-transform: uppercase`
|
|
- No new CSS or JS files — everything in existing `app.css` and a new Stimulus controller file
|