Post subject: petits projet de débutants...
Former player
Joined: 7/6/2012
Posts: 207
Location: Réunion (FR)
salut, comme le dis le titre, je suis un débutant et je commence tout juste dans le domaine. j'ai commencé par modifié un lua script (celuis-ci: http://www.mediafire.com/?o4jvgp7ql9nsa7c ) en ceci : http://www.mediafire.com/?c32pq4r7c67m30y mon problème étant que le "jump velocity Y" de sonic ne fonctionne pas comme voulu. Pourquoi?
~ [I]feeuzz
Editor, Skilled player (1278)
Joined: 1/31/2010
Posts: 327
Location: France
Salut, pour commencer je te conseille d'utiliser les balises [code=Lua][/code] afin de directement poster le Lua script dans ton message, ce qui donne ceci :
Language: Lua

-- simple sonic 2 speedometer display -- demonstrates reading memory and writing text, -- as well as predicting future frames and reading memory from them -- create space in memory for a savestate state = savestate.create() -- register a function to run when the screen gets updated gui.register( function () -- get the X and Y velocity of the player xvel = memory.readwordsigned(0xffb010) -- sonic the hedgehog 2 yvel = memory.readwordsigned(0xffb012) -- get the X and Y velocity of the player 2 txvel = memory.readwordsigned(0xffb050) -- tails (miles) prower tyvel = memory.readwordsigned(0xffb052) -- look 2 frames into the future, pretending the B button is held, -- and get what the X and Y velocity of the player 2 will be savestate.save(state) for n=1,2 do joypad.set(1, {B = true}) gens.emulateframeinvisible() end jumpxvel = memory.readwordsigned(0xffb010) jumpyvel = memory.readwordsigned(0xffb012) savestate.load(state) ------------------------------------------------------------------------------------------------------ jumpxvel2 = memory.readwordsigned(0xffb050) jumpyvel2 = memory.readwordsigned(0xffb052) savestate.load(state) -- print the velocities onscreen, near the top-left corner, -- in a blue color with a black outline message = string.format("velocity: %d, %d", xvel, yvel) gui.text(15, 60, message, "#0080FFFF", "black") message = string.format("jump vel: %d, %d", jumpxvel, jumpyvel) gui.text(15, 68, message, "#0080FFFF", "black") message = string.format("speed: %d", memory.readwordsigned(0xffb014)) gui.text(22, 76, message, "#0080FFFF", "black") -- print the velocities onscreen, near the top-right corner, -- in a orange color with a black outline message = string.format("velocity: %d, %d", txvel, tyvel) gui.text(260, 60, message, "#FFA500FF", "black") message = string.format("jump vel: %d, %d", jumpxvel2, jumpyvel2) gui.text(260, 68, message, "#FFA500FF", "black") message = string.format("speed: %d", memory.readwordsigned(0xffb054)) gui.text(260, 76, message, "#FFA500FF", "black") end)
Je n'ai pas essayé de le lancer (je n'ai ni l'émulateur ni le jeu) mais à priori les adresses ont l'air d'avoir été correctement changées pour que le script fonctionne avec Sonic 2. Je ne suis pas sûr de totalement comprendre quel est ton problème mais je suis sûr que le savestate.load que j'ai indiqué avec des tirets est en trop (ou sinon il faudrait remettre une boucle qui fait avancer le jeu de 2 frames). Si ça ne fonctionne pas après ça, alors il y a de fortes chances que le problème vienne du code couleur ou des coordonnées des messages (ou éventuellement de ta ROM, si tu as une version européenne au lieu de la version américaine par exemple).
Former player
Joined: 7/6/2012
Posts: 207
Location: Réunion (FR)
merci beaucoup, pour l'info, le conseil et aussi l'astuce. mon probleme était qu'en fait, le chiffre affiché n'a pas l'air correcte. juste sa. mais merci quand même pour la remarque
~ [I]feeuzz
Joined: 1/26/2009
Posts: 558
Location: Canada - Québec
En faisant quelques tests, on voit que la prédiction pour "velocity y" est de "-1608" quand on reste immobile. Je crois que c'est dû à cette petite loop qui regarde 2 frames dans le futur en supposant qu'on appuis sur B(donc la gravité va donner un chiffre négatif), puis reload le frame courrant :
savestate.save(state)
	for n=1,2 do
		joypad.set(1, {B = true})--ligne a modifier ou enlever
		gens.emulateframeinvisible()
	end

	jumpxvel = memory.readwordsigned(0xffb010)
	jumpyvel = memory.readwordsigned(0xffb012)
	savestate.load(state)
Former player
Joined: 7/6/2012
Posts: 207
Location: Réunion (FR)
a ok, c'est donc sa, mais alors, pourquoi pour sonic 1 ça fonctionne parfaitement?
~ [I]feeuzz
Former player
Joined: 7/6/2012
Posts: 207
Location: Réunion (FR)
une deuxieme chose, est-t-il possible d'afficher une image (créer par moi même) sur l'écran pour une(plusieurs) certaine(s) valeurs d'une ram dans un simple lua?
~ [I]feeuzz
Joined: 1/26/2009
Posts: 558
Location: Canada - Québec
feeuzz22 wrote:
une deuxieme chose, est-t-il possible d'afficher une image (créer par moi même) sur l'écran pour une(plusieurs) certaine(s) valeurs d'une ram dans un simple lua?
Oui c'est possible, en tout cas le lua HUD pour sonic3 permet de cliquer sur l'écran et ils utilises quelques images pour certains icônes. Ceci dit, je crois que le plus simple pour mettre une image c'est d'utilisé la lib "gd" de lua. Voici les instructions pour windows: -Tout d'abord tu as de besoins des dll "lua5.1.dll" et "lua51.dll", que tu dois mettre dans ton fichier contenant l'exécutable de gens. Tu peux les prendres à partir de ce zip -Ensuite, toujours dans ton fichier contenant gens, crée un fichier "lua"(à moins que ce ne soit déjà fait) -Télécharge la lib lua GD ici et dézipe le tout dans le fichier fichier lua Ensuite fait toi un script .lua pour voir si ça marche:
Language: Lua

require "gd" emu = gens while true do fileNameIMG = "lua/logo.png" logo = gd.createFromPng(fileNameIMG):gdStr() gui.gdoverlay(40, 0, logo) emu.frameadvance() end
(ici, j'ai fait un mit un logo.png dans le fichier lua) S'il a une erreur tu peux regarder dans la console lua. Sinon, voilà un screenshot de ce que ça me donne. Pour plus d'info sur les fonction de la GD, google est ton amis ;) Pour ta première question, de mon côté les valeurs de sonic1 semblent avoir le même comportement que dans sonic2, donc je ne suis pas sûr de comprendre où est l'erreur.
Former player
Joined: 7/6/2012
Posts: 207
Location: Réunion (FR)
ok merci, j'avais surement la tete ailleur, lorsque j'ai tester sonic 1, mais as tu remarquer que sa fonctionne correctement pour tails? J'ai fait une version sonic 3 aussi, qui montre le velocity de 2 façons différentes, je trouve sa mieux.
Language: Lua

-- simple sonic 3 & knuckles speedometer display and jumpometer+ -- demonstrates reading memory and writing text, -- as well as predicting future frames and reading memory from them -- create space in memory for a savestate state = savestate.create() -- register a function to run when the screen gets updated gui.register( function () -- get the X and Y velocity of the player xvel = memory.readwordsigned(0xffb018) -- sonic the hedgehog 2 bxvel = memory.readbytesigned(0xffb018) yvel = memory.readwordsigned(0xffb01a) byvel = memory.readbytesigned(0xfb01a) -- get the X and Y velocity of the player 2 txvel = memory.readwordsigned(0xffb062) -- tails (miles) prower btxvel = memory.readbytesigned(0xffb062) tyvel = memory.readwordsigned(0xffb064) btyvel = memory.readbytesigned(0xffb064) -- look 2 frames into the future, pretending the B button is held, -- and get what the X and Y velocity of the player 2 will be savestate.save(state) for n=1,2 do joypad.set(1, {B = true}) gens.emulateframeinvisible() end jumpxvel = memory.readwordsigned(0xffb010) jumpyvel = memory.readwordsigned(0xffb012) savestate.load(state) jumpxvel2 = memory.readwordsigned(0xffb050) jumpyvel2 = memory.readwordsigned(0xffb052) savestate.load(state) message = string.format("velocity: %d, %d", xvel, yvel) gui.text(10, 60, message, "#0080FFFF", "black") message = string.format("jump vel: %d, %d", bxvel, byvel) gui.text(10, 70, message, "#0080FFFF", "black") message = string.format("speed: %d", memory.readwordsigned(0xffb014)) gui.text(10, 80, message, "#0080FFFF", "black") message = string.format("velocity: %d, %d", txvel, tyvel) gui.text(210, 60, message, "#FFA500FF", "black") message = string.format("velocity: %d, %d", btxvel, btxvel) gui.text(210, 70, message, "#FFA500FF", "black") message = string.format("speed: %d", memory.readwordsigned(0xffb054)) gui.text(210, 80, message, "#FFA500FF", "black") message = string.format("tails jump vel: %d, %d", jumpxvel2, jumpyvel2) gui.text(180, 30, message, "#FFFFFFFF", "black") message = string.format("sonic jump vel: %d, %d", jumpxvel, jumpyvel) gui.text(180, 20, message, "#FFFFFFFF", "black") end)
~ [I]feeuzz
Former player
Joined: 7/6/2012
Posts: 207
Location: Réunion (FR)
dans l'avant, avant dernier paragraphe, il vaut mieux remplacer "jump vel" par "velocity" ^^.
~ [I]feeuzz