No description
  • Rust 92.1%
  • Shell 3.4%
  • WGSL 3.3%
  • CSS 0.8%
  • HTML 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-31 01:28:46 +00:00
.agents/skills chore(release): update RoamCube release tooling 2026-08-30 20:19:59 -04:00
.forgejo/workflows feat(web): add playable browser build and deployment 2026-08-30 20:19:39 -04:00
docs docs: document web release operations 2026-08-31 01:28:46 +00:00
scripts chore(release): update RoamCube release tooling 2026-08-30 20:19:59 -04:00
src fix(web): initialize canvas at viewport size 2026-08-31 01:20:17 +00:00
web feat(web): add playable browser build and deployment 2026-08-30 20:19:39 -04:00
.gitattributes feat(web): add playable browser build and deployment 2026-08-30 20:19:39 -04:00
.gitignore Add manual macOS release tooling 2026-08-30 17:25:39 -04:00
Cargo.lock fix(web): initialize canvas at viewport size 2026-08-31 01:20:17 +00:00
Cargo.toml fix(web): initialize canvas at viewport size 2026-08-31 01:20:17 +00:00
CHANGELOG.md fix(web): initialize canvas at viewport size 2026-08-31 01:20:17 +00:00
PLAN.md docs: update RoamCube roadmap and platform guides 2026-08-30 20:20:17 -04:00
README.md docs: document web release operations 2026-08-31 01:28:46 +00:00

RoamCube

Un RPG micro-voxel third-person construit directement avec Rust, wgpu et winit.

Jouer dans le navigateur

Le périmètre du MVP, ses décisions techniques et sa validation sont détaillés dans PLAN.md. Les changements par version sont regroupés dans CHANGELOG.md.

État actuel

Le monde est organisé en deux cartes fixes : le DOMAINE, une île plate de 11×11 chunks réservée au joueur dont les 121 chunks restent chargés, et la PRAIRIE, une région d'exploration procédurale de 42×42 chunks. La Prairie commence avec les 49 chunks proches du joueur, puis précharge progressivement une zone de 9×9 et conserve tous les chunks découverts. Voyager préserve leur état et les ressources de la Prairie repoussent cinq minutes après leur collecte. Une minimap permanente suit les 7×7 chunks autour du joueur et présente le terrain local, son orientation, sa destination, les portails et les ennemis à proximité. Terminer le créateur de personnage ouvre le portail vers la Prairie; ses premiers objectifs demandent ensuite de récolter du bois et du minerai puis de vaincre des slimes. L'apparence, l'inventaire et cette progression sont sauvegardés automatiquement. Le renderer combine meshing par chunk, frustum culling, shadow map filtrée, voxel AO, ciel stylisé avec soleil et eau animée avec reflets et écume de rive.

Le clic au sol déplace le personnage. Cliquer un arbre ou un rocher déclenche l'approche puis les frappes automatiques avec la hache ou la pioche appropriée. Soixante-quatre slimes indépendants sont répartis de façon pseudo-aléatoire sur toute la Prairie. Ils détectent, poursuivent et attaquent le joueur, affichent une anticipation avant l'impact et peuvent être ciblés individuellement puis vaincus avec le bâton.

Les voxels du monde mesurent 0,25 m : le joueur fait environ huit voxels de haut, ce qui donne des reliefs, arbres et roches plus fins qu'une grille de blocs classique. La direction artistique repose sur des terrasses irrégulières, des arbres courbés, des silhouettes biseautées et une palette sauge, ocre, corail et bleu pétrole. La caméra reste centrée sur le joueur, zoome de façon lissée et se rapproche immédiatement lorsqu'un obstacle bloque la vue.

Jouer

La version navigateur officielle est disponible sur roamcube.monsilaro.ca. Elle utilise WebAssembly et WebGPU; un navigateur récent est recommandé. La sauvegarde Web reste localement dans le navigateur.

Pour lancer la version native depuis les sources :

cargo run

Contrôles :

  • créateur initial : / ou W/S pour choisir une catégorie
  • créateur initial : / ou A/D pour changer l'option, 1 à 5 pour un choix direct
  • Entrée : confirmer le personnage et commencer la partie
  • clic gauche au sol : se déplacer
  • clic gauche sur une ressource : approcher et frapper automatiquement
  • clic gauche sur le slime : approcher et attaquer automatiquement
  • Espace : sauter
  • les terrasses jusqu'à deux micro-voxels sont franchies automatiquement avec une transition lissée
  • WASD : aucune action (le déplacement reste entièrement click-to-move)
  • traverser un portail ouvert : voyager entre le Domaine et la Prairie
  • F1 : afficher ou masquer FPS, temps de frame, triangles, chunks résidents, carte active, entités, effets et zoom
  • clic droit + souris : orbiter
  • molette : zoomer sans limite maximale de recul
  • Échap : quitter

Sauvegarde

La sauvegarde automatique conserve l'apparence, l'inventaire et la progression des objectifs :

  • Windows : %APPDATA%\RoamCube\save.json
  • macOS : ~/Library/Application Support/RoamCube/save.json
  • Linux : $XDG_DATA_HOME/RoamCube/save.json, ou ~/.local/share/RoamCube/save.json
  • Web : stockage local du navigateur, clé roamcube.save.v1

Validation locale

cargo fmt --all -- --check
cargo test --all-targets
cargo clippy --all-targets -- -D warnings
cargo run --release

Le développement actuel compte 97 tests déterministes. La release 0.6.0 a aussi été validée manuellement en build optimisée.

Releases Windows, Web et macOS

Lorsqu'un tag v* est poussé, le workflow Forgejo compile l'exécutable Windows x86-64 et le bundle Web autonome, puis crée la page Releases avec leurs checksums SHA-256. La release renvoie aussi vers la version toujours jouable sur roamcube.monsilaro.ca. Le bundle macOS est ensuite compilé manuellement sur un MacBook et ajouté à cette même release avec le skill $rpg-cube-macos-release. Aucun runner macOS permanent ni compte Apple Developer n'est nécessaire.

Pour publier une version, mettre à jour version dans Cargo.toml, committer, puis pousser un tag correspondant exactement à cette version :

git tag -a vX.Y.Z -m "RoamCube vX.Y.Z"
git push origin main
git push origin vX.Y.Z

Forgejo refuse automatiquement la release si le tag et la version de Cargo.toml ne correspondent pas.

Le push du tag doit impérativement passer par le serveur Forgejo (remote HTTPS ou interface Web). Écrire directement dans le dépôt bare présent sur le VPS met bien à jour la ref Git, mais contourne les hooks Forgejo : aucune Action et aucune page Release ne sont alors créées.

Déploiement Web sur le VPS

Après la création de la release Forgejo, le runbook docs/deploy-web-vps.md décrit la mise en production sur roamcube.monsilaro.ca, les vérifications HTTPS et le rollback. Le helper installé sur le VPS vérifie le ZIP Web et son checksum, puis conserve chaque version dans un dossier distinct avant de basculer atomiquement le lien actif.

Publication manuelle sur le MacBook

Le Mac doit fournir Rust et les outils en ligne de commande Xcode. Après avoir récupéré le tag à publier, placer le dépôt exactement sur ce tag avec un worktree propre :

git fetch --tags
git switch --detach vX.Y.Z

Puis demander à Codex :

Utilise $rpg-cube-macos-release pour publier le bundle macOS de cette version.

Le même flux peut être lancé directement, sans Codex :

bash scripts/release-macos.sh --publish

Le skill valide le projet, installe les deux cibles Rust macOS, compile Apple Silicon et Intel, combine les exécutables, applique une signature ad hoc et produit :

  • dist/macos/roamcube-vX.Y.Z-macos-universal.zip;
  • dist/macos/roamcube-vX.Y.Z-macos-universal.zip.sha256.

La publication demande un jeton Forgejo avec accès en écriture au dépôt. Le script lit FORGEJO_TOKEN, cherche ensuite l'élément rpg-cube-forgejo-token dans le Trousseau macOS, ou demande le jeton de façon masquée. Il refuse de remplacer un asset qui porte déjà le même nom.

Comme l'application est signée de façon ad hoc et non notariée, macOS peut afficher un avertissement Gatekeeper au premier lancement chez une autre personne. La notarisation publique demanderait un compte Apple Developer payant, mais elle n'est pas requise pour produire et joindre le ZIP.

Le skill local $rpg-cube-release automatise la préparation cohérente du changelog, du bump Cargo, des validations, du commit et du tag. Il ne pousse les refs que lorsque la publication est demandée explicitement.

Après le MVP

Le MVP planifié est terminé et publié dans v0.6.0. RoamCube possède maintenant une première boucle d'objectifs et une sauvegarde légère; la sauvegarde complète du monde, le crafting, les quêtes avancées, les biomes multiples ou le multijoueur restent volontairement hors scope. La prochaine tranche de produit doit être définie avant d'étendre ces systèmes.