Miu2D : un moteur ARPG 2D de 176 000 lignes basé sur WebGL brut
Ce projet transforme « Miu2D is a 2D RPG game engine built with Rust + TypeScript + React + Canvas, designed for the Web platform. 2/ / . » en une solution open source exploitable, avec une chaîne d’outils réutilisable et des moyens d’intégration pour des cas d’usage concrets.
En bref
- De quoi s’agit-il ?
- Un moteur écrit en TypeScript et Rust qui exécute trois remakes de wuxia Kingsoft dans le navigateur, sans dépendance à un framework de jeu.
- À qui s’adresse-t-il ?
- Miu2D est un projet d'apprentissage fait par des fans. Le code source du moteur est sous licence MIT, tandis que les ressources du jeu (images, audio, cartes, scripts) ne sont pas couvertes et restent la propriété de leurs créateurs d'origine, Kingsoft (Xishanju).
- Puis-je l’utiliser commercialement ?
- Oui. MIT est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
- Est-il encore maintenu ?
- Oui. Les derniers commits datent d’il y a 10 jours.
- En quel langage est-il écrit ?
- Principalement TypeScript, d’après les statistiques de langage de GitHub.
Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 14 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.
ANALYSE OPEN SOURCE APPROFONDIE
WebGL brut, zéro dépendance à un framework de jeu
Miu2D est un moteur ARPG 2D écrit en TypeScript et Rust, dont la couche de rendu appelle directement WebGLRenderingContext. Selon le README, le moteur compte environ 176 000 lignes et évite volontairement Unity, Godot, Phaser, PixiJS ou tout autre framework de jeu. Chaque sous-système, y compris le batch de sprites, le pathfinding A*, les décodeurs de formats binaires, la VM de script, les particules météo et les effets d'écran, est implémenté à partir des premiers principes. Le projet se présente également comme développé avec de la programmation assistée par IA depuis le premier jour, sous le label « Vibe Coding ».
Trois jeux wuxia Kingsoft comme preuve de concept
À titre de démonstration, Miu2D reconstruit trois action-RPG classiques de Xishanju (Kingsoft) dans le navigateur et les présente comme entièrement jouables. Legend of Yue Ying (2001) est décrit comme la plus grande production de Xishanju à l'époque, avec sept fins ou plus, plus de 100 événements narratifs, une équipe de 30 personnes et une production de 14 mois. Swords of Legends 2 (1998) a introduit un combat en temps réel inspiré de Diablo, comprend plus de 200 PNJ, fonctionne en 640×480 en 16 bits et a une chanson thème de 谢雨欣. New Swords of Legends (2001) est un remake de l'original de 1997, avec plus de 110 cartes et le moteur de combat en temps réel de Swords of Legends 2. Le README ne précise pas les tailles de téléchargement ni les fréquences d'images de ces jeux.
Onze paquets dans un monorepo pnpm
Le dépôt est organisé en espace de travail pnpm avec 11 paquets. Le paquet moteur, @miu2d/engine, est en TypeScript pur avec 215 fichiers répartis dans 19 modules et aucune dépendance à React. Le runtime de jeu, @miu2d/game, utilise React 19 et propose trois thèmes d'interface : Classic, Modern et Mobile. Le paquet WASM, @miu2d/engine-wasm, est du Rust compilé en WebAssembly, hébergeant le pathfinding A*, les décodeurs, le hachage spatial et la compression zstd. Le paquet backend, @miu2d/server, est construit avec Hono, tRPC et Prisma ORM, avec 21 tables PostgreSQL et 19 routeurs. Le paquet dashboard fournit un éditeur de style VS Code avec 13 modules d'édition. Les autres paquets couvrent les types, la coquille de l'application web, le convertisseur, le visualiseur, les composants UI et le code partagé i18n/contexte.
Rendu : batching, repli et éclairage
Le rendu utilise directement WebGLRenderingContext. Un SpriteBatcher accumule les données de sommets et les vide à chaque changement de texture, réduisant une frame de carte typique d'environ 4 800 tuiles à un à cinq appels de dessin. Un RectBatcher regroupe les particules météo et les rectangles d'interface en un seul appel. Les textures sont converties d'ImageData en WebGLTexture, mises en cache avec WeakMap et nettoyées automatiquement via FinalizationRegistry. Les shaders de fragment GLSL appliquent des filtres de couleur pour les états poison, gel et pétrification, et la boucle de rendu compose des effets d'écran comme le fondu, le flash et l'ondulation de l'eau. Un repli Canvas 2D implémente la même interface Renderer avec une parité de fonctionnalités pour les appareils sans WebGL. L'éclairage local utilise des masques de lueur additifs provenant des entités lumineuses et correspond à la référence C++ du projet JxqyHD, avec des motifs d'émission de lumière spécifiques pour les sous-projectiles selon le type de mouvement de magie.
Script : DSL maison plus Lua 5.4
Miu2D comporte deux modes de script partageant la même GameAPI. Le mode DSL analyse les fichiers .txt et .npc avec un parseur personnalisé et les exécute avec un exécuteur asynchrone. Le README liste 218 commandes réparties en neuf catégories : dialogue, joueur, PNJ, état du jeu, audio, effets, objets, objets d'inventaire et divers. Le mode Lua intègre un runtime Lua 5.4 complet via wasmoon, qui compile Lua en WASM. Les 170 fonctions de la GameAPI sont exposées en variables globales PascalCase, et le système de proxy de wasmoon fait le pont entre les fonctions asynchrones JavaScript et les coroutines Lua, de sorte que des opérations bloquantes comme PlayerWalkTo() ou Talk() fonctionnent sans await explicite. Le même ScriptExecutor achemine selon l'extension : .lua vers l'exécuteur Lua, .txt et .npc vers l'exécuteur DSL. Un exemple de script Lua dans le README charge une carte, positionne le joueur, joue un dialogue et pose une question pour ajouter magie et expérience.
Pathfinding, décodeurs binaires et météo
Le pathfinding A* est écrit en Rust et compilé en WebAssembly. Il écrit les bitmaps d'obstacles directement dans la mémoire linéaire WASM via des vues Uint8Array, exécute A* sur place et lit les résultats via des vues de pointeur Int32Array, évitant toute sérialisation ou copie. Le README rapporte cinq stratégies de chemin, de glouton à A* complet avec un nombre maximal d'itérations configurable, et des requêtes typiques à environ 0,2 ms, soit environ dix fois plus rapide que l'implémentation TypeScript équivalente. Le moteur décode huit formats binaires des jeux d'origine : ASF, MPC, MAP, SHD, XNB, MSF, MMF et INI/OBJ, MSF et MMF utilisant une compression zstd personnalisée. Le système météo simule une pluie poussée par le vent avec des éclaboussures et des éclairs, un effet de lentille de réfraction pour les gouttelettes à l'écran, et des flocons de neige avec oscillation, rotation, dérive et fonte progressive. Le README ne précise pas le matériel ou les versions de navigateur utilisés pour les chiffres de performance.
Éditeur, contrôles et déploiement
Le dépôt inclut un éditeur de données de jeu de style VS Code, dont les 13 modules couvrent la magie, les PNJ, les scènes, les objets, les boutiques, les dialogues, le joueur, les niveaux, la configuration du jeu, le gestionnaire de fichiers, les ressources et les statistiques. Contrôles de bureau : clic gauche pour se déplacer ou interagir, clic droit pour une interaction alternative, Ctrl+clic gauche pour attaquer sur place, Q et E pour interagir avec l'objet ou le PNJ le plus proche, A/S/D/F/G pour les emplacements de magie, Z/X/C pour les emplacements rapides d'objets, et V pour basculer entre s'asseoir et méditer. Sur mobile, un joystick virtuel permet de se déplacer et un appui pour interagir. Pour le déploiement, le README décrit Vercel pour le frontend en SPA statique et Docker Compose avec PostgreSQL, MinIO, Hono et Nginx pour la pile complète. Il liste aussi des commandes comme pnpm dev, make dev, make tsc, pnpm lint, make test et make convert, avec Node.js 18+ et pnpm 9+ comme prérequis.
Conclusion éditoriale
Miu2D est un projet d'apprentissage fait par des fans. Le code source du moteur est sous licence MIT, tandis que les ressources du jeu (images, audio, cartes, scripts) ne sont pas couvertes et restent la propriété de leurs créateurs d'origine, Kingsoft (Xishanju). Le README cite la réimplémentation C# JxqyHD et le moteur C++ JXQY-all-in-one comme références. Il ne fournit pas de feuille de route, de détails sur le suivi des problèmes ni de liste des limitations connues ; ces sujets ne sont donc pas abordés ici.
Notes de la communauté