diff --git a/Omnidirectional-Jump.md b/Omnidirectional-Jump.md new file mode 100644 index 0000000..880e743 --- /dev/null +++ b/Omnidirectional-Jump.md @@ -0,0 +1,61 @@ +## Omnidirectional Jump + +credits to ghoulslash + +This tutorial teaches you how to create a tile behavior that lets you jump over it from any direction + + +### Step 1 - create the behavior +Open [include/constants/metatile_behaviors.h](../blob/master/include/constants/metatile_behaviors.h). Replace an unused behavior with: +e.g.: +```diff +-#define MB_UNUSED_1D 0x1D ++#define MB_OMNIDIRECTIONAL_JUMP 0x1D +``` + +### Step 1 - make the behavior do something +Open [src/event_object_movement.c](../blob/master/src/event_object_movement.c), and find `GetLedgeJumpDirection` and replace the entire function with the following: +```c +u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) +{ + static bool8 (*const sLedgeJumpBehaviors[])(u8) = { + MetatileBehavior_IsJumpSouth, + MetatileBehavior_IsJumpNorth, + MetatileBehavior_IsJumpWest, + MetatileBehavior_IsJumpEast, + }; + + u8 behavior; + u8 direction = z; + + if (direction == 0) + return 0; + else if (direction > 4) + direction -= 4; + + direction--; + behavior = MapGridGetMetatileBehaviorAt(x, y); + + if (sLedgeJumpBehaviors[direction](behavior) || MetatileBehavior_IsOmnidirectionalJump(behavior)) + return direction + 1; + + return DIR_NONE; +} +``` +### Step 3 - make the function recognize the behavior +Open [src/metatile_behavior.c](../blob/master/src/metatile_behavior.c). Add the following at the end of the file +```c +bool8 MetatileBehavior_IsOmnidirectionalJump(u8 metatileBehavior) +{ + if (metatileBehavior == MB_OMNIDIRECTIONAL_JUMP) + return TRUE; + else + return FALSE; +} +``` + +Then, open [include/metatile_behavior.h](../blob/master/include/metatile_behavior.h) and add the following somewhere: +```diff ++bool8 MetatileBehavior_IsOmnidirectionalJump(u8 metatileBehavior); +``` +