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.

Randomness

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.


TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15628
Location: 127.0.0.1
Joined: 1/22/2008
Posts: 319
Location: Brasil
fasssst. :)
Run..Run...Run.....
Former player
Joined: 4/17/2009
Posts: 88
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
Experienced player (591)
Joined: 1/11/2007
Posts: 103
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.
Skilled player (1327)
Joined: 9/7/2007
Posts: 1354
Location: U.S.
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?
Emulator Coder, Skilled player (1311)
Joined: 12/21/2004
Posts: 2687
Dammit, I am replying to an implied question in your Lua script:
--local function saveXarray()
--		return Xvalue --store values with savestate: I don't know how this is supposed to work
--end
--savestate.registersave(saveXarray)

local function loadarrays()
	for n=#Xvalue,0,-1 do
		table.remove(Xvalue,n) --wipe out the current data cuz I don't know how to get it from the save data
	end
	readX()
	for n=#Yvalue,0,-1 do
		table.remove(Yvalue,n)
	end
	readY()
end
savestate.registerload(loadarrays)
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)
Experienced player (591)
Joined: 1/11/2007
Posts: 103
Sonikkustar wrote:
BTW, Does the upward wallzipping only work on a single jump? Or can it work on a double jump?
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.
nitsuja wrote:
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)
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?
Former player
Joined: 4/17/2009
Posts: 88
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
Emulator Coder, Skilled player (1311)
Joined: 12/21/2004
Posts: 2687
Dammit wrote:
nitsuja wrote:
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)
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?
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.
Experienced player (829)
Joined: 11/18/2006
Posts: 2426
Location: Back where I belong
AndyD wrote:
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.
Living Well Is The Best Revenge My Personal Page
Joined: 12/20/2004
Posts: 226
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.
Experienced player (591)
Joined: 1/11/2007
Posts: 103
mmbossman wrote:
AndyD wrote:
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.
Joined: 12/20/2004
Posts: 226
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. :-/
Joined: 3/11/2008
Posts: 583
Location: USA
mmbossman wrote:
AndyD wrote:
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.
Or it can lead to additional weapon damage, or faster swim speed...hmm, this gives me an idea.
Joined: 12/20/2004
Posts: 226
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?
Player (84)
Joined: 8/18/2008
Posts: 80
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.
Joined: 7/2/2007
Posts: 3960
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.
Post subject: Movie published
TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15628
Location: 127.0.0.1
This movie has been published. The posts before this message apply to the submission, and posts after this message apply to the published movie. ---- [1308] Genesis Shinobi III: Return of the Ninja Master by Dammit in 22:18.42
Joined: 12/20/2004
Posts: 226
Okay, I'm happy now. :) Thanks Sp00ky.
Sir_VG
He/Him
Player (40)
Joined: 10/9/2004
Posts: 1914
Location: Floating Tower
This was a nice treat to watch. Glad it got published finally. :)
Taking over the world, one game at a time. Currently TASing: Nothing
Joined: 7/2/2007
Posts: 3960
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.
Experienced player (591)
Joined: 1/11/2007
Posts: 103
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.
Zucca
He/Him
Joined: 8/22/2008
Posts: 118
Location: KUUSANKOSKI, Finland
Tis was really entertaining. I wish I had played this game before so that I could see how fast this really is. A yes -vote.
trazz wrote:
Killing the skeletons sooner or letting the skeletons live (unlive?) won't affect that at all.
Post subject: what i just post is not a malware
yagamihikari
He/Him
Joined: 10/17/2016
Posts: 13
what i just post is not a malware
Post subject: Re: what i just post is not a malware
Editor, Skilled player (1824)
Joined: 8/25/2013
Posts: 1200
yagamihikari wrote:
what i just post is not a malware
sure bud
effort on the first draft means less effort on any draft thereafter - some loser