Outils pour utilisateurs

Outils du site


back2root:reverse-engineering:planet-x3:part2-savegame_dat

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
back2root:reverse-engineering:planet-x3:part2-savegame_dat [2023/01/13 20:07] – modification externe 127.0.0.1back2root:reverse-engineering:planet-x3:part2-savegame_dat [2023/01/17 09:07] (Version actuelle) frater
Ligne 2: Ligne 2:
  
 Ce fichier est un "dump mémoire" du jeu, il n'est pas compressé ni crypté; on y retrouve la meme structure que dans le code source. Ce fichier est un "dump mémoire" du jeu, il n'est pas compressé ni crypté; on y retrouve la meme structure que dans le code source.
 +
 +Le fichier est composé de 3 "blocs" de données:
 +
 +  * 1 [[#blockmap|block]] de 32 Kb (0x8000 bytes) avec la carte en cours
 +  * 1 [[#blockunit|block]] de 2560 bytes (0x1010 bytes) contenant les unités/batiments des 2 factions
 +  * 1 [[#blocktimer|block]] de 5 bytes (0x0005 bytes) contenant principalement les timers du jeu.
 +
 +une sauvegarde fait donc TOUJOURS 36885 bytes
  
 ===== Function de sauvegarde/chargement ===== ===== Function de sauvegarde/chargement =====
Ligne 7: Ligne 15:
 Dans le code source, la sauvegarde se fait <color #ed1c24>**uniquement**</color> dans le fichier ''SAVEGAME.DAT''. Dans le code source, la sauvegarde se fait <color #ed1c24>**uniquement**</color> dans le fichier ''SAVEGAME.DAT''.
  
-elle est composée de 3 "blocsde données:+<code asm> 
 +Game_WriteSaveGame: 
 + MOV AH,0x3c ; bug no mod selected : random ? 
 + MOV CX,0x0 
 + MOV DX,fname_SaveGame_DAT ;"SAVEGAME.DAT" 
 + MOV AH,0x3c 
 + INT 0x21 ; Create/truncate file 
 + JC exitError ; exit function without handling 
 + MOV [fhandler_SaveGame],AX ; preserve file handler 
 +     JMP continue 
 +exitError: RET 
 +</code> 
 +On découvre ici que cette fonction ne gère **aucune** erreur, la sauvegarde est simplement abandonnée en cas d'erreur d'ouverture de fichier.
  
-  1 [[#blockmap|block]] de 32 Kb (0x8000 bytes) avec la carte en cours +L'usage du **JMP** pour sauter au dessus du **RET** d'erreur ressemble beaucoup à une structure de gestion d'erreurs (qui a été éliminée de la version finalepropre aux processeurs sans caches (8088, 8086, 6502, etc). 
-  [[#blockunit|block]] de 2560 bytes (0x1010 bytescontenant les unités/batiments des 2 factions + 
-  * 1 [[#blocktimer|block]] de 5 bytes (0x0005 bytes) contenant principalement les timers du jeu.+Personnellement, je n'aurais pas rompu le flux avec un **JMP** j'aurais placé la gestion (ou non) des erreurs à la fin de la fonction, et réservé le saut (rupture de flux) aux erreurs, afin de ne pas forcer un "flush cache" sur des processeurs plus puissant (x386 et suivant). 
 + 
 +<code asm>  
 +continue: MOV BX,word ptr [fhandler_SaveGame] ; fhandler 
 + 
 + ; save current game map 
 + MOV DX,0x0 
 + MOV CX,0x8000 ; 0x8000 = 256*128  
 + MOV AH,0x40 
 + PUSH DS ; switch to map's Segment 
 + MOV DS,word ptr [g_Seg_GameMap] 
 + INT 0x21 ; write map (32kb) 
 + POP DS ; restore DS 
 +</code> 
 + 
 +la carte du jeu est sauvegardée "tel quel" sans aucune encryption ni compression. 
 + 
 +<code asm>  
 + ; save unit/building records 
 + MOV BX,word ptr [fhandler_SaveGame] 
 + MOV DX,Game_UnitsArr_Type 
 + MOV CX,0x1010 ; Write 256 units/buildings (10 attributes) 
 + MOV AH,0x40 
 + INT 0x21 
 +</code> 
 + 
 +Pareil pour la structure des unités/batiments, sauvegardée "tel quel" sans aucune encryption ni compression. 
 + 
 +<code asm>  
 + ; save Ingame timers 
 + MOV BX,word ptr [fhandler_SaveGame] 
 + MOV DX,Timer_InGame_Counter 
 + MOV CX,0x5 ; 1 word (total seconds) + 3 bytes (Hours:minutes:seconds) 
 + MOV AH,0x40 
 + INT 0x21 
 +</code> 
 + 
 +Avant de fermer le fichier, Planet X3 sauvegarde le compteur de temps générale (1 mot) et le temps "en jeu" 3 bytes
  
-une sauvegarde fait donc TOUJOURS 36885 bytes +<code asm>  
 + MOV AH,0x3e ; close file 
 + MOV BX,word ptr [fhandler_SaveGame] 
 + INT 0x21 
 + RET  
 +</code>
  
 ===== Block Map ===== ===== Block Map =====
Ligne 144: Ligne 206:
  
  
 +====== Tiles ======
 + 
 +{{:back2root:reverse-engineering:planet-x3:pasted:20230114-113015.png}}
back2root/reverse-engineering/planet-x3/part2-savegame_dat.1673636830.txt.gz · Dernière modification : 2023/01/13 20:07 de 127.0.0.1