Posts for Bobo_the_King

Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Lua program "skitchinspeedometerpro.lua" (cannibalized from the Sonic speedometer):
-- simple skitchin' 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
	
	dist = memory.readwordsigned(0xff0736)
	speed = memory.readbytesigned(0xff0768)
	xpos = memory.readwordsigned(0xff0748)
	xvel = memory.readbytesigned(0xff1541)
	frames = memory.readbyteunsigned(0xff01fb)
	health = memory.readwordunsigned(0xff077A)
	skates = memory.readwordunsigned(0xff0002)

	-- look 25 frames into the future and find if a jump is possible next frame
	savestate.save(state)
	gens.emulateframeinvisible()
	joypad.set(1, {up = true})
	joypad.set(1, {B = true})
	joypad.set(1, {C = true})
	i = 1
	while i<25> 0) then
		canjump = 1
	else
		canjump = 0
	end
	savestate.load(state)

	-- print the velocities onscreen, near the top-right corner,
	-- in a green color with a black outline
	message = string.format("position: %d, %d", dist, xpos)
	gui.text(210, 10, message, "#00FF00FF", "black")
	message = string.format("velocity: %d, %d", speed, xvel)
	gui.text(210, 18, message, "#00FF00FF", "black")
	message = string.format("frames: %d", frames)
	gui.text(180, 140, message, "#00FF00FF", "black")
	message = string.format("%d", health)
	gui.text(300, 185, message, "#00FF00FF", "black")
	message = string.format("%d", skates)
	gui.text(300, 193, message, "#00FF00FF", "black")
	message = string.format("can jump: %d", canjump)
	gui.text(100,140,message, "#00FF00FF", "black")
end)
I think that code is pretty self-explanatory, especially if you run it. Matlab program "skitchin.m":
function skitchin(t)

frame = 35614;
x = 76107726;
v = 25447;
x_fin = 139500000;

nitro = 0;
v_max = 32255;
acc = 56; %per frame
coast = -4.3;

while x<x_fin> 0;
        v = v + acc;
        if v > v_max;
            v = v_max;
        end
        nitro = nitro - 1;
    else
        v = v + coast;
    end
    x = x+v;
    frame = frame+1;
end

frame
Matlab is my bread and butter, but I don't think anything is too difficult to understand for someone with a good background in programming. The only thing I feel the need to point out is that the input argument t is a vector specifying the time(s) that I want to simulate using a nitro. The program's output is the projected time (in frames) to completion of the level. The values of acc and coast were derived empirically, although coast may vary somewhat from level to level. The values for frame, x, v, and x_fin all vary contextually; whenever I want to simulate a new level, I change the values of those variables manually. I then run the code several times until I find a global minimum. I could probably automate the minimization process, but it generally isn't too difficult. Level maps: Vancouver --------- Oil - 214/139 Ramp - 247/210 CB Ramp - 296/216 Pipe -368/192 SL Ramp - 410/304 Gravel - 428/70 Crowbar - 510/212 Ramp - 558/210 Crowbar - 644/219 CB Ramp - 687/227 Bench - 729/363 SL Ramp - 761/285 Bench - 804/463 Nitro - 835/-632 Gravel - 841/91 SL Ramp - 865/321 Pipe - 951/183 Trash cans - 961/245 Bench - 964/410 Trash cans - 977/122 Trash cans - 995/260 Ramp - 1074/230 Ramp - 1150/222 Oil - 1165/142 Crowbar - 1270/191 Ramp - 1322/224 Gravel - 1344/-113 Crowbar - 1495/199 Ramp - 1525/209 Denver ------ Ramp - 168/-220 Oil - 181/20 CB Ramp - 304/-215 SL Ramp - 367/327 Slow Ahead - 394/-225 Potholes - 403/-226 Slow Ahead - 423/-234 Ramp - 458/-186 Oil - 467/0 Gravel - 523/-91 Crowbar - 576/-214 Slow Ahead - 633/265 Slow Ahead - 653/265 Ramp - 681/190 Nitro - 687/179 Truck - 693/Right Oil - 737/-68 CB Ramp - 774/215 Ramp - 867/214 Intersection - 937 Oil - 961/-120 Ramp - 977/211 Gravel - 1017/83 Intersection - 1048 Mound - 1089/200 Chain - 1096/160 Barriers - 1102/Right Oil - 1141/34 SL Ramp - 1144/296 Ramp - 1208/150 Boxcar - 1220/202 Gravel - 1268/-150 Pipe - 1311/123 Gravel - 1312/-127 Cones and Potholes - 1319/Right Oil - 1374/-120 Intersection - 1376 Nitro - 1432/-200 Intersection - 1453 Gravel - 1468/100 Ramp - 1492/-224 San Diego --------- Intersection - 140 Intersection - 179 Intersection - 320 Nitro - 432/-196 SL Ramp - 518/319 Intersection - 560 Intersection - 600 Oil - 645/210 Intersection - 680 Intersection - 720 Crowbar - 800/-270 RW Sign - 821/-272 Mound - 839/-186 Truck - 850/Left Pipe - 893/-207 Intersection - 899 CB Ramp - 922/-174 Intersection - 939 CB Ramp - 994/-162 Barriers - 1047/Left Intersection - 1080 Gravel - 1104/-87 Gravel - 1130/-150 Intersection - 1200 Pipe - 1206/196 Oil - 1242/128 Intersection - 1280 Ramp - 1304/230 Oil - 1308/-60 Intersection - 1360 Mound - 1391/200 Bat - 1399/124 Open MH - 1404/165 Intersection - 1420 Intersection - 1475 Gravel - 1497/-140 Intersection - 1540 Seattle ------- Gravel - 110/-148 Oil - 193/70 Gravel - 274/-115 Nunchuks - 474/-220 Washington ---------- Oil - 102/40 Oil - 167/73 Nitro - 179/265 Oil - 251/61 Cones - 304/left Split road - 313 to 388 Oil - 317/130 Mound - 333/-210 Oil - 337/143 Barriers - 338/left Oil - 354/111 Nunchuks - 361/-265 Oil - 383/115 Nitro - 386/55 Barriers - 388/left Oil - 416/-40 Gravel - 412/301 Gravel - 443/-70 Gravel - 457/250 Gravel - 465/-55 Gravel - 469/120 Gravel - 527/-85 Oil - 571/-82 Gravel - 582/120 Pothole - 633/-197 Gravel - 648/120 Gravel - 664/-123 Nitro - 665/248 Gravel - 674/90 Gravel - 708/94 Oil - 716/-53 Gravel - 729/100 Gravel - 805/-147 Bat - 814/-215 Gravel - 895/-80 Oil - 913/-36 Pothole - 930/-220 Nitro - 958/78 SL ramp - 961/304 Pothole - 982/-206 Gravel - 1008/-72 Oil - 1055/53 Crowbar - 1106/-229 RW sign - 1118/-21 RW sign - 1127/-21 Divided road - 1137 to 1292 Oil - 1183/-44 Gravel - 1200/-119 Chain - 1210/166 Pothole - 1315/250 SL ramp - 1363/328 Toronto ------- Gravel - 191/-5 Nitro - 258/180 SL Ramp - 713/329 Speed Bump - 1064 Nitro - 1129/177 Speed Bump - 1211 Ramp - 1267/-160 Speed Bump - 1387 Nitro - 1461/256 Speed Bump - 1803 End - 2128 (139500000) Detroit ------- Nitro - 365/290 Nitro - 642/-290 Slow Ahead - 788/190 Nitro - 817/381 Mound - 875/170 Nitro - 901/66 Slow Ahead - 918/-370 Slow Ahead - 1018/-346 (fool's gold!) Slow Ahead - 1197/-121 Slow Ahead - 1243/-140 Mound - 1287/-168 SL Ramp - 1304/324 (choose between mound and SL ramp) Ramp - 1341/-197 Mound - 1347/-191 (choose between ramp and mound) Ramp - 1379/-194 (can't jump truck) SL Ramp - 1555/326 SL Ramp - 1614/341 End - 2128 (139500000) Chicago ------- Speed Bump - 205 SL Ramp - 348/314 Speed Bump - 412 SL Ramp - 500/316 Speed Bump - 541 Nitro - 615/205 Speed Bump - 634 Speed Bump - 741 Heap - 789/-331 Miami ----- Nitro - 306/-185 SL Ramp - 938/310 SL Ramp - 1068/329 SL Ramp - 1322/320 Nitro - 1406/-220 SL Ramp - 1704/??? Nitro - 1715/-212 SL Ramp - 1724/324 SL Ramp - 1894/329 Mound - 2381/191 Nitro - 2427/481 Nitro - 2464/506 Nitro - 2650/-700 Nitro - 2671/-707 End - 2895 (18960625) New York -------- Nitro - 147/260 SL Ramp - 160/314 SL Ramp - 250/311 SL Ramp - 362/307 SL Ramp - 558/307 SL Ramp - 649/315 Nitro - 725/-217 Nitro - 1061/252 Slow Ahead - 1550/-307 Slow Ahead - 1556/-246 Slow Ahead - 1566/-191 Slow Ahead - 1584/-131 Slow Ahead - 1600/-60 Nitro - 1618/-294 Slow Ahead - 1621/-64 Slow Ahead - 1639/-53 Nitro - 1708/-203 Slow Ahead - 1860/135 Mound - 1875/197 Slow Ahead - 1881/128 Nitro - 1980/-270 Heap - 2035/-300 Heap - 2115/-306 (may be difficult to catch) Heap - 2311/-306 Heap - 2368/-323 Heap - 2447/312 Nitro - 2529/-263 Heap - 2585/-309 Heap - 2622/-312 Slow Ahead - 2700/317 Slow Ahead - 2729/150 Heap - 2842/327 Nitro - 2898/239 Heap - 2970/277 End - 2992 (196121868) Speed Bonus (Vancouver, Toronto, and Miami) ------------------------------------------- Nitro - 266/-212 Nitro - 595/50 Cattle Prod - 653/763 Nitro - 888/-197
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Latest progress (no youtube video this time, as I only completed Toronto through Detroit): http://dehacked.2y.net/microstorage.php/info/1905198446/speedrun2.gmv djchilxxn: Thank you for your support! These levels just get harder and harder to run but when I play them back, they look better every time! I only hope that more people share your admiration-- I want this published, damn it! By the way, when you said that Nova's playthrough is more entertaining, it got me thinking that maybe this would be a fun game for maximizing the bonus cash (the "score"). That would be done by getting first in each race, doing all the bonus levels, knocking down as many people as possible, and doing as many tricks as possible. It would essentially be a very impressive conventional playthrough of the game. The drawback is that it would probably take a lot longer, although I imagine it wouldn't require nearly so much optimization. If at least a few people show interest, I may shoot for a money-maximizing TAS. mmbossman: You got your T-bone! Check it out at the end of Toronto. I'll try to do more as they seem to save a little time. I was feeling a little overwhelmed by route planning: I had to use two, three, or four nitros in Toronto; zero, one, two, or three in Toronto bonus; and anywhere from three to six in Detroit. In addition, I had to make sure that I would have no more than three nitros at any given time and that I had at least one or two left over for the start of Chicago. I figured that the only way to see how many nitros I should use in Toronto and Toronto bonus would be to test them manually. Then I slapped myself on the forehead as I realized I had written this nifty Matlab program to simulate levels and I didn't have to use trial and error. I admit the Matlab program is far from perfect (I think its biggest flaw is that it doesn't take into account speed gained from jumps), however the idea is not to simulate the level times, but the difference between two level times due to a change in strategy. For the sake of thoroughness, here are my results: Toronto: 2 nitros (Matlab simulation) - 5337 frames 3 nitros (Matlab) - 4854 4 nitros (Matlab) - 4671 Toronto bonus: 0 nitros (existing TAS of Vancouver bonus) - 2540 1 nitro (emulation) - 2560 2 nitros (emulation) - 2193 3 nitros (emulation) - 2158 Since running the Toronto bonus level manually is very easy, I opted to get ideal approximations via emulation. You can see that using three nitros in Toronto saves about 500 frames as opposed to two nitros. Using four nitros in Toronto saves an additional 200 frames, but because I would then start Toronto bonus with no nitros on reserve, it then costs me about 400 frames. Clearly, the best strategy is to use three nitros in Toronto and two nitros in Toronto bonus, saving two for Detroit. If you download the .gmv file at the top of this post, you'll see that's exactly what I do (and with good results!). Detroit, as expected, was a pain. There is a nitro off in the grass, so picking it up was a pain in the ass to accomplish without losing too much time. Additionally, there are a few jumps that cannot be completed because of an obstruction just ahead of them. Nevertheless, I had to devote several attempts to verify that. It's basically a level that's full of jumps and tricks that almost but don't quite work. I have a feeling that, despite my best effort, Detroit might benefit significantly from a route change. I also have three nitros for a while, negating my up+B+C jump and forcing me to do regular jumps. Blech. The good news is that Detroit looks great despite all that (I'm particularly fond of the ending) and I get to move on to Chicago with two nitros in stock. I'll probably use those two right at the start of Chicago and then use one to start Miami, but I'll test it in Matlab just to be sure. Lastly, I finished mapping the levels. After Washington, I got lazy and decided not to map things like gravel and potholes-- instead, I only map jumps and nitros. Knowing where obstacles are is mildly useful, but not especially so and for the most part it just cluttered up my maps. Chicago has about seven jumps and one nitro to look forward to. Miami has seven nitros, four of which are in the grass near the end. Planning Miami is either going to be really fun or a major pain. New York has eight nitros and about 26 jumps. I may be able to nitro non-stop through New York and I'll try to do a very thorough job on that level to go out with a bang. I hope no one minds, but I'm going to post my Lua code, Matlab code, and level maps in a new post. I can't imagine anyone wants them right now, but if someone makes a new TAS down the line, they may prove useful.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
I think you guys are long overdue for an update. I'll spare you the long introduction and just immediately post the youtube video of my progress so far: http://www.youtube.com/watch?v=07GoSvZIB-s And the GMV file, for those who prefer it: http://dehacked.2y.net/microstorage.php/info/729335123/speedrun2.gmv I think it's looking pretty good, but of course I want your opinions. Now on to the details of my progress... I was not able to reproduce the nitro glitch. It either requires a very particular speed and proximity that's virtually impossible to reproduce, or it depends on other factors that I haven't yet considered. If anyone else can make lightning strike twice (and then a third, fourth, and fifth time and so on), you can obliterate my speedrun. I updated my Lua script to add several features. Most notably, it looks into the future to see if a jump is possible from the current frame. This allows me to limit my inputs to only those frames where it makes a difference. Additionally, it reports my health and my skate integrity, neither of which should be of any use. This Lua script isn't used in the video I posted above, which instead uses the "lite" script, featuring only the speedometer. Speaking of the speedometer, the speed and distance variables are stored in 2 and 4 bytes respectively, not 1 and 2, as I initially thought. I kept just 1 and 2 in the Lua script because the extra digits are hardly significant and would just clutter up the screen, but I track all 2 and 4 bytes in the RAM Watch window for detailed portions of the run. I also found RAM addresses for the weapon slots as well as an address for the currently selected weapon. These help me switch weapons at the last possible moment before the end of a level. I wrote a very simple Matlab program that simulates levels based on when I use nitros. It's a very crude approximation, but it's still a lot better than guessing and I think that its results are at least decent (you can see it in action in Washington and I will use it for the rest of the run). Route planning is proving to be a pain since testing two different routes can mean going back and re-running half a level. For this reason, I quickly gave up on producing absolute perfection and instead am focusing on perfecting the input within my selected route (quite frankly, I think I'm doing a fine job at that!). Vancouver looks just a bit sloppy since I didn't quite know what I was doing back then. If I could go back, I would certainly pick up the nitro there more smoothly, but I think it's decent as-is. I'm confident the rest of the run is near perfect aside from the aforementioned route planning issues. I dread Detroit. Detroit has four nitros, but they're all in the first half of the level. Additionally, I'll start Detroit coming out of Toronto's speed bonus. I could have four or five discretionary nitros in the first half of the level (use 'em or lose 'em), followed by a significant drought where I need to hang onto one or two to save for Chicago. My next step will be to determine the fastest way though Toronto's speed bonus, then carefully plan Detroit with an eye on Chicago. After that, it'll still be tricky, but I'm confident Detroit will be the hardest level to run. Oh yeah, and my wheel situation is much better than I expected-- 160 units left as of the start of Toronto. I might be able to barely stretch it to the end, but it'll be damn close since there are five levels (four full levels) and two bonus levels left in the game. At the very least, I can put off purchasing new wheels until after Toronto and maybe even after Detroit or Miami. Anyway, I included a speedometer, as per maTO's request. I haven't had the opportunity to T-Bone any cars yet, but I trip over a bush in San Diego and suffer a bizarre hit in Vancouver's bonus. I'll keep working at it, mmbossman. Other than that, I'm leaving this open to discussion. If you don't think my run is entertaining, this is pretty much your last chance to say so since there isn't a whole lot of game left to play. If you do think my run is entertaining, please pipe in as well-- I could use the encouragement!
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
How do you pronounce the following acronyms? Is a tool assisted speedrun a "Tass" or a T-A-S? Is a frequently asked questions document a "Fack" or an F-A-Q? Is the original Nintendo Entertainment System called the "Ness" or N-E-S? (Likewise for the Super Nintendo-- the "Sness" or the S-N-E-S or possibly the Super N-E-S?) Is a graphical user interface a "Gooey" or a G-U-I? Is a uniform resource locator (okay, I admit I had to look it up...) an "Earl" or a U-R-L? For me, I can't help but call a frequently asked questions document a "fack" but all the rest I spell out. I'm not sure why. People saying "gooey" for some reason really annoys me. In fact, most of the time when people pronounce an acronym as a word when it isn't clearly supposed to be one is at least mildly irritating to me. For some reason, though, "fack" gets a free pass. So where do you draw the line? If you like to spell out acronyms, do you take it to extremes like Yahtzee and insist on saying S-T-A-L-K-E-R: Clear Sky? If you like to pronounce acronyms, do you pronounce them even when they don't have enough vowels? As you type your response, are you wondering if you should disable "hutmul" or "bubcode"? Please include other acronyms that interest or irritate you and, if possible, try to keep them TAS- or web-related.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Well, shucks. I'm done with Vancouver and feeling pretty good about my progress but... I ran into a useful glitch. I was basically goofing off trying to get the first nitro in Vancouver bonus and I somehow picked up two. Now I don't know what to do. The easy thing would be to just keep going and accept it as a fluke, but I know that's not how things are generally done 'round here. What I should do is analyze the glitch, see if I can reproduce it, and if so, exploit it in Vancouver, then use it to my advantage throughout the run. I suppose there's no harm in spending at least a little time trying to figure out what happened. However, there's this piece of me that kind of hopes I can't reproduce it. First of all, I don't want to redo half of Vancouver, and second, I really don't need extra nitros all that much after Vancouver's bonus level. They'd help a bit in San Diego, but after that, I should have too many nitros as-is. If I can get extra nitros consistently, it will absolutely break the rest of the game and I'll never have any reason to get up from a crouch (except at the beginning of a level). Anyone have any thoughts? Incidentally, the glitch occurred when my velocity hit 88 units...
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
All right, I think we're in business! I wasted a lot of time today playing Toronto, Detroit, and Miami. It turns out there are speed bonuses in Toronto and Miami, which is a shame, since the later levels are already loaded with nitros. The good news is that the second half of this run should be really fast. I also found out that the road rises and dips more than I thought. In a number of areas, you cannot land an up+B+C jump (you hit the ground before your legs straighten and you wipe out) and in some places, you can't even do a regular jump! I'd like to find where the road's contour is stored in the RAM, but I'm not sure what I'd do with that information since it should only make a difference when I'm using my legs or perhaps skitching. Since most of the run will be completed with nitros and jumping, it shouldn't make much difference. I checked the beginning of Seattle for a nitro and found nothing. Washington's first nitro can be reached quickly by using a nitro at the beginning. Lastly, I finished Vancouver's bonus level without using a nitro to determine how much time is lost. In summary, not using a nitro in Vancouver bonus costs 130 frames while using a nitro to start Washington saves at least 450 frames (probably many more). This means I should save all three nitros in the Vancouver bonus track and use them at the starts of Seattle and Washington. Once I reach Washington, I should be in the clear since it has four or five nitros. I think it's rather funny-- rationing nitros when they're scarce is very easy. You generally use them at the start of the level. Apportioning them when they're plentiful is going to be tricky. I honestly expect to have so many nitros that I won't know what to do with them and I may even skip some that are somewhat out of the way. It's better to start Denver with your legs than skitching. If you use a nitro when you reach top speed, it runs out right as you hit a ramp. From there, it's just a couple of jumps and you hit another ramp, then you can go to the warp. I discovered that top speed (under leg power) changes from level to level. I was concerned that it depends on your equipment (wheels and/or skates), but I checked this and there's no dependency. Speaking of which, remind me to buy new wheels halfway through this run. I'll almost certainly need them before the big Seattle to Washington to Los Angeles to Toronto run. It would be extremely embarrassing if I get all the way to Toronto and then wipe out halfway through the course because I forgot to replace my wheels. I can just see it now and it sends shivers up my spine... (Perhaps I should look for RAM addresses corresponding to equipment strength. Blech, more RAM searching.) Edit: Easiest RAM search ever! Wheel strength is stored at 00FF0000,2U (the first two bytes!). Skates, kneepads, elbow pads, wrist guards, and gloves are stored in 02, 04, 06, 08, and 0A respectively (also two bytes each). Player health is stored at 00FF077A,2U. Edit 2: Knowing the RAM address for the wheel strength, I re-ran my demo video. I discovered that in the first leg of the game (the first three levels), I consumed about 110 wheel health points out of 300 total in about 4500 distance units. The second leg (ending in Toronto) is about 4900 distance units. Furthermore, I also discovered that your wheels only deteriorate when they're in contact with the ground. This is good because I'll be jumping around a lot. The flip side, however, is that the second leg is loaded with nitros and since your wheels are in contact with the ground when you use a nitro, it chews them up. The question, ultimately, is whether my wheels will be in contact with the ground twice as much in the second leg as in the first. If not, then I can put off buying new wheels until after Toronto, probably saving a few seconds. If I can't get through the second leg, then I have two options. First, I could buy beginner wheels at the start. Beginner wheels are somewhat more durable and should safely last through Toronto. My other option is to buy wheels before Seattle. Seattle has standard class equipment, which is more durable. If standard equipment can get me through the rest of the game, then that's easily my best option. Testing shows that standard wheels are three times as durable as economy wheels, so I might just go with that. By far the most useful thing I discovered today is a frame counter (00FF01FB,1U). What good is a frame counter, you ask? Well, this game has a lower framerate than anime. There are about five or six "sub-frames" (frames incremented by the frame-advance button) for each "game frame" (in which the screen is re-rendered). This leads to a host of problems. The number of sub-frames for each game frame varies (in a typical level, it's usually five or six, but in bonus levels, it drops to three or four, probably because it doesn't have to render other skaters). This is important because pressing left or right changes your velocity by one unit per sub-frame (NOT game frame). The counter I discovered increments to some number (4 or 5), then resets to 0. When it changes from 0 to 1, it renders a new frame. What this means is that I can control my horizontal velocity extremely precisely, making the process tremendously easier. Now the TAS will consist of me choosing the right velocity, advancing until I'm ready to jump, then jumping directly to my next target. Much of the guesswork has been eliminated. It will also allow me to minimize my inputs; I won't have to hold up+B+C, I can just press it during the relevant frame. I think I'll be ready to run Vancouver either tonight or tomorrow. I'm pretty sure I have everything I need to know for a high-quality TAS.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
maTO wrote:
For YouTube you don't have to worry about file size. There was that 100 MB rule at some point but not anymore.
I'm not so much worried about Youtube as I am about video quality. From my first upload, it seems Youtube recompressed the video and it suffered a hit in quality. I'm hoping to avoid that. Edit: And uploading. Uploading large files is a bit of a pain.
maTO wrote:
Frame-advance mode? You mean unchecking 'Slow mode enabled' or hot-keying toggle slow mode button ?
Actually, I just figured it out. When you press backslash, it advances the emulation by one frame, but I couldn't get it to play again at normal speed after that. It looks like you just press escape and it's back to normal.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Thank you all for your prompt replies!
maTO wrote:
As for bonus rounds, it's your decision, but I would play as fast as possible even if it means you have to do bonus rounds.
I agree. Bonus levels are full of nitros anyway, so I think it'll be worth it. I'm still trying to decide if I should aim for fastest in-game time, which would mean taking a jump at the end of a level, or fastest realtime, which means going as slow as possible over the finish line.
maTO wrote:
It's a bit early but i would like your speed displayed on screen with LUA script :)
Done and done! I've never scripted in Lua before, but cannibalizing the included Sonic speedometer was a piece of cake.
adelikat wrote:
This movie doesn't seem like a genre that would normally be publishable. However, I did enjoy watching your WIPs. I say keep going with it.
I'm a little concerned about your reservations, but the bottom line is that if I have adelikat's blessings, I will move forward with this TAS.
mmbossman wrote:
My only request is that you T-Bone a crossing car right before the finish line a couple times, so that your battered body can go flying over the line in style.
You got it! I tested it on that car in San Diego and didn't notice any frames lost compared with jumping over it.
mmbossman wrote:
I haven't seen this game before, but it looks like they just recycled about 75% of the code for roadrash 2, which isn't really a bad thing, when I think about it.
I never had the fortune to play Road Rash 1 or 2, but looking at Youtube videos, it seems you are right. Skitchin' had the benefit of its predecessors, but I think the gameplay is more nuanced than Road Rash. I wish my TAS could demonstrate all the fun crap you can do.
arflech wrote:
When I was a kid I seriously considered doing this IRL once I became good enough at skating
These dolts obviously didn't read the warning screen: http://www.youtube.com/watch?v=ikOznkfTPzk The next order of business will be for me to map the start of Seattle. I'm hoping there's a nitro I can pick up since I don't want to go into Washington without one. If I can't get a nitro in Seattle, I'm going to have to save all three from the speed bonus round in Vancouver. After that, it's a little bit more testing: I want to see how recovering after a trick affects your speed, whether I should skitch the first car in Denver, and perhaps look at how the speed boost after slingshotting varies. Once that's out of the way, I think I can begin. In the meantime, I have two questions about Gens that have been bugging me: •What codec should I use for video recording? The articles suggested ffdshow, but that just gave me an error. For my demo video, I think I ended up going with XVid, but the video was almost 100 MB! Is there another codec I can use, or should I just try to make ffdshow work? •Can you turn off frame-advance mode? I looked, but I didn't find anything.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Notes on My Demo Video My demo video has some errors and quirks that should be discussed or explained. The number I list is the time on the Youtube video. 0:12 - I enter the B-A-Down-A-Start-Start (BADASS) code. This skips the warning screen but has no effect on the game. 0:24 - I use the default name, Blader 1. I suppose I could add my own stamp to it, but you know who I am anyway. 0:33 - I stick out my arm to skitch early. The idea is to get the speed boost as early as possible. I figure it's worth it to go faster even if you lag behind initially since going fast means hitting ramps more often, which means going even faster. In the final version, I won't stick my arm out until I'm ready to skitch and I'll make sure I go no faster than I need to. 0:44 - The first of many up+B+C jumps. 0:46 - You'll see a lot of backflips in this video. Backflips are my favorite trick when playing the game normally because they pay well and are easy to pull off. I plan on mixing it up as much as I can in the final run. 0:59 - I think I landed in the grass. Oops! I'll be sure to clean up stuff like that. Unfortunately, landing on the pavement after doing a trick off a speed limit sign is extremely difficult because they're on the right side of the road and you need to conjure up some momentum to the left. 1:23 - I do this spinning trick (I can't remember the trick names) because I wanted to move left, but it doesn't do any good (your horizontal velocity does not change after you leave the ground). As a consequence, I lose a few frames standing back up. I haven't yet checked, but I think my speed drops in that time. If that's the case, I'll stick to flips and A, B, and C tricks. 1:27 - The only nitro in this level is way off in the grass, so it's a pain to pick up. You can see in the following seconds that it's still well worth it. 1:34 - From this point on, my speed is always above 90 and usually above 100. I guess it could be even faster if I didn't spin. 1:58 - I skip this ramp and do a normal jump because any time spent in the air after crossing the finish line is essentially wasted. Also, skidding to a stop takes longer if you go faster, so the level ends faster if you're going slower. If I want to minimize in-game time, I should take that ramp. Any suggestions on whether to take the ramp or not are more than welcome. 2:15 - Because I beat Vancouver in under 2:35, I play the speed bonus level. This may cost some time, but the advantage is that I pick up two nitros. I could waste time in Vancouver and skip the bonus level, but even if it's faster (which I don't believe), it would be a lot less entertaining. 2:26 - In speed bonus levels, whenever you skitch a car in one lane, cars in the other lane go much faster. That's why I switch back and forth a few times here. The slingshotting here alone brings me up to a speed of over 80. 2:38 - This nitro brings me up to the max speed of 125. I suppose I could beat the bonus level by slingshotting some more and save all three nitros, but I think this one is well-spent. I'll be sure to look ahead in my route planning in case that nitro could be better used later on. 2:47 - I switch weapons because you can't do the up+B+C jump if you're holding a nitro canister. In the final version, I'll be more prescient about changing weapons. 3:27 - I figured it pays to skitch this car and get my speed as high as possible before using the nitro. Now I'm not so sure. I'll have to play this level again and test how long it takes to reach the warp if I get up to top speed with my legs. Also, if skitching is faster, I should skitch a narrow car so I don't end up in the grass after slingshotting (I don't think it affected my speed, but I don't even want to worry about it). 3:41 - Ideally, I'd hit that warp on the way down so I don't slow down in the grass, but this will do. If you go off the speed limit sign, you'll sail right over the warp. Also, I don't skip the warp screen as fast as I should because I forgot you could before I saved. 3:44 - Warping really helps by starting you off at full speed (37 units) and a bit ahead of where you would normally. I could slow down and skitch a car, but I figure it makes more sense to blast ahead with the nitro. 4:05 - I miss this speed limit sign, which is a shame. To hit it, I'd have to get over the the right side and get a fair bit of momentum to the left to account for that nasty turn. I'll try harder to hit it in my real run, but I don't think it's possible without losing too much speed. If I'm not mistaken, it's the only jump I miss in this level. 4:28 - Nothing much to see here, but I'd like to direct your attention to the rear-view mirror. That's rubber band AI in full effect! By my calculation, I'm going about 230 miles per hour but I just can't shake that guy! All right, that just about covers everything! I'd be happy to address any additional critiques you have concerning my demo, since I can use that to improve the real deal.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Warps and Long-Term Route Planning Testing the game, I found the following warps: Vancouver: None Denver: San Diego San Diego: Vancouver Seattle: Washington San Francisco: Seattle Los Angeles: Toronto Washington: Los Angeles Toronto: None Detroit: Washington Chicago: Miami Miami: Detroit New York: None As far as I'm aware, there is no more than one warp per level, although I'm a little nervous about that. If I overlook a warp that bypasses several levels, I could end up wasting a lot of time on a run that should be much shorter. I'm also a little shaky about Toronto. It's kind of weird seeing nine other levels that all have warps while Toronto doesn't have one. I checked it pretty thoroughly, though. I'm also pretty certain about Vancouver and New York. If anyone else is familiar with this game and knows a warp or two that I've omitted, please let me know. This means the fastest route is... Vancouver -> Denver -(warp)> San Diego -> Seattle -(warp)> Washington -(warp)> Los Angeles -(warp)> Toronto -> Detroit -> Chicago -(warp)> Miami -> New York Take note of that warp from Washington back to Los Angeles, then from Los Angeles to Toronto. Not only is it shorter in distance than beating Washington, but it also cuts out the camera zoom at the end of the level and wading through the stat screen and menus. I even did some basic testing and found the warp back to Los Angeles to be about 800 frames faster. I hope that's consistent with the results in the finished product. I will have to complete five levels (Vancouver, San Diego, Toronto, Detroit, Miami, and New York) and warp five times. Even though I will use warps, I will still play 11 out of 12 levels! Handy Addresses I did some RAM searching and came up with some useful addresses. In addition to each address, I also say how many bytes it is and whether it is signed or unsigned. For example, I list the player distance as 00FF0736,2U, signifying that it's at address 00FF0736 and is two bytes, unsigned. 00FF0736,2U - Player distance (how far through the level you are) 00FF0768,1U - Speed (that's forward speed) 00FF0748,2S - Horizontal position 00FF1541,1S - Horizontal velocity 00FF074A,1U - Altitude 00FF0F0C,2U - Vehicle 1 position 00FF0F8E,2U - Vehicle 2 position 00FF1010,2U - Vehicle 3 position 00FF1092,2U - Vehicle 4 position 00FF1114,2U - Vehicle 5 position 00FF1196,2U - Vehicle 6 position 00FF0F24,1U - Vehicle 1 speed 00FF0FA6,1U - Vehicle 2 speed 00FF1028,1U - Vehicle 3 speed 00FF10AA,1U - Vehicle 4 speed 00FF112C,1U - Vehicle 5 speed 00FF11AE,1U - Vehicle 6 speed 00FF0F45,1U - Vehicle 1 model 00FF0FC7,1U - Vehicle 2 model 00FF1049,1U - Vehicle 3 model 00FF10CB,1U - Vehicle 4 model 00FF114D,1U - Vehicle 5 model 00FF11CF,1U - Vehicle 6 model I also have addresses for: an alternate player distance, the camera distance, two alternate horizontal positions, an alternate altitude, something that appears to be your airtime, alternate vehicle positions, and a terrain indicator. The maximum speed is 125 units and the maximum horizontal velocity is 16 units (or -16 units to the left). Only six vehicles can be in play at any given time. Vehicle positions and speeds are in the same units as player position and speed. The vehicle model numbers seem to have some redundancies. For example, both compacts and jeeps in Vancouver are given by 68. Fortunately, this isn't very important. A vehicle will spawn about 15 units behind the player and drive until it gets about 30 units ahead, then it stalls (in case the player catches up), then respawns as a random model. Vehicles cannot spawn in front of a player, so if you're going faster than about 50 speed units, nothing will get in your way. The drawback to this is that I don't get to use those addresses as often as I expected! Level Maps I wanted to make sure I was thinking one or two obstacles in advance, so I used the player position addresses to make maps of the levels. I've made complete maps of Vancouver, Denver (even though I warp out!), and San Diego. As an example, I'll share my Vancouver map. The first number is the distance along the course and the second number is the horizontal position. Vancouver Oil - 214/139 Ramp - 247/210 CB Ramp - 296/216 Pipe -368/192 SL Ramp - 410/304 Gravel - 428/70 Crowbar - 510/212 Ramp - 558/210 Crowbar - 644/219 CB Ramp - 687/227 Bench - 729/363 SL Ramp - 761/285 Bench - 804/463 Nitro - 835/-632 Gravel - 841/91 SL Ramp - 865/321 Pipe - 951/183 Trash cans - 961/245 Bench - 964/410 Trash cans - 977/122 Trash cans - 995/260 Ramp - 1074/230 Ramp - 1150/222 Oil - 1165/142 Crowbar - 1270/191 Ramp - 1322/224 Gravel - 1344/-113 Crowbar - 1495/199 Ramp - 1525/209 Tips for Playing Nitro boosts are key. Each boost increases your speed by about 60 units. Ramps also boost your speed. A typical jump will increase your speed by about eight units. In my little demo video, I neglected to consider how you land. After certain tricks (left, right, or diagonal buttons), the character takes a few frames standing back up (although it seems you can alter your horizontal velocity during these frames). It may even be faster to do no trick at all (but I hope not, since doing tricks will be one of the more entertaining aspects of my run). Your speed does not decrease while you are in the air but it decreases by about 4 units per second while on pavement. To maintain speed, press (or hold) up+B+C. This is a semi-secret jump move that is much higher and lasts longer than the standard jump. When you land, you lose just one or two speed units provided you go directly into another jump. Occasionally, a standard jump is preferable (so that you don't jump past a ramp or item). Top speed when holding B is 37 units. You can accelerate past this by ducking on a downward-sloping road, although I haven't looked into this much. When you skitch a car, you immediately take that car's speed. You can slingshot off a car by holding B while moving past the edge of its bumper. This boosts your speed by about eight units, although it seems to vary (perhaps depending on the road's contour). I would like to find a RAM address that says whether the road is sloping up or down. I also wish I knew how the road twists and the mechanics of how far you're flung as you turn a corner, but I'm not hopeful I'll find anything. There are tons more details on how to play the game (such as weapon strength and how obstacles affect you) that are totally irrelevant to this run.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Well, after giving up during the planning stages of my Cool Spot run (route planning is not fun!), I'm back to attempt a more linear game: Skitchin'. I was going to surprise everyone with a finished run, but I decided that I'm better off doing this right and getting it accepted than finding out after nominating it that I made some boneheaded mistake. First things first, here's a little demo video of the first three levels: http://www.youtube.com/watch?v=Bcga3UJn5xk As you can see, I plan on using warps in this run, which should cut down on time significantly. That video is not in any way the finished product-- I threw it together in about two hours. What you should get from the video is roughly how I intend to play the game. Please tell me if you think the run is not entertaining enough to be published; I don't want to pour hours and hours of effort into something that will be shot down. If you're not familiar with the game, here's a typical playthrough by a skilled player: http://www.youtube.com/watch?v=8uqeXUHH_hc Basically, the final video should be about 20 minutes of jumping around like that. Personally, I think what I have so far is fairly entertaining, but I can see how it might get repetitive after a while, especially in such a linear game. There are a few other questions I need answered: •The filename for my ROM is "Skitchin (UEJ) [!].smd". Is this the best version? The articles indicated that it is, but I want to be 100% sure. •At the start of the video, during the "WARNING" screen, I enter B-A-down-A-Start-Start. This is technically a cheat code, but it only allows the player to input special passwords and does not affect gameplay on its own. The only reason I use it is that it makes the warning screen go away more quickly (normally it stays up for about five seconds). Is this okay? I know, for example, there are runs of Metroid that use a suitless code. •Bonus levels are a pain. For example, Vancouver has a speed bonus level that I can avoid if I complete the course in over 2:35 or so. I don't want to do that for many reasons. In fact, it seems to be faster to finish Vancouver as quickly as possible and to play the bonus level as well, as opposed to racing more slowly to avoid it. Even if it is faster to skip the bonus level, I can pick up two nitro canisters there, so I'm pretty sure it pays to play it. Anyway, that's all beside the point. In my final run, I may need to play a bonus level when it would be faster to skip it by racing more slowly. Should I play it this way? I figure it's analogous to Sonic runs where they go as fast as possible despite the fact that it takes longer for the score to tally at the end of the level. Would I need to declare that my run has speed/entertainment tradeoffs? I don't know if this is bad etiquette, but I'm going to create separate posts documenting my progress so far. Any feedback or answers would be greatly appreciated! Thanks in advance!
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
UPDATE
Guybrush wrote:
You were directed to the older topic and that means you should continue your discussion there.
Do I really have to use that topic? It's pretty old and the author has basically acknowledged he abandoned it. Plus, this topic is already available and a lot of people seem to be using it. (Do you want two front page "Cool Spot" topics?) If you insist that I bump that one and continue from there, I won't argue with you, but it looks like it would be an unpopular decision.
JXQ wrote:
Good luck with this. Here is a WIP I made long ago of the first level and bonus level on Hard (though I don't get all 100 spots in the first level, just 95, enough to go to the bonus level).
Great! I'll be sure to use this as a benchmark for my own run. Obviously there are going to be a few differences (I don't plan on death abuse if I can help it).
A Runnelid wrote:
It's been a long time since I've played the game, and this post is slightly off-topic, but isn't 75 spots enough to access the bonus levels?
Actually, it's 85 to get a bonus level, but you bring up a good point. I was wrong when I said you need 99 to beat a level on hard. You "only" need 90. I still would rather do a 100% run because I don't think it will take that much more time and I have a feeling that deciding which ten cool points to leave behind will take more time than finding the optimum route with all of them. To address Deign's comment and give an overall status update, I've scraped together quite a few resources in a day. This FAQ has more information in it than I thought at first glance. Specifically it lists every cool point in each level, which means I don't have to stagger blindly for a few days while I try to map things. Speaking of, even though I have that FAQ, I'd still like to make a layer translucent, just so I have an explicit map of where all the cool points are. I found a workaround. Pressing and releasing 1 (the foreground layer) is too tedious, but I can record a video, then hold 1. This causes it to flicker, allowing me to see where all the cool points are hiding. For hex editing, I've come up with some cheats for gathering information. For archival purposes, here they are in PAR form: Infinite time-- 7E00CE3C and 7E00CF00 (freezes clock at 1:00) Infinite lives-- 7E11CE03 and 7E00D403 (first code is just cosmetic, second is effective) Infinite health-- 7E00D007 I also found an "auto-walk" cheat. Not very useful, but mildly neat. I also found the addresses for the x and y coordinates, measured from the top-left corner. The x axis is stored in three bytes at 7E083B and the y axis is stored at 7E0843. Actually, there are about five different coordinates listed (a hitbox?) but I chose the ones that were roughly centered. To give a sense of scale, the first level is about 1,000,000 units (pixels?) by 200,000 units. From this I was able to determine that Spot can jump about 37,000 units high. Not sure if I'll explicitly use that info later on, but it could prove useful. As for my mapmaking skills, that's going to be the most time consuming part of this run. I shied away from making a digital map with screenshots because I thought it would take too much time and effort. Instead, I tried to make a hand-drawn map of the first level by going to key points in the terrain, finding their coordinates, then sketching in the rest. It took about two hours just to get the sand and the balloons in the first level. What I have so far looks very sexy, but I plan on adding enemies and spots, which would take at least another hour or two. One of the things that kind of sucks about this game is that it often requires "leaps of faith" where you're jumping to something offscreen. This makes compiling a map rather difficult. (Actually, what am I talking about? I can use the coordinates I have to help place things.) I'm going to try using screenshots for my map of level 2 to compare how quickly I can produce it. I think both the most challenging and fun task of this speedrun will be working on the bonus stages, which have lots of routes to choose from. I plan on uploading maps of them so we can work on them collectively. Bonus stages automatically end if you collect all the points within the time limit, so there's a significant time bonus if I can finish them fast enough. Aside from mapping and route planning, there are a few simple questions I have about the mechanics of the game that I'll want to check first: What angle does Spot fall at? How is firing handled? You can fire shots in more than eight directions which is actually more of a pain than a benefit for now. My guess is that it has to do with how long you hold down one direction versus another. Much testing is needed. What's the best way to climb ropes? You can jump while climbing, gaining a lot of speed. What is the best way to defeat/dodge each enemy? Dodging enemies is a really bad idea in this game because Spot's not all that nimble. If you don't hold left or right while jumping, Spot instantly loses his lateral momentum when he lands. Shooting enemies is a much better strategy because Spot can walk and fire simultaneously. Playing "Off the Wall" on hard is giving me the chills just thinking about it. That's it for now! Thanks for all the attention!
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Soulrivers wrote:
Bobo the King wrote:
•How should I route plan?
http://tasvideos.org/RoutePlanning.html Route planning is usually much easier if you know the game well. Do you? If not, you'll probably need to play through the game once without frame advance or slowdowns to familiarize yourself with it.
To be honest, no, I don't know the game nearly as well as I should. I'm only considering this attempt because I played the game a lot about ten years ago and it strikes me as nearly perfect for a TAS. For one reason or another, I'll be playing through the game a few times before attempting the TAS. However, it would probably take weeks and lots of note-taking to find the same route that would take me less than an hour to find if I had a map of the level. So the question remains: how to I get/make maps? I'll be fiddling around with the cheat finder and see if I can get a walk-through-walls cheat going. I don't think I could stand to make a map while dealing with the constraints of the level.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Thanks for the lightning fast replies!
erokky (and Kyrsimys) wrote:
http://tasvideos.org/forum/viewtopic.php?t=2674 http://tasvideos.org/FAQ.html
Damn, I did a forum search and a Google search but nothing turned up. Probably because that thread is so old. Thankfully, it looks like this game is still open. Already read the FAQs too. In that first thread, he asks what kind of run he should do. Just to make it explicit in advance, I'd do a hardest difficulty, 100% run ("hard" mode requires you to collect 99 spots anyway, so it wouldn't be much work to find one more in most levels).
Dromiceius (and Deign) wrote:
As for 'advice', I think you should just use snes9x 1.43 for production, and version 1.51 for finding more cheats- cheats like your lateral and vertical velocities. Knowing how fast your character is going at any given moment will make your life easier, especially TASing this particular game, methinks.
Thanks! Already downloaded. Questions I still need answered: •Can I make a layer translucent? (Probably not) •How should I route plan?
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Hey guys! I'm completely new to TASing, but I figure Cool Spot is a nice game to start on. It's modestly popular, pretty straightforward, but still requires a fair amount of route planning and optimizing. I also noticed a couple of requests for it. That said, since I'm new, I need a bit of help. Here's a few questions: •Is ZSNESw allowed? I think it's also known as ZSNES WIP or something. I presume it is, but it would be very embarrassing if I completed my run and found out it's illegal because I used the wrong emulator. •Is there a way to make a graphics layer translucent (i.e., semitransparent)? Spots are hidden behind all sorts of objects, but it just so happens that the layer they're hidden behind is also the layer for important things like the ground. I'd like to be able to see where I'm going while searching for spots (at least in my preliminary runs). Is there perhaps a way to force one layer to be displayed on top of the other instead of the default ordering? •Is there an easy or efficient way to make level maps? I'm thinking about putting together a whole bunch of screenshots, but the prospect of that is more than daunting. What do most people do to make level maps? I hope to have a sample level up in a day or two. I've already come up with an invincibility cheat and an infinite time cheat to familiarize myself with each of the levels and track down every last spot. Any advice would be great. Thanks in advance!