Mechanics

Movement and Acceleration

Whenever the Faxanadude starts moving, his speed is set to 192 subpixels per frame (spx/f) and incremented by 2spx/f to a maximum of 384spx/f. As long as the Faxanadude continues moving in a horizontal direction without missing a frame, acceleration continues. Turning around, as long as there is no intermediate non-walking frame, does not kill your acceleration. Jumping without Wing Boots being active also affords acceleration. For jumping with Wing Boots to provide acceleration, L or R must be pressed at each frame of the jump.
Movement is registered two frames before enemies appear on screen, and two frames before the Faxanadude lands from a jump without Wing Boots being active.
Speed is immediately set to the minimum value of 192spx/f if:

Attacking

Pressing B causes the Faxanadude to enter his attack animation. Nine frames later, the weapon is minimally extended and can deal damage. A few frames later, the weapon is maximally extended and can deal damage. On the final frame of attacking (where advancing the game causes the uppermost bit of the Player Behaviours to be set to 0), movement is again able to be registered, but it is also possible to activate items (DB) or throw Magic (UB) without starting a new attack. On the frame immediately following, it is impossible to start a new attack. On the frame following that, a new attack can be started.

Tricks

Skipping the introduction

The introductory text crawl is actually a trigger that is one block wide and two blocks high, located at (48, 112) - (64, 144). As a result, it can be jumped over, saving 12.5 seconds with an optimized jump. This is demonstrated here.

Enemy Manipulation

Many enemies in the game do not pay attention to RNG, and will simply move toward the player following a pre-defined path. This causes some enemies to jump at the Faxanadude, some to jump over the Faxanadude, and some to waddle slowly toward the Faxanadude.
However, some enemies do read and advance the RNG, and when they are reading RNG, their direction can be controlled with the A button. Holding A on the relevant frame Not holding A on the relevant frame.

Ladders as Platforms

The Wing Boots drastically change the way the game is played. While active, you can grab a ladder for one frame while moving horizontally (URA, ULA), release jump and up (R, L), and then jump (A) to quickly ascend. This is demonstrated here.

Prolonging Timers

The Wing Boots, Gloves, Ointment, and Hourglass all have set durations based on the Faxanadude's title, and these durations decrease as the Faxanadude's title advances. At Aspirant (the title earned at 1000 experience), the Wing Boots, Ointment, and Gloves (and probably Hourglass too) are set to last for 30 seconds. Each of these timers decrement when the frame counter, modulo 64, is equal to 63. The pause frame does register other input, the unpause frame does not, so a typical pause pattern might look like: URSA, --, S, URA to continue flying to the right.

Jumping Down Ladders

Lord Tom discovered a way to partially jump down a ladder. To make this work, you need at least a one-pixel ceiling above the Faxanadude. Then jump (toward the ladder you wish to fall through). Done correctly, you will notice that falling acceleration is applied to the Faxanadude even though rising acceleration was not, and on the last frame of acceleration, the Faxanadude will fall eight pixels further into the floor.

Damage Boosting

Enemies will push the Faxanadude in the direction they are facing when they hit the Faxanadude (or, when the Faxanadude hits them). The Faxanadude is shoved away at a rate of eight pixels per frame for three frames, and is given sixty frames of invincibility. These sixty frames cannot be extended through pausing. By hitting an enemy with a Weapon or a Magic on the same frame as the enemy collides with the Faxanadude, the enemy will be turned in the direction it was hit and Faxanadude will be sent in that direction as well. As with all other methods of stopping, the Faxanadude's movement speed will be reduced to its lowest value, 192 spx/f.

Useful Memory Addresses

AddressDescriptionNotes
0x001AFrame counterUnsigned. Counts from 0 to 255, but when this number, modulo 64, is 63, timers are decremented.
0x009DPlayer's X Subpixel
0x009EPlayer's X Coordinate
0x00A1Player's Y Coordinate
0x00A4Player BehavioursA bitmask containing useful information. The uppermost bit (bit 8) indicates that the Faxanadude is attacking. Bit 3 indicates that the Faxanadude in in front of a ladder. Bit 1 indicates that the Faxandude is jumping.
0x00A9Player's Speed16-bit little endian value. The first frame of new movement sets it to 192 and increments it to 194, and its maximum value is 384.
0x00ADPlayer's Invulnerability TimerSet to 60 whenever collision with an enemy occurs.
0x0431Player's Full HealthHow much health the Faxanadude has. Maximum is 80.
0x0432Player's Fractional HealthThis is stored but I don't know that it is actually used. Maybe if the Faxanadude has armour?
0x043AFour-Item CounterCounts up by one every time the Faxanadude enters a room with a hidden item, cycling back from 3 to 0. At 0x00A4 == 0, a hidden item will spawn when all enemies are killed.
0x039APlayer's MagicHow much magic the Faxanadude has.
0x00D7Spring Rock CounterCounts the number of sequential frames that the rock above the Spring has been pushed. At 96, the rock is pushed aside.
0x00DARNG OffsetUsed to index into the ROM table at 0x8000 to give the actual RNG bits, incremented every time an enemy needs an RNG value and ignored otherwise.
0x0427Ointment CounterCan be extended by pausing around framecount % 64 == 63
0x0428Glove CounterCan be extended by pausing around framecount % 64 == 63
0x0429Wing Boots CounterCan be extended by pausing around framecount % 64 == 63
0x034BEnemy 8's HealthEnemies do not die until their hit points are reduced below 0. Use 0x034A for enemy 7, and so on until enemy 1.
0x036BEnemy 8's Phase DurationThe phase duration, phase counter, and phase timer variables dictate enemy movement and behaviours.
0x02EBEnemy 8's Phase CounterThose behaviours are defined on a per-enemy basis, but knowing when an enemy is about to decide to
0x02F3Enemy 8's Phase Timerdo something new is helpful for your own decision making. 0x036A, 0x02EA, 0x2F2 are the values for enemy 7.
0x0343Enemy 8's Magic Invincibility TimerThis is set to 4 whenever enemy 8 is hit by Deluge (and probably other Magic). 0x0342 for enemy 7.
0x0353Enemy 8's Weapon Invincibility TimerThis is set to 8 whenever enemy 8 is hit by the Dagger (and probably other Weapons). 0x0352 for enemy 7.
0x02CCEnemy 1's Sprite NumberUseful for looking into the SpriteSize table, which then is used for looking into the SpriteWidth and SpriteHeight tables. 02CD for enemy 2.
0xB4DFThe Sprite Sizes Table0xB4DF + (the value in (0x02CC + enemy number - 1) ) = the memory address containing the offset into the SpriteWidth and SpriteHeight tables.
0xB4D1The Sprite Widths Table0xB4D1 + (the value in (0xB4DF + (the value in (0x02CC + enemy number - 1) ) ) )= the number of pixels wide that the sprite at enemy number is.
0xB4D8The Sprite Heights Table0xB4D8 + (the value in (0xB4DF + (the value in (0x02CC + enemy number - 1) ) ) ) = the number of pixels tall that the sprite at enemy number is.

Lua Script

The Lua Script Invariel used to create his submission is available here: Userfiles/Info/35925051135496342 It was written for BizHawk, and may require some modifications to run in FCEUX.

GameResources/NES/Faxanadu last edited by adelikat on 8/31/2023 4:17 PM
Page History Latest diff List referrers View Source