Texte Compressé - Compression LZSS - Par Skeud

Ce type de compression peut être adapté pour d'autres jeux (exemple : FF7 pour play, etc...).

Ce qui suit à été écrit par Wild Ham:

1ère Partie:
Il faut avant tout savoir la notation binaire, qui n'a que les valeurs 0 et 1. 8 Bits équivaux à un octect, valeurs 0 à FF. Avec Base Converter, on peut convertir les valeurs, donc

FF=11111111
FE=11111110
FD=11111101
etc...

Maintenant, on va dans ogre battle, dans la zone du début du script :
FF1810511057617272FF656E3A4974207365FF656D732074686174FF20796F7520686176FF650D
707265706172BF656420666F7207E565FF20626174746C6520FF61686561647F0059

Ou, en ASCII :
...Q.Warr.en:It se.ems that. you hav.e.prepar.ed for..e. battle .ahead..Y

Avec un peu d'observation, on voit des octect sans aucun rapport dans le script, comme le FF dans 'Warren'. On va regarder le texte d'une autre façon:

FF1810511057617272
FF656E3A4974207365
FF656D732074686174
FF20796F7520686176
FF650D707265706172
BF656420666F7207E565 (Hum hum...)
FF20626174746C6520
FF61686561647F0059

------------------

...Q.Warr
.en:It se
.ems that
. you hav
.e.prepar
.ed for..e
. battle
.ahead..Y

La première phrase ne semble pas avoir quoi que ce soit de compressé. Alors qu'à la deuxième manque un ' th'(on fait gaffe à l'espace!!) vu que la phrase complète dans le jeux est 'for the'. Donc celle ci est compressée. De plus les deux avant-derniers octects ressemblent à un pointeur!

65 0D 70 72 65 70 61 72
-1- -1- -1- -1- -1- -1- -1- -1-

65 64 20 66 6F 72 07 E5 65
-1- -1- -1- -1- -1- -1- -0- -1-

Dans ce type de compression, on utilise un octet pour définir si la donée est compressée ou non. Ici, un 1 signifie qu'un octet est lu, que l'on écrit à l'écran. Si il y a un zéro, 2 octets sont lus, grace auxquels on peut calculer la longueur compressée, et l'adresse de la chaîne décompressée.

Voilà où en était Wild, et où il avait bloqué. Zinkietez pas, voilà la suite! on va s'interesser au pointeur 07 E5.
Décortikons-le :
07 = 00000111
E5 = 11100101

Ce qui fait côte à côte :
00000111 | 11100101

C à partir d'ici que commencent les recherche pour un autre jeu dont on recherche le format des pointeurs. Mais ici, je le donne :
Le format des pointeurs d'ogre battle est ainsi :
L5 L4 L3 L2 L1 OB OA O9 | O8 O7 O6 O5 O4 O3 O2 O1

Ce qui siginfie en clair Lx = Longueur compressée et Ox = offset du pointeur (mais pas directement. Les explikations viennent après.

On a donc :
L5 L4 L3 L2 L1 OB OA O9 | O8 O7 O6 O5 O4 O3 O2 O1
0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1
(voix OFF) : "Oh le nuuul! La taille est de 0! Alors que 3 caractères sont compressés. L'est trop naze lui!"

Mais nooon. On ajoute TOUJOURS 3 à la longuer. Car la compression devient utile au dessus de 3 caratères.. Pfffff.
Maitenant, LE POINTEUR!
Ca nous donne 07E5, ce que l'on avait avant. Mais c normal, car la longueur compressée est ici minimale...Pas grave si vous pigez pas.
Je vous disais que la position pointée était calculée d'une certaine façon. Voilà la formule :

OFFSET POINTE = OFFSET DU PREMIER OCTET DU POINTEUR + POINTEUR - 2048d

Ce qui nous donne dans notre exemple, 07E5 situé à 1540EF +07E5-2048d = 1540D4 on va voir à cette adresse, et on se retrouve juste à la fin d'un " th". Et voilà. Je pense que la fin de la formule serait -taillecompressée.

Mais pourkoi 2048 (ou 800h en hexa). Si vous voulez le savoir, il faudra lire mon tut sur le LZ77 et ses dérivés.


VOILA! C fini! J'espère que cette doc a été utile. Merci de me le faire savoir! J'écrirait un tut sur la compression LZ77 SEULEMENT si G 3 ou 4 mails Minimums qui me le demandent..

Les remerciements :
WILDHAM ! Merci pour ton chtit tut ki m'a mis sur la voie (ca fait 4 mois ke j'avais les pièces du puzzle, mais pas moyen de le former!)
CzarDragon : Sans lui, Rien n'aurait été possible.
MERA : Bah, c un pote. C tout!
LAG : Bah pareil. Sauf que pour lui, je comprends ce qu'il écrit... pas comme mer.. :-)))

PS : Pour ceux qui veulent avoir d'autres formats de pointeurs, allez voir la doc de czardragon à
Zophar's Domain sur la compression LZW. Mais ATTENTION ! ici, ce n'est PAS de la compression LZW. C'EST UNE ERREUR! OK ? La comrpession LZW ne fonctionne PAS vraiment comme la compression LZSS!!


Retour