Architecture By Year
Rôle
By Year est le framework historique où une activité progresse année par année. À chaque année, les équipes prennent des décisions game-specific, le serveur génère les résultats, calcule les évaluations et prépare l'année suivante.
flowchart LR
ACT[ActivityByYear] --> Y[Current Year]
Y --> DEC[TeamDecisionsByYear]
DEC --> GAME[Game-specific logic]
GAME --> RES[ResultsByYear]
RES --> EVAL[TeamEvaluation / StudentEvaluation]
RES --> NEXT[Next Year]
Unity
Assets/Src/Game/Data/ByYear/
Controllers
Assets/Src/Game/Controllers/*ByYear*
UI commune
Assets/Src/UI/SimByYear/
Game-specific
Assets/GameSpecific/ent1|hr1|mgt1|mk1|mk2/
Serveur
_utils/utils_by_year.js: cycle, calendrier, jobs, bots et helpers annuels;_utils/utils_eval.js: évaluations communes;_utils/utils_rankings.js: rankings;_utils/factory/utils_factory_generate_results.js: sélection du moteur de résultats par GameUid;_utils/factory/utils_factory_eval.js: sélection du moteur d'évaluation par GameUid;<gameUid>/utils/*: décisions, events, résultats et scoring propres au jeu.
Game-specific
Contrairement à Accounting, By Year n'a pas une seule logique métier partagée. Le framework fournit le cycle; les jeux fournissent les décisions et les calculs. Il faut donc éviter de mettre les règles MK1, HR1 ou ENT1 dans une page “Common”.
Ajouter un nouveau jeu By Year de A à Z
Un nouveau jeu annuel n'est pas seulement un nouveau dossier GameSpecific. Il doit être branché côté Unity, static data, serveur, génération, évaluation, résultats, messages, UI et factories.
1. GameUid et composition Unity
SharedConstants.
Le mapper vers SimType.ByYear.
Créer Assets/GameSpecific/<gameUid>/.
Créer les modèles StaticData, Team, TeamDecisions, Results et les controllers game-specific nécessaires.
Brancher les classes dans Factory.cs.
2. Static data
Ajouter le jeu dans node.js/exports/exportAllData.js avec Spreadsheet/GIDs et fichiers supplémentaires. Créer Resources/data_<gameUid>, importer puis vérifier StaticDataController<Game>.
3. Serveur game-specific
Créer server_scripts/<gameUid>/ avec :
utils/<gameUid>_utils.js — GameSpecificUtils*;
utils/<gameUid>_utils_generate_results.js — GenerateResults*;
utils/<gameUid>_utils_eval.js — Eval* si l'évaluation est spécifique;
utils/..._bots.js si async/bots;
wrappers command/.
4. Brancher les factories serveur
utils_factory_game_specific_utils.js;
utils_factory_generate_results.js;
utils_factory_eval.js;
takeBotsDecision() / factory bots si le jeu supporte les bots.
5. Définir le cycle annuel du jeu
Implémenter au minimum startYearGameSpec(actData), getYearData(), generateEvents(), gameSpecificInitTeam(), startCash(), anyDecisionsTaken() et les helpers métier requis.
6. Génération
GenerateResults<Game>.generateCurrentYearResults(actData) doit être l'entrée unique du calcul annuel. Il doit lire les équipes/décisions, calculer les résultats, les sauvegarder et préparer l'état de l'année suivante sans dépendre de l'UI.
7. Unity UI
Créer les contrôles game-specific dans GameSpecific/<gameUid>/Src/UI, plus les prefabs/scenes/Resources. Les composants génériques année/eval/rankings restent sous Src/UI/SimByYear.
8. Textes, scénario, tutoriels, timelines
Ajouter les textes et assets propres au jeu. Si le jeu possède ses propres tutoriels/timelines, les placer dans ses dossiers GameSpecific et les brancher via les states/UI concernés.