Post subject: Road Runner's Death Valley Rally
Player (137)
Joined: 9/18/2007
Posts: 389
I like the videos created here very much, so I decided to make my own one. There seems to be no one currently creating a video of this game, so I decided to start that 3 days ago. It's my first TASing attempt. Rules: -any% -aims for fastest time -takes damage to save time -abuses programming errors ("instant-stop without jumping" and "jumping through floors" at the moment, more if i find them...) I noticed there is already a thread about this game, but no one posted anything to it for more than one year. My current progress: Finished! (see my submission) Emulator used: Snes9x 1.51 ROM used: Road Runner's Death Valley Rally (U) [!] OLD LINKS: for my run until 4-3 (some stages can be improved, especially the third boss will look much better in my final version): http://dehacked.2y.net/microstorage.php/info/124627199/partyboy-road-runner-wip-until-4-3.smv for my optimized run (only done till 2-1): http://dehacked.2y.net/microstorage.php/info/575920820/partyboy-roadrunner-optimized-wip-until-2-1.smv NEWEST ONE: see my latest post I wish feedback. Does it look impressive so far? Does it sync for you? Do you see any shortcuts I have forgotten? PS: If someone still has the older wip (which was posted in the old thread), it would be great for me to see it. PS2: I'm not a native english speaker... Edit: corrected the download link. Edit: added rules for this run. My older WIPs: http://dehacked.2y.net/microstorage.php/info/626440002/Road%20Runner%27s%20Death%20Valley%20Rally%20%28U%29%20%5B%21%5D.smv I finished 2-3, it goes out of sync during the boss fight. http://dehacked.2y.net/microstorage.php/info/1059437760/Road%20Runner%27s%20Death%20Valley%20Rally%20%28U%29%20%5B%21%5D.smv (When fast-forwarding, it desyncs in 2-1, even if you turn off frame-skipping.) 1.43-9: http://dehacked.2y.net/microstorage.php/info/1990184366/Road%20Runner%27s%20Death%20Valley%20Rally%20%28U%29%20%5B%21%5D.smv (I finished 1-1 only since the bug already appears there.)
Skilled player (1827)
Joined: 4/20/2005
Posts: 2161
Location: Norrköping, Sweden
The password you posted seems to be wrong, it doesn't work for me. And you should upload your run here instead, it's much more convenient. I'll take a look at this once you've uploaded it there. :) I made a short WIP of this game, here. It's probably improvable though, but it could be used as a base for level 1. EDIT: Oh, and I'm sure you've seen the run on Speed Demos archive: http://speeddemosarchive.com/DeathValleyRally.html If not, you should watch it carefully, it's pretty good.
Player (137)
Joined: 9/18/2007
Posts: 389
Yes, i've watched that one from speed demos archive. It would be great to know if someone sees bad path decisions in there. Edit I'd love to see more of your wips, they may give me good ideas... this time, i was already 33 frames faster. I didn't have the idea of doing your last jump that early. However, it was 2 frames slower than my later jump.
Skilled player (1827)
Joined: 4/20/2005
Posts: 2161
Location: Norrköping, Sweden
I hate to be a pain about this, but your movie file don't work. :( When I downloaded it and tried to play it in SNES9X, it says "File is wrong version". Basically, it doesn't recognize the file as an .smv-file. Perhaps your SMV-file is broken or something... My suggestion is that you make sure that the SMV-file can be played in SNES9X before you upload it. If it still doesn't work, you might want to record a new movie, and load the latest savestate, and then upload it.
Player (137)
Joined: 9/18/2007
Posts: 389
As already said, I used (the official version of) Snes9x 1.51 to make this movie.
JXQ
Experienced player (761)
Joined: 5/6/2005
Posts: 3132
If you load a wrong state with 1.43, but reload a correct state afterwards, it will restore your movie. This happens because each savestate stores the entire movie up to that point.
<Swordless> Go hug a tree, you vegetarian (I bet you really are one)
Player (137)
Joined: 9/18/2007
Posts: 389
For now, I will use Snes9x 1.51. It's too difficult to convert the file back to the old format, because it desyncs at every single frame-perfect action. And what about my video so far? Is there a chance it will be accepted in this format when it is finished (and being good enough, of course)?
Editor, Reviewer, Experienced player (979)
Joined: 4/17/2004
Posts: 3109
Location: Sweden
>Is there a chance it will be accepted in this format when it is finished (and being good enough, of course)? Yes, 1.51 is a valid emulator, so your movie can be accepted if it is good enough. 1.51 is only discouraged because it has sync problems. About your movie, the first jump off the first rising platform didn't look optimal. You could have had more speed as you jumped off the platform. But maybe this doesn't matter since you are boosting directly afterwards?
Player (137)
Joined: 9/18/2007
Posts: 389
Truncated wrote:
>the first jump off the first rising platform didn't look optimal. You could have had more speed as you jumped off the platform. But maybe this doesn't matter since you are boosting directly afterwards?
I've tested it for now. I haven't seen any difference between these two variations. EDIT: I've retested it, and I managed to save 3 frames by using Randil's strategy. Movie will be updated soon (I think I'll post it saturday or monday, I don't have enough time left at the moment). That's the hex address list I currently use: ;================================ ; >> Road Runner's Death Valley Rally ;================================ [RR DEATH VALLEY RALLY0] 7E04C6,2f,X Speed 7E0554,2f,Y Speed 7E031C,2u,X Pos 7E17A2,2u,X Pos2 7E194C,2u,Y Pos 7E0038,2u,Y Pos2 7E1F1C,2f,Bird Seed 7E1F1D,1u,Bird Seed2 7E1F1E,1u,Health 7E14DC,1s,Random? Note: I modified Snes9x-watcher to display floating point numbers (but I programmed it very dirty since I don't know how to program with HSP). You either need to replace the ,2f, with ,2u, or you need my version. I'll post my modification upon request. My comments for the other levels: 1-2 I managed to get the last platform moving before I stand on it. The margin for the last few jumps at the end is very small (it was only 2 or 3 frames). 1-3 The first level where I take damage to save time. The fly ends a bit over the top of the highest reachable platform, but there's no way to fly about 5 pixels lower (The game seems to be designed that way.) The jumping at the end of the level looks quite crappy, but it can't be made faster since the jumping height (and so the time for landing on the platform) can't be influenced. 1-4 (Boss) I think this one can't be improved any further (because of the animations that need to be completed). 2-1 Currently the movie will desync here... About half the level is completed PS: maybe someone is interested in co-authoring the movie with me?
Skilled player (1827)
Joined: 4/20/2005
Posts: 2161
Location: Norrköping, Sweden
partyboy1a wrote:
That's the hex address list I currently use: ;================================ ; >> Road Runner's Death Valley Rally ;================================ [RR DEATH VALLEY RALLY0] 7E04C6,2f,X Speed 7E0554,2f,Y Speed 7E031C,2u,X Pos 7E17A2,2u,X Pos2 7E194C,2u,Y Pos 7E0038,2u,Y Pos2 7E1F1C,2f,Bird Seed 7E1F1D,1u,Bird Seed2 7E1F1E,1u,Health 7E14DC,1s,Random?
I have some other addresses for this game: ;================================ ; >> Road Runners Death Valley ;================================ [RR DEATH VALLEY RALLY] 7E0036,1u,X position 7E0006,1u,Y position 7E04C7,1u,X pixel Speed They're probably mirror-addresses of yours, but perhaps they could be of some use.
Player (137)
Joined: 9/18/2007
Posts: 389
I restarted my run, because I found big improvements in the first levels... level 1-1: optimized by 2 frames. level 1-2: optimized by 46 frames. possible improvements: 1-1: 1 frame maybe. If i got it to leave the ramp just 2/256 pixels/frame slower, that would be the best possible jump, since I wouldn't need to stop moving forward for 1 frame when flying. Gained 2 frames over my previous attempt by changing the tactic for jumping from the lift. 1-2: 1 frame maybe. When I corrected an error in the beginning (i stopped dashing, which costs 1 frame), it caused exactly 1 frame delay later on. Since I cannot change this place, I couldn't remove this delay. Time savers compared to earlier version: -jumping onto the first ramp: 9 frames -jumping to the very top of the next ramp: 26 frames -hitting the lift earlier: 11 frames Here's the link for my optimized run: http://dehacked.2y.net/microstorage.php/info/561929671/roadrunner-by-partyboy.smv I think I have found a (risky) workaround for the fast-forward bug... I will disable the "WrongMovieStateProtection", so i can try the hex-editing without playing back the whole movie... warning: do not fast-forward, it will desync.
Joined: 3/17/2007
Posts: 97
Location: Berkeley, CA
It doesn't sound risky because that check doesn't do much. If you're in read-only mode, the input already gets checked for consistency. If not, loading a savestate will clobber all of your hex-editing work anyway. :) If you grab my modified snes9x (not desyncless, but available in the "desyncless 1.51" thread) you can get a "fast forward to frame" feature. That might even be nicer because you can skip right to where you started making changes. (This assumes you're using Windows. If you're on Linux, snes9x can do that already. :))
IRC nick: UncombedCoconut
Player (137)
Joined: 9/18/2007
Posts: 389
Thanks, I already found that one. However, it doesn't work for me the way I need it, because it desyncs in the same way. My last polished run desyncs before the first jump in 1-2 while using it. The jump is done as early as possible, and fast-forwarding causes Road Runner to run into the opposite direction. Do you think it would be OK to sacrifice some frames for fast-forwardablity? For example, this desync can be fixed by standing still for 1 or 2 more frames at the beginning (so I think at least) I have posted some newer WIPs (see my first post). Does anyone see any mistakes especially in my optimized run?
Joined: 10/14/2008
Posts: 44
Location: Sweden
Uhm, Im also doing one which probaly sucks compared to yours (although I just done lvl 1) Youtube : http://www.youtube.com/watch?v=hOcMDfIBtHU SMV : http://dehacked.2y.net/microstorage.php/info/1755141970/Road%20Runner%20DVR%20TAS%20by%20DJS.smv Use snes9x 1.51
Joined: 8/27/2006
Posts: 883
Actually, the post is 13 months old, so I don't think it's being worked on right now.
Joined: 10/14/2008
Posts: 44
Location: Sweden
One problem for me about this game is that I never beated it. I just remember it from my childom and remember its very funny, so thats why im TASing it. But Idk I might just TAS it for fun to get some TASing skillz so I can move up to N64. I think im gonna keep posting level per level, but remember they are not TAS perfect, but yeah... Have fun with them, gonna start working on Level 2 (which i never have beaten)
MezzoDragon
He/Him
Joined: 5/27/2007
Posts: 120
I could never beat the game either. Although I did make it to the final boss, I could not figure out how to defeat it. Anyway, once you are done with the any% TAS, is there any chance for a 100% run. Whether or not there is, what could be considered to be 100%?
Joined: 10/14/2008
Posts: 44
Location: Sweden
I think 100% would be: *All bird seeds *All flags *All secret pickups If theres intrest I maybe do 100% TAS, but that will take years since I gotta check up GameFAQ and other stuff for all the stuff...
Joined: 10/14/2008
Posts: 44
Location: Sweden
I kinda started working on it again heres WIP to 2-1 http://dehacked.2y.net/microstorage.php/info/1339930256/Road%20Runner%27s%20Death%20Valley%20Rally%20%28U%29%20%5B!%5D.smv But im atm just doing for fun :) I can probaly do a lot more faster.
Post subject: i'm working on it again after that long break...
Player (137)
Joined: 9/18/2007
Posts: 389
http://dehacked.2y.net/microstorage.php/info/1158395610/roadrunner-done-till-5-3-snes9x151.smv http://dehacked.2y.net/microstorage.php/info/832128840/roadrunner-done-till-4-3-snes9x151.smv allow left+right ON volume envelope height reading ON fake mute desync workaround ON sync samples with sound cpu ON (!!) the levels up to 4-2 are around 5 seconds faster than compared to the 3 years old wip, while 4-3 alone is about 15 seconds faster due to a bug i found. it makes it possible to jump through solid floor. so... does it look nice to you? ------------- about a 100% run i won't do one because i think it's too difficult to say what is 100%. getting all flags is just one thing, but that wouldn't cover the secret way near the elevator in the very first level. picking up everything wouldn't make a nice goal either, for example there is no reason for picking up all the bird seed. and a rule like "pick up all extra lives" is even more strange. ------------- still waiting for feedback. i can provide savestates so you can watch level-by-level
Player (118)
Joined: 5/13/2009
Posts: 700
Location: suffern, ny
I would give feed back, but upon working on this game, I hit fast forward once by accident, and any run I watch, immediately desychs. sorry.
[19:16] <scrimpy> silly portuguese [19:16] <scrimpy> it's like spanish, only less cool
Player (137)
Joined: 9/18/2007
Posts: 389
some of the tricks i found so far: (i use the "lazymacro" syntax) the fastest way of running to the right is (<Y)[(>Y)]16|>, it's 2 pixels faster than just using (>Y). if you're running right without y for a certain amount of time and you want to change the direction, try +Y <<>|< or +Y <<>>|< or +Y <<<>>|< if you're running to the right with full speed, you can stop movement very fast with +Y <<><! in level 4, you can jump through the spikes which hang from the ceiling, i do abuse that in 4-3. hitting ramps at the top can have unexpected effects. it may be possible to influence the "behaviour" of ramps by changing roadrunners position by a few pixels. (at least in one case thats possible, in 5-3 there is one ramp where i had to do that) ------------- i tried using zsnes, but it didn't record anything after i stopped my movie for the first time. i got 1-1 done even 7 frames faster there ------------- some people wanted to see an "all flags run". i created a small lua script (which can for sure be improved by a lot) which helps if you want to create a map. best method would be to move road runner, but i couldnt figure out how to change his y-position. before using it, you must disable all graphic layers except BG1 and BG4 (and you must be in level 1-1). everything should work well. There are some minor distortions in the map, and it won't show the elevators. You might be able to improve it.
require "gd"

levelname="level1-1"
y = 544  --highest x/y value camx2 can reach in normal gameplay
x = 9344 --found by running completely to the lowest right corner of the map
         --must be adjusted manually

upperblacksize=13 --found by taking screenshots
lowerblacksize=16 --and a little trial-and-error


xsize=256
ysize=224
realysize = ysize - upperblacksize - lowerblacksize

gridx=200
gridy=150

camx1 = 0x7E0050
camx2 = 0x7E0054
posx1 = 0x7E031C
posx2 = 0x7E17A2
posy1 = 0x7E194C
posy2 = 0x7E0038
posy3 = 0x7E03AA

camy1 = 0x7E007A
camy2 = 0x7E0056
xspeed = 0x7E04C6
yspeed = 0x7E0554

image = gd.createFromPng(string.format("%s.png",levelname))

if(image == nil) then
	image = gd.createTrueColor(x + xsize, y + ysize - lowerblacksize - upperblacksize)
end

mycolor = image:colorAllocate(255,0,255)
takingpicture = false

function writeposition(x, y)
	memory.writeshort(posx1, x)
	memory.writeshort(posx2, x)
	memory.writeshort(posy1, y)
	memory.writeshort(posy2, y)
	memory.writeshort(posy3, y)
end

function setgroundflag()
	memory.writebyte(0x7E144D, 0)
	memory.writebyte(0x7E144D, 1)
end

function movetozerozero()
	currentposx=memory.readshort(posx1)
	currentposy=memory.readshort(posy1)
	while currentposx >= 8 do
		writeposition(currentposx - 8, currentposy)
		setgroundflag()
		currentposx = currentposx - 8
		snes9x.frameadvance()
	end
	while currentposy >= 8 do
		writeposition(currentposx, currentposy - 8)
		setgroundflag()
		currentposy = currentposy - 8
		snes9x.frameadvance()
	end
end

function takenextpicture()
	if not(takingpicture) then
		takingpicture = true
		lastimage = gui.gdscreenshot()
		if not(lastimage==nil) then 
			lastshot = gd.createFromGdStr(lastimage)
			currentcamx = memory.readshort(camx2)
			currentcamy = memory.readshort(camy2)
			--gd.copy(dstImage, srcImage, dstX,                dstY,                        srcX, srcY,           w,            h) 
			--insert the last picture into what we got so far
			
			if movingdirection==-1 then xcorrection=0 else xcorrection=-16 end
			gd.copy  (image,    lastshot, currentcamx + xcorrection, currentcamy - upperblacksize, 0, upperblacksize, xsize, ysize - upperblacksize - lowerblacksize) 
		end
		
		--gui.text(int x, int y, string msg)
		
		--draw current position onto the game screen so you know where something is still missing
		for i = 0, 1 do
			for j = 0, 1 do 
				stringtodraw = string.format("(%i/%i)",(i+math.floor(currentcamx / gridx))*gridx, (j+math.floor(currentcamy/gridy))*gridy)
				gui.text(-currentcamx % gridx + i*gridx, -currentcamy % gridy + j*gridy, stringtodraw)
			end
		end
		takingpicture=false
	end
end

function writepicture()
	image:png(string.format("%s.png",levelname))
	
	--gdImage:line(x1, y1, x2, y2, color)
	--i think there is a much better way for that as presented here, but at least it works
	image2 = gd.createFromPng(string.format("%s.png",levelname))
	for i = 0, math.ceil(x / gridx) do
		for j = 0, math.ceil(y / gridy) do
				image2:line(i*gridx, (j+1)*gridy, (i+1)*gridx, (j+1)*gridy, mycolor)
				image2:line((i+1)*gridx, j*gridy, (i+1)*gridx, (j+1)*gridy, mycolor)
				--gdImage:string(font, x, y, string, color)
				stringtodraw = string.format("(%i/%i)", i*gridx, j*gridy)
				image2:string(gd.FONT_LARGE, i*gridx, j*gridy, stringtodraw,mycolor)
		end	
	end
	image2:png(string.format("%s-sectioned.png",levelname))
end

--now move him all over the screen
movetozerozero()

emu.registerafter(takenextpicture)
emu.registerexit(writepicture)

movingdirection=1
currentposx=memory.readshort(posx1)
currentposy=memory.readshort(posy1)

--this massively increases consumed ram
--snes9x.speedmode("maximum")

repeat
	writeposition(currentposx + 8, currentposy)
	currentposx = currentposx + 8
	snes9x.frameadvance()
	currentcamx=memory.readshort(camx2)
until currentcamx>=x
j=1
currentcamx=memory.readshort(camx2)
currentcamy=memory.readshort(camy2)

while currentcamy < y do
	movingdirection = movingdirection * -1
	currentposy = currentposy + 96
	writeposition(currentposx, currentposy)
	snes9x.frameadvance()
	repeat
		if movingdirection==1 then
			writeposition(x + xsize, currentposy)
		else
			writeposition(40, currentposy)
		end
		snes9x.frameadvance()
		currentcamx=memory.readshort(camx2)
	until ((currentcamx>=x and movingdirection==1) or (currentcamx==0 and movingdirection==-1))
end

movingdirection = movingdirection * -1
writeposition(currentposx, currentposy)
snes9x.frameadvance()
repeat
	if movingdirection==1 then
		writeposition(x + xsize, currentposy)
	else
		writeposition(40, currentposy)
	end
	snes9x.frameadvance()
	currentcamx=memory.readshort(camx2)
until ((currentcamx>=x and movingdirection==1) or (currentcamx==0 and movingdirection==-1))

movingdirection=1

emu.registerafter(nil)
--snes9x.speedmode("normal")