Added automatic move to name entry after connecting and scouting

This commit is contained in:
Jerom Venneker
2025-06-12 21:52:47 +02:00
parent 0fe29b4a20
commit 1fe3871f6c
3 changed files with 73 additions and 14 deletions

View File

@@ -43,10 +43,24 @@ bool ArchipelagoClient::StartClient() {
} }
disconnecting = false; disconnecting = false;
retries = 0;
apClient = std::unique_ptr<APClient>( apClient = std::unique_ptr<APClient>(
new APClient(uuid, AP_Client_consts::AP_GAME_NAME, new APClient(uuid, AP_Client_consts::AP_GAME_NAME,
CVarGetString(CVAR_REMOTE_ARCHIPELAGO("ServerAddress"), "localhost:38281"), "cacert.pem")); CVarGetString(CVAR_REMOTE_ARCHIPELAGO("ServerAddress"), "localhost:38281"), "cacert.pem"));
CVarSetInteger(CVAR_REMOTE_ARCHIPELAGO("ConnectionStatus"), 1); // connecting
apClient->set_socket_error_handler([&](const std::string& msg) {
retries++;
if(retries > AP_Client_consts::MAX_RETRIES) {
ArchipelagoConsole_SendMessage("[ERROR] Could not connect to server");
CVarSetInteger(CVAR_REMOTE_ARCHIPELAGO("ConnectionStatus"), 2); // connection error
disconnecting = true;
return;
}
ArchipelagoConsole_SendMessage("[ERROR] Could not connect to server, retrying...");
});
apClient->set_room_info_handler([&]() { apClient->set_room_info_handler([&]() {
std::list<std::string> tags; std::list<std::string> tags;
// tags.push_back("DeathLink"); // todo, implement deathlink // tags.push_back("DeathLink"); // todo, implement deathlink
@@ -56,6 +70,7 @@ bool ArchipelagoClient::StartClient() {
}); });
apClient->set_slot_connected_handler([&](const nlohmann::json data) { apClient->set_slot_connected_handler([&](const nlohmann::json data) {
CVarSetInteger(CVAR_REMOTE_ARCHIPELAGO("ConnectionStatus"), 3); // slot connected
ArchipelagoConsole_SendMessage("[LOG] Connected.", true); ArchipelagoConsole_SendMessage("[LOG] Connected.", true);
ArchipelagoClient::StartLocationScouts(); ArchipelagoClient::StartLocationScouts();
@@ -117,6 +132,7 @@ bool ArchipelagoClient::StartClient() {
} }
ArchipelagoConsole_SendMessage("[LOG] Scouting finished.", true); ArchipelagoConsole_SendMessage("[LOG] Scouting finished.", true);
CVarSetInteger(CVAR_REMOTE_ARCHIPELAGO("ConnectionStatus"), 4); // locations scouted
}); // todo maybe move these functions to a lambda, since they don't have to be static anymore }); // todo maybe move these functions to a lambda, since they don't have to be static anymore
apClient->set_location_checked_handler([&](const std::list<int64_t> locations) { apClient->set_location_checked_handler([&](const std::list<int64_t> locations) {
@@ -370,6 +386,7 @@ void ArchipelagoClient::Poll() {
if(disconnecting) { if(disconnecting) {
apClient->reset(); apClient->reset();
apClient = nullptr; apClient = nullptr;
disconnecting = false;
return; return;
} }
@@ -527,7 +544,7 @@ void RegisterArchipelago() {
// make sure the client is constructed // make sure the client is constructed
ArchipelagoClient::GetInstance(); ArchipelagoClient::GetInstance();
CVarSetInteger(CVAR_REMOTE_ARCHIPELAGO("Connected"), 0); CVarSetInteger(CVAR_REMOTE_ARCHIPELAGO("ConnectionStatus"), 0);
COND_HOOK(GameInteractor::OnGameFrameUpdate, true, [](){ArchipelagoClient::GetInstance().Poll();}); COND_HOOK(GameInteractor::OnGameFrameUpdate, true, [](){ArchipelagoClient::GetInstance().Poll();});
COND_HOOK(GameInteractor::PostLoadGame, true, [](int32_t file_id){ArchipelagoClient::GetInstance().GameLoaded();}); COND_HOOK(GameInteractor::PostLoadGame, true, [](int32_t file_id){ArchipelagoClient::GetInstance().GameLoaded();});

View File

@@ -15,6 +15,7 @@ namespace AP_Client_consts {
static constexpr int MAX_PASSWORD_LENGTH = 32; static constexpr int MAX_PASSWORD_LENGTH = 32;
static constexpr char const* AP_GAME_NAME = "Ship of Harkinian"; static constexpr char const* AP_GAME_NAME = "Ship of Harkinian";
static constexpr int MAX_RETRIES = 6;
} }
class ArchipelagoClient{ class ArchipelagoClient{
@@ -64,6 +65,7 @@ class ArchipelagoClient{
std::unique_ptr<APClient> apClient; std::unique_ptr<APClient> apClient;
bool itemQueued; bool itemQueued;
bool disconnecting; bool disconnecting;
int retries;
protected: protected:
ArchipelagoClient(); ArchipelagoClient();

View File

@@ -1076,14 +1076,14 @@ void FileChoose_UpdateRandomizer() {
} }
} }
u8 connecting; bool FileChoose_UpdateArchipelago() {
if (CVarGetInteger(CVAR_REMOTE_ARCHIPELAGO("ConnectionStatus"), 0) == 4 && !fileSelectArchipelagoLoaded) {
void FileChoose_UpdateArchipelago() {
if (CVarGetInteger(CVAR_REMOTE_ARCHIPELAGO("Connected"), 0) && !fileSelectArchipelagoLoaded) {
ParseArchipelago(); ParseArchipelago();
fileSelectArchipelagoLoaded = true; fileSelectArchipelagoLoaded = true;
Audio_PlayFanfare(NA_BGM_HORSE_GOAL); Audio_PlayFanfare(NA_BGM_HORSE_GOAL);
return true;
} }
return false;
} }
static s16 sLastFileChooseButtonIndex; static s16 sLastFileChooseButtonIndex;
@@ -1774,11 +1774,46 @@ void FileChoose_UpdateArchipelagoMenu(GameState* thisx) {
Input* input = &this->state.input[0]; Input* input = &this->state.input[0];
bool dpad = CVarGetInteger(CVAR_SETTING("DpadInText"), 0); bool dpad = CVarGetInteger(CVAR_SETTING("DpadInText"), 0);
FileChoose_UpdateArchipelago(); if(FileChoose_UpdateArchipelago()) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
static u8 emptyName[] = { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E };
static u8 emptyNameNES[] = { 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF };
static u8 linkName[] = { 0x15, 0x2C, 0x31, 0x2E, 0x3E, 0x3E, 0x3E, 0x3E };
static u8 linkNameNES[] = { 0xB6, 0xB3, 0xB8, 0xB5, 0xDF, 0xDF, 0xDF, 0xDF };
static u8 linkNameJP[] = { 0x81, 0x87, 0x61, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF };
u8* defaultName;
if(connecting) { this->prevConfigMode = this->configMode;
return; this->configMode = CM_ROTATE_TO_NAME_ENTRY;
this->logoAlpha = 0;
CVarSetInteger(CVAR_GENERAL("OnFileSelectNameEntry"), 1);
this->kbdButton = FS_KBD_BTN_NONE;
this->charPage = FS_CHAR_PAGE_ENG;
this->kbdX = 0;
this->kbdY = 0;
this->charIndex = 0;
this->charBgAlpha = 0;
this->newFileNameCharCount = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? 4 : 0;
this->nameEntryBoxPosX = 120;
this->nameEntryBoxAlpha = 0;
if (ResourceMgr_GetGameRegion(0) == GAME_REGION_PAL && gSaveContext.language != LANGUAGE_JPN) {
defaultName = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkName : &emptyName;
} else if (gSaveContext.language == LANGUAGE_JPN) { // Japanese
if (CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) != 0) {
// Set player name to "リンク" ("Link" in Katakana, 3 characters long) when playing in Japanese.
defaultName = &linkNameJP;
this->newFileNameCharCount = 3;
} else {
defaultName = &emptyNameNES;
} }
this->charPage = FS_CHAR_PAGE_HIRA; // Default to Hiragana Keyboard
} else { // GAME_REGION_NTSC
defaultName = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkNameNES : &emptyNameNES;
}
memcpy(Save_GetSaveMetaInfo(this->buttonIndex)->playerName, defaultName, 8);
}
// Fade in elements after opening Archipelago Options menu // Fade in elements after opening Archipelago Options menu
this->archipelagoUIAlpha += 25; this->archipelagoUIAlpha += 25;
@@ -2846,10 +2881,15 @@ void FileChoose_DrawWindowContents(GameState* thisx) {
(80 + ((5 + index) * 16)), textColorR, textColorG, textColorB, textAlpha, 0.8f, true); (80 + ((5 + index) * 16)), textColorR, textColorG, textColorB, textAlpha, 0.8f, true);
} }
// Show text to indicate the client is connecting to the server. switch(CVarGetInteger(CVAR_REMOTE_ARCHIPELAGO("ConnectionStatus"), 0)) {
if (connecting) { case 1:
Interface_DrawTextLine(this->state.gfxCtx, SohFileSelect_GetArchipelagoSettingText(ASM_CONNECTING, language), 70, Interface_DrawTextLine(this->state.gfxCtx, SohFileSelect_GetArchipelagoSettingText(ASM_CONNECTING, language), 70,
(80 + 64), 255, 255, 255, textAlpha, 0.8f, true); (80 + 64), 185, 185, 185, textAlpha, 0.8f, true);
break;
case 2:
Interface_DrawTextLine(this->state.gfxCtx, SohFileSelect_GetArchipelagoSettingText(ASM_CONNECTION_ERROR, language), 70,
(80 + 64), 255, 100, 100, textAlpha, 0.8f, true);
break;
} }
uint16_t textOffset = 16 * (5 + this->archipelagoIndex); uint16_t textOffset = 16 * (5 + this->archipelagoIndex);