From e1ddecb9f89ac873c255e9281e7d5d2881e301ba Mon Sep 17 00:00:00 2001 From: Zhongwei Li Date: Sun, 30 Nov 2025 08:27:08 +0800 Subject: [PATCH] Initial commit --- .claude-plugin/plugin.json | 12 ++ README.md | 3 + plugin.lock.json | 45 ++++++++ skills/game-mode/SKILL.md | 220 +++++++++++++++++++++++++++++++++++++ 4 files changed, 280 insertions(+) create mode 100644 .claude-plugin/plugin.json create mode 100644 README.md create mode 100644 plugin.lock.json create mode 100644 skills/game-mode/SKILL.md diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json new file mode 100644 index 0000000..bb24ca3 --- /dev/null +++ b/.claude-plugin/plugin.json @@ -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" + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2db97d1 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# leapmultix-skill-game-mode + +Skill game-mode from LeapMultix diff --git a/plugin.lock.json b/plugin.lock.json new file mode 100644 index 0000000..91a6f04 --- /dev/null +++ b/plugin.lock.json @@ -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": [] + } +} \ No newline at end of file diff --git a/skills/game-mode/SKILL.md b/skills/game-mode/SKILL.md new file mode 100644 index 0000000..b35a9ac --- /dev/null +++ b/skills/game-mode/SKILL.md @@ -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