Refresh 15

This commit is contained in:
n64
2021-10-14 15:25:30 -04:00
parent f9982e0ef5
commit 1372ae1bb7
383 changed files with 7001 additions and 5730 deletions
+3 -2
View File
@@ -2110,10 +2110,11 @@ void set_audio_muted(u8 muted) {
for (i = 0; i < SEQUENCE_PLAYERS; i++) {
#if defined(VERSION_EU) || defined(VERSION_SH)
if (muted)
if (muted) {
func_802ad74c(0xf1000000, 0);
else
} else {
func_802ad74c(0xf2000000, 0);
}
#else
gSequencePlayers[i].muted = muted;
#endif
+1 -2
View File
@@ -82,8 +82,7 @@ void unk_pools_init(u32 size1, u32 size2);
* Assuming 'k' in [9, 24],
* Computes a newton's method step for f(x) = x^k - d
*/
f64 root_newton_step(f64 x, s32 k, f64 d)
{
f64 root_newton_step(f64 x, s32 k, f64 d) {
f64 deg2 = x * x;
f64 deg4 = deg2 * deg2;
f64 deg8 = deg4 * deg4;
+7 -14
View File
@@ -15,8 +15,7 @@
#define IS_BANK_LOAD_COMPLETE(bankId) (gBankLoadStatus[bankId] >= SOUND_LOAD_STATUS_COMPLETE)
#define IS_SEQ_LOAD_COMPLETE(seqId) (gSeqLoadStatus[seqId] >= SOUND_LOAD_STATUS_COMPLETE)
struct SoundAllocPool
{
struct SoundAllocPool {
u8 *start;
u8 *cur;
u32 size;
@@ -34,15 +33,13 @@ struct SeqOrBankEntry {
#endif
}; // size = 0xC
struct PersistentPool
{
struct PersistentPool {
/*0x00*/ u32 numEntries;
/*0x04*/ struct SoundAllocPool pool;
/*0x14*/ struct SeqOrBankEntry entries[32];
}; // size = 0x194
struct TemporaryPool
{
struct TemporaryPool {
/*EU, SH*/
/*0x00, 0x00*/ u32 nextSide;
/*0x04, */ struct SoundAllocPool pool;
@@ -59,21 +56,18 @@ struct TemporaryPool
/*0x28, 0x2A entries[1].id */
}; // size = 0x2C
struct SoundMultiPool
{
struct SoundMultiPool {
/*0x000*/ struct PersistentPool persistent;
/*0x194*/ struct TemporaryPool temporary;
/* */ u32 pad2[4];
}; // size = 0x1D0
struct Unk1Pool
{
struct Unk1Pool {
struct SoundAllocPool pool;
struct SeqOrBankEntry entries[32];
};
struct UnkEntry
{
struct UnkEntry {
s8 used;
s8 medium;
s8 bankId;
@@ -83,8 +77,7 @@ struct UnkEntry
u32 size;
};
struct UnkPool
{
struct UnkPool {
/*0x00*/ struct SoundAllocPool pool;
/*0x10*/ struct UnkEntry entries[64];
/*0x510*/ s32 numEntries;
+26 -52
View File
@@ -93,8 +93,7 @@
struct NotePool;
struct AudioListItem
{
struct AudioListItem {
// A node in a circularly linked list. Each node is either a head or an item:
// - Items can be either detached (prev = NULL), or attached to a list.
// 'value' points to something of interest.
@@ -111,8 +110,7 @@ struct AudioListItem
struct NotePool *pool;
}; // size = 0x10
struct NotePool
{
struct NotePool {
struct AudioListItem disabled;
struct AudioListItem decaying;
struct AudioListItem releasing;
@@ -154,8 +152,7 @@ struct AdsrEnvelope {
s16 arg;
}; // size = 0x4
struct AdpcmLoop
{
struct AdpcmLoop {
u32 start;
u32 end;
u32 count;
@@ -163,15 +160,13 @@ struct AdpcmLoop
s16 state[16]; // only exists if count != 0. 8-byte aligned
};
struct AdpcmBook
{
struct AdpcmBook {
s32 order;
s32 npredictors;
s16 book[1]; // size 8 * order * npredictors. 8-byte aligned
};
struct AudioBankSample
{
struct AudioBankSample {
#ifdef VERSION_SH
/* 0x00 */ u32 codec : 4;
/* 0x00 */ u32 medium : 2;
@@ -190,14 +185,12 @@ struct AudioBankSample
#endif
};
struct AudioBankSound
{
struct AudioBankSound {
struct AudioBankSample *sample;
f32 tuning; // frequency scale factor
}; // size = 0x8
struct Instrument
{
struct Instrument {
/*0x00*/ u8 loaded;
/*0x01*/ u8 normalRangeLo;
/*0x02*/ u8 normalRangeHi;
@@ -208,8 +201,7 @@ struct Instrument
/*0x18*/ struct AudioBankSound highNotesSound;
}; // size = 0x20
struct Drum
{
struct Drum {
u8 releaseRate;
u8 pan;
u8 loaded;
@@ -217,14 +209,12 @@ struct Drum
struct AdsrEnvelope *envelope;
};
struct AudioBank
{
struct AudioBank {
struct Drum **drums;
struct Instrument *instruments[1];
}; // dynamic size
struct CtlEntry
{
struct CtlEntry {
#ifndef VERSION_SH
u8 unused;
#endif
@@ -246,8 +236,7 @@ struct M64ScriptState {
}; // size = 0x1C
// Also known as a Group, according to debug strings.
struct SequencePlayer
{
struct SequencePlayer {
/*US/JP, EU, SH */
#if defined(VERSION_EU) || defined(VERSION_SH)
/*0x000, 0x000, 0x000*/ u8 enabled : 1;
@@ -325,8 +314,7 @@ struct SequencePlayer
/*0x13C, 0x144*/ ssize_t bankDmaRemaining;
}; // size = 0x140, 0x148 on EU, 0x14C on SH
struct AdsrSettings
{
struct AdsrSettings {
u8 releaseRate;
#if defined(VERSION_EU) || defined(VERSION_SH)
u8 sustain;
@@ -388,8 +376,7 @@ struct ReverbInfo {
s16 *filter;
};
struct NoteAttributes
{
struct NoteAttributes {
u8 reverbVol;
#ifdef VERSION_SH
u8 synthesisVolume; // UQ4.4, although 0 <= x < 1 is rounded up to 1
@@ -412,8 +399,7 @@ struct NoteAttributes
// Also known as a SubTrack, according to debug strings.
// Confusingly, a SubTrack is a container of Tracks.
struct SequenceChannel
{
struct SequenceChannel {
/* U/J, EU, SH */
/*0x00, 0x00*/ u8 enabled : 1;
/*0x00, 0x00*/ u8 finished : 1;
@@ -495,8 +481,7 @@ struct SequenceChannel
}; // size = 0xC0, 0xC4 in EU, 0xD0 in SH
// Also known as a Track, according to debug strings.
struct SequenceChannelLayer
{
struct SequenceChannelLayer {
/* U/J, EU, SH */
/*0x00, 0x00*/ u8 enabled : 1;
/*0x00, 0x00*/ u8 finished : 1;
@@ -554,8 +539,7 @@ struct SequenceChannelLayer
}; // size = 0x80
#if defined(VERSION_EU) || defined(VERSION_SH)
struct NoteSynthesisState
{
struct NoteSynthesisState {
/*0x00*/ u8 restart;
/*0x01*/ u8 sampleDmaIndex;
/*0x02*/ u8 prevHeadsetPanRight;
@@ -570,8 +554,7 @@ struct NoteSynthesisState
/*0x10*/ s16 curVolLeft; // UQ0.16 (EU Q1.15)
/*0x12*/ s16 curVolRight; // UQ0.16 (EU Q1.15)
};
struct NotePlaybackState
{
struct NotePlaybackState {
/* U/J, EU, SH */
/*0x04, 0x00, 0x00*/ u8 priority;
/* 0x01, 0x01*/ u8 waveId;
@@ -591,8 +574,7 @@ struct NotePlaybackState
/*0x74, 0x4C, */ struct Portamento portamento;
/*0x84, 0x5C, */ struct VibratoState vibratoState;
};
struct NoteSubEu
{
struct NoteSubEu {
/*0x00*/ volatile u8 enabled : 1;
/*0x00*/ u8 needsInit : 1;
/*0x00*/ u8 finished : 1;
@@ -624,8 +606,7 @@ struct NoteSubEu
/*0x10*/ s16 *filter;
#endif
};
struct Note
{
struct Note {
/* U/J, EU, SH */
/*0xA4, 0x00, 0x00*/ struct AudioListItem listItem;
/* 0x10, 0x10*/ struct NoteSynthesisState synthesisState;
@@ -660,14 +641,12 @@ struct Note
}; // size = 0xC0, known to be 0xC8 on SH
#else
// volatile Note, needed in synthesis_process_notes
struct vNote
{
struct vNote {
/* U/J, EU */
/*0x00*/ volatile u8 enabled : 1;
long long int force_structure_alignment;
}; // size = 0xC0
struct Note
{
struct Note {
/* U/J, EU */
/*0x00*/ u8 enabled : 1;
/*0x00*/ u8 needsInit : 1;
@@ -717,8 +696,7 @@ struct Note
}; // size = 0xC0
#endif
struct NoteSynthesisBuffers
{
struct NoteSynthesisBuffers {
s16 adpcmdecState[0x10];
s16 finalResampleState[0x10];
#ifdef VERSION_SH
@@ -737,15 +715,13 @@ struct NoteSynthesisBuffers
};
#ifdef VERSION_EU
struct ReverbSettingsEU
{
struct ReverbSettingsEU {
u8 downsampleRate;
u8 windowSize; // To be multiplied by 64
u16 gain;
};
#else
struct ReverbSettingsEU
{
struct ReverbSettingsEU {
u8 downsampleRate; // always 1
u8 windowSize; // To be multiplied by 16
u16 gain;
@@ -758,8 +734,7 @@ struct ReverbSettingsEU
};
#endif
struct AudioSessionSettingsEU
{
struct AudioSessionSettingsEU {
/* 0x00 */ u32 frequency;
/* 0x04 */ u8 unk1; // always 1
/* 0x05 */ u8 maxSimultaneousNotes;
@@ -782,8 +757,7 @@ struct AudioSessionSettingsEU
#endif
}; // 0x30 on shindou
struct AudioSessionSettings
{
struct AudioSessionSettings {
/*0x00*/ u32 frequency;
/*0x04*/ u8 maxSimultaneousNotes;
/*0x05*/ u8 reverbDownsampleRate; // always 1
+2 -1
View File
@@ -974,7 +974,8 @@ void audio_init() {
#endif
#ifdef TARGET_N64
eu_stubbed_printf_3("Clear Workarea %x -%x size %x \n",
eu_stubbed_printf_3(
"Clear Workarea %x -%x size %x \n",
(uintptr_t) &gAudioGlobalsStartMarker,
(uintptr_t) &gAudioGlobalsEndMarker,
(uintptr_t) &gAudioGlobalsEndMarker - (uintptr_t) &gAudioGlobalsStartMarker
+5 -6
View File
@@ -254,8 +254,7 @@ void init_sample_dma_buffers(UNUSED s32 arg0) {
sSampleDmas = sound_alloc_uninitialized(&gNotesAndBuffersPool,
gMaxSimultaneousNotes * 4 * sizeof(struct SharedDma) * gAudioBufferParameters.presetUnk4);
for (i = 0; i < gMaxSimultaneousNotes * 3 * gAudioBufferParameters.presetUnk4; i++)
{
for (i = 0; i < gMaxSimultaneousNotes * 3 * gAudioBufferParameters.presetUnk4; i++) {
if ((sSampleDmas[gSampleDmaNumListItems].buffer = sound_alloc_uninitialized(&gNotesAndBuffersPool, sDmaBufSize)) == NULL) {
break;
}
@@ -622,8 +621,7 @@ void *func_sh_802f3764(s32 poolIdx, s32 idx, s32 *arg2) {
devAddr = f->seqArray[idx].offset;
switch (sp18)
{
switch (sp18) {
case 0:
vAddr = unk_pool1_alloc(poolIdx, idx, size);
if (vAddr == NULL) {
@@ -1033,7 +1031,8 @@ void audio_init() {
port_eu_init();
#ifdef TARGET_N64
eu_stubbed_printf_3("Clear Workarea %x -%x size %x \n",
eu_stubbed_printf_3(
"Clear Workarea %x -%x size %x \n",
(uintptr_t) &gAudioGlobalsStartMarker,
(uintptr_t) &gAudioGlobalsEndMarker,
(uintptr_t) &gAudioGlobalsEndMarker - (uintptr_t) &gAudioGlobalsStartMarker
@@ -1544,7 +1543,7 @@ s32 func_sh_802f573c(s32 audioResetStatus) {
if (D_SH_8034F68C > 0) {
if (audioResetStatus != 0) {
if (osRecvMesg(&gUnkQueue2, (OSMesg *) &idx, OS_MESG_NOBLOCK)){
if (osRecvMesg(&gUnkQueue2, (OSMesg *) &idx, OS_MESG_NOBLOCK)) {
}
D_SH_8034F68C = 0;
return 0;
+73 -74
View File
@@ -134,44 +134,44 @@ void eu_process_audio_cmd(struct EuAudioCmd *cmd) {
s32 i;
switch (cmd->u.s.op) {
case 0x81:
preload_sequence(cmd->u.s.arg2, 3);
break;
case 0x81:
preload_sequence(cmd->u.s.arg2, 3);
break;
case 0x82:
case 0x88:
load_sequence(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
func_8031D690(cmd->u.s.arg1, cmd->u2.as_s32);
break;
case 0x82:
case 0x88:
load_sequence(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
func_8031D690(cmd->u.s.arg1, cmd->u2.as_s32);
break;
case 0x83:
if (gSequencePlayers[cmd->u.s.arg1].enabled != FALSE) {
if (cmd->u2.as_s32 == 0) {
sequence_player_disable(&gSequencePlayers[cmd->u.s.arg1]);
case 0x83:
if (gSequencePlayers[cmd->u.s.arg1].enabled != FALSE) {
if (cmd->u2.as_s32 == 0) {
sequence_player_disable(&gSequencePlayers[cmd->u.s.arg1]);
}
else {
seq_player_fade_to_zero_volume(cmd->u.s.arg1, cmd->u2.as_s32);
}
}
else {
seq_player_fade_to_zero_volume(cmd->u.s.arg1, cmd->u2.as_s32);
break;
case 0xf0:
gSoundMode = cmd->u2.as_s32;
break;
case 0xf1:
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = TRUE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
}
break;
break;
case 0xf0:
gSoundMode = cmd->u2.as_s32;
break;
case 0xf1:
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = TRUE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
break;
case 0xf2:
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = FALSE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
break;
case 0xf2:
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = FALSE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
break;
}
}
@@ -259,55 +259,54 @@ void func_802ad7ec(u32 arg0) {
}
else if ((cmd->u.s.op & 0x40) != 0) {
switch (cmd->u.s.op) {
case 0x41:
seqPlayer->fadeVolumeScale = cmd->u2.as_f32;
seqPlayer->recalculateVolume = TRUE;
break;
case 0x41:
seqPlayer->fadeVolumeScale = cmd->u2.as_f32;
seqPlayer->recalculateVolume = TRUE;
break;
case 0x47:
seqPlayer->tempo = cmd->u2.as_s32 * TATUMS_PER_BEAT;
break;
case 0x47:
seqPlayer->tempo = cmd->u2.as_s32 * TATUMS_PER_BEAT;
break;
case 0x48:
seqPlayer->transposition = cmd->u2.as_s8;
break;
case 0x48:
seqPlayer->transposition = cmd->u2.as_s8;
break;
case 0x46:
seqPlayer->seqVariationEu[cmd->u.s.arg3] = cmd->u2.as_s8;
break;
case 0x46:
seqPlayer->seqVariationEu[cmd->u.s.arg3] = cmd->u2.as_s8;
break;
}
}
else if (seqPlayer->enabled != FALSE && cmd->u.s.arg2 < 0x10) {
chan = seqPlayer->channels[cmd->u.s.arg2];
if (IS_SEQUENCE_CHANNEL_VALID(chan))
{
if (IS_SEQUENCE_CHANNEL_VALID(chan)) {
switch (cmd->u.s.op) {
case 1:
chan->volumeScale = cmd->u2.as_f32;
chan->changes.as_bitfields.volume = TRUE;
break;
case 2:
chan->volume = cmd->u2.as_f32;
chan->changes.as_bitfields.volume = TRUE;
break;
case 3:
chan->newPan = cmd->u2.as_s8;
chan->changes.as_bitfields.pan = TRUE;
break;
case 4:
chan->freqScale = cmd->u2.as_f32;
chan->changes.as_bitfields.freqScale = TRUE;
break;
case 5:
chan->reverbVol = cmd->u2.as_s8;
break;
case 6:
if (cmd->u.s.arg3 < 8) {
chan->soundScriptIO[cmd->u.s.arg3] = cmd->u2.as_s8;
}
break;
case 8:
chan->stopSomething2 = cmd->u2.as_s8;
case 1:
chan->volumeScale = cmd->u2.as_f32;
chan->changes.as_bitfields.volume = TRUE;
break;
case 2:
chan->volume = cmd->u2.as_f32;
chan->changes.as_bitfields.volume = TRUE;
break;
case 3:
chan->newPan = cmd->u2.as_s8;
chan->changes.as_bitfields.pan = TRUE;
break;
case 4:
chan->freqScale = cmd->u2.as_f32;
chan->changes.as_bitfields.freqScale = TRUE;
break;
case 5:
chan->reverbVol = cmd->u2.as_s8;
break;
case 6:
if (cmd->u.s.arg3 < 8) {
chan->soundScriptIO[cmd->u.s.arg3] = cmd->u2.as_s8;
}
break;
case 8:
chan->stopSomething2 = cmd->u2.as_s8;
}
}
}
+115 -116
View File
@@ -152,74 +152,74 @@ void eu_process_audio_cmd(struct EuAudioCmd *cmd) {
struct NoteSubEu *sub;
switch (cmd->u.s.op) {
case 0x81:
preload_sequence(cmd->u.s.arg2, 3);
break;
case 0x81:
preload_sequence(cmd->u.s.arg2, 3);
break;
case 0x82:
case 0x88:
load_sequence(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
func_8031D690(cmd->u.s.arg1, cmd->u2.as_s32);
break;
case 0x82:
case 0x88:
load_sequence(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
func_8031D690(cmd->u.s.arg1, cmd->u2.as_s32);
break;
case 0x83:
if (gSequencePlayers[cmd->u.s.arg1].enabled != FALSE) {
if (cmd->u2.as_s32 == 0) {
sequence_player_disable(&gSequencePlayers[cmd->u.s.arg1]);
case 0x83:
if (gSequencePlayers[cmd->u.s.arg1].enabled != FALSE) {
if (cmd->u2.as_s32 == 0) {
sequence_player_disable(&gSequencePlayers[cmd->u.s.arg1]);
}
else {
seq_player_fade_to_zero_volume(cmd->u.s.arg1, cmd->u2.as_s32);
}
}
else {
seq_player_fade_to_zero_volume(cmd->u.s.arg1, cmd->u2.as_s32);
break;
case 0x84:
break;
case 0xf0:
gSoundMode = cmd->u2.as_s32;
break;
case 0xf1:
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = TRUE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
}
break;
break;
case 0x84:
break;
case 0xf0:
gSoundMode = cmd->u2.as_s32;
break;
case 0xf1:
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = TRUE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
break;
case 0xf2:
if (cmd->u2.as_s32 == 1) {
for (i = 0; i < gMaxSimultaneousNotes; i++) {
note = &gNotes[i];
sub = &note->noteSubEu;
if (note->noteSubEu.enabled && note->unkSH34 == 0) {
if ((note->parentLayer->seqChannel->muteBehavior & 8) != 0) {
sub->finished = TRUE;
case 0xf2:
if (cmd->u2.as_s32 == 1) {
for (i = 0; i < gMaxSimultaneousNotes; i++) {
note = &gNotes[i];
sub = &note->noteSubEu;
if (note->noteSubEu.enabled && note->unkSH34 == 0) {
if ((note->parentLayer->seqChannel->muteBehavior & 8) != 0) {
sub->finished = TRUE;
}
}
}
}
}
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = FALSE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
break;
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = FALSE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
break;
case 0xf3:
func_sh_802f3024(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
break;
case 0xf3:
func_sh_802f3024(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
break;
case 0xf4:
func_sh_802f30f4(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3, &gUnkQueue1);
break;
case 0xf4:
func_sh_802f30f4(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3, &gUnkQueue1);
break;
case 0xf5:
func_sh_802f3158(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3, &gUnkQueue1);
break;
case 0xf5:
func_sh_802f3158(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3, &gUnkQueue1);
break;
case 0xf6:
func_sh_802f3288(cmd->u.s.arg2);
break;
case 0xf6:
func_sh_802f3288(cmd->u.s.arg2);
break;
}
}
@@ -344,75 +344,74 @@ void func_802ad7ec(u32 arg0) {
}
else if ((cmd->u.s.op & 0x40) != 0) {
switch (cmd->u.s.op) {
case 0x41:
if (seqPlayer->fadeVolumeScale != cmd->u2.as_f32) {
seqPlayer->fadeVolumeScale = cmd->u2.as_f32;
seqPlayer->recalculateVolume = TRUE;
}
break;
case 0x41:
if (seqPlayer->fadeVolumeScale != cmd->u2.as_f32) {
seqPlayer->fadeVolumeScale = cmd->u2.as_f32;
seqPlayer->recalculateVolume = TRUE;
}
break;
case 0x47:
seqPlayer->tempo = cmd->u2.as_s32 * TATUMS_PER_BEAT;
break;
case 0x47:
seqPlayer->tempo = cmd->u2.as_s32 * TATUMS_PER_BEAT;
break;
case 0x49:
seqPlayer->tempoAdd = cmd->u2.as_s32 * TEMPO_SCALE;
break;
case 0x49:
seqPlayer->tempoAdd = cmd->u2.as_s32 * TEMPO_SCALE;
break;
case 0x48:
seqPlayer->transposition = cmd->u2.as_s8;
break;
case 0x48:
seqPlayer->transposition = cmd->u2.as_s8;
break;
case 0x46:
seqPlayer->seqVariationEu[cmd->u.s.arg3] = cmd->u2.as_s8;
break;
case 0x46:
seqPlayer->seqVariationEu[cmd->u.s.arg3] = cmd->u2.as_s8;
break;
}
}
else if (seqPlayer->enabled != FALSE && cmd->u.s.arg2 < 0x10) {
chan = seqPlayer->channels[cmd->u.s.arg2];
if (IS_SEQUENCE_CHANNEL_VALID(chan))
{
if (IS_SEQUENCE_CHANNEL_VALID(chan)) {
switch (cmd->u.s.op) {
case 1:
if (chan->volumeScale != cmd->u2.as_f32) {
chan->volumeScale = cmd->u2.as_f32;
chan->changes.as_bitfields.volume = TRUE;
}
break;
case 2:
if (chan->volume != cmd->u2.as_f32) {
chan->volume = cmd->u2.as_f32;
chan->changes.as_bitfields.volume = TRUE;
}
break;
case 3:
if (chan->newPan != cmd->u2.as_s8) {
chan->newPan = cmd->u2.as_s8;
chan->changes.as_bitfields.pan = TRUE;
}
break;
case 4:
if (chan->freqScale != cmd->u2.as_f32) {
chan->freqScale = cmd->u2.as_f32;
chan->changes.as_bitfields.freqScale = TRUE;
}
break;
case 5:
//! @bug u8 s8 comparison (but harmless)
if (chan->reverbVol != cmd->u2.as_s8) {
chan->reverbVol = cmd->u2.as_s8;
}
break;
case 6:
if (cmd->u.s.arg3 < 8) {
chan->soundScriptIO[cmd->u.s.arg3] = cmd->u2.as_s8;
}
break;
case 8:
chan->stopSomething2 = cmd->u2.as_s8;
break;
case 9:
chan->muteBehavior = cmd->u2.as_s8;
case 1:
if (chan->volumeScale != cmd->u2.as_f32) {
chan->volumeScale = cmd->u2.as_f32;
chan->changes.as_bitfields.volume = TRUE;
}
break;
case 2:
if (chan->volume != cmd->u2.as_f32) {
chan->volume = cmd->u2.as_f32;
chan->changes.as_bitfields.volume = TRUE;
}
break;
case 3:
if (chan->newPan != cmd->u2.as_s8) {
chan->newPan = cmd->u2.as_s8;
chan->changes.as_bitfields.pan = TRUE;
}
break;
case 4:
if (chan->freqScale != cmd->u2.as_f32) {
chan->freqScale = cmd->u2.as_f32;
chan->changes.as_bitfields.freqScale = TRUE;
}
break;
case 5:
//! @bug u8 s8 comparison (but harmless)
if (chan->reverbVol != cmd->u2.as_s8) {
chan->reverbVol = cmd->u2.as_s8;
}
break;
case 6:
if (cmd->u.s.arg3 < 8) {
chan->soundScriptIO[cmd->u.s.arg3] = cmd->u2.as_s8;
}
break;
case 8:
chan->stopSomething2 = cmd->u2.as_s8;
break;
case 9:
chan->muteBehavior = cmd->u2.as_s8;
}
}
}
+10 -19
View File
@@ -1390,8 +1390,7 @@ s32 seq_channel_layer_process_script_part3(struct SequenceChannelLayer *layer, s
layer->delay = sp3A;
layer->duration = layer->noteDuration * sp3A >> 8;
if ((seqPlayer->muted && (seqChannel->muteBehavior & 0x50) != 0)
|| seqChannel->stopSomething2)
{
|| seqChannel->stopSomething2) {
layer->stopSomething = TRUE;
return -1;
}
@@ -1404,8 +1403,7 @@ u8 get_instrument(struct SequenceChannel *seqChannel, u8 instId, struct Instrume
struct Instrument *inst;
#if defined(VERSION_EU) || defined(VERSION_SH)
inst = get_instrument_inner(seqChannel->bankId, instId);
if (inst == NULL)
{
if (inst == NULL) {
*instOut = NULL;
return 0;
}
@@ -1524,25 +1522,21 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) {
for (;;) {
cmd = m64_read_u8(state);
#if !defined(VERSION_EU) && !defined(VERSION_SH)
if (cmd == 0xff) // chan_end
{
if (cmd == 0xff) { // chan_end
if (state->depth == 0) {
sequence_channel_disable(seqChannel);
break;
}
state->depth--, state->pc = state->stack[state->depth];
}
if (cmd == 0xfe) // chan_delay1
{
if (cmd == 0xfe) { // chan_delay1
break;
}
if (cmd == 0xfd) // chan_delay
{
if (cmd == 0xfd) { // chan_delay
seqChannel->delay = m64_read_compressed_u16(state);
break;
}
if (cmd == 0xf3) // chan_hang
{
if (cmd == 0xf3) { // chan_hang
seqChannel->stopScript = TRUE;
break;
}
@@ -2362,8 +2356,7 @@ void sequence_player_process_sequence(struct SequencePlayer *seqPlayer) {
#endif
for (;;) {
cmd = m64_read_u8(state);
if (cmd == 0xff) // seq_end
{
if (cmd == 0xff) { // seq_end
if (state->depth == 0) {
sequence_player_disable(seqPlayer);
break;
@@ -2375,14 +2368,12 @@ void sequence_player_process_sequence(struct SequencePlayer *seqPlayer) {
#endif
}
if (cmd == 0xfd) // seq_delay
{
if (cmd == 0xfd) { // seq_delay
seqPlayer->delay = m64_read_compressed_u16(state);
break;
}
if (cmd == 0xfe) // seq_delay1
{
if (cmd == 0xfe) { // seq_delay1
seqPlayer->delay = 1;
break;
}
@@ -2502,7 +2493,7 @@ void sequence_player_process_sequence(struct SequencePlayer *seqPlayer) {
seqPlayer->tempo = gTempoInternalToExternal;
}
//if (cmd){}
//if (cmd) {}
if ((s16) seqPlayer->tempo <= 0) {
seqPlayer->tempo = 1;
+3 -6
View File
@@ -17,8 +17,7 @@
#define MAX_UPDATES_PER_FRAME 4
#endif
struct ReverbRingBufferItem
{
struct ReverbRingBufferItem {
s16 numSamplesAfterDownsampling;
s16 chunkLen; // never read
s16 *toDownsampleLeft;
@@ -28,8 +27,7 @@ struct ReverbRingBufferItem
s16 lengthB; // second length in ring buffer (from pos 0)
}; // size = 0x14
struct SynthesisReverb
{
struct SynthesisReverb {
/*0x00, 0x00, 0x00*/ u8 resampleFlags;
/*0x01, 0x01, 0x01*/ u8 useReverb;
/*0x02, 0x02, 0x02*/ u8 framesLeftToIgnore;
@@ -53,8 +51,7 @@ struct SynthesisReverb
/*0x08, 0x0C, 0x14*/ s32 nextRingBufferPos;
/*0x0C, 0x10, 0x18*/ s32 unkC; // never read
/*0x10, 0x14, 0x1C*/ s32 bufSizePerChannel;
struct
{
struct {
s16 *left;
s16 *right;
} ringBuffer;
-5
View File
@@ -40,8 +40,3 @@ ALIGNED8 u8 gAudioSPTaskYieldBuffer[OS_YIELD_AUDIO_SIZE];
#if !defined(F3DEX_GBI_SHARED) && !defined(VERSION_EU)
ALIGNED8 u8 gUnusedThread2Stack[0x1400];
#endif
+4 -4
View File
@@ -4,9 +4,9 @@
// 0x70800 bytes
#ifdef AVOID_UB
u16 gFrameBuffers[3][SCREEN_WIDTH * SCREEN_HEIGHT];
u16 gFramebuffers[3][SCREEN_WIDTH * SCREEN_HEIGHT];
#else
u16 gFrameBuffer0[SCREEN_WIDTH * SCREEN_HEIGHT];
u16 gFrameBuffer1[SCREEN_WIDTH * SCREEN_HEIGHT];
u16 gFrameBuffer2[SCREEN_WIDTH * SCREEN_HEIGHT];
u16 gFramebuffer0[SCREEN_WIDTH * SCREEN_HEIGHT];
u16 gFramebuffer1[SCREEN_WIDTH * SCREEN_HEIGHT];
u16 gFramebuffer2[SCREEN_WIDTH * SCREEN_HEIGHT];
#endif
+7 -7
View File
@@ -9,14 +9,14 @@
// -g codegen implies that they are separate variables. This is impossible to
// reconcile without undefined behavior. Avoid that when possible.
#ifdef AVOID_UB
extern u16 gFrameBuffers[3][SCREEN_WIDTH * SCREEN_HEIGHT];
#define gFrameBuffer0 gFrameBuffers[0]
#define gFrameBuffer1 gFrameBuffers[1]
#define gFrameBuffer2 gFrameBuffers[2]
extern u16 gFramebuffers[3][SCREEN_WIDTH * SCREEN_HEIGHT];
#define gFramebuffer0 gFramebuffers[0]
#define gFramebuffer1 gFramebuffers[1]
#define gFramebuffer2 gFramebuffers[2]
#else
extern u16 gFrameBuffer0[SCREEN_WIDTH * SCREEN_HEIGHT];
extern u16 gFrameBuffer1[SCREEN_WIDTH * SCREEN_HEIGHT];
extern u16 gFrameBuffer2[SCREEN_WIDTH * SCREEN_HEIGHT];
extern u16 gFramebuffer0[SCREEN_WIDTH * SCREEN_HEIGHT];
extern u16 gFramebuffer1[SCREEN_WIDTH * SCREEN_HEIGHT];
extern u16 gFramebuffer2[SCREEN_WIDTH * SCREEN_HEIGHT];
#endif
#endif // FRAMEBUFFERS_H
+1 -1
View File
@@ -904,7 +904,7 @@ static BhvCommandProc BehaviorCmdTable[] = {
// Execute the behavior script of the current object, process the object flags, and other miscellaneous code for updating objects.
void cur_obj_update(void) {
UNUSED u32 unused;
UNUSED u8 filler[4];
s16 objFlags = gCurrentObject->oFlags;
f32 distanceFromMario;
+1 -1
View File
@@ -293,7 +293,7 @@ void geo_layout_cmd_nop3(void) {
}
/*
0x0C: Create zbuffer-toggling scene graph node
0x0C: Create z-buffer-toggling scene graph node
cmd+0x01: u8 enableZBuffer (1 = on, 0 = off)
*/
void geo_layout_cmd_node_master_list(void) {
+3 -5
View File
@@ -719,7 +719,7 @@ void geo_obj_init_spawninfo(struct GraphNodeObject *graphNode, struct SpawnInfo
graphNode->areaIndex = spawn->areaIndex;
graphNode->activeAreaIndex = spawn->activeAreaIndex;
graphNode->sharedChild = spawn->unk18;
graphNode->sharedChild = spawn->model;
graphNode->unk4C = spawn;
graphNode->throwMatrix = NULL;
graphNode->animInfo.curAnim = 0;
@@ -791,9 +791,7 @@ s32 retrieve_animation_index(s32 frame, u16 **attributes) {
*/
s16 geo_update_animation_frame(struct AnimInfo *obj, s32 *accelAssist) {
s32 result;
struct Animation *anim;
anim = obj->curAnim;
struct Animation *anim = obj->curAnim;
if (obj->animTimer == gAreaUpdateCounter || anim->flags & ANIM_FLAG_2) {
if (accelAssist != NULL) {
@@ -804,7 +802,7 @@ s16 geo_update_animation_frame(struct AnimInfo *obj, s32 *accelAssist) {
}
if (anim->flags & ANIM_FLAG_FORWARD) {
if (obj->animAccel) {
if (obj->animAccel != 0) {
result = obj->animFrameAccelAssist - obj->animAccel;
} else {
result = (obj->animFrame - 1) << 16;
+26 -49
View File
@@ -68,16 +68,14 @@ typedef Gfx *(*GraphNodeFunc)(s32 callContext, struct GraphNode *node, void *con
* Many graph node types have an update function that gets called
* when they are processed.
*/
struct FnGraphNode
{
struct FnGraphNode {
/*0x00*/ struct GraphNode node;
/*0x14*/ GraphNodeFunc func;
};
/** The very root of the geo tree. Specifies the viewport.
*/
struct GraphNodeRoot
{
struct GraphNodeRoot {
/*0x00*/ struct GraphNode node;
/*0x14*/ u8 areaIndex;
/*0x15*/ s8 unk15; // ?
@@ -92,8 +90,7 @@ struct GraphNodeRoot
/** A node that sets up an orthographic projection based on the global
* root node. Used to draw the skybox image.
*/
struct GraphNodeOrthoProjection
{
struct GraphNodeOrthoProjection {
/*0x00*/ struct GraphNode node;
/*0x14*/ f32 scale;
};
@@ -102,8 +99,7 @@ struct GraphNodeOrthoProjection
* game world. It does not set up the camera position, that is done by
* the child of this node, which has type GraphNodeCamera.
*/
struct GraphNodePerspective
{
struct GraphNodePerspective {
/*0x00*/ struct FnGraphNode fnNode;
/*0x18*/ s32 unused;
/*0x1C*/ f32 fov; // horizontal field of view in degrees
@@ -114,8 +110,7 @@ struct GraphNodePerspective
/** An entry in the master list. It is a linked list of display lists
* carrying a transformation matrix.
*/
struct DisplayListNode
{
struct DisplayListNode {
Mtx *transform;
void *displayList;
struct DisplayListNode *next;
@@ -126,8 +121,7 @@ struct DisplayListNode
* different master list than opaque objects.
* It also sets the z-buffer on before rendering and off after.
*/
struct GraphNodeMasterList
{
struct GraphNodeMasterList {
/*0x00*/ struct GraphNode node;
/*0x14*/ struct DisplayListNode *listHeads[GFX_NUM_MASTER_LISTS];
/*0x34*/ struct DisplayListNode *listTails[GFX_NUM_MASTER_LISTS];
@@ -136,8 +130,7 @@ struct GraphNodeMasterList
/** Simply used as a parent to group multiple children.
* Does not have any additional functionality.
*/
struct GraphNodeStart
{
struct GraphNodeStart {
/*0x00*/ struct GraphNode node;
};
@@ -147,8 +140,7 @@ struct GraphNodeStart
* Usage examples: Mario has three level's of detail: Normal, low-poly arms only, and fully low-poly
* The tower in Whomp's fortress has two levels of detail.
*/
struct GraphNodeLevelOfDetail
{
struct GraphNodeLevelOfDetail {
/*0x00*/ struct GraphNode node;
/*0x14*/ s16 minDistance;
/*0x16*/ s16 maxDistance;
@@ -159,8 +151,7 @@ struct GraphNodeLevelOfDetail
* which is set in the node's function.
* Usage examples: room visibility, coin animation, blinking, Mario's power-up / hand pose / cap
*/
struct GraphNodeSwitchCase
{
struct GraphNodeSwitchCase {
/*0x00*/ struct FnGraphNode fnNode;
/*0x18*/ s32 unused;
/*0x1C*/ s16 numCases;
@@ -171,8 +162,7 @@ struct GraphNodeSwitchCase
* GraphNode that specifies the location and aim of the camera.
* When the roll is 0, the up vector is (0, 1, 0).
*/
struct GraphNodeCamera
{
struct GraphNodeCamera {
/*0x00*/ struct FnGraphNode fnNode;
/*0x18*/ union {
// When the node is created, a mode is assigned to the node.
@@ -195,8 +185,7 @@ struct GraphNodeCamera
* based on the ENEMYINFO array.
* The display list can be null, in which case it won't draw anything itself.
*/
struct GraphNodeTranslationRotation
{
struct GraphNodeTranslationRotation {
/*0x00*/ struct GraphNode node;
/*0x14*/ void *displayList;
/*0x18*/ Vec3s translation;
@@ -207,12 +196,11 @@ struct GraphNodeTranslationRotation
* Usage example: SUPER MARIO logo letters in debug level select.
* The display list can be null, in which case it won't draw anything itself.
*/
struct GraphNodeTranslation
{
struct GraphNodeTranslation {
/*0x00*/ struct GraphNode node;
/*0x14*/ void *displayList;
/*0x18*/ Vec3s translation;
u8 pad1E[2];
u8 filler[2];
};
/** GraphNode that rotates itself and its children.
@@ -220,12 +208,11 @@ struct GraphNodeTranslation
* set by a parent script node in that case.
* The display list can be null, in which case it won't draw anything itself.
*/
struct GraphNodeRotation
{
struct GraphNodeRotation {
/*0x00*/ struct GraphNode node;
/*0x14*/ void *displayList;
/*0x18*/ Vec3s rotation;
u8 pad1E[2];
u8 filler[2];
};
/** GraphNode part that transforms itself and its children based on animation
@@ -235,8 +222,7 @@ struct GraphNodeRotation
* Used for Mario, enemies and anything else with animation data.
* The display list can be null, in which case it won't draw anything itself.
*/
struct GraphNodeAnimatedPart
{
struct GraphNodeAnimatedPart {
/*0x00*/ struct GraphNode node;
/*0x14*/ void *displayList;
/*0x18*/ Vec3s translation;
@@ -247,8 +233,7 @@ struct GraphNodeAnimatedPart
* then it simply sets the billboard flag for the entire object, this node is
* used for billboard parts (like a chuckya or goomba body).
*/
struct GraphNodeBillboard
{
struct GraphNodeBillboard {
/*0x00*/ struct GraphNode node;
/*0x14*/ void *displayList;
/*0x18*/ Vec3s translation;
@@ -257,8 +242,7 @@ struct GraphNodeBillboard
/** A GraphNode that simply draws a display list without doing any
* transformation beforehand. It does inherit the parent's transformation.
*/
struct GraphNodeDisplayList
{
struct GraphNodeDisplayList {
/*0x00*/ struct GraphNode node;
/*0x14*/ void *displayList;
};
@@ -271,8 +255,7 @@ struct GraphNodeDisplayList
* There is also a level command that scales the entire level, used for THI.
* The display list can be null, in which case it won't draw anything itself.
*/
struct GraphNodeScale
{
struct GraphNodeScale {
/*0x00*/ struct GraphNode node;
/*0x14*/ void *displayList;
/*0x18*/ f32 scale;
@@ -283,8 +266,7 @@ struct GraphNodeScale
* The shadow type determines the shape (round or rectangular), vertices (4 or 9)
* and other features.
*/
struct GraphNodeShadow
{
struct GraphNodeShadow {
/*0x00*/ struct GraphNode node;
/*0x14*/ s16 shadowScale; // diameter (when a circle) or side (when a square) of shadow
/*0x16*/ u8 shadowSolidity; // opacity of shadow, 255 = opaque
@@ -294,8 +276,7 @@ struct GraphNodeShadow
/** GraphNode that contains as its sharedChild a group node containing all
* object nodes.
*/
struct GraphNodeObjectParent
{
struct GraphNodeObjectParent {
/*0x00*/ struct GraphNode node;
/*0x14*/ struct GraphNode *sharedChild;
};
@@ -308,8 +289,7 @@ struct GraphNodeObjectParent
* The parameter field gives extra context info. For shifting sand or paintings,
* it can determine which texture to use.
*/
struct GraphNodeGenerated
{
struct GraphNodeGenerated {
/*0x00*/ struct FnGraphNode fnNode;
/*0x18*/ u32 parameter; // extra context for the function
};
@@ -317,8 +297,7 @@ struct GraphNodeGenerated
/** GraphNode that draws a background image or a rectangle of a color.
* Drawn in an orthographic projection, used for skyboxes.
*/
struct GraphNodeBackground
{
struct GraphNodeBackground {
/*0x00*/ struct FnGraphNode fnNode;
/*0x18*/ s32 unused;
/*0x1C*/ s32 background; // background ID, or rgba5551 color if fnNode.func is null
@@ -326,8 +305,7 @@ struct GraphNodeBackground
/** Renders the object that Mario is holding.
*/
struct GraphNodeHeldObject
{
struct GraphNodeHeldObject {
/*0x00*/ struct FnGraphNode fnNode;
/*0x18*/ s32 playerIndex;
/*0x1C*/ struct Object *objNode;
@@ -339,11 +317,10 @@ struct GraphNodeHeldObject
* object node. Used for very large objects, such as shock wave rings that Bowser
* creates, tornadoes, the big eel.
*/
struct GraphNodeCullingRadius
{
struct GraphNodeCullingRadius {
/*0x00*/ struct GraphNode node;
/*0x14*/ s16 cullingRadius; // specifies the 'sphere radius' for purposes of frustum culling
u8 pad1E[2];
u8 filler[2];
};
extern struct GraphNodeMasterList *gCurGraphNodeMasterList;
+5 -5
View File
@@ -286,7 +286,7 @@ static void level_cmd_load_mario_head(void) {
if (addr != NULL) {
gdm_init(addr, DOUBLE_SIZE_ON_64_BIT(0xE1000));
gd_add_to_heap(gZBuffer, sizeof(gZBuffer)); // 0x25800
gd_add_to_heap(gFrameBuffer0, 3 * sizeof(gFrameBuffer0)); // 0x70800
gd_add_to_heap(gFramebuffer0, 3 * sizeof(gFramebuffer0)); // 0x70800
gdm_setup();
gdm_maketestdl(CMD_GET(s16, 2));
} else {
@@ -425,7 +425,7 @@ static void level_cmd_init_mario(void) {
gMarioSpawnInfo->areaIndex = 0;
gMarioSpawnInfo->behaviorArg = CMD_GET(u32, 4);
gMarioSpawnInfo->behaviorScript = CMD_GET(void *, 8);
gMarioSpawnInfo->unk18 = gLoadedGraphNodes[CMD_GET(u8, 3)];
gMarioSpawnInfo->model = gLoadedGraphNodes[CMD_GET(u8, 3)];
gMarioSpawnInfo->next = NULL;
sCurrentCmd = CMD_NEXT;
@@ -453,7 +453,7 @@ static void level_cmd_place_object(void) {
spawnInfo->behaviorArg = CMD_GET(u32, 16);
spawnInfo->behaviorScript = CMD_GET(void *, 20);
spawnInfo->unk18 = gLoadedGraphNodes[model];
spawnInfo->model = gLoadedGraphNodes[model];
spawnInfo->next = gAreas[sCurrAreaIndex].objectSpawnInfos;
gAreas[sCurrAreaIndex].objectSpawnInfos = spawnInfo;
@@ -545,8 +545,8 @@ static void level_cmd_3A(void) {
struct UnusedArea28 *val4;
if (sCurrAreaIndex != -1) {
if ((val4 = gAreas[sCurrAreaIndex].unused28) == NULL) {
val4 = gAreas[sCurrAreaIndex].unused28 =
if ((val4 = gAreas[sCurrAreaIndex].unused) == NULL) {
val4 = gAreas[sCurrAreaIndex].unused =
alloc_only_pool_alloc(sLevelPool, sizeof(struct UnusedArea28));
}
+15 -13
View File
@@ -211,7 +211,7 @@ s32 find_wall_collisions(struct WallCollisionData *colData) {
numCollisions += find_wall_collisions_from_list(node, colData);
// Increment the debug tracker.
gNumCalls.wall += 1;
gNumCalls.wall++;
return numCollisions;
}
@@ -305,18 +305,20 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32
*/
f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil) {
s16 cellZ, cellX;
struct Surface *ceil, *dynamicCeil;
struct SurfaceNode *surfaceList;
f32 height = CELL_HEIGHT_LIMIT;
f32 dynamicHeight = CELL_HEIGHT_LIMIT;
s16 x, y, z;
//! (Parallel Universes) Because position is casted to an s16, reaching higher
// float locations can return ceilings despite them not existing there.
//(Dynamic ceilings will unload due to the range.)
x = (s16) posX;
y = (s16) posY;
z = (s16) posZ;
// float locations can return ceilings despite them not existing there.
// (Dynamic ceilings will unload due to the range.)
s16 x = (s16) posX;
s16 y = (s16) posY;
s16 z = (s16) posZ;
*pceil = NULL;
if (x <= -LEVEL_BOUNDARY_MAX || x >= LEVEL_BOUNDARY_MAX) {
@@ -346,7 +348,7 @@ f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil) {
*pceil = ceil;
// Increment the debug tracker.
gNumCalls.ceil += 1;
gNumCalls.ceil++;
return height;
}
@@ -518,8 +520,8 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) {
f32 dynamicHeight = FLOOR_LOWER_LIMIT;
//! (Parallel Universes) Because position is casted to an s16, reaching higher
// float locations can return floors despite them not existing there.
//(Dynamic floors will unload due to the range.)
// float locations can return floors despite them not existing there.
// (Dynamic floors will unload due to the range.)
s16 x = (s16) xPos;
s16 y = (s16) yPos;
s16 z = (s16) zPos;
@@ -563,7 +565,7 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) {
// If a floor was missed, increment the debug counter.
if (floor == NULL) {
gNumFindFloorMisses += 1;
gNumFindFloorMisses++;
}
if (dynamicHeight > height) {
@@ -574,7 +576,7 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) {
*pfloor = floor;
// Increment the debug tracker.
gNumCalls.floor += 1;
gNumCalls.floor++;
return height;
}
@@ -624,7 +626,7 @@ f32 find_water_level(f32 x, f32 z) {
f32 find_poison_gas_level(f32 x, f32 z) {
s32 i;
s32 numRegions;
UNUSED s32 unused;
UNUSED u8 filler[4];
s16 val;
f32 loX, hiX, loZ, hiZ;
f32 gasLevel = FLOOR_LOWER_LIMIT;
+4 -6
View File
@@ -17,19 +17,17 @@
// It doesn't match if ".0" is removed or ".f" is added
#define FLOOR_LOWER_LIMIT_SHADOW (FLOOR_LOWER_LIMIT + 1000.0)
struct WallCollisionData
{
struct WallCollisionData {
/*0x00*/ f32 x, y, z;
/*0x0C*/ f32 offsetY;
/*0x10*/ f32 radius;
/*0x14*/ s16 unused;
/*0x14*/ u8 filler[2];
/*0x16*/ s16 numWalls;
/*0x18*/ struct Surface *walls[4];
};
struct FloorGeometry
{
f32 unused[4]; // possibly position data?
struct FloorGeometry {
u8 filler[16]; // possibly position data?
f32 normalX;
f32 normalY;
f32 normalZ;
+8 -11
View File
@@ -1,7 +1,5 @@
#include <PR/ultratypes.h>
#include "prevent_bss_reordering.h"
#include "sm64.h"
#include "game/ingame_menu.h"
#include "graph_node.h"
@@ -213,7 +211,7 @@ static s16 lower_cell_index(s16 coord) {
//! Some wall checks are larger than the buffer, meaning wall checks can
// miss walls that are near a cell border.
if (coord % CELL_SIZE < 50) {
index -= 1;
index--;
}
if (index < 0) {
@@ -245,7 +243,7 @@ static s16 upper_cell_index(s16 coord) {
//! Some wall checks are larger than the buffer, meaning wall checks can
// miss walls that are near a cell border.
if (coord % CELL_SIZE > CELL_SIZE - 50) {
index += 1;
index++;
}
if (index > NUM_CELLS_INDEX) {
@@ -442,12 +440,12 @@ static void load_static_surfaces(s16 **data, s16 *vertexData, s16 surfaceType, s
s16 flags = surf_has_no_cam_collision(surfaceType);
numSurfaces = *(*data);
*data += 1;
(*data)++;
for (i = 0; i < numSurfaces; i++) {
if (*surfaceRooms != NULL) {
room = *(*surfaceRooms);
*surfaceRooms += 1;
(*surfaceRooms)++;
}
surface = read_surface_data(vertexData, data);
@@ -467,7 +465,7 @@ static void load_static_surfaces(s16 **data, s16 *vertexData, s16 surfaceType, s
*data += 3;
if (hasForce) {
*data += 1;
(*data)++;
}
}
}
@@ -477,8 +475,7 @@ static void load_static_surfaces(s16 **data, s16 *vertexData, s16 surfaceType, s
*/
static s16 *read_vertex_data(s16 **data) {
s32 numVertices;
UNUSED s16 unused1[3];
UNUSED s16 unused2[3];
UNUSED u8 filler[16];
s16 *vertexData;
numVertices = *(*data);
@@ -590,7 +587,7 @@ u32 get_area_terrain_size(s16 *data) {
void load_area_terrain(s16 index, s16 *data, s8 *surfaceRooms, s16 *macroObjects) {
s16 terrainLoadType;
s16 *vertexData;
UNUSED s32 unused;
UNUSED u8 filler[4];
// Initialize the data for this.
gEnvironmentRegions = NULL;
@@ -756,7 +753,7 @@ void load_object_surfaces(s16 **data, s16 *vertexData) {
* Transform an object's vertices, reload them, and render the object.
*/
void load_object_collision_model(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
s16 vertexData[600];
s16 *collisionData = gCurrentObject->collisionData;
+2 -4
View File
@@ -9,14 +9,12 @@
#define NUM_CELLS (2 * LEVEL_BOUNDARY_MAX / CELL_SIZE)
#define NUM_CELLS_INDEX (NUM_CELLS - 1)
struct SurfaceNode
{
struct SurfaceNode {
struct SurfaceNode *next;
struct Surface *surface;
};
enum
{
enum {
SPATIAL_PARTITION_FLOORS,
SPATIAL_PARTITION_CEILS,
SPATIAL_PARTITION_WALLS
+5 -7
View File
@@ -109,7 +109,7 @@ void print_intro_text(void) {
#ifdef VERSION_EU
s32 language = eu_get_language();
#endif
if ((gGlobalTimer & 0x1F) < 20) {
if ((gGlobalTimer & 31) < 20) {
if (gControllerBits == 0) {
#ifdef VERSION_EU
print_text_centered(SCREEN_WIDTH / 2, 20, gNoControllerMsg[language]);
@@ -194,7 +194,7 @@ void clear_areas(void) {
gAreaData[i].instantWarps = NULL;
gAreaData[i].objectSpawnInfos = NULL;
gAreaData[i].camera = NULL;
gAreaData[i].unused28 = NULL;
gAreaData[i].unused = NULL;
gAreaData[i].whirlpools[0] = NULL;
gAreaData[i].whirlpools[1] = NULL;
gAreaData[i].dialog[0] = DIALOG_NONE;
@@ -330,16 +330,14 @@ void play_transition(s16 transType, s16 time, u8 red, u8 green, u8 blue) {
gWarpTransition.data.texTimer = 0;
if (transType & 1) // Is the image fading in?
{
if (transType & 1) { // Is the image fading in?
gWarpTransition.data.startTexRadius = GFX_DIMENSIONS_FULL_RADIUS;
if (transType >= 0x0F) {
gWarpTransition.data.endTexRadius = 16;
} else {
gWarpTransition.data.endTexRadius = 0;
}
} else // The image is fading out. (Reverses start & end circles)
{
} else { // The image is fading out. (Reverses start & end circles)
if (transType >= 0x0E) {
gWarpTransition.data.startTexRadius = 16;
} else {
@@ -409,7 +407,7 @@ void render_game(void) {
if (D_8032CE78 != NULL) {
clear_viewport(D_8032CE78, gWarpTransFBSetColor);
} else {
clear_frame_buffer(gWarpTransFBSetColor);
clear_framebuffer(gWarpTransFBSetColor);
}
}
+11 -20
View File
@@ -7,16 +7,14 @@
#include "camera.h"
#include "engine/graph_node.h"
struct WarpNode
{
struct WarpNode {
/*00*/ u8 id;
/*01*/ u8 destLevel;
/*02*/ u8 destArea;
/*03*/ u8 destNode;
};
struct ObjectWarpNode
{
struct ObjectWarpNode {
/*0x00*/ struct WarpNode node;
/*0x04*/ struct Object *object;
/*0x08*/ struct ObjectWarpNode *next;
@@ -26,27 +24,24 @@ struct ObjectWarpNode
#define INSTANT_WARP_INDEX_START 0x00 // Equal and greater than Surface 0x1B
#define INSTANT_WARP_INDEX_STOP 0x04 // Less than Surface 0x1F
struct InstantWarp
{
struct InstantWarp {
/*0x00*/ u8 id; // 0 = 0x1B / 1 = 0x1C / 2 = 0x1D / 3 = 0x1E
/*0x01*/ u8 area;
/*0x02*/ Vec3s displacement;
};
struct SpawnInfo
{
struct SpawnInfo {
/*0x00*/ Vec3s startPos;
/*0x06*/ Vec3s startAngle;
/*0x0C*/ s8 areaIndex;
/*0x0D*/ s8 activeAreaIndex;
/*0x10*/ u32 behaviorArg;
/*0x14*/ void *behaviorScript;
/*0x18*/ struct GraphNode *unk18;
/*0x18*/ struct GraphNode *model;
/*0x1C*/ struct SpawnInfo *next;
};
struct UnusedArea28
{
struct UnusedArea28 {
/*0x00*/ s16 unk00;
/*0x02*/ s16 unk02;
/*0x04*/ s16 unk04;
@@ -54,14 +49,12 @@ struct UnusedArea28
/*0x08*/ s16 unk08;
};
struct Whirlpool
{
struct Whirlpool {
/*0x00*/ Vec3s pos;
/*0x03*/ s16 strength;
};
struct Area
{
struct Area {
/*0x00*/ s8 index;
/*0x01*/ s8 flags; // Only has 1 flag: 0x01 = Is this the active area?
/*0x02*/ u16 terrainType; // default terrain of the level (set from level script cmd 0x31)
@@ -74,7 +67,7 @@ struct Area
/*0x1C*/ struct InstantWarp *instantWarps;
/*0x20*/ struct SpawnInfo *objectSpawnInfos;
/*0x24*/ struct Camera *camera;
/*0x28*/ struct UnusedArea28 *unused28; // Filled by level script 0x3A, but is unused.
/*0x28*/ struct UnusedArea28 *unused; // Filled by level script 0x3A, but is unused.
/*0x2C*/ struct Whirlpool *whirlpools[2];
/*0x34*/ u8 dialog[2]; // Level start dialog number (set by level script cmd 0x30)
/*0x36*/ u16 musicParam;
@@ -82,8 +75,7 @@ struct Area
};
// All the transition data to be used in screen_transition.c
struct WarpTransitionData
{
struct WarpTransitionData {
/*0x00*/ u8 red;
/*0x01*/ u8 green;
/*0x02*/ u8 blue;
@@ -109,8 +101,7 @@ struct WarpTransitionData
#define WARP_TRANSITION_FADE_FROM_BOWSER 0x12
#define WARP_TRANSITION_FADE_INTO_BOWSER 0x13
struct WarpTransition
{
struct WarpTransition {
/*0x00*/ u8 isActive; // Is the transition active. (either TRUE or FALSE)
/*0x01*/ u8 type; // Determines the type of transition to use (circle, star, etc.)
/*0x02*/ u8 time; // Amount of time to complete the transition (in frames)
+35 -44
View File
@@ -47,47 +47,18 @@
#define o gCurrentObject
struct WFRotatingPlatformData {
s16 pad;
s16 scale;
const Collision *collisionData;
s16 collisionDistance;
static s32 sCapSaveFlags[] = {
SAVE_FLAG_HAVE_WING_CAP,
SAVE_FLAG_HAVE_METAL_CAP,
SAVE_FLAG_HAVE_VANISH_CAP,
};
struct Struct8032F34C {
s16 numBridgeSections;
s16 bridgeRelativeStartingXorZ;
s16 platformWidth;
s16 model;
const void *segAddr;
};
struct Struct802C0DF0 {
u8 unk0;
u8 unk1;
u8 unk2;
u8 model;
const BehaviorScript *behavior;
};
struct Struct8032F754 {
s32 unk0;
Vec3f unk1;
f32 unk2;
};
struct OpenableGrill {
s16 halfWidth;
s16 modelID;
const Collision *collision;
};
static s32 sCapSaveFlags[] = { SAVE_FLAG_HAVE_WING_CAP, SAVE_FLAG_HAVE_METAL_CAP, SAVE_FLAG_HAVE_VANISH_CAP };
// Boo Roll
static s16 sBooHitRotations[] = { 6047, 5664, 5292, 4934, 4587, 4254, 3933, 3624, 3329, 3046, 2775,
2517, 2271, 2039, 1818, 1611, 1416, 1233, 1063, 906, 761, 629,
509, 402, 308, 226, 157, 100, 56, 25, 4, 0 };
static s16 sBooHitRotations[] = {
6047, 5664, 5292, 4934, 4587, 4254, 3933, 3624, 3329, 3046, 2775,
2517, 2271, 2039, 1818, 1611, 1416, 1233, 1063, 906, 761, 629,
509, 402, 308, 226, 157, 100, 56, 25, 4, 0,
};
#include "behaviors/star_door.inc.c"
#include "behaviors/mr_i.inc.c"
@@ -108,13 +79,27 @@ static s16 sBooHitRotations[] = { 6047, 5664, 5292, 4934, 4587, 4254, 3933, 3624
#include "behaviors/white_puff_explode.inc.c"
// not in behavior file
struct SpawnParticlesInfo sMistParticles = { 2, 20, MODEL_MIST, 0, 40, 5, 30, 20, 252, 30, 330.0f, 10.0f };
static struct SpawnParticlesInfo sMistParticles = {
/* behParam: */ 2,
/* count: */ 20,
/* model: */ MODEL_MIST,
/* offsetY: */ 0,
/* forwardVelBase: */ 40,
/* forwardVelRange: */ 5,
/* velYBase: */ 30,
/* velYRange: */ 20,
/* gravity: */ 252,
/* dragStrength: */ 30,
/* sizeBase: */ 330.0f,
/* sizeRange: */ 10.0f,
};
// generate_wind_puffs/dust (something like that)
void spawn_mist_particles_variable(s32 count, s32 offsetY, f32 size) {
sMistParticles.sizeBase = size;
sMistParticles.sizeRange = size / 20.0;
sMistParticles.offsetY = offsetY;
if (count == 0) {
sMistParticles.count = 20;
} else if (count > 20) {
@@ -122,6 +107,7 @@ void spawn_mist_particles_variable(s32 count, s32 offsetY, f32 size) {
} else {
sMistParticles.count = 4;
}
cur_obj_spawn_particles(&sMistParticles);
}
@@ -159,16 +145,16 @@ void spawn_mist_particles_variable(s32 count, s32 offsetY, f32 size) {
// not sure what this is doing here. not in a behavior file.
Gfx *geo_move_mario_part_from_parent(s32 run, UNUSED struct GraphNode *node, Mat4 mtx) {
Mat4 sp20;
struct Object *sp1C;
if (run == TRUE) {
sp1C = (struct Object *) gCurGraphNodeObject;
struct Object *sp1C = (struct Object *) gCurGraphNodeObject;
if (sp1C == gMarioObject && sp1C->prevObj != NULL) {
create_transformation_from_matrices(sp20, mtx, *gCurGraphNodeCamera->matrixPtr);
obj_update_pos_from_parent_transformation(sp20, sp1C->prevObj);
obj_set_gfx_pos_from_pos(sp1C->prevObj);
}
}
return NULL;
}
@@ -185,6 +171,7 @@ void spawn_sparkle_particles(s32 n, s32 a1, s32 a2, s32 r) {
static s16 D_8035FF10;
s32 i;
s16 separation = 0x10000 / n; // Evenly spread around a circle
for (i = 0; i < n; i++) {
spawn_object_relative(0, sins(D_8035FF10 + i * separation) * a1, (i + 1) * a2,
coss(D_8035FF10 + i * separation) * a1, o, MODEL_NONE, bhvSparkleSpawn);
@@ -233,13 +220,17 @@ void vec3f_copy_2(Vec3f dest, Vec3f src) {
s32 set_obj_anim_with_accel_and_sound(s16 a0, s16 a1, s32 a2) {
f32 sp1C;
if ((sp1C = o->header.gfx.animInfo.animAccel / (f32) 0x10000) == 0)
if ((sp1C = o->header.gfx.animInfo.animAccel / (f32) 0x10000) == 0) {
sp1C = 1.0f;
}
if (cur_obj_check_anim_frame_in_range(a0, sp1C) || cur_obj_check_anim_frame_in_range(a1, sp1C)) {
cur_obj_play_sound_2(a2);
return 1;
return TRUE;
}
return 0;
return FALSE;
}
#include "behaviors/tuxie.inc.c"
+4 -3
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvActivatedBackAndForthPlatform.
* There are only 2 of these in the game; the BitFS gray elevator
@@ -16,7 +17,7 @@
* move off of it. To do this, they changed it to a bhvPlatformOnTrack, but
* forgot to remove its entry in this table.
*/
static void const *sActivatedBackAndForthPlatformCollisionModels[] = {
static Collision const *sActivatedBackAndForthPlatformCollisionModels[] = {
/* ACTIVATED_BF_PLAT_TYPE_BITS_ARROW_PLAT */ bits_seg7_collision_0701AD54,
/* ACTIVATED_BF_PLAT_TYPE_BITFS_MESH_PLAT */ bitfs_seg7_collision_070157E0,
/* ACTIVATED_BF_PLAT_TYPE_BITFS_ELEVATOR */ bitfs_seg7_collision_07015124
@@ -61,7 +62,7 @@ void bhv_activated_back_and_forth_platform_init(void) {
* Activated back-and-forth platform update function.
*/
void bhv_activated_back_and_forth_platform_update(void) {
UNUSED s32 unused[3];
UNUSED u8 filler[12];
// oVelY is used for vertical platforms' movement and also for
// horizontal platforms' dipping up/down when Mario gets on/off them
@@ -78,7 +79,7 @@ void bhv_activated_back_and_forth_platform_update(void) {
// and one more frame of "lag" after it finally reaches 0 here,
// Mario actually has to wait 22 frames before the platform starts moving.
if (o->oActivatedBackAndForthPlatformCountdown != 0) {
o->oActivatedBackAndForthPlatformCountdown -= 1;
o->oActivatedBackAndForthPlatformCountdown--;
} else {
// After the wait period is over, we start moving, by adding the velocity
// to the positional offset.
+13 -12
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvHomingAmp and bhvCirclingAmp.
* These are distinct objects; one chases (homes in on) Mario,
@@ -24,9 +25,9 @@ void bhv_homing_amp_init(void) {
o->oHomeX = o->oPosX;
o->oHomeY = o->oPosY;
o->oHomeZ = o->oPosZ;
o->oGravity = 0;
o->oFriction = 1.0;
o->oBuoyancy = 1.0;
o->oGravity = 0.0f;
o->oFriction = 1.0f;
o->oBuoyancy = 1.0f;
o->oHomingAmpAvgY = o->oHomeY;
// Homing amps start at 1/10th their normal size.
@@ -48,8 +49,9 @@ static void check_amp_attack(void) {
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
// Unnecessary if statement, maybe caused by a macro for
// if (o->oInteractStatus & INT_STATUS_INTERACTED)
// if (o->oInteractStatus & INT_STATUS_INTERACTED) {
// o->oAction = X;
// }
// ?
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
// This function is used for both normal amps and homing amps,
@@ -88,7 +90,7 @@ static void homing_amp_appear_loop(void) {
// Once the timer becomes greater than 90, i.e. 91 frames have passed,
// reset the amp's size and start chasing Mario.
if (o->oTimer >= 91) {
if (o->oTimer > 90) {
cur_obj_scale(1.0f);
o->oAction = HOMING_AMP_ACT_CHASE;
o->oAmpYPhase = 0;
@@ -121,7 +123,7 @@ static void homing_amp_chase_loop(void) {
o->oHomingAmpAvgY = gMarioObject->header.gfx.pos[1] + 150.0f;
}
if (o->oTimer >= 31) {
if (o->oTimer > 30) {
o->oHomingAmpLockedOn = FALSE;
}
} else {
@@ -160,7 +162,7 @@ static void homing_amp_give_up_loop(void) {
// Move forward for 152 frames
o->oForwardVel = 15.0f;
if (o->oTimer >= 151) {
if (o->oTimer > 150) {
// Hide the amp and reset it back to its inactive state
o->oPosX = o->oHomeX;
o->oPosY = o->oHomeY;
@@ -168,7 +170,7 @@ static void homing_amp_give_up_loop(void) {
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
o->oAction = HOMING_AMP_ACT_INACTIVE;
o->oAnimState = 0;
o->oForwardVel = 0;
o->oForwardVel = 0.0f;
o->oHomingAmpAvgY = o->oHomeY;
}
}
@@ -179,15 +181,15 @@ static void homing_amp_give_up_loop(void) {
static void amp_attack_cooldown_loop(void) {
// Turn intangible and wait for 90 frames before chasing Mario again after hitting him.
o->header.gfx.animInfo.animFrame += 2;
o->oForwardVel = 0;
o->oForwardVel = 0.0f;
cur_obj_become_intangible();
if (o->oTimer >= 31) {
if (o->oTimer > 30) {
o->oAnimState = 0;
}
if (o->oTimer >= 91) {
if (o->oTimer > 90) {
o->oAnimState = 1;
cur_obj_become_tangible();
o->oAction = HOMING_AMP_ACT_CHASE;
@@ -334,7 +336,6 @@ void bhv_circling_amp_loop(void) {
} else {
circling_amp_idle_loop();
}
break;
case AMP_ACT_ATTACK_COOLDOWN:
@@ -1,8 +1,8 @@
// animated_floor_switch.inc.c
struct Struct80331A54 {
const void *unk00;
s16 unk04;
const Collision *collision;
s16 model;
};
struct Struct80331A54 D_80331A54[][5] = {
@@ -63,7 +63,7 @@ void bhv_animates_on_floor_switch_press_loop(void) {
}
if (o->oFloorSwitchPressAnimationUnkF8 < 9) {
o->oFloorSwitchPressAnimationUnkF8 += 1;
o->oFloorSwitchPressAnimationUnkF8++;
}
} else if ((o->oFloorSwitchPressAnimationUnkF8 -= 2) < 0) {
o->oFloorSwitchPressAnimationUnkF8 = 0;
@@ -71,7 +71,7 @@ void bhv_animates_on_floor_switch_press_loop(void) {
}
o->collisionData = segmented_to_virtual(
D_80331A54[o->oBehParams2ndByte][o->oFloorSwitchPressAnimationUnkF8 / 2].unk00);
D_80331A54[o->oBehParams2ndByte][o->oFloorSwitchPressAnimationUnkF8 / 2].collision);
cur_obj_set_model(D_80331A54[o->oBehParams2ndByte][o->oFloorSwitchPressAnimationUnkF8 / 2].unk04);
cur_obj_set_model(D_80331A54[o->oBehParams2ndByte][o->oFloorSwitchPressAnimationUnkF8 / 2].model);
}
+1
View File
@@ -1,3 +1,4 @@
/**
* Behavior for WDW arrow lifts.
* When a player stands on an arrow lift, it starts moving between
@@ -1,3 +1,4 @@
/**
* Behavior for bhvHauntedBookshelf.
* This is the bookshelf that recedes after solving the puzzle of the haunted books.
@@ -29,6 +30,7 @@ void bhv_haunted_bookshelf_loop(void) {
}
break;
case HAUNTED_BOOKSHELF_ACT_RECEDE:
// Move the bookshelf and play the sound
o->oPosX += 5.0f;
@@ -40,6 +42,7 @@ void bhv_haunted_bookshelf_loop(void) {
}
break;
default:
break;
}
@@ -1,3 +1,4 @@
/**
* Behavior for bhvMerryGoRound.
* This is the merry-go-round in BBH.
+5 -4
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvBbhTiltingTrapPlatform.
* This is the tilting platform trap in the upper floor of BBH
@@ -8,9 +9,9 @@
* Update function for bhvBbhTiltingTrapPlatform.
*/
void bhv_bbh_tilting_trap_platform_loop(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
// US (and probably later) versions use oAction for the
// Post-JP versions use oAction for the
// if statement, while immediately setting it over here.
// This was done so that Mario leaving or getting on the platform
// resets oTimer to 0.
@@ -29,14 +30,14 @@ void bhv_bbh_tilting_trap_platform_loop(void) {
o->oFaceAnglePitch += o->oAngleVelPitch;
} else
#ifndef VERSION_JP
// In the US version, if the platform has tilted more than 3000 angle units
// In the post-JP versions, if the platform has tilted more than 3000 angle units
// in less than 16 frames since Mario got on it, and he has stepped off,
// this code will not run, so it will continue to rotate with the same
// angular velocity for 16 more frames. This was probably done to make
// the platform more dangerous. This code will not work correctly
// without the oAction changes above, since oTimer will not ever
// reset to 0 without them.
if ((absi(o->oFaceAnglePitch) < 3000) || (o->oTimer >= 16))
if ((absi(o->oFaceAnglePitch) < 3000) || (o->oTimer > 15))
#endif
{
// Make the platform return to the horizontal at a speed of
+6 -2
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvAlphaBooKey and bhvBetaBooKey.
* They were apparently intended to be a key that would be contained in boos
@@ -163,8 +164,11 @@ static void beta_boo_key_inside_boo_loop(void) {
o->oFaceAngleYaw += 0x200;
}
static void (*sBetaBooKeyActions[])(void) = { beta_boo_key_inside_boo_loop, beta_boo_key_drop,
beta_boo_key_dropped_loop };
static void (*sBetaBooKeyActions[])(void) = {
beta_boo_key_inside_boo_loop,
beta_boo_key_drop,
beta_boo_key_dropped_loop,
};
/**
* Update function for bhvBetaBooKey.
+4 -3
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvBetaBowserAnchor.
* This seems to be a beta bowser anchor object. It continuously updates to be
@@ -9,15 +10,15 @@
* It continuously updates to be in front of Mario,
* and attacks all non-Mario objects it touches.
* It continuously sets its hitbox radius/height
* based on gDebugInfo[4].
* based on gDebugInfo[DEBUG_PAGE_EFFECTINFO].
*/
void bhv_beta_bowser_anchor_loop(void) {
// Set the object's position to be 30 units above Mario's feet,
// and 300 units in front of him.
cur_obj_set_pos_relative(gMarioObject, 0, 30.0f, 300.0f);
o->hitboxRadius = gDebugInfo[4][0] + 100;
o->hitboxHeight = gDebugInfo[4][1] + 300;
o->hitboxRadius = gDebugInfo[DEBUG_PAGE_EFFECTINFO][0] + 100;
o->hitboxHeight = gDebugInfo[DEBUG_PAGE_EFFECTINFO][1] + 300;
obj_attack_collided_from_other_object(o);
}
+3 -1
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvBetaChestBottom and bhvBetaChestLid.
* These are apparently the beta versions of chests.
@@ -49,6 +50,7 @@ void bhv_beta_chest_lid_loop(void) {
}
break;
case BETA_CHEST_ACT_OPENING:
if (o->oTimer == 0) {
// Spawn the bubble 80 units in the -Y direction and 120 units in the +Z direction.
@@ -63,7 +65,7 @@ void bhv_beta_chest_lid_loop(void) {
o->oAction++; // Set to BETA_CHEST_ACT_IDLE_OPEN
}
// Fall-through
// fallthrough
case BETA_CHEST_ACT_IDLE_OPEN:
break;
}
@@ -1,3 +1,4 @@
/**
* Behavior for bhvBetaFishSplashSpawner.
* This is a now non-functional fish splash object found in WF
@@ -12,6 +13,6 @@
* Update function for bhvBetaFishSplashSpawner.
*/
void bhv_beta_fish_splash_spawner_loop(void) {
UNUSED u8 pad[12];
UNUSED f32 water_level = find_water_level(o->oPosX, o->oPosZ);
UNUSED u8 filler[12];
UNUSED f32 waterLevel = find_water_level(o->oPosX, o->oPosZ);
}
@@ -1,3 +1,4 @@
/**
* Behavior for bhvBetaHoldableObject.
* This is a simple implementation of a holdable object, probably used
@@ -11,9 +12,9 @@
* Just sets various physics constants for the object.
*/
void bhv_beta_holdable_object_init(void) {
o->oGravity = 2.5;
o->oFriction = 0.8;
o->oBuoyancy = 1.3;
o->oGravity = 2.5f;
o->oFriction = 0.8f;
o->oBuoyancy = 1.3f;
}
/**
@@ -27,8 +28,8 @@ static void beta_holdable_object_drop(void) {
o->oHeldState = HELD_FREE;
o->oForwardVel = 0;
o->oVelY = 0;
o->oForwardVel = 0.0f;
o->oVelY = 0.0f;
}
/**
@@ -46,8 +47,8 @@ static void beta_holdable_object_throw(void) {
o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW;
// Set initial velocity
o->oForwardVel = 40.0;
o->oVelY = 20.0;
o->oForwardVel = 40.0f;
o->oVelY = 20.0f;
}
/**
+1
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvBetaTrampolineTop and bhvBetaTrampolineSpring.
* This was a trampoline that was never finished. The model and collision
+2 -1
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvBird. These are the birds in the castle grounds
* that fly away and scatter when Mario comes near them. There are
@@ -52,7 +53,7 @@ static void bird_act_inactive(void) {
* and the parent spawner bird if it's a spawned bird.
*/
static void bird_act_fly(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
f32 distance;
// Compute forward velocity and vertical velocity from oBirdSpeed and pitch
+5
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvHiddenBlueCoin and bhvBlueCoinSwitch.
* bhvHiddenBlueCoin are the stationary blue coins that appear when
@@ -24,6 +25,7 @@ void bhv_hidden_blue_coin_loop(void) {
}
break;
case HIDDEN_BLUE_COIN_ACT_WAITING:
// Wait until the blue coin switch starts ticking to activate.
blueCoinSwitch = o->oHiddenBlueCoinSwitch;
@@ -33,6 +35,7 @@ void bhv_hidden_blue_coin_loop(void) {
}
break;
case HIDDEN_BLUE_COIN_ACT_ACTIVE:
// Become tangible
cur_obj_enable_rendering();
@@ -85,6 +88,7 @@ void bhv_blue_coin_switch_loop(void) {
load_object_collision_model();
break;
case BLUE_COIN_SWITCH_ACT_RECEDING:
// Recede for 6 frames before going invisible and ticking.
// This is probably an off-by-one error, since the switch is 100 units tall
@@ -108,6 +112,7 @@ void bhv_blue_coin_switch_loop(void) {
}
break;
case BLUE_COIN_SWITCH_ACT_TICKING:
// Tick faster when the blue coins start blinking
if (o->oTimer < 200) {
+24 -18
View File
@@ -1,3 +1,4 @@
/**
* @file blue_fish.inc.c
* Implements behaviour and spawning for bhvBlueFish located in the castle aquarium outside of SA.
@@ -8,17 +9,18 @@
*/
void bhv_blue_fish_movement_loop(void) {
f32 randomSwitch;
switch (o->oAction) {
// Initial dive phase after spawning
case BLUE_FISH_ACT_DIVE:
cur_obj_init_animation_with_accel_and_sound(0, 1.0f);
// Assigns random values to variables that help determine natural motion.
if (o->oTimer == 0) {
o->oBlueFishRandomAngle = random_sign() << 11;
o->oBlueFishRandomAngle = random_sign() * 0x800;
o->oBlueFishRandomVel = random_float() * 2;
o->oBlueFishRandomTime = (s32)(random_float() * 30) & 0xFE;
// Adjusts pitch velocity or sets to zero dependant on outcome of randomSwitch.
randomSwitch = random_float() * 5;
if (randomSwitch < 2.0f) {
@@ -27,23 +29,24 @@ void bhv_blue_fish_movement_loop(void) {
o->oAngleVelPitch = 0;
}
}
// Set forward velocity and progress oAction to BLUE_FISH_ACT_TURN.
o->oForwardVel = o->oBlueFishRandomVel + 3.0f;
if (o->oTimer >= o->oBlueFishRandomTime + 60) {
o->oAction++;
}
// Set pitch velocity
if (o->oTimer < (o->oBlueFishRandomTime + 60) / 2) {
o->oFaceAnglePitch += o->oAngleVelPitch;
} else {
o->oFaceAnglePitch -= o->oAngleVelPitch;
}
// Calculate new Y velocity
o->oVelY = -sins(o->oFaceAnglePitch) * o->oForwardVel;
break;
// Animates and adjusts fish yaw angle.
case BLUE_FISH_ACT_TURN:
cur_obj_init_animation_with_accel_and_sound(0, 2.0f);
@@ -51,39 +54,41 @@ void bhv_blue_fish_movement_loop(void) {
if (o->oTimer == 15) {
o->oAction++;
}
break;
break;
// Animates and adjusts pitch to an upward direction.
case BLUE_FISH_ACT_ASCEND:
cur_obj_init_animation_with_accel_and_sound(0, 1.0f);
// Progresses oAction to BLUE_FISH_ACT_TURN_BACK after elapsed time.
// Progresses oAction to BLUE_FISH_ACT_TURN_BACK after elapsed time.
if (o->oTimer >= o->oBlueFishRandomTime + 60) {
o->oAction++;
}
// Adjusts pitch angle. Direction relies on time not passed.
if (o->oTimer < (o->oBlueFishRandomTime + 60) / 2) {
o->oFaceAnglePitch -= o->oAngleVelPitch;
} else {
o->oFaceAnglePitch += o->oAngleVelPitch;
}
break;
break;
// Animates and turns fish around
case BLUE_FISH_ACT_TURN_BACK:
cur_obj_init_animation_with_accel_and_sound(0, 2.0f);
o->oMoveAngleYaw = (s32)(o->oBlueFishRandomAngle + o->oMoveAngleYaw);
// Sets the fish back to the BLUE_FISH_ACT_DIVE phase.
if (o->oTimer == 15) {
o->oAction = BLUE_FISH_ACT_DIVE;
}
break;
}
// Calculates Y velocity and calls physics engine.
o->oVelY = -sins(o->oFaceAnglePitch) * o->oForwardVel;
cur_obj_move_using_fvel_and_gravity();
// Deletes object if the parent has oAction set to BLUE_FISH_ACT_DUPLICATE.
if (o->parentObj->oAction == BLUE_FISH_ACT_DUPLICATE) {
obj_mark_for_deletion(o);
@@ -97,28 +102,29 @@ void bhv_blue_fish_movement_loop(void) {
void bhv_tank_fish_group_loop(void) {
struct Object *fish;
s32 i;
switch (o->oAction) {
case BLUE_FISH_ACT_SPAWN:
if (gMarioCurrentRoom == 15 || gMarioCurrentRoom == 7) {
// spawns fifteen fish and moves them within 200.0f
for (i = 0; i < 15; i++) {
fish = spawn_object_relative(0, 300, 0, -200, o, MODEL_FISH, bhvBlueFish);
obj_translate_xyz_random(fish, 200.0f);
}
// Proceed to BLUE_FISH_ACT_ROOM phase.
o->oAction++;
}
break;
// Sets next oAction phase if Mario is not in rooms fifteen and seven.
case BLUE_FISH_ACT_ROOM:
if (gMarioCurrentRoom != 15 && gMarioCurrentRoom != 7) {
o->oAction++;
}
break;
// Sets oAction to the BLUE_FISH_ACT_SPAWN phase.
case BLUE_FISH_ACT_DUPLICATE:
o->oAction = BLUE_FISH_ACT_SPAWN;
+91 -68
View File
@@ -1,4 +1,4 @@
// bobomb.c.inc
// bobomb.inc.c
static struct ObjectHitbox sBobombHitbox = {
/* interactType: */ INTERACT_GRABBABLE,
@@ -13,14 +13,14 @@ static struct ObjectHitbox sBobombHitbox = {
};
void bhv_bobomb_init(void) {
o->oGravity = 2.5;
o->oFriction = 0.8;
o->oBuoyancy = 1.3;
o->oGravity = 2.5f;
o->oFriction = 0.8f;
o->oBuoyancy = 1.3f;
o->oInteractionSubtype = INT_SUBTYPE_KICKABLE;
}
void bobomb_spawn_coin(void) {
if (((o->oBehParams >> 8) & 0x1) == 0) {
if (!((o->oBehParams >> 8) & 0x01)) {
obj_spawn_yellow_coins(o, 1);
o->oBehParams = 0x100;
set_object_respawn_info_bits(o, 1);
@@ -28,70 +28,70 @@ void bobomb_spawn_coin(void) {
}
void bobomb_act_explode(void) {
struct Object *explosion;
if (o->oTimer < 5)
if (o->oTimer < 5) {
cur_obj_scale(1.0 + (f32) o->oTimer / 5.0);
else {
explosion = spawn_object(o, MODEL_EXPLOSION, bhvExplosion);
} else {
struct Object *explosion = spawn_object(o, MODEL_EXPLOSION, bhvExplosion);
explosion->oGraphYOffset += 100.0f;
bobomb_spawn_coin();
create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000);
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
}
void bobomb_check_interactions(void) {
obj_set_hitbox(o, &sBobombHitbox);
if ((o->oInteractStatus & INT_STATUS_INTERACTED) != 0)
{
if ((o->oInteractStatus & INT_STATUS_MARIO_KNOCKBACK_DMG) != 0)
{
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
if (o->oInteractStatus & INT_STATUS_MARIO_KNOCKBACK_DMG) {
o->oMoveAngleYaw = gMarioObject->header.gfx.angle[1];
o->oForwardVel = 25.0;
o->oVelY = 30.0;
o->oForwardVel = 25.0f;
o->oVelY = 30.0f;
o->oAction = BOBOMB_ACT_LAUNCHED;
}
if ((o->oInteractStatus & INT_STATUS_TOUCHED_BOB_OMB) != 0)
if (o->oInteractStatus & INT_STATUS_TOUCHED_BOB_OMB) {
o->oAction = BOBOMB_ACT_EXPLODE;
}
o->oInteractStatus = 0;
}
if (obj_attack_collided_from_other_object(o) == 1)
if (obj_attack_collided_from_other_object(o) == TRUE) {
o->oAction = BOBOMB_ACT_EXPLODE;
}
}
void bobomb_act_patrol(void) {
UNUSED s8 filler[4];
UNUSED s16 sp22;
UNUSED u8 filler[4];
UNUSED s16 animFrame = o->header.gfx.animInfo.animFrame;
s16 collisionFlags;
sp22 = o->header.gfx.animInfo.animFrame;
o->oForwardVel = 5.0;
o->oForwardVel = 5.0f;
collisionFlags = object_step();
if ((obj_return_home_if_safe(o, o->oHomeX, o->oHomeY, o->oHomeZ, 400) == 1)
if ((obj_return_home_if_safe(o, o->oHomeX, o->oHomeY, o->oHomeZ, 400) == TRUE)
&& (obj_check_if_facing_toward_angle(o->oMoveAngleYaw, o->oAngleToMario, 0x2000) == TRUE)) {
o->oBobombFuseLit = 1;
o->oAction = BOBOMB_ACT_CHASE_MARIO;
}
obj_check_floor_death(collisionFlags, sObjFloor);
}
void bobomb_act_chase_mario(void) {
UNUSED u8 filler[4];
s16 sp1a, collisionFlags;
sp1a = ++o->header.gfx.animInfo.animFrame;
o->oForwardVel = 20.0;
s16 animFrame = ++o->header.gfx.animInfo.animFrame;
s16 collisionFlags;
o->oForwardVel = 20.0f;
collisionFlags = object_step();
if (sp1a == 5 || sp1a == 16)
if (animFrame == 5 || animFrame == 16) {
cur_obj_play_sound_2(SOUND_OBJ_BOBOMB_WALK);
}
obj_turn_toward_object(o, gMarioObject, 16, 0x800);
obj_check_floor_death(collisionFlags, sObjFloor);
@@ -100,8 +100,9 @@ void bobomb_act_chase_mario(void) {
void bobomb_act_launched(void) {
s16 collisionFlags = 0;
collisionFlags = object_step();
if ((collisionFlags & OBJ_COL_FLAG_GROUNDED) == OBJ_COL_FLAG_GROUNDED)
o->oAction = BOBOMB_ACT_EXPLODE; /* bit 0 */
if ((collisionFlags & OBJ_COL_FLAG_GROUNDED) == OBJ_COL_FLAG_GROUNDED) {
o->oAction = BOBOMB_ACT_EXPLODE;
}
}
void generic_bobomb_free_loop(void) {
@@ -123,8 +124,9 @@ void generic_bobomb_free_loop(void) {
break;
case BOBOMB_ACT_LAVA_DEATH:
if (obj_lava_death() == 1)
if (obj_lava_death() == TRUE) {
create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000);
}
break;
case BOBOMB_ACT_DEATH_PLANE_DEATH:
@@ -135,8 +137,9 @@ void generic_bobomb_free_loop(void) {
bobomb_check_interactions();
if (o->oBobombFuseTimer >= 151)
if (o->oBobombFuseTimer > 150) {
o->oAction = 3;
}
}
void stationary_bobomb_free_loop(void) {
@@ -150,8 +153,9 @@ void stationary_bobomb_free_loop(void) {
break;
case BOBOMB_ACT_LAVA_DEATH:
if (obj_lava_death() == 1)
if (obj_lava_death() == TRUE) {
create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000);
}
break;
case BOBOMB_ACT_DEATH_PLANE_DEATH:
@@ -162,15 +166,17 @@ void stationary_bobomb_free_loop(void) {
bobomb_check_interactions();
if (o->oBobombFuseTimer >= 151)
if (o->oBobombFuseTimer > 150) {
o->oAction = 3;
}
}
void bobomb_free_loop(void) {
if (o->oBehParams2ndByte == BOBOMB_BP_STYPE_GENERIC)
if (o->oBehParams2ndByte == BOBOMB_BP_STYPE_GENERIC) {
generic_bobomb_free_loop();
else
} else {
stationary_bobomb_free_loop();
}
}
void bobomb_held_loop(void) {
@@ -179,7 +185,7 @@ void bobomb_held_loop(void) {
cur_obj_set_pos_relative(gMarioObject, 0, 60.0f, 100.0);
o->oBobombFuseLit = 1;
if (o->oBobombFuseTimer >= 151) {
if (o->oBobombFuseTimer > 150) {
//! Although the Bob-omb's action is set to explode when the fuse timer expires,
// bobomb_act_explode() will not execute until the bob-omb's held state changes.
// This allows the Bob-omb to be regrabbed indefinitely.
@@ -203,14 +209,12 @@ void bobomb_thrown_loop(void) {
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
o->oHeldState = 0;
o->oFlags &= ~0x8; /* bit 3 */
o->oForwardVel = 25.0;
o->oVelY = 20.0;
o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW;
o->oForwardVel = 25.0f;
o->oVelY = 20.0f;
o->oAction = BOBOMB_ACT_LAUNCHED;
}
// sp18 = blinkTimer
void curr_obj_random_blink(s32 *blinkTimer) {
if (*blinkTimer == 0) {
if ((s16)(random_float() * 100.0f) == 0) {
@@ -219,11 +223,16 @@ void curr_obj_random_blink(s32 *blinkTimer) {
}
} else {
(*blinkTimer)++;
if (*blinkTimer >= 6)
if (*blinkTimer > 5) {
o->oAnimState = 0;
if (*blinkTimer >= 11)
}
if (*blinkTimer > 10) {
o->oAnimState = 1;
if (*blinkTimer >= 16) {
}
if (*blinkTimer > 15) {
o->oAnimState = 0;
*blinkTimer = 0;
}
@@ -232,7 +241,8 @@ void curr_obj_random_blink(s32 *blinkTimer) {
void bhv_bobomb_loop(void) {
s8 dustPeriodMinus1;
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 4000) != 0) {
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 4000)) {
switch (o->oHeldState) {
case HELD_FREE:
bobomb_free_loop();
@@ -254,14 +264,16 @@ void bhv_bobomb_loop(void) {
curr_obj_random_blink(&o->oBobombBlinkTimer);
if (o->oBobombFuseLit == 1) {
if (o->oBobombFuseTimer >= 121)
if (o->oBobombFuseTimer > 120) {
dustPeriodMinus1 = 1;
else
} else {
dustPeriodMinus1 = 7;
}
if ((dustPeriodMinus1 & o->oBobombFuseTimer)
== 0) /* oBobombFuseTimer % 2 or oBobombFuseTimer % 8 */
// oBobombFuseTimer % 2 or oBobombFuseTimer % 8
if (!(dustPeriodMinus1 & o->oBobombFuseTimer)) {
spawn_object(o, MODEL_SMOKE, bhvBobombFuseSmoke);
}
cur_obj_play_sound_1(SOUND_AIR_BOBOMB_LIT_FUSE);
@@ -278,15 +290,15 @@ void bhv_bobomb_fuse_smoke_init(void) {
}
void bhv_bobomb_buddy_init(void) {
o->oGravity = 2.5;
o->oFriction = 0.8;
o->oBuoyancy = 1.3;
o->oGravity = 2.5f;
o->oFriction = 0.8f;
o->oBuoyancy = 1.3f;
o->oInteractionSubtype = INT_SUBTYPE_NPC;
}
void bobomb_buddy_act_idle(void) {
UNUSED u8 filler[4];
s16 sp1a = o->header.gfx.animInfo.animFrame;
s16 animFrame = o->header.gfx.animInfo.animFrame;
UNUSED s16 collisionFlags = 0;
o->oBobombBuddyPosXCopy = o->oPosX;
@@ -295,14 +307,17 @@ void bobomb_buddy_act_idle(void) {
collisionFlags = object_step();
if ((sp1a == 5) || (sp1a == 16))
if (animFrame == 5 || animFrame == 16) {
cur_obj_play_sound_2(SOUND_OBJ_BOBOMB_WALK);
}
if (o->oDistanceToMario < 1000.0f)
if (o->oDistanceToMario < 1000.0f) {
o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, o->oAngleToMario, 0x140);
}
if (o->oInteractStatus == INT_STATUS_INTERACTED)
if (o->oInteractStatus == INT_STATUS_INTERACTED) {
o->oAction = BOBOMB_BUDDY_ACT_TURN_TO_TALK;
}
}
/**
@@ -320,27 +335,30 @@ void bobomb_buddy_cannon_dialog(s16 dialogFirstText, s16 dialogSecondText) {
switch (o->oBobombBuddyCannonStatus) {
case BOBOMB_BUDDY_CANNON_UNOPENED:
buddyText = cutscene_object_with_dialog(CUTSCENE_DIALOG, o, dialogFirstText);
if (buddyText != 0) {
if (buddyText != DIALOG_RESPONSE_NONE) {
save_file_set_cannon_unlocked();
cannonClosed = cur_obj_nearest_object_with_behavior(bhvCannonClosed);
if (cannonClosed != 0)
if (cannonClosed != NULL) {
o->oBobombBuddyCannonStatus = BOBOMB_BUDDY_CANNON_OPENING;
else
} else {
o->oBobombBuddyCannonStatus = BOBOMB_BUDDY_CANNON_STOP_TALKING;
}
}
break;
case BOBOMB_BUDDY_CANNON_OPENING:
cannonClosed = cur_obj_nearest_object_with_behavior(bhvCannonClosed);
cutscene = cutscene_object(CUTSCENE_PREPARE_CANNON, cannonClosed);
if (cutscene == -1)
if (cutscene == -1) {
o->oBobombBuddyCannonStatus = BOBOMB_BUDDY_CANNON_OPENED;
}
break;
case BOBOMB_BUDDY_CANNON_OPENED:
buddyText = cutscene_object_with_dialog(CUTSCENE_DIALOG, o, dialogSecondText);
if (buddyText != 0)
if (buddyText != DIALOG_RESPONSE_NONE) {
o->oBobombBuddyCannonStatus = BOBOMB_BUDDY_CANNON_STOP_TALKING;
}
break;
case BOBOMB_BUDDY_CANNON_STOP_TALKING:
@@ -373,23 +391,28 @@ void bobomb_buddy_act_talk(void) {
break;
case BOBOMB_BUDDY_ROLE_CANNON:
if (gCurrCourseNum == COURSE_BOB)
if (gCurrCourseNum == COURSE_BOB) {
bobomb_buddy_cannon_dialog(DIALOG_004, DIALOG_105);
else
} else {
bobomb_buddy_cannon_dialog(DIALOG_047, DIALOG_106);
}
break;
}
}
}
void bobomb_buddy_act_turn_to_talk(void) {
s16 sp1e = o->header.gfx.animInfo.animFrame;
if ((sp1e == 5) || (sp1e == 16))
s16 animFrame = o->header.gfx.animInfo.animFrame;
if (animFrame == 5 || animFrame == 16) {
cur_obj_play_sound_2(SOUND_OBJ_BOBOMB_WALK);
}
o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, o->oAngleToMario, 0x1000);
if ((s16) o->oMoveAngleYaw == (s16) o->oAngleToMario)
if ((s16) o->oMoveAngleYaw == (s16) o->oAngleToMario) {
o->oAction = BOBOMB_BUDDY_ACT_TALK;
}
cur_obj_play_sound_2(SOUND_ACTION_READ_SIGN);
}
+9 -9
View File
@@ -1,4 +1,4 @@
// bomp.c.inc
// bomp.inc.c
void bhv_small_bomp_init(void) {
o->oFaceAngleYaw -= 0x4000;
@@ -9,7 +9,7 @@ void bhv_small_bomp_init(void) {
void bhv_small_bomp_loop(void) {
switch (o->oAction) {
case BOMP_ACT_WAIT:
if (o->oTimer >= 101) {
if (o->oTimer > 100) {
o->oAction = BOMP_ACT_POKE_OUT;
o->oForwardVel = 30.0f;
}
@@ -18,7 +18,7 @@ void bhv_small_bomp_loop(void) {
case BOMP_ACT_POKE_OUT:
if (o->oPosX > 3450.0f) {
o->oPosX = 3450.0f;
o->oForwardVel = 0;
o->oForwardVel = 0.0f;
}
if (o->oTimer == 15.0) {
@@ -31,7 +31,7 @@ void bhv_small_bomp_loop(void) {
case BOMP_ACT_EXTEND:
if (o->oPosX > 3830.0f) {
o->oPosX = 3830.0f;
o->oForwardVel = 0;
o->oForwardVel = 0.0f;
}
if (o->oTimer == 60) {
@@ -45,7 +45,7 @@ void bhv_small_bomp_loop(void) {
case BOMP_ACT_RETRACT:
if (o->oPosX < 3330.0f) {
o->oPosX = 3330.0f;
o->oForwardVel = 0;
o->oForwardVel = 0.0f;
}
if (o->oTimer == 90) {
@@ -65,7 +65,7 @@ void bhv_large_bomp_init(void) {
void bhv_large_bomp_loop(void) {
switch (o->oAction) {
case BOMP_ACT_WAIT:
if (o->oTimer >= 101) {
if (o->oTimer > 100) {
o->oAction = BOMP_ACT_POKE_OUT;
o->oForwardVel = 30.0f;
}
@@ -74,7 +74,7 @@ void bhv_large_bomp_loop(void) {
case BOMP_ACT_POKE_OUT:
if (o->oPosX > 3450.0f) {
o->oPosX = 3450.0f;
o->oForwardVel = 0;
o->oForwardVel = 0.0f;
}
if (o->oTimer == 15.0) {
@@ -87,7 +87,7 @@ void bhv_large_bomp_loop(void) {
case BOMP_ACT_EXTEND:
if (o->oPosX > 3830.0f) {
o->oPosX = 3830.0f;
o->oForwardVel = 0;
o->oForwardVel = 0.0f;
}
if (o->oTimer == 60) {
@@ -101,7 +101,7 @@ void bhv_large_bomp_loop(void) {
case BOMP_ACT_RETRACT:
if (o->oPosX < 3330.0f) {
o->oPosX = 3330.0f;
o->oForwardVel = 0;
o->oForwardVel = 0.0f;
}
if (o->oTimer == 90) {
+71 -76
View File
@@ -1,22 +1,24 @@
// boo.c.inc
// boo.inc.c
#define SPAWN_CASTLE_BOO_STAR_REQUIREMENT 12
static struct ObjectHitbox sBooGivingStarHitbox = {
/* interactType: */ 0,
/* downOffset: */ 0,
/* interactType: */ 0,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 3,
/* health: */ 3,
/* numLootCoins: */ 0,
/* radius: */ 140,
/* height: */ 80,
/* hurtboxRadius: */ 40,
/* hurtboxHeight: */ 60,
/* health: */ 3,
/* numLootCoins: */ 0,
/* radius: */ 140,
/* height: */ 80,
/* hurtboxRadius: */ 40,
/* hurtboxHeight: */ 60,
};
// Relative positions
static s16 sCourtyardBooTripletPositions[][3] = {
{0, 50, 0},
{210, 110, 210},
{-210, 70, -210}
{ 0, 50, 0 },
{ 210, 110, 210 },
{ -210, 70, -210 },
};
static void boo_stop(void) {
@@ -41,10 +43,8 @@ static s32 boo_should_be_stopped(void) {
return TRUE;
}
if (o->oRoom == 10) {
if (gTimeStopState & TIME_STOP_MARIO_OPENED_DOOR) {
return TRUE;
}
if (o->oRoom == 10 && (gTimeStopState & TIME_STOP_MARIO_OPENED_DOOR)) {
return TRUE;
}
}
@@ -71,10 +71,8 @@ static s32 boo_should_be_active(void) {
return TRUE;
}
} else if (!boo_should_be_stopped()) {
if (
o->oDistanceToMario < activationRadius &&
(o->oRoom == gMarioCurrentRoom || gMarioCurrentRoom == 0)
) {
if (o->oDistanceToMario < activationRadius
&& (o->oRoom == gMarioCurrentRoom || gMarioCurrentRoom == 0)) {
return TRUE;
}
}
@@ -84,21 +82,14 @@ static s32 boo_should_be_active(void) {
void bhv_courtyard_boo_triplet_init(void) {
s32 i;
struct Object *boo;
if (gHudDisplay.stars < 12) {
if (gHudDisplay.stars < SPAWN_CASTLE_BOO_STAR_REQUIREMENT) {
obj_mark_for_deletion(o);
} else {
for (i = 0; i < 3; i++) {
boo = spawn_object_relative(
0x01,
sCourtyardBooTripletPositions[i][0],
sCourtyardBooTripletPositions[i][1],
sCourtyardBooTripletPositions[i][2],
o,
MODEL_BOO,
bhvGhostHuntBoo
);
struct Object *boo = spawn_object_relative(
1, sCourtyardBooTripletPositions[i][0], sCourtyardBooTripletPositions[i][1],
sCourtyardBooTripletPositions[i][2], o, MODEL_BOO, bhvGhostHuntBoo);
boo->oMoveAngleYaw = random_u16();
}
@@ -124,14 +115,14 @@ static void boo_approach_target_opacity_and_update_scale(void) {
}
}
scale = (o->oOpacity/255.0f * 0.4 + 0.6) * o->oBooBaseScale;
scale = (o->oOpacity / 255.0f * 0.4 + 0.6) * o->oBooBaseScale;
obj_scale(o, scale); // why no cur_obj_scale? was cur_obj_scale written later?
}
static void boo_oscillate(s32 ignoreOpacity) {
o->oFaceAnglePitch = sins(o->oBooOscillationTimer) * 0x400;
if (o->oOpacity == 0xFF || ignoreOpacity == TRUE) {
if (o->oOpacity == 255 || ignoreOpacity == TRUE) {
o->header.gfx.scale[0] = sins(o->oBooOscillationTimer) * 0.08 + o->oBooBaseScale;
o->header.gfx.scale[1] = -sins(o->oBooOscillationTimer) * 0.08 + o->oBooBaseScale;
o->header.gfx.scale[2] = o->header.gfx.scale[0];
@@ -145,15 +136,13 @@ static s32 boo_vanish_or_appear(void) {
s16 relativeMarioFaceAngle = abs_angle_diff(o->oMoveAngleYaw, gMarioObject->oFaceAngleYaw);
// magic?
s16 relativeAngleToMarioThreshhold = 0x1568;
s16 relativeMarioFaceAngleThreshhold = 0x6b58;
s16 relativeMarioFaceAngleThreshhold = 0x6B58;
s32 doneAppearing = FALSE;
o->oVelY = 0.0f;
if (
relativeAngleToMario > relativeAngleToMarioThreshhold ||
relativeMarioFaceAngle < relativeMarioFaceAngleThreshhold
) {
if (relativeAngleToMario > relativeAngleToMarioThreshhold
|| relativeMarioFaceAngle < relativeMarioFaceAngleThreshhold) {
if (o->oOpacity == 40) {
o->oBooTargetOpacity = 255;
cur_obj_play_sound_2(SOUND_OBJ_BOO_LAUGH_LONG);
@@ -175,9 +164,9 @@ static void boo_set_move_yaw_for_during_hit(s32 hurt) {
o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW;
o->oBooMoveYawBeforeHit = (f32) o->oMoveAngleYaw;
if (hurt != FALSE) {
if (hurt) {
o->oBooMoveYawDuringHit = gMarioObject->oMoveAngleYaw;
} else if (coss((s16)o->oMoveAngleYaw - (s16)o->oAngleToMario) < 0.0f) {
} else if (coss((s16) o->oMoveAngleYaw - (s16) o->oAngleToMario) < 0.0f) {
o->oBooMoveYawDuringHit = o->oMoveAngleYaw;
} else {
o->oBooMoveYawDuringHit = (s16)(o->oMoveAngleYaw + 0x8000);
@@ -196,7 +185,7 @@ static void boo_move_during_hit(s32 roll, f32 fVel) {
o->oVelY = coss(oscillationVel);
o->oMoveAngleYaw = o->oBooMoveYawDuringHit;
if (roll != FALSE) {
if (roll) {
o->oFaceAngleYaw += sBooHitRotations[o->oTimer];
o->oFaceAngleRoll += sBooHitRotations[o->oTimer];
}
@@ -223,11 +212,12 @@ static s32 boo_update_after_bounced_on(f32 a0) {
}
if (o->oTimer < 32) {
boo_move_during_hit(FALSE, sBooHitRotations[o->oTimer]/5000.0f * a0);
boo_move_during_hit(FALSE, sBooHitRotations[o->oTimer] / 5000.0f * a0);
} else {
cur_obj_become_tangible();
boo_reset_after_hit();
o->oAction = 1;
return TRUE;
}
@@ -243,13 +233,12 @@ static s32 big_boo_update_during_nonlethal_hit(f32 a0) {
}
if (o->oTimer < 32) {
boo_move_during_hit(TRUE, sBooHitRotations[o->oTimer]/5000.0f * a0);
boo_move_during_hit(TRUE, sBooHitRotations[o->oTimer] / 5000.0f * a0);
} else if (o->oTimer < 48) {
big_boo_shake_after_hit();
} else {
cur_obj_become_tangible();
boo_reset_after_hit();
o->oAction = 1;
return TRUE;
@@ -261,8 +250,6 @@ static s32 big_boo_update_during_nonlethal_hit(f32 a0) {
// called every frame once mario lethally hits the boo until the boo is deleted,
// returns whether death is complete
static s32 boo_update_during_death(void) {
struct Object *parentBigBoo;
if (o->oTimer == 0) {
o->oForwardVel = 40.0f;
o->oMoveAngleYaw = gMarioObject->oMoveAngleYaw;
@@ -278,14 +265,14 @@ static s32 boo_update_during_death(void) {
o->oBooDeathStatus = BOO_DEATH_STATUS_DEAD;
if (o->oBooParentBigBoo != NULL) {
parentBigBoo = o->oBooParentBigBoo;
struct Object *parentBigBoo = o->oBooParentBigBoo;
#ifndef VERSION_JP
if (!cur_obj_has_behavior(bhvBoo)) {
#endif
parentBigBoo->oBigBooNumMinionBoosKilled++;
#ifndef VERSION_JP
}
#else
parentBigBoo->oBigBooNumMinionBoosKilled++;
#endif
}
@@ -312,7 +299,8 @@ static s32 boo_get_attack_status(void) {
s32 attackStatus = BOO_NOT_ATTACKED;
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
if ((o->oInteractStatus & INT_STATUS_WAS_ATTACKED) && !obj_has_attack_type(ATTACK_FROM_ABOVE)) {
if ((o->oInteractStatus & INT_STATUS_WAS_ATTACKED)
&& !obj_has_attack_type(ATTACK_FROM_ABOVE)) {
cur_obj_become_intangible();
o->oInteractStatus = 0;
@@ -338,7 +326,7 @@ static void boo_chase_mario(f32 a0, s16 a1, f32 a2) {
s16 sp1A;
if (boo_vanish_or_appear()) {
o->oInteractType = 0x8000;
o->oInteractType = INTERACT_BOUNCE_TOP;
if (cur_obj_lateral_dist_from_mario_to_home() > 1500.0f) {
sp1A = cur_obj_angle_to_home();
@@ -349,10 +337,11 @@ static void boo_chase_mario(f32 a0, s16 a1, f32 a2) {
cur_obj_rotate_yaw_toward(sp1A, a1);
o->oVelY = 0.0f;
if (mario_is_in_air_action() == 0) {
if (!mario_is_in_air_action()) {
sp1C = o->oPosY - gMarioObject->oPosY;
if (a0 < sp1C && sp1C < 500.0f) {
o->oVelY = increment_velocity_toward_range(o->oPosY, gMarioObject->oPosY + 50.0f, 10.f, 2.0f);
o->oVelY = increment_velocity_toward_range
(o->oPosY, gMarioObject->oPosY + 50.0f, 10.0f, 2.0f);
}
}
@@ -383,7 +372,7 @@ static void boo_act_0(void) {
o->oBooParentBigBoo = cur_obj_nearest_object_with_behavior(bhvGhostHuntBigBoo);
o->oBooBaseScale = 1.0f;
o->oBooTargetOpacity = 0xFF;
o->oBooTargetOpacity = 255;
if (boo_should_be_active()) {
// Condition is met if the object is bhvBalconyBigBoo or bhvMerryGoRoundBoo
@@ -417,6 +406,7 @@ static void boo_act_1(void) {
}
boo_chase_mario(-100.0f, o->oBooTurningSpeed + 0x180, 0.5f);
attackStatus = boo_get_attack_status();
if (boo_should_be_stopped()) {
@@ -480,7 +470,7 @@ static void (*sBooActions[])(void) = {
boo_act_2,
boo_act_3,
boo_act_4,
boo_act_5
boo_act_5,
};
void bhv_boo_loop(void) {
@@ -491,10 +481,9 @@ void bhv_boo_loop(void) {
cur_obj_move_standard(78);
boo_approach_target_opacity_and_update_scale();
if (obj_has_behavior(o->parentObj, bhvMerryGoRoundBooManager)) {
if (o->activeFlags == ACTIVE_FLAG_DEACTIVATED) {
o->parentObj->oMerryGoRoundBooManagerNumBoosKilled++;
}
if (obj_has_behavior(o->parentObj, bhvMerryGoRoundBooManager)
&& o->activeFlags == ACTIVE_FLAG_DEACTIVATED) {
o->parentObj->oMerryGoRoundBooManagerNumBoosKilled++;
}
o->oInteractStatus = 0;
@@ -510,11 +499,13 @@ static void big_boo_act_0(void) {
o->oBooParentBigBoo = NULL;
if (boo_should_be_active()
#ifndef VERSION_JP
if (boo_should_be_active() && gDebugInfo[5][0] + 5 <= o->oBigBooNumMinionBoosKilled) {
&& o->oBigBooNumMinionBoosKilled >= gDebugInfo[DEBUG_PAGE_ENEMYINFO][0] + 5
#else
if (boo_should_be_active() && o->oBigBooNumMinionBoosKilled >= 5) {
&& o->oBigBooNumMinionBoosKilled >= 5
#endif
) {
o->oAction = 1;
cur_obj_set_pos_to_home();
@@ -522,7 +513,7 @@ static void big_boo_act_0(void) {
cur_obj_unhide();
o->oBooTargetOpacity = 0xFF;
o->oBooTargetOpacity = 255;
o->oBooBaseScale = 3.0f;
o->oHealth = 3;
@@ -569,7 +560,7 @@ static void big_boo_act_1(void) {
o->oAction = 3;
}
if (attackStatus == 1) {
if (attackStatus == BOO_ATTACKED) {
create_sound_spawner(SOUND_OBJ_THWOMP);
}
}
@@ -660,7 +651,7 @@ static void (*sBooGivingStarActions[])(void) = {
big_boo_act_1,
big_boo_act_2,
big_boo_act_3,
big_boo_act_4
big_boo_act_4,
};
void bhv_big_boo_loop(void) {
@@ -675,12 +666,13 @@ void bhv_big_boo_loop(void) {
cur_obj_move_standard(78);
boo_approach_target_opacity_and_update_scale();
o->oInteractStatus = 0;
}
static void boo_with_cage_act_0(void) {
o->oBooParentBigBoo = NULL;
o->oBooTargetOpacity = 0xFF;
o->oBooTargetOpacity = 255;
o->oBooBaseScale = 2.0f;
cur_obj_scale(2.0f);
@@ -724,12 +716,10 @@ static void boo_with_cage_act_3(void) {
}
void bhv_boo_with_cage_init(void) {
struct Object* cage;
if (gHudDisplay.stars < 12) {
if (gHudDisplay.stars < SPAWN_CASTLE_BOO_STAR_REQUIREMENT) {
obj_mark_for_deletion(o);
} else {
cage = spawn_object(o, MODEL_HAUNTED_CAGE, bhvBooCage);
struct Object *cage = spawn_object(o, MODEL_HAUNTED_CAGE, bhvBooCage);
cage->oBehParams = o->oBehParams;
}
}
@@ -738,11 +728,10 @@ static void (*sBooWithCageActions[])(void) = {
boo_with_cage_act_0,
boo_with_cage_act_1,
boo_with_cage_act_2,
boo_with_cage_act_3
boo_with_cage_act_3,
};
void bhv_boo_with_cage_loop(void)
{
void bhv_boo_with_cage_loop(void) {
//PARTIAL_UPDATE
cur_obj_update_floor_and_walls();
@@ -750,6 +739,7 @@ void bhv_boo_with_cage_loop(void)
cur_obj_move_standard(78);
boo_approach_target_opacity_and_update_scale();
o->oInteractStatus = 0;
}
@@ -759,7 +749,8 @@ void bhv_merry_go_round_boo_manager_loop(void) {
if (o->oDistanceToMario < 1000.0f) {
if (o->oMerryGoRoundBooManagerNumBoosKilled < 5) {
if (o->oMerryGoRoundBooManagerNumBoosSpawned != 5) {
if (o->oMerryGoRoundBooManagerNumBoosSpawned - o->oMerryGoRoundBooManagerNumBoosKilled < 2) {
if (o->oMerryGoRoundBooManagerNumBoosSpawned
- o->oMerryGoRoundBooManagerNumBoosKilled < 2) {
spawn_object(o, MODEL_BOO, bhvMerryGoRoundBoo);
o->oMerryGoRoundBooManagerNumBoosSpawned++;
}
@@ -768,7 +759,7 @@ void bhv_merry_go_round_boo_manager_loop(void) {
o->oAction++;
}
if (o->oMerryGoRoundBooManagerNumBoosKilled > 4) {
if (o->oMerryGoRoundBooManagerNumBoosKilled >= 5) {
struct Object *boo = spawn_object(o, MODEL_BOO, bhvMerryGoRoundBigBoo);
obj_copy_behavior_params(boo, o);
@@ -783,12 +774,14 @@ void bhv_merry_go_round_boo_manager_loop(void) {
}
break;
case 1:
if (o->oTimer > 60) {
o->oAction = 0;
}
break;
case 2:
break;
}
@@ -810,7 +803,7 @@ void bhv_boo_in_castle_loop(void) {
if (o->oAction == 0) {
cur_obj_hide();
if (gHudDisplay.stars < 12) {
if (gHudDisplay.stars < SPAWN_CASTLE_BOO_STAR_REQUIREMENT) {
obj_mark_for_deletion(o);
}
@@ -878,7 +871,7 @@ void bhv_boo_staircase(void) {
break;
}
switch(o->oAction) {
switch (o->oAction) {
case 0:
o->oPosY = o->oHomeY - 620.0f;
o->oAction++;
@@ -893,6 +886,7 @@ void bhv_boo_staircase(void) {
}
break;
case 2:
if (o->oTimer == 0) {
cur_obj_play_sound_2(SOUND_GENERAL_UNKNOWN4_LOWPRIO);
@@ -903,6 +897,7 @@ void bhv_boo_staircase(void) {
}
break;
case 3:
if (o->oTimer == 0 && o->oBehParams2ndByte == 1) {
play_puzzle_jingle();
+14 -9
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvBooCage.
* This is the cage inside the big boo in the castle courtyard
@@ -10,22 +11,22 @@
* Mario has to enter to enter BBH.
*/
static struct ObjectHitbox sBooCageHitbox = {
/* interactType: */ INTERACT_BBH_ENTRANCE,
/* downOffset: */ 0,
/* interactType: */ INTERACT_BBH_ENTRANCE,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 0,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 120,
/* height: */ 300,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 120,
/* height: */ 300,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
};
/**
* Update function for bhvBooCage.
*/
void bhv_boo_cage_loop(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
obj_set_hitbox(o, &sBooCageHitbox);
@@ -50,6 +51,7 @@ void bhv_boo_cage_loop(void) {
}
break;
case BOO_CAGE_ACT_FALLING:
// Reset pitch and roll. This is useless, since the cage never rotates.
// Was it meant to rotate inside the boo, like the beta boo key?
@@ -78,6 +80,7 @@ void bhv_boo_cage_loop(void) {
}
break;
case BOO_CAGE_ACT_ON_GROUND:
// Allow Mario to enter the cage once it's still on the ground.
cur_obj_become_tangible();
@@ -91,6 +94,7 @@ void bhv_boo_cage_loop(void) {
}
break;
case BOO_CAGE_ACT_MARIO_JUMPING_IN:
// All this action does is wait 100 frames after Mario starts
// jumping into the cage to set the action to BOO_CAGE_ACT_USELESS,
@@ -101,6 +105,7 @@ void bhv_boo_cage_loop(void) {
}
break;
case BOO_CAGE_ACT_USELESS:
break;
}
+15 -9
View File
@@ -1,4 +1,4 @@
// boulder.c.inc
// boulder.inc.c
void bhv_big_boulder_init(void) {
o->oHomeX = o->oPosX;
@@ -11,24 +11,27 @@ void bhv_big_boulder_init(void) {
}
void boulder_act_1(void) {
s16 sp1E;
s16 collisionFlags = object_step_without_floor_orient();
sp1E = object_step_without_floor_orient();
if ((sp1E & 0x09) == 0x01 && o->oVelY > 10.0f) {
if ((collisionFlags & OBJ_COL_FLAGS_LANDED) == OBJ_COL_FLAG_GROUNDED && o->oVelY > 10.0f) {
cur_obj_play_sound_2(SOUND_GENERAL_GRINDEL_ROLL);
spawn_mist_particles();
}
if (o->oForwardVel > 70.0)
if (o->oForwardVel > 70.0) {
o->oForwardVel = 70.0f;
}
if (o->oPosY < -1000.0f)
if (o->oPosY < -1000.0f) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
}
void bhv_big_boulder_loop(void) {
cur_obj_scale(1.5f);
o->oGraphYOffset = 270.0f;
switch (o->oAction) {
case 0:
o->oForwardVel = 40.0f;
@@ -47,20 +50,23 @@ void bhv_big_boulder_loop(void) {
void bhv_big_boulder_generator_loop(void) {
struct Object *sp1C;
if (o->oTimer >= 256) {
o->oTimer = 0;
}
if (!current_mario_room_check(4) || is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1500))
if (!current_mario_room_check(4)
|| is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1500)) {
return;
}
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 6000)) {
if ((o->oTimer & 0x3F) == 0) {
if (!(o->oTimer & 0x3F)) {
sp1C = spawn_object(o, MODEL_HMC_ROLLING_ROCK, bhvBigBoulder);
sp1C->oMoveAngleYaw = random_float() * 4096.0f;
}
} else {
if ((o->oTimer & 0x7F) == 0) {
if (!(o->oTimer & 0x7F)) {
sp1C = spawn_object(o, MODEL_HMC_ROLLING_ROCK, bhvBigBoulder);
sp1C->oMoveAngleYaw = random_float() * 4096.0f;
}
+34 -9
View File
@@ -1,54 +1,79 @@
// bouncing_fireball.c.inc
// bouncing_fireball.inc.c
void bhv_bouncing_fireball_flame_loop(void) {
o->activeFlags |= ACTIVE_FLAG_UNK10;
cur_obj_update_floor_and_walls();
switch (o->oAction) {
case 0:
if (o->oTimer == 0) {
o->oAnimState = random_float() * 10.0f;
o->oVelY = 30.0f;
}
if (o->oMoveFlags & OBJ_MOVE_LANDED)
if (o->oMoveFlags & OBJ_MOVE_LANDED) {
o->oAction++;
}
break;
case 1:
if (o->oTimer == 0) {
o->oVelY = 50.0f;
o->oForwardVel = 30.0f;
}
if (o->oMoveFlags & (OBJ_MOVE_UNDERWATER_ON_GROUND | OBJ_MOVE_AT_WATER_SURFACE | OBJ_MOVE_ON_GROUND) && o->oTimer > 100)
if (o->oMoveFlags
& (OBJ_MOVE_ON_GROUND | OBJ_MOVE_AT_WATER_SURFACE | OBJ_MOVE_UNDERWATER_ON_GROUND)
&& o->oTimer > 100) {
obj_mark_for_deletion(o);
}
break;
}
if (o->oTimer > 300)
if (o->oTimer > 300) {
obj_mark_for_deletion(o);
}
cur_obj_move_standard(78);
o->oInteractStatus = 0;
}
void bhv_bouncing_fireball_loop(void) {
struct Object *sp2C;
f32 sp28;
switch (o->oAction) {
case 0:
if (o->oDistanceToMario < 2000.0f)
if (o->oDistanceToMario < 2000.0f) {
o->oAction = 1;
}
break;
case 1:
sp2C = spawn_object(o, MODEL_RED_FLAME, bhvBouncingFireballFlame);
sp28 = (10 - o->oTimer) * 0.5;
obj_scale_xyz(sp2C, sp28, sp28, sp28);
if (o->oTimer == 0)
if (o->oTimer == 0) {
obj_become_tangible(sp2C);
if (o->oTimer > 10)
}
if (o->oTimer > 10) {
o->oAction++;
}
break;
case 2:
if (o->oTimer == 0)
if (o->oTimer == 0) {
o->oBouncingFireBallUnkF4 = random_float() * 100.0f;
if (o->oBouncingFireBallUnkF4 + 100 < o->oTimer)
}
if (o->oBouncingFireBallUnkF4 + 100 < o->oTimer) {
o->oAction = 0;
}
break;
}
}
+40 -36
View File
@@ -1,4 +1,4 @@
// bowling_ball.c.inc
// bowling_ball.inc.c
static struct ObjectHitbox sBowlingBallHitbox = {
/* interactType: */ INTERACT_DAMAGE,
@@ -48,8 +48,9 @@ void bhv_bowling_ball_init(void) {
void bowling_ball_set_hitbox(void) {
obj_set_hitbox(o, &sBowlingBallHitbox);
if (o->oInteractStatus & INT_STATUS_INTERACTED)
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
o->oInteractStatus = 0;
}
}
void bowling_ball_set_waypoints(void) {
@@ -78,16 +79,16 @@ void bowling_ball_set_waypoints(void) {
void bhv_bowling_ball_roll_loop(void) {
s16 collisionFlags;
s32 sp18;
s32 followStatus;
#ifdef AVOID_UB
sp18 = 0;
followStatus = 0;
#endif
bowling_ball_set_waypoints();
collisionFlags = object_step();
//! Uninitialzed parameter, but the parameter is unused in the called function
sp18 = cur_obj_follow_path(sp18);
followStatus = cur_obj_follow_path(followStatus);
o->oBowlingBallTargetYaw = o->oPathedTargetYaw;
o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, o->oBowlingBallTargetYaw, 0x400);
@@ -97,7 +98,7 @@ void bhv_bowling_ball_roll_loop(void) {
bowling_ball_set_hitbox();
if (sp18 == -1) {
if (followStatus == PATH_REACHED_END) {
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 7000)) {
spawn_mist_particles();
spawn_mist_particles_variable(0, 0, 92.0f);
@@ -106,20 +107,21 @@ void bhv_bowling_ball_roll_loop(void) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
if ((collisionFlags & OBJ_COL_FLAG_GROUNDED) && (o->oVelY > 5.0f))
if ((collisionFlags & OBJ_COL_FLAG_GROUNDED) && (o->oVelY > 5.0f)) {
cur_obj_play_sound_2(SOUND_GENERAL_QUIET_POUND1_LOWPRIO);
}
}
void bhv_bowling_ball_initializeLoop(void) {
s32 sp1c;
void bhv_bowling_ball_initialize_loop(void) {
s32 followStatus;
#ifdef AVOID_UB
sp1c = 0;
followStatus = 0;
#endif
bowling_ball_set_waypoints();
//! Uninitialzed parameter, but the parameter is unused in the called function
sp1c = cur_obj_follow_path(sp1c);
followStatus = cur_obj_follow_path(followStatus);
o->oMoveAngleYaw = o->oPathedTargetYaw;
@@ -152,7 +154,7 @@ void bhv_bowling_ball_loop(void) {
switch (o->oAction) {
case BBALL_ACT_INITIALIZE:
o->oAction = BBALL_ACT_ROLL;
bhv_bowling_ball_initializeLoop();
bhv_bowling_ball_initialize_loop();
break;
case BBALL_ACT_ROLL:
@@ -160,8 +162,9 @@ void bhv_bowling_ball_loop(void) {
break;
}
if (o->oBehParams2ndByte != 4)
if (o->oBehParams2ndByte != BBALL_BP_STYPE_THI_SMALL) {
set_camera_shake_from_point(SHAKE_POS_BOWLING_BALL, o->oPosX, o->oPosY, o->oPosZ);
}
set_object_visibility(o, 4000);
}
@@ -186,42 +189,39 @@ void bhv_generic_bowling_ball_spawner_init(void) {
}
void bhv_generic_bowling_ball_spawner_loop(void) {
struct Object *bowlingBall;
if (o->oTimer == 256)
if (o->oTimer == 256) {
o->oTimer = 0;
}
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1000)
|| (o->oPosY < gMarioObject->header.gfx.pos[1]))
|| o->oPosY < gMarioObject->header.gfx.pos[1]) {
return;
}
if ((o->oTimer & o->oBBallSpawnerPeriodMinus1) == 0) /* Modulus */
{
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, o->oBBallSpawnerMaxSpawnDist)) {
if ((s32)(random_float() * o->oBBallSpawnerSpawnOdds) == 0) {
bowlingBall = spawn_object(o, MODEL_BOWLING_BALL, bhvBowlingBall);
bowlingBall->oBehParams2ndByte = o->oBehParams2ndByte;
}
if ((o->oTimer & o->oBBallSpawnerPeriodMinus1) == 0) { /* Modulus */
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, o->oBBallSpawnerMaxSpawnDist)
&& (s32)(random_float() * o->oBBallSpawnerSpawnOdds) == 0) {
struct Object *bowlingBall = spawn_object(o, MODEL_BOWLING_BALL, bhvBowlingBall);
bowlingBall->oBehParams2ndByte = o->oBehParams2ndByte;
}
}
}
void bhv_thi_bowling_ball_spawner_loop(void) {
struct Object *bowlingBall;
if (o->oTimer == 256)
if (o->oTimer == 256) {
o->oTimer = 0;
}
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 800)
|| (o->oPosY < gMarioObject->header.gfx.pos[1]))
|| o->oPosY < gMarioObject->header.gfx.pos[1]) {
return;
}
if ((o->oTimer % 64) == 0) {
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 12000)) {
if ((s32)(random_float() * 1.5) == 0) {
bowlingBall = spawn_object(o, MODEL_BOWLING_BALL, bhvBowlingBall);
bowlingBall->oBehParams2ndByte = o->oBehParams2ndByte;
}
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 12000)
&& (s32)(random_float() * 1.5) == 0) {
struct Object *bowlingBall = spawn_object(o, MODEL_BOWLING_BALL, bhvBowlingBall);
bowlingBall->oBehParams2ndByte = o->oBehParams2ndByte;
}
}
}
@@ -237,8 +237,9 @@ void bhv_bob_pit_bowling_ball_loop(void) {
UNUSED s16 collisionFlags = object_step();
find_floor_height_and_data(o->oPosX, o->oPosY, o->oPosZ, &sp1c);
if ((sp1c->normalX == 0) && (sp1c->normalZ == 0))
if ((sp1c->normalX == 0) && (sp1c->normalZ == 0)) {
o->oForwardVel = 28.0f;
}
bowling_ball_set_hitbox();
set_camera_shake_from_point(SHAKE_POS_BOWLING_BALL, o->oPosX, o->oPosY, o->oPosZ);
@@ -259,6 +260,7 @@ void bhv_free_bowling_ball_init(void) {
void bhv_free_bowling_ball_roll_loop(void) {
s16 collisionFlags = object_step();
bowling_ball_set_hitbox();
if (o->oForwardVel > 10.0f) {
@@ -266,8 +268,9 @@ void bhv_free_bowling_ball_roll_loop(void) {
cur_obj_play_sound_1(SOUND_ENV_UNKNOWN2);
}
if ((collisionFlags & OBJ_COL_FLAG_GROUNDED) && !(collisionFlags & OBJ_COL_FLAGS_LANDED))
if ((collisionFlags & OBJ_COL_FLAG_GROUNDED) && !(collisionFlags & OBJ_COL_FLAGS_LANDED)) {
cur_obj_play_sound_2(SOUND_GENERAL_QUIET_POUND1_LOWPRIO);
}
if (!is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 6000)) {
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
@@ -298,8 +301,9 @@ void bhv_free_bowling_ball_loop(void) {
break;
case FREE_BBALL_ACT_RESET:
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 5000))
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 5000)) {
o->oAction = FREE_BBALL_ACT_IDLE;
}
break;
}
}
File diff suppressed because it is too large Load Diff
+18 -12
View File
@@ -1,14 +1,13 @@
// bowser_bomb.c.inc
// bowser_bomb.inc.c
void bhv_bowser_bomb_loop(void) {
if (obj_check_if_collided_with_object(o, gMarioObject) == 1) {
if (obj_check_if_collided_with_object(o, gMarioObject) == TRUE) {
o->oInteractStatus &= ~INT_STATUS_INTERACTED;
spawn_object(o, MODEL_EXPLOSION, bhvExplosion);
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
if (o->oInteractStatus & INT_STATUS_HIT_MINE)
{
if (o->oInteractStatus & INT_STATUS_HIT_MINE) {
spawn_object(o, MODEL_BOWSER_FLAMES, bhvBowserBombExplosion);
create_sound_spawner(SOUND_GENERAL_BOWSER_BOMB_EXPLOSION);
set_camera_shake_from_point(SHAKE_POS_LARGE, o->oPosX, o->oPosY, o->oPosZ);
@@ -19,33 +18,40 @@ void bhv_bowser_bomb_loop(void) {
}
void bhv_bowser_bomb_explosion_loop(void) {
struct Object *mineSmoke;
cur_obj_scale((f32) o->oTimer / 14.0f * 9.0 + 1.0);
if ((o->oTimer % 4 == 0) && (o->oTimer < 20)) {
mineSmoke = spawn_object(o, MODEL_BOWSER_SMOKE, bhvBowserBombSmoke);
struct Object *mineSmoke = spawn_object(o, MODEL_BOWSER_SMOKE, bhvBowserBombSmoke);
mineSmoke->oPosX += random_float() * 600.0f - 400.0f;
mineSmoke->oPosZ += random_float() * 600.0f - 400.0f;
mineSmoke->oVelY += random_float() * 10.0f;
}
if (o->oTimer % 2 == 0)
if (o->oTimer % 2 == 0) {
o->oAnimState++;
if (o->oTimer == 28)
}
if (o->oTimer == 28) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
}
void bhv_bowser_bomb_smoke_loop(void) {
cur_obj_scale((f32) o->oTimer / 14.0f * 9.0 + 1.0);
if (o->oTimer % 2 == 0)
if (o->oTimer % 2 == 0) {
o->oAnimState++;
}
o->oOpacity -= 10;
if (o->oOpacity < 10)
if (o->oOpacity < 10) {
o->oOpacity = 0;
}
o->oPosY += o->oVelY;
if (o->oTimer == 28)
if (o->oTimer == 28) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
}
@@ -1,3 +1,5 @@
// bowser_falling_platform.inc.c
struct BowserFallingPlatformData {
const Collision *collision;
s16 posX;
@@ -16,32 +18,40 @@ struct BowserFallingPlatformData sBowserFallingPlatform[] = {
{ bowser_3_seg7_collision_07004EAC, 1158, 390, 18432 },
{ bowser_3_seg7_collision_07004F30, 800, -1000, 20992 },
{ bowser_3_seg7_collision_07004FB4, 800, -1000, -31744 },
{ bowser_3_seg7_collision_07005038, -800, -1000, 31744 }
{ bowser_3_seg7_collision_07005038, -800, -1000, 31744 },
};
void falling_bowser_plat_act_start(void) {
o->oBitsPlatformBowser = cur_obj_nearest_object_with_behavior(bhvBowser);
obj_set_collision_data(o, sBowserFallingPlatform[o->oBehParams2ndByte].collision);
if (o->oBitsPlatformBowser != 0)
if (o->oBitsPlatformBowser != NULL) {
o->oAction = BOWSER_BITS_PLAT_ACT_CHECK;
}
}
void falling_bowser_plat_act_check(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
struct Object *bowser = o->oBitsPlatformBowser;
if (bowser->platform == o) {
if (bowser->oAction == BOWSER_ACT_BIG_JUMP && bowser->oBowserStatus & BOWSER_STATUS_BIG_JUMP) {
if (bowser->oAction == BOWSER_ACT_BIG_JUMP
&& bowser->oBowserStatus & BOWSER_STATUS_BIG_JUMP) {
o->oAction = BOWSER_BITS_PLAT_ACT_FALL;
}
}
if (bowser->oHealth == 1 && (bowser->oAction == BOWSER_ACT_DANCE || bowser->oHeldState != HELD_FREE)) {
if (bowser->oHealth == 1
&& (bowser->oAction == BOWSER_ACT_DANCE || bowser->oHeldState != HELD_FREE)) {
o->oSubAction = 1;
}
if (o->oSubAction == 0) {
o->oBitsPlatformTimer = 0;
} else {
if ((gDebugInfo[4][6] + 20) * (o->oBehParams2ndByte - 1) < o->oBitsPlatformTimer)
if ((gDebugInfo[DEBUG_PAGE_EFFECTINFO][6] + 20)
* (o->oBehParams2ndByte - 1) < o->oBitsPlatformTimer) {
o->oAction = BOWSER_BITS_PLAT_ACT_FALL;
}
o->oBitsPlatformTimer++;
}
}
@@ -51,17 +61,22 @@ void falling_bowser_plat_act_fall(void) {
s16 angle;
f32 val;
UNUSED struct Object *bowser = o->oBitsPlatformBowser;
if (o->oTimer == 0 || o->oTimer == 22) {
cur_obj_play_sound_2(SOUND_GENERAL_BOWSER_PLATFORM_2);
}
if (o->oTimer < 22) {
set_environmental_camera_shake(SHAKE_ENV_FALLING_BITS_PLAT);
o->oVelY = 8.0f;
o->oGravity = 0.0f;
} else
} else {
o->oGravity = -4.0f;
if ((o->oTimer & 1) == 0 && o->oTimer < 14) {
angle = sBowserFallingPlatform[o->oBehParams2ndByte].angle + (gDebugInfo[4][1] << 8);
}
if (!(o->oTimer & 1) && o->oTimer < 14) {
angle = sBowserFallingPlatform[o->oBehParams2ndByte].angle
+ (gDebugInfo[DEBUG_PAGE_EFFECTINFO][1] << 8);
val = -(o->oTimer / 2) * 290 + 1740;
vec3f_copy_2(pos, &o->oPosX);
o->oPosX = sBowserFallingPlatform[o->oBehParams2ndByte].posX + sins(angle + 0x14B0) * val;
@@ -73,7 +88,9 @@ void falling_bowser_plat_act_fall(void) {
spawn_mist_particles_variable(4, 0, 100);
vec3f_copy_2(&o->oPosX, pos);
}
cur_obj_move_using_fvel_and_gravity();
if (o->oTimer > 300) {
obj_mark_for_deletion(o);
}
+49 -27
View File
@@ -1,25 +1,27 @@
// bowser_flame.inc.c
struct ObjectHitbox sGrowingBowserFlameHitbox = {
/* interactType: */ INTERACT_FLAME,
/* downOffset: */ 20,
/* interactType: */ INTERACT_FLAME,
/* downOffset: */ 20,
/* damageOrCoinValue: */ 1,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 10,
/* height: */ 40,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 10,
/* height: */ 40,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
};
struct ObjectHitbox sBowserFlameHitbox = {
/* interactType: */ INTERACT_FLAME,
/* downOffset: */ 0,
/* interactType: */ INTERACT_FLAME,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 1,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 10,
/* height: */ 40,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 10,
/* height: */ 40,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
};
void bowser_flame_despawn(void) {
@@ -49,11 +51,7 @@ s32 bowser_flame_should_despawn(s32 maxTime) {
void bhv_flame_bowser_init(void) {
o->oAnimState = (s32)(random_float() * 10.0f);
o->oMoveAngleYaw = random_u16();
if (random_float() < 0.2) {
o->oVelY = 80.0f;
} else {
o->oVelY = 20.0f;
}
o->oVelY = random_float() < 0.2 ? 80.0f : 20.0f;
o->oForwardVel = 10.0f;
o->oGravity = -1.0f;
o->oFlameScale = random_float() + 1.0f;
@@ -68,8 +66,7 @@ void bhv_flame_large_burning_out_init(void) {
}
void bowser_flame_move(void) {
s32 timer;
timer = ((o->oFlameSpeedTimerOffset + gGlobalTimer) & 0x3F) << 10;
s32 timer = ((o->oFlameSpeedTimerOffset + gGlobalTimer) & 0x3F) << 10;
o->oPosX += sins(o->oMoveAngleYaw) * sins(timer) * 4.0f;
o->oPosZ += coss(o->oMoveAngleYaw) * sins(timer) * 4.0f;
}
@@ -77,12 +74,15 @@ void bowser_flame_move(void) {
void bhv_flame_bowser_loop(void) {
cur_obj_update_floor_and_walls();
cur_obj_move_standard(78);
if (o->oVelY < -4.0f) {
o->oVelY = -4.0f;
}
if (o->oAction == 0) {
cur_obj_become_intangible();
bowser_flame_move();
if (o->oMoveFlags & OBJ_MOVE_LANDED) {
o->oAction++;
if (cur_obj_has_behavior(bhvFlameLargeBurningOut)) {
@@ -96,6 +96,7 @@ void bhv_flame_bowser_loop(void) {
}
} else {
cur_obj_become_tangible();
if (o->oTimer > o->oFlameScale * 10 + 5.0f) {
o->oFlameScale -= 0.15;
if (o->oFlameScale <= 0) {
@@ -103,6 +104,7 @@ void bhv_flame_bowser_loop(void) {
}
}
}
cur_obj_scale(o->oFlameScale);
o->oGraphYOffset = o->header.gfx.scale[1] * 14.0f;
obj_set_hitbox(o, &sBowserFlameHitbox);
@@ -116,19 +118,24 @@ void bhv_flame_moving_forward_growing_init(void) {
}
void bhv_flame_moving_forward_growing_loop(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
UNUSED struct Object *flame;
obj_set_hitbox(o, &sGrowingBowserFlameHitbox);
o->oFlameScale = o->oFlameScale + 0.5;
cur_obj_scale(o->oFlameScale);
if (o->oMoveAnglePitch > 0x800) {
o->oMoveAnglePitch -= 0x200;
}
cur_obj_set_pos_via_transform();
cur_obj_update_floor_height();
if (o->oFlameScale > 30.0f) {
obj_mark_for_deletion(o);
}
if (o->oPosY < o->oFloorHeight) {
o->oPosY = o->oFloorHeight;
flame = spawn_object(o, MODEL_RED_FLAME, bhvFlameBowser);
@@ -152,16 +159,20 @@ void bhv_flame_floating_landing_init(void) {
f32 sFlameFloatingYLimit[] = { -8.0f, -6.0f, -3.0f };
void bhv_flame_floating_landing_loop(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
cur_obj_update_floor_and_walls();
cur_obj_move_standard(78);
bowser_flame_move();
if (bowser_flame_should_despawn(900)) {
obj_mark_for_deletion(o);
}
if (o->oVelY < sFlameFloatingYLimit[o->oBehParams2ndByte]) {
o->oVelY = sFlameFloatingYLimit[o->oBehParams2ndByte];
}
if (o->oMoveFlags & OBJ_MOVE_LANDED) {
if (o->oBehParams2ndByte == 0) {
spawn_object(o, MODEL_RED_FLAME, bhvFlameLargeBurningOut);
@@ -170,6 +181,7 @@ void bhv_flame_floating_landing_loop(void) {
}
obj_mark_for_deletion(o);
}
o->oGraphYOffset = o->header.gfx.scale[1] * 14.0f;
}
@@ -186,14 +198,18 @@ void bhv_blue_bowser_flame_init(void) {
void bhv_blue_bowser_flame_loop(void) {
s32 i;
obj_set_hitbox(o, &sGrowingBowserFlameHitbox);
if (o->oFlameScale < 16.0f) {
o->oFlameScale = o->oFlameScale + 0.5;
}
cur_obj_scale(o->oFlameScale);
cur_obj_update_floor_and_walls();
cur_obj_move_standard(78);
if (o->oTimer > 0x14) {
if (o->oTimer > 20) {
if (o->oBehParams2ndByte == 0) {
for (i = 0; i < 3; i++) {
spawn_object_relative_with_scale(0, 0, 0, 0, 5.0f, o, MODEL_RED_FLAME,
@@ -219,9 +235,11 @@ void bhv_flame_bouncing_init(void) {
void bhv_flame_bouncing_loop(void) {
struct Object *bowser;
if (o->oTimer == 0) {
o->oFlameBowser = cur_obj_nearest_object_with_behavior(bhvBowser);
}
bowser = o->oFlameBowser;
o->oForwardVel = 15.0f;
o->oBounciness = -1.0f;
@@ -229,9 +247,11 @@ void bhv_flame_bouncing_loop(void) {
obj_set_hitbox(o, &sGrowingBowserFlameHitbox);
cur_obj_update_floor_and_walls();
cur_obj_move_standard(78);
if (bowser_flame_should_despawn(300)) {
obj_mark_for_deletion(o);
}
if (bowser != NULL) {
if (bowser->oHeldState == HELD_FREE) {
if (lateral_dist_between_objects(o, bowser) < 300.0f) {
@@ -244,12 +264,14 @@ void bhv_flame_bouncing_loop(void) {
void bhv_blue_flames_group_loop(void) {
struct Object *flame;
s32 i;
if (o->oTimer == 0) {
o->oMoveAngleYaw = obj_angle_to_object(o, gMarioObject);
o->oBlueFlameNextScale = 5.0f;
}
if (o->oTimer < 16) {
if ((o->oTimer & 1) == 0) {
if (!(o->oTimer & 1)) {
for (i = 0; i < 3; i++) {
flame = spawn_object(o, MODEL_BLUE_FLAME, bhvFlameBouncing);
flame->oMoveAngleYaw += i * 0x5555;
+23 -18
View File
@@ -1,41 +1,46 @@
// bowser_key.c.inc
// bowser_key.inc.c
struct ObjectHitbox sBowserKeyHitbox = {
/* interactType: */ INTERACT_STAR_OR_KEY,
/* downOffset: */ 0,
/* interactType: */ INTERACT_STAR_OR_KEY,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 0,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 160,
/* height: */ 100,
/* hurtboxRadius: */ 160,
/* hurtboxHeight: */ 100,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 160,
/* height: */ 100,
/* hurtboxRadius: */ 160,
/* hurtboxHeight: */ 100,
};
void bhv_bowser_key_loop(void) {
cur_obj_scale(0.5f);
if (o->oAngleVelYaw > 0x400)
if (o->oAngleVelYaw > 0x400) {
o->oAngleVelYaw -= 0x100;
}
o->oFaceAngleYaw += o->oAngleVelYaw;
o->oFaceAngleRoll = -0x4000;
o->oGraphYOffset = 165.0f;
if (o->oAction == 0) {
if (o->oTimer == 0)
if (o->oTimer == 0) {
o->oVelY = 70.0f;
}
spawn_sparkle_particles(3, 200, 80, -60);
spawn_object(o, MODEL_NONE, bhvSparkleSpawn);
cur_obj_update_floor_and_walls();
cur_obj_move_standard(78);
if (o->oMoveFlags & OBJ_MOVE_ON_GROUND)
if (o->oMoveFlags & OBJ_MOVE_ON_GROUND) {
o->oAction++;
else if (o->oMoveFlags & OBJ_MOVE_LANDED)
#ifndef VERSION_JP
cur_obj_play_sound_2(SOUND_GENERAL_UNKNOWN3_2);
#else
cur_obj_play_sound_2(SOUND_GENERAL_UNKNOWN3_LOWPRIO);
#endif
} else if (o->oMoveFlags & OBJ_MOVE_LANDED) {
cur_obj_play_sound_2(SOUND_GENERAL_UNKNOWN3);
}
} else {
obj_set_hitbox(o, &sBowserKeyHitbox);
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
mark_obj_for_deletion(o);
o->oInteractStatus = 0;
+30 -22
View File
@@ -1,47 +1,55 @@
// bowser_key_cutscene.inc.c
Gfx *geo_scale_bowser_key(s32 run, struct GraphNode *node, UNUSED f32 mtx[4][4]) {
struct Object *sp4;
if (run == TRUE) {
sp4 = (struct Object *) gCurGraphNodeObject;
struct Object *sp4 = (struct Object *) gCurGraphNodeObject;
((struct GraphNodeScale *) node->next)->scale = sp4->oBowserKeyScale;
}
return 0;
return NULL;
}
void bhv_bowser_key_unlock_door_loop(void) {
s32 animTimer;
animTimer = o->header.gfx.animInfo.animFrame;
s32 animFrame = o->header.gfx.animInfo.animFrame;
cur_obj_init_animation_with_sound(0);
if (animTimer < 38)
if (animFrame < 38) {
o->oBowserKeyScale = 0.0f;
else if (animTimer < 49)
} else if (animFrame < 49) {
o->oBowserKeyScale = 0.2f;
else if (animTimer < 58)
o->oBowserKeyScale = (animTimer - 53) * 0.11875f + 0.2; // 0.11875?
else if (animTimer < 59)
} else if (animFrame < 58) {
o->oBowserKeyScale = (animFrame - 53) * 0.11875f + 0.2; // 0.11875?
} else if (animFrame < 59) {
o->oBowserKeyScale = 1.1f;
else if (animTimer < 60)
} else if (animFrame < 60) {
o->oBowserKeyScale = 1.05f;
else
} else {
o->oBowserKeyScale = 1.0f;
if (o->oTimer > 150)
}
if (o->oTimer > 150) {
obj_mark_for_deletion(o);
}
}
void bhv_bowser_key_course_exit_loop(void) {
s32 animTimer = o->header.gfx.animInfo.animFrame;
s32 animFrame = o->header.gfx.animInfo.animFrame;
cur_obj_init_animation_with_sound(1);
if (animTimer < 38)
if (animFrame < 38) {
o->oBowserKeyScale = 0.2f;
else if (animTimer < 52)
o->oBowserKeyScale = (animTimer - 42) * 0.042857f + 0.2; // TODO 3/70?
else if (animTimer < 94)
} else if (animFrame < 52) {
o->oBowserKeyScale = (animFrame - 42) * 0.042857f + 0.2; // TODO 3/70?
} else if (animFrame < 94) {
o->oBowserKeyScale = 0.8f;
else if (animTimer < 101)
o->oBowserKeyScale = (101 - animTimer) * 0.085714f + 0.2; // TODO 6/70?
else
} else if (animFrame < 101) {
o->oBowserKeyScale = (101 - animFrame) * 0.085714f + 0.2; // TODO 6/70?
} else {
o->oBowserKeyScale = 0.2f;
if (o->oTimer > 138)
}
if (o->oTimer > 138) {
obj_mark_for_deletion(o);
}
}
+31 -18
View File
@@ -1,3 +1,4 @@
/**
* Behavior for the sliding Bowser puzzle in Lethal Lava Land.
*/
@@ -103,12 +104,13 @@ void bhv_lll_bowser_puzzle_spawn_pieces(f32 pieceWidth) {
s32 i;
// Spawn all 14 puzzle pieces.
for (i = 0; i < 14; i++)
for (i = 0; i < 14; i++) {
bhv_lll_bowser_puzzle_spawn_piece(sBowserPuzzlePieces[i].model, bhvLllBowserPuzzlePiece,
sBowserPuzzlePieces[i].xOffset * pieceWidth / 10.0f,
sBowserPuzzlePieces[i].zOffset * pieceWidth / 10.0f,
sBowserPuzzlePieces[i].initialAction,
sBowserPuzzlePieces[i].actionList);
}
// The pieces should only be spawned once so go to the next action.
o->oAction++;
@@ -119,17 +121,20 @@ void bhv_lll_bowser_puzzle_spawn_pieces(f32 pieceWidth) {
*/
void bhv_lll_bowser_puzzle_loop(void) {
s32 i;
UNUSED struct Object *sp28;
switch (o->oAction) {
case BOWSER_PUZZLE_ACT_SPAWN_PIECES:
bhv_lll_bowser_puzzle_spawn_pieces(480.0f);
break;
case BOWSER_PUZZLE_ACT_WAIT_FOR_COMPLETE:
// If both completion flags are set and Mario is within 1000 units...
if (o->oBowserPuzzleCompletionFlags == 3 && o->oDistanceToMario < 1000.0f) {
// Spawn 5 coins.
for (i = 0; i < 5; i++)
sp28 = spawn_object(o, MODEL_YELLOW_COIN, bhvSingleCoinGetsSpawned);
for (i = 0; i < 5; i++) {
UNUSED struct Object *coin =
spawn_object(o, MODEL_YELLOW_COIN, bhvSingleCoinGetsSpawned);
}
// Reset completion flags (even though they never get checked again).
o->oBowserPuzzleCompletionFlags = 0;
@@ -138,6 +143,7 @@ void bhv_lll_bowser_puzzle_loop(void) {
o->oAction++;
}
break;
case BOWSER_PUZZLE_ACT_DONE:
break;
}
@@ -164,8 +170,9 @@ void bhv_lll_bowser_puzzle_piece_update(void) {
s8 *nextAction = o->oBowserPuzzlePieceNextAction;
// If Mario is standing on this puzzle piece, set a flag in the parent.
if (gMarioObject->platform == o)
if (gMarioObject->platform == o) {
o->parentObj->oBowserPuzzleCompletionFlags = 1;
}
// If we should advance to the next action...
if (o->oBowserPuzzlePieceContinuePerformingAction == 0) {
@@ -193,14 +200,16 @@ void bhv_lll_bowser_puzzle_piece_update(void) {
void bhv_lll_bowser_puzzle_piece_move(f32 xOffset, f32 zOffset, s32 duration, UNUSED s32 a3) {
// For the first 20 frames, shake the puzzle piece up and down.
if (o->oTimer < 20) {
if (o->oTimer % 2)
if (o->oTimer % 2) {
o->oBowserPuzzlePieceOffsetY = 0.0f;
else
} else {
o->oBowserPuzzlePieceOffsetY = -6.0f;
}
} else {
// On frame 20, play the shifting sound.
if (o->oTimer == 20)
if (o->oTimer == 20) {
cur_obj_play_sound_2(SOUND_OBJ2_BOWSER_PUZZLE_PIECE_MOVE);
}
// For the number of frames specified by duration, move the piece.
if (o->oTimer < duration + 20) {
@@ -208,8 +217,8 @@ void bhv_lll_bowser_puzzle_piece_move(f32 xOffset, f32 zOffset, s32 duration, UN
o->oBowserPuzzlePieceOffsetZ += zOffset;
} else {
// This doesn't actually accomplish anything since
// cur_obj_change_action is going to be called before the
// next action is performed anyway.
// cur_obj_change_action is going to be called before the
// next action is performed anyway.
o->oAction = 2;
// Advance to the next action.
@@ -219,14 +228,15 @@ void bhv_lll_bowser_puzzle_piece_move(f32 xOffset, f32 zOffset, s32 duration, UN
}
void bhv_lll_bowser_puzzle_piece_idle(void) {
UNUSED s32 sp4;
UNUSED s32 unused;
// For the first 24 frames, do nothing.
if (o->oTimer < 24)
sp4 = 0;
else
if (o->oTimer < 24) {
unused = 0;
} else {
// Then advance to the next action.
o->oBowserPuzzlePieceContinuePerformingAction = 0;
}
}
void bhv_lll_bowser_puzzle_piece_move_left(void) {
@@ -246,10 +256,13 @@ void bhv_lll_bowser_puzzle_piece_move_down(void) {
}
void (*sBowserPuzzlePieceActions[])(void) = {
bhv_lll_bowser_puzzle_piece_action_0, bhv_lll_bowser_puzzle_piece_action_1,
bhv_lll_bowser_puzzle_piece_idle, bhv_lll_bowser_puzzle_piece_move_left,
bhv_lll_bowser_puzzle_piece_move_right, bhv_lll_bowser_puzzle_piece_move_up,
bhv_lll_bowser_puzzle_piece_move_down
bhv_lll_bowser_puzzle_piece_action_0,
bhv_lll_bowser_puzzle_piece_action_1,
bhv_lll_bowser_puzzle_piece_idle,
bhv_lll_bowser_puzzle_piece_move_left,
bhv_lll_bowser_puzzle_piece_move_right,
bhv_lll_bowser_puzzle_piece_move_up,
bhv_lll_bowser_puzzle_piece_move_down,
};
void bhv_lll_bowser_puzzle_piece_loop(void) {
+4 -1
View File
@@ -1,8 +1,9 @@
// break_particles.c.inc
// break_particles.inc.c
void spawn_triangle_break_particles(s16 numTris, s16 triModel, f32 triSize, s16 triAnimState) {
struct Object *triangle;
s32 i;
for (i = 0; i < numTris; i++) {
triangle = spawn_object(o, triModel, bhvBreakBoxTriangle);
triangle->oAnimState = triAnimState;
@@ -11,6 +12,7 @@ void spawn_triangle_break_particles(s16 numTris, s16 triModel, f32 triSize, s16
triangle->oFaceAngleYaw = triangle->oMoveAngleYaw;
triangle->oFaceAnglePitch = random_u16();
triangle->oVelY = random_f32_around_zero(50.0f);
if (triModel == MODEL_DIRT_ANIMATION || triModel == MODEL_SL_CRACKED_ICE_CHUNK) {
triangle->oAngleVelPitch = 0xF00;
triangle->oAngleVelYaw = 0x500;
@@ -19,6 +21,7 @@ void spawn_triangle_break_particles(s16 numTris, s16 triModel, f32 triSize, s16
triangle->oAngleVelPitch = 0x80 * (s32)(random_float() + 50.0f);
triangle->oForwardVel = 30.0f;
}
obj_scale(triangle, triSize);
}
}
+6 -3
View File
@@ -1,11 +1,14 @@
// breakable_box.c.inc
// breakable_box.inc.c
void bhv_breakable_box_loop(void) {
obj_set_hitbox(o, &sBreakableBoxHitbox);
cur_obj_set_model(MODEL_BREAKABLE_BOX_SMALL);
if (o->oTimer == 0)
if (o->oTimer == 0) {
breakable_box_init();
if (cur_obj_was_attacked_or_ground_pounded() != 0) {
}
if (cur_obj_was_attacked_or_ground_pounded()) {
obj_explode_and_spawn_coins(46.0f, 1);
create_sound_spawner(SOUND_GENERAL_BREAK_BOX);
}
+17 -12
View File
@@ -1,4 +1,4 @@
// breakable_box.c.inc
// breakable_box.inc.c
struct ObjectHitbox sBreakableBoxSmallHitbox = {
/* interactType: */ INTERACT_GRABBABLE,
@@ -29,19 +29,22 @@ void small_breakable_box_spawn_dust(void) {
}
void small_breakable_box_act_move(void) {
s16 sp1E = object_step();
s16 collisionFlags = object_step();
obj_attack_collided_from_other_object(o);
if (sp1E == 1)
if (collisionFlags == OBJ_COL_FLAG_GROUNDED) {
cur_obj_play_sound_2(SOUND_GENERAL_BOX_LANDING_2);
if (sp1E & 1) {
}
if (collisionFlags & OBJ_COL_FLAG_GROUNDED) {
if (o->oForwardVel > 20.0f) {
cur_obj_play_sound_2(SOUND_ENV_SLIDING);
small_breakable_box_spawn_dust();
}
}
if (sp1E & 2) {
if (collisionFlags & OBJ_COL_FLAG_HIT_WALL) {
spawn_mist_particles();
spawn_triangle_break_particles(20, MODEL_DIRT_ANIMATION, 0.7f, 3);
obj_spawn_yellow_coins(o, 3);
@@ -49,7 +52,7 @@ void small_breakable_box_act_move(void) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
obj_check_floor_death(sp1E, sObjFloor);
obj_check_floor_death(collisionFlags, sObjFloor);
}
void breakable_box_small_released_loop(void) {
@@ -57,10 +60,11 @@ void breakable_box_small_released_loop(void) {
// Begin flashing
if (o->oBreakableBoxSmallFramesSinceReleased > 810) {
if (o->oBreakableBoxSmallFramesSinceReleased & 1)
if (o->oBreakableBoxSmallFramesSinceReleased & 1) {
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
else
} else {
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
}
}
// Despawn, and create a corkbox respawner
@@ -86,8 +90,9 @@ void breakable_box_small_idle_loop(void) {
break;
}
if (o->oBreakableBoxSmallReleased == 1)
if (o->oBreakableBoxSmallReleased == TRUE) {
breakable_box_small_released_loop();
}
}
void breakable_box_small_get_dropped(void) {
@@ -96,7 +101,7 @@ void breakable_box_small_get_dropped(void) {
cur_obj_get_dropped();
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
o->oHeldState = 0;
o->oBreakableBoxSmallReleased = 1;
o->oBreakableBoxSmallReleased = TRUE;
o->oBreakableBoxSmallFramesSinceReleased = 0;
}
@@ -106,10 +111,10 @@ void breakable_box_small_get_thrown(void) {
cur_obj_enable_rendering();
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
o->oHeldState = 0;
o->oFlags &= ~0x08;
o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW;
o->oForwardVel = 40.0f;
o->oVelY = 20.0f;
o->oBreakableBoxSmallReleased = 1;
o->oBreakableBoxSmallReleased = TRUE;
o->oBreakableBoxSmallFramesSinceReleased = 0;
o->activeFlags &= ~ACTIVE_FLAG_UNK9;
}
+10 -4
View File
@@ -1,16 +1,22 @@
// breakable_wall.c.inc
// breakable_wall.inc.c
void bhv_wf_breakable_wall_loop(void) {
if (gMarioStates[0].action == ACT_SHOT_FROM_CANNON) {
cur_obj_become_tangible();
if (obj_check_if_collided_with_object(o, gMarioObject)) {
if (cur_obj_has_behavior(bhvWfBreakableWallRight))
if (cur_obj_has_behavior(bhvWfBreakableWallRight)) {
play_puzzle_jingle();
}
create_sound_spawner(SOUND_GENERAL_WALL_EXPLOSION);
o->oInteractType = 8;
o->oInteractType = INTERACT_DAMAGE;
o->oDamageOrCoinValue = 1;
obj_explode_and_spawn_coins(80.0f, 0);
}
} else
} else {
cur_obj_become_intangible();
}
}
+75 -28
View File
@@ -1,23 +1,24 @@
// bub.c.inc
// bub.inc.c
// NOTE: These first set of functions spawn a school of bub depending on objF4's
// value. The later action functions seem to check Y distance to Mario and proceed
// to do nothing, which indicates this behavior set is incomplete.
// TODO: Rename these. These have nothing to do with birds.
void bub_spawner_act_0(void) {
s32 i;
s32 sp18 = o->oBirdChirpChirpUnkF4;
if (o->oDistanceToMario < 1500.0f) {
for (i = 0; i < sp18; i++)
for (i = 0; i < sp18; i++) {
spawn_object(o, MODEL_BUB, bhvBub);
}
o->oAction = 1;
}
}
void bub_spawner_act_1(void) {
if (gMarioObject->oPosY - o->oPosY > 2000.0f)
if (gMarioObject->oPosY - o->oPosY > 2000.0f) {
o->oAction = 2;
}
}
void bub_spawner_act_2(void) {
@@ -28,8 +29,12 @@ void bub_spawner_act_3(void) {
o->oAction = 0;
}
void (*sBirdChirpChirpActions[])(void) = { bub_spawner_act_0, bub_spawner_act_1,
bub_spawner_act_2, bub_spawner_act_3 };
void (*sBirdChirpChirpActions[])(void) = {
bub_spawner_act_0,
bub_spawner_act_1,
bub_spawner_act_2,
bub_spawner_act_3,
};
void bhv_bub_spawner_loop(void) {
cur_obj_call_action_function(sBirdChirpChirpActions);
@@ -38,9 +43,9 @@ void bhv_bub_spawner_loop(void) {
void bub_move_vertically(s32 a0) {
f32 sp1C = o->parentObj->oPosY;
if (sp1C - 100.0f - o->oCheepCheepUnk104 < o->oPosY
&& o->oPosY < sp1C + 1000.0f + o->oCheepCheepUnk104)
&& o->oPosY < sp1C + 1000.0f + o->oCheepCheepUnk104) {
o->oPosY = approach_f32_symmetric(o->oPosY, o->oCheepCheepUnkF8, a0);
else {
} else {
}
}
@@ -52,73 +57,115 @@ void bub_act_0(void) {
void bub_act_1(void) {
f32 dy;
if (o->oTimer == 0) {
o->oForwardVel = random_float() * 2 + 2;
o->oCheepCheepUnk108 = random_float();
}
dy = o->oPosY - gMarioObject->oPosY;
if (o->oPosY < o->oCheepCheepUnkF4 - 50.0f) {
if (dy < 0.0f)
if (dy < 0.0f) {
dy = 0.0f - dy;
if (dy < 500.0f)
}
if (dy < 500.0f) {
bub_move_vertically(1);
else
} else {
bub_move_vertically(4);
}
} else {
o->oPosY = o->oCheepCheepUnkF4 - 50.0f;
if (dy > 300.0f)
if (dy > 300.0f) {
o->oPosY = o->oPosY - 1.0f;
}
}
if (800.0f < cur_obj_lateral_dist_from_mario_to_home())
if (800.0f < cur_obj_lateral_dist_from_mario_to_home()) {
o->oAngleToMario = cur_obj_angle_to_home();
}
cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x100);
if (o->oDistanceToMario < 200.0f)
if (o->oCheepCheepUnk108 < 0.5)
if (o->oDistanceToMario < 200.0f) {
if (o->oCheepCheepUnk108 < 0.5) {
o->oAction = 2;
if (o->oInteractStatus & INT_STATUS_INTERACTED)
}
}
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
o->oAction = 2;
}
}
void bub_act_2(void) {
f32 dy;
if (o->oTimer < 20) {
if (o->oInteractStatus & INT_STATUS_INTERACTED)
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
spawn_object(o, MODEL_WHITE_PARTICLE_SMALL, bhvSmallParticleSnow);
} else
}
} else {
o->oInteractStatus = 0;
if (o->oTimer == 0)
}
if (o->oTimer == 0) {
cur_obj_play_sound_2(SOUND_GENERAL_MOVING_WATER);
if (o->oForwardVel == 0.0f)
}
if (o->oForwardVel == 0.0f) {
o->oForwardVel = 6.0f;
}
dy = o->oPosY - gMarioObject->oPosY;
if (o->oPosY < o->oCheepCheepUnkF4 - 50.0f) {
if (dy < 0.0f)
if (dy < 0.0f) {
dy = 0.0f - dy;
if (dy < 500.0f)
}
if (dy < 500.0f) {
bub_move_vertically(2);
else
} else {
bub_move_vertically(4);
}
} else {
o->oPosY = o->oCheepCheepUnkF4 - 50.0f;
if (dy > 300.0f)
if (dy > 300.0f) {
o->oPosY -= 1.0f;
}
}
if (cur_obj_lateral_dist_from_mario_to_home() > 800.0f)
if (cur_obj_lateral_dist_from_mario_to_home() > 800.0f) {
o->oAngleToMario = cur_obj_angle_to_home();
}
cur_obj_rotate_yaw_toward(o->oAngleToMario + 0x8000, 0x400);
if (o->oTimer > 200 && o->oDistanceToMario > 600.0f)
if (o->oTimer > 200 && o->oDistanceToMario > 600.0f) {
o->oAction = 1;
}
}
void (*sCheepCheepActions[])(void) = { bub_act_0, bub_act_1, bub_act_2 };
void (*sCheepCheepActions[])(void) = {
bub_act_0,
bub_act_1,
bub_act_2,
};
void bhv_bub_loop(void) {
o->oCheepCheepUnkF4 = find_water_level(o->oPosX, o->oPosZ);
o->oCheepCheepUnkF8 = gMarioObject->oPosY + o->oCheepCheepUnkFC;
o->oWallHitboxRadius = 30.0f;
cur_obj_update_floor_and_walls();
cur_obj_call_action_function(sCheepCheepActions);
cur_obj_move_using_fvel_and_gravity();
if (o->parentObj->oAction == 2)
if (o->parentObj->oAction == 2) {
obj_mark_for_deletion(o);
}
}
+5 -5
View File
@@ -13,9 +13,8 @@ static struct ObjectHitbox sBubbaHitbox = {
};
void bubba_act_0(void) {
f32 sp24;
f32 sp24 = cur_obj_lateral_dist_to_home();
sp24 = cur_obj_lateral_dist_to_home();
treat_far_home_as_mario(2000.0f);
o->oAnimState = 0;
@@ -33,12 +32,12 @@ void bubba_act_0(void) {
o->oBubbaUnkF8 = random_linear_offset(20, 30);
}
if ((o->oBubbaUnkFC = o->oMoveFlags & OBJ_MOVE_HIT_WALL) != 0) {
if ((o->oBubbaUnkFC = o->oMoveFlags & OBJ_MOVE_HIT_WALL)) {
o->oBubbaUnk1AE = cur_obj_reflect_move_angle_off_wall();
} else if (o->oTimer > 30 && o->oDistanceToMario < 2000.0f) {
o->oAction = 1;
} else if (o->oBubbaUnkF8 != 0) {
o->oBubbaUnkF8 -= 1;
o->oBubbaUnkF8--;
} else {
o->oBubbaUnk1AE = obj_random_fixed_turn(0x2000);
o->oBubbaUnkF8 = random_linear_offset(100, 100);
@@ -48,6 +47,7 @@ void bubba_act_0(void) {
void bubba_act_1(void) {
treat_far_home_as_mario(2500.0f);
if (o->oDistanceToMario > 2500.0f) {
o->oAction = 0;
} else if (o->oBubbaUnk100 != 0) {
@@ -96,7 +96,7 @@ void bubba_act_1(void) {
}
void bhv_bubba_loop(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
o->oInteractionSubtype &= ~INT_SUBTYPE_EATS_MARIO;
o->oBubbaUnk104 = obj_turn_pitch_toward_mario(120.0f, 0);
+2 -2
View File
@@ -1,4 +1,4 @@
// bubble.c.inc
// bubble.inc.c
void bhv_object_bubble_init(void) {
o->oPosX += random_float() * 30.0f;
@@ -12,7 +12,7 @@ void bhv_object_bubble_loop(void) {
f32 bubbleY = o->oPosY;
if (bubbleY > waterY) {
if (gFreeObjectList.next) {
if (gFreeObjectList.next != NULL) {
bubbleSplash = spawn_object_at_origin(o, 0, MODEL_SMALL_WATER_SPLASH, bhvBubbleSplash);
bubbleSplash->oPosX = o->oPosX;
bubbleSplash->oPosY = bubbleY + 5.0f;
+28 -12
View File
@@ -1,6 +1,5 @@
// bullet_bill.inc.c
// bullet bill smoke
void bhv_white_puff_smoke_init(void) {
cur_obj_scale(random_float() * 2 + 2.0);
}
@@ -22,29 +21,37 @@ void bullet_bill_act_0(void) {
void bullet_bill_act_1(void) {
s16 sp1E = abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw);
if (sp1E < 0x2000 && 400.0f < o->oDistanceToMario && o->oDistanceToMario < 1500.0f)
if (sp1E < 0x2000 && 400.0f < o->oDistanceToMario && o->oDistanceToMario < 1500.0f) {
o->oAction = 2;
}
}
void bullet_bill_act_2(void) {
if (o->oTimer < 40)
if (o->oTimer < 40) {
o->oForwardVel = 3.0f;
else if (o->oTimer < 50) {
if (o->oTimer % 2)
} else if (o->oTimer < 50) {
if (o->oTimer % 2) {
o->oForwardVel = 3.0f;
else
} else {
o->oForwardVel = -3.0f;
}
} else {
if (o->oTimer > 70)
if (o->oTimer > 70) {
cur_obj_update_floor_and_walls();
}
spawn_object(o, MODEL_SMOKE, bhvWhitePuffSmoke);
o->oForwardVel = 30.0f;
if (o->oDistanceToMario > 300.0f)
if (o->oDistanceToMario > 300.0f) {
cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x100);
}
if (o->oTimer == 50) {
cur_obj_play_sound_2(SOUND_OBJ_POUNDING_CANNON);
cur_obj_shake_screen(SHAKE_POS_SMALL);
}
if (o->oTimer > 150 || o->oMoveFlags & OBJ_MOVE_HIT_WALL) {
o->oAction = 3;
spawn_mist_particles();
@@ -61,18 +68,27 @@ void bullet_bill_act_4(void) {
o->oForwardVel = -30.0f;
cur_obj_become_intangible();
}
o->oFaceAnglePitch += 0x1000;
o->oFaceAngleRoll += 0x1000;
o->oPosY += 20.0f;
if (o->oTimer > 90)
if (o->oTimer > 90) {
o->oAction = 0;
}
}
void (*sBulletBillActions[])(void) = { bullet_bill_act_0, bullet_bill_act_1, bullet_bill_act_2,
bullet_bill_act_3, bullet_bill_act_4 };
void (*sBulletBillActions[])(void) = {
bullet_bill_act_0,
bullet_bill_act_1,
bullet_bill_act_2,
bullet_bill_act_3,
bullet_bill_act_4,
};
void bhv_bullet_bill_loop(void) {
cur_obj_call_action_function(sBulletBillActions);
if (cur_obj_check_interacted())
if (cur_obj_check_interacted()) {
o->oAction = 4;
}
}
+49 -47
View File
@@ -1,4 +1,4 @@
// bully.c.inc
// bully.inc.c
static struct ObjectHitbox sSmallBullyHitbox = {
/* interactType: */ INTERACT_BULLY,
@@ -57,14 +57,15 @@ void bully_check_mario_collision(void) {
o->oAction != BULLY_ACT_LAVA_DEATH && o->oAction != BULLY_ACT_DEATH_PLANE_DEATH &&
#endif
o->oInteractStatus & INT_STATUS_INTERACTED) {
if (o->oBehParams2ndByte == BULLY_BP_SIZE_SMALL)
if (o->oBehParams2ndByte == BULLY_BP_SIZE_SMALL) {
cur_obj_play_sound_2(SOUND_OBJ2_BULLY_ATTACKED);
else
} else {
cur_obj_play_sound_2(SOUND_OBJ2_LARGE_BULLY_ATTACKED);
}
o->oInteractStatus &= ~INT_STATUS_INTERACTED;
o->oAction = BULLY_ACT_KNOCKBACK;
o->oFlags &= ~0x8; /* bit 3 */
o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW;
cur_obj_init_animation(3);
o->oBullyMarioCollisionAngle = o->oMoveAngleYaw;
}
@@ -77,15 +78,17 @@ void bully_act_chase_mario(void) {
if (o->oTimer < 10) {
o->oForwardVel = 3.0;
obj_turn_toward_object(o, gMarioObject, 16, 4096);
obj_turn_toward_object(o, gMarioObject, 16, 0x1000);
} else if (o->oBehParams2ndByte == BULLY_BP_SIZE_SMALL) {
o->oForwardVel = 20.0;
if (o->oTimer >= 31)
if (o->oTimer > 30) {
o->oTimer = 0;
}
} else {
o->oForwardVel = 30.0;
if (o->oTimer >= 36)
if (o->oTimer > 35) {
o->oTimer = 0;
}
}
if (!is_point_within_radius_of_mario(homeX, posY, homeZ, 1000)) {
@@ -98,11 +101,12 @@ void bully_act_knockback(void) {
if (o->oForwardVel < 10.0 && (s32) o->oVelY == 0) {
o->oForwardVel = 1.0;
o->oBullyKBTimerAndMinionKOCounter++;
o->oFlags |= 0x8; /* bit 3 */
o->oFlags |= OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW;
o->oMoveAngleYaw = o->oFaceAngleYaw;
obj_turn_toward_object(o, gMarioObject, 16, 1280);
} else
obj_turn_toward_object(o, gMarioObject, 16, 0x500);
} else {
o->header.gfx.animInfo.animFrame = 0;
}
if (o->oBullyKBTimerAndMinionKOCounter == 18) {
o->oAction = BULLY_ACT_CHASE_MARIO;
@@ -113,7 +117,7 @@ void bully_act_knockback(void) {
void bully_act_back_up(void) {
if (o->oTimer == 0) {
o->oFlags &= ~0x8; /* bit 3 */
o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW;
o->oMoveAngleYaw += 0x8000;
}
@@ -128,14 +132,13 @@ void bully_act_back_up(void) {
if (o->oTimer == 15) {
o->oMoveAngleYaw = o->oFaceAngleYaw;
o->oFlags |= 0x8; /* bit 3 */
o->oFlags |= OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW;
o->oAction = BULLY_ACT_PATROL;
}
}
void bully_backup_check(s16 collisionFlags) {
if (!(collisionFlags & 0x8) && o->oAction != BULLY_ACT_KNOCKBACK) /* bit 3 */
{
if (!(collisionFlags & OBJ_COL_FLAG_NO_Y_VEL) && o->oAction != BULLY_ACT_KNOCKBACK) {
o->oPosX = o->oBullyPrevX;
o->oPosZ = o->oBullyPrevZ;
o->oAction = BULLY_ACT_BACK_UP;
@@ -143,24 +146,27 @@ void bully_backup_check(s16 collisionFlags) {
}
void bully_play_stomping_sound(void) {
s16 sp26 = o->header.gfx.animInfo.animFrame;
s16 animFrame = o->header.gfx.animInfo.animFrame;
switch (o->oAction) {
case BULLY_ACT_PATROL:
if (sp26 == 0 || sp26 == 12) {
if (o->oBehParams2ndByte == BULLY_BP_SIZE_SMALL)
if (animFrame == 0 || animFrame == 12) {
if (o->oBehParams2ndByte == BULLY_BP_SIZE_SMALL) {
cur_obj_play_sound_2(SOUND_OBJ_BULLY_WALK);
else
} else {
cur_obj_play_sound_2(SOUND_OBJ_BULLY_WALKING);
}
}
break;
case BULLY_ACT_CHASE_MARIO:
case BULLY_ACT_BACK_UP:
if (sp26 == 0 || sp26 == 5) {
if (o->oBehParams2ndByte == BULLY_BP_SIZE_SMALL)
if (animFrame == 0 || animFrame == 5) {
if (o->oBehParams2ndByte == BULLY_BP_SIZE_SMALL) {
cur_obj_play_sound_2(SOUND_OBJ_BULLY_WALK);
else
} else {
cur_obj_play_sound_2(SOUND_OBJ_BULLY_WALKING);
}
}
break;
}
@@ -168,26 +174,24 @@ void bully_play_stomping_sound(void) {
void bully_step(void) {
s16 collisionFlags = 0;
collisionFlags = object_step();
bully_backup_check(collisionFlags);
bully_play_stomping_sound();
obj_check_floor_death(collisionFlags, sObjFloor);
if (o->oBullySubtype & BULLY_STYPE_CHILL) {
if (o->oPosY < 1030.0f)
if (o->oPosY < 1030.0f) {
o->oAction = BULLY_ACT_LAVA_DEATH;
}
}
}
void bully_spawn_coin(void) {
struct Object *coin = spawn_object(o, MODEL_YELLOW_COIN, bhvMovingYellowCoin);
#ifdef VERSION_JP // TODO: maybe move this ifdef logic to the header?
cur_obj_play_sound_2(SOUND_GENERAL_COIN_SPURT);
#elif defined(VERSION_EU) || defined(VERSION_SH)
cur_obj_play_sound_2(SOUND_GENERAL_COIN_SPURT_EU);
#else
cur_obj_play_sound_2(SOUND_GENERAL_COIN_SPURT_2);
#endif
coin->oForwardVel = 10.0f;
coin->oVelY = 100.0f;
coin->oPosY = o->oPosY + 310.0f;
@@ -195,20 +199,21 @@ void bully_spawn_coin(void) {
}
void bully_act_level_death(void) {
if (obj_lava_death() == 1) {
if (obj_lava_death() == TRUE) {
if (o->oBehParams2ndByte == BULLY_BP_SIZE_SMALL) {
if (o->oBullySubtype == BULLY_STYPE_MINION)
if (o->oBullySubtype == BULLY_STYPE_MINION) {
o->parentObj->oBullyKBTimerAndMinionKOCounter++;
}
bully_spawn_coin();
} else {
spawn_mist_particles();
if (o->oBullySubtype == BULLY_STYPE_CHILL)
if (o->oBullySubtype == BULLY_STYPE_CHILL) {
spawn_default_star(130.0f, 1600.0f, -4335.0f);
else {
} else {
spawn_default_star(0, 950.0f, -6800.0f);
spawn_object_abs_with_rot(o, 0, MODEL_NONE, bhvLllTumblingBridge, 0, 154, -5631, 0, 0,
0);
spawn_object_abs_with_rot(o, 0, MODEL_NONE, bhvLllTumblingBridge,
0, 154, -5631, 0, 0, 0);
}
}
}
@@ -229,7 +234,7 @@ void bhv_bully_loop(void) {
case BULLY_ACT_PATROL:
o->oForwardVel = 5.0;
if (obj_return_home_if_safe(o, o->oHomeX, o->oPosY, o->oHomeZ, 800) == 1) {
if (obj_return_home_if_safe(o, o->oHomeX, o->oPosY, o->oHomeZ, 800) == TRUE) {
o->oAction = BULLY_ACT_CHASE_MARIO;
cur_obj_init_animation(1);
}
@@ -264,14 +269,9 @@ void bhv_bully_loop(void) {
set_object_visibility(o, 3000);
}
// sp38 = arg0
// sp3c = arg1
// sp40 = arg2
// sp44 = arg3
void big_bully_spawn_minion(s32 arg0, s32 arg1, s32 arg2, s16 arg3) {
void big_bully_spawn_minion(s32 x, s32 y, s32 z, s16 yaw) {
struct Object *bully =
spawn_object_abs_with_rot(o, 0, MODEL_BULLY, bhvSmallBully, arg0, arg1, arg2, 0, arg3, 00);
spawn_object_abs_with_rot(o, 0, MODEL_BULLY, bhvSmallBully, x, y, z, 0, yaw, 0);
bully->oBullySubtype = BULLY_STYPE_MINION;
bully->oBehParams2ndByte = BULLY_BP_SIZE_SMALL;
}
@@ -289,7 +289,7 @@ void bhv_big_bully_with_minions_init(void) {
}
void big_bully_spawn_star(void) {
if (obj_lava_death() == 1) {
if (obj_lava_death() == TRUE) {
spawn_mist_particles();
spawn_default_star(3700.0f, 600.0f, -5500.0f);
}
@@ -308,7 +308,7 @@ void bhv_big_bully_with_minions_loop(void) {
case BULLY_ACT_PATROL:
o->oForwardVel = 5.0;
if (obj_return_home_if_safe(o, o->oHomeX, o->oPosY, o->oHomeZ, 1000) == 1) {
if (obj_return_home_if_safe(o, o->oHomeX, o->oPosY, o->oHomeZ, 1000) == TRUE) {
o->oAction = BULLY_ACT_CHASE_MARIO;
cur_obj_init_animation(1);
}
@@ -339,17 +339,19 @@ void bhv_big_bully_with_minions_loop(void) {
if (o->oBullyKBTimerAndMinionKOCounter == 3) {
play_puzzle_jingle();
if (o->oTimer >= 91)
if (o->oTimer > 90) {
o->oAction = BULLY_ACT_ACTIVATE_AND_FALL;
}
}
break;
case BULLY_ACT_ACTIVATE_AND_FALL:
collisionFlags = object_step();
if ((collisionFlags & 0x9) == 0x9) /* bits 0 and 3 */
if ((collisionFlags & OBJ_COL_FLAGS_LANDED) == OBJ_COL_FLAGS_LANDED) {
o->oAction = BULLY_ACT_PATROL;
}
if (collisionFlags == 1) {
if (collisionFlags == OBJ_COL_FLAG_GROUNDED) {
cur_obj_play_sound_2(SOUND_OBJ_THWOMP);
set_camera_shake_from_point(SHAKE_POS_SMALL, o->oPosX, o->oPosY, o->oPosZ);
spawn_mist_particles();
+10 -8
View File
@@ -1,4 +1,4 @@
// butterfly.c.inc
// butterfly.inc.c
void bhv_butterfly_init(void) {
cur_obj_init_animation(1);
@@ -10,8 +10,6 @@ void bhv_butterfly_init(void) {
o->oHomeZ = o->oPosZ;
}
// sp28 = speed
void butterfly_step(s32 speed) {
struct FloorGeometry *sp24;
s16 yaw = o->oMoveAngleYaw;
@@ -26,19 +24,22 @@ void butterfly_step(s32 speed) {
o->oPosX += o->oVelX;
o->oPosZ += o->oVelZ;
if (o->oAction == BUTTERFLY_ACT_FOLLOW_MARIO)
if (o->oAction == BUTTERFLY_ACT_FOLLOW_MARIO) {
o->oPosY -= o->oVelY + coss((s32)(yPhase * 655.36)) * 20.0f / 4;
else
} else {
o->oPosY -= o->oVelY;
}
floorY = find_floor_height_and_data(o->oPosX, o->oPosY, o->oPosZ, &sp24);
if (o->oPosY < floorY + 2.0f)
if (o->oPosY < floorY + 2.0f) {
o->oPosY = floorY + 2.0f;
}
o->oButterflyYPhase++;
if (o->oButterflyYPhase >= 101)
if (o->oButterflyYPhase > 100) {
o->oButterflyYPhase = 0;
}
}
void butterfly_calculate_angle(void) {
@@ -67,8 +68,9 @@ void butterfly_act_follow_mario(void) {
butterfly_step(7);
if (!is_point_within_radius_of_mario(o->oHomeX, o->oHomeY, o->oHomeZ, 1200))
if (!is_point_within_radius_of_mario(o->oHomeX, o->oHomeY, o->oHomeZ, 1200)) {
o->oAction = BUTTERFLY_ACT_RETURN_HOME;
}
}
void butterfly_act_return_home(void) {
+10 -12
View File
@@ -28,13 +28,11 @@ void bhv_camera_lakitu_init(void) {
static void camera_lakitu_intro_act_trigger_cutscene(void) {
//! These bounds are slightly smaller than the actual bridge bounds, allowing
// the RTA speedrunning method of lakitu skip
if (gMarioObject->oPosX > -544.0f && gMarioObject->oPosX < 545.0f && gMarioObject->oPosY > 800.0f
&& gMarioObject->oPosZ > -2000.0f && gMarioObject->oPosZ < -177.0f
&& gMarioObject->oPosZ < -177.0f) // always double check your conditions
{
if (set_mario_npc_dialog(MARIO_DIALOG_LOOK_UP) == MARIO_DIALOG_STATUS_START) {
o->oAction = CAMERA_LAKITU_INTRO_ACT_SPAWN_CLOUD;
}
if (gMarioObject->oPosX > -544.0f && gMarioObject->oPosX < 545.0f
&& gMarioObject->oPosY > 800.0f && gMarioObject->oPosZ > -2000.0f
&& gMarioObject->oPosZ < -177.0f && gMarioObject->oPosZ < -177.0f // always double check your conditions
&& set_mario_npc_dialog(MARIO_DIALOG_LOOK_UP) == MARIO_DIALOG_STATUS_START) {
o->oAction = CAMERA_LAKITU_INTRO_ACT_SPAWN_CLOUD;
}
}
@@ -108,7 +106,6 @@ static void camera_lakitu_intro_act_show_dialog(void) {
o->oCameraLakituUnk104 = TRUE;
}
#endif
// Once within 1000 units, slow down
approach_f32_ptr(&o->oCameraLakituSpeed, 20.0f, 1.0f);
if (o->oDistanceToMario < 500.0f
@@ -125,10 +122,10 @@ static void camera_lakitu_intro_act_show_dialog(void) {
}
}
o->oCameraLakituPitchVel = approach_s16_symmetric(o->oCameraLakituPitchVel, 0x7D0, 0x190);
o->oCameraLakituPitchVel = approach_s16_symmetric(o->oCameraLakituPitchVel, 2000, 400);
obj_move_pitch_approach(targetMovePitch, o->oCameraLakituPitchVel);
o->oCameraLakituYawVel = approach_s16_symmetric(o->oCameraLakituYawVel, 0x7D0, 0x64);
o->oCameraLakituYawVel = approach_s16_symmetric(o->oCameraLakituYawVel, 2000, 100);
cur_obj_rotate_yaw_toward(targetMoveYaw, o->oCameraLakituYawVel);
// vel y is explicitly computed, so gravity doesn't apply
@@ -156,7 +153,8 @@ void bhv_camera_lakitu_update(void) {
break;
}
} else {
f32 val0C = (f32) 0x875C3D / 0x800 - gLakituState.curPos[0];
f32 val0C = 4331.53f - gLakituState.curPos[0];
if (gLakituState.curPos[0] < 1700.0f || val0C < 0.0f) {
cur_obj_hide();
} else {
@@ -173,7 +171,7 @@ void bhv_camera_lakitu_update(void) {
o->oFaceAnglePitch = atan2s(cur_obj_lateral_dist_to_home(),
o->oPosY - gLakituState.curFocus[1]);
o->oPosX = (f32) 0x875C3D / 0x800 + val0C;
o->oPosX = 4331.53f + val0C;
}
}
}
+40 -18
View File
@@ -1,4 +1,4 @@
// cannon.c.inc
// cannon.inc.c
void bhv_cannon_base_unused_loop(void) {
o->oPosY += o->oVelY;
@@ -17,18 +17,18 @@ void opened_cannon_act_0(void) {
cur_obj_enable_rendering();
cur_obj_become_tangible();
}
if (o->oDistanceToMario < 500.0f) {
cur_obj_become_tangible();
cur_obj_enable_rendering();
if (o->oInteractStatus & INT_STATUS_INTERACTED
&& (!(o->oInteractStatus
& INT_STATUS_TOUCHED_BOB_OMB))) // bob-omb explodes when it gets into a cannon
{
&& !(o->oInteractStatus & INT_STATUS_TOUCHED_BOB_OMB)) { // bob-omb explodes when it gets into a cannon
o->oAction = 4;
o->oCannonUnk10C = 1;
o->oCannonUnkF8 = 1;
} else
} else {
o->oInteractStatus = 0;
}
} else {
cur_obj_become_intangible();
cur_obj_disable_rendering();
@@ -37,11 +37,14 @@ void opened_cannon_act_0(void) {
}
void opened_cannon_act_4(void) {
if (o->oTimer == 0)
if (o->oTimer == 0) {
cur_obj_play_sound_2(SOUND_OBJ_CANNON1);
}
o->oPosY += 5.0f;
o->oPosX += (f32)((o->oTimer / 2 & 1) - 0.5) * 2;
o->oPosZ += (f32)((o->oTimer / 2 & 1) - 0.5) * 2;
if (o->oTimer > 67) {
o->oPosX += (f32)((o->oTimer / 2 & 1) - 0.5) * 4;
o->oPosZ += (f32)((o->oTimer / 2 & 1) - 0.5) * 4;
@@ -50,8 +53,10 @@ void opened_cannon_act_4(void) {
}
void opened_cannon_act_6(void) {
if (o->oTimer == 0)
if (o->oTimer == 0) {
cur_obj_play_sound_2(SOUND_OBJ_CANNON2);
}
if (o->oTimer < 4) {
o->oPosX += (f32)((o->oTimer / 2 & 1) - 0.5) * 4.0f;
o->oPosZ += (f32)((o->oTimer / 2 & 1) - 0.5) * 4.0f;
@@ -72,25 +77,30 @@ void opened_cannon_act_6(void) {
}
void opened_cannon_act_5(void) {
if (o->oTimer == 0)
if (o->oTimer == 0) {
cur_obj_play_sound_2(SOUND_OBJ_CANNON3);
}
if (o->oTimer < 4) {
} else {
if (o->oTimer < 20) {
o->oCannonUnkF4 += 0x400;
o->oMoveAnglePitch = sins(o->oCannonUnkF4) * 0x2000;
} else if (o->oTimer < 25) {
} else
} else {
o->oAction = 1;
}
}
}
void opened_cannon_act_1(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
cur_obj_become_intangible();
cur_obj_disable_rendering();
o->oCannonUnk10C = 0;
gMarioShotFromCannon = 1;
gMarioShotFromCannon = TRUE;
}
void opened_cannon_act_2(void) {
@@ -98,29 +108,41 @@ void opened_cannon_act_2(void) {
}
void opened_cannon_act_3(void) {
UNUSED s32 unused;
if (o->oTimer > 3)
UNUSED u8 filler[4];
if (o->oTimer > 3) {
o->oAction = 0;
}
}
void (*sOpenedCannonActions[])(void) = { opened_cannon_act_0, opened_cannon_act_1, opened_cannon_act_2,
opened_cannon_act_3, opened_cannon_act_4, opened_cannon_act_5,
opened_cannon_act_6 };
void (*sOpenedCannonActions[])(void) = {
opened_cannon_act_0,
opened_cannon_act_1,
opened_cannon_act_2,
opened_cannon_act_3,
opened_cannon_act_4,
opened_cannon_act_5,
opened_cannon_act_6,
};
void bhv_cannon_base_loop(void) {
cur_obj_call_action_function(sOpenedCannonActions);
if (o->oCannonUnkF8)
if (o->oCannonUnkF8) {
o->oCannonUnkF8++;
}
o->oInteractStatus = 0;
}
void bhv_cannon_barrel_loop(void) {
struct Object *parent = o->parentObj;
if (parent->header.gfx.node.flags & GRAPH_RENDER_ACTIVE) {
cur_obj_enable_rendering();
obj_copy_pos(o, o->parentObj);
o->oMoveAngleYaw = o->parentObj->oMoveAngleYaw;
o->oFaceAnglePitch = o->parentObj->oMoveAnglePitch;
} else
} else {
cur_obj_disable_rendering();
}
}
+14 -13
View File
@@ -1,11 +1,10 @@
// cannon.c.inc
// cannon.inc.c
void bhv_cannon_closed_init(void) {
struct Object *cannon;
if (save_file_is_cannon_unlocked() == 1) {
if (save_file_is_cannon_unlocked() == TRUE) {
// If the cannon is open, spawn a cannon and despawn the object.
cannon = spawn_object(o, MODEL_CANNON_BASE, bhvCannon);
struct Object *cannon = spawn_object(o, MODEL_CANNON_BASE, bhvCannon);
cannon->oBehParams2ndByte = o->oBehParams2ndByte;
cannon->oPosX = o->oHomeX;
cannon->oPosY = o->oHomeY;
@@ -17,13 +16,14 @@ void bhv_cannon_closed_init(void) {
}
void cannon_door_act_opening(void) {
if (o->oTimer == 0)
if (o->oTimer == 0) {
cur_obj_play_sound_2(SOUND_GENERAL_CANNON_UP);
}
if (o->oTimer < 30) {
o->oVelY = -0.5f;
o->oPosY += o->oVelY;
o->oVelX = 0;
o->oVelX = 0.0f;
} else {
if (o->oTimer == 80) {
bhv_cannon_closed_init();
@@ -31,7 +31,7 @@ void cannon_door_act_opening(void) {
}
o->oVelX = 4.0f;
o->oVelY = 0;
o->oVelY = 0.0f;
o->oPosX += o->oVelX;
}
}
@@ -39,18 +39,19 @@ void cannon_door_act_opening(void) {
void bhv_cannon_closed_loop(void) {
switch (o->oAction) {
case CANNON_TRAP_DOOR_ACT_CLOSED:
o->oVelX = 0;
o->oVelY = 0;
o->oVelX = 0.0f;
o->oVelY = 0.0f;
o->oDrawingDistance = 4000.0f;
if (save_file_is_cannon_unlocked() == 1)
if (save_file_is_cannon_unlocked() == TRUE) {
o->oAction = CANNON_TRAP_DOOR_ACT_CAM_ZOOM;
}
break;
case CANNON_TRAP_DOOR_ACT_CAM_ZOOM:
if (o->oTimer == 60)
if (o->oTimer == 60) {
o->oAction = CANNON_TRAP_DOOR_ACT_OPENING;
}
o->oDrawingDistance = 20000.0f;
break;
+41 -28
View File
@@ -1,4 +1,4 @@
// cap.c.inc
// cap.inc.c
static struct ObjectHitbox sCapHitbox = {
/* interactType: */ INTERACT_CAP,
@@ -14,13 +14,14 @@ static struct ObjectHitbox sCapHitbox = {
s32 cap_set_hitbox(void) {
obj_set_hitbox(o, &sCapHitbox);
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
o->oInteractStatus = 0;
return 1;
return TRUE;
}
return 0;
return FALSE;
}
void cap_despawn(void) {
@@ -30,8 +31,9 @@ void cap_despawn(void) {
}
void cap_check_quicksand(void) {
if (sObjFloor == NULL)
if (sObjFloor == NULL) {
return;
}
switch (sObjFloor->type) {
case SURFACE_DEATH_PLANE:
@@ -76,24 +78,24 @@ void cap_sink_quicksand(void) {
break;
case 11:
if (o->oTimer < 10)
if (o->oTimer < 10) {
o->oGraphYOffset += -3.0f;
}
o->oFaceAnglePitch = 0x2000;
break;
case 12:
o->oGraphYOffset += -1.0f;
if (o->oTimer >= 21)
if (o->oTimer > 20) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
break;
case 13:
o->oGraphYOffset += -6.0f;
if (o->oTimer >= 21)
if (o->oTimer > 20) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
o->oFaceAnglePitch = 0x2000;
break;
}
@@ -118,11 +120,12 @@ void cap_scale_vertically(void) {
}
void wing_vanish_cap_act_0(void) {
s16 sp1E;
s16 collisionFlags;
o->oFaceAngleYaw += o->oForwardVel * 128.0f;
sp1E = object_step();
if (sp1E & 0x01) {
collisionFlags = object_step();
if (collisionFlags & OBJ_COL_FLAG_GROUNDED) {
cap_check_quicksand();
if (o->oVelY != 0.0f) {
o->oCapUnkF4 = 1;
@@ -130,8 +133,9 @@ void wing_vanish_cap_act_0(void) {
}
}
if (o->oCapUnkF4 == 1)
if (o->oCapUnkF4 == 1) {
cap_scale_vertically();
}
}
void bhv_wing_vanish_cap_loop(void) {
@@ -146,8 +150,9 @@ void bhv_wing_vanish_cap_loop(void) {
break;
}
if (o->oTimer > 20)
if (o->oTimer > 20) {
cur_obj_become_tangible();
}
cap_despawn();
cap_set_hitbox();
@@ -157,16 +162,18 @@ void bhv_metal_cap_init(void) {
o->oGravity = 2.4f;
o->oFriction = 0.999f;
o->oBuoyancy = 1.5f;
o->oOpacity = 0xFF;
o->oOpacity = 255;
}
void metal_cap_act_0(void) {
s16 sp1E;
s16 collisionFlags;
o->oFaceAngleYaw += o->oForwardVel * 128.0f;
sp1E = object_step();
if (sp1E & 0x01)
collisionFlags = object_step();
if (collisionFlags & OBJ_COL_FLAG_GROUNDED) {
cap_check_quicksand();
}
}
void bhv_metal_cap_loop(void) {
@@ -181,8 +188,9 @@ void bhv_metal_cap_loop(void) {
break;
}
if (o->oTimer > 20)
if (o->oTimer > 20) {
cur_obj_become_tangible();
}
cap_set_hitbox();
cap_despawn();
@@ -192,7 +200,7 @@ void bhv_normal_cap_init(void) {
o->oGravity = 0.7f;
o->oFriction = 0.89f;
o->oBuoyancy = 0.9f;
o->oOpacity = 0xFF;
o->oOpacity = 255;
save_file_set_cap_pos(o->oPosX, o->oPosY, o->oPosZ);
}
@@ -220,12 +228,13 @@ void normal_cap_set_save_flags(void) {
}
void normal_cap_act_0(void) {
s16 sp1E;
s16 collisionFlags;
o->oFaceAngleYaw += o->oForwardVel * 128.0f;
o->oFaceAnglePitch += o->oForwardVel * 80.0f;
sp1E = object_step();
if (sp1E & 0x01) {
collisionFlags = object_step();
if (collisionFlags & OBJ_COL_FLAG_GROUNDED) {
cap_check_quicksand();
if (o->oVelY != 0.0f) {
@@ -235,8 +244,9 @@ void normal_cap_act_0(void) {
}
}
if (o->oCapUnkF4 == 1)
if (o->oCapUnkF4 == 1) {
cap_scale_vertically();
}
}
void bhv_normal_cap_loop(void) {
@@ -251,14 +261,17 @@ void bhv_normal_cap_loop(void) {
break;
}
if ((s32) o->oForwardVel != 0)
if ((s32) o->oForwardVel != 0) {
save_file_set_cap_pos(o->oPosX, o->oPosY, o->oPosZ);
}
if (o->activeFlags == ACTIVE_FLAG_DEACTIVATED)
if (o->activeFlags == ACTIVE_FLAG_DEACTIVATED) {
normal_cap_set_save_flags();
}
if (cap_set_hitbox() == 1)
if (cap_set_hitbox() == TRUE) {
save_file_clear_flags(SAVE_FLAG_CAP_ON_GROUND);
}
}
void bhv_vanish_cap_init(void) {
+18 -9
View File
@@ -1,4 +1,4 @@
// capswitch.c.inc
// capswitch.inc.c
UNUSED u8 sCapSwitchText[] = { DIALOG_010, DIALOG_011, DIALOG_012 };
@@ -6,15 +6,19 @@ void cap_switch_act_0(void) {
o->oAnimState = o->oBehParams2ndByte;
cur_obj_scale(0.5f);
o->oPosY += 71.0f;
spawn_object_relative_with_scale(0, 0, -71, 0, 0.5f, o, MODEL_CAP_SWITCH_BASE, bhvCapSwitchBase);
if (gCurrLevelNum != LEVEL_UNKNOWN_32) {
if (save_file_get_flags() & sCapSaveFlags[o->oBehParams2ndByte]) {
o->oAction = 3;
o->header.gfx.scale[1] = 0.1f;
} else
} else {
o->oAction = 1;
} else
}
} else {
o->oAction = 1;
}
}
void cap_switch_act_1(void) {
@@ -26,7 +30,6 @@ void cap_switch_act_1(void) {
}
void cap_switch_act_2(void) {
s32 sp1C;
if (o->oTimer < 5) {
cur_obj_scale_over_time(2, 4, 0.5f, 0.1f);
if (o->oTimer == 4) {
@@ -41,18 +44,24 @@ void cap_switch_act_2(void) {
//! Neither of these flags are defined in this function so they do nothing.
// On an extra note, there's a specific check for this cutscene and
// there's no dialog defined since the cutscene itself calls the dialog.
sp1C = cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_FRONT,
s32 dialogResponse = cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_FRONT,
(DIALOG_FLAG_TEXT_RESPONSE | DIALOG_FLAG_UNK_CAPSWITCH), CUTSCENE_CAP_SWITCH_PRESS, 0);
if (sp1C)
if (dialogResponse) {
o->oAction = 3;
}
}
}
// dead function
void cap_switch_act_3(void) {
} // dead function
}
void (*sCapSwitchActions[])(void) = { cap_switch_act_0, cap_switch_act_1,
cap_switch_act_2, cap_switch_act_3 };
void (*sCapSwitchActions[])(void) = {
cap_switch_act_0,
cap_switch_act_1,
cap_switch_act_2,
cap_switch_act_3,
};
void bhv_cap_switch_loop(void) {
cur_obj_call_action_function(sCapSwitchActions);
+16 -8
View File
@@ -1,8 +1,9 @@
// castle_floor_trap.c.inc
// castle_floor_trap.inc.c
void bhv_floor_trap_in_castle_loop(void) {
if (gMarioObject->platform == o)
if (gMarioObject->platform == o) {
o->parentObj->oInteractStatus |= INT_STATUS_TRAP_TURN;
}
o->oFaceAngleRoll = o->parentObj->oFaceAngleRoll;
}
@@ -15,20 +16,24 @@ void bhv_castle_floor_trap_init(void) {
void bhv_castle_floor_trap_open_detect(void) {
if (gMarioStates[0].action == ACT_SPECIAL_EXIT_AIRBORNE
|| gMarioStates[0].action == ACT_SPECIAL_DEATH_EXIT)
|| gMarioStates[0].action == ACT_SPECIAL_DEATH_EXIT) {
o->oAction = 4; // rotates trapdoor so it looks always open
else {
} else {
o->oAngleVelRoll = 0x400;
if (o->oInteractStatus & INT_STATUS_TRAP_TURN)
if (o->oInteractStatus & INT_STATUS_TRAP_TURN) {
o->oAction = 1; // detects interact then opens the trapdoor
}
}
}
void bhv_castle_floor_trap_open(void) {
if (o->oTimer == 0)
if (o->oTimer == 0) {
cur_obj_play_sound_2(SOUND_GENERAL_CASTLE_TRAP_OPEN);
}
o->oAngleVelRoll -= 0x100;
o->oFaceAngleRoll += o->oAngleVelRoll;
if (o->oFaceAngleRoll < -0x4000) {
o->oFaceAngleRoll = -0x4000;
o->oAction = 2; // after opening is done, enable close detection
@@ -36,12 +41,14 @@ void bhv_castle_floor_trap_open(void) {
}
void bhv_castle_floor_trap_close_detect(void) {
if (o->oDistanceToMario > 1000.0f)
if (o->oDistanceToMario > 1000.0f) {
o->oAction = 3; // close trapdoor
}
}
void bhv_castle_floor_trap_close(void) {
o->oFaceAngleRoll += 0x400;
if (o->oFaceAngleRoll > 0) {
o->oFaceAngleRoll = 0;
o->oAction = 0; // after closing, reloads open detection
@@ -54,7 +61,8 @@ void bhv_castle_floor_trap_rotate(void) {
}
void bhv_castle_floor_trap_loop(void) {
UNUSED s32 unused[3];
UNUSED u8 filler[12];
switch (o->oAction) {
case 0:
bhv_castle_floor_trap_open_detect();
+11 -7
View File
@@ -1,4 +1,4 @@
// celebration_star.c.inc
// celebration_star.inc.c
void bhv_celebration_star_init(void) {
o->oHomeX = gMarioObject->header.gfx.pos[0];
@@ -10,7 +10,7 @@ void bhv_celebration_star_init(void) {
if (gCurrLevelNum == LEVEL_BOWSER_1 || gCurrLevelNum == LEVEL_BOWSER_2) {
o->header.gfx.sharedChild = gLoadedGraphNodes[MODEL_BOWSER_KEY];
o->oFaceAnglePitch = 0;
o->oFaceAngleRoll = 49152;
o->oFaceAngleRoll = 0xC000;
cur_obj_scale(0.1f);
o->oCelebStarUnkF4 = 1;
} else {
@@ -35,17 +35,19 @@ void celeb_star_act_spin_around_mario(void) {
o->oFaceAngleYaw += 0x1000;
o->oMoveAngleYaw += 0x2000;
if (o->oTimer == 40)
if (o->oTimer == 40) {
o->oAction = CELEB_STAR_ACT_FACE_CAMERA;
}
if (o->oTimer < 35) {
spawn_object(o, MODEL_SPARKLES, bhvCelebrationStarSparkle);
o->oCelebStarDiameterOfRotation++;
} else
} else {
o->oCelebStarDiameterOfRotation -= 20;
}
}
void celeb_star_act_face_camera(void) {
if (o->oTimer < 10) {
#if BUGFIX_STAR_BOWSER_KEY
if (o->oCelebStarUnkF4 == 0) {
@@ -61,8 +63,9 @@ void celeb_star_act_face_camera(void) {
o->oFaceAngleYaw = gMarioObject->header.gfx.angle[1];
}
if (o->oTimer == 59)
if (o->oTimer == 59) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
}
void bhv_celebration_star_loop(void) {
@@ -80,8 +83,9 @@ void bhv_celebration_star_loop(void) {
void bhv_celebration_star_sparkle_loop(void) {
o->oPosY -= 15.0f;
if (o->oTimer == 12)
if (o->oTimer == 12) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
}
void bhv_star_key_collection_puff_spawner_loop(void) {
+14 -14
View File
@@ -13,15 +13,15 @@
* Hitbox for chain chomp.
*/
static struct ObjectHitbox sChainChompHitbox = {
/* interactType: */ INTERACT_MR_BLIZZARD,
/* downOffset: */ 0,
/* interactType: */ INTERACT_MR_BLIZZARD,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 3,
/* health: */ 1,
/* numLootCoins: */ 0,
/* radius: */ 80,
/* height: */ 160,
/* hurtboxRadius: */ 80,
/* hurtboxHeight: */ 160,
/* health: */ 1,
/* numLootCoins: */ 0,
/* radius: */ 80,
/* height: */ 160,
/* hurtboxRadius: */ 80,
/* hurtboxHeight: */ 160,
};
/**
@@ -190,7 +190,7 @@ static void chain_chomp_sub_act_turn(void) {
o->oChainChompTargetPitch = obj_get_pitch_from_vel();
}
} else {
o->oTimer -= 1;
o->oTimer--;
}
} else {
o->oForwardVel = 0.0f;
@@ -201,7 +201,7 @@ static void chain_chomp_sub_act_turn(void) {
o->oVelY = 20.0f;
}
} else {
cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x190);
cur_obj_rotate_yaw_toward(o->oAngleToMario, 400);
o->oTimer = 0;
}
}
@@ -228,7 +228,7 @@ static void chain_chomp_sub_act_lunge(void) {
} else {
// Turn toward pivot
cur_obj_rotate_yaw_toward(atan2s(o->oChainChompSegments[0].posZ, o->oChainChompSegments[0].posX),
0x1000);
0x1000);
if (o->oChainChompUnk104 != 0.0f) {
approach_f32_ptr(&o->oChainChompUnk104, 0.0f, 0.8f);
@@ -274,9 +274,9 @@ static void chain_chomp_released_lunge_around(void) {
if (o->oMoveFlags & OBJ_MOVE_MASK_ON_GROUND) {
// Before first bounce, turn toward mario and wait 2 seconds
if (o->oChainChompNumLunges == 0) {
if (cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x320)) {
if (cur_obj_rotate_yaw_toward(o->oAngleToMario, 800)) {
if (o->oTimer > 60) {
o->oChainChompNumLunges += 1;
o->oChainChompNumLunges++;
// enable wall collision
o->oWallHitboxRadius = 200.0f;
}
@@ -434,7 +434,7 @@ static void chain_chomp_act_move(void) {
chain_chomp_update_chain_segments();
// Begin a lunge if mario tries to attack
if (obj_check_attacks(&sChainChompHitbox, o->oAction)) {
if (obj_check_attacks(&sChainChompHitbox, o->oAction) != 0) {
o->oSubAction = CHAIN_CHOMP_SUB_ACT_LUNGE;
o->oChainChompMaxDistFromPivotPerChainPart = 900.0f / 5;
o->oForwardVel = 0.0f;
+38 -13
View File
@@ -1,7 +1,15 @@
// checkerboard_platform.c.inc
// checkerboard_platform.inc.c
struct Struct8032F754 D_8032F754[] = { { 145, { 0.7f, 1.5f, 0.7f }, 7.0f },
{ 235, { 1.2f, 2.0f, 1.2f }, 11.6f } };
struct Struct8032F754 {
s32 unk0;
Vec3f unk1;
f32 unk2;
};
struct Struct8032F754 D_8032F754[] = {
{ 145, { 0.7f, 1.5f, 0.7f }, 7.0f },
{ 235, { 1.2f, 2.0f, 1.2f }, 11.6f },
};
void bhv_checkerboard_elevator_group_init(void) {
s32 sp3C;
@@ -9,15 +17,20 @@ void bhv_checkerboard_elevator_group_init(void) {
s32 sp34;
s32 i;
struct Object *sp2C;
if (o->oBehParams2ndByte == 0)
if (o->oBehParams2ndByte == 0) {
o->oBehParams2ndByte = 65;
}
sp3C = o->oBehParams2ndByte * 10;
sp34 = (o->oBehParams >> 24) & 0XFF;
sp34 = (o->oBehParams >> 24) & 0xFF;
for (i = 0; i < 2; i++) {
if (i == 0)
if (i == 0) {
sp38 = -D_8032F754[sp34].unk0;
else
} else {
sp38 = D_8032F754[sp34].unk0;
}
sp2C = spawn_object_relative(i, 0, i * sp3C, sp38, o, MODEL_CHECKERBOARD_PLATFORM,
bhvCheckerboardPlatformSub);
@@ -31,15 +44,17 @@ void checkerboard_plat_act_move_y(UNUSED s32 unused, f32 vel, s32 a2) {
o->oAngleVelPitch = 0;
o->oForwardVel = 0.0f;
o->oVelY = vel;
if (o->oTimer > a2)
if (o->oTimer > a2) {
o->oAction++;
}
}
void checkerboard_plat_act_rotate(s32 a0, s16 a1) {
o->oVelY = 0.0f;
o->oAngleVelPitch = a1;
if (o->oTimer + 1 == 0x8000 / absi(a1))
if (o->oTimer + 1 == 0x8000 / absi(a1)) {
o->oAction = a0;
}
o->oCheckerBoardPlatformUnkF8 = a0;
}
@@ -49,15 +64,20 @@ void bhv_checkerboard_platform_init(void) {
void bhv_checkerboard_platform_loop(void) {
f32 sp24 = o->oCheckerBoardPlatformUnk1AC;
o->oCheckerBoardPlatformUnkF8 = 0;
if (o->oDistanceToMario < 1000.0f)
if (o->oDistanceToMario < 1000.0f) {
cur_obj_play_sound_1(SOUND_ENV_ELEVATOR4);
}
switch (o->oAction) {
case 0:
if (o->oBehParams2ndByte == 0)
if (o->oBehParams2ndByte == 0) {
o->oAction = 1;
else
} else {
o->oAction = 3;
}
break;
case 1:
checkerboard_plat_act_move_y(2, 10.0f, o->oCheckerBoardPlatformUnkFC);
@@ -72,18 +92,23 @@ void bhv_checkerboard_platform_loop(void) {
checkerboard_plat_act_rotate(1, -512);
break;
}
o->oMoveAnglePitch += absi(o->oAngleVelPitch);
o->oFaceAnglePitch += absi(o->oAngleVelPitch);
o->oFaceAngleYaw = o->oMoveAngleYaw;
if (o->oMoveAnglePitch != 0) {
o->oForwardVel = signum_positive(o->oAngleVelPitch) * sins(o->oMoveAnglePitch) * sp24;
o->oVelY = signum_positive(o->oAngleVelPitch) * coss(o->oMoveAnglePitch) * sp24;
}
if (o->oCheckerBoardPlatformUnkF8 == 1) {
o->oAngleVelPitch = 0;
o->oFaceAnglePitch &= ~0x7FFF;
cur_obj_move_using_fvel_and_gravity();
} else
} else {
cur_obj_move_using_fvel_and_gravity();
}
load_object_collision_model();
}
+101 -53
View File
@@ -1,4 +1,4 @@
// chuckya.c.inc
// chuckya.inc.c
struct UnusedChuckyaData {
u8 unk0;
@@ -6,79 +6,97 @@ struct UnusedChuckyaData {
f32 unk8;
};
struct UnusedChuckyaData sUnusedChuckyaData[] = { { 2, 0.f, 1.f },
{ 2, 10.f, 1.f },
{ 2, 20.f, 1.f },
{ 2, 20.f, 1.f },
{ 8, 10.f, 1.f }};
struct UnusedChuckyaData sUnusedChuckyaData[] = {
{ 2, 0.f, 1.f },
{ 2, 10.f, 1.f },
{ 2, 20.f, 1.f },
{ 2, 20.f, 1.f },
{ 8, 10.f, 1.f },
};
void common_anchor_mario_behavior(f32 sp28, f32 sp2C, s32 sp30) {
switch (o->parentObj->oChuckyaUnk88) {
case 0:
break;
case 1:
obj_set_gfx_pos_at_obj_pos(gMarioObject, o);
break;
case 2:
gMarioObject->oInteractStatus |= (sp30 + INT_STATUS_MARIO_UNK2);
gMarioObject->oInteractStatus |= (INT_STATUS_MARIO_UNK2 + sp30);
gMarioStates[0].forwardVel = sp28;
gMarioStates[0].vel[1] = sp2C;
o->parentObj->oChuckyaUnk88 = 0;
break;
case 3:
gMarioObject->oInteractStatus |=
(INT_STATUS_MARIO_UNK2 + INT_STATUS_MARIO_UNK6); // loads 2 interactions at once?
gMarioObject->oInteractStatus |= (INT_STATUS_MARIO_UNK2 | INT_STATUS_MARIO_UNK6);
gMarioStates[0].forwardVel = 10.0f;
gMarioStates[0].vel[1] = 10.0f;
o->parentObj->oChuckyaUnk88 = 0;
break;
}
o->oMoveAngleYaw = o->parentObj->oMoveAngleYaw;
if (o->parentObj->activeFlags == ACTIVE_FLAG_DEACTIVATED)
if (o->parentObj->activeFlags == ACTIVE_FLAG_DEACTIVATED) {
obj_mark_for_deletion(o);
}
}
void bhv_chuckya_anchor_mario_loop(void) {
common_anchor_mario_behavior(40.0f, 40.0f, 64);
common_anchor_mario_behavior(40.0f, 40.0f, INT_STATUS_MARIO_UNK6);
}
s32 unknown_chuckya_function(s32 sp20, f32 sp24, f32 sp28, s32 sp2C) {
s32 unknown_chuckya_function(s32 sp20, f32 sp24, f32 sp28, s16 sp2C) {
s32 sp1C = 0;
if (o->oChuckyaUnkF8 != 4) {
if (sp24 < cur_obj_lateral_dist_from_mario_to_home()) {
if (cur_obj_lateral_dist_to_home() < 200.0f)
if (cur_obj_lateral_dist_to_home() < 200.0f) {
sp1C = 0;
else {
} else {
sp1C = 1;
o->oAngleToMario = cur_obj_angle_to_home();
}
} else if (o->oDistanceToMario > sp28) {
if (gGlobalTimer % (s16) sp2C == 0)
if (gGlobalTimer % sp2C == 0) {
o->oAngleToMario = obj_angle_to_object(o, gMarioObject);
}
sp1C = 2;
} else
} else {
sp1C = 3;
}
if (sp20 && update_angle_from_move_flags(&o->oAngleToMario)) {
sp1C = 4;
o->oChuckyaUnkF8 = 4;
}
} else
} else {
sp1C = 4;
}
return sp1C;
}
s32 approach_forward_vel(f32 *arr, f32 spC, f32 sp10) {
s32 approach_forward_vel(f32 *forwardVel, f32 spC, f32 sp10) {
s32 sp4 = 0;
if (arr[0] > spC) {
arr[0] -= sp10;
if (arr[0] < spC)
arr[0] = spC;
} else if (arr[0] < spC) {
arr[0] += sp10;
if (arr[0] > spC)
arr[0] = spC;
} else
if (*forwardVel > spC) {
*forwardVel -= sp10;
if (*forwardVel < spC) {
*forwardVel = spC;
}
} else if (*forwardVel < spC) {
*forwardVel += sp10;
if (*forwardVel > spC) {
*forwardVel = spC;
}
} else {
sp4 = 1;
}
return sp4;
}
@@ -87,61 +105,81 @@ void chuckya_act_0(void) {
#ifdef AVOID_UB
sp3C = 0;
#endif
UNUSED u8 pad[16];
UNUSED u8 filler[16];
s32 sp28;
if (o->oTimer == 0)
if (o->oTimer == 0) {
o->oChuckyaUnkFC = 0;
}
o->oAngleToMario = obj_angle_to_object(o, gMarioObject);
switch (sp28 = o->oSubAction) {
case 0:
o->oForwardVel = 0;
o->oForwardVel = 0.0f;
if (cur_obj_lateral_dist_from_mario_to_home() < 2000.0f) {
cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x400);
if (o->oChuckyaUnkFC > 40
|| abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < 0x1000)
|| abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < 0x1000) {
o->oSubAction = 1;
} else
}
} else {
o->oSubAction = 3;
}
break;
case 1:
approach_forward_vel(&o->oForwardVel, 30.0f, 4.0f);
if (abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) > 0x4000)
if (abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) > 0x4000) {
o->oSubAction = 2;
if (cur_obj_lateral_dist_from_mario_to_home() > 2000.0f)
}
if (cur_obj_lateral_dist_from_mario_to_home() > 2000.0f) {
o->oSubAction = 3;
}
break;
case 2:
approach_forward_vel(&o->oForwardVel, 0, 4.0f);
if (o->oChuckyaUnkFC > 48)
if (o->oChuckyaUnkFC > 48) {
o->oSubAction = 0;
}
break;
case 3:
if (cur_obj_lateral_dist_to_home() < 500.0f)
o->oForwardVel = 0;
else {
if (cur_obj_lateral_dist_to_home() < 500.0f) {
o->oForwardVel = 0.0f;
} else {
approach_forward_vel(&o->oForwardVel, 10.0f, 4.0f);
o->oAngleToMario = cur_obj_angle_to_home();
cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x800);
}
if (cur_obj_lateral_dist_from_mario_to_home() < 1900.0f)
if (cur_obj_lateral_dist_from_mario_to_home() < 1900.0f) {
o->oSubAction = 0;
}
break;
}
if (o->oSubAction != sp28)
if (o->oSubAction != sp28) {
o->oChuckyaUnkFC = 0;
else
} else {
o->oChuckyaUnkFC++;
}
cur_obj_init_animation_with_sound(4);
if (o->oForwardVel > 1.0f)
if (o->oForwardVel > 1.0f) {
cur_obj_play_sound_1(SOUND_AIR_CHUCKYA_MOVE);
}
print_debug_bottom_up("fg %d", sp3C);
print_debug_bottom_up("sp %d", o->oForwardVel);
}
void chuckya_act_1(void) {
if (o->oSubAction == 0) {
if (cur_obj_init_animation_and_check_if_near_end(0))
if (cur_obj_init_animation_and_check_if_near_end(0)) {
o->oSubAction++;
}
o->oChuckyaUnkFC = random_float() * 30.0f + 10.0f;
o->oChuckyaUnk100 = 0;
o->oForwardVel = 0.0f;
@@ -152,14 +190,14 @@ void chuckya_act_1(void) {
if (o->oChuckyaUnk100 > 10) {
o->oChuckyaUnk88 = 3;
o->oAction = 3;
o->oInteractStatus &= ~(INT_STATUS_GRABBED_MARIO);
o->oInteractStatus &= ~INT_STATUS_GRABBED_MARIO;
} else {
cur_obj_init_animation_with_sound(1);
o->oMoveAngleYaw += INT_STATUS_GRABBED_MARIO;
if (o->oChuckyaUnkFC-- < 0)
if (check_if_moving_over_floor(50.0f, 150.0f) || o->oChuckyaUnkFC < -16) {
o->oSubAction++;
}
if (o->oChuckyaUnkFC-- < 0
&& (check_if_moving_over_floor(50.0f, 150.0f) || o->oChuckyaUnkFC < -16)) {
o->oSubAction++;
}
}
} else {
cur_obj_init_animation_with_sound(3);
@@ -167,18 +205,19 @@ void chuckya_act_1(void) {
cur_obj_play_sound_2(SOUND_OBJ_UNKNOWN4);
o->oChuckyaUnk88 = 2;
o->oAction = 3;
o->oInteractStatus &= ~(INT_STATUS_GRABBED_MARIO);
o->oInteractStatus &= ~INT_STATUS_GRABBED_MARIO;
}
}
}
}
void chuckya_act_3(void) {
o->oForwardVel = 0;
o->oVelY = 0;
o->oForwardVel = 0.0f;
o->oVelY = 0.0f;
cur_obj_init_animation_with_sound(4);
if (o->oTimer > 100)
if (o->oTimer > 100) {
o->oAction = 0;
}
}
void chuckya_act_2(void) {
@@ -189,7 +228,12 @@ void chuckya_act_2(void) {
}
}
void (*sChuckyaActions[])(void) = { chuckya_act_0, chuckya_act_1, chuckya_act_2, chuckya_act_3 };
void (*sChuckyaActions[])(void) = {
chuckya_act_0,
chuckya_act_1,
chuckya_act_2,
chuckya_act_3,
};
void chuckya_move(void) {
cur_obj_update_floor_and_walls();
@@ -205,8 +249,10 @@ void chuckya_move(void) {
void bhv_chuckya_loop(void) {
f32 sp2C = 20.0f;
f32 sp28 = 50.0f;
cur_obj_scale(2.0f);
o->oInteractionSubtype |= INT_SUBTYPE_GRABS_MARIO;
switch (o->oHeldState) {
case HELD_FREE:
chuckya_move();
@@ -219,6 +265,8 @@ void bhv_chuckya_loop(void) {
cur_obj_get_thrown_or_placed(sp2C, sp28, 2);
break;
}
o->oInteractStatus = 0;
print_debug_bottom_up("md %d", o->oAction);
}
+3 -5
View File
@@ -24,22 +24,20 @@ void clam_act_0(void) {
cur_obj_play_sound_2(SOUND_GENERAL_CLAM_SHELL2);
o->oAction = 1;
} else if (o->oClamUnkF4 != 0) {
o->oClamUnkF4 -= 1;
o->oClamUnkF4--;
cur_obj_shake_y(3.0f);
}
}
void clam_act_1(void) {
s16 val06;
s16 val04;
s16 val02;
if (o->oTimer > 150) {
o->oAction = 0;
} else if (obj_is_rendering_enabled() && cur_obj_init_anim_check_frame(1, 8)) {
for (val06 = -0x2000; val06 < 0x2000; val06 += 0x555) {
val04 = (s16)(100.0f * sins(val06));
val02 = (s16)(100.0f * coss(val06));
s16 val04 = (s16)(100.0f * sins(val06));
s16 val02 = (s16)(100.0f * coss(val06));
spawn_object_relative(0, val04, 30, val02, o, MODEL_BUBBLE, bhvBubbleMaybe);
}
+14 -9
View File
@@ -1,9 +1,12 @@
// clock_arm.inc.c
/**
* Main loop of the hour and minute hands of the Tick Tock Clock painting.
*/
void bhv_rotating_clock_arm_loop(void) {
struct Surface *marioSurface;
u16 rollAngle = o->oFaceAngleRoll;
o->oFloorHeight =
find_floor(gMarioObject->oPosX, gMarioObject->oPosY, gMarioObject->oPosZ, &marioSurface);
@@ -12,9 +15,9 @@ void bhv_rotating_clock_arm_loop(void) {
// Probably a safety check for when you leave the level through the painting
// to make sure the setting isn't accidentally locked in as you fly out.
if (o->oAction == 0) {
if (marioSurface->type == SURFACE_DEFAULT)
if (o->oTimer >= 4)
o->oAction++;
if (marioSurface->type == SURFACE_DEFAULT && o->oTimer >= 4) {
o->oAction++;
}
} else if (o->oAction == 1) {
// If Mario is touching the Tick Tock Clock painting...
if (marioSurface != NULL
@@ -26,16 +29,17 @@ void bhv_rotating_clock_arm_loop(void) {
// Set Tick Tick Clock's speed based on the angle of the hand.
// The angle actually counting down from 0xFFFF to 0 so
// 11 o'clock is a small value and 1 o'clock is a large value.
if (rollAngle < 0xAAA) // > 345 degrees from 12 o'clock.
if (rollAngle < 0xAAA) { // > 345 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_STOPPED;
else if (rollAngle < 0x6aa4) // 210..345 degrees from 12 o'clock.
} else if (rollAngle < 0x6AA4) { // 210..345 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_FAST;
else if (rollAngle < 0x954C) // 150..210 degrees from 12 o'clock.
} else if (rollAngle < 0x954C) { // 150..210 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_RANDOM;
else if (rollAngle < 0xf546) // 15..150 degrees from 12 o'clock.
} else if (rollAngle < 0xF546) { // 15..150 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_SLOW;
else // < 15 degrees from 12 o'clock.
} else { // < 15 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_STOPPED;
}
}
// Increment the action to stop animating the hands.
@@ -45,6 +49,7 @@ void bhv_rotating_clock_arm_loop(void) {
}
// Only rotate the hands until Mario enters the painting.
if (o->oAction < 2)
if (o->oAction < 2) {
cur_obj_rotate_face_angle_using_vel();
}
}
+8 -10
View File
@@ -103,11 +103,9 @@ static void cloud_fwoosh_update(void) {
* unloads, and when fwoosh blows wind.
*/
static void cloud_act_main(void) {
s16 localOffsetPhase;
s16 localOffsetPhase = 0x800 * gGlobalTimer;
f32 localOffset;
localOffsetPhase = 0x800 * gGlobalTimer;
if (o->parentObj != o) {
// Despawn if the parent lakitu does
if (o->parentObj->activeFlags == ACTIVE_FLAG_DEACTIVATED) {
@@ -176,7 +174,7 @@ void bhv_cloud_part_update(void) {
if (o->parentObj->oAction == CLOUD_ACT_UNLOAD) {
obj_mark_for_deletion(o);
} else {
f32 size = 2.0f / 3.0f * o->parentObj->header.gfx.scale[0];
f32 scale = 2.0f / 3.0f * o->parentObj->header.gfx.scale[0];
s16 angleFromCenter = o->parentObj->oFaceAngleYaw + 0x10000 / 5 * o->oBehParams2ndByte;
// Takes 32 frames to cycle
@@ -185,22 +183,22 @@ void bhv_cloud_part_update(void) {
f32 cloudRadius;
cur_obj_scale(size);
cur_obj_scale(scale);
// Cap fwoosh's face size
if (o->oBehParams2ndByte == 5 && size > 2.0f) {
size = o->header.gfx.scale[1] = 2.0f;
if (o->oBehParams2ndByte == 5 && scale > 2.0f) {
scale = o->header.gfx.scale[1] = 2.0f;
}
// Move back and forth along (1, 1, 1)
localOffset = 2 * coss(localOffsetPhase) * size;
localOffset = 2 * coss(localOffsetPhase) * scale;
cloudRadius = 25.0f * size;
cloudRadius = 25.0f * scale;
o->oPosX = o->parentObj->oCloudCenterX + cloudRadius * sins(angleFromCenter) + localOffset;
o->oPosY =
o->parentObj->oCloudCenterY + localOffset + size * sCloudPartHeights[o->oBehParams2ndByte];
o->parentObj->oCloudCenterY + localOffset + scale * sCloudPartHeights[o->oBehParams2ndByte];
o->oPosZ = o->parentObj->oPosZ + cloudRadius * coss(angleFromCenter) + localOffset;
+14 -22
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvCoffinSpawner and bhvCoffin.
* The coffins are spawned by a singular spawner,
@@ -37,7 +38,7 @@ void bhv_coffin_spawner_loop(void) {
// Behavior param of 0 for all even i, 1 for all odd
coffin = spawn_object_relative(i & 1, coffinRelativePos[i].x, 0, relativeZ, o,
MODEL_BBH_WOODEN_TOMB, bhvCoffin);
MODEL_BBH_WOODEN_TOMB, bhvCoffin);
// Never true, game would enter a while(1) before it could.
// Possible a remnant of days this didn't happen.
@@ -49,7 +50,7 @@ void bhv_coffin_spawner_loop(void) {
}
}
o->oAction += 1;
o->oAction++;
}
} else if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) {
o->oAction = COFFIN_SPAWNER_ACT_COFFINS_UNLOADED;
@@ -62,13 +63,6 @@ void bhv_coffin_spawner_loop(void) {
* Also controls laying the coffin down after it has stood up.
*/
void coffin_act_idle(void) {
f32 yawCos;
f32 yawSin;
f32 dx;
f32 dz;
f32 distForwards;
f32 distSideways;
if (o->oBehParams2ndByte != COFFIN_BP_STATIC) {
// Lay down if standing
if (o->oFaceAnglePitch != 0) {
@@ -90,25 +84,23 @@ void coffin_act_idle(void) {
o->oTimer = 0;
} else {
// Yaw never changes and is aligned, so yawCos = 1 or -1, yawSin = 0
yawCos = coss(o->oFaceAngleYaw);
yawSin = sins(o->oFaceAngleYaw);
f32 yawCos = coss(o->oFaceAngleYaw);
f32 yawSin = sins(o->oFaceAngleYaw);
dx = gMarioObject->oPosX - o->oPosX;
dz = gMarioObject->oPosZ - o->oPosZ;
f32 dx = gMarioObject->oPosX - o->oPosX;
f32 dz = gMarioObject->oPosZ - o->oPosZ;
distForwards = dx * yawCos + dz * yawSin;
distSideways = dz * yawCos - dx * yawSin;
f32 distForwards = dx * yawCos + dz * yawSin;
f32 distSideways = dz * yawCos - dx * yawSin;
// This checks a box around the coffin and if it has been a bit since it stood up.
// It also checks in the case Mario is squished, so he doesn't get permanently squished.
if (o->oTimer > 60
&& (o->oDistanceToMario > 100.0f || gMarioState->action == ACT_SQUISHED)) {
if (gMarioObject->oPosY - o->oPosY < 200.0f && absf(distForwards) < 140.0f) {
if (distSideways < 150.0f && distSideways > -450.0f) {
cur_obj_play_sound_2(SOUND_GENERAL_BUTTON_PRESS_2_LOWPRIO);
o->oAction = COFFIN_ACT_STAND_UP;
}
}
&& (o->oDistanceToMario > 100.0f || gMarioState->action == ACT_SQUISHED)
&& gMarioObject->oPosY - o->oPosY < 200.0f && absf(distForwards) < 140.0f
&& distSideways < 150.0f && distSideways > -450.0f) {
cur_obj_play_sound_2(SOUND_GENERAL_BUTTON_PRESS_2_LOWPRIO);
o->oAction = COFFIN_ACT_STAND_UP;
}
o->oAngleVelPitch = 0;
+109 -49
View File
@@ -1,28 +1,39 @@
// coin.c.inc
// coin.inc.c
struct ObjectHitbox sYellowCoinHitbox = {
/* interactType: */ INTERACT_COIN,
/* downOffset: */ 0,
/* interactType: */ INTERACT_COIN,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 1,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 100,
/* height: */ 64,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 100,
/* height: */ 64,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
};
s16 sCoinArrowPositions[][2] = { { 0, -150 }, { 0, -50 }, { 0, 50 }, { 0, 150 },
{ -50, 100 }, { -100, 50 }, { 50, 100 }, { 100, 50 } };
s16 sCoinArrowPositions[][2] = {
{ 0, -150 },
{ 0, -50 },
{ 0, 50 },
{ 0, 150 },
{ -50, 100 },
{ -100, 50 },
{ 50, 100 },
{ 100, 50 },
};
s32 bhv_coin_sparkles_init(void) {
if (o->oInteractStatus & INT_STATUS_INTERACTED && !(o->oInteractStatus & INT_STATUS_TOUCHED_BOB_OMB)) {
if (o->oInteractStatus & INT_STATUS_INTERACTED
&& !(o->oInteractStatus & INT_STATUS_TOUCHED_BOB_OMB)) {
spawn_object(o, MODEL_SPARKLES, bhvGoldenCoinSparkles);
obj_mark_for_deletion(o);
return 1;
return TRUE;
}
o->oInteractStatus = 0;
return 0;
return FALSE;
}
void bhv_yellow_coin_init(void) {
@@ -30,10 +41,14 @@ void bhv_yellow_coin_init(void) {
obj_set_hitbox(o, &sYellowCoinHitbox);
bhv_init_room();
cur_obj_update_floor_height();
if (500.0f < absf(o->oPosY - o->oFloorHeight))
if (500.0f < absf(o->oPosY - o->oFloorHeight)) {
cur_obj_set_model(MODEL_YELLOW_COIN_NO_SHADOW);
if (o->oFloorHeight < FLOOR_LOWER_LIMIT_MISC)
}
if (o->oFloorHeight < FLOOR_LOWER_LIMIT_MISC) {
obj_mark_for_deletion(o);
}
}
void bhv_yellow_coin_loop(void) {
@@ -43,8 +58,11 @@ void bhv_yellow_coin_loop(void) {
void bhv_temp_coin_loop(void) {
o->oAnimState++;
if (cur_obj_wait_then_blink(200, 20))
if (cur_obj_wait_then_blink(200, 20)) {
obj_mark_for_deletion(o);
}
bhv_coin_sparkles_init();
}
@@ -52,6 +70,7 @@ void bhv_coin_init(void) {
o->oVelY = random_float() * 10.0f + 30 + o->oCoinUnk110;
o->oForwardVel = random_float() * 10.0f;
o->oMoveAngleYaw = random_u16();
cur_obj_set_behavior(bhvYellowCoin);
obj_set_hitbox(o, &sYellowCoinHitbox);
cur_obj_become_intangible();
@@ -59,51 +78,58 @@ void bhv_coin_init(void) {
void bhv_coin_loop(void) {
struct Surface *sp1C;
s16 sp1A;
cur_obj_update_floor_and_walls();
cur_obj_if_hit_wall_bounce_away();
cur_obj_move_standard(-62);
if ((sp1C = o->oFloor) != NULL) {
if (o->oMoveFlags & OBJ_MOVE_ON_GROUND)
if (o->oMoveFlags & OBJ_MOVE_ON_GROUND) {
o->oSubAction = 1;
}
if (o->oSubAction == 1) {
o->oBounciness = 0;
if (sp1C->normal.y < 0.9) {
sp1A = atan2s(sp1C->normal.z, sp1C->normal.x);
s16 sp1A = atan2s(sp1C->normal.z, sp1C->normal.x);
cur_obj_rotate_yaw_toward(sp1A, 0x400);
}
}
}
if (o->oTimer == 0)
#if defined(VERSION_US)
cur_obj_play_sound_2(SOUND_GENERAL_COIN_SPURT_2);
#elif defined(VERSION_EU) || defined(VERSION_SH)
cur_obj_play_sound_2(SOUND_GENERAL_COIN_SPURT_EU);
#else
if (o->oTimer == 0) {
cur_obj_play_sound_2(SOUND_GENERAL_COIN_SPURT);
#endif
if (o->oVelY < 0)
}
if (o->oVelY < 0) {
cur_obj_become_tangible();
}
if (o->oMoveFlags & OBJ_MOVE_LANDED) {
#ifndef VERSION_JP
if (o->oMoveFlags & (OBJ_MOVE_ABOVE_DEATH_BARRIER | OBJ_MOVE_ABOVE_LAVA))
#else
if (o->oMoveFlags & OBJ_MOVE_ABOVE_LAVA)
#endif
{
obj_mark_for_deletion(o);
}
}
#ifndef VERSION_JP
if (o->oMoveFlags & OBJ_MOVE_BOUNCE) {
if (o->oCoinUnk1B0 < 5)
#ifndef VERSION_JP
if (o->oCoinUnk1B0 < 5) {
cur_obj_play_sound_2(SOUND_GENERAL_COIN_DROP);
}
o->oCoinUnk1B0++;
}
#else
if (o->oMoveFlags & OBJ_MOVE_BOUNCE)
cur_obj_play_sound_2(SOUND_GENERAL_COIN_DROP);
#endif
if (cur_obj_wait_then_blink(400, 20))
}
if (cur_obj_wait_then_blink(400, 20)) {
obj_mark_for_deletion(o);
}
bhv_coin_sparkles_init();
}
@@ -112,25 +138,33 @@ void bhv_coin_formation_spawn_loop(void) {
cur_obj_set_behavior(bhvYellowCoin);
obj_set_hitbox(o, &sYellowCoinHitbox);
bhv_init_room();
if (o->oCoinUnkF8) {
o->oPosY += 300.0f;
cur_obj_update_floor_height();
if (o->oPosY < o->oFloorHeight || o->oFloorHeight < FLOOR_LOWER_LIMIT_MISC)
if (o->oPosY < o->oFloorHeight || o->oFloorHeight < FLOOR_LOWER_LIMIT_MISC) {
obj_mark_for_deletion(o);
else
} else {
o->oPosY = o->oFloorHeight;
}
} else {
cur_obj_update_floor_height();
if (absf(o->oPosY - o->oFloorHeight) > 250.0f)
if (absf(o->oPosY - o->oFloorHeight) > 250.0f) {
cur_obj_set_model(MODEL_YELLOW_COIN_NO_SHADOW);
}
}
} else {
if (bhv_coin_sparkles_init())
if (bhv_coin_sparkles_init()) {
o->parentObj->oCoinUnkF4 |= bit_shift_left(o->oBehParams2ndByte);
}
o->oAnimState++;
}
if (o->parentObj->oAction == 2)
if (o->parentObj->oAction == 2) {
obj_mark_for_deletion(o);
}
}
void spawn_coin_in_formation(s32 sp50, s32 sp54) {
@@ -138,18 +172,22 @@ void spawn_coin_in_formation(s32 sp50, s32 sp54) {
Vec3i sp40;
s32 sp3C = 1;
s32 sp38 = 1;
sp40[0] = sp40[1] = sp40[2] = 0;
switch (sp54 & 7) {
case 0:
sp40[2] = 160 * (sp50 - 2);
if (sp50 > 4)
if (sp50 > 4) {
sp3C = 0;
}
break;
case 1:
sp38 = 0;
sp40[1] = 160 * sp50 * 0.8; // 128 * sp50
if (sp50 > 4)
if (sp50 > 4) {
sp3C = 0;
}
break;
case 2:
sp40[0] = sins(sp50 << 13) * 300.0f;
@@ -165,8 +203,11 @@ void spawn_coin_in_formation(s32 sp50, s32 sp54) {
sp40[2] = sCoinArrowPositions[sp50][1];
break;
}
if (sp54 & 0x10)
if (sp54 & 0x10) {
sp38 = 0;
}
if (sp3C) {
sp4C = spawn_object_relative(sp50, sp40[0], sp40[1], sp40[2], o, MODEL_YELLOW_COIN,
bhvCoinFormationSpawn);
@@ -180,19 +221,22 @@ void bhv_coin_formation_init(void) {
void bhv_coin_formation_loop(void) {
s32 bitIndex;
switch (o->oAction) {
case 0:
if (o->oDistanceToMario < 2000.0f) {
for (bitIndex = 0; bitIndex < 8; bitIndex++) {
if (!(o->oCoinUnkF4 & (1 << bitIndex)))
if (!(o->oCoinUnkF4 & (1 << bitIndex))) {
spawn_coin_in_formation(bitIndex, o->oBehParams2ndByte);
}
}
o->oAction++;
}
break;
case 1:
if (o->oDistanceToMario > 2100.0f)
if (o->oDistanceToMario > 2100.0f) {
o->oAction++;
}
break;
case 2:
o->oAction = 0;
@@ -206,31 +250,43 @@ void bhv_coin_formation_loop(void) {
void coin_inside_boo_act_1(void) {
cur_obj_update_floor_and_walls();
cur_obj_if_hit_wall_bounce_away();
if (o->oMoveFlags & OBJ_MOVE_BOUNCE)
if (o->oMoveFlags & OBJ_MOVE_BOUNCE) {
cur_obj_play_sound_2(SOUND_GENERAL_COIN_DROP);
}
if (o->oTimer > 90 || (o->oMoveFlags & OBJ_MOVE_LANDED)) {
obj_set_hitbox(o, &sYellowCoinHitbox);
cur_obj_become_tangible();
cur_obj_set_behavior(bhvYellowCoin);
}
cur_obj_move_standard(-30);
bhv_coin_sparkles_init();
if (cur_obj_has_model(MODEL_BLUE_COIN))
if (cur_obj_has_model(MODEL_BLUE_COIN)) {
o->oDamageOrCoinValue = 5;
if (cur_obj_wait_then_blink(400, 20))
}
if (cur_obj_wait_then_blink(400, 20)) {
obj_mark_for_deletion(o);
}
}
void coin_inside_boo_act_0(void) {
s16 sp26;
f32 sp20;
struct Object *parent = o->parentObj;
cur_obj_become_intangible();
if (o->oTimer == 0 && gCurrLevelNum == LEVEL_BBH) {
cur_obj_set_model(MODEL_BLUE_COIN);
cur_obj_scale(0.7);
cur_obj_scale(0.7f);
}
obj_copy_pos(o, parent);
if (parent->oBooDeathStatus == BOO_DEATH_STATUS_DYING) {
o->oAction = 1;
sp26 = gMarioObject->oMoveAngleYaw;
@@ -241,7 +297,10 @@ void coin_inside_boo_act_0(void) {
}
}
void (*sCoinInsideBooActions[])(void) = { coin_inside_boo_act_0, coin_inside_boo_act_1 };
void (*sCoinInsideBooActions[])(void) = {
coin_inside_boo_act_0,
coin_inside_boo_act_1,
};
void bhv_coin_inside_boo_loop(void) {
cur_obj_call_action_function(sCoinInsideBooActions);
@@ -253,8 +312,9 @@ void bhv_coin_sparkles_loop(void) {
void bhv_golden_coin_sparkles_loop(void) {
struct Object *sp2C;
UNUSED s32 unused;
UNUSED u8 filler[4];
f32 sp24 = 30.0f;
sp2C = spawn_object(o, MODEL_SPARKLES, bhvCoinSparkles);
sp2C->oPosX += random_float() * sp24 - sp24 / 2;
sp2C->oPosZ += random_float() * sp24 - sp24 / 2;
+17 -14
View File
@@ -1,4 +1,4 @@
// collide_particles.c.inc
// collide_particles.inc.c
static s16 sTinyTriMovementParams[] = { 0xD000, 0, 0x3000, 0, 0xDE67, 0x2199,
0x2199, 0x2199, 0xDE67, 0xDE67, 0x2199, 0xDE67 };
@@ -7,27 +7,29 @@ static s16 sTinyStarMovementParams[] = { 0xE000, 0, 0, 0, 0x2000,
0x1666, 0x1666, 0x1666, 0xE99A, 0xE99A, 0x1666, 0xE99A };
void bhv_punch_tiny_triangle_loop(void) {
s16 sp1E;
if (o->oTimer == 0) {
sp1E = o->oMoveAngleYaw;
s16 sp1E = o->oMoveAngleYaw;
o->oCollisionParticleUnkF4 = 1.28f;
cur_obj_set_pos_relative(gMarioObject, 0.0f, 60.0f, 100.0f);
o->oMoveAngleYaw = sp1E;
}
cur_obj_move_using_fvel_and_gravity();
o->oAnimState = 5;
cur_obj_scale(o->oCollisionParticleUnkF4);
o->oCollisionParticleUnkF4 -= 0.2f;
if (gDebugInfo[4][0] + 6 < o->oTimer)
if (gDebugInfo[DEBUG_PAGE_EFFECTINFO][0] + 6 < o->oTimer) {
obj_mark_for_deletion(o);
}
}
void bhv_punch_tiny_triangle_init(void) {
s32 i;
UNUSED s32 unused;
struct Object *triangle;
UNUSED u8 filler[4];
for (i = 0; i < 6; i++) {
triangle = spawn_object(o, MODEL_DIRT_ANIMATION, bhvPunchTinyTriangle);
struct Object *triangle = spawn_object(o, MODEL_DIRT_ANIMATION, bhvPunchTinyTriangle);
triangle->oMoveAngleYaw = gMarioObject->oMoveAngleYaw + sTinyTriMovementParams[2 * i] + 0x8000;
triangle->oVelY = sins(sTinyTriMovementParams[2 * i + 1]) * 25.0f;
triangle->oForwardVel = coss(sTinyTriMovementParams[2 * i + 1]) * 25.0f;
@@ -35,13 +37,13 @@ void bhv_punch_tiny_triangle_init(void) {
}
void bhv_wall_tiny_star_particle_loop(void) {
s16 sp1E;
if (o->oTimer == 0) {
sp1E = o->oMoveAngleYaw;
s16 sp1E = o->oMoveAngleYaw;
o->oCollisionParticleUnkF4 = 0.28f;
cur_obj_set_pos_relative(gMarioObject, 0.0f, 30.0f, 110.0f);
o->oMoveAngleYaw = sp1E;
}
cur_obj_move_using_fvel_and_gravity();
o->oAnimState = 4;
cur_obj_scale(o->oCollisionParticleUnkF4);
@@ -50,10 +52,10 @@ void bhv_wall_tiny_star_particle_loop(void) {
void bhv_tiny_star_particles_init(void) {
s32 i;
UNUSED s32 unused;
struct Object *particle;
UNUSED u8 filler[4];
for (i = 0; i < 7; i++) {
particle = spawn_object(o, MODEL_CARTOON_STAR, bhvWallTinyStarParticle);
struct Object *particle = spawn_object(o, MODEL_CARTOON_STAR, bhvWallTinyStarParticle);
particle->oMoveAngleYaw = gMarioObject->oMoveAngleYaw + sTinyStarMovementParams[2 * i] + 0x8000;
particle->oVelY = sins(sTinyStarMovementParams[2 * i + 1]) * 25.0f;
particle->oForwardVel = coss(sTinyStarMovementParams[2 * i + 1]) * 25.0f;
@@ -67,6 +69,7 @@ void bhv_pound_tiny_star_particle_loop(void) {
o->oPosY -= 20.0f;
o->oVelY = 14.0f;
}
cur_obj_move_using_fvel_and_gravity();
o->oAnimState = 4;
cur_obj_scale(o->oCollisionParticleUnkF4);
@@ -76,9 +79,9 @@ void bhv_pound_tiny_star_particle_loop(void) {
void bhv_pound_tiny_star_particle_init(void) {
s32 sp24;
s32 sp20 = 8;
struct Object *particle;
for (sp24 = 0; sp24 < sp20; sp24++) {
particle = spawn_object(o, MODEL_CARTOON_STAR, bhvPoundTinyStarParticle);
struct Object *particle = spawn_object(o, MODEL_CARTOON_STAR, bhvPoundTinyStarParticle);
particle->oMoveAngleYaw = (sp24 * 65536) / sp20;
}
}
+14 -8
View File
@@ -1,4 +1,4 @@
// controllable_platform.c.inc
// controllable_platform.inc.c
static s8 D_80331694 = 0;
@@ -11,8 +11,9 @@ void controllable_platform_act_1(void) {
}
void controllable_platform_act_2(void) {
if (o->oBehParams2ndByte == D_80331694)
if (o->oBehParams2ndByte == D_80331694) {
return;
}
o->oParentRelativePosY += 4.0f;
if (o->oParentRelativePosY > 51.0f) {
@@ -24,8 +25,9 @@ void controllable_platform_act_2(void) {
void bhv_controllable_platform_sub_loop(void) {
switch (o->oAction) {
case 0:
if (o->oTimer < 30)
if (o->oTimer < 30) {
break;
}
if (gMarioObject->platform == o) {
D_80331694 = o->oBehParams2ndByte;
@@ -49,12 +51,14 @@ void bhv_controllable_platform_sub_loop(void) {
o->oVelX = o->parentObj->oVelX;
o->oVelZ = o->parentObj->oVelZ;
if (o->parentObj->activeFlags == ACTIVE_FLAG_DEACTIVATED)
if (o->parentObj->activeFlags == ACTIVE_FLAG_DEACTIVATED) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
}
void bhv_controllable_platform_init(void) {
struct Object *sp34;
sp34 = spawn_object_rel_with_rot(o, MODEL_HMC_METAL_ARROW_PLATFORM, bhvControllablePlatformSub, 0,
51, 204, 0, 0, 0);
sp34->oBehParams2ndByte = 1;
@@ -85,9 +89,9 @@ void controllable_platform_hit_wall(s8 sp1B) {
}
void controllable_platform_check_walls(s8 sp1B, s8 sp1C[3], Vec3f sp20, UNUSED Vec3f sp24, Vec3f sp28) {
if (sp1C[1] == 1 || (sp1C[0] == 1 && sp1C[2] == 1))
if (sp1C[1] == 1 || (sp1C[0] == 1 && sp1C[2] == 1)) {
controllable_platform_hit_wall(sp1B);
else {
} else {
if (sp1C[0] == 1) {
if (((sp1B == 1 || sp1B == 2) && (s32) sp20[2] != 0)
|| ((sp1B == 3 || sp1B == 4) && (s32) sp20[0] != 0)) {
@@ -209,15 +213,17 @@ void bhv_controllable_platform_loop(void) {
break;
case 6:
if (obj_flicker_and_disappear(o, 150))
if (obj_flicker_and_disappear(o, 150)) {
spawn_object_abs_with_rot(o, 0, MODEL_HMC_METAL_PLATFORM, bhvControllablePlatform,
o->oHomeX, o->oHomeY, o->oHomeZ, 0, 0, 0);
}
break;
}
controllable_platform_tilt_from_mario();
o->oPosX += o->oVelX;
o->oPosZ += o->oVelZ;
if (D_80331694 != 0 && D_80331694 != 6)
if (D_80331694 != 0 && D_80331694 != 6) {
cur_obj_play_sound_1(SOUND_ENV_ELEVATOR2);
}
}
+5 -5
View File
@@ -1,4 +1,4 @@
// corkbox.c.inc
// corkbox.inc.c
// TODO: This split seems weird. Investigate further?
void bhv_bobomb_bully_death_smoke_init(void) {
@@ -31,18 +31,18 @@ void bhv_bobomb_explosion_bubble_loop(void) {
spawn_object(o, MODEL_SMALL_WATER_SPLASH, bhvObjectWaterSplash);
}
if (o->oTimer >= 61)
if (o->oTimer > 60) {
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
o->oPosY += o->oVelY;
o->oTimer++;
}
void bhv_respawner_loop(void) {
struct Object *spawnedObject;
if (!is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, o->oRespawnerMinSpawnDist)) {
spawnedObject = spawn_object(o, o->oRespawnerModelToRespawn, o->oRespawnerBehaviorToRespawn);
struct Object *spawnedObject = spawn_object(o, o->oRespawnerModelToRespawn,
o->oRespawnerBehaviorToRespawn);
spawnedObject->oBehParams = o->oBehParams;
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
+1 -1
View File
@@ -1,4 +1,4 @@
// cruiser.c.inc
// cruiser.inc.c
void bhv_rr_cruiser_wing_init(void) {
o->oRRCruiserWingUnkF4 = o->oFaceAngleYaw;
+1
View File
@@ -1,3 +1,4 @@
// ddd_pole.inc.c
void bhv_ddd_pole_init(void) {
if (!(save_file_get_flags() & (SAVE_FLAG_HAVE_KEY_2 | SAVE_FLAG_UNLOCKED_UPSTAIRS_DOOR))) {
+3 -2
View File
@@ -1,6 +1,7 @@
// ddd_sub.c.inc
// ddd_sub.inc.c
void bhv_bowsers_sub_loop(void) {
if (save_file_get_flags() & (SAVE_FLAG_HAVE_KEY_2 | SAVE_FLAG_UNLOCKED_UPSTAIRS_DOOR))
if (save_file_get_flags() & (SAVE_FLAG_HAVE_KEY_2 | SAVE_FLAG_UNLOCKED_UPSTAIRS_DOOR)) {
obj_mark_for_deletion(o);
}
}
+4 -3
View File
@@ -1,8 +1,9 @@
// ddd_warp.c.inc
// ddd_warp.inc.c
void bhv_ddd_warp_loop(void) {
if (gDddPaintingStatus & BOWSERS_SUB_BEATEN)
if (gDddPaintingStatus & BOWSERS_SUB_BEATEN) {
o->collisionData = segmented_to_virtual(inside_castle_seg7_collision_ddd_warp_2);
else
} else {
o->collisionData = segmented_to_virtual(inside_castle_seg7_collision_ddd_warp);
}
}
+6 -3
View File
@@ -1,3 +1,4 @@
/**
* Behavior for bhvDecorativePendulum.
* This controls the pendulum that lies underneath the Tick Tock Clock painting.
@@ -13,10 +14,11 @@ void bhv_decorative_pendulum_init(void) {
* acceleration.
*/
void bhv_decorative_pendulum_loop(void) {
if (o->oFaceAngleRoll > 0)
if (o->oFaceAngleRoll > 0) {
o->oAngleVelRoll -= 0x08;
else
} else {
o->oAngleVelRoll += 0x08;
}
o->oFaceAngleRoll += o->oAngleVelRoll;
@@ -26,6 +28,7 @@ void bhv_decorative_pendulum_loop(void) {
* This means the sound we hear when the pendulum hits its upswing is
* actually one sound played twice in rapid succession.
*/
if (o->oAngleVelRoll == 0x10 || o->oAngleVelRoll == -0x10)
if (o->oAngleVelRoll == 0x10 || o->oAngleVelRoll == -0x10) {
cur_obj_play_sound_2(SOUND_GENERAL_BIG_CLOCK);
}
}
+8 -11
View File
@@ -1,3 +1,5 @@
// donut_platform.inc.c
static Vec3s sDonutPlatformPositions[] = {
{ 0x0B4C, 0xF7D7, 0x19A4 }, { 0xF794, 0x08A3, 0xFFA9 }, { 0x069C, 0x09D8, 0xFFE0 },
{ 0x05CF, 0x09D8, 0xFFE0 }, { 0x0502, 0x09D8, 0xFFE0 }, { 0x054C, 0xF7D7, 0x19A4 },
@@ -15,24 +17,19 @@ static Vec3s sDonutPlatformPositions[] = {
void bhv_donut_platform_spawner_update(void) {
s32 i;
s32 platformFlag;
f32 dx;
f32 dy;
f32 dz;
f32 marioSqDist;
for (i = 0, platformFlag = 1; i < 31; i++, platformFlag = platformFlag << 1) {
for (i = 0, platformFlag = 1; i < ARRAY_COUNT(sDonutPlatformPositions); i++, platformFlag = platformFlag << 1) {
if (!(o->oDonutPlatformSpawnerSpawnedPlatforms & platformFlag)) {
dx = gMarioObject->oPosX - sDonutPlatformPositions[i][0];
dy = gMarioObject->oPosY - sDonutPlatformPositions[i][1];
dz = gMarioObject->oPosZ - sDonutPlatformPositions[i][2];
marioSqDist = dx * dx + dy * dy + dz * dz;
f32 dx = gMarioObject->oPosX - sDonutPlatformPositions[i][0];
f32 dy = gMarioObject->oPosY - sDonutPlatformPositions[i][1];
f32 dz = gMarioObject->oPosZ - sDonutPlatformPositions[i][2];
f32 marioSqDist = dx * dx + dy * dy + dz * dz;
// dist > 1000 and dist < 2000
if (marioSqDist > 1000000.0f && marioSqDist < 4000000.0f) {
if (spawn_object_relative(i, sDonutPlatformPositions[i][0],
sDonutPlatformPositions[i][1], sDonutPlatformPositions[i][2],
o, MODEL_RR_DONUT_PLATFORM, bhvDonutPlatform)
!= NULL) {
o, MODEL_RR_DONUT_PLATFORM, bhvDonutPlatform) != NULL) {
o->oDonutPlatformSpawnerSpawnedPlatforms |= platformFlag;
}
}
+46 -32
View File
@@ -1,12 +1,11 @@
// door.c.inc
// door.inc.c
struct DoorAction
{
struct DoorAction {
u32 flag;
s32 action;
};
static struct DoorAction sDoorActions[] = { { 0x40000, 3 }, { 0x80000, 4 }, { 0x10000, 1 }, { 0x20000, 2 }, { -1, 0 }, };
static struct DoorAction sDoorActions[] = { { 0x40000, 3 }, { 0x80000, 4 }, { 0x10000, 1 }, { 0x20000, 2 }, { 0xFFFFFFFF, 0 }, };
static s32 sDoorOpenSounds[] = { SOUND_GENERAL_OPEN_WOOD_DOOR, SOUND_GENERAL_OPEN_IRON_DOOR };
@@ -14,15 +13,17 @@ static s32 sDoorCloseSounds[] = { SOUND_GENERAL_CLOSE_WOOD_DOOR, SOUND_GENERAL_C
void door_animation_and_reset(s32 sp18) {
cur_obj_init_animation_with_sound(sp18);
if (cur_obj_check_if_near_animation_end())
if (cur_obj_check_if_near_animation_end()) {
o->oAction = 0;
}
}
void set_door_camera_event(void) {
if (segmented_to_virtual(bhvDoor) == o->behavior)
if (segmented_to_virtual(bhvDoor) == o->behavior) {
gPlayerCameraState->cameraEvent = CAM_EVENT_DOOR;
else
} else {
gPlayerCameraState->cameraEvent = CAM_EVENT_DOOR_WARP;
}
gPlayerCameraState->usedObj = o;
}
@@ -39,14 +40,15 @@ void play_door_open_noise(void) {
void play_warp_door_open_noise(void) {
s32 sp1C = cur_obj_has_model(MODEL_HMC_METAL_DOOR);
if (o->oTimer == 30)
if (o->oTimer == 30) {
cur_obj_play_sound_2(sDoorCloseSounds[sp1C]);
}
}
void bhv_door_loop(void) {
s32 sp1C = 0;
while (sDoorActions[sp1C].flag != (u32)~0) {
while (sDoorActions[sp1C].flag != 0xFFFFFFFF) {
if (cur_obj_clear_interact_status_flag(sDoorActions[sp1C].flag)) {
set_door_camera_event();
cur_obj_change_action(sDoorActions[sp1C].action);
@@ -75,15 +77,21 @@ void bhv_door_loop(void) {
play_warp_door_open_noise();
break;
}
if (o->oAction == 0)
if (o->oAction == 0) {
load_object_collision_model();
}
bhv_star_door_loop_2();
}
void bhv_door_init(void) {
f32 x = o->oPosX;
f32 z = o->oPosZ;
f32 x;
f32 z;
struct Surface *floor;
x = o->oPosX;
z = o->oPosZ;
find_floor(x, o->oPosY, z, &floor);
if (floor != NULL) {
o->oDoorUnkF8 = floor->room;
@@ -110,30 +118,36 @@ void bhv_door_init(void) {
}
void bhv_star_door_loop_2(void) {
s32 sp4 = 0;
s32 sp4 = FALSE;
if (gMarioCurrentRoom != 0) {
if (o->oDoorUnkF8 == gMarioCurrentRoom)
sp4 = 1;
else if (gMarioCurrentRoom == o->oDoorUnkFC)
sp4 = 1;
else if (gMarioCurrentRoom == o->oDoorUnk100)
sp4 = 1;
else if (gDoorAdjacentRooms[gMarioCurrentRoom][0] == o->oDoorUnkFC)
sp4 = 1;
else if (gDoorAdjacentRooms[gMarioCurrentRoom][0] == o->oDoorUnk100)
sp4 = 1;
else if (gDoorAdjacentRooms[gMarioCurrentRoom][1] == o->oDoorUnkFC)
sp4 = 1;
else if (gDoorAdjacentRooms[gMarioCurrentRoom][1] == o->oDoorUnk100)
sp4 = 1;
} else
sp4 = 1;
if (sp4 == 1) {
if (o->oDoorUnkF8 == gMarioCurrentRoom) {
sp4 = TRUE;
} else if (gMarioCurrentRoom == o->oDoorUnkFC) {
sp4 = TRUE;
} else if (gMarioCurrentRoom == o->oDoorUnk100) {
sp4 = TRUE;
} else if (gDoorAdjacentRooms[gMarioCurrentRoom][0] == o->oDoorUnkFC) {
sp4 = TRUE;
} else if (gDoorAdjacentRooms[gMarioCurrentRoom][0] == o->oDoorUnk100) {
sp4 = TRUE;
} else if (gDoorAdjacentRooms[gMarioCurrentRoom][1] == o->oDoorUnkFC) {
sp4 = TRUE;
} else if (gDoorAdjacentRooms[gMarioCurrentRoom][1] == o->oDoorUnk100) {
sp4 = TRUE;
}
} else {
sp4 = TRUE;
}
if (sp4 == TRUE) {
o->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE;
D_8035FEE4++;
}
if (sp4 == 0) {
if (!sp4) {
o->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE;
}
o->oDoorUnk88 = sp4;
}
+5 -9
View File
@@ -1,11 +1,10 @@
// dorrie.inc.c
void dorrie_raise_head(void) {
s16 startAngle;
s16 startAngle = o->oDorrieNeckAngle;
f32 xzDisp;
f32 yDisp;
startAngle = o->oDorrieNeckAngle;
o->oDorrieNeckAngle -= (s16) absf(370.0f * sins(o->oDorrieHeadRaiseSpeed));
xzDisp = 440.0f * (coss(o->oDorrieNeckAngle) - coss(startAngle));
@@ -16,12 +15,10 @@ void dorrie_raise_head(void) {
}
void dorrie_act_move(void) {
s16 startYaw;
s16 startYaw = o->oMoveAngleYaw;
s16 targetYaw;
s16 targetSpeed;
s16 circularTurn;
startYaw = o->oMoveAngleYaw;
o->oDorrieNeckAngle = -0x26F4;
cur_obj_init_animation_with_sound(1);
@@ -36,7 +33,7 @@ void dorrie_act_move(void) {
targetYaw = gMarioObject->oFaceAngleYaw;
targetSpeed = 10;
} else {
circularTurn = 0x4000 - atan2s(2000.0f, o->oDorrieDistToHome - 2000.0f);
s16 circularTurn = 0x4000 - atan2s(2000.0f, o->oDorrieDistToHome - 2000.0f);
if ((s16)(o->oMoveAngleYaw - o->oDorrieAngleToHome) < 0) {
circularTurn = -circularTurn;
}
@@ -112,8 +109,7 @@ void dorrie_act_raise_head(void) {
void bhv_dorrie_update(void) {
f32 boundsShift;
UNUSED s32 unused1;
UNUSED s32 unused2;
UNUSED u8 filler[8];
f32 maxOffsetY;
if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) {
+3 -3
View File
@@ -1,4 +1,4 @@
// drawbridge.c.inc
// drawbridge.inc.c
void bhv_lll_drawbridge_spawner_loop(void) {
struct Object *drawbridge1, *drawbridge2;
@@ -34,7 +34,7 @@ void bhv_lll_drawbridge_loop(void) {
//! Because the global timer increments when the game is paused, pausing and unpausing
// the game at regular intervals can leave the drawbridge raised indefinitely.
if (o->oTimer >= 51 && (globalTimer % 8) == 0) {
if (o->oTimer > 50 && (globalTimer % 8) == 0) {
o->oAction = LLL_DRAWBRIDGE_ACT_LOWER;
cur_obj_play_sound_2(SOUND_GENERAL_BOAT_TILT1);
}
@@ -45,7 +45,7 @@ void bhv_lll_drawbridge_loop(void) {
//! Because the global timer increments when the game is paused, pausing and unpausing
// the game at regular intervals can leave the drawbridge lowered indefinitely.
if (o->oTimer >= 51 && (globalTimer % 8) == 0) {
if (o->oTimer > 50 && (globalTimer % 8) == 0) {
o->oAction = LLL_DRAWBRIDGE_ACT_RAISE;
cur_obj_play_sound_2(SOUND_GENERAL_BOAT_TILT2);
}
+43 -29
View File
@@ -1,12 +1,14 @@
// elevator.c.inc
// elevator.inc.c
static s16 sElevatorHeights[] = { -51, 0, 0,
-461, 0, 0,
-512, 0, 0,
-2611, 0, 0,
-2360, 0, 0,
214, 0, 0,
-50, 1945, 1 };
static s16 sElevatorHeights[] = {
-51, 0, 0,
-461, 0, 0,
-512, 0, 0,
-2611, 0, 0,
-2360, 0, 0,
214, 0, 0,
-50, 1945, 1,
};
void elevator_starting_shake(void) {
cur_obj_play_sound_2(SOUND_GENERAL_QUIET_POUND1);
@@ -17,56 +19,62 @@ void elevator_act_0(void) {
o->oVelY = 0;
if (o->oElevatorUnk100 == 2) {
if (gMarioObject->platform == o) {
if (o->oPosY > o->oElevatorUnkFC)
if (o->oPosY > o->oElevatorUnkFC) {
o->oAction = 2;
else
} else {
o->oAction = 1;
}
}
} else if (gMarioObject->oPosY > o->oElevatorUnkFC || o->oElevatorUnk100 == 1) {
o->oPosY = o->oElevatorUnkF8;
if (gMarioObject->platform == o)
if (gMarioObject->platform == o) {
o->oAction = 2;
}
} else {
o->oPosY = o->oElevatorUnkF4;
if (gMarioObject->platform == o)
if (gMarioObject->platform == o) {
o->oAction = 1;
}
}
}
void elevator_act_1(void) {
cur_obj_play_sound_1(SOUND_ENV_ELEVATOR1);
if (o->oTimer == 0 && cur_obj_is_mario_on_platform())
if (o->oTimer == 0 && cur_obj_is_mario_on_platform()) {
elevator_starting_shake();
}
approach_f32_signed(&o->oVelY, 10.0f, 2.0f);
o->oPosY += o->oVelY;
if (o->oPosY > o->oElevatorUnkF8) {
o->oPosY = o->oElevatorUnkF8;
if (o->oElevatorUnk100 == 2 || o->oElevatorUnk100 == 1)
if (o->oElevatorUnk100 == 2 || o->oElevatorUnk100 == 1) {
o->oAction = 3;
else if (gMarioObject->oPosY < o->oElevatorUnkFC)
} else if (gMarioObject->oPosY < o->oElevatorUnkFC) {
o->oAction = 2;
else
} else {
o->oAction = 3;
}
}
}
void elevator_act_2(void) // Pretty similar code to action 1
{
void elevator_act_2(void) {
cur_obj_play_sound_1(SOUND_ENV_ELEVATOR1);
if (o->oTimer == 0 && cur_obj_is_mario_on_platform())
if (o->oTimer == 0 && cur_obj_is_mario_on_platform()) {
elevator_starting_shake();
}
approach_f32_signed(&o->oVelY, -10.0f, -2.0f);
o->oPosY += o->oVelY;
if (o->oPosY < o->oElevatorUnkF4) {
o->oPosY = o->oElevatorUnkF4;
if (o->oElevatorUnk100 == 1)
if (o->oElevatorUnk100 == 1) {
o->oAction = 4;
else if (o->oElevatorUnk100 == 2)
} else if (o->oElevatorUnk100 == 2) {
o->oAction = 3;
else if (gMarioObject->oPosY > o->oElevatorUnkFC)
} else if (gMarioObject->oPosY > o->oElevatorUnkFC) {
o->oAction = 1;
else
} else {
o->oAction = 3;
}
}
}
@@ -76,19 +84,20 @@ void elevator_act_4(void) {
cur_obj_shake_screen(SHAKE_POS_SMALL);
cur_obj_play_sound_2(SOUND_GENERAL_METAL_POUND);
}
if (!mario_is_in_air_action() && !cur_obj_is_mario_on_platform())
if (!mario_is_in_air_action() && !cur_obj_is_mario_on_platform()) {
o->oAction = 1;
}
}
void elevator_act_3(void) // nearly identical to action 2
{
void elevator_act_3(void) {
o->oVelY = 0;
if (o->oTimer == 0) {
cur_obj_shake_screen(SHAKE_POS_SMALL);
cur_obj_play_sound_2(SOUND_GENERAL_METAL_POUND);
}
if (!mario_is_in_air_action() && !cur_obj_is_mario_on_platform())
if (!mario_is_in_air_action() && !cur_obj_is_mario_on_platform()) {
o->oAction = 0;
}
}
void bhv_elevator_init(void) {
@@ -106,8 +115,13 @@ void bhv_elevator_init(void) {
}
}
void (*sElevatorActions[])(void) = { elevator_act_0, elevator_act_1, elevator_act_2, elevator_act_3,
elevator_act_4 };
void (*sElevatorActions[])(void) = {
elevator_act_0,
elevator_act_1,
elevator_act_2,
elevator_act_3,
elevator_act_4,
};
void bhv_elevator_loop(void) {
cur_obj_call_action_function(sElevatorActions);
+17 -13
View File
@@ -4,24 +4,28 @@ void bhv_end_birds_1_loop(void) {
Vec3f sp34;
UNUSED f32 sp30 = random_float();
switch (gCurrentObject->oAction) {
switch (o->oAction) {
case 0:
cur_obj_scale(0.7f);
gCurrentObject->oIntroLakituUnk110 = -554.f;
gCurrentObject->oIntroLakituUnk10C = 3044.f;
gCurrentObject->oIntroLakituUnk108 = -1314.f;
gCurrentObject->oAction += 1;
o->oIntroLakituUnk110 = -554.0f;
o->oIntroLakituUnk10C = 3044.0f;
o->oIntroLakituUnk108 = -1314.0f;
o->oAction++;
break;
case 1:
vec3f_set(sp34, gCurrentObject->oIntroLakituUnk110, gCurrentObject->oIntroLakituUnk10C,
gCurrentObject->oIntroLakituUnk108);
if (gCurrentObject->oTimer < 100)
obj_rotate_towards_point(gCurrentObject, sp34, 0, 0, 0x20, 0x20);
if ((gCurrentObject->oEndBirdUnk104 == 0.f) && (gCurrentObject->oTimer == 0))
case 1:
vec3f_set(sp34, o->oIntroLakituUnk110, o->oIntroLakituUnk10C,
o->oIntroLakituUnk108);
if (o->oTimer < 100) {
obj_rotate_towards_point(o, sp34, 0, 0, 0x20, 0x20);
}
if ((o->oEndBirdUnk104 == 0.0f) && (o->oTimer == 0)) {
cur_obj_play_sound_2(SOUND_GENERAL_BIRDS_FLY_AWAY);
if (gCutsceneTimer == 0)
obj_mark_for_deletion(gCurrentObject);
}
if (gCutsceneTimer == 0) {
obj_mark_for_deletion(o);
}
break;
}
+9 -8
View File
@@ -2,28 +2,29 @@
void bhv_end_birds_2_loop(void) {
Vec3f sp3C;
UNUSED f32 sp38;
UNUSED f32 sp38 = random_float();
f32 sp34;
s16 sp32, sp30;
sp38 = random_float();
gCurrentObject->oForwardVel = (random_float() * 10.f) + 25.f;
o->oForwardVel = (random_float() * 10.0f) + 25.0f;
switch (gCurrentObject->oAction) {
switch (o->oAction) {
case 0:
cur_obj_scale(0.7f);
gCurrentObject->oAction += 1;
o->oAction++;
break;
case 1:
vec3f_get_dist_and_angle(gCamera->pos, gCamera->focus, &sp34, &sp32,
&sp30);
sp30 += 0x1000;
sp32 += 0; // nice work, Nintendo
vec3f_set_dist_and_angle(gCamera->pos, sp3C, 14000.f, sp32, sp30);
obj_rotate_towards_point(gCurrentObject, sp3C, 0, 0, 8, 8);
vec3f_set_dist_and_angle(gCamera->pos, sp3C, 14000.0f, sp32, sp30);
obj_rotate_towards_point(o, sp3C, 0, 0, 8, 8);
if ((gCurrentObject->oEndBirdUnk104 == 0.f) && (gCurrentObject->oTimer == 0))
if ((o->oEndBirdUnk104 == 0.0f) && (o->oTimer == 0)) {
cur_obj_play_sound_2(SOUND_GENERAL_BIRDS_FLY_AWAY);
}
break;
}
+6 -6
View File
@@ -77,14 +77,14 @@ static void enemy_lakitu_update_speed_and_angle(void) {
// Turn toward mario except right after throwing a spiny
if (o->oEnemyLakituFaceForwardCountdown != 0) {
o->oEnemyLakituFaceForwardCountdown -= 1;
o->oEnemyLakituFaceForwardCountdown--;
} else {
obj_face_yaw_approach(o->oAngleToMario, 0x600);
}
// Change move angle toward mario faster when farther from mario
turnSpeed = (s16)(distToMario * 2);
clamp_s16(&turnSpeed, 0xC8, 0xFA0);
clamp_s16(&turnSpeed, 200, 4000);
cur_obj_rotate_yaw_toward(o->oAngleToMario, turnSpeed);
}
@@ -96,7 +96,7 @@ static void enemy_lakitu_sub_act_no_spiny(void) {
cur_obj_init_animation_with_sound(1);
if (o->oEnemyLakituSpinyCooldown != 0) {
o->oEnemyLakituSpinyCooldown -= 1;
o->oEnemyLakituSpinyCooldown--;
} else if (o->oEnemyLakituNumSpinies < 3 && o->oDistanceToMario < 800.0f
&& abs_angle_diff(o->oAngleToMario, o->oFaceAngleYaw) < 0x4000) {
struct Object *spiny = spawn_object(o, MODEL_SPINY_BALL, bhvSpiny);
@@ -105,7 +105,7 @@ static void enemy_lakitu_sub_act_no_spiny(void) {
spiny->oAction = SPINY_ACT_HELD_BY_LAKITU;
obj_init_animation_with_sound(spiny, spiny_egg_seg5_anims_050157E4, 0);
o->oEnemyLakituNumSpinies += 1;
o->oEnemyLakituNumSpinies++;
o->oSubAction = ENEMY_LAKITU_SUB_ACT_HOLD_SPINY;
o->oEnemyLakituSpinyCooldown = 30;
}
@@ -120,7 +120,7 @@ static void enemy_lakitu_sub_act_hold_spiny(void) {
cur_obj_init_anim_extend(3);
if (o->oEnemyLakituSpinyCooldown != 0) {
o->oEnemyLakituSpinyCooldown -= 1;
o->oEnemyLakituSpinyCooldown--;
}
// TODO: Check if anything interesting happens if we bypass this with speed
else if (o->oDistanceToMario > o->oDrawingDistance - 100.0f
@@ -176,7 +176,7 @@ static void enemy_lakitu_act_main(void) {
cur_obj_move_standard(78);
// Die and drop held spiny when attacked by mario
if (obj_check_attacks(&sEnemyLakituHitbox, o->oAction)) {
if (obj_check_attacks(&sEnemyLakituHitbox, o->oAction) != 0) {
// The spiny uses this as a signal to get thrown
o->prevObj = NULL;
}
+59 -39
View File
@@ -1,48 +1,59 @@
// exclamation_box.c.inc
// exclamation_box.inc.c
struct ObjectHitbox sExclamationBoxHitbox = {
/* interactType: */ INTERACT_BREAKABLE,
/* downOffset: */ 5,
/* interactType: */ INTERACT_BREAKABLE,
/* downOffset: */ 5,
/* damageOrCoinValue: */ 0,
/* health: */ 1,
/* numLootCoins: */ 0,
/* radius: */ 40,
/* height: */ 30,
/* hurtboxRadius: */ 40,
/* hurtboxHeight: */ 30,
/* health: */ 1,
/* numLootCoins: */ 0,
/* radius: */ 40,
/* height: */ 30,
/* hurtboxRadius: */ 40,
/* hurtboxHeight: */ 30,
};
struct Struct802C0DF0 sExclamationBoxContents[] = { { 0, 0, 0, MODEL_MARIOS_WING_CAP, bhvWingCap },
{ 1, 0, 0, MODEL_MARIOS_METAL_CAP, bhvMetalCap },
{ 2, 0, 0, MODEL_MARIOS_CAP, bhvVanishCap },
{ 3, 0, 0, MODEL_KOOPA_SHELL, bhvKoopaShell },
{ 4, 0, 0, MODEL_YELLOW_COIN,
bhvSingleCoinGetsSpawned },
{ 5, 0, 0, MODEL_NONE, bhvThreeCoinsSpawn },
{ 6, 0, 0, MODEL_NONE, bhvTenCoinsSpawn },
{ 7, 0, 0, MODEL_1UP, bhv1upWalking },
{ 8, 0, 0, MODEL_STAR, bhvSpawnedStar },
{ 9, 0, 0, MODEL_1UP, bhv1upRunningAway },
{ 10, 0, 1, MODEL_STAR, bhvSpawnedStar },
{ 11, 0, 2, MODEL_STAR, bhvSpawnedStar },
{ 12, 0, 3, MODEL_STAR, bhvSpawnedStar },
{ 13, 0, 4, MODEL_STAR, bhvSpawnedStar },
{ 14, 0, 5, MODEL_STAR, bhvSpawnedStar },
{ 99, 0, 0, 0, NULL } };
struct Struct802C0DF0 {
u8 unk0;
u8 unk1;
u8 unk2;
u8 model;
const BehaviorScript *behavior;
};
struct Struct802C0DF0 sExclamationBoxContents[] = {
{ 0, 0, 0, MODEL_MARIOS_WING_CAP, bhvWingCap },
{ 1, 0, 0, MODEL_MARIOS_METAL_CAP, bhvMetalCap },
{ 2, 0, 0, MODEL_MARIOS_CAP, bhvVanishCap },
{ 3, 0, 0, MODEL_KOOPA_SHELL, bhvKoopaShell },
{ 4, 0, 0, MODEL_YELLOW_COIN, bhvSingleCoinGetsSpawned },
{ 5, 0, 0, MODEL_NONE, bhvThreeCoinsSpawn },
{ 6, 0, 0, MODEL_NONE, bhvTenCoinsSpawn },
{ 7, 0, 0, MODEL_1UP, bhv1upWalking },
{ 8, 0, 0, MODEL_STAR, bhvSpawnedStar },
{ 9, 0, 0, MODEL_1UP, bhv1upRunningAway },
{ 10, 0, 1, MODEL_STAR, bhvSpawnedStar },
{ 11, 0, 2, MODEL_STAR, bhvSpawnedStar },
{ 12, 0, 3, MODEL_STAR, bhvSpawnedStar },
{ 13, 0, 4, MODEL_STAR, bhvSpawnedStar },
{ 14, 0, 5, MODEL_STAR, bhvSpawnedStar },
{ 99, 0, 0, 0, NULL }
};
void bhv_rotating_exclamation_box_loop(void) {
if (o->parentObj->oAction != 1)
if (o->parentObj->oAction != 1) {
obj_mark_for_deletion(o);
}
}
void exclamation_box_act_0(void) {
if (o->oBehParams2ndByte < 3) {
o->oAnimState = o->oBehParams2ndByte;
if ((save_file_get_flags() & sCapSaveFlags[o->oBehParams2ndByte])
|| ((o->oBehParams >> 24) & 0xFF) != 0)
|| ((o->oBehParams >> 24) & 0xFF)) {
o->oAction = 2;
else
} else {
o->oAction = 1;
}
} else {
o->oAnimState = 3;
o->oAction = 2;
@@ -56,7 +67,7 @@ void exclamation_box_act_1(void) {
cur_obj_set_model(MODEL_EXCLAMATION_BOX_OUTLINE);
}
if ((save_file_get_flags() & sCapSaveFlags[o->oBehParams2ndByte])
|| ((o->oBehParams >> 24) & 0xFF) != 0) {
|| ((o->oBehParams >> 24) & 0xFF)) {
o->oAction = 2;
cur_obj_set_model(MODEL_EXCLAMATION_BOX);
}
@@ -86,7 +97,7 @@ void exclamation_box_act_2(void) {
}
void exclamation_box_act_3(void) {
UNUSED s32 unused;
UNUSED u8 filler[4];
cur_obj_move_using_fvel_and_gravity();
if (o->oVelY < 0.0f) {
o->oVelY = 0.0f;
@@ -99,8 +110,9 @@ void exclamation_box_act_3(void) {
o->header.gfx.scale[0] = o->oExclamationBoxUnkF4 * 2.0f;
o->header.gfx.scale[1] = o->oExclamationBoxUnkF8 * 2.0f;
o->header.gfx.scale[2] = o->oExclamationBoxUnkF4 * 2.0f;
if (o->oTimer == 7)
if (o->oTimer == 7) {
o->oAction = 4;
}
}
void exclamation_box_spawn_contents(struct Struct802C0DF0 *a0, u8 a1) {
@@ -113,8 +125,9 @@ void exclamation_box_spawn_contents(struct Struct802C0DF0 *a0, u8 a1) {
sp1C->oForwardVel = 3.0f;
sp1C->oMoveAngleYaw = gMarioObject->oMoveAngleYaw;
o->oBehParams |= a0->unk2 << 24;
if (a0->model == 122)
o->oFlags |= 0x4000;
if (a0->model == MODEL_STAR) {
o->oFlags |= OBJ_FLAG_PERSISTENT_RESPAWN;
}
break;
}
a0++;
@@ -129,18 +142,25 @@ void exclamation_box_act_4(void) {
if (o->oBehParams2ndByte < 3) {
o->oAction = 5;
cur_obj_hide();
} else
} else {
obj_mark_for_deletion(o);
}
}
void exclamation_box_act_5(void) {
if (o->oTimer > 300)
if (o->oTimer > 300) {
o->oAction = 2;
}
}
void (*sExclamationBoxActions[])(void) = { exclamation_box_act_0, exclamation_box_act_1,
exclamation_box_act_2, exclamation_box_act_3,
exclamation_box_act_4, exclamation_box_act_5 };
void (*sExclamationBoxActions[])(void) = {
exclamation_box_act_0,
exclamation_box_act_1,
exclamation_box_act_2,
exclamation_box_act_3,
exclamation_box_act_4,
exclamation_box_act_5,
};
void bhv_exclamation_box_loop(void) {
cur_obj_scale(2.0f);
+5 -3
View File
@@ -1,4 +1,4 @@
// explosion.c.inc
// explosion.inc.c
void bhv_explosion_init(void) {
create_sound_spawner(SOUND_GENERAL2_BOBOMB_EXPLOSION);
@@ -12,10 +12,12 @@ void bhv_explosion_loop(void) {
if (o->oTimer == 9) {
if (find_water_level(o->oPosX, o->oPosZ) > o->oPosY) {
for (i = 0; i < 40; i++)
for (i = 0; i < 40; i++) {
spawn_object(o, MODEL_WHITE_PARTICLE_SMALL, bhvBobombExplosionBubble);
} else
}
} else {
spawn_object(o, MODEL_SMOKE, bhvBobombBullyDeathSmoke);
}
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
+9 -5
View File
@@ -1,19 +1,22 @@
// express_elevator.c.inc
// express_elevator.inc.c
void bhv_wdw_express_elevator_loop(void) {
o->oVelY = 0.0f;
if (o->oAction == 0) {
if (cur_obj_is_mario_on_platform())
if (cur_obj_is_mario_on_platform()) {
o->oAction++;
}
} else if (o->oAction == 1) {
o->oVelY = -20.0f;
o->oPosY += o->oVelY;
cur_obj_play_sound_1(SOUND_ENV_ELEVATOR4);
if (o->oTimer > 132)
if (o->oTimer > 132) {
o->oAction++;
}
} else if (o->oAction == 2) {
if (o->oTimer > 110)
if (o->oTimer > 110) {
o->oAction++;
}
} else if (o->oAction == 3) {
o->oVelY = 10.0f;
o->oPosY += o->oVelY;
@@ -22,6 +25,7 @@ void bhv_wdw_express_elevator_loop(void) {
o->oPosY = o->oHomeY;
o->oAction++;
}
} else if (!cur_obj_is_mario_on_platform())
} else if (!cur_obj_is_mario_on_platform()) {
o->oAction = 0;
}
}
+22 -27
View File
@@ -1,3 +1,5 @@
// eyerok.inc.c
struct ObjectHitbox sEyerokHitbox = {
/* interactType: */ INTERACT_BOUNCE_TOP,
/* downOffset: */ 0,
@@ -21,9 +23,8 @@ static s32 eyerok_check_mario_relative_z(s32 arg0) {
}
static void eyerok_spawn_hand(s16 side, s32 model, const BehaviorScript *behavior) {
struct Object *hand;
hand = spawn_object_relative_with_scale(side, -500 * side, 0, 300, 1.5f, o, model, behavior);
struct Object *hand = spawn_object_relative_with_scale(side, -500 * side, 0, 300, 1.5f,
o, model, behavior);
if (hand != NULL) {
hand->oFaceAngleYaw -= 0x4000 * side;
}
@@ -44,17 +45,17 @@ static void eyerok_boss_act_wake_up(void) {
if (o->oTimer > 5) {
if (o->oSubAction == 0) {
seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40);
o->oSubAction += 1;
o->oSubAction++;
}
if (o->oEyerokBossUnk110 == 0.0f && mario_ready_to_speak() != 0) {
if (o->oEyerokBossUnk110 == 0.0f && mario_ready_to_speak()) {
o->oAction = EYEROK_BOSS_ACT_SHOW_INTRO_TEXT;
} else if (o->oTimer > 150) {
if (approach_f32_ptr(&o->oEyerokBossUnk110, 0.0f, 10.0f)) {
o->oTimer = 0;
}
} else if (o->oTimer > 90) {
approach_f32_ptr(&o->oEyerokBossUnk110, 300.f, 10.0f);
approach_f32_ptr(&o->oEyerokBossUnk110, 300.0f, 10.0f);
}
}
} else {
@@ -75,22 +76,22 @@ static void eyerok_boss_act_fight(void) {
if (o->oEyerokBossUnk104 != 0) {
if (approach_f32_ptr(&o->oEyerokBossUnk110, 1.0f, 0.02f)) {
if (o->oEyerokBossUnk104 < 0) {
if (eyerok_check_mario_relative_z(400) == 0 && ++o->oEyerokBossUnk104 == 0) {
if (!eyerok_check_mario_relative_z(400) && ++o->oEyerokBossUnk104 == 0) {
o->oEyerokBossUnk104 = 1;
}
} else {
o->oEyerokBossUnk104 -= 1;
o->oEyerokBossUnk104--;
}
if (o->oEyerokBossUnk104 != 0 && o->oEyerokBossUnk104 != 1) {
o->oEyerokBossUnkFC += 1;
o->oEyerokBossUnkFC++;
if ((o->oEyerokBossActiveHand = o->oEyerokBossUnkFC & 0x1) == 0) {
o->oEyerokBossActiveHand = -1;
}
}
}
} else {
o->oEyerokBossUnkFC += 1;
o->oEyerokBossUnkFC++;
if (eyerok_check_mario_relative_z(400)) {
o->oEyerokBossUnk104 = -8;
@@ -120,7 +121,7 @@ static void eyerok_boss_act_die(void) {
if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_NONE, CUTSCENE_DIALOG, DIALOG_118)) {
spawn_default_star(0.0f, -900.0f, -3700.0f);
} else {
o->oTimer -= 1;
o->oTimer--;
}
} else if (o->oTimer > 120) {
stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS));
@@ -156,7 +157,7 @@ static s32 eyerok_hand_check_attacked(void) {
o->oAction = EYEROK_HAND_ACT_ATTACKED;
o->oVelY = 30.0f;
} else {
o->parentObj->oEyerokBossNumHands -= 1;
o->parentObj->oEyerokBossNumHands--;
o->oAction = EYEROK_HAND_ACT_DIE;
o->oVelY = 50.0f;
}
@@ -183,7 +184,7 @@ static void eyerok_hand_act_sleep(void) {
if (o->parentObj->oAction != EYEROK_BOSS_ACT_SLEEP
&& ++o->oEyerokHandWakeUpTimer > -3 * o->oBehParams2ndByte) {
if (cur_obj_check_if_near_animation_end()) {
o->parentObj->oEyerokBossNumHands += 1;
o->parentObj->oEyerokBossNumHands++;
o->oAction = EYEROK_HAND_ACT_IDLE;
o->collisionData = segmented_to_virtual(&ssl_seg7_collision_07028274);
} else {
@@ -216,7 +217,7 @@ static void eyerok_hand_act_idle(void) {
}
} else if (o->parentObj->oEyerokBossUnk1AC == 0 && o->parentObj->oEyerokBossActiveHand != 0) {
if (o->parentObj->oEyerokBossActiveHand == o->oBehParams2ndByte) {
if (eyerok_check_mario_relative_z(400) != 0 || random_u16() % 2 != 0) {
if (eyerok_check_mario_relative_z(400) || random_u16() % 2 != 0) {
o->oAction = EYEROK_HAND_ACT_TARGET_MARIO;
o->oMoveAngleYaw = o->oAngleToMario;
o->oGravity = 0.0f;
@@ -262,23 +263,21 @@ static void eyerok_hand_act_open(void) {
}
static void eyerok_hand_act_show_eye(void) {
UNUSED s16 val06;
cur_obj_init_animation_with_sound(5);
cur_obj_play_sound_at_anim_range(0, 0, SOUND_OBJ_EYEROK_SHOW_EYE);
if (!eyerok_hand_check_attacked()) {
if (o->parentObj->oEyerokBossActiveHand == 0) {
if (o->oAnimState < 3) {
o->oAnimState += 1;
o->oAnimState++;
} else if (cur_obj_check_if_near_animation_end()) {
val06 = (s16)(o->oAngleToMario - o->oFaceAngleYaw) * o->oBehParams2ndByte;
UNUSED s16 val06 = (s16)(o->oAngleToMario - o->oFaceAngleYaw) * o->oBehParams2ndByte;
o->oAction = EYEROK_HAND_ACT_CLOSE;
}
} else {
if (o->oEyerokHandUnk100--) {
if (o->oEyerokHandUnkFC != 0) {
o->oEyerokHandUnkFC -= 1;
o->oEyerokHandUnkFC--;
}
o->oAnimState = D_80331BA4[o->oEyerokHandUnkFC];
} else {
@@ -373,7 +372,7 @@ static void eyerok_hand_act_retreat(void) {
}
static void eyerok_hand_act_target_mario(void) {
if (eyerok_check_mario_relative_z(400) != 0 || o->oPosZ - gMarioObject->oPosZ > 0.0f
if (eyerok_check_mario_relative_z(400) || o->oPosZ - gMarioObject->oPosZ > 0.0f
|| o->oPosZ - o->parentObj->oPosZ > 1700.0f || absf(o->oPosX - o->parentObj->oPosX) > 900.0f
|| (o->oMoveFlags & OBJ_MOVE_HIT_WALL)) {
o->oForwardVel = 0.0f;
@@ -388,15 +387,13 @@ static void eyerok_hand_act_target_mario(void) {
}
static void eyerok_hand_act_smash(void) {
s16 sp1E;
if (o->oTimer > 20) {
if (o->oMoveFlags & OBJ_MOVE_MASK_ON_GROUND) {
if (o->oGravity < -4.0f) {
eyerok_hand_pound_ground();
o->oGravity = -4.0f;
} else {
sp1E = abs_angle_diff(o->oFaceAngleYaw, o->oAngleToMario);
s16 sp1E = abs_angle_diff(o->oFaceAngleYaw, o->oAngleToMario);
if (o->oDistanceToMario < 300.0f && sp1E > 0x2000 && sp1E < 0x6000) {
o->oAction = EYEROK_HAND_ACT_FIST_SWEEP;
if ((s16)(o->oFaceAngleYaw - o->oAngleToMario) < 0) {
@@ -441,15 +438,13 @@ static void eyerok_hand_act_fist_sweep(void) {
}
static void eyerok_hand_act_begin_double_pound(void) {
f32 sp4;
if (o->parentObj->oEyerokBossUnk104 < 0
|| o->parentObj->oEyerokBossActiveHand == o->oBehParams2ndByte) {
o->oAction = EYEROK_HAND_ACT_DOUBLE_POUND;
o->oMoveAngleYaw = (s32)(o->oFaceAngleYaw - 0x4000 * o->parentObj->oEyerokBossUnk108);
} else {
sp4 = o->parentObj->oPosX + 400.0f * o->parentObj->oEyerokBossUnk108
- 180.0f * o->oBehParams2ndByte;
f32 sp4 = o->parentObj->oPosX + 400.0f * o->parentObj->oEyerokBossUnk108
- 180.0f * o->oBehParams2ndByte;
o->oPosX = o->oHomeX + (sp4 - o->oHomeX) * o->parentObj->oEyerokBossUnk110;
o->oPosY = o->oHomeY + 300.0f * o->parentObj->oEyerokBossUnk110;

Some files were not shown because too many files have changed in this diff Show More