Annexe technique · Accueil · English
Comment le joueur agit sur le jeu, et ce qui décide quelle phrase
apparaît. L'essentiel du contenu du jeu est constitué de données dans
G3.CON enregistrement 0x2A ; les listes sont
donc générées dans logic/ par tools/game_logic.py.
| Fichier | Contenu |
|---|---|
logic/dialogue.md |
Chaque réponse pour chaque personnage et question, avec ce qui la change |
logic/actions.md |
Par lieu et par zone : la réponse de chaque verbe, les objets, les contenants |
logic/unlocks.md |
Ce qui débloque chaque sujet de conversation |
logic/events.md |
Messages et changements de scène selon l'heure |
logic/schedule.tsv |
Où se trouve chaque personnage, à chaque demi-heure |
logic/rooms.md |
Sorties des lieux et coûts de déplacement |
logic/quiz.md |
Le questionnaire final, avec ses réponses |
logic/documents.md |
Chaque objet lisible avec ses pages, les journaux et les airs du piano |
Couverture. Les tables sont extraites exactement
comme le code les lit. Les réactions écrites directement dans le code ne
sont listées qu'en partie (voir « Réactions scriptées »), donc une
phrase absente de logic/ ne prouve
pas qu'elle n'apparaît jamais. Les noms des lieux sont retrouvés d'après
les libellés de sorties et l'ordre des chaînes, et ne sont stockés dans
aucune table.
Game_Turn EA 0x1E220 attend un choix, puis
Cmd_Dispatch EA 0x1D9D8 l'exécute.
Menu (DS:40) |
Libellé | Choix |
|---|---|---|
| 0 | Fic (libellé déduit) |
9 personnages : s'ils sont présents, Accoster
(parler) ou Suivre. L'élément 10 ouvre un autre écran
(0x119B8), pas encore lu |
| 1 | Dep |
jusqu'à 6 sorties pour le lieu, d'après les tables 6, 7 et 8 |
| 2 | Invent |
choisir un objet porté (jusqu'à 5 emplacements en
DS:7A0, objet en main en DS:7AA) |
| 3 | Action |
appuyer, attendre, dormir, fermer, fouiller, lire, manger, mettre, observer, ouvrir, prendre, regarder, sentir, sonder, soulever, tourner |
| 4 | Self |
se cacher, déposer, se fouiller, lire |
Après avoir choisi un verbe qui demande une cible, le joueur clique
sur la scène. Ui_PickPoint EA 0x19660
convertit le clic en cellules de 8×8 et cherche dans deux ensembles de
zones, par lieu : les tables 0x111 (zones de scène,
DS:78) et 0x112 (zones de détail,
DS:7A). Une zone qui a une entrée dans
Flag_ZoneIndex EA 0x1FCC8 n'existe que tant
que son drapeau est positionné. La cellule est ((x - 4) / 8, (y - 12) /
8) sur l'écran de 320 × 200. Chaque table donne, par lieu, une entrée de
l'enregistrement 0x2A avec le nombre de rectangles par zone
(premier octet : zones - 1), et l'entrée suivante contient, zone par
zone, les paires x0, x1 des rectangles puis leurs paires y0, y1, en
cellules (Zone_Find EA 0x206ED).
Comportement fixe de certains verbes :
DS:68, calculée à partir du temps par EA
0x1F924) vaut 9, 13 ou 20, sinon un refus. Le petit
déjeuner à 9 ajoute 7 de condition et une demi-heure ; le déjeuner à 13
et le dîner à 20 ajoutent 14 et prennent une heure (EA
0x1A58C).DS:16E de 1 si
DS:7C est positionné, et de 3 si DS:137 l'est
; voir « État ».138 là où la
zone le permet. Tant qu'il l'est, l'occupant du lieu ne vous confronte
pas.Game_AdvanceTime EA 0x138DE fait avancer
l'horloge et exécute ce qui en dépend. Le temps commence à 20 (10 h 00
le 31), et les tables des personnages couvrent 74 demi-heures à partir
de là.
logic/schedule.tsv :
table 0, room = T0[(time - 20) * 9 + character]. Le joueur
ne peut parler qu'à ceux qui sont dans le lieu actuel.6C. Le code l'ajuste de
(condition / 20 - 2) * 25 / 100, mais cette division
entière donne 0 pour toute valeur de condition, donc l'ajustement n'a
aucun effet.0x113, 0x114,
0x116, listées à la fin de logic/rooms.md).A79 +
2 × (lieu - 1) est le nombre de sorties du lieu que montre le menu
Dep (Game_Turn EA 0x1E258). Des
scripts l'augmentent : la corde mise sur le puits (lieu 10, zone 17) le
met à 6 et ajoute dans le puits ; ouvrir la trappe de Maguy
le met à 4 et ajoute le passage ; dans le puits (lieu 16),
appuyer sur la zone de détail 6 (« Signes des temps ») le
fait passer de 1 à 2 et inversement, ce qui ajoute
dans le passage, mais seulement tant que la pierre #23 est
dans le rocher du puits (lieu 10, zone 15, drapeau DS:7F0).
Remonter le remet à 1.Tbl_LockCheck EA
0x152A2 refuse une porte (table 0x1B2) ou une
zone qui s'ouvre (table 0x1B8) entre deux heures, sauf si
l'un des cinq objets portés correspond. La chambre de Lucie (porte 4
devant chez Maguy) est toujours fermée sans la clef n° 15, la maison de
Juste est fermée de 18 h 30 à 19 h 00 et à partir de 21 h 30 le 31 sans
la clef n° 76, et la trappe de Maguy demande la clef n° 17. Toutes sont
listées dans logic/rooms.md.logic/events.md,
comme le puits qui se remplit à 16 h 30, la perruque dans le poêle de
Juste à 18 h 30, le médaillon dans la nasse à 1 h 30 et la feuille
déchiffrée dans la cabine de Roy à 2 h 00. Chaque déplacement d'objet ne
joue qu'une fois (drapeau DS:924+i). Un retrait qui ne
trouve rien dans le contenant signifie que vous portez l'objet, et vous
tue.Dlg_Talk EA 0x1ADD4 propose une liste de
sujets. Les personnages sont numérotés de 0 à 8 : Maguy, Sue, Anita,
Bruce, Roy, Chris, Bob, Anton, Juste. On peut poser des questions sur
Marie et Lucie, mais elles ne sont pas dans les horaires.
| Question | Table | Recherche, c = personnage |
Clef de changement (type) |
|---|---|---|---|
| Votre emploi du temps... | 1 | T[slot * 9 + c] |
c * 40 + slot (1) |
| Qu'avez-vous remarqué... | 2 | T[slot * 9 + c] |
c * 40 + slot (2) |
| Que faites-vous là? | 3 | T[(time - 20) * 9 + c] |
c * 74 + time - 20 (3) |
| avis sur une personne, 0-8 | 4 | T[c * 9 + person] |
c * 9 + person (4) |
| Marie, Lucie, ou l'un des 20 sujets | 5 | T[row * 9 + c] |
c * 22 + row (5) |
Les valeurs sont des chaînes de classe 5 numérotées à partir de 1 (banque de stockage 7). Une valeur de 0 donne une réplique évasive au hasard : l'une des chaînes 141-143 de la classe 5 pour « Que faites-vous là? », et trois autres pour « Qu'avez-vous remarqué ».
Une réponse déjà changée a la priorité : Dlg_GetOverride
EA 0x18784 cherche dans le tableau sauvegardé en
DS:2D2.
Les trois listes sont contrôlées par des drapeaux du bloc d'état.
Afficher certaines chaînes ou prendre certains objets les positionne,
comme le liste logic/unlocks.md.
| Sujets | Drapeaux | Noms |
|---|---|---|
| les personnes et les quatre questions standard | DS:842+i |
table 0x105 |
| 20 sujets | DS:851+i |
table 0x106 |
| tranches horaires | DS:864+i-1 ; les deux premières sont toujours
actives |
table 0x107 |
Une tranche horaire apparaît une fois terminée. À
chaque pas de temps, Time_UnlockSlots EA
0x1F924 positionne DS:864+i pour i = 1 à jour
× 24 + heure - 10, donc on peut interroger sur « 6 à 7 h PM » à partir
de 19 h 00. Le menu lit la tranche k (k ≥ 2) en
DS:864+k-1.
Les sujets se débloquent de quatre façons, toutes listées dans logic/unlocks.md et exécutées
par Tbl_UnlockTopic EA 0x103B4 : une réponse
(table 0x1BE), un message (0x1C6), la lecture
ou la prise d'un objet (0x1C2), et un clic sur une
zone de la scène avec n'importe quel verbe (0x1CB,
depuis Ui_PickPoint). C'est ainsi qu'apparaît « La chambre
fermée à clef » : cliquez sur la porte fermée à clef devant chez Maguy.
La statue du bassin, le caisson étanche et la bibliothèque forcée de
Marie fonctionnent de la même façon.
Dlg_Answer EA 0x18A43 affiche une réponse
avec sept boutons (table 0xFE) :
| Bouton | Effet |
|---|---|
| Mémoriser | stocke la réponse : qui, quelle question et quelle chaîne, en
DS:170-1A6 |
| opposer | confronte le personnage à une réponse stockée : 8 points si c'est la déclaration attendue à ce niveau |
| se souvenir | affiche une réponse stockée |
| donner | donne l'objet en main ; si le personnage le veut (tables
0x130/0x131), +4 de pression |
| montrer | montre l'objet en main : réponse de la table 0x87,
T[object * 9 + c] ; coûte 2 de DS:16E |
| soudoyer | offre de l'argent : accepté si le montant dépasse le prix de la table 10 de 3 par refus, +2 de pression |
| tabasser | abaisse DS:16E de 10 ou 40. Gagné si la condition
atteint au moins la force du personnage
(30,20,40,60,60,90,90,80,40) plus le numéro de la tentative
: +1 de pression, -10 de condition. Perdre coûte en condition l'écart,
au moins 15 |
Dlg_Pressure EA 0x163A3 applique le
changement, avec les tables F =
0xCA, 0xCE, 0xD6, 0xDC, 0xE4 selon le type de question et
G = 0x1EA, 0x1EB, 0x1EE, 0x1F0, 0x1F3. Une
question listée dans F+1 a jusqu'à trois niveaux, et chaque
niveau indique la réponse suivante (table F+3+2×level).
Pour avancer :
F+2+2×level,
F+3+2×level). Une chaîne de 600 dans les données ne peut
jamais correspondre, donc ces niveaux n'avancent que par la pression.
Sinon, cela ajoute 8 points.88), qui baisse
ensuite de 1.216+2i) plus le montant de cet essai atteignent son
seuil (G+level). Ce n'est qu'alors que les points sont
gardés, l'octet de niveau (DS:1B8+i) augmenté et la
nouvelle réponse stockée en DS:2D2. Un essai raté
ne laisse aucun point, et les seuils comptent à partir des
points déjà gardés.opposer avec la déclaration attendue (montant 8,
EA 0x19047) marche du premier coup tant que les niveaux
précédents ont aussi été passés en opposant : aucun seuil du jeu ne
dépasse 8 × (niveau + 1). Opposer autre chose ne sert jamais. Le «
pressure >= N » de logic/dialogue.md est ce
seuil : la pression (DS:88) est le montant d'une simple
question, et elle ne compte que pour les niveaux marqués 600, qu'on ne
peut pas opposer.logic/dialogue.md les
montre sous chaque réponse, sous la forme
→ condition: new answer. Atteindre une phrase
donnée demande de remplir toutes ces conditions : le personnage
est présent à ce moment, le sujet est débloqué, et toute condition
→ sur cette phrase est remplie. Les phrases absentes de la
grille d'un personnage viennent de lignes → ou du code.
Suivre (Dlg_Follow EA 0x1C5CD) reprend les
horaires du personnage, et peut échouer avec « Vous l'avez perdu de vue!
».
Chaque verbe a une famille de tables de réponses, listée dans logic/actions.md :
T zones par lieu, T+1 identifiants de zones,
T+2 la réponse par défaut, T+3 les chaînes
(Tbl_ZoneLookup EA 0x1FF5C).
| Réponse utilisée | Quand |
|---|---|
| réponse de la table | la zone est listée pour ce verbe |
| par défaut | pas d'entrée ; pour Tbl_ZoneReply EA
0x1294C, aussi quand la zone est déjà ouverte |
| réponse « pas encore ouvert » | Tbl_StateReply EA 0x12C58, pour fermer,
fouiller, ouvrir, mettre |
Autres mécanismes :
ouvrir,
fermer, soulever, tourner et
appuyer basculent l'état en DS:92F +
11 × (room - 1) + zone, en redessinant la zone. La table
0x1B8 peut les bloquer selon l'heure ou l'objet porté.0x185-0x1A9, une par verbe, positionnent et
effacent des drapeaux de scène en cas de réussite
(Tbl_ApplyFlags EA 0x11584).prendre utilise les tables
0xC0-0xC3. Les contenants gardent jusqu'à 5
objets, dans les tableaux sauvegardés en DS:368 et
DS:5FC ; fouiller les montre. Les noms
d'objets sont dans la table 0xC6.88E (tables 0x1D0-0x1D5), base
de « Vous devriez avoir remarqué x pour cent des indices ».| DS: | Signification |
|---|---|
166 |
lieu |
168 |
temps, en demi-heures |
16C |
condition, 0-99 ; en dessous de 0, déclenche un événement |
16E |
score caché de sympathie, 50 au départ ; voir « Sympathie » |
7A0, 7AA |
objets portés, objet en main |
7B5 |
drapeaux de scène et d'histoire ; comprend les drapeaux de sujets en
842, 851, 864 |
88C |
argent |
88E |
points d'indices |
8AE |
mots d'état des zones et des objets |
DS:16E est un score caché, de 50 au départ. « Sympathie
» est le nom que lui donne une source en ligne ; le texte du jeu ne le
nomme jamais. Seules trois instructions y touchent : l'addition et le
stockage dans Game_AddSympathy EA 0x1F9B1, et
le test dans Game_AdvanceTime. Il a 18 sites d'appel, tous
avec des montants négatifs fixes, donc il ne peut que
baisser. Il n'est pas affiché et ne change rien d'autre, pas
même les dialogues.
Au pas de temps suivant son passage en dessous de 0 (51 points perdus), la partie se termine par l'un de deux textes d'échec, les chaînes 62 ou 63 de la classe 6 : Maguy vous fait emmener à Mahé, ou les hommes vous enferment dans votre cabine.
| Action | Perte | Condition | Site |
|---|---|---|---|
| tabasser | 40 | quelqu'un d'autre est dans le lieu | 0x1939B |
| tabasser | 10 | vous êtes seuls tous les deux (DS:7C = 1) |
0x19390 |
| fouiller | 3 | l'occupant du lieu est là (DS:137) |
0x1A1A8 |
| fouiller | 1 | quelqu'un d'autre est là | 0x1A19D |
| montrer | 2 | à chaque fois | 0x191C9 |
| soudoyer | 1 | à chaque offre, acceptée ou non | 0x19236 |
| suivre | 2 | la personne vous remarque et se retourne contre vous | 0x1CE55 |
| suivre | 2 | vous suivez de nouveau la même personne (« Encore vous? ») | 0x1AFAE |
| être dans la chambre de quelqu'un avec lui | 1 | « Vous vouliez me voir? » | 0x1B00B |
| de même | 2 | si c'est la dernière personne suivie (« Toujours dans mes pattes! ») | 0x1AFF6 |
| de même, de 23 h 00 à 8 h 00 | 1 ou 2 | « Ce n'est pas une heure pour déranger. » | 0x1AF5C, 0x1AF47 |
| laisser quelque chose ouvert | 2 par élément | quelqu'un est passé dans le lieu depuis votre départ ; il le referme | 0x19CCD |
| prendre de l'argent dans une liste d'objets | 1 | 0x160D8 |
|
| prendre un objet les mains pleines | 2 | depuis une vue rapprochée | 0x160B5 |
| déposer un objet | 1 | hors de sa place d'origine | 0x1D64B |
Les lieux des occupants viennent du tableau de Dlg_Talk
: Maguy 3, Sue 5, Anita 7, Bruce 20, Roy 19, Chris 21, Bob 25, Anton 27,
Juste 8. Le contrôle du lieu s'exécute depuis la boucle du tour, donc
rester peut coûter plus d'une fois (la fréquence n'a pas été comptée).
Se cacher évite la confrontation, mais pas la pénalité de fouiller.
Les pertes s'appliquent avant le résultat, donc tabasser coûte autant
qu'on gagne ou qu'on perde. Accoster, poser des questions,
opposer, donner et Mémoriser ne
coûtent rien.
Deux autres sites d'appel, 0x1AFCD (3) et
0x1B038 (2), exigent que Dlg_Talk soit appelé
pour l'occupant d'un lieu avec DS:137 à zéro. Le seul site
d'appel concerné vérifie qu'il est positionné, ils semblent donc
inatteignables.
Pour mémoire, la tolérance : tabasser devant témoin laisse 10, et une seconde fois termine la partie. Seul à seul, on peut le faire cinq fois et rester à 0 ; la sixième termine la partie.
Tourner sur la zone 31 du lieu 30 lance le contrôle de
Script_Hook EA 0x1767F. Il faut le bénitier de
5 sur le premier plateau et le bénitier de 3 sur le second, contenant
chacun 2 volumes (DS:AF7 = 0xA6,
DS:AF9 = 0xA8, DS:AF1 = 2,
DS:AF3 = 2). La zone 31 existe une fois le médaillon ouvert
placé dans l'anneau.
Quiz_Run EA 0x15450 pose alors 7
enchaînements de questions d'après la table 0x1F9. Les
questions de 0x1FB passent à 0x1FC si la
réponse est juste. Toute mauvaise réponse efface le drapeau de
réussite, donc le pourcentage de la chaîne 126 de la classe 7
ne s'affiche qu'en cas d'échec, et la partie continue. La réussite joue
la chaîne 102 de la classe 6 et positionne DS:132. Le
parcours gagnant vaut exactement 100 points. Voir Solution.
Script_Hook reçoit
(event, room, zone, item), avec ces événements :
| Événement | Origine | Événement | Origine |
|---|---|---|---|
| 1 | ouvrir | 9 | appuyer, zone de scène |
| 2, 3 | tourner, zones de détail et de scène | 0xA |
lire |
| 4 | fermer | 0xB |
temps qui passe pendant un déplacement |
| 5, 6, 7 | mettre : réussite, tentative, spécial | 0xC |
une sortie |
| 8 | appuyer, zone de détail | 0xD, 0xE, 0xF |
déposer, sonder, prendre |
Cas lus jusqu'ici :
Énigme du lieu 30 : une énigme de transvasement
avec des bénitiers de 5, 3 et 8 volumes, pleins au départ ;
sonder indique un niveau, tourner vide,
mettre verse.
Le piano (lieu 2). tourner sur sa
zone de détail 14 une fois le cendrier en place positionne
DS:139 et ouvre le compartiment (contenant 24). Mettre une
pièce d'un cent dans la fente (zone 16, événement 6 avec la sorte
d'objet 14 de la table 0xC4) affiche les 15 airs de la
table 0xF1 (logic/documents.md). Si
DS:139 est positionné, l'air choisi laisse une feuille dans
le compartiment (DS:456 est sa cinquième case) et
DS:139 est remis à zéro (EA 0x17D37) :
de 12 h 00 à 17 h 00 le 31, l'air 13 (« Requiem ») laisse le vrai message, la feuille #139 ; les airs 0-12 et 14 laissent
88A, qui finit vers 15 h
00) ; quand il s'achève, si vous êtes seul au salon vous êtestué, sinon il attend.
à partir de 7 h 00 le 1er, l'air 4 (« Ham and eggs ») laisse le deuxième message, la feuille #162 ; les autres laissent #188-#201. La liste cachée de Marie (feuille #158) commence par « Requiem: Kyrie eleison », puis « Ham and eggs ». À 17 h 30 le 31, l'horloge met de toute façon #139 dans le compartiment, et l'enlève à 23 h 00.
Inscriptions : lire sur la zone 5
du bassin (avec les jumelles, à marée basse) affiche l'enregistrement
0x21 sous-enr. 7, et lire sur la zone de
détail 1 du passage sous la trappe de Maguy (lieu 17) affiche le
sous-enr. 6. Chacun est la moitié d'un texte espagnol en miroir ; voir
Solution.
Énigmes à toucher :
Item_TouchPuzzle EA 0x14D04 change un objet en
un autre quand on clique ses pierres dans l'ordre. En-tête T : l'octet 2
est l'indice de la dernière pierre, l'octet 3 celui de la dernière
étape, l'octet 4 le nouvel objet ; T+1 et T+2 sont les x et y des
pierres, T+3 l'ordre. L'écrin #40 (T = 0x1E0) a 5 pierres,
demande 4, 5, 3, 3, 5, 2 et devient #163, dont le couvercle montre des
signes du zodiaque. Le médaillon #49 (T = 0x1E5) a 7
pierres, demande 3, 4, 6, 5, 2 et devient #153 avec sa clef.
Caches : appuyer sur le tableau de
la chambre de Maguy (zone 1, table 0x12D) ouvre la cache
qui contient la clef #15 et 10 dollars. tourner sur la zone
14 ouvre le tiroir de la clef #17 (zone 30), et soulever
sur la zone 15 découvre la trappe (zone 21). Dans la cabine de Roy,
tourner sur la zone 31 (« Un déclic ») ouvre la cache, zone
33, où la feuille déchiffrée
Lieu 11, zone 5 (événement 10) : lisible seulement aux instants 32-33, 56-57 et 80-81, en portant l'objet 42 (les jumelles). Sinon « Vous êtes trop loin... ».
Puits, lieu 10 vers 16 (événement 12) : en
dehors de ces mêmes instants, le départ déclenche l'événement spécial
0x40.
Des sons et de petits changements de drapeaux dans les lieux 1, 3, 10, 12, 16, 20, 26 et 28.
Item_Read EA 0x12E52 cherche l'objet dans
trois familles, listées dans logic/documents.md : pages
seules (tables 0x137-0x13A), livres
(0x13B-0x13E) et journaux
(0x13F-0x145). Pour une page seule, il passe
le numéro de chaîne au service 9 avec la valeur de la table
0x13A dans le mot haut. Txt_DrawIndexed dans
maup.exe (EA 0x157C3) garde cette valeur en
DS:CE, et Vid_DrawStringEx (EA
0x1188C) s'en sert pour surligner certaines lettres d'une
autre couleur :
maup.exe en DS:k-1 (chaque octet est un
décalage vers une liste d'écarts, terminée par 0xFF). Dans
le fichier, DS:0 contient le copyright de la bibliothèque
C, et le jeu la lit bien : dans le jeu, #174 (k = -1) fonce les quatre
premiers caractères puis un sur la troisième ligne, et #175 (k = -2) les
trois premiers puis un, une place plus tôt, comme le prédisent les
octets 0, 0, 0, 0 et « T » (84). Les leurres affichent du bruit.Les cinq grilles lisibles telles que le jeu les affiche, lues dans le jeu depuis un état de départ de test (le pointeur est la souris) :
| Feuille | Écran |
|---|---|
| #139, le vrai message (« Requiem ») | ![]() |
| #25, la copie de Roy | ![]() |
| #162, le deuxième message (« Ham and eggs ») | ![]() |
| #48, le papier du jardin | ![]() |
| #174, un leurre (« Sweet Emily ») | ![]() |
Déchiffrement. Les 64 lettres surlignées forment un échiquier, a1 d'abord puis rangée par rangée. Lire la case d'arrivée de chaque coup d'une partie de 'Les échecs', blancs et noirs à tour de rôle, donne le message : la partie n°4 (pages 4 et 90 de la banque 4) sur #139 ou #25 donne « we wait the boat », et la partie n°5 (pages 40 et 96) sur #162 donne « tribes need guns! the Wind! ». Aucune partie ne déchiffre #48. La méthode a d'abord été trouvée par le blog Adventurers' Guild pour le premier message.
Pas encore lu en entier : des parties de
Script_Hook, les vues rapprochées de
Act_Regarder (dont le médaillon),
Act_Observer, 0x119B8, et ce qui se passe
quand on est surpris.
Précédent : Les deux programmes · Suivant : Formats de fichiers, scènes et palettes · Annexe technique · Accueil