Posts for TheRandomPie_IV

Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
The lag can be a bit weird unfortunately and I never really got to the bottom of it. I've tried a few things but I couldn't do anything about it either. I can't think of anything else that could improve BLW1 at the moment, time to focus more on the other levels I think.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Nice! I was a bit busy recently so I didn't see your question before, but it looks like Truncated had it covered. I made some attempts at BLW1 myself and ended up with this: http://tasvideos.org/userfiles/info/33462102174540930 It completes BLW1 in the same number of frames as your movie, but the improvements came at different places. I gained a little bit at the first dragon, but then fall behind at the first slopes, and then gain ground again entering the rubber block pit, but didn't improve the end section like you did. It looks like it should be possible to be 2/3 frames faster in BLW1 if we combine the best sections of both attempts.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Ok, so I got around to properly testing your method of handling the blocks at the start of BLW2 and it turns out that it does seem to be slightly faster (just under two full frames) than the method I used. Here's my best attempt so far. http://tasvideos.org/userfiles/info/33172480726180494 Nice find!
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Nice, I'll try to check those out this weekend. I'm fine with co-authoring and taking inputs from my old runs, and I'll try to help out and go over things as much as I can. There's no reason for the X holding, I think I have X bound to the same key as one I'm using for something else and never bothered to change it because it has no effect.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Yes, Gens was the emulator used for the runs I made, but that was because it was the only option available when I made those runs. I would recommend sticking with Bizhawk as it is a more accurate emulator and looks like it has more features as well. Many games on many systems have longer transitions when we move to using newer more accurate emulators from older ones, so don't worry about it. I've recorded a short section of BLW1 on BizHawk, so you can see more easily if you are really loosing time against me or not, though I didn't thoroughly compare it to my old movie and I am a bit rusty, so it's possible I dropped a frame somewhere. A couple of places are a bit ugly too, as I didn't take time to smooth out the movement, but that shouldn't effect anything from a comparison point of view. I've uploaded it along with a very simple ram watch file that you can load in BizHawks ram watch tool, though you may have already been using that. http://tasvideos.org/userfiles/user/TheRandomPie_IV The ram watch contains only the horizontal position and horizontal speed, split into pixel and sub-pixel components, as I couldn't find my old file from when I made my runs, but those are the main ones you need to be able to properly see what is going on and properly compare two attempts at a section. If you've already improved your first attempt a bit this might not be that useful, but if there's something else you want to know fire away.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
I'll take a look at it, but I don't have Bizhawk set up at the moment, so it might be a few days. For TAS pointers I'll try and post something helpful once I've had a look over what you've got. For now I don't believe many of the subpixel tricks will be useful in realtime play (though I'm pretty bad at realtime play, so maybe don't take my word on this). The only exception to that comes to mind offhand is that when jumping or flying with cyclone, once you've hit the normal full speed horizontally you will go slightly faster if you don't hold the run button (or do hold it if using auto run..).
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
From what I remember the dragons spawn when you get within a certain distance of the point they spawn at, so it may be that one of the points where you temporarily gain a pixel or two are causing it to spawn one frame earlier and somehow cause some lag. I noticed that sometimes the game would seem to not fully lag but would appear to do some of the subpixel updates a frame late, leaving you a pixel off where you 'should' be temporarily until it catches up a frame later, but I never really looked at the details of what was going on. I am pretty confident that it is not RNG though, in making my runs I hexedited in sections and changes quite a few times and never found any changes to the rubber blocks. The only things that seemed to be effected by the RNG were certain enemies (mostly the aliens and tornadoes, but there may be few others as well). Good luck at finding the problem, I'm interested to see what you can come up with. Just ask if you have any more questions, though I can't promise that I'll remember everything correctly.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Yeah, I guess I'll also dump what our team had. Fair warning: The vast majority of it sucks and isn't worth watching. http://dehacked.2y.net/microstorage.php/info/1183498047/Rockin%27%20Kats%20%28U%29%20%5B%21%5D-%20Dream%20Team%20Contest.fm2
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Very nice improvement! I definitely enjoyed watching.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Very nice! I'm really surprised at how much better that looks than before. Definitely looking forward to this improvement :)
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Nice going, you can definitely see the improvements between this and your last version! I can't remember for certain but I vaguely recall that how long it takes for you to fall off the screen when dying effect how long it takes you to respawn, and that sometimes getting thrown off the side instead of the bottom could make it faster and could hopefully give better timing with the clouds as well. Many games have platforms like the clouds on some sort of fixed timer, I don't know if that's the case here, but if so there is often nothing you can do to change it and so the waiting is unavoidable.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
It's been a while, but I finally got some time to contribute to this again. I played on from Diman's last movie and took my first shot at the boss. http://dehacked.2y.net/microstorage.php/info/800649368/Highness_Diman_RandomPie_IV-Going_Ape_Shit.gmv I think it can be improved a bit though, I'm pretty sure it's possible to get at least one more shot one the left side before crossing to the right, so I'll probably have another go at this sometime soon.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
I'm up for another one of these.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
ShadowJacky wrote:
I have two questions after watching this completed entry for this. 1: how do you get the maximum drill whenever you want?
The easiest way to get the absolute best possible drills is to watch the memory. 00FF012D - 1 byte signed (X speed in pixels -ve is left) 00FF012D - 1 byte unsgned (X speed in 256ths of a pixel always to the right and added to the above to get total speed) when drilling the first value is set to +/- 3 depending on direction, but the second is fixed at whaterver it was when you start the drill. So going right you can have between 3 + 0/256 px/frame and 3 + 255/256 (ish you can quite get it that high..). Similarly you get (-3) + 0/256 to (-3) + 255/256 going left, so here 3 px/frame is the fastest possible while going to the right it is the slowest possible. which is why right drills are faster than left ones.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Nice job, especially for a first run. Definitely a comfortable yes vote for me.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Sure, feel free to use my WIP for the run. I'll hold off on commenting on your current version since it looks like you're in the process of redoing it, but I wouldn't worry too much about not being able to match the stage 1 time. I suspect most of the difference there comes from subpixel optimisations (especially the extra drill distance) that you may not want to worry about for your first run (I certainly didn't for mine). Good luck with the run, it'll be nice to see someone make actual progress with this game again :)
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Ok, so I finally got around to making a bit of an attempt at 1-3 myself, though I didn't get very far http://dehacked.2y.net/microstorage.php/info/1577860972/Highness_Diman_RandomPie_IV-Going_Ape_Shit.gmv. It looks like I did the opening part three frames faster than Diman's version but then I did the part around frame 5400 with the two crushing things worse than him so it came out slower overall. Hopefully it will be possible to fix that part to be as fast as Diman's while still keeping the lead from the start. Also I won't have much of an internet connection for the next week or so, though I doubt either of you will notice the difference ;)
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Sorry for basically disappearing for the last two weeks, but I made good use of the little free time I had. I finally made some headway on a hitbox script! There still seem to be a few kinks to work out, but it should be ok for now.
Language: lua

address = { X_Speed = 0xFF1CF4, X_Subspeed = 0xFF1CF6, X_Position = 0xFF1CEC, X_Subposition = 0xFF1CEE, Y_Speed = 0xFF1CF8, Y_Subspeed = 0xFF1CFA, Y_Position = 0xFF1CF0, Y_Subposition = 0xFF1CF2, X_Hitbox = 0xFF1CE6, Y_Hitbox = 0xFF1CEA, X_Camera = 0xFF1BC4, Y_Camera = 0xFF1BC8, Boss_HP = 0xFF3601 } enemy_data = { Harmful_Unsure = 0xFF21B4, Health = 0xFF21C0, X_Hitbox = 0xFF21C6, Y_Hitbox = 0xFF21CA, X_Position = 0xFF21CC, X_Subposition = 0xFF21CE, Y_Position = 0xFF21D0, Y_Subposition = 0xFF21D2, X_Speed = 0xFF21D4, X_Subspeed = 0xFF21D6, Y_Speed = 0xFF21D8, Y_Subspeed = 0xFF21DA, Slots = 32, Size = 0x60 } enemy_value = { Harmful_Unsure = 0, Health = 0, X_Hitbox = 0, Y_Hitbox = 0, X_Position = 0, X_Subposition = 0, Y_Position = 0, Y_Subposition = 0, X_Speed = 0, X_Subspeed = 0, Y_Speed = 0, Y_Subspeed = 0 } value = { X_Speed = 0, X_Subspeed = 0, X_Position = 0, X_Subposition = 0, Y_Speed = 0, Y_Subspeed = 0, Y_Position = 0, Y_Subposition = 0, X_Hitbox = 0, Y_Hitbox = 0, Boss_HP = 0, X_Camera = 0, Y_Camera = 0, } lagCount = 0 lagCountY = 0 lastX = 0 lastXS = 0 lastY = 0 lastYS = 0 function LagCounter() XCSpeed = value.X_Speed * 256 + value.X_Subspeed YCSpeed = value.Y_Speed * 256 + value.Y_Subspeed XCPos = value.X_Position * 256 + value.X_Subposition YCPos = value.Y_Position * 256 + value.Y_Subposition if (lastX == XCPos and lastXS ~= 0) then lagCount = lagCount + 1 end if (lastY == YCPos and lastYS ~= 0) then lagCountY = lagCountY + 1 end lastX = XCPos lastY = YCPos lastXS = XCSpeed lastYS = YCSpeed if gens.framecount() == 1 then lagCount = 0 lagCountY = 0 end end function GetInfo() value.X_Speed = memory.readwordsigned(address.X_Speed) value.X_Subspeed = memory.readbyte(address.X_Subspeed) value.X_Position = memory.readwordsigned(address.X_Position) value.X_Subposition = memory.readbyte(address.X_Subposition) value.Y_Speed = memory.readwordsigned(address.Y_Speed) value.Y_Subspeed = memory.readbyte(address.Y_Subspeed) value.Y_Position = memory.readwordsigned(address.Y_Position) value.Y_Subposition = memory.readbyte(address.Y_Subposition) value.X_Hitbox = memory.readwordsigned(address.X_Hitbox) value.Y_Hitbox = memory.readwordsigned(address.Y_Hitbox) value.X_Camera = memory.readwordsigned(address.X_Camera) value.Y_Camera = memory.readwordsigned(address.Y_Camera) end function GetEnemyInfo( Slot ) enemy_value.Harmful_Unsure = memory.readwordsigned(enemy_data.Harmful_Unsure + enemy_data.Size * Slot) enemy_value.Health = memory.readwordsigned(enemy_data.Health + enemy_data.Size * Slot) enemy_value.X_Hitbox = memory.readwordsigned(enemy_data.X_Hitbox + enemy_data.Size * Slot) enemy_value.Y_Hitbox = memory.readwordsigned(enemy_data.Y_Hitbox + enemy_data.Size * Slot) enemy_value.X_Position = memory.readwordsigned(enemy_data.X_Position + enemy_data.Size * Slot) enemy_value.X_Subposition = memory.readword(enemy_data.X_Subposition + enemy_data.Size * Slot) enemy_value.Y_Position = memory.readwordsigned(enemy_data.Y_Position + enemy_data.Size * Slot) enemy_value.Y_Subposition = memory.readword(enemy_data.Y_Subposition + enemy_data.Size * Slot) enemy_value.X_Speed = memory.readwordsigned(enemy_data.X_Speed + enemy_data.Size * Slot) enemy_value.X_Subspeed = memory.readword(enemy_data.X_Subspeed + enemy_data.Size * Slot) enemy_value.Y_Speed = memory.readwordsigned(enemy_data.Y_Speed + enemy_data.Size * Slot) enemy_value.Y_Subspeed = memory.readword(enemy_data.Y_Subspeed + enemy_data.Size * Slot) end function Draw() GetInfo() if value.X_Subspeed == 0 then value.X_Subspeed = "" elseif value.X_Subspeed == 128 then value.X_Subspeed = ".5" else value.X_Subspeed = ": " .. value.X_Subspeed end if value.X_Subposition == 0 then value.X_Subposition = "" elseif value.X_Subposition == 128 then value.X_Subposition = ".5" else value.X_Subposition = ": " .. value.X_Subposition end gui.box(10, 195, 150, 220, 'black', 'black') gui.text( 90, 200,"pos", 'cyan') gui.text( 130, 200,"spd", 'yellow') gui.text( 70, 209,"X") gui.text( 87, 209, value.X_Position .. value.X_Subposition, 'cyan') gui.text( 128, 209, value.X_Speed .. value.X_Subspeed, 'yellow') gui.text( 70, 220,"Y") gui.text( 87, 220, value.Y_Position .. ": " .. value.Y_Subposition, 'cyan') gui.text( 128, 220, value.Y_Speed .. ": " .. value.Y_Subspeed, 'yellow') gui.text(8,32,lagCount,"#00FF00") gui.text(8,40,lagCountY,"#00FF00") gui.box( (value.X_Position - value.X_Camera) - value.X_Hitbox, (value.Y_Position - value.Y_Camera) - value.Y_Hitbox, (value.X_Position - value.X_Camera) + value.X_Hitbox, (value.Y_Position - value.Y_Camera) + value.Y_Hitbox, 'clear', 'green' ) for i=0, enemy_data.Slots do GetEnemyInfo( i ) if enemy_value.X_Hitbox > 0 and enemy_value.Y_Hitbox > 0 and enemy_value.Health > -1 then gui.box( (enemy_value.X_Position - value.X_Camera) - enemy_value.X_Hitbox, (enemy_value.Y_Position - value.Y_Camera) - enemy_value.Y_Hitbox, (enemy_value.X_Position - value.X_Camera) + enemy_value.X_Hitbox, (enemy_value.Y_Position - value.Y_Camera) + enemy_value.Y_Hitbox, 'clear', 'red' ) gui.text(enemy_value.X_Position - value.X_Camera, enemy_value.Y_Position - value.Y_Camera, enemy_value.Health, 'red', 'black') end end end savestate.registersave(function(slotnumber) return lagCount, lastX, lastY, lagCountY, lastXS, lastYS end) savestate.registerload(function(slotnumber) local a, b, c, d, e, f = savestate.loadscriptdata(slotnumber) if a and b and c then lagCount = a lastX = b lastY = c end if d then lagCountY = d end if e and f then lastXS = e lastYS = f else lastXS = 0 lastYS = 0 end end) gui.register ( function() Draw() end) gens.registerafter(function() GetInfo() LagCounter() end)
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
I managed to get through that section myself now that I had Diman's run to show me how it's done :) My attempt came up 4 frames faster, though I'm not entierly sure where all of it came from. I certainly don't think I can do any better at any rate. http://dehacked.2y.net/microstorage.php/info/947369390/Highness_Diman_RandomPie_IV-Going_Ape_Shit.gmv
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Nice! I'll be watching this right away. EDIT: Looks great! Now that I can see how you did it I think I'll have another go myself.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Wow! Very nice indeed, that's far better than I thought would be possible for that section. There's no need to worry about the upward shots by the way, we don't loose any frames by doing it.
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
My turn :) I managed to beat the first area 4 frames ahead of Diman's version, but then I made a start on the second area and ran into some trouble. For some reason I just don't seem able to jump over this spike like your old wip did. Mind taking a look? Hopefully I'm just missing something obvious. http://dehacked.2y.net/microstorage.php/info/1764633373/Highness_Diman_RandomPie_IV-Going_Ape_Shit.gmv
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
I was actually looking at doing this as my next project, I didn't realise you guys were still interested. I've been the following lua script for displaying information, feel free to make use of it. I'd only actually tased the first area of stage one and the only improvement I found over your old wip was a couple of frames in the menu. If you're interested in working together I'd like to help, but I don't mind leaving this one to you if you'd rather not.
Language: lua

address = { X_Speed = 0xFF1CF4, X_Subspeed = 0xFF1CF6, X_Position = 0xFF1CEC, X_Subposition = 0xFF1CEE, Y_Speed = 0xFF1CF8, Y_Subspeed = 0xFF1CFA, Y_Position = 0xFF1CF0, Y_Subposition = 0xFF1CF2, Boss_HP = 0xFF3601 } value = { X_Speed = 0, X_Subspeed = 0, X_Position = 0, X_Subposition = 0, Y_Speed = 0, Y_Subspeed = 0, Y_Position = 0, Y_Subposition = 0, Boss_HP = 0 } lagCount = 0 lagCountY = 0 lastX = 0 lastXS = 0 lastY = 0 lastYS = 0 function LagCounter() XCSpeed = value.X_Speed * 256 + value.X_Subspeed YCSpeed = value.Y_Speed * 256 + value.Y_Subspeed XCPos = value.X_Position * 256 + value.X_Subposition YCPos = value.Y_Position * 256 + value.Y_Subposition if (lastX == XCPos and lastXS ~= 0) then lagCount = lagCount + 1 end if (lastY == YCPos and lastYS ~= 0) then lagCountY = lagCountY + 1 end lastX = XCPos lastY = YCPos lastXS = XCSpeed lastYS = YCSpeed if gens.framecount() == 1 then lagCount = 0 lagCountY = 0 end end function GetInfo() value.X_Speed = memory.readwordsigned(address.X_Speed) value.X_Subspeed = memory.readbyte(address.X_Subspeed) value.X_Position = memory.readwordsigned(address.X_Position) value.X_Subposition = memory.readbyte(address.X_Subposition) value.Y_Speed = memory.readwordsigned(address.Y_Speed) value.Y_Subspeed = memory.readbyte(address.Y_Subspeed) value.Y_Position = memory.readwordsigned(address.Y_Position) value.Y_Subposition = memory.readbyte(address.Y_Subposition) end function Draw() GetInfo() if value.X_Subspeed == 0 then value.X_Subspeed = "" elseif value.X_Subspeed == 128 then value.X_Subspeed = ".5" else value.X_Subspeed = ": " .. value.X_Subspeed end if value.X_Subposition == 0 then value.X_Subposition = "" elseif value.X_Subposition == 128 then value.X_Subposition = ".5" else value.X_Subposition = ": " .. value.X_Subposition end gui.box(10, 195, 150, 220, 'black', 'black') gui.text( 90, 200,"pos", 'cyan') gui.text( 130, 200,"spd", 'yellow') gui.text( 70, 209,"X") gui.text( 87, 209, value.X_Position .. value.X_Subposition, 'cyan') gui.text( 128, 209, value.X_Speed .. value.X_Subspeed, 'yellow') gui.text( 70, 220,"Y") gui.text( 87, 220, value.Y_Position .. ": " .. value.Y_Subposition, 'cyan') gui.text( 128, 220, value.Y_Speed .. ": " .. value.Y_Subspeed, 'yellow') gui.text(8,32,lagCount,"#00FF00") gui.text(8,40,lagCountY,"#00FF00") end savestate.registersave(function(slotnumber) return lagCount, lastX, lastY, lagCountY, lastXS, lastYS end) savestate.registerload(function(slotnumber) local a, b, c, d, e, f = savestate.loadscriptdata(slotnumber) if a and b and c then lagCount = a lastX = b lastY = c end if d then lagCountY = d end if e and f then lastXS = e lastYS = f else lastXS = 0 lastYS = 0 end end) gui.register ( function() Draw() end) gens.registerafter(function() GetInfo() LagCounter() end)
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Here's a WIP of the first three (and a small bit of stage 4) stages for those that wanted it. http://dehacked.2y.net/microstorage.php/info/967161691/Ranger-X%20%28U%29%20%5B%21%5D.gmv
Experienced Forum User, Published Author, Active player (483)
Joined: 2/19/2007
Posts: 114
Truncated and I are both still actively working on it. We're currently only at the start of stage 3 though, so it'll be a while before we're done .