mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
better /warp dev command
no need to provide act and area, it will default to area 1 act 0 added alternate level abbreviations that have been used commonly in some mods (to avoid typing long level names)
This commit is contained in:
parent
b1af1ade33
commit
aa21b4feea
1 changed files with 72 additions and 16 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue