Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
back2root:reverse-engineering:planet-x3:part2-savegame_dat [2023/01/12 15:48] – frater | back2root:reverse-engineering:planet-x3:part2-savegame_dat [2023/01/17 09:07] (Version actuelle) – frater | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Format of " | + | ====== |
Ce fichier est un "dump mémoire" | Ce fichier est un "dump mémoire" | ||
+ | Le fichier est composé de 3 " | ||
- | |0x0000 - 0x7fff |256x128 tile codes top-left=0x0000 | + | * 1 [[#blockmap|block]] de 32 Kb (0x8000 |
- | |0x8000 | + | * 1 [[# |
- | |0x8014 - |constructions type 14: | + | |
- | |0x8080 - |enemy constructions type 21:HQ 22:Gun Tower | | + | |
- | |0x8100 - 0x8113 unit| X position | + | |
- | |0x8114 - |constructions X position | + | |
- | |0x8180 - |enemy constructions X position | + | |
- | |0x8200 - 0x8213 unit| Y position | + | |
- | |0x8214 - |constructions Y position | + | |
- | |0x8280 - |enemy construction Y position | + | |
- | |0x8700 - 0x873f life| values for units and constructions | + | |
- | |0x8740 - 0x876f ~ un|known area | | + | |
- | |0x8780 - 0x87bf enem|y lifes for units and constructions | + | |
- | |0x87c0 - 0x8fff |~ unknown area | | + | |
- | |0x8910 - |missile silo fill up | | + | |
- | |0x9000 - |0x31 = green 0x32= ice 0x33=desert | + | |
- | |0x9001 - |current selected unit | | + | |
- | |0x9002 - |Difficulty 0 1 2 | | + | |
- | |0x9003 - |Mine | + | |
- | |0x9004 - |Gas | + | |
- | |0x9005 - |Energy | + | |
- | |0x9006 - 0x900f ~ un|known area | | + | |
- | |0x9010 - |ms | + | |
- | |0x9011 - |~ unknown area | | + | |
- | |0x9012 - |Second | + | |
- | |0x9013 - |Minute | + | |
- | |0x9014 - |Hour | + | |
+ | une sauvegarde fait donc TOUJOURS 36885 bytes | ||
+ | |||
+ | ===== Function de sauvegarde/ | ||
+ | |||
+ | Dans le code source, la sauvegarde se fait <color # | ||
+ | |||
+ | <code asm> | ||
+ | Game_WriteSaveGame: | ||
+ | MOV AH, | ||
+ | MOV CX, | ||
+ | MOV DX, | ||
+ | MOV AH, | ||
+ | INT 0x21 ; | ||
+ | JC exitError ; | ||
+ | MOV [fhandler_SaveGame], | ||
+ | | ||
+ | exitError: | ||
+ | </ | ||
+ | On découvre ici que cette fonction ne gère **aucune** erreur, la sauvegarde est simplement abandonnée en cas d' | ||
+ | |||
+ | L' | ||
+ | |||
+ | Personnellement, | ||
+ | |||
+ | <code asm> | ||
+ | continue: | ||
+ | |||
+ | ; save current game map | ||
+ | MOV DX, | ||
+ | MOV CX, | ||
+ | MOV AH, | ||
+ | PUSH DS ; | ||
+ | MOV DS, | ||
+ | INT 0x21 ; | ||
+ | POP DS ; | ||
+ | </ | ||
+ | |||
+ | la carte du jeu est sauvegardée "tel quel" sans aucune encryption ni compression. | ||
+ | |||
+ | <code asm> | ||
+ | ; save unit/ | ||
+ | MOV BX, | ||
+ | MOV DX, | ||
+ | MOV CX, | ||
+ | MOV AH, | ||
+ | INT 0x21 | ||
+ | </ | ||
+ | |||
+ | Pareil pour la structure des unités/ | ||
+ | |||
+ | <code asm> | ||
+ | ; save Ingame timers | ||
+ | MOV BX, | ||
+ | MOV DX, | ||
+ | MOV CX, | ||
+ | MOV AH, | ||
+ | INT 0x21 | ||
+ | </ | ||
+ | |||
+ | Avant de fermer le fichier, Planet X3 sauvegarde le compteur de temps générale (1 mot) et le temps "en jeu" 3 bytes | ||
+ | |||
+ | <code asm> | ||
+ | MOV AH, | ||
+ | MOV BX, | ||
+ | INT 0x21 | ||
+ | RET | ||
+ | </ | ||
+ | |||
+ | ===== Block Map ===== | ||
+ | {{anchor: | ||
+ | {{tablelayout? | ||
+ | ^ Offset | ||
+ | | 0x0000 | ||
+ | | 0x8000 | ||
+ | | 0x9010 | ||
+ | |||
+ | ==== Block d' | ||
+ | {{anchor: | ||
+ | {{tablelayout? | ||
+ | ^ Offset | ||
+ | | +0x0000 | ||
+ | | +0x0100 | ||
+ | | +0x0200 | ||
+ | | +0x0300 | ||
+ | | +0x0400 | ||
+ | | +0x0500 | ||
+ | | +0x0600 | ||
+ | | +0x0700 | ||
+ | | +0x0800 | ||
+ | | +0x0900 | ||
+ | | +0x0A00 | ||
+ | | +0x0B00 | ||
+ | | +0x0C00 | ||
+ | | +0x0D00 | ||
+ | | +0x0E00 | ||
+ | | +0x0F00 | ||
+ | | +0x1000 | ||
+ | |||
+ | |||
+ | Pour n' | ||
+ | |||
+ | {{tablelayout? | ||
+ | ^ Offset | ||
+ | | +0x0000 | ||
+ | | +0x0014 | ||
+ | | +0x0080 | ||
+ | | +0x0094 | ||
+ | |||
+ | Suivant le code, le nombre maximum d' | ||
+ | |||
+ | * Dans 2 fonctions, PX3 vérifie le status (offset 0x0000) pour les indices de 0 à 20 (0x00-0x14) | ||
+ | * Dans 1 fonction, PX3 vérifie le status (offset 0x0000) pour les indices de 20 à 50 (0x14-0x32) | ||
+ | * Dans 5 fonctions, PX3 vérifie le status (offset 0x0000) pour les indices de 0 à 64 (0x00-0x40) | ||
+ | * Dans 2 fonctions, PX3 vérifie le status (offset 0x0000) pour les indices de 20 à 64 (0x14-0x40) | ||
+ | |||
+ | <WRAP round help> | ||
+ | meme si le code présente bien des limites pour le joueur, je n'ai pas trouvé trace de limite similaire pour l' | ||
+ | </ | ||
+ | |||
+ | ==== Block de configuration ==== | ||
+ | |||
+ | ^ offset | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | ===== Block " | ||
+ | {{anchor: | ||
+ | |||
+ | ^ offset | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |||
+ | ===== Information détaillée ===== | ||
+ | |||
+ | {{tablelayout? | ||
+ | ^ Offset | ||
+ | | 0000 | ||
+ | | 8000 | ||
+ | | 8014 | ||
+ | | 8080 | ||
+ | | 8100 | ||
+ | | 8114 | ||
+ | | 8180 | ||
+ | | 8200 | ||
+ | | 8214 | ||
+ | | 8280 | ||
+ | | 8700 | ||
+ | | 8714 | ||
+ | | 8780 | ||
+ | | 8910 | ||
+ | | 9000 | ||
+ | |||
+ | ====== Type de Carte/ | ||
+ | {{anchor: | ||
+ | ^ Valeur | ||
+ | | 0x31 | Champs "green valey" | | ||
+ | | 0x32 | Monde de glace (ice) | | ||
+ | | 0x33 | désert | | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | ====== Type d' | ||
+ | {{anchor: | ||
+ | {{tablelayout? | ||
+ | ^ Valeur | ||
+ | | 0x01 | builder | ||
+ | | 0x02 | tank | | ||
+ | | 0x03 | Heavy Tank | | ||
+ | | 0x04 | frigate | ||
+ | | 0x1F | Missile ? | | ||
+ | |||
+ | ====== Type de Batiments ====== | ||
+ | {{anchor: | ||
+ | {{tablelayout? | ||
+ | ^ Valeur | ||
+ | | 0x14 | Joueur | ||
+ | | 0x15 | Joueur | ||
+ | | 0x16 | Joueur | ||
+ | | 0x17 | Joueur | ||
+ | | 0x19 | Joueur | ||
+ | | 0x1A | Joueur | ||
+ | | 0x1B | Joueur | ||
+ | | | Joueur | ||
+ | | 0x21 | Ennemi | ||
+ | | | Ennemi | ||
+ | | | Ennemi | ||
+ | | | Ennemi | ||
+ | | | Ennemi | ||
+ | | | Ennemi | ||
+ | |||
+ | |||
+ | ====== Tiles ====== | ||
+ | |||
+ | {{: |