decompile string_util
This commit is contained in:
+2
-2
@@ -4084,7 +4084,7 @@ sub_809F914: @ 809F914
|
||||
bcs _0809F9AA
|
||||
add r5, sp, 0xC
|
||||
mov r10, r4
|
||||
ldr r0, _0809F9E4 @ =gUnknown_8415A20
|
||||
ldr r0, _0809F9E4 @ =gExpandedPlaceholder_Empty
|
||||
ldrb r0, [r0]
|
||||
mov r8, r0
|
||||
_0809F956:
|
||||
@@ -4154,7 +4154,7 @@ _0809F9AA:
|
||||
_0809F9D8: .4byte gUnknown_203998C
|
||||
_0809F9DC: .4byte 0x00001e28
|
||||
_0809F9E0: .4byte 0x00001e13
|
||||
_0809F9E4: .4byte gUnknown_8415A20
|
||||
_0809F9E4: .4byte gExpandedPlaceholder_Empty
|
||||
thumb_func_end sub_809F914
|
||||
|
||||
thumb_func_start sub_809F9E8
|
||||
|
||||
-1168
File diff suppressed because it is too large
Load Diff
+12
-30
@@ -1,23 +1,5 @@
|
||||
.section .rodata
|
||||
|
||||
gUnknown_8231E2C:: @ 8231E2C
|
||||
.incbin "baserom.gba", 0x231E2C, 0x10
|
||||
|
||||
gUnknown_8231E3C:: @ 8231E3C
|
||||
.incbin "baserom.gba", 0x231E3C, 0x28
|
||||
|
||||
gUnknown_8231E64:: @ 8231E64
|
||||
.incbin "baserom.gba", 0x231E64, 0x4
|
||||
|
||||
gUnknown_8231E68:: @ 8231E68
|
||||
.incbin "baserom.gba", 0x231E68, 0x8
|
||||
|
||||
gUnknown_8231E70:: @ 8231E70
|
||||
.incbin "baserom.gba", 0x231E70, 0x38
|
||||
|
||||
gUnknown_8231EA8:: @ 8231EA8
|
||||
.incbin "baserom.gba", 0x231EA8, 0x1C
|
||||
|
||||
gUnknown_8231EC4:: @ 8231EC4
|
||||
.incbin "baserom.gba", 0x231EC4, 0x20
|
||||
|
||||
@@ -4188,40 +4170,40 @@ gUnknown_8415A08:: @ 8415A08
|
||||
gUnknown_8415A10:: @ 8415A10
|
||||
.incbin "baserom.gba", 0x415A10, 0x10
|
||||
|
||||
gUnknown_8415A20:: @ 8415A20
|
||||
gExpandedPlaceholder_Empty:: @ 8415A20
|
||||
.incbin "baserom.gba", 0x415A20, 0x1
|
||||
|
||||
gUnknown_8415A21:: @ 8415A21
|
||||
gExpandedPlaceholder_Kun:: @ 8415A21
|
||||
.incbin "baserom.gba", 0x415A21, 0x1
|
||||
|
||||
gUnknown_8415A22:: @ 8415A22
|
||||
gExpandedPlaceholder_Chan:: @ 8415A22
|
||||
.incbin "baserom.gba", 0x415A22, 0xA
|
||||
|
||||
gUnknown_8415A2C:: @ 8415A2C
|
||||
gExpandedPlaceholder_Ruby:: @ 8415A2C
|
||||
.incbin "baserom.gba", 0x415A2C, 0x5
|
||||
|
||||
gUnknown_8415A31:: @ 8415A31
|
||||
gExpandedPlaceholder_Aqua:: @ 8415A31
|
||||
.incbin "baserom.gba", 0x415A31, 0x5
|
||||
|
||||
gUnknown_8415A36:: @ 8415A36
|
||||
gExpandedPlaceholder_Magma:: @ 8415A36
|
||||
.incbin "baserom.gba", 0x415A36, 0x6
|
||||
|
||||
gUnknown_8415A3C:: @ 8415A3C
|
||||
gExpandedPlaceholder_Archie:: @ 8415A3C
|
||||
.incbin "baserom.gba", 0x415A3C, 0x7
|
||||
|
||||
gUnknown_8415A43:: @ 8415A43
|
||||
gExpandedPlaceholder_Maxie:: @ 8415A43
|
||||
.incbin "baserom.gba", 0x415A43, 0x6
|
||||
|
||||
gUnknown_8415A49:: @ 8415A49
|
||||
gExpandedPlaceholder_Kyogre:: @ 8415A49
|
||||
.incbin "baserom.gba", 0x415A49, 0x7
|
||||
|
||||
gUnknown_8415A50:: @ 8415A50
|
||||
gExpandedPlaceholder_Groudon:: @ 8415A50
|
||||
.incbin "baserom.gba", 0x415A50, 0x8
|
||||
|
||||
gUnknown_8415A58:: @ 8415A58
|
||||
gExpandedPlaceholder_Red:: @ 8415A58
|
||||
.incbin "baserom.gba", 0x415A58, 0x4
|
||||
|
||||
gUnknown_8415A5C:: @ 8415A5C
|
||||
gExpandedPlaceholder_Green:: @ 8415A5C
|
||||
.incbin "baserom.gba", 0x415A5C, 0x6
|
||||
|
||||
gUnknown_8415A62:: @ 8415A62
|
||||
|
||||
+2
-148
@@ -454,156 +454,10 @@ struct RecordMixingDayCareMail
|
||||
#define VARS_COUNT 256
|
||||
#define MAIL_COUNT 16
|
||||
|
||||
enum
|
||||
{
|
||||
LILYCOVE_LADY_QUIZ,
|
||||
LILYCOVE_LADY_FAVOUR,
|
||||
LILYCOVE_LADY_CONTEST
|
||||
};
|
||||
|
||||
struct LilycoveLadyQuiz
|
||||
{
|
||||
/*0x000*/ u8 id;
|
||||
/*0x001*/ u8 phase;
|
||||
/*0x002*/ u16 unk_002[9];
|
||||
/*0x014*/ u16 unk_014;
|
||||
/*0x016*/ u16 unk_016;
|
||||
/*0x018*/ u8 playerName[8];
|
||||
/*0x020*/ u16 playerTrainerId[4];
|
||||
/*0x028*/ u16 itemId;
|
||||
/*0x02a*/ u8 unk_02a;
|
||||
/*0x02b*/ u8 unk_02b;
|
||||
/*0x02c*/ u8 unk_02c;
|
||||
/*0x02d*/ u8 language;
|
||||
};
|
||||
|
||||
struct LilycoveLadyFavour
|
||||
{
|
||||
/*0x000*/ u8 id;
|
||||
/*0x001*/ u8 phase;
|
||||
/*0x002*/ u8 unk_002;
|
||||
/*0x003*/ u8 unk_003;
|
||||
/*0x004*/ u8 playerName[8];
|
||||
/*0x00c*/ u8 unk_00c;
|
||||
/*0x00e*/ u16 itemId;
|
||||
/*0x010*/ u16 unk_010;
|
||||
/*0x012*/ u8 language;
|
||||
};
|
||||
|
||||
struct LilycoveLadyContest
|
||||
{
|
||||
/*0x000*/ u8 id;
|
||||
/*0x001*/ u8 phase;
|
||||
/*0x002*/ u8 fave_pkblk;
|
||||
/*0x003*/ u8 other_pkblk;
|
||||
/*0x004*/ u8 playerName[8];
|
||||
/*0x00c*/ u8 max_sheen;
|
||||
/*0x00d*/ u8 category;
|
||||
/*0x00e*/ u8 language;
|
||||
};
|
||||
|
||||
typedef union // TODO
|
||||
{
|
||||
struct LilycoveLadyQuiz quiz;
|
||||
struct LilycoveLadyFavour favour;
|
||||
struct LilycoveLadyContest contest;
|
||||
u8 id;
|
||||
} LilycoveLady;
|
||||
|
||||
struct WaldaPhrase
|
||||
{
|
||||
u16 field_0;
|
||||
u16 field_2;
|
||||
u8 text[16];
|
||||
u8 iconId;
|
||||
u8 patternId;
|
||||
bool8 patternUnlocked;
|
||||
};
|
||||
|
||||
struct SaveBlock1
|
||||
{
|
||||
/*0x00*/ struct Coords16 pos;
|
||||
/*0x04*/ struct WarpData location;
|
||||
/*0x0C*/ struct WarpData warp1;
|
||||
/*0x14*/ struct WarpData warp2;
|
||||
/*0x1C*/ struct WarpData warp3;
|
||||
/*0x24*/ struct WarpData warp4;
|
||||
/*0x2C*/ u16 battleMusic;
|
||||
/*0x2E*/ u8 weather;
|
||||
/*0x2F*/ u8 filler_2F;
|
||||
/*0x30*/ u8 flashUsed;
|
||||
/*0x32*/ u16 mapDataId;
|
||||
/*0x34*/ u16 mapView[0x100];
|
||||
/*0x234*/ u8 playerPartyCount;
|
||||
/*0x238*/ struct Pokemon playerParty[6];
|
||||
/*0x490*/ u32 money;
|
||||
/*0x494*/ u16 coins;
|
||||
/*0x496*/ u16 registeredItem; // registered for use with SELECT button
|
||||
/*0x498*/ struct ItemSlot pcItems[50];
|
||||
/*0x560*/ struct ItemSlot bagPocket_Items[30];
|
||||
/*0x5D8*/ struct ItemSlot bagPocket_KeyItems[30];
|
||||
/*0x650*/ struct ItemSlot bagPocket_PokeBalls[16];
|
||||
/*0x690*/ struct ItemSlot bagPocket_TMHM[64];
|
||||
/*0x790*/ struct ItemSlot bagPocket_Berries[46];
|
||||
/*0x848*/ struct Pokeblock pokeblocks[40];
|
||||
/*0x988*/ u8 seen1[52];
|
||||
/*0x9BC*/ u16 berryBlenderRecords[3];
|
||||
/*0x9C2*/ u8 field_9C2[6];
|
||||
/*0x9C8*/ u16 trainerRematchStepCounter;
|
||||
/*0x9CA*/ u8 trainerRematches[100];
|
||||
/*0xA30*/ struct MapObject mapObjects[MAP_OBJECTS_COUNT];
|
||||
/*0xC70*/ struct MapObjectTemplate mapObjectTemplates[64];
|
||||
/*0x1270*/ u8 flags[FLAGS_COUNT];
|
||||
/*0x139C*/ u16 vars[VARS_COUNT];
|
||||
/*0x159C*/ u32 gameStats[NUM_GAME_STATS];
|
||||
/*0x169C*/ struct BerryTree berryTrees[BERRY_TREES_COUNT];
|
||||
/*0x1A9C*/ struct SecretBaseRecord secretBases[20];
|
||||
/*0x271C*/ u8 playerRoomDecor[12];
|
||||
/*0x2728*/ u8 playerRoomDecorPos[12];
|
||||
/*0x2734*/ u8 decorDesk[10];
|
||||
/*0x????*/ u8 decorChair[10];
|
||||
/*0x????*/ u8 decorPlant[10];
|
||||
/*0x????*/ u8 decorOrnament[30];
|
||||
/*0x????*/ u8 decorMat[30];
|
||||
/*0x????*/ u8 decorPoster[10];
|
||||
/*0x????*/ u8 decorDoll[40];
|
||||
/*0x????*/ u8 decorCushion[10];
|
||||
/*0x27CA*/ u8 padding_27CA[2];
|
||||
/*0x2B90*/ u16 outbreakPokemonSpecies;
|
||||
/*0x2B92*/ u8 outbreakLocationMapNum;
|
||||
/*0x2B93*/ u8 outbreakLocationMapGroup;
|
||||
/*0x2B94*/ u8 outbreakPokemonLevel;
|
||||
/*0x2B95*/ u8 outbreakUnk1;
|
||||
/*0x2B96*/ u16 outbreakUnk2;
|
||||
/*0x2B98*/ u16 outbreakPokemonMoves[4];
|
||||
/*0x2BA0*/ u8 outbreakUnk4;
|
||||
/*0x2BA1*/ u8 outbreakPokemonProbability;
|
||||
/*0x2BA2*/ u16 outbreakDaysLeft;
|
||||
/*0x2BB0*/ u16 unk2BB0[6];
|
||||
/*0x2BBC*/ u16 unk2BBC[6];
|
||||
/*0x2BC8*/ u16 unk2BC8[6];
|
||||
/*0x2BD4*/ u16 unk2BD4[6];
|
||||
/*0x2BE0*/ struct MailStruct mail[MAIL_COUNT];
|
||||
/*0x2E20*/ u8 additionalPhrases[5]; // bitfield for 33 additional phrases in easy chat system
|
||||
/*0x2E25*/ u8 unk2E25[3]; // possibly padding?
|
||||
/*0x2E28*/ OldMan oldMan;
|
||||
/*0x2e64*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
|
||||
/*0x2e90*/ struct ContestWinner contestWinners[13]; // 0 - 5 used in contest hall, 6 - 7 unused?, 8 - 12 museum
|
||||
/*0x3030*/ struct DayCare daycare;
|
||||
/*0x3150*/ struct LinkBattleRecord linkBattleRecords[5];
|
||||
/*0x31A0*/ u8 unk_31A0;
|
||||
/*0x31A1*/ u8 filler_31A1[7];
|
||||
/*0x31A8*/ u8 giftRibbons[52];
|
||||
/*0x31DC*/ struct Roamer roamer;
|
||||
/*0x31F8*/ struct EnigmaBerry enigmaBerry;
|
||||
/*0x322C*/ u8 field_322C[1276];
|
||||
/*0x3728*/ struct RamScript ramScript;
|
||||
/*0x3B14*/ struct RecordMixingGift recordMixingGift;
|
||||
/*0x3B24*/ u8 seen2[52];
|
||||
/*0x3B58*/ LilycoveLady lilycoveLady;
|
||||
/*0x3B88*/ u8 filler_3B88[0x1E8];
|
||||
/*0x3D70*/ struct WaldaPhrase waldaPhrase;
|
||||
// sizeof: 0x3D88
|
||||
/*0x0000*/ u8 filler[0x3A4C];
|
||||
/*0x3A4C*/ u8 rivalName[PLAYER_NAME_LENGTH];
|
||||
};
|
||||
|
||||
extern struct SaveBlock1* gSaveBlock1Ptr;
|
||||
|
||||
+2
-1
@@ -95,7 +95,7 @@ SECTIONS {
|
||||
src/text.o(.text);
|
||||
asm/text.o(.text);
|
||||
src/sprite.o(.text);
|
||||
asm/string_util.o(.text);
|
||||
src/string_util.o(.text);
|
||||
asm/link.o(.text);
|
||||
asm/multiboot.o(.text);
|
||||
asm/main_menu.o(.text);
|
||||
@@ -402,6 +402,7 @@ SECTIONS {
|
||||
data/text.o(.rodata);
|
||||
src/sprite.o(.rodata);
|
||||
src/bg_regs.o(.rodata);
|
||||
src/string_util.o(.rodata);
|
||||
data/data.o(.rodata);
|
||||
src/m4a_tables.o(.rodata);
|
||||
data/sound_data.o(.rodata);
|
||||
|
||||
@@ -0,0 +1,691 @@
|
||||
#include "global.h"
|
||||
#include "string_util.h"
|
||||
#include "text.h"
|
||||
|
||||
EWRAM_DATA u8 gUnknownStringVar[16] = {0};
|
||||
|
||||
static const u8 sDigits[] = __("0123456789ABCDEF");
|
||||
|
||||
static const s32 sPowersOfTen[] =
|
||||
{
|
||||
1,
|
||||
10,
|
||||
100,
|
||||
1000,
|
||||
10000,
|
||||
100000,
|
||||
1000000,
|
||||
10000000,
|
||||
100000000,
|
||||
1000000000,
|
||||
};
|
||||
|
||||
extern u8 gExpandedPlaceholder_Empty[];
|
||||
extern u8 gExpandedPlaceholder_Kun[];
|
||||
extern u8 gExpandedPlaceholder_Chan[];
|
||||
extern u8 gExpandedPlaceholder_Sapphire[];
|
||||
extern u8 gExpandedPlaceholder_Ruby[];
|
||||
extern u8 gExpandedPlaceholder_Aqua[];
|
||||
extern u8 gExpandedPlaceholder_Magma[];
|
||||
extern u8 gExpandedPlaceholder_Archie[];
|
||||
extern u8 gExpandedPlaceholder_Maxie[];
|
||||
extern u8 gExpandedPlaceholder_Kyogre[];
|
||||
extern u8 gExpandedPlaceholder_Groudon[];
|
||||
extern u8 gExpandedPlaceholder_Red[];
|
||||
extern u8 gExpandedPlaceholder_Green[];
|
||||
|
||||
u8 *StringCopy10(u8 *dest, const u8 *src)
|
||||
{
|
||||
u8 i;
|
||||
u32 limit = 10;
|
||||
|
||||
for (i = 0; i < limit; i++)
|
||||
{
|
||||
dest[i] = src[i];
|
||||
|
||||
if (dest[i] == EOS)
|
||||
return &dest[i];
|
||||
}
|
||||
|
||||
dest[i] = EOS;
|
||||
return &dest[i];
|
||||
}
|
||||
|
||||
u8 *StringGetEnd10(u8 *str)
|
||||
{
|
||||
u8 i;
|
||||
u32 limit = 10;
|
||||
|
||||
for (i = 0; i < limit; i++)
|
||||
if (str[i] == EOS)
|
||||
return &str[i];
|
||||
|
||||
str[i] = EOS;
|
||||
return &str[i];
|
||||
}
|
||||
|
||||
u8 *StringCopy7(u8 *dest, const u8 *src)
|
||||
{
|
||||
s32 i;
|
||||
s32 limit = 7;
|
||||
|
||||
for (i = 0; i < limit; i++)
|
||||
{
|
||||
dest[i] = src[i];
|
||||
|
||||
if (dest[i] == EOS)
|
||||
return &dest[i];
|
||||
}
|
||||
|
||||
dest[i] = EOS;
|
||||
return &dest[i];
|
||||
}
|
||||
|
||||
u8 *StringCopy(u8 *dest, const u8 *src)
|
||||
{
|
||||
while (*src != EOS)
|
||||
{
|
||||
*dest = *src;
|
||||
dest++;
|
||||
src++;
|
||||
}
|
||||
|
||||
*dest = EOS;
|
||||
return dest;
|
||||
}
|
||||
|
||||
u8 *StringAppend(u8 *dest, const u8 *src)
|
||||
{
|
||||
while (*dest != EOS)
|
||||
dest++;
|
||||
|
||||
return StringCopy(dest, src);
|
||||
}
|
||||
|
||||
u8 *StringCopyN(u8 *dest, const u8 *src, u8 n)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
dest[i] = src[i];
|
||||
|
||||
return &dest[n];
|
||||
}
|
||||
|
||||
u8 *StringAppendN(u8 *dest, const u8 *src, u8 n)
|
||||
{
|
||||
while (*dest != EOS)
|
||||
dest++;
|
||||
|
||||
return StringCopyN(dest, src, n);
|
||||
}
|
||||
|
||||
u16 StringLength(const u8 *str)
|
||||
{
|
||||
u16 length = 0;
|
||||
|
||||
while (str[length] != EOS)
|
||||
length++;
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
s32 StringCompare(const u8 *str1, const u8 *str2)
|
||||
{
|
||||
while (*str1 == *str2)
|
||||
{
|
||||
if (*str1 == EOS)
|
||||
return 0;
|
||||
str1++;
|
||||
str2++;
|
||||
}
|
||||
|
||||
return *str1 - *str2;
|
||||
}
|
||||
|
||||
s32 StringCompareN(const u8 *str1, const u8 *str2, u32 n)
|
||||
{
|
||||
while (*str1 == *str2)
|
||||
{
|
||||
if (*str1 == EOS)
|
||||
return 0;
|
||||
str1++;
|
||||
str2++;
|
||||
if (--n == 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return *str1 - *str2;
|
||||
}
|
||||
|
||||
u8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n)
|
||||
{
|
||||
enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state;
|
||||
s32 powerOfTen;
|
||||
s32 largestPowerOfTen = sPowersOfTen[n - 1];
|
||||
|
||||
state = WAITING_FOR_NONZERO_DIGIT;
|
||||
|
||||
if (mode == STR_CONV_MODE_RIGHT_ALIGN)
|
||||
state = WRITING_SPACES;
|
||||
|
||||
if (mode == STR_CONV_MODE_LEADING_ZEROS)
|
||||
state = WRITING_DIGITS;
|
||||
|
||||
for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10)
|
||||
{
|
||||
u8 *out;
|
||||
u8 c;
|
||||
u16 digit = value / powerOfTen;
|
||||
s32 temp = value - (powerOfTen * digit);
|
||||
|
||||
if (state == WRITING_DIGITS)
|
||||
{
|
||||
out = dest++;
|
||||
|
||||
if (digit <= 9)
|
||||
c = sDigits[digit];
|
||||
else
|
||||
c = CHAR_QUESTION_MARK;
|
||||
|
||||
*out = c;
|
||||
}
|
||||
else if (digit != 0 || powerOfTen == 1)
|
||||
{
|
||||
state = WRITING_DIGITS;
|
||||
out = dest++;
|
||||
|
||||
if (digit <= 9)
|
||||
c = sDigits[digit];
|
||||
else
|
||||
c = CHAR_QUESTION_MARK;
|
||||
|
||||
*out = c;
|
||||
}
|
||||
else if (state == WRITING_SPACES)
|
||||
{
|
||||
*dest++ = CHAR_SPACE;
|
||||
}
|
||||
|
||||
value = temp;
|
||||
}
|
||||
|
||||
*dest = EOS;
|
||||
return dest;
|
||||
}
|
||||
|
||||
u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n)
|
||||
{
|
||||
enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state;
|
||||
u8 i;
|
||||
s32 powerOfSixteen;
|
||||
s32 largestPowerOfSixteen = 1;
|
||||
|
||||
for (i = 1; i < n; i++)
|
||||
largestPowerOfSixteen *= 16;
|
||||
|
||||
state = WAITING_FOR_NONZERO_DIGIT;
|
||||
|
||||
if (mode == STR_CONV_MODE_RIGHT_ALIGN)
|
||||
state = WRITING_SPACES;
|
||||
|
||||
if (mode == STR_CONV_MODE_LEADING_ZEROS)
|
||||
state = WRITING_DIGITS;
|
||||
|
||||
for (powerOfSixteen = largestPowerOfSixteen; powerOfSixteen > 0; powerOfSixteen /= 16)
|
||||
{
|
||||
u8 *out;
|
||||
u8 c;
|
||||
u32 digit = value / powerOfSixteen;
|
||||
s32 temp = value % powerOfSixteen;
|
||||
|
||||
if (state == WRITING_DIGITS)
|
||||
{
|
||||
out = dest++;
|
||||
|
||||
if (digit <= 0xF)
|
||||
c = sDigits[digit];
|
||||
else
|
||||
c = CHAR_QUESTION_MARK;
|
||||
|
||||
*out = c;
|
||||
}
|
||||
else if (digit != 0 || powerOfSixteen == 1)
|
||||
{
|
||||
state = WRITING_DIGITS;
|
||||
out = dest++;
|
||||
|
||||
if (digit <= 0xF)
|
||||
c = sDigits[digit];
|
||||
else
|
||||
c = CHAR_QUESTION_MARK;
|
||||
|
||||
*out = c;
|
||||
}
|
||||
else if (state == WRITING_SPACES)
|
||||
{
|
||||
*dest++ = CHAR_SPACE;
|
||||
}
|
||||
|
||||
value = temp;
|
||||
}
|
||||
|
||||
*dest = EOS;
|
||||
return dest;
|
||||
}
|
||||
|
||||
u8 *StringExpandPlaceholders(u8 *dest, const u8 *src)
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
u8 c = *src++;
|
||||
u8 placeholderId;
|
||||
u8 *expandedString;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case PLACEHOLDER_BEGIN:
|
||||
placeholderId = *src++;
|
||||
expandedString = GetExpandedPlaceholder(placeholderId);
|
||||
dest = StringExpandPlaceholders(dest, expandedString);
|
||||
break;
|
||||
case EXT_CTRL_CODE_BEGIN:
|
||||
*dest++ = c;
|
||||
c = *src++;
|
||||
*dest++ = c;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 0x07:
|
||||
case 0x09:
|
||||
case 0x0F:
|
||||
case 0x15:
|
||||
case 0x16:
|
||||
case 0x17:
|
||||
case 0x18:
|
||||
break;
|
||||
case 0x04:
|
||||
*dest++ = *src++;
|
||||
case 0x0B:
|
||||
*dest++ = *src++;
|
||||
default:
|
||||
*dest++ = *src++;
|
||||
}
|
||||
break;
|
||||
case EOS:
|
||||
*dest = EOS;
|
||||
return dest;
|
||||
case 0xFA:
|
||||
case 0xFB:
|
||||
case 0xFE:
|
||||
default:
|
||||
*dest++ = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
u8 *StringBraille(u8 *dest, const u8 *src)
|
||||
{
|
||||
u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF };
|
||||
u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF };
|
||||
|
||||
dest = StringCopy(dest, setBrailleFont);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
u8 c = *src++;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case EOS:
|
||||
*dest = c;
|
||||
return dest;
|
||||
case 0xFE:
|
||||
dest = StringCopy(dest, gotoLine2);
|
||||
break;
|
||||
default:
|
||||
*dest++ = c;
|
||||
*dest++ = c + 0x40;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_UnknownStringVar(void)
|
||||
{
|
||||
return gUnknownStringVar;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_PlayerName(void)
|
||||
{
|
||||
return gSaveBlock2Ptr->playerName;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_StringVar1(void)
|
||||
{
|
||||
return gStringVar1;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_StringVar2(void)
|
||||
{
|
||||
return gStringVar2;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_StringVar3(void)
|
||||
{
|
||||
return gStringVar3;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_KunChan(void)
|
||||
{
|
||||
if (gSaveBlock2Ptr->playerGender == MALE)
|
||||
return gExpandedPlaceholder_Kun;
|
||||
else
|
||||
return gExpandedPlaceholder_Chan;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_RivalName(void)
|
||||
{
|
||||
if (gSaveBlock1Ptr->rivalName[0] == EOS)
|
||||
{
|
||||
if (gSaveBlock2Ptr->playerGender == MALE)
|
||||
return gExpandedPlaceholder_Green;
|
||||
else
|
||||
return gExpandedPlaceholder_Red;
|
||||
}
|
||||
else
|
||||
{
|
||||
return gSaveBlock1Ptr->rivalName;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_Version(void)
|
||||
{
|
||||
return gExpandedPlaceholder_Ruby;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_Magma(void)
|
||||
{
|
||||
return gExpandedPlaceholder_Magma;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_Aqua(void)
|
||||
{
|
||||
return gExpandedPlaceholder_Aqua;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_Maxie(void)
|
||||
{
|
||||
return gExpandedPlaceholder_Maxie;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_Archie(void)
|
||||
{
|
||||
return gExpandedPlaceholder_Archie;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_Groudon(void)
|
||||
{
|
||||
return gExpandedPlaceholder_Groudon;
|
||||
}
|
||||
|
||||
static u8 *ExpandPlaceholder_Kyogre(void)
|
||||
{
|
||||
return gExpandedPlaceholder_Kyogre;
|
||||
}
|
||||
|
||||
u8 *GetExpandedPlaceholder(u32 id)
|
||||
{
|
||||
typedef u8 *(*ExpandPlaceholderFunc)(void);
|
||||
|
||||
static const ExpandPlaceholderFunc funcs[] =
|
||||
{
|
||||
ExpandPlaceholder_UnknownStringVar,
|
||||
ExpandPlaceholder_PlayerName,
|
||||
ExpandPlaceholder_StringVar1,
|
||||
ExpandPlaceholder_StringVar2,
|
||||
ExpandPlaceholder_StringVar3,
|
||||
ExpandPlaceholder_KunChan,
|
||||
ExpandPlaceholder_RivalName,
|
||||
ExpandPlaceholder_Version,
|
||||
ExpandPlaceholder_Magma,
|
||||
ExpandPlaceholder_Aqua,
|
||||
ExpandPlaceholder_Maxie,
|
||||
ExpandPlaceholder_Archie,
|
||||
ExpandPlaceholder_Groudon,
|
||||
ExpandPlaceholder_Kyogre,
|
||||
};
|
||||
|
||||
if (id >= ARRAY_COUNT(funcs))
|
||||
return gExpandedPlaceholder_Empty;
|
||||
else
|
||||
return funcs[id]();
|
||||
}
|
||||
|
||||
u8 *StringFill(u8 *dest, u8 c, u16 n)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
*dest++ = c;
|
||||
|
||||
*dest = EOS;
|
||||
return dest;
|
||||
}
|
||||
|
||||
u8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n)
|
||||
{
|
||||
while (*src != EOS)
|
||||
{
|
||||
*dest++ = *src++;
|
||||
|
||||
if (n)
|
||||
n--;
|
||||
}
|
||||
|
||||
n--;
|
||||
|
||||
while (n != (u16)-1)
|
||||
{
|
||||
*dest++ = c;
|
||||
n--;
|
||||
}
|
||||
|
||||
*dest = EOS;
|
||||
return dest;
|
||||
}
|
||||
|
||||
u8 *StringFillWithTerminator(u8 *dest, u16 n)
|
||||
{
|
||||
return StringFill(dest, EOS, n);
|
||||
}
|
||||
|
||||
u8 *StringCopyN_Multibyte(u8 *dest, u8 *src, u32 n)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = n - 1; i != (u32)-1; i--)
|
||||
{
|
||||
if (*src == EOS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
*dest++ = *src++;
|
||||
if (*(src - 1) == 0xF9)
|
||||
*dest++ = *src++;
|
||||
}
|
||||
}
|
||||
|
||||
*dest = EOS;
|
||||
return dest;
|
||||
}
|
||||
|
||||
u32 StringLength_Multibyte(u8 *str)
|
||||
{
|
||||
u32 length = 0;
|
||||
|
||||
while (*str != EOS)
|
||||
{
|
||||
if (*str == 0xF9)
|
||||
str++;
|
||||
str++;
|
||||
length++;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
u8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color)
|
||||
{
|
||||
*dest = 0xFC;
|
||||
dest++;
|
||||
|
||||
switch (colorType)
|
||||
{
|
||||
case 0:
|
||||
*dest = 1;
|
||||
dest++;
|
||||
break;
|
||||
case 1:
|
||||
*dest = 3;
|
||||
dest++;
|
||||
break;
|
||||
case 2:
|
||||
*dest = 2;
|
||||
dest++;
|
||||
break;
|
||||
}
|
||||
|
||||
*dest = color;
|
||||
dest++;
|
||||
*dest = EOS;
|
||||
return dest;
|
||||
}
|
||||
|
||||
u8 GetExtCtrlCodeLength(u8 code)
|
||||
{
|
||||
static const u8 lengths[] =
|
||||
{
|
||||
1,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
4,
|
||||
2,
|
||||
2,
|
||||
1,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
3,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
1,
|
||||
3,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
};
|
||||
|
||||
u8 length = 0;
|
||||
if (code < ARRAY_COUNT(lengths))
|
||||
length = lengths[code];
|
||||
return length;
|
||||
}
|
||||
|
||||
static const u8 *SkipExtCtrlCode(const u8 *s)
|
||||
{
|
||||
while (*s == 0xFC)
|
||||
{
|
||||
s++;
|
||||
s += GetExtCtrlCodeLength(*s);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2)
|
||||
{
|
||||
s32 retVal = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
str1 = SkipExtCtrlCode(str1);
|
||||
str2 = SkipExtCtrlCode(str2);
|
||||
|
||||
if (*str1 > *str2)
|
||||
break;
|
||||
|
||||
if (*str1 < *str2)
|
||||
{
|
||||
retVal = -1;
|
||||
if (*str2 == 0xFF)
|
||||
retVal = 1;
|
||||
}
|
||||
|
||||
if (*str1 == 0xFF)
|
||||
return retVal;
|
||||
|
||||
str1++;
|
||||
str2++;
|
||||
}
|
||||
|
||||
retVal = 1;
|
||||
|
||||
if (*str1 == 0xFF)
|
||||
retVal = -1;
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
void ConvertInternationalString(u8 *s, u8 language)
|
||||
{
|
||||
if (language == LANGUAGE_JAPANESE)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
StripExtCtrlCodes(s);
|
||||
i = StringLength(s);
|
||||
s[i++] = 0xFC;
|
||||
s[i++] = 22;
|
||||
s[i++] = 0xFF;
|
||||
|
||||
i--;
|
||||
|
||||
while (i != (u8)-1)
|
||||
{
|
||||
s[i + 2] = s[i];
|
||||
i--;
|
||||
}
|
||||
|
||||
s[0] = 0xFC;
|
||||
s[1] = 21;
|
||||
}
|
||||
}
|
||||
|
||||
void StripExtCtrlCodes(u8 *str)
|
||||
{
|
||||
u16 srcIndex = 0;
|
||||
u16 destIndex = 0;
|
||||
while (str[srcIndex] != 0xFF)
|
||||
{
|
||||
if (str[srcIndex] == 0xFC)
|
||||
{
|
||||
srcIndex++;
|
||||
srcIndex += GetExtCtrlCodeLength(str[srcIndex]);
|
||||
}
|
||||
else
|
||||
{
|
||||
str[destIndex++] = str[srcIndex++];
|
||||
}
|
||||
}
|
||||
str[destIndex] = 0xFF;
|
||||
}
|
||||
Reference in New Issue
Block a user