tera: la cité des cranes?
Réduire
X
-
après avoir téléphoné à Ulysse, j'ai de très bonnes nouvelles à annoncer: la rencontre en vrai est possible et même fortement anticipée... Il nous attend avec ses exemplaires, ses archives et journaux et une multitude de documents plus précieux les uns que les autres...
Hoagie, je t'envoie un PM dès maintenant... merci pour ton aide!
Il y a suffisamment de choses chez Ulysse pour monter un dossier similaire à celui de M. Weill de ex loriciel lorsque une équipe est allée chez lui... peut être que d'autres membres de LTF seraient interessés d'y participer... pour autant qu'ils puissent se rendre à Tours... Par contre il a précisé qu'il veut toujours garder l'anonymat sous le num d'Ulysse.Dernière modification par starlord, 01 juin 2010, 09h30.
Commentaire
-
Si quelqu'un s'y connait , ca m'intéresserait aussi !Envoyé par Hoagie Voir le messageSuite du feuilleton...
Y a t-il quelqu'un ici qui s'y connaît en déplombage de jeu ?
(mais bon j'ai déja été modéré une fois par ubn pour une demande similaire, pourtant ca peut etre intéressant pour des cheats)
Commentaire
-
... quelques annees plus tard ...
Alors finalement, cette rencontre avec Ulysse a-t-elle eu lieu ?
Il y a peut-etre eu deja un debriefing dans un autre sujet, mais je ne l'ai pas trouve alors...
Vous me pardonnerez si c'etait le cas.
Commentaire
-
C'est cool tout ca
Pour la plupart des jeux je savais deja qu'ils etaient sur LTF; dans mon post, je pensais plutot a une eventuelle interview de Ulysse, ou la divulgation des codes source, ou d'autres infos encore ... Par exemple le pourquoi de la necessite de l'anonymat meme apres tant d'annees.
Pour tout vous dire, je suis en train de decompiler Tera (75% fait je dirais), mais entre-temps, je suis retombe sur ce thread. Si les sources de Tera sont deja disponible quelque part, ma demarche, pour autant amusante qu'elle soit, parait assez redondante non ?
Commentaire
-
Histoire de deterer cette discussion, je vous mets une partie des resultats de la decompilation; pour ceux qui connaissent le jeu, c'est la partie dans l'espace lors de laquelle il faut degommer les vaisseaux des pirates ... tres stylises bien sur les vaisseaux. Si vous voulez, ca ressemble a ca:
Quant au source:Code:#### #### #### #### ##++++## ##++++## ##++++## ##++++## ##++++## ##++++## ##++++## ##++++## #### ## ++ ++ ## #### #### ## ++ ++ ## #### ## #### ## ## #### ## ## ##++++## ## ## ##++++## ## ################ ################ ## #### ## ## #### ## #################### #################### ##############++++++++############## ##############++++++++############## ######.. ..########.. ..###### ######.. ..########.. ..###### ####.. .... ..#### ####.. .... ..####
Niveau code c'est, a mon avis, la partie la plus lisible.Code:{SPACE SEQUENCE} OVERLAY PROCEDURE OVL_00AE; VAR _i:INTEGER; _shootX,_shootY:INTEGER; BP_0A:INTEGER; _alienX,_alienY:INTEGER;{in [-1,0,1]} _energyBak:INTEGER; _niceShoot:BOOLEAN; BP_12:CHAR; {INNER_BA2F}PROCEDURE __DrawShoot; BEGIN DRAW(155,134,_shootX,_shootY,3); DRAW(156,134,_shootX,_shootY,3); IF SoundFlag THEN SoundFx_4(6000,6,6) ELSE DELAY(30); DRAW(155,134,_shootX,_shootY,0); DRAW(156,134,_shootX,_shootY,0); END; {INNER_BAE2}PROCEDURE __CheckShoot; VAR BBP_06:INTEGER; BEGIN _niceShoot := FALSE; IF KEYPRESSED = TRUE THEN BEGIN READ(KBD,BP_12); IF (BP_12 = '1') AND ((_alienX = -1) AND (_alienY = 1)) THEN _niceShoot := TRUE; IF (BP_12 = '2') AND ((_alienX = 0) AND (_alienY = 1)) THEN _niceShoot := TRUE; IF (BP_12 = '3') AND ((_alienX = 1) AND (_alienY = 1)) THEN _niceShoot := TRUE; IF (BP_12 = '4') AND ((_alienX = -1) AND (_alienY = 0)) THEN _niceShoot := TRUE; IF (BP_12 = '5') AND ((_alienX = 0) AND (_alienY = 0)) THEN _niceShoot := TRUE; IF (BP_12 = '6') AND ((_alienX = 1) AND (_alienY = 0)) THEN _niceShoot := TRUE; IF (BP_12 = '7') AND ((_alienX = -1) AND (_alienY = -1)) THEN _niceShoot := TRUE; IF (BP_12 = '8') AND ((_alienX = 0) AND (_alienY = -1)) THEN _niceShoot := TRUE; IF (BP_12 = '9') AND ((_alienX = 1) AND (_alienY = -1)) THEN _niceShoot := TRUE; IF _niceShoot THEN BEGIN _shootX := D_9B6E; _shootY := D_9B70; __DrawShoot; END ELSE BEGIN VAL(BP_12,BP_0A,BBP_06); IF (BP_0A < 4) AND (BP_0A > 0) THEN BEGIN {bottom line} _shootX := (BP_0A - 2) * 64 + 155; _shootY := 118; __DrawShoot; END ELSE IF (BP_0A < 7) AND (BP_0A > 0) THEN BEGIN {middle line} _shootX := (BP_0A - 5) * 64 + 155; _shootY := 90; __DrawShoot; END ELSE IF (BP_0A < 10) AND (BP_0A > 0) THEN BEGIN {top line} _shootX := (BP_0A - 8) * 64 + 155; _shootY := 66; __DrawShoot; END; END; END; END; {INNER_BF05}PROCEDURE __ClearStatusText; BEGIN GOTOXY(11,20);WRITE(' '); GOTOXY(11,21);WRITE(' '); GOTOXY(11,20); END; {INNER_BF72}PROCEDURE __SpaceFight; BEGIN Counter := NumPirates; REPEAT DELAY(RANDOM(10) * 100); _alienX := RANDOM(3) - 1; _alienY := RANDOM(3) - 1; WHILE KEYPRESSED DO READ(KBD,D_A678); D_9B6E := 155 + _alienX * 4; D_9B70 := 90 + _alienY * 2; PLOT(D_9B6E,D_9B70,3); DELAY(300); PLOT(D_9B6E,D_9B70,0); WHILE KEYPRESSED DO READ(KBD,D_A678); D_9B6E := 155 + _alienX * 8; D_9B70 := 90 + _alienY * 4; GetPic(D_ABD9,D_9B6E - 6,D_9B70 - 6,D_9B6E + 6,D_9B70 + 6); PutSprite((D_9B6E - 3) DIV 4,D_9B70 - 2,SPR_1F); DELAY(230); PutPic(D_ABD9,D_9B6E - 6,D_9B70 + 6); D_9B6E := 155 + _alienX * 16; D_9B70 := 90 + _alienY * 6; GetPic(D_ABD9,D_9B6E - 12,D_9B70 - 6,D_9B6E + 12,D_9B70 + 6); PutSprite((D_9B6E - 6) DIV 4,D_9B70 - 4,SPR_1E); DELAY(200); PutPic(D_ABD9,D_9B6E - 12,D_9B70 + 6); D_9B6E := 155 + _alienX * 32; D_9B70 := 90 + _alienY * 12; GetPic(D_ABD9,D_9B6E - 16,D_9B70 - 8,D_9B6E + 16,D_9B70 + 8); PutSprite((D_9B6E - 12) DIV 4,D_9B70 - 6,SPR_1D); DELAY(170); PutPic(D_ABD9,D_9B6E - 16,D_9B70 + 8); D_9B6E := 155 + _alienX * 64; D_9B70 := 90 + _alienY * 24; GetPic(D_ABD9,D_9B6E - 28,D_9B70 - 14,D_9B6E + 28,D_9B70 + 14); PutSprite((D_9B6E - 24) DIV 4,D_9B70 - 12,SPR_43); DELAY(90); __CheckShoot; PutPic(D_ABD9,D_9B6E - 28,D_9B70 + 14); IF _niceShoot = FALSE THEN BEGIN Sav.f_Energy := Sav.f_Energy - 5; Explosion(TRUE); END; __ClearStatusText; GOTOXY(15,21); WRITE('énergie = ',Sav.f_Energy,' '); IF _niceShoot THEN BEGIN NumPirates := NumPirates - 1; Counter := Counter - 1; IF NotDemo {-- in game --} THEN Sav.f_ExpPoints := Sav.f_ExpPoints + 3; END; Counter := Counter - 1; UNTIL (Counter < 1) OR (Sav.f_Energy < 5); IF Sav.f_Energy < 5 THEN BEGIN __ClearStatusText; WRITE(' BARRIERE D''ENERGIE'); GOTOXY(17,21); WRITE('SAUTE !'); IF SoundFlag THEN SoundFx_6(10000); FOR _i := 1 TO 4 DO Explosion(TRUE); HALT; END; END; BEGIN CurrentPalette := 3; SetGraphicMode(3); ASSIGN(D_0268,C_41AD[1]); RESET(D_0268); READ(D_0268,D_0260^); CLOSE(D_0268); MOVE(D_0260^,C_41FC,$4000); Screen2Off; Off2Screen; IF NotDemo THEN BEGIN {-- in game --} __ClearStatusText; WRITE('énergie disponible :'); GOTOXY(18,21); WRITE(Sav.f_Energy); DELAY(2000); __ClearStatusText; WRITE('ravitaillement O/N ?'); D_A679 := ReadChar; IF D_A679 = 'O' THEN BEGIN __ClearStatusText; WRITE('nombre de containers'); GOTOXY(11,21); WRITE('(50 p.o. l''unité) ?'); GOTOXY(11,22); ReadDigit; GOTOXY(11,22); WRITE(' '); IF (D_9B64 * 50) < (Sav.f_Money + 1) THEN BEGIN Sav.f_Money := Sav.f_Money - 50 * D_9B64; Sav.f_Energy := Sav.f_Energy + 50 * D_9B64; END ELSE BEGIN __ClearStatusText; WRITE('compte à découvert !'); Beep; END; END; END ELSE BEGIN {-- demo version --} _energyBak := Sav.f_Energy; Sav.f_Energy := 50; NumPirates := 8; END; FOR _i := 1 TO 24 DO PLOT(RANDOM(200) + 60,RANDOM(90) + 40,3); IF NotDemo THEN BEGIN {-- in game --} __ClearStatusText; WRITE(' SAUT HYPERESPACE'); IF SoundFlag THEN SoundFx_8 ELSE DELAY(2000); Screen2Off; FOR _i := 1 TO 4 DO Explosion(TRUE); FOR _i := 1 TO 24 DO PLOT(RANDOM(200) + 60,RANDOM(90) + 40,3); END; __ClearStatusText; WRITE(' LES PIRATES '); GOTOXY(15,21); WRITE(' de SHAAM !'); IF SoundFlag THEN SoundFx_4(200,2,200) ELSE DELAY(3000); __SpaceFight; IF NotDemo THEN BEGIN {-- in game --} __ClearStatusText; DELAY(1000); WRITE(' SAUT HYPERESPACE'); IF SoundFlag THEN SoundFx_8 ELSE DELAY(2000); Screen2Off; FOR _i := 1 TO 4 DO Explosion(TRUE); FOR _i := 1 TO 24 DO PLOT(RANDOM(200) + 60,RANDOM(90) + 40,3); IF Sav.f_Energy > 25 THEN Sav.f_Energy := Sav.f_Energy - 25 ELSE Sav.f_Energy := 5; __ClearStatusText; WRITE(' energie = ',Sav.f_Energy,' '); IF SoundFlag THEN SoundFx_9; Sav.f_Days := Sav.f_Days + 7 END ELSE BEGIN Sav.f_Energy := _energyBak; END; END;
Sinon la decompilation est finie (9 octets de difference avec le fichier TERA.COM original); il ne reste qu'a renommer certaines variables et fonctions et, s'il n'y a pas d'objections, je poste le tout.
Niveau technique, c'est du turbo pascal (la version 3.01A); Ulysse a utilise les overlays et quelques acces direct a la memoire du PC (avec le mot-clef ABSOLUTE) mais a part ca, c'est du pur pascal.
Bonne lectureDernière modification par ergonomy_joe, 19 décembre 2014, 06h01.
Commentaire
-
Je viens de tester le jeu car j'ai tout juste découvert la discussion, il faut être nostalgique pour jouer à ce jeu, dur dur quand on ne le connait pas. C'est pas très clair ce qu'il faut faire.
Enfin bref ma curiosité est satisfaite, sur un jeu Loriciel qui m'était inconnu.
Je n'ai pas vu de protection, le jeu n'a pas nécessité de modification à ce niveau ?
Commentaire
-
@karamoon
pas de protection pour ce jeu. Par contre comme tu le fais remarquer l'objectif du jeu n'est pas facile a aprehender; c'est peut etre une autre forme de protection anti-copie ? ;-)
D'apres le source, il y a quatre taches a accomplir pour arriver la victoire. Les taches sont independantes il me semble.
- Invoquer un nom precis sur Meduz (et pour aller sur meduz il font encore monter en haut de la pyramide et y invoquer quelqu'un d'autre)
- Obtenir l'appui des medias (ca consiste a explorer un base sur Alfol pour trouver le bureau des medias, et leur donner 1000 ducats)
- Tuer Arioch (bien sur en etant assez costaud pour ca, et puis apres lui avoir mis la main dessus)
- Tuer un copain d'Arioch (apres avoir decouvert son nom, et l'avoir invoquer devant l'autel des tenebres)
Le gros du jeu consiste a explorer le plus possible de lieux, augmenter ses stats, parler au plus possible de monde pour apprendre les noms importants (invocations ...) et les points faibles des big bosses (en gros, a quels armes/objets ils sont vulnerables).
Je poste le source en l'etat. Il y aurait beaucoup a faire pour le rendre plus lisible, mais je n'ai pas trop le temps de m'en occuper (enfin si ca me reprend, je ferai quand meme des mises a jours):
TERA_SRC_20150107.zip
Comme je l'ai deja signale, le compilateur original est "Turbo Pascal 3.01A". Ulysse a modifie quelques messages d'erreurs directement dans le compilateur, si ca vous amuse de retrouver lesquels...
Et pour afficher/editer les fichiers sources correctement il vous faut IMPERATIVEMENT un editeur texte qui gere la page de code 437 (sinon au revoir les caracteres accentues, et puis surtout impossibilite de compiler).
bon retrodev!
Commentaire
-
Bonjour à tous,
Etant un nostalgique de ce jeu que j'avais eu du mal à finir à l'époque (qui peut deviner qu'il faut presser 'm' pour méditer à MEDUZ), j'ai regardé le code source disponible avec intérêt.
Celui-ci semble incomplet toutefois: je ne vois pas par exemple la partie combat (il y a une fonction SpawnMonster qui est déclarée, ou FightSequence, où sont-elles implémentées), ni la partie relative à la montée de niveau.
Le code référence des fichiers KBD.INC ou TERAUTIL.INC, je ne les vois pas présents dans l'archive.
Commentaire





Commentaire