diff --git a/src/pc/dev/chat.c b/src/pc/dev/chat.c index f4199a1d7..dc5a08fc1 100644 --- a/src/pc/dev/chat.c +++ b/src/pc/dev/chat.c @@ -9,6 +9,7 @@ #include "pc/debuglog.h" #include "pc/lua/utils/smlua_level_utils.h" #include "level_table.h" +#include "game/save_file.h" #ifdef DEVELOPMENT @@ -16,6 +17,57 @@ static bool str_starts_with(const char* pre, char* str) { return strncmp(pre, str, strlen(pre)) == 0; } +// For case insensitivity +static const char *upper(char *str) { + static char buffer[50]; + if (strlen(str) > 50) { return NULL; } + memset(buffer, 0, 50); + s16 i = 0; + while (str[i] != '\0' && i < 49) { + buffer[i] = toupper((unsigned char) str[i]); + i++; + } + buffer[i] = '\0'; + return buffer; +} + +static s32 get_level_abbreviation_alt(const char *str) { + + // c + course number translates to that level + // e.g. c11 is wdw + if (str[0] == 'C' && strlen(str) > 1) { + s32 course = -1; + if (sscanf(&str[1], "%d", &course) > 0) { + s32 level = get_level_num_from_course_num(course); + if (level == LEVEL_NONE) { return -1; } // Failed! + return level; + } + } + + if (strcmp(str, "S1") == 0) { return LEVEL_PSS; } + if (strcmp(str, "S2") == 0) { return LEVEL_WMOTR; } + if (strcmp(str, "S3") == 0) { return LEVEL_SA; } + if (strcmp(str, "S4") == 0) { return LEVEL_ENDING; } + + if (strcmp(str, "WC") == 0) { return LEVEL_TOTWC; } + if (strcmp(str, "VC") == 0) { return LEVEL_VCUTM; } + if (strcmp(str, "MC") == 0) { return LEVEL_COTMC; } + + if (strcmp(str, "B1") == 0) { return LEVEL_BITDW; } + if (strcmp(str, "B2") == 0) { return LEVEL_BITFS; } + if (strcmp(str, "B3") == 0) { return LEVEL_BITS; } + + if (strcmp(str, "B1F") == 0) { return LEVEL_BOWSER_1; } + if (strcmp(str, "B2F") == 0) { return LEVEL_BOWSER_2; } + if (strcmp(str, "B3F") == 0) { return LEVEL_BOWSER_3; } + + if (strcmp(str, "OW1") == 0) { return LEVEL_CASTLE_GROUNDS; } + if (strcmp(str, "OW2") == 0) { return LEVEL_CASTLE; } + if (strcmp(str, "OW3") == 0) { return LEVEL_CASTLE_COURTYARD; } + + return -1; +} + bool exec_dev_chat_command(char* command) { if (strcmp("/warp", command) == 0) { djui_chat_message_create("Missing parameters: [LEVEL] [AREA] [ACT]"); @@ -32,25 +84,28 @@ bool exec_dev_chat_command(char* command) { #undef STUB_LEVEL #undef DEFINE_LEVEL }; + s32 area = 1; + s32 act = 0; // Params char *paramLevel = command + 6; if (*paramLevel == 0 || *paramLevel == ' ') { - djui_chat_message_create("Missing parameters: [LEVEL] [AREA] [ACT]"); + djui_chat_message_create("Missing parameters: [LEVEL]"); return true; } char *paramArea = strchr(paramLevel, ' '); + char *paramAct = NULL; if (paramArea++ == NULL || *paramArea == 0 || *paramArea == ' ') { - djui_chat_message_create("Missing parameters: [AREA] [ACT]"); - return true; + paramArea = NULL; + } else { + *(paramArea - 1) = 0; + paramAct = strchr(paramArea, ' '); + if (paramAct++ == NULL || *paramAct == 0 || *paramAct == ' ') { + paramAct = NULL; + } else { + *(paramAct - 1) = 0; + } } - char *paramAct = strchr(paramArea, ' '); - if (paramAct++ == NULL || *paramAct == 0 || *paramAct == ' ') { - djui_chat_message_create("Missing parameters: [ACT]"); - return true; - } - *(paramArea - 1) = 0; - *(paramAct - 1) = 0; // Level s32 level = -1; @@ -67,6 +122,9 @@ bool exec_dev_chat_command(char* command) { level = info->levelNum; } } + if (level == -1) { + level = get_level_abbreviation_alt(upper(paramLevel)); + } if (level == -1) { char message[256]; snprintf(message, 256, "Invalid [LEVEL] parameter: %s", paramLevel); @@ -76,8 +134,7 @@ bool exec_dev_chat_command(char* command) { } // Area - s32 area = 1; - if (sscanf(paramArea, "%d", &area) <= 0) { + if (paramArea && sscanf(paramArea, "%d", &area) <= 0) { char message[256]; snprintf(message, 256, "Invalid [AREA] parameter: %s", paramArea); djui_chat_message_create(message); @@ -85,8 +142,7 @@ bool exec_dev_chat_command(char* command) { } // Act - s32 act = 1; - if (sscanf(paramAct, "%d", &act) <= 0) { + if (paramAct && sscanf(paramAct, "%d", &act) <= 0) { char message[256]; snprintf(message, 256, "Invalid [ACT] parameter: %s", paramAct); djui_chat_message_create(message); @@ -96,14 +152,14 @@ bool exec_dev_chat_command(char* command) { // Warp if (!dynos_warp_to_level(level, area, act)) { char message[256]; - snprintf(message, 256, "Unable to warp to: %s %s %s", paramLevel, paramArea, paramAct); + snprintf(message, 256, "Unable to warp to: %s %d %d", paramLevel, area, act); djui_chat_message_create(message); return true; } // OK char message[256]; - snprintf(message, 256, "Warping to: %s %s %s...", paramLevel, paramArea, paramAct); + snprintf(message, 256, "Warping to: %s %d %d...", paramLevel, area, act); djui_chat_message_create(message); return true; }