6 KiB
Tales of Pokémon — Organisation du projet
Jeu 3D développé avec Godot (GDScript). Ce document décrit comment le projet est rangé et les conventions à suivre pour s'y retrouver.
Principe général
- On range par fonctionnalité, pas par type de fichier : le script d'une scène vit à côté de sa scène.
- Règle de test : si je supprime la fonctionnalité X, je ne supprime qu'un seul dossier.
- Les fichiers bruts (images, sons, modèles 3D) sont dans
assets/, les ressources de données (.tres) dansdata/, le code et les scènes dansgame/.
Arborescence
res://
├── addons/ # plugins (pokeapi_importer, controller_icons) — ne pas modifier à la main
├── assets/ # fichiers bruts uniquement
│ ├── textures/ # fonds, splash…
│ ├── ui/types/ # symboles des types
│ └── audio/
├── data/ # ressources .tres (importées ou faites à la main)
│ ├── pokemon/ # fichiers préfixés par l'id (ex. 0025_pikachu.tres)
│ ├── moves/
│ ├── types/
│ ├── items/
│ └── mounts/
├── game/
│ ├── core/ # autoloads : game_data, pokedex, ui_audio
│ ├── player/
│ │ ├── player_character.tscn / .gd
│ │ ├── camera/ # camera_holder
│ │ ├── input/ # input_management_component
│ │ ├── aim/ # aim_target
│ │ └── states/ # state, state_machine, idle_state, walk_state, …
│ ├── pokemon/ # pokemon_instance, pokemon_team, pokemon_nature, move_slot, trainer_data…
│ ├── mount/ # mount_profile, mount_registry
│ ├── storage/ # pokemon_box, pokemon_storage, pc_screen (+ .tscn)
│ ├── ui/
│ │ ├── main_menu/ # scène + script
│ │ ├── pause_menu/ # scène + script + shader
│ │ ├── splash_screen/
│ │ └── hud/
│ └── world/ # main.tscn et futures zones
├── docs/ # documentation (ce fichier)
├── project.godot
└── icon.svg
Conventions de nommage
| Élément | Convention | Exemple |
|---|---|---|
| Fichiers et dossiers | snake_case |
pokemon_team.gd, main_menu.tscn |
class_name |
PascalCase |
PokemonTeam, AimTarget |
| Variables et fonctions | snake_case |
move_speed, gravity_apply() |
| Constantes | MAJUSCULES_SNAKE |
MAX_TEAM_SIZE |
| Signaux | snake_case, verbe au passé |
transitioned |
| Ressources de données Pokémon | préfixe par l'id | 0025_pikachu.tres |
Les grands systèmes
Joueur et state machine (game/player/)
Le joueur est un CharacterBody3D piloté par une state machine : le nœud StateMachine contient un nœud enfant par état.
- Chaque état hérite de
Stateet implémenteenter(),exit(),update()etphysics_update(). - Un état demande un changement avec
transitioned.emit(self, "NomDuNoeud"). Le nom correspond au nom du nœud enfant dans la scène (insensible à la casse). Si aucun nœud ne porte ce nom, la transition est ignorée sans erreur. - États en place ou prévus : Idle, Walk, Run, Jump, Inair, Crouch, Dodge, Aim, Mounted.
- Les variables partagées entre états (vitesses, cooldowns de saut,
walk_or_run…) sont surPlayerCharacter.
Ajouter un état :
- Créer
xxx_state.gddansgame/player/states/(extends State, avec unclass_nameet unstate_name). - Ajouter un nœud enfant sous
StateMachinedansplayer_character.tscn, avec le même nom que celui utilisé dans les transitions, et lui attacher le script. - Ajouter les transitions entrantes et sortantes dans les états concernés.
Visée (game/player/aim/)
AimState fait un auto-lock sur les AimTarget du groupe aim_targets. Les actions d'entrée sont configurables dans l'inspecteur de l'état.
Pokémon, équipe et PC (game/pokemon/, game/storage/)
PokemonInstance: un Pokémon concret (capacités débloquées, nature, sans IV ni EV).PokemonTeam: équipe de 6 maximum, utilisée par le joueur et les PNJ.TrainerData/TrainerPartyEntry: équipes des PNJ dresseurs.PokemonStorage/PokemonBox/pc_screen: stockage de type « boîte PC » quand l'équipe est pleine.
Montures (game/mount/ et data/mounts/)
Certains Pokémon peuvent être montés hors combat. Le code est dans game/mount/, les profils de monture (.tres) dans data/mounts/.
Données Pokémon (addons/pokeapi_importer/ et data/)
- Le plugin d'éditeur pokeapi_importer importe depuis PokeAPI uniquement les Pokémon, capacités et objets choisis, et les écrit en
.tresdansdata/. - Il est autonome (prévu pour un dépôt séparé) : le jeu utilise ses données, mais ne doit pas le modifier.
- Le
Pokedex(autoload) est côté jeu, dansgame/core/.
Interfaces
Le jeu est pensé manette d'abord (clavier et souris restent possibles). Toute nouvelle interface doit être entièrement utilisable à la manette, avec un focus initial défini. Les icônes de touches viennent du plugin controller_icons.
Autoloads
| Autoload | Rôle |
|---|---|
game_data |
Sauvegarde et progression |
pokedex |
Accès aux Pokémon et capacités par id ou nom |
ui_audio |
Sons d'interface |
Règles pour garder le projet rangé
- Un script et sa scène vont dans le même dossier.
- Aucun script dans
assets/, aucun gros fichier brut dansgame/. - Déplacer et renommer les fichiers depuis le dock FileSystem de Godot, jamais depuis l'explorateur de l'OS.
- Après un déplacement, chercher
res://dans le projet : les chemins écrits en chaîne de caractères ne sont pas mis à jour automatiquement. - Ne pas mélanger un renommage et un déplacement dans le même commit Git.
- Mettre ce document à jour quand un nouveau dossier ou système apparaît.