I just played through them and they were pretty fun. I will probably play around with them a bit more this weekend to see if I can get a decent time. Got a 2:10 on my second play through without doing any OOB, but that could come down a lot. A lot of pretty precise timing shots which I kept messing up on my first play through.
Early on there were some out of bounds issues. On the first map you can jump on top of the level to the left and if you walk a little that way you enter an endless fall. More serious perhaps is on the second level if you stand on top of the spiky elevator platform you can jump on top of the level and just run right, skipping a ton of stuff.
In the ghost level it seems like you want us to go all the way around the top, but you can just jump across the gap over the lava and skip that whole thing.
I was a bit disappointed that you didn't leave the possibility of a pacifist run. You have put in just enough hp that we can get past the big brute without killing him, but the 4 small guys below seem like they are impossible to pass without killing them.
Is there any meaning to the alien artifact that you can pick up or was it just put in there to collect?
Binding shooting to the scroll wheel would make the final fight faster. I think that's the only thing it will affect, but who knows. I don't think we have any rule against it and as long as it's just a simple rebind (no fancy repeaters or delay timers) it seems like it should be allowed, however no one seems to be doing it. The only real points against it I can see are 1) it can't be done directly from the in-game menus. 2) button mashing boss is a part of the game and we shouldn't try to change that.
I therefore wanted to bring it up and see if there is consensus on whether this should be allowed or not. In any case we should have a clear rule one way or the other. Personally I'm for it as I don't think a direct rebind counts as an external tool just like changing monitor brightness or using a split timer is fine even if they offer something that is not directly available from the in-game menus. However I will be happy to go along with the majority opinion or with any pre-existing rule I'm unaware of.
The following is a video of what the boss fight looked like for me after a few tries:
There seems to be a hard limit of a shot per frame or something like that. And at that shooting speed movement doesn't work properly.
At the shootemup, isn't it better to get hit by 3 ships, either top or big 3, then dying to the fouoas it appears?
So hitting 3 ships in the first group? You have to hold left to do that so it takes a long time to get to the fourth ship whether you choose it among the first group or race straight ahead to the second group.
If you have an idea try it out. I don't see a faster way to do it, but maybe you have some strategy in mind that could actually work. There has not been a ton of optimization of this stuff so don't just assume that what people are doing is always optimal.
A very easy and rough way to test if you're faster than current strats is to after having your ship destroyed just hold right and skip the first dialogue box (don't use teleport gun at all). With current strats the dialogue box in Spaceship Graveyard triggers almost immediately after the timer turns to 00:00:07. So if you do this with your space strats and the dialogue box comes up at 00:00:06 that means they are slightly faster.
If on the other hand you do the same, but you do the small teleport at Crash Site, then with current strats the dialogue box comes up right before 00:00:07. So if you do this with your space strats and the dialogue box comes up at 00:00:07, then that means your strats are slower.
At "Before the City", why do people jump at the ledge before shooting the gun? Wouldn't it be faster to jump before and fall right after the ledge to increase your vertical velocity, so you can shoot the teleport gun earlier? Would you fall down the bottom of the screen before the teleport bullet can hit the block?
As you say the screen would transition before you hit. Exactly when we jump could be optimized a little bit I bet, but it's very minor.
Very nice trick. The life capsule is useful even in any% IGT because it allows you to do an extra damage boost.
EDIT: I misunderstood what you meant by saying "The current route is 5s faster IGT." I thought this trick was 5s faster, but obviously that is not the case. With decent execution I'm confident this new strat is at most 2s IGT slower than the ordinary strats, at least that's around what I've been getting when trying it out. Still I don't see it being useful except in runs where you really need the life capsule.
As far as I know they move at a fixed speed until they encounter an obstacle at which point they turn around. I have also noticed some inconsistencies and Null Field is the most notable example, and I think it's due to an uneven framerate. Loading a room always reduces framerate a little and with all the weird effects in Null Field along with you possibly teleporting, a little variability is unfortunately unavoidable.
The code that is actually responsible for movement of chompers is (Action/game/enemy/Components/Goomba.as):
if (this.debug_face_x < 0 || this.debug_face_x > level.width || level.hasMovingPlatformAt(new Rectangle(this.debug_face_x, enemy.y - enemy.body.height / 2, enemy.body.width, enemy.body.height)) || !_loc_2 || _loc_2 is OneWayBlock || _loc_2 is FragileBlock || _loc_2 is Slope || _loc_3) { this.side = this.side ¤ -1; } else { enemy.x = enemy.x + this.speed ¤ Constants.SECS_PER_STEP ¤ this.side; }
The if statement is true if something is blocking the movement of the chomper, in which case the movement direction is reversed by negating the side variable. If nothing is blocking the movement, then its horizontal position is shifted by the constant speed / FPS to the side the chomper is currently moving.
In the first space sequence where we try to kill ourselves we have 10HP and take 3dmg for every ship we hit, so we usually have to hit 4 ships. I've noticed that when I miss the 3rd ship I still sometime die from the 4th ship and I had no idea why. It turns out that I take 2dmg from a near miss with the 3rd ship. See the following video:
It seems that when we're close to spaceships we take 1-3dmg the first frame, so often when they die they actually die over the course of 1-2 frames but we don't notice this as there is no animation for partial damage and 2 frames is not very long.
I don't know the specifics of how this works, or whether it really matters but since we're trying to understand the game I wanted to share.
Can I just ask for a small clarification on any%? We need to include the overflow preparation in our vod, but should it be timed or can we wait to start the timer until we press 'New game' on our actual run?
Actually I've been looking it a little more and I think I was wrong, there is no overriding going on. Teleporting works by directly calling setPosition but onLeaveGround is only called if you leave the ground with the method move().
What is really going on is the following:
Every frame both the teleshot and the player run onUpdate methods. Since the player was created before the teleshot it updates first. A player update basically consists of the following individual steps in the following order: updateControls - Check whether a key is pressed and adjust speed and such accordingly. updateAnimations - Irrelevant for our purposes updateCollisions - Irrelevant for our purposes updateProperties - This is where jumpException is decreased by 1.
For illustration lets say the player presses jump on the 7th frame. Then when a teleshot hits the following happens on the frame where the teleshot collides with a wall. Frame 1: player updates its state - teleshot still hasn't updated so the player doesn't do anything special. teleshot updates its state - it detects collision with a wall and sets player.jumpException = 6
Frame 2: player updates its state - now it knows we have teleported and it decreases player.jumpException to 5.
Frame 3: player updates its state - it decreases player.jumpException to 4.
Frame 4: player updates its state - it decreases player.jumpException to 3.
Frame 5: player updates its state -it decreases player.jumpException to 2.
Frame 6: player updates its state - it decreases player.jumpException to 1.
Frame 7 (jump is pressed): player.updateControls - jump is pressed so the game tests whether
(onGround || this.jumpException > 0) && !this.jumping
This is true since jumpException = 1. Therefore the game initiates a jump.
player.updateAnimations - Stuff happens player.updateCollisions - Stuff happens updateProperties - Here jumpException was supposed to be decreased to 0, but we managed to jump beforehand.
This explains why when a teleshot sets this.jumpException = 6 that really means we have 7 frames.
I'm unsure when exactly in the update process onLeaveGround is called so the time for when we walk off a platform could still be 7 or 8 frames depending on whether it's called before or after player.onUpdate().
UPDATE: You also have 7 frames when you walk off a platform that is because onLeaveGround is called before player.onUpdate. The way it works is that when a player object is created it registers first platformObject.onUpdate and only then player.onUpdate with the ON_UPDATE signal. So on a frame where you leave the ground the following would happen:
Frame 1: platformObject.onUpdate - this method detects that we left the ground via move and calls onLeaveGround which sets player.jumpException = 7 player.onUpdate - jumpException > 0 so it is decreased to 6.
Therefore coming out of frame 1 jumpException is 6 no matter if we walked off a platform or we teleported to another location.
SUMMARY: You always have 7 frames to jump when leaving solid ground.
There is definitely 7 frames to jump when you're teleporting. Not completely sure if it's 7 or 8 when walking off a platform.
EDIT: The following stuff is wrong. There is no overridding going on. See my next post.
I think the game has a minor bug (I'm not sure on this) where when you teleport first the game sets jumpException = 6 because you teleported, but then since you left the ground the game overrides it with jumpException = 7. I think that's why you have 7 frames when you're teleporting rather than the 6 that
this.jumpException = EXCEPTION_JUMP_FRAMES;
would suggest. What I know for certain is that you have 7 frames because I have recorded myself doing it and I can always jump on the 7th frame, but never on the 8th.
You have precisely 7 frames to do this, and this is also why the green beam jump works and the only way to get the jump from Outpost Cache to Junkyard Exit. I tried to include this in my explanation in the Google docs, but I didn't really go into details so I guess I might as well here with the accompanying code. All the following code is from ots/Action/game/player/player.as in the game asset archive that was extracted.
When you press jump the game calls:
public function onJump() : void { if ((onGround || this.jumpException > 0) && !this.jumping) { if (!onWater) { _ySpeed = -JUMP_FORCE; } else { _ySpeed = -JUMP_FORCE; } this.jumpException = 0; if (!onGround && this.airborneFromTeleport) { this.onTeleJump(); } this.jumping = true; SoundManager.playSound("yuriJump"); } return; }// end function
so it allows you to jump if you're on the ground or you have a jumpException > 0. When you walk off a platform you get a jumpException of 7 (and it decreases by 1 every frame):
override protected function onLeaveGround() : void { super.onLeaveGround(); if (ySpeed > 0 && !this.jumping) { this.jumpException = 7; } return; }// end function
The same thing happens when you teleport. In that case the teleport function calls applyMomentum:
private function applyMomentum() : void { if (_ySpeed > 0) { _ySpeed = _ySpeed / 2; } if (_ySpeed < (-JUMP_FORCE) / 4) { this.onTeleJump(); _ySpeed = -JUMP_FORCE; } if (onGround) { this.jumpException = EXCEPTION_JUMP_FRAMES; } return; }// end function
private function tryTeleporting(param1:int, param2:int) : Boolean { if (!willCollide(param1, param2)) { this.level.particles.burst(this.x, this.y, "teleport", 1).startSize(6); setPosition(param1, param2); this.applyMomentum(); this.level.particles.burst(param1, param2, "teleport", 2); this.teleportTrail = this.level.particles.burst(param1, param2, "teleShot", 60); SoundManager.playSound("teleportSuccess"); this.airborneFromTeleport = true; this._grigoriTeleportTrigger = true; Steamworks.current.setStatInt("TELEPORT", (Steamworks.current.getStatInt("TELEPORT") + 1)); Steamworks.current.storeStats(); return true; } return false; }// end function
and EXCEPTION_JUMP_FRAMES = 6.
That is a pretty cool glitch as well. I tried it out and it's quite precise as you say, but if we could get it consistent I bet it would be useful in any% IGT at least.
The game code seems quite accessible. Never used ActionScript but it's pretty self-explanatory. When I get time I'm going to try to see if I can dig into it to further understand the green beam glitch.
I've been playing around a bit with damage boosting for an all collectibles run. Grigori's Tower + The Guard is the only place where I've had success getting any significant time saves using damage boosts. The following is a comparison video of various strategies I've been playing around with.
I really like the first example, but it uses all our health and is a little hard.
In Grigori's Tower I differentiate between 3 approaches: Approach 1: Do double damage boost like I do in example 1. Approach 2: Yolo, try to shoot a teleport shot under the ghost first and then force the ghost down after hitting the second ledge. This is the fastest strat in any% IGT, but requires quite precise timing at first and is easy to mess up. Doesn't require any extra hp though. This is shown in example 2 and 3 in my video. Approach 3: Cautious. Wait for the ghost to pass first and then go up by teleport shooting the ledges. I do this in example 4.
In The Guard I differentiate between 2 approaches: Approach A: Do damage boost off the brute. I do this in example 1 and 2. Approach B: Kill the brute like in any% IGT except we shoot 2 shots every jump since we have upgraded Gauss gun. I do this in example 3 and 4.
Using this numbering the examples in my video are: Example 1 (11.94): Approach 1A Example 2 (12.98): Approach 2A Example 3 (14.90): Approach 2B Example 4 (15.90): Approach 3B
My timing shows the following: Approach 1 saves 1 second compared to approach 2. Approach 2 saves 1 second compared to approach 3. Approach A saves 2 seconds compared to approach B.
In terms of HP requirements: Approach 1 requires 2 extra HP. Approach 2/3 requires no extra HP. Approach A requires 1 extra HP. Approach B requires no extra HP.
So if you go for approach 1A you need the full 4HP.
I generally think approach 1 is easier than approach 2 (with some practice of course) so I would always choose approach 1 or 3 for Grigori's Tower.
This also has applications to any% IGT. If in Jumping Over you do the jump over the map, then you can pick up an Alien Artifact in Outpost Cache with under 1s time loss. This will allow you do do Approach B in The Guard though which saves 2s overall compared to upgraded Gauss gun, but we only have normal Gauss gun so it saves even more time. This triggers an additional dialogue box when picking up the Alien Artifact, but for IGT runs that is irrelevant.
I just thought I'd share my findings and open up for any discussions of damage boosting as it seems very unexplored at present.
EDIT: I completely forgot to include some stuff on how to actually do these damage boosts. Given how underused they are I imagine many people don't actually know how they work.
Orientation: Once you take damage you are paralyzed for some time and you usually face towards the monster you hit which is the wrong way. If you turn around after shooting the teleport shot, but before hitting the monster, then you will face the correct way when getting boosted into the air.
Height: A normal damage boost does not boost you very high at all, but it counts as a teleport so if you stand on a platform when the teleport hits then the game treats you as standing on a platform for the first 7 frames (at 60FPS) after hitting the teleport shot. This means that if you press jump shortly AFTER you take damage you will get boosted much higher into the air, and if you face the right way you will be able to shoot a teleport shot near the highest point even if you can't control yourself yet.
So for the ghost dmg boost where you are to the left of the ghost (just reverse everything if you're on the right) you do the following:
- Shoot teleport shot to the right towards the ghost.
- Hold the left direction key, and make sure to be on a platform by the time the shot hits.
- Once the shot hits after 3-7 frames press jump
- When you're high in the air press teleport shot.
For the brute dmg boost you do the following:
- Shoot the teleport shot above the brute so that you touch it, but the damage boost will take you out of range of the brute. This just means as high as possible in The Guard, but even if you don't attain maximum height it will probably work out.
- Land on the little platform and wait a little, ideally stand by the right side of the platform.
- As the teleport shot is about to hit hold the left direction key. If you are facing the wrong way in the air you were too slow. If you fall off the platform before being teleported you were too quick.
- Once the shot hits after 3-7 frames press jump
- When you're high in the air press teleport shot.
There is a small variation on this mechanic which I think is useless but I might as well share. If you shoot a ghost, and as soon as you teleport into it you shoot another teleport shot you will get teleported into it again, but because of the upwards speed from your first damage boost you will get a high damage boost as if you had jumped. This could be useful if for some reason you didn't have time to land on a platform. I think it's impossible to turn around with this variation though which makes it useless as far as I can see.
Yeah the shot you highlighted prettz is kinda tricky. When I first played around with this trick I would get it maybe 25% of the time at best, but now I get it the majority of the time. I think it's easier than a green beam jump, but you only get 1 shot at it and if you fail you lose like 5seconds. Probably not a "beginner strat" but if you're trying to optimize your gun pickup time it's a nice way to gain about 3 seconds, especially in tight categories like the current any%.
For runs where you want alien artifacts (hp upgrades) it makes sense even if you drop down to Junkyard since you only lose a few seconds and get to pick up an alien artifact. So for pacifist%, and maybe 107% I think it makes sense even if you don't do the tricky jump+shot to Junkyard Exit as it's the quickest way to get to Outpost Cache.
I'm not suggesting that everyone adopts this or anything, but just thought I'd share it seeing as it can save time and I haven't seen others really do this strat except to pick up an alien artifact.
Wow great work. I would never have imagined that level files were just basic XML and you could look into them like that.
"Using this i managed to determine that in order to get to the boss trigger you have to walk right 8 squares off screen, jump right, then go right which correspond to the previous image." The first right should probably be a "left". Is the jump actually to the right or to the left?
One small addition. When we enter Junkyard Exit from the left with the OOB strats we can actually shoot the blue beam as we're first falling and get out of Junkyard Exit that way without even going to the destructible platform side. Not sure exactly how much that saves, but at least another second.
Video of the slightly updated version:
With this optimization I think it might even make sense in runs using IGT.
EDIT: I just noticed that the 17.98 standard strat time was mistimed, ignore that particular time, but the point still stands. It should be 18.78.
Since we're now moving on to using real-time for some categories and it seems that is here to stay for at least any% there is a dialogue box in Alien Outpost that we can skip by going OOB in Jumping Over and never actually entering Alien Outpost. This saves 2 seconds when done correctly. The following is a summary of my times with these strats compared to standard strats (timed with external timer):
Standard strats: 18.60 19.25 18.78 (updated from 17.98 earlier which was incorrectly timed)
OOB strats: 16.71 16.23 17.52
OOB strats failing and doing backup strats: 20.28 17.30 20.79
All are timed from I enter Jumping Over until I stand on the rightmost destructible platform in Junkyard Exit. The following is my comparison video where I get these times:
The strats are pretty self-explanatory I think even if they take some practice to get good at.
The OOB strats are nothing new; I first saw the OOB strat used in timbouton's pacifist run, but I've never seen anyone else do the jump from Outpost Cache to Junkyard Exit (which is required for the strat to make sense). To get the fast version of the OOB strats can be a little hard, but with a 3 minute any% category I think it makes sense to consider them. The hardest thing is the jump from Outpost Cache to Junkyard Exit, when you exit the platform you have to jump 2-4 frames after you've left the platform to get the required height (similar to green beam jump, but easier to time and with only 1 try).
The only reason this strat makes sense is because we skip the dialogue box in Alien Outpost. With IGT runs OOB strats and standard strats are almost identical in time (well executed OOB strats might still be slightly faster, but only slightly and considerably harder).
Regarding the particles, I'm almost 100% that I was wrong. I wanted to explain why it seemed to take a few seconds less sometimes and the common feature seemed to be destroying things, but now I just think it's due to the fact that I had a few resets beforehand and therefore had spend some time in Crash Site in a previous run.
I actually tested this by staying in Crash Site for 2m49s (1s less than it takes to trigger the glitch), so the glitch should almost be triggered. I then went to Mirror Mirror and started destroying blocks but couldn't get it to trigger. So I definitely don't believe that anymore.