mirror of https://github.com/zeldaret/tmc.git
78 lines
2.7 KiB
C
78 lines
2.7 KiB
C
#ifndef OCTOROKBOSS_H
|
|
#define OCTOROKBOSS_H
|
|
|
|
#include "enemy.h"
|
|
|
|
typedef struct OctorokBossEntity OctorokBossEntity;
|
|
typedef struct {
|
|
/*0x00*/ u8 unk_0; // [0,1,2,4] is later stored in super->subtimer
|
|
/*0x01*/ u8 tailCount;
|
|
/*0x02*/ u8 field_0x2; // [0,1]
|
|
/*0x03*/ u8 targetAngle; // relates to this->field_0x7a.HALF.HI
|
|
/*0x04*/ u8 rotation; // [0,1,0xff]
|
|
/*0x05*/ u8 phase4PrevAttackPattern; // [0-4], sets this->phase4AttackPattern
|
|
/*0x06*/ u8 fallingStonesTimer;
|
|
/*0x07*/ u8 field_0x7; // some sort of counter that is only set when hit for the first time?
|
|
/*0x08*/ OctorokBossEntity* mouthObject;
|
|
/*0x0c*/ OctorokBossEntity* tailObjects[5];
|
|
/*0x20*/ OctorokBossEntity* legObjects[4];
|
|
} OctorokBossHeap;
|
|
static_assert(sizeof(OctorokBossHeap) == 0x30);
|
|
|
|
struct OctorokBossEntity {
|
|
/*0x00*/ Entity base;
|
|
/*0x68*/ union SplitHWord field_0x68;
|
|
/*0x6a*/ union SplitHWord field_0x6a;
|
|
/*0x6c*/ union SplitHWord field_0x6c;
|
|
/*0x6e*/ union SplitHWord field_0x6e;
|
|
/*0x70*/ union SplitWord field_0x70;
|
|
/*0x74*/ u16 unk_74;
|
|
/*0x76*/ u16 unk_76;
|
|
/*0x78*/ u8 attackWaitTurns; /**< Turns until the next attack */
|
|
/*0x79*/ u8 timer; /**< Reused timer */
|
|
/*0x7a*/ union SplitHWord angle; /**< Angle of legs */
|
|
/*0x7c*/ u8 bossPhase; /**< Boss Phase
|
|
0: unfrozen
|
|
1: frozen 1
|
|
2: unfrozen
|
|
3: frozen 2
|
|
4: unfrozen -> death */
|
|
/*0x7d*/ u8 currentAttack;
|
|
/*0x7e*/ u8 nextAttackIndex;
|
|
/*0x7f*/ u8 unk_7f;
|
|
/*0x80*/ u8 unk_80;
|
|
/*0x81*/ u8 phase4AttackPattern; /**< Which attack pattern is currently used in phase 4 */
|
|
/*0x82*/ union SplitHWord angularSpeed;
|
|
/*0x84*/ OctorokBossHeap* heap; /**< Heap data allocated with #zMalloc. */
|
|
};
|
|
|
|
enum OctorokRotation { ROTATION_CW, ROTATION_CCW, NO_ROTATION = 0xff };
|
|
|
|
enum OctorokBossPart { WHOLE, LEG_BR, LEG_FR, LEG_FL, LEG_BL, MOUTH, TAIL_END, TAIL };
|
|
enum OctorokBossAction {
|
|
INIT, // 0
|
|
ACTION1, // 1
|
|
HIT, // 2
|
|
INTRO, // 3
|
|
BURNING, // 4
|
|
};
|
|
|
|
enum OctorokBossAttack {
|
|
ATTACK_SPITROCK, // 0
|
|
ATTACK_VACUUM, // 1
|
|
ATTACK_SMOKE, // 2
|
|
ATTACK_FREEZE, // 3
|
|
NO_ATTACK, // 4
|
|
END_OF_ATTACK_PATTERN // 5
|
|
};
|
|
|
|
enum OctorokBossAction1SubAction {
|
|
ACTION1_AIMTOWARDSPLAYER, // Moving around with step sounds
|
|
ACTION1_WAITFORTURN, // Also step sounds
|
|
ACTION1_SUBACTION2, // Step sounds, some kind of attack that is started in OctorokBoss_StartRegularAttack?
|
|
ACTION1_WAITFORATTACK, // Wait for GET_TIMER(), then OctorokBoss_SetWaitTurnsForNextAttack
|
|
ACTION1_ATTACK, // Attack
|
|
};
|
|
|
|
#endif // OCTOROKBOSS_H
|