Skip to content

Commit

Permalink
Merge PR HarbourMasters#510 from HarbourMasters/2ship2harkinian
Browse files Browse the repository at this point in the history
  • Loading branch information
actions-user committed Sep 23, 2024
2 parents 90be55f + 6152215 commit 2885e65
Show file tree
Hide file tree
Showing 683 changed files with 61,593 additions and 220 deletions.
29 changes: 29 additions & 0 deletions mm/2s2h/BenPort.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -808,6 +808,7 @@ extern "C" uint32_t ResourceMgr_GetGamePlatform(int index) {
case OOT_PAL_GC_DBG2:
case OOT_PAL_GC_MQ_DBG:
case MM_NTSC_US_GC:
case MM_NTSC_JP_GC:
return GAME_PLATFORM_GC;
}
}
Expand All @@ -826,6 +827,7 @@ extern "C" uint32_t ResourceMgr_GetGameRegion(int index) {
case OOT_NTSC_US_MQ:
case MM_NTSC_US_10:
case MM_NTSC_US_GC:
case MM_NTSC_JP_GC:
return GAME_REGION_NTSC;
case OOT_PAL_10:
case OOT_PAL_11:
Expand All @@ -838,6 +840,33 @@ extern "C" uint32_t ResourceMgr_GetGameRegion(int index) {
}
}

extern "C" uint32_t ResourceMgr_GetGameDefaultLanguage(int index) {
uint32_t version =
Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->GetGameVersions()[index];

switch (version) {
case OOT_NTSC_US_10:
case OOT_NTSC_US_11:
case OOT_NTSC_US_12:
case OOT_PAL_10:
case OOT_PAL_11:
case MM_NTSC_US_10:
case OOT_NTSC_JP_GC:
case OOT_NTSC_US_GC:
case OOT_PAL_GC:
case OOT_NTSC_JP_MQ:
case OOT_NTSC_US_MQ:
case OOT_PAL_MQ:
case OOT_PAL_GC_DBG1:
case OOT_PAL_GC_DBG2:
case OOT_PAL_GC_MQ_DBG:
case MM_NTSC_US_GC:
return LANGUAGE_ENG;
case MM_NTSC_JP_GC:
return LANGUAGE_JPN;
}
}

extern "C" void ResourceMgr_LoadDirectory(const char* resName) {
Ship::Context::GetInstance()->GetResourceManager()->LoadDirectory(resName);
}
Expand Down
3 changes: 3 additions & 0 deletions mm/2s2h/BenPort.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#define MM_NTSC_US_10 0x5354631C
#define MM_NTSC_US_GC 0xB443EB08
#define MM_NTSC_JP_GC 0x8473D0C1

#ifdef __cplusplus
#include <Context.h>
Expand Down Expand Up @@ -54,6 +55,7 @@ void DeinitOTR(void);
void VanillaItemTable_Init();
void OTRAudio_Init();
void OTRMessage_Init();
void OTRJPFontMessage_Init();
void InitAudio();
void Graph_StartFrame();
void Graph_ProcessGfxCommands(Gfx* commands);
Expand All @@ -67,6 +69,7 @@ uint32_t ResourceMgr_GetNumGameVersions();
uint32_t ResourceMgr_GetGameVersion(int index);
uint32_t ResourceMgr_GetGamePlatform(int index);
uint32_t ResourceMgr_GetGameRegion(int index);
uint32_t ResourceMgr_GetGameDefaultLanguage(int index);
void ResourceMgr_LoadDirectory(const char* resName);
char** ResourceMgr_ListFiles(const char* searchMask, int* resultSize);
uint8_t ResourceMgr_FileExists(const char* resName);
Expand Down
7 changes: 6 additions & 1 deletion mm/2s2h/DeveloperTools/BetterMapSelect.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "overlays/gamestates/ovl_file_choose/z_file_select.h"
#include "overlays/gamestates/ovl_select/z_select.h"
#include <libultraship/bridge.h>
#include "BenPort.h"

extern SceneSelectEntry sScenes[143];

Expand All @@ -21,7 +22,11 @@ void BetterMapSelect_LoadFileSelect(MapSelectState* mapSelectState) {
CVarSetInteger("gDeveloperTools.BetterMapSelect.PageDownIndex", mapSelectState->pageDownIndex);
CVarSave();
STOP_GAMESTATE(&mapSelectState->state);
SET_NEXT_GAMESTATE(&mapSelectState->state, FileSelect_Init, sizeof(FileSelectState));
if (ResourceMgr_GetGameDefaultLanguage(0) == LANGUAGE_JPN) {
SET_NEXT_GAMESTATE(&mapSelectState->state, FileSelect_JP_Init, sizeof(FileSelectState));
} else {
SET_NEXT_GAMESTATE(&mapSelectState->state, FileSelect_Init, sizeof(FileSelectState));
}
}

// 2S2H Added columns to scene table: entranceSceneId, betterMapSelectIndex, humanName
Expand Down
8 changes: 6 additions & 2 deletions mm/2s2h/Extractor/Extract.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,10 @@ static constexpr uint32_t OOT_PAL_11 = 0xB2055FBD;

static constexpr uint32_t MM_US_10 = 0x5354631C;
static constexpr uint32_t MM_US_GC = 0xB443EB08;
static constexpr uint32_t MM_JP_GC = 0x8473D0C1;

static const std::unordered_map<uint32_t, const char*> verMap = {
{ MM_US_10, "US 1.0" }, { MM_US_GC, "US GC" },
{ MM_US_10, "US 1.0" }, { MM_US_GC, "US GC" }, { MM_JP_GC, "JP GC" },
//{ OOT_PAL_GC, "PAL Gamecube" },
//{ OOT_PAL_MQ, "PAL MQ" },
//{ OOT_PAL_GC_DBG1, "PAL Debug 1" },
Expand All @@ -76,7 +77,8 @@ static const std::unordered_map<uint32_t, const char*> verMap = {
// TODO only check the first 54MB of the rom.
static constexpr std::array<const uint32_t, 10> goodCrcs = {
0x96F49400, // MM US 1.0 32MB
0xBB434787, // MM GC
0xBB434787, // MM US GC
0x2BD099FA, // MM JP GC
// 0xfa8c0555, // MQ DBG 64MB (Original overdump)
// 0x8652ac4c, // MQ DBG 64MB
// 0x5B8A1EB7, // MQ DBG 64MB (Empty overdump)
Expand Down Expand Up @@ -512,6 +514,8 @@ const char* Extractor::GetZapdVerStr() const {
return "N64_US";
case MM_US_GC:
return "GC_US";
case MM_JP_GC:
return "GC_JP";
default:
// We should never be in a state where this path happens.
UNREACHABLE;
Expand Down
4 changes: 1 addition & 3 deletions mm/2s2h/resource/importer/TextMMFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ std::shared_ptr<Ship::IResource> ResourceFactoryBinaryTextMMV0::ReadResource(std
entry.id = reader->ReadUInt16();
entry.textboxType = reader->ReadUByte();
entry.textboxYPos = reader->ReadUByte();
// BENTODO: the new ZAPD reads and exports this as an int16 for JP but nothing currently uses that and the game
// expects an int8. Use this for now.
entry.icon = (int8_t)reader->ReadUInt16();
entry.icon = reader->ReadUInt16();
entry.nextMessageID = reader->ReadUInt16();
entry.firstItemCost = reader->ReadUInt16();
entry.secondItemCost = reader->ReadUInt16();
Expand Down
2 changes: 1 addition & 1 deletion mm/2s2h/resource/type/TextMM.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class MessageEntryMM {
uint16_t id;
uint8_t textboxType;
uint8_t textboxYPos;
uint8_t icon;
uint16_t icon;
uint16_t nextMessageID;
uint16_t firstItemCost;
uint16_t secondItemCost;
Expand Down
65 changes: 47 additions & 18 deletions mm/2s2h/z_message_OTR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
extern "C" MessageTableEntry* sMessageTableNES;
extern "C" MessageTableEntry* sMessageTableCredits;

extern "C" MessageTableEntry* sJPMessageEntryTablePtr;

MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
auto file = std::static_pointer_cast<SOH::TextMM>(
Ship::Context::GetInstance()->GetResourceManager()->LoadResource(filePath));
Expand All @@ -22,27 +24,37 @@ MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * (file->messages.size() + 1));

for (size_t i = 0; i < file->messages.size(); i++) {
uint8_t offset = isNES ? 11 : 12;
table[i].textId = file->messages[i].id;
table[i].typePos = (file->messages[i].textboxType << 4) | file->messages[i].textboxYPos;
table[i].segment = (const char*)malloc(file->messages[i].msg.size() + 11);

auto segment = (char*)table[i].segment;
table[i].segment = (const char*)malloc(file->messages[i].msg.size() + offset);

segment[0] = file->messages[i].textboxType;
segment[1] = file->messages[i].textboxYPos;
segment[2] = file->messages[i].icon;
segment[3] = (file->messages[i].nextMessageID & 0xFF00) >> 8;
segment[4] = (file->messages[i].nextMessageID & 0x00FF);
segment[5] = (file->messages[i].firstItemCost & 0xFF00) >> 8;
segment[6] = (file->messages[i].firstItemCost & 0x00FF);
segment[7] = (file->messages[i].secondItemCost & 0xFF00) >> 8;
segment[8] = (file->messages[i].secondItemCost & 0x00FF);
segment[9] = 0xFF;
segment[10] = 0xFF;
if (isNES) {
auto segment = (char*)table[i].segment;
segment[0] = file->messages[i].textboxType;
segment[1] = file->messages[i].textboxYPos;
segment[2] = (u8)file->messages[i].icon;
segment[3] = (file->messages[i].nextMessageID & 0xFF00) >> 8;
segment[4] = (file->messages[i].nextMessageID & 0x00FF);
segment[5] = (file->messages[i].firstItemCost & 0xFF00) >> 8;
segment[6] = (file->messages[i].firstItemCost & 0x00FF);
segment[7] = (file->messages[i].secondItemCost & 0xFF00) >> 8;
segment[8] = (file->messages[i].secondItemCost & 0x00FF);
segment[9] = 0xFF;
segment[10] = 0xFF;
} else {
uint16_t* segment = (uint16_t*)table[i].segment;
segment[0] = (file->messages[i].textboxType << 8) | file->messages[i].textboxYPos;
segment[1] = file->messages[i].icon;
segment[2] = file->messages[i].nextMessageID;
segment[3] = file->messages[i].firstItemCost;
segment[4] = file->messages[i].secondItemCost;
segment[5] = 0xFFFF;
}

memcpy((void*)(&table[i].segment[11]), file->messages[i].msg.c_str(), file->messages[i].msg.size());
memcpy((void*)(&table[i].segment[offset]), file->messages[i].msg.c_str(), file->messages[i].msg.size());

table[i].msgSize = file->messages[i].msg.size() + 11;
table[i].msgSize = file->messages[i].msg.size() + offset;

// if (isNES && file->messages[i].id == 0xFFFC)
//_message_0xFFFC_nes = (char*)file->messages[i].msg.c_str();
Expand All @@ -51,8 +63,25 @@ MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
return table;
}

extern "C" void OTRMessage_Init() {
sMessageTableNES = OTRMessage_LoadTable("text/message_data_static/message_data_static", true);
// File select screen does not have access to an initialised PlayState, so cannot use MessageContext's messageEntryTable
extern "C" void OTRJPFontMessage_Init() {
if (sJPMessageEntryTablePtr == NULL) {
sJPMessageEntryTablePtr = OTRMessage_LoadTable("text/message_data_static_jp/message_data_static_jp", false);
}
}

extern "C" void OTRMessage_Init(PlayState* play, bool isJP) {
// OTRTODO: Added a lot of null checks here so that we don't malloc the table multiple times causing a memory leak.
// We really ought to fix the implementation such that we aren't malloc'ing new tables.
// Once we fix the implementation, remove these NULL checks.
// if (play->msgCtx.messageEntryTableNes == NULL) {
// OTRTODO:
if (isJP) {
OTRJPFontMessage_Init();
} else {
sMessageTableNES = OTRMessage_LoadTable("text/message_data_static/message_data_static", true);
}
//}

auto file2 = std::static_pointer_cast<SOH::TextMM>(Ship::Context::GetInstance()->GetResourceManager()->LoadResource(
"text/staff_message_data_static/staff_message_data_static"));
Expand Down
8 changes: 8 additions & 0 deletions mm/assets/extractor/Config_GC_JP.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Root>
<SymbolMap File="symbols/SymbolMap_MM.txt"/>
<ActorList File="symbols/ActorList_MM.txt"/>
<ObjectList File="symbols/ObjectList_MM.txt"/>
<EnumData File="EnumData.xml"/>
<ExternalXMLFolder Path="assets/extractor/xmls/GC_JP/"/>
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
</Root>
Loading

0 comments on commit 2885e65

Please sign in to comment.