Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion MarathonRecomp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ set(MARATHON_RECOMP_PATCHES_CXX_SOURCES
"patches/misc_patches.cpp"
"patches/player_patches.cpp"
"patches/SaveDataTask_patches.cpp"
"patches/text_patches.cpp"
"patches/TitleTask_patches.cpp"
"patches/video_patches.cpp"
)
Expand Down Expand Up @@ -543,7 +544,9 @@ BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/com
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/select.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/select.dds" ARRAY_NAME "g_select" COMPRESSION_TYPE "zstd")
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/light.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/light.dds" ARRAY_NAME "g_light" COMPRESSION_TYPE "zstd")
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/main_menu1.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/main_menu1.dds" ARRAY_NAME "g_main_menu1" COMPRESSION_TYPE "zstd")
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/arrow.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/arrow.dds" ARRAY_NAME "arrow" COMPRESSION_TYPE "zstd")
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/arrow.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/arrow.dds" ARRAY_NAME "g_arrow" COMPRESSION_TYPE "zstd")
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/window.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/window.dds" ARRAY_NAME "g_window" COMPRESSION_TYPE "zstd")
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/select_arrow.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/select_arrow.dds" ARRAY_NAME "g_select_arrow" COMPRESSION_TYPE "zstd")

## Installer ##
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/install_001.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/install_001.dds" ARRAY_NAME "g_install_001" COMPRESSION_TYPE "zstd")
Expand Down
8 changes: 6 additions & 2 deletions MarathonRecomp/api/Sonicteam/SoX/Engine/Doc.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@ namespace Sonicteam::SoX::Engine
public:
xpointer<void> m_pVftable;
MARATHON_INSERT_PADDING(4);
xpointer<SoX::Engine::DocMode> m_pDocMode;
MARATHON_INSERT_PADDING(0x50);
xpointer<DocMode> m_pDocMode;
xpointer<Task> m_pRootTask;
xpointer<Task> m_pRootGTask;
MARATHON_INSERT_PADDING(8);
xpointer<Task> m_pDocModeExecutor;
MARATHON_INSERT_PADDING(0x3C);

template <typename T>
inline T* GetDocMode();
Expand Down
22 changes: 21 additions & 1 deletion MarathonRecomp/api/Sonicteam/TitleTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,27 @@ namespace Sonicteam
class TitleTask : public SoX::Engine::Task
{
public:
MARATHON_INSERT_PADDING(0x30);
static constexpr float ms_DefaultMovieWaitTime = 30.0f;

enum TitleState : uint32_t
{
TitleState_Open,
TitleState_Wait,
TitleState_PressStart,
TitleState_OptionsOpen = 5,
TitleState_OptionsWait,
TitleState_OptionsProceed = 7,
TitleState_Proceed,
TitleState_Outro = 13
};

be<TitleState> m_State;
MARATHON_INSERT_PADDING(0x0C);
be<float> m_MovieWaitTime;
be<uint32_t> m_Field60;
MARATHON_INSERT_PADDING(0x18);
be<uint32_t> m_SelectedIndex;
MARATHON_INSERT_PADDING(0x20);
be<uint32_t> m_CastIndex;
};
}
40 changes: 19 additions & 21 deletions MarathonRecomp/exports.cpp
Original file line number Diff line number Diff line change
@@ -1,33 +1,31 @@
#include "exports.h"
#include <apu/embedded_player.h>
#include <cpu/guest_stack_var.h>
#include <kernel/function.h>
#include <kernel/heap.h>
#include <kernel/memory.h>
#include <ui/game_window.h>
#include <app.h>

void Game_PlaySound(const char* pName)
{
if (EmbeddedPlayer::s_isActive)
{
EmbeddedPlayer::Play(pName);
}
else
{
Game_PlaySound("system", pName);
}
}

void Game_PlaySound(const char* pBankName, const char* pName)
{
auto pBankNameGuest = g_userHeap.Alloc(strlen(pBankName) + 1);
auto pNameGuest = g_userHeap.Alloc(strlen(pName) + 1);

strcpy((char*)pBankNameGuest, pBankName);
strcpy((char*)pNameGuest, pName);

GuestToHostFunction<int>(sub_824C7868, App::s_pApp->m_pDoc->m_pRootTask.get(), pBankNameGuest, pNameGuest);

// TODO: support in-game sounds (see sub_824C7868).
// else
// {
// // Use EVENT category in cutscenes since SYSTEM gets muted by the game.
// uint32_t category = !InspirePatches::s_sceneName.empty() ? 10 : 7;
//
// guest_stack_var<boost::anonymous_shared_ptr> soundPlayer;
// GuestToHostFunction<void>(sub_82B4DF50, soundPlayer.get(), ((be<uint32_t>*)g_memory.Translate(0x83367900))->get(), category, 0, 0);
//
// auto soundPlayerVtable = (be<uint32_t>*)g_memory.Translate(*(be<uint32_t>*)soundPlayer->get());
// uint32_t virtualFunction = *(soundPlayerVtable + 1);
//
// size_t strLen = strlen(pName);
// void *strAllocation = g_userHeap.Alloc(strLen + 1);
// memcpy(strAllocation, pName, strLen + 1);
// GuestToHostFunction<void>(virtualFunction, soundPlayer->get(), strAllocation, 0);
// g_userHeap.Free(strAllocation);
// }
g_userHeap.Free(pBankNameGuest);
g_userHeap.Free(pNameGuest);
}
1 change: 1 addition & 0 deletions MarathonRecomp/exports.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#pragma once

void Game_PlaySound(const char* pName);
void Game_PlaySound(const char* pBankName, const char* pName);
4 changes: 2 additions & 2 deletions MarathonRecomp/gpu/imgui/imgui_font_builder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ static bool FontBuilder_Build(ImFontAtlas* atlas)
double spaceAdvance = 0.0;

auto& config = atlas->ConfigData[i];
bool increaseSpacing = strstr(config.Name, "Seurat") != nullptr;
bool increaseSpacing = strstr(config.Name, "Rodin") != nullptr;

auto& [index, count] = ranges[i];
for (size_t j = 0; j < count; j++)
Expand All @@ -238,7 +238,7 @@ static bool FontBuilder_Build(ImFontAtlas* atlas)
{
if (increaseSpacing)
{
advance *= 1.5;
advance *= 1.75;
}

spaceAdvance = advance;
Expand Down
2 changes: 1 addition & 1 deletion MarathonRecomp/gpu/video.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2809,8 +2809,8 @@ static void DrawImGui()
// OptionsMenu::Draw();
AchievementOverlay::Draw();
InstallerWizard::Draw();
MessageWindow::Draw();
ButtonGuide::Draw();
MessageWindow::Draw();
Fader::Draw();
BlackBar::Draw();

Expand Down
47 changes: 29 additions & 18 deletions MarathonRecomp/locale/locale.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -525,36 +525,36 @@ std::unordered_map<std::string_view, std::unordered_map<ELanguage, std::string>>
// Notes: message appears when user chooses "Quit" on the first available installation screen.
"Installer_Message_Quit",
{
{ ELanguage::English, "Are you sure you want to quit?" },
{ ELanguage::Japanese, "[終了:しゅうりょう]してもよろしいですか?" },
{ ELanguage::German, "Installation verlassen?" },
{ ELanguage::French, "Êtes-vous sûr de vouloir quitter ?" },
{ ELanguage::Spanish, "¿Estás seguro de que quieres\nsalir?" },
{ ELanguage::Italian, "Sicuro di voler uscire?" }
{ ELanguage::English, "Exit the installer.\nOK?" },
{ ELanguage::Japanese, "" },
{ ELanguage::German, "" },
{ ELanguage::French, "" },
{ ELanguage::Spanish, "" },
{ ELanguage::Italian, "" }
}
Comment thread
squidbus marked this conversation as resolved.
},
{
// Notes: message appears when user chooses "Cancel" during installation.
"Installer_Message_Cancel",
{
{ ELanguage::English, "Are you sure you want to cancel the installation?" },
{ ELanguage::Japanese, "インストールをキャンセルしてもよろしいですか?" },
{ ELanguage::German, "Bist du dir sicher, dass du die Installation abbrechen möchtest?" },
{ ELanguage::French, "Êtes-vous sûr de vouloir annuler l'installation ?" },
{ ELanguage::Spanish, "¿Estás seguro de que quieres cancelar la instalación?" },
{ ELanguage::Italian, "Sicuro di voler annullare l'installazione?" }
{ ELanguage::English, "Cancel the installation.\nOK?" },
{ ELanguage::Japanese, "" },
{ ELanguage::German, "" },
{ ELanguage::French, "" },
{ ELanguage::Spanish, "" },
{ ELanguage::Italian, "" }
}
},
{
// Notes: message appears when pressing B at the title screen.
"Title_Message_Quit",
{
{ ELanguage::English, "Are you sure you want to quit?" },
{ ELanguage::Japanese, "[終了:しゅうりょう]してもよろしいですか?" },
{ ELanguage::German, "Spiel verlassen?" },
{ ELanguage::French, "Êtes-vous sûr de vouloir quitter ?" },
{ ELanguage::Spanish, "¿Estás seguro de que quieres\nsalir?" },
{ ELanguage::Italian, "Sicuro di voler uscire ?" }
{ ELanguage::English, "Exit the game.\nOK?" },
{ ELanguage::Japanese, "" },
{ ELanguage::German, "" },
{ ELanguage::French, "" },
{ ELanguage::Spanish, "" },
{ ELanguage::Italian, "" }
}
},
{
Expand Down Expand Up @@ -663,6 +663,17 @@ std::unordered_map<std::string_view, std::unordered_map<ELanguage, std::string>>
{ ELanguage::Italian, "La verifica dei file d'installazione non è andata a buon fine.\n\nErrore: %s\n\nIl gioco si chiuderà. Prova a reinstallare il gioco utilizzando l'argomento di avvio --install." }
}
},
{
"Common_OK",
{
{ ELanguage::English, "OK" },
{ ELanguage::Japanese, "OK" },
{ ELanguage::German, "OK" },
{ ELanguage::French, "OK" },
{ ELanguage::Spanish, "OK" },
{ ELanguage::Italian, "OK" }
}
},
{
"Common_On",
{
Expand Down
26 changes: 0 additions & 26 deletions MarathonRecomp/patches/SaveDataTask_patches.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,29 +46,3 @@ void SaveAlertThreeOptionRemoveDeviceSelect(PPCRegister& r5)
// second index for the three option alert windows.
options[2] = 0;
}

// Load system message.
PPC_FUNC_IMPL(__imp__sub_825ECB48);
PPC_FUNC(sub_825ECB48)
{
auto* pMessage = (const char*)(base + ctx.r5.u32);
void* pNewMessage = nullptr;

if (strcmp(pMessage, "msg_deviceselect") == 0)
{
constexpr const char* MSG_RETRY = "msg_retry";

pNewMessage = g_userHeap.Alloc(strlen(MSG_RETRY) + 1);

strcpy((char*)pNewMessage, MSG_RETRY);

ctx.r5.u32 = g_memory.MapVirtual(pNewMessage);
}

__imp__sub_825ECB48(ctx, base);

if (!pNewMessage)
return;

g_userHeap.Free(pNewMessage);
}
Loading
Loading