[FWR] Halo 2 MCC // Sacred Icon Co-op Easy -

Описание к видео [FWR] Halo 2 MCC // Sacred Icon Co-op Easy -

World Record Speedrun of the Halo 2 Anniversary mission Sacred Icon on the Easy Difficulty in Co-op.

-- AUP Explanation --
In Halo 2, there is a runtime pool of all objects, which is basically a giant fixed array where each index points elsewhere in memory to the real object. The reason for this, is that there are many different object types, and they can all have different types of info and different sizes, so this simplifies keeping track of them a little bit.

Each object in the game is referred to by its 'datum index' (that I'll now just call datum), which tells the game how to find it in the object pool.

This datum can be broken up into two parts;

The first part is called the salt, which is a number the pool keeps track of that gets incremented every single time an object is created, and that the object saves a copy of. For example, if the salt of the last object created was e576 (hexadecimal), if I then throw a grenade or shoot a bullet, that new projectile object it creates will now have the salt of e577. Next one after that will have e578, then e579 etc. The salt only ever gets incremented, never goes backwards.

The second part is called the index, which is the actual index in the pool where the referenced object should be found at. When you create an object, it will occupy the next available pool index. Once it is deleted, it gives that index back to the pool to be used again. The index for the next object can go up and down, depending on the objects that get deleted and give their index back to the pool before the new object spawns.

So what does this have to do with respawning in Coop? When your player respawns, their new biped (body) takes up the very next available index in the pool. For example, lets say they get a salt of e3ab, and an index of 72. Then that means their datum is e3ab0072. Once the player biped is created, the game then tries to use that datum to teleport the new player biped over to the alive player. At this point, we can now screw the game up by intentionally preventing it from teleporting the new player. We do this by 'pinching' the alive player in a spot that the game flat out can't teleport the new player to. The game will try to teleport the new player over and over again, endlessly until it succeeds.

If we Restart the mission while the game is failing to teleport the player via a pinch, something very interesting happens. Because it created a new player biped and never got to finish doing its thing, it screws up, and continues to hold onto the datum of that new player in the memory of the respawn system, even after we've Restarted. The very next time that player tries to respawn after the Restart, the respawn system will find that old datum, and believe that it already made a new player. So then, it will take that datum, attempt to teleport it to the alive player, and make the dead player possess that unit instead. This is the basis of the Arbitrary Unit Possession trick.

So, we've pinched the respawn, Restarted, and want to possess something. We try to respawn the player and... nothing happened? They just respawned normal. Why didn't it work? I thought it saved the previous datum?

Well, there's another aspect to how the game uses that datum. To use it, it splits the datum in half to get the pool index, and looks at the object there. The very next thing it does, is verify that the salt stored in that object, perfectly matches the salt from the other half of the datum. If it doesn't, it knows that something is screwed up, it fails, and starts the whole thing over again, creating a new player, and no fun tricks are accomplished.

So how do we get around this? We have to make sure that the the datum that's generated when we pinch the respawn perfectly and exactly matches a valid object and object type we spawn after the Restart. Same exact salt, same exact index. If this succeeds, then it will steal whatever unit is valid at that datum, teleport it to the alive player, and have the dead player possess it.

95% of the Arbitrary Unit Possession trick, is that you have to be able to fully predict the object pool that you have both before the pinch/Restart, and after. If you can manage the pool perfectly and consistently, then you can intentionally put specific things at the datum that you want, and force your respawn to hijack it. This can get very complicated, because every single bullet increments the salt, every single object deletion, deload, breaking into multiple pieces etc, pushes and pops the available indexes off of the object pool. The available indexes can end up looking like Swiss cheese after a short time. So areas where you can reasonably control the flow of objects through the game, like at the beginning of certain levels with no shooting, have the highest likelihood of being able to be predicted/manipulated successfully.

0:00 AUP Pinch
0:20 Run Start
0:46 AUP into Constructor
2:12 Post-Gondola
3:42 Acrophobia-Style Ending

Комментарии

Информация по комментариям в разработке