summaryrefslogtreecommitdiff
path: root/src/code_08077DF4.c
blob: 4743db5544eba2a092332ef6c1da04eae1353ef2 (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "global.h"
#include "entity.h"
#include "player.h"
#include "dma.h"
#include "functions.h"

typedef struct {
    u8 b0 : 4;
    u8 b1 : 4;
} PACKED Unk_bitfield;

typedef struct {
    u8 unk[16];
} Unk_struct;

void sub_08077DF4(Entity* ent, u32 arg1) {
    *(u16*)&ent->flags = arg1;
    if ((arg1 & 0xff) > 0xb8) {
        arg1 += ent->type >> 1;
    }
    gPlayerEntity.spriteIndex = (short)(arg1 >> 8);
    InitAnimationForceUpdate(&gPlayerEntity, (u8)arg1);
    sub_08077E54(ent);
}

void UpdateItemAnim(Entity* ent) {
    UpdateAnimationSingleFrame(&gPlayerEntity);
    sub_08077E54(ent);
}

void sub_08077E3C(Entity* ent, u32 idx) {
    sub_080042BA(&gPlayerEntity, idx);
    sub_08077E54(ent);
}

void sub_08077E54(Entity* ent) {
    ent->action = gPlayerEntity.animIndex;
    *(u8*)&ent->spriteIndex = gPlayerEntity.frameIndex;
    ent->previousActionFlag = gPlayerEntity.frameDuration;
    ent->actionDelay = gPlayerEntity.frames.all;
}

void sub_08077E78(void* arg0, u32 bits) {
    u8* pbVar1;
    u32 not ;

    if (bits == 0) {
        if (gPlayerState.field_0x2c != NULL) {
            ((Unk_bitfield*)gPlayerState.field_0x2c)[0x11].b0 = 6;
            gPlayerState.field_0x2c = (u8*)bits;
        } else {
            gPlayerState.field_0x2c = (u8*)bits;
        }
    }

    not = (8 >> bits);
    gPlayerState.field_0x3[1] &= ~((u8)((8 >> bits) << 4) | not );
    not = ~not ;
    gPlayerState.field_0xa &= not ;
    gPlayerState.keepFacing &= not ;
    MemClear(arg0, 0x1c);
}

u32 sub_08077EC8(Unk_struct* arg0) {

    if ((gPlayerState.field_0x1a[1] & 8) != 0) {
        sub_08077DF4((Entity*)arg0, 0x170);
        arg0->unk[7] = 0x28;
        arg0->unk[4] = 7;
        arg0->unk[15] = 6;
        return 1;
    } else {
        return 0;
    }
}

void sub_08077EFC(ItemBehavior* arg0) {
    sub_08077F24(arg0, (u16)gPlayerState.field_0x90.HALF.LO);
}

void sub_08077F10(ItemBehavior* arg0) {
    sub_08077F24(arg0, (u16)gPlayerState.field_0x90.HALF.HI);
}

NAKED
void sub_08077F24(ItemBehavior* beh, u32 arg1) {
    asm(".include \"asm/non_matching/sub_08077F24.inc\"");
}

void sub_08077F50(ItemBehavior* beh, u32 arg1) {
    sub_08079184();
    sub_08077E78(beh, arg1);
}

u32 sub_08077F64(ItemBehavior* arg0, u32 unk) {
    u32 temp;
    if (gPlayerState.heldObject == 0) {
        sub_08077F50(arg0, unk);
        temp = 0;
    } else {
        temp = 1;
    }
    return temp;
}

void sub_08077F84(void) {
    Entity* obj;

    if (((gPlayerEntity.collisionLayer & 2) == 0) &&
        GetTileTypeByPos(gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI - 0xc, 2) - 0x343U < 4) {
        sub_0807AA80(&gPlayerEntity);
        gPlayerState.jumpStatus |= 8;
        obj = CreateObject(0x44, 0, 0);
        if (obj != NULL) {
            obj->x = gPlayerEntity.x;
            obj->y.HALF.HI = gPlayerEntity.y.HALF.HI - 0xc;
            gPlayerEntity.y.HALF.HI -= 0xc;
        }
    }
}