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).
.CONCon_ReadRecord EA 0x13F9F (vérifié)Arguments, empilés du premier au dernier : enregistrement, sous-indice, segment de destination, décalage de destination.
Con_OpenArchive EA 0x140EC.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.base + 4*sub, puis lit 8 octets dans
ConRecIndexBuf EA 0x1AEC0.base + start, et lit
next - start octets (mots bas) dans le tampon de
l'appelant.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.
Con_OpenArchive (vérifié)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.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à.0x141CF).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.
| 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é |
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
flags est le mode de balayage, aiguillé
en 0x14B91 + 3*mode, de 0 à 18.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.flags indiquent que ces listes sont
elles-mêmes compressées par plages.rec27_sub02 a une palette de 16 couleurs et quatre
tuiles qui couvrent exactement 320×200 :

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 |
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 :

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 :

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.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.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.
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.
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.
.HUFHufStreamTab 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..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.
HNF.HUF : pas
des données du jeumaup.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