Logique de jeu

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.

Les commandes du joueur

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 :

  • attendre : ajoute une demi-heure.
  • dormir : seulement dans le lieu 26 (votre cabine) ; ajoute 6 de condition et fait avancer le temps deux fois.
  • manger : seulement dans le lieu 2, et seulement quand l'heure (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).
  • fouiller : abaisse DS:16E de 1 si DS:7C est positionné, et de 3 si DS:137 l'est ; voir « État ».
  • se cacher : positionne DS:138 là où la zone le permet. Tant qu'il l'est, l'occupant du lieu ne vous confronte pas.

Temps et déplacements

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à.

  • Les personnages suivent exactement logic/schedule.tsv : table 0, room = T0[(time - 20) * 9 + character]. Le joueur ne peut parler qu'à ceux qui sont dans le lieu actuel.
  • Un déplacement ajoute la valeur de la table 8 à DS: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.
  • Sorties : les valeurs à partir de 100 déclenchent un événement spécial. Les sorties « choix sur écran » (255) passent par une zone de porte (tables 0x113, 0x114, 0x116, listées à la fin de logic/rooms.md).
  • Sorties affichées : le mot en DS: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.
  • Serrures : 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.
  • Les messages datés, les changements de scène et les objets déplacés par l'horloge sont dans 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.

Conversations

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.

Quelle réponse vous obtenez

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.

Quels sujets sont disponibles

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.

Ce qui change une réponse

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 :

  • Opposer doit correspondre au type, à la question et à la chaîne attendus (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.
  • La pression agit sur toute question listée : demander ajoute la pression actuelle (DS:88), qui baisse ensuite de 1.
  • Le niveau avance quand les points de la question (mot en DS: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.
  • Donc 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! ».

Actions sur la scène

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 :

  • Zones ouvertes : 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é.
  • Écritures de drapeaux : les tables 0x185-0x1A9, une par verbe, positionnent et effacent des drapeaux de scène en cas de réussite (Tbl_ApplyFlags EA 0x11584).
  • Objets : 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.
  • Indices : la première fois que certaines chaînes apparaissent ou que certains objets sont pris, des points vont en DS:88E (tables 0x1D0-0x1D5), base de « Vous devriez avoir remarqué x pour cent des indices ».

État

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

Sympathie

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.

La fin

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.

Réactions scriptées

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

      174-#187. Un compte à rebours démarre (DS:88A, qui finit vers 15 h 00) ; quand il s'achève, si vous êtes seul au salon vous êtes

      tué, 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

    25 arrive à 2 h 00 le 1er.

  • 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.

Documents et feuilles codées

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 :

  • k positif (feuilles #25, #139, #162, #48) : la chaîne k est décodée aussi, et une lettre de la grille est surlignée quand elle correspond à la lettre suivante de la chaîne k. Les lettres surlignées forment la chaîne k elle-même : ce mode ne fait que marquer des lettres. Confirmé dans le jeu : les lettres foncées de #139 forment la chaîne 2 de la classe 6.
  • k négatif (les feuilles leurres #174-#201) : les lettres sont surlignées à des intervalles lus dans une table d'octets de 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 ») #139
#25, la copie de Roy #25
#162, le deuxième message (« Ham and eggs ») #162
#48, le papier du jardin #48
#174, un leurre (« Sweet Emily ») #174

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