Vous incarnez Cuchulainn qui cherche les 4 pièces du sceau de Calum afin de rendre à la race Sidhe son intelligence initiale. Le jeu est composé de plusieurs mini-jeux, tous différents.
- DIVERS -
La version originale de Gargoyle Games était vendue exclusivement par correspondance par la revue Amtix! Lorsque Amtix! a cessé de paraître, le jeu était vendu par correspondance par la revue Amstrad Action.
Pub "Amtix!" numéro 12 Octobre 1986, pages 4 et 5.
Pub "Amstrad Action" Issue 20, May 1987, page 87.
Le jeu est en MODE 1 et via l'utilisation des rasters, permet de dépasser les 4 couleurs par défaut.
- COMMANDES -
Clavier AZERTY :
Sélectionner un objet = 0 a 9 (l'étoile devant l'objet signale qu'on l'a sélectionné)
Prendre = A
Poser = Z
Aller à gauche = W
Aller à droite = X
Rotation caméra gauche = Q
Rotation caméra droite = S
Action = Espace
* La zone An-Lin est dans le noir total ce qui n'est pas le cas avec la version ZX Spectrum (Nous avons un cyan très pale).
Correction :
poke &7B1A, le &14 en &06 (&06 = encre 10 CYAN ou &04 = encre 1 BLEU)
AVANT :
C3 3E 7B 14 17 0C 0D
APRES :
C3 3E 7B 06 17 0C 0D
Si vous êtes déjà dans la zone An-Lin avec une version non patchée, pas de panique, il suffit de modifier 2 adresses en RAM.
poke &731F,&06 (&06 = encre 10 CYAN ou &04 = encre 1 BLEU)
poke &7322,&06 (&06 = encre 10 CYAN ou &04 = encre 1 BLEU)
* Le message de fin ne s'affiche pas
Pour finir le jeu, il faut réunir les 4 talismans (Dagda's Cauldron, Lugh's Spear, Nuada's Sword et Stone of Fal) et le marteau (Calum's Hammer) pour reforger le sceau.
Il faut déposer tous les objets au sol et les inscriptions changent sur l'autel en affichant "OGAM".
Le dernier objet a déposer et qui doit valider la fin du jeu c'est le "Calum's Hammer" mais le jeu refuse de déclencher la fin.
Correction par Isidoro :
Le problème venait du fait que lorsque le programme arrive en &A3D7, "HL" devrait pointer vers un tableau contenant les données des 5 éléments que nous devons placer sur l'autel (ces 5 éléments seront testés dans la boucle &A3E3), mais il semble que le développeur ait oublié d'attribuer ce pointeur à "HL". Ainsi, à ce stade de l'exécution du programme, "HL" prend la valeur de la fonction &A3D7 elle-même, ce qui est incorrect.
La solution devrait consister à ajouter les instructions nécessaires pour lire ce pointeur et le charger dans "HL", mais cela implique d’ajouter quelques octets au milieu de la fonction ; je devrais donc déplacer une partie de la fonction vers un autre espace mémoire libre. Mais en lisant le code juste avant &A3D7, je me suis rendu compte que ce code ne faisait que mettre en valeur certaines variables dans le registre indexé "IX" ; je peux donc intervertir l'ordre de (IX + #0E) – (IX + #0f) et (IX + #03) – (IX + #04) sans modifier le comportement de la fonction, et changer l'adresse de départ de l'exécution de la fonction de &A3D7 à &A3CE. De cette manière, le correctif permettant de corriger le bogue peut être réalisé en modifiant quelques octets, sans qu'il soit nécessaire de déplacer la fonction vers une autre adresse mémoire. C'est la raison pour laquelle j'ai choisi cette méthode pour le corriger.
En &A3B8
AVANT :
21 A5 AD DD 75 0E DD 74 0F
APRES :
21 CE A3 DD 75 03 DD 74 04
poke &A3B9, le &A5 en &CE
poke &A3BA, le &AD en &A3
poke &A3BD, le &0E en &03
poke &A3C0, le &0F en &04
En &A3CE
AVANT :
21 D7 A3 DD 75 03 DD 74 04
APRES :
21 A5 AD DD 75 0E DD 74 0F
poke &A3CF, le &D7 en &A5
poke &A3D0, le &A3 en &AD
poke &A3D3, le &03 en &0E
poke &A3D6, le &04 en &0F
Détail au niveau de la programmation :
; 1454
SPRITES_ALTAR
dw GFX_ALTAR : DB #84, #05 ; Sprite de l'AUTEL (Hauteur : 4x8 lignes, Largeur : 5 octets)
; 51c6
GFX_ALTAR ;; Graphisme de l’autel en mode 2
; ada5
; Le premier octet devient 00 lorsque l'on place correctement l'objet
; "ogam" : le texte qui s'affiche sur l'autel au fur et à mesure que l'on place les objets
ITEMS_ALTAR
68(00) "o" 29 ; NUADAS SWORD
67(00) "g" 2A ; LUGHS SPEAR
92(00) "a" 51 ; STONE OF FAL
65(00) "m" 52 ; DAGDAS CAULDRON
7F(00) 00 00 ; CALUMS HAMMER
; CORRECTION DE BOGUE :
; A3B8 : 21 CE A3 DD 75 03 DD 74 04
; A3CE : 21 A5 AD DD 75 0E DD 74 0F
; a3b8 ; spectrum_l8db6
; Cette fonction s'exécute lors du rendu graphique de l'autel, dans la dernière pièce
ROOM_ALTAR_handler
; MODIFICATION
if BUGFIX
LD HL, .la3ce ; Au lieu de sauvegarder la3d7, je sauvegarde la3ce, qui commencera par attribuer HL = ITEMS_ALTAR, ce qui permettra à la boucle vérifiant les 5 objets de fonctionner correctement
LD (IX + #03), L
LD (IX + #04), H
else
LD HL, ITEMS_ALTAR ; ada5
LD (IX + #0E), L
LD (IX + #0F), H
endif
LD HL, (SPRITE_ALTAR) ; HL = (SPRITE_ALTAR(1154)) = GFX_ALTAR(51c6)
LD (IX + #10), L
LD (IX + #11), H
LD (IX + #12), #05
if BUGFIX
.la3ce
LD HL, ITEMS_ALTAR ; ada5
LD (IX + #0E), L
LD (IX + #0F), H
else
LD HL, .la3d7
LD (IX + #03), L
LD (IX + #04), H
endif
.la3d7 ; Cette sous-fonction est appelée avec JP(HL) à chaque trame, c'est pourquoi, en arrivant ici, hl contient la valeur de l'adresse de la sous-fonction elle-même
; REMARQUE : En réalité, la CORRECTION consisterait à ajouter ici ces deux lignes :
; LD L, (IX + #0E)
; LD H, (IX + #0F)
; Le CORRECTIF que j'ai appliqué précédemment consiste à réorganiser l'ordre entre l'endroit où s'effectue l'affectation de "items_altar" et cette sous-fonction, afin de pouvoir appliquer le correctif sans ajouter d'octets ni avoir à déplacer cette sous-fonction.
; Je peux réorganiser cela car le code au début de la fonction ne fait que des affectations de variables.
LD A, (la734)
CP #00
JR NZ, .la3ed
; Vérifie si les 5 objets nécessaires ont bien été placés sur l’autel
LD B, #05 ; Les 5 objets nécessaires sur l’autel
LD DE, l0003
.la3e3
LD A, (HL) ; ERREUR : cela devrait être HL = ITEMS_ALTAR (ada5), mais à la place, c'est l'adresse mémoire de la sous-fonction la3d7 elle-même
AND A
JR NZ, .la3ed
ADD HL, de
DJNZ .la3e3
JP l847c ; Affiche le message de fin de jeu et lance l'animation des couleurs des crânes sur le HUD