No description
  • Rust 82.1%
  • Python 10.5%
  • JavaScript 3.3%
  • Fluent 2.4%
  • HTML 1.4%
  • Other 0.2%
Find a file
ocdev 4c191cc29d
All checks were successful
Dev build (Linux, client + serveur) / build-and-publish-dev (push) Successful in 4m47s
build(ocdeploy): recette de build jetable Linux+Windows + /dist/ ignoré
Usine de build jetable (VM Incus) : compile client+serveur/front en release pour Linux et Windows (cross mingw-w64, aucune VM Windows), assemble les 4 archives comme le workflow de release, les sert sur le port d'aperçu pour récupération depuis l'hôte. Miroir de .forgejo/workflows/release-client.yml. dist/ (archives récupérées) ajouté au .gitignore.
2026-10-14 20:01:07 +00:00
.cargo ci: pipeline Forgejo Actions pour binaires client Linux + Windows 2026-08-31 19:34:34 +02:00
.forgejo/workflows ci: pipeline de build de dev (Linux, client+serveur, URL invariante) 2026-09-21 22:37:00 +02:00
.ocdeploy build(ocdeploy): recette de build jetable Linux+Windows + /dist/ ignoré 2026-10-14 20:01:07 +00:00
client feat(hud): onglet « Perf » du panneau debug (FPS / ennemis / entités / réseau) 2026-10-14 20:01:07 +00:00
data feat(hud): unités invoquées sélectionnables et dessinées en sprite 2026-09-27 00:35:30 +02:00
docs docs(hud): état de reprise en fin de chantier console WC3 2026-09-27 20:11:04 +02:00
extraction fix(data): Chaos Swarm et Impaler complétés d'après leurs tooltips 2026-09-23 12:47:49 +02:00
server test(balance): mesure le coût client de la réplication (BLOC 2 du diagnostic optimisations) 2026-10-14 20:01:07 +00:00
shared fix(bouclier): cycle du Bouclier de mana fidèle à la source (Impulsion d'énergie en boucle) 2026-09-28 18:23:30 +02:00
tools feat(icon-lab): intégration git des icônes (par icône ou sélection) et push groupé 2026-09-27 13:16:48 +02:00
.gitignore build(ocdeploy): recette de build jetable Linux+Windows + /dist/ ignoré 2026-10-14 20:01:07 +00:00
BALANCE_REPORT.md test(balance): mesure le coût client de la réplication (BLOC 2 du diagnostic optimisations) 2026-10-14 20:01:07 +00:00
Cargo.lock chore(release): v0.20.0 — console HUD façon Warcraft III 2026-09-28 01:20:47 +02:00
Cargo.toml chore(release): v0.20.0 — console HUD façon Warcraft III 2026-09-28 01:20:47 +02:00
CHALLENGES_SKINS_AUDIT.md docs: 3e vague de défis — 50/50 en scope, journal + status à jour 2026-09-13 14:48:46 +02:00
CLAUDE.md docs(hud): console WC3 et adaptation de résolution validées en jeu 2026-09-27 13:22:31 +02:00
content_audit_challenges.csv docs: tableau défis x skins (content_audit_challenges.csv) 2026-09-13 15:02:47 +02:00
content_audit_upgrades.csv feat: ajoute Living Wood, plancher de 25 % pour Deflection 2026-09-23 12:45:25 +02:00
content_audit_weapons.csv feat(armes): Necromancer's Tome relève un Mage squelette sur les cadavres 2026-09-23 14:47:50 +02:00
DEPLOYMENT.md docs(deployment): documenter le piège firewalld multi-chaînes + KDE Plasma 2026-09-25 10:08:22 +02:00
EFFECT_TYPES.md docs: audit en vrais fichiers CSV plutôt qu'un markdown 2026-09-02 17:53:00 +02:00
IMPLEMENTATION_STATUS.md fix(bouclier): cycle du Bouclier de mana fidèle à la source (Impulsion d'énergie en boucle) 2026-09-28 18:23:30 +02:00
README.md chore(release): v0.18.0 — serveur public par défaut, guide de déploiement à jour 2026-09-20 01:17:50 +02:00
ROADMAP.md docs(roadmap): console HUD phase B + point ouvert options front/serveur 2026-09-26 17:08:57 +02:00
tower_survivors_analysis.md Analyse : le mécanisme "remplacement de compétence" est une fausse piste 2026-08-30 03:54:32 +02:00
UPGRADE_AUDIT_UNRESOLVED.md docs: audit des ~40 blocs d'amélioration jamais résolus (pas implémenté) 2026-09-02 19:46:00 +02:00

Tower Survivors — recréation open source

Recréation, en Rust/Bevy, d'un tower defense multijoueur en ligne inspiré de TowerSurvivorsv1_90.w3x : chaque joueur défend une tour unique avec des armes achetées, en coop contre des vagues d'ennemis, avec économie, score, défis à contrainte et skins cosmétiques.

Commencez ici :

  1. tower_survivors_analysis.md — ce qui a été extrait/compris de la map source (systèmes, contenu, mécaniques).
  2. ROADMAP.md — le plan de recréation complet, en phases.

Structure du workspace

.
├── Cargo.toml          # workspace, versions centralisées
├── shared/               # components/messages réseau — la source de
│                           vérité du protocole, utilisée par client ET serveur
├── server/               # binaire headless, autoritaire, déployable en VPS
├── client/                # binaire avec rendu, se connecte au serveur
└── data/                    # catalogue de contenu RON (Phase 3+), partagé
                               client+serveur via l'asset source `data://`
    ├── weapons/              # *.weapon.ron — voir shared::content::WeaponDef
    ├── enemies/              # *.enemy.ron — voir shared::content::EnemyDef
    ├── challenges/           # *.challenge.ron — voir shared::challenges::ChallengeDef
    └── skins/                # *.skin.ron — voir shared::challenges::SkinDef

Statut actuel

Phases 0 et 1 complètes, Phase 2 quasi complète, Phases 3-7 complètes, Phase 8 en cours (voir ROADMAP.md) : connexion client/serveur réelle (bevy_replicon 0.40.4 + bevy_replicon_renet2 0.17.0), tour fixe par joueur pouvant posséder plusieurs armes simultanées (achetées depuis un catalogue data-driven en RON, aucune arme offerte au départ) et des bonus génériques cumulés (PV max, régénération, réduction de dégâts, revenu passif, bonus de dégâts par type), tous achetés via la même offre de boutique que les armes, vagues d'ennemis isolées par joueur (types d'ennemis data-driven, santé/vitesse croissantes dans le temps, nouveaux types débloqués progressivement), économie, défaite, compteur de vagues affiché, tableau de bord (DPS/ revenu/puissance de feu/score par joueur) avec espionnage (Tab), défis à contrainte de type de dégâts récompensés par un skin de tour cosmétique, compte joueur persistant (token anonyme, score cumulé/skins en base SQLite) avec reconnexion en cours de partie après coupure réseau, HUD localisé en français (bevy_fluent), lobby (prêt/démarrage synchronisé), caméra déplaçable. Boutique refaite (2026-08-30) : l'ancien catalogue fixe à achat libre (confirmé non fidèle à la map source par ré-extraction directe) est remplacé par une offre à 4 emplacements d'armes + 4 d'améliorations génériques, tirées par palier de rareté (Commun/Peu commun/Rare/Épique, coûts et probabilités extraits de la map source), renouvelable par reroll à coût croissant — voir ROADMAP.md ("Système de shop réel"). HUD refait en vrais panneaux (fond contrasté, deux colonnes) avec la caméra dézoomée pour garder la carte visible derrière. Testé jusqu'à 8 clients simultanés sans erreur. Reste : souris/minimap (Phase 2, confort d'UX), icônes/tooltips pour la boutique (pas d'assets graphiques pour l'instant), contenu à étoffer et passes d'équilibrage (Phase 8, en cours), thèmes cosmétiques et comptes pseudo/mot de passe (reportés, voir ROADMAP.md).

Prérequis Linux (compilation du client)

Bevy compile le support des DEUX serveurs d'affichage (X11 et Wayland) dans le même binaire par défaut — le bon backend est choisi tout seul au lancement selon l'environnement (WAYLAND_DISPLAY/DISPLAY), donc un seul binaire tourne partout. Ça veut dire que la compilation a besoin des en-têtes de développement des DEUX, même sur une machine qui n'utilise que l'un des deux au quotidien (signalé en jeu 2026-08-31 : échec de compilation sur une machine X11 sans paquets Wayland installés — voir le commentaire dans client/Cargo.toml pour le détail de pourquoi ce n'est pas contournable côté Cargo.toml).

# Debian/Ubuntu
sudo apt install g++ pkg-config libx11-dev libxkbcommon-dev libwayland-dev libasound2-dev libudev-dev

# Fedora
sudo dnf install gcc-c++ libX11-devel libxkbcommon-devel wayland-devel alsa-lib-devel systemd-devel

# Arch
sudo pacman -S base-devel libx11 libxkbcommon wayland alsa-lib systemd-libs

Le serveur (cargo run -p server) n'a besoin d'aucun de ces paquets — il tourne headless, sans fenêtre ni rendu.

Binaires client précompilés (Linux + Windows)

À chaque tag vX.Y.Z poussé sur le dépôt, .forgejo/workflows/ release-client.yml compile le client pour Linux (natif) et Windows (cross-compilation via mingw-w64) et publie les deux archives sur la release Forgejo correspondante — voir l'onglet "Releases" du dépôt. Toutes les releases sont publiées en pre-release (prerelease: true, projet en développement actif, aucune version stable pour l'instant) — à ne retirer que le jour où une version est jugée réellement stable.

Un binaire précompilé n'a besoin d'AUCUN outil Rust/Cargo pour tourner (les paquets système ci-dessus ne servent qu'à COMPILER). Après extraction de l'archive, garder la disposition des dossiers telle quelle (data/ à côté de client/, jamais l'inverse — voir la doc de shared::register_data_source si besoin de comprendre pourquoi) :

tower-survivors-client-vX.Y.Z-linux-x86_64/
├── data/
└── client/
    ├── client          (ou client.exe sous Windows)
    ├── config.ron.example  (copier en config.ron pour se connecter à un
    │                        serveur distant — voir section suivante)
    └── assets/

Puis lancer l'exécutable directement depuis ce dossier client/ (double- clic sous Windows, ./client sous Linux).

Se connecter à un serveur distant

Le serveur écoute sur 127.0.0.1 (loopback uniquement, comportement historique inchangé) tant qu'aucune config n'est donnée — pour héberger une vraie partie accessible à des amis sur d'autres machines, exposez-le sur toutes les interfaces :

# Argument CLI (le plus explicite) :
cargo run -p server -- --bind 0.0.0.0:5000

# ...ou juste un port (IP 0.0.0.0 implicite) :
cargo run -p server -- --bind 5000

# ...ou variable d'environnement (pratique pour un systemd/conteneur) :
TOWER_SURVIVORS_BIND_ADDR=0.0.0.0:5000 cargo run -p server

Le port UDP correspondant doit être ouvert sur le pare-feu/la box de la machine hôte.

Pour héberger pour de bon — matchmaking à plusieurs salles, matrice de flux, exemple nftables complet, redirection de port et unité systemd : voir DEPLOYMENT.md. À retenir d'emblée : grâce au relais UDP, un seul port suffit (UDP 5000) pour tous les clients natifs, quel que soit le nombre de salles.

Côté client, l'adresse par défaut (tde.k-yu.fr:5000, le serveur public — un nom de domaine ou une IP, au choix) se configure par ordre de priorité croissante : un fichier config.ron posé À CÔTÉ du binaire/dossier client/ (voir la disposition ci-dessus), puis les arguments --server/--name (pratiques en dev pour basculer vite entre plusieurs serveurs de test) :

// config.ron
(
    server_addr: "203.0.113.42:5000",
    display_name: "Xel",
)
cargo run -p client -- --server 203.0.113.42:5000 --name Xel

display_name est un pseudo purement cosmétique (affiché dans le HUD/ tableau de bord de tous les joueurs) — PAS un système de compte avec mot de passe, voir shared::PlayerName.

Lancer

# Terminal 1
cargo run -p server

# Terminal 2 (répéter pour tester plusieurs joueurs)
cargo run -p client

Sans argument, le client démarre sur un écran d'Accueil puis Rejoindre (adresse serveur + pseudo, favoris sauvegardables) — voir "Se connecter à un serveur distant" plus haut. Passer --server saute directement à la connexion (pratique en dev pour un test rapide sans repasser par le menu).

Touches 1-4 : acheter l'emplacement d'ARME correspondant de l'offre de boutique (voir le HUD — 4 emplacements tirés par rareté, aucune arme au départ, la tour ne tire sur rien tant que rien n'a été acheté). Touches 5-8 : acheter l'emplacement d'AMÉLIORATION correspondant (même offre, groupe différent — revenu passif, PV max/régénération/ réduction de dégâts, ou bonus de dégâts par type). Y : reroll complet de l'offre — gratuit tant qu'il reste des rerolls gratuits (6 de départ + un pool "bonus" dont le plafond grandit avec le temps de jeu, confirmés extraits de la map source), coût croissant ensuite. Tab : espionner un autre joueur (affiche son détail d'armes/bonus en lecture seule). F1-F4 : lancer un défi à contrainte du catalogue. [/] : changer de skin de tour parmi ceux débloqués. R bascule prêt/pas prêt en salon d'attente. Flèches/WASD déplacent la caméra.

Réglages de partie configurables (variables d'environnement du serveur) :

# Nombre de joueurs max (2-8, défaut 8)
TOWER_SURVIVORS_MAX_PLAYERS=4 cargo run -p server

# Vitesse de jeu et coefficient de difficulté (0.25-4.0, défaut 1.0)
TOWER_SURVIVORS_GAME_SPEED=1.5 TOWER_SURVIVORS_DIFFICULTY=2 cargo run -p server

# Persistance (Phase 7) : chemin de la base SQLite serveur, et durée de
# grâce de reconnexion (secondes, 30-1800, défaut 180)
TOWER_SURVIVORS_DB_PATH=tower_survivors.db TOWER_SURVIVORS_RECONNECT_GRACE_SECS=180 cargo run -p server

Le client génère et conserve un token de compte anonyme localement (fichier .tower_survivors_token par défaut, chemin personnalisable via TOWER_SURVIVORS_TOKEN_PATH) :

TOWER_SURVIVORS_TOKEN_PATH=/chemin/vers/token cargo run -p client

Avant de coder la suite

Les versions de bevy_replicon / bevy_replicon_renet2 sont verrouillées et vérifiées (voir CLAUDE.md), mais cet écosystème réseau évolue vite — revalidez contre docs.rs/bevy_replicon avant toute montée de version.