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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/**
* @file gentariCurtain.c
* @ingroup Objects
*
* @brief Gentari Curtain object
*/
#include "asm.h"
#include "entity.h"
#include "flags.h"
#include "object.h"
#include "room.h"
#include "tiles.h"
#include "map.h"
typedef struct {
Entity base;
u8 filler[0x8];
u16 tilePos;
u16 tilePos2;
u16 tileIndex;
u16 tileIndex2;
u8 filler2[0xe];
u16 flags;
} GentariCurtainEntity;
void GentariCurtain_Init(GentariCurtainEntity* this);
void GentariCurtain_Action1(GentariCurtainEntity* this);
void GentariCurtain_Action2(GentariCurtainEntity* this);
void GentariCurtain_Action3(GentariCurtainEntity* this);
void sub_0809223C(GentariCurtainEntity* this);
void sub_080921BC(GentariCurtainEntity* this);
void sub_080921F0(GentariCurtainEntity* this);
void sub_08092214(GentariCurtainEntity* this);
void GentariCurtain(Entity* this) {
static void (*const GentariCurtain_Actions[])(GentariCurtainEntity*) = {
GentariCurtain_Init,
GentariCurtain_Action1,
GentariCurtain_Action2,
GentariCurtain_Action3,
};
GentariCurtain_Actions[this->action]((GentariCurtainEntity*)this);
}
void GentariCurtain_Init(GentariCurtainEntity* this) {
if (CheckFlags(this->flags)) {
super->action = 3;
super->x.HALF.HI += 2;
sub_0809223C(this);
InitAnimationForceUpdate(super, 1);
} else {
if (super->subAction == 0) {
super->subAction = 1;
super->collisionLayer = 1;
super->spritePriority.b0 = 6;
super->x.HALF.HI += 2;
UpdateSpriteForCollisionLayer(super);
this->tilePos = COORD_TO_TILE_OFFSET(super, 0, 8);
this->tilePos2 = COORD_TO_TILE_OFFSET(super, 0, -8);
this->tileIndex = GetTileIndex(this->tilePos, LAYER_BOTTOM);
this->tileIndex2 = GetTileIndex(this->tilePos2, LAYER_BOTTOM);
SetTile(SPECIAL_TILE_34, this->tilePos, LAYER_BOTTOM);
SetTile(SPECIAL_TILE_34, this->tilePos2, LAYER_BOTTOM);
InitAnimationForceUpdate(super, 0);
} else {
super->action = 1;
sub_080921BC(this);
sub_080921F0(this);
}
}
}
void GentariCurtain_Action1(GentariCurtainEntity* this) {
if (CheckFlags(this->flags)) {
super->action = 2;
}
}
void GentariCurtain_Action2(GentariCurtainEntity* this) {
UpdateAnimationSingleFrame(super);
if ((super->frame & ANIM_DONE) != 0) {
super->action = 3;
SetTile(this->tileIndex, this->tilePos, LAYER_BOTTOM);
SetTile(this->tileIndex2, this->tilePos2, LAYER_BOTTOM);
sub_08092214(this);
sub_0809223C(this);
InitAnimationForceUpdate(super, 1);
}
}
void GentariCurtain_Action3(GentariCurtainEntity* this) {
}
void sub_080921BC(GentariCurtainEntity* this) {
GenericEntity* pEVar1;
GenericEntity* end;
pEVar1 = (GenericEntity*)gAuxPlayerEntities;
end = pEVar1 + 0x4f;
do {
if (pEVar1->base.kind == OBJECT) {
if (pEVar1->base.id == MINISH_SIZED_ARCHWAY) {
if (pEVar1->base.type == 2) {
super->child = (Entity*)pEVar1;
return;
}
}
}
pEVar1++;
} while (pEVar1 < end);
super->child = NULL;
}
void sub_080921F0(GentariCurtainEntity* this) {
Entity* pEVar1 = super->child;
if (pEVar1) {
pEVar1->collisionLayer = 1;
pEVar1->spritePriority.b0 = 7;
UpdateSpriteForCollisionLayer(pEVar1);
}
}
void sub_08092214(GentariCurtainEntity* this) {
Entity* pEVar1 = super->child;
if (pEVar1) {
pEVar1->collisionLayer = 2;
pEVar1->spritePriority.b0 = 4;
UpdateSpriteForCollisionLayer(pEVar1);
}
}
void sub_0809223C(GentariCurtainEntity* this) {
super->collisionLayer = 2;
super->spritePriority.b0 = 3;
UpdateSpriteForCollisionLayer(super);
}
|