Adds support for compiling other regions (#378)

* Initial support for compiling with EU.

* Fix EU text.

* JP now compiles, TODO: Fix Autogen to fix JP and fix text in djui.

* audio: Prevent crash in EU.

* audio: Sync EU audio to 60 Hz instead of 50 Hz

* Add logging and remove sanity check to hopefully track EU crash.

* Various improvements for EU

Improve some memory debugging
Improve sound debugging
Initalize some variables in load.c for the sound system
Synchronize the EU cutscenes with the US version.

* Fix credits music playing in EU, Document some EU audio code.

* Autogen now supports version excluded object fields and functions. Reran autogen in accordance.

* Fix some potentional shifting issues due to version differences.

* Decrease the sleep times in some spots, We do not need them to be so long. (#373)

* Add the region to the version string.

---------

Co-authored-by: djoslin0 <djoslin0@users.noreply.github.com>
This commit is contained in:
Prince Frizzy 2023-05-03 03:54:25 -04:00 committed by GitHub
parent b1662a3338
commit ee3a7018ab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
41 changed files with 1197 additions and 814 deletions

View file

@ -1307,6 +1307,12 @@ ifeq ($(VERSION),eu)
$(BUILD_DIR)/levels/menu/leveldata.o: $(BUILD_DIR)/text/us/define_courses.inc.c
$(BUILD_DIR)/levels/menu/leveldata.o: $(BUILD_DIR)/text/de/define_courses.inc.c
$(BUILD_DIR)/levels/menu/leveldata.o: $(BUILD_DIR)/text/fr/define_courses.inc.c
$(BUILD_DIR)/src/game/level_info.o: $(BUILD_DIR)/include/text_strings.h
$(BUILD_DIR)/src/game/level_info.o: $(BUILD_DIR)/text/us/define_courses.inc.c
$(BUILD_DIR)/src/game/level_info.o: $(BUILD_DIR)/text/de/define_courses.inc.c
$(BUILD_DIR)/src/game/level_info.o: $(BUILD_DIR)/text/fr/define_courses.inc.c
O_FILES += $(BUILD_DIR)/bin/eu/translation_en.o $(BUILD_DIR)/bin/eu/translation_de.o $(BUILD_DIR)/bin/eu/translation_fr.o
else
ifeq ($(VERSION),sh)
TEXT_DIRS := text/jp

View file

@ -1,4 +1,4 @@
#!/usr/bin/bash
python3 ./autogen/convert_structs.py
python3 ./autogen/convert_functions.py
python3 ./autogen/convert_constants.py
python3 ./autogen/convert_constants.py

View file

@ -113,6 +113,12 @@ override_hide_functions = {
"smlua_deprecated.h" : [ ".*" ],
}
override_function_version_excludes = {
"bhv_play_music_track_when_touched_loop": "VERSION_JP",
"play_knockback_sound": "VERSION_JP",
"cur_obj_spawn_star_at_y_offset": "VERSION_JP"
}
lua_function_params = {
"src/pc/lua/utils/smlua_obj_utils.h::spawn_object_sync::objSetupFunction": [ "struct Object*" ]
}
@ -596,11 +602,14 @@ def build_call(function):
def build_function(function, do_extern):
s = ''
fid = function['identifier']
if fid in override_function_version_excludes:
s += '#ifndef ' + override_function_version_excludes[fid] + '\n'
if len(function['params']) <= 0:
s = 'int smlua_func_%s(UNUSED lua_State* L) {\n' % function['identifier']
s += 'int smlua_func_%s(UNUSED lua_State* L) {\n' % function['identifier']
else:
s = 'int smlua_func_%s(lua_State* L) {\n' % function['identifier']
s += 'int smlua_func_%s(lua_State* L) {\n' % function['identifier']
s += """ if (L == NULL) { return 0; }\n
int top = lua_gettop(L);
@ -628,6 +637,9 @@ def build_function(function, do_extern):
s += '\n'
s += ' return 1;\n}\n'
if fid in override_function_version_excludes:
s += '#endif\n'
function['implemented'] = 'UNIMPLEMENTED' not in s
if 'UNIMPLEMENTED' in s:
@ -648,9 +660,15 @@ def build_functions(processed_files):
return s
def build_bind(function):
s = 'smlua_bind_function(L, "%s", smlua_func_%s);' % (function['identifier'], function['identifier'])
fid = function['identifier']
s = 'smlua_bind_function(L, "%s", smlua_func_%s);' % (fid, fid)
if function['implemented']:
s = ' ' + s
# There is no point in adding the ifndef statement if the function is commented out here anyways.
# So we only do it on implemented functions.
if fid in override_function_version_excludes:
s = '#ifndef ' + override_function_version_excludes[fid] + '\n' + s
s += '\n#endif'
else:
s = ' //' + s + ' <--- UNIMPLEMENTED'
return s + "\n"

View file

@ -98,6 +98,11 @@ override_field_immutable = {
"SpawnInfo": [ "syncID" ]
}
override_field_version_excludes = {
"oCameraLakituUnk104": "VERSION_JP",
"oCoinUnk1B0": "VERSION_JP"
}
override_allowed_structs = {
"src/pc/network/network.h": [ 'ServerSettings' ],
}
@ -157,6 +162,8 @@ def table_to_string(table):
for row in table:
for i in range(columns):
if '#' in row[i]:
continue
if len(row[i]) > column_width[i]:
column_width[i] = len(row[i])
@ -268,15 +275,24 @@ def build_struct(struct):
if sid in override_field_invisible:
if fid in override_field_invisible[sid]:
continue
version = None
row = []
row.append(' { ' )
startStr = ''
endStr = ' },'
if fid in override_field_version_excludes:
startStr += '#ifndef ' + override_field_version_excludes[fid] + '\n'
endStr += '\n#endif'
startStr += ' { '
row.append(startStr )
row.append('"%s", ' % fid )
row.append('%s, ' % lvt )
row.append('offsetof(struct %s, %s), ' % (sid, field['identifier']) )
row.append('%s, ' % fimmutable )
row.append("%s" % lot )
row.append(' },' )
row.append(endStr )
field_table.append(row)
field_table_str, field_count = table_to_string(field_table)

View file

@ -9,7 +9,10 @@
// Include text/define_text.inc.c, preprocessed with -I text/de/ to get the
// right translation strings, with symbols renamed as below.
#define seg2_course_name_table course_name_table_eu_de
#define seg2_course_name_table_original course_name_table_eu_de_original
#define seg2_act_name_table act_name_table_eu_de
#define seg2_act_name_table_original act_name_table_eu_de_original
#define seg2_dialog_table dialog_table_eu_de
#define seg2_dialog_original dialog_table_eu_de_original
#include "text/de/define_text.inc.c"

View file

@ -9,7 +9,10 @@
// Include text/define_text.inc.c, preprocessed with -I text/us/ to get the
// right translation strings, with symbols renamed as below.
#define seg2_course_name_table course_name_table_eu_en
#define seg2_course_name_table_original course_name_table_eu_en_original
#define seg2_act_name_table act_name_table_eu_en
#define seg2_act_name_table_original act_name_table_eu_en_original
#define seg2_dialog_table dialog_table_eu_en
#define seg2_dialog_original dialog_table_eu_en_original
#include "text/us/define_text.inc.c"

View file

@ -9,7 +9,10 @@
// Include text/define_text.inc.c, preprocessed with -I text/fr/ to get the
// right translation strings, with symbols renamed as below.
#define seg2_course_name_table course_name_table_eu_fr
#define seg2_course_name_table_original course_name_table_eu_fr_original
#define seg2_act_name_table act_name_table_eu_fr
#define seg2_act_name_table_original act_name_table_eu_fr_original
#define seg2_dialog_table dialog_table_eu_fr
#define seg2_dialog_original dialog_table_eu_fr_original
#include "text/fr/define_text.inc.c"

View file

@ -86,14 +86,14 @@ ALIGNED8 const Texture texture_hud_char_I[] = {
#include "textures/segment2/segment2.02400.rgba16.inc.c"
};
ALIGNED8 static const u8 texture_hud_char_J[] = {
#include "textures/segment2/custom_hud_j.rgba16.inc.c"
};
#if defined(VERSION_JP) || defined(VERSION_SH)
ALIGNED8 const Texture texture_hud_char_J[] = {
#include "textures/segment2/segment2.02600.rgba16.inc.c"
};
#else
ALIGNED8 static const u8 texture_hud_char_J[] = {
#include "textures/segment2/custom_hud_j.rgba16.inc.c"
};
#endif
ALIGNED8 const Texture texture_hud_char_K[] = {

View file

@ -341,7 +341,9 @@ const struct BehaviorTableEntry gBehaviorTable[id_bhv_max_count] = {
BHV_ENTRY(bhvPiranhaPlantWakingBubbles),
BHV_ENTRY(bhvPitBowlingBall),
BHV_ENTRY(bhvPlatformOnTrack),
#ifndef VERSION_JP
BHV_ENTRY(bhvPlaysMusicTrackWhenTouched),
#endif
BHV_ENTRY(bhvPlungeBubble),
BHV_ENTRY(bhvPokey),
BHV_ENTRY(bhvPokeyBodyPart),

View file

@ -256,7 +256,6 @@ s64 DynOS_Common_ParseBhvConstants(const String &_Arg, bool *found) {
common_constant(bhvTweesterSandParticle);
common_constant(bhvTweester);
common_constant(bhvMerryGoRoundBooManager);
common_constant(bhvPlaysMusicTrackWhenTouched);
common_constant(bhvAnimatedTexture);
common_constant(bhvBooInCastle);
common_constant(bhvBooWithCage);
@ -556,6 +555,11 @@ s64 DynOS_Common_ParseBhvConstants(const String &_Arg, bool *found) {
common_legacy_constant(bhvFish2, bhvManyBlueFishSpawner);
common_legacy_constant(bhvFish3, bhvFewBlueFishSpawner);
common_legacy_constant(bhvLargeFishGroup, bhvFishSpawner);
// Version exclusive behaviors
#ifndef VERSION_JP
common_constant(bhvPlaysMusicTrackWhenTouched);
#endif
*found = false;
return 0;

View file

@ -4,6 +4,11 @@ extern "C" {
#include "game/save_file.h"
#include "levels/scripts.h"
#include "pc/lua/utils/smlua_level_utils.h"
#ifdef VERSION_EU
#include "eu_translation.h"
#endif
}
//
@ -310,7 +315,11 @@ const u8 *DynOS_Level_GetName(s32 aLevel, bool aDecaps, bool aAddCourseNumber) {
} else if (_Course >= COURSE_CAKE_END) {
SetConvertedTextToBuffer(sBuffer, DYNOS_LEVEL_TEXT_CASTLE);
} else {
#ifdef VERSION_EU
const u8 *_CourseName = ((const u8 **) course_name_table_eu_en)[_Course - COURSE_BOB] + 3;
#else
const u8 *_CourseName = ((const u8 **) seg2_course_name_table)[_Course - COURSE_BOB] + 3;
#endif
memcpy(sBuffer, _CourseName, DynOS_String_Length(_CourseName));
}
@ -356,7 +365,11 @@ const u8 *DynOS_Level_GetActName(s32 aLevel, s32 aAct, bool aDecaps, bool aAddSt
} else if (aAct >= 7) {
SetConvertedTextToBuffer(sBuffer, DYNOS_LEVEL_TEXT_100_COINS_STAR);
} else {
#ifdef VERSION_EU
const u8 *_ActName = ((const u8 **) act_name_table_eu_en)[(_Course - COURSE_BOB) * 6 + (aAct - 1)];
#else
const u8 *_ActName = ((const u8 **) seg2_act_name_table)[(_Course - COURSE_BOB) * 6 + (aAct - 1)];
#endif
memcpy(sBuffer, _ActName, DynOS_String_Length(_ActName));
}

View file

@ -3,6 +3,7 @@ extern "C" {
#include "behavior_table.h"
#include "levels/scripts.h"
#include "object_fields.h"
#include "engine/behavior_script.h"
#include "engine/level_script.h"
#include "engine/surface_load.h"
#include "game/object_helpers.h"
@ -1584,7 +1585,12 @@ static const void* sDynosBuiltinFuncs[] = {
define_builtin(bhv_bbh_tilting_trap_platform_loop),
define_builtin(bhv_haunted_bookshelf_loop),
define_builtin(bhv_merry_go_round_loop),
// We can't move this without forcing all old mods to possibly need to recompile. How annoying.
#ifndef VERSION_JP
define_builtin(bhv_play_music_track_when_touched_loop),
#else
(const void *) "bhv_play_music_track_when_touched_loop", (const void *) stub_behavior_script_2,
#endif
define_builtin(bhv_beta_bowser_anchor_loop),
define_builtin(bhv_static_checkered_platform_loop),
define_builtin(bhv_castle_floor_trap_init),

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,8 @@
#ifndef EU_TRANSLATION_H
#define EU_TRANSLATION_H
#include "types.h"
// EU changes most text to arrays for each language. This define allows these
// differences to be combined.
#ifdef VERSION_EU
@ -9,16 +11,25 @@
#define LANGUAGE_ARRAY(cmd) cmd
#endif
extern void *dialog_table_eu_en[];
extern void *course_name_table_eu_en[];
extern void *act_name_table_eu_en[];
extern u8 *dialog_table_eu_en[];
extern u8 *course_name_table_eu_en[];
extern u8 *act_name_table_eu_en[];
extern u8 *dialog_table_eu_en_original[];
extern u8 *course_name_table_eu_en_original[];
extern u8 *act_name_table_eu_en_original[];
extern void *dialog_table_eu_fr[];
extern void *course_name_table_eu_fr[];
extern void *act_name_table_eu_fr[];
extern u8 *dialog_table_eu_fr[];
extern u8 *course_name_table_eu_fr[];
extern u8 *act_name_table_eu_fr[];
extern u8 *dialog_table_eu_fr_original[];
extern u8 *course_name_table_eu_fr_original[];
extern u8 *act_name_table_eu_fr_original[];
extern void *dialog_table_eu_de[];
extern void *course_name_table_eu_de[];
extern void *act_name_table_eu_de[];
extern u8 *dialog_table_eu_de[];
extern u8 *course_name_table_eu_de[];
extern u8 *act_name_table_eu_de[];
extern u8 *dialog_table_eu_de_original[];
extern u8 *course_name_table_eu_de_original[];
extern u8 *act_name_table_eu_de_original[];
#endif // EU_TRANSLATION_H

View file

@ -50,7 +50,7 @@ const LevelScript level_main_menu_entry_1[] = {
GET_OR_SET(/*op*/ OP_SET, /*var*/ VAR_CURR_SAVE_FILE_NUM),
STOP_MUSIC(/*fadeOutTime*/ 0x00BE),
TRANSITION(/*transType*/ WARP_TRANSITION_FADE_INTO_COLOR, /*time*/ 16, /*color*/ 0xFF, 0xFF, 0xFF),
SLEEP(/*frames*/ 16),
SLEEP(/*frames*/ 8), // Was 16 frames
CLEAR_LEVEL(),
SLEEP_BEFORE_EXIT(/*frames*/ 1),
SET_REG(/*value*/ LEVEL_CASTLE_GROUNDS),
@ -80,13 +80,13 @@ const LevelScript level_main_menu_entry_2[] = {
CALL(/*arg*/ 0, /*func*/ lvl_init_act_selector_values_and_stars),
/*27*/ TRANSITION(/*transType*/ WARP_TRANSITION_FADE_FROM_COLOR, /*time*/ 16, /*color*/ 0xFF, 0xFF, 0xFF),
/*29*/ SLEEP(/*frames*/ 16),
/*29*/ SLEEP(/*frames*/ 8), // Was 16 frames
/*30*/ SET_MENU_MUSIC(/*seq*/ 0x000D),
/*33*/ CALL_LOOP(/*arg*/ 0, /*func*/ lvl_update_obj_and_load_act_button_actions),
/*35*/ GET_OR_SET(/*op*/ OP_SET, /*var*/ VAR_CURR_ACT_NUM),
/*36*/ STOP_MUSIC(/*fadeOutTime*/ 0x00BE),
/*37*/ TRANSITION(/*transType*/ WARP_TRANSITION_FADE_INTO_COLOR, /*time*/ 16, /*color*/ 0xFF, 0xFF, 0xFF),
/*39*/ SLEEP(/*frames*/ 16),
/*39*/ SLEEP(/*frames*/ 10), // Was 16 frames
/*40*/ CLEAR_LEVEL(),
/*41*/ SLEEP_BEFORE_EXIT(/*frames*/ 1),
// L1:

View file

@ -151,7 +151,7 @@ const LevelScript level_main_scripts_entry[] = {
LOOP_BEGIN(),
EXECUTE(/*seg*/ 0x14, _menuSegmentRomStart, _menuSegmentRomEnd, level_main_menu_entry_2),
JUMP_LINK(script_exec_level_table),
SLEEP(/*frames*/ 1),
//SLEEP(/*frames*/ 1),
LOOP_UNTIL(/*op*/ OP_LT, /*arg*/ 0),
JUMP_IF(/*op*/ OP_EQ, /*arg*/ -1, script_L2),
JUMP_IF(/*op*/ OP_EQ, /*arg*/ -2, goto_mario_head_regular),

View file

@ -902,8 +902,8 @@ volatile s32 gAudioLoadLock = AUDIO_LOCK_UNINITIALIZED;
#if defined(VERSION_EU)
u8 bufferDelete2[12] = { 0 };
u8 D_EU_80302010 = 0;
u8 D_EU_80302014 = 0;
u8 gQueuedAudioCmdCount = 0;
u8 gLastQueuedAudioCmdCount = 0;
struct OSMesgQueue *OSMesgQueues[4] = { &OSMesgQueue0, &OSMesgQueue1, &OSMesgQueue2, &OSMesgQueue3 };
#elif defined(VERSION_JP) || defined(VERSION_US)

View file

@ -122,8 +122,8 @@ extern u32 gAudioRandom;
#define AUDIO_INIT_POOL_SIZE (0x2500 + EXT_AUDIO_INIT_POOL_SIZE)
#endif
// Normal Heap Size, Extended Heap Size, Extended Audio Init Pool Size
#define AUDIO_HEAP_SIZE (AUDIO_HEAP_BASE + EXT_AUDIO_HEAP_SIZE + EXT_AUDIO_INIT_POOL_SIZE)
// Normal Heap Size, Extended Heap Size
#define AUDIO_HEAP_SIZE (AUDIO_HEAP_BASE + EXT_AUDIO_HEAP_SIZE)
#ifdef VERSION_SH
extern f32 unk_sh_data_1[];

View file

@ -14,6 +14,7 @@
#include "seq_ids.h"
#include "dialog_ids.h"
#include "level_table.h"
#include "pc/debuglog.h"
#include "pc/lua/utils/smlua_level_utils.h"
#if defined(VERSION_EU) || defined(VERSION_SH)
@ -281,7 +282,7 @@ u16 sLevelAcousticReaches[LEVEL_COUNT] = {
#define VOLUME_RANGE_UNK2 0.8f
#endif
const u8 sBackgroundMusicDefaultVolumeDefault[] = {
const u8 sBackgroundMusicDefaultVolumeDefault[35] = {
127, // SEQ_SOUND_PLAYER
80, // SEQ_EVENT_CUTSCENE_COLLECT_STAR
80, // SEQ_MENU_TITLE_SCREEN
@ -451,7 +452,7 @@ OSPiHandle DriveRomHandle; // used in osDriveRomInit.c. Why here?
s8 D_SH_80343E48_pad[0x8];
#endif
struct Sound sSoundRequests[0x100];
struct Sound sSoundRequests[0x100] = { 0 };
struct ChannelVolumeScaleFade D_80360928[SEQUENCE_PLAYERS][CHANNELS_MAX] = { 0 };
u8 sUsedChannelsForSoundBank[SOUND_BANK_COUNT] = { 0 };
u8 sCurrentSound[SOUND_BANK_COUNT][MAX_CHANNELS_PER_SOUND_BANK] = { 0 }; // index into sSoundBanks
@ -464,10 +465,10 @@ u8 sCurrentSound[SOUND_BANK_COUNT][MAX_CHANNELS_PER_SOUND_BANK] = { 0 }; // inde
*/
struct SoundCharacteristics sSoundBanks[SOUND_BANK_COUNT][SOUND_INDEX_COUNT] = { 0 };
u8 sSoundMovingSpeed[SOUND_BANK_COUNT];
u8 sSoundMovingSpeed[SOUND_BANK_COUNT] = { 0 };
u8 sBackgroundMusicTargetVolume;
static u8 sLowerBackgroundMusicVolume;
struct SequenceQueueItem sBackgroundMusicQueue[MAX_BACKGROUND_MUSIC_QUEUE_SIZE];
struct SequenceQueueItem sBackgroundMusicQueue[MAX_BACKGROUND_MUSIC_QUEUE_SIZE] = { 0 };
#if defined(VERSION_EU) || defined(VERSION_SH)
s32 unk_sh_8034754C;
@ -480,7 +481,7 @@ OSMesgQueue OSMesgQueue2;
OSMesgQueue OSMesgQueue3;
extern OSMesgQueue *OSMesgQueues[];
struct EuAudioCmd sAudioCmd[0x100];
struct EuAudioCmd sAudioCmd[0x100] = { 0 };
OSMesg OSMesg0;
s32 pad1; // why is there 1 s32 here
@ -500,9 +501,9 @@ typedef s32 FadeT;
#endif
// some sort of main thread -> sound thread dispatchers
extern void func_802ad728(u32 bits, f32 arg);
extern void func_802ad74c(u32 bits, u32 arg);
extern void func_802ad770(u32 bits, s8 arg);
extern void queue_audio_cmd_f32(u32 bits, f32 arg);
extern void queue_audio_cmd_u32(u32 bits, u32 arg);
extern void queue_audio_cmd_s8(u32 bits, s8 arg);
static void update_background_music_after_sound(u8 bank, u8 soundIndex);
static void update_game_sound(void);
@ -684,7 +685,7 @@ static void seq_player_fade_to_zero_volume(s32 player, FadeT fadeDuration) {
/**
* Called from threads: thread4_sound, thread5_game_loop
*/
static void func_8031D690(s32 player, FadeT fadeInTime) {
static void seq_player_fade_from_zero_volume(s32 player, FadeT fadeInTime) {
struct SequencePlayer *seqPlayer = &gSequencePlayers[player];
if (fadeInTime == 0 || seqPlayer->state == SEQUENCE_PLAYER_STATE_FADE_OUT) {
@ -796,7 +797,7 @@ static void seq_player_fade_to_target_volume(s32 player, FadeT fadeDuration, u8
#if defined(VERSION_EU) || defined(VERSION_SH)
#ifdef VERSION_EU
extern void func_802ad7a0(void);
extern void send_process_queued_audio_cmds(void);
#else
extern void func_sh_802F64C8(void);
#endif
@ -810,7 +811,7 @@ void maybe_tick_game_sound(void) {
sGameLoopTicked = 0;
}
#ifdef VERSION_EU
func_802ad7a0();
send_process_queued_audio_cmds();
#else
func_sh_802F64C8(); // moved in SH
#endif
@ -819,7 +820,7 @@ void maybe_tick_game_sound(void) {
void func_eu_802e9bec(s32 player, s32 channel, s32 arg2) {
// EU verson of unused_803209D8
// chan->stopSomething2 = arg2?
func_802ad770(0x08000000 | (player & 0xff) << 16 | (channel & 0xff) << 8, (s8) arg2);
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x08, player, channel, 0), (s8)arg2);
}
#else
@ -1428,8 +1429,8 @@ static void update_game_sound(void) {
if (!(sSoundBanks[bank][soundIndex].soundBits & SOUND_CONSTANT_FREQUENCY)) {
if (sSoundMovingSpeed[bank] > 8) {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(
0x02020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(
AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK1));
#else
value = get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK1);
@ -1438,7 +1439,7 @@ static void update_game_sound(void) {
#endif
} else {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(0x02020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK1)
* ((sSoundMovingSpeed[bank] + 8.0f) / 16));
#else
@ -1448,7 +1449,7 @@ static void update_game_sound(void) {
#endif
}
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad770(0x03020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x03, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_pan(*sSoundBanks[bank][soundIndex].x,
*sSoundBanks[bank][soundIndex].z));
#else
@ -1460,8 +1461,8 @@ static void update_game_sound(void) {
if ((sSoundBanks[bank][soundIndex].soundBits & SOUNDARGS_MASK_SOUNDID)
== (SOUND_MOVING_FLYING & SOUNDARGS_MASK_SOUNDID)) {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(
0x04020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(
AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex)
+ ((f32) sSoundMovingSpeed[bank] / US_FLOAT(80.0)));
#else
@ -1471,8 +1472,8 @@ static void update_game_sound(void) {
#endif
} else {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(
0x04020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(
AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex)
+ ((f32) sSoundMovingSpeed[bank] / US_FLOAT(400.0)));
#else
@ -1482,7 +1483,7 @@ static void update_game_sound(void) {
#endif
}
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad770(0x05020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x05, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_reverb(bank, soundIndex, channelIndex));
#else
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->reverb =
@ -1494,9 +1495,9 @@ static void update_game_sound(void) {
// fallthrough
case SOUND_BANK_MENU:
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(0x02020000 | ((channelIndex & 0xff) << 8), 1);
func_802ad770(0x03020000 | ((channelIndex & 0xff) << 8), 64);
func_802ad728(0x04020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0), 1);
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x03, SEQ_PLAYER_SFX, channelIndex, 0), 64);
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex));
#else
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->volume = 1.0f;
@ -1509,16 +1510,14 @@ static void update_game_sound(void) {
case SOUND_BANK_LUIGI_VOICE:
case SOUND_BANK_WARIO_VOICE:
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad770(0x05020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x05, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_reverb(bank, soundIndex, channelIndex));
func_802ad728(0x02020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK1));
func_802ad770(0x03020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x03, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_pan(*sSoundBanks[bank][soundIndex].x,
*sSoundBanks[bank][soundIndex].z)
* 127.0f
+ 0.5f);
func_802ad728(0x04020000 | ((channelIndex & 0xff) << 8),
*sSoundBanks[bank][soundIndex].z) * 127.0f + 0.5f);
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex));
#else
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->volume =
@ -1539,16 +1538,14 @@ static void update_game_sound(void) {
case SOUND_BANK_GENERAL2:
case SOUND_BANK_OBJ2:
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad770(0x05020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x05, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_reverb(bank, soundIndex, channelIndex));
func_802ad728(0x02020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK2));
func_802ad770(0x03020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x03, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_pan(*sSoundBanks[bank][soundIndex].x,
*sSoundBanks[bank][soundIndex].z)
* 127.0f
+ 0.5f);
func_802ad728(0x04020000 | ((channelIndex & 0xff) << 8),
*sSoundBanks[bank][soundIndex].z) * 127.0f + 0.5f);
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex));
#else
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->reverb =
@ -1605,8 +1602,8 @@ static void update_game_sound(void) {
if (!(sSoundBanks[bank][soundIndex].soundBits & SOUND_CONSTANT_FREQUENCY)) {
if (sSoundMovingSpeed[bank] > 8) {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(
0x02020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(
AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK1));
#else
value = get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK1);
@ -1615,7 +1612,7 @@ static void update_game_sound(void) {
#endif
} else {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(0x02020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK1)
* ((sSoundMovingSpeed[bank] + 8.0f) / 16));
#else
@ -1625,7 +1622,7 @@ static void update_game_sound(void) {
#endif
}
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad770(0x03020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x03, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_pan(*sSoundBanks[bank][soundIndex].x,
*sSoundBanks[bank][soundIndex].z));
#else
@ -1637,8 +1634,8 @@ static void update_game_sound(void) {
if ((sSoundBanks[bank][soundIndex].soundBits & SOUNDARGS_MASK_SOUNDID)
== (SOUND_MOVING_FLYING & SOUNDARGS_MASK_SOUNDID)) {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(
0x04020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(
AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex)
+ ((f32) sSoundMovingSpeed[bank] / US_FLOAT(80.0)));
#else
@ -1648,8 +1645,8 @@ static void update_game_sound(void) {
#endif
} else {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(
0x04020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(
AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex)
+ ((f32) sSoundMovingSpeed[bank] / US_FLOAT(400.0)));
#else
@ -1659,7 +1656,7 @@ static void update_game_sound(void) {
#endif
}
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad770(0x05020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x05, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_reverb(bank, soundIndex, channelIndex));
#else
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->reverb =
@ -1671,9 +1668,9 @@ static void update_game_sound(void) {
// fallthrough
case SOUND_BANK_MENU:
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(0x02020000 | ((channelIndex & 0xff) << 8), 1);
func_802ad770(0x03020000 | ((channelIndex & 0xff) << 8), 64);
func_802ad728(0x04020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0), 1);
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x03, SEQ_PLAYER_SFX, channelIndex, 0), 64);
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex));
#else
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->volume = 1.0f;
@ -1684,16 +1681,14 @@ static void update_game_sound(void) {
case SOUND_BANK_ACTION:
case SOUND_BANK_MARIO_VOICE:
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad770(0x05020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x05, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_reverb(bank, soundIndex, channelIndex));
func_802ad728(0x02020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK1));
func_802ad770(0x03020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x03, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_pan(*sSoundBanks[bank][soundIndex].x,
*sSoundBanks[bank][soundIndex].z)
* 127.0f
+ 0.5f);
func_802ad728(0x04020000 | ((channelIndex & 0xff) << 8),
*sSoundBanks[bank][soundIndex].z) * 127.0f + 0.5f);
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex));
#else
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->volume =
@ -1714,16 +1709,14 @@ static void update_game_sound(void) {
case SOUND_BANK_GENERAL2:
case SOUND_BANK_OBJ2:
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad770(0x05020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x05, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_reverb(bank, soundIndex, channelIndex));
func_802ad728(0x02020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x02, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_volume(bank, soundIndex, VOLUME_RANGE_UNK2));
func_802ad770(0x03020000 | ((channelIndex & 0xff) << 8),
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x03, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_pan(*sSoundBanks[bank][soundIndex].x,
*sSoundBanks[bank][soundIndex].z)
* 127.0f
+ 0.5f);
func_802ad728(0x04020000 | ((channelIndex & 0xff) << 8),
*sSoundBanks[bank][soundIndex].z) * 127.0f + 0.5f);
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
get_sound_freq_scale(bank, soundIndex));
#else
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->reverb =
@ -1743,7 +1736,13 @@ static void update_game_sound(void) {
// add custom pitch bend
if (soundIndex < SOUND_INDEX_COUNT && sSoundBanks[bank][soundIndex].customFreqScale != 0) {
#if defined(VERSION_EU) || defined(VERSION_SH)
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x04, SEQ_PLAYER_SFX, channelIndex, 0),
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->freqScale
* sSoundBanks[bank][soundIndex].customFreqScale);
#else
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->freqScale *= sSoundBanks[bank][soundIndex].customFreqScale;
#endif
}
// Increment to the next channel that this bank owns
@ -1777,8 +1776,8 @@ static void seq_player_play_sequence(u8 player, u8 seqId, u16 arg2) {
}
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad770(0x46000000 | ((u8)(u32) player) << 16, seqId & SEQ_VARIATION);
func_802ad74c(0x82000000 | ((u8)(u32) player) << 16 | ((u8)(seqId & SEQ_BASE_ID)) << 8, arg2);
queue_audio_cmd_s8(AUDIO_CMD_ARGS(0x46, player, 0, 0), seqId & SEQ_VARIATION);
queue_audio_cmd_u32(AUDIO_CMD_ARGS(0x82, player, seqId & SEQ_BASE_ID, 0), arg2);
if (player == SEQ_PLAYER_LEVEL) {
targetVolume = begin_background_music_fade(0);
@ -1798,7 +1797,7 @@ static void seq_player_play_sequence(u8 player, u8 seqId, u16 arg2) {
gSequencePlayers[SEQ_PLAYER_LEVEL].fadeVolume = (f32) targetVolume / US_FLOAT(127.0);
}
} else {
func_8031D690(player, arg2);
seq_player_fade_from_zero_volume(player, arg2);
}
#endif
}
@ -1811,12 +1810,12 @@ void seq_player_fade_out(u8 player, u16 fadeDuration) {
#ifdef VERSION_EU
u32 fd = fadeDuration;
#else
s32 fd = fadeDuration; // will also match if we change function signature func_802ad74c to use s32 as arg1
s32 fd = fadeDuration; // will also match if we change function signature queue_audio_cmd_u32 to use s32 as arg1
#endif
if (!player) {
sCurrentBackgroundMusicSeqId = SEQUENCE_NONE;
}
func_802ad74c(0x83000000 | (player & 0xff) << 16, fd);
queue_audio_cmd_u32(AUDIO_CMD_ARGS(0x83, player, 0, 0), fd);
#else
if (player == SEQ_PLAYER_LEVEL) {
sCurrentBackgroundMusicSeqId = SEQUENCE_NONE;
@ -1864,7 +1863,7 @@ static void func_8031F96C(u8 player) {
&& D_80360928[player][i].remainingFrames != 0) {
D_80360928[player][i].current += D_80360928[player][i].velocity;
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad728(0x01000000 | (player & 0xff) << 16 | (i & 0xff) << 8,
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x01, player, i, 0),
D_80360928[player][i].current);
#else
gSequencePlayers[player].channels[i]->volumeScale = D_80360928[player][i].current;
@ -1872,10 +1871,10 @@ static void func_8031F96C(u8 player) {
D_80360928[player][i].remainingFrames--;
if (D_80360928[player][i].remainingFrames == 0) {
#if defined(VERSION_EU)
func_802ad728(0x01000000 | (player & 0xff) << 16 | (i & 0xff) << 8,
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x01, player, i, 0),
FLOAT_CAST(D_80360928[player][i].target) / 127.0);
#elif defined(VERSION_SH)
func_802ad728(0x01000000 | (player & 0xff) << 16 | (i & 0xff) << 8,
queue_audio_cmd_f32(AUDIO_CMD_ARGS(0x01, player, i, 0),
FLOAT_CAST(D_80360928[player][i].target) / 127.0f);
#else
gSequencePlayers[player].channels[i]->volumeScale =
@ -2150,9 +2149,9 @@ void set_audio_muted(u8 muted) {
for (i = 0; i < SEQUENCE_PLAYERS; i++) {
#if defined(VERSION_EU) || defined(VERSION_SH)
if (muted)
func_802ad74c(0xf1000000, 0);
queue_audio_cmd_u32(AUDIO_CMD_ARGS(0xf1, 0, 0, 0), 0);
else
func_802ad74c(0xf2000000, 0);
queue_audio_cmd_u32(AUDIO_CMD_ARGS(0xf2, 0, 0, 0), 0);
#else
gSequencePlayers[i].muted = muted;
#endif
@ -2426,6 +2425,8 @@ void play_music(u8 player, u16 seqArgs, u16 fadeTimer) {
u8 priority = seqArgs >> 8;
u8 i;
u8 foundIndex = 0;
//LOG_DEBUG("Playing music with arguments: %d, 0x%X, %d, %d", player, seqId, priority, fadeTimer);
// Except for the background music player, we don't support queued
// sequences. Just play them immediately, stopping any old sequence.
@ -2436,6 +2437,7 @@ void play_music(u8 player, u16 seqArgs, u16 fadeTimer) {
// Abort if the queue is already full.
if (sBackgroundMusicQueueSize == MAX_BACKGROUND_MUSIC_QUEUE_SIZE) {
LOG_DEBUG("Background music queue reached max size! Ignoring request to queue sequence %d.", seqId);
return;
}
@ -2449,6 +2451,7 @@ void play_music(u8 player, u16 seqArgs, u16 fadeTimer) {
} else if (!gSequencePlayers[SEQ_PLAYER_LEVEL].enabled) {
stop_background_music(sBackgroundMusicQueue[0].seqId);
}
//LOG_DEBUG("Sequence 0x%X is already in the background music queue!", seqId);
return;
}
}
@ -2465,6 +2468,7 @@ void play_music(u8 player, u16 seqArgs, u16 fadeTimer) {
// one more entry in the queue.
if (foundIndex == 0) {
seq_player_play_sequence(SEQ_PLAYER_LEVEL, seqId, fadeTimer);
//LOG_DEBUG("Playing sequence 0x%X as it's first in the background music queue!", seqId);
sBackgroundMusicQueueSize++;
}
@ -2671,7 +2675,7 @@ void func_803210D4(u16 fadeDuration) {
if (gSequencePlayers[SEQ_PLAYER_LEVEL].enabled == TRUE) {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad74c(0x83000000, fadeDuration);
queue_audio_cmd_u32(AUDIO_CMD_ARGS(0x83, 0, 0, 0), fadeDuration);
#else
seq_player_fade_to_zero_volume(SEQ_PLAYER_LEVEL, fadeDuration);
#endif
@ -2679,7 +2683,7 @@ void func_803210D4(u16 fadeDuration) {
if (gSequencePlayers[SEQ_PLAYER_ENV].enabled == TRUE) {
#if defined(VERSION_EU) || defined(VERSION_SH)
func_802ad74c(0x83010000, fadeDuration);
queue_audio_cmd_u32(AUDIO_CMD_ARGS(0x83, SEQ_PLAYER_ENV, 0, 0), fadeDuration);
#else
seq_player_fade_to_zero_volume(SEQ_PLAYER_ENV, fadeDuration);
#endif
@ -2799,7 +2803,7 @@ void sound_reset(u8 presetId) {
disable_all_sequence_players();
sound_init();
#ifdef VERSION_SH
func_802ad74c(0xF2000000, 0);
queue_audio_cmd_u32(AUDIO_CMD_ARGS(0xF2, 0, 0, 0), 0);
#endif
#if defined(VERSION_JP) || defined(VERSION_US)
audio_reset_session(&gAudioSessionPresets[presetId]);

View file

@ -10,6 +10,10 @@
// bit which may be read by the sequence script.
#define SEQUENCE_ARGS(priority, seqId) ((priority << 8) | seqId)
#if defined(VERSION_EU) || defined(VERSION_SH)
#define AUDIO_CMD_ARGS(cmd, arg1, arg2, arg3) (((cmd & 0xff) << 24) | ((arg1 & 0xff) << 16) | ((arg2 & 0xff) << 8) | (arg3 & 0xff))
#endif
#define SOUND_MODE_STEREO 0
#define SOUND_MODE_MONO 3
#define SOUND_MODE_HEADSET 1
@ -21,6 +25,9 @@
extern s32 gAudioErrorFlags;
extern f32 gGlobalSoundSource[3];
extern const u8 sBackgroundMusicDefaultVolumeDefault[35];
extern u8 sBackgroundMusicDefaultVolume[64];
// defined in data.c, used by the game
extern u32 gAudioRandom;

View file

@ -8,6 +8,8 @@
#include "seqplayer.h"
#include "effects.h"
#include "pc/debuglog.h"
#define ALIGN16(val) (((val) + 0xF) & ~0xF)
struct PoolSplit {
@ -248,16 +250,23 @@ void discard_sequence(s32 seqId) {
void *soundAlloc(struct SoundAllocPool *pool, u32 size) {
#if defined(VERSION_EU) || defined(VERSION_SH)
u8 *start;
u8 *pos;
u32 alignedSize = ALIGN16(size);
if (pool == NULL || pool->cur == NULL) {
LOG_ERROR("Failed to allocate for sound pool! Pool is NULL!");
return NULL;
}
start = pool->cur;
u8 *start = pool->cur;
if (start + alignedSize <= pool->start + pool->size) {
bzero(start, alignedSize);
pool->cur += alignedSize;
} else {
fprintf(stderr, "soundAlloc failed: tried to alloc %u bytes at %p (%i free)\n", ALIGN16(size), (void*)pool, pool->start + pool->size - pool->cur);
LOG_ERROR("Tried to alloc %u bytes at %p (%i free) and failed!", ALIGN16(size), (void*)pool, pool->start + pool->size - pool->cur);
return NULL;
}
if (start == NULL) {
LOG_ERROR("An unknown error occured when allocating %u bytes at %p (%i free)!", ALIGN16(size), (void*)pool, pool->start + pool->size - pool->cur);
return NULL;
}
#ifdef VERSION_SH
@ -268,7 +277,7 @@ void *soundAlloc(struct SoundAllocPool *pool, u32 size) {
u32 alignedSize = ALIGN16(size);
if (pool == NULL || pool->cur == NULL) {
fprintf(stderr, "soundAlloc failed: pull was invalid\n");
LOG_ERROR("Failed to allocate for sound pool! Pool is NULL!");
return NULL;
}
@ -277,7 +286,7 @@ void *soundAlloc(struct SoundAllocPool *pool, u32 size) {
bzero(start, alignedSize);
pool->cur += alignedSize;
} else {
fprintf(stderr, "soundAlloc failed: tried to alloc %u bytes at %p (%i free)\n", (unsigned int)ALIGN16(size), (void*)pool, (int)(pool->start + pool->size - pool->cur));
LOG_ERROR("Tried to alloc %u bytes at %p (%i free) and failed!", (unsigned int)ALIGN16(size), (void*)pool, (int)(pool->start + pool->size - pool->cur));
return NULL;
}
return start;
@ -1199,6 +1208,7 @@ void audio_reset_session(void) {
gAudioBufferParameters.samplesPerFrameTarget = ALIGN16(gAudioBufferParameters.frequency / gRefreshRate);
gAudioBufferParameters.minAiBufferLength = gAudioBufferParameters.samplesPerFrameTarget - 0x10;
gAudioBufferParameters.maxAiBufferLength = gAudioBufferParameters.samplesPerFrameTarget + 0x10;
//printf("samplesPerFrameTarget: %d, maxAiBufferLength: %d, minAiBufferLength: %d\n", gAudioBufferParameters.samplesPerFrameTarget, gAudioBufferParameters.maxAiBufferLength, gAudioBufferParameters.minAiBufferLength);
#ifdef VERSION_SH
gAudioBufferParameters.updatesPerFrame = (gAudioBufferParameters.samplesPerFrameTarget + 0x10) / 192 + 1;
gAudioBufferParameters.samplesPerUpdate = (gAudioBufferParameters.samplesPerFrameTarget / gAudioBufferParameters.updatesPerFrame) & -8;

View file

@ -1,3 +1,4 @@
#include <assert.h>
#include <ultra64.h>
#include "data.h"
@ -32,7 +33,7 @@ void func_sh_802f6a9c(void);
void func_sh_802f51d4(struct AudioBankSound *sound, struct AudioBank *memBase, struct PatchStruct *patchInfo);
#endif
struct Note *gNotes;
struct Note *gNotes = NULL;
#if defined(VERSION_EU) || defined(VERSION_SH)
static u8 pad[4];
@ -76,27 +77,31 @@ OSMesg gUnkMesgBufs2[0x10];
#endif
OSMesgQueue gCurrAudioFrameDmaQueue;
OSMesg gCurrAudioFrameDmaMesgBufs[AUDIO_FRAME_DMA_QUEUE_SIZE];
OSIoMesg gCurrAudioFrameDmaIoMesgBufs[AUDIO_FRAME_DMA_QUEUE_SIZE];
OSMesg gCurrAudioFrameDmaMesgBufs[AUDIO_FRAME_DMA_QUEUE_SIZE] = { 0 };
OSIoMesg gCurrAudioFrameDmaIoMesgBufs[AUDIO_FRAME_DMA_QUEUE_SIZE] = { 0 };
OSMesgQueue gAudioDmaMesgQueue;
OSMesg gAudioDmaMesg;
OSIoMesg gAudioDmaIoMesg;
#ifdef VERSION_EU
#define SAMPLE_DMA_COUNT 0x100
#else
#define SAMPLE_DMA_COUNT 0x90
#endif
#ifdef VERSION_SH
struct SharedDma *sSampleDmas; // sh: 0x803503D0
struct SharedDma *sSampleDmas = NULL; // sh: 0x803503D0
#else
struct SharedDma sSampleDmas[SAMPLE_DMA_COUNT];
struct SharedDma sSampleDmas[SAMPLE_DMA_COUNT] = { 0 };
#endif
u32 gSampleDmaNumListItems; // sh: 0x803503D4
u32 sSampleDmaListSize1; // sh: 0x803503D8
u32 sUnused80226B40; // set to 0, never read, sh: 0x803503DC
// Circular buffer of DMAs with ttl = 0. tail <= head, wrapping around mod 256.
u8 sSampleDmaReuseQueue1[256];
u8 sSampleDmaReuseQueue2[256];
u8 sSampleDmaReuseQueue1[256] = { 0 };
u8 sSampleDmaReuseQueue2[256] = { 0 };
u8 sSampleDmaReuseQueueTail1;
u8 sSampleDmaReuseQueueTail2;
u8 sSampleDmaReuseQueueHead1; // sh: 0x803505E2
@ -104,11 +109,11 @@ u8 sSampleDmaReuseQueueHead2; // sh: 0x803505E3
// bss correct up to here
ALSeqFile *gSeqFileHeader;
ALSeqFile *gAlCtlHeader;
ALSeqFile *gAlTbl;
u8 *gAlBankSets;
u16 gSequenceCount;
ALSeqFile *gSeqFileHeader = NULL;
ALSeqFile *gAlCtlHeader = NULL;
ALSeqFile *gAlTbl = NULL;
u8 *gAlBankSets = NULL;
u16 gSequenceCount = 0;
struct CtlEntry *gCtlEntries; // sh: 0x803505F8
@ -417,6 +422,9 @@ void init_sample_dma_buffers(UNUSED s32 arg0) {
sDmaBufSize = 144 * 9 * 4;
#endif
// Sanity check to prevent a buffer overflow into memory we're not supposed to touch.
assert(gSampleDmaNumListItems < SAMPLE_DMA_COUNT);
#if defined(VERSION_EU) || defined(VERSION_SH)
for (s32 i = 0; i < gMaxSimultaneousNotes * 3 * gAudioBufferParameters.presetUnk4; i++)
#else
@ -1850,8 +1858,10 @@ void audio_init() {
}
#ifdef VERSION_EU
D_EU_802298D0 = 20.03042f;
gRefreshRate = 50;
// We want the refresh rate to be 60 FPS on PC.
// We shouldn't need to worry about PAL specfic computers anymore.
D_EU_802298D0 = 16.713f;
gRefreshRate = 60;
port_eu_init();
if (k) {
}

View file

@ -346,24 +346,21 @@ void process_notes(void) {
f32 cap;
#endif
#endif
struct Note *note;
struct Note *note = NULL;
#if defined(VERSION_EU) || defined(VERSION_SH)
struct NotePlaybackState *playbackState;
struct NoteSubEu *noteSubEu;
struct NotePlaybackState *playbackState = NULL;
struct NoteSubEu *noteSubEu = NULL;
#ifndef VERSION_SH
UNUSED u8 pad[12];
u8 reverb;
UNUSED u8 pad3;
u8 pan;
#else
u8 pad[8];
struct ReverbInfo reverbInfo;
#endif
u8 bookOffset;
#endif
struct NoteAttributes *attributes;
struct NoteAttributes *attributes = NULL;
#if defined(VERSION_JP) || defined(VERSION_US)
struct AudioListItem *it;
struct AudioListItem *it = NULL;
#endif
s32 i;
@ -443,9 +440,6 @@ void process_notes(void) {
#endif
d:
if (playbackState->priority != NOTE_PRIORITY_DISABLED) {
#ifdef VERSION_SH
if (1) {}
#endif
noteSubEu = &note->noteSubEu;
#ifdef VERSION_SH
if (playbackState->unkSH34 >= 1 || noteSubEu->finished) {
@ -477,10 +471,6 @@ void process_notes(void) {
goto skip;
}
}
#ifndef VERSION_SH
if (1) {
}
#endif
} else if (playbackState->adsr.state == ADSR_STATE_DISABLED) {
note_disable(note);
audio_list_remove(&note->listItem);

View file

@ -4,6 +4,7 @@
#include "data.h"
#include "seqplayer.h"
#include "synthesis.h"
#include "pc/debuglog.h"
#ifdef VERSION_EU
@ -27,12 +28,12 @@ extern u8 gAudioResetPresetIdToLoad;
extern OSMesgQueue *OSMesgQueues[];
extern struct EuAudioCmd sAudioCmd[0x100];
void func_8031D690(s32 player, FadeT fadeInTime);
void seq_player_fade_from_zero_volume(s32 player, FadeT fadeInTime);
void seq_player_fade_to_zero_volume(s32 player, FadeT fadeOutTime);
void port_eu_init_queues(void);
void decrease_sample_dma_ttls(void);
s32 audio_shut_down_and_reset_step(void);
void func_802ad7ec(u32);
void process_queued_audio_cmds(u32);
struct SPTask *create_next_audio_frame_task(void) {
return NULL;
@ -40,9 +41,10 @@ struct SPTask *create_next_audio_frame_task(void) {
void create_next_audio_buffer(s16 *samples, u32 num_samples) {
s32 writtenCmds;
OSMesg msg;
gAudioFrameCount++;
decrease_sample_dma_ttls();
if (osRecvMesg(OSMesgQueues[2], &msg, 0) != -1) {
if (osRecvMesg(OSMesgQueues[2], &msg, OS_MESG_NOBLOCK) != -1) {
gAudioResetPresetIdToLoad = (u8) (s32) msg;
gAudioResetStatus = 5;
}
@ -52,7 +54,7 @@ void create_next_audio_buffer(s16 *samples, u32 num_samples) {
gAudioResetStatus = 0;
}
if (osRecvMesg(OSMesgQueues[1], &msg, OS_MESG_NOBLOCK) != -1) {
func_802ad7ec((u32) msg);
process_queued_audio_cmds((u32) msg);
}
synthesis_execute(gAudioCmdBuffers[0], &writtenCmds, samples, num_samples);
gAudioRandom = ((gAudioRandom + gAudioFrameCount) * gAudioFrameCount);
@ -70,7 +72,8 @@ void eu_process_audio_cmd(struct EuAudioCmd *cmd) {
case 0x82:
case 0x88:
load_sequence(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
func_8031D690(cmd->u.s.arg1, cmd->u2.as_s32);
seq_player_fade_from_zero_volume(cmd->u.s.arg1, cmd->u2.as_s32);
//LOG_DEBUG("Playing sequence with arguments: %d, 0x%X, %d", cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
break;
case 0x83:
@ -107,8 +110,8 @@ void eu_process_audio_cmd(struct EuAudioCmd *cmd) {
const char undefportcmd[] = "Undefined Port Command %d\n";
extern OSMesgQueue *OSMesgQueues[];
extern u8 D_EU_80302010;
extern u8 D_EU_80302014;
extern u8 gQueuedAudioCmdCount;
extern u8 gLastQueuedAudioCmdCount;
extern OSMesg OSMesg0;
extern OSMesg OSMesg1;
extern OSMesg OSMesg2;
@ -119,14 +122,14 @@ void seq_player_fade_to_zero_volume(s32 player, FadeT fadeOutTime) {
fadeOutTime = 1;
}
gSequencePlayers[player].fadeVelocity = -(gSequencePlayers[player].fadeVolume / fadeOutTime);
gSequencePlayers[player].state = 2;
gSequencePlayers[player].state = 2; // These are reversed compared to USA, Which is 2 for a fade in and 1 for a fade out.
gSequencePlayers[player].fadeRemainingFrames = fadeOutTime;
}
void func_8031D690(s32 player, FadeT fadeInTime) {
void seq_player_fade_from_zero_volume(s32 player, FadeT fadeInTime) {
if (fadeInTime != 0) {
gSequencePlayers[player].state = 1;
gSequencePlayers[player].state = 1; // These are reversed compared to USA, Which is 2 for a fade in and 1 for a fade out.
gSequencePlayers[player].fadeTimerUnkEu = fadeInTime;
gSequencePlayers[player].fadeRemainingFrames = fadeInTime;
gSequencePlayers[player].fadeVolume = 0.0f;
@ -135,42 +138,42 @@ void func_8031D690(s32 player, FadeT fadeInTime) {
}
void port_eu_init_queues(void) {
D_EU_80302010 = 0;
D_EU_80302014 = 0;
gQueuedAudioCmdCount = 0;
gLastQueuedAudioCmdCount = 0;
osCreateMesgQueue(OSMesgQueues[0], &OSMesg0, 1);
osCreateMesgQueue(OSMesgQueues[1], &OSMesg1, 4);
osCreateMesgQueue(OSMesgQueues[2], &OSMesg2, 1);
osCreateMesgQueue(OSMesgQueues[3], &OSMesg3, 1);
}
void func_802ad6f0(s32 arg0, s32 *arg1) {
struct EuAudioCmd *cmd = &sAudioCmd[D_EU_80302010 & 0xff];
void queue_audio_cmd(s32 arg0, s32 *arg1) {
struct EuAudioCmd *cmd = &sAudioCmd[gQueuedAudioCmdCount & 0xff];
cmd->u.first = arg0;
cmd->u2.as_u32 = *arg1;
D_EU_80302010++;
gQueuedAudioCmdCount++;
}
void func_802ad728(u32 arg0, f32 arg1) {
func_802ad6f0(arg0, (s32*) &arg1);
void queue_audio_cmd_f32(u32 arg0, f32 arg1) {
queue_audio_cmd(arg0, (s32*) &arg1);
}
void func_802ad74c(u32 arg0, u32 arg1) {
func_802ad6f0(arg0, (s32*) &arg1);
void queue_audio_cmd_u32(u32 arg0, u32 arg1) {
queue_audio_cmd(arg0, (s32*) &arg1);
}
void func_802ad770(u32 arg0, s8 arg1) {
void queue_audio_cmd_s8(u32 arg0, s8 arg1) {
s32 sp1C = arg1 << 24;
func_802ad6f0(arg0, &sp1C);
queue_audio_cmd(arg0, &sp1C);
}
void func_802ad7a0(void) {
void send_process_queued_audio_cmds(void) {
osSendMesg(OSMesgQueues[1],
(OSMesg)(u32)((D_EU_80302014 & 0xff) << 8 | (D_EU_80302010 & 0xff)),
(OSMesg)(u32)((gLastQueuedAudioCmdCount & 0xff) << 8 | (gQueuedAudioCmdCount & 0xff)),
OS_MESG_NOBLOCK);
D_EU_80302014 = D_EU_80302010;
gLastQueuedAudioCmdCount = gQueuedAudioCmdCount;
}
void func_802ad7ec(u32 arg0) {
void process_queued_audio_cmds(u32 arg0) {
struct EuAudioCmd *cmd;
struct SequencePlayer *seqPlayer;
struct SequenceChannel *chan;

View file

@ -259,7 +259,7 @@ void func_sh_802f6330(void) {
}
extern struct EuAudioCmd sAudioCmd[0x100]; // sAudioCmd, maybe?
void func_802ad6f0(s32 arg0, s32 *arg1) { // func_sh_802f63f8
void queue_audio_cmd(s32 arg0, s32 *arg1) { // func_sh_802f63f8
struct EuAudioCmd *cmd = &sAudioCmd[D_SH_80350F18 & 0xff];
cmd->u.first = arg0;
cmd->u2.as_u32 = *arg1;
@ -269,17 +269,17 @@ void func_802ad6f0(s32 arg0, s32 *arg1) { // func_sh_802f63f8
}
}
void func_802ad728(u32 arg0, f32 arg1) { // func_sh_802f6450
func_802ad6f0(arg0, (s32 *) &arg1);
void queue_audio_cmd_f32(u32 arg0, f32 arg1) { // func_sh_802f6450
queue_audio_cmd(arg0, (s32 *) &arg1);
}
void func_802ad74c(u32 arg0, u32 arg1) { // func_sh_802f6474
func_802ad6f0(arg0, (s32 *) &arg1);
void queue_audio_cmd_u32(u32 arg0, u32 arg1) { // func_sh_802f6474
queue_audio_cmd(arg0, (s32 *) &arg1);
}
void func_802ad770(u32 arg0, s8 arg1) { // func_sh_802f6498
void queue_audio_cmd_s8(u32 arg0, s8 arg1) { // func_sh_802f6498
s32 sp1C = arg1 << 24;
func_802ad6f0(arg0, &sp1C);
queue_audio_cmd(arg0, &sp1C);
}
char shindouDebugPrint133[] = "AudioSend: %d -> %d (%d)\n";

View file

@ -51,8 +51,10 @@ void bhv_camera_lakitu_init(void) {
sync_object_init_field(o, &o->oCameraLakituSpeed);
sync_object_init_field(o, &o->oCameraLakituCircleRadius);
sync_object_init_field(o, &o->oCameraLakituFinishedDialog);
sync_object_init_field(o, &o->oCameraLakituUnk104);
sync_object_init_field(o, &o->oCameraLakituPitchVel);
#ifndef VERSION_JP
sync_object_init_field(o, &o->oCameraLakituUnk104);
#endif
}
}
}

View file

@ -6560,7 +6560,7 @@ struct CutsceneSplinePoint sIntroPipeToDialogPosition[] = {
/**
* Describes the spline that the camera's focus follows, during the same part of the intro as the above.
*/
#ifdef VERSION_EU
/**#ifdef VERSION_EU
struct CutsceneSplinePoint sIntroPipeToDialogFocus[] = {
{ 0, 25, { -1248, 450, 4596 } }, { 1, 71, { -1258, 485, 4606 } }, { 2, 71, { -1379, 344, 4769 } },
{ 3, 22, { -1335, 366, 4815 } }, { 4, 23, { -1315, 370, 4450 } }, { 5, 40, { -1322, 333, 4591 } },
@ -6568,7 +6568,7 @@ struct CutsceneSplinePoint sIntroPipeToDialogFocus[] = {
{ 9, 21, { -1321, 346, 4098 } }, { 0, 0, { -1328, 385, 4354 } }, { 0, 0, { -1328, 385, 4354 } },
{ 0, 0, { -1328, 385, 4354 } }, { -1, 0, { -1328, 385, 4354 } }
};
#else
#else**/
struct CutsceneSplinePoint sIntroPipeToDialogFocus[] = {
{ 0, 20, { -1248, 450, 4596 } }, { 1, 59, { -1258, 485, 4606 } }, { 2, 59, { -1379, 344, 4769 } },
{ 3, 20, { -1335, 366, 4815 } }, { 4, 23, { -1315, 370, 4450 } }, { 5, 40, { -1322, 333, 4591 } },
@ -6576,7 +6576,7 @@ struct CutsceneSplinePoint sIntroPipeToDialogFocus[] = {
{ 9, 21, { -1321, 346, 4098 } }, { 0, 0, { -1328, 385, 4354 } }, { 0, 0, { -1328, 385, 4354 } },
{ 0, 0, { -1328, 385, 4354 } }, { -1, 0, { -1328, 385, 4354 } }
};
#endif
//#endif
struct CutsceneSplinePoint sEndingFlyToWindowPos[] = {
{ 0, 0, { -86, 876, 640 } }, { 1, 0, { -86, 876, 610 } }, { 2, 0, { -66, 945, 393 } },
@ -6621,11 +6621,11 @@ struct CutsceneSplinePoint sEndingLookUpAtCastle[] = {
};
struct CutsceneSplinePoint sEndingLookAtSkyFocus[] = {
#ifdef VERSION_EU
{ 0, 50, { 484, 1368, -868 } }, { 0, 72, { 479, 1372, -872 } }, { 0, 50, { 351, 1817, -918 } },
#else
//#ifdef VERSION_EU
// { 0, 50, { 484, 1368, -868 } }, { 0, 72, { 479, 1372, -872 } }, { 0, 50, { 351, 1817, -918 } },
//#else
{ 0, 50, { 484, 1368, -888 } }, { 0, 72, { 479, 1372, -892 } }, { 0, 50, { 351, 1817, -918 } },
#endif
//#endif
{ 0, 50, { 351, 1922, -598 } }, { 0, 0, { 636, 2027, -415 } }, { 0, 0, { 636, 2027, -415 } },
{ -1, 0, { 636, 2027, -415 } }
};
@ -7543,15 +7543,15 @@ BAD_RETURN(s32) cutscene_ending_look_up_at_castle(UNUSED struct Camera *c) {
BAD_RETURN(s32) cutscene_ending_peach_wakeup(struct Camera *c) {
cutscene_event(cutscene_ending_reset_spline, c, 0, 0);
cutscene_event(cutscene_ending_look_up_at_castle, c, 0, 0);
#ifdef VERSION_EU
/**#ifdef VERSION_EU
cutscene_event(cutscene_ending_look_up_at_castle, c, 265, -1);
cutscene_spawn_obj(7, 315);
cutscene_spawn_obj(9, 355);
#else
#else**/
cutscene_event(cutscene_ending_look_up_at_castle, c, 250, -1);
cutscene_spawn_obj(7, 300);
cutscene_spawn_obj(9, 340);
#endif
//#endif
vec3f_set(c->pos, -163.f, 978.f, -1082.f);
player2_rotate_cam(c, -0x800, 0x2000, -0x2000, 0x2000);
}
@ -7595,11 +7595,11 @@ BAD_RETURN(s32) cutscene_ending_kiss_here_we_go(struct Camera *c) {
*/
BAD_RETURN(s32) cutscene_ending_kiss(struct Camera *c) {
cutscene_event(cutscene_ending_kiss_closeup, c, 0, 0);
#ifdef VERSION_EU
/**#ifdef VERSION_EU
cutscene_event(cutscene_ending_kiss_here_we_go, c, 185, -1);
#else
#else**/
cutscene_event(cutscene_ending_kiss_here_we_go, c, 155, -1);
#endif
//#endif
player2_rotate_cam(c, -0x800, 0x2000, -0x2000, 0x2000);
}
@ -9779,16 +9779,17 @@ BAD_RETURN(s32) cutscene_intro_peach_fly_to_pipe(struct Camera *c) {
#if defined(VERSION_US) || defined(VERSION_SH)
cutscene_event(play_sound_intro_turn_on_hud, c, 818, 818);
#elif defined(VERSION_EU)
cutscene_event(play_sound_intro_turn_on_hud, c, 673, 673);
//cutscene_event(play_sound_intro_turn_on_hud, c, 673, 673);
cutscene_event(play_sound_intro_turn_on_hud, c, 818, 818);
#endif
cutscene_spawn_obj(6, 1);
cutscene_event(cutscene_intro_peach_start_flying_music, c, 0, 0);
cutscene_event(cutscene_intro_peach_start_to_pipe_spline, c, 0, -1);
#ifdef VERSION_EU
/**#ifdef VERSION_EU
cutscene_event(cutscene_intro_peach_clear_cutscene_status, c, 572, 572);
#else
#else**/
cutscene_event(cutscene_intro_peach_clear_cutscene_status, c, 717, 717);
#endif
//#endif
clamp_pitch(c->pos, c->focus, 0x3B00, -0x3B00);
sCutsceneVars[1].point[1] = 400.f;
}
@ -10571,7 +10572,7 @@ BAD_RETURN(s32) cutscene_door_mode(struct Camera *c) {
struct Cutscene sCutsceneEnding[] = {
{ cutscene_ending_mario_fall, 170 },
{ cutscene_ending_mario_land, 70 },
#ifdef VERSION_EU
/**#ifdef VERSION_EU
{ cutscene_ending_mario_land_closeup, 0x44 },
{ cutscene_ending_stars_free_peach, 0x15c },
{ cutscene_ending_peach_appears, 0x6d },
@ -10580,7 +10581,7 @@ struct Cutscene sCutsceneEnding[] = {
{ cutscene_ending_peach_wakeup, 0x1a4 },
{ cutscene_ending_dialog, 0x114 },
{ cutscene_ending_kiss, 0x10b },
#else
#else**/
{ cutscene_ending_mario_land_closeup, 75 },
#ifdef VERSION_SH
{ cutscene_ending_stars_free_peach, 431 },
@ -10598,7 +10599,7 @@ struct Cutscene sCutsceneEnding[] = {
{ cutscene_ending_dialog, 236 },
#endif
{ cutscene_ending_kiss, 245 },
#endif
//#endif
{ cutscene_ending_cake_for_mario, CUTSCENE_LOOP },
{ cutscene_ending_stop, 0 }
};
@ -10742,11 +10743,11 @@ struct Cutscene sCutsceneUnusedExit[] = {
struct Cutscene sCutsceneIntroPeach[] = {
{ cutscene_intro_peach_letter, CUTSCENE_LOOP },
{ cutscene_intro_peach_reset_fov, 35 },
#ifdef VERSION_EU
{ cutscene_intro_peach_fly_to_pipe, 675 },
#else
//#ifdef VERSION_EU
// { cutscene_intro_peach_fly_to_pipe, 675 },
//#else
{ cutscene_intro_peach_fly_to_pipe, 820 },
#endif
//#endif
{ cutscene_intro_peach_mario_appears, 270 },
{ cutscene_intro_peach_dialog, CUTSCENE_LOOP }
};

View file

@ -514,6 +514,9 @@ void str_ascii_to_dialog(const char* string, u8* dialog, u16 length) {
}
f32 get_generic_dialog_width(u8* dialog) {
#ifdef VERSION_JP
return 0;
#else
f32 largestWidth = 0;
f32 width = 0;
u8* d = dialog;
@ -528,6 +531,7 @@ f32 get_generic_dialog_width(u8* dialog) {
d++;
}
return largestWidth;
#endif
}
f32 get_generic_ascii_string_width(const char* ascii) {
@ -2881,9 +2885,11 @@ static u32 pause_castle_get_stars(s32 index) {
static void render_pause_castle_course_name(const u8 *courseName, s16 x, s16 y) {
s16 width = 0;
#ifndef VERSION_JP
for (const u8 *c = courseName; *c != DIALOG_CHAR_TERMINATOR; c++) {
width += gDialogCharWidths[*c];
}
#endif
print_generic_string(x - width / 2, y, courseName);
}
@ -2985,10 +2991,28 @@ void render_pause_castle_main_strings_extended(s16 x, s16 y) {
gSPDisplayList(gDisplayListHead++, dl_ia_text_begin);
gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha);
void **courseNameTbl = NULL;
#ifdef VERSION_EU
switch (gInGameLanguage) {
case LANGUAGE_ENGLISH:
courseNameTbl = segmented_to_virtual(course_name_table_eu_en);
break;
case LANGUAGE_FRENCH:
courseNameTbl = segmented_to_virtual(course_name_table_eu_fr);
break;
case LANGUAGE_GERMAN:
courseNameTbl = segmented_to_virtual(course_name_table_eu_de);
break;
}
#else
courseNameTbl = segmented_to_virtual(seg2_course_name_table);
#endif
// Main courses (0-14)
if (gDialogLineNum < COURSE_STAGES_COUNT) {
const u8 *courseName = seg2_course_name_table[gDialogLineNum];
const u8 *courseName = courseNameTbl[gDialogLineNum];
const u8 textCoin[] = { TEXT_COIN_X };
u8 textCoinCount[8];
render_pause_castle_course_name(courseName, 160, y + 30);
@ -3000,14 +3024,14 @@ void render_pause_castle_main_strings_extended(s16 x, s16 y) {
// Secret courses (15-24)
else if (gDialogLineNum >= COURSE_STAGES_COUNT && gDialogLineNum < INDEX_CASTLE_STARS) {
const u8 *courseName = seg2_course_name_table[gDialogLineNum];
const u8 *courseName = courseNameTbl[gDialogLineNum];
render_pause_castle_course_name(courseName + 3, 160, y + 30);
render_pause_castle_course_stars_extended(x + 20, y);
}
// Castle stars (25)
else if (gDialogLineNum == INDEX_CASTLE_STARS) {
const u8 *courseName = seg2_course_name_table[COURSE_MAX];
const u8 *courseName = courseNameTbl[COURSE_MAX];
const u8 textStar[] = { TEXT_STAR_X };
u8 textStarCount[8];
render_pause_castle_course_name(courseName + 3, 160, y + 30);
@ -3409,24 +3433,24 @@ void render_save_confirmation(s16 x, s16 y, s8 *index, s16 sp6e)
#endif
{
#ifdef VERSION_EU
u8 textSaveAndContinueArr[][24] = {
u8 textSaveAndContinueArr[][30] = {
{ TEXT_SAVE_AND_CONTINUE },
{ TEXT_SAVE_AND_CONTINUE_FR },
{ TEXT_SAVE_AND_CONTINUE_DE }
};
u8 textSaveAndQuitArr[][22] = {
u8 textSaveAndQuitArr[][30] = {
{ TEXT_SAVE_AND_QUIT },
{ TEXT_SAVE_AND_QUIT_FR },
{ TEXT_SAVE_AND_QUIT_DE }
};
u8 textSaveExitGame[][26] = { // New function to exit game
u8 textSaveExitGame[][30] = { // New function to exit game
{ TEXT_SAVE_EXIT_GAME },
{ TEXT_SAVE_EXIT_GAME_FR },
{ TEXT_SAVE_EXIT_GAME_DE }
};
u8 textContinueWithoutSaveArr[][27] = {
u8 textContinueWithoutSaveArr[][30] = {
{ TEXT_CONTINUE_WITHOUT_SAVING },
{ TEXT_CONTINUE_WITHOUT_SAVING_FR },
{ TEXT_CONTINUE_WITHOUT_SAVING_DE }

View file

@ -6,16 +6,13 @@
#include "game/memory.h"
#include "level_info.h"
#include "level_table.h"
#include "save_file.h"
#include "types.h"
#include "pc/lua/utils/smlua_level_utils.h"
#ifdef VERSION_EU
extern u8 *course_name_table_eu_en[];
extern u8 *course_name_table_eu_fr[];
extern u8 *course_name_table_eu_de[];
extern u8 *act_name_table_eu_en[];
extern u8 *act_name_table_eu_fr[];
extern u8 *act_name_table_eu_de[];
extern s32 gInGameLanguage;
#include "eu_translation.h"
#else
extern u8 *seg2_course_name_table[];
extern u8 *seg2_act_name_table[];

View file

@ -278,7 +278,7 @@ void fade_into_special_warp(u32 arg, u32 color) {
fadeout_music(190);
play_transition(WARP_TRANSITION_FADE_INTO_COLOR, 0x10, color, color, color);
level_set_transition(30, NULL);
level_set_transition(16, NULL);
warp_special(arg);
}

View file

@ -1880,7 +1880,8 @@ static void intro_cutscene_hide_hud_and_mario(struct MarioState *m) {
}
#ifdef VERSION_EU
#define TIMER_SPAWN_PIPE 47
//#define TIMER_SPAWN_PIPE 47
#define TIMER_SPAWN_PIPE 37
#else
#define TIMER_SPAWN_PIPE 37
#endif
@ -1900,7 +1901,8 @@ static void intro_cutscene_peach_lakitu_scene(struct MarioState *m) {
#undef TIMER_SPAWN_PIPE
#ifdef VERSION_EU
#define TIMER_RAISE_PIPE 28
//#define TIMER_RAISE_PIPE 28
#define TIMER_RAISE_PIPE 38
#else
#define TIMER_RAISE_PIPE 38
#endif
@ -2317,8 +2319,10 @@ static void end_peach_cutscene_summon_jumbo_star(struct MarioState *m) {
}
#if defined(VERSION_EU)
#define TIMER_FADE_IN_PEACH 201
#define TIMER_DESCEND_PEACH 280
//#define TIMER_FADE_IN_PEACH 201
//#define TIMER_DESCEND_PEACH 280
#define TIMER_FADE_IN_PEACH 276
#define TIMER_DESCEND_PEACH 355
#elif defined(VERSION_SH)
#define TIMER_FADE_IN_PEACH 276
#define TIMER_DESCEND_PEACH 400
@ -2380,7 +2384,8 @@ static void end_peach_cutscene_spawn_peach(struct MarioState *m) {
}
#ifdef VERSION_EU
#define TIMER_RUN_TO_PEACH 531
//#define TIMER_RUN_TO_PEACH 531
#define TIMER_RUN_TO_PEACH 584
#else
#define TIMER_RUN_TO_PEACH 584
#endif
@ -2532,8 +2537,10 @@ static void end_peach_cutscene_dialog_1(struct MarioState *m) {
}
#if defined(VERSION_EU)
#define TIMER_SOMETHING_SPECIAL 150
#define TIMER_PEACH_KISS 260
//#define TIMER_SOMETHING_SPECIAL 150
//#define TIMER_PEACH_KISS 260
#define TIMER_SOMETHING_SPECIAL 130
#define TIMER_PEACH_KISS 200
#elif defined(VERSION_SH)
#define TIMER_SOMETHING_SPECIAL 170
#define TIMER_PEACH_KISS 250
@ -2848,9 +2855,12 @@ static s32 act_end_peach_cutscene(struct MarioState *m) {
}
#if defined(VERSION_EU)
#define TIMER_CREDITS_SHOW 51
#define TIMER_CREDITS_PROGRESS 80
#define TIMER_CREDITS_WARP 160
//#define TIMER_CREDITS_SHOW 51
//#define TIMER_CREDITS_PROGRESS 80
//#define TIMER_CREDITS_WARP 160
#define TIMER_CREDITS_SHOW 61
#define TIMER_CREDITS_PROGRESS 90
#define TIMER_CREDITS_WARP 200
#elif defined(VERSION_SH)
#define TIMER_CREDITS_SHOW 61
#define TIMER_CREDITS_PROGRESS 90

View file

@ -134,7 +134,7 @@ void *main_pool_alloc(u32 size, u32 side) {
}
}
if (addr == NULL) {
LOG_ERROR("Main pool alloc failed!");
LOG_ERROR("Main pool failed to allocate memory of size 0x%X on side %d.", size, side);
}
return addr;
}
@ -182,7 +182,7 @@ void *main_pool_realloc(void *addr, u32 size) {
newAddr = main_pool_alloc(size, MEMORY_POOL_LEFT);
}
if (addr == NULL) {
LOG_ERROR("Main pool realloc failed!");
LOG_ERROR("Main pool failed to reallocate memory of size 0x%X at %p!", size, addr);
}
return newAddr;
}
@ -267,7 +267,7 @@ struct AllocOnlyPool *alloc_only_pool_init(u32 size, u32 side) {
subPool->freePtr = (u8 *) addr + sizeof(struct AllocOnlyPool);
}
if (addr == NULL) {
LOG_ERROR("Alloc only pool init failed!");
LOG_ERROR("Allocate only pool failed to initalize memory of size 0x%X on side %d.", size, side);
}
return subPool;
}
@ -286,7 +286,7 @@ void *alloc_only_pool_alloc(struct AllocOnlyPool *pool, s32 size) {
pool->usedSpace += size;
}
if (addr == NULL) {
LOG_ERROR("Alloc only pool alloc failed!");
LOG_ERROR("Allocate only pool failed to allocate memory of size 0x%X on at pool %p.", size, pool);
}
return addr;
}
@ -306,7 +306,7 @@ struct AllocOnlyPool *alloc_only_pool_resize(struct AllocOnlyPool *pool, u32 siz
pool->totalSpace = size;
}
if (newPool == NULL) {
LOG_ERROR("Alloc only pool realloc failed!");
LOG_ERROR("Allocate only pool failed to reallocate memory of size 0x%X on at pool %p.", size, pool);
}
return newPool;
}
@ -335,7 +335,7 @@ struct MemoryPool *mem_pool_init(u32 size, u32 side) {
block->size = pool->totalSpace;
}
if (addr == NULL) {
LOG_ERROR("Mem pool init failed!");
LOG_ERROR("Memory pool failed to initalize memory of size 0x%X on side %d.", size, side);
}
return pool;
}
@ -365,7 +365,7 @@ void *mem_pool_alloc(struct MemoryPool *pool, u32 size) {
freeBlock = freeBlock->next;
}
if (addr == NULL) {
LOG_ERROR("Mem pool alloc failed!");
LOG_ERROR("Memory pool failed to allocate memory of size 0x%X on at pool %p.", size, pool);
}
return addr;
}
@ -420,7 +420,7 @@ void *alloc_display_list(u32 size) {
gGfxPoolEnd -= size;
ptr = gGfxPoolEnd;
} else {
LOG_ERROR("Failed to alloc display list!");
LOG_ERROR("Failed to allocate display list of size 0x%X!", size);
}
return ptr;
}

View file

@ -15,6 +15,7 @@
#include "sm64.h"
#include "sound_init.h"
#include "rumble_init.h"
#include "pc/debuglog.h"
#define MUSIC_NONE 0xFFFF

View file

@ -1120,7 +1120,9 @@ static struct LuaObjectField sObjectFields[LUA_OBJECT_FIELD_COUNT] = {
{ "oCameraLakituFinishedDialog", LVT_S32, offsetof(struct Object, oCameraLakituFinishedDialog), false, LOT_NONE },
{ "oCameraLakituPitchVel", LVT_S16, offsetof(struct Object, oCameraLakituPitchVel), false, LOT_NONE },
{ "oCameraLakituSpeed", LVT_F32, offsetof(struct Object, oCameraLakituSpeed), false, LOT_NONE },
#ifndef VERSION_JP
{ "oCameraLakituUnk104", LVT_S32, offsetof(struct Object, oCameraLakituUnk104), false, LOT_NONE },
#endif
{ "oCameraLakituYawVel", LVT_S16, offsetof(struct Object, oCameraLakituYawVel), false, LOT_NONE },
{ "oCannonBarrelBubblesUnkF4", LVT_F32, offsetof(struct Object, oCannonBarrelBubblesUnkF4), false, LOT_NONE },
{ "oCannonPlayerIndex", LVT_S32, offsetof(struct Object, oCannonPlayerIndex), false, LOT_NONE },
@ -1160,7 +1162,9 @@ static struct LuaObjectField sObjectFields[LUA_OBJECT_FIELD_COUNT] = {
{ "oCloudFwooshMovementRadius", LVT_S16, offsetof(struct Object, oCloudFwooshMovementRadius), false, LOT_NONE },
{ "oCloudGrowSpeed", LVT_F32, offsetof(struct Object, oCloudGrowSpeed), false, LOT_NONE },
{ "oCoinUnk110", LVT_F32, offsetof(struct Object, oCoinUnk110), false, LOT_NONE },
#ifndef VERSION_JP
{ "oCoinUnk1B0", LVT_S32, offsetof(struct Object, oCoinUnk1B0), false, LOT_NONE },
#endif
{ "oCoinUnkF4", LVT_S32, offsetof(struct Object, oCoinUnkF4), false, LOT_NONE },
{ "oCoinUnkF8", LVT_S32, offsetof(struct Object, oCoinUnkF8), false, LOT_NONE },
{ "oCollisionDistance", LVT_F32, offsetof(struct Object, oCollisionDistance), false, LOT_NONE },

View file

@ -10,6 +10,7 @@ char gSmluaConstants[] = ""
" return a['_pointer'] == b['_pointer'] and a['_lot'] == b['_lot'] and a['_pointer'] ~= nil and a['_lot'] ~= nil\n"
" end\n"
"}\n"
"\n"
"_CPointer = {\n"
" __index = function (t,k)\n"
" return nil\n"
@ -23,6 +24,7 @@ char gSmluaConstants[] = ""
" return a['_pointer'] == b['_pointer'] and a['_pointer'] ~= nil and a['_lvt'] ~= nil\n"
" end\n"
"}\n"
"\n"
"_SyncTable = {\n"
" __index = function (t,k)\n"
" local _table = rawget(t, '_table')\n"
@ -34,6 +36,7 @@ char gSmluaConstants[] = ""
" _set_sync_table_field(t, k, v)\n"
" end\n"
"}\n"
"\n"
"_ReadOnlyTable = {\n"
" __index = function (t,k)\n"
" local _table = rawget(t, '_table')\n"
@ -42,6 +45,7 @@ char gSmluaConstants[] = ""
" __newindex = function (t,k,v)\n"
" end\n"
"}\n"
"\n"
"--- @param dest Vec3f\n"
"--- @param src Vec3f\n"
"--- @return Vec3f\n"
@ -51,6 +55,7 @@ char gSmluaConstants[] = ""
" dest.z = src.z\n"
" return dest\n"
"end\n"
"\n"
"--- @param dest Vec3f\n"
"--- @param x number\n"
"--- @param y number\n"
@ -62,6 +67,7 @@ char gSmluaConstants[] = ""
" dest.z = z\n"
" return dest\n"
"end\n"
"\n"
"--- @param dest Vec3f\n"
"--- @param a Vec3f\n"
"--- @return Vec3f\n"
@ -71,6 +77,7 @@ char gSmluaConstants[] = ""
" dest.z = dest.z + a.z\n"
" return dest\n"
"end\n"
"\n"
"--- @param dest Vec3f\n"
"--- @param a Vec3f\n"
"--- @param b Vec3f\n"
@ -81,6 +88,7 @@ char gSmluaConstants[] = ""
" dest.z = a.z + b.z\n"
" return dest\n"
"end\n"
"\n"
"--- @param dest Vec3f\n"
"--- @param a number\n"
"--- @return Vec3f\n"
@ -90,6 +98,7 @@ char gSmluaConstants[] = ""
" dest.z = dest.z * a\n"
" return dest\n"
"end\n"
"\n"
"--- @param dest Vec3f\n"
"--- @return Vec3f\n"
"function vec3f_normalize(dest)\n"
@ -97,23 +106,28 @@ char gSmluaConstants[] = ""
" if divisor == 0 then\n"
" return dest\n"
" end\n"
"\n"
" local invsqrt = 1.0 / divisor\n"
" dest.x = dest.x * invsqrt\n"
" dest.y = dest.y * invsqrt\n"
" dest.z = dest.z * invsqrt\n"
"\n"
" return dest\n"
"end\n"
"\n"
"--- @param a Vec3f\n"
"--- @return number\n"
"function vec3f_length(a)\n"
" return math.sqrt(a.x * a.x + a.y * a.y + a.z * a.z)\n"
"end\n"
"\n"
"--- @param a Vec3f\n"
"--- @param b Vec3f\n"
"--- @return number\n"
"function vec3f_dot(a, b)\n"
" return a.x * b.x + a.y * b.y + a.z * b.z\n"
"end\n"
"\n"
"--- @param vec Vec3f\n"
"--- @param onto Vec3f\n"
"--- @return Vec3f\n"
@ -125,6 +139,7 @@ char gSmluaConstants[] = ""
" vec3f_mul(out, numerator / denominator)\n"
" return out\n"
"end\n"
"\n"
"--- @param v1 Vec3f\n"
"--- @param v2 Vec3f\n"
"--- @return number\n"
@ -134,6 +149,7 @@ char gSmluaConstants[] = ""
" dz = v1.z - v2.z\n"
" return math.sqrt(dx * dx + dy * dy + dz * dz)\n"
"end\n"
"\n"
"--- @param dest Vec3s\n"
"--- @param src Vec3s\n"
"--- @return Vec3s\n"
@ -143,6 +159,7 @@ char gSmluaConstants[] = ""
" dest.z = src.z\n"
" return dest\n"
"end\n"
"\n"
"--- @param dest Vec3s\n"
"--- @param x number\n"
"--- @param y number\n"
@ -154,6 +171,7 @@ char gSmluaConstants[] = ""
" dest.z = z\n"
" return dest\n"
"end\n"
"\n"
"--- @param dest Vec3s\n"
"--- @param a Vec3s\n"
"--- @return Vec3s\n"
@ -163,6 +181,7 @@ char gSmluaConstants[] = ""
" dest.z = dest.z + a.z\n"
" return dest\n"
"end\n"
"\n"
"--- @param dest Vec3s\n"
"--- @param a Vec3s\n"
"--- @param b Vec3s\n"
@ -173,6 +192,7 @@ char gSmluaConstants[] = ""
" dest.z = a.z + b.z\n"
" return dest\n"
"end\n"
"\n"
"--- @param dest Vec3s\n"
"--- @param a number\n"
"--- @return Vec3s\n"
@ -182,6 +202,7 @@ char gSmluaConstants[] = ""
" dest.z = dest.z * a\n"
" return dest\n"
"end\n"
"\n"
"--- @param v1 Vec3s\n"
"--- @param v2 Vec3s\n"
"--- @return number\n"
@ -191,6 +212,7 @@ char gSmluaConstants[] = ""
" dz = v1.z - v2.z\n"
" return math.sqrt(dx * dx + dy * dy + dz * dz)\n"
"end\n"
"\n"
"--- @param current number\n"
"--- @param target number\n"
"--- @param inc number\n"
@ -210,6 +232,7 @@ char gSmluaConstants[] = ""
" end\n"
" return current;\n"
"end\n"
"\n"
"--- @param current number\n"
"--- @param target number\n"
"--- @param inc number\n"
@ -227,6 +250,7 @@ char gSmluaConstants[] = ""
" current = target\n"
" end\n"
" end\n"
"\n"
" -- keep within 32 bits\n"
" if current > 2147483647 then\n"
" current = -2147483648 + (current - 2147483647)\n"
@ -235,6 +259,7 @@ char gSmluaConstants[] = ""
" end\n"
" return current;\n"
"end\n"
"\n"
"--- @param bank number\n"
"--- @param soundID number\n"
"--- @param priority number\n"
@ -244,9 +269,11 @@ char gSmluaConstants[] = ""
" if flags == nil then flags = 0 end\n"
" return (bank << 28) | (soundID << 16) | (priority << 8) | flags | SOUND_STATUS_WAITING\n"
"end\n"
"\n"
"-------------\n"
"-- courses --\n"
"-------------\n"
"\n"
"--- @type integer\n"
"COURSE_NONE = 0\n"
"--- @type integer\n"

View file

@ -5298,6 +5298,7 @@ int smlua_func_bhv_platform_on_track_update(UNUSED lua_State* L) {
return 1;
}
#ifndef VERSION_JP
int smlua_func_bhv_play_music_track_when_touched_loop(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
@ -5312,6 +5313,7 @@ int smlua_func_bhv_play_music_track_when_touched_loop(UNUSED lua_State* L) {
return 1;
}
#endif
int smlua_func_bhv_pokey_body_part_update(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
@ -14171,6 +14173,7 @@ int smlua_func_play_flip_sounds(lua_State* L) {
return 1;
}
#ifndef VERSION_JP
int smlua_func_play_knockback_sound(lua_State* L) {
if (L == NULL) { return 0; }
@ -14188,6 +14191,7 @@ int smlua_func_play_knockback_sound(lua_State* L) {
return 1;
}
#endif
int smlua_func_should_get_stuck_in_ground(lua_State* L) {
if (L == NULL) { return 0; }
@ -22913,6 +22917,7 @@ int smlua_func_cur_obj_spawn_particles(lua_State* L) {
return 1;
}
#ifndef VERSION_JP
int smlua_func_cur_obj_spawn_star_at_y_offset(lua_State* L) {
if (L == NULL) { return 0; }
@ -22936,6 +22941,7 @@ int smlua_func_cur_obj_spawn_star_at_y_offset(lua_State* L) {
return 1;
}
#endif
int smlua_func_cur_obj_start_cam_event(lua_State* L) {
if (L == NULL) { return 0; }
@ -29704,7 +29710,9 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "bhv_platform_normals_init", smlua_func_bhv_platform_normals_init);
smlua_bind_function(L, "bhv_platform_on_track_init", smlua_func_bhv_platform_on_track_init);
smlua_bind_function(L, "bhv_platform_on_track_update", smlua_func_bhv_platform_on_track_update);
#ifndef VERSION_JP
smlua_bind_function(L, "bhv_play_music_track_when_touched_loop", smlua_func_bhv_play_music_track_when_touched_loop);
#endif
smlua_bind_function(L, "bhv_pokey_body_part_update", smlua_func_bhv_pokey_body_part_update);
smlua_bind_function(L, "bhv_pokey_update", smlua_func_bhv_pokey_update);
smlua_bind_function(L, "bhv_pole_base_loop", smlua_func_bhv_pole_base_loop);
@ -30203,7 +30211,9 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "mario_execute_airborne_action", smlua_func_mario_execute_airborne_action);
smlua_bind_function(L, "play_far_fall_sound", smlua_func_play_far_fall_sound);
smlua_bind_function(L, "play_flip_sounds", smlua_func_play_flip_sounds);
#ifndef VERSION_JP
smlua_bind_function(L, "play_knockback_sound", smlua_func_play_knockback_sound);
#endif
smlua_bind_function(L, "should_get_stuck_in_ground", smlua_func_should_get_stuck_in_ground);
smlua_bind_function(L, "update_air_with_turn", smlua_func_update_air_with_turn);
smlua_bind_function(L, "update_air_without_turn", smlua_func_update_air_without_turn);
@ -30607,7 +30617,9 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "cur_obj_spawn_loot_blue_coin", smlua_func_cur_obj_spawn_loot_blue_coin);
smlua_bind_function(L, "cur_obj_spawn_loot_coin_at_mario_pos", smlua_func_cur_obj_spawn_loot_coin_at_mario_pos);
smlua_bind_function(L, "cur_obj_spawn_particles", smlua_func_cur_obj_spawn_particles);
#ifndef VERSION_JP
smlua_bind_function(L, "cur_obj_spawn_star_at_y_offset", smlua_func_cur_obj_spawn_star_at_y_offset);
#endif
smlua_bind_function(L, "cur_obj_start_cam_event", smlua_func_cur_obj_start_cam_event);
smlua_bind_function(L, "cur_obj_unhide", smlua_func_cur_obj_unhide);
smlua_bind_function(L, "cur_obj_unrender_and_reset_state", smlua_func_cur_obj_unrender_and_reset_state);

View file

@ -1,4 +1,5 @@
#include "types.h"
#include "seq_ids.h"
#include "audio/external.h"
#include "game/camera.h"
#include "engine/math_util.h"
@ -45,7 +46,17 @@ static void smlua_audio_utils_reset(struct AudioOverride* override) {
void smlua_audio_utils_reset_all(void) {
audio_init();
for (s32 i = 0; i < MAX_AUDIO_OVERRIDE; i++) {
#ifdef VERSION_EU
if (sAudioOverrides[i].enabled) {
if (i >= SEQ_EVENT_CUTSCENE_LAKITU) {
sBackgroundMusicDefaultVolume[i] = 75;
return;
}
sBackgroundMusicDefaultVolume[i] = sBackgroundMusicDefaultVolumeDefault[i];
}
#else
if (sAudioOverrides[i].enabled) { sound_reset_background_music_default_volume(i); }
#endif
smlua_audio_utils_reset(&sAudioOverrides[i]);
}
}
@ -123,7 +134,11 @@ void smlua_audio_utils_replace_sequence(u8 sequenceId, u8 bankId, u8 defaultVolu
override->filename = strdup(file->cachedPath);
override->enabled = true;
override->bank = bankId;
#ifdef VERSION_EU
//sBackgroundMusicDefaultVolume[sequenceId] = defaultVolume;
#else
sound_set_background_music_default_volume(sequenceId, defaultVolume);
#endif
return;
}
}

View file

@ -3,8 +3,14 @@
#include "course_table.h"
#include "game/memory.h"
#include "game/ingame_menu.h"
#include "game/save_file.h"
#include "game/segment2.h"
#ifdef VERSION_EU
extern s32 gInGameLanguage;
#include "eu_translation.h"
#endif
static bool sReplacedDialog[DIALOG_COUNT] = { 0 };
static bool sReplacedCourseName[COURSE_COUNT+2] = { 0 };
static bool sReplacedActName[(COURSE_RR+2)*6] = { 0 };
@ -17,35 +23,93 @@ static u8* smlua_text_utils_convert(const char* str) {
}
void smlua_text_utils_reset_all(void) {
void **dialogTable = segmented_to_virtual(seg2_dialog_table);
void **dialogTable = NULL;
void **actNameTbl = NULL;
void **courseNameTbl = NULL;
void **dialogTableOrg = NULL;
void **actNameTblOrg = NULL;
void **courseNameTblOrg = NULL;
#ifdef VERSION_EU
switch (gInGameLanguage) {
case LANGUAGE_ENGLISH:
dialogTable = segmented_to_virtual(dialog_table_eu_en);
actNameTbl = segmented_to_virtual(act_name_table_eu_en);
courseNameTbl = segmented_to_virtual(course_name_table_eu_en);
dialogTableOrg = segmented_to_virtual(dialog_table_eu_en_original);
actNameTblOrg = segmented_to_virtual(act_name_table_eu_en_original);
courseNameTblOrg = segmented_to_virtual(course_name_table_eu_en_original);
break;
case LANGUAGE_FRENCH:
dialogTable = segmented_to_virtual(dialog_table_eu_fr);
actNameTbl = segmented_to_virtual(act_name_table_eu_fr);
courseNameTbl = segmented_to_virtual(course_name_table_eu_fr);
dialogTableOrg = segmented_to_virtual(dialog_table_eu_fr_original);
actNameTblOrg = segmented_to_virtual(act_name_table_eu_fr_original);
courseNameTblOrg = segmented_to_virtual(course_name_table_eu_fr_original);
break;
case LANGUAGE_GERMAN:
dialogTable = segmented_to_virtual(dialog_table_eu_de);
actNameTbl = segmented_to_virtual(act_name_table_eu_de);
courseNameTbl = segmented_to_virtual(course_name_table_eu_de);
dialogTableOrg = segmented_to_virtual(dialog_table_eu_de_original);
actNameTblOrg = segmented_to_virtual(act_name_table_eu_de_original);
courseNameTblOrg = segmented_to_virtual(course_name_table_eu_de_original);
break;
}
#else
dialogTable = segmented_to_virtual(seg2_dialog_table);
actNameTbl = segmented_to_virtual(seg2_act_name_table);
courseNameTbl = segmented_to_virtual(seg2_course_name_table);
dialogTableOrg = segmented_to_virtual(seg2_dialog_original);
actNameTblOrg = segmented_to_virtual(seg2_act_name_table_original);
courseNameTblOrg = segmented_to_virtual(seg2_course_name_table_original);
#endif
for (s32 i = 0; i < DIALOG_COUNT; i++) {
if (!sReplacedDialog[i]) { continue; }
struct DialogEntry *dialog = segmented_to_virtual(dialogTable[i]);
free((u8*)dialog->str);
dialog->str = seg2_dialog_original[i];
dialog->str = dialogTableOrg[i];
sReplacedDialog[i] = false;
}
for (s32 i = 0; i < COURSE_COUNT+2; i++) {
if (!sReplacedCourseName[i]) { continue; }
free((u8*)seg2_course_name_table[i]);
seg2_course_name_table[i] = seg2_course_name_table_original[i];
free((u8*)courseNameTbl[i]);
courseNameTbl[i] = segmented_to_virtual(courseNameTblOrg[i]);
sReplacedCourseName[i] = false;
}
for (s32 i = 0; i < (COURSE_RR+2)*6; i++) {
if (!sReplacedActName[i]) { continue; }
free((u8*)seg2_act_name_table[i]);
seg2_act_name_table[i] = seg2_act_name_table_original[i];
free((u8*)actNameTbl[i]);
actNameTbl[i] = segmented_to_virtual(actNameTblOrg[i]);
sReplacedActName[i] = false;
}
}
void smlua_text_utils_dialog_replace(enum DialogId dialogId, UNUSED u32 unused, s8 linesPerBox, s16 leftOffset, s16 width, const char* str) {
if (dialogId >= DIALOG_COUNT) { return; }
void **dialogTable = NULL;
#ifdef VERSION_EU
switch (gInGameLanguage) {
case LANGUAGE_ENGLISH:
dialogTable = segmented_to_virtual(dialog_table_eu_en);
break;
case LANGUAGE_FRENCH:
dialogTable = segmented_to_virtual(dialog_table_eu_fr);
break;
case LANGUAGE_GERMAN:
dialogTable = segmented_to_virtual(dialog_table_eu_de);
break;
}
#else
dialogTable = segmented_to_virtual(seg2_dialog_table);
#endif
void **dialogTable = segmented_to_virtual(seg2_dialog_table);
struct DialogEntry *dialog = segmented_to_virtual(dialogTable[dialogId]);
if (sReplacedDialog[dialogId]) {
@ -63,12 +127,35 @@ void smlua_text_utils_dialog_replace(enum DialogId dialogId, UNUSED u32 unused,
void smlua_text_utils_course_acts_replace(s16 courseNum, const char* courseName, const char* act1, const char* act2, const char* act3, const char* act4, const char* act5, const char* act6) {
if (courseNum <= 0 || courseNum > COURSE_RR) { return; }
s16 courseOffset = courseNum - 1;
void **actNameTbl = NULL;
void **courseNameTbl = NULL;
#ifdef VERSION_EU
switch (gInGameLanguage) {
case LANGUAGE_ENGLISH:
actNameTbl = segmented_to_virtual(act_name_table_eu_en);
courseNameTbl = segmented_to_virtual(course_name_table_eu_en);
break;
case LANGUAGE_FRENCH:
actNameTbl = segmented_to_virtual(act_name_table_eu_fr);
courseNameTbl = segmented_to_virtual(course_name_table_eu_fr);
break;
case LANGUAGE_GERMAN:
actNameTbl = segmented_to_virtual(act_name_table_eu_de);
courseNameTbl = segmented_to_virtual(course_name_table_eu_de);
break;
}
#else
actNameTbl = segmented_to_virtual(seg2_act_name_table);
courseNameTbl = segmented_to_virtual(seg2_course_name_table);
#endif
// replace course name
if (sReplacedCourseName[courseOffset]) {
free(seg2_course_name_table[courseOffset]);
free(courseNameTbl[courseOffset]);
}
seg2_course_name_table[courseOffset] = smlua_text_utils_convert(courseName);
courseNameTbl[courseOffset] = smlua_text_utils_convert(courseName);
sReplacedCourseName[courseOffset] = true;
// replace act names
@ -77,10 +164,10 @@ void smlua_text_utils_course_acts_replace(s16 courseNum, const char* courseName,
s32 index = (courseOffset * 6 + i);
if (sReplacedActName[index]) {
free(seg2_act_name_table[index]);
free(actNameTbl[index]);
}
seg2_act_name_table[index] = smlua_text_utils_convert(newActs[i]);
actNameTbl[index] = smlua_text_utils_convert(newActs[i]);
sReplacedActName[index] = true;
}
}
@ -88,35 +175,89 @@ void smlua_text_utils_course_acts_replace(s16 courseNum, const char* courseName,
void smlua_text_utils_secret_star_replace(s16 courseNum, const char* courseName) {
if (courseNum <= COURSE_RR || courseNum > COURSE_COUNT) { return; }
s16 courseOffset = courseNum - 1;
void **courseNameTbl = NULL;
#ifdef VERSION_EU
switch (gInGameLanguage) {
case LANGUAGE_ENGLISH:
courseNameTbl = segmented_to_virtual(course_name_table_eu_en);
break;
case LANGUAGE_FRENCH:
courseNameTbl = segmented_to_virtual(course_name_table_eu_fr);
break;
case LANGUAGE_GERMAN:
courseNameTbl = segmented_to_virtual(course_name_table_eu_de);
break;
}
#else
courseNameTbl = segmented_to_virtual(seg2_course_name_table);
#endif
if (sReplacedCourseName[courseOffset]) {
free(seg2_course_name_table[courseOffset]);
free(courseNameTbl[courseOffset]);
}
seg2_course_name_table[courseOffset] = smlua_text_utils_convert(courseName);
courseNameTbl[courseOffset] = smlua_text_utils_convert(courseName);
sReplacedCourseName[courseOffset] = true;
}
void smlua_text_utils_castle_secret_stars_replace(const char* name) {
s16 courseOffset = COURSE_COUNT;
void **courseNameTbl = NULL;
#ifdef VERSION_EU
switch (gInGameLanguage) {
case LANGUAGE_ENGLISH:
courseNameTbl = segmented_to_virtual(course_name_table_eu_en);
break;
case LANGUAGE_FRENCH:
courseNameTbl = segmented_to_virtual(course_name_table_eu_fr);
break;
case LANGUAGE_GERMAN:
courseNameTbl = segmented_to_virtual(course_name_table_eu_de);
break;
}
#else
courseNameTbl = segmented_to_virtual(seg2_course_name_table);
#endif
if (sReplacedCourseName[courseOffset]) {
free(seg2_course_name_table[courseOffset]);
free(courseNameTbl[courseOffset]);
}
seg2_course_name_table[courseOffset] = smlua_text_utils_convert(name);
courseNameTbl[courseOffset] = smlua_text_utils_convert(name);
sReplacedCourseName[courseOffset] = true;
}
void smlua_text_utils_extra_text_replace(s16 index, const char* text) {
if (index < 0 || index > 6) { return; }
index = (COURSE_RR * 6 + index);
void **actNameTbl = NULL;
#ifdef VERSION_EU
switch (gInGameLanguage) {
case LANGUAGE_ENGLISH:
actNameTbl = segmented_to_virtual(act_name_table_eu_en);
break;
case LANGUAGE_FRENCH:
actNameTbl = segmented_to_virtual(act_name_table_eu_fr);
break;
case LANGUAGE_GERMAN:
actNameTbl = segmented_to_virtual(act_name_table_eu_de);
break;
}
#else
actNameTbl = segmented_to_virtual(seg2_act_name_table);
#endif
if (sReplacedActName[index]) {
free(seg2_act_name_table[index]);
free(actNameTbl[index]);
}
seg2_act_name_table[index] = smlua_text_utils_convert(text);
actNameTbl[index] = smlua_text_utils_convert(text);
sReplacedActName[index] = true;
}

View file

@ -7,9 +7,9 @@ static char sLocalVersionString[MAX_LOCAL_VERSION_LENGTH] = { 0 };
char* get_version(void) {
if (MINOR_VERSION_NUMBER > 0) {
snprintf(sVersionString, MAX_VERSION_LENGTH, "%s %d.%d", VERSION_TEXT, VERSION_NUMBER, MINOR_VERSION_NUMBER);
snprintf(sVersionString, MAX_VERSION_LENGTH, "%s %d.%d %s", VERSION_TEXT, VERSION_NUMBER, MINOR_VERSION_NUMBER, VERSION_REGION);
} else {
snprintf(sVersionString, MAX_VERSION_LENGTH, "%s %d", VERSION_TEXT, VERSION_NUMBER);
snprintf(sVersionString, MAX_VERSION_LENGTH, "%s %d %s", VERSION_TEXT, VERSION_NUMBER, VERSION_REGION);
}
return sVersionString;
}
@ -18,6 +18,6 @@ char* get_version_local(void) {
if (PATCH_VERSION_NUMBER <= 0) {
return get_version();
}
snprintf(sLocalVersionString, MAX_LOCAL_VERSION_LENGTH, "%s %d.%d.%d", VERSION_TEXT, VERSION_NUMBER, MINOR_VERSION_NUMBER, PATCH_VERSION_NUMBER);
snprintf(sLocalVersionString, MAX_LOCAL_VERSION_LENGTH, "%s %d.%d.%d %s", VERSION_TEXT, VERSION_NUMBER, MINOR_VERSION_NUMBER, PATCH_VERSION_NUMBER, VERSION_REGION);
return sLocalVersionString;
}

View file

@ -6,8 +6,18 @@
#define MINOR_VERSION_NUMBER 1
#define PATCH_VERSION_NUMBER 0
#define MAX_VERSION_LENGTH 28
#define MAX_LOCAL_VERSION_LENGTH 32
#if defined(VERSION_JP)
#define VERSION_REGION "JP"
#elif defined(VERSION_EU)
#define VERSION_REGION "EU"
#elif defined(VERSION_SH)
#define VERSION_REGION "SH"
#else
#define VERSION_REGION "US"
#endif
#define MAX_VERSION_LENGTH 32
#define MAX_LOCAL_VERSION_LENGTH 36
char* get_version(void);
char* get_version_local(void);

View file

@ -110,8 +110,8 @@ void send_display_list(struct SPTask *spTask) {
}
#ifdef VERSION_EU
#define SAMPLES_HIGH 656
#define SAMPLES_LOW 640
#define SAMPLES_HIGH 560 // gAudioBufferParameters.maxAiBufferLength
#define SAMPLES_LOW 528 // gAudioBufferParameters.minAiBufferLength
#else
#define SAMPLES_HIGH 544
#define SAMPLES_LOW 528