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
|
/**
* @file linkAnimation.c
* @ingroup Objects
*
* @brief Link Animation object. This is used during "item get" sequences and
* replaces the player entity for the duration.
*/
#include "message.h"
#include "object.h"
#include "physics.h"
#include "player.h"
#include "object/linkAnimation.h"
#include "item.h"
#include "pauseMenu.h"
typedef enum {
ITEMGET_INIT,
ITEMGET_UPDATE,
ITEMGET_WAIT,
} ItemGetState;
void LinkAnimation_Init(LinkAnimationEntity*);
void LinkAnimation_Default(LinkAnimationEntity*);
void LinkAnimation_ItemGet(LinkAnimationEntity*);
void LinkAnimation(LinkAnimationEntity* this) {
static void (*const LinkAnimation_Actions[])(LinkAnimationEntity*) = {
LinkAnimation_Init, LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default,
LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default,
LinkAnimation_ItemGet, LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default,
LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default,
LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default,
LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default,
LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default,
LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default, LinkAnimation_Default,
};
LinkAnimation_Actions[super->action](this);
}
void LinkAnimation_Init(LinkAnimationEntity* this) {
super->action = PLAYER_ITEMGET;
LinkAnimation_ItemGet(this);
}
void LinkAnimation_Default(LinkAnimationEntity* this) {
ResetPlayerEventPriority();
gPauseMenuOptions.disabled = 0;
DeleteThisEntity();
}
void LinkAnimation_ItemGet(LinkAnimationEntity* this) {
u32 one;
u32 sprite;
Entity* held_obj;
u8* ptr;
// hide player entity
gPlayerEntity.base.flags &= ~ENT_COLLIDE;
gPlayerEntity.base.spriteSettings.draw = 0;
super->palette.b.b0 = gPlayerEntity.base.palette.b.b0;
switch (super->subAction) {
case ITEMGET_INIT:
one = 1;
super->subAction = one;
super->spriteSettings.draw = one;
super->collisionLayer = gPlayerEntity.base.collisionLayer;
super->spritePriority.b0 = gPlayerEntity.base.spritePriority.b0;
super->spriteRendering.b3 = gPlayerEntity.base.spriteRendering.b3;
super->spriteOrientation.flipY = gPlayerEntity.base.spriteOrientation.flipY;
super->spriteSettings.flipX = 0;
super->animationState = 4;
SetEntityPriority(super, PRIO_PLAYER_EVENT);
if (gPlayerState.flags & PL_NO_CAP) {
if (IsMinishItem(super->type)) {
sprite = ANIM_GET_ITEM_SMALL_NOCAP;
} else {
sprite = ANIM_GET_ITEM_BIG_NOCAP;
}
} else {
if (IsMinishItem(super->type)) {
sprite = ANIM_GET_ITEM_SMALL;
} else {
sprite = ANIM_GET_ITEM_BIG;
}
}
super->spriteIndex = (sprite >> 8);
InitAnimationForceUpdate(super, sprite & 0xff);
break;
case ITEMGET_UPDATE:
UpdateAnimationSingleFrame(super);
if (super->frame != 0) {
super->subAction++;
}
break;
case ITEMGET_WAIT:
UpdateAnimationSingleFrame(super);
if ((gMessage.state & MESSAGE_ACTIVE) != 0) {
return;
}
if (super->frame & ANIM_DONE) {
super->action = PLAYER_NORMAL;
// restore player state
gPlayerEntity.base.flags = this->storeFlags;
gPlayerEntity.base.spriteSettings.draw = this->storeDrawFlags;
gPlayerEntity.base.iframes = this->storeIFrames;
gPlayerState.field_0x7 = this->storeField7;
gPlayerState.keepFacing = this->storeKeepFacing;
gPlayerState.field_0xa = this->storeFieldA;
gPlayerState.field_0x27[0] = this->storeField27;
gPlayerState.mobility = this->storeMobility;
gPlayerState.flags = this->storeStateFlags;
gPlayerState.field_0x8a = this->store8A;
}
break;
}
held_obj = super->parent;
if (held_obj != NULL) {
PositionEntityOnTop(super, held_obj);
ptr = GetSpriteSubEntryOffsetDataPointer((u16)super->spriteIndex, super->frameIndex);
held_obj->spriteOffsetX = ptr[0];
held_obj->spriteOffsetY = ptr[1];
}
}
|