Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "leapmultix-skill-game-mode",
|
||||||
|
"description": "Skill game-mode from LeapMultix",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": {
|
||||||
|
"name": "Julien LE SAUX",
|
||||||
|
"email": "contact@jls42.org"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./skills"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# leapmultix-skill-game-mode
|
||||||
|
|
||||||
|
Skill game-mode from LeapMultix
|
||||||
45
plugin.lock.json
Normal file
45
plugin.lock.json
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:jls42/leapmultix:leapmultix-marketplace/skills/game-mode",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "fe6cefea87fda8e75c1ab849ac5e06773f369227",
|
||||||
|
"treeHash": "c44d0ad20c41809149d199dede2aa0770411cc92d63c1ee77c1dc4099096acb8",
|
||||||
|
"generatedAt": "2025-11-28T10:19:12.730335Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "leapmultix-skill-game-mode",
|
||||||
|
"description": "Skill game-mode from LeapMultix",
|
||||||
|
"version": "1.0.0"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "14c150ac4cd539007f513153aff0ad48de4a6fb562217392e845930b621c7a9d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "8bbdcf5f4b0db276654c14038f5fe7decd3ecf05a23ab8f021bdb3abf8644321"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/game-mode/SKILL.md",
|
||||||
|
"sha256": "16786958e57665705b8d61d2ee8f68333f049ffabacf09304a43007afa8f9804"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "c44d0ad20c41809149d199dede2aa0770411cc92d63c1ee77c1dc4099096acb8"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
220
skills/game-mode/SKILL.md
Normal file
220
skills/game-mode/SKILL.md
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
---
|
||||||
|
name: creating-game-modes
|
||||||
|
description: Creates new game modes by extending the abstract GameMode.js class with lifecycle management, event bus, and lazy loading
|
||||||
|
allowed-tools: Read, Write, Grep, Glob, Bash
|
||||||
|
---
|
||||||
|
|
||||||
|
# New Game Mode Creator
|
||||||
|
|
||||||
|
Guide la création de nouveaux modes de jeu suivant l'architecture établie du projet.
|
||||||
|
|
||||||
|
## Table des matières
|
||||||
|
|
||||||
|
- [Quand utiliser](#quand-utiliser)
|
||||||
|
- [Architecture des Game Modes](#architecture-des-game-modes)
|
||||||
|
- [Workflow de création](#workflow-de-création)
|
||||||
|
- [Patterns et conventions](#patterns-et-conventions)
|
||||||
|
- [Checklist de création](#checklist-de-création)
|
||||||
|
- [Debugging](#debugging)
|
||||||
|
- [En cas de doute](#en-cas-de-doute)
|
||||||
|
- [Références](#références)
|
||||||
|
|
||||||
|
## Quand utiliser
|
||||||
|
|
||||||
|
- Création d'un nouveau mode de jeu
|
||||||
|
- Extension de la fonctionnalité arcade
|
||||||
|
- Ajout de variantes de modes existants
|
||||||
|
- Migration de code legacy vers pattern GameMode
|
||||||
|
|
||||||
|
## Architecture des Game Modes
|
||||||
|
|
||||||
|
### Principes fondamentaux
|
||||||
|
|
||||||
|
**Héritage** : Tous les modes héritent de `GameMode` (classe abstraite)
|
||||||
|
|
||||||
|
**Communication** :
|
||||||
|
|
||||||
|
- Utilise `eventBus` pour découplage (jamais de couplage direct)
|
||||||
|
- Pattern publish/subscribe pour événements
|
||||||
|
|
||||||
|
**Chargement** : Lazy loading via le système existant
|
||||||
|
|
||||||
|
**Cycle de vie** : `init()` → `start()` → `update()` → `cleanup()`
|
||||||
|
|
||||||
|
- Toujours nettoyer les listeners dans `cleanup()`
|
||||||
|
|
||||||
|
### Méthodes abstraites requises
|
||||||
|
|
||||||
|
À implémenter dans tout mode :
|
||||||
|
|
||||||
|
- `init()` - Initialisation
|
||||||
|
- `cleanup()` - Nettoyage et libération ressources
|
||||||
|
- `handleQuestion()` - Traitement d'une question
|
||||||
|
- `handleCorrectAnswer()` - Gestion réponse correcte
|
||||||
|
- `handleWrongAnswer()` - Gestion réponse incorrecte
|
||||||
|
- `updateUI()` - Mise à jour interface
|
||||||
|
- `showResults()` - Affichage résultats
|
||||||
|
|
||||||
|
## Workflow de création
|
||||||
|
|
||||||
|
### Étape 1 : Explorer les exemples existants
|
||||||
|
|
||||||
|
Examine les modes dans `js/modes/` :
|
||||||
|
|
||||||
|
- **QuizMode.js** : Mode simple, bon point de départ
|
||||||
|
- **ChallengeMode.js** : Mode avec timer, patterns avancés
|
||||||
|
- **ArcadeMode.js** : Collection de mini-jeux
|
||||||
|
|
||||||
|
Trouve celui qui ressemble le plus à ce que tu veux créer.
|
||||||
|
|
||||||
|
### Étape 2 : Localiser la classe abstraite
|
||||||
|
|
||||||
|
Trouve et examine `GameMode.js` pour comprendre :
|
||||||
|
|
||||||
|
- Les méthodes abstraites obligatoires
|
||||||
|
- Les méthodes utilitaires disponibles
|
||||||
|
- Le contrat d'interface
|
||||||
|
|
||||||
|
### Étape 3 : Comprendre l'intégration
|
||||||
|
|
||||||
|
Cherche dans le code existant :
|
||||||
|
|
||||||
|
- Comment les modes sont enregistrés (gestionnaire de modes)
|
||||||
|
- Comment le lazy loading fonctionne
|
||||||
|
- Comment les modes communiquent via eventBus
|
||||||
|
|
||||||
|
### Étape 4 : Créer ton mode
|
||||||
|
|
||||||
|
**Convention de nommage** : `js/modes/YourMode.js` (PascalCase)
|
||||||
|
|
||||||
|
**Structure minimale** :
|
||||||
|
|
||||||
|
- Hérite de GameMode
|
||||||
|
- Implémente toutes les méthodes abstraites
|
||||||
|
- Utilise eventBus pour communication
|
||||||
|
- Nettoie proprement dans cleanup()
|
||||||
|
|
||||||
|
Adapte un exemple existant à ton besoin.
|
||||||
|
|
||||||
|
### Étape 5 : Intégrer
|
||||||
|
|
||||||
|
- Enregistre dans le gestionnaire de modes
|
||||||
|
- Ajoute au lazy loader
|
||||||
|
- Crée les traductions (fr, en, es)
|
||||||
|
- Vérifie synchronisation i18n
|
||||||
|
|
||||||
|
### Étape 6 : Tester
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm test YourMode.test.js
|
||||||
|
npm run format:check
|
||||||
|
npm run lint
|
||||||
|
npm run i18n:compare
|
||||||
|
```
|
||||||
|
|
||||||
|
## Patterns et conventions
|
||||||
|
|
||||||
|
### Communication via Event Bus
|
||||||
|
|
||||||
|
**Principe** : Ne jamais coupler directement les composants
|
||||||
|
|
||||||
|
**Pattern typique** :
|
||||||
|
|
||||||
|
- Émettre : `eventBus.emit('mode:event', data)`
|
||||||
|
- Écouter : `eventBus.on('user:action', this.handler)`
|
||||||
|
- Nettoyer : `eventBus.off('user:action', this.handler)`
|
||||||
|
|
||||||
|
Cherche des exemples dans les modes existants.
|
||||||
|
|
||||||
|
### Gestion de l'état
|
||||||
|
|
||||||
|
Trouve comment les modes existants gèrent leur état interne.
|
||||||
|
Pattern commun : objet `this.state` avec propriétés du jeu.
|
||||||
|
|
||||||
|
### Utilisation des utilitaires
|
||||||
|
|
||||||
|
Examine `utils-es6.js` pour voir les fonctions disponibles :
|
||||||
|
|
||||||
|
- Génération de nombres aléatoires
|
||||||
|
- Mélange d'arrays
|
||||||
|
- Formatage du temps
|
||||||
|
- Etc.
|
||||||
|
|
||||||
|
## Checklist de création
|
||||||
|
|
||||||
|
### Découverte
|
||||||
|
|
||||||
|
- [ ] Examiner au moins 1 mode existant similaire
|
||||||
|
- [ ] Comprendre GameMode (classe abstraite)
|
||||||
|
- [ ] Identifier où les modes sont enregistrés
|
||||||
|
- [ ] Trouver le pattern de lazy loading
|
||||||
|
|
||||||
|
### Implémentation
|
||||||
|
|
||||||
|
- [ ] Fichier créé dans `js/modes/`
|
||||||
|
- [ ] Hérite de GameMode
|
||||||
|
- [ ] Toutes méthodes abstraites implémentées
|
||||||
|
- [ ] Event bus utilisé (pas de couplage direct)
|
||||||
|
- [ ] Cleanup proper (listeners retirés)
|
||||||
|
|
||||||
|
### Intégration
|
||||||
|
|
||||||
|
- [ ] Enregistré dans gestionnaire
|
||||||
|
- [ ] Ajouté au lazy loader
|
||||||
|
- [ ] Traductions ajoutées (fr → en → es)
|
||||||
|
- [ ] `npm run i18n:compare` passe
|
||||||
|
|
||||||
|
### Qualité
|
||||||
|
|
||||||
|
- [ ] Tests créés et passent
|
||||||
|
- [ ] Code formatté (`npm run format`)
|
||||||
|
- [ ] Lint passe (`npm run lint`)
|
||||||
|
- [ ] Documentation JSDoc
|
||||||
|
- [ ] Testé manuellement
|
||||||
|
|
||||||
|
## Debugging
|
||||||
|
|
||||||
|
### Vérifier initialisation
|
||||||
|
|
||||||
|
Cherche les patterns de logging dans les modes existants.
|
||||||
|
|
||||||
|
### Vérifier event bus
|
||||||
|
|
||||||
|
Liste tous les événements émis par les modes existants pour comprendre les conventions.
|
||||||
|
|
||||||
|
### Problèmes courants
|
||||||
|
|
||||||
|
**Mode ne se charge pas** :
|
||||||
|
|
||||||
|
- Vérifie enregistrement dans gestionnaire
|
||||||
|
- Vérifie configuration lazy loader
|
||||||
|
|
||||||
|
**Event bus ne fonctionne pas** :
|
||||||
|
|
||||||
|
- Vérifie que cleanup retire les listeners
|
||||||
|
- Cherche la bonne signature des événements
|
||||||
|
|
||||||
|
**Traductions manquantes** :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run i18n:compare
|
||||||
|
```
|
||||||
|
|
||||||
|
## En cas de doute
|
||||||
|
|
||||||
|
**Source de vérité = code existant**
|
||||||
|
|
||||||
|
1. Explore les modes similaires
|
||||||
|
2. Le code réel est plus fiable que toute documentation
|
||||||
|
3. Adapte les patterns, ne copie pas aveuglément
|
||||||
|
4. Teste fréquemment
|
||||||
|
|
||||||
|
## Références
|
||||||
|
|
||||||
|
Cherche dans le code :
|
||||||
|
|
||||||
|
- `js/core/GameMode.js` - Classe abstraite
|
||||||
|
- `js/modes/` - Tous les modes existants
|
||||||
|
- `js/core/GameModeManager.js` - Gestionnaire
|
||||||
|
- `js/lazy-loader.js` - Configuration lazy loading
|
||||||
|
- `js/core/eventBus.js` - Event bus
|
||||||
Reference in New Issue
Block a user