This is an improvement over the current movie by about 2m 45s. It follows the same goals, namely:
Aims for fastest time
Plays at the hardest difficulty, including no initial shurikens
Doesn't get hit or lose power
There are a gazillion things to discuss, so I'll focus on the following points.
Lag
This game doesn't have much lag, but much of what it does have doesn't show up on the lag counter. To deal with this, I made a lua script that counts frames when the ninja doesn't move, and also tracks speed in pixels per frame. You need Gens 11+ for lua.
Some things like the timing of enemy attacks are random. So if you spot-weld improvements earlier in the movie, you get desyncs later. The randomness is determined at least in part by the input stream--even input that has no effect on gameplay affects the RNG. Crazy but true, it's possible to repair sync by adding or changing input that does nothing before the random thing gets spawned.
Tricks and glitches
Pallete error
In the horsey level, the last enemy is left for awhile to illustrate this.
Quickroll
Perform a double jump below a thin platform and the ninja will jolt upward while rising through it. Pressing into a wall during the zip will terminate the roll and return to standing position with full control.
Shuriken spamming
You can cancel the standing attack recovery with a jump and a jump with an attack. You can see where that's going. However, this doesn't help for the bosses with long invuln times.
Fastkicking
A typical jump kick moves at the same horizontal speed as running. But if the kick is done to the right while at less than running speed, it's 25% faster. (This seems to be a glitch because the same procedure to the left incurs a speed penalty.) Because of the delay in jumping up and landing, it's not faster than running over flat ground, but if done near the peak of a high jump, the penalty is less than one frame's worth of movement.
Recoilless kicks
It's possible to hit an enemy with a kick after touching ground and avoid the costly recoil. This is the fastest way to get rid of enemies that have 1 HP, but some open ground in front is required. In a couple cases it's also useful for hitting bosses that are too low to shoot.
Wallkicking
A sheer wall can be climbed by kicking into it on alternating frames. Gravitational acceleration continues, so it's best as a supplement rather than a substitute for jumping. Neofix demonstrated this in his movie but didn't put it to good use.
Upward zipping
This requires a low ceiling that opens up and becomes a vertical wall. Jump facing away from the wall so that the ninja's back is partly overlapping the wall in a nonsubversive manner. When the wall covers the ninja's back at foot level, do a turnaround kick into the wall. Do not press into the wall or the ninja will be ejected. The zipping lasts until the ejection is complete and is accelerated by wallkicking. It looks and sounds like wallkicking but is much faster and allows regular jumping, which is better than walljumping.
Walk through walls
Performing wallkicks while zipping into a ceiling can bring the ninja high enough to walk around in there. Running is not possible inside walls.
mmbossman: Excellent improvement, and a ton of fun to watch. Accepting.
questions:
when you are jumping over enemies, do you jump the minimum height and kick as soon as possible to save time?
did you use the throwing spikes and other weapons as efficiently as possible? you had 321 at the end, which could've been used on enemies you were just passing or just throwing at max speed for the entertainment of it, if it didn't slow you down anyway
is it faster jump-kicking than just running?
on the surfing level, does the level take less time if u kill enemies faster?
looks quite good
Good questions.
when you are jumping over enemies, do you jump the minimum height and kick as soon as possible to save time?
I jump maximum height and kick as high as possible to get a bigger kick. Any jump costs the same three frames to start so you get more for your money by going higher.
did you use the throwing spikes and other weapons as efficiently as possible? you had 321 at the end, which could've been used on enemies you were just passing or just throwing at max speed for the entertainment of it, if it didn't slow you down anyway
This game is very generous with the shurikens. (The Shinobi II movie ran out a few times.) I had a lot because I got them whenever it cost no time but didn't use them if they cost any time. It costs 1 frame to throw while jumping and several frames for a shuriken spread because the kick won't be as high. And I sometimes use other weapons instead. The result is you get a variety of kills and non-kills.
is it faster jump-kicking than just running?
Kick-speed is higher than run-speed but a kick takes some time to set up. It's easier to see the difference by watching the scrolling instead of the characters. You can also see it quantitatively with the lua script.
on the surfing level, does the level take less time if u kill enemies faster?
The autoscrollers have to pass the same distance and you can't affect the speed. So naturally I cocktease the viewer there.
This TAS has two things that are awesome. Ninjas and Glitches. You basically combined these two things together.
Definitive Yes Vote!
BTW, Does the upward wallzipping only work on a single jump? Or can it work on a double jump?
Dammit, I am replying to an implied question in your Lua script:
Replace all of that code with this and it will actually work, you'll see how simple it is...:
savestate.registersave(function(slotnumber)
-- save out the arrays
return Xvalue,Yvalue
end)
savestate.registerload(function(slotnumber,x,y)
-- load in the arrays
Xvalue,Yvalue = x,y
end)
It doesn't work on a double jump because by the time the flip is finished you'll be ejected from the wall. (You can't kick during the flip.)
It doesn't work on a walljump either because you can't do a turnaround kick, or even turn around, during a walljump.
I think it's cool how it can only be used under strict circumstances.
Hm, now I get an error on the first line after gui.register: Xvalue is a nil at that point. I guess that means savestate.registerload didn't plug in the values? How does registerload know what "slotnumber," "x" and "y" are?
1. couldn't you have used up all the weapons on the autoscroll levels? So when you finish, you end the game with exactly 0, which would be a nice touch. just a suggestion
2. As the autoscroll levels are so long, I did see a lot of falling off screen glitches, what about the tapping left right combo per frame? (common tas trick) I don't think I saw any of that.
i voted yes, but recommend you do my suggestions if you are thinking of improving it
slotnumber is the save slot number, Gens always passes that in first (in your case you don't care what it is, but in other cases it's important to know which save slot is being saved or loaded) so it must be listed first. The rest of the arguments are the same things that were returned by the registersave callback the last time the savestate got saved, in the same order they got returned. I picked x and y for their names arbitrarily, but anything else would work too as long as it's not exactly the same name as the variables you're loading into. If you try to load a savestate that was saved without that registersave callback active, then x and y will be nil, which would cause the error you saw. To fix that you could change the registerload callback function to do some error checking like this:
savestate.registerload(function(slotnumber,x,y)
if x and y then
-- load in the arrays
Xvalue,Yvalue = x,y
else
-- x or y is nil, so we failed to load them, so clear the arrays instead
Xvalue,Yvalue = {},{}
end
end)
Or, to do basically the same thing in less lines of code:
savestate.registerload(function(slotnumber,x,y)
Xvalue = x or {}
Yvalue = y or {}
end)
EDIT: Sorry to fill up the movie thread with so much Lua stuff, but the submission does link to a Lua script which links back to this thread as presumably the place to discuss it... Maybe this discussion should move to PMs if it's going to continue though.
Okay, this run was awesome, and it's one of the many games in the list of "Wow I should rerun this game because the TAS shows how shit my current run is." And like always, I'm not sure when I'll actually get around to it.
My only question is whether the wall climbing can be useful for a speedrun, but I guess I have to try that out myself.
what about the tapping left right combo per frame? (common tas trick)
Kids, just say no to wobbling. It can only lead to bad things.
This is what should happen to all wobblers:
Nitsuja helped me find the lua problem and already fixed it. (Thank you.) The script has been updated and will work with or without the fix.
mikwuyma wrote:
Okay, this run was awesome, and it's one of the many games in the list of "Wow I should rerun this game because the TAS shows how shit my current run is." And like always, I'm not sure when I'll actually get around to it.
My only question is whether the wall climbing can be useful for a speedrun, but I guess I have to try that out myself.
With quick fingers, you should be able to do the shuriken spamming and fastkicking in realtime, but the wall climbing tricks require finicky frame precision. Actually I didn't see many points where your speedrun could be reliably improved. Some parts are more precise than the old TAS.
I tried a little shuriken spamming the other day and the best I could manage was jumping really low and doing a down kick in between shots. It's still faster than just pressing the button though.
And yes, I was faster than the old TAS in some parts, but it wasn't the best TAS. :-/
Is there a reason this run hasn't been published yet? It has all yes votes and it's been in the workbench for nearly 2 months. Is no one willing to encode it?
It's in the works. I'm trying to make this encode look better than the one for the previous run without going over the sites limit, since this game is one of those ones that pushes the envelope encoding wise.
In general, any time a run's been on the workbench for a long time, it's because either
a) all our encoders are busy with other runs (after all, they aren't required to go work on the oldest one), or
b) all our encoders are just busy, period, or
c) the run is unusually difficult to encode
So just have patience. :)
Pyrel - an open-source rewrite of the Angband roguelike game in Python.
Very nice run. I'm glad to see that you played around with the enemies during the forced scrolling segments instead of killing them off immediately.
How'd you do that "jump off the bottom of the screen, then come back on" trick? It seemed like you stayed down there far too long for it to be just a generous "this is where you die" line.
Pyrel - an open-source rewrite of the Angband roguelike game in Python.
Thanks, everyone. It's good we have another publisher too.
Derakon wrote:
How'd you do that "jump off the bottom of the screen, then come back on" trick? It seemed like you stayed down there far too long for it to be just a generous "this is where you die" line.
Indeed that's what it was, to one frame from death.