Formats de fichiers, scènes et palettes

Annexe technique · Accueil · English

Fichier Taille (o) Format Données
G1.CON 295 406 .CON 60 (20 enregistrements)
G2.CON 70 513 .CON 15 (5 enregistrements)
G3.CON 114 229 .CON 18 (4 enregistrements)
G4.CON 180 769 .CON 53 (5 enregistrements)
G5.CON 54 978 .CON 93 (2 enregistrements)
G6.CON 63 860 .CON 16 (4 enregistrements)
MUS.HUF 31 782 fichier de flux 29
SND.HUF 4 478 fichier de flux 28
SAUP.MAU 2 467 brut 1
DEMOFR.MAU 895 brut 1
HNF.HUF 4 717 pas des données du jeu voir section 4

Cela fait 40 enregistrements .CON, 255 blocs de données .CON et 57 flux .HUF (312 au total, 952 709 o), plus les deux fichiers .MAU.

Fichiers nommés par maup.exe : G1-G6.CON, SAUP.MAU, DEMOFR.MAU, MUS.HUF, SND.HUF, SAUVEMAU.00n, et sous condition G7.CON (ci-dessous).

1. .CON

Lecture : Con_ReadRecord EA 0x13F9F (vérifié)

Arguments, empilés du premier au dernier : enregistrement, sous-indice, segment de destination, décalage de destination.

  1. Appelle Con_OpenArchive EA 0x140EC.
  2. Parcourt wConArchiveSentinels EA 0x1AE64 : six groupes de numéros d'enregistrements terminés par 0xFFFF. Le numéro du groupe choisit ConOfs_Disk1-6 (EA 0x1ADAC, 0x1AE00, 0x1AE18, 0x1AE2C, 0x1AE44, 0x1AE50) ; la position dans le groupe choisit un mot double de cette table.
  3. Se place en base + 4*sub, puis lit 8 octets dans ConRecIndexBuf EA 0x1AEC0.
  4. Se place en base + start, et lit next - start octets (mots bas) dans le tampon de l'appelant.
  5. Ne ferme le fichier que si la longueur est non nulle.

Les groupes sont : 0,1,2,4,5,6,8,9,B,C,D,E,12,13,14,17,18,1A,1C,1E / 7,A,10,15,1B / 27,28,29,2A / 21,22,23,2B,2C / 20,1F / 3,F,19,1D.

Choix de l'archive : Con_OpenArchive (vérifié)

  • Le nom vient de wConRecordToArchive[record] EA 0x1AD52 : emplacement (n-1)*7 de aConNames EA 0x1AEC8. L'ouverture se fait en AX=3D80h.
  • bConDiskLayoutVariant EA 0x1AA92 est positionné par Sys_DetectMedia EA 0x10842 à partir de INT 21h AH=1Bh : l'octet de média F9h donne 1, F8h (disque dur) donne 2, tout le reste donne 0.
  • La variante 2 saute les contrôles de disque. Sinon, le disque voulu vient de bConRecordDiskMap0/1 EA 0x1ACF8 / 0x1AD25 ; en cas de différence, Con_PromptDisk EA 0x128F7 s'exécute avec AX = 8, 0x306 ou 6.
  • G7.CON : avec la variante 0, l'enregistrement 0x20, le disque actuel 2 et un sous-indice hors de 4..9, le chiffre du nom G5.CON est remplacé par 7 en 0x14185. Aucun G7.CON n'est dans ce dossier. Il appartient sans doute à un jeu de disquettes basse densité (déduit), et une installation sur disque dur ne passe jamais par là.
  • Un échec d'ouverture efface l'octet de disque et revient au début (0x141CF).

Découpage des données

Entrées de 4 octets, N = first entry / 4, payload[k] = blob[base + start[k] : base + start[k+1]]. Toutes les archives se découpent exactement (selftest) ; 39 blocs sont vides, toujours le dernier emplacement d'un enregistrement.

Contenu connu des enregistrements

Enregistrement Contenu Preuve
0x27 sous-enr. 2 image plein écran vérifié : un voilier au coucher du soleil
0x27 sous-enr. 9, 10 flux du codec, de type musical codec vérifié ; chargés par Huf_LoadRec27Music EA 0x1781C
0x27 sous-enr. 0, 1, 3-8 éléments du cadre et sprites d'interface, comme le titre et la loupe ; rôles exacts non établis chargement vérifié
0x28 sous-enr. 0 1 589 tailles de chaînes u16 gros-boutiennes, en 7 banques vérifié
0x29 sous-enr. 0 texte du jeu compacté sur 5 bits, en 7 banques vérifié : voir Texte et polices
0x2A sous-enr. 0 table de 516 entrées de données de logique, ci-dessous structure vérifiée
0x00-0x1E sous-enr. 0, 1 lieux : le sous-enr. 0 est le décor, ci-dessous vérifié pour le sous-enr. 0
0x22 décor de conversation et les neuf portraits de personnages, chargés par Con_LoadRec22Images vérifié
0x2B sous-enr. 0 échantillons de parole : 644 décalages gros-boutiens, puis audio delta sur 4 bits. Voir Parole vérifié
0x2C sous-enr. 0 phrases parlées : 460 décalages gros-boutiens (450 utilisés), puis mots de phonèmes sur 16 bits. Voir Parole vérifié

Images : Img_Decode EA 0x14930 (structure vérifiée)

Arguments far : segment source, décalage source, segment de destination, x, y.

u8 kind; u8 tileCount
if kind == 0: 16 big-endian palette words, 0RGB with 3 bits per channel; no transparency
else:         u8 transparent colour; u8 unused
each tile:    be16 lenA, lenB, x, y, flags, w-1, h-1, then its data
  • L'octet haut de flags est le mode de balayage, aiguillé en 0x14B91 + 3*mode, de 0 à 18.
  • Le mode 0 stocke des quartets bruts. Les autres construisent une liste de valeurs en quartets (lenA) et une liste de longueurs de plages en quartets (lenB) dans une zone de travail au segment de destination +0xFA0, juste après la page de 64 000 octets.
  • Les bits 0 et 1 de flags indiquent que ces listes sont elles-mêmes compressées par plages.
  • Les ordres de balayage comprennent des lignes et colonnes en serpentin et plusieurs motifs diagonaux.

rec27_sub02 a une palette de 16 couleurs et quatre tuiles qui couvrent exactement 320×200 :

L'image d'introduction, enregistrement 0x27, sous-enregistrement 2

tools/decode_image.py porte les 19 modes. Exécutée dans un émulateur, la routine du jeu produit la même page pour les 439 images du jeu (tools/verify_image.py).

Autres enregistrements d'images :

Enregistrement Contenu
0x1F icônes des objets, dans l'ordre de la liste d'objets
0x20 calques de scène datés (ci-dessous)
0x21 pages de livre, de journal, de calendrier et de parchemin, avec leurs fonds ; les sous-enr. 6 et 7 sont les deux moitiés de l'inscription des pirates
0x22 décor de conversation et portraits ; la palette semble être celle de l'enregistrement 0x23 (déduit)
0x23 carte de l'île et petits portraits
0x27 titre, éléments du cadre et sprites d'interface

Lieux : service 0x18 Con_LoadRoom EA 0x12640 (vérifié)

Le numéro d'enregistrement est le numéro du lieu moins 1 : MAUPITI1 passe DS:166 - 1, et les captures d'écran le confirment (le lieu 26, la cabine, est l'enregistrement 0x19). Le sous-enr. 0 contient deux palettes de 16 mots en +0 et +0x20, puis une image normale en +0x40 avec sa propre palette en +0x42, dessinée en (0,0). Les tailles des en-têtes se suivent exactement : pour l'enregistrement 0x1A, 21 tuiles remplissent les 11 418 octets restants. Six lieux de jour :

Six lieux de jour

Une scène se dessine par calques avec Room_Enter MAUPITI1 EA 0x141CB ; tools/render_scene.py le porte, et scenes/ contient tous les lieux. Sur les quatre captures d'écran, seul le pointeur de la souris diffère dans la zone d'image (49-61 pixels chacune). À gauche, les captures ; à droite, le rendu :

Captures d'écran à côté du rendu

  1. Décor : sous-enr. 0.
  2. Zones : tables 0x129 (nombre par lieu) et 0x12A (zone). L'état DS:92F + 11 * room + i choisit l'image ouverte (tailles dans 0x12B) ou fermée (0x12C). Une zone est ignorée si son drapeau dans DS:7B5 est à zéro, sauf si Zone_Alias EA 0x1079F la fait correspondre à une autre zone.
  3. Objets : tables 0xC0 et 0xC1. L'état DS:8AE + 2 * index choisit l'image : zéro utilise la table 0x132, sinon 0x133. Le lieu 30 groupe ses bénitiers par paires et dessine aussi les entrées de taille 0.
  4. Calques datés, Scene_DrawTimedOverlays EA 0x10479 : tables 0x11C (nombre par lieu), 0x11D et 0x11E (premier et dernier instant), 0x11F (sous-enr. de l'enregistrement 0x20). Ils dessinent les marées et le reflet du bassin, les corps sur la plage et l'embarcadère, et les changements des lieux 6 et 8.

Le sous-enr. 1 contient ces images dans l'ordre, chacune étant une image normale : tailles venant de 0x12B, 0x12C, 0x132, 0x133, 0x134, puis 51 octets utilisés seulement hors VGA. Le total est exact sur les lieux contrôlés (par exemple 3 146 + 51 = 3 197 pour l'enregistrement 0x19). La table 0x134 contient des images utilisées quand un objet est pris.

L'enregistrement 0x1E, que la fin charge comme « lieu 31 », est un coucher de soleil sur l'île, sans données de lieu propres.

Palettes (mode VGA)

Les mots de palette sont en 0RGB, 3 bits par canal. Ils n'atteignent jamais le VGA directement. tools/decode_image.py implémente ce système, et il reproduit exactement les 16 couleurs de screenshots/, sur les quatre captures.

Étape 1 : quelle palette. EA 0x145D4 en stocke trois en DS:79E, 7BE, 7DE, et Pal_TimeOfDayB EA 0x147C3 choisit selon hour = (time / 2) mod 24 :

Heures Palette Décalage dans l'enregistrement DS:
8-17 jour +0x42 79E
6-7, 18-19 aube et crépuscule +0 7BE
20-5 nuit +0x20 7DE

Étape 2 : tables par canal. EA 0x143F0 convertit chaque canal par une table en DS:676 vers une valeur DAC sur 6 bits. Les tables diffèrent selon le canal, et 6 et 7 donnent la même valeur :

Valeur 0 1 2 3 4 5 6 7
Rouge, DS:676 0 3 17 31 44 58 63 63
Vert, DS:67E 0 7 18 30 43 54 63 63
Bleu, DS:686 0 4 13 29 41 60 63 63

Étape 3 : ordre des registres. L'entrée k de la palette est écrite dans le registre DAC DS:68E[k], qui inverse les quatre bits : 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15. Donc la valeur de pixel i affiche le mot de palette inversé(i).

Étape 4 : fondu. Les couleurs sont écrites à un seul endroit, EA 0x1453E. Chaque pas mélange (from * a + to * b) >> 6 par canal, a descendant depuis 63 et b montant depuis 1, sur 63 pas. « From » ou « to » peut être remis au noir (DS:647 = 1 ou 2).

Partie Contrôlée par
Palette de jour, tables par canal, ordre des registres Les quatre captures, exactement
Palettes d'aube, de crépuscule et de nuit Le code seulement : les captures sont toutes à 10 h 00
Fondu Le code seulement
Autres modes vidéo (DS:492 différent de 5) N'utilisent pas ce chemin ; non étudiés

DOSBox affiche une valeur v sur 6 bits comme (v << 2) | (v >> 4). C'est visible dans les couleurs de screenshots/, et cela ne fait pas partie du jeu.

Enregistrement 0x2A : la table de données du jeu (structure vérifiée)

Table_GetEntry EA 0x15354 (service 0x0F) traite l'enregistrement comme des tailles gros-boutiennes. Le premier mot, 1 032, est la taille de la table elle-même, donc 516 entrées. À la première utilisation, EA 0x153BD les rend cumulatives sur place. Les tailles totalisent 41 895, soit 10 octets de plus que l'enregistrement, donc la dernière entrée dépasse sa fin.

Les entrées sont de petits tableaux d'octets et de mots gros-boutiens, lus avec les services Mem_Peek. Presque aucune n'est une image. Les entrées 199 et 200 sont des palettes de 32 octets, et les demander a un effet de bord en 0x153E4/0x15405 qui copie aussi des données de palette. rec2a-entries.tsv liste chaque entrée, avec ses appelants quand l'indice est constant (115 entrées ; les autres sont calculés). Logique de jeu explique les tables derrière les dialogues, les actions, les objets et la fin ; d'autres restent non identifiées.

2. .HUF

HufStreamTab EA 0x1CC60 contient les décalages u32 cumulés ; les fichiers n'ont pas de répertoire.

MUS: 30 boundaries, 29 streams
SND: 29 boundaries, 28 streams

Huf_LoadFile EA 0x1761D ouvre les fichiers en AX=3D80h. Quand bSoundCard (DS:F6, EA 0x1A516) vaut zéro, le sélecteur est d'abord remplacé par HufStreamRemap[selector] (table de mots en EA 0x1CD5A) : identité jusqu'à 0x14, puis 0x15→0x17, 0x16→0x14, 0x17→0x17.

Chaque flux commence par une longueur u32 et utilise le codec de Le codec de compression. Tous se décodent à l'octet près.

  • SND : {u16 ver; u16 count; u16 dataOfs = 6+9*count; count × 9-byte name; count × 56-byte record} ; 25 noms d'instruments distincts.
  • MUS : 28 scripts d'événements avec un en-tête de 70 octets (u16 0x04F0 en +0x24, longueur du corps u32 en +0x2A) ; le flux 28 est un échantillon Amiga IFF 8SVX.

3. .MAU : Mau_LoadFiles EA 0x141D9 (vérifié)

  • SAUP.MAU : lit 0x9A3 octets dans le tampon de l'appelant. Les 8 derniers octets sont copiés en DS:2835. C'est l'état de départ du jeu : voir Les deux programmes, et Logique de jeu pour les champs utilisés.
  • DEMOFR.MAU : lit 0x37F octets en DS:AE6 (EA 0x1AF06).

DEMOFR.MAU est un u8 + 149 enregistrements de six octets. Demo_Init EA 0x148BC multiplie l'octet 0 par 18 ; le consommateur en 0x137FC avance de 6. Les enregistrements contiennent des données de type souris lues près de 0x135BB (mots x et y en +2 et +4). L'interprétation comme trajet de souris est déduite.

4. HNF.HUF : pas des données du jeu

maup.exe ne le nomme jamais. Son en-tête est du texte ROT-13 :

Jeu telecharge sur : The X Web
Webmaster : Fred
E-mail du webmaster : fred@lankhor.net
URL : http://www.lankhor.net

Le reste ressemble à SND.HUF sans en être une copie : le suffixe commun fait 216 o. Cela ressemble à des métadonnées de groupe de diffusion, comme la signature à la fin de maup.exe.

Précédent : Logique de jeu · Suivant : Le codec de compression · Annexe technique · Accueil