Fix bounds checking of course/act name replacement
This commit is contained in:
parent
cece41f1a8
commit
1f54996d47
|
@ -2804,7 +2804,7 @@ void render_pause_castle_main_strings(s16 x, s16 y) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
u8 courseNum = gDialogLineNum + 1;
|
u8 courseNum = gDialogLineNum + 1;
|
||||||
const u8 *courseName = get_level_name_sm64(courseNum, courseNum < COURSE_COUNT ? gCourseNumToLevelNumTable[courseNum] : LEVEL_NONE, 1, 1);
|
const u8 *courseName = get_level_name_sm64(courseNum, get_level_num_from_course_num(courseNum), 1, 1);
|
||||||
|
|
||||||
u8 strVal[8];
|
u8 strVal[8];
|
||||||
s16 starNum = gDialogLineNum;
|
s16 starNum = gDialogLineNum;
|
||||||
|
@ -2999,7 +2999,7 @@ void render_pause_castle_main_strings_extended(s16 x, s16 y) {
|
||||||
gSPDisplayList(gDisplayListHead++, dl_ia_text_begin);
|
gSPDisplayList(gDisplayListHead++, dl_ia_text_begin);
|
||||||
gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha);
|
gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha);
|
||||||
|
|
||||||
const u8 *courseName = get_level_name_sm64(gDialogLineNum, gDialogLineNum < COURSE_COUNT ? gCourseNumToLevelNumTable[gDialogLineNum] : LEVEL_NONE, 1, 1);
|
const u8 *courseName = get_level_name_sm64(gDialogLineNum, get_level_num_from_course_num(gDialogLineNum), 1, 1);
|
||||||
|
|
||||||
// Main courses (0-14)
|
// Main courses (0-14)
|
||||||
if (gDialogLineNum < COURSE_STAGES_COUNT) {
|
if (gDialogLineNum < COURSE_STAGES_COUNT) {
|
||||||
|
|
|
@ -261,17 +261,18 @@ const char *get_level_name(s16 courseNum, s16 levelNum, s16 areaIndex) {
|
||||||
const char *get_star_name_ascii(s16 courseNum, s16 starNum, s16 charCase) {
|
const char *get_star_name_ascii(s16 courseNum, s16 starNum, s16 charCase) {
|
||||||
static char output[256];
|
static char output[256];
|
||||||
|
|
||||||
if (starNum >= 0 && starNum <= 6 &&
|
s16 starIndex = starNum - 1;
|
||||||
courseNum >= 0 && courseNum <= COURSE_MAX &&
|
if (starIndex >= 0 && starIndex < MAX_ACTS &&
|
||||||
gReplacedActNameTable[courseNum]->actName && gReplacedActNameTable[courseNum]->actName[starNum - 1].isModified) {
|
courseNum >= 0 && courseNum < COURSE_END &&
|
||||||
snprintf(output, 256, "%s", gReplacedActNameTable[courseNum]->actName[starNum - 1].name);
|
gReplacedActNameTable[courseNum]->actName && gReplacedActNameTable[courseNum]->actName[starIndex].isModified) {
|
||||||
|
snprintf(output, 256, "%s", gReplacedActNameTable[courseNum]->actName[starIndex].name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main courses: BOB to RR
|
// Main courses: BOB to RR
|
||||||
else if (COURSE_IS_MAIN_COURSE(courseNum)) {
|
else if (COURSE_IS_MAIN_COURSE(courseNum)) {
|
||||||
if (starNum >= 1 && starNum <= 6) {
|
if (starIndex >= 0 && starIndex < MAX_ACTS) {
|
||||||
void **actNameTable = get_act_name_table();
|
void **actNameTable = get_act_name_table();
|
||||||
const u8 *starName = segmented_to_virtual(actNameTable[(courseNum - COURSE_BOB) * 6 + (starNum - 1)]);
|
const u8 *starName = segmented_to_virtual(actNameTable[(courseNum - COURSE_BOB) * MAX_ACTS + starIndex]);
|
||||||
convert_string_sm64_to_ascii(output, starName);
|
convert_string_sm64_to_ascii(output, starName);
|
||||||
charCase = MIN(charCase, 0); // Don't need to capitalize vanilla act names
|
charCase = MIN(charCase, 0); // Don't need to capitalize vanilla act names
|
||||||
} else if (starNum == 7) {
|
} else if (starNum == 7) {
|
||||||
|
|
|
@ -65,6 +65,13 @@ s8 gCourseNumToLevelNumTable[] = {
|
||||||
STATIC_ASSERT(ARRAY_COUNT(gLevelToCourseNumTable) == LEVEL_COUNT - 1,
|
STATIC_ASSERT(ARRAY_COUNT(gLevelToCourseNumTable) == LEVEL_COUNT - 1,
|
||||||
"change this array if you are adding levels");
|
"change this array if you are adding levels");
|
||||||
|
|
||||||
|
s8 get_level_num_from_course_num(s16 courseNum) {
|
||||||
|
if (courseNum < 0 || courseNum >= COURSE_COUNT) {
|
||||||
|
return LEVEL_NONE;
|
||||||
|
}
|
||||||
|
return gCourseNumToLevelNumTable[courseNum];
|
||||||
|
}
|
||||||
|
|
||||||
s8 get_level_course_num(s16 levelNum) {
|
s8 get_level_course_num(s16 levelNum) {
|
||||||
if (levelNum >= CUSTOM_LEVEL_NUM_START) {
|
if (levelNum >= CUSTOM_LEVEL_NUM_START) {
|
||||||
struct CustomLevelInfo* info = smlua_level_util_get_info(levelNum);
|
struct CustomLevelInfo* info = smlua_level_util_get_info(levelNum);
|
||||||
|
|
|
@ -129,6 +129,7 @@ extern struct WarpCheckpoint gWarpCheckpoint;
|
||||||
extern s8 gMainMenuDataModified;
|
extern s8 gMainMenuDataModified;
|
||||||
extern s8 gSaveFileModified;
|
extern s8 gSaveFileModified;
|
||||||
|
|
||||||
|
s8 get_level_num_from_course_num(s16 courseNum);
|
||||||
s8 get_level_course_num(s16 levelNum);
|
s8 get_level_course_num(s16 levelNum);
|
||||||
void touch_coin_score_age(s32 fileIndex, s32 courseIndex);
|
void touch_coin_score_age(s32 fileIndex, s32 courseIndex);
|
||||||
void save_file_do_save(s32 fileIndex, s8 forceSave);
|
void save_file_do_save(s32 fileIndex, s8 forceSave);
|
||||||
|
|
|
@ -44,9 +44,9 @@ AT_STARTUP static void smlua_text_utils_init() {
|
||||||
|
|
||||||
// Individual acts
|
// Individual acts
|
||||||
if (COURSE_IS_MAIN_COURSE(courseNum)) {
|
if (COURSE_IS_MAIN_COURSE(courseNum)) {
|
||||||
courseActNames->actName = calloc(6, sizeof(struct ActName));
|
courseActNames->actName = calloc(MAX_ACTS, sizeof(struct ActName));
|
||||||
for (s16 actNum = 0; actNum < 6; actNum++) {
|
for (s16 actNum = 0; actNum < MAX_ACTS; actNum++) {
|
||||||
const u8 *starName = segmented_to_virtual(actNameTbl[courseNum * 6 + actNum]);
|
const u8 *starName = segmented_to_virtual(actNameTbl[courseNum * MAX_ACTS + actNum]);
|
||||||
convert_string_sm64_to_ascii(actBuffer, starName);
|
convert_string_sm64_to_ascii(actBuffer, starName);
|
||||||
snprintf(courseActNames->actName[actNum].name, 50, "%s", actBuffer);
|
snprintf(courseActNames->actName[actNum].name, 50, "%s", actBuffer);
|
||||||
snprintf(courseActNames->actName[actNum].orig, 50, "%s", actBuffer);
|
snprintf(courseActNames->actName[actNum].orig, 50, "%s", actBuffer);
|
||||||
|
@ -136,7 +136,7 @@ void smlua_text_utils_reset_all(void) {
|
||||||
|
|
||||||
// Individual acts
|
// Individual acts
|
||||||
if (COURSE_IS_MAIN_COURSE(courseNum)) {
|
if (COURSE_IS_MAIN_COURSE(courseNum)) {
|
||||||
for (s16 actNum = 0; actNum < 6; actNum++) {
|
for (s16 actNum = 0; actNum < MAX_ACTS; actNum++) {
|
||||||
snprintf(courseActNames->actName[actNum].name, 50, "%s", courseActNames->actName[actNum].orig);
|
snprintf(courseActNames->actName[actNum].name, 50, "%s", courseActNames->actName[actNum].orig);
|
||||||
courseActNames->actName[actNum].isModified = false;
|
courseActNames->actName[actNum].isModified = false;
|
||||||
}
|
}
|
||||||
|
@ -226,7 +226,7 @@ void smlua_text_utils_course_name_reset(s16 courseNum) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void smlua_text_utils_act_name_replace(s16 courseNum, u8 actNum, const char* name) {
|
void smlua_text_utils_act_name_replace(s16 courseNum, u8 actNum, const char* name) {
|
||||||
if (INVALID_COURSE_NUM(courseNum) || actNum > 7) { return; }
|
if (INVALID_COURSE_NUM(courseNum) || actNum >= MAX_ACTS) { return; }
|
||||||
|
|
||||||
struct CourseName* courseActNames = gReplacedActNameTable[courseNum];
|
struct CourseName* courseActNames = gReplacedActNameTable[courseNum];
|
||||||
|
|
||||||
|
@ -235,19 +235,19 @@ void smlua_text_utils_act_name_replace(s16 courseNum, u8 actNum, const char* nam
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* smlua_text_utils_act_name_get(s16 courseNum, u8 actNum) {
|
const char* smlua_text_utils_act_name_get(s16 courseNum, u8 actNum) {
|
||||||
if (INVALID_COURSE_NUM(courseNum) || actNum > 7) { return NULL; }
|
if (INVALID_COURSE_NUM(courseNum) || actNum >= MAX_ACTS) { return NULL; }
|
||||||
|
|
||||||
return gReplacedActNameTable[courseNum]->actName[actNum].name;
|
return gReplacedActNameTable[courseNum]->actName[actNum].name;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool smlua_text_utils_act_name_is_modified(s16 courseNum, u8 actNum) {
|
bool smlua_text_utils_act_name_is_modified(s16 courseNum, u8 actNum) {
|
||||||
if (INVALID_COURSE_NUM(courseNum) || actNum > 7) { return false; }
|
if (INVALID_COURSE_NUM(courseNum) || actNum >= MAX_ACTS) { return false; }
|
||||||
|
|
||||||
return gReplacedActNameTable[courseNum]->actName[actNum].isModified;
|
return gReplacedActNameTable[courseNum]->actName[actNum].isModified;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smlua_text_utils_act_name_reset(s16 courseNum, u8 actNum) {
|
void smlua_text_utils_act_name_reset(s16 courseNum, u8 actNum) {
|
||||||
if (INVALID_COURSE_NUM(courseNum) || actNum > 7) { return; }
|
if (INVALID_COURSE_NUM(courseNum) || actNum >= MAX_ACTS) { return; }
|
||||||
|
|
||||||
struct CourseName* courseActNames = gReplacedActNameTable[courseNum];
|
struct CourseName* courseActNames = gReplacedActNameTable[courseNum];
|
||||||
snprintf(courseActNames->actName[actNum].name, 50, "%s", courseActNames->actName[actNum].orig);
|
snprintf(courseActNames->actName[actNum].name, 50, "%s", courseActNames->actName[actNum].orig);
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "dialog_ids.h"
|
#include "dialog_ids.h"
|
||||||
|
|
||||||
|
#define MAX_ACTS 6
|
||||||
|
|
||||||
struct ActName {
|
struct ActName {
|
||||||
char name[256];
|
char name[256];
|
||||||
char orig[256];
|
char orig[256];
|
||||||
|
|
Loading…
Reference in New Issue