Skip to content

Commit ceeae4f

Browse files
hyperbxNextinMonoIsaacMarovitz
authored
Implemented achievements (#195)
* Implemented achievements I/O, overlay and error handling * Implemented achievements menu * Update resources submodule * Added Achievement Notifications option * Use total instead of percentage for achievement progress * Use original game's time format * Fix gold medals not reappearing when switching between menus * English localisation * Update locale * Added sliding transition to achievements menu * Update locale * Italian localisation Co-authored-by: NextinHKRY <38560522+NextinMono@users.noreply.github.com> * Spanish localisation by DaGuAr Co-authored-by: DaGuAr * Adjusted achievement text marquee start/end position * Fix text card string replacement causing crashes on main menu exit * Fixed UTF-8 std::string -> std::wstring conversion * Update Spanish localisation * Improve transitions and visual feedback * Update Spanish localisation Co-authored-by: DaGuAr * options_menu: disable description fade animation if current option is Language * German localisation by Ray Vassos * French & Japanese Locale Signed-off-by: Isaac Marovitz <isaacryu@icloud.com> * Fix typo Signed-off-by: Isaac Marovitz <isaacryu@icloud.com> * Finish French Signed-off-by: Isaac Marovitz <isaacryu@icloud.com> * Remove JP full stops Signed-off-by: Isaac Marovitz <isaacryu@icloud.com> * Japanese Signed-off-by: Isaac Marovitz <isaacryu@icloud.com> * Font atlas Signed-off-by: Isaac Marovitz <isaacryu@icloud.com> * Minor adjustments Signed-off-by: Isaac Marovitz <isaacryu@icloud.com> * Fix missing “legendary” Signed-off-by: Isaac Marovitz <isaacryu@icloud.com> * Adjust JP locale * Fix Japanese locale for Gold Medal Results * Fix wide string conversion on macOS * Fix achievement overlay text not centring vertically at narrow aspect ratios --------- Signed-off-by: Isaac Marovitz <isaacryu@icloud.com> Co-authored-by: NextinHKRY <38560522+NextinMono@users.noreply.github.com> Co-authored-by: Isaac Marovitz <isaacryu@icloud.com>
1 parent 53f19ef commit ceeae4f

65 files changed

Lines changed: 2992 additions & 1472 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

MarathonRecomp/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ set(MARATHON_RECOMP_KERNEL_CXX_SOURCES
8181
)
8282

8383
set(MARATHON_RECOMP_LOCALE_CXX_SOURCES
84+
"locale/achievement_locale.cpp"
8485
"locale/config_locale.cpp"
8586
"locale/locale.cpp"
8687
)
@@ -538,7 +539,6 @@ set(RESOURCES_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/res")
538539
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/bc_diff/button_bc_diff.bin" DEST_FILE "${RESOURCES_OUTPUT_PATH}/bc_diff/button_bc_diff.bin" ARRAY_NAME "g_button_bc_diff" COMPRESSION_TYPE "zstd")
539540
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/font/im_font_atlas.bin" DEST_FILE "${RESOURCES_OUTPUT_PATH}/font/im_font_atlas.bin" ARRAY_NAME "g_im_font_atlas" COMPRESSION_TYPE "zstd")
540541
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/font/im_font_atlas.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/font/im_font_atlas.dds" ARRAY_NAME "g_im_font_atlas_texture" COMPRESSION_TYPE "zstd")
541-
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/achievements_menu/trophy.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/achievements_menu/trophy.dds" ARRAY_NAME "g_trophy" COMPRESSION_TYPE "zstd")
542542
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/button_window.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/button_window.dds" ARRAY_NAME "g_button_window" COMPRESSION_TYPE "zstd")
543543
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/controller.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/controller.dds" ARRAY_NAME "g_controller" COMPRESSION_TYPE "zstd")
544544
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/sonicnext-dev.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/sonicnext-dev.dds" ARRAY_NAME "g_sonicnextdev" COMPRESSION_TYPE "zstd")
@@ -549,7 +549,7 @@ BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/com
549549
BIN2C(TARGET_OBJ MarathonRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/main_menu9.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/main_menu9.dds" ARRAY_NAME "g_main_menu9" COMPRESSION_TYPE "zstd")
550550
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")
551551
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")
552-
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")
552+
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")
553553

554554
## Installer ##
555555
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")

MarathonRecomp/api/Marathon.h

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "Sonicteam/Globals.h"
4444
#include "Sonicteam/HUDButtonWindow.h"
4545
#include "Sonicteam/HUDCALLBACK.h"
46+
#include "Sonicteam/HUDGoldMedal.h"
4647
#include "Sonicteam/HUDLimitTime.h"
4748
#include "Sonicteam/HUDLoading.h"
4849
#include "Sonicteam/HUDMainDisplay.h"
@@ -56,17 +57,19 @@
5657
#include "Sonicteam/HudTextParts.h"
5758
#include "Sonicteam/ImageFilter.h"
5859
#include "Sonicteam/MainDisplayTask.h"
60+
#include "Sonicteam/MainMenuExpositionTask.h"
5961
#include "Sonicteam/MainMenuTask.h"
6062
#include "Sonicteam/MainMode.h"
61-
#include "Sonicteam/Message/MsgCameramanChangeMode.h"
62-
#include "Sonicteam/Message/MsgHUDButtonWindowChangeButtons.h"
63-
#include "Sonicteam/Message/MsgHUDMainMenuChangeState.h"
64-
#include "Sonicteam/Message/MsgHUDMainMenuSetCursor.h"
65-
#include "Sonicteam/Message/MsgHUDMainMenuTransition.h"
66-
#include "Sonicteam/Message/MsgMissionGetGlobalFlag.h"
67-
#include "Sonicteam/Message/MsgObjJump123GetNextPoint.h"
68-
#include "Sonicteam/Message/MsgPauseAdapterText.h"
69-
#include "Sonicteam/Message/MsgSuckPlayer.h"
63+
#include "Sonicteam/Message/Camera/Cameraman/MsgChangeMode.h"
64+
#include "Sonicteam/Message/HUDButtonWindow/MsgChangeButtons.h"
65+
#include "Sonicteam/Message/HUDGoldMedal/MsgChangeState.h"
66+
#include "Sonicteam/Message/HUDMainMenu/MsgChangeState.h"
67+
#include "Sonicteam/Message/HUDMainMenu/MsgSetCursor.h"
68+
#include "Sonicteam/Message/HUDMainMenu/MsgTransition.h"
69+
#include "Sonicteam/Message/Mission/MsgGetGlobalFlag.h"
70+
#include "Sonicteam/Message/ObjJump123/MsgGetNextPoint.h"
71+
#include "Sonicteam/Message/PauseAdapter/MsgGetText.h"
72+
#include "Sonicteam/Message/Player/MsgSuckPlayer.h"
7073
#include "Sonicteam/MessageWindowTask.h"
7174
#include "Sonicteam/Mission/Core.h"
7275
#include "Sonicteam/MovieObject.h"
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
#include <boost/smart_ptr/shared_ptr.h>
5+
#include <Sonicteam/SoX/Engine/Doc.h>
6+
#include <Sonicteam/SoX/Engine/Task.h>
7+
#include <Sonicteam/SoX/RefCountObject.h>
8+
#include <Sonicteam/CsdObject.h>
9+
#include <Sonicteam/HudTextParts.h>
10+
#include <Sonicteam/TextCard.h>
11+
#include <Sonicteam/TextEntity.h>
12+
13+
namespace Sonicteam
14+
{
15+
class HUDGoldMedal : public SoX::RefCountObject, public SoX::Engine::Task
16+
{
17+
public:
18+
xpointer<CsdObject> m_pCsdObject;
19+
xpointer<HudTextParts> m_pMedalCountText;
20+
xpointer<SoX::Engine::Doc> m_pDoc;
21+
MARATHON_INSERT_PADDING(0x3C);
22+
be<uint32_t> m_EpisodeIndex;
23+
be<uint32_t> m_ScrollIndex;
24+
be<uint32_t> m_MedalCount;
25+
boost::shared_ptr<TextCard> m_spMedalCountTextCard;
26+
MARATHON_INSERT_PADDING(0x10);
27+
boost::shared_ptr<TextCard> m_aspTextCards[5];
28+
boost::shared_ptr<TextEntity> m_aspTextEntities[5];
29+
};
30+
31+
MARATHON_ASSERT_OFFSETOF(HUDGoldMedal, m_pCsdObject, 0x54);
32+
MARATHON_ASSERT_OFFSETOF(HUDGoldMedal, m_pMedalCountText, 0x58);
33+
MARATHON_ASSERT_OFFSETOF(HUDGoldMedal, m_pDoc, 0x5C);
34+
MARATHON_ASSERT_OFFSETOF(HUDGoldMedal, m_EpisodeIndex, 0x9C);
35+
MARATHON_ASSERT_OFFSETOF(HUDGoldMedal, m_ScrollIndex, 0xA0);
36+
MARATHON_ASSERT_OFFSETOF(HUDGoldMedal, m_MedalCount, 0xA4);
37+
MARATHON_ASSERT_OFFSETOF(HUDGoldMedal, m_spMedalCountTextCard, 0xA8);
38+
MARATHON_ASSERT_OFFSETOF(HUDGoldMedal, m_aspTextCards, 0xC0);
39+
MARATHON_ASSERT_OFFSETOF(HUDGoldMedal, m_aspTextEntities, 0xE8);
40+
MARATHON_ASSERT_SIZEOF(HUDGoldMedal, 0x110);
41+
}

MarathonRecomp/api/Sonicteam/HUDMainMenu.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@ namespace Sonicteam
1212
enum HUDMainMenuState : uint32_t
1313
{
1414
HUDMainMenuState_OptionsOutro = 5,
15+
HUDMainMenuState_SinglePlayerTextOutro = 8,
16+
HUDMainMenuState_SinglePlayerCursorIntro = 86,
1517
HUDMainMenuState_OptionsIntro = 90,
1618
HUDMainMenuState_MainCursorIntro = 98,
17-
HUDMainMenuState_MainCursorOutro = 99
19+
HUDMainMenuState_MainCursorOutro = 99,
20+
HUDMainMenuState_GoldMedalResultsCursorOutro = 101
1821
};
1922

2023
MARATHON_INSERT_PADDING(0x20);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/RefCountObject.h>
5+
6+
namespace Sonicteam
7+
{
8+
class MainMenuExpositionTask : public SoX::RefCountObject, public SoX::Engine::Task
9+
{
10+
public:
11+
be<uint32_t> m_TextMotionState;
12+
};
13+
14+
MARATHON_ASSERT_OFFSETOF(MainMenuExpositionTask, m_TextMotionState, 0x54);
15+
}

MarathonRecomp/api/Sonicteam/MainMenuTask.h

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
#include <Marathon.inl>
44
#include <Sonicteam/SoX/Math/Vector.h>
5+
#include <Sonicteam/SoX/RefSharedPointer.h>
56
#include <Sonicteam/Player/Object.h>
67
#include <Sonicteam/ButtonWindowTask.h>
8+
#include <Sonicteam/MainMenuExpositionTask.h>
79

810
namespace Sonicteam
911
{
@@ -14,7 +16,7 @@ namespace Sonicteam
1416
{
1517
MainMenuState_MainMenuBack = 1,
1618
MainMenuState_MainMenu = 2,
17-
MainMenuState_MainMenuExitPrompt = 4,
19+
MainMenuState_ExitPrompt = 4,
1820
MainMenuState_SinglePlayer = 6,
1921
MainMenuState_EpisodeSelect = 9,
2022
MainMenuState_TrialSelect = 0x0D,
@@ -26,22 +28,34 @@ namespace Sonicteam
2628
MainMenuState_Tag = 0x1E,
2729
MainMenuState_Tag1PSelect = 0x1F,
2830
MainMenuState_Battle = 0x22,
29-
MainMenuState_GoldMedalResults = 0x26,
31+
MainMenuState_GoldMedalResultsOpen = 0x26,
32+
MainMenuState_GoldMedalResults = 0x27,
3033
MainMenuState_AudioRoom = 0x2F,
3134
MainMenuState_TheaterRoom = 0x31,
3235
MainMenuState_Options = 0x33,
33-
MainMenuState_MainMenuExitToStage = 0x3B,
34-
MainMenuState_MainMenuExitToTitle = 0x3C
36+
MainMenuState_ExitToStage = 0x3B,
37+
MainMenuState_ExitToTitle = 0x3C
3538
};
3639

3740
be<uint32_t> m_State;
3841
MARATHON_INSERT_PADDING(0x24);
3942
xpointer<HUDMainMenu> m_pHUDMainMenu;
40-
MARATHON_INSERT_PADDING(0x20);
43+
MARATHON_INSERT_PADDING(8);
44+
xpointer<HUDGoldMedal> m_pHUDGoldMedal;
45+
MARATHON_INSERT_PADDING(0x14);
4146
xpointer<ButtonWindowTask> m_pButtonWindowTask;
42-
MARATHON_INSERT_PADDING(4);
47+
SoX::RefSharedPointer<MainMenuExpositionTask> m_spMainMenuExpositionTask;
4348
be<uint32_t> m_MainMenuSelectedIndex;
44-
MARATHON_INSERT_PADDING(0x1D8);
49+
be<uint32_t> m_SinglePlayerSelectedIndex;
50+
MARATHON_INSERT_PADDING(0x14);
51+
be<uint32_t> m_FieldBC;
52+
MARATHON_INSERT_PADDING(0x60);
53+
be<uint32_t> m_GoldMedalEpisodeIndex;
54+
MARATHON_INSERT_PADDING(4);
55+
be<uint32_t> m_GoldMedalScrollIndex;
56+
MARATHON_INSERT_PADDING(0x144);
57+
be<uint32_t> m_IsChangingState;
58+
MARATHON_INSERT_PADDING(8);
4559
be<uint32_t> m_PressedButtons;
4660
MARATHON_INSERT_PADDING(0x18);
4761
xpointer<Actor> m_Field298;
@@ -51,8 +65,15 @@ namespace Sonicteam
5165

5266
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_State, 0x4C);
5367
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_pHUDMainMenu, 0x74);
68+
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_pHUDGoldMedal, 0x80);
5469
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_pButtonWindowTask, 0x98);
70+
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_spMainMenuExpositionTask, 0x9C);
5571
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_MainMenuSelectedIndex, 0xA0);
72+
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_SinglePlayerSelectedIndex, 0xA4);
73+
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_FieldBC, 0xBC);
74+
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_GoldMedalEpisodeIndex, 0x120);
75+
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_GoldMedalScrollIndex, 0x128);
76+
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_IsChangingState, 0x270);
5677
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_PressedButtons, 0x27C);
5778
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_Field298, 0x298);
5879
MARATHON_ASSERT_OFFSETOF(MainMenuTask, m_apSelectCharacters, 0x29C);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/Math/Vector.h>
5+
#include <Sonicteam/SoX/Message.h>
6+
7+
namespace Sonicteam::Message::Camera::Cameraman
8+
{
9+
struct MsgChangeMode : SoX::Message<0x14007>
10+
{
11+
be<uint32_t> PadID{};
12+
be<uint32_t> TargetActorID{};
13+
bool IsDemoCamera{};
14+
};
15+
16+
MARATHON_ASSERT_OFFSETOF(MsgChangeMode, PadID, 0x04);
17+
MARATHON_ASSERT_OFFSETOF(MsgChangeMode, TargetActorID, 0x08);
18+
MARATHON_ASSERT_OFFSETOF(MsgChangeMode, IsDemoCamera, 0x0C);
19+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/Message.h>
5+
6+
namespace Sonicteam::Message::HUDButtonWindow
7+
{
8+
struct MsgChangeButtons : SoX::Message<0x1B05B>
9+
{
10+
be<uint32_t> ButtonType{};
11+
12+
MsgChangeButtons(uint32_t buttonType = 0) : ButtonType(buttonType) {}
13+
};
14+
15+
MARATHON_ASSERT_OFFSETOF(MsgChangeButtons, ButtonType, 0x04);
16+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/Message.h>
5+
6+
namespace Sonicteam::Message::HUDGoldMedal
7+
{
8+
struct MsgChangeState : SoX::Message<0x1B058>
9+
{
10+
be<uint32_t> State{};
11+
be<uint32_t> Field08{};
12+
uint8_t Field0C{};
13+
be<uint32_t> EpisodeIndex{};
14+
15+
MsgChangeState() {}
16+
17+
MsgChangeState(uint32_t state, uint32_t episodeIndex = 0) : State(state), EpisodeIndex(episodeIndex) {}
18+
};
19+
20+
MARATHON_ASSERT_OFFSETOF(MsgChangeState, State, 0x04);
21+
MARATHON_ASSERT_OFFSETOF(MsgChangeState, Field08, 0x08);
22+
MARATHON_ASSERT_OFFSETOF(MsgChangeState, Field0C, 0x0C);
23+
MARATHON_ASSERT_OFFSETOF(MsgChangeState, EpisodeIndex, 0x10);
24+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/Message.h>
5+
6+
namespace Sonicteam::Message::HUDMainMenu
7+
{
8+
struct MsgChangeState : SoX::Message<0x1B053>
9+
{
10+
be<uint32_t> State{};
11+
};
12+
13+
MARATHON_ASSERT_OFFSETOF(MsgChangeState, State, 0x04);
14+
}

0 commit comments

Comments
 (0)