mirror of
https://github.com/zeldaret/oot.git
synced 2025-07-13 11:24:40 +00:00
Merge branch 'master' into doc_pause_menu
This commit is contained in:
commit
932e5866e1
69 changed files with 5804 additions and 4593 deletions
|
@ -212,16 +212,62 @@ void* gItemIcons[] = {
|
|||
|
||||
// Used to map item IDs to inventory slots
|
||||
u8 gItemSlots[] = {
|
||||
SLOT_STICK, SLOT_NUT, SLOT_BOMB, SLOT_BOW, SLOT_ARROW_FIRE, SLOT_DINS_FIRE,
|
||||
SLOT_SLINGSHOT, SLOT_OCARINA, SLOT_OCARINA, SLOT_BOMBCHU, SLOT_HOOKSHOT, SLOT_HOOKSHOT,
|
||||
SLOT_ARROW_ICE, SLOT_FARORES_WIND, SLOT_BOOMERANG, SLOT_LENS, SLOT_BEAN, SLOT_HAMMER,
|
||||
SLOT_ARROW_LIGHT, SLOT_NAYRUS_LOVE, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1,
|
||||
SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1,
|
||||
SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD,
|
||||
SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD,
|
||||
SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT,
|
||||
SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT,
|
||||
SLOT_TRADE_ADULT, SLOT_TRADE_ADULT,
|
||||
SLOT_STICK, // ITEM_STICK
|
||||
SLOT_NUT, // ITEM_NUT
|
||||
SLOT_BOMB, // ITEM_BOMB
|
||||
SLOT_BOW, // ITEM_BOW
|
||||
SLOT_ARROW_FIRE, // ITEM_ARROW_FIRE
|
||||
SLOT_DINS_FIRE, // ITEM_DINS_FIRE
|
||||
SLOT_SLINGSHOT, // ITEM_SLINGSHOT
|
||||
SLOT_OCARINA, // ITEM_OCARINA_FAIRY
|
||||
SLOT_OCARINA, // ITEM_OCARINA_TIME
|
||||
SLOT_BOMBCHU, // ITEM_BOMBCHU
|
||||
SLOT_HOOKSHOT, // ITEM_HOOKSHOT
|
||||
SLOT_HOOKSHOT, // ITEM_LONGSHOT
|
||||
SLOT_ARROW_ICE, // ITEM_ARROW_ICE
|
||||
SLOT_FARORES_WIND, // ITEM_FARORES_WIND
|
||||
SLOT_BOOMERANG, // ITEM_BOOMERANG
|
||||
SLOT_LENS, // ITEM_LENS
|
||||
SLOT_BEAN, // ITEM_BEAN
|
||||
SLOT_HAMMER, // ITEM_HAMMER
|
||||
SLOT_ARROW_LIGHT, // ITEM_ARROW_LIGHT
|
||||
SLOT_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE
|
||||
SLOT_BOTTLE_1, // ITEM_BOTTLE
|
||||
SLOT_BOTTLE_1, // ITEM_POTION_RED
|
||||
SLOT_BOTTLE_1, // ITEM_POTION_GREEN
|
||||
SLOT_BOTTLE_1, // ITEM_POTION_BLUE
|
||||
SLOT_BOTTLE_1, // ITEM_FAIRY
|
||||
SLOT_BOTTLE_1, // ITEM_FISH
|
||||
SLOT_BOTTLE_1, // ITEM_MILK_BOTTLE
|
||||
SLOT_BOTTLE_1, // ITEM_LETTER_RUTO
|
||||
SLOT_BOTTLE_1, // ITEM_BLUE_FIRE
|
||||
SLOT_BOTTLE_1, // ITEM_BUG
|
||||
SLOT_BOTTLE_1, // ITEM_BIG_POE
|
||||
SLOT_BOTTLE_1, // ITEM_MILK_HALF
|
||||
SLOT_BOTTLE_1, // ITEM_POE
|
||||
SLOT_TRADE_CHILD, // ITEM_WEIRD_EGG
|
||||
SLOT_TRADE_CHILD, // ITEM_CHICKEN
|
||||
SLOT_TRADE_CHILD, // ITEM_LETTER_ZELDA
|
||||
SLOT_TRADE_CHILD, // ITEM_MASK_KEATON
|
||||
SLOT_TRADE_CHILD, // ITEM_MASK_SKULL
|
||||
SLOT_TRADE_CHILD, // ITEM_MASK_SPOOKY
|
||||
SLOT_TRADE_CHILD, // ITEM_MASK_BUNNY
|
||||
SLOT_TRADE_CHILD, // ITEM_MASK_GORON
|
||||
SLOT_TRADE_CHILD, // ITEM_MASK_ZORA
|
||||
SLOT_TRADE_CHILD, // ITEM_MASK_GERUDO
|
||||
SLOT_TRADE_CHILD, // ITEM_MASK_TRUTH
|
||||
SLOT_TRADE_CHILD, // ITEM_SOLD_OUT
|
||||
SLOT_TRADE_ADULT, // ITEM_POCKET_EGG
|
||||
SLOT_TRADE_ADULT, // ITEM_POCKET_CUCCO
|
||||
SLOT_TRADE_ADULT, // ITEM_COJIRO
|
||||
SLOT_TRADE_ADULT, // ITEM_ODD_MUSHROOM
|
||||
SLOT_TRADE_ADULT, // ITEM_ODD_POTION
|
||||
SLOT_TRADE_ADULT, // ITEM_SAW
|
||||
SLOT_TRADE_ADULT, // ITEM_SWORD_BROKEN
|
||||
SLOT_TRADE_ADULT, // ITEM_PRESCRIPTION
|
||||
SLOT_TRADE_ADULT, // ITEM_FROG
|
||||
SLOT_TRADE_ADULT, // ITEM_EYEDROPS
|
||||
SLOT_TRADE_ADULT, // ITEM_CLAIM_CHECK
|
||||
};
|
||||
|
||||
void Inventory_ChangeEquipment(s16 equipment, u16 value) {
|
||||
|
|
|
@ -1241,8 +1241,8 @@ u8 sMalonSingingTimer;
|
|||
u8 sAudioSpecPeakNumNotes[0x12];
|
||||
u8 sMalonSingingDisabled;
|
||||
u8 D_8016B9F3;
|
||||
u8 D_8016B9F4;
|
||||
u16 D_8016B9F6;
|
||||
u8 sFanfareStartTimer;
|
||||
u16 sFanfareSeqId;
|
||||
|
||||
OcarinaStaff sPlayingStaff;
|
||||
OcarinaStaff sPlaybackStaff;
|
||||
|
@ -3208,7 +3208,7 @@ void AudioDebug_ProcessInput_SndCont(void) {
|
|||
if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) {
|
||||
if (sAudioSndContSel == 0) {
|
||||
if (1) {}
|
||||
func_800F595C(sAudioSndContWork[sAudioSndContSel]);
|
||||
Audio_PlaySequenceInCutscene(sAudioSndContWork[sAudioSndContSel]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3693,7 +3693,7 @@ void AudioDebug_ProcessInput(void) {
|
|||
}
|
||||
|
||||
void Audio_UpdateRiverSoundVolumes(void);
|
||||
void func_800F5CF8(void);
|
||||
void Audio_UpdateFanfare(void);
|
||||
|
||||
/**
|
||||
* This is Audio_Update for the graph thread
|
||||
|
@ -3707,7 +3707,7 @@ void func_800F3054(void) {
|
|||
Audio_StepFreqLerp(&sWaterfallFreqScaleLerp);
|
||||
Audio_UpdateRiverSoundVolumes();
|
||||
Audio_UpdateSceneSequenceResumePoint();
|
||||
func_800F5CF8();
|
||||
Audio_UpdateFanfare();
|
||||
if (gAudioSpecId == 7) {
|
||||
Audio_ClearSariaBgm();
|
||||
}
|
||||
|
@ -4260,17 +4260,17 @@ void Audio_StepFreqLerp(FreqLerp* lerp) {
|
|||
}
|
||||
}
|
||||
|
||||
void func_800F47BC(void) {
|
||||
void Audio_SetBgmVolumeOffDuringFanfare(void) {
|
||||
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_FANFARE, 0, 10);
|
||||
Audio_SetVolumeScale(SEQ_PLAYER_BGM_SUB, VOL_SCALE_INDEX_FANFARE, 0, 10);
|
||||
}
|
||||
|
||||
void func_800F47FC(void) {
|
||||
void Audio_SetBgmVolumeOnDuringFanfare(void) {
|
||||
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_FANFARE, 0x7F, 3);
|
||||
Audio_SetVolumeScale(SEQ_PLAYER_BGM_SUB, VOL_SCALE_INDEX_FANFARE, 0x7F, 3);
|
||||
}
|
||||
|
||||
void func_800F483C(u8 targetVol, u8 volFadeTimer) {
|
||||
void Audio_SetMainBgmVolume(u8 targetVol, u8 volFadeTimer) {
|
||||
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_BGM_MAIN, targetVol, volFadeTimer);
|
||||
}
|
||||
|
||||
|
@ -4593,7 +4593,7 @@ void Audio_PlaySceneSequence(u16 seqId) {
|
|||
Audio_QueueCmdS32(0xF8000000, 0);
|
||||
}
|
||||
|
||||
if ((sSeqFlags[sPrevSceneSeqId] & SEQ_FLAG_RESUME_PREV) && sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_RESUME) {
|
||||
if ((sSeqFlags[sPrevSceneSeqId] & SEQ_FLAG_RESUME_PREV) && (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_RESUME)) {
|
||||
// Resume the sequence from the point where it left off last time it was played in the scene
|
||||
if ((sSeqResumePoint & 0x3F) != 0) {
|
||||
fadeInDuration = 30;
|
||||
|
@ -4622,7 +4622,7 @@ void Audio_PlaySceneSequence(u16 seqId) {
|
|||
void Audio_UpdateSceneSequenceResumePoint(void) {
|
||||
u16 seqId = Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN);
|
||||
|
||||
if ((seqId != NA_BGM_DISABLED) && (sSeqFlags[(u8)seqId & 0xFF] & SEQ_FLAG_RESUME)) {
|
||||
if ((seqId != NA_BGM_DISABLED) && (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_RESUME)) {
|
||||
if (sSeqResumePoint != SEQ_RESUME_POINT_NONE) {
|
||||
// Get the current point to resume from
|
||||
sSeqResumePoint = gAudioCtx.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[3];
|
||||
|
@ -4633,14 +4633,15 @@ void Audio_UpdateSceneSequenceResumePoint(void) {
|
|||
}
|
||||
}
|
||||
|
||||
void func_800F5718(void) {
|
||||
void Audio_PlayWindmillBgm(void) {
|
||||
if (Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) != NA_BGM_WINDMILL) {
|
||||
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, 0, NA_BGM_WINDMILL);
|
||||
}
|
||||
}
|
||||
|
||||
void func_800F574C(f32 scaleTempoAndFreq, u8 duration) {
|
||||
void Audio_SetMainBgmTempoFreqAfterFanfare(f32 scaleTempoAndFreq, u8 duration) {
|
||||
if (scaleTempoAndFreq == 1.0f) {
|
||||
// Should instead use `SEQCMD_SETUP_RESET_TEMPO` to wait until the fanfare is finished
|
||||
SEQCMD_RESET_TEMPO(SEQ_PLAYER_BGM_MAIN, duration);
|
||||
} else {
|
||||
SEQCMD_SETUP_SCALE_TEMPO(SEQ_PLAYER_FANFARE, SEQ_PLAYER_BGM_MAIN, duration, scaleTempoAndFreq * 100.0f);
|
||||
|
@ -4649,52 +4650,51 @@ void func_800F574C(f32 scaleTempoAndFreq, u8 duration) {
|
|||
SEQCMD_SETUP_SET_PLAYER_FREQ(SEQ_PLAYER_FANFARE, SEQ_PLAYER_BGM_MAIN, duration, scaleTempoAndFreq * 100.0f);
|
||||
}
|
||||
|
||||
void func_800F5918(void) {
|
||||
if (Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) == NA_BGM_TIMED_MINI_GAME &&
|
||||
/**
|
||||
* Set the tempo for the timed minigame sequence to 210 bpm,
|
||||
* which is faster than the default tempo
|
||||
*/
|
||||
void Audio_SetFastTempoForTimedMinigame(void) {
|
||||
if ((Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) == NA_BGM_TIMED_MINI_GAME) &&
|
||||
Audio_IsSeqCmdNotQueued(SEQCMD_OP_PLAY_SEQUENCE << 28, SEQCMD_OP_MASK)) {
|
||||
SEQCMD_SET_TEMPO(SEQ_PLAYER_BGM_MAIN, 5, 210);
|
||||
}
|
||||
}
|
||||
|
||||
void func_800F595C(u16 arg0) {
|
||||
u8 arg0b = arg0 & 0xFF;
|
||||
|
||||
if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE) {
|
||||
Audio_PlayFanfare(arg0);
|
||||
} else if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE_GANON) {
|
||||
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 0, 0, arg0);
|
||||
|
||||
void Audio_PlaySequenceInCutscene(u16 seqId) {
|
||||
if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE) {
|
||||
Audio_PlayFanfare(seqId);
|
||||
} else if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
|
||||
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 0, 0, seqId);
|
||||
} else {
|
||||
Audio_PlaySequenceWithSeqPlayerIO(SEQ_PLAYER_BGM_MAIN, arg0, 0, 7, SEQ_IO_VAL_NONE);
|
||||
Audio_PlaySequenceWithSeqPlayerIO(SEQ_PLAYER_BGM_MAIN, seqId, 0, 7, SEQ_IO_VAL_NONE);
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void func_800F59E8(u16 arg0) {
|
||||
u8 arg0b = arg0 & 0xFF;
|
||||
|
||||
if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE) {
|
||||
void Audio_StopSequenceInCutscene(u16 seqId) {
|
||||
if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE) {
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
|
||||
} else if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE_GANON) {
|
||||
} else if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
|
||||
} else {
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0);
|
||||
}
|
||||
}
|
||||
|
||||
s32 func_800F5A58(u8 arg0) {
|
||||
u8 phi_a1 = 0;
|
||||
s32 Audio_IsSequencePlaying(u16 seqId) {
|
||||
u8 seqPlayerIndex = SEQ_PLAYER_BGM_MAIN;
|
||||
|
||||
if (sSeqFlags[arg0 & 0xFF] & SEQ_FLAG_FANFARE) {
|
||||
phi_a1 = 1;
|
||||
} else if (sSeqFlags[arg0 & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
|
||||
phi_a1 = 1;
|
||||
if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE) {
|
||||
seqPlayerIndex = SEQ_PLAYER_FANFARE;
|
||||
} else if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
|
||||
seqPlayerIndex = SEQ_PLAYER_FANFARE;
|
||||
}
|
||||
|
||||
if (arg0 == (u8)Audio_GetActiveSeqId(phi_a1)) {
|
||||
return 1;
|
||||
if ((seqId & 0xFF) == (Audio_GetActiveSeqId(seqPlayerIndex) & 0xFF)) {
|
||||
return true;
|
||||
} else {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4757,31 +4757,35 @@ void func_800F5C2C(void) {
|
|||
}
|
||||
|
||||
void Audio_PlayFanfare(u16 seqId) {
|
||||
u16 sp26;
|
||||
u32 sp20;
|
||||
u8* sp1C;
|
||||
u8* sp18;
|
||||
u16 curSeqId;
|
||||
u32 outNumFonts;
|
||||
u8* curFontId;
|
||||
u8* requestedFontId;
|
||||
|
||||
sp26 = Audio_GetActiveSeqId(SEQ_PLAYER_FANFARE);
|
||||
sp1C = func_800E5E84(sp26 & 0xFF, &sp20);
|
||||
sp18 = func_800E5E84(seqId & 0xFF, &sp20);
|
||||
if ((sp26 == NA_BGM_DISABLED) || (*sp1C == *sp18)) {
|
||||
D_8016B9F4 = 1;
|
||||
curSeqId = Audio_GetActiveSeqId(SEQ_PLAYER_FANFARE);
|
||||
|
||||
curFontId = func_800E5E84(curSeqId & 0xFF, &outNumFonts);
|
||||
requestedFontId = func_800E5E84(seqId & 0xFF, &outNumFonts);
|
||||
|
||||
if ((curSeqId == NA_BGM_DISABLED) || (*curFontId == *requestedFontId)) {
|
||||
sFanfareStartTimer = 1;
|
||||
} else {
|
||||
D_8016B9F4 = 5;
|
||||
// Give extra time to start the fanfare if both another fanfare needs to be stopped
|
||||
// and a new fontId needs to be loaded in
|
||||
sFanfareStartTimer = 5;
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
|
||||
}
|
||||
D_8016B9F6 = seqId;
|
||||
sFanfareSeqId = seqId;
|
||||
}
|
||||
|
||||
void func_800F5CF8(void) {
|
||||
void Audio_UpdateFanfare(void) {
|
||||
u16 seqIdFanfare;
|
||||
u16 seqIdBgmMain;
|
||||
u16 seqIdBgmSub;
|
||||
|
||||
if (D_8016B9F4 != 0) {
|
||||
D_8016B9F4--;
|
||||
if (D_8016B9F4 == 0) {
|
||||
if (sFanfareStartTimer != 0) {
|
||||
sFanfareStartTimer--;
|
||||
if (sFanfareStartTimer == 0) {
|
||||
Audio_QueueCmdS32(0xE3000000, SEQUENCE_TABLE);
|
||||
Audio_QueueCmdS32(0xE3000000, FONT_TABLE);
|
||||
|
||||
|
@ -4802,7 +4806,7 @@ void func_800F5CF8(void) {
|
|||
SEQCMD_SETUP_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_FANFARE, SEQ_PLAYER_BGM_SUB, 0);
|
||||
}
|
||||
}
|
||||
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 1, 0, D_8016B9F6);
|
||||
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 1, 0, sFanfareSeqId);
|
||||
SEQCMD_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_BGM_MAIN, 0xFFFF);
|
||||
if (seqIdBgmSub != NA_BGM_LONLON) {
|
||||
SEQCMD_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_BGM_SUB, 0xFFFF);
|
||||
|
@ -4833,7 +4837,7 @@ void Audio_SetSequenceMode(u8 seqMode) {
|
|||
seqMode = SEQ_MODE_IGNORE;
|
||||
}
|
||||
|
||||
if ((seqId == NA_BGM_DISABLED) || (sSeqFlags[(u8)(seqId & 0xFF)] & SEQ_FLAG_ENEMY) ||
|
||||
if ((seqId == NA_BGM_DISABLED) || (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_ENEMY) ||
|
||||
((sPrevSeqMode & 0x7F) == SEQ_MODE_ENEMY)) {
|
||||
if (seqMode != (sPrevSeqMode & 0x7F)) {
|
||||
if (seqMode == SEQ_MODE_ENEMY) {
|
||||
|
@ -5160,10 +5164,10 @@ void func_800F6964(u16 arg0) {
|
|||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_SUB, (arg0 * 3) / 2);
|
||||
}
|
||||
|
||||
void func_800F6AB0(u16 arg0) {
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, arg0);
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, arg0);
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_SUB, arg0);
|
||||
void Audio_StopBgmAndFanfare(u16 fadeOutDuration) {
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, fadeOutDuration);
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, fadeOutDuration);
|
||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_SUB, fadeOutDuration);
|
||||
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_BGM_SUB, 0x7F, 0);
|
||||
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_FANFARE, 0x7F, 0);
|
||||
}
|
||||
|
@ -5223,7 +5227,7 @@ void func_800F6C34(void) {
|
|||
sPrevMainBgmSeqId = NA_BGM_DISABLED;
|
||||
Audio_QueueCmdS8(0x46 << 24 | SEQ_PLAYER_BGM_MAIN << 16, -1);
|
||||
sSariaBgmPtr = NULL;
|
||||
D_8016B9F4 = 0;
|
||||
sFanfareStartTimer = 0;
|
||||
D_8016B9F3 = 1;
|
||||
sMalonSingingDisabled = false;
|
||||
}
|
||||
|
@ -5297,7 +5301,7 @@ void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId) {
|
|||
u8 ioData;
|
||||
|
||||
if ((gActiveSeqs[SEQ_PLAYER_BGM_MAIN].seqId == NA_BGM_DISABLED) ||
|
||||
!(sSeqFlags[((u8)gActiveSeqs[SEQ_PLAYER_BGM_MAIN].seqId) & 0xFF] & SEQ_FLAG_NO_AMBIENCE)) {
|
||||
!(sSeqFlags[gActiveSeqs[SEQ_PLAYER_BGM_MAIN].seqId & 0xFF & 0xFF] & SEQ_FLAG_NO_AMBIENCE)) {
|
||||
|
||||
Audio_StartNatureAmbienceSequence(sNatureAmbienceDataIO[natureAmbienceId].playerIO,
|
||||
sNatureAmbienceDataIO[natureAmbienceId].channelMask);
|
||||
|
|
|
@ -3,9 +3,13 @@
|
|||
|
||||
s32 gUseAtanContFrac;
|
||||
|
||||
f32 Math_FTanF(f32 x) {
|
||||
f32 sin = sinf(x);
|
||||
f32 cos = cosf(x);
|
||||
/**
|
||||
* @param angle radians
|
||||
* @return tan(angle)
|
||||
*/
|
||||
f32 Math_FTanF(f32 angle) {
|
||||
f32 sin = sinf(angle);
|
||||
f32 cos = cosf(angle);
|
||||
|
||||
return sin / cos;
|
||||
}
|
||||
|
@ -42,7 +46,7 @@ f32 Math_FAtanTaylorQF(f32 x) {
|
|||
const f32* c = coeffs;
|
||||
f32 term;
|
||||
|
||||
while (1) {
|
||||
while (true) {
|
||||
term = *c++ * exp;
|
||||
if (poly + term == poly) {
|
||||
break;
|
||||
|
@ -124,6 +128,9 @@ f32 Math_FAtanContFracF(f32 x) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return arctan(x) in radians, in (-pi/2,pi/2) range
|
||||
*/
|
||||
f32 Math_FAtanF(f32 x) {
|
||||
if (!gUseAtanContFrac) {
|
||||
return Math_FAtanTaylorF(x);
|
||||
|
@ -132,6 +139,9 @@ f32 Math_FAtanF(f32 x) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return angle to (x,y) from vector (1,0) around (0,0) in radians, in (-pi,pi] range
|
||||
*/
|
||||
f32 Math_FAtan2F(f32 y, f32 x) {
|
||||
if (x == 0.0f) {
|
||||
if (y == 0.0f) {
|
||||
|
@ -152,10 +162,16 @@ f32 Math_FAtan2F(f32 y, f32 x) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return arcsin(x) in radians, in [-pi/2,pi/2] range
|
||||
*/
|
||||
f32 Math_FAsinF(f32 x) {
|
||||
return Math_FAtan2F(x, sqrtf(1.0f - SQ(x)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return arccos(x) in radians, in [0,pi] range
|
||||
*/
|
||||
f32 Math_FAcosF(f32 x) {
|
||||
return M_PI / 2 - Math_FAsinF(x);
|
||||
}
|
||||
|
|
|
@ -111,61 +111,54 @@ Vec3f* DbCamera_AddVecGeoToVec3f(Vec3f* dest, Vec3f* a, VecGeo* geo) {
|
|||
return dest;
|
||||
}
|
||||
|
||||
Vec3f* DbCamera_CalcUpFromPitchYawRoll(Vec3f* dest, s16 pitch, s16 yaw, s16 roll) {
|
||||
f32 sinPitch;
|
||||
f32 cosPitch;
|
||||
f32 sinYaw;
|
||||
f32 cosYaw;
|
||||
f32 sinNegRoll;
|
||||
f32 cosNegRoll;
|
||||
Vec3f spA4;
|
||||
f32 sp54;
|
||||
f32 sp4C;
|
||||
f32 cosPitchCosYawSinRoll;
|
||||
f32 negSinPitch;
|
||||
f32 temp_f10_2;
|
||||
f32 cosPitchcosYaw;
|
||||
f32 temp_f14;
|
||||
f32 negSinPitchSinYaw;
|
||||
f32 negSinPitchCosYaw;
|
||||
f32 cosPitchSinYaw;
|
||||
f32 temp_f4_2;
|
||||
f32 temp_f6;
|
||||
f32 temp_f8;
|
||||
f32 temp_f8_2;
|
||||
f32 temp_f8_3;
|
||||
/**
|
||||
* Calculates a new Up vector from the pitch, yaw, roll
|
||||
*/
|
||||
Vec3f* DbCamera_CalcUpFromPitchYawRoll(Vec3f* viewUp, s16 pitch, s16 yaw, s16 roll) {
|
||||
f32 sinP = Math_SinS(pitch);
|
||||
f32 cosP = Math_CosS(pitch);
|
||||
f32 sinY = Math_SinS(yaw);
|
||||
f32 cosY = Math_CosS(yaw);
|
||||
f32 sinR = Math_SinS(-roll);
|
||||
f32 cosR = Math_CosS(-roll);
|
||||
Vec3f up;
|
||||
Vec3f baseUp;
|
||||
Vec3f u;
|
||||
Vec3f rollMtxRow1;
|
||||
Vec3f rollMtxRow2;
|
||||
Vec3f rollMtxRow3;
|
||||
|
||||
sinPitch = Math_SinS(pitch);
|
||||
cosPitch = Math_CosS(pitch);
|
||||
sinYaw = Math_SinS(yaw);
|
||||
cosYaw = Math_CosS(yaw);
|
||||
sinNegRoll = Math_SinS(-roll);
|
||||
cosNegRoll = Math_CosS(-roll);
|
||||
negSinPitch = -sinPitch;
|
||||
negSinPitchSinYaw = negSinPitch * sinYaw;
|
||||
negSinPitchCosYaw = negSinPitch * cosYaw;
|
||||
temp_f14 = 1.0f - cosNegRoll;
|
||||
cosPitchSinYaw = cosPitch * sinYaw;
|
||||
sp54 = SQ(cosPitchSinYaw);
|
||||
sp4C = (cosPitchSinYaw * sinPitch) * ((void)0, temp_f14);
|
||||
cosPitchcosYaw = cosPitch * cosYaw;
|
||||
temp_f4_2 = ((1.0f - sp54) * cosNegRoll) + sp54;
|
||||
cosPitchCosYawSinRoll = cosPitchcosYaw * sinNegRoll;
|
||||
temp_f6 = (cosPitchcosYaw * cosPitchSinYaw) * ((void)0, temp_f14);
|
||||
temp_f10_2 = sinPitch * sinNegRoll;
|
||||
spA4.x = ((negSinPitchSinYaw * temp_f4_2) + (cosPitch * (sp4C - cosPitchCosYawSinRoll))) +
|
||||
(negSinPitchCosYaw * (temp_f6 + temp_f10_2));
|
||||
sp54 = SQ(sinPitch);
|
||||
temp_f4_2 = (sinPitch * cosPitchcosYaw) * ((void)0, temp_f14);
|
||||
temp_f8_3 = cosPitchSinYaw * sinNegRoll;
|
||||
temp_f8 = sp4C + cosPitchCosYawSinRoll;
|
||||
spA4.y = ((negSinPitchSinYaw * temp_f8) + (cosPitch * (((1.0f - sp54) * cosNegRoll) + sp54))) +
|
||||
(negSinPitchCosYaw * (temp_f4_2 - temp_f8_3));
|
||||
temp_f8_2 = temp_f6 - temp_f10_2;
|
||||
spA4.z = ((negSinPitchSinYaw * temp_f8_2) + (cosPitch * (temp_f4_2 + temp_f8_3))) +
|
||||
(negSinPitchCosYaw * (((1.0f - SQ(cosPitchcosYaw)) * cosNegRoll) + SQ(cosPitchcosYaw)));
|
||||
*dest = spA4;
|
||||
return dest;
|
||||
// Axis to roll around
|
||||
u.x = cosP * sinY;
|
||||
u.y = sinP;
|
||||
u.z = cosP * cosY;
|
||||
|
||||
// Up without roll
|
||||
baseUp.x = -sinP * sinY;
|
||||
baseUp.y = cosP;
|
||||
baseUp.z = -sinP * cosY;
|
||||
|
||||
// Matrix to apply the roll to the Up vector without roll
|
||||
rollMtxRow1.x = ((1.0f - SQ(u.x)) * cosR) + SQ(u.x);
|
||||
rollMtxRow1.y = ((1.0f - cosR) * (u.x * u.y)) - (u.z * sinR);
|
||||
rollMtxRow1.z = ((1.0f - cosR) * (u.z * u.x)) + (u.y * sinR);
|
||||
|
||||
rollMtxRow2.x = ((1.0f - cosR) * (u.x * u.y)) + (u.z * sinR);
|
||||
rollMtxRow2.y = ((1.0f - SQ(u.y)) * cosR) + SQ(u.y);
|
||||
rollMtxRow2.z = ((1.0f - cosR) * (u.y * u.z)) - (u.x * sinR);
|
||||
|
||||
rollMtxRow3.x = ((1.0f - cosR) * (u.z * u.x)) - (u.y * sinR);
|
||||
rollMtxRow3.y = ((1.0f - cosR) * (u.y * u.z)) + (u.x * sinR);
|
||||
rollMtxRow3.z = ((1.0f - SQ(u.z)) * cosR) + SQ(u.z);
|
||||
|
||||
// rollMtx * baseUp
|
||||
up.x = DOTXYZ(baseUp, rollMtxRow1);
|
||||
up.y = DOTXYZ(baseUp, rollMtxRow2);
|
||||
up.z = DOTXYZ(baseUp, rollMtxRow3);
|
||||
|
||||
*viewUp = up;
|
||||
|
||||
return viewUp;
|
||||
}
|
||||
|
||||
char* DbCamera_SetTextValue(s16 value, char* str, u8 endIdx) {
|
||||
|
|
|
@ -38,10 +38,18 @@ f32 Math_PowF(f32 base, s32 exp) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param angle radians
|
||||
* @return sin(angle)
|
||||
*/
|
||||
f32 Math_SinF(f32 angle) {
|
||||
return sins((s16)(angle * (0x7FFF / M_PI))) * SHT_MINV;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param angle radians
|
||||
* @return cos(angle)
|
||||
*/
|
||||
f32 Math_CosF(f32 angle) {
|
||||
return coss((s16)(angle * (0x7FFF / M_PI))) * SHT_MINV;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "global.h"
|
||||
|
||||
static u16 sATan2Tbl[] = {
|
||||
static u16 sAtan2Tbl[] = {
|
||||
0x0000, 0x000A, 0x0014, 0x001F, 0x0029, 0x0033, 0x003D, 0x0047, 0x0051, 0x005C, 0x0066, 0x0070, 0x007A, 0x0084,
|
||||
0x008F, 0x0099, 0x00A3, 0x00AD, 0x00B7, 0x00C2, 0x00CC, 0x00D6, 0x00E0, 0x00EA, 0x00F4, 0x00FF, 0x0109, 0x0113,
|
||||
0x011D, 0x0127, 0x0131, 0x013C, 0x0146, 0x0150, 0x015A, 0x0164, 0x016F, 0x0179, 0x0183, 0x018D, 0x0197, 0x01A1,
|
||||
|
@ -77,24 +77,34 @@ static u16 sATan2Tbl[] = {
|
|||
0x1FF6, 0x1FFB, 0x2000,
|
||||
};
|
||||
|
||||
u16 Math_GetAtan2Tbl(f32 x, f32 y) {
|
||||
/**
|
||||
* @param y must be >= 0 and <= x
|
||||
* @param x must be >= 0
|
||||
* @return arctan(y/x) as binang, in [0,0x2000] range
|
||||
*/
|
||||
u16 Math_GetAtan2Tbl(f32 y, f32 x) {
|
||||
u16 ret;
|
||||
|
||||
if (y == 0.0f) {
|
||||
ret = sATan2Tbl[0];
|
||||
if (x == 0.0f) {
|
||||
ret = sAtan2Tbl[0];
|
||||
} else {
|
||||
s32 tblIdx = ((x / y) * 1024.0f) + 0.5f;
|
||||
s32 tblIdx = ((y / x) * 1024.0f) + 0.5f;
|
||||
|
||||
if (tblIdx >= ARRAY_COUNT(sATan2Tbl)) {
|
||||
ret = sATan2Tbl[0];
|
||||
if (tblIdx >= ARRAY_COUNT(sAtan2Tbl)) {
|
||||
ret = sAtan2Tbl[0];
|
||||
} else {
|
||||
ret = sATan2Tbl[tblIdx];
|
||||
ret = sAtan2Tbl[tblIdx];
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return angle to (x,y) from vector (1,0) around (0,0) as binang, in [-0x8000,0x7FFF] range
|
||||
*
|
||||
* @note The arguments are (x,y), which is different from atan2's (y,x)
|
||||
*/
|
||||
s16 Math_Atan2S(f32 x, f32 y) {
|
||||
s32 ret;
|
||||
|
||||
|
@ -107,7 +117,7 @@ s16 Math_Atan2S(f32 x, f32 y) {
|
|||
}
|
||||
} else {
|
||||
if (-x < y) {
|
||||
ret = Math_GetAtan2Tbl(-x, y) + 0x4000;
|
||||
ret = 0x4000 + Math_GetAtan2Tbl(-x, y);
|
||||
} else {
|
||||
ret = 0x8000 - Math_GetAtan2Tbl(y, -x);
|
||||
}
|
||||
|
@ -115,21 +125,27 @@ s16 Math_Atan2S(f32 x, f32 y) {
|
|||
} else {
|
||||
if (x < 0.0f) {
|
||||
if (-y <= -x) {
|
||||
ret = Math_GetAtan2Tbl(-y, -x) + 0x8000;
|
||||
ret = 0x8000 + Math_GetAtan2Tbl(-y, -x);
|
||||
} else {
|
||||
ret = 0xC000 - Math_GetAtan2Tbl(-x, -y);
|
||||
}
|
||||
} else {
|
||||
if (x < -y) {
|
||||
ret = Math_GetAtan2Tbl(x, -y) + 0xC000;
|
||||
ret = 0xC000 + Math_GetAtan2Tbl(x, -y);
|
||||
} else {
|
||||
ret = -Math_GetAtan2Tbl(-y, x);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
||||
return (s16)ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return angle to (x,y) from vector (1,0) around (0,0) in radians, in [-pi,pi) range
|
||||
*
|
||||
* @note The arguments are (x,y), which is different from atan2's (y,x)
|
||||
*/
|
||||
f32 Math_Atan2F(f32 x, f32 y) {
|
||||
return BINANG_TO_RAD(Math_Atan2S(x, y));
|
||||
}
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
#include "global.h"
|
||||
|
||||
// clang-format off
|
||||
Mtx gMtxClear = {
|
||||
65536, 0, 1, 0,
|
||||
0, 65536, 0, 1,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
};
|
||||
Mtx gMtxClear = gdSPDefMtx(
|
||||
1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, 1.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f, 1.0f, 0.0f,
|
||||
0.0f, 0.0f, 0.0f, 1.0f
|
||||
);
|
||||
|
||||
MtxF gMtxFClear = {
|
||||
1.0f, 0.0f, 0.0f, 0.0f,
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#include "global.h"
|
||||
|
||||
typedef void (*UcodeDisasCallback)(UCodeDisas*, u32);
|
||||
|
||||
#define F3DZEX_CONST(name) \
|
||||
{ name, #name }
|
||||
#define F3DZEX_FLAG(set, unset) \
|
||||
|
@ -17,8 +19,8 @@
|
|||
if (this->enableLog) \
|
||||
osSyncPrintf
|
||||
|
||||
void* UCodeDisas_TranslateAddr(UCodeDisas* this, u32 addr) {
|
||||
u32 physical = this->segments[SEGMENT_NUMBER(addr)] + SEGMENT_OFFSET(addr);
|
||||
void* UCodeDisas_TranslateAddr(UCodeDisas* this, uintptr_t addr) {
|
||||
uintptr_t physical = this->segments[SEGMENT_NUMBER(addr)] + SEGMENT_OFFSET(addr);
|
||||
|
||||
return PHYSICAL_TO_VIRTUAL(physical);
|
||||
}
|
||||
|
@ -38,61 +40,82 @@ F3dzexFlag sUCodeDisasMtxFlags[] = {
|
|||
F3DZEX_FLAG(G_MTX_PUSH, G_MTX_NOPUSH),
|
||||
};
|
||||
|
||||
const char* UCodeDisas_ParseCombineColor(u32 value, u32 idx) {
|
||||
typedef enum { COMBINER_A = 1, COMBINER_B, COMBINER_C, COMBINER_D } CombinerArg;
|
||||
|
||||
const char* UCodeDisas_GetCombineColorName(u32 value, u32 arg) {
|
||||
const char* ret = "?";
|
||||
|
||||
switch (value) {
|
||||
case G_CCMUX_COMBINED:
|
||||
ret = "COMBINED";
|
||||
break;
|
||||
|
||||
case G_CCMUX_TEXEL0:
|
||||
ret = "TEXEL0";
|
||||
break;
|
||||
|
||||
case G_CCMUX_TEXEL1:
|
||||
ret = "TEXEL1";
|
||||
break;
|
||||
|
||||
case G_CCMUX_PRIMITIVE:
|
||||
ret = "PRIMITIVE";
|
||||
break;
|
||||
|
||||
case G_CCMUX_SHADE:
|
||||
ret = "SHADE";
|
||||
break;
|
||||
|
||||
case G_CCMUX_ENVIRONMENT:
|
||||
ret = "ENVIRONMENT";
|
||||
break;
|
||||
case 6:
|
||||
ret = (idx == 2) ? "CENTER" : (idx == 3) ? "SCALE" : "1";
|
||||
|
||||
case 6: // G_CCMUX_CENTER, G_CCMUX_SCALE, G_CCMUX_1
|
||||
ret = (arg == COMBINER_B) ? "CENTER" : (arg == COMBINER_C) ? "SCALE" : "1";
|
||||
break;
|
||||
case 7:
|
||||
ret = (idx == 1) ? "NOISE" : (idx == 2) ? "K4" : (idx == 3) ? "COMBINED_ALPHA" : "0";
|
||||
|
||||
case 7: // G_CCMUX_NOISE, G_CCMUX_K4, G_CCMUX_COMBINED_ALPHA, G_CCMUX_0
|
||||
ret = (arg == COMBINER_A) ? "NOISE"
|
||||
: (arg == COMBINER_B) ? "K4"
|
||||
: (arg == COMBINER_C) ? "COMBINED_ALPHA"
|
||||
: "0";
|
||||
break;
|
||||
|
||||
default:
|
||||
if (idx == 3) {
|
||||
if (arg == COMBINER_C) {
|
||||
switch (value) {
|
||||
case G_CCMUX_TEXEL0_ALPHA:
|
||||
ret = "TEXEL0_ALPHA";
|
||||
break;
|
||||
|
||||
case G_CCMUX_TEXEL1_ALPHA:
|
||||
ret = "TEXEL1_ALPHA";
|
||||
break;
|
||||
|
||||
case G_CCMUX_PRIMITIVE_ALPHA:
|
||||
ret = "PRIMITIVE_ALPHA";
|
||||
break;
|
||||
|
||||
case G_CCMUX_SHADE_ALPHA:
|
||||
ret = "SHADE_ALPHA";
|
||||
break;
|
||||
|
||||
case G_CCMUX_ENV_ALPHA:
|
||||
ret = "ENV_ALPHA";
|
||||
break;
|
||||
|
||||
case G_CCMUX_LOD_FRACTION:
|
||||
ret = "LOD_FRACTION";
|
||||
break;
|
||||
|
||||
case G_CCMUX_PRIM_LOD_FRAC:
|
||||
ret = "PRIM_LOD_FRAC";
|
||||
break;
|
||||
|
||||
case G_CCMUX_K5:
|
||||
ret = "K5";
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = "0";
|
||||
break;
|
||||
|
@ -104,30 +127,38 @@ const char* UCodeDisas_ParseCombineColor(u32 value, u32 idx) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
const char* UCodeDisas_ParseCombineAlpha(u32 value, u32 idx) {
|
||||
const char* UCodeDisas_GetCombineAlphaName(u32 value, u32 arg) {
|
||||
const char* ret = "?";
|
||||
|
||||
switch (value) {
|
||||
case 0:
|
||||
ret = (idx == 3) ? "LOD_FRACTION" : "COMBINED";
|
||||
case 0: // G_ACMUX_LOD_FRACTION, G_ACMUX_COMBINED
|
||||
ret = (arg == COMBINER_C) ? "LOD_FRACTION" : "COMBINED";
|
||||
break;
|
||||
|
||||
case G_ACMUX_TEXEL0:
|
||||
ret = "TEXEL0";
|
||||
break;
|
||||
|
||||
case G_ACMUX_TEXEL1:
|
||||
ret = "TEXEL1";
|
||||
break;
|
||||
|
||||
case G_ACMUX_PRIMITIVE:
|
||||
ret = "PRIMITIVE";
|
||||
break;
|
||||
|
||||
case G_ACMUX_SHADE:
|
||||
ret = "SHADE";
|
||||
break;
|
||||
|
||||
case G_ACMUX_ENVIRONMENT:
|
||||
ret = "ENVIRONMENT";
|
||||
break;
|
||||
case 6:
|
||||
ret = (idx == 3) ? "PRIM_LOD_FRAC" : "1";
|
||||
|
||||
case 6: // G_ACMUX_PRIM_LOD_FRAC, G_ACMUX_1
|
||||
ret = (arg == COMBINER_C) ? "PRIM_LOD_FRAC" : "1";
|
||||
break;
|
||||
|
||||
case G_ACMUX_0:
|
||||
ret = "0";
|
||||
break;
|
||||
|
@ -162,7 +193,7 @@ void UCodeDisas_SetCurUCodeImpl(UCodeDisas* this, void* ptr) {
|
|||
}
|
||||
}
|
||||
|
||||
void UCodeDisas_ParseGeometryMode(UCodeDisas* this, u32 mode) {
|
||||
void UCodeDisas_PrintGeometryMode(UCodeDisas* this, u32 mode) {
|
||||
u32 first = true;
|
||||
s32 i;
|
||||
|
||||
|
@ -181,7 +212,7 @@ void UCodeDisas_ParseGeometryMode(UCodeDisas* this, u32 mode) {
|
|||
}
|
||||
}
|
||||
|
||||
void UCodeDisas_ParseRenderMode(UCodeDisas* this, u32 mode) {
|
||||
void UCodeDisas_PrintRenderMode(UCodeDisas* this, u32 mode) {
|
||||
static F3dzexRenderMode sUCodeDisasRenderModeFlags[] = {
|
||||
F3DZEX_RENDERMODE(AA_EN, 0x8),
|
||||
F3DZEX_RENDERMODE(Z_CMP, 0x10),
|
||||
|
@ -200,7 +231,7 @@ void UCodeDisas_ParseRenderMode(UCodeDisas* this, u32 mode) {
|
|||
F3DZEX_RENDERMODE(ALPHA_CVG_SEL, 0x2000),
|
||||
F3DZEX_RENDERMODE(FORCE_BL, 0x4000),
|
||||
};
|
||||
static const char* D_8012DDDC[4][4] = {
|
||||
static const char* sBlenderInputNames[4][4] = {
|
||||
{ "G_BL_CLR_IN", "G_BL_CLR_MEM", "G_BL_CLR_BL", "G_BL_CLR_FOG" },
|
||||
{ "G_BL_A_IN", "G_BL_A_FOG", "G_BL_A_SHADE", "G_BL_0" },
|
||||
{ "G_BL_CLR_IN", "G_BL_CLR_MEM", "G_BL_CLR_BL", "G_BL_CLR_FOG" },
|
||||
|
@ -224,18 +255,19 @@ void UCodeDisas_ParseRenderMode(UCodeDisas* this, u32 mode) {
|
|||
|
||||
// clang-format off
|
||||
if (this->enableLog == 0) {} else { osSyncPrintf("\nGBL_c1(%s, %s, %s, %s)|",
|
||||
D_8012DDDC[0][a >> 12 & 3], D_8012DDDC[1][a >> 8 & 3], D_8012DDDC[2][a >> 4 & 3], D_8012DDDC[3][a >> 0 & 3]);
|
||||
sBlenderInputNames[0][a >> 12 & 3], sBlenderInputNames[1][a >> 8 & 3], sBlenderInputNames[2][a >> 4 & 3], sBlenderInputNames[3][a >> 0 & 3]);
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
if (this->enableLog) {
|
||||
osSyncPrintf("\nGBL_c2(%s, %s, %s, %s)", D_8012DDDC[0][b >> 12 & 3], D_8012DDDC[1][b >> 8 & 3],
|
||||
D_8012DDDC[2][b >> 4 & 3], D_8012DDDC[3][b >> 0 & 3]);
|
||||
osSyncPrintf("\nGBL_c2(%s, %s, %s, %s)", sBlenderInputNames[0][b >> 12 & 3], sBlenderInputNames[1][b >> 8 & 3],
|
||||
sBlenderInputNames[2][b >> 4 & 3], sBlenderInputNames[3][b >> 0 & 3]);
|
||||
}
|
||||
}
|
||||
|
||||
void UCodeDisas_PrintVertices(UCodeDisas* this, Vtx* vtx, s32 count, s32 start) {
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (this->geometryMode & G_LIGHTING) {
|
||||
DISAS_LOG("\n{{%6d, %6d, %6d, %d, %6d, %6d, %3d, %3d, %3d, %3d}}, /* vc%d */", vtx->n.ob[0], vtx->n.ob[1],
|
||||
|
@ -252,225 +284,32 @@ void UCodeDisas_PrintVertices(UCodeDisas* this, Vtx* vtx, s32 count, s32 start)
|
|||
}
|
||||
}
|
||||
|
||||
// Todo: clean this up
|
||||
|
||||
typedef struct {
|
||||
s8 cmd;
|
||||
u8 v0;
|
||||
u8 v1;
|
||||
u8 wd;
|
||||
void UCodeDisas_Disassemble(UCodeDisas* this, Gfx* ptr) {
|
||||
u32 pad;
|
||||
} Gline3DFix;
|
||||
|
||||
typedef struct {
|
||||
int cmd : 8;
|
||||
u32 pad : 4;
|
||||
u32 numv : 8;
|
||||
s32 pad2 : 4;
|
||||
u8 vbidx;
|
||||
} Gvtx;
|
||||
|
||||
typedef struct {
|
||||
u8 pad : 8;
|
||||
u8 v0 : 8;
|
||||
u8 v1 : 8;
|
||||
u8 v2 : 8;
|
||||
} Gtrimod;
|
||||
|
||||
typedef struct {
|
||||
int cmd : 8;
|
||||
int pad : 24;
|
||||
Gtrimod tri;
|
||||
} Gtri1;
|
||||
|
||||
typedef struct {
|
||||
Gtrimod tri1;
|
||||
Gtrimod tri2;
|
||||
} Gtri2;
|
||||
|
||||
typedef struct {
|
||||
u8 pad : 8;
|
||||
u8 v0 : 8;
|
||||
u8 v1 : 8;
|
||||
u8 v2 : 8;
|
||||
u8 pad1 : 8;
|
||||
u8 pad2 : 8;
|
||||
u8 pad3 : 8;
|
||||
u8 v3 : 8;
|
||||
} Gquadmod;
|
||||
|
||||
typedef struct {
|
||||
u16 pad;
|
||||
u16 vstart;
|
||||
u16 pad2;
|
||||
u16 vend;
|
||||
} Gcull;
|
||||
|
||||
typedef struct {
|
||||
u16 pad;
|
||||
u16 vstart;
|
||||
u16 pad2;
|
||||
u16 vend;
|
||||
} Gbranchz;
|
||||
|
||||
typedef struct {
|
||||
int cmd : 8;
|
||||
u8 pad;
|
||||
u8 prim_min_level;
|
||||
u8 prim_level;
|
||||
u8 r;
|
||||
u8 g;
|
||||
u8 b;
|
||||
u8 a;
|
||||
} GsetcolorMod;
|
||||
|
||||
typedef struct {
|
||||
u8 cmd;
|
||||
char pad[3];
|
||||
u16 z;
|
||||
u16 d;
|
||||
} Gsetprimdepth;
|
||||
|
||||
typedef struct {
|
||||
u8 cmd;
|
||||
u8 type;
|
||||
u16 len;
|
||||
union {
|
||||
u32 u32;
|
||||
f32 f32;
|
||||
} value;
|
||||
} Gnoop;
|
||||
|
||||
typedef struct {
|
||||
u8 cmd;
|
||||
u8 pad[2];
|
||||
u8 params;
|
||||
u32 addr;
|
||||
} Gmatrix;
|
||||
|
||||
typedef struct {
|
||||
u8 cmd;
|
||||
u32 a : 4;
|
||||
u32 c : 5;
|
||||
u32 z : 3;
|
||||
u32 x : 3;
|
||||
u32 e : 4;
|
||||
u32 g : 5;
|
||||
u32 b : 4;
|
||||
u32 f : 4;
|
||||
u32 v : 3;
|
||||
u32 t : 3;
|
||||
u32 d : 3;
|
||||
u32 y : 3;
|
||||
u32 w : 3;
|
||||
u32 h : 3;
|
||||
u32 u : 3;
|
||||
u32 s : 3;
|
||||
} GsetcombineMod;
|
||||
|
||||
typedef struct {
|
||||
u32 cmd : 8;
|
||||
u32 pad0 : 8;
|
||||
u32 sft : 8;
|
||||
u32 len : 8;
|
||||
u32 data : 32;
|
||||
} GsetothermodeMod;
|
||||
|
||||
typedef struct {
|
||||
s32 cmd : 8;
|
||||
u32 offset : 16;
|
||||
u32 index : 8;
|
||||
u32 data;
|
||||
} Gmovewd;
|
||||
|
||||
typedef struct {
|
||||
s32 cmd : 8;
|
||||
u32 size : 8;
|
||||
u32 offset : 8;
|
||||
u32 index : 8;
|
||||
u32 data;
|
||||
} Gmovemem;
|
||||
|
||||
typedef struct {
|
||||
u8 cmd : 8;
|
||||
u8 lodscale : 8;
|
||||
u8 pad : 2;
|
||||
u8 level : 3;
|
||||
u8 tile : 3;
|
||||
|
||||
unsigned char on;
|
||||
unsigned short s;
|
||||
unsigned short t;
|
||||
} Gtexturemod;
|
||||
|
||||
typedef struct {
|
||||
int cmd : 8;
|
||||
int pad1 : 24;
|
||||
u32 param : 26;
|
||||
unsigned char pad3 : 6;
|
||||
} Gpopmtxmod;
|
||||
|
||||
typedef union {
|
||||
Gwords words;
|
||||
Gnoop noop;
|
||||
Gmatrix matrix;
|
||||
Gdma dma;
|
||||
Gtri1 tri1;
|
||||
Gtri2 tri2;
|
||||
Gquadmod quad;
|
||||
Gcull cull;
|
||||
Gline3D line;
|
||||
Gline3DFix linefix;
|
||||
Gmovewd movewd;
|
||||
Gmovemem movemem;
|
||||
Gpopmtx popmtx;
|
||||
Gpopmtxmod popmtxmod;
|
||||
Gsegment segment;
|
||||
GsetothermodeH setothermodeH;
|
||||
GsetothermodeL setothermodeL;
|
||||
GsetothermodeMod setothermode;
|
||||
Gtexture texture;
|
||||
Gtexturemod texmod;
|
||||
Gperspnorm perspnorm;
|
||||
Gsetimg setimg;
|
||||
GsetcombineMod setcombine;
|
||||
GsetcolorMod setcolor; // mod
|
||||
Gfillrect fillrect; /* use for setscissor also */
|
||||
Gsettile settile;
|
||||
Gloadtile loadtile; /* use for loadblock also, th is dxt */
|
||||
Gsettilesize settilesize;
|
||||
Gloadtlut loadtlut;
|
||||
Gsetprimdepth setprimdepth;
|
||||
Gvtx vtx;
|
||||
long long int force_structure_alignment;
|
||||
} GfxMod;
|
||||
|
||||
void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
||||
u32 pad;
|
||||
u32 addr;
|
||||
uintptr_t addr;
|
||||
u32 rdpHalf;
|
||||
u16 linkDlLow;
|
||||
u8 sid;
|
||||
u8 cmd;
|
||||
s32 i0;
|
||||
s32 i;
|
||||
u32 exit;
|
||||
GfxMod curGfx[1];
|
||||
Gfx curGfx[1];
|
||||
|
||||
exit = false;
|
||||
|
||||
while (!exit) {
|
||||
this->dlCnt++;
|
||||
|
||||
ptr = UCodeDisas_TranslateAddr(this, (u32)ptr);
|
||||
ptr = UCodeDisas_TranslateAddr(this, (uintptr_t)ptr);
|
||||
DISAS_LOG("%08x:", ptr);
|
||||
|
||||
*curGfx = *ptr;
|
||||
cmd = curGfx->dma.cmd;
|
||||
addr = (u32)UCodeDisas_TranslateAddr(this, curGfx->dma.addr);
|
||||
cmd = curGfx->noop.cmd;
|
||||
addr = (uintptr_t)UCodeDisas_TranslateAddr(this, (uintptr_t)curGfx->noop.value.addr);
|
||||
|
||||
DISAS_LOG("%08x-%08x:", curGfx->words.w0, curGfx->words.w1);
|
||||
|
||||
for (i0 = 0; i0 < this->dlDepth; i0++) {
|
||||
for (i = 0; i < this->dlDepth; i++) {
|
||||
DISAS_LOG(" ");
|
||||
}
|
||||
|
||||
|
@ -483,15 +322,15 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
Gdma dma = ptr->dma;
|
||||
|
||||
switch (dma.par) {
|
||||
case 0: {
|
||||
case G_DL_PUSH: {
|
||||
DISAS_LOG("gsSPDisplayList(0x%08x),", dma.addr);
|
||||
this->dlStack[this->dlDepth++] = (Gfx*)(ptr + 1);
|
||||
ptr = (GfxMod*)addr - 1;
|
||||
ptr = (Gfx*)addr - 1;
|
||||
} break;
|
||||
|
||||
case 1: {
|
||||
case G_DL_NOPUSH: {
|
||||
DISAS_LOG("gsSPBranchList(0x%08x),", dma.addr);
|
||||
ptr = (GfxMod*)addr - 1;
|
||||
ptr = (Gfx*)addr - 1;
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
@ -513,7 +352,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case G_LOAD_UCODE: {
|
||||
if (curGfx->dma.len == 0x7FF) {
|
||||
if (curGfx->dma.len == SP_UCODE_DATA_SIZE - 1) {
|
||||
DISAS_LOG("gsSPLoadUcode(0x%08x, 0x%08x),", curGfx->dma.addr, rdpHalf);
|
||||
} else {
|
||||
DISAS_LOG("gsSPLoadUcodeEx(0x%08x, 0x%08x, 0x%05x),", curGfx->dma.addr, rdpHalf,
|
||||
|
@ -528,7 +367,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
if (this->dlDepth <= 0) {
|
||||
exit = true;
|
||||
} else {
|
||||
ptr = (GfxMod*)this->dlStack[--this->dlDepth] - 1;
|
||||
ptr = this->dlStack[--this->dlDepth] - 1;
|
||||
}
|
||||
} break;
|
||||
|
||||
|
@ -579,20 +418,28 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case G_SETCOMBINE: {
|
||||
GsetcombineMod setcombine = ptr->setcombine;
|
||||
Gsetcombine setcombine = ptr->setcombine;
|
||||
|
||||
DISAS_LOG("gsDPSetCombineLERP(%s,%s,%s,%s, %s,%s,%s,%s, %s,%s,%s,%s, %s,%s,%s,%s),",
|
||||
UCodeDisas_ParseCombineColor(setcombine.a, 1), UCodeDisas_ParseCombineColor(setcombine.b, 2),
|
||||
UCodeDisas_ParseCombineColor(setcombine.c, 3), UCodeDisas_ParseCombineColor(setcombine.d, 4),
|
||||
UCodeDisas_GetCombineColorName(setcombine.a0, COMBINER_A),
|
||||
UCodeDisas_GetCombineColorName(setcombine.b0, COMBINER_B),
|
||||
UCodeDisas_GetCombineColorName(setcombine.c0, COMBINER_C),
|
||||
UCodeDisas_GetCombineColorName(setcombine.d0, COMBINER_D),
|
||||
|
||||
UCodeDisas_ParseCombineAlpha(setcombine.z, 1), UCodeDisas_ParseCombineAlpha(setcombine.y, 2),
|
||||
UCodeDisas_ParseCombineAlpha(setcombine.x, 3), UCodeDisas_ParseCombineAlpha(setcombine.w, 4),
|
||||
UCodeDisas_GetCombineAlphaName(setcombine.Aa0, COMBINER_A),
|
||||
UCodeDisas_GetCombineAlphaName(setcombine.Ab0, COMBINER_B),
|
||||
UCodeDisas_GetCombineAlphaName(setcombine.Ac0, COMBINER_C),
|
||||
UCodeDisas_GetCombineAlphaName(setcombine.Ad0, COMBINER_D),
|
||||
|
||||
UCodeDisas_ParseCombineColor(setcombine.e, 1), UCodeDisas_ParseCombineColor(setcombine.f, 2),
|
||||
UCodeDisas_ParseCombineColor(setcombine.g, 3), UCodeDisas_ParseCombineColor(setcombine.h, 4),
|
||||
UCodeDisas_GetCombineColorName(setcombine.a1, COMBINER_A),
|
||||
UCodeDisas_GetCombineColorName(setcombine.b1, COMBINER_B),
|
||||
UCodeDisas_GetCombineColorName(setcombine.c1, COMBINER_C),
|
||||
UCodeDisas_GetCombineColorName(setcombine.d1, COMBINER_D),
|
||||
|
||||
UCodeDisas_ParseCombineAlpha(setcombine.v, 1), UCodeDisas_ParseCombineAlpha(setcombine.u, 2),
|
||||
UCodeDisas_ParseCombineAlpha(setcombine.t, 3), UCodeDisas_ParseCombineAlpha(setcombine.s, 4));
|
||||
UCodeDisas_GetCombineAlphaName(setcombine.Aa1, COMBINER_A),
|
||||
UCodeDisas_GetCombineAlphaName(setcombine.Ab1, COMBINER_B),
|
||||
UCodeDisas_GetCombineAlphaName(setcombine.Ac1, COMBINER_C),
|
||||
UCodeDisas_GetCombineAlphaName(setcombine.Ad1, COMBINER_D));
|
||||
|
||||
if (this->pipeSyncRequired) {
|
||||
DISAS_LOG("### PipeSyncが必要です。\n");
|
||||
|
@ -624,34 +471,33 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
-1),
|
||||
};
|
||||
|
||||
u32 len = curGfx->setothermode.len + 1;
|
||||
u32 sft = (-curGfx->setothermode.sft - len) + 32;
|
||||
u32 s2 = curGfx->setothermode.data * 1;
|
||||
u32 i1;
|
||||
u32 i2;
|
||||
u32 len = curGfx->setothermodeH.len + 1;
|
||||
u32 sft = (-curGfx->setothermodeH.sft - len) + 32;
|
||||
u32 s2 = curGfx->setothermodeH.data * 1;
|
||||
u32 j;
|
||||
u32 k;
|
||||
|
||||
for (i1 = 0; i1 < ARRAY_COUNTU(sUCodeDisasModeHMacros); i1++) {
|
||||
if (sft == sUCodeDisasModeHMacros[i1].shift) {
|
||||
for (i2 = 0; i2 < 4; i2++) {
|
||||
if (s2 == sUCodeDisasModeHMacros[i1].values[i2].value) {
|
||||
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeHMacros[i1].name,
|
||||
sUCodeDisasModeHMacros[i1].values[i2].name);
|
||||
goto block_1;
|
||||
for (j = 0; j < ARRAY_COUNTU(sUCodeDisasModeHMacros); j++) {
|
||||
if (sft == sUCodeDisasModeHMacros[j].shift) {
|
||||
for (k = 0; k < ARRAY_COUNTU(sUCodeDisasModeHMacros[j].values); k++) {
|
||||
if (s2 == sUCodeDisasModeHMacros[j].values[k].value) {
|
||||
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeHMacros[j].name,
|
||||
sUCodeDisasModeHMacros[j].values[k].name);
|
||||
goto found_othermode_hi_macro;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
DISAS_LOG("gsSPSetOtherModeH(%d, %d, 0x%08x),", sft, len, s2);
|
||||
|
||||
block_1:
|
||||
this->modeH &= (((1 - (1 << len)) << sft) - 1);
|
||||
found_othermode_hi_macro:
|
||||
this->modeH &= ((1 - (1 << len)) << sft) - 1;
|
||||
this->modeH |= s2;
|
||||
|
||||
if (this->pipeSyncRequired) {
|
||||
DISAS_LOG("### PipeSyncが必要です。\n");
|
||||
this->syncErr++;
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
case G_SETOTHERMODE_L: {
|
||||
|
@ -661,24 +507,24 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
F3DZEX_SETRENDERMACRO("gsDPSetDepthSource", G_MDSFT_ZSRCSEL, 1, G_ZS_PIXEL, G_ZS_PRIM, -1, -1),
|
||||
};
|
||||
|
||||
u32 len = curGfx->setothermode.len + 1;
|
||||
u32 sft = (-curGfx->setothermode.sft - len) + 32;
|
||||
u32 s2 = curGfx->setothermode.data * 1;
|
||||
u32 i1;
|
||||
u32 i2;
|
||||
u32 len = curGfx->setothermodeL.len + 1;
|
||||
u32 sft = (-curGfx->setothermodeL.sft - len) + 32;
|
||||
u32 s2 = curGfx->setothermodeL.data * 1;
|
||||
u32 j;
|
||||
u32 k;
|
||||
|
||||
if (sft == G_MDSFT_RENDERMODE) {
|
||||
DISAS_LOG("\ngsDPSetRenderBlender(");
|
||||
UCodeDisas_ParseRenderMode(this, s2);
|
||||
UCodeDisas_PrintRenderMode(this, s2);
|
||||
DISAS_LOG("\n),");
|
||||
} else {
|
||||
for (i1 = 0; i1 * 1 < ARRAY_COUNTU(sUCodeDisasModeLMacros); i1++) {
|
||||
if (sft == sUCodeDisasModeLMacros[i1].shift) {
|
||||
for (i2 = 0; i2 < 4; i2++) {
|
||||
if (s2 == sUCodeDisasModeLMacros[i1].values[i2].value) {
|
||||
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeLMacros[i1].name,
|
||||
sUCodeDisasModeLMacros[i1].values[i2].name);
|
||||
goto block_2;
|
||||
for (j = 0; j * 1 < ARRAY_COUNTU(sUCodeDisasModeLMacros); j++) {
|
||||
if (sft == sUCodeDisasModeLMacros[j].shift) {
|
||||
for (k = 0; k < ARRAY_COUNTU(sUCodeDisasModeLMacros[j].values); k++) {
|
||||
if (s2 == sUCodeDisasModeLMacros[j].values[k].value) {
|
||||
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeLMacros[j].name,
|
||||
sUCodeDisasModeLMacros[j].values[k].name);
|
||||
goto found_othermode_lo_macro;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -686,7 +532,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
DISAS_LOG("gsSPSetOtherModeL(%d, %d, 0x%08x),", sft, len, s2);
|
||||
}
|
||||
|
||||
block_2:
|
||||
found_othermode_lo_macro:
|
||||
this->modeL &= (((1 - (1 << len)) << sft) - 1);
|
||||
this->modeL |= s2;
|
||||
|
||||
|
@ -758,7 +604,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case G_SETZIMG: {
|
||||
DISAS_LOG("gsDPSetDepthImage(0x%08x(0x%08x)),", curGfx->words.w1, addr);
|
||||
DISAS_LOG("gsDPSetDepthImage(0x%08x(0x%08x)),", curGfx->setimg.dram, addr);
|
||||
|
||||
if (this->pipeSyncRequired) {
|
||||
DISAS_LOG("### PipeSyncが必要です。\n");
|
||||
|
@ -814,7 +660,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case G_SETFILLCOLOR: {
|
||||
DISAS_LOG("gsDPSetFillColor(0x%08x),", curGfx->words.w1);
|
||||
DISAS_LOG("gsDPSetFillColor(0x%08x),", curGfx->setcolor.color);
|
||||
|
||||
if (this->pipeSyncRequired) {
|
||||
DISAS_LOG("### PipeSyncが必要です。\n");
|
||||
|
@ -823,7 +669,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case G_SETPRIMDEPTH: {
|
||||
DISAS_LOG("gsDPSetPrimDepth(%d, %d),", curGfx->setprimdepth.z, curGfx->setprimdepth.d);
|
||||
DISAS_LOG("gsDPSetPrimDepth(%d, %d),", curGfx->setprimdepth.z, curGfx->setprimdepth.dz);
|
||||
|
||||
if (this->pipeSyncRequired) {
|
||||
DISAS_LOG("### PipeSyncが必要です。\n");
|
||||
|
@ -872,19 +718,19 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case 1: {
|
||||
DISAS_LOG("count_gsDPNoOpHere([%s:%d]),", curGfx->noop.value.u32, curGfx->noop.len);
|
||||
DISAS_LOG("count_gsDPNoOpHere([%s:%d]),", curGfx->noop.value.str, curGfx->noop.len);
|
||||
} break;
|
||||
|
||||
case 7: {
|
||||
DISAS_LOG("count_gsDPNoOpOpenDisp([%s:%d]),", curGfx->noop.value.u32, curGfx->noop.len);
|
||||
DISAS_LOG("count_gsDPNoOpOpenDisp([%s:%d]),", curGfx->noop.value.str, curGfx->noop.len);
|
||||
} break;
|
||||
|
||||
case 8: {
|
||||
DISAS_LOG("count_gsDPNoOpCloseDisp([%s:%d]),", curGfx->noop.value.u32, curGfx->noop.len);
|
||||
DISAS_LOG("count_gsDPNoOpCloseDisp([%s:%d]),", curGfx->noop.value.str, curGfx->noop.len);
|
||||
} break;
|
||||
|
||||
case 2: {
|
||||
DISAS_LOG("count_gsDPNoOpString(%c%s%c, %d),", '"', curGfx->noop.value.u32, '"',
|
||||
DISAS_LOG("count_gsDPNoOpString(%c%s%c, %d),", '"', curGfx->noop.value.str, '"',
|
||||
curGfx->noop.len);
|
||||
} break;
|
||||
|
||||
|
@ -906,9 +752,9 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case 6: {
|
||||
/*! @bug arguments are not printed */
|
||||
//! @bug arguments are not printed
|
||||
DISAS_LOG("count_gsDPNoOpCallBack(%08x,%d),");
|
||||
((void (*)(UCodeDisas*, u32))curGfx->noop.value.u32)(this, curGfx->noop.len);
|
||||
((UcodeDisasCallback)curGfx->noop.value.callback)(this, curGfx->noop.len);
|
||||
} break;
|
||||
|
||||
default: {
|
||||
|
@ -924,27 +770,27 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
case UCODE_UNK: {
|
||||
switch (cmd) {
|
||||
case G_MTX: {
|
||||
Gmatrix gmtx = ptr->matrix;
|
||||
Gdma2 gmtx = ptr->dma2;
|
||||
u32 params;
|
||||
MtxF mtx;
|
||||
s32 i1 = 0;
|
||||
MtxF mtxF;
|
||||
s32 j = 0;
|
||||
|
||||
DISAS_LOG("gsSPMatrix(0x%08x(%08x), 0", gmtx.addr, addr);
|
||||
|
||||
params = (gmtx.params ^ G_MTX_PUSH);
|
||||
params = gmtx.par ^ G_MTX_PUSH;
|
||||
|
||||
for (; i1 != ARRAY_COUNT(sUCodeDisasMtxFlags); i1++) {
|
||||
DISAS_LOG("|%s", (sUCodeDisasMtxFlags[i1].value & params)
|
||||
? sUCodeDisasMtxFlags[i1].setName
|
||||
: sUCodeDisasMtxFlags[i1].unsetName);
|
||||
for (; j != ARRAY_COUNT(sUCodeDisasMtxFlags); j++) {
|
||||
DISAS_LOG("|%s", (sUCodeDisasMtxFlags[j].value & params)
|
||||
? sUCodeDisasMtxFlags[j].setName
|
||||
: sUCodeDisasMtxFlags[j].unsetName);
|
||||
}
|
||||
DISAS_LOG("),", gmtx.addr); /*! @bug gmtx.addr shouldn't be here*/
|
||||
DISAS_LOG("),", gmtx.addr); //! @bug gmtx.addr shouldn't be here
|
||||
|
||||
if (this->enableLog >= 2) {
|
||||
MtxConv_L2F(&mtx, (Mtx*)addr);
|
||||
MtxConv_L2F(&mtxF, (Mtx*)addr);
|
||||
DISAS_LOG("\n");
|
||||
|
||||
/*! @bug %.04x.%04x is a typo, should be %04x.%04x */
|
||||
//! @bug %.04x.%04x is a typo, should be %04x.%04x
|
||||
// clang-format off
|
||||
DISAS_LOG(
|
||||
"/ %04x.%04x %04x.%04x %04x.%04x %.04x.%04x \\/ %12.6f %12.6f %12.6f %12.6f \\\n"
|
||||
|
@ -955,22 +801,22 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
((Mtx*)addr)->intPart[1][0], ((Mtx*)addr)->fracPart[1][0],
|
||||
((Mtx*)addr)->intPart[2][0], ((Mtx*)addr)->fracPart[2][0],
|
||||
((Mtx*)addr)->intPart[3][0], ((Mtx*)addr)->fracPart[3][0],
|
||||
mtx.mf[0][0], mtx.mf[1][0], mtx.mf[2][0], mtx.mf[3][0],
|
||||
mtxF.mf[0][0], mtxF.mf[1][0], mtxF.mf[2][0], mtxF.mf[3][0],
|
||||
((Mtx*)addr)->intPart[0][1], ((Mtx*)addr)->fracPart[0][1],
|
||||
((Mtx*)addr)->intPart[1][1], ((Mtx*)addr)->fracPart[1][1],
|
||||
((Mtx*)addr)->intPart[2][1], ((Mtx*)addr)->fracPart[2][1],
|
||||
((Mtx*)addr)->intPart[3][1], ((Mtx*)addr)->fracPart[3][1],
|
||||
mtx.mf[0][1], mtx.mf[1][1], mtx.mf[2][1], mtx.mf[3][1],
|
||||
mtxF.mf[0][1], mtxF.mf[1][1], mtxF.mf[2][1], mtxF.mf[3][1],
|
||||
((Mtx*)addr)->intPart[0][2], ((Mtx*)addr)->fracPart[0][2],
|
||||
((Mtx*)addr)->intPart[1][2], ((Mtx*)addr)->fracPart[1][2],
|
||||
((Mtx*)addr)->intPart[2][2], ((Mtx*)addr)->fracPart[2][2],
|
||||
((Mtx*)addr)->intPart[3][2], ((Mtx*)addr)->fracPart[3][2],
|
||||
mtx.mf[0][2], mtx.mf[1][2], mtx.mf[2][2], mtx.mf[3][2],
|
||||
mtxF.mf[0][2], mtxF.mf[1][2], mtxF.mf[2][2], mtxF.mf[3][2],
|
||||
((Mtx*)addr)->intPart[0][3], ((Mtx*)addr)->fracPart[0][3],
|
||||
((Mtx*)addr)->intPart[1][3], ((Mtx*)addr)->fracPart[1][3],
|
||||
((Mtx*)addr)->intPart[2][3], ((Mtx*)addr)->fracPart[2][3],
|
||||
((Mtx*)addr)->intPart[3][3], ((Mtx*)addr)->fracPart[3][3],
|
||||
mtx.mf[0][3], mtx.mf[1][3], mtx.mf[2][3], mtx.mf[3][3]);
|
||||
mtxF.mf[0][3], mtxF.mf[1][3], mtxF.mf[2][3], mtxF.mf[3][3]);
|
||||
// clang-format on
|
||||
}
|
||||
} break;
|
||||
|
@ -981,9 +827,9 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
|
||||
numv >>= 12;
|
||||
numv &= 0xFF;
|
||||
vbidx = (curGfx->vtx.vbidx >> 1) - numv;
|
||||
vbidx = (curGfx->vtx.par >> 1) - numv;
|
||||
|
||||
DISAS_LOG("gsSPVertex(0x%08x(0x%08x), %d, %d),", curGfx->words.w1, addr, numv, vbidx);
|
||||
DISAS_LOG("gsSPVertex(0x%08x(0x%08x), %d, %d),", curGfx->vtx.addr, addr, numv, vbidx);
|
||||
|
||||
this->vtxCnt += numv;
|
||||
this->spvtxCnt++;
|
||||
|
@ -1006,21 +852,21 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case G_TRI1: {
|
||||
Gtri1 gtri = ptr->tri1;
|
||||
Gtrimod tri = gtri.tri;
|
||||
Gtri gtri = ptr->tri;
|
||||
Tri tri = gtri.tri;
|
||||
|
||||
DISAS_LOG("gsSP1Triangle(%d, %d, %d),", tri.v0 / 2, tri.v1 / 2, tri.v2 / 2);
|
||||
DISAS_LOG("gsSP1Triangle(%d, %d, %d),", tri.v[0] / 2, tri.v[1] / 2, tri.v[2] / 2);
|
||||
|
||||
this->tri1Cnt++;
|
||||
this->pipeSyncRequired = true;
|
||||
} break;
|
||||
|
||||
case G_LINE3D: {
|
||||
if (curGfx->linefix.wd == 0) {
|
||||
DISAS_LOG("gsSPLine3D(%d, %d),", curGfx->linefix.v0, curGfx->linefix.v1);
|
||||
if (curGfx->line.wd == 0) {
|
||||
DISAS_LOG("gsSPLine3D(%d, %d),", curGfx->line.v0, curGfx->line.v1);
|
||||
} else {
|
||||
DISAS_LOG("gsSPLineW3D(%d, %d, %d),", curGfx->linefix.v0, curGfx->linefix.v1,
|
||||
curGfx->linefix.wd);
|
||||
DISAS_LOG("gsSPLineW3D(%d, %d, %d),", curGfx->line.v0, curGfx->line.v1,
|
||||
curGfx->line.wd);
|
||||
}
|
||||
|
||||
this->lineCnt++;
|
||||
|
@ -1032,13 +878,13 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
u32 v0, v1, v2;
|
||||
u32 v3, v4, v5;
|
||||
|
||||
v0 = tri2.tri1.v0 / 2;
|
||||
v1 = tri2.tri1.v1 / 2;
|
||||
v2 = tri2.tri1.v2 / 2;
|
||||
v0 = tri2.tri1.v[0] / 2;
|
||||
v1 = tri2.tri1.v[1] / 2;
|
||||
v2 = tri2.tri1.v[2] / 2;
|
||||
|
||||
v3 = tri2.tri2.v0 / 2;
|
||||
v4 = tri2.tri2.v1 / 2;
|
||||
v5 = tri2.tri2.v2 / 2;
|
||||
v3 = tri2.tri2.v[0] / 2;
|
||||
v4 = tri2.tri2.v[1] / 2;
|
||||
v5 = tri2.tri2.v[2] / 2;
|
||||
|
||||
DISAS_LOG("gsSP2Triangles(%d, %d, %d, 0, %d, %d, %d, 0),", v0, v1, v2, v3, v4, v5);
|
||||
|
||||
|
@ -1047,13 +893,13 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case G_QUAD: {
|
||||
Gquadmod quad = ptr->quad;
|
||||
Gquad quad = ptr->quad;
|
||||
u32 v0, v1, v2, v3;
|
||||
|
||||
v0 = quad.v0 / 2;
|
||||
v1 = quad.v1 / 2;
|
||||
v2 = quad.v2 / 2;
|
||||
v3 = quad.v3 / 2;
|
||||
v0 = quad.tri1.v[0] / 2;
|
||||
v1 = quad.tri1.v[1] / 2;
|
||||
v2 = quad.tri1.v[2] / 2;
|
||||
v3 = quad.tri2.v[2] / 2;
|
||||
|
||||
DISAS_LOG("gsSP1Quadrangle(%d, %d, %d, %d, 0),", v0, v1, v2, v3);
|
||||
|
||||
|
@ -1062,19 +908,19 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case G_CULLDL: {
|
||||
DISAS_LOG("gsSPCullDisplayList(%d, %d),", (curGfx->cull.vstart) / 2,
|
||||
(curGfx->cull.vend) / 2);
|
||||
DISAS_LOG("gsSPCullDisplayList(%d, %d),", (curGfx->cull.vstart_x2) / 2,
|
||||
(curGfx->cull.vend_x2) / 2);
|
||||
} break;
|
||||
|
||||
case G_BRANCH_Z: {
|
||||
addr = (u32)UCodeDisas_TranslateAddr(this, rdpHalf);
|
||||
addr = (uintptr_t)UCodeDisas_TranslateAddr(this, rdpHalf);
|
||||
DISAS_LOG("gsSPBranchLessZraw(0x%08x(0x%08x), %d, 0x%08x),", rdpHalf, addr,
|
||||
(curGfx->words.w0 & 0xFFF) / 2, curGfx->words.w1);
|
||||
ptr = (GfxMod*)addr - 1;
|
||||
ptr = (Gfx*)addr - 1;
|
||||
} break;
|
||||
|
||||
case G_TEXTURE: {
|
||||
Gtexturemod texture = ptr->texmod;
|
||||
Gtexture texture = ptr->texture;
|
||||
|
||||
if (texture.lodscale == 0) {
|
||||
DISAS_LOG("gsSPTexture(%d, %d, %d, %d, %s),", texture.s, texture.t, texture.level,
|
||||
|
@ -1087,12 +933,12 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
} break;
|
||||
|
||||
case G_POPMTX: {
|
||||
Gpopmtxmod popmtx = ptr->popmtxmod;
|
||||
Gpopmtx popmtx = ptr->popmtx;
|
||||
|
||||
if (popmtx.param == 1) {
|
||||
if (popmtx.param / 64 == 1) {
|
||||
DISAS_LOG("gsSPPopMatrix(G_MTX_MODELVIEW),");
|
||||
} else {
|
||||
DISAS_LOG("gsSPPopMatrixN(G_MTX_MODELVIEW, %d),", popmtx.param);
|
||||
DISAS_LOG("gsSPPopMatrixN(G_MTX_MODELVIEW, %d),", popmtx.param / 64);
|
||||
}
|
||||
} break;
|
||||
|
||||
|
@ -1102,21 +948,21 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
|
||||
if (clearbits == 0) {
|
||||
DISAS_LOG("gsSPLoadGeometryMode(");
|
||||
UCodeDisas_ParseGeometryMode(this, setbits);
|
||||
UCodeDisas_PrintGeometryMode(this, setbits);
|
||||
DISAS_LOG("),");
|
||||
} else if (setbits == 0) {
|
||||
DISAS_LOG("gsSPClearGeometryMode(");
|
||||
UCodeDisas_ParseGeometryMode(this, ~clearbits);
|
||||
UCodeDisas_PrintGeometryMode(this, ~clearbits);
|
||||
DISAS_LOG("),");
|
||||
} else if (clearbits == 0xFFFFFF) {
|
||||
DISAS_LOG("gsSPSetGeometryMode(");
|
||||
UCodeDisas_ParseGeometryMode(this, setbits);
|
||||
UCodeDisas_PrintGeometryMode(this, setbits);
|
||||
DISAS_LOG("),");
|
||||
} else {
|
||||
DISAS_LOG("gsSPGeometryMode(");
|
||||
UCodeDisas_ParseGeometryMode(this, ~clearbits);
|
||||
UCodeDisas_PrintGeometryMode(this, ~clearbits);
|
||||
DISAS_LOG(", ");
|
||||
UCodeDisas_ParseGeometryMode(this, setbits);
|
||||
UCodeDisas_PrintGeometryMode(this, setbits);
|
||||
DISAS_LOG("),");
|
||||
}
|
||||
|
||||
|
@ -1185,7 +1031,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
|
||||
case G_MV_MATRIX: {
|
||||
DISAS_LOG("gsSPForceMatrix(0x%08x),", movemem.data);
|
||||
ptr += 1;
|
||||
ptr += 2 - 1;
|
||||
} break;
|
||||
|
||||
case G_MV_LIGHT: {
|
||||
|
@ -1200,7 +1046,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
|
||||
default: {
|
||||
DISAS_LOG("gsSPLight(0x%08x,%d),", movemem.data,
|
||||
(movemem.offset * 8 - 24) / 24);
|
||||
(movemem.offset * 8 - 0x18) / 0x18);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
@ -1299,8 +1145,9 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
|
|||
|
||||
case G_SELECT_DL: {
|
||||
Gdma dma = ptr->dma;
|
||||
u32 dlAddr = (u32)UCodeDisas_TranslateAddr(this, (dma.len << 16) | (linkDlLow));
|
||||
u32 dmaAddr = dma.addr;
|
||||
uintptr_t dlAddr =
|
||||
(uintptr_t)UCodeDisas_TranslateAddr(this, (dma.len << 16) | (linkDlLow));
|
||||
uintptr_t dmaAddr = dma.addr;
|
||||
|
||||
if (dma.par == 0) {
|
||||
DISAS_LOG("gsSPSelectDL(0x%08x, %d, 0x%08x, 0x%08x),", dlAddr, sid, rdpHalf,
|
||||
|
|
|
@ -1953,15 +1953,14 @@ void Actor_DisableLens(PlayState* play) {
|
|||
}
|
||||
}
|
||||
|
||||
// Actor_InitContext
|
||||
void func_800304DC(PlayState* play, ActorContext* actorCtx, ActorEntry* actorEntry) {
|
||||
void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* playerEntry) {
|
||||
ActorOverlay* overlayEntry;
|
||||
SavedSceneFlags* savedSceneFlags;
|
||||
s32 i;
|
||||
|
||||
savedSceneFlags = &gSaveContext.sceneFlags[play->sceneId];
|
||||
|
||||
bzero(actorCtx, sizeof(*actorCtx));
|
||||
bzero(actorCtx, sizeof(ActorContext));
|
||||
|
||||
ActorOverlayTable_Init();
|
||||
Matrix_MtxFCopy(&play->billboardMtxF, &gMtxFClear);
|
||||
|
@ -1983,7 +1982,7 @@ void func_800304DC(PlayState* play, ActorContext* actorCtx, ActorEntry* actorEnt
|
|||
|
||||
actorCtx->absoluteSpace = NULL;
|
||||
|
||||
Actor_SpawnEntry(actorCtx, actorEntry, play);
|
||||
Actor_SpawnEntry(actorCtx, playerEntry, play);
|
||||
func_8002C0C0(&actorCtx->targetCtx, actorCtx->actorLists[ACTORCAT_PLAYER].head, play);
|
||||
func_8002FA60(play);
|
||||
}
|
||||
|
@ -2024,12 +2023,12 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
|
|||
sp74 = NULL;
|
||||
unkFlag = 0;
|
||||
|
||||
if (play->numSetupActors != 0) {
|
||||
actorEntry = &play->setupActorList[0];
|
||||
for (i = 0; i < play->numSetupActors; i++) {
|
||||
if (play->numActorEntries != 0) {
|
||||
actorEntry = &play->actorEntryList[0];
|
||||
for (i = 0; i < play->numActorEntries; i++) {
|
||||
Actor_SpawnEntry(&play->actorCtx, actorEntry++, play);
|
||||
}
|
||||
play->numSetupActors = 0;
|
||||
play->numActorEntries = 0;
|
||||
}
|
||||
|
||||
if (actorCtx->unk_02 != 0) {
|
||||
|
|
|
@ -156,11 +156,11 @@ void Camera_LERPCeilVec3f(Vec3f* target, Vec3f* cur, f32 yStepScale, f32 xzStepS
|
|||
|
||||
void func_80043ABC(Camera* camera) {
|
||||
camera->yawUpdateRateInv = 100.0f;
|
||||
camera->pitchUpdateRateInv = R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV;
|
||||
camera->rUpdateRateInv = OREG(6);
|
||||
camera->xzOffsetUpdateRate = CAM_DATA_SCALED(OREG(2));
|
||||
camera->yOffsetUpdateRate = CAM_DATA_SCALED(OREG(3));
|
||||
camera->fovUpdateRate = CAM_DATA_SCALED(OREG(4));
|
||||
camera->pitchUpdateRateInv = R_CAM_PITCH_UPDATE_RATE_INV;
|
||||
camera->rUpdateRateInv = R_CAM_R_UPDATE_RATE_INV;
|
||||
camera->xzOffsetUpdateRate = CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE);
|
||||
camera->yOffsetUpdateRate = CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE);
|
||||
camera->fovUpdateRate = CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE);
|
||||
}
|
||||
|
||||
void func_80043B60(Camera* camera) {
|
||||
|
@ -928,7 +928,8 @@ s32 Camera_CalcAtDefault(Camera* camera, VecGeo* eyeAtDir, f32 extraYOffset, s16
|
|||
|
||||
if (calcSlope) {
|
||||
posOffsetTarget.y -= OLib_ClampMaxDist(
|
||||
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, OREG(9)), yOffset);
|
||||
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT),
|
||||
yOffset);
|
||||
}
|
||||
|
||||
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate,
|
||||
|
@ -957,7 +958,8 @@ s32 func_800458D4(Camera* camera, VecGeo* eyeAtDir, f32 arg2, f32* arg3, s16 arg
|
|||
posOffsetTarget.z = 0.0f;
|
||||
|
||||
if (arg4) {
|
||||
posOffsetTarget.y -= Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, OREG(9));
|
||||
posOffsetTarget.y -=
|
||||
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT);
|
||||
}
|
||||
|
||||
deltaY = playerPosRot->pos.y - *arg3;
|
||||
|
@ -1005,7 +1007,7 @@ s32 func_80045B08(Camera* camera, VecGeo* eyeAtDir, f32 yExtra, s16 arg3) {
|
|||
phi_f2 = -Math_CosS(playerPosRot->rot.y - eyeAtDir->yaw);
|
||||
}
|
||||
|
||||
posOffsetTarget.y -= temp_ret * phi_f2 * OREG(9);
|
||||
posOffsetTarget.y -= temp_ret * phi_f2 * R_CAM_SLOPE_Y_ADJ_AMOUNT;
|
||||
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate,
|
||||
0.1f);
|
||||
|
||||
|
@ -1038,7 +1040,8 @@ s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32* arg
|
|||
posOffsetTarget.z = 0.0f;
|
||||
|
||||
if (PREG(76) && arg4) {
|
||||
posOffsetTarget.y -= Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, arg1->yaw, OREG(9));
|
||||
posOffsetTarget.y -=
|
||||
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, arg1->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT);
|
||||
}
|
||||
|
||||
if (camera->playerGroundY == camera->playerPosRot.pos.y || camera->player->actor.gravity > -0.1f ||
|
||||
|
@ -1110,7 +1113,7 @@ s32 Camera_CalcAtForLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f
|
|||
tmpPos0.y = playerHeight + yOffset;
|
||||
tmpPos0.z = 0.0f;
|
||||
if (PREG(76) && (flags & FLG_ADJSLOPE)) {
|
||||
tmpPos0.y -= Camera_CalcSlopeYAdj(floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, OREG(9));
|
||||
tmpPos0.y -= Camera_CalcSlopeYAdj(floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT);
|
||||
}
|
||||
|
||||
// tmpPos1 is player's head
|
||||
|
@ -1219,8 +1222,8 @@ s32 Camera_CalcAtForHorse(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* yP
|
|||
posOffsetTarget.z = 0.0f;
|
||||
|
||||
if (calcSlope != 0) {
|
||||
posOffsetTarget.y -=
|
||||
Camera_CalcSlopeYAdj(&camera->floorNorm, camera->playerPosRot.rot.y, eyeAtDir->yaw, OREG(9));
|
||||
posOffsetTarget.y -= Camera_CalcSlopeYAdj(&camera->floorNorm, camera->playerPosRot.rot.y, eyeAtDir->yaw,
|
||||
R_CAM_SLOPE_Y_ADJ_AMOUNT);
|
||||
}
|
||||
|
||||
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate,
|
||||
|
@ -1240,17 +1243,17 @@ f32 Camera_LERPClampDist(Camera* camera, f32 dist, f32 min, f32 max) {
|
|||
|
||||
if (dist < min) {
|
||||
distTarget = min;
|
||||
rUpdateRateInvTarget = OREG(6);
|
||||
rUpdateRateInvTarget = R_CAM_R_UPDATE_RATE_INV;
|
||||
} else if (dist > max) {
|
||||
distTarget = max;
|
||||
rUpdateRateInvTarget = OREG(6);
|
||||
rUpdateRateInvTarget = R_CAM_R_UPDATE_RATE_INV;
|
||||
} else {
|
||||
distTarget = dist;
|
||||
rUpdateRateInvTarget = 1.0f;
|
||||
}
|
||||
|
||||
camera->rUpdateRateInv =
|
||||
Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
camera->rUpdateRateInv = Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f);
|
||||
}
|
||||
|
||||
|
@ -1261,19 +1264,19 @@ f32 Camera_ClampDist(Camera* camera, f32 dist, f32 minDist, f32 maxDist, s16 tim
|
|||
if (dist < minDist) {
|
||||
distTarget = minDist;
|
||||
|
||||
rUpdateRateInvTarget = timer != 0 ? OREG(6) * 0.5f : OREG(6);
|
||||
rUpdateRateInvTarget = timer != 0 ? R_CAM_R_UPDATE_RATE_INV * 0.5f : R_CAM_R_UPDATE_RATE_INV;
|
||||
} else if (maxDist < dist) {
|
||||
distTarget = maxDist;
|
||||
|
||||
rUpdateRateInvTarget = timer != 0 ? OREG(6) * 0.5f : OREG(6);
|
||||
rUpdateRateInvTarget = timer != 0 ? R_CAM_R_UPDATE_RATE_INV * 0.5f : R_CAM_R_UPDATE_RATE_INV;
|
||||
} else {
|
||||
distTarget = dist;
|
||||
|
||||
rUpdateRateInvTarget = timer != 0 ? OREG(6) : 1.0f;
|
||||
rUpdateRateInvTarget = timer != 0 ? R_CAM_R_UPDATE_RATE_INV : 1.0f;
|
||||
}
|
||||
|
||||
camera->rUpdateRateInv =
|
||||
Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
camera->rUpdateRateInv = Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f);
|
||||
}
|
||||
|
||||
|
@ -1519,9 +1522,9 @@ s32 Camera_Normal1(Camera* camera) {
|
|||
rwData->startSwingTimer--;
|
||||
}
|
||||
|
||||
spA0 = camera->speedRatio * CAM_DATA_SCALED(OREG(25));
|
||||
sp9C = camera->speedRatio * CAM_DATA_SCALED(OREG(26));
|
||||
sp98 = rwData->swing.unk_18 != 0 ? CAM_DATA_SCALED(OREG(25)) : spA0;
|
||||
spA0 = camera->speedRatio * CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ);
|
||||
sp9C = camera->speedRatio * CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y);
|
||||
sp98 = rwData->swing.unk_18 != 0 ? CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) : spA0;
|
||||
|
||||
sp94 = (camera->xzSpeed - rwData->unk_20) * (0.333333f);
|
||||
if (sp94 > 1.0f) {
|
||||
|
@ -1538,7 +1541,7 @@ s32 Camera_Normal1(Camera* camera) {
|
|||
Camera_LERPCeilF(rwData->swing.swingUpdateRate + (f32)(rwData->swing.swingUpdateRateTimer * 2),
|
||||
camera->yawUpdateRateInv, sp98, rate);
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF((f32)R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV + (f32)(rwData->swing.swingUpdateRateTimer * 2),
|
||||
Camera_LERPCeilF((f32)R_CAM_PITCH_UPDATE_RATE_INV + (f32)(rwData->swing.swingUpdateRateTimer * 2),
|
||||
camera->pitchUpdateRateInv, sp9C, rate);
|
||||
rwData->swing.swingUpdateRateTimer--;
|
||||
} else {
|
||||
|
@ -1546,15 +1549,16 @@ s32 Camera_Normal1(Camera* camera) {
|
|||
((OREG(49) * 0.01f) * rwData->swing.swingUpdateRate * sp94),
|
||||
camera->yawUpdateRateInv, sp98, rate);
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF(R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp9C, rate);
|
||||
Camera_LERPCeilF(R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp9C, rate);
|
||||
}
|
||||
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF(R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp9C, rate);
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, spA0, rate);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, sp9C, rate);
|
||||
camera->fovUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, camera->speedRatio * 0.05f, rate);
|
||||
camera->pitchUpdateRateInv = Camera_LERPCeilF(R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp9C, rate);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, spA0, rate);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, sp9C, rate);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate,
|
||||
camera->speedRatio * 0.05f, rate);
|
||||
|
||||
if (roData->interfaceFlags & 1) {
|
||||
t = Camera_GetPitchAdjFromFloorHeightDiffs(camera, atEyeGeo.yaw - 0x7FFF, false);
|
||||
|
@ -1752,17 +1756,18 @@ s32 Camera_Normal2(Camera* camera) {
|
|||
OLib_Vec3fDiffToVecGeo(&atToEyeNextDir, at, eyeNext);
|
||||
|
||||
camera->speedRatio *= 0.5f;
|
||||
spA4 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio;
|
||||
spA0 = CAM_DATA_SCALED(OREG(26)) * camera->speedRatio;
|
||||
spA4 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
|
||||
spA0 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio;
|
||||
|
||||
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->unk_0C, camera->yawUpdateRateInv * camera->speedRatio,
|
||||
CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF(R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, spA0, 0.1f);
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, spA4, 0.1f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, spA0, 0.1f);
|
||||
camera->fovUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, camera->speedRatio * 0.05f, 0.1f);
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
camera->pitchUpdateRateInv = Camera_LERPCeilF(R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, spA0, 0.1f);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, spA4, 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, spA0, 0.1f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate,
|
||||
camera->speedRatio * 0.05f, 0.1f);
|
||||
|
||||
if (!(roData->interfaceFlags & 0x80)) {
|
||||
Camera_CalcAtDefault(camera, &atToEyeNextDir, roData->unk_00, roData->interfaceFlags & 1);
|
||||
|
@ -1900,26 +1905,28 @@ s32 Camera_Normal3(Camera* camera) {
|
|||
rwData->distTimer--;
|
||||
}
|
||||
|
||||
sp98 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio;
|
||||
sp94 = CAM_DATA_SCALED(OREG(26)) * camera->speedRatio;
|
||||
sp98 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
|
||||
sp94 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio;
|
||||
|
||||
if (rwData->swing.swingUpdateRateTimer != 0) {
|
||||
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpdateSpeed + (rwData->swing.swingUpdateRateTimer * 2),
|
||||
camera->yawUpdateRateInv, sp98, 0.1f);
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF((f32)R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV + (rwData->swing.swingUpdateRateTimer * 2),
|
||||
Camera_LERPCeilF((f32)R_CAM_PITCH_UPDATE_RATE_INV + (rwData->swing.swingUpdateRateTimer * 2),
|
||||
camera->pitchUpdateRateInv, sp94, 0.1f);
|
||||
if (1) {}
|
||||
rwData->swing.swingUpdateRateTimer--;
|
||||
} else {
|
||||
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpdateSpeed, camera->yawUpdateRateInv, sp98, 0.1f);
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF(R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp94, 0.1f);
|
||||
Camera_LERPCeilF(R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp94, 0.1f);
|
||||
}
|
||||
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, sp98, 0.1f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, sp94, 0.1f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->fovUpdateRate, sp94, 0.1f);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, sp98, 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, sp94, 0.1f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->fovUpdateRate, sp94, 0.1f);
|
||||
|
||||
t2 = Camera_GetPitchAdjFromFloorHeightDiffs(camera, sp7C.yaw - 0x7FFF, true);
|
||||
sp94 = ((1.0f / roData->unk_10) * 0.5f);
|
||||
|
@ -2079,16 +2086,18 @@ s32 Camera_Parallel1(Camera* camera) {
|
|||
camera->animState = 1;
|
||||
}
|
||||
|
||||
spB8 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio;
|
||||
spB4 = CAM_DATA_SCALED(OREG(26)) * camera->speedRatio;
|
||||
spB8 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
|
||||
spB4 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio;
|
||||
|
||||
camera->rUpdateRateInv = Camera_LERPCeilF(OREG(6), camera->rUpdateRateInv, spB8, 0.1f);
|
||||
camera->rUpdateRateInv = Camera_LERPCeilF(R_CAM_R_UPDATE_RATE_INV, camera->rUpdateRateInv, spB8, 0.1f);
|
||||
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->unk_08, camera->yawUpdateRateInv, spB8, 0.1f);
|
||||
camera->pitchUpdateRateInv = Camera_LERPCeilF(2.0f, camera->pitchUpdateRateInv, spB4, 0.1f);
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, spB8, 0.1f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, spB4, 0.1f);
|
||||
camera->fovUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.1f);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, spB8, 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, spB4, 0.1f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->fovUpdateRate,
|
||||
camera->speedRatio * 0.05f, 0.1f);
|
||||
|
||||
if (roData->interfaceFlags & 1) {
|
||||
tangle = Camera_GetPitchAdjFromFloorHeightDiffs(camera, atToEyeDir.yaw - 0x7FFF, true);
|
||||
|
@ -2263,24 +2272,27 @@ s32 Camera_Jump1(Camera* camera) {
|
|||
}
|
||||
|
||||
if (rwData->swing.swingUpdateRateTimer != 0) {
|
||||
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpateRateTarget + rwData->swing.swingUpdateRateTimer,
|
||||
camera->yawUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f);
|
||||
camera->yawUpdateRateInv =
|
||||
Camera_LERPCeilF(roData->yawUpateRateTarget + rwData->swing.swingUpdateRateTimer, camera->yawUpdateRateInv,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF((f32)R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV + rwData->swing.swingUpdateRateTimer,
|
||||
camera->pitchUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f);
|
||||
Camera_LERPCeilF((f32)R_CAM_PITCH_UPDATE_RATE_INV + rwData->swing.swingUpdateRateTimer,
|
||||
camera->pitchUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
|
||||
rwData->swing.swingUpdateRateTimer--;
|
||||
} else {
|
||||
camera->yawUpdateRateInv =
|
||||
Camera_LERPCeilF(roData->yawUpateRateTarget, camera->yawUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f);
|
||||
camera->pitchUpdateRateInv = Camera_LERPCeilF((f32)R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV,
|
||||
camera->pitchUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f);
|
||||
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpateRateTarget, camera->yawUpdateRateInv,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
|
||||
camera->pitchUpdateRateInv = Camera_LERPCeilF((f32)R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
|
||||
}
|
||||
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, CAM_DATA_SCALED(OREG(26)), 0.1f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, 0.05f, 0.1f);
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
|
||||
camera->fovUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate, 0.05f, 0.1f);
|
||||
|
||||
func_800458D4(camera, &eyeNextAtOffset, roData->atYOffset, &rwData->unk_1C, 0);
|
||||
|
||||
|
@ -2318,7 +2330,7 @@ s32 Camera_Jump1(Camera* camera) {
|
|||
Camera_AddVecGeoToVec3f(&newEye, at, &eyeDiffGeo);
|
||||
eyeNext->x = newEye.x;
|
||||
eyeNext->z = newEye.z;
|
||||
eyeNext->y += (newEye.y - eyeNext->y) * CAM_DATA_SCALED(OREG(31));
|
||||
eyeNext->y += (newEye.y - eyeNext->y) * CAM_DATA_SCALED(R_CAM_JUMP1_EYE_Y_STEP_SCALE);
|
||||
if ((camera->status == CAM_STAT_ACTIVE) && !(roData->interfaceFlags & 0x10)) {
|
||||
func_80046E20(camera, &eyeDiffGeo, roData->distMin, roData->yawUpateRateTarget, &spA4, &rwData->swing);
|
||||
if (roData->interfaceFlags & 4) {
|
||||
|
@ -2435,14 +2447,15 @@ s32 Camera_Jump2(Camera* camera) {
|
|||
camera->atLERPStepScale = roData->atLERPStepScale;
|
||||
}
|
||||
|
||||
sp90 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio;
|
||||
sp8C = CAM_DATA_SCALED(OREG(26)) * camera->speedRatio;
|
||||
sp90 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
|
||||
sp8C = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio;
|
||||
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpdRateTarget, camera->yawUpdateRateInv, sp90, 0.1f);
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(roData->xzUpdRateTarget, camera->xzOffsetUpdateRate, sp90, 0.1f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, sp8C, 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, sp8C, 0.1f);
|
||||
|
||||
camera->fovUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, camera->speedRatio * 0.05f, 0.1f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate,
|
||||
camera->speedRatio * 0.05f, 0.1f);
|
||||
camera->rUpdateRateInv = OREG(27);
|
||||
|
||||
Camera_CalcAtDefault(camera, &atToEyeNextDir, roData->atYOffset, 0);
|
||||
|
@ -2481,14 +2494,16 @@ s32 Camera_Jump2(Camera* camera) {
|
|||
if ((sp90 != BGCHECK_Y_MIN) && (playerPosRot->pos.y < sp90)) {
|
||||
// top of the climb is within 2.2x of the player's height.
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF(20.0f, camera->pitchUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f);
|
||||
camera->rUpdateRateInv = Camera_LERPCeilF(20.0f, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f);
|
||||
Camera_LERPCeilF(20.0f, camera->pitchUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
|
||||
camera->rUpdateRateInv =
|
||||
Camera_LERPCeilF(20.0f, camera->rUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
|
||||
adjAtToEyeDir.pitch = Camera_LERPCeilS(0x1F4, atToEyeNextDir.pitch, 1.0f / camera->pitchUpdateRateInv, 0xA);
|
||||
} else if ((playerPosRot->pos.y - rwData->floorY) < playerHeight) {
|
||||
// player is within his height of the ground.
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF(20.0f, camera->pitchUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f);
|
||||
camera->rUpdateRateInv = Camera_LERPCeilF(20.0f, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f);
|
||||
Camera_LERPCeilF(20.0f, camera->pitchUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
|
||||
camera->rUpdateRateInv =
|
||||
Camera_LERPCeilF(20.0f, camera->rUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
|
||||
adjAtToEyeDir.pitch = Camera_LERPCeilS(0x1F4, atToEyeNextDir.pitch, 1.0f / camera->pitchUpdateRateInv, 0xA);
|
||||
} else {
|
||||
camera->pitchUpdateRateInv = 100.0f;
|
||||
|
@ -2630,9 +2645,9 @@ s32 Camera_Jump3(Camera* camera) {
|
|||
|
||||
spB0 = *eye;
|
||||
|
||||
spC4 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio;
|
||||
spC0 = camera->speedRatio * CAM_DATA_SCALED(OREG(26));
|
||||
spBC = rwData->swing.unk_18 != 0 ? CAM_DATA_SCALED(OREG(25)) : spC4;
|
||||
spC4 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
|
||||
spC0 = camera->speedRatio * CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y);
|
||||
spBC = rwData->swing.unk_18 != 0 ? CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) : spC4;
|
||||
|
||||
if (rwData->swing.swingUpdateRateTimer != 0) {
|
||||
camera->yawUpdateRateInv =
|
||||
|
@ -2647,10 +2662,12 @@ s32 Camera_Jump3(Camera* camera) {
|
|||
camera->pitchUpdateRateInv = Camera_LERPCeilF(40.0f, camera->pitchUpdateRateInv, spC0, 0.1f);
|
||||
}
|
||||
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, spC4, 0.1f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, spC0, 0.1f);
|
||||
camera->fovUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, camera->speedRatio * 0.05f, 0.1f);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, spC4, 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, spC0, 0.1f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate,
|
||||
camera->speedRatio * 0.05f, 0.1f);
|
||||
|
||||
Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, roData->interfaceFlags);
|
||||
OLib_Vec3fDiffToVecGeo(&eyeDiffGeo, at, eyeNext);
|
||||
|
@ -2805,12 +2822,13 @@ s32 Camera_Battle1(Camera* camera) {
|
|||
|
||||
if (camera->player->stateFlags1 & PLAYER_STATE1_12) {
|
||||
// charging sword.
|
||||
rwData->unk_10 =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(12)) * 0.5f, rwData->unk_10, CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
rwData->unk_10 = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(12)) * 0.5f, rwData->unk_10,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(0.2f, camera->xzOffsetUpdateRate, CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(0.2f, camera->yOffsetUpdateRate, CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
if (rwData->chargeTimer >= -19) {
|
||||
Camera_LERPCeilF(0.2f, camera->xzOffsetUpdateRate, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(0.2f, camera->yOffsetUpdateRate, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
if (rwData->chargeTimer > -20) {
|
||||
rwData->chargeTimer--;
|
||||
} else {
|
||||
distance = 250.0f;
|
||||
|
@ -2826,14 +2844,17 @@ s32 Camera_Battle1(Camera* camera) {
|
|||
rwData->chargeTimer++;
|
||||
} else {
|
||||
rwData->chargeTimer = 40;
|
||||
rwData->unk_10 = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(12)), rwData->unk_10, CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(40)), camera->xzOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(OREG(25)) * camera->speedRatio, 0.1f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(40)), camera->yOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(OREG(26)) * camera->speedRatio, 0.1f);
|
||||
rwData->unk_10 = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(12)), rwData->unk_10,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_BATTLE1_XYZ_OFFSET_UPDATE_RATE_TARGET), camera->xzOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio, 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_BATTLE1_XYZ_OFFSET_UPDATE_RATE_TARGET), camera->yOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio, 0.1f);
|
||||
}
|
||||
camera->fovUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.1f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->fovUpdateRate,
|
||||
camera->speedRatio * 0.05f, 0.1f);
|
||||
playerHeight += roData->yOffset;
|
||||
OLib_Vec3fDiffToVecGeo(&atToEyeDir, at, eye);
|
||||
OLib_Vec3fDiffToVecGeo(&atToEyeNextDir, at, eyeNext);
|
||||
|
@ -2980,7 +3001,8 @@ s32 Camera_Battle1(Camera* camera) {
|
|||
*eye = *eyeNext;
|
||||
}
|
||||
}
|
||||
rwData->roll += (((OREG(36) * camera->speedRatio) * (1.0f - distRatio)) - rwData->roll) * CAM_DATA_SCALED(OREG(37));
|
||||
rwData->roll += ((R_CAM_BATTLE1_ROLL_TARGET_BASE * camera->speedRatio * (1.0f - distRatio)) - rwData->roll) *
|
||||
CAM_DATA_SCALED(R_CAM_BATTLE1_ROLL_STEP_SCALE);
|
||||
camera->roll = CAM_DEG_TO_BINANG(rwData->roll);
|
||||
camera->fov = Camera_LERPCeilF((player->meleeWeaponState != 0 ? 0.8f
|
||||
: gSaveContext.health <= 0x10 ? 0.8f
|
||||
|
@ -3047,13 +3069,16 @@ s32 Camera_Battle4(Camera* camera) {
|
|||
break;
|
||||
}
|
||||
|
||||
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->lerpUpdateRate, camera->yawUpdateRateInv,
|
||||
CAM_DATA_SCALED(OREG(25)) * camera->speedRatio, 0.1f);
|
||||
camera->yawUpdateRateInv =
|
||||
Camera_LERPCeilF(roData->lerpUpdateRate, camera->yawUpdateRateInv,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio, 0.1f);
|
||||
camera->rUpdateRateInv = 1000.0f;
|
||||
camera->pitchUpdateRateInv = 1000.0f;
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(0.025f, camera->xzOffsetUpdateRate, CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(OREG(26)) * camera->speedRatio, 0.1f);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(0.025f, camera->xzOffsetUpdateRate, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio, 0.1f);
|
||||
camera->fovUpdateRate = 0.0001f;
|
||||
Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, 1);
|
||||
if (rwData->animTimer != 0) {
|
||||
|
@ -3191,12 +3216,14 @@ s32 Camera_KeepOn1(Camera* camera) {
|
|||
rwData->unk_0C = camera->target;
|
||||
camera->atLERPStepScale = 0.0f;
|
||||
}
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(1.0f, camera->xzOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(OREG(25)) * camera->speedRatio, 0.1f);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(1.0f, camera->xzOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio, 0.1f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(1.0f, camera->yOffsetUpdateRate, CAM_DATA_SCALED(OREG(26)) * camera->speedRatio, 0.1f);
|
||||
camera->fovUpdateRate =
|
||||
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.1f);
|
||||
Camera_LERPCeilF(1.0f, camera->yOffsetUpdateRate,
|
||||
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio, 0.1f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->fovUpdateRate,
|
||||
camera->speedRatio * 0.05f, 0.1f);
|
||||
goto cont;
|
||||
case 0x10:
|
||||
rwData->unk_0C = NULL;
|
||||
|
@ -3225,16 +3252,17 @@ s32 Camera_KeepOn1(Camera* camera) {
|
|||
OLib_Vec3fDiffToVecGeo(&spD8, at, eyeNext);
|
||||
if (spD8.r < roData->unk_04) {
|
||||
sp104 = roData->unk_04;
|
||||
spE8 = OREG(6);
|
||||
spE8 = R_CAM_R_UPDATE_RATE_INV;
|
||||
} else if (roData->unk_08 < spD8.r) {
|
||||
sp104 = roData->unk_08;
|
||||
spE8 = OREG(6);
|
||||
spE8 = R_CAM_R_UPDATE_RATE_INV;
|
||||
} else {
|
||||
sp104 = spD8.r;
|
||||
spE8 = 1.0f;
|
||||
}
|
||||
|
||||
camera->rUpdateRateInv = Camera_LERPCeilF(spE8, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(25)), 0.1f);
|
||||
camera->rUpdateRateInv =
|
||||
Camera_LERPCeilF(spE8, camera->rUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
|
||||
spD8.r = spE8 = camera->dist = Camera_LERPCeilF(sp104, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f);
|
||||
sp108 = camera->targetPosRot.pos;
|
||||
OLib_Vec3fDiffToVecGeo(&spD0, at, &sp108);
|
||||
|
@ -4622,11 +4650,15 @@ s32 Camera_Unique1(Camera* camera) {
|
|||
|
||||
Actor_GetFocus(&playerhead, &camera->player->actor); // unused
|
||||
|
||||
camera->yawUpdateRateInv = Camera_LERPCeilF(100.0f, camera->yawUpdateRateInv, OREG(25) * 0.01f, 0.1f);
|
||||
camera->pitchUpdateRateInv = Camera_LERPCeilF(100.0f, camera->pitchUpdateRateInv, OREG(25) * 0.01f, 0.1f);
|
||||
camera->xzOffsetUpdateRate = Camera_LERPCeilF(0.005f, camera->xzOffsetUpdateRate, OREG(25) * 0.01f, 0.01f);
|
||||
camera->yOffsetUpdateRate = Camera_LERPCeilF(0.01f, camera->yOffsetUpdateRate, OREG(26) * 0.01f, 0.01f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(OREG(4) * 0.01f, camera->fovUpdateRate, 0.05f, 0.1f);
|
||||
camera->yawUpdateRateInv =
|
||||
Camera_LERPCeilF(100.0f, camera->yawUpdateRateInv, R_CAM_UPDATE_RATE_STEP_SCALE_XZ * 0.01f, 0.1f);
|
||||
camera->pitchUpdateRateInv =
|
||||
Camera_LERPCeilF(100.0f, camera->pitchUpdateRateInv, R_CAM_UPDATE_RATE_STEP_SCALE_XZ * 0.01f, 0.1f);
|
||||
camera->xzOffsetUpdateRate =
|
||||
Camera_LERPCeilF(0.005f, camera->xzOffsetUpdateRate, R_CAM_UPDATE_RATE_STEP_SCALE_XZ * 0.01f, 0.01f);
|
||||
camera->yOffsetUpdateRate =
|
||||
Camera_LERPCeilF(0.01f, camera->yOffsetUpdateRate, R_CAM_UPDATE_RATE_STEP_SCALE_Y * 0.01f, 0.01f);
|
||||
camera->fovUpdateRate = Camera_LERPCeilF(R_CAM_FOV_UPDATE_RATE * 0.01f, camera->fovUpdateRate, 0.05f, 0.1f);
|
||||
|
||||
Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, 1);
|
||||
OLib_Vec3fDiffToVecGeo(&sp8C, at, eyeNext);
|
||||
|
@ -6563,8 +6595,8 @@ s32 Camera_Special5(Camera* camera) {
|
|||
}
|
||||
|
||||
Camera_CalcAtDefault(camera, &sp5C, roData->yOffset, 0);
|
||||
camera->fov =
|
||||
Camera_LERPCeilF(roData->fovTarget, camera->fov, camera->atLERPStepScale * CAM_DATA_SCALED(OREG(4)), 1.0f);
|
||||
camera->fov = Camera_LERPCeilF(roData->fovTarget, camera->fov,
|
||||
camera->atLERPStepScale * CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), 1.0f);
|
||||
camera->roll = Camera_LERPCeilS(0, camera->roll, 0.5f, 0xA);
|
||||
camera->atLERPStepScale = Camera_ClampLERPScale(camera, roData->atMaxLERPScale);
|
||||
return true;
|
||||
|
@ -6958,10 +6990,10 @@ void Camera_Init(Camera* camera, View* view, CollisionContext* colCtx, PlayState
|
|||
camera->up.y = 1.0f;
|
||||
camera->up.z = 0.0f;
|
||||
camera->fov = 60.0f;
|
||||
camera->pitchUpdateRateInv = R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV;
|
||||
camera->xzOffsetUpdateRate = CAM_DATA_SCALED(OREG(2));
|
||||
camera->yOffsetUpdateRate = CAM_DATA_SCALED(OREG(3));
|
||||
camera->fovUpdateRate = CAM_DATA_SCALED(OREG(4));
|
||||
camera->pitchUpdateRateInv = R_CAM_PITCH_UPDATE_RATE_INV;
|
||||
camera->xzOffsetUpdateRate = CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE);
|
||||
camera->yOffsetUpdateRate = CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE);
|
||||
camera->fovUpdateRate = CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE);
|
||||
sCameraLetterboxSize = 32;
|
||||
sCameraInterfaceAlpha = 0;
|
||||
camera->unk_14C = 0;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -437,14 +437,14 @@ void Cutscene_Command_SetLighting(PlayState* play, CutsceneContext* csCtx, CsCmd
|
|||
// Command 0x56: Play Background Music
|
||||
void Cutscene_Command_PlayBGM(PlayState* play, CutsceneContext* csCtx, CsCmdMusicChange* cmd) {
|
||||
if (csCtx->frames == cmd->startFrame) {
|
||||
func_800F595C(cmd->sequence - 1);
|
||||
Audio_PlaySequenceInCutscene(cmd->sequence - 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Command 0x57: Stop Background Music
|
||||
void Cutscene_Command_StopBGM(PlayState* play, CutsceneContext* csCtx, CsCmdMusicChange* cmd) {
|
||||
if (csCtx->frames == cmd->startFrame) {
|
||||
func_800F59E8(cmd->sequence - 1);
|
||||
Audio_StopSequenceInCutscene(cmd->sequence - 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,60 +1,69 @@
|
|||
#include "global.h"
|
||||
#include "z64elf_message.h"
|
||||
#include "z64quest_hint_commands.h"
|
||||
|
||||
ElfMessage sChildSariaMsgs[] = {
|
||||
ELF_MSG_STRENGTH_UPG(SKIP, 3, false, 0),
|
||||
ELF_MSG_FLAG(CHECK, 0x61, false, EVENTCHKINF_37),
|
||||
ELF_MSG_END(0x64),
|
||||
ELF_MSG_FLAG(CHECK, 0x62, false, EVENTCHKINF_25),
|
||||
ELF_MSG_FLAG(CHECK, 0x63, false, EVENTCHKINF_37),
|
||||
ELF_MSG_FLAG(CHECK, 0x65, false, EVENTCHKINF_43),
|
||||
ELF_MSG_MEDALLION(CHECK, 0x66, false, ITEM_MEDALLION_FOREST),
|
||||
ELF_MSG_MEDALLION(CHECK, 0x66, false, ITEM_MEDALLION_FIRE),
|
||||
ELF_MSG_MEDALLION(CHECK, 0x66, false, ITEM_MEDALLION_WATER),
|
||||
ELF_MSG_SONG(CHECK, 0x67, false, ITEM_SONG_STORMS),
|
||||
ELF_MSG_MEDALLION(CHECK, 0x68, false, ITEM_MEDALLION_SPIRIT),
|
||||
ELF_MSG_MEDALLION(CHECK, 0x68, false, ITEM_MEDALLION_SHADOW),
|
||||
ELF_MSG_END(0x69),
|
||||
QuestHintCmd sChildSariaQuestHints[] = {
|
||||
QUEST_HINT_STRENGTH_UPG(SKIP, 0, false, 3),
|
||||
QUEST_HINT_FLAG(CHECK, EVENTCHKINF_37, false, 0x61),
|
||||
QUEST_HINT_END(0x64),
|
||||
|
||||
QUEST_HINT_FLAG(CHECK, EVENTCHKINF_25, false, 0x62),
|
||||
QUEST_HINT_FLAG(CHECK, EVENTCHKINF_37, false, 0x63),
|
||||
QUEST_HINT_FLAG(CHECK, EVENTCHKINF_43, false, 0x65),
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FOREST, false, 0x66),
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FIRE, false, 0x66),
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_WATER, false, 0x66),
|
||||
QUEST_HINT_SONG(CHECK, ITEM_SONG_STORMS, false, 0x67),
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SPIRIT, false, 0x68),
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SHADOW, false, 0x68),
|
||||
QUEST_HINT_END(0x69),
|
||||
};
|
||||
|
||||
ElfMessage sAdultSariaMsgs[] = {
|
||||
ELF_MSG_MEDALLION(CHECK, 0x6A, false, ITEM_MEDALLION_FOREST),
|
||||
ELF_MSG_MEDALLION(CHECK, 0x6B, false, ITEM_MEDALLION_FIRE),
|
||||
ELF_MSG_MEDALLION(CHECK, 0x6B, false, ITEM_MEDALLION_WATER),
|
||||
ELF_MSG_MEDALLION(CHECK, 0x6C, false, ITEM_MEDALLION_SPIRIT),
|
||||
ELF_MSG_MEDALLION(CHECK, 0x6C, false, ITEM_MEDALLION_SHADOW),
|
||||
ELF_MSG_END(0x6D),
|
||||
QuestHintCmd sAdultSariaQuestHints[] = {
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FOREST, false, 0x6A),
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FIRE, false, 0x6B),
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_WATER, false, 0x6B),
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SPIRIT, false, 0x6C),
|
||||
QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SHADOW, false, 0x6C),
|
||||
QUEST_HINT_END(0x6D),
|
||||
};
|
||||
|
||||
u32 ElfMessage_CheckCondition(ElfMessage* msg) {
|
||||
s32 type = msg->byte0 & 0x1E;
|
||||
u32 QuestHint_CheckCondition(QuestHintCmd* hintCmd) {
|
||||
s32 type = hintCmd->byte0 & 0x1E;
|
||||
u16 flag;
|
||||
|
||||
switch (type) {
|
||||
case (ELF_MSG_CONDITION_FLAG << 1):
|
||||
flag = 1 << (msg->byte1 & 0x0F);
|
||||
return ((msg->byte0 & 1) == 1) == ((flag & gSaveContext.eventChkInf[(msg->byte1 & 0xF0) >> 4]) != 0);
|
||||
case (ELF_MSG_CONDITION_DUNGEON_ITEM << 1):
|
||||
return ((msg->byte0 & 1) == 1) ==
|
||||
(CHECK_DUNGEON_ITEM(msg->byte1 - ITEM_KEY_BOSS, gSaveContext.mapIndex) != 0);
|
||||
case (ELF_MSG_CONDITION_ITEM << 1):
|
||||
return ((msg->byte0 & 1) == 1) == (msg->byte3 == INV_CONTENT(msg->byte1));
|
||||
case (ELF_MSG_CONDITION_OTHER << 1):
|
||||
switch (msg->byte1 & 0xF0) {
|
||||
case (ELF_MSG_CONDITION_STRENGTH_UPG << 4):
|
||||
return ((msg->byte0 & 1) == 1) == ((msg->byte1 & 0x0F) == CUR_UPG_VALUE(UPG_STRENGTH));
|
||||
case (ELF_MSG_CONDITION_BOOTS << 4):
|
||||
return ((msg->byte0 & 1) == 1) ==
|
||||
case (QUEST_HINT_CONDITION_FLAG << 1):
|
||||
flag = 1 << (hintCmd->byte1 & 0x0F);
|
||||
return ((hintCmd->byte0 & 1) == 1) ==
|
||||
((flag & gSaveContext.eventChkInf[(hintCmd->byte1 & 0xF0) >> 4]) != 0);
|
||||
|
||||
case (QUEST_HINT_CONDITION_DUNGEON_ITEM << 1):
|
||||
return ((hintCmd->byte0 & 1) == 1) ==
|
||||
(CHECK_DUNGEON_ITEM(hintCmd->byte1 - ITEM_KEY_BOSS, gSaveContext.mapIndex) != 0);
|
||||
|
||||
case (QUEST_HINT_CONDITION_ITEM << 1):
|
||||
return ((hintCmd->byte0 & 1) == 1) == (hintCmd->byte3 == INV_CONTENT(hintCmd->byte1));
|
||||
|
||||
case (QUEST_HINT_CONDITION_OTHER << 1):
|
||||
switch (hintCmd->byte1 & 0xF0) {
|
||||
case (QUEST_HINT_CONDITION_STRENGTH_UPG << 4):
|
||||
return ((hintCmd->byte0 & 1) == 1) == ((hintCmd->byte1 & 0x0F) == CUR_UPG_VALUE(UPG_STRENGTH));
|
||||
|
||||
case (QUEST_HINT_CONDITION_BOOTS << 4):
|
||||
return ((hintCmd->byte0 & 1) == 1) ==
|
||||
(CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS,
|
||||
msg->byte3 - ITEM_BOOTS_KOKIRI + EQUIP_INV_BOOTS_KOKIRI) != 0);
|
||||
case (ELF_MSG_CONDITION_SONG << 4):
|
||||
return ((msg->byte0 & 1) == 1) ==
|
||||
(CHECK_QUEST_ITEM(msg->byte3 - ITEM_SONG_MINUET + QUEST_SONG_MINUET) != 0);
|
||||
case (ELF_MSG_CONDITION_MEDALLION << 4):
|
||||
return ((msg->byte0 & 1) == 1) ==
|
||||
(CHECK_QUEST_ITEM(msg->byte3 - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST) != 0);
|
||||
case (ELF_MSG_CONDITION_MAGIC << 4):
|
||||
return ((msg->byte0 & 1) == 1) == (((void)0, gSaveContext.isMagicAcquired) != 0);
|
||||
hintCmd->byte3 - ITEM_BOOTS_KOKIRI + EQUIP_INV_BOOTS_KOKIRI) != 0);
|
||||
|
||||
case (QUEST_HINT_CONDITION_SONG << 4):
|
||||
return ((hintCmd->byte0 & 1) == 1) ==
|
||||
(CHECK_QUEST_ITEM(hintCmd->byte3 - ITEM_SONG_MINUET + QUEST_SONG_MINUET) != 0);
|
||||
|
||||
case (QUEST_HINT_CONDITION_MEDALLION << 4):
|
||||
return ((hintCmd->byte0 & 1) == 1) ==
|
||||
(CHECK_QUEST_ITEM(hintCmd->byte3 - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST) != 0);
|
||||
|
||||
case (QUEST_HINT_CONDITION_MAGIC << 4):
|
||||
return ((hintCmd->byte0 & 1) == 1) == (((void)0, gSaveContext.isMagicAcquired) != 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -64,111 +73,126 @@ u32 ElfMessage_CheckCondition(ElfMessage* msg) {
|
|||
return false;
|
||||
}
|
||||
|
||||
u32 func_8006BE88(ElfMessage** msgp) {
|
||||
u32 temp = true;
|
||||
u32 QuestHint_CheckConditionChain(QuestHintCmd** hintCmdPtr) {
|
||||
u32 allConditionsMet = true;
|
||||
|
||||
while (((*msgp)->byte0 & 0xE0) == (ELF_MSG_TYPE_UNK_1 << 5)) {
|
||||
if (!ElfMessage_CheckCondition(*msgp)) {
|
||||
temp = false;
|
||||
while (((*hintCmdPtr)->byte0 & 0xE0) == (QUEST_HINT_TYPE_CHAIN << 5)) {
|
||||
// if any of the conditions checked in the chain are not met,
|
||||
// the whole chain is considered false
|
||||
if (!QuestHint_CheckCondition(*hintCmdPtr)) {
|
||||
allConditionsMet = false;
|
||||
}
|
||||
*msgp += 1;
|
||||
|
||||
*hintCmdPtr += 1;
|
||||
}
|
||||
|
||||
if (temp) {
|
||||
return ElfMessage_CheckCondition(*msgp);
|
||||
if (allConditionsMet) {
|
||||
return QuestHint_CheckCondition(*hintCmdPtr);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
u32 func_8006BF1C(ElfMessage** msgp) {
|
||||
ElfMessage* msg = *msgp;
|
||||
u32 sp44[10];
|
||||
s32 temp1 = 0;
|
||||
s32 temp2 = 0;
|
||||
s32 temp3;
|
||||
u32 QuestHint_CheckRandomCondition(QuestHintCmd** hintCmdPtr) {
|
||||
QuestHintCmd* hintCmd = *hintCmdPtr;
|
||||
u32 conditions[10];
|
||||
s32 i = 0;
|
||||
s32 totalChecked = 0;
|
||||
s32 rand;
|
||||
|
||||
do {
|
||||
sp44[temp2] = ElfMessage_CheckCondition(msg);
|
||||
temp1 += sp44[temp2];
|
||||
temp2++;
|
||||
msg++;
|
||||
} while ((msg->byte0 & 0xE0) == (ELF_MSG_TYPE_UNK_2 << 5));
|
||||
conditions[totalChecked] = QuestHint_CheckCondition(hintCmd);
|
||||
// i is incremented if the condition was met
|
||||
i += conditions[totalChecked];
|
||||
totalChecked++;
|
||||
hintCmd++;
|
||||
} while ((hintCmd->byte0 & 0xE0) == (QUEST_HINT_TYPE_RANDOM << 5));
|
||||
|
||||
if (temp1 == 0) {
|
||||
// if none of the conditions checked were satisfied, there are none to use
|
||||
if (i == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
temp3 = Rand_ZeroFloat(temp1);
|
||||
for (temp1 = 0; temp1 < temp2; temp1++) {
|
||||
if (sp44[temp1]) {
|
||||
if (temp3 > 0) {
|
||||
temp3--;
|
||||
// choose a random number between 0 and the total amount of conditions met
|
||||
rand = Rand_ZeroFloat(i);
|
||||
|
||||
for (i = 0; i < totalChecked; i++) {
|
||||
// keep decrementing the random number until it reaches 0 then use that hint
|
||||
if (conditions[i]) {
|
||||
if (rand > 0) {
|
||||
rand--;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
*msgp += 1;
|
||||
|
||||
*hintCmdPtr += 1;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
u16 ElfMessage_GetTextFromMsgs(ElfMessage* msg) {
|
||||
u16 QuestHint_GetTextIdFromScript(QuestHintCmd* hintCmd) {
|
||||
while (true) {
|
||||
switch (msg->byte0 & 0xE0) {
|
||||
case (ELF_MSG_TYPE_CHECK << 5):
|
||||
if (ElfMessage_CheckCondition(msg)) {
|
||||
return msg->byte2 | 0x100;
|
||||
switch (hintCmd->byte0 & 0xE0) {
|
||||
case (QUEST_HINT_TYPE_CHECK << 5):
|
||||
if (QuestHint_CheckCondition(hintCmd)) {
|
||||
return hintCmd->byte2 | 0x100;
|
||||
}
|
||||
break;
|
||||
case (ELF_MSG_TYPE_UNK_1 << 5):
|
||||
if (func_8006BE88(&msg)) {
|
||||
return msg->byte2 | 0x100;
|
||||
|
||||
case (QUEST_HINT_TYPE_CHAIN << 5):
|
||||
if (QuestHint_CheckConditionChain(&hintCmd)) {
|
||||
return hintCmd->byte2 | 0x100;
|
||||
}
|
||||
break;
|
||||
case (ELF_MSG_TYPE_UNK_2 << 5):
|
||||
if (func_8006BF1C(&msg)) {
|
||||
return msg->byte2 | 0x100;
|
||||
|
||||
case (QUEST_HINT_TYPE_RANDOM << 5):
|
||||
if (QuestHint_CheckRandomCondition(&hintCmd)) {
|
||||
return hintCmd->byte2 | 0x100;
|
||||
}
|
||||
break;
|
||||
case (ELF_MSG_TYPE_SKIP << 5):
|
||||
if (ElfMessage_CheckCondition(msg)) {
|
||||
msg += msg->byte2;
|
||||
msg--;
|
||||
|
||||
case (QUEST_HINT_TYPE_SKIP << 5):
|
||||
if (QuestHint_CheckCondition(hintCmd)) {
|
||||
hintCmd += hintCmd->byte2; // skip the specified amount
|
||||
hintCmd--; // decrement by 1 because it will be incremented again below
|
||||
}
|
||||
break;
|
||||
case (ELF_MSG_TYPE_END << 5):
|
||||
return msg->byte2 | 0x100;
|
||||
|
||||
case (QUEST_HINT_TYPE_END << 5):
|
||||
return hintCmd->byte2 | 0x100;
|
||||
|
||||
default:
|
||||
LOG_STRING("企画外 条件", "../z_elf_message.c", 281); // "Unplanned conditions"
|
||||
ASSERT(0, "0", "../z_elf_message.c", 282);
|
||||
}
|
||||
msg++;
|
||||
|
||||
hintCmd++;
|
||||
}
|
||||
}
|
||||
|
||||
u16 ElfMessage_GetSariaText(PlayState* play) {
|
||||
u16 QuestHint_GetSariaTextId(PlayState* play) {
|
||||
Player* player = GET_PLAYER(play);
|
||||
ElfMessage* msgs;
|
||||
QuestHintCmd* sariaQuestHints;
|
||||
|
||||
if (!LINK_IS_ADULT) {
|
||||
if (Actor_FindNearby(play, &player->actor, ACTOR_EN_SA, 4, 800.0f) == NULL) {
|
||||
msgs = sChildSariaMsgs;
|
||||
sariaQuestHints = sChildSariaQuestHints;
|
||||
} else {
|
||||
return 0x0160; // Special text about Saria preferring to talk to you face-to-face
|
||||
}
|
||||
} else {
|
||||
msgs = sAdultSariaMsgs;
|
||||
sariaQuestHints = sAdultSariaQuestHints;
|
||||
}
|
||||
|
||||
return ElfMessage_GetTextFromMsgs(msgs);
|
||||
return QuestHint_GetTextIdFromScript(sariaQuestHints);
|
||||
}
|
||||
|
||||
u16 ElfMessage_GetCUpText(PlayState* play) {
|
||||
if (play->cUpElfMsgs == NULL) {
|
||||
u16 QuestHint_GetNaviTextId(PlayState* play) {
|
||||
if (play->naviQuestHints == NULL) {
|
||||
return 0;
|
||||
} else {
|
||||
return ElfMessage_GetTextFromMsgs(play->cUpElfMsgs);
|
||||
return QuestHint_GetTextIdFromScript(play->naviQuestHints);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,10 +23,18 @@ void Lib_MemSet(u8* dest, size_t len, u8 val) {
|
|||
// clang-format on
|
||||
}
|
||||
|
||||
/**
|
||||
* @param angle binang
|
||||
* @return cos(angle)
|
||||
*/
|
||||
f32 Math_CosS(s16 angle) {
|
||||
return coss(angle) * SHT_MINV;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param angle binang
|
||||
* @return sin(angle)
|
||||
*/
|
||||
f32 Math_SinS(s16 angle) {
|
||||
return sins(angle) * SHT_MINV;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ Path* Path_GetByIndex(PlayState* play, s16 index, s16 max) {
|
|||
Path* path;
|
||||
|
||||
if (index != max) {
|
||||
path = &play->setupPathList[index];
|
||||
path = &play->pathList[index];
|
||||
} else {
|
||||
path = NULL;
|
||||
}
|
||||
|
|
|
@ -403,7 +403,7 @@ void Play_Init(GameState* thisx) {
|
|||
(s32)(zAllocAligned + zAllocSize) - (s32)(zAllocAligned - zAlloc));
|
||||
|
||||
Fault_AddClient(&D_801614B8, ZeldaArena_Display, NULL, NULL);
|
||||
func_800304DC(this, &this->actorCtx, this->linkActorEntry);
|
||||
Actor_InitContext(this, &this->actorCtx, this->playerEntry);
|
||||
|
||||
while (!func_800973FC(this, &this->roomCtx)) {
|
||||
; // Empty Loop
|
||||
|
@ -1408,14 +1408,17 @@ void Play_InitEnvironment(PlayState* this, s16 skyboxId) {
|
|||
}
|
||||
|
||||
void Play_InitScene(PlayState* this, s32 spawn) {
|
||||
this->curSpawn = spawn;
|
||||
this->linkActorEntry = NULL;
|
||||
this->spawn = spawn;
|
||||
|
||||
this->playerEntry = NULL;
|
||||
this->unk_11DFC = NULL;
|
||||
this->setupEntranceList = NULL;
|
||||
this->setupExitList = NULL;
|
||||
this->cUpElfMsgs = NULL;
|
||||
this->setupPathList = NULL;
|
||||
this->numSetupActors = 0;
|
||||
this->spawnList = NULL;
|
||||
this->exitList = NULL;
|
||||
this->naviQuestHints = NULL;
|
||||
this->pathList = NULL;
|
||||
|
||||
this->numActorEntries = 0;
|
||||
|
||||
Object_InitBank(this, &this->objectCtx);
|
||||
LightContext_Init(this, &this->lightCtx);
|
||||
TransitionActor_InitContext(&this->state, &this->transiActorCtx);
|
||||
|
|
|
@ -582,7 +582,7 @@ u32 func_80096FE8(PlayState* play, RoomContext* roomCtx) {
|
|||
roomCtx->status = 0;
|
||||
|
||||
frontRoom = gSaveContext.respawnFlag > 0 ? ((void)0, gSaveContext.respawn[gSaveContext.respawnFlag - 1].roomIndex)
|
||||
: play->setupEntranceList[play->curSpawn].room;
|
||||
: play->spawnList[play->spawn].room;
|
||||
func_8009728C(play, roomCtx, frontRoom);
|
||||
|
||||
return maxRoomSize;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "global.h"
|
||||
#include "vt.h"
|
||||
|
||||
RomFile sNaviMsgFiles[];
|
||||
RomFile sNaviQuestHintFiles[];
|
||||
|
||||
s32 Object_Spawn(ObjectContext* objectCtx, s16 objectId) {
|
||||
u32 size;
|
||||
|
@ -182,22 +182,22 @@ s32 Scene_ExecuteCommands(PlayState* play, SceneCmd* sceneCmd) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
void Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) {
|
||||
ActorEntry* linkEntry = play->linkActorEntry =
|
||||
(ActorEntry*)SEGMENTED_TO_VIRTUAL(cmd->spawnList.data) + play->setupEntranceList[play->curSpawn].spawn;
|
||||
void Scene_CommandPlayerEntryList(PlayState* play, SceneCmd* cmd) {
|
||||
ActorEntry* playerEntry = play->playerEntry =
|
||||
(ActorEntry*)SEGMENTED_TO_VIRTUAL(cmd->playerEntryList.data) + play->spawnList[play->spawn].playerEntryIndex;
|
||||
s16 linkObjectId;
|
||||
|
||||
play->linkAgeOnLoad = ((void)0, gSaveContext.linkAge);
|
||||
|
||||
linkObjectId = gLinkObjectIds[((void)0, gSaveContext.linkAge)];
|
||||
|
||||
gActorOverlayTable[linkEntry->id].initInfo->objectId = linkObjectId;
|
||||
gActorOverlayTable[playerEntry->id].initInfo->objectId = linkObjectId;
|
||||
Object_Spawn(&play->objectCtx, linkObjectId);
|
||||
}
|
||||
|
||||
void Scene_CommandActorList(PlayState* play, SceneCmd* cmd) {
|
||||
play->numSetupActors = cmd->actorList.length;
|
||||
play->setupActorList = SEGMENTED_TO_VIRTUAL(cmd->actorList.data);
|
||||
void Scene_CommandActorEntryList(PlayState* play, SceneCmd* cmd) {
|
||||
play->numActorEntries = cmd->actorEntryList.length;
|
||||
play->actorEntryList = SEGMENTED_TO_VIRTUAL(cmd->actorEntryList.data);
|
||||
}
|
||||
|
||||
void Scene_CommandUnused2(PlayState* play, SceneCmd* cmd) {
|
||||
|
@ -221,8 +221,8 @@ void Scene_CommandRoomList(PlayState* play, SceneCmd* cmd) {
|
|||
play->roomList = SEGMENTED_TO_VIRTUAL(cmd->roomList.data);
|
||||
}
|
||||
|
||||
void Scene_CommandEntranceList(PlayState* play, SceneCmd* cmd) {
|
||||
play->setupEntranceList = SEGMENTED_TO_VIRTUAL(cmd->entranceList.data);
|
||||
void Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) {
|
||||
play->spawnList = SEGMENTED_TO_VIRTUAL(cmd->spawnList.data);
|
||||
}
|
||||
|
||||
void Scene_CommandSpecialFiles(PlayState* play, SceneCmd* cmd) {
|
||||
|
@ -231,8 +231,8 @@ void Scene_CommandSpecialFiles(PlayState* play, SceneCmd* cmd) {
|
|||
gSegments[5] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[play->objectCtx.subKeepIndex].segment);
|
||||
}
|
||||
|
||||
if (cmd->specialFiles.cUpElfMsgNum != 0) {
|
||||
play->cUpElfMsgs = Play_LoadFile(play, &sNaviMsgFiles[cmd->specialFiles.cUpElfMsgNum - 1]);
|
||||
if (cmd->specialFiles.naviQuestHintFileId != NAVI_QUEST_HINTS_NONE) {
|
||||
play->naviQuestHints = Play_LoadFile(play, &sNaviQuestHintFiles[cmd->specialFiles.naviQuestHintFileId - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -308,10 +308,10 @@ void Scene_CommandLightList(PlayState* play, SceneCmd* cmd) {
|
|||
}
|
||||
|
||||
void Scene_CommandPathList(PlayState* play, SceneCmd* cmd) {
|
||||
play->setupPathList = SEGMENTED_TO_VIRTUAL(cmd->pathList.data);
|
||||
play->pathList = SEGMENTED_TO_VIRTUAL(cmd->pathList.data);
|
||||
}
|
||||
|
||||
void Scene_CommandTransitionActorList(PlayState* play, SceneCmd* cmd) {
|
||||
void Scene_CommandTransitionActorEntryList(PlayState* play, SceneCmd* cmd) {
|
||||
play->transiActorCtx.numActors = cmd->transiActorList.length;
|
||||
play->transiActorCtx.list = SEGMENTED_TO_VIRTUAL(cmd->transiActorList.data);
|
||||
}
|
||||
|
@ -386,7 +386,7 @@ void Scene_CommandWindSettings(PlayState* play, SceneCmd* cmd) {
|
|||
}
|
||||
|
||||
void Scene_CommandExitList(PlayState* play, SceneCmd* cmd) {
|
||||
play->setupExitList = SEGMENTED_TO_VIRTUAL(cmd->exitList.data);
|
||||
play->exitList = SEGMENTED_TO_VIRTUAL(cmd->exitList.data);
|
||||
}
|
||||
|
||||
void Scene_CommandUndefined9(PlayState* play, SceneCmd* cmd) {
|
||||
|
@ -470,35 +470,35 @@ void Scene_CommandMiscSettings(PlayState* play, SceneCmd* cmd) {
|
|||
}
|
||||
|
||||
void (*gSceneCmdHandlers[SCENE_CMD_ID_MAX])(PlayState*, SceneCmd*) = {
|
||||
Scene_CommandSpawnList, // SCENE_CMD_ID_SPAWN_LIST
|
||||
Scene_CommandActorList, // SCENE_CMD_ID_ACTOR_LIST
|
||||
Scene_CommandUnused2, // SCENE_CMD_ID_UNUSED_2
|
||||
Scene_CommandCollisionHeader, // SCENE_CMD_ID_COLLISION_HEADER
|
||||
Scene_CommandRoomList, // SCENE_CMD_ID_ROOM_LIST
|
||||
Scene_CommandWindSettings, // SCENE_CMD_ID_WIND_SETTINGS
|
||||
Scene_CommandEntranceList, // SCENE_CMD_ID_ENTRANCE_LIST
|
||||
Scene_CommandSpecialFiles, // SCENE_CMD_ID_SPECIAL_FILES
|
||||
Scene_CommandRoomBehavior, // SCENE_CMD_ID_ROOM_BEHAVIOR
|
||||
Scene_CommandUndefined9, // SCENE_CMD_ID_UNDEFINED_9
|
||||
Scene_CommandRoomShape, // SCENE_CMD_ID_ROOM_SHAPE
|
||||
Scene_CommandObjectList, // SCENE_CMD_ID_OBJECT_LIST
|
||||
Scene_CommandLightList, // SCENE_CMD_ID_LIGHT_LIST
|
||||
Scene_CommandPathList, // SCENE_CMD_ID_PATH_LIST
|
||||
Scene_CommandTransitionActorList, // SCENE_CMD_ID_TRANSITION_ACTOR_LIST
|
||||
Scene_CommandLightSettingsList, // SCENE_CMD_ID_LIGHT_SETTINGS_LIST
|
||||
Scene_CommandTimeSettings, // SCENE_CMD_ID_TIME_SETTINGS
|
||||
Scene_CommandSkyboxSettings, // SCENE_CMD_ID_SKYBOX_SETTINGS
|
||||
Scene_CommandSkyboxDisables, // SCENE_CMD_ID_SKYBOX_DISABLES
|
||||
Scene_CommandExitList, // SCENE_CMD_ID_EXIT_LIST
|
||||
NULL, // SCENE_CMD_ID_END
|
||||
Scene_CommandSoundSettings, // SCENE_CMD_ID_SOUND_SETTINGS
|
||||
Scene_CommandEchoSettings, // SCENE_CMD_ID_ECHO_SETTINGS
|
||||
Scene_CommandCutsceneData, // SCENE_CMD_ID_CUTSCENE_DATA
|
||||
Scene_CommandAlternateHeaderList, // SCENE_CMD_ID_ALTERNATE_HEADER_LIST
|
||||
Scene_CommandMiscSettings, // SCENE_CMD_ID_MISC_SETTINGS
|
||||
Scene_CommandPlayerEntryList, // SCENE_CMD_ID_SPAWN_LIST
|
||||
Scene_CommandActorEntryList, // SCENE_CMD_ID_ACTOR_LIST
|
||||
Scene_CommandUnused2, // SCENE_CMD_ID_UNUSED_2
|
||||
Scene_CommandCollisionHeader, // SCENE_CMD_ID_COLLISION_HEADER
|
||||
Scene_CommandRoomList, // SCENE_CMD_ID_ROOM_LIST
|
||||
Scene_CommandWindSettings, // SCENE_CMD_ID_WIND_SETTINGS
|
||||
Scene_CommandSpawnList, // SCENE_CMD_ID_ENTRANCE_LIST
|
||||
Scene_CommandSpecialFiles, // SCENE_CMD_ID_SPECIAL_FILES
|
||||
Scene_CommandRoomBehavior, // SCENE_CMD_ID_ROOM_BEHAVIOR
|
||||
Scene_CommandUndefined9, // SCENE_CMD_ID_UNDEFINED_9
|
||||
Scene_CommandRoomShape, // SCENE_CMD_ID_ROOM_SHAPE
|
||||
Scene_CommandObjectList, // SCENE_CMD_ID_OBJECT_LIST
|
||||
Scene_CommandLightList, // SCENE_CMD_ID_LIGHT_LIST
|
||||
Scene_CommandPathList, // SCENE_CMD_ID_PATH_LIST
|
||||
Scene_CommandTransitionActorEntryList, // SCENE_CMD_ID_TRANSITION_ACTOR_LIST
|
||||
Scene_CommandLightSettingsList, // SCENE_CMD_ID_LIGHT_SETTINGS_LIST
|
||||
Scene_CommandTimeSettings, // SCENE_CMD_ID_TIME_SETTINGS
|
||||
Scene_CommandSkyboxSettings, // SCENE_CMD_ID_SKYBOX_SETTINGS
|
||||
Scene_CommandSkyboxDisables, // SCENE_CMD_ID_SKYBOX_DISABLES
|
||||
Scene_CommandExitList, // SCENE_CMD_ID_EXIT_LIST
|
||||
NULL, // SCENE_CMD_ID_END
|
||||
Scene_CommandSoundSettings, // SCENE_CMD_ID_SOUND_SETTINGS
|
||||
Scene_CommandEchoSettings, // SCENE_CMD_ID_ECHO_SETTINGS
|
||||
Scene_CommandCutsceneData, // SCENE_CMD_ID_CUTSCENE_DATA
|
||||
Scene_CommandAlternateHeaderList, // SCENE_CMD_ID_ALTERNATE_HEADER_LIST
|
||||
Scene_CommandMiscSettings, // SCENE_CMD_ID_MISC_SETTINGS
|
||||
};
|
||||
|
||||
RomFile sNaviMsgFiles[] = {
|
||||
RomFile sNaviQuestHintFiles[] = {
|
||||
ROM_FILE(elf_message_field),
|
||||
ROM_FILE(elf_message_ydan),
|
||||
ROM_FILE_UNSET,
|
||||
|
|
|
@ -136,9 +136,52 @@ static ItemEquips sNewSaveEquips = {
|
|||
};
|
||||
|
||||
static Inventory sNewSaveInventory = {
|
||||
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, // items
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // ammo
|
||||
// items
|
||||
{
|
||||
ITEM_NONE, // SLOT_STICK
|
||||
ITEM_NONE, // SLOT_NUT
|
||||
ITEM_NONE, // SLOT_BOMB
|
||||
ITEM_NONE, // SLOT_BOW
|
||||
ITEM_NONE, // SLOT_ARROW_FIRE
|
||||
ITEM_NONE, // SLOT_DINS_FIRE
|
||||
ITEM_NONE, // SLOT_SLINGSHOT
|
||||
ITEM_NONE, // SLOT_OCARINA
|
||||
ITEM_NONE, // SLOT_BOMBCHU
|
||||
ITEM_NONE, // SLOT_HOOKSHOT
|
||||
ITEM_NONE, // SLOT_ARROW_ICE
|
||||
ITEM_NONE, // SLOT_FARORES_WIND
|
||||
ITEM_NONE, // SLOT_BOOMERANG
|
||||
ITEM_NONE, // SLOT_LENS
|
||||
ITEM_NONE, // SLOT_BEAN
|
||||
ITEM_NONE, // SLOT_HAMMER
|
||||
ITEM_NONE, // SLOT_ARROW_LIGHT
|
||||
ITEM_NONE, // SLOT_NAYRUS_LOVE
|
||||
ITEM_NONE, // SLOT_BOTTLE_1
|
||||
ITEM_NONE, // SLOT_BOTTLE_2
|
||||
ITEM_NONE, // SLOT_BOTTLE_3
|
||||
ITEM_NONE, // SLOT_BOTTLE_4
|
||||
ITEM_NONE, // SLOT_TRADE_ADULT
|
||||
ITEM_NONE, // SLOT_TRADE_CHILD
|
||||
},
|
||||
// ammo
|
||||
{
|
||||
0, // SLOT_STICK
|
||||
0, // SLOT_NUT
|
||||
0, // SLOT_BOMB
|
||||
0, // SLOT_BOW
|
||||
0, // SLOT_ARROW_FIRE
|
||||
0, // SLOT_DINS_FIRE
|
||||
0, // SLOT_SLINGSHOT
|
||||
0, // SLOT_OCARINA
|
||||
0, // SLOT_BOMBCHU
|
||||
0, // SLOT_HOOKSHOT
|
||||
0, // SLOT_ARROW_ICE
|
||||
0, // SLOT_FARORES_WIND
|
||||
0, // SLOT_BOOMERANG
|
||||
0, // SLOT_LENS
|
||||
0, // SLOT_BEAN
|
||||
0, // SLOT_HAMMER
|
||||
},
|
||||
// equipment
|
||||
(((1 << EQUIP_INV_TUNIC_KOKIRI) << (EQUIP_TYPE_TUNIC * 4)) |
|
||||
((1 << EQUIP_INV_BOOTS_KOKIRI) << (EQUIP_TYPE_BOOTS * 4))),
|
||||
|
@ -223,13 +266,52 @@ static ItemEquips sDebugSaveEquips = {
|
|||
};
|
||||
|
||||
static Inventory sDebugSaveInventory = {
|
||||
// items
|
||||
{
|
||||
ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_ARROW_FIRE, ITEM_DINS_FIRE,
|
||||
ITEM_SLINGSHOT, ITEM_OCARINA_FAIRY, ITEM_BOMBCHU, ITEM_HOOKSHOT, ITEM_ARROW_ICE, ITEM_FARORES_WIND,
|
||||
ITEM_BOOMERANG, ITEM_LENS, ITEM_BEAN, ITEM_HAMMER, ITEM_ARROW_LIGHT, ITEM_NAYRUS_LOVE,
|
||||
ITEM_BOTTLE, ITEM_POTION_RED, ITEM_POTION_GREEN, ITEM_POTION_BLUE, ITEM_POCKET_EGG, ITEM_WEIRD_EGG,
|
||||
}, // items
|
||||
{ 50, 50, 10, 30, 1, 1, 30, 1, 50, 1, 1, 1, 1, 1, 1, 1 }, // ammo
|
||||
ITEM_STICK, // SLOT_STICK
|
||||
ITEM_NUT, // SLOT_NUT
|
||||
ITEM_BOMB, // SLOT_BOMB
|
||||
ITEM_BOW, // SLOT_BOW
|
||||
ITEM_ARROW_FIRE, // SLOT_ARROW_FIRE
|
||||
ITEM_DINS_FIRE, // SLOT_DINS_FIRE
|
||||
ITEM_SLINGSHOT, // SLOT_SLINGSHOT
|
||||
ITEM_OCARINA_FAIRY, // SLOT_OCARINA
|
||||
ITEM_BOMBCHU, // SLOT_BOMBCHU
|
||||
ITEM_HOOKSHOT, // SLOT_HOOKSHOT
|
||||
ITEM_ARROW_ICE, // SLOT_ARROW_ICE
|
||||
ITEM_FARORES_WIND, // SLOT_FARORES_WIND
|
||||
ITEM_BOOMERANG, // SLOT_BOOMERANG
|
||||
ITEM_LENS, // SLOT_LENS
|
||||
ITEM_BEAN, // SLOT_BEAN
|
||||
ITEM_HAMMER, // SLOT_HAMMER
|
||||
ITEM_ARROW_LIGHT, // SLOT_ARROW_LIGHT
|
||||
ITEM_NAYRUS_LOVE, // SLOT_NAYRUS_LOVE
|
||||
ITEM_BOTTLE, // SLOT_BOTTLE_1
|
||||
ITEM_POTION_RED, // SLOT_BOTTLE_2
|
||||
ITEM_POTION_GREEN, // SLOT_BOTTLE_3
|
||||
ITEM_POTION_BLUE, // SLOT_BOTTLE_4
|
||||
ITEM_POCKET_EGG, // SLOT_TRADE_ADULT
|
||||
ITEM_WEIRD_EGG, // SLOT_TRADE_CHILD
|
||||
},
|
||||
// ammo
|
||||
{
|
||||
50, // SLOT_STICK
|
||||
50, // SLOT_NUT
|
||||
10, // SLOT_BOMB
|
||||
30, // SLOT_BOW
|
||||
1, // SLOT_ARROW_FIRE
|
||||
1, // SLOT_DINS_FIRE
|
||||
30, // SLOT_SLINGSHOT
|
||||
1, // SLOT_OCARINA
|
||||
50, // SLOT_BOMBCHU
|
||||
1, // SLOT_HOOKSHOT
|
||||
1, // SLOT_ARROW_ICE
|
||||
1, // SLOT_FARORES_WIND
|
||||
1, // SLOT_BOOMERANG
|
||||
1, // SLOT_LENS
|
||||
1, // SLOT_BEAN
|
||||
1 // SLOT_HAMMER
|
||||
},
|
||||
// equipment
|
||||
((((1 << EQUIP_INV_SWORD_KOKIRI) << (EQUIP_TYPE_SWORD * 4)) |
|
||||
((1 << EQUIP_INV_SWORD_MASTER) << (EQUIP_TYPE_SWORD * 4)) |
|
||||
|
@ -300,9 +382,22 @@ void Sram_InitDebugSave(void) {
|
|||
}
|
||||
|
||||
static s16 sDungeonEntrances[] = {
|
||||
ENTR_YDAN_0, ENTR_DDAN_0, ENTR_BDAN_0, ENTR_BMORI1_0, ENTR_HIDAN_0, ENTR_MIZUSIN_0,
|
||||
ENTR_JYASINZOU_0, ENTR_HAKADAN_0, ENTR_HAKADANCH_0, ENTR_ICE_DOUKUTO_0, ENTR_GANON_0, ENTR_MEN_0,
|
||||
ENTR_GERUDOWAY_0, ENTR_GANONTIKA_0, ENTR_GANON_SONOGO_0, ENTR_GANONTIKA_SONOGO_0,
|
||||
ENTR_YDAN_0, // SCENE_YDAN
|
||||
ENTR_DDAN_0, // SCENE_DDAN
|
||||
ENTR_BDAN_0, // SCENE_BDAN
|
||||
ENTR_BMORI1_0, // SCENE_BMORI1
|
||||
ENTR_HIDAN_0, // SCENE_HIDAN
|
||||
ENTR_MIZUSIN_0, // SCENE_MIZUSIN
|
||||
ENTR_JYASINZOU_0, // SCENE_JYASINZOU
|
||||
ENTR_HAKADAN_0, // SCENE_HAKADAN
|
||||
ENTR_HAKADANCH_0, // SCENE_HAKADANCH
|
||||
ENTR_ICE_DOUKUTO_0, // SCENE_ICE_DOUKUTO
|
||||
ENTR_GANON_0, // SCENE_GANON
|
||||
ENTR_MEN_0, // SCENE_MEN
|
||||
ENTR_GERUDOWAY_0, // SCENE_GERUDOWAY
|
||||
ENTR_GANONTIKA_0, // SCENE_GANONTIKA
|
||||
ENTR_GANON_SONOGO_0, // SCENE_GANON_SONOGO
|
||||
ENTR_GANONTIKA_SONOGO_0, // SCENE_GANONTIKA_SONOGO
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue