Skip to content

Latest commit

 

History

History
156 lines (109 loc) · 7.08 KB

File metadata and controls

156 lines (109 loc) · 7.08 KB

Guide Développeur & Base de Connaissances

Persona 2: Innocent Sin FR (PSP)


Statut Reverse Engineering

Note

Bienvenue dans la documentation technique exhaustive du projet. Ce document s'adresse aux développeurs, programmeurs et romhackers. Il détaille l'architecture de notre outil de compilation maison (p2is_tool), les spécificités du moteur Atlus et le fonctionnement des archives CRI Middleware.



Sommaire

  1. La Stack Technique (V2)
  2. Architecture et Pipeline de Compilation
  3. Gestion Mémoire et Algorithme du Delta
  4. Opcodes et Bytecode Atlus
  5. Structure Modulaire du Code Source
  6. Le Patcher Web (WebAssembly)


La Stack Technique (V2)

L'outil de romhacking a été restructuré en une application web locale performante, asynchrone et modulaire.


  • Backend : L'API se charge de la décompression, de l'analyse (parsing) et de la recompilation de l'ISO en manipulant directement les flux hexadécimaux.
  • Frontend : Une interface utilisateur réactive fournissant des retours visuels en temps réel.
  • Déploiement Automatisé : L'application est orchestrée via le fichier start.bat qui installe de façon autonome les dépendances nécessaires.

Dépendance Externe : CriFsLib
L'extraction de l'archive principale du jeu (P2PT_ALL.cpk, environ 800 Mo) est déléguée à l'exécutable tiers CriFsLib.GUI.exe (développé par Sewer56). Ce choix garantit une extraction rapide et sécurisée du système de fichiers propriétaire de CRI Middleware.



Architecture et Pipeline de Compilation

Le traitement automatisé de l'ISO s'articule autour de quatre phases :

► 1. Extraction
  • Isolement du fichier P2PT_ALL.cpk depuis l'ISO originale.
  • Appel à CriFsLib pour dépaqueter l'archive.
  • Décompression LZSS (algorithme CRILAYLA) des fichiers vitaux tels que event.bin.
  • Découpage séquentiel des scripts (script_000.bin à script_398.bin).
► 2. Décodage (Parsing)
  • L'API analyse le bytecode propriétaire d'Atlus et sépare les opcodes du texte original.
  • Génération de fichiers .json clairs et normalisés destinés à la traduction.
► 3. Encodage (Injection)
  • Lecture et validation des données JSON traduites.
  • Application du remappage des accents français vers les ID VRAM.
  • Recalcul dynamique des tables de pointeurs absolus afin d'accommoder les variations de longueur de texte.
  • Génération des nouveaux fichiers binaires modifiés.
► 4. Rebuild (Compilation ISO)
  • Recompression LZSS des nouveaux scripts.
  • Réinjection dans le CPK et actualisation stricte de la TOC (Table Of Contents).
  • Patch LBA (Logical Block Addressing) de l'ISO 9660 : déplacement des secteurs de l'archive modifiée à la fin de l'image disque.


Gestion Mémoire et Algorithme du Delta

Le moteur de jeu Atlus gère la mémoire différemment selon le type de fichier, imposant des contraintes d'injection drastiques.

Fichier Cible Gestion des Pointeurs Contrainte Technique Majeure
event.bin Table d'Offsets Absolus Le moindre décalage provoque un crash immédiat. Le script reconstruit la table entière (offsets absolus et longueurs) à chaque compilation.
F_BE.BNP Scanner Séquentiel (Combat) L'ajout d'octets de padding (remplissage 00) provoque un Invalid Memory Access (Crash Philémon). L'Algorithme du Delta est utilisé pour compacter l'espace binaire de manière purement séquentielle.


Opcodes et Bytecode Atlus

Le moteur lit des opcodes de contrôle spécifiques que l'outil de parsing convertit en balises textuelles ([TAG]) pour les protéger lors de la traduction :

Opcode Hex (Little Endian) Tag Python Fonction In-Game
00 22 [START] Initialise une nouvelle chaîne de caractères en mémoire.
11 07 [END] Termine la chaîne et réinitialise le buffer d'affichage.
11 01 [NL] Applique un retour à la ligne.
12 08 [CHOICE] Affiche les options d'un menu contextuel.
14 31 [ANIM] Déclenche un événement lié à l'animation ou à l'UI (ex. visages).
02 11 [WAIT] Instruction de pause (historiquement responsable de crashs si mal positionnée).


Structure Modulaire du Code Source

Le backend Python localisé dans p2is_tool/src/ suit une séparation stricte des responsabilités :

  • core/iso.py : Manipulation directe de l'ISO 9660, extraction des secteurs et patching LBA.
  • core/text.py : Moteur de conversion String ↔ Shift-JIS Atlus et intégration de la table ACCENT_MAP.
  • core/compression.py : Logique bas niveau des algorithmes de décompression LZSS propriétaire CRILAYLA.
  • parsers/ : Scripts spécialisés dans l'heuristique de détection de texte (ex. bin_parser.py).
  • encoders/ : Logique d'assemblage binaire, de reconstruction des tables de pointeurs et d'application de l'Algorithme du Delta.


Le Patcher Web (WebAssembly)

Afin de faciliter l'installation du patch FR par les joueurs sans nécessiter le téléchargement d'un logiciel tiers, un Patcher Web a été intégré au projet dans le dossier p2is_patcher/.

  • Moteur : DeltaPatcher (GPL-2.0) compilé en WebAssembly (xdelta3.wasm) par Marco Calautti.
  • Performance : L'application tourne dans un Web Worker (xdelta3.worker.js) pour ne pas bloquer l'interface utilisateur.
  • Gestion Mémoire : Pour gérer des ISO de plus de 1 Go dans le navigateur sans saturer la RAM, le patcher utilise des Streams et un Service Worker (sw.js / mitm.html) permettant de sauvegarder le fichier de sortie au fur et à mesure de sa création.
  • Architecture : Le code frontend (HTML/CSS) respecte la charte graphique globale et s'exécute de façon entièrement locale et autonome.