audio odyssey (#744)

* first pass

* seq cmd args retyping

* some SEF commands

* etc

* couple more SND commands

* more functions

* checkpoint

* five more

* another one

* more funcs + cleanup

* reverted unnecessary unions

* all SEF commands done

* a bunch more

* more!

* morrrrrrre

* almost done for now

* 99%

* 100

* few names and types

* reorg

* minor chnages

* miscmiscmisc

* yet more

* another day another func

* eth wip func_8004EC68

* some sym names

* retyping sound mgr fields

* minor renames

* D_80078400

* bigger func

* retypings

* enhanced drum info

* the evil is defeated

* merged

* prelim ambient sound func names

* audio frame

* checkpoint

* renames

* learnin bout sounds

* latest

* fix snd_load_BK_to_bank

* func_80056FA4

* warnings

* cosmetics

* func_800522A8

* struct reorg

* figured some stuff out

* much more info

* fx params

* cleanin up

* revert accidental changes to jp

* more accidental jp changes reverted

* misc names

* small stuff

* migrated all audio data

* checkpoint

* header reorg begins

* audio public/private headers

* fixed headers

* fixin warnins

* oops

* 51 fixed

* formatted binary data in 30450

* workwork

* cleanup

* misc

* flip macro arg order

* more names

* audio event triggers

* various

* sfx player cleanup

* start bgm player cleanup

* names names names

* priorities

* merlow

* misc enum vals

* rocking chair

* kmr_00 funcs

* enough

* restore delete jp file

* func_80055EB4

* fix func name

* addressed comments

* demoted a couple variables from global

* couple hidden panel things

* credits mostly

* credits dedupe in progress

* jump table repair

* 'finished' end dedupe

Co-authored-by: HailSanta <Hail2Santa@gmail.com>
Co-authored-by: Ethan Roseman <ethteck@gmail.com>
This commit is contained in:
HailSanta 2022-08-06 08:14:04 -04:00 committed by GitHub
parent ae64b1b5cc
commit 1ce49b1ba9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
406 changed files with 13278 additions and 23250 deletions

115
include/PR/n_abi.h Normal file
View File

@ -0,0 +1,115 @@
/*====================================================================
*
* Copyright 1993, Silicon Graphics, Inc.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
* Inc.; the contents of this file may not be disclosed to third
* parties, copied or duplicated in any form, in whole or in part,
* without the prior written permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to
* restrictions as set forth in subdivision (c)(1)(ii) of the Rights
* in Technical Data and Computer Software clause at DFARS
* 252.227-7013, and/or in similar or successor clauses in the FAR,
* DOD or NASA FAR Supplement. Unpublished - rights reserved under the
* Copyright Laws of the United States.
*====================================================================*/
#ifndef __N_ABI__
#define __N_ABI__
/*
* BEGIN C-specific section: (typedef's)
*/
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
/*
* Macros to assemble the audio command list
*/
#define n_aADPCMdec(pkt, s, f, c, a, d) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = (_SHIFTL(A_ADPCM, 24, 8) | _SHIFTL(s, 0, 24)); \
_a->words.w1 = (_SHIFTL(f, 28, 4) | _SHIFTL(c, 16, 12) | \
_SHIFTL(a, 12, 4) | _SHIFTL(d, 0, 12)); \
}
#define n_aPoleFilter(pkt, f, g, t, s) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = (_SHIFTL(A_POLEF, 24, 8) | _SHIFTL(f, 16, 8) | \
_SHIFTL(g, 0, 16)); \
_a->words.w1 = (_SHIFTL(t, 24, 8) | \
_SHIFTL((unsigned int)(s), 0, 24)); \
}
#define n_aEnvMixer(pkt, f, t, s) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = (_SHIFTL(A_ENVMIXER, 24, 8) | _SHIFTL(f, 16, 8) |\
_SHIFTL(t, 0, 16)); \
_a->words.w1 = (unsigned int)(s); \
}
#define n_aInterleave(pkt) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8); \
}
#define n_aLoadBuffer(pkt, c, d, s) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = (_SHIFTL(A_LOADBUFF, 24, 8) | _SHIFTL(c, 12, 12)|\
_SHIFTL(d, 0, 12)); \
_a->words.w1 = (unsigned int)(s); \
}
#define n_aResample(pkt, s, f, p, i, o) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = (_SHIFTL(A_RESAMPLE, 24, 8) | _SHIFTL(s, 0, 24));\
_a->words.w1 = (_SHIFTL(f, 30, 2) | _SHIFTL(p, 14, 16) | \
_SHIFTL(i, 2, 12) | _SHIFTL(o, 0, 2)); \
}
#define n_aSaveBuffer(pkt, c, d, s) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = (_SHIFTL(A_SAVEBUFF, 24, 8) | _SHIFTL(c, 12, 12)|\
_SHIFTL(d, 0, 12)); \
_a->words.w1 = (unsigned int)(s); \
}
#define n_aSetVolume(pkt, f, v, t, r) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = (_SHIFTL(A_SETVOL, 24, 8) | _SHIFTL(f, 16, 8) | \
_SHIFTL(v, 0, 16)); \
_a->words.w1 = _SHIFTL(t, 16, 16) | _SHIFTL(r, 0, 16); \
}
#define n_aLoadADPCM(pkt, c, d) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_LOADADPCM, 24, 8) | _SHIFTL(c, 0, 24); \
_a->words.w1 = (unsigned int) d; \
}
#endif /* _LANGUAGE_C */
#endif /* __N_ABI__ */

View File

@ -13,6 +13,12 @@ typedef ApiStatus(*ApiFunc)(struct Evt*, s32);
typedef Bytecode EvtScript[0];
typedef void NoArgCallback(void*);
#define MSG_PTR u8*
#define IMG_PTR u8*
#define PAL_PTR u16*
typedef struct {
u8 r, g, b, a;
} Color_RGBA8;
@ -560,21 +566,29 @@ typedef DynamicEntity* DynamicEntityList[MAX_DYNAMIC_ENTITIES];
typedef struct MusicSettings {
/* 0x00 */ u16 flags;
/* 0x02 */ s16 unk_02;
/* 0x02 */ s16 state;
/* 0x04 */ s32 fadeOutTime;
/* 0x08 */ s32 fadeInTime;
/* 0x0C */ s16 unk_0C;
/* 0x0E */ s16 unk_0E;
/* 0x0C */ s16 fadeStartVolume;
/* 0x0E */ s16 fadeEndVolume;
/* 0x10 */ s32 songID;
/* 0x14 */ s32 variation;
/* 0x18 */ s32 songName;
/* 0x1C */ s32 unk_1C;
/* 0x20 */ s32 unk_20;
/* 0x24 */ s32 unk_24;
/* 0x28 */ s32 unk_28;
/* 0x2C */ s32 unk_2C;
/* 0x1C */ s32 battleSongID;
/* 0x20 */ s32 battleVariation;
/* 0x24 */ s32 savedSongID;
/* 0x28 */ s32 savedVariation;
/* 0x2C */ s32 savedSongName;
} MusicSettings; // size = 0x30
typedef struct MusicProximityTrigger {
/* 0x00 */ Vec2XZf pos;
/* 0x08 */ f32 innerDist;
/* 0x0C */ f32 outerDist;
/* 0x10 */ s32 unk;
/* 0x14 */ s32 manualActivationFlag;
} MusicProximityTrigger; // size = 0x18
typedef struct UiStatus {
/* 0x00 */ s32 hpIconIndices[2];
/* 0x08 */ s32 fpIconIndices[2];
@ -908,6 +922,7 @@ typedef struct BattleStatus {
/* 0x45C */ char unk_45C[4];
} BattleStatus; // size = 0x460
// alternative name: TileDescriptor
typedef struct TextureHeader {
/* 0x00 */ s8 name[32];
/* 0x20 */ s16 auxW;
@ -1237,11 +1252,11 @@ typedef struct MessageCharset {
} MessageCharset; // size = 0xA;
typedef struct MesasgeFontGlyphData {
/* 0x0 */ s8* raster;
/* 0x4 */ s16* palette;
/* 0x8 */ Vec2b texSize;
/* 0xA */ s8 charWidth;
/* 0xB */ s8 charHeight;
/* 0x0 */ IMG_PTR raster;
/* 0x4 */ PAL_PTR palette;
/* 0x8 */ Vec2bu texSize;
/* 0xA */ u8 charWidth;
/* 0xB */ u8 charHeight;
} MesasgeFontGlyphData; // size = 0xC
typedef struct MessageImageData {
@ -1286,7 +1301,7 @@ typedef struct ShopItemLocation {
typedef struct ShopItemData {
/* 0x0 */ u32 itemID;
/* 0x4 */ s32 price;
/* 0x8 */ s32 unk_08;
/* 0x8 */ s32 descMsg;
} ShopItemData; // size = 0xC
typedef struct ShopSellPriceData {
@ -2251,14 +2266,14 @@ typedef struct PopupMessage {
/* 0x18 */ Message* message;
} PopupMessage; // size = 0x1C
typedef struct Struct8015A578 {
/* 0x00 */ s8 unk_00;
/* 0x01 */ u8 unk_01;
/* 0x02 */ s8 unk_02;
/* 0x03 */ u8 unk_03[5];
/* 0x08 */ f32 unk_08;
typedef struct HiddenPanelsData {
/* 0x00 */ s8 tryFlipTrigger;
/* 0x01 */ u8 panelsCount;
/* 0x02 */ s8 activateISpy;
/* 0x03 */ char unk_03[0x5];
/* 0x08 */ f32 flipTriggerPosY;
/* 0x0C */ char unk_0C[0x4];
} Struct8015A578; // size = 0x10
} HiddenPanelsData; // size = 0x10
typedef struct SpriteShadingLightSource {
/* 0x00 */ s8 flags;
@ -2300,8 +2315,8 @@ typedef struct UnkStruct0 {
} UnkStruct0;
typedef struct FoldImageRecPart {
/* 0x00 */ s8* raster;
/* 0x04 */ s8* palette;
/* 0x00 */ IMG_PTR raster;
/* 0x04 */ PAL_PTR palette;
/* 0x08 */ u16 width;
/* 0x0A */ u16 height;
/* 0x0C */ s16 xOffset;
@ -2326,4 +2341,108 @@ typedef struct FoldImageRec {
/* 0x24 */ u8 alphaMultiplier;
} FoldImageRec; // size = 0x25
typedef struct SongUpdateEvent {
/* 0x00 */ s32 songName;
/* 0x04 */ s32 duration;
/* 0x08 */ s32 startVolume;
/* 0x0C */ s32 finalVolume;
/* 0x10 */ s32 variation;
/* 0x14 */ s32 unk14;
/* 0x18 */ s32 unk18;
/* 0x1C */ s32 unk1C; // may be fake
} SongUpdateEvent; // size = 0x1C or 0x20
// unfortunately, cant use bitfield for this
// format: ABCC00DD
// A = playerID
// B = trackIndex
// C = musicEventID
// D = scriptSelector
typedef u32 MusicEventTrigger;
// allows Evt scripts to be triggered by BGM commands
typedef struct MusicEvent {
s32 musicEventID; // user-defined, events will respond to BGM Trigger commands with matching ID
EvtScript* scripts[4];
} MusicEvent;
typedef struct ParadeNpcInfo {
/* 0x00 */ u32 initialAnim;
/* 0x04 */ u32** animList;
/* 0x08 */ Vec3f pos;
/* 0x14 */ f32 yaw;
} ParadeNpcInfo; // size = 0x18
typedef struct CreditsEntry {
/* 0x00 */ s32 msgID;
/* 0x04 */ s32 posX;
/* 0x08 */ s32 posY;
/* 0x0C */ s32 palette;
/* 0x10 */ s32 appearMode;
/* 0x14 */ s32 appearTime;
/* 0x18 */ s32 perCharDelayIn;
/* 0x1C */ s32 holdMode;
/* 0x20 */ s32 holdTime;
/* 0x24 */ s32 vanishMode;
/* 0x28 */ s32 vanishTime;
/* 0x2C */ s32 perCharDelayOut;
/* 0x30 */ s32 next;
/* 0x34 */ s16 flags;
/* 0x36 */ char pad_36[2];
} CreditsEntry; // size = 0x38
typedef struct CreditsLine {
/* 0x00 */ u8* message;
/* 0x04 */ s32 unk__04;
/* 0x08 */ s32 time;
/* 0x0C */ s32 state;
/* 0x10 */ s32 palette;
/* 0x14 */ s32 msgWidth;
/* 0x18 */ s32 appearMode;
/* 0x1C */ s32 appearTime;
/* 0x20 */ s32 perCharDelayIn;
/* 0x24 */ s32 unk__24;
/* 0x28 */ s32 unk__28;
/* 0x2C */ s32 unk__2C;
/* 0x30 */ s32 unk__30;
/* 0x34 */ s32 holdMode;
/* 0x38 */ s32 holdTime;
/* 0x3C */ s32 unk__3C;
/* 0x40 */ s32 unk__40;
/* 0x44 */ s32 unk__44;
/* 0x48 */ s32 unk__48;
/* 0x4C */ s32 vanishMode;
/* 0x50 */ s32 vanishTime;
/* 0x54 */ s32 perCharDelayOut;
/* 0x58 */ s32 unk__58;
/* 0x5C */ s32 unk__5C;
/* 0x60 */ s32 unk__60;
/* 0x64 */ s32 unk__64;
/* 0x68 */ s32 posX;
/* 0x6C */ s32 posY;
/* 0x70 */ s16 flags;
/* 0x72 */ char unk_72[2];
} CreditsLine; // size = 0x74
typedef struct CreditsChar {
/* 0x00 */ s32 charIndex;
/* 0x04 */ s32 font;
/* 0x08 */ s32 variation;
/* 0x0C */ s32 palette;
/* 0x10 */ s32 posX;
/* 0x14 */ s32 posY;
/* 0x18 */ s32 fadeInTime;
} CreditsChar; // size = unk
typedef struct CreditsData {
/* 0x00 */ u32 workerID;
/* 0x04 */ CreditsLine lines[32];
} CreditsData; // size = 0x74
typedef struct CreditsUnkBeta {
/* 0x00 */ u8 unk_00;
/* 0x01 */ u8 unk_01;
/* 0x02 */ s16 size;
} CreditsUnkBeta; // size = 0x4
#endif

View File

@ -589,6 +589,7 @@ enum SoundIDs {
SOUND_METAL_GATE_CLOSE = 0x000001CA,
SOUND_1CB = 0x000001CB,
SOUND_1CC = 0x000001CC,
SOUND_CREAKY_ROCKING_CHAIR = 0x000001D6,
SOUND_1E2 = 0x000001E2,
SOUND_211 = 0x00000211,
SOUND_213 = 0x00000213,
@ -655,6 +656,7 @@ enum SoundIDs {
SOUND_32E = 0x0000032E,
SOUND_32F = 0x0000032F,
SOUND_349 = 0x00000349,
SOUND_34A = 0x0000034A,
SOUND_34E = 0x0000034E,
SOUND_359 = 0x00000359,
SOUND_35D = 0x0000035D,
@ -811,6 +813,68 @@ enum SoundIDs {
SOUND_B000001E = 0xB000001E,
};
enum SoundInstanceFlags {
SOUND_INSTANCE_FLAG_4 = 0x00000004,
};
enum SoundType {
SOUND_TYPE_SPECIAL = 0x80000000,
SOUND_TYPE_LOOPING = 0,
SOUND_TYPE_DOOR1 = 1,
SOUND_TYPE_DOOR2 = 2,
SOUND_TYPE_ALTERNATING = 3
};
enum SoundIDBits {
SOUND_ID_10000 = 0x00010000,
SOUND_ID_LOWER = 0x000023FF,
SOUND_ID_MID = 0x00000C00,
};
typedef enum AuResult {
AU_RESULT_OK = 0,
AU_ERROR_1 = 1,
AU_AMBIENCE_ERROR_1 = 1,
AU_ERROR_SONG_NOT_PLAYING = 2, // player not found for songName
AU_AMBIENCE_ERROR_2 = 2,
AU_ERROR_NULL_SONG_NAME = 3, // songName is NULL
AU_AMBIENCE_ERROR_3 = 3,
AU_ERROR_INVALID_SONG_DURATION = 4, // duration out of bounds: (250,10000)
AU_ERROR_6 = 6,
AU_ERROR_7 = 7,
AU_ERROR_11 = 11,
AU_ERROR_SBN_INDEX_OUT_OF_RANGE = 101,
AU_ERROR_SBN_FORMAT_MISMATCH = 102,
AU_ERROR_151 = 151,
AU_ERROR_201 = 201
} AuResult;
typedef enum AuFileFormat {
AU_FMT_BGM = 0x10,
AU_FMT_SEF = 0x20,
AU_FMT_BK = 0x30,
AU_FMT_PER = 0x40,
AU_FMT_PRG = 0x40,
AU_FMT_MSEQ = 0x40
} AuFileFormat;
enum {
MUSIC_PROXIMITY_FAR,
MUSIC_PROXIMITY_NEAR,
MUSIC_PROXIMITY_FULL
};
typedef enum MusicTrackVols {
TRACK_VOLS_0 = 0,
TRACK_VOLS_1 = 1,
TRACK_VOLS_2 = 2,
TRACK_VOLS_3 = 3,
TRACK_VOLS_KPA_OUTSIDE = 4,
TRACK_VOLS_KPA_1 = 5,
TRACK_VOLS_KPA_2 = 6,
TRACK_VOLS_KPA_3 = 7
} MusicTrackVols;
enum Cams {
CAM_DEFAULT = 0,
CAM_BATTLE = 1,
@ -1338,7 +1402,10 @@ enum AmbientSounds {
AMBIENT_UNDER_SEA6 = 11,
AMBIENT_BIRDS = 12,
AMBIENT_SEA = 13,
AMBIENT_MUSIC = 16,
AMBIENT_RADIO = 16, // radio songs for nok
// the following 4 IDs are reserved for additional radio songs,
// and no more are expected to follow after that
// see: func_80053F80
};
enum EncounterOutcomes {
@ -3696,10 +3763,25 @@ enum FoldStateFlags {
FOLD_STATE_FLAG_8000 = 0x00008000,
FOLD_STATE_FLAG_10000 = 0x00010000,
FOLD_STATE_FLAG_20000 = 0x00020000,
FOLD_STATE_FLAG_40000 = 0x00040000,
FOLD_STATE_FLAG_80000 = 0x00080000,
FOLD_STATE_FLAG_100000 = 0x00100000,
};
typedef enum FoldType {
FOLD_TYPE_NONE = 0x0,
FOLD_TYPE_1 = 0x1,
FOLD_TYPE_2 = 0x2,
FOLD_TYPE_3 = 0x3,
FOLD_TYPE_4 = 0x4,
FOLD_TYPE_5 = 0x5,
FOLD_TYPE_6 = 0x6,
FOLD_TYPE_7 = 0x7,
FOLD_TYPE_8 = 0x8,
FOLD_TYPE_9 = 0x9,
FOLD_TYPE_A = 0xA,
} FoldType;
enum MoveType {
MOVE_TYPE_NONE = 0,
MOVE_TYPE_HAMMER = 1,

View File

@ -266,11 +266,7 @@ s32 round(f32);
f32 atan2(f32 startX, f32 startZ, f32 endX, f32 endZ);
f32 clamp_angle(f32 theta);
s32 sign(s32 value);
s32 func_80055448(s32);
s32 func_80055464(s32, s32);
s32 func_80055618(s32, s32);
s32 func_800557CC(s32);
s32 func_80055848(s32);
s32 func_800E0208(void);
s32 battle_heap_create(void);
@ -515,18 +511,15 @@ f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by);
f32 dist3D(f32 ax, f32 ay, f32 az, f32 bx, f32 by, f32 bz);
void add_vec2D_polar(f32* x, f32* y, f32 r, f32 theta);
s32 sfx_adjust_env_sound_pos(s32 soundID, s32 arg1, f32 arg2, f32 arg3, f32 arg4);
void sfx_play_sound(s32 soundID);
void sfx_play_sound_at_position(s32 soundID, s32 value2, f32 posX, f32 posY, f32 posZ);
void sfx_play_sound_at_player(s32 soundID, s32 arg0);
void sfx_play_sound_at_npc(s32 soundID, s32 arg1, s32 npcID);
//TODO -- remove these and use audio/public.h instead
s32 bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s16 volume);
void bgm_set_battle_song(s32, s32);
void bgm_push_battle_song(void);
void func_801497FC(s32 arg0);
s32 bgm_adjust_proximity(s32 playerIndex, s32 arg1, s16 arg2);
s32 func_8014A964(s32 playerIndex, s32 songID, s32 variation, s32 fadeInTime, s16 arg4, s16 arg5);
s32 func_8014AA54(s32 playerIndex, s32 arg1, s16 arg2);
s32 func_8014AB0C(s32 playerIndex, s16 arg1);
#include "audio/public.h"
void basic_window_update(s32 windowIndex, s32* flags, s32* posX, s32* posY, s32* posZ, f32* scaleX, f32* scaleY,
f32* rotX, f32* rotY, f32* rotZ, s32* darkening, s32* opacity);
@ -577,9 +570,7 @@ void update_entities(void);
void func_80138198(void);
void bgm_update_music_settings(void);
void update_ambient_sounds(void);
void sfx_update_looping_sound_params(void);
void update_windows(void);
void sfx_stop_env_sounds(void);
void player_render_interact_prompts(void);
void func_802C3EE4(void);
void render_screen_overlay_backUI(void);
@ -597,7 +588,6 @@ void func_80028838(void);
void clear_screen_overlays(void);
void bgm_reset_sequence_players(void);
void reset_ambient_sounds(void);
void sfx_clear_sounds(void);
void poll_rumble(void);
void bgm_pop_song(void);
void bgm_push_song(s32 songID, s32 variation);
@ -621,8 +611,6 @@ void suspend_all_group(s32 groupFlags);
void kill_script(Evt* instanceToKill);
void exec_entity_commandlist(Entity* entity);
void sfx_reset_door_sounds(void);
void show_start_recovery_shimmer(f32 x, f32 y, f32 z, s32 arg3);
void show_recovery_shimmer(f32 x, f32 y, f32 z, s32 arg3);
@ -778,13 +766,11 @@ s32 create_generic_entity_world(WorldArgs, WorldArgs);
EntityModel* get_entity_model(s32 idx);
f32 phys_get_spin_history(s32 lag, s32* x, s32* y, s32* z);
void fold_update(u32, s32, s32, s32, s32, s32, s32);
void fold_update(u32, FoldType, s32, s32, s32, s32, s32);
s32 fold_appendGfx_component(s32, FoldImageRecPart*, u32, Matrix4f);
s32 func_8013A704(s32);
void free_generic_entity(s32);
void sfx_get_spatialized_sound_params(f32 arg0, f32 arg1, f32 arg2, s16* arg3, s16* arg4, s32 arg5);
void sfx_play_sound_with_params(s32 arg0, u8 arg1, u8 arg2, s16 arg3);
s32 ai_check_fwd_collisions(Npc* npc, f32 arg1, f32* arg2, f32* arg3, f32* arg4, f32* arg5);
void basic_ai_loiter_init(Evt* script, NpcAISettings* aiSettings, EnemyDetectVolume* territory);
void PatrolAI_LoiterInit(Evt* script, NpcAISettings* aiSettings, EnemyDetectVolume* territory);
@ -825,19 +811,12 @@ void func_800EF3E4(void);
void func_80268858(void);
void func_80269118(void);
s32 func_80268224(s32);
void func_80149A6C(s32, s32);
void func_800EF300(void);
void enable_player_shadow(void);
s32 get_msg_lines(s32 messageID);
void set_window_properties(s32 panelID, s32 posX, s32 posY, s32 width, s32 height, u8, void* drawContents, void* drawContentsArg, s8 parent);
void set_window_update(s32 panelID, s32);
void set_windows_visible(s32 groupIdx);
void snd_stop_sound(s32 soundID);
void snd_start_sound_with_shift(s32 soundID, u8 volume, u8 pan, s16 pitchShift);
void snd_adjust_sound_with_shift(s32 soundID, u8 volume, u8 pan, s16 pitchShift);
void sfx_adjust_env_sound_params(s32 soundID, u8 volume, u8 pan, s16 pitchShift);
void sfx_stop_sound(s32 soundID);
void partner_disable_input(void);
void partner_set_goal_pos(s32 x, s32 z);

View File

@ -65,9 +65,4 @@ MapConfig* get_current_map_header(void);
/// Zero-terminated.
extern Area gAreas[29];
/// Lists the songs that are forced to use the variation determined by `map.songVariation & 1`.
/// @see bgm_get_map_default_variation
extern s32 gSongsUsingVariationFlag[6];
extern s16 D_8014F738;
#endif

View File

@ -78,24 +78,9 @@ typedef struct ModelTreeInfo {
/* 0x03 */ char unk_03;
} ModelTreeInfo; // size = 0x04
typedef struct TileDescriptor {
/* 0x00 */ s8 name[32];
/* 0x20 */ u16 auxW;
/* 0x22 */ u16 mainW;
/* 0x24 */ u16 auxH;
/* 0x26 */ u16 mainH;
/* 0x28 */ char unk_28;
/* 0x29 */ u8 extraTiles;
/* 0x2A */ u16 colorCombine;
/* 0x2C */ u8 bitDepth;
/* 0x2D */ u8 wrapH;
/* 0x2E */ u8 wrapV;
/* 0x2F */ u8 filtering;
} TileDescriptor; // size = 0x30
typedef struct TextureHandle {
/* 0x00 */ Gfx* gfx;
/* 0x04 */ TileDescriptor desc;
/* 0x04 */ TextureHeader header;
/* 0x34 */ s32* raster;
/* 0x38 */ s32* palette;
/* 0x3C */ s32* auxRaster;

View File

@ -74,13 +74,13 @@ extern s8 D_800A0900;
extern f32 GravityParamsStartFall[];
extern s16 D_800F7B80;
extern u8* D_801512F0;
extern s16 D_80151308;
extern u16 D_80151308;
extern s32 gEntityHideMode;
extern s32 D_8010C92C;
extern s32 D_8010C950;
extern s32 D_801595A0;
extern Struct8015A578 D_8015A578;
extern HiddenPanelsData gCurrentHiddenPanels;
extern BackgroundHeader gBackgroundImage;
@ -176,7 +176,7 @@ extern f32 gCurtainFade;
extern f32 gCurtainFadeGoal;
extern UNK_FUN_PTR(gCurtainDrawCallback);
extern s16 gCurrentDoorSoundsSet;
extern u16 gCurrentDoorSoundsSet;
extern s32 D_800D9620;
extern UNK_TYPE D_800E92D8;
@ -231,12 +231,7 @@ extern EvtScript SCRIPT_NpcDefeat;
extern EvtScript ShakeCam1;
extern EvtScript ShakeCamX;
extern s16 gMusicUnkVolume;
extern s16 gMusicUnkVolume2;
extern s16 gMusicCurrentVolume;
extern s16 gMusicTargetVolume;
extern MusicSettings gMusicSettings[4];
extern MusicSettings D_8014F6F0;
// OS
extern OSThread D_800A4270; // idle thread, id 1

View File

@ -1,7 +1,7 @@
#include "common.h"
#include "filemenu.h"
#include "hud_element.h"
#include "audio.h"
#include "audio/public.h"
#include "fio.h"
extern HudScript* filemenu_hudElemScripts[14];

View File

@ -55,7 +55,7 @@ void filemenu_info_handle_input(void) {
filemenu_8024C098 = 0;
switch(menu->page) {
switch (menu->page) {
case 1:
menu->page = 0;
set_window_update(WINDOW_ID_51, (s32)filemenu_update_show_options_left);

View File

@ -236,7 +236,7 @@ void btl_state_update_begin_player_turn(void) {
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
} else {
battleStatus->battlePhase = 0xC;
script = start_script(partner->onTurnChanceScriptSource, 0xA, 0);
script = start_script(partner->onTurnChanceScriptSource, EVT_PRIORITY_A, 0);
partner->onTurnChangeScript = script;
gBattleState2 = BATTLE_STATE2_UNK_14;
partner->onTurnChangeID = script->id;
@ -462,7 +462,7 @@ void btl_state_update_begin_player_turn(void) {
if (battleStatus->hammerLossTurns >= 0) {
battleStatus->hammerLossTurns--;
if (battleStatus->hammerLossTurns == -1) {
script = start_script(RegainAbility, 0xA, 0);
script = start_script(RegainAbility, EVT_PRIORITY_A, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->varTable[0] = 1;
@ -477,7 +477,7 @@ void btl_state_update_begin_player_turn(void) {
if (battleStatus->jumpLossTurns >= 0) {
battleStatus->jumpLossTurns--;
if (battleStatus->jumpLossTurns == -1) {
script = start_script(RegainAbility, 0xA, 0);
script = start_script(RegainAbility, EVT_PRIORITY_A, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->varTable[0] = phi_s0_3;
@ -491,7 +491,7 @@ void btl_state_update_begin_player_turn(void) {
if (battleStatus->itemLossTurns >= 0) {
battleStatus->itemLossTurns--;
if (battleStatus->itemLossTurns == -1) {
script = start_script(RegainAbility, 0xA, 0);
script = start_script(RegainAbility, EVT_PRIORITY_A, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->varTable[10] = 2;
@ -651,7 +651,7 @@ block_27:
Evt* script;
battleStatus->battlePhase = 0xC;
script = start_script(partner->onTurnChanceScriptSource, 0xA, 0);
script = start_script(partner->onTurnChanceScriptSource, EVT_PRIORITY_A, 0);
partner->onTurnChangeScript = script;
partner->onTurnChangeID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
@ -1037,7 +1037,7 @@ void btl_state_update_end_training_battle(void) {
Evt* script;
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
script = start_script(partner->onTurnChanceScriptSource, 0xA, 0);
script = start_script(partner->onTurnChanceScriptSource, EVT_PRIORITY_A, 0);
partner->onTurnChangeScript = script;
gBattleState2 = BATTLE_STATE2_UNK_C;
partner->onTurnChangeID = script->id;
@ -1122,7 +1122,7 @@ void btl_state_update_end_battle(void) {
gBattleState2 = BATTLE_STATE2_UNK_4;
return;
}
script = start_script(stage->postBattle, 0xA, 0);
script = start_script(stage->postBattle, EVT_PRIORITY_A, 0);
battleStatus->controlScript = script;
gBattleState2 = BATTLE_STATE2_UNK_3;
battleStatus->controlScriptID = script->id;
@ -1274,12 +1274,12 @@ void btl_state_update_run_away(void) {
player->state.varTable[0] = 100;
}
battleStatus->battlePhase = 3;
script = start_script(PlayerScriptDispatcher, 0xA, 0);
script = start_script(PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PLAYER;
if (partner != NULL && partner->koStatus == 0) {
script = start_script(partner->takeTurnScriptSource, 0xA, 0);
script = start_script(partner->takeTurnScriptSource, EVT_PRIORITY_A, 0);
partner->takeTurnScript = script;
partner->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
@ -1353,12 +1353,12 @@ void btl_state_update_run_away(void) {
switch (gBattleState2) {
case BATTLE_STATE2_UNK_3:
battleStatus->battlePhase = 7;
script = start_script(PlayerScriptDispatcher, 0xA, 0);
script = start_script(PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PLAYER;
if (partner != NULL && partner->koStatus == 0) {
script = start_script(partner->takeTurnScriptSource, 0xA, 0);
script = start_script(partner->takeTurnScriptSource, EVT_PRIORITY_A, 0);
partner->takeTurnScript = script;
partner->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
@ -1981,7 +1981,7 @@ void btl_state_update_next_enemy(void) {
Evt* onTurnChanceScript;
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
onTurnChanceScript = start_script(enemy->onTurnChanceScriptSource, 0xA, 0);
onTurnChanceScript = start_script(enemy->onTurnChanceScriptSource, EVT_PRIORITY_A, 0);
enemy->onTurnChangeScript = onTurnChanceScript;
enemy->onTurnChangeID = onTurnChanceScript->id;
onTurnChanceScript->owner1.actorID = battleStatus->activeEnemyActorID;
@ -2071,7 +2071,7 @@ void btl_state_update_partner_striking_first(void) {
actor = get_actor(ACTOR_ENEMY0);
if (actor->onHitScriptSource != NULL) {
actor->lastEventType = EVENT_BEGIN_FIRST_STRIKE;
script = start_script(actor->onHitScriptSource, 0xA, 0x20);
script = start_script(actor->onHitScriptSource, EVT_PRIORITY_A, EVT_FLAG_20);
actor->onHitScript = script;
actor->onHitID = script->id;
script->owner1.actorID = actor->actorID;
@ -2094,7 +2094,7 @@ void btl_state_update_partner_striking_first(void) {
btl_cam_target_actor(ACTOR_PARTNER);
reset_actor_turn_info();
battleStatus->battlePhase = PHASE_FIRST_STRIKE;
script = start_script(partner->takeTurnScriptSource, 0xA, 0);
script = start_script(partner->takeTurnScriptSource, EVT_PRIORITY_A, 0);
partner->takeTurnScript = script;
D_8029F248 = 3;
gBattleState2 = BATTLE_STATE2_UNK_2;
@ -2154,7 +2154,7 @@ void btl_state_update_partner_striking_first(void) {
if (actor != NULL) {
if (actor->onHitScriptSource != NULL) {
actor->lastEventType = EVENT_END_FIRST_STRIKE;
script = start_script(actor->onHitScriptSource, 0xA, 0x20);
script = start_script(actor->onHitScriptSource, EVT_PRIORITY_A, EVT_FLAG_20);
actor->onHitScript = script;
actor->onHitID = script->id;
script->owner1.actorID = actor->actorID;
@ -2320,7 +2320,7 @@ void btl_state_update_enemy_striking_first(void) {
enemy = battleStatus->currentTurnEnemy;
reset_actor_turn_info();
battleStatus->battlePhase = 1;
script = start_script(enemy->takeTurnScriptSource, 0xA, 0);
script = start_script(enemy->takeTurnScriptSource, EVT_PRIORITY_A, 0);
enemy->takeTurnScript = script;
D_8029F248 = 3;
enemy->takeTurnID = script->id;
@ -2455,7 +2455,7 @@ void btl_state_update_end_demo_battle(void) {
if (stage->postBattle == NULL) {
gBattleState2 = BATTLE_STATE2_UNK_4;
} else {
battleStatus->controlScript = start_script(stage->postBattle, 0xA, 0);
battleStatus->controlScript = start_script(stage->postBattle, EVT_PRIORITY_A, 0);
gBattleState2 = BATTLE_STATE2_UNK_3;
battleStatus->controlScriptID = battleStatus->controlScript->id;
}

View File

@ -78,8 +78,8 @@ EvtScript BtlBringPartnerOut = {
};
extern s32 D_8029DA30;
extern s32 D_8029DA34;
extern s32 bSavedPartner;
extern s32 bSavedOverrideFlags;
extern s32 D_8029DA40;
extern s32 D_8029DA44;
extern s32 D_8029DA48;
@ -157,7 +157,7 @@ void initialize_battle(void) {
gBattleStatus.flags1 = 0;
gBattleStatus.flags2 = 0;
gBattleStatus.flags1 = 0;
D_8029DA34 = gOverrideFlags;
bSavedOverrideFlags = gOverrideFlags;
gOverrideFlags &= ~GLOBAL_OVERRIDES_80;
gBattleStatus.inputBitmask = -1;
gOverrideFlags &= ~GLOBAL_OVERRIDES_80;
@ -225,7 +225,7 @@ void initialize_battle(void) {
playerData->battlesCount++;
}
D_8029DA30 = playerData->currentPartner;
bSavedPartner = playerData->currentPartner;
if (gBattleStatus.flags2 & BS_FLAGS2_40) {
playerData->currentPartner = PARTNER_TWINK;
}
@ -964,14 +964,14 @@ void btl_restore_world_cameras(void) {
playerStatus->position.y = D_8029EFB4;
playerStatus->position.z = D_8029EFB8;
if (D_8029DA34 & 0x80) {
if (bSavedOverrideFlags & GLOBAL_OVERRIDES_80) {
gOverrideFlags |= GLOBAL_OVERRIDES_80;
} else {
gOverrideFlags &= ~GLOBAL_OVERRIDES_80;
}
if (gBattleStatus.flags2 & 0x40) {
playerData->currentPartner = D_8029DA30;
playerData->currentPartner = bSavedPartner;
}
}

View File

@ -1528,7 +1528,7 @@ void close_action_command_instruction_popup(void) {
void func_8024FB3C(void* data) {
PopupMessage* popup = data;
BattleStatus* battleStatus = &gBattleStatus;
s32 cond = FALSE;
s32 shouldDisposeWindow = FALSE;
s32 temp_a0;
@ -1605,7 +1605,7 @@ void func_8024FB3C(void* data) {
}
break;
case 4:
cond = TRUE;
shouldDisposeWindow = TRUE;
break;
case 3:
popup->unk_16 = 4;
@ -1637,7 +1637,7 @@ void func_8024FB3C(void* data) {
D_8029F64A = TRUE;
if (temp_a0 == 0) {
D_8029F64A = FALSE;
cond = TRUE;
shouldDisposeWindow = TRUE;
break;
}
@ -1783,11 +1783,11 @@ void func_8024FB3C(void* data) {
case 1:
if (gBattleStatus.flags1 & BS_FLAGS1_10000) {
gBattleStatus.flags1 &= ~BS_FLAGS1_4000;
set_window_update(9, 7);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW_TRANSPARENT);
popup->duration = 0;
popup->unk_16 = 2;
} else if (!(gBattleStatus.flags1 & BS_FLAGS1_4000) && (temp_a0 != 2)) {
set_window_update(9, 7);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW_TRANSPARENT);
switch (popup->messageIndex) {
case 49:
hud_element_set_script(D_8029F642, &HES_MashAButton);
@ -1923,7 +1923,7 @@ void func_8024FB3C(void* data) {
break;
}
D_8029F64A = FALSE;
cond = TRUE;
shouldDisposeWindow = TRUE;
}
}
}
@ -1960,7 +1960,7 @@ void func_8024FB3C(void* data) {
popup->unk_16 = 4;
break;
case 4:
cond = TRUE;
shouldDisposeWindow = TRUE;
break;
}
break;
@ -2017,14 +2017,14 @@ void func_8024FB3C(void* data) {
popup->duration--;
break;
}
cond = TRUE;
shouldDisposeWindow = TRUE;
hud_element_free(D_8029F642);
break;
}
break;
}
if (cond) {
set_window_update(9, 2);
if (shouldDisposeWindow) {
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_HIDE);
D_802838F8 = NULL;
free_popup(popup);
}
@ -2354,8 +2354,8 @@ void btl_show_message_popup(void* data) {
width = msgWidth;
numLines = get_msg_lines(messageID) - 1;
height = bMsgHeights[numLines];
set_window_properties(9, posX, posY, width, height, 0, func_80250818, popup, -1);
set_window_update(9, 1);
set_window_properties(WINDOW_ID_9, posX, posY, width, height, 0, func_80250818, popup, -1);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW);
}
break;
case 73:
@ -2371,8 +2371,8 @@ void btl_show_message_popup(void* data) {
posX = 160 - (msgWidth / 2);
width = msgWidth;
height = 40;
set_window_properties(9, posX, posY, width, height, 0, func_80250818, popup, -1);
set_window_update(9, 1);
set_window_properties(WINDOW_ID_9, posX, posY, width, height, 0, func_80250818, popup, -1);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW);
}
break;
case 4:
@ -2396,8 +2396,8 @@ void btl_show_message_popup(void* data) {
width = msgWidth;
numLines = get_msg_lines(messageID) - 1;
height = bMsgHeights[numLines];
set_window_properties(9, posX, posY, width, height, 0, func_80250818, popup, -1);
set_window_update(9, 1);
set_window_properties(WINDOW_ID_9, posX, posY, width, height, 0, func_80250818, popup, -1);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW);
}
break;
case 81:
@ -2412,8 +2412,8 @@ void btl_show_message_popup(void* data) {
width = msgWidth;
numLines = get_msg_lines(messageID) - 1;
height = bMsgHeights[numLines];
set_window_properties(9, posX, posY, width, height, 0, func_80250818, popup, -1);
set_window_update(9, 1);
set_window_properties(WINDOW_ID_9, posX, posY, width, height, 0, func_80250818, popup, -1);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW);
}
break;
case 46:
@ -2456,11 +2456,11 @@ void btl_show_message_popup(void* data) {
D_8029F650 = D_802835D8[numLines];
posY = D_8029F64E + D_8029F650;
set_window_properties(9, posX, posY, width, height, 0, func_80250818, popup, -1);
set_window_properties(WINDOW_ID_9, posX, posY, width, height, 0, func_80250818, popup, -1);
if (popup->messageIndex == 0x3B) {
set_window_update(9, 1);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW);
} else {
set_window_update(9, 8);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW_DARKENED);
}
}
break;

View File

@ -456,54 +456,54 @@ s32 calc_item_damage_enemy(void) {
}
if ((battleStatus->currentAttackStatus & STATUS_FLAG_SLEEP) && wasStatusInflicted) {
script = start_script(DoSleepHit, EVT_PRIORITY_A, 0);
script = start_script(&DoSleepHit, EVT_PRIORITY_A, 0);
script->varTable[0] = state->goalPos.x;
script->varTable[1] = state->goalPos.y;
script->varTable[2] = state->goalPos.z;
sfx_play_sound_at_position(SOUND_INFLICT_SLEEP, 0, state->goalPos.x, state->goalPos.y, state->goalPos.z);
}
if ((battleStatus->currentAttackStatus & STATUS_FLAG_DIZZY) && wasStatusInflicted) {
script = start_script(DoDizzyHit, EVT_PRIORITY_A, 0);
script = start_script(&DoDizzyHit, EVT_PRIORITY_A, 0);
script->varTable[0] = state->goalPos.x;
script->varTable[1] = state->goalPos.y;
script->varTable[2] = state->goalPos.z;
sfx_play_sound_at_position(SOUND_INFLICT_STATUS, 0, state->goalPos.x, state->goalPos.y, state->goalPos.z);
}
if ((battleStatus->currentAttackStatus & STATUS_FLAG_PARALYZE) && wasStatusInflicted) {
script = start_script(DoParalyzeHit, EVT_PRIORITY_A, 0);
script = start_script(&DoParalyzeHit, EVT_PRIORITY_A, 0);
script->varTable[0] = state->goalPos.x;
script->varTable[1] = state->goalPos.y;
script->varTable[2] = state->goalPos.z;
sfx_play_sound_at_position(SOUND_INFLICT_STATUS, 0, state->goalPos.x, state->goalPos.y, state->goalPos.z);
}
if ((battleStatus->currentAttackStatus & STATUS_FLAG_POISON) && wasStatusInflicted) {
script = start_script(DoPoisonHit, EVT_PRIORITY_A, 0);
script = start_script(&DoPoisonHit, EVT_PRIORITY_A, 0);
script->varTable[0] = state->goalPos.x;
script->varTable[1] = state->goalPos.y;
script->varTable[2] = state->goalPos.z;
sfx_play_sound_at_position(SOUND_INFLICT_STATUS, 0, state->goalPos.x, state->goalPos.y, state->goalPos.z);
}
if ((battleStatus->currentAttackStatus & STATUS_FLAG_STOP) && wasStatusInflicted) {
script = start_script(DoStopHit, EVT_PRIORITY_A, 0);
script = start_script(&DoStopHit, EVT_PRIORITY_A, 0);
script->varTable[0] = state->goalPos.x;
script->varTable[1] = state->goalPos.y;
script->varTable[2] = state->goalPos.z;
sfx_play_sound_at_position(SOUND_INFLICT_STATUS, 0, state->goalPos.x, state->goalPos.y, state->goalPos.z);
}
if ((battleStatus->currentAttackStatus & STATUS_FLAG_FROZEN) && wasStatusInflicted) {
script = start_script(DoFreezeHit, EVT_PRIORITY_A, 0);
script = start_script(&DoFreezeHit, EVT_PRIORITY_A, 0);
script->varTable[0] = state->goalPos.x;
script->varTable[1] = state->goalPos.y;
script->varTable[2] = state->goalPos.z;
script->varTable[3] = target;
script->varTablePtr[3] = target;
sfx_play_sound_at_position(SOUND_INFLICT_STATUS, 0, state->goalPos.x, state->goalPos.y, state->goalPos.z);
}
if ((battleStatus->currentAttackStatus & STATUS_FLAG_SHRINK) && wasStatusInflicted) {
script = start_script(DoShrinkHit, EVT_PRIORITY_A, 0);
script = start_script(&DoShrinkHit, EVT_PRIORITY_A, 0);
script->varTable[0] = state->goalPos.x;
script->varTable[1] = state->goalPos.y;
script->varTable[2] = state->goalPos.z;
script->varTable[3] = target;
script->varTablePtr[3] = target;
sfx_play_sound_at_position(SOUND_INFLICT_STATUS, 0, state->goalPos.x, state->goalPos.y, state->goalPos.z);
}
if ((battleStatus->currentAttackElement & DAMAGE_TYPE_SMASH) && (target->actorType == ACTOR_TYPE_GOOMNUT_TREE)) {

View File

@ -618,7 +618,7 @@ void btl_state_update_celebration(void) {
hud_element_set_tint(id, 128, 128, 128);
x = 20;
y = 186;
set_window_properties(8, 20, 186, 280, 32, 20, func_80260948, NULL, -1);
set_window_properties(WINDOW_ID_8, 20, 186, 280, 32, 20, func_80260948, NULL, -1);
set_window_update(WINDOW_ID_8, WINDOW_UPDATE_SHOW);
gBattleState2 = BATTLE_STATE2_UNK_8;
}
@ -769,7 +769,7 @@ void btl_state_update_celebration(void) {
width = get_msg_width(0x1D00AB, 0) + 31;
x = 160 - (width / 2);
y = 80;
set_window_properties(9, x, y, width, 28, 10, func_80260A20, NULL, -1);
set_window_properties(WINDOW_ID_9, x, y, width, 28, 10, func_80260A20, NULL, -1);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW);
D_8029FB4C = 60;
gBattleState2 = BATTLE_STATE2_UNK_10;

View File

@ -1,348 +0,0 @@
#include "common.h"
#include "audio.h"
void snd_SEFCmd_00_SetVolume(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_01_SetPan(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_02_SetInstrument(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_03_SetReverb(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_04(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_05(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_06(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_07(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_08(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_09_StartLoop(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_0A_EndLoop(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_0B(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_0C(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_0D(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_0E(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_0F(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_10_Jump(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_13(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_14(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_15(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_16(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_17(SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_18(SoundManager* manager, SoundPlayer* player);
void func_8004B440(SoundManager* manager, u8 arg1, u8 arg2, UnkAl19E0* arg3, u8 arg4) {
u32 i;
s32 c = 0x6A25E;
manager->soundData = arg3;
manager->unkCounterStep = 312500;
manager->unkCounterMax = manager->unkCounter = c;
manager->unk_BC = arg1;
manager->unk_BE = arg2;
if (arg4 > 0x10) {
manager->sfxPlayerSelector = 0x10;
} else {
manager->sfxPlayerSelector = arg4;
}
manager->unk_5C = 0x8000;
manager->unk_B8 = 0x8000;
manager->playCounter = 0;
manager->unk_60 = 0;
for (i = 0; i < ARRAY_COUNT(manager->unk_16C); i++) {
SoundPlayer* sub = &manager->unk_16C[i];
sub->sefDataReadPos = 0;
sub->sfxVolume = 0;
sub->unk_8E = 0;
sub->unk_90 = 0;
sub->unk_92 = 0;
sub->unk_94 = 0;
sub->sfxPan = 0;
sub->reverb = 0;
sub->instrumentIndex = 0;
sub->unk_9E = 0;
sub->unk_9F = 0;
sub->unk_99 = 0;
sub->locatorB = 0;
sub->locatorC = 0;
sub->locatorD = 0;
sub->unk_7B = 0x40;
sub->unk_7C = 0;
sub->unk_7D = 0xB0;
sub->unk_7E = 0;
sub->unk_7F = 0;
}
for (i = 0; i < ARRAY_COUNT(manager->unk_90); i++) {
manager->unk_90[i] = 0;
}
for (i = 0; i < ARRAY_COUNT(manager->unk_A0); i++) {
manager->unk_A0[i].x = 0;
}
manager->unk_168 = 0;
func_8004BA54(manager, 0);
snd_clear_sfx_queue(manager);
snd_initialize_bgm_fade(&manager->unk_40, 0, 0x7FFF, 0x7FFF);
func_80053A98(manager->unk_BE, manager->unk_40.currentVolume.u16, manager->unk_5C);
manager->unk_8C = 0xFF;
manager->unk_64[0] = &D_80078290;
manager->unk_64[1] = &D_800782F8;
manager->unk_64[2] = &D_80078320;
manager->unk_64[3] = &D_80078348;
manager->unk_64[4] = &D_80078348;
manager->unk_64[5] = &D_80078348;
manager->unk_64[6] = &D_80078348;
manager->unk_64[7] = &D_80078348;
manager->unk_84[0] = 0x10;
manager->unk_84[1] = 0x20;
manager->unk_84[2] = 0x20;
manager->unk_84[3] = 0x20;
manager->unk_84[4] = 0x20;
manager->unk_84[5] = 0x30;
manager->unk_84[6] = 0x40;
manager->unk_84[7] = 0x50;
func_8004B9E4(manager, 0);
}
INCLUDE_ASM(void, "26840_len_20d0", snd_load_sfx_groups_from_SEF, SoundManager* manager);
void snd_clear_sfx_queue(SoundManager* manager) {
s32 i;
for (i = 0; i < ARRAY_COUNT(manager->unk_C2); i++) {
manager->unk_C2[i].soundID = 0;
manager->unk_C2[i].upperSoundID = 0;
manager->unk_C2[i].volume = 0;
manager->unk_C2[i].pitchShift = 0;
manager->unk_C2[i].pan = 0;
}
manager->unk_165 = 0;
manager->sfxQueueNextPos = 0;
manager->sfxQueuePosOffset = 0;
manager->unk_162 = 0;
}
void snd_enqueue_sfx_event(SoundManager* manager, s32 soundID, s16 volume, s16 pitchShift, u8 pan) {
u32 queuePos = manager->sfxQueueNextPos;
s32 queueAmt = manager->sfxQueueNextPos - manager->sfxQueuePosOffset;
if (queueAmt < 0) {
queueAmt += 16;
}
if (queueAmt < 16) {
u32 queueNextPos = queuePos;
manager->unk_C2[queueNextPos].soundID = soundID & 0xBFFF;
manager->unk_C2[queueNextPos].upperSoundID = (((u32) soundID >> 0x10) & 0x3FF);
manager->unk_C2[queueNextPos].volume = volume;
manager->unk_C2[queueNextPos].pitchShift = pitchShift;
manager->unk_C2[queueNextPos].pan = pan;
queueNextPos++;
if (queueNextPos >= 16) {
queueNextPos = 0;
}
manager->sfxQueueNextPos = queueNextPos;
}
}
INCLUDE_ASM(void, "26840_len_20d0", func_8004B748, SoundManager* manager);
s32 func_8004B9E4(SoundManager* manager, s32 arg1) {
s32 a1 = (u8) arg1;
if (a1 != 0xF0) {
if (a1 < 8) {
if (manager->unk_8C != a1) {
manager->unk_8C = a1;
manager->soundData->unk_40[1].unk_00 = 6;
manager->soundData->unk_40[1].unk_01 = 1;
D_8007F1F8[0] = manager->unk_64[a1];
}
manager->unk_8D = manager->unk_84[a1];
} else {
manager->unk_8C = 0xFF;
manager->unk_8D = 0;
}
}
return manager->unk_8C;
}
void func_8004BA54(SoundManager* manager, s32 arg1) {
if (arg1 == 0) {
manager->unk_C0 = 0;
} else if (arg1 == 1) {
manager->unk_C0 = 1;
}
}
INCLUDE_ASM(s32, "26840_len_20d0", func_8004BA74);
INCLUDE_ASM(s32, "26840_len_20d0", func_8004C0E4);
INCLUDE_ASM(s32, "26840_len_20d0", func_8004C268);
INCLUDE_ASM(s32, "26840_len_20d0", func_8004C2A4);
INCLUDE_ASM(s32, "26840_len_20d0", func_8004C300);
INCLUDE_ASM(void, "26840_len_20d0", snd_set_modifiers, SoundManager* manager, SoundSFXEntry* sfxEntry);
void snd_set_player_modifiers(SoundManager* manager, SoundSFXEntry* sfxEntry);
INCLUDE_ASM(void, "26840_len_20d0", snd_set_player_modifiers, SoundManager* manager, SoundSFXEntry* sfxEntry);
void func_8004C578(SoundManager*, SoundPlayer*, UnkAl48*, u32);
void func_8004C884(SoundManager*, SoundPlayer*, UnkAl48*, u32);
s16 func_8004C444(SoundManager* arg0) {
u32 phi_a3 = arg0->sfxPlayerSelector;
u16 temp = arg0->unk_60;
u16 playCounter = arg0->playCounter;
SoundPlayer* temp_a1;
UnkAl48* temp_a2;
u8 i;
arg0->unk_60 = temp + playCounter;
for (i = phi_a3, phi_a3 += 8; i < (u8)phi_a3; i++){
temp_a1 = &arg0->unk_16C[i - arg0->sfxPlayerSelector];
if (temp_a1->sefDataReadPos != 0) {
arg0->unk_04 = temp_a2 = &arg0->soundData->unk_1320[i];
if (arg0->unk_04->unk_45 <= arg0->unk_BC) {
arg0->unk_BF = i;
switch (temp_a1->sfxParamsFlags & 3) {
case 0:
func_8004C578(arg0, temp_a1, temp_a2, i);
break;
case 1:
func_8004C884(arg0, temp_a1, temp_a2, i);
break;
case 2: // Yes, this is needed.
break;
}
} else {
temp_a1->sefDataReadPos = NULL;
temp_a1->currentSoundID = 0;
temp_a1->unk_98 = 0;
}
}
}
return 0;
}
INCLUDE_ASM(s32, "26840_len_20d0", func_8004C578);
INCLUDE_ASM(s32, "26840_len_20d0", snd_get_scaled_volume);
INCLUDE_ASM(s32, "26840_len_20d0", func_8004C884);
INCLUDE_ASM(s32, "26840_len_20d0", snd_set_voice_volume);
INCLUDE_ASM(s32, "26840_len_20d0", func_8004CDF8);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_00_SetVolume, SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_01_SetPan(SoundManager* manager, SoundPlayer* player) {
s8 sfxPan = *player->sefDataReadPos;
player->sefDataReadPos++;
player->changedPan = TRUE;
player->sfxPan = sfxPan;
}
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_02_SetInstrument, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_03_SetReverb, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_04, SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_05(SoundManager* manager, SoundPlayer* player) {
s32 temp_v1 = *player->sefDataReadPos;
player->sefDataReadPos++;
player->unk_92 = temp_v1 * 100;
}
void snd_SEFCmd_06(SoundManager* manager, SoundPlayer* player) {
s8 temp_v1 = *player->sefDataReadPos;
player->sefDataReadPos++;
player->unk_94 = temp_v1;
}
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_07, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_08, SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_09_StartLoop(SoundManager* manager, SoundPlayer* player) {
s8 loopIterCount = *player->sefDataReadPos;
player->sefDataReadPos++;
player->loopStartPos = player->sefDataReadPos;
player->loopIterCount = loopIterCount;
}
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_0A_EndLoop, SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_0B(SoundManager* manager, SoundPlayer* player) {
if (player->unk_90 != 0) {
player->unk_8E = 3;
player->sefDataReadPos--;
}
}
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_0C, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_0D, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_0E, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_0F, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_10_Jump, SoundManager* manager, SoundPlayer* player);
void snd_SEFCmd_11_Restart(SoundManager* manager, SoundPlayer* player) {
player->sefDataReadPos = player->sefReadStart;
}
void snd_SEFCmd_12_NOP(SoundManager* manager, SoundPlayer* player) {
}
void snd_SEFCmd_13(SoundManager* manager, SoundPlayer* player) {
s8 temp_v1 = *player->sefDataReadPos;
player->sefDataReadPos++;
player->unk_A1 = temp_v1;
}
void snd_SEFCmd_14(SoundManager* manager, SoundPlayer* player) {
s8 temp_v1 = *player->sefDataReadPos;
player->sefDataReadPos++;
player->unk_A2 = temp_v1;
}
void snd_SEFCmd_15(SoundManager* manager, SoundPlayer* player) {
s8 temp_v1 = *player->sefDataReadPos;
player->sefDataReadPos++;
player->unk_A3 = temp_v1;
}
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_16, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_17, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(void, "26840_len_20d0", snd_SEFCmd_18, SoundManager* manager, SoundPlayer* player);
INCLUDE_ASM(s32, "26840_len_20d0", func_8004D428);
INCLUDE_ASM(s32, "26840_len_20d0", func_8004D484);
INCLUDE_ASM(s32, "26840_len_20d0", func_8004D4BC);

View File

@ -1,497 +0,0 @@
#include "audio.h"
INCLUDE_ASM(void, "28910_len_5090", func_8004D510, BGMPlayer* arg0);
// Return values are being pushed into v0 in the wrong place
// May depend on data decomp
#ifdef NON_EQUIVALENT
BGMPlayer* snd_get_player_with_song_name(s32 songString) {
UnkAl19E0* temp_v1 = D_8009A664->data;
if (songString == temp_v1->currentTrackData[0][2]) {
return D_8009A664;
}
if (songString == temp_v1->currentTrackData[1][2]) {
return D_8009A5FC;
}
return NULL;
}
#else
INCLUDE_ASM(BGMPlayer*, "28910_len_5090", snd_get_player_with_song_name, s32 songString);
#endif
INCLUDE_ASM(s32, "28910_len_5090", snd_dispatch_bgm_player_event);
s32 func_8004DA0C(s32 songName) {
s32 ret = 0;
if (songName != 0) {
BGMPlayer* player = snd_get_player_with_song_name(songName);
do {} while (0);
do {
if (player == NULL) {
ret = 2;
} else if (songName == player->songName) {
func_8004DAA8(player);
ret = 0;
}
} while (0);
} else {
ret = 3;
}
return ret;
}
void func_8004DA74(void) {
func_8004DAA8(D_8009A664);
func_8004DAA8(D_8009A5FC);
}
void func_8004DAA8(BGMPlayer* player) {
if (player->unk_221 != 0) {
player->unk_221 = 4;
player->unk_10 = 1;
player->unkFrequency = 1;
snd_clear_bgm_fade(&player->fadeInfo);
}
}
s32 snd_is_song_playing(s32 songName) {
if (songName != 0) {
BGMPlayer* player = snd_get_player_with_song_name(songName);
if (player != NULL) {
return songName == player->songName;
}
return 2;
}
return 3;
}
INCLUDE_ASM(s32, "28910_len_5090", func_8004DB28);
INCLUDE_ASM(s32, "28910_len_5090", func_8004DB4C);
INCLUDE_ASM(s32, "28910_len_5090", func_8004DC80);
INCLUDE_ASM(s32, "28910_len_5090", func_8004DCB8);
INCLUDE_ASM(s32, "28910_len_5090", func_8004DE2C);
INCLUDE_ASM(void, "28910_len_5090", func_8004DFD4, UnkAl19E0* arg0);
INCLUDE_ASM(s32, "28910_len_5090", func_8004E0F4);
void func_8004E158(BGMPlayer* player, s32 arg1, s32 arg2, UnkAl19E0* arg3) {
s16 i;
player->data = arg3;
func_8004E880(player, 0x2625A, 0x30);
player->unk_48 = 0x8000;
player->unk_B0 = 0x3CF0;
player->unk_C0 = 0x7F000000;
player->unk_22B = 1;
player->unk_14 = 0;
player->unk_18 = 0;
player->songName = 0;
player->fadeSongName = 0;
player->unk_58 = 0;
player->unk_5A = 0;
player->unk_68 = 0;
player->unk_6C = 0;
player->unk_70 = 0;
player->unk_BC = 0;
player->unk_B8 = 0;
player->unk_B4 = 0;
player->unk_CC = 0;
player->unk_C8 = 0;
player->unk_C4 = 0;
player->unk_20C = 0;
player->unk_20E = 0;
player->unk_220 = 0;
player->unk_204 = 0;
player->unk_232 = 0;
player->unk_221 = 0;
player->unk_234 = arg1;
player->unk_235 = arg2;
player->unk_168 = 0;
player->unk_222 = 0;
player->unk_223 = 0;
player->unk_22A = 0;
player->unk_22C = 0;
player->unk_D0 = 1.0f;
player->unk_22D = 0;
player->unk_22F = 2;
player->unk_230 = 3;
player->unk_22E = 0;
player->unk_231 = 4;
for (i = 0; i < ARRAY_COUNT(player->unk_25C); i++) {
BGMPlayerTrack* temp = &player->unk_25C[i];
temp->subTrackVolume = 0;
temp->unk_28 = 0;
temp->subTrackCoarseTune = 0;
temp->subTrackFineTune = 0;
temp->subTrackPan = 0;
temp->subTrackReverb = 0;
temp->unk_44 = 0;
temp->unk_58 = 0;
temp->segTrackVolume = 0x7F;
temp->unk_4C = 0;
if (i < ARRAY_COUNT(player->unk_238)) {
player->unk_238[i] = 0;
}
}
for (i = 0; i < ARRAY_COUNT(player->unk_85C); i++) {
UnkAl24* temp = &player->unk_85C[i];
temp->unk_08 = 0;
temp->unk_0A = 0;
temp->unk_0C = 0;
temp->unk_14 = 0;
temp->unk_16 = 0;
temp->unk_17 = 0;
}
func_80053AEC(&player->fadeInfo, 0x7FFF);
func_80055110(player);
}
INCLUDE_ASM(s32, "28910_len_5090", func_8004E344);
void snd_update_bgm_fade(BGMPlayer* player) {
player->fadeInfo.fadeTime--;
if (player->fadeInfo.fadeTime != 0) {
player->fadeInfo.currentVolume.s32 += player->fadeInfo.fadeStep;
} else {
player->fadeInfo.currentVolume.s32 = player->fadeInfo.endVolume << 16;
if (player->fadeInfo.fpFadeCallback != NULL) {
player->fadeInfo.fpFadeCallback();
}
if (player->fadeSongName != 0) {
func_8004DC80(player->fadeSongName);
} else if (player->fadeInfo.currentVolume.s32 == 0) {
func_8004DAA8(player);
}
}
func_8004E444(player);
}
void func_8004E444(BGMPlayer* arg0) {
u16 mult = (arg0->fadeInfo.currentVolume.u16 * arg0->fadeInfo.unk_10.u16) >> 15;
s32 i;
for (i = 0; i < 4; i++) {
s8 temp = arg0->unk_4C[i];
if (temp < 0) {
return;
}
func_80053A98(temp, mult, arg0->unk_48);
}
}
INCLUDE_ASM(s16, "28910_len_5090", func_8004E4B8, BGMPlayer* player);
INCLUDE_ASM(s32, "28910_len_5090", snd_initialize_bgm_player, BGMPlayer* player);
INCLUDE_ASM(s32, "28910_len_5090", func_8004E844);
INCLUDE_ASM(s32, "28910_len_5090", func_8004E880);
INCLUDE_ASM(s32, "28910_len_5090", func_8004E904);
INCLUDE_ASM(s32, "28910_len_5090", func_8004EA34);
INCLUDE_ASM(s32, "28910_len_5090", func_8004EAD4);
INCLUDE_ASM(s32, "28910_len_5090", func_8004EC04);
INCLUDE_ASM(s32, "28910_len_5090", func_8004EC68);
void snd_BGMCmd_E0_MasterTempo(BGMPlayer* player, BGMPlayerTrack* track) {
u32 unk_D4 = player->unk_D4.u16;
s32 temp_v0;
player->unk_208 = unk_D4;
temp_v0 = snd_bpm_to_tempo(player, unk_D4);
player->unk_B0 = temp_v0;
player->unkFrequency = temp_v0 * 10;
player->unk_BC = 0;
player->unk_B8 = 0;
player->unk_B4 = 0;
}
s32 snd_bpm_to_tempo(BGMPlayer* player, u32 tempo) {
u32 unk_20A = player->unk_20A;
u32 ret = tempo;
ret *= player->unk_D0;
if (unk_20A < ret) {
ret = unk_20A;
} else if (ret == 0) {
ret = 1;
}
return ret * 100;
}
void snd_BGMCmd_E1_MasterVolume(BGMPlayer* player, BGMPlayerTrack* track) {
s32 unk_D4 = player->unk_D4.u8[0] & 0x7F;
if (unk_D4 != 0) {
unk_D4 = unk_D4 << 0x18;
}
player->unk_C0 = unk_D4;
player->unk_CC = 0;
player->unk_C8 = 0;
player->unk_C4 = 0;
player->unk_21A = 1;
track->volumeChanged = 1;
}
void snd_BGMCmd_E2_MasterTranspose(BGMPlayer* player, BGMPlayerTrack* track) {
player->unk_20C = (s8)player->unk_D4.u8[0] * 100;
}
void snd_BGMCmd_E3(BGMPlayer* player, BGMPlayerTrack* track) {
player->data->unk_40[player->unk_235].unk_00 = player->unk_D4.u8[0];
player->data->unk_40[player->unk_235].unk_01 = 1;
}
void snd_BGMCmd_E6_MasterEffect(BGMPlayer* player, BGMPlayerTrack* track) {
u8 unk_D4 = player->unk_D4.u8[0];
u32 temp_v1 = player->unk_4C[unk_D4];
if ((unk_D4 < 4) && (temp_v1 < 0x80)) {
if (player->data->unk_40[temp_v1].unk_00 != player->unk_D4.u8[1]) {
player->data->unk_40[temp_v1].unk_00 = player->unk_D4.u8[1];
player->data->unk_40[temp_v1].unk_01 = 1;
}
player->unk_224[unk_D4] = player->unk_D4.u8[1];
}
}
void snd_BGMCmd_E4_MasterTempoFade(BGMPlayer* player, BGMPlayerTrack* track) {
s32 unk_D4 = player->unk_D4.u16;
s32 temp_a0 = snd_bpm_to_tempo(player, player->unk_D6.u16);
s32 temp_v0;
if (unk_D4 <= 0) {
unk_D4 = 1;
}
temp_v0 = (temp_a0 - player->unk_B0) / unk_D4;
player->unk_BC = unk_D4;
player->unk_B8 = temp_a0;
player->unk_B4 = temp_v0;
}
void snd_BGMCmd_E5_MasterVolumeFade(BGMPlayer* player, BGMPlayerTrack* track) {
s32 temp_a1 = player->unk_D4.u16;
s32 temp_a2 = player->unk_D6.u8[0] & 0x7F;
if (temp_a2 != 0) {
temp_a2 = temp_a2 << 0x18;
}
if (temp_a1 <= 0) {
temp_a1 = 1;
}
player->unk_CC = temp_a1;
player->unk_C8 = temp_a2;
player->unk_C4 = (temp_a2 - player->unk_C0) / temp_a1;
}
void snd_BGMCmd_E8_TrackOverridePatch(BGMPlayer* player, BGMPlayerTrack* track) {
track->unk_44 = player->unk_D4.u8[1];
track->unk_0C = func_80053BE8(player->data, player->unk_D4.u8[0], track->unk_44, track->unk_10);
}
void snd_BGMCmd_E9_SubTrackVolume(BGMPlayer* arg0, BGMPlayerTrack* track) {
u32 unk_D4 = arg0->unk_D4.u8[0] & 0x7F;
if (unk_D4 != 0) {
unk_D4 = unk_D4 << 0x18;
}
track->subTrackVolume = unk_D4;
track->volumeChanged = 1;
}
void snd_BGMCmd_F6_TrackVolumeFade(BGMPlayer* player, BGMPlayerTrack* track) {
s32 temp_a0 = player->unk_D6.u8[0] & 0x7F;
s32 temp_a2 = player->unk_D4.u16;
if (temp_a0 != 0) {
temp_a0 = temp_a0 << 0x18;
}
if (temp_a0 != track->subTrackVolume) {
if (temp_a2 <= 0) {
temp_a2 = 1;
}
track->subTrackVolumeFadeTime = temp_a2;
track->subTrackVolumeFadeVolume = temp_a0;
track->subTrackVolumeFadeDelta = (temp_a0 - track->subTrackVolume) / temp_a2;
}
}
void snd_BGMCmd_EA_SubTrackPan(BGMPlayer* player, BGMPlayerTrack* track) {
track->subTrackPan = player->unk_D4.u8[0] & 0x7F;
track->unk_57 = 0;
track->panChanged = 1;
}
void snd_BGMCmd_EB_SubTrackReverb(BGMPlayer* player, BGMPlayerTrack* track) {
track->subTrackReverb = player->unk_D4.u8[0] & 0x7F;
track->reverbChanged = 1;
}
void snd_BGMCmd_EC_SegTrackVolume(BGMPlayer* player, BGMPlayerTrack* track) {
track->segTrackVolume = player->unk_D4.u8[0] & 0x7F;
track->volumeChanged = 1;
}
void snd_BGMCmd_ED_SubTrackCoarseTune(BGMPlayer* player, BGMPlayerTrack* track) {
track->subTrackCoarseTune = (s8)player->unk_D4.u8[0] * 100;
}
void snd_BGMCmd_EE_SubTrackFineTune(BGMPlayer* player, BGMPlayerTrack* track) {
track->subTrackFineTune = player->unk_D4.u8[0];
}
void snd_BGMCmd_EF_SegTrackTune(BGMPlayer* player, BGMPlayerTrack* track) {
track->segTrackTune = player->unk_D4.u16;
track->tuneChanged = 1;
}
void snd_BGMCmd_F0_TrackTremolo(BGMPlayer* player, BGMPlayerTrack* track) {
track->trackTremoloAmount = player->unk_D4.u8[0];
track->trackTremoloSpeed = player->unk_D4.u8[1];
track->trackTremoloTime = player->unk_D6.u8[0];
}
void snd_BGMCmd_F1_TrackTremoloSpeed(BGMPlayer* player, BGMPlayerTrack* track) {
track->trackTremoloSpeed = player->unk_D4.u8[0];
}
void snd_BGMCmd_F2_TrackTremoloTime(BGMPlayer* player, BGMPlayerTrack* track) {
track->trackTremoloTime = player->unk_D4.u8[0];
}
void snd_BGMCmd_F3_TrackTremoloStop(BGMPlayer* player, BGMPlayerTrack* track) {
track->trackTremoloTime = 0;
}
void snd_BGMCmd_F4(BGMPlayer* player, BGMPlayerTrack* track) {
track->subTrackPan = player->unk_D4.u8[0] & 0x7F;
track->unk_57 = player->unk_D4.u8[1] & 0x7F;
}
INCLUDE_ASM(void, "28910_len_5090", snd_BGMCmd_F5_TrackVoice, BGMPlayer* player, BGMPlayerTrack* track);
void snd_BGMCmd_F7_SubTrackReverbType(BGMPlayer* player, BGMPlayerTrack* track) {
u8 temp_v0 = player->unk_D4.u8[0];
u8 temp_v1 = player->unk_4C[temp_v0];
if ((temp_v0 < 4) && ((s8)temp_v1 >= 0)) {
track->subtrackReverbType = temp_v1;
} else {
track->subtrackReverbType = player->unk_235;
}
}
// unk_D4 type shenanigans
#ifdef NON_EQUIVALENT
void snd_BGMCmd_FD(BGMPlayer* player, BGMPlayerTrack* track) {
func_800560BC(player->unk_234, track->unk_5C, player->unk_D4.u16 >> 8);
}
#else
INCLUDE_ASM(void, "28910_len_5090", snd_BGMCmd_FD, BGMPlayer* player, BGMPlayerTrack* track);
#endif
void snd_BGMCmd_FE(BGMPlayer* player, BGMPlayerTrack* track) {
s32 temp = player->unk_D4.u16 + (s32)player->unk_64;
track->unk_3E = player->unk_D6.u8[0];
track->unk_04 = track->bgmReadPos;
track->bgmReadPos = temp;
}
INCLUDE_ASM(void, "28910_len_5090", snd_BGMCmd_FC_Jump, BGMPlayer* player, BGMPlayerTrack* track);
INCLUDE_ASM(void, "28910_len_5090", snd_BGMCmd_FF, BGMPlayer* player, BGMPlayerTrack* track);
void snd_BGMCmd_NOP(BGMPlayer* player, BGMPlayerTrack* track) {
}
INCLUDE_ASM(s32, "28910_len_5090", func_80050568);
INCLUDE_ASM(s32, "28910_len_5090", func_800505E4);
INCLUDE_ASM(s32, "28910_len_5090", func_80050654);
INCLUDE_ASM(s32, "28910_len_5090", func_8005068C);
INCLUDE_ASM(s32, "28910_len_5090", func_800506C8, s32 arg0, s32 arg1);
void func_80050770(BGMPlayer* player, f32 arg1) {
if (arg1 > 2.0) {
arg1 = 2.0f;
} else if (arg1 < 0.25) {
arg1 = 0.25f;
}
player->unk_D0 = arg1;
player->unk_B0 = snd_bpm_to_tempo(player, player->unk_208);
player->unkFrequency = player->unk_B0 * 10;
player->unk_BC = 0;
player->unk_B8 = 0;
player->unk_B4 = 0;
}
void func_80050818(BGMPlayer* player, s32 arg1) {
if (arg1 > 1200) {
arg1 = 1200;
} else if (arg1 < -2400) {
arg1 = -2400;
}
player->unk_20E = arg1;
}
void func_8005083C(BGMPlayer* arg0, s32 arg1, s16 arg2, s8 arg3) {
BGMPlayerTrack* temp_a1 = &arg0->unk_25C[arg1];
if (temp_a1->bgmReadPos != 0) {
arg0->unk_D4.u16 = arg2;
arg0->unk_D6.u8[0] = arg3;
snd_BGMCmd_F6_TrackVolumeFade(arg0, temp_a1);
}
}
void func_8005087C(BGMPlayer* player, s32* arg1, s32 arg2) {
player->unk_204 = arg1;
player->unk_232 = arg2;
}
INCLUDE_ASM(s32, "28910_len_5090", func_80050888);
INCLUDE_ASM(s32, "28910_len_5090", func_80050900);
INCLUDE_ASM(s32, "28910_len_5090", func_80050970);

View File

@ -1,97 +0,0 @@
#include "audio.h"
INCLUDE_ASM(s32, "2BF90", func_80050B90);
s32 func_80050C30(u32 arg0) {
if (D_8009A628->unk_20 <= arg0) {
return 3;
} else {
return 0;
}
}
void func_80050C54(s32 arg0, s8 arg1) {
D_8009A628->unk_21 = arg1;
}
INCLUDE_ASM(s32, "2BF90", func_80050C64);
INCLUDE_ASM(s32, "2BF90", func_80050CA0);
INCLUDE_ASM(void, "2BF90", func_80050D50, UnkAl1E4* arg0);
INCLUDE_ASM(s32, "2BF90", func_80050E18);
INCLUDE_ASM(s32, "2BF90", func_80050E84);
INCLUDE_ASM(s32, "2BF90", func_80050EF0);
INCLUDE_ASM(s32, "2BF90", func_80050F64);
INCLUDE_ASM(s32, "2BF90", func_80050FD0);
INCLUDE_ASM(s32, "2BF90", func_80051050);
INCLUDE_ASM(s32, "2BF90", func_800510A4);
void func_800511BC(UnkAl834* arg0) {
u32 i;
s32 j;
for (i = 0; i < ARRAY_COUNT(arg0->unk_7B4); i++) {
UnkAl8* temp = &arg0->unk_7B4[i];
if ((temp->unk_00.u8[3] == 1) && (arg0->unk_00->unk_1320[i].unk_45 != arg0->unk_22)) {
temp->unk_00.s32 = 0;
}
}
for (j = 0; j < ARRAY_COUNT(arg0->unk_24); j++) {
UnkAl1E4* temp = &arg0->unk_24[j];
s32 var;
if (temp->unk_08 != 0) {
if (arg0->unk_21 != 0) {
func_80051334(arg0, temp);
}
var = temp->unk_24;
if (var != 0) {
if (var == 3) {
temp->unk_24 = 2;
func_800522A8(arg0, temp);
func_800521E8(arg0, temp);
} else if (temp->unk_24 == 1) {
temp->unk_24 = 0;
if (temp->unk_28 != 0) {
func_80050D50(temp);
}
func_8005232C(arg0, temp);
}
} else {
if (temp->unk_28 != 0) {
func_80050D50(temp);
}
if (temp->unk_25 == 2) {
func_800521E8(arg0, temp);
temp->unk_25 = 1;
}
func_80051434(arg0, temp);
}
}
}
arg0->unk_21 = 0;
}
INCLUDE_ASM(void, "2BF90", func_80051334, UnkAl834* arg0, UnkAl1E4* arg1);
INCLUDE_ASM(void, "2BF90", func_80051434, UnkAl834* arg0, UnkAl1E4* arg1);
INCLUDE_ASM(s32, "2BF90", func_800521D0);
INCLUDE_ASM(void, "2BF90", func_800521E8, UnkAl834* arg0, UnkAl1E4* arg1);
INCLUDE_ASM(void, "2BF90", func_800522A8, UnkAl834* arg0, UnkAl1E4* arg1);
INCLUDE_ASM(void, "2BF90", func_8005232C, UnkAl834* arg0, UnkAl1E4* arg1);

View File

@ -1,58 +0,0 @@
#include "common.h"
#include "audio.h"
void func_800525A0(UnkAl19E0* arg0) {
s32 i;
for (i = 0; i < ARRAY_COUNT(arg0->unk_1320); i++) {
UnkAl48* temp = &arg0->unk_1320[i];
if (temp->unk_42 != 0) {
func_80056EE8(i);
temp->unk_42 = 0;
temp->unk_1C = NULL;
temp->unk_45 = 0;
}
}
}
void func_80052614(UnkAl19E0* arg0) {
s32 i;
for (i = 0; i < ARRAY_COUNT(arg0->unk_1320); i++) {
UnkAl48* temp = &arg0->unk_1320[i];
temp->unk_1C = 0;
temp->unk_20 = 0;
temp->unk_24 = 0;
temp->unk_28 = 0;
temp->unk_3B = 0;
temp->unk_3C = 0;
temp->unk_3D = 0;
temp->unk_3E = 0;
temp->unk_3F = 0x80;
}
}
INCLUDE_ASM(void, "2d9a0_len_890", func_80052660, UnkAl19E0* arg0);
void func_80052B44(UnkAl48* arg0) {
s32 temp_lo = ((arg0->unk_3A * arg0->unk_40 * arg0->unk_3F) >> 14) * arg0->unk_30;
arg0->unk_0C = temp_lo >> 7;
arg0->unk_08 = func_80052BC0(arg0->unk_28);
arg0->unk_3D &= ~0x2;
arg0->unk_43 |= 0x4;
}
s32 func_80052BC0(s32 arg0) {
return (arg0 / 5750) * 0xB8;
}
INCLUDE_ASM(void, "2d9a0_len_890", func_80052BF8, UnkAl48* arg0, s32* arg1);
INCLUDE_ASM(s32, "2d9a0_len_890", func_80052CFC, UnkAl48* arg0);
void func_80052E18(UnkAl48* arg0) {
arg0->unk_3D |= 0x20;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,610 +0,0 @@
#include "common.h"
#include "audio.h"
s32 D_80078DB0 = 0;
u16 D_80078DB4 = 0;
u16 D_80078DB6 = 0;
// chunks of data, not sure what
s32 D_80078DB8[] = { 0x025E0350, 0x04640554, 0x00000000, };
s32 D_80078DC4[] = { 0x0264036E, 0x045A0000, };
s32 D_80078DCC[] = { 0x025F0000, };
s32 D_80078DD0[] = { 0x0546065A, 0x075A0864, 0x00000000, };
s32 D_80078DDC[] = { 0x05000600, 0x07000800, 0x09000A00, 0x0B000C00, 0x0D000E00, 0x0F001000, 0x00000000, };
s32 D_80078DF8[] = { 0x05640666, 0x0758086E, 0x09000A00, 0x0B000C00, 0x0D000E00, 0x0F001000, 0x00000000, };
s32 D_80078E14[] = { 0x05640666, 0x0758086E, 0x097E0A58, 0x0B640C00, 0x0D000E00, 0x0F001000, 0x00000000, };
s32 D_80078E30[] = { 0x05640666, 0x0758086E, 0x097E0A58, 0x0B640C64, 0x0D6A0E64, 0x0F64106E, 0x00000000, 0x00000000, };
void func_80055050(ALHeap* heap) {
D_80078DB4 = 1;
D_80078DB0 = 0;
}
void func_80055068(u32 arg0) {
u16 temp_a0 = D_80078DB4;
u32 temp_v1 = arg0 & 0xF;
if (temp_a0 == 1) {
switch (temp_v1) {
case 2:
case 3:
break;
case 4:
snd_start_sound_with_shift(arg0 >> 4, 0, 0, 0);
break;
case 1:
if (temp_v1 == temp_a0) {
s32 filename = snd_load_song((arg0 >> 4) & 0xFF, 0);
if (filename > ASCII_TO_U32('0', ' ', ' ', '\0')) {
snd_start_song_variation(filename, (arg0 >> 0xC) & 3);
}
}
break;
}
}
}
void func_80055110(BGMPlayer* player) {
s32 i;
for (i = 0; i < ARRAY_COUNT(player->unk_238); i++) {
player->unk_238[i] = 0;
}
player->unk_25B = 0;
player->unk_25A = 0;
player->unk_259 = 0;
player->unk_258 = 0;
}
void func_8005513C(u32 arg0) {
BGMPlayer* player = NULL;
u32 playerSwitch = arg0 & 0xF;
if (playerSwitch != 0) {
if (playerSwitch == 1) {
player = D_8009A664;
} else if (playerSwitch == 2) {
player = D_8009A5FC;
}
if (player != NULL) {
u32 temp;
if (player->unk_258 < 8) {
temp = player->unk_25A;
player->unk_238[temp] = arg0 >> 4;
temp++;
if (temp >= 8) {
temp = 0;
}
player->unk_25A = temp;
player->unk_258++;
} else {
temp = player->unk_25B + 1;
if (temp > 99) {
temp = 99;
}
player->unk_25B = temp;
}
}
}
}
void snd_start_sound(s32 soundID, u8 volume, u8 pan) {
SoundManager* soundManager = D_8009A640;
s16 a1temp = volume * 256;
if (a1temp != 0) {
a1temp |= 0xFF;
}
if (pan > 0x7F) {
pan = 0x7F;
}
snd_enqueue_sfx_event(soundManager, soundID, a1temp, 0, pan);
}
void snd_start_sound_with_shift(s32 soundID, u8 volume, u8 pan, s16 pitchShift) {
SoundManager* soundManager = D_8009A640;
s16 a1temp = volume * 256;
if (a1temp != 0) {
a1temp |= 0xFF;
}
if (pan > 0x7F) {
pan = 0x7F;
}
if (pitchShift > 0x960) {
pitchShift = 0x960;
} else if (pitchShift < -0x960) {
pitchShift = -0x960;
}
snd_enqueue_sfx_event(soundManager, soundID, a1temp, pitchShift, pan);
}
void snd_adjust_sound(s32 soundID, u8 volume, u8 pan) {
SoundManager* soundManager = D_8009A640;
s16 a1temp = volume * 256;
if (a1temp != 0) {
a1temp |= 0xFF;
}
if (pan > 0x7F) {
pan = 0x7F;
}
snd_enqueue_sfx_event(soundManager, soundID | 0x1000, a1temp, 0, pan);
}
void snd_adjust_sound_with_shift(s32 soundID, u8 volume, u8 pan, s16 pitchShift) {
SoundManager* soundManager = D_8009A640;
s16 a1temp = volume * 256;
if (a1temp != 0) {
a1temp |= 0xFF;
}
if (pan > 0x7F) {
pan = 0x7F;
}
if (pitchShift > 0x960) {
pitchShift = 0x960;
} else if (pitchShift < -0x960) {
pitchShift = -0x960;
}
snd_enqueue_sfx_event(soundManager, soundID | 0x1000, a1temp, pitchShift, pan);
}
void snd_stop_sound(s32 soundID) {
SoundManager* soundManager = D_8009A640;
snd_enqueue_sfx_event(soundManager, soundID | 0x8000, 0, 0, 0);
}
void func_800553F4(void) {
D_8009A640->unk_168 = 1;
}
void snd_start_sound_raw(s32 soundID, s16 volume, s16 pitchShift, s32 pan) {
SoundManager* soundManager = D_8009A640;
snd_enqueue_sfx_event(soundManager, soundID, volume, pitchShift, pan);
}
s32 func_80055448(s32 arg0) {
return func_80053F80(arg0);
}
s32 func_80055464(s32 arg0, s32 arg1) {
if (func_80050C30(arg0) == 0) {
func_80050CA0(arg0, arg1);
}
}
s32 func_800554A4(s32 arg0) {
s32 ret = func_80050C30(arg0);
if (ret == 0) {
func_80050EF0(arg0);
}
return ret;
}
s32 func_800554E8(s32 arg0, s32 arg1) {
s32 ret = func_80050C30(arg0);
if (ret == 0) {
func_80050F64(arg0, arg1);
}
return ret;
}
s32 func_8005553C(s32 arg0, s32 arg1) {
s32 ret = func_80050C30(arg0);
if (ret == 0) {
func_80050E18(arg0, arg1);
}
return ret;
}
s32 func_80055590(s32 arg0, s32 arg1) {
s32 ret = func_80050C30(arg0);
if (ret == 0) {
func_80050E84(arg0, arg1);
}
return ret;
}
void func_800555E4(s32 arg0) {
if (func_80050C30(arg0) == 0) {
func_80051050(arg0);
}
}
s32 func_80055618(s32 arg0, s32 arg1) {
s32 ret = func_80050C30(arg0);
if (ret == 0) {
func_80050C54(arg0, arg1);
}
return ret;
}
s32 func_8005566C(s32 arg0, s32 arg1, s32 arg2) {
s32 ret = func_80050C30(arg0);
if (ret == 0) {
func_80050FD0(arg0, arg1, arg2);
}
return ret;
}
s32 func_800556D0(s32 arg0) {
s32 ret = func_80050C30(arg0);
if (ret == 0) {
func_80050C64(arg0, 1);
}
return ret;
}
s32 func_80055718(s32 arg0) {
s32 ret = func_80050C30(arg0);
if (ret == 0) {
func_80050C64(arg0, 0);
}
return ret;
}
void func_80055760(s32 arg0) {
u32 i;
s32 lim = 4;
D_80078DB6 = 0xFF;
for (i = 0; i < lim; i++) {
if (func_80055464(i, 0) != 0) {
return;
}
}
func_80055848(arg0);
}
s32 func_800557CC(s32 arg0) {
u32 i;
s32 lim = 4;
s32 phi_v1;
for (i = 0; i < lim; i++) {
if (i == D_80078DB6) {
phi_v1 = func_800554E8(i, arg0);
} else {
phi_v1 = func_800554A4(i);
}
if (phi_v1 != 0) {
break;
}
}
return phi_v1;
}
s32 func_80055848(s32 arg0) {
s32 lim = 4;
s32 phi_v1 = 0;
if (arg0 != D_80078DB6) {
u32 i;
for (i = 0; i < lim; i++) {
if (i == arg0) {
phi_v1 = func_80055718(arg0);
} else {
phi_v1 = func_800556D0(i);
}
if (phi_v1 != 0) {
break;
}
}
if (phi_v1 == 0) {
D_80078DB6 = arg0;
}
}
return phi_v1;
}
s32 snd_load_song(s32 songID, s32 playerIndex) {
s32* currentTrackData;
BGMPlayer* songPlayer;
snd_get_sequence_player_and_track(playerIndex, &currentTrackData, &songPlayer);
if (currentTrackData != NULL) {
return snd_load_song_files(songID, currentTrackData, songPlayer);
} else {
return 3;
}
}
INCLUDE_ASM(s32, "30450", snd_start_song);
INCLUDE_ASM(s32, "30450", snd_start_song_variation);
s32 func_800559C4(UNK_TYPE arg0) {
return func_8004DA0C(arg0);
}
void func_800559E0(void) {
func_8004DA74();
}
s32 func_800559FC(void) {
return snd_is_song_playing();
}
INCLUDE_ASM(s32, "30450", snd_set_song_variation_fade);
INCLUDE_ASM(s32, "30450", snd_set_song_fade);
INCLUDE_ASM(s32, "30450", snd_set_song_variation_fade_time);
INCLUDE_ASM(s32, "30450", func_80055AF0);
INCLUDE_ASM(s32, "30450", func_80055B28);
INCLUDE_ASM(s32, "30450", func_80055B80);
INCLUDE_ASM(s32, "30450", func_80055BB8);
INCLUDE_ASM(s32, "30450", func_80055BF0);
INCLUDE_ASM(s32, "30450", func_80055C2C);
INCLUDE_ASM(s32, "30450", func_80055C64);
INCLUDE_ASM(s32, "30450", func_80055C94);
INCLUDE_ASM(s32, "30450", func_80055CC4);
s32 func_80055CE8(s32 songName, s32* arg1, BGMPlayer** player);
// We need to figure out what currentTrackData is a list of
#ifdef NON_EQUIVALENT
s32 func_80055CE8(s32 songName, s32* arg1, BGMPlayer** player) {
UnkAl19E0* temp_a3 = D_8009A5C0;
s32 ret = 0;
if (songName == temp_a3->currentTrackData[0][2]) {
*arg1 = temp_a3->currentTrackData[0];
*player = D_8009A664;
} else if (songName == temp_a3->currentTrackData[1][2]) {
*arg1 = temp_a3->currentTrackData[1];
*player = D_8009A5FC;
} else {
ret = 1;
}
return ret;
}
#else
INCLUDE_ASM(s32, "30450", func_80055CE8, s32 songName, s32* arg1, BGMPlayer** player);
#endif
s32 func_80055D38(s32 songName, f32 arg1) {
s32 ret;
s32 unkArg1;
BGMPlayer* bgmPlayer;
ret = func_80055CE8(songName, &unkArg1, &bgmPlayer);
if (ret == 0) {
func_80050770(bgmPlayer, arg1);
}
return ret;
}
s32 func_80055D8C(s32 songName, s32 arg1) {
s32 ret;
s32 unkArg1;
BGMPlayer* bgmPlayer;
ret = func_80055CE8(songName, &unkArg1, &bgmPlayer);
if (ret == 0) {
func_80050818(bgmPlayer, arg1);
}
return ret;
}
s32 func_80055DDC(s32 songName, s32 arg1) {
s32 ret;
s32 unkArg1;
BGMPlayer* bgmPlayer;
ret = func_80055CE8(songName, &unkArg1, &bgmPlayer);
if (ret == 0) {
s32* temp_v0 = func_80055EB4(arg1);
if (temp_v0 != NULL) {
func_8005087C(bgmPlayer, temp_v0, 1);
} else {
ret = 11;
}
}
return ret;
}
s32 func_80055E48(s32 songName, s32 arg1) {
s32 ret;
s32 unkArg1;
BGMPlayer* bgmPlayer;
ret = func_80055CE8(songName, &unkArg1, &bgmPlayer);
if (ret == 0) {
s32* temp_v0 = func_80055EB4(arg1);
if (temp_v0 != NULL) {
func_8005087C(bgmPlayer, temp_v0, 0);
} else {
ret = 11;
}
}
return ret;
}
s32* func_80055EB4(s32 arg0) {
s32* ret = NULL;
switch (arg0) {
case 0:
ret = &D_80078DB8;
break;
case 1:
ret = &D_80078DC4;
break;
case 2:
ret = &D_80078DCC;
break;
case 3:
ret = &D_80078DD0;
break;
case 4:
ret = &D_80078DDC;
break;
case 5:
ret = &D_80078DF8;
break;
case 6:
ret = &D_80078E14;
break;
case 7:
ret = &D_80078E30;
break;
}
return ret;
}
static const f32 padding[] = {0.0f};
s32 func_80055F58(s32 arg0, u32 arg1, u32 arg2) {
s32* subroutine_arg4;
s32* subroutine_arg5;
s32 temp_s2 = func_80055CE8(arg0, &subroutine_arg4, &subroutine_arg5);
if (temp_s2 == 0) {
if (arg2 > 0x7F) {
arg2 = 0x7F;
}
if (arg1 > 0xF) {
arg1 = 0xF;
}
func_8005083C(subroutine_arg5, arg1, 0x60, (u8)arg2); // todo remove cast when func is defined
}
return temp_s2;
}
s32 func_80055FD4(s32 arg0, s32 arg1) {
return func_80055F58(arg0, arg1, 0);
}
s32 func_80055FF0(s32 arg0, s32 arg1) {
return func_80055F58(arg0, arg1, 0x3F);
}
s32 func_8005600C(s32 arg0, s32 arg1) {
return func_80055F58(arg0, arg1, 0x7F);
}
s32 func_80056028(s32 arg0, u8 arg1) {
return func_800506C8(arg0, arg1);
}
s32 func_80056044(s32 arg0, u8 arg1) {
return func_800506C8(arg0, arg1 | 0x57000000);
}
s32 func_80056068(s32 arg0, u8 arg1) {
return func_800506C8(arg0, arg1 | 0x7F000000);
}
void func_8005608C(s32* arg0, s32* arg1) {
UnkAl19E0* temp_v0 = D_8009A5C0;
*arg0 = temp_v0->unk_94;
*arg1 = temp_v0->unk_98;
}
void func_800560A8(void) {
D_8009A5C0->unk_9C = 1;
}
INCLUDE_ASM(s32, "30450", func_800560BC);
INCLUDE_ASM(void, "30450", func_8005610C, void);
void func_80056144(UnkFuncAl arg0, s32 arg1) {
D_8009A5C0->unk_A4[arg1] = arg0;
}
void audio_set_stereo(void) {
func_80056D5C(1);
func_80054DA8(0);
}
void audio_set_mono(void) {
func_80056D5C(0);
func_80054DA8(1);
}
void func_800561A4(s32 arg0) {
func_80054CE0(1, arg0);
}
void func_800561C4(s32 arg0) {
func_80054CE0(16, arg0);
}
void func_800561E4(s32 arg0) {
func_80054D74(16, arg0);
}
void func_80056204(void) {
func_8004BA54(D_8009A640, 0);
}
void func_80056228(void) {
func_8004BA54(D_8009A640, 1);
}

View File

@ -1,331 +0,0 @@
#include "common.h"
#include "audio.h"
#include "nu/nualsgi.h"
UnkAl0* D_80078E50 = NULL;
UnkAl0* D_80078E54 = NULL;
s8 D_80078E58 = 0;
s16 D_80078E5A = 0x7FFF;
s8 D_80078E5C = 0;
s32 D_80078E60[] = { 0x7FFF7FFC, 0x7FF57FE8, 0x7FD77FC0, 0x7FA57F84, 0x7F5F7F34, 0x7F057ED0, 0x7E977E58, 0x7E157DCD,
0x7D7F7D2D, 0x7CD67C7A, 0x7C1A7BB4, 0x7B497ADA, 0x7A6679ED, 0x796F78ED, 0x786677DA, 0x774976B4, 0x761A757B,
0x74D87430, 0x738472D3, 0x721E7164, 0x70A66FE3, 0x6F1C6E51, 0x6D816CAD, 0x6BD56AF9, 0x6A186933, 0x684A675D,
0x666C6577, 0x647E6381, 0x6280617C, 0x60735F67, 0x5E575D43, 0x5C2C5B11,
};
void func_80056250(UnkAl0* globals, ALConfig* config) {
s32 i;
ALHeap* heap = config->heap;
if (D_80078E50 != NULL) {
return;
}
globals->unk_0C = config->unk_00;
globals->unk_10 = config->unk_04;
globals->unk_00 = 0;
globals->unk_04 = 0;
globals->frequency = config->frequency;
globals->dmaNew = config->dmaNew;
D_80078E50 = globals;
D_80078E54 = globals;
D_80078E58 = 0;
D_80078E5A = 0x7FFF;
D_80078E5C = 1;
D_80078E54->unk_1C = alHeapAlloc(heap, config->unk_00, sizeof(UnkAl7C));
for (i = 0; i < config->unk_00; i++) {
UnkAl7C* al7C = &D_80078E54->unk_1C[i];
al7C->unk_04 = alHeapAlloc(heap, 1, 0x20);
al7C->unk_08 = alHeapAlloc(heap, 1, 0x20);
al7C->dmaProc = ((ALDMAproc (*)(NUDMAState**))(D_80078E54->dmaNew))(&al7C->dmaState);
al7C->unk_2C = 0;
al7C->unk_30 = 1;
al7C->unk_34 = 0;
al7C->unk_38 = alHeapAlloc(heap, 1, 0x20);
al7C->unk_40 = 0;
al7C->unk_44 = 1;
al7C->unk_3C = 1.0f;
al7C->unk_48 = alHeapAlloc(heap, 1, 0x50);
al7C->unk_6C = 1;
al7C->unk_70 = 0;
al7C->unk_4E = 1;
al7C->unk_5C = 1;
al7C->unk_62 = 1;
al7C->unk_50 = 1;
al7C->unk_52 = 1;
al7C->unk_54 = 0;
al7C->unk_56 = 0;
al7C->unk_5A = 1;
al7C->unk_58 = 0;
al7C->unk_60 = 1;
al7C->unk_5E = 0;
al7C->unk_64 = 0;
al7C->unk_68 = 0;
al7C->unk_4C = 64;
al7C->unk_74 = 0;
al7C->unk_00 = 0;
al7C->unk_78 = 0;
al7C->unk_79 = i;
}
D_80078E54->unk_20 = alHeapAlloc(heap, config->unk_04, sizeof(UnkLen18));
for (i = 0; i < config->unk_04; i++) {
UnkLen18* temp = &D_80078E54->unk_20[i];
temp->unk_10 = 0;
temp->unk_14 = 0;
temp->unk_00 = 0x7FFF;
temp->unk_0C = 0;
temp->unk_04 = alHeapAlloc(heap, 1, 0x14);
temp->unk_08 = alHeapAlloc(heap, 1, 0x14);
func_80058E84(temp->unk_04, temp->unk_0C, heap);
func_80058E84(temp->unk_08, temp->unk_0C, heap);
}
D_80078E54->unk_24 = alHeapAlloc(heap, 0x170, 2);
D_80078E54->unk_28 = alHeapAlloc(heap, 0x170, 2);
D_800A3FEC = 0;
D_800A3FEE = 0;
D_800A3FF0 = 4;
D_800A3FE0 = alHeapAlloc(heap, 0x2E0, 2);
D_800A3FE4 = alHeapAlloc(heap, 0x2E0, 2);
for (i = 0; i < 0x2E0; i++) {
D_800A3FE4[i] = D_800A3FE0[i] = 0;
}
D_80078E54->heap = heap;
}
void func_800565A4(void) {
if (D_80078E50 != NULL) {
D_80078E50 = NULL;
}
}
INCLUDE_ASM(Acmd*, "31650", alAudioFrame, Acmd* cmdList, s32* cmdLen, s16* outBuf, s32 outLen);
void func_80056D34(void) {
D_80078E58 = 1;
}
void func_80056D44(s16 arg0) {
D_80078E5A = arg0;
}
s16 func_80056D50(void) {
return D_80078E5A;
}
#ifdef NON_MATCHING
void func_80056D5C(s8 arg0) {
D_80078181 = arg0;
D_80078E5C = 1;
}
#else
INCLUDE_ASM(s32, "31650", func_80056D5C);
#endif
void func_80056D78(u8 arg0, u16 arg1) {
UnkLen18* temp = &D_80078E54->unk_20[arg0];
temp->unk_00 = arg1 & 0x7FFF;
}
u16 func_80056DA4(u8 arg0, u16 arg1) {
UnkLen18* temp = &D_80078E54->unk_20[arg0];
return temp->unk_00;
}
void func_80056DCC(u8 arg0, u8 arg1) {
UnkLen18* temp = &D_80078E54->unk_20[arg0];
temp->unk_0C = arg1;
func_8005904C(temp->unk_04, arg1);
func_8005904C(temp->unk_08, arg1);
}
INCLUDE_ASM(s32, "31650", func_80056E34);
void func_80056EC0(u8 arg0, s8 arg1) {
UnkAl7C* al7C = &D_80078E54->unk_1C[arg0];
al7C->unk_78 = arg1;
}
INCLUDE_ASM(void, "31650", func_80056EE8, u8 arg0);
void func_80056F78(u8 arg0) {
UnkAl7C* al7C = &D_80078E54->unk_1C[arg0];
al7C->unk_70 = 1;
}
INCLUDE_ASM(void, "31650", func_80056FA4, u8 arg0, u8 arg1, s32 arg2, f32 arg3, s16 arg4, u8 arg5, u8 arg6,
s32 arg7);
INCLUDE_ASM(void, "31650", func_80057224, u8 arg0, Instrument* arg1);
void func_80057344(u8 arg0, f32 arg1) {
UnkAl7C* al7C = &D_80078E54->unk_1C[arg0];
al7C->unk_3C = arg1;
}
INCLUDE_ASM(void, "31650", func_8005736C, u8 arg0, s16 arg1, s32 arg2, u8 arg3, u8 arg4);
INCLUDE_ASM(void, "31650", func_80057548, u8 arg0, u8 arg1, u8 arg2);
INCLUDE_ASM(void, "31650", func_800576EC, u8 arg0, s32 arg1, s32 arg2);
INCLUDE_ASM(s32, "31650", func_80057874);
INCLUDE_ASM(s32, "31650", func_800579D8);
s32 func_80057B64(u8 arg0) {
UnkAl7C* al7C = &D_80078E54->unk_1C[arg0];
return al7C->unk_70;
}
s32 func_80057B8C(u8 arg0) {
UnkAl7C* al7C = &D_80078E54->unk_1C[arg0];
return al7C->unk_78;
}
f32 func_80057BB4(u8 arg0) {
UnkAl7C* al7C = &D_80078E54->unk_1C[arg0];
return al7C->unk_3C;
}
u8 func_80057BDC(u8 arg0) {
UnkAl7C* al7C = &D_80078E54->unk_1C[arg0];
return al7C->unk_4C_s.unk_4D;
}
s16 func_80057C04(u8 arg0) {
UnkAl7C* al7C = &D_80078E54->unk_1C[arg0];
return al7C->unk_54;
}
s16 func_80057C2C(u8 arg0) {
UnkAl7C* al7C = &D_80078E54->unk_1C[arg0];
return al7C->unk_56;
}
INCLUDE_ASM(s32, "31650", func_80057C54);
INCLUDE_ASM(s32, "31650", func_80057D0C);
void func_80057DC8(s32 arg0) {
if (arg0 < 2) {
D_800A3FF0 = 0;
D_800A3FEE = 0;
}
D_800A3FF0 = arg0;
if (arg0 >= 5) {
D_800A3FF0 = 4;
}
}
void func_80057E08(u8 arg0) {
s32* phi_a1 = (s32*)D_800A3FE0;
s32* phi_v1 = (s32*)D_800A3FE4;
s32 i;
for (i = 0; i < 0x170; i++) {
*phi_a1++ = 0;
*phi_v1++ = 0;
}
D_800A3FEC = arg0;
D_800A3FEE = 1;
D_800A3FE8 = 0;
}
void func_80057E5C(u8 arg0) {
s32* phi_a1 = (s32*)D_800A3FE0;
s32* phi_v1 = (s32*)D_800A3FE4;
s32 i;
for (i = 0; i < 0x170; i++) {
*phi_a1++ = 0;
*phi_v1++ = 0;
}
D_800A3FEC = arg0;
D_800A3FEE = 2;
D_800A3FE8 = 0;
}
void func_80057EB0(void) {
D_800A3FEC = 0;
D_800A3FEE = 0;
D_800A3FE8 = 0;
}
void func_80057ED0(s16 arg0) {
s32* phi_a1 = (s32*)D_800A3FE0;
s32* phi_v1 = (s32*)D_800A3FE4;
s32 i;
for (i = 0; i < 0x170; i++) {
*phi_a1++ = 0;
*phi_v1++ = 0;
}
D_800A3FEC = 0;
D_800A3FEE = arg0;
D_800A3FE8 = 0;
}
void alHeapInit(ALHeap* hp, u8* base, s32 len) {
u32 i;
s32 alignBytes = 0x10 - ((s32)base & 0xF);
if (alignBytes != 0x10) {
hp->base = base + alignBytes;
} else {
hp->base = base;
}
hp->len = len;
hp->count = 0;
hp->cur = hp->base;
for (i = 0; i < (u32)(hp->len) >> 2; i++) {
((u32*)hp->base)[i] = 0;
}
}
void* alHeapAlloc(ALHeap* heap, s32 arg1, s32 size) {
void* ret = NULL;
u8* newCur = &heap->cur[ALIGN16(arg1 * size)];
if (&heap->base[heap->len] >= newCur) {
ret = heap->cur;
heap->cur = newCur;
}
return ret;
}
void alCopy(void* src, void* dst, s32 size) {
s32 i;
u8* srcIt = src;
u8* dstIt = dst;
for (i = 0; i < size; i++) {
*dstIt++ = *srcIt++;
}
}
INCLUDE_ASM(s32, "31650", func_80058004);

View File

@ -1,7 +0,0 @@
#include "common.h"
INCLUDE_ASM(s32, "33450", func_80058050);
INCLUDE_ASM(s32, "33450", func_80058B20);
INCLUDE_ASM(s32, "33450", func_80058C6C);

View File

@ -1,87 +0,0 @@
#include "common.h"
s32 D_8007EFE0[] = {
0x00000003, 0x0000000B, 0x00000000, 0x00000009, 0x00002666, 0xFFFFD99A, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000003, 0x00000007, 0x00000CCC, 0xFFFFF334, 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x0000000A, 0x00001388, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00005000
};
s32 D_8007F048[] = {
0x00000004, 0x0000000E, 0x00000000, 0x00000009, 0x00002666, 0xFFFFD99A, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000002, 0x00000006, 0x00000CCC, 0xFFFFF334, 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
0x00000009, 0x0000000C, 0x00000CCC, 0xFFFFF334, 0x00003FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x0000000D, 0x00001770, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00005000, 0x00000004, 0x00000011,
0x00000000, 0x0000000B, 0x00002666, 0xFFFFD99A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000004,
0x00000009, 0x00000CCC, 0xFFFFF334, 0x00003FFF, 0x00000000, 0x00000000, 0x00000000, 0x0000000B, 0x0000000F,
0x00000CCC, 0xFFFFF334, 0x00003FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0x00001F40,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00005000
};
s32 D_8007F158[] = {
0x00000001, 0x0000000E, 0x00000000, 0x0000000D, 0x00004E20, 0x00000000, 0x00007FFF, 0x00000000, 0x00000000,
0x00007FFF
};
s32 D_8007F180[] = {
0x00000001, 0x00000003, 0x00000000, 0x00000001, 0x00004000, 0x00000000, 0x00007FFF, 0x00001DB0, 0x000002BC,
0x00000000
};
s32 D_8007F1A8[] = {
0x00000001, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00005FFF, 0x00007FFF, 0x0000017C, 0x000001F4,
0x00000000
};
s32 D_8007F1D0[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000
};
typedef struct unk341d0 {
s32 unk_00;
s16 unk_04;
s16 unk_06;
s16 unk_08;
s16 unk_0A;
s16* unk_0C;
s16* unk_10;
} unk341d0;
s32* D_8007F1F8 = D_8007F1D0;
s32* D_8007F1FC = D_8007F1D0;
s32* D_8007F200 = D_8007F1D0;
s32* D_8007F204 = D_8007F1D0;
void func_80058DD0(s16* arg);
INCLUDE_ASM(s32, "341d0", func_80058DD0);
INCLUDE_ASM(s32, "341d0", func_80058E84);
INCLUDE_ASM(s32, "341d0", func_80058F88);
void func_80059008(unk341d0* arg0, s16 arg1, s16 arg2, s16 arg3) {
arg0->unk_06 = arg1;
arg0->unk_08 = arg2;
if (arg3 != 0) {
arg0->unk_0C = arg0->unk_10;
*arg0->unk_0C = arg3;
func_80058DD0(arg0->unk_0C);
return;
}
arg0->unk_0C = NULL;
}
INCLUDE_ASM(s32, "341d0", func_8005904C);
INCLUDE_ASM(s32, "341d0", func_80059310);
INCLUDE_ASM(s32, "341d0", func_800598A0);
INCLUDE_ASM(s32, "341d0", func_80059AB8);
INCLUDE_ASM(s32, "341d0", func_80059BD4);

View File

@ -6,140 +6,140 @@
#define STANDARD_ITEM_SCRIPT(icon) \
{ \
is_SetIcon(60, icon) \
is_Restart \
is_End \
is_Restart \
is_End \
}
#define STANDARD_ITEM_HUD_SCRIPT(icon) \
{ \
hs_SetVisible \
hs_SetTileSize(HUD_ELEMENT_SIZE_32x32) \
hs_Loop \
hs_SetIcon(60, icon) \
hs_Restart \
hs_End \
hs_SetVisible \
hs_SetTileSize(HUD_ELEMENT_SIZE_32x32) \
hs_Loop \
hs_SetIcon(60, icon) \
hs_Restart \
hs_End \
}
HudScript HES_HandPointDownLoop = {
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_Loop
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(2, -1)
hs_SetIcon(1, anim_hand_1)
hs_SetTexelOffset(2, -1)
hs_SetIcon(1, anim_hand_2)
hs_SetTexelOffset(2, -1)
hs_SetIcon(4, anim_hand_3)
hs_SetTexelOffset(2, 4)
hs_SetIcon(1, anim_hand_1)
hs_SetTexelOffset(0, 3)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(14, anim_hand_4)
hs_Restart
hs_End
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_Loop
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(2, -1)
hs_SetIcon(1, anim_hand_1)
hs_SetTexelOffset(2, -1)
hs_SetIcon(1, anim_hand_2)
hs_SetTexelOffset(2, -1)
hs_SetIcon(4, anim_hand_3)
hs_SetTexelOffset(2, 4)
hs_SetIcon(1, anim_hand_1)
hs_SetTexelOffset(0, 3)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(14, anim_hand_4)
hs_Restart
hs_End
};
HudScript HES_HandPointDown = {
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(2, -1)
hs_SetIcon(1, anim_hand_1)
hs_SetTexelOffset(2, -1)
hs_SetIcon(1, anim_hand_2)
hs_SetTexelOffset(2, -1)
hs_SetIcon(4, anim_hand_3)
hs_SetTexelOffset(2, 4)
hs_SetIcon(1, anim_hand_1)
hs_SetTexelOffset(0, 3)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(2, anim_hand_4)
hs_SetTexelOffset(0, 3)
hs_Loop
hs_SetIcon(60, anim_hand_0)
hs_Restart
hs_End
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(2, -1)
hs_SetIcon(1, anim_hand_1)
hs_SetTexelOffset(2, -1)
hs_SetIcon(1, anim_hand_2)
hs_SetTexelOffset(2, -1)
hs_SetIcon(4, anim_hand_3)
hs_SetTexelOffset(2, 4)
hs_SetIcon(1, anim_hand_1)
hs_SetTexelOffset(0, 3)
hs_SetIcon(1, anim_hand_0)
hs_SetTexelOffset(0, -1)
hs_SetIcon(2, anim_hand_4)
hs_SetTexelOffset(0, 3)
hs_Loop
hs_SetIcon(60, anim_hand_0)
hs_Restart
hs_End
};
HudScript HES_HandPointDownHeld = {
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_Loop
hs_SetIcon(60, anim_hand_0)
hs_Restart
hs_End
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_Loop
hs_SetIcon(60, anim_hand_0)
hs_Restart
hs_End
};
HudScript HES_HandPointLeftLoop = {
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_Loop
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_6)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_7)
hs_SetTexelOffset(1, -3)
hs_SetIcon(4, anim_hand_8)
hs_SetTexelOffset(0, 4)
hs_SetIcon(1, anim_hand_6)
hs_SetTexelOffset(0, 4)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 1)
hs_SetIcon(14, anim_hand_9)
hs_Restart
hs_End
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_Loop
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_6)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_7)
hs_SetTexelOffset(1, -3)
hs_SetIcon(4, anim_hand_8)
hs_SetTexelOffset(0, 4)
hs_SetIcon(1, anim_hand_6)
hs_SetTexelOffset(0, 4)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 1)
hs_SetIcon(14, anim_hand_9)
hs_Restart
hs_End
};
HudScript HES_HandPointLeft = {
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_6)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_7)
hs_SetTexelOffset(1, -3)
hs_SetIcon(4, anim_hand_8)
hs_SetTexelOffset(0, 4)
hs_SetIcon(1, anim_hand_6)
hs_SetTexelOffset(0, 4)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 1)
hs_SetIcon(2, anim_hand_9)
hs_SetTexelOffset(0, 4)
hs_Loop
hs_SetIcon(60, anim_hand_5)
hs_Restart
hs_End
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_SetTexelOffset(0, 0)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_6)
hs_SetTexelOffset(0, -1)
hs_SetIcon(1, anim_hand_7)
hs_SetTexelOffset(1, -3)
hs_SetIcon(4, anim_hand_8)
hs_SetTexelOffset(0, 4)
hs_SetIcon(1, anim_hand_6)
hs_SetTexelOffset(0, 4)
hs_SetIcon(1, anim_hand_5)
hs_SetTexelOffset(0, 1)
hs_SetIcon(2, anim_hand_9)
hs_SetTexelOffset(0, 4)
hs_Loop
hs_SetIcon(60, anim_hand_5)
hs_Restart
hs_End
};
HudScript HES_HandPointLeftHeld = {
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_Loop
hs_SetIcon(60, anim_hand_5)
hs_Restart
hs_End
hs_SetVisible
hs_SetTileSize(HUD_ELEMENT_SIZE_24x24)
hs_Loop
hs_SetIcon(60, anim_hand_5)
hs_Restart
hs_End
};
#include "item_hud_scripts.inc.c"
@ -235,12 +235,12 @@ s32 pad_after_move_table[] = {
};
s32* gMessageBoxFrameParts[] = {
D_802EBFF0, D_802EC010, D_802EC030, D_802EC050,
D_802EC070, D_802EC090, D_802EC0B0, D_802EC0D0,
D_802EC0F0, D_802EC110, D_802EC130, D_802EC150,
D_802EC170, D_802EC190, D_802EC1B0, D_802EC1D0,
D_802EC1F0, D_802EC210, D_802EC230, D_802EC250,
D_802EC270, D_802EC290, D_802EC2B0, D_802EC2D0,
D_802EC2F0, D_802EC310, D_802EC330, D_802EC350,
D_802EC370, D_802EC390, D_802EC3B0, D_802EC3D0
D_802EBFF0, D_802EC010, D_802EC030, D_802EC050,
D_802EC070, D_802EC090, D_802EC0B0, D_802EC0D0,
D_802EC0F0, D_802EC110, D_802EC130, D_802EC150,
D_802EC170, D_802EC190, D_802EC1B0, D_802EC1D0,
D_802EC1F0, D_802EC210, D_802EC230, D_802EC250,
D_802EC270, D_802EC290, D_802EC2B0, D_802EC2D0,
D_802EC2F0, D_802EC310, D_802EC330, D_802EC350,
D_802EC370, D_802EC390, D_802EC3B0, D_802EC3D0
};

View File

@ -221,7 +221,7 @@ void func_800E24F8(void) {
break;
}
} else {
switch(gPlayerStatus.actionState) {
switch (gPlayerStatus.actionState) {
case ACTION_STATE_WALK:
case ACTION_STATE_RUN:
case ACTION_STATE_JUMP:

View File

@ -473,11 +473,11 @@ f32 func_800E34D8(void) {
return ret;
}
f32 player_check_collision_below(f32 arg0, s32* colliderID) {
f32 player_check_collision_below(f32 offset, s32* colliderID) {
PlayerStatus* playerStatus = &gPlayerStatus;
CollisionStatus* collisionStatus = &gCollisionStatus;
f32 temp_f4 = playerStatus->colliderHeight * 0.5f;
f32 outLength = fabsf(arg0) + temp_f4;
f32 outLength = fabsf(offset) + temp_f4;
f32 x = playerStatus->position.x;
f32 y = playerStatus->position.y + temp_f4;
f32 z = playerStatus->position.z;
@ -486,10 +486,10 @@ f32 player_check_collision_below(f32 arg0, s32* colliderID) {
&sp38, &sp3C, &sp40, &sp44);
if (hit < 0) {
if (arg0 >= 0.0f && collisionStatus->currentCeiling >= 0) {
if (offset >= 0.0f && collisionStatus->currentCeiling >= 0) {
return playerStatus->position.y;
}
y = playerStatus->position.y + arg0;
y = playerStatus->position.y + offset;
} else {
collisionStatus->currentFloor = hit;
collisionStatus->lastTouchedFloor = -1;

View File

@ -530,7 +530,7 @@ void show_coin_counter(void) {
}
if (uiStatus->unk_6C[0] == 0) {
set_window_properties(0x14, 32, 164, 64, 20, 0x15, coin_counter_draw_content, 0, -1);
set_window_properties(WINDOW_ID_20, 32, 164, 64, 20, 0x15, coin_counter_draw_content, 0, -1);
set_window_update(WINDOW_ID_20, (s32)basic_window_update);
index = hud_element_create(&HES_MenuTimes);
uiStatus->iconIndex10 = index;

View File

@ -413,9 +413,9 @@ void set_cam_viewport(s16 id, s16 x, s16 y, s16 width, s16 height) {
camera->vp.vp.vscale[2] = 0x1FF;
camera->vp.vp.vscale[3] = 0;
camera->vp.vp.vtrans[0] = (((u16)camera->viewportStartX + (camera->viewportW / 2)) << 16) >> 14;
camera->vp.vp.vtrans[1] = ((u16)camera->viewportStartY + (camera->viewportH / 2));
camera->vp.vp.vtrans[1] = (camera->vp.vp.vtrans[1] << 16) >> 14; // needed to match
camera->vp.vp.vtrans[0] = 4 * (s16) ((u16) camera->viewportStartX + (camera->viewportW / 2));
camera->vp.vp.vtrans[1] = (s16) ((u16) camera->viewportStartY + (camera->viewportH / 2));
camera->vp.vp.vtrans[1] = 4 * camera->vp.vp.vtrans[1];
camera->vp.vp.vtrans[2] = 0x1FF;
camera->vp.vp.vtrans[3] = 0;
@ -424,8 +424,8 @@ void set_cam_viewport(s16 id, s16 x, s16 y, s16 width, s16 height) {
camera->vpAlt.vp.vscale[2] = 0x1FF;
camera->vpAlt.vp.vscale[3] = 0;
camera->vpAlt.vp.vtrans[0] = gGameStatusPtr->unk_82 + ((((u16) camera->viewportStartX + (camera->viewportW / 2)) << 16) >> 14);
camera->vpAlt.vp.vtrans[1] = gGameStatusPtr->unk_83 + ((((u16) camera->viewportStartY + (camera->viewportH / 2)) << 16) >> 14);
camera->vpAlt.vp.vtrans[0] = gGameStatusPtr->unk_82 + 4 * (s16) ((u16) camera->viewportStartX + (camera->viewportW / 2));
camera->vpAlt.vp.vtrans[1] = gGameStatusPtr->unk_83 + 4 * (s16) ((u16) camera->viewportStartY + (camera->viewportH / 2));
camera->vpAlt.vp.vtrans[2] = 0x200;
camera->vpAlt.vp.vtrans[3] = 0;
}

View File

@ -165,7 +165,7 @@ s32 popup_menu_update(void) {
D_8010D65C = elementID;
hud_element_set_flags(elementID, HUD_ELEMENT_FLAGS_80);
hud_element_set_tint(elementID, 255, 255, 255);
if (gPopupMenu->popupType != 2) {
if (gPopupMenu->popupType != POPUP_MENU_THROW_AWAY_ITEM) {
hud_element_set_flags(elementID, HUD_ELEMENT_FLAGS_DISABLED);
}
@ -187,31 +187,31 @@ s32 popup_menu_update(void) {
D_8010D674 = elementID;
hud_element_set_flags(elementID, HUD_ELEMENT_FLAGS_DROP_SHADOW | HUD_ELEMENT_FLAGS_80);
if (gPopupMenu->popupType == 3) {
if (gPopupMenu->popupType == POPUP_MENU_TRADE_FOR_BADGE) {
D_8010D660 = hud_element_create(&HES_StatusStarPiece);
elementID = D_8010D660;
hud_element_set_flags(elementID, HUD_ELEMENT_FLAGS_80);
hud_element_set_tint(elementID, 255, 255, 255);
}
if (gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
D_8010D660 = hud_element_create(&HES_StatusStarPiece);
elementID = D_8010D660;
hud_element_set_flags(elementID, HUD_ELEMENT_FLAGS_FILTER_TEX | HUD_ELEMENT_FLAGS_80);
hud_element_set_tint(elementID, 255, 255, 255);
}
if (gPopupMenu->popupType == 5) {
if (gPopupMenu->popupType == POPUP_MENU_SELL_ITEM) {
D_8010D660 = hud_element_create(&HES_StatusCoin);
elementID = D_8010D660;
hud_element_set_flags(elementID, HUD_ELEMENT_FLAGS_80);
hud_element_set_tint(elementID, 255, 255, 255);
}
if (gPopupMenu->popupType == 3 || gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == POPUP_MENU_TRADE_FOR_BADGE || gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
D_8010D664 = hud_element_create(&HES_MenuTimes);
elementID = D_8010D664;
hud_element_set_flags(elementID, HUD_ELEMENT_FLAGS_80);
hud_element_set_tint(elementID, 255, 255, 255);
}
if (gPopupMenu->popupType == one || gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == one || gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
D_8010D668 = hud_element_create(D_80109890[0]);
elementID = D_8010D668;
hud_element_set_flags(elementID, HUD_ELEMENT_FLAGS_80);
@ -233,66 +233,66 @@ s32 popup_menu_update(void) {
case 6:
case 7:
case 12:
set_window_properties(0xE, posX, posY, 0x91, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_14, posX, posY, 0x91, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
if (gPopupMenu->unk_31C == 0) {
set_window_properties(0xF, 0x19, -6, 0x5F, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_15, 0x19, -6, 0x5F, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
} else {
set_window_properties(0xF, 0xC, -6, 0x79, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_15, 0xC, -6, 0x79, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
}
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_SHOW);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_HIDE);
break;
case 1:
set_window_properties(0xE, posX, posY, 0x8B, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(0x11, 0xD, -6, 0x72, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_14, posX, posY, 0x8B, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_17, 0xD, -6, 0x72, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_HIDE);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_SHOW);
break;
case 3:
set_window_properties(0xE, posX, posY, 0xA2, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(0xF, 0x11, -6, 0x60, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_14, posX, posY, 0xA2, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_15, 0x11, -6, 0x60, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_SHOW);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_HIDE);
break;
case 4:
set_window_properties(0xE, posX, posY, 0x92, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(0x11, 0xC, -6, 0x72, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_14, posX, posY, 0x92, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_17, 0xC, -6, 0x72, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_HIDE);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_SHOW);
break;
case 5:
set_window_properties(0xE, posX, posY, 0xA7, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(0xF, 0x16, -6, 0x5F, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_14, posX, posY, 0xA7, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_15, 0x16, -6, 0x5F, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_SHOW);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_HIDE);
break;
case 8:
set_window_properties(0xE, posX, posY, 0xAA, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(0xF, 0x20, -6, 0x68, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_14, posX, posY, 0xAA, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_15, 0x20, -6, 0x68, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_SHOW);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_HIDE);
break;
case 9:
set_window_properties(0xE, posX, posY, 0x91, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(0xF, 0xC, -6, 0x79, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_14, posX, posY, 0x91, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_15, 0xC, -6, 0x79, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_SHOW);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_HIDE);
break;
case 10:
set_window_properties(0xE, posX, posY, 0x80, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(0xF, 0xC, -6, 0x68, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_14, posX, posY, 0x80, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_15, 0xC, -6, 0x68, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_SHOW);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_HIDE);
break;
case 11:
set_window_properties(0xE, posX, posY, 0x95, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(0xF, 6, -6, 0x8B, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_14, posX, posY, 0x95, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_15, 6, -6, 0x8B, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_SHOW);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_HIDE);
break;
case 13:
set_window_properties(0xE, posX, posY, 0x83, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(0x11, 0xA, -6, 0x72, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_properties(WINDOW_ID_14, posX, posY, 0x83, ((s8) D_8010D656 * 0xD) + 0x1A, 0x14, popup_menu_draw_menu_contents, NULL, -1);
set_window_properties(WINDOW_ID_17, 0xA, -6, 0x72, 0x10, 0x15, popup_menu_draw_title_contents, NULL, 0xE);
set_window_update(WINDOW_ID_15, WINDOW_UPDATE_HIDE);
set_window_update(WINDOW_ID_17, WINDOW_UPDATE_SHOW);
break;
@ -300,15 +300,15 @@ s32 popup_menu_update(void) {
switch (gPopupMenu->popupType) {
case 3:
set_window_properties(0x10, 0x7E, -0xE, 0x20, 0x20, 0x15, func_800F4C6C, NULL, 0xE);
set_window_properties(WINDOW_ID_16, 0x7E, -0xE, 0x20, 0x20, 0x15, func_800F4C6C, NULL, 0xE);
break;
case 5:
set_window_properties(0x10, 0x83, -0xE, 0x20, 0x20, 0x15, func_800F4C6C, NULL, 0xE);
set_window_properties(WINDOW_ID_16, 0x83, -0xE, 0x20, 0x20, 0x15, func_800F4C6C, NULL, 0xE);
break;
}
if (gPopupMenu->popupType == 3) {
set_window_properties(0x14, D_8010D688, D_8010D68A, 0x40, 0x14, 0x15, func_800F4D28, NULL, -1);
if (gPopupMenu->popupType == POPUP_MENU_TRADE_FOR_BADGE) {
set_window_properties(WINDOW_ID_20, D_8010D688, D_8010D68A, 0x40, 0x14, 0x15, func_800F4D28, NULL, -1);
}
do {
@ -328,8 +328,9 @@ s32 popup_menu_update(void) {
D_8010D655 = D_8010D654 + D_8010D68F;
D_8010D658 = -D_8010D654 * 0xD;
if (gPopupMenu->popupType >= 0 && (gPopupMenu->popupType < 0xA || gPopupMenu->popupType == 0xC)) {
set_window_properties(0x13, D_8010D680, D_8010D682, 0x118, 0x20, 0x14, func_800F48F4, NULL, -1);
if (gPopupMenu->popupType >= POPUP_MENU_USE_ITEM
&& (gPopupMenu->popupType < POPUP_MENU_READ_DIARY_PAGE || gPopupMenu->popupType == POPUP_MENU_USEKEY)) {
set_window_properties(WINDOW_ID_19, D_8010D680, D_8010D682, 0x118, 0x20, 0x14, func_800F48F4, NULL, -1);
}
posX = D_8010D684;
@ -340,26 +341,26 @@ s32 popup_menu_update(void) {
case 7:
case 9:
case 12:
set_window_properties(0x15, posX, posY, 0x90, 0x20, 0x14, func_800F4944, NULL, -1);
set_window_properties(WINDOW_ID_21, posX, posY, 0x90, 0x20, 0x14, func_800F4944, NULL, -1);
break;
case 1:
case 2:
case 13:
set_window_properties(0x15, posX, posY, 0x90, 0x28, 0x14, func_800F4944, NULL, -1);
set_window_properties(WINDOW_ID_21, posX, posY, 0x90, 0x28, 0x14, func_800F4944, NULL, -1);
break;
case 3:
case 10:
case 11:
set_window_properties(0x15, posX, posY, 0x80, 0x28, 0x14, func_800F4944, NULL, -1);
set_window_properties(WINDOW_ID_21, posX, posY, 0x80, 0x28, 0x14, func_800F4944, NULL, -1);
break;
case 4:
set_window_properties(0x15, posX, posY, 0x88, 0x28, 0x14, func_800F4944, NULL, -1);
set_window_properties(WINDOW_ID_21, posX, posY, 0x88, 0x28, 0x14, func_800F4944, NULL, -1);
break;
case 8:
set_window_properties(0x15, posX, posY, 0x70, 0x28, 0x14, func_800F4944, NULL, -1);
set_window_properties(WINDOW_ID_21, posX, posY, 0x70, 0x28, 0x14, func_800F4944, NULL, -1);
break;
case 5:
set_window_properties(0x15, posX, posY, 0x78, 0x20, 0x14, func_800F4944, NULL, -1);
set_window_properties(WINDOW_ID_21, posX, posY, 0x78, 0x20, 0x14, func_800F4944, NULL, -1);
break;
}
@ -419,14 +420,14 @@ s32 popup_menu_update(void) {
set_window_update(WINDOW_ID_21, WINDOW_UPDATE_SHOW);
}
if (gPopupMenu->popupType == 3) {
if (gPopupMenu->popupType == POPUP_MENU_TRADE_FOR_BADGE) {
set_window_update(WINDOW_ID_16, (s32)basic_window_update);
set_window_update(WINDOW_ID_20, (s32)basic_window_update);
}
if (gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
set_window_update(WINDOW_ID_18, (s32)basic_window_update);
}
if (gPopupMenu->popupType == 5) {
if (gPopupMenu->popupType == POPUP_MENU_SELL_ITEM) {
set_window_update(WINDOW_ID_16, (s32)basic_window_update);
}
D_8010D640 = 1;
@ -438,7 +439,7 @@ s32 popup_menu_update(void) {
D_8010D64C = D_8010D648;
if (gGameStatusPtr->heldButtons[0] & (BUTTON_STICK_UP | BUTTON_Z) &&
(D_8010D648 > 0 || (gGameStatusPtr->pressedButtons[0] & 0x12000)))
(D_8010D648 > 0 || (gGameStatusPtr->pressedButtons[0] & (BUTTON_STICK_UP | BUTTON_Z))))
{
do {
D_8010D648--;
@ -519,7 +520,7 @@ s32 popup_menu_update(void) {
D_8010D640 = 0x1E;
break;
}
if ((D_8010D68E != 0) && (gPopupMenu->popupType == 0 || gPopupMenu->popupType == 3)) {
if ((D_8010D68E != 0) && (gPopupMenu->popupType == POPUP_MENU_USE_ITEM || gPopupMenu->popupType == POPUP_MENU_TRADE_FOR_BADGE)) {
sfx_play_sound(SOUND_MENU_ERROR);
}
break;
@ -604,18 +605,18 @@ s32 popup_menu_update(void) {
hud_element_set_tint(D_8010D670, 160, 160, 160);
hud_element_set_tint(D_8010D674, 160, 160, 160);
hud_element_set_script(D_8010D66C, &HES_HandPointer);
if (gPopupMenu->popupType == 3) {
if (gPopupMenu->popupType == POPUP_MENU_TRADE_FOR_BADGE) {
hud_element_set_tint(D_8010D660, 160, 160, 160);
hud_element_set_tint(D_8010D664, 160, 160, 160);
}
if (gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
hud_element_set_tint(D_8010D660, 160, 160, 160);
hud_element_set_tint(D_8010D664, 160, 160, 160);
}
if (gPopupMenu->popupType == 1 || gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == 1 || gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
hud_element_set_tint(D_8010D668, 160, 160, 160);
}
if (gPopupMenu->popupType == 5) {
if (gPopupMenu->popupType == POPUP_MENU_SELL_ITEM) {
hud_element_set_tint(D_8010D660, 160, 160, 160);
}
D_8010D690 = 0xD;
@ -694,7 +695,7 @@ s32 popup_menu_update(void) {
set_window_update(WINDOW_ID_21, WINDOW_UPDATE_HIDE);
}
width = get_msg_width(0x1D006B, 0) + 23;
set_window_properties(9, 160 - (width / 2), 0x50, width, 0x28, 0x14, func_800F4CF0, NULL, -1);
set_window_properties(WINDOW_ID_9, 160 - (width / 2), 0x50, width, 0x28, 0x14, func_800F4CF0, NULL, -1);
set_window_update(WINDOW_ID_9, WINDOW_UPDATE_SHOW);
D_8010D644 = 0x3C;
D_8010D640 = 0x20;
@ -724,18 +725,18 @@ s32 popup_menu_update(void) {
hud_element_set_tint(D_8010D674, 160, 160, 160);
hud_element_set_script(D_8010D66C, &HES_HandPointer);
if (gPopupMenu->popupType == 3) {
if (gPopupMenu->popupType == POPUP_MENU_TRADE_FOR_BADGE) {
hud_element_set_tint(D_8010D660, 160, 160, 160);
hud_element_set_tint(D_8010D664, 160, 160, 160);
}
if (gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
hud_element_set_tint(D_8010D660, 160, 160, 160);
hud_element_set_tint(D_8010D664, 160, 160, 160);
}
if (gPopupMenu->popupType == 1 || gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == 1 || gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
hud_element_set_tint(D_8010D668, 160, 160, 160);
}
if (gPopupMenu->popupType == 5) {
if (gPopupMenu->popupType == POPUP_MENU_SELL_ITEM) {
hud_element_set_tint(D_8010D660, 160, 160, 160);
}
@ -771,7 +772,7 @@ s32 popup_menu_update(void) {
msgID = 0x1D0069;
}
width = get_msg_width(msgID, 0) + 23;
set_window_properties(0x15, 160 - (width / 2), 76, width, 32, 0x13, func_800F4C1C, NULL, -1);
set_window_properties(WINDOW_ID_21, 160 - (width / 2), 76, width, 32, 0x13, func_800F4C1C, NULL, -1);
set_window_update(WINDOW_ID_21, WINDOW_UPDATE_SHOW);
D_8010D6A0 = msg_get_printer_for_msg(0x1E001D, &D_8010D6A4);
msg_printer_set_origin_pos(D_8010D6A0, 160, 0x90);
@ -799,18 +800,18 @@ s32 popup_menu_update(void) {
hud_element_set_tint(D_8010D66C, 255, 255, 255);
hud_element_set_tint(D_8010D670, 255, 255, 255);
hud_element_set_tint(D_8010D674, 255, 255, 255);
if (gPopupMenu->popupType == 3) {
if (gPopupMenu->popupType == POPUP_MENU_TRADE_FOR_BADGE) {
hud_element_set_tint(D_8010D660, 160, 160, 160);
hud_element_set_tint(D_8010D664, 160, 160, 160);
}
if (gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
hud_element_set_tint(D_8010D660, 160, 160, 160);
hud_element_set_tint(D_8010D664, 160, 160, 160);
}
if (gPopupMenu->popupType == 1 || gPopupMenu->popupType == 4) {
if (gPopupMenu->popupType == 1 || gPopupMenu->popupType == POPUP_MENU_UPGRADE_PARTNER) {
hud_element_set_tint(D_8010D668, 160, 160, 160);
}
if (gPopupMenu->popupType == 5) {
if (gPopupMenu->popupType == POPUP_MENU_SELL_ITEM) {
hud_element_set_tint(D_8010D660, 160, 160, 160);
}
hud_element_set_script(D_8010D66C, &HES_HandPointer);

View File

@ -1254,24 +1254,24 @@ void func_801363A0(ItemEntity* itemEntity) {
temp = 0;
}
if (gItemTable[itemEntity->itemID].typeFlags) {
set_window_properties(0xC, s1, s3 - 0x18 + temp, offsetY,
set_window_properties(WINDOW_ID_12, s1, s3 - 0x18 + temp, offsetY,
temp2, 0, func_8013673C, itemEntity, -1);
} else {
set_window_properties(0xC, s1, s3 - 0x18 + temp, offsetY,
set_window_properties(WINDOW_ID_12, s1, s3 - 0x18 + temp, offsetY,
temp2, 0, func_8013673C, itemEntity, -1);
}
if (itemEntity->itemID != ITEM_STAR_PIECE && itemEntity->itemID != ITEM_COIN) {
set_window_properties(0x13, 0x14, 0xBA, 0x118, 0x20, NULL, func_80136A08, itemEntity, -1);
set_window_properties(WINDOW_ID_19, 0x14, 0xBA, 0x118, 0x20, NULL, func_80136A08, itemEntity, -1);
}
if (itemEntity->state != 2) {
offsetY = get_msg_width(MESSAGE_ID(0x1D, 0x060), 0) + 0x18;
set_window_properties(0x11, 160 - offsetY / 2, 0x24, offsetY, 40, NULL, func_801369D0, itemEntity, -1);
set_window_properties(WINDOW_ID_17, 160 - offsetY / 2, 0x24, offsetY, 40, NULL, func_801369D0, itemEntity, -1);
}
break;
case 12:
set_message_msg(itemData->nameMsg, 0);
offsetY = get_msg_width(MESSAGE_ID(0x1D, 0x05F), 0) + 0x36;
set_window_properties(0xC, 160 - offsetY / 2, 0x4C, offsetY, 40, NULL, func_8013673C, itemEntity, -1);
set_window_properties(WINDOW_ID_12, 160 - offsetY / 2, 0x4C, offsetY, 40, NULL, func_8013673C, itemEntity, -1);
break;
}
}

View File

@ -76,7 +76,7 @@ void func_802B7000_E225B0(void) {
foldImage.palette = D_802B7BE0_E23190;
break;
}
fold_update(0, 7, 0xFF, 0xFF, 0xFF, D_802B7C78_E23228->unk_28, 0);
fold_update(0, FOLD_TYPE_7, 0xFF, 0xFF, 0xFF, D_802B7C78_E23228->unk_28, 0);
foldImage.raster = D_802B7580_E22B30;
foldImage.width = 56;
@ -161,7 +161,7 @@ void func_802B735C_E2290C(void) {
}
if (D_802B7C78_E23228->unk_18++ > 50) {
D_8015A578.unk_02 = FALSE;
gCurrentHiddenPanels.activateISpy = FALSE;
D_8010C93C = NULL;
playerStatus->animFlags &= ~0x100;
}

View File

@ -1031,7 +1031,7 @@ extern EntityBlueprint* bEntityBlueprint[4];
extern s32* D_801516F4;
extern TileDescriptor gCurrentTileDescriptor;
extern TextureHeader gCurrentTileDescriptor;
extern ModelList wModelList;
extern ModelList bModelList;
@ -1063,7 +1063,7 @@ extern s32 texPannerMainU[MAX_TEX_PANNERS];
extern s32 texPannerMainV[MAX_TEX_PANNERS];
extern s32 texPannerAuxU[MAX_TEX_PANNERS];
extern s32 texPannerAuxV[MAX_TEX_PANNERS];
extern u32 mdl_nextTextureAddress;
extern u8* mdl_nextTextureAddress;
extern u16 mdl_currentTransformGroupChildIndex;
extern u16 D_80153226;
extern ModelNode* D_80153370;
@ -1218,7 +1218,7 @@ void update_entities(void) {
}
update_shadows();
D_8015A578.unk_00 = FALSE;
gCurrentHiddenPanels.tryFlipTrigger = FALSE;
}
void update_shadows(void) {
@ -1814,8 +1814,8 @@ void clear_entity_data(s32 arg0) {
}
entity_area_specific_data_is_loaded = FALSE;
D_8015A578.unk_01 = 0;
D_8015A578.unk_02 = FALSE;
gCurrentHiddenPanels.panelsCount = 0;
gCurrentHiddenPanels.activateISpy = FALSE;
if (!arg0) {
D_80151344 = 0;
}
@ -2970,7 +2970,35 @@ void state_render_frontUI(void) {
void appendGfx_model(Model* model);
INCLUDE_ASM(void, "a5dd0_len_114e0", appendGfx_model, Model*);
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80114B58);
void func_80114B58(u32 romOffset, TextureHandle* handle, TextureHeader* header, s32 mainSize, s32 mainPalSize, s32 auxSize, s32 auxPalSize) {
handle->raster = (u32*) mdl_nextTextureAddress;
if (mainPalSize != 0) {
handle->palette = (u32*) (mdl_nextTextureAddress + mainSize);
} else {
handle->palette = NULL;
}
dma_copy((u8*) romOffset, (u8*) (romOffset + mainSize + mainPalSize), mdl_nextTextureAddress);
romOffset += mainSize + mainPalSize;
mdl_nextTextureAddress += mainSize + mainPalSize;
if (auxSize != 0) {
handle->auxRaster = (u32*) mdl_nextTextureAddress;
if (auxPalSize != 0) {
handle->auxPalette = (u32*) (mdl_nextTextureAddress + auxSize);
} else {
handle->auxPalette = NULL;
}
dma_copy((u8*) romOffset, (u8*) (romOffset + auxSize + auxPalSize), mdl_nextTextureAddress);
mdl_nextTextureAddress += auxSize + auxPalSize;
} else {
handle->auxPalette = NULL;
handle->auxRaster = NULL;
}
handle->gfx = (Gfx*) mdl_nextTextureAddress;
memcpy(&handle->header, header, sizeof(*header));
func_801180E8(header, &mdl_nextTextureAddress, handle->raster, handle->palette, handle->auxRaster, handle->auxPalette, 0, 0, 0, 0);
gSPEndDisplayList(((Gfx*) mdl_nextTextureAddress)++);
}
void load_tile_header(char* textureName, s32 romOffset, s32 size);
INCLUDE_ASM(s32, "a5dd0_len_114e0", load_tile_header);
@ -4101,7 +4129,7 @@ void get_model_fog_color_parameters(u8* primR, u8* primG, u8* primB, u8* primA,
*fogEnd = mdl_renderModelFogEnd;
}
void set_model_env_color_parameters(u8 primR, u8 primG, u8 primB, u8 envR, s32 envG, s32 envB) {
void set_model_env_color_parameters(u8 primR, u8 primG, u8 primB, u8 envR, u8 envG, u8 envB) {
gRenderModelPrimR = primR;
gRenderModelPrimG = primG;
gRenderModelPrimB = primB;

File diff suppressed because it is too large Load Diff

View File

@ -8,54 +8,48 @@ NUAuPreNMIFunc nuAuPreNMIFunc = NULL;
s32 nuAuDmaNext = 0;
u32 nuAuFrameCounter = 0;
u8 nuAuTaskStop = NU_AU_TASK_RUN;
u8 D_80078181 = 1;
u8 volatile AuSynUseStereo = TRUE;
//bss
extern Acmd* D_800A3510[3];
extern Acmd* AlCmdListBuffers[3];
extern NUScTask D_800A3520[3];
extern u8* D_800A3628[3];
extern s32 D_800A3634;
extern s32 D_800A3638;
extern s32 AlFrameSize;
extern s32 AlMinFrameSize;
extern OSMesgQueue nuAuDmaMesgQ;
extern OSMesg nuAuDmaMesgBuf[50];
extern OSIoMesg nuAuDmaIOMesgBuf[];
extern NUDMABuffer* D_800A3BD4;
extern NUDMABuffer nuAuDmaBufList[50];
extern u8 D_800B91A0[];
extern AuSynDriver auSynDriver;
extern u64 rspbootUcodeBuffer[];
extern OSMesgQueue D_800DA444;
extern s32 D_800DAAB8;
extern s32 AlNumFields;
extern u64 n_aspMain_text_bin[];
extern u64 n_aspMain_data_bin[];
extern u8 D_801AA000[0x56000];
s32 nuAuDmaCallBack(s32 addr, s32 len, void* state, u8 arg3);
void func_8004B328(NUScMsg, u32);
void func_80056250(u8*, ALConfig*);
void nuAuMgr(void*);
void snd_load_audio_data(s32 frequency);
extern u8 AuHeapBase[AUDIO_HEAP_SIZE];
void create_audio_system(void) {
u32 i;
u32 freq, freq2;
u32 outputRate, frameSize;
ALConfig config;
nuAuTaskStop = NU_AU_TASK_RUN;
nuAuPreNMI = 0;
alHeapInit(&nuAuHeap, D_801AA000, 0x56000);
config.unk_00 = 24;
config.unk_04 = 4;
freq = osAiSetFrequency(32000);
freq2 = (D_800DAAB8 * freq + 59) / 60;
config.frequency = freq;
alHeapInit(&nuAuHeap, AuHeapBase, AUDIO_HEAP_SIZE);
config.num_pvoice = 24;
config.unk_num_gamma = 4;
outputRate = osAiSetFrequency(32000);
frameSize = (AlNumFields * outputRate + 59) / 60;
config.outputRate = outputRate;
config.unk_0C = 0;
config.heap = &nuAuHeap;
config.dmaNew = nuAuDmaNew;
D_800A3634 = (freq2 / 184 + 1) * 184; // NU_AU_AUDIO_SAMPLES ?
D_800A3638 = D_800A3634 - 184;
AlFrameSize = ((frameSize / AUDIO_SAMPLES) + 1) * AUDIO_SAMPLES;
AlMinFrameSize = AlFrameSize - AUDIO_SAMPLES;
for (i = 0; i < ARRAY_COUNT(D_800A3510); i++) {
D_800A3510[i] = alHeapAlloc(config.heap, 1, 0x4000);
for (i = 0; i < ARRAY_COUNT(AlCmdListBuffers); i++) {
AlCmdListBuffers[i] = alHeapAlloc(config.heap, 1, AUDIO_COMMAND_LIST_BUFFER_SIZE);
}
for (i = 0; i < ARRAY_COUNT(D_800A3520); i++) {
@ -76,7 +70,7 @@ void create_audio_system(void) {
}
for (i = 0; i < ARRAY_COUNT(D_800A3628); i++) {
D_800A3628[i] = alHeapAlloc(config.heap, 1, D_800A3634 * 4);
D_800A3628[i] = alHeapAlloc(config.heap, 1, AlFrameSize * 4);
}
nuAuDmaBufList[0].node.next = nuAuDmaBufList[0].node.prev = NULL;
@ -88,9 +82,9 @@ void create_audio_system(void) {
osCreateMesgQueue(&nuAuDmaMesgQ, nuAuDmaMesgBuf, 50);
nuAuPreNMIFunc = func_8004B328;
func_80056250(D_800B91A0, &config);
snd_load_audio_data(config.frequency);
osCreateThread(&nuAuMgrThread, NU_MAIN_THREAD_ID, nuAuMgr, NULL, &D_800A3510, NU_AU_MGR_THREAD_PRI); //why main thread?
au_driver_init(&auSynDriver, &config);
au_engine_init(config.outputRate);
osCreateThread(&nuAuMgrThread, NU_MAIN_THREAD_ID, nuAuMgr, NULL, &AlCmdListBuffers, NU_AU_MGR_THREAD_PRI); //why main thread?
osStartThread(&nuAuMgrThread);
}
@ -126,7 +120,7 @@ void nuAuMgr(void* arg) {
cmdListIndex = 0;
bufferIndex = 0;
samples = 0;
cmdListBuf = D_800A3510[0];
cmdListBuf = AlCmdListBuffers[0];
bufferPtr = D_800A3628[0];
while (TRUE) {
osRecvMesg(&auMesgQ, (OSMesg*)&mesg_type, OS_MESG_BLOCK);
@ -153,14 +147,14 @@ void nuAuMgr(void* arg) {
sampleSize = osAiGetLength() >> 2;
if (cmdList_len != 0 && nuAuTaskStop == NU_AU_TASK_RUN) {
osAiSetNextBuffer(bufferPtr, samples * 4);
cmdListBuf = D_800A3510[cmdListIndex];
cmdListBuf = AlCmdListBuffers[cmdListIndex];
bufferPtr = D_800A3628[bufferIndex];
}
if (sampleSize < 184 || cond) {
samples = D_800A3634;
if (sampleSize < AUDIO_SAMPLES || cond) {
samples = AlFrameSize;
cond = FALSE;
} else {
samples = D_800A3638;
samples = AlMinFrameSize;
cond = TRUE;
}
cmdListAfter_ptr = alAudioFrame(cmdListBuf, &cmdList_len, (s16*)osVirtualToPhysical(bufferPtr), samples);
@ -301,6 +295,7 @@ void nuAuCleanDMABuffers(void) {
// Nop issue
// try again when bss is figured out up until this file
// rename: default_nuAuPreNMIFunc
#ifdef NON_MATCHING
void func_8004B328(NUScMsg mesg_type, u32 frameCounter) {
s16 temp;
@ -329,7 +324,7 @@ void func_8004B328(NUScMsg mesg_type, u32 frameCounter) {
}
}
#else
INCLUDE_ASM(s32, "25f00_len_940", func_8004B328);
INCLUDE_ASM(s32, "audio/25f00_len_940", func_8004B328);
#endif
void alLink(ALLink* element, ALLink* after) {

2076
src/audio/28910_len_5090.c Normal file

File diff suppressed because it is too large Load Diff

419
src/audio/2BF90.c Normal file
View File

@ -0,0 +1,419 @@
#include "audio.h"
extern s8 BlankMseqData;
enum LambdaState24 {
LAMBDA_24_0 = 0,
LAMBDA_24_1 = 1,
LAMBDA_24_2 = 2,
LAMBDA_24_3 = 3
};
enum MseqPlayState {
MSEQ_PLAYER_PLAYING = 0,
MSEQ_PLAYER_STOPPED = 1,
MSEQ_PLAYER_STOPPING = 2
};
void au_mseq_manager_init(AuAmbienceManager* manager, s8 priority, s8 reverbType, AuGlobals* globals) {
AuAmbPlayer* lambda;
s32 i;
au_memset(manager, sizeof(*manager), 0);
for (i = 0; i < ARRAY_COUNT(manager->mseqPlayers); i++) {
lambda = &manager->mseqPlayers[i];
lambda->unk_14.u8[0] = i;
lambda->unk_18 = 1;
lambda->unk_38 = 0x7F000000;
}
manager->globals = globals;
manager->nextUpdateStep = 1;
manager->nextUpdateCounter = 2;
manager->nextUpdateInterval = 2;
manager->priority = priority;
manager->defaultReverbType = reverbType;
}
AuResult func_80050C30(u32 arg0) {
if (gAuAmbienceManager->unk_20 <= arg0) {
return AU_AMBIENCE_ERROR_3;
} else {
return AU_RESULT_OK;
}
}
void func_80050C54(s32 arg0, s32 arg1) {
gAuAmbienceManager->unk_21 = arg1;
}
void au_mseq_set_disabled(s32 index, s32 disable) {
AuAmbienceManager* manager = gAuAmbienceManager;
AuAmbPlayer* ambPlayer = &manager->mseqPlayers[index];
if (!disable) {
ambPlayer->playState = MSEQ_PLAYER_PLAYING;
} else {
ambPlayer->playState = MSEQ_PLAYER_STOPPING;
}
}
AuResult func_80050CA0(s32 index, s32 time) {
AuAmbPlayer* lambda = &gAuAmbienceManager->mseqPlayers[index];
MSEQHeader* mseq = gAuAmbienceManager->mseqFiles[index];
AuResult status = AU_RESULT_OK;
if (mseq != NULL) {
if (lambda->mseqName == 0) {
func_800510A4(gAuAmbienceManager, mseq, index);
if (time != 0) {
lambda->time = time;
lambda->unk_2A = 0;
lambda->volume = 0x7F;
lambda->unk_26 = 0;
func_80050D50(lambda);
}
} else {
status = AU_AMBIENCE_ERROR_1;
}
} else {
status = AU_AMBIENCE_ERROR_2;
}
return status;
}
void func_80050D50(AuAmbPlayer* lambda) {
u16 time = lambda->time;
if (lambda->unk_2A == 0xFF) {
lambda->unk_2A = lambda->unk_38 >> 0x18;
}
if (time >= SND_MIN_DURATION && time <= SND_MAX_DURATION) {
lambda->unk_38 = lambda->unk_2A << 0x18;
lambda->unk_42 = lambda->volume;
lambda->volInterpTime = (u32)(time * 10) / 115;
lambda->volInterpStep = ((lambda->volume - lambda->unk_2A) << 0x18) / ((s16)lambda->volInterpTime & 0xFFFF);
}
lambda->time = 0;
lambda->unk_2A = 0;
lambda->volume = 0;
}
void func_80050EF0_fade_out_unk(s32 index, s32 time) {
AuAmbPlayer* lambda = &gAuAmbienceManager->mseqPlayers[index];
if ((lambda->mseqReadStart != NULL) && (lambda->mseqReadPos != NULL)) {
if (time != 0) {
lambda->unk_2A = 0xFF;
lambda->time = time;
lambda->volume = 0;
lambda->unk_26 = 2;
return;
}
lambda->unk_24 = LAMBDA_24_3;
}
}
void func_80050EF0_fade_in_unk(s32 index, s32 time) {
AuAmbPlayer* lambda = &gAuAmbienceManager->mseqPlayers[index];
if ((lambda->mseqReadStart != NULL) && (lambda->mseqReadPos != NULL)) {
lambda->unk_24 = LAMBDA_24_1;
if (time != 0) {
lambda->time = time;
} else {
lambda->time = SND_MIN_DURATION;
}
lambda->unk_2A = 0;
lambda->volume = SND_MAX_VOLUME_8;
lambda->unk_26 = 0;
}
}
void func_80050EF0_fade_out_quick(s32 index) {
AuAmbPlayer* lambda = &gAuAmbienceManager->mseqPlayers[index];
if ((lambda->mseqReadStart != NULL) && (lambda->mseqReadPos != NULL)) {
if (lambda->unk_24 != LAMBDA_24_0) {
lambda->mseqReadPos = NULL;
lambda->mseqName = 0;
lambda->unk_24 = LAMBDA_24_0;
return;
}
lambda->mseqReadPos = &BlankMseqData;
lambda->unk_18 = 1;
}
}
void func_80050EF0_fade_out_slow(s32 index, s32 time) {
AuAmbPlayer* lambda = &gAuAmbienceManager->mseqPlayers[index];
if ((lambda->mseqReadStart != NULL) && (lambda->mseqReadPos != NULL)) {
if (time != 0) {
lambda->time = time;
} else {
lambda->time = SND_MIN_DURATION;
}
lambda->unk_2A = -1;
lambda->volume = 0;
lambda->unk_26 = 1;
}
}
void au_mseq_set_volume(s32 index, s32 time, s32 volume) {
AuAmbPlayer* lambda = &gAuAmbienceManager->mseqPlayers[index];
if ((lambda->mseqReadStart != 0) && (lambda->mseqReadPos != 0)) {
if (volume <= 0) {
volume = 1;
} else if (volume > SND_MAX_VOLUME_8) {
volume = SND_MAX_VOLUME_8;
}
if (time != 0) {
lambda->time = time;
} else {
lambda->time = SND_MIN_DURATION;
}
lambda->unk_2A = -1;
lambda->volume = volume;
lambda->unk_26 = 0;
}
}
AuResult func_80051050(s32 arg0) {
AuAmbPlayer* lambda = &gAuAmbienceManager->mseqPlayers[arg0];
AuResult status = AU_RESULT_OK;
if ((lambda->mseqReadStart != NULL) && (lambda->mseqReadPos != NULL)) {
status = AU_AMBIENCE_ERROR_1;
if (lambda->unk_24 != LAMBDA_24_0) {
status = AU_AMBIENCE_ERROR_2;
}
}
return status;
}
void func_800510A4(AuAmbienceManager* manager, MSEQHeader* mseqFile, s32 index) {
AuAmbPlayer* lambda;
AlUnkXi* xi;
AuFilePos readPos;
s32 i;
lambda = &manager->mseqPlayers[index];
au_memset(lambda, sizeof(*lambda), 0);
lambda->mseqFile = mseqFile;
readPos = AU_FILE_RELATIVE(mseqFile->dataStart, mseqFile);
lambda->unk_14.u8[0] = index;
lambda->mseqReadPos = readPos;
lambda->unk_10 = readPos;
lambda->unk_0C = readPos;
lambda->mseqReadStart = readPos;
lambda->unk_18 = 1;
lambda->unk_38 = 0x7F000000;
lambda->unk_42 = 0x7F;
lambda->mseqName = lambda->mseqFile->name;
lambda->firstVoiceIdx = lambda->mseqFile->first_iota;
lambda->lastVoiceIdx = lambda->firstVoiceIdx + 16;
if (lambda->lastVoiceIdx > 24) {
lambda->lastVoiceIdx = 24;
}
for (i = 0; i < 10; i++) {
xi = &lambda->unk_44[i];
xi->instrument = manager->globals->defaultInstrument;
xi->unk_18.full = 0x7FFFFFFF;
xi->pan = 0x40;
}
lambda->unk_43 = 1;
}
void snd_ambient_manager_update(AuAmbienceManager* manager) {
u32 i;
s32 j;
for (i = 0; i < ARRAY_COUNT(manager->mseqVoiceStates); i++) {
AlUnkIota* temp = &manager->mseqVoiceStates[i];
if ((temp->unk_00.u8[3] == 1) && (manager->globals->voices[i].priority != manager->priority)) {
temp->unk_00.s32 = 0;
}
}
for (j = 0; j < ARRAY_COUNT(manager->mseqPlayers); j++) {
AuAmbPlayer* lambda = &manager->mseqPlayers[j];
s32 var;
if (lambda->mseqReadPos != NULL) {
if (manager->unk_21) {
// not usually taken
func_80051334(manager, lambda);
}
var = lambda->unk_24;
if (var != LAMBDA_24_0) {
if (var == LAMBDA_24_3) {
lambda->unk_24 = LAMBDA_24_2;
func_800522A8(manager, lambda);
au_mseq_player_stop(manager, lambda);
} else if (lambda->unk_24 == LAMBDA_24_1) {
lambda->unk_24 = LAMBDA_24_0;
if (lambda->time != 0) {
func_80050D50(lambda);
}
func_8005232C(manager, lambda);
}
} else {
if (lambda->time != 0) {
func_80050D50(lambda);
}
if (lambda->playState == MSEQ_PLAYER_STOPPING) {
au_mseq_player_stop(manager, lambda);
lambda->playState = MSEQ_PLAYER_STOPPED;
}
func_80051434(manager, lambda);
}
}
}
manager->unk_21 = FALSE;
}
void func_80051334(AuAmbienceManager* manager, AuAmbPlayer* lambda) {
MSEQHeader* mseqFile;
AlUnkMSEQData* var_a0;
AlUnkXi* xi;
s32 offset;
s32 count;
s32 lim;
mseqFile = lambda->mseqFile;
count = mseqFile->unkCount;
if (count != 0 && mseqFile->unkOffset != 0) {
var_a0 = AU_FILE_RELATIVE(mseqFile->unkOffset, mseqFile);
while (count--) {
xi = &lambda->unk_44[var_a0->unk_00];
if (var_a0->unk_01 == 0) {
xi->unk_14 = var_a0->unk_02;
xi->unk_10 = (var_a0->unk_04 << 0x10) / var_a0->unk_02;
xi->unk_16 = var_a0->unk_06;
} else if (var_a0->unk_01 == 1) {
xi->unk_20 = var_a0->unk_02;
xi->unk_1C = (var_a0->unk_04 << 0x10) / var_a0->unk_02;
xi->unk_22 = var_a0->unk_06;
}
var_a0++;
}
}
}
INCLUDE_ASM(void, "audio/2BF90", func_80051434, AuAmbienceManager* arg0, AuAmbPlayer* arg1);
// could return u8?
s32 au_mseq_read_next(AuAmbPlayer* state) {
u8 value = *state->mseqReadPos++;
return value;
}
void au_mseq_player_stop(AuAmbienceManager* manager, AuAmbPlayer* lambda) {
AlUnkVoice* voice;
Q32* temp_s1;
s32 i;
for (i = lambda->firstVoiceIdx; i < lambda->lastVoiceIdx; i++) {
temp_s1 = &manager->mseqVoiceStates[i - lambda->firstVoiceIdx].unk_00;
if (*temp_s1->u8 == lambda->unk_14.u8[0]) {
voice = &manager->globals->voices[i];
if (voice->priority == manager->priority) {
au_reset_voice(voice, i);
}
temp_s1->s32 = 0;
}
}
}
void func_800522A8(AuAmbienceManager* arg0, AuAmbPlayer* lambda) {
AlUnkOmega* omega = lambda->unk_1D4;
u32 copied = 0;
s32 i;
for (i = lambda->firstVoiceIdx; i < lambda->lastVoiceIdx; i++) {
AlUnkIota* iota = &arg0->mseqVoiceStates[i - lambda->firstVoiceIdx];
if (iota->unk_07 == 0) {
continue;
}
omega->unk_00 = iota->unk_00.u8[1];
omega->unk_01 = iota->unk_00.u8[2];
omega->unk_02 = iota->volume;
omega++;
copied++;
if (copied >= 4) {
break;
}
}
}
void func_8005232C(AuAmbienceManager* manager, AuAmbPlayer* lambda) {
AuGlobals* globals;
AlUnkVoice* voice;
AlUnkOmega* omega;
AlUnkIota* iota;
AlUnkXi* xi;
u32 i, j;
globals = manager->globals;
if (lambda->playState == MSEQ_PLAYER_PLAYING) {
for (i = 0; i < ARRAY_COUNT(lambda->unk_1D4); i++) {
omega = &lambda->unk_1D4[i];
if (omega->unk_01 != 0) {
xi = &lambda->unk_44[omega->unk_00];
// find first free voice
for (j = lambda->firstVoiceIdx; j < lambda->lastVoiceIdx; j++) {
voice = &globals->voices[j];
if (voice->priority == AU_PRIORITY_FREE) {
break;
}
}
// try stealing a voice with lower priority
if (j >= lambda->lastVoiceIdx) {
for (j = lambda->firstVoiceIdx; j < lambda->lastVoiceIdx; j++) {
voice = &globals->voices[j];
if (voice->priority < manager->priority) {
au_reset_voice(voice, j);
break;
}
}
}
if (j < lambda->lastVoiceIdx) {
iota = &manager->mseqVoiceStates[j - lambda->firstVoiceIdx];
iota->unk_00.s32 = lambda->unk_14.s32 + (omega->unk_00 << 0x10) + (omega->unk_01 << 8);
iota->pitch = ((omega->unk_01 & 0x7F) * 100) - xi->instrument->keyBase;
iota->volume = omega->unk_02 & 0x7F;
voice->adjustedVolume = ((lambda->unk_38 >> 0x18) * xi->unk_18.half * iota->volume) >> 0xE;
voice->pitchRatio = au_compute_pitch_ratio(iota->pitch + xi->pitch) * xi->instrument->pitchRatio;
voice->pan = xi->pan;
voice->reverbAmt = xi->reverb;
voice->instrument = xi->instrument;
voice->reverbType = manager->defaultReverbType;
voice->unk_14.unk_00 = xi->unk_04.unk_00;
voice->unk_14.unk_04 = xi->unk_04.unk_04;
voice->unk_flags_43 = AU_VOICE_SYNC_FLAGS_ALL;
voice->priority = manager->priority;
voice->priorityCopy = voice->priority;
}
}
omega->unk_00 = 0;
omega->unk_01 = 0;
omega->unk_02 = 0;
}
}
}

203
src/audio/2d9a0_len_890.c Normal file
View File

@ -0,0 +1,203 @@
#include "common.h"
#include "audio.h"
void func_800525A0(AuGlobals* globals) {
s32 i;
for (i = 0; i < ARRAY_COUNT(globals->voices); i++) {
AlUnkVoice* voice = &globals->voices[i];
if (voice->unk_42 != 0) {
au_pvoice_reset_filter(i);
voice->unk_42 = 0;
voice->unk_1C = NULL;
voice->priority = AU_PRIORITY_FREE;
}
}
}
void func_80052614(AuGlobals* globals) {
s32 i;
for (i = 0; i < ARRAY_COUNT(globals->voices); i++) {
AlUnkVoice* temp = &globals->voices[i];
temp->unk_1C = NULL;
temp->unk_20 = 0;
temp->unk_24 = 0;
temp->unk_28 = 0;
temp->unk_3B = 0;
temp->unk_3C = 0;
temp->unk_flags_3D = 0;
temp->unk_3E = 0;
temp->unk_3F = 0x80;
}
}
void func_80052660(AuGlobals* globals) {
AlUnkVoice* voice;
s8 var_a0;
s16 unkTemp;
s32 i;
for (i = 0; i < ARRAY_COUNT(globals->voices); i++) {
voice = &globals->voices[i];
if (voice->unk_1C == NULL) {
continue;
}
if (voice->unk_flags_3D & AU_VOICE_3D_FLAGS_HANDLED_VOL_CHANGE) {
func_80052B44(voice);
continue;
}
if (voice->unk_flags_3D & AU_VOICE_3D_FLAGS_10) {
voice->unk_flags_3D &= ~AU_VOICE_3D_FLAGS_10;
voice->unk_flags_3D |= AU_VOICE_3D_FLAGS_1;
voice->unk_1C = (u8*)voice->unk_14.unk_04;
if (voice->unk_28 > AU_5750) {
voice->unk_39 = voice->unk_39 + (s32) (voice->unk_2C * (f32) (voice->unk_24 - voice->unk_28));
} else {
voice->unk_39 = voice->unk_3A;
}
voice->unk_3B = *voice->unk_1C++;
var_a0 = *voice->unk_1C;
if (*(s8*)voice->unk_1C++ < 0) {
var_a0 &= 0x7F;
voice->unk_3E = 1;
voice->unk_3F = voice->unk_39;
}
voice->unk_3A = var_a0;
voice->unk_28 = D_800785A0[voice->unk_3B];
voice->unk_24 = voice->unk_28;
if (voice->unk_flags_3D & AU_VOICE_3D_FLAGS_VOL_CHANGED) {
voice->unk_flags_3D &= ~AU_VOICE_3D_FLAGS_VOL_CHANGED;
if (voice->unk_28 > AU_5750) {
voice->unk_28 -= AU_5750;
voice->unk_flags_3D |= AU_VOICE_3D_FLAGS_HANDLED_VOL_CHANGE;
unkTemp = voice->unk_39 + (s32) (voice->unk_2C * (voice->unk_24 - voice->unk_28));
} else {
unkTemp = voice->unk_3A;
}
voice->unk_08 = AUDIO_SAMPLES;
} else {
voice->unk_08 = func_80052BC0(voice->unk_24);
unkTemp = voice->unk_3A;
}
voice->volume = (((unkTemp * voice->adjustedVolume * voice->unk_3F) >> 0xE) * voice->unk_30) >> 7;
voice->unk_flags_43 |= AU_VOICE_SYNC_FLAGS_4;
} else {
if (voice->unk_28 == -1) {
if (voice->unk_flags_3D & AU_VOICE_3D_FLAGS_VOL_CHANGED) {
voice->unk_flags_3D &= ~AU_VOICE_3D_FLAGS_VOL_CHANGED;
voice->volume = (((voice->unk_39 * voice->adjustedVolume * voice->unk_3F) >> 0xE) * voice->unk_30) >> 7;
voice->unk_flags_43 |= AU_VOICE_SYNC_FLAGS_4;
}
} else {
voice->unk_28 -= AU_5750;
if (voice->unk_28 <= 0) {
if (*voice->unk_1C == 0xFF) {
if (voice->unk_flags_3D & AU_VOICE_3D_FLAGS_1) {
voice->unk_flags_3D = 0;
voice->unk_1C = NULL;
voice->unk_42 = 1;
} else {
voice->unk_28 = -1;
voice->unk_24 = -1;
voice->unk_3B = 0x3B;
voice->unk_08 = AUDIO_SAMPLES;
voice->unk_2C = 0.0f;
voice->unk_39 = voice->unk_3A;
}
} else {
voice->unk_3B = func_80052CFC(voice);
voice->unk_39 = voice->unk_3A;
voice->unk_3A = (*voice->unk_1C++) & 0x7F;
voice->unk_28 = D_800785A0[voice->unk_3B];
voice->unk_24 = voice->unk_28;
if (voice->unk_24 != 0) {
voice->unk_2C = ((f32) voice->unk_3A - (f32) voice->unk_39) / (f32) voice->unk_24;
} else {
voice->unk_2C = 0.0f;
}
if (voice->unk_flags_3D & AU_VOICE_3D_FLAGS_VOL_CHANGED) {
voice->unk_flags_3D &= ~AU_VOICE_3D_FLAGS_VOL_CHANGED;
if (voice->unk_28 > AU_5750) {
voice->unk_28 -= AU_5750;
voice->unk_flags_3D |= AU_VOICE_3D_FLAGS_HANDLED_VOL_CHANGE;
unkTemp = voice->unk_39 + (s32) (voice->unk_2C * (voice->unk_24 - voice->unk_28));
} else {
unkTemp = voice->unk_3A;
}
voice->unk_08 = AUDIO_SAMPLES;
} else {
voice->unk_08 = func_80052BC0(voice->unk_24);
unkTemp = voice->unk_3A;
}
voice->volume = (((unkTemp * voice->adjustedVolume * voice->unk_3F) >> 0xE) * voice->unk_30) >> 7;
voice->unk_flags_43 |= AU_VOICE_SYNC_FLAGS_4;
}
} else {
if (voice->unk_flags_3D & AU_VOICE_3D_FLAGS_VOL_CHANGED) {
voice->unk_flags_3D &= ~AU_VOICE_3D_FLAGS_VOL_CHANGED;
if (voice->unk_28 > AU_5750) {
voice->unk_28 -= AU_5750;
voice->unk_flags_3D |= AU_VOICE_3D_FLAGS_HANDLED_VOL_CHANGE;
unkTemp = voice->unk_39 + (s32) (voice->unk_2C * (voice->unk_24 - voice->unk_28));
} else {
unkTemp = voice->unk_3A;
}
voice->unk_08 = AUDIO_SAMPLES;
voice->volume = (((unkTemp * voice->adjustedVolume * voice->unk_3F) >> 0xE) * voice->unk_30) >> 7;
voice->unk_flags_43 |= AU_VOICE_SYNC_FLAGS_4;
}
}
}
}
}
}
void func_80052B44(AlUnkVoice* arg0) {
arg0->volume = (((arg0->unk_3A * arg0->adjustedVolume * arg0->unk_3F) >> 14) * arg0->unk_30) >> 7;
arg0->unk_08 = func_80052BC0(arg0->unk_28);
arg0->unk_flags_3D &= ~AU_VOICE_3D_FLAGS_HANDLED_VOL_CHANGE;
arg0->unk_flags_43 |= AU_VOICE_SYNC_FLAGS_4;
}
s32 func_80052BC0(s32 arg0) {
return (arg0 / AU_5750) * AUDIO_SAMPLES;
}
void func_80052BF8(AlUnkVoice* voice, AlUnkInstrumentData* arg1) {
s32 x;
voice->unk_14.unk_00 = arg1->unk_00;
voice->unk_1C = voice->unk_14.unk_00;
voice->unk_14.unk_04 = arg1->unk_04;
voice->unk_30 = 0x80;
voice->unk_34 = 0;
x = func_80052CFC(voice);
voice->unk_flags_3D = 0;
voice->unk_39 = 0;
voice->unk_3A = *voice->unk_1C++;
voice->unk_3B = x;
voice->unk_24 = D_800785A0[x];
voice->unk_28 = voice->unk_24;
voice->volume = (voice->unk_3A * voice->adjustedVolume * voice->unk_30) >> 14;
voice->unk_08 = func_80052BC0(voice->unk_24);
if (voice->unk_24 != 0) {
voice->unk_2C = ((f32) voice->unk_3A - (f32) voice->unk_39) / voice->unk_24;
} else {
voice->unk_2C = 0.0f;
}
voice->unk_3E = 0;
voice->unk_3F = 0x80;
}
INCLUDE_ASM(u8, "audio/2d9a0_len_890", func_80052CFC, AlUnkVoice* arg0);
void func_80052E18(AlUnkVoice* arg0) {
arg0->unk_flags_3D |= AU_VOICE_3D_FLAGS_VOL_CHANGED;
}

1185
src/audio/2e230_len_2190.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,22 +4,22 @@
typedef struct BufferEntry {
/* 0x0 */ u16 fileIndex;
/* 0x2 */ u8 bankIndex;
/* 0x3 */ u8 unk_3;
/* 0x3 */ u8 bankGroup;
} BufferEntry; // size = 4
void snd_load_BK_headers(UnkAl19E0* soundData, ALHeap* arg1) {
void au_load_BK_headers(AuGlobals* globals, ALHeap* heap) {
SBNFileEntry fileEntry;
BufferEntry buffer[80];
s32 i;
snd_read_rom(soundData->bkFileListOffset, &buffer, soundData->bkListLength);
au_read_rom(globals->bkFileListOffset, &buffer, globals->bkListLength);
for (i = 0; i < ARRAY_COUNT(buffer); i++) {
if (buffer[i].fileIndex == 0xFFFF) {
break;
}
snd_fetch_SBN_file(buffer[i].fileIndex, 0x30, &fileEntry);
snd_load_BK_to_bank(fileEntry.offset, NULL, buffer[i].bankIndex, buffer[i].unk_3);
au_fetch_SBN_file(buffer[i].fileIndex, AU_FMT_BK, &fileEntry);
snd_load_BK_to_bank(fileEntry.offset, NULL, buffer[i].bankIndex, buffer[i].bankGroup);
}
}

869
src/audio/30450.c Normal file
View File

@ -0,0 +1,869 @@
#include "common.h"
#include "audio.h"
static u8* snd_song_get_track_volumes_set(MusicTrackVols arg0);
s32 PreventBGMPlayerUpdate = FALSE;
u16 D_80078DB4 = 0;
u16 D_80078DB6 = 0;
// lists of data:
// u8 trackIdx
// u8 volume?
// repeated until idx = 0
u8 D_80078DB8[] = {
2, 94,
3, 80,
4, 100,
5, 84,
0
};
u8 D_80078DC4[] = {
2, 100,
3, 110,
4, 90,
0
};
u8 D_80078DCC[] = {
2, 95,
0
};
u8 D_80078DD0[] = {
5, 70,
6, 90,
7, 90,
8, 100,
0
};
// used in kpa_60-63
u8 TrackVols_KPA_Outside[] = {
5, 0,
6, 0,
7, 0,
8, 0,
9, 0,
10, 0,
11, 0,
12, 0,
13, 0,
14, 0,
15, 0,
16, 0,
0
};
// starting areas, only basic instrumentation
u8 TrackVols_KPA_1[] = {
5, 100,
6, 102,
7, 88,
8, 110,
9, 0,
10, 0,
11, 0,
12, 0,
13, 0,
14, 0,
15, 0,
16, 0,
0
};
// middle areas
u8 TrackVols_KPA_2[] = {
5, 100,
6, 102,
7, 88,
8, 110,
9, 126,
10, 88,
11, 100,
12, 0,
13, 0,
14, 0,
15, 0,
16, 0,
0
};
// final areas, full instrumentation
u8 TrackVols_KPA_3[] = {
5, 100,
6, 102,
7, 88,
8, 110,
9, 126,
10, 88,
11, 100,
12, 100,
13, 106,
14, 100,
15, 100,
16, 110,
0
};
void func_80055050(ALHeap* heap) {
D_80078DB4 = 1;
PreventBGMPlayerUpdate = FALSE;
}
void func_80055068(u32 arg0) {
u16 temp_a0 = D_80078DB4;
u32 temp_v1 = arg0 & 0xF;
if (temp_a0 == 1) {
switch (temp_v1) {
case 2:
case 3:
break;
case 4:
snd_start_sound_with_shift(arg0 >> 4, 0, 0, 0);
break;
case 1:
if (temp_v1 == 1) {
s32 filename = au_song_load((arg0 >> 4) & 0xFF, 0);
if (filename > ASCII_TO_U32('0', ' ', ' ', '\0')) {
au_song_start_variation(filename, (arg0 >> 0xC) & 3);
}
}
break;
}
}
}
void func_80055110(BGMPlayer* player) {
s32 i;
for (i = 0; i < ARRAY_COUNT(player->unk_238); i++) {
player->unk_238[i] = 0;
}
player->unk_25B = 0;
player->unk_25A = 0;
player->unk_259 = 0;
player->unk_258 = 0;
}
void func_8005513C(u32 arg0) {
BGMPlayer* player = NULL;
u32 playerSwitch = arg0 & 0xF;
if (playerSwitch != 0) {
if (playerSwitch == 1) {
player = gBGMPlayerA;
} else if (playerSwitch == 2) {
player = gBGMPlayerB;
}
if (player != NULL) {
u32 temp;
if (player->unk_258 < 8) {
temp = player->unk_25A;
player->unk_238[temp] = arg0 >> 4;
temp++;
if (temp >= 8) {
temp = 0;
}
player->unk_25A = temp;
player->unk_258++;
} else {
temp = player->unk_25B + 1;
if (temp > 99) {
temp = 99;
}
player->unk_25B = temp;
}
}
}
}
void snd_start_sound(s32 soundID, u8 volume, u8 pan) {
SoundManager* soundManager = gSoundManager;
s16 vol = volume << 8;
if (vol != 0) {
vol |= 0xFF;
}
if (pan > 0x7F) {
pan = 0x7F;
}
au_sfx_enqueue_event(soundManager, soundID, vol, 0, pan);
}
void snd_start_sound_with_shift(s32 soundID, u8 volume, u8 pan, s16 pitchShift) {
SoundManager* soundManager = gSoundManager;
s16 vol = volume << 8;
if (vol != 0) {
vol |= 0xFF;
}
if (pan > 0x7F) {
pan = 0x7F;
}
if (pitchShift > 2400) {
pitchShift = 2400;
} else if (pitchShift < -2400) {
pitchShift = -2400;
}
au_sfx_enqueue_event(soundManager, soundID, vol, pitchShift, pan);
}
void snd_adjust_sound(s32 soundID, u8 volume, u8 pan) {
SoundManager* soundManager = gSoundManager;
s16 vol = volume << 8;
if (vol != 0) {
vol |= 0xFF;
}
if (pan > 0x7F) {
pan = 0x7F;
}
au_sfx_enqueue_event(soundManager, soundID | 0x1000, vol, 0, pan);
}
void snd_adjust_sound_with_shift(s32 soundID, u8 volume, u8 pan, s16 pitchShift) {
SoundManager* soundManager = gSoundManager;
s16 vol = volume << 8;
if (vol != 0) {
vol |= 0xFF;
}
if (pan > 0x7F) {
pan = 0x7F;
}
if (pitchShift > 2400) {
pitchShift = 2400;
} else if (pitchShift < -2400) {
pitchShift = -2400;
}
au_sfx_enqueue_event(soundManager, soundID | 0x1000, vol, pitchShift, pan);
}
void snd_stop_sound(s32 soundID) {
SoundManager* soundManager = gSoundManager;
au_sfx_enqueue_event(soundManager, soundID | 0x8000, 0, 0, 0);
}
void func_800553F4(void) {
gSoundManager->unk_168 = 1;
}
void snd_start_sound_raw(s32 soundID, s16 volume, s16 pitchShift, s32 pan) {
SoundManager* soundManager = gSoundManager;
au_sfx_enqueue_event(soundManager, soundID, volume, pitchShift, pan);
}
AuResult snd_ambient_80055448(s32 ambSoundID) {
return func_80053F80(ambSoundID);
}
AuResult snd_ambient_80055464(s32 arg0, s32 arg1) {
AuResult status = func_80050C30(arg0);
if (status != AU_RESULT_OK) {
return status;
}
return func_80050CA0(arg0, arg1);
}
AuResult snd_ambient_quick_fade_out(s32 arg0) {
AuResult status = func_80050C30(arg0);
if (status == AU_RESULT_OK) {
func_80050EF0_fade_out_quick(arg0);
}
return status;
}
AuResult snd_ambient_slow_fade_out(s32 arg0, s32 arg1) {
AuResult status = func_80050C30(arg0);
if (status == AU_RESULT_OK) {
func_80050EF0_fade_out_slow(arg0, arg1);
}
return status;
}
// fade out sounds (kmr_00)
AuResult snd_ambient_8005553C(s32 arg0, s32 arg1) {
AuResult status = func_80050C30(arg0);
if (status == AU_RESULT_OK) {
func_80050EF0_fade_out_unk(arg0, arg1);
}
return status;
}
// fade in sounds (kmr_00) -- restart?
AuResult snd_ambient_80055590(s32 arg0, s32 arg1) {
AuResult status = func_80050C30(arg0);
if (status == AU_RESULT_OK) {
func_80050EF0_fade_in_unk(arg0, arg1);
}
return status;
}
AuResult snd_ambient_800555E4(s32 arg0) {
AuResult status = func_80050C30(arg0);
if (status != AU_RESULT_OK) {
return status;
}
return func_80051050(arg0);
}
//TODO au_ambience_disable? -- sets a flag which tells the manager to mute players
AuResult snd_ambient_80055618(s32 index, s32 arg1) {
AuResult status = func_80050C30(index);
if (status == AU_RESULT_OK) {
func_80050C54(index, arg1);
}
return status;
}
AuResult au_ambience_set_volume(s32 index, s32 time, s32 volume) {
AuResult status = func_80050C30(index);
if (status == AU_RESULT_OK) {
au_mseq_set_volume(index, time, volume);
}
return status;
}
AuResult au_ambience_disable(s32 index) {
AuResult status = func_80050C30(index);
if (status == AU_RESULT_OK) {
au_mseq_set_disabled(index, TRUE);
}
return status;
}
AuResult au_ambience_enable(s32 index) {
AuResult status = func_80050C30(index);
if (status == AU_RESULT_OK) {
au_mseq_set_disabled(index, FALSE);
}
return status;
}
void snd_ambient_80055760(s32 arg0) {
u32 i;
s32 lim = 4;
D_80078DB6 = 0xFF;
for (i = 0; i < lim; i++) {
if (snd_ambient_80055464(i, 0) != AU_RESULT_OK) {
return;
}
}
snd_ambient_80055848(arg0);
}
AuResult snd_ambient_800557CC(s32 arg0) {
AuResult status = AU_RESULT_OK;
s32 lim = 4;
u32 i;
for (i = 0; i < lim; i++) {
if (i == D_80078DB6) {
status = snd_ambient_slow_fade_out(i, arg0);
} else {
status = snd_ambient_quick_fade_out(i);
}
if (status != AU_RESULT_OK) {
break;
}
}
return status;
}
// play only
AuResult snd_ambient_80055848(s32 index) {
AuResult status = AU_RESULT_OK;
s32 lim = 4;
if (index != D_80078DB6) {
u32 i;
for (i = 0; i < lim; i++) {
if (i == index) {
status = au_ambience_enable(index);
} else {
status = au_ambience_disable(i); // mute
}
if (status != AU_RESULT_OK) {
break;
}
}
if (status == AU_RESULT_OK) {
D_80078DB6 = index;
}
}
return status;
}
AuResult au_song_load(s32 songID, s32 playerIndex) {
BGMHeader* bgmFile;
BGMPlayer* player;
au_get_bgm_player_and_file(playerIndex, &bgmFile, &player);
if (bgmFile != NULL) {
return au_load_song_files(songID, bgmFile, player);
} else {
return AU_ERROR_NULL_SONG_NAME;
}
}
AuResult au_song_start(s32 songName) {
AuResult status;
SongUpdateEvent s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
s.duration = 0;
s.startVolume = 127;
s.finalVolume = 127;
s.variation = 0;
s.unk14 = 0;
status = au_bgm_dispatch_player_event(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
}
AuResult au_song_start_variation(s32 songName, s32 variation) {
AuResult status;
SongUpdateEvent s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
s.duration = 0;
s.startVolume = 127;
s.finalVolume = 127;
s.variation = variation;
s.unk14 = 0;
status = au_bgm_dispatch_player_event(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
}
AuResult au_song_stop(s32 songName) {
return au_bgm_stop_song(songName);
}
void au_stop_songs(void) {
au_bgm_stop_all();
}
AuResult au_song_is_playing(s32 songName) {
return au_bgm_is_song_playing(songName);
}
AuResult snd_set_song_variation_fade(s32 songName, s32 variation, s32 fadeInTime, s32 startVolume, s32 endVolume) {
AuResult status;
SongUpdateEvent s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
s.duration = fadeInTime;
s.startVolume = startVolume;
s.finalVolume = endVolume;
s.variation = variation;
s.unk14 = 0;
status = au_bgm_dispatch_player_event(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
}
AuResult snd_set_song_fade(s32 songName, s32 fadeInTime, s32 startVolume, s32 endVolume) {
AuResult status;
SongUpdateEvent s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
s.duration = fadeInTime;
s.startVolume = startVolume;
s.finalVolume = endVolume;
s.variation = 0;
s.unk14 = 0;
status = au_bgm_dispatch_player_event(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
}
AuResult snd_set_song_variation_fade_time(s32 songName, s32 fadeTime, s32 variation) {
SongUpdateEvent s;
s.songName = songName;
s.duration = fadeTime;
s.startVolume = 0;
s.finalVolume = 0;
s.variation = variation;
s.unk14 = 0;
return func_8004DB4C(&s);
}
AuResult func_80055AF0(s32 songName) {
SongUpdateEvent s;
s.songName = songName;
s.duration = 0;
s.startVolume = 0;
s.finalVolume = 0;
s.variation = 0;
s.unk14 = 0;
return func_8004DCB8(&s, 0);
}
AuResult func_80055B28(s32 songName) {
AuResult status;
SongUpdateEvent s;
PreventBGMPlayerUpdate = TRUE;
s.songName = songName;
s.duration = 2000;
s.startVolume = 1;
s.finalVolume = 127;
s.variation = 0;
s.unk14 = 0;
status = func_8004DE2C(&s);
PreventBGMPlayerUpdate = FALSE;
return status;
}
AuResult func_80055B80(s32 songName) {
SongUpdateEvent s;
s.songName = songName;
s.duration = 0;
s.startVolume = 0;
s.finalVolume = 0;
s.variation = 0;
s.unk14 = 0;
return func_8004DCB8(&s, 1);
}
AuResult func_80055BB8(s32 songName, s32 fadeTime) {
SongUpdateEvent s;
s.songName = songName;
s.duration = fadeTime;
s.startVolume = 0;
s.finalVolume = 0;
s.variation = 0;
s.unk14 = 1;
return func_8004DB4C(&s);
}
AuResult func_80055BF0(s32 songName) {
SongUpdateEvent s;
s.songName = songName;
s.duration = 0;
s.startVolume = 0;
s.finalVolume = 0;
s.variation = 0;
s.unk14 = 1;
return func_8004DCB8(&s, 0);
}
AuResult func_80055C2C(s32 songName) {
SongUpdateEvent s;
s.songName = songName;
s.duration = 0;
s.startVolume = 0;
s.finalVolume = 0;
s.variation = 0;
s.unk14 = 1;
return func_8004DE2C(&s);
}
AuResult func_80055C64(s32 songName) {
SongUpdateEvent s;
s.songName = songName;
s.duration = 500;
s.finalVolume = 0x2000;
return func_8004E0F4(&s);
}
AuResult func_80055C94(s32 songName) {
SongUpdateEvent s;
s.songName = songName;
s.duration = 500;
s.finalVolume = 0x7FFF;
return func_8004E0F4(&s);
}
AuResult snd_set_song_variation(s32 songName, s32 variation) {
SongUpdateEvent s;
s.songName = songName;
s.variation = variation;
return func_80050970(&s);
}
// get file and player information for a given song name if it's currently playing
AuResult snd_song_get_playing_info(s32 songName, BGMHeader** outFile, BGMPlayer** outPlayer) {
AuResult status = AU_RESULT_OK;
BGMHeader* bgmFile;
bgmFile = gSoundGlobals->dataBGM[0];
if (songName == bgmFile->name) {
*outPlayer = gBGMPlayerA;
*outFile = bgmFile;
} else {
bgmFile = gSoundGlobals->dataBGM[1];
if (songName == bgmFile->name) {
*outPlayer = gBGMPlayerB;
*outFile = bgmFile;
} else {
status = AU_ERROR_1;
}
}
return status;
}
AuResult func_80055D38(s32 songName, f32 arg1) {
BGMPlayer* bgmPlayer;
BGMHeader* bgmFile;
AuResult status;
status = snd_song_get_playing_info(songName, &bgmFile, &bgmPlayer);
if (status == AU_RESULT_OK) {
func_80050770(bgmPlayer, arg1);
}
return status;
}
AuResult func_80055D8C(s32 songName, s32 arg1) {
BGMPlayer* bgmPlayer;
BGMHeader* bgmFile;
AuResult status;
status = snd_song_get_playing_info(songName, &bgmFile, &bgmPlayer);
if (status == AU_RESULT_OK) {
func_80050818(bgmPlayer, arg1);
}
return status;
}
AuResult snd_song_set_track_volumes(s32 songName, MusicTrackVols trackVolSet) {
BGMPlayer* bgmPlayer;
BGMHeader* bgmFile;
AuResult status;
status = snd_song_get_playing_info(songName, &bgmFile, &bgmPlayer);
if (status == AU_RESULT_OK) {
u8* trackVols = snd_song_get_track_volumes_set(trackVolSet);
if (trackVols != NULL) {
au_bgm_set_track_volumes(bgmPlayer, trackVols, TRUE);
} else {
status = AU_ERROR_11;
}
}
return status;
}
AuResult snd_song_clear_track_volumes(s32 songName, MusicTrackVols trackVolSet) {
BGMPlayer* bgmPlayer;
BGMHeader* bgmFile;
AuResult status;
status = snd_song_get_playing_info(songName, &bgmFile, &bgmPlayer);
if (status == AU_RESULT_OK) {
u8* trackVols = snd_song_get_track_volumes_set(trackVolSet);
if (trackVols != NULL) {
au_bgm_set_track_volumes(bgmPlayer, trackVols, FALSE);
} else {
status = AU_ERROR_11;
}
}
return status;
}
static u8* snd_song_get_track_volumes_set(MusicTrackVols trackVolSet) {
u8* trackVols = NULL;
switch (trackVolSet) {
case TRACK_VOLS_0:
trackVols = D_80078DB8;
break;
case TRACK_VOLS_1:
trackVols = D_80078DC4;
break;
case TRACK_VOLS_2:
trackVols = D_80078DCC;
break;
case TRACK_VOLS_3:
trackVols = D_80078DD0;
break;
case TRACK_VOLS_KPA_OUTSIDE:
trackVols = TrackVols_KPA_Outside;
break;
case TRACK_VOLS_KPA_1:
trackVols = TrackVols_KPA_1;
break;
case TRACK_VOLS_KPA_2:
trackVols = TrackVols_KPA_2;
break;
case TRACK_VOLS_KPA_3:
trackVols = TrackVols_KPA_3;
break;
}
return trackVols;
}
static const f32 padding[] = {0.0f};
static AuResult snd_song_change_track_volume(s32 songName, u32 trackIdx, u32 volume) {
BGMPlayer* bgmPlayer;
BGMHeader* bgmFile;
AuResult status;
status = snd_song_get_playing_info(songName, &bgmFile, &bgmPlayer);
if (status == AU_RESULT_OK) {
if (volume > 0x7F) {
volume = 0x7F;
}
if (trackIdx > 15) {
trackIdx = 15;
}
au_bgm_change_track_volume(bgmPlayer, trackIdx, 96, volume);
}
return status;
}
AuResult snd_song_set_track_vol_mute(s32 songName, s32 trackIdx) {
return snd_song_change_track_volume(songName, trackIdx, 0);
}
AuResult snd_song_set_track_vol_quiet(s32 songName, s32 trackIdx) {
return snd_song_change_track_volume(songName, trackIdx, 0x3F);
}
AuResult snd_song_set_track_vol_full(s32 songName, s32 trackIdx) {
return snd_song_change_track_volume(songName, trackIdx, 0x7F);
}
void bgm_set_proximity_mix_far(s32 songName, s32 mix) {
au_bgm_set_proximity_mix(songName, (u8)mix);
}
void bgm_set_proximity_mix_near(s32 songName, s32 mix) {
au_bgm_set_proximity_mix(songName, (u8)mix | 0x57000000);
}
void bgm_set_proximity_mix_full(s32 songName, s32 mix) {
au_bgm_set_proximity_mix(songName, (u8)mix | 0x7F000000);
}
void bgm_poll_music_events(MusicEventTrigger** musicEvents, s32* count) {
AuGlobals* globals = gSoundGlobals;
*musicEvents = globals->musicEventQueue;
*count = globals->musicEventQueueCount;
}
void bgm_flush_music_events(void) {
gSoundGlobals->flushMusicEventQueue = TRUE;
}
void bgm_trigger_music_event(s32 playerID, s32 trackIndex, s32 eventInfo) {
AuGlobals* globals = gSoundGlobals;
if (globals->musicEventQueueCount < 16) {
*globals->musicEventQueuePos++ = ((playerID << 0x1C) + ((trackIndex & 0xF) << 0x18) + eventInfo);
globals->musicEventQueueCount++;
}
}
void bgm_clear_music_events(void) {
AuGlobals* globals = gSoundGlobals;
s32* buf = globals->musicEventQueue;
s32 i = 15;
do {
*buf++ = 0;
} while(i-- != 0);
globals->musicEventQueueCount = 0;
globals->flushMusicEventQueue = FALSE;
globals->musicEventQueuePos = globals->musicEventQueue;
}
void au_register_callback(AuCallback func, s32 index) {
gSoundGlobals->audioThreadCallbacks[index] = func;
}
void audio_set_stereo(void) {
func_80056D5C(1);
func_80054DA8(0);
}
void audio_set_mono(void) {
func_80056D5C(0);
func_80054DA8(1);
}
void func_800561A4(s32 arg0) {
func_80054CE0(1, arg0);
}
void func_800561C4(s32 arg0) {
func_80054CE0(0x10, arg0);
}
void func_800561E4(s32 arg0) {
func_80054D74(0x10, arg0);
}
void func_80056204(void) {
func_8004BA54(gSoundManager, 0);
}
void func_80056228(void) {
func_8004BA54(gSoundManager, 1);
}

763
src/audio/31650.c Normal file
View File

@ -0,0 +1,763 @@
#include "common.h"
#include "audio.h"
#include "nu/nualsgi.h"
static s16 _getVol(s16 arg0, s32 arg1, s16 arg2, u16 arg3);
AuSynDriver* gActiveSynDriverPtr = NULL;
AuSynDriver* gSynDriverPtr = NULL;
u8 D_80078E58 = FALSE;
u16 D_80078E5A = 0x7FFF;
u8 D_80078E5C = FALSE;
extern s16 AuEqPower[128];
#define AU_EQPOW_MID_IDX 64
#define AU_EQPOW_MAX_IDX 127
void au_driver_init(AuSynDriver* driver, ALConfig* config) {
s32 i;
ALHeap* heap = config->heap;
if (gActiveSynDriverPtr != NULL) {
return;
}
driver->num_pvoice = config->num_pvoice;
driver->unk_num_gamma = config->unk_num_gamma;
driver->curSamples = 0;
driver->unk_04 = 0;
driver->outputRate = config->outputRate;
driver->dmaNew = config->dmaNew;
gActiveSynDriverPtr = driver;
gSynDriverPtr = driver;
D_80078E58 = FALSE;
D_80078E5A = 0x7FFF;
D_80078E5C = TRUE;
gSynDriverPtr->pvoices = alHeapAlloc(heap, config->num_pvoice, sizeof(*gSynDriverPtr->pvoices));
// this is inlined alN_PVoiceNew
for (i = 0; i < config->num_pvoice; i++) {
AuPVoice* voice = &gSynDriverPtr->pvoices[i];
voice->loadFilter.dc_state = alHeapAlloc(heap, 1, sizeof(*voice->loadFilter.dc_state));
voice->loadFilter.dc_lstate = alHeapAlloc(heap, 1, sizeof(*voice->loadFilter.dc_lstate));
// note: dmaNew has type ALDMANew (nuAuDmaNew), which returns a ALDMAproc (nuAuDmaCallBack)
voice->loadFilter.dc_dmaFunc = ((ALDMAproc (*)(NUDMAState**))(gSynDriverPtr->dmaNew))(&voice->loadFilter.dc_dmaState);
voice->loadFilter.dc_lastsam = 0;
voice->loadFilter.dc_first = 1;
voice->loadFilter.dc_memin = NULL;
voice->resampler.rs_state = alHeapAlloc(heap, 1, sizeof(*voice->resampler.rs_state));
voice->resampler.delta = 0;
voice->resampler.first = 1;
voice->resampler.rs_ratio = 1.0f;
voice->envMixer.em_state = alHeapAlloc(heap, 1, sizeof(*voice->envMixer.em_state));
voice->envMixer.em_first = 1;
voice->envMixer.em_motion = AL_STOPPED;
voice->envMixer.em_volume = 1;
voice->envMixer.em_ltgt = 1;
voice->envMixer.em_rtgt = 1;
voice->envMixer.em_cvolL = 1;
voice->envMixer.em_cvolR = 1;
voice->envMixer.em_dryamt = 0;
voice->envMixer.em_wetamt = 0;
voice->envMixer.em_lratm = 1;
voice->envMixer.em_lratl = 0;
voice->envMixer.em_rratm = 1;
voice->envMixer.em_rratl = 0;
voice->envMixer.em_delta = 0;
voice->envMixer.em_segEnd = 0;
voice->envMixer.em_pan = 64;
voice->unk_74 = 0;
voice->next = NULL;
voice->gammaID = 0;
voice->index = i;
}
gSynDriverPtr->al_unk_gamma = alHeapAlloc(heap, config->unk_num_gamma, sizeof(*gSynDriverPtr->al_unk_gamma));
for (i = 0; i < config->unk_num_gamma; i++) {
AlUnkGamma* gamma = &gSynDriverPtr->al_unk_gamma[i];
gamma->pvoice_10 = NULL;
gamma->pvoice_14 = NULL;
gamma->unk_00 = 0x7FFF;
gamma->currentEffectType = AU_FX_NONE;
gamma->fxL = alHeapAlloc(heap, 1, sizeof(*gamma->fxL));
gamma->fxR = alHeapAlloc(heap, 1, sizeof(*gamma->fxR));
func_80058E84(gamma->fxL, gamma->currentEffectType, heap);
func_80058E84(gamma->fxR, gamma->currentEffectType, heap);
}
gSynDriverPtr->unk_drvr_24 = alHeapAlloc(heap, 2 * AUDIO_SAMPLES, 2);
gSynDriverPtr->unk_drvr_28 = alHeapAlloc(heap, 2 * AUDIO_SAMPLES, 2);
D_800A3FEC = 0;
D_800A3FEE = 0;
D_800A3FF0 = 4;
D_800A3FE0 = alHeapAlloc(heap, 4 * AUDIO_SAMPLES, 2);
D_800A3FE4 = alHeapAlloc(heap, 4 * AUDIO_SAMPLES, 2);
for (i = 0; i < 4 * AUDIO_SAMPLES; i++) {
D_800A3FE4[i] = D_800A3FE0[i] = 0;
}
gSynDriverPtr->heap = heap;
}
void au_driver_release(void) {
if (gActiveSynDriverPtr != NULL) {
gActiveSynDriverPtr = NULL;
}
}
Acmd* alAudioFrame(Acmd* cmdList, s32* cmdLen, s16* outBuf, s32 outLen) {
Acmd* cmdListPos;
AuPVoice* pvoice;
AlUnkGamma* gamma;
s16* bufPos;
s16 auxOut;
s16 mainOut;
s32 i;
s32 var_s7 = FALSE;
cmdListPos = cmdList;
bufPos = outBuf;
if (gActiveSynDriverPtr == NULL) {
*cmdLen = 0;
} else {
au_update_players_main();
if (D_80078E5C) {
for (i = 0; i < gSynDriverPtr->num_pvoice; i++) {
pvoice = &gSynDriverPtr->pvoices[i];
if (pvoice->envMixer.em_motion == AL_PLAYING) {
func_80057874(i, pvoice->envMixer.em_pan);
}
}
D_80078E5C = FALSE;
}
while (outLen > 0) {
au_update_clients_2();
for (i = 0; i < gSynDriverPtr->num_pvoice; i++) {
pvoice = &gSynDriverPtr->pvoices[i];
if ((pvoice->gammaID != 0xFF) && (pvoice->gammaID < gSynDriverPtr->unk_num_gamma)) {
gamma = &gSynDriverPtr->al_unk_gamma[pvoice->gammaID];
if (gamma->pvoice_14 != NULL) {
gamma->pvoice_14->next = pvoice;
} else {
gamma->pvoice_10 = pvoice;
}
gamma->pvoice_14 = pvoice;
}
}
var_s7 = TRUE;
for (i = 0; i < gSynDriverPtr->unk_num_gamma; i++) {
gamma = &gSynDriverPtr->al_unk_gamma[i];
if (gamma->pvoice_10 != NULL) {
aClearBuffer(cmdListPos++, N_AL_MAIN_L_OUT, 8 * AUDIO_SAMPLES);
if (gamma->pvoice_10 != NULL) {
AuPVoice* next;
do {
cmdListPos = func_80058050(gamma->pvoice_10, cmdListPos);
next = gamma->pvoice_10->next;
gamma->pvoice_10->next = NULL;
gamma->pvoice_10 = next;
} while (next != NULL);
gamma->pvoice_14 = 0;
}
if (gamma->currentEffectType != AU_FX_NONE) {
cmdListPos = func_80059310(gamma->fxL, cmdListPos, N_AL_AUX_L_OUT, 0);
cmdListPos = func_80059310(gamma->fxR, cmdListPos, N_AL_AUX_R_OUT, 0);
}
if (i == D_800A3FEC) {
mainOut = -1;
switch (D_800A3FEE) {
case 1:
mainOut = N_AL_MAIN_L_OUT;
auxOut = N_AL_AUX_L_OUT;
break;
case 2:
mainOut = N_AL_MAIN_R_OUT;
auxOut = N_AL_AUX_R_OUT;
break;
}
if (mainOut != -1) {
aSaveBufferSize(cmdListPos++, 2 * AUDIO_SAMPLES, mainOut, osVirtualToPhysical(D_800A3FE0 + (D_800A3FE8 % D_800A3FF0) * AUDIO_SAMPLES));
aLoadBufferSize(cmdListPos++, 2 * AUDIO_SAMPLES, mainOut, osVirtualToPhysical(D_800A3FE0 + ((D_800A3FE8 + 1) % D_800A3FF0) * AUDIO_SAMPLES));
aSaveBufferSize(cmdListPos++, 2 * AUDIO_SAMPLES, auxOut, osVirtualToPhysical(D_800A3FE4 + (D_800A3FE8 % D_800A3FF0) * AUDIO_SAMPLES));
aLoadBufferSize(cmdListPos++, 2 * AUDIO_SAMPLES, auxOut, osVirtualToPhysical(D_800A3FE4 + ((D_800A3FE8 + 1) % D_800A3FF0) * AUDIO_SAMPLES));
}
}
if (var_s7) {
aClearBuffer(cmdListPos++, 0, 4 * AUDIO_SAMPLES);
} else {
aLoadBufferSize(cmdListPos++, 4 * AUDIO_SAMPLES, 0, osVirtualToPhysical(gSynDriverPtr->unk_drvr_28));
}
aMix(cmdListPos++, 0, gamma->unk_00, N_AL_AUX_L_OUT, 0);
aMix(cmdListPos++, 0, gamma->unk_00, N_AL_AUX_R_OUT, 2 * AUDIO_SAMPLES);
aSaveBufferSize(cmdListPos++, 4 * AUDIO_SAMPLES, 0, osVirtualToPhysical(gSynDriverPtr->unk_drvr_28));
if (var_s7) {
aClearBuffer(cmdListPos++, 0, 4 * AUDIO_SAMPLES);
var_s7 = FALSE;
} else {
aLoadBufferSize(cmdListPos++, 4 * AUDIO_SAMPLES, 0, osVirtualToPhysical(gSynDriverPtr->unk_drvr_24));
}
aMix(cmdListPos++, 0, gamma->unk_00, N_AL_MAIN_L_OUT, 0);
aMix(cmdListPos++, 0, gamma->unk_00, N_AL_MAIN_R_OUT, 2 * AUDIO_SAMPLES);
aSaveBufferSize(cmdListPos++, 4 * AUDIO_SAMPLES, 0, osVirtualToPhysical(gSynDriverPtr->unk_drvr_24));
}
}
aDMEMMove(cmdListPos++, 0, N_AL_MAIN_L_OUT, 4 * AUDIO_SAMPLES);
aLoadBufferSize(cmdListPos++, 4 * AUDIO_SAMPLES, N_AL_AUX_L_OUT, osVirtualToPhysical(gSynDriverPtr->unk_drvr_28));
aMix(cmdListPos++, 0, 0x7FFF, N_AL_AUX_L_OUT, N_AL_MAIN_L_OUT);
aMix(cmdListPos++, 0, 0x7FFF, N_AL_AUX_R_OUT, N_AL_MAIN_R_OUT);
if (D_80078E58) {
u16 temp;
aDMEMMove(cmdListPos++, N_AL_MAIN_L_OUT, 0, 4 * AUDIO_SAMPLES);
aClearBuffer(cmdListPos++, N_AL_MAIN_L_OUT, 4 * AUDIO_SAMPLES);
temp = D_80078E5A;
aMix(cmdListPos++, 0, temp, 0, N_AL_MAIN_L_OUT);
aMix(cmdListPos++, 0, temp, 2 * AUDIO_SAMPLES, N_AL_MAIN_R_OUT);
}
outLen -= AUDIO_SAMPLES;
aInterleavePart(cmdListPos++);
aSaveBufferSize(cmdListPos++, 4 * AUDIO_SAMPLES, 0, bufPos);
bufPos += 2 * AUDIO_SAMPLES;
D_800A3FE8++;
gSynDriverPtr->curSamples += AUDIO_SAMPLES;
}
*cmdLen = (cmdListPos - cmdList);
}
return cmdListPos;
}
void func_80056D34(void) {
D_80078E58 = TRUE;
}
void func_80056D44(s16 arg0) {
D_80078E5A = arg0;
}
s16 func_80056D50(void) {
return D_80078E5A;
}
void func_80056D5C(u8 bStereoSound) {
AuSynUseStereo = bStereoSound;
D_80078E5C = TRUE;
}
void func_80056D78(u8 index, u16 arg1) {
AlUnkGamma* gamma = &gSynDriverPtr->al_unk_gamma[index];
gamma->unk_00 = arg1 & 0x7FFF;
}
u16 func_80056DA4(u8 index, u16 arg1) {
AlUnkGamma* gamma = &gSynDriverPtr->al_unk_gamma[index];
return gamma->unk_00;
}
void func_80056DCC(u8 index, u8 effectType) {
AlUnkGamma* gamma = &gSynDriverPtr->al_unk_gamma[index];
gamma->currentEffectType = effectType;
func_8005904C(gamma->fxL, effectType);
func_8005904C(gamma->fxR, effectType);
}
void func_80056E34(u8 index, s16 delayIndex, s16 paramID, s32 value) {
AlUnkGamma* gamma = &gSynDriverPtr->al_unk_gamma[index];
au_fx_param_hdl(gamma->fxL, delayIndex, paramID, value);
au_fx_param_hdl(gamma->fxR, delayIndex, paramID, value);
}
void func_80056EC0(u8 index, s8 arg1) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[index];
pvoice->gammaID = arg1;
}
// n_alLoadParam case AL_FILTER_RESET
void au_pvoice_reset_filter(u8 voiceIdx) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
AuLoadFilter* filter = &pvoice->loadFilter;
pvoice->envMixer.em_motion = AL_STOPPED;
pvoice->envMixer.em_first = 1;
pvoice->envMixer.em_volume = 1;
pvoice->resampler.delta = 0;
pvoice->resampler.first = 1;
filter->dc_lastsam = 0;
filter->dc_first = 1;
filter->dc_sample = 0;
if (filter->instrument != NULL) {
filter->dc_memin = filter->instrument->base;
if (filter->instrument->type == 0) {
if (filter->instrument->loopEnd != 0){
filter->dc_loop.count = filter->instrument->loopCount;
}
} else if (filter->instrument->type == 1) {
if (filter->instrument->loopEnd != 0){
filter->dc_loop.count = filter->instrument->loopCount;
}
}
}
}
// n_alEnvmixerParam case AL_FILTER_START
void au_pvoice_set_playing(u8 index) {
AuPVoice* pvoice = (AuPVoice*)&gSynDriverPtr->pvoices[index];
pvoice->envMixer.em_motion = AL_PLAYING;
}
#define ADPCMFBYTES 9
// n_alLoadParam case AL_FILTER_SET_WAVETABLE
void au_pvoice_set_filter(u8 index, u8 reverbType, Instrument* instrument, f32 pitchRatio, s16 arg4, u8 pan, u8 reverb, s32 arg7) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[index];
AuLoadFilter* filter = &pvoice->loadFilter;
AuEnvMixer* envMixer = &pvoice->envMixer;
AuResampler* resampler = &pvoice->resampler;
pvoice->gammaID = reverbType;
filter->instrument = instrument;
pvoice->loadFilter.dc_memin = filter->instrument->base;
pvoice->loadFilter.dc_sample = 0;
switch (filter->instrument->type) {
case AL_ADPCM_WAVE:
filter->instrument->wavDataLength = (filter->instrument->wavDataLength / ADPCMFBYTES) * ADPCMFBYTES;
pvoice->loadFilter.dc_bookSize = filter->instrument->dc_bookSize;
if (filter->instrument->loopEnd == 0) {
filter->dc_loop.count = 0;
filter->dc_loop.end = 0;
filter->dc_loop.start = 0;
} else {
filter->dc_loop.start = filter->instrument->loopStart;
filter->dc_loop.end = filter->instrument->loopEnd;
filter->dc_loop.count = filter->instrument->loopCount;
alCopy(filter->instrument->loopPredictor, filter->dc_lstate, sizeof(ADPCM_STATE));
}
break;
case AL_RAW16_WAVE:
if (filter->instrument->loopEnd != 0) {
filter->dc_loop.start = filter->instrument->loopStart;
filter->dc_loop.end = filter->instrument->loopEnd;
filter->dc_loop.count = filter->instrument->loopCount;
} else {
filter->dc_loop.count = 0;
filter->dc_loop.end = 0;
filter->dc_loop.start = 0;
}
break;
}
envMixer->em_motion = AL_PLAYING;
envMixer->em_first = 1;
envMixer->em_delta = 0;
envMixer->em_segEnd = arg7;
envMixer->em_pan = pan;
envMixer->em_volume = SQ(arg4) >> 0xF;
envMixer->em_dryamt = AuEqPower[reverb];
envMixer->em_wetamt = AuEqPower[AU_EQPOW_MAX_IDX - reverb];
if (envMixer->em_segEnd != 0) {
envMixer->em_cvolL = 1;
envMixer->em_cvolR = 1;
} else {
if (!AuSynUseStereo) {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
} else {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[envMixer->em_pan]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MAX_IDX - envMixer->em_pan]) >> 0xF;
}
}
resampler->rs_ratio = pitchRatio;
}
void au_pvoice_set_filter_wavetable(u8 voiceIdx, Instrument* instrument) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
AuLoadFilter* filter = &pvoice->loadFilter;
pvoice->loadFilter.instrument = instrument;
pvoice->loadFilter.dc_memin = filter->instrument->base;
pvoice->loadFilter.dc_sample = 0;
switch (filter->instrument->type) {
case AL_ADPCM_WAVE:
filter->instrument->wavDataLength = (filter->instrument->wavDataLength / ADPCMFBYTES) * ADPCMFBYTES;
pvoice->loadFilter.dc_bookSize = filter->instrument->dc_bookSize;
if (filter->instrument->loopEnd == 0) {
pvoice->loadFilter.dc_loop.count = 0;
pvoice->loadFilter.dc_loop.end = 0;
pvoice->loadFilter.dc_loop.start = 0;
} else {
pvoice->loadFilter.dc_loop.start = filter->instrument->loopStart;
pvoice->loadFilter.dc_loop.end = filter->instrument->loopEnd;
pvoice->loadFilter.dc_loop.count = filter->instrument->loopCount;
alCopy(filter->instrument->loopPredictor, pvoice->loadFilter.dc_lstate, sizeof(ADPCM_STATE));
}
break;
case AL_RAW16_WAVE:
if (filter->instrument->loopEnd != 0) {
pvoice->loadFilter.dc_loop.start = filter->instrument->loopStart;
pvoice->loadFilter.dc_loop.end = filter->instrument->loopEnd;
pvoice->loadFilter.dc_loop.count = filter->instrument->loopCount;
} else {
pvoice->loadFilter.dc_loop.count = 0;
pvoice->loadFilter.dc_loop.end = 0;
pvoice->loadFilter.dc_loop.start = 0;
}
break;
}
}
void au_pvoice_set_pitch_ratio(u8 voiceIdx, f32 pitchRatio) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
pvoice->resampler.rs_ratio = pitchRatio;
}
void func_8005736C(u8 voiceIdx, s16 volume, s32 arg2, u8 pan, u8 arg4) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
AuEnvMixer* envMixer = &pvoice->envMixer;
if (envMixer->em_delta >= envMixer->em_segEnd) {
envMixer->em_delta = envMixer->em_segEnd;
if (!AuSynUseStereo) {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
} else {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[envMixer->em_pan]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MAX_IDX - envMixer->em_pan]) >> 0xF;
}
} else {
envMixer->em_cvolL = _getVol(envMixer->em_cvolL, envMixer->em_delta, envMixer->em_lratm, envMixer->em_lratl);
envMixer->em_cvolR = _getVol(envMixer->em_cvolR, envMixer->em_delta, envMixer->em_rratm, envMixer->em_rratl);
}
if (envMixer->em_cvolL == 0) {
envMixer->em_cvolL = 1;
}
if (envMixer->em_cvolR == 0) {
envMixer->em_cvolR = 1;
}
envMixer->em_delta = 0;
envMixer->em_segEnd = arg2;
envMixer->em_pan = pan;
envMixer->em_volume = SQ(volume) >> 0xF;
envMixer->em_dryamt = AuEqPower[arg4];
envMixer->em_wetamt = AuEqPower[AU_EQPOW_MAX_IDX - arg4];
envMixer->em_first = 1;
}
void func_80057548(u8 voiceIdx, u8 pan, u8 arg2) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
AuEnvMixer* envMixer = &pvoice->envMixer;
if (envMixer->em_delta >= envMixer->em_segEnd) {
envMixer->em_delta = envMixer->em_segEnd;
if (!AuSynUseStereo) {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
} else {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[envMixer->em_pan]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MAX_IDX - envMixer->em_pan]) >> 0xF;
}
} else {
envMixer->em_cvolL = _getVol(envMixer->em_cvolL, envMixer->em_delta, envMixer->em_lratm, envMixer->em_lratl);
envMixer->em_cvolR = _getVol(envMixer->em_cvolR, envMixer->em_delta, envMixer->em_rratm, envMixer->em_rratl);
}
if (envMixer->em_cvolL == 0) {
envMixer->em_cvolL = 1;
}
if (envMixer->em_cvolR == 0) {
envMixer->em_cvolR = 1;
}
envMixer->em_pan = pan;
envMixer->em_dryamt = AuEqPower[arg2];
envMixer->em_wetamt = AuEqPower[AU_EQPOW_MAX_IDX - arg2];
envMixer->em_first = 1;
}
void func_800576EC(u8 voiceIdx, s16 arg1, s32 arg2) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
AuEnvMixer* envMixer = &pvoice->envMixer;
if (envMixer->em_delta >= envMixer->em_segEnd) {
envMixer->em_delta = envMixer->em_segEnd;
if (!AuSynUseStereo) {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
} else {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[envMixer->em_pan]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MAX_IDX - envMixer->em_pan]) >> 0xF;
}
} else {
envMixer->em_cvolL = _getVol(envMixer->em_cvolL, envMixer->em_delta, envMixer->em_lratm, envMixer->em_lratl);
envMixer->em_cvolR = _getVol(envMixer->em_cvolR, envMixer->em_delta, envMixer->em_rratm, envMixer->em_rratl);
}
if (envMixer->em_cvolL == 0) {
envMixer->em_cvolL = 1;
}
if (envMixer->em_cvolR == 0) {
envMixer->em_cvolR = 1;
}
envMixer->em_volume = SQ(arg1) >> 0xF;
envMixer->em_delta = 0;
envMixer->em_segEnd = arg2;
envMixer->em_first = 1;
}
void func_80057874(u8 voiceIdx, u8 pan) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
AuEnvMixer* envMixer = &pvoice->envMixer;
if (envMixer->em_delta >= envMixer->em_segEnd) {
envMixer->em_delta = envMixer->em_segEnd;
if (!AuSynUseStereo) {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
} else {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[envMixer->em_pan]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MAX_IDX - envMixer->em_pan]) >> 0xF;
}
} else {
envMixer->em_cvolL = _getVol(envMixer->em_cvolL, envMixer->em_delta, envMixer->em_lratm, envMixer->em_lratl);
envMixer->em_cvolR = _getVol(envMixer->em_cvolR, envMixer->em_delta, envMixer->em_rratm, envMixer->em_rratl);
}
if (envMixer->em_cvolL == 0) {
envMixer->em_cvolL = 1;
}
if (envMixer->em_cvolR == 0) {
envMixer->em_cvolR = 1;
}
envMixer->em_pan = pan;
envMixer->em_first = 1;
}
void func_800579D8(u8 voiceIdx, u8 dryAmt) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
AuEnvMixer* envMixer = &pvoice->envMixer;
if (envMixer->em_delta >= envMixer->em_segEnd) {
envMixer->em_delta = envMixer->em_segEnd;
if (!AuSynUseStereo) {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MID_IDX]) >> 0xF;
} else {
envMixer->em_cvolL = (envMixer->em_volume * AuEqPower[envMixer->em_pan]) >> 0xF;
envMixer->em_cvolR = (envMixer->em_volume * AuEqPower[AU_EQPOW_MAX_IDX - envMixer->em_pan]) >> 0xF;
}
} else {
envMixer->em_cvolL = _getVol(envMixer->em_cvolL, envMixer->em_delta, envMixer->em_lratm, envMixer->em_lratl);
envMixer->em_cvolR = _getVol(envMixer->em_cvolR, envMixer->em_delta, envMixer->em_rratm, envMixer->em_rratl);
}
if (envMixer->em_cvolL == 0) {
envMixer->em_cvolL = 1;
}
if (envMixer->em_cvolR == 0) {
envMixer->em_cvolR = 1;
}
envMixer->em_dryamt = AuEqPower[dryAmt];
envMixer->em_wetamt = AuEqPower[AU_EQPOW_MAX_IDX - dryAmt];
envMixer->em_first = 1;
}
s32 func_80057B64(u8 voiceIdx) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
return pvoice->envMixer.em_motion;
}
s32 func_80057B8C(u8 voiceIdx) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
return pvoice->gammaID;
}
f32 func_80057BB4(u8 voiceIdx) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
return pvoice->resampler.rs_ratio;
}
u8 func_80057BDC(u8 voiceIdx) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
return pvoice->envMixer.em_pan;
}
s16 func_80057C04(u8 voiceIdx) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
return pvoice->envMixer.em_dryamt;
}
s16 func_80057C2C(u8 voiceIdx) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
return pvoice->envMixer.em_wetamt;
}
s32 func_80057C54(u8 voiceIdx) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
AuEnvMixer* sub48 = &pvoice->envMixer;
u32 retVal;
if (sub48->em_delta >= sub48->em_segEnd) {
if (!AuSynUseStereo) {
retVal = (sub48->em_volume * AuEqPower[AU_EQPOW_MID_IDX] * 2) >> 0x10;
} else {
retVal = (sub48->em_volume * AuEqPower[sub48->em_pan] * 2) >> 0x10;
}
} else {
retVal = _getVol(sub48->em_cvolL, sub48->em_delta, sub48->em_lratm, sub48->em_lratl);
}
return retVal;
}
s32 func_80057D0C(u8 voiceIdx) {
AuPVoice* pvoice = &gSynDriverPtr->pvoices[voiceIdx];
AuEnvMixer* sub48 = &pvoice->envMixer;
u32 retVal;
if (sub48->em_delta >= sub48->em_segEnd) {
if (!AuSynUseStereo) {
retVal = (sub48->em_volume * AuEqPower[AU_EQPOW_MID_IDX] * 2) >> 0x10;
} else {
retVal = (sub48->em_volume * AuEqPower[AU_EQPOW_MAX_IDX - sub48->em_pan] * 2) >> 0x10;
}
} else {
retVal = _getVol(sub48->em_cvolL, sub48->em_delta, sub48->em_lratm, sub48->em_lratl);
}
return retVal;
}
void func_80057DC8(s32 arg0) {
if (arg0 < 2) {
D_800A3FF0 = 0;
D_800A3FEE = 0;
}
D_800A3FF0 = arg0;
if (arg0 >= 5) {
D_800A3FF0 = 4;
}
}
void func_80057E08(u8 arg0) {
s32* phi_a1 = (s32*)D_800A3FE0;
s32* phi_v1 = (s32*)D_800A3FE4;
s32 i;
for (i = 0; i < 2 * AUDIO_SAMPLES; i++) {
*phi_a1++ = 0;
*phi_v1++ = 0;
}
D_800A3FEC = arg0;
D_800A3FEE = 1;
D_800A3FE8 = 0;
}
void func_80057E5C(u8 arg0) {
s32* phi_a1 = (s32*)D_800A3FE0;
s32* phi_v1 = (s32*)D_800A3FE4;
s32 i;
for (i = 0; i < 2 * AUDIO_SAMPLES; i++) {
*phi_a1++ = 0;
*phi_v1++ = 0;
}
D_800A3FEC = arg0;
D_800A3FEE = 2;
D_800A3FE8 = 0;
}
void func_80057EB0(void) {
D_800A3FEC = 0;
D_800A3FEE = 0;
D_800A3FE8 = 0;
}
void func_80057ED0(s16 arg0) {
s32* phi_a1 = (s32*)D_800A3FE0;
s32* phi_v1 = (s32*)D_800A3FE4;
s32 i;
for (i = 0; i < 2 * AUDIO_SAMPLES; i++) {
*phi_a1++ = 0;
*phi_v1++ = 0;
}
D_800A3FEC = 0;
D_800A3FEE = arg0;
D_800A3FE8 = 0;
}
void alHeapInit(ALHeap* hp, u8* base, s32 len) {
u32 i;
s32 alignBytes = 0x10 - ((s32)base & 0xF);
if (alignBytes != 0x10) {
hp->base = base + alignBytes;
} else {
hp->base = base;
}
hp->len = len;
hp->count = 0;
hp->cur = hp->base;
for (i = 0; i < (u32)(hp->len) >> 2; i++) {
((u32*)hp->base)[i] = 0;
}
}
void* alHeapAlloc(ALHeap* heap, s32 count, s32 size) {
void* ret = NULL;
u8* newCur = &heap->cur[ALIGN16(count * size)];
if (&heap->base[heap->len] >= newCur) {
ret = heap->cur;
heap->cur = newCur;
}
return ret;
}
void alCopy(void* src, void* dst, s32 size) {
s32 i;
u8* srcIt = src;
u8* dstIt = dst;
for (i = 0; i < size; i++) {
*dstIt++ = *srcIt++;
}
}
static s16 _getVol(s16 ivol, s32 samples, s16 ratem, u16 ratel) {
s32 tmpl;
samples = samples >> 3;
if (samples == 0) {
return ivol;
}
tmpl = ratel * samples;
tmpl = tmpl >> 16;
tmpl += ratem * samples;
return ivol + tmpl;
}

92
src/audio/33450.c Normal file
View File

@ -0,0 +1,92 @@
#include "common.h"
#include "audio.h"
// values for cosine from 0 to pi/2 multiplied by 32767
// called n_eqpower in libultra
s16 AuEqPower[128] = {
32767, 32764, 32757, 32744, 32727, 32704, 32677, 32644,
32607, 32564, 32517, 32464, 32407, 32344, 32277, 32205,
32127, 32045, 31958, 31866, 31770, 31668, 31561, 31450,
31334, 31213, 31087, 30957, 30822, 30682, 30537, 30388,
30234, 30075, 29912, 29744, 29572, 29395, 29214, 29028,
28838, 28643, 28444, 28241, 28033, 27821, 27605, 27385,
27160, 26931, 26698, 26461, 26220, 25975, 25726, 25473,
25216, 24956, 24691, 24423, 24151, 23875, 23596, 23313,
23026, 22736, 22442, 22145, 21845, 21541, 21234, 20924,
20610, 20294, 19974, 19651, 19325, 18997, 18665, 18331,
17993, 17653, 17310, 16965, 16617, 16266, 15913, 15558,
15200, 14840, 14477, 14113, 13746, 13377, 13006, 12633,
12258, 11881, 11503, 11122, 10740, 10357, 9971, 9584,
9196, 8806, 8415, 8023, 7630, 7235, 6839, 6442,
6044, 5646, 5246, 4845, 4444, 4042, 3640, 3237,
2833, 2429, 2025, 1620, 1216, 810, 405, 0
};
static Acmd* _decodeChunk(Acmd* cmdBufPos, AuLoadFilter* arg1, s32 count, s32 size, s16 arg4, s16 arg5, s32 flags);
static s16 _getRate(f64 arg0, f64 arg1, s32 arg4, u16* arg5);
// au_pull_voice -- based on n_alAdpcmPull
INCLUDE_ASM(s32, "audio/33450", func_80058050);
static Acmd* _decodeChunk(Acmd* cmdBufPos, AuLoadFilter* filter, s32 tsam, s32 nbytes, s16 output, s16 input, s32 flags) {
s32 endAddr;
s32 endAlign;
s32 paddedSize;
if (nbytes > 0) {
endAddr = filter->dc_dmaFunc(filter->dc_memin, nbytes, filter->dc_dmaState, filter->instrument->unk_25); // ALDMAproc has an extra arg added
endAlign = endAddr & 7;
nbytes += endAlign;
paddedSize = nbytes + 8 - (nbytes & 7);
n_aLoadBuffer(cmdBufPos++, paddedSize, input, endAddr - endAlign);
} else {
endAlign = 0;
}
if (flags & A_LOOP) {
aSetLoop(cmdBufPos++, K0_TO_PHYS(filter->dc_lstate));
}
n_aADPCMdec(cmdBufPos++, filter->dc_state, flags, tsam << 1, endAlign, output);
filter->dc_first = 0;
return cmdBufPos;
}
static s16 _getRate(f64 vol, f64 tgt, s32 count, u16* ratel) {
f64 inv;
f64 a;
f64 b;
s16 c_int;
s16 a_int;
s16 b_int;
if (count == 0) {
if (tgt >= vol) {
*ratel = 0xFFFF;
return 0x7FFF;
} else {
*ratel = 0;
return 0;
}
}
inv = (1.0 / count);
if (tgt < 1.0) {
tgt = 1.0;
}
if (vol <= 0.0) {
vol = 1.0;
}
a = (tgt - vol) * inv * 8.0;
a_int = a;
c_int = (a_int - 1);
b = (a - a_int) + 1.0;
b_int = b;
c_int += b_int;
*ratel = (b - b_int) * 0xFFFF;
return c_int;
}

89
src/audio/ambience.c Normal file
View File

@ -0,0 +1,89 @@
#include "common.h"
//#include "audio/public.h"
typedef struct {
/* 0x0 */ s16 flags;
/* 0x2 */ s16 fadeState;
/* 0x4 */ s32 fadeTime;
/* 0x8 */ s32 soundID;
/* 0xC */ s32 unkC;
} AmbientSoundSettings;
typedef enum AmbientSoundState {
AMBIENT_SOUND_IDLE = 0,
AMBIENT_SOUND_FADE_OUT = 1, // fade out old sounds
AMBIENT_SOUND_FADE_IN = 2 // fade in new sounds
} AmbientSoundState;
AmbientSoundSettings DefaultAmbientSoundData = {
.flags = 0,
.fadeState = 0,
.fadeTime = 0,
.soundID = -1,
.unkC = -1
};
extern AmbientSoundSettings AmbientSoundData;
void reset_ambient_sounds(void) {
AmbientSoundData = DefaultAmbientSoundData;
}
void update_ambient_sounds(void) {
AmbientSoundSettings* ambientSoundState = &AmbientSoundData;
s32 error;
switch (ambientSoundState->fadeState) {
case AMBIENT_SOUND_IDLE:
break;
case AMBIENT_SOUND_FADE_OUT:
if (ambientSoundState->flags & 1) {
if (ambientSoundState->fadeTime < 250) {
error = snd_ambient_quick_fade_out(0);
} else {
error = snd_ambient_slow_fade_out(0, ambientSoundState->fadeTime);
}
if (error != AU_RESULT_OK) {
return;
}
}
ambientSoundState->fadeState = AMBIENT_SOUND_FADE_IN;
break;
case AMBIENT_SOUND_FADE_IN:
if (ambientSoundState->flags & 1) {
if (snd_ambient_800555E4(0) != AU_RESULT_OK) {
return;
}
ambientSoundState->flags &= ~1;
}
if (ambientSoundState->soundID < 0) {
ambientSoundState->fadeState = AMBIENT_SOUND_IDLE;
} else if (snd_ambient_80055448(ambientSoundState->soundID) == AU_RESULT_OK) {
if (snd_ambient_80055464(0, 0) == AU_RESULT_OK) {
ambientSoundState->fadeState = AMBIENT_SOUND_IDLE;
ambientSoundState->flags |= 1;
}
}
break;
}
}
s32 play_ambient_sounds(s32 soundID, s32 fadeTime) {
AmbientSoundSettings* state = &AmbientSoundData;
if (!gGameStatusPtr->musicEnabled) {
snd_ambient_quick_fade_out(state->soundID);
state->flags &= ~1;
return 1;
}
if (state->soundID == soundID) {
return 2;
}
state->soundID = soundID;
state->fadeTime = fadeTime;
state->fadeState = AMBIENT_SOUND_FADE_OUT;
return 1;
}

432
src/audio/e0b30_len_b80.c Normal file
View File

@ -0,0 +1,432 @@
#include "common.h"
#include "npc.h"
void bgm_update_volume(void);
void bgm_set_target_volume(s16 volume);
// these are BSS
extern s16 MusicDefaultVolume;
extern s16 MusicMaxVolume;
extern s16 MusicCurrentVolume;
extern s16 MusicTargetVolume;
MusicSettings BlankMusicSettings = {
.flags = 0,
.state = 0,
.fadeOutTime = -1,
.fadeInTime = 0,
.fadeStartVolume = 0,
.fadeEndVolume = 0,
.songID = -1,
.variation = -1,
.songName = -1,
.battleSongID = 0,
.battleVariation = 0,
.savedSongID = 0,
.savedVariation = 0,
.savedSongName = 0
};
/// Lists the songs that are forced to use the variation determined by `map.songVariation & 1`.
/// @see bgm_get_map_default_variation
s32 SongsUsingVariationFlag[] = {
SONG_SPECIAL_BATTLE,
SONG_TUBBA_BLUBBA_BATTLE,
SONG_JR_TROOPA_BATTLE,
SONG_YOSHI_KIDS_FOUND,
SONG_ITEM_UPGRADE,
SONG_NEW_PARTNER,
};
s16 NextVolumeUpdateTimer = 0;
/// If the given song ID is present in SongsUsingVariationFlag, returns the current
/// map's `songVariation & 1` value. Otherwise, returns -1.
///
/// @see SongsUsingVariationFlag
/// @returns -1: no override; 0: override to variation 0; 1 override to variation 1
s32 bgm_get_map_default_variation(s32 songID) {
u32 i;
for (i = 0; i < ARRAY_COUNT(SongsUsingVariationFlag); i++) {
if (SongsUsingVariationFlag[i] == songID) {
Map* map = &gAreas[gGameStatusPtr->areaID].maps[gGameStatusPtr->mapID];
return map->unk_1C.bytes.songVariation & 1;
}
}
return -1;
}
void bgm_reset_sequence_players(void) {
s32 i;
for (i = 0; i < 2; i++) {
gMusicSettings[i] = BlankMusicSettings;
}
MusicTargetVolume = 8;
MusicMaxVolume = 8;
MusicCurrentVolume = 8;
func_800561A4(8);
}
void bgm_reset_volume(void) {
MusicTargetVolume = 8;
MusicMaxVolume = 8;
}
//TODO refactor out constants
void bgm_update_music_settings(void) {
MusicSettings* music = gMusicSettings;
s32 i = 0;
s16 state2 = 2;
s16 flag4 = MUSIC_SETTINGS_FLAGS_4;
s32 flags;
for (i; i < 2; i++, music++) {
switch (music->state) {
case 0:
break;
case 1:
if (music->flags & MUSIC_SETTINGS_FLAGS_1) {
if (music->fadeOutTime < 250) {
if (!(music->flags & MUSIC_SETTINGS_FLAGS_4)) {
if (au_song_stop(music->songName) == AU_RESULT_OK) {
music->state = state2;
}
} else {
if (func_80055AF0(music->songName) == AU_RESULT_OK) {
music->state = state2;
}
}
} else if (!(music->flags & MUSIC_SETTINGS_FLAGS_4)) {
if (snd_set_song_variation_fade_time(music->songName, music->fadeOutTime, 0) == 0) {
music->state = state2;
}
} else {
if (func_80055BB8(music->songName, 250) == AU_RESULT_OK) {
music->state = state2;
}
}
} else {
if (music->flags & MUSIC_SETTINGS_FLAGS_4) {
music->flags |= MUSIC_SETTINGS_FLAGS_10;
}
music->flags &= ~flag4;
music->state = 5;
}
break;
case 2:
flags = music->flags;
music->flags &= ~flag4;
if (flags & 1) {
if (au_song_is_playing(music->songName) == AU_RESULT_OK) {
music->flags &= ~MUSIC_SETTINGS_FLAGS_1;
music->state = 3;
}
} else {
music->state = 5;
}
break;
case 3:
music->state = 4;
break;
case 4:
music->state = 5;
break;
case 5:
if (!(music->flags & MUSIC_SETTINGS_FLAGS_8)) {
if (music->songID < 0) {
music->state = 0;
} else {
music->songName = au_song_load(music->songID, i);
if (music->songName > 0xFFFFU) {
if ((music->flags & MUSIC_SETTINGS_FLAGS_20)) {
snd_set_song_variation_fade(music->songName, music->variation,
music->fadeInTime, music->fadeStartVolume, music->fadeEndVolume);
music->flags &= ~MUSIC_SETTINGS_FLAGS_20;
} else {
bgm_set_target_volume(MusicDefaultVolume);
}
if (au_song_start_variation(music->songName, music->variation) == 0) {
music->flags |= MUSIC_SETTINGS_FLAGS_1;
music->state = 0;
}
}
}
} else {
if (music->flags & MUSIC_SETTINGS_FLAGS_10) {
music->state = 0;
music->flags &= ~(MUSIC_SETTINGS_FLAGS_10 | MUSIC_SETTINGS_FLAGS_8);
} else if (func_80055B28(music->savedSongName) == 0) {
music->songID = music->savedSongID;
music->variation = music->savedVariation;
music->songName = music->savedSongName;
music->state = 0;
music->flags |= MUSIC_SETTINGS_FLAGS_1;
music->flags &= ~MUSIC_SETTINGS_FLAGS_8;
}
}
break;
}
}
bgm_update_volume();
}
static const f32 padding = 0.0f;
s32 _bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s16 volume) {
MusicSettings* musicSetting;
s32 mapSongVariation;
if (gGameStatusPtr->demoState != 0) {
return 1;
}
musicSetting = &gMusicSettings[playerIndex];
if (!gGameStatusPtr->musicEnabled) {
au_song_stop(musicSetting->songName);
musicSetting->flags &= ~MUSIC_SETTINGS_FLAGS_1;
return 1;
}
mapSongVariation = bgm_get_map_default_variation(songID);
if (mapSongVariation >= 0) {
variation = mapSongVariation;
}
if (musicSetting->songID == songID && musicSetting->variation == variation) {
bgm_set_target_volume(volume);
if (musicSetting->flags & MUSIC_SETTINGS_FLAGS_4) {
func_80055B80(musicSetting->songName);
musicSetting->flags &= ~MUSIC_SETTINGS_FLAGS_4;
}
return 2;
}
MusicDefaultVolume = volume;
musicSetting->songID = songID;
musicSetting->variation = variation;
musicSetting->fadeOutTime = fadeOutTime;
musicSetting->state = 1;
musicSetting->flags &= ~MUSIC_SETTINGS_FLAGS_2;
return 1;
}
s32 bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s16 volume) {
gMusicSettings[playerIndex].flags &= ~MUSIC_SETTINGS_FLAGS_8;
return _bgm_set_song(playerIndex, songID, variation, fadeOutTime, volume);
}
s32 func_8014A964(s32 playerIndex, s32 songID, s32 variation, s32 fadeInTime, s16 fadeStartVolume, s16 fadeEndVolume) {
MusicSettings* musicSetting;
s32 mapSongVariation;
if (gGameStatusPtr->demoState) {
return 1;
}
musicSetting = &gMusicSettings[playerIndex];
if (!gGameStatusPtr->musicEnabled) {
au_song_stop(musicSetting->songName);
musicSetting->flags &= ~MUSIC_SETTINGS_FLAGS_1;
return 1;
}
mapSongVariation = bgm_get_map_default_variation(songID);
if (mapSongVariation >= 0) {
variation = mapSongVariation;
}
musicSetting->fadeInTime = fadeInTime;
musicSetting->fadeStartVolume = fadeStartVolume;
musicSetting->fadeEndVolume = fadeEndVolume;
musicSetting->songID = songID;
musicSetting->variation = variation;
musicSetting->flags |= MUSIC_SETTINGS_FLAGS_20;
musicSetting->state = 1;
musicSetting->flags &= ~MUSIC_SETTINGS_FLAGS_2;
return 1;
}
s32 bgm_adjust_proximity(s32 playerIndex, s32 mix, s16 state) {
MusicSettings* musicSetting = &gMusicSettings[playerIndex];
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAGS_1)) {
return FALSE;
}
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAGS_2)) {
return FALSE;
}
switch (state) {
case MUSIC_PROXIMITY_FAR:
bgm_set_proximity_mix_far(musicSetting->songName, mix);
break;
case MUSIC_PROXIMITY_NEAR:
bgm_set_proximity_mix_near(musicSetting->songName, mix);
break;
case MUSIC_PROXIMITY_FULL:
bgm_set_proximity_mix_full(musicSetting->songName, mix);
break;
}
return TRUE;
}
AuResult bgm_set_track_volumes(s32 playerIndex, s16 trackVolSet) {
MusicSettings* musicSetting = &gMusicSettings[playerIndex];
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAGS_1)) {
return AU_RESULT_OK;
}
return snd_song_set_track_volumes(musicSetting->songName, trackVolSet);
}
AuResult bgm_clear_track_volumes(s32 playerIndex, s16 trackVolSet) {
MusicSettings* musicSetting = &gMusicSettings[playerIndex];
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAGS_1)) {
return AU_RESULT_OK;
}
return snd_song_clear_track_volumes(musicSetting->songName, trackVolSet);
}
AuResult bgm_set_variation(s32 playerIndex, s16 arg1) {
MusicSettings* musicSetting = &gMusicSettings[playerIndex];
if (!(musicSetting->flags & MUSIC_SETTINGS_FLAGS_1)) {
return AU_RESULT_OK;
}
return snd_set_song_variation(musicSetting->songName, arg1);
}
s32 bgm_init_music_players(void) {
bgm_set_song(0, -1, 0, 250, 8);
bgm_set_song(1, -1, 0, 250, 8);
return 1;
}
void bgm_quiet_max_volume(void) {
MusicMaxVolume = 4;
}
void bgm_reset_max_volume(void) {
MusicMaxVolume = 8;
}
void bgm_set_target_volume(s16 volume) {
MusicTargetVolume = volume;
}
void bgm_update_volume(void) {
s16 toVolume;
if (NextVolumeUpdateTimer != 0) {
NextVolumeUpdateTimer--;
return;
}
toVolume = MusicTargetVolume;
if (toVolume > MusicMaxVolume) {
toVolume = MusicMaxVolume;
}
if (MusicCurrentVolume != toVolume) {
if (MusicCurrentVolume >= toVolume) {
MusicCurrentVolume--;
} else {
MusicCurrentVolume++;
}
func_800561A4(MusicCurrentVolume);
NextVolumeUpdateTimer = 3;
}
}
s32 func_8014AD40(void) {
MusicSettings* settings = gMusicSettings;
s32 i;
for (i = 0; i < 2; i++, settings++) {
if (!(settings->flags & MUSIC_SETTINGS_FLAGS_1)) {
continue;
}
if (au_song_is_playing(settings->songName)) {
return TRUE;
}
}
return FALSE;
}
void bgm_pop_song(void) {
MusicSettings* musicSetting = gMusicSettings;
if (gGameStatusPtr->demoState == 0) {
musicSetting->flags |= MUSIC_SETTINGS_FLAGS_8;
_bgm_set_song(0, musicSetting->savedSongID, musicSetting->savedVariation, 0, 8);
}
}
void bgm_push_song(s32 songID, s32 variation) {
MusicSettings* musicSetting = gMusicSettings;
if (gGameStatusPtr->demoState == 0) {
musicSetting->savedSongID = musicSetting->songID;
musicSetting->savedVariation = musicSetting->variation;
musicSetting->savedSongName = musicSetting->songName;
musicSetting->flags |= MUSIC_SETTINGS_FLAGS_4;
bgm_set_song(0, songID, variation, 500, 8);
}
}
void bgm_pop_battle_song(void) {
MusicSettings* musicSetting = gMusicSettings;
if (gGameStatusPtr->demoState == 0) {
if (gOverrideFlags & GLOBAL_OVERRIDES_20000) {
gOverrideFlags &= ~GLOBAL_OVERRIDES_20000;
} else {
musicSetting->flags |= MUSIC_SETTINGS_FLAGS_8;
_bgm_set_song(0, musicSetting->savedSongID, musicSetting->savedVariation, 0, 8);
snd_ambient_80055590(0, 250);
}
}
}
void bgm_push_battle_song(void) {
MusicSettings* musicSetting = gMusicSettings;
if (gGameStatusPtr->demoState == 0 && !(gOverrideFlags & GLOBAL_OVERRIDES_20000)) {
snd_ambient_8005553C(0, 250);
musicSetting->savedSongID = musicSetting->songID;
musicSetting->savedVariation = musicSetting->variation;
musicSetting->savedSongName = musicSetting->songName;
musicSetting->flags |= MUSIC_SETTINGS_FLAGS_4;
bgm_set_song(0, musicSetting->battleSongID, musicSetting->battleVariation, 500, 8);
}
}
void bgm_set_battle_song(s32 songID, s32 variation) {
MusicSettings* musicSetting = gMusicSettings;
musicSetting->battleSongID = songID;
musicSetting->battleVariation = variation;
}
void func_8014AFA0(void) {
}

326
src/audio/private.h Normal file
View File

@ -0,0 +1,326 @@
// 2BF90.c
void au_mseq_manager_init(AuAmbienceManager* arg0, s8 arg1, s8 reverbType, AuGlobals* arg3);
AuResult func_80050C30(u32 arg0);
void func_80050C54(s32 arg0, s32 arg1);
void au_mseq_set_disabled(s32 arg0, s32 arg1);
AuResult func_80050CA0(s32 arg0, s32 arg1);
void func_80050D50(AuAmbPlayer* arg0)