Merge branch 'master' into code_8069E0C

This commit is contained in:
DizzyEggg 2024-11-22 09:43:35 +01:00
commit 4c379c3c7e
9 changed files with 344 additions and 923 deletions

View File

@ -36,11 +36,8 @@ void LoadMonsterParameters(void);
unkStruct_203B45C *GetRecruitedPokemon(void);
void InitializeRecruitedPokemon(void);
// This needs to be overridden in status_actions.c
// Uncomment when fixed
//u8 GetBodySize(s16 index);
u8 GetBodySize(s32 index);
void CopyMonsterNameToBuffer(u8 * buffer, s32 index);
void CopyYellowMonsterNametoBuffer(u8 *buffer, s16 index);
void PrintColoredPokeNameToBuffer(u8 *buffer, PokemonStruct1 *pokemon, s32 colorNum);

View File

@ -15,10 +15,12 @@ struct unkShiftData
// size: 0xC
struct unkChar
{
u32 *unk0;
u16 *unk0;
u16 unk4;
s16 unk6;
u32 fill8;
u8 fill8;
u8 fill9;
u8 unkA;
};
struct unkStruct_80B8824

View File

@ -16,7 +16,6 @@ extern s32 sub_80902C8(u8 dungeon);
extern s16 ExtractSpeciesIndex(UnkDungeonGlobal_unk1CD98 *r0);
extern u32 ExtractLevel(UnkDungeonGlobal_unk1CD98 *r0);
extern void sub_808E9C4(UnkDungeonGlobal_unk1CD98 *r0, s16 r1);
extern u8 GetBodySize(s16 index);
extern bool8 sub_80848EC(void);
extern u8 GetFloorType(void);
extern const u8 *GetDungeonName2(u8 dungeon);

View File

@ -45,7 +45,6 @@ u8 sub_806B8CC();
bool8 sub_805FBE8(u8 *a0);
void sub_8083D88();
u8 sub_808529C(s32);
extern u8 GetBodySize(s16 index);
void nullsub_96(Entity *pokemon,Entity *target);
u8 sub_8097900(s16);
void sub_806F910(void);

View File

@ -15,6 +15,7 @@
#include "dungeon.h"
#include "pokemon_3.h"
#include "status_checks_1.h"
#include "code_805D8C8.h"
#include "structs/str_806B7F8.h"
EWRAM_DATA s32 gUnknown_202F31C[2] = {0, 0};
@ -55,6 +56,9 @@ extern s16 sub_803D970(u32);
extern s32 sub_803DA20(s32 param_1);
extern bool8 sub_806AA0C(s32, u32);
extern bool8 sub_8083660(DungeonPos *param_1);
extern bool8 sub_803D930(u32);
extern void sub_8072B78(Entity *pokemon, Entity *target, s16 id);
extern s32 sub_808E400(s32 _species, s16* _a2, bool32 bodySizeCheck, bool32 shedinjaCheck);
void GetPokemonLevelData(LevelData* a1, s32 _id, s32 level); // TODO: change to s32
void sub_8071B48(void)
@ -176,312 +180,109 @@ void sub_8071D4C(Entity *pokemon, Entity *target, s32 exp)
}
}
// https://decomp.me/scratch/Wcmvb - (98.45% matching - Seth)
NAKED
void sub_8071DA4(Entity *entity)
{
asm_unified(
" push {r4-r7,lr}\n"
" mov r7, r10\n"
" mov r6, r9\n"
" mov r5, r8\n"
" push {r5-r7}\n"
" sub sp, 0xD4\n"
" str r0, [sp, 0xB4]\n"
" ldr r2, _08071E44\n"
" ldr r1, [r2]\n"
" ldrb r0, [r1, 0xD]\n"
" cmp r0, 0\n"
" bne _08071DBE\n"
" b _08071FE2\n"
"_08071DBE:\n"
" movs r0, 0\n"
" strb r0, [r1, 0xD]\n"
" ldr r0, [r2]\n"
" ldrb r0, [r0, 0x10]\n"
" cmp r0, 0\n"
" beq _08071DCC\n"
" b _08071FE2\n"
"_08071DCC:\n"
" ldr r0, [sp, 0xB4]\n"
" bl EntityExists\n"
" lsls r0, 24\n"
" cmp r0, 0\n"
" bne _08071DE2\n"
" mov r0, sp\n"
" bl sub_80457DC\n"
" mov r0, sp\n"
" str r0, [sp, 0xB4]\n"
"_08071DE2:\n"
" movs r4, 0\n"
"_08071DE4:\n"
" movs r5, 0\n"
" ldr r0, _08071E44\n"
" ldr r0, [r0]\n"
" lsls r1, r4, 2\n"
" ldr r2, _08071E48\n"
" adds r0, r2\n"
" adds r0, r1\n"
" ldr r0, [r0]\n"
" mov r8, r0\n"
" movs r0, 0\n"
" str r0, [sp, 0xB8]\n"
" movs r1, 0\n"
" movs r2, 0\n"
" str r1, [sp, 0xBC]\n"
" str r2, [sp, 0xC0]\n"
" movs r0, 0\n"
" movs r1, 0\n"
" str r0, [sp, 0xC4]\n"
" str r1, [sp, 0xC8]\n"
" adds r1, r4, 0x1\n"
" str r1, [sp, 0xCC]\n"
" mov r2, r8\n"
" cmp r2, 0\n"
" bne _08071E16\n"
" b _08071FDA\n"
"_08071E16:\n"
" mov r0, r8\n"
" bl EntityExists\n"
" lsls r0, 24\n"
" cmp r0, 0\n"
" bne _08071E24\n"
" b _08071FDA\n"
"_08071E24:\n"
" mov r0, r8\n"
" ldr r6, [r0, 0x70]\n"
" movs r1, 0xE\n"
" ldrsh r0, [r6, r1]\n"
" cmp r0, 0\n"
" bne _08071E32\n"
" b _08071FDA\n"
"_08071E32:\n"
" adds r1, r6, 0\n"
" adds r1, 0xF9\n"
" ldrb r0, [r1]\n"
" cmp r0, 0\n"
" beq _08071E4C\n"
" add r2, sp, 0xB8\n"
" ldrb r2, [r2]\n"
" strb r2, [r1]\n"
" b _08071FCA\n"
" .align 2, 0\n"
"_08071E44: .4byte gDungeon\n"
"_08071E48: .4byte 0x000135cc\n"
"_08071E4C:\n"
" movs r1, 254\n"
" lsls r1, 1\n"
" adds r0, r6, r1\n"
" ldr r0, [r0]\n"
" mov r10, r0\n"
" cmp r0, 0\n"
" beq _08071EB6\n"
" ldrb r0, [r6, 0x7]\n"
" cmp r0, 0\n"
" beq _08071E68\n"
" ldrb r1, [r6, 0x9]\n"
" add r0, sp, 0x74\n"
" bl GetAvailTacticsforLvl_Bool\n"
"_08071E68:\n"
" movs r0, 0x10\n"
" ldrsh r2, [r6, r0]\n"
" str r2, [sp, 0xB8]\n"
" ldrb r1, [r6, 0x14]\n"
" str r1, [sp, 0xBC]\n"
" ldrb r2, [r6, 0x15]\n"
" str r2, [sp, 0xC0]\n"
" ldrb r0, [r6, 0x16]\n"
" str r0, [sp, 0xC4]\n"
" ldrb r1, [r6, 0x17]\n"
" str r1, [sp, 0xC8]\n"
" ldrb r0, [r6, 0x9]\n"
" cmp r0, 0x64\n"
" beq _08071EB6\n"
" ldr r0, [r6, 0x18]\n"
" add r0, r10\n"
" str r0, [r6, 0x18]\n"
" mov r2, r10\n"
" ldr r0, _08071EE8\n"
" str r2, [r0]\n"
" ldr r0, _08071EEC\n"
" adds r1, r6, 0\n"
" movs r2, 0\n"
" bl SetMessageArgument_2\n"
" ldr r0, _08071EF0\n"
" ldr r2, [r0]\n"
" ldr r0, [sp, 0xB4]\n"
" mov r1, r8\n"
" bl TryDisplayDungeonLoggableMessage3\n"
" ldr r0, [sp, 0xB4]\n"
" mov r1, r8\n"
" movs r2, 0x1\n"
" movs r3, 0x1\n"
" bl sub_80723D0\n"
" lsls r0, 24\n"
" lsrs r5, r0, 24\n"
"_08071EB6:\n"
" ldr r1, _08071EF4\n"
" adds r0, r6, r1\n"
" ldrb r0, [r0]\n"
" adds r4, 0x1\n"
" str r4, [sp, 0xCC]\n"
" cmp r0, 0\n"
" beq _08071F3A\n"
" movs r2, 0x2\n"
" ldrsh r0, [r6, r2]\n"
" add r1, sp, 0x8C\n"
" movs r2, 0\n"
" movs r3, 0\n"
" bl sub_808E400\n"
" adds r7, r0, 0\n"
" add r0, sp, 0x8C\n"
" mov r9, r0\n"
" cmp r7, 0\n"
" beq _08071F38\n"
" adds r0, r7, 0\n"
" bl DungeonRandInt\n"
" adds r4, r0, 0\n"
" movs r1, 0\n"
" b _08071F02\n"
" .align 2, 0\n"
"_08071EE8: .4byte gFormatArgs\n"
"_08071EEC: .4byte gFormatBuffer_Monsters\n"
"_08071EF0: .4byte gUnknown_80F9E64\n"
"_08071EF4: .4byte 0x00000149\n"
"_08071EF8:\n"
" adds r4, 0x1\n"
" cmp r4, r7\n"
" blt _08071F00\n"
" movs r4, 0\n"
"_08071F00:\n"
" adds r1, 0x1\n"
"_08071F02:\n"
" cmp r1, r7\n"
" bge _08071F38\n"
" lsls r0, r4, 1\n"
" mov r2, r9\n"
" adds r5, r2, r0\n"
" movs r2, 0\n"
" ldrsh r0, [r5, r2]\n"
" str r1, [sp, 0xD0]\n"
" bl sub_803D930\n"
" lsls r0, 24\n"
" ldr r1, [sp, 0xD0]\n"
" cmp r0, 0\n"
" beq _08071EF8\n"
" movs r2, 0\n"
" ldrsh r0, [r5, r2]\n"
" bl GetSpriteData\n"
" ldr r1, [sp, 0xD0]\n"
" cmp r0, 0\n"
" beq _08071EF8\n"
" movs r0, 0\n"
" ldrsh r2, [r5, r0]\n"
" ldr r0, [sp, 0xB4]\n"
" mov r1, r8\n"
" bl sub_8072B78\n"
"_08071F38:\n"
" movs r5, 0\n"
"_08071F3A:\n"
" cmp r5, 0\n"
" beq _08071F7A\n"
" ldrb r0, [r6, 0x6]\n"
" cmp r0, 0\n"
" bne _08071F7A\n"
" movs r1, 0x10\n"
" ldrsh r0, [r6, r1]\n"
" ldr r2, [sp, 0xB8]\n"
" subs r0, r2\n"
" ldr r1, _08071FF4\n"
" str r0, [r1]\n"
" ldrb r0, [r6, 0x14]\n"
" ldr r2, [sp, 0xBC]\n"
" subs r0, r2\n"
" str r0, [r1, 0x4]\n"
" ldrb r0, [r6, 0x16]\n"
" ldr r1, [sp, 0xC4]\n"
" subs r0, r1\n"
" ldr r2, _08071FF4\n"
" str r0, [r2, 0x8]\n"
" ldrb r0, [r6, 0x15]\n"
" ldr r1, [sp, 0xC0]\n"
" subs r0, r1\n"
" str r0, [r2, 0xC]\n"
" ldrb r0, [r6, 0x17]\n"
" ldr r2, [sp, 0xC8]\n"
" subs r0, r2\n"
" ldr r1, _08071FF4\n"
" str r0, [r1, 0x10]\n"
" mov r0, r8\n"
" bl sub_807218C\n"
"_08071F7A:\n"
" mov r2, r10\n"
" cmp r2, 0\n"
" beq _08071FCA\n"
" ldrb r0, [r6, 0x7]\n"
" cmp r0, 0\n"
" beq _08071FCA\n"
" ldrb r1, [r6, 0x9]\n"
" add r0, sp, 0x80\n"
" bl GetAvailTacticsforLvl_Bool\n"
" movs r4, 0\n"
" add r7, sp, 0x74\n"
" add r5, sp, 0x80\n"
"_08071F94:\n"
" adds r0, r7, r4\n"
" ldrb r0, [r0]\n"
" cmp r0, 0\n"
" bne _08071FC4\n"
" adds r0, r5, r4\n"
" ldrb r0, [r0]\n"
" cmp r0, 0x1\n"
" bne _08071FC4\n"
" ldr r0, _08071FF8\n"
" mov r1, r8\n"
" movs r2, 0\n"
" bl SubstitutePlaceholderStringTags\n"
" lsls r1, r4, 24\n"
" lsrs r1, 24\n"
" ldr r0, _08071FFC\n"
" bl CopyTacticsNameToBuffer\n"
" ldr r0, _08072000\n"
" ldr r2, [r0]\n"
" ldr r0, [sp, 0xB4]\n"
" mov r1, r8\n"
" bl TryDisplayDungeonLoggableMessage3\n"
"_08071FC4:\n"
" adds r4, 0x1\n"
" cmp r4, 0xB\n"
" ble _08071F94\n"
"_08071FCA:\n"
" movs r1, 254\n"
" lsls r1, 1\n"
" adds r0, r6, r1\n"
" movs r1, 0\n"
" str r1, [r0]\n"
" ldr r2, _08072004\n"
" adds r0, r6, r2\n"
" strb r1, [r0]\n"
"_08071FDA:\n"
" ldr r4, [sp, 0xCC]\n"
" cmp r4, 0x13\n"
" bgt _08071FE2\n"
" b _08071DE4\n"
"_08071FE2:\n"
" add sp, 0xD4\n"
" pop {r3-r5}\n"
" mov r8, r3\n"
" mov r9, r4\n"
" mov r10, r5\n"
" pop {r4-r7}\n"
" pop {r0}\n"
" bx r0\n"
" .align 2, 0\n"
"_08071FF4: .4byte gFormatArgs\n"
"_08071FF8: .4byte gFormatBuffer_Monsters\n"
"_08071FFC: .4byte gFormatBuffer_Items\n"
"_08072000: .4byte gUnknown_80FF730\n"
"_08072004: .4byte 0x00000149");
int counter;
s16 *id;
Entity EStack_f4;
u8 tacticsBuffer1[NUM_TACTICS];
u8 tacticsBuffer2[NUM_TACTICS];
s16 idStack [20];
Entity *entityPtr; // 0xB4
s32 index;
entityPtr = entity;
if ((gDungeon->unkD != 0) && (gDungeon->unkD = 0, gDungeon->unk10 == 0)) {
if (!EntityExists(entityPtr)) {
sub_80457DC(&EStack_f4);
entityPtr = &EStack_f4;
}
for(index = 0; index < DUNGEON_MAX_POKEMON; index++)
{
EntityInfo *info;
bool8 flag = FALSE;
Entity *target = gDungeon->activePokemon[index];
s32 maxHP = 0;
u32 atk[2] = {0, 0};
u32 def[2] = {0, 0};
if (target == NULL)
continue;
if (!EntityExists(target))
continue;
info = GetEntInfo(target);
if (info->HP != 0) {
if (info->unkF9 != 0) {
info->unkF9 = 0;
}
else
{
s32 expGained = info->expGainedInTurn;
if (expGained != 0) {
if (info->isTeamLeader) {
GetAvailTacticsforLvl_Bool(tacticsBuffer1, info->level);
}
maxHP = info->maxHPStat;
atk[0] = info->atk[0];
atk[1] = info->atk[1];
def[0] = info->def[0];
def[1] = info->def[1];
if (info->level != 100) {
info->exp += expGained;
gFormatArgs[0] = expGained;
SetMessageArgument_2(gFormatBuffer_Monsters[0],info,0);
TryDisplayDungeonLoggableMessage3(entityPtr,target,*gUnknown_80F9E64); // $m0 gained $d0 Exp Points
flag = sub_80723D0(entityPtr,target,1,1);
}
}
if (info->unk149 != 0) {
s32 numMons = sub_808E400(info->id, idStack, FALSE, FALSE);
if (numMons != 0) {
s32 randIndex = DungeonRandInt(numMons);
for(counter = 0; counter < numMons; counter++)
{
id = &idStack[randIndex];
if ((sub_803D930(*id) != 0) && (GetSpriteData(*id) != NULL)) {
sub_8072B78(entityPtr,target,*id);
break;
}
randIndex++;
if (randIndex >= numMons) {
randIndex = 0;
}
}
}
flag = FALSE;
}
if (flag && (!info->isNotTeamMember)) {
gFormatArgs[0] = info->maxHPStat - maxHP;
gFormatArgs[1] = info->atk[0] - atk[0];
gFormatArgs[2] = info->def[0] - def[0];
gFormatArgs[3] = info->atk[1] - atk[1];
gFormatArgs[4] = info->def[1] - def[1];
sub_807218C(target);
}
if ((expGained != 0) && (info->isTeamLeader)) {
s32 tacticIndex;
GetAvailTacticsforLvl_Bool(tacticsBuffer2,info->level);
for(tacticIndex = 0; tacticIndex < NUM_TACTICS; tacticIndex++)
{
if ((tacticsBuffer1[tacticIndex] == 0) && (tacticsBuffer2[tacticIndex] == 1)) {
SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0],target,0);
CopyTacticsNameToBuffer(gFormatBuffer_Items[0],tacticIndex);
TryDisplayDungeonLoggableMessage3(entityPtr,target,*gUnknown_80FF730); // $i0 was added to $m0's list of usable tactics
}
}
}
}
info->expGainedInTurn = 0;
info->unk149 = 0;
}
}
}
return;
}
void sub_8072008(Entity *pokemon, Entity *target, s32 level, u8 param_4, u8 param_5)

View File

@ -56,7 +56,6 @@ extern bool8 sub_8040BB0(Entity *entity, Move *move, bool8);
extern void sub_8040DA0(Entity *entity, Move *move);
extern u16 sub_80412E0(u16 moveId, u8 weather, u8 a2);
extern void sub_800569C(DungeonPos *, axdata *, u8);
extern u8 GetBodySize(s16 index);
extern void sub_800EF10(u16 r0);
extern s32 sub_800E710(s16 a0, u16 a1);
extern void sub_800E3AC(s32 a0, DungeonPos *pos, s32 a2);

View File

@ -9,6 +9,7 @@
#include "dungeon_pokemon_attributes.h"
#include "dungeon_serializer.h"
#include "dungeon_util.h"
#include "pokemon.h"
#include "structs/str_dungeon.h"
extern u8 gUnknown_202EE70[MAX_TEAM_BODY_SIZE];
@ -133,7 +134,6 @@ static Entity* sub_80828E0(s16 id, s16 apparentID, s32 index);
static Entity* sub_8082A08(s16 id, s16 apparentID, s32 index);
// These externs are from other files
extern u8 GetBodySize(s16 index);
extern void sub_80460F8(DungeonPos *, Item *, u32);
void SaveDungeonState(u8 *buffer, u32 bufLen)

View File

@ -36,8 +36,6 @@ extern int sprintf(char *, const char *, ...);
extern u32 ReturnIntFromChar(u8 r0);
extern void xxx_pokemon2_to_pokemonstruct_808DF44(PokemonStruct1*, PokemonStruct2*);
extern u8 GetBodySize(s16 index);
struct unkStruct_8107654 {
s16 unk0;
s16 fill2;
@ -373,9 +371,10 @@ u8 *GetCategoryString(s16 index)
return gMonsterParameters[index].category;
}
u8 GetBodySize(s16 index)
u8 GetBodySize(s32 index)
{
return gMonsterParameters[index].bodySize;
s16 index_s16 = index;
return gMonsterParameters[index_s16].bodySize;
}
u8 GetShadowSize(s16 index)
@ -898,32 +897,37 @@ s32 GetEvolutionSequence(PokemonStruct1* pokemon, struct EvolveStage* a2)
#endif
}
s32 sub_808E400(s32 _species, s16* _a2, bool32 bodySizeCheck, bool32 shedinjaCheck)
s32 sub_808E400(s32 _species, s16* _a2, bool32 _bodySizeCheck, bool32 _shedinjaCheck)
{
// this is horrible
s32 i;
register s32 species asm("r9") = (s16)_species;
bool32 bodySizeCheck_bool32 = (bool8)bodySizeCheck;
bool32 shedinjaCheck_bool32 = (bool8)shedinjaCheck;
s32 count = 0;
register s16* a2 asm("r6");
i = 1;
a2 = _a2;
for (i = 1; i < MONSTER_MAX; i++) {
register s32 current asm("r8") = (s16)i;
if (species != GetPokemonEvolveFrom(i)) {
continue;
// This is horrible
s32 species = SpeciesId(_species);
bool8 bodySizeCheck = _bodySizeCheck;
bool8 shedinjaCheck = _shedinjaCheck;
s32 count = 0;
s32 i = 1;
s16 *a2 = _a2;
for (i = 1; i < MONSTER_MAX; i++) {
s32 loopSpeciesId = SpeciesId(i);
#ifdef NONMATCHING
s32 loopSpeciesId2 = SpeciesId(i);
#else
register s32 loopSpeciesId2 asm("r8") = SpeciesId(i);
#endif // NONMATCHING
if (species != GetPokemonEvolveFrom(loopSpeciesId)) {
continue;
}
if (!bodySizeCheck && GetBodySize(species) != GetBodySize(loopSpeciesId)) {
continue;
}
if (!shedinjaCheck && loopSpeciesId == MONSTER_SHEDINJA) {
continue;
}
*a2++ = loopSpeciesId2;
count++;
}
if (!bodySizeCheck_bool32 && (GetBodySize(species) != GetBodySize(i))) {
continue;
}
if (!shedinjaCheck_bool32 && ((s16)i == MONSTER_SHEDINJA)) {
continue;
}
*a2++ = current;
count++;
}
return count;
return count;
}
void sub_808E490(Move* a1, s16 species)

View File

@ -1254,578 +1254,208 @@ bool8 sub_8007464(void)
return FALSE;
}
// https://decomp.me/scratch/F06Ty
NAKED
u32 xxx_draw_char(UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 color, u32 a5)
extern const u32 gUnknown_80B853C[16];
struct CharMapStruct
{
asm_unified(
"push {r4-r7,lr}\n"
"\tmov r7, r10\n"
"\tmov r6, r9\n"
"\tmov r5, r8\n"
"\tpush {r5-r7}\n"
"\tsub sp, 0x28\n"
"\tadds r6, r1, 0\n"
"\tmov r10, r2\n"
"\tadds r4, r3, 0\n"
"\tldr r2, [sp, 0x48]\n"
"\tldr r3, [sp, 0x4C]\n"
"\tlsls r1, r3, 3\n"
"\tadds r1, r3\n"
"\tlsls r1, 3\n"
"\tadds r5, r0, r1\n"
"\tldr r1, _080074B8\n"
"\tmovs r0, 0xF\n"
"\tands r2, r0\n"
"\tlsls r2, 2\n"
"\tadds r2, r1\n"
"\tldr r2, [r2]\n"
"\tstr r2, [sp, 0x18]\n"
"\tldr r0, _080074BC\n"
"\tldr r0, [r0]\n"
"\tcmp r0, 0x1\n"
"\tbne _080074CC\n"
"\tcmp r4, 0x70\n"
"\tbeq _080074B0\n"
"\tcmp r4, 0x6A\n"
"\tbeq _080074B0\n"
"\tcmp r4, 0x71\n"
"\tbeq _080074B0\n"
"\tcmp r4, 0x79\n"
"\tbeq _080074B0\n"
"\tcmp r4, 0x67\n"
"\tbne _080074C0\n"
"_080074B0:\n"
"\tmovs r0, 0x2\n"
"\tadd r10, r0\n"
"\tb _080074CC\n"
"\t.align 2, 0\n"
"_080074B8: .4byte gUnknown_80B853C\n"
"_080074BC: .4byte gCurrentCharmap\n"
"_080074C0:\n"
"\tldr r0, _080074F8\n"
"\tcmp r4, r0\n"
"\tbne _080074CC\n"
"\tmovs r1, 0x2\n"
"\tnegs r1, r1\n"
"\tadd r10, r1\n"
"_080074CC:\n"
"\tadds r0, r4, 0\n"
"\tbl GetCharacter\n"
"\tstr r0, [sp]\n"
"\tldr r2, [r0]\n"
"\tstr r2, [sp, 0x4]\n"
"\tstr r2, [sp, 0xC]\n"
"\tadds r3, r2, 0\n"
"\tsubs r3, 0x6\n"
"\tstr r3, [sp, 0x8]\n"
"\tldr r0, _080074FC\n"
"\tldrb r0, [r0]\n"
"\tcmp r0, 0\n"
"\tbeq _08007500\n"
"\tldr r4, [sp]\n"
"\tldrb r1, [r4, 0xA]\n"
"\tlsrs r7, r1, 1\n"
"\tmovs r0, 0x1\n"
"\tadds r2, r7, 0\n"
"\tands r2, r0\n"
"\tstr r2, [sp, 0x1C]\n"
"\tb _08007508\n"
"\t.align 2, 0\n"
"_080074F8: .4byte 0x00008199\n"
"_080074FC: .4byte gDrawTextShadow\n"
"_08007500:\n"
"\tmovs r3, 0\n"
"\tstr r3, [sp, 0x1C]\n"
"\tldr r4, [sp]\n"
"\tldrb r1, [r4, 0xA]\n"
"_08007508:\n"
"\tmovs r0, 0x1\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbne _08007512\n"
"\tb _08007670\n"
"_08007512:\n"
"\tmov r0, r10\n"
"\tcmp r0, 0\n"
"\tbge _0800751A\n"
"\tadds r0, 0x7\n"
"_0800751A:\n"
"\tasrs r4, r0, 3\n"
"\tmovs r7, 0x4\n"
"\tldrsh r0, [r5, r7]\n"
"\tmuls r0, r4\n"
"\tadds r2, r6, 0\n"
"\tcmp r6, 0\n"
"\tbge _0800752A\n"
"\tadds r2, r6, 0x7\n"
"_0800752A:\n"
"\tasrs r2, 3\n"
"\tadds r0, r2\n"
"\tlsls r0, 5\n"
"\tldr r1, [r5, 0x18]\n"
"\tadds r3, r1, r0\n"
"\tlsls r0, r4, 3\n"
"\tmov r1, r10\n"
"\tsubs r0, r1, r0\n"
"\tlsls r0, 2\n"
"\tadds r3, r0\n"
"\tlsls r0, r2, 3\n"
"\tsubs r0, r6, r0\n"
"\tlsls r0, 4\n"
"\tldr r1, _08007664\n"
"\tadds r0, r1\n"
"\tmov r12, r0\n"
"\tmov r9, r2\n"
"\tstr r4, [sp, 0x14]\n"
"\tmovs r2, 0x8\n"
"\tldrsh r0, [r5, r2]\n"
"\tcmp r4, r0\n"
"\tblt _08007558\n"
"\tb _0800786C\n"
"_08007558:\n"
"\tmovs r4, 0\n"
"\tstr r4, [sp, 0x10]\n"
"\tldr r2, _08007668\n"
"\tldr r1, _0800766C\n"
"\tldr r0, [r1]\n"
"\tlsls r0, 2\n"
"\tadds r0, r2\n"
"\tldr r0, [r0]\n"
"\tcmp r4, r0\n"
"\tblt _0800756E\n"
"\tb _0800786C\n"
"_0800756E:\n"
"\tadds r4, r2, 0\n"
"_08007570:\n"
"\tldr r6, [sp, 0x4]\n"
"\tldrh r0, [r6, 0x2]\n"
"\tlsls r2, r0, 16\n"
"\tldrh r0, [r6]\n"
"\torrs r2, r0\n"
"\tcmp r2, 0\n"
"\tbeq _080075CC\n"
"\tmovs r7, 0x4\n"
"\tldrsh r0, [r5, r7]\n"
"\tcmp r9, r0\n"
"\tbge _080075A6\n"
"\tmov r0, r12\n"
"\tldr r1, [r0]\n"
"\tands r1, r2\n"
"\tldr r0, [r0, 0x8]\n"
"\tlsls r1, r0\n"
"\tldr r0, [r3]\n"
"\torrs r0, r1\n"
"\tstr r0, [r3]\n"
"\tldr r0, [r5, 0x3C]\n"
"\tcmp r0, r3\n"
"\tbls _0800759E\n"
"\tstr r3, [r5, 0x3C]\n"
"_0800759E:\n"
"\tldr r0, [r5, 0x40]\n"
"\tcmp r0, r3\n"
"\tbcs _080075A6\n"
"\tstr r3, [r5, 0x40]\n"
"_080075A6:\n"
"\tmovs r1, 0x4\n"
"\tldrsh r0, [r5, r1]\n"
"\tsubs r0, 0x1\n"
"\tcmp r9, r0\n"
"\tbge _080075CC\n"
"\tadds r3, 0x20\n"
"\tmov r6, r12\n"
"\tldr r0, [r6, 0x4]\n"
"\tands r2, r0\n"
"\tldr r0, [r6, 0xC]\n"
"\tlsrs r2, r0\n"
"\tldr r0, [r3]\n"
"\torrs r0, r2\n"
"\tstr r0, [r3]\n"
"\tldr r0, [r5, 0x40]\n"
"\tcmp r0, r3\n"
"\tbcs _080075CA\n"
"\tstr r3, [r5, 0x40]\n"
"_080075CA:\n"
"\tsubs r3, 0x20\n"
"_080075CC:\n"
"\tldr r7, [sp, 0x4]\n"
"\tldrh r2, [r7, 0x4]\n"
"\tcmp r2, 0\n"
"\tbeq _08007620\n"
"\tmovs r1, 0x4\n"
"\tldrsh r0, [r5, r1]\n"
"\tsubs r0, 0x1\n"
"\tcmp r9, r0\n"
"\tbge _080075FA\n"
"\tadds r3, 0x20\n"
"\tmov r6, r12\n"
"\tldr r1, [r6]\n"
"\tands r1, r2\n"
"\tldr r0, [r6, 0x8]\n"
"\tlsls r1, r0\n"
"\tldr r0, [r3]\n"
"\torrs r0, r1\n"
"\tstr r0, [r3]\n"
"\tldr r0, [r5, 0x40]\n"
"\tcmp r0, r3\n"
"\tbcs _080075F8\n"
"\tstr r3, [r5, 0x40]\n"
"_080075F8:\n"
"\tsubs r3, 0x20\n"
"_080075FA:\n"
"\tmovs r7, 0x4\n"
"\tldrsh r0, [r5, r7]\n"
"\tsubs r0, 0x2\n"
"\tcmp r9, r0\n"
"\tbge _08007620\n"
"\tadds r3, 0x40\n"
"\tmov r1, r12\n"
"\tldr r0, [r1, 0x4]\n"
"\tands r2, r0\n"
"\tldr r0, [r1, 0xC]\n"
"\tlsrs r2, r0\n"
"\tldr r0, [r3]\n"
"\torrs r0, r2\n"
"\tstr r0, [r3]\n"
"\tldr r0, [r5, 0x40]\n"
"\tcmp r0, r3\n"
"\tbcs _0800761E\n"
"\tstr r3, [r5, 0x40]\n"
"_0800761E:\n"
"\tsubs r3, 0x40\n"
"_08007620:\n"
"\tldr r2, [sp, 0x4]\n"
"\tadds r2, 0x6\n"
"\tstr r2, [sp, 0x4]\n"
"\tadds r3, 0x4\n"
"\tmovs r6, 0x1\n"
"\tadd r10, r6\n"
"\tmovs r0, 0x7\n"
"\tmov r7, r10\n"
"\tands r0, r7\n"
"\tcmp r0, 0\n"
"\tbne _0800764E\n"
"\tldr r0, [r5, 0x20]\n"
"\tlsls r0, 2\n"
"\tadds r3, r0\n"
"\tldr r0, [sp, 0x14]\n"
"\tadds r0, 0x1\n"
"\tstr r0, [sp, 0x14]\n"
"\tmovs r1, 0x8\n"
"\tldrsh r0, [r5, r1]\n"
"\tldr r2, [sp, 0x14]\n"
"\tcmp r2, r0\n"
"\tblt _0800764E\n"
"\tb _0800786C\n"
"_0800764E:\n"
"\tldr r6, [sp, 0x10]\n"
"\tadds r6, 0x1\n"
"\tstr r6, [sp, 0x10]\n"
"\tldr r7, _0800766C\n"
"\tldr r0, [r7]\n"
"\tlsls r0, 2\n"
"\tadds r0, r4\n"
"\tldr r0, [r0]\n"
"\tcmp r6, r0\n"
"\tblt _08007570\n"
"\tb _0800786C\n"
"\t.align 2, 0\n"
"_08007664: .4byte gCharMasksOffsets\n"
"_08007668: .4byte gCharHeight\n"
"_0800766C: .4byte gCurrentCharmap\n"
"_08007670:\n"
"\tmovs r0, 0\n"
"\tstr r0, [sp, 0x20]\n"
"\tmov r0, r10\n"
"\tcmp r0, 0\n"
"\tbge _0800767C\n"
"\tadds r0, 0x7\n"
"_0800767C:\n"
"\tasrs r4, r0, 3\n"
"\tmovs r1, 0x4\n"
"\tldrsh r0, [r5, r1]\n"
"\tadds r1, r4, 0\n"
"\tmuls r1, r0\n"
"\tadds r0, r6, 0\n"
"\tcmp r6, 0\n"
"\tbge _0800768E\n"
"\tadds r0, r6, 0x7\n"
"_0800768E:\n"
"\tasrs r2, r0, 3\n"
"\tadds r0, r1, r2\n"
"\tlsls r0, 5\n"
"\tldr r1, [r5, 0x18]\n"
"\tadds r3, r1, r0\n"
"\tlsls r0, r4, 3\n"
"\tmov r7, r10\n"
"\tsubs r0, r7, r0\n"
"\tlsls r0, 2\n"
"\tadds r3, r0\n"
"\tlsls r0, r2, 3\n"
"\tsubs r0, r6, r0\n"
"\tlsls r0, 4\n"
"\tldr r1, _0800788C\n"
"\tadds r0, r1\n"
"\tmov r12, r0\n"
"\tmov r9, r2\n"
"\tstr r4, [sp, 0x14]\n"
"\tmovs r1, 0x8\n"
"\tldrsh r0, [r5, r1]\n"
"\tcmp r4, r0\n"
"\tblt _080076BC\n"
"\tb _0800786C\n"
"_080076BC:\n"
"\tmovs r2, 0\n"
"\tstr r2, [sp, 0x10]\n"
"\tldr r2, _08007890\n"
"\tldr r1, _08007894\n"
"\tldr r0, [r1]\n"
"\tlsls r0, 2\n"
"\tadds r0, r2\n"
"\tldr r0, [r0]\n"
"\tldr r4, [sp, 0x10]\n"
"\tcmp r4, r0\n"
"\tblt _080076D4\n"
"\tb _0800786C\n"
"_080076D4:\n"
"\tldr r6, [sp, 0x4]\n"
"\tldrh r0, [r6, 0x2]\n"
"\tlsls r4, r0, 16\n"
"\tldrh r0, [r6]\n"
"\torrs r4, r0\n"
"\tldr r1, _08007898\n"
"\tands r1, r4\n"
"\tldr r0, [sp, 0x18]\n"
"\tands r0, r4\n"
"\tadds r2, r1, r0\n"
"\tldr r7, [sp, 0x1C]\n"
"\tcmp r7, 0\n"
"\tbeq _08007724\n"
"\tldr r1, [sp, 0xC]\n"
"\tldrh r0, [r1, 0x2]\n"
"\tlsls r0, 16\n"
"\tldrh r1, [r1]\n"
"\torrs r0, r1\n"
"\tlsls r1, r0, 4\n"
"\tmvns r6, r4\n"
"\tmov r8, r6\n"
"\tbics r1, r4\n"
"\tldr r7, _0800789C\n"
"\tldr r6, [r7]\n"
"\tands r1, r6\n"
"\torrs r2, r1\n"
"\tldr r0, [sp, 0x20]\n"
"\tcmp r0, 0\n"
"\tbeq _08007724\n"
"\tldr r1, [sp, 0x8]\n"
"\tldrh r0, [r1, 0x2]\n"
"\tlsls r0, 16\n"
"\tldrh r1, [r1]\n"
"\torrs r0, r1\n"
"\tlsls r1, r0, 4\n"
"\teors r1, r4\n"
"\tmov r4, r8\n"
"\tands r1, r4\n"
"\tands r1, r6\n"
"\torrs r2, r1\n"
"_08007724:\n"
"\tcmp r2, 0\n"
"\tbeq _08007776\n"
"\tmovs r6, 0x4\n"
"\tldrsh r0, [r5, r6]\n"
"\tcmp r9, r0\n"
"\tbge _08007750\n"
"\tmov r7, r12\n"
"\tldr r1, [r7]\n"
"\tands r1, r2\n"
"\tldr r0, [r7, 0x8]\n"
"\tlsls r1, r0\n"
"\tldr r0, [r3]\n"
"\torrs r0, r1\n"
"\tstr r0, [r3]\n"
"\tldr r0, [r5, 0x3C]\n"
"\tcmp r0, r3\n"
"\tbls _08007748\n"
"\tstr r3, [r5, 0x3C]\n"
"_08007748:\n"
"\tldr r0, [r5, 0x40]\n"
"\tcmp r0, r3\n"
"\tbcs _08007750\n"
"\tstr r3, [r5, 0x40]\n"
"_08007750:\n"
"\tmovs r1, 0x4\n"
"\tldrsh r0, [r5, r1]\n"
"\tsubs r0, 0x1\n"
"\tcmp r9, r0\n"
"\tbge _08007776\n"
"\tadds r3, 0x20\n"
"\tmov r4, r12\n"
"\tldr r0, [r4, 0x4]\n"
"\tands r2, r0\n"
"\tldr r0, [r4, 0xC]\n"
"\tlsrs r2, r0\n"
"\tldr r0, [r3]\n"
"\torrs r0, r2\n"
"\tstr r0, [r3]\n"
"\tldr r0, [r5, 0x40]\n"
"\tcmp r0, r3\n"
"\tbcs _08007774\n"
"\tstr r3, [r5, 0x40]\n"
"_08007774:\n"
"\tsubs r3, 0x20\n"
"_08007776:\n"
"\tldr r6, [sp, 0x4]\n"
"\tldrh r4, [r6, 0x4]\n"
"\tldr r1, _08007898\n"
"\tands r1, r4\n"
"\tldr r0, [sp, 0x18]\n"
"\tands r0, r4\n"
"\tadds r2, r1, r0\n"
"\tldr r7, [sp, 0x1C]\n"
"\tcmp r7, 0\n"
"\tbeq _080077CC\n"
"\tldr r1, [sp, 0xC]\n"
"\tldrh r0, [r1, 0x4]\n"
"\tlsls r1, r0, 4\n"
"\tldr r6, [sp, 0xC]\n"
"\tldrh r0, [r6, 0x2]\n"
"\tmovs r7, 0xF\n"
"\tmov r8, r7\n"
"\tlsrs r0, 12\n"
"\torrs r1, r0\n"
"\tmvns r0, r4\n"
"\tstr r0, [sp, 0x24]\n"
"\tbics r1, r4\n"
"\tldr r7, _0800789C\n"
"\tldr r6, [r7]\n"
"\tands r1, r6\n"
"\torrs r2, r1\n"
"\tldr r0, [sp, 0x20]\n"
"\tcmp r0, 0\n"
"\tbeq _080077CC\n"
"\tldr r1, [sp, 0x8]\n"
"\tldrh r0, [r1, 0x4]\n"
"\tlsls r1, r0, 4\n"
"\tldr r7, [sp, 0x8]\n"
"\tldrh r0, [r7, 0x2]\n"
"\tlsrs r0, 12\n"
"\tmov r7, r8\n"
"\tands r0, r7\n"
"\torrs r1, r0\n"
"\teors r1, r4\n"
"\tldr r0, [sp, 0x24]\n"
"\tands r1, r0\n"
"\tands r1, r6\n"
"\torrs r2, r1\n"
"_080077CC:\n"
"\tcmp r2, 0\n"
"\tbeq _0800781C\n"
"\tmovs r1, 0x4\n"
"\tldrsh r0, [r5, r1]\n"
"\tsubs r0, 0x1\n"
"\tcmp r9, r0\n"
"\tbge _080077F6\n"
"\tadds r3, 0x20\n"
"\tmov r4, r12\n"
"\tldr r1, [r4]\n"
"\tands r1, r2\n"
"\tldr r0, [r4, 0x8]\n"
"\tlsls r1, r0\n"
"\tldr r0, [r3]\n"
"\torrs r0, r1\n"
"\tstr r0, [r3]\n"
"\tldr r0, [r5, 0x40]\n"
"\tcmp r0, r3\n"
"\tbcs _080077F4\n"
"\tstr r3, [r5, 0x40]\n"
"_080077F4:\n"
"\tsubs r3, 0x20\n"
"_080077F6:\n"
"\tmovs r6, 0x4\n"
"\tldrsh r0, [r5, r6]\n"
"\tsubs r0, 0x2\n"
"\tcmp r9, r0\n"
"\tbge _0800781C\n"
"\tadds r3, 0x40\n"
"\tmov r7, r12\n"
"\tldr r0, [r7, 0x4]\n"
"\tands r2, r0\n"
"\tldr r0, [r7, 0xC]\n"
"\tlsrs r2, r0\n"
"\tldr r0, [r3]\n"
"\torrs r0, r2\n"
"\tstr r0, [r3]\n"
"\tldr r0, [r5, 0x40]\n"
"\tcmp r0, r3\n"
"\tbcs _0800781A\n"
"\tstr r3, [r5, 0x40]\n"
"_0800781A:\n"
"\tsubs r3, 0x40\n"
"_0800781C:\n"
"\tmovs r0, 0x1\n"
"\tstr r0, [sp, 0x20]\n"
"\tldr r1, [sp, 0x4]\n"
"\tadds r1, 0x6\n"
"\tstr r1, [sp, 0x4]\n"
"\tldr r2, [sp, 0x8]\n"
"\tadds r2, 0x6\n"
"\tstr r2, [sp, 0x8]\n"
"\tldr r4, [sp, 0xC]\n"
"\tadds r4, 0x6\n"
"\tstr r4, [sp, 0xC]\n"
"\tadds r3, 0x4\n"
"\tadd r10, r0\n"
"\tmovs r0, 0x7\n"
"\tmov r6, r10\n"
"\tands r0, r6\n"
"\tcmp r0, 0\n"
"\tbne _08007854\n"
"\tldr r0, [r5, 0x20]\n"
"\tlsls r0, 2\n"
"\tadds r3, r0\n"
"\tldr r7, [sp, 0x14]\n"
"\tadds r7, 0x1\n"
"\tstr r7, [sp, 0x14]\n"
"\tmovs r1, 0x8\n"
"\tldrsh r0, [r5, r1]\n"
"\tcmp r7, r0\n"
"\tbge _0800786C\n"
"_08007854:\n"
"\tldr r2, [sp, 0x10]\n"
"\tadds r2, 0x1\n"
"\tstr r2, [sp, 0x10]\n"
"\tldr r4, _08007894\n"
"\tldr r0, [r4]\n"
"\tlsls r0, 2\n"
"\tldr r6, _08007890\n"
"\tadds r0, r6\n"
"\tldr r0, [r0]\n"
"\tcmp r2, r0\n"
"\tbge _0800786C\n"
"\tb _080076D4\n"
"_0800786C:\n"
"\tldr r7, [sp]\n"
"\tmovs r1, 0x6\n"
"\tldrsh r0, [r7, r1]\n"
"\tldr r2, _080078A0\n"
"\tmovs r3, 0\n"
"\tldrsh r1, [r2, r3]\n"
"\tadds r0, r1\n"
"\tadd sp, 0x28\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r1}\n"
"\tbx r1\n"
"\t.align 2, 0\n"
"_0800788C: .4byte gCharMasksOffsets\n"
"_08007890: .4byte gCharHeight\n"
"_08007894: .4byte gCurrentCharmap\n"
"_08007898: .4byte 0x11111111\n"
"_0800789C: .4byte gTextShadowMask\n"
"_080078A0: .4byte gCharacterSpacing");
s32 unk0;
struct unkChar *unk4;
};
extern struct CharMapStruct *gCharmaps[];
extern s32 gCurrentCharmap;
extern s16 gCharacterSpacing;
extern s32 gCharHeight[];
extern u8 gDrawTextShadow;
u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 color, u32 a5)
{
u32 *r3;
const struct unkShiftData *shiftData;
const struct unkChar *sp0;
u16 *local_44;
u16 *sp8;
u16 *local_3c;
s32 i;
s32 xDiv8, yDiv8;
struct UnkTextStruct1 *r5 = &a0[a5];
s32 sp18 = gUnknown_80B853C[color & 0xF];
u8 var_2C;
u32 r4;
u32 r2;
if (gCurrentCharmap == 1) {
if (a3 == 0x70 || a3 == 0x6A || a3 == 0x71 || a3 == 0x79 || a3 == 0x67)
y += 2;
else if (a3 == 0x8199)
y -= 2;
}
sp0 = GetCharacter(a3);
local_44 = sp0->unk0;
ASM_MATCH_TRICK(local_3c); // stack doesn't match without it
local_3c = sp0->unk0;
sp8 = sp0->unk0 - 3;
if (gDrawTextShadow != 0) {
var_2C = (sp0->unkA >> 1) & 1;
}
else {
var_2C = 0;
}
if (sp0->unkA & 1) {
r3 = r5->unk18 + ((((y / 8) * r5->unk4) + (x / 8)) * 8);
r3 += y - (y / 8 * 8);
shiftData = &gCharMasksOffsets[x - ((x / 8) * 8)];
xDiv8 = x / 8;
yDiv8 = y / 8;
if (yDiv8 < r5->unk8) {
for (i = 0; i < gCharHeight[gCurrentCharmap]; i++) {
r2 = (local_44[1] << 0x10) | (local_44[0]);
if (r2 != 0) {
if (xDiv8 < r5->unk4) {
*r3 |= (shiftData->bytesA & r2) << shiftData->shift_left;
if (r5->unk3C > r3)
r5->unk3C = r3;
if (r5->unk40 < r3)
r5->unk40 = r3;
}
if (xDiv8 < r5->unk4 - 1) {
r3 += 8;
r2 &= shiftData->bytesB;
*r3 |= (r2) >> shiftData->shift_right;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 8;
}
}
r2 = local_44[2];
if (r2 != 0) {
if (xDiv8 < r5->unk4 - 1) {
r3 += 8;
*r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 8;
}
if (xDiv8 < r5->unk4 - 2) {
r3 += 16;
*r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 16;
}
}
local_44 += 3;
r3++;
y++;
if (y % 8 == 0) {
r3 += r5->unk20;
yDiv8++;
if (yDiv8 >= r5->unk8)
break;
}
}
}
}
else {
bool8 notFirstIteration = FALSE;
u32 r1;
r3 = r5->unk18 + ((((y / 8) * r5->unk4) + (x / 8)) * 8);
r3 += y - (y / 8 * 8);
shiftData = &gCharMasksOffsets[x - ((x / 8) * 8)];
xDiv8 = x / 8;
yDiv8 = y / 8;
if (yDiv8 < r5->unk8) {
for (i = 0; i < gCharHeight[gCurrentCharmap]; i++) {
r4 = (local_44[1] << 0x10) | (local_44[0]);
r2 = (0x11111111 & r4) + (sp18 & r4);
if (var_2C != 0) {
r1 = ((local_3c[1] << 0x10) | local_3c[0]) << 4;
r1 |= r4; // This doesn't really do anything since r4 bits are cleared, but it's needed to match.
r1 &= ~(r4);
r1 &= gTextShadowMask;
r2 |= (r1);
if (notFirstIteration) {
r1 = (((sp8[1] << 0x10) | sp8[0]) << 4) ^ r4;
r1 &= ~(r4);
r2 |= (r1 & gTextShadowMask);
}
}
if (r2 != 0) {
if (xDiv8 < r5->unk4) {
*r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left;
if (r5->unk3C > r3)
r5->unk3C = r3;
if (r5->unk40 < r3)
r5->unk40 = r3;
}
if (xDiv8 < r5->unk4 - 1) {
r3 += 8;
*r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 8;
}
}
r4 = local_44[2];
r2 = (0x11111111 & r4) + (sp18 & r4);
if (var_2C != 0) {
r1 = (local_3c[2] << 4) | ((local_3c[1] >> 0xC) & 0xF);
r1 |= r4; // This doesn't really do anything since r4 bits are cleared, but it's needed to match.
r1 &= ~(r4);
r1 &= gTextShadowMask;
r2 |= r1;
if (notFirstIteration) {
r1 = ((sp8[2] << 4) | ((sp8[1] >> 0xC) & 0xF)) ^ r4;
r1 &= ~(r4);
r1 &= gTextShadowMask;
r2 |= (r1);
}
}
if (r2 != 0) {
if (xDiv8 < r5->unk4 - 1) {
r3 += 8;
*r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 8;
}
if (xDiv8 < r5->unk4 - 2) {
r3 += 16;
*r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 16;
}
}
notFirstIteration = TRUE;
local_44 += 3;
sp8 += 3;
local_3c += 3;
r3++;
y++;
if (y % 8 == 0) {
r3 += r5->unk20;
yDiv8++;
if (yDiv8 >= r5->unk8)
break;
}
}
}
}
return sp0->unk6 + gCharacterSpacing;
}
void sub_80078A4(u32 a0, s32 x, s32 y, s32 a3, u32 color)
@ -2691,14 +2321,6 @@ void sub_80084A4(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32
extern const struct unkChar gUnknown_80B86A4;
struct CharMapStruct
{
s32 unk0;
struct unkChar *unk4;
};
extern struct CharMapStruct *gCharmaps[];
extern s32 gCurrentCharmap;
// Oddly similar to sub_803DEC8
const struct unkChar *GetCharacter(s32 chr)
{
@ -3240,8 +2862,6 @@ UNUSED void sub_8008E58(s32 a0, s32 a1, u8 *a2, s32 a3)
gUnknown_20274A5 = 1;
}
extern s16 gCharacterSpacing;
s32 sub_8008ED0(const u8 *str)
{
s32 ret = 0;