summaryrefslogtreecommitdiff
path: root/Omnidirectional-Jump.md
blob: 73743a3677b864c88e2830cdb734ca5edb3f8bb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
## Omnidirectional Jump

credits to ghoulslash

This tutorial teaches you how to create a tile behavior that lets you jump over it from any direction
<a href="https://imgur.com/fT9c6ZV"><img src="https://imgur.com/fT9c6ZV.gif" title="source: imgur.com" /></a>

### 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);
```

### Step 4 - Assign your behavior
Give one of your tiles the behavior `MB_OMNIDIRECTIONAL_JUMP` in porymap, and jump for joy!