10/04/2008

10/04/08 - 22:03

Souvenirs de joueur [radotages]

Dans un passé maintenant lointain malgré mes efforts derniers de le faire ressurgir à force d'invocations diverses, je fus un sorcier redoutable. Du moins dans l'univers fort confiné d'un jeu informatique du nom de « Heretic, Shadow of the Serpent Riders ».

Ma faible agilité ne suffisant pas toujours à me sortir des chausse-trappes proprement infernaux préparés par les scénaristes du jeu -- je puis l'avouer aujourd'hui -- j'avais succombé à la tentation de la fontaine de jouvence que m'offraient les fameux « cheat codes ».

Mais il ne me suffisait pas de recevoir ces derniers comme une manne venue de camarades compatissants. Je voulais moi-même retrouver ces informations. Il s'agissait d'un défi technique. En vain je scrutais un à un les fichiers de ce jeu en vue d'y identifier des termes intéressants ou des motifs intrigants, ce qui est la même chose. Faute d'y parvenir, je restais interloqué, envisageant que, peut-être, les codes recherchés auraient été cryptés.

Hier m'est apparue la confirmation de cette hypothèse d'il y a dix ans. En effet, le code source -- c'est à dire le texte définissant complètement le logiciel -- est aujourd'hui publié et disponible en de multiples endroits. La curiosité m'a poussé à le scruter et j'ai très rapidement identifié le fichier qui m'intéressait et la définition de macro-commande suivante :

#define CHEAT_ENCRYPT(a) \
((((a)&1)<<5)+ \
(((a)&2)<<1)+ \
(((a)&4)<<4)+ \
(((a)&8)>>3)+ \
(((a)&16)>>3)+ \
(((a)&32)<<2)+ \
(((a)&64)>>2)+ \
(((a)&128)>>4))

Ainsi les codes en question étaient-ils bien cryptés, et de façon rudimentaire puisque, pour qui ouvre les yeux, il est évident qu'il s'agit tout bonnement d'une permutation des bits d'un octet (je l'explique ensuite). Mais on remarquera l'usage judicieux d'une macro-commande, de façon à ce que la chaîne de caractères correspondant au code se trouve cryptée au moment de la compilation. Autrement dit, mes recherches enfantines étaient vouées à l'échec, il m'aurait fallu procéder à une inspection beaucoup plus fine pour avoir une chance d'identifier les informations recherchées.

Un exemple d'utilisation de la macro :
// Toggle no clipping mode
static byte CheatNoClipSeq[] =
{
CHEAT_ENCRYPT('k'),
CHEAT_ENCRYPT('i'),
CHEAT_ENCRYPT('t'),
CHEAT_ENCRYPT('t'),
CHEAT_ENCRYPT('y'),
0xff
};

Revenons au cryptage. Comme on le constate dans l'exemple précédent, la macro CHEAT_ENCRYPT est utilisée pour crypter les caractères un à un. Quant à comprendre le fonctionnement de cette dernière, ce n'est pas si compliqué qu'il peut sembler au néophyte. Un caractère informatique (dans sa version rudimentaire) est représenté par la juxtaposition de 8 bits, lesquels valent soit 0 soit 1. Il s'agit en fait ici de changer l'ordre de ces bits selon la correspondance suivante :

position initiale : 12345678
position image : 45287136

J'entends déjà les cris et les reproches qu'on m'adresse (j'entends par là « ceux que m'aurait adressé un lecteur »). En effet celui-là a raison : je n'ai pas identifié mon public, le niveau requis pour comprendre n'est pas uniforme et même les verbes sont conjugués à des temps et modes douteux. Qu'il aille se faire etc.