mirror of
https://github.com/n64decomp/sm64
synced 2026-06-22 07:55:42 -04:00
Refresh 15
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 = ¬e->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 = ¬e->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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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,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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,3 +1,4 @@
|
||||
|
||||
/**
|
||||
* Behavior for bhvBetaTrampolineTop and bhvBetaTrampolineSpring.
|
||||
* This was a trampoline that was never finished. The model and collision
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+209
-146
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,4 +1,4 @@
|
||||
// cruiser.c.inc
|
||||
// cruiser.inc.c
|
||||
|
||||
void bhv_rr_cruiser_wing_init(void) {
|
||||
o->oRRCruiserWingUnkF4 = o->oFaceAngleYaw;
|
||||
|
||||
@@ -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))) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user