decompile up to sub_80F8598

This commit is contained in:
camthesaxman 2017-08-24 01:10:30 -05:00
parent bfc4b338cb
commit 988f5a685a
10 changed files with 794 additions and 1201 deletions

File diff suppressed because it is too large Load Diff

View File

@ -3,37 +3,6 @@
.section .rodata
.align 2
gGiddyAdjectives:: @ 83E5388
.4byte OtherText_SoPretty
.4byte OtherText_SoDarling
.4byte OtherText_SoRelaxed
.4byte OtherText_SoSunny
.4byte OtherText_SoDesirable
.4byte OtherText_SoExciting
.4byte OtherText_SoAmusing
.4byte OtherText_SoMagical
.align 2
gGiddyQuestions:: @ 83E53A8
.4byte OtherText_WantVacationNicePlace
.4byte OtherText_BoughtCrayonsIsNice
.4byte OtherText_IfWeCouldFloat
.4byte OtherText_SandWashesAwayMakeSad
.4byte OtherText_WhatsBottomSeaLike
.4byte OtherText_SeeSettingSun
.4byte OtherText_LyingInGreenGrass
.4byte OtherText_SecretBasesWonderful
.align 1
gUnknown_083E53C8:: @ 83E53C8
.2byte 0x0, 0
.2byte 0xC, 0
.2byte 0xD, 0
.2byte 0x12, 0
.2byte 0x13, 0
.2byte 0x15, 0
.align 2
gUnknown_083E53E0:: @ 83E53E0
.4byte 0x132, UnknownString_81AEFFC, UnknownString_81AF013, UnknownString_81AF022
@ -71,8 +40,6 @@ gUnknown_083E53E0:: @ 83E53E0
.4byte 0x12e, UnknownString_81B0523, UnknownString_81B053E, UnknownString_81B0554
.4byte 0x12f, UnknownString_81B05D8, UnknownString_81B05F3, UnknownString_81B0610
.4byte 0x130, UnknownString_81B06A9, UnknownString_81B06C6, UnknownString_81B06D9
gUnknown_083E5610:: @ 83E5610
.4byte 0x131, UnknownString_81B0763, UnknownString_81B0781, UnknownString_81B0797
.align 2

43
include/bard_music.h Normal file
View File

@ -0,0 +1,43 @@
#ifndef GUARD_BARD_MUSIC_H
#define GUARD_BARD_MUSIC_H
struct BardSound
{
u8 pad_00[48];
};
struct UnkBard
{
/*0x00*/ u8 var00;
/*0x01*/ s8 var01;
/*0x02*/ u16 var02;
/*0x04*/ u16 var04;
/*0x06*/ u16 var06;
};
struct UnkBard3
{
/*0x00*/ u16 var00;
/*0x02*/ u16 var02;
/*0x04*/ s16 var04;
/*0x06*/ u16 var06;
};
struct UnkBard2
{
/*0x00*/ u8 var00;
/*0x01*/ u8 var01;
/*0x02*/ u8 var02;
/*0x03*/ u8 var03;
/*0x04*/ s16 var04;
/*0x06*/ u16 volume;
/*0x08*/ s16 pitch;
/*0x0A*/ s16 var0A;
/*0x0C*/ u16 var0C[6];
/*0x18*/ struct UnkBard3 var18[6];
};
struct BardSound *sub_814A2D0(u16 arg0, u16 arg1);
s32 sub_814A2EC(struct UnkBard2 *dest, struct UnkBard *src, u16 arg2);
#endif // GUARD_BARD_MUSIC_H

View File

@ -404,10 +404,6 @@ void SampleFreqSet(u32 freq);
void m4aSoundVSyncOn(void);
void m4aSoundVSyncOff(void);
void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo);
void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch);
void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan);
void ClearModM(struct MusicPlayerTrack *track);
void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth);
void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed);

View File

@ -457,14 +457,14 @@ struct MauvilleManCommon
struct MauvilleManBard
{
u8 id;
u8 unk_2D95;
/*0x2D96*/ u16 songLyrics[6];
/*0x2DA2*/ u16 mauvilleOldMan_ecArray2[6];
/*0x2DAE*/ u8 playerName[8];
/*0x2DB6*/ u8 filler_2DB6[0x3];
/*0x2DB9*/ u8 playerTrainerId[4];
u8 unk_2DBD;
/*0x00*/ u8 id;
/*0x01*/ u8 unk_2D95;
/*0x02*/ u16 songLyrics[6];
/*0x0E*/ u16 mauvilleOldMan_ecArray2[6];
/*0x1A*/ u8 playerName[8];
/*0x22*/ u8 filler_2DB6[0x3];
/*0x25*/ u8 playerTrainerId[4];
/*0x29*/ u8 unk_2DBD;
}; /*size = 0x2C*/
struct MauvilleManHipster
@ -484,18 +484,24 @@ struct MauvilleManTrader
struct MauvilleManStoryteller
{
u8 id;
u8 unk1;
u8 filler2[2];
u8 unk4[4];
u8 unk8[4][7];
u8 unk24[2][4]; // unknown length
};
struct MauvilleManGiddy
{
u8 id;
u8 unk1;
u8 unk2;
u16 mauvilleOldMan_ecArray[10];
u8 mauvilleOldMan_ecArray2[12];
u8 fillerF[0x2];
/*0x00*/ u8 id;
/*0x01*/ u8 unk1;
/*0x02*/ u8 questionNum;
/*0x04*/ u16 mauvilleOldMan_ecArray[10];
/*0x18*/ u8 questionList[12];
/*0x24*/ u8 fillerF[0x2];
}; /*size = 0x2C*/
typedef union OldMan
{
struct MauvilleManCommon common;

View File

@ -16,4 +16,9 @@ void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed);
void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed);
void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo);
void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo);
void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch);
void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan);
#endif //GUARD_M4A_H

View File

@ -2,5 +2,6 @@
#define GUARD_TRADER_H
void TraderSetup(void);
void sub_8109A20(void);
#endif // GUARD_TRADER_H

View File

@ -1,41 +1,7 @@
#include "global.h"
#include "bard_music.h"
#include "easy_chat.h"
struct BardSound
{
u8 pad_00[48];
};
struct UnkBard
{
/*0x00*/ u8 var00;
/*0x01*/ s8 var01;
/*0x02*/ u16 var02;
/*0x04*/ u16 var04;
/*0x06*/ u16 var06;
};
struct UnkBard3
{
/*0x00*/ u16 var00;
/*0x02*/ u16 var02;
/*0x04*/ s16 var04;
/*0x06*/ u16 var06;
};
struct UnkBard2
{
/*0x00*/ u8 var00;
/*0x01*/ u8 var01;
/*0x02*/ u8 var02;
/*0x03*/ u8 var03;
/*0x04*/ u16 var04;
u8 pad06[4];
/*0x0A*/ u16 var0A;
u8 pad0C[12];
/*0x18*/ struct UnkBard3 var18[6];
};
extern struct BardSound *gBardMusicTable[];
extern s16 *gUnknown_08417068[];
extern u32 gUnknown_084170F4[];

View File

@ -45,7 +45,7 @@ void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16
mplayInfo->ident = ID_NUMBER;
}
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch)
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)
{
s32 i;
u32 bit;

View File

@ -1,19 +1,30 @@
#include "global.h"
#include "bard_music.h"
#include "mauville_old_man.h"
#include "easy_chat.h"
#include "easy_chat_constants.h"
#include "event_data.h"
#include "m4a.h"
#include "menu.h"
#include "rom4.h"
#include "rng.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
#include "trader.h"
#define MACRO1(a) (((a) % 4) + (((a) / 8) & 1))
extern struct MusicPlayerInfo gMPlay_SE2;
extern u16 gScriptResult;
extern u16 gSpecialVar_0x8004;
extern struct UnkBard2 gUnknown_03005DA0;
extern const u8 *gGiddyAdjectives[];
extern const u8 *gGiddyQuestions[];
extern u16 gUnknown_020388BC; // set but not used?
const u16 gDefaultBardSongLyrics[] =
{
@ -34,6 +45,33 @@ const u16 gDefaultBardSongLyrics[] =
#endif
};
const u8 *const gGiddyAdjectives[] =
{
OtherText_SoPretty,
OtherText_SoDarling,
OtherText_SoRelaxed,
OtherText_SoSunny,
OtherText_SoDesirable,
OtherText_SoExciting,
OtherText_SoAmusing,
OtherText_SoMagical,
};
const u8 *const gGiddyQuestions[] =
{
OtherText_WantVacationNicePlace,
OtherText_BoughtCrayonsIsNice,
OtherText_IfWeCouldFloat,
OtherText_SandWashesAwayMakeSad,
OtherText_WhatsBottomSeaLike,
OtherText_SeeSettingSun,
OtherText_LyingInGreenGrass,
OtherText_SecretBasesWonderful,
};
void sub_80F8184(u8);
void sub_80F8428(void);
void SetupBard(void)
{
u16 i;
@ -288,7 +326,7 @@ void ScrSpecial_GenerateGiddyLine(void)
}
else
{
StringCopy(gStringVar4, gGiddyQuestions[giddy->mauvilleOldMan_ecArray2[giddy->unk2++]]);
StringCopy(gStringVar4, gGiddyQuestions[giddy->questionList[giddy->questionNum++]]);
}
if (!(Random() % 10))
@ -298,3 +336,685 @@ void ScrSpecial_GenerateGiddyLine(void)
gScriptResult = TRUE;
}
#ifdef NONMATCHING
void sub_80F7DC0(void)
{
u16 arr[][2] =
{
{ 0x0, 0},
{ 0xC, 0},
{ 0xD, 0},
{0x12, 0},
{0x13, 0},
{0x15, 0},
};
u16 i;
u16 r10;
u16 r7;
for (i = 0; i < 8; i++)
{
struct MauvilleManGiddy *giddy = &gSaveBlock1.oldMan.giddy;
//gSaveBlock1.oldMan.giddy.questionList[i] = i;
giddy->questionList[i] = i;
}
// Scramble questions
for (i = 0; i < 8; i++)
{
struct MauvilleManGiddy *giddy = &gSaveBlock1.oldMan.giddy;
/*
u16 r1 = Random() % (i + 1);
u8 r7 = gSaveBlock1.oldMan.giddy.questionList[i];
gSaveBlock1.oldMan.giddy.questionList[i] = gSaveBlock1.oldMan.giddy.questionList[r1];
gSaveBlock1.oldMan.giddy.questionList[r1] = r7;
*/
u16 r1 = Random() % (i + 1);
u8 r7 = giddy->questionList[i];
giddy->questionList[i] = giddy->questionList[r1];
giddy->questionList[r1] = r7;
}
r10 = 0;
for (i = 0; i < 6; i++)
{
arr[i][1] = sub_80EAE88(arr[i][0]);
r10 += arr[i][1];
}
{
struct MauvilleManGiddy *giddy = &gSaveBlock1.oldMan.giddy;
giddy->questionNum = 0;
}
//gSaveBlock1.oldMan.giddy.questionNum = 0;
r7 = 0;
for (i = 0; i < 10; i++)
{
struct MauvilleManGiddy *giddy = &gSaveBlock1.oldMan.giddy;
u16 var = Random() % 10;
if (var < 3 && r7 < 8)
{
//gSaveBlock1.oldMan.giddy.mauvilleOldMan_ecArray[i] = 0xFFFF;
giddy->mauvilleOldMan_ecArray[i] = 0xFFFF;
r7++;
}
//_080F7E90
else
{
s16 r2 = Random() % r10;
u16 r1 = 0;
while (i < 6) // comparing the wrong variable
{
r2 = arr[r1][1] - r2;
if (r2 <= 0)
break;
r1++;
}
if (r1 == 6)
r1 = 0;
//gSaveBlock1.oldMan.giddy.mauvilleOldMan_ecArray[i] = sub_80EB784(arr[r1][0]);
giddy->mauvilleOldMan_ecArray[i] = sub_80EB784(arr[r1][0]);
}
}
}
#else
const u16 gUnknown_083E53C8[][2] =
{
{ 0x0, 0},
{ 0xC, 0},
{ 0xD, 0},
{0x12, 0},
{0x13, 0},
{0x15, 0},
};
__attribute__((naked))
void sub_80F7DC0(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x18\n\
ldr r1, _080F7E84 @ =gUnknown_083E53C8\n\
mov r0, sp\n\
movs r2, 0x18\n\
bl memcpy\n\
movs r5, 0\n\
movs r0, 0x2\n\
add r0, sp\n\
mov r8, r0\n\
ldr r1, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\
adds r1, 0x18\n\
adds r3, r1, 0\n\
_080F7DE4:\n\
adds r0, r3, r5\n\
strb r5, [r0]\n\
adds r0, r5, 0x1\n\
lsls r0, 16\n\
lsrs r5, r0, 16\n\
cmp r5, 0x7\n\
bls _080F7DE4\n\
movs r5, 0\n\
ldr r2, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\
adds r2, 0x4\n\
mov r9, r2\n\
adds r6, r1, 0\n\
_080F7DFC:\n\
bl Random\n\
lsls r0, 16\n\
lsrs r0, 16\n\
adds r4, r5, 0x1\n\
adds r1, r4, 0\n\
bl __modsi3\n\
lsls r0, 16\n\
lsrs r1, r0, 16\n\
adds r2, r6, r5\n\
ldrb r7, [r2]\n\
adds r1, r6, r1\n\
ldrb r0, [r1]\n\
strb r0, [r2]\n\
strb r7, [r1]\n\
lsls r4, 16\n\
lsrs r5, r4, 16\n\
cmp r5, 0x7\n\
bls _080F7DFC\n\
movs r3, 0\n\
mov r10, r3\n\
movs r5, 0\n\
_080F7E2A:\n\
lsls r4, r5, 2\n\
mov r1, sp\n\
adds r0, r1, r4\n\
ldrb r0, [r0]\n\
bl sub_80EAE88\n\
add r4, r8\n\
strh r0, [r4]\n\
add r0, r10\n\
lsls r0, 16\n\
lsrs r0, 16\n\
mov r10, r0\n\
adds r0, r5, 0x1\n\
lsls r0, 16\n\
lsrs r5, r0, 16\n\
cmp r5, 0x5\n\
bls _080F7E2A\n\
movs r0, 0\n\
ldr r2, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\
strb r0, [r2, 0x2]\n\
movs r7, 0\n\
movs r5, 0\n\
_080F7E56:\n\
bl Random\n\
lsls r0, 16\n\
lsrs r0, 16\n\
movs r1, 0xA\n\
bl __umodsi3\n\
lsls r0, 16\n\
lsrs r1, r0, 16\n\
cmp r1, 0x2\n\
bhi _080F7E90\n\
cmp r7, 0x7\n\
bhi _080F7E90\n\
lsls r0, r5, 1\n\
add r0, r9\n\
ldr r1, _080F7E8C @ =0x0000ffff\n\
strh r1, [r0]\n\
adds r0, r7, 0x1\n\
lsls r0, 16\n\
lsrs r7, r0, 16\n\
adds r4, r5, 0x1\n\
b _080F7EE2\n\
.align 2, 0\n\
_080F7E84: .4byte gUnknown_083E53C8\n\
_080F7E88: .4byte gSaveBlock1 + 0x2D94\n\
_080F7E8C: .4byte 0x0000ffff\n\
_080F7E90:\n\
bl Random\n\
lsls r0, 16\n\
lsrs r0, 16\n\
mov r1, r10\n\
bl __umodsi3\n\
lsls r0, 16\n\
lsrs r2, r0, 16\n\
movs r1, 0\n\
adds r4, r5, 0x1\n\
lsls r6, r5, 1\n\
cmp r5, 0x5\n\
bhi _080F7ECC\n\
mov r3, r8\n\
ldrh r0, [r3]\n\
b _080F7EC2\n\
_080F7EB2:\n\
adds r0, r1, 0x1\n\
lsls r0, 16\n\
lsrs r1, r0, 16\n\
cmp r5, 0x5\n\
bhi _080F7ECC\n\
lsls r0, r1, 2\n\
adds r0, r3, r0\n\
ldrh r0, [r0]\n\
_080F7EC2:\n\
subs r0, r2, r0\n\
lsls r0, 16\n\
lsrs r2, r0, 16\n\
cmp r0, 0\n\
bgt _080F7EB2\n\
_080F7ECC:\n\
cmp r1, 0x6\n\
bne _080F7ED2\n\
movs r1, 0\n\
_080F7ED2:\n\
lsls r0, r1, 2\n\
add r0, sp\n\
ldrh r0, [r0]\n\
bl sub_80EB784\n\
mov r2, r9\n\
adds r1, r2, r6\n\
strh r0, [r1]\n\
_080F7EE2:\n\
lsls r0, r4, 16\n\
lsrs r5, r0, 16\n\
cmp r5, 0x9\n\
bls _080F7E56\n\
add sp, 0x18\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\
.syntax divided\n");
}
#endif
void sub_80F7EFC(void)
{
struct MauvilleManBard *bard = &gSaveBlock1.oldMan.bard;
bard->unk_2DBD = 0;
}
void sub_80F7F0C(void)
{
struct MauvilleManHipster *hipster = &gSaveBlock1.oldMan.hipster;
hipster->unk1 = 0;
}
void sub_80F7F18(void)
{
sub_8109A20();
}
void sub_80F7F24(void)
{
sub_80F8428();
}
void sub_80F7F30(void)
{
switch (GetCurrentMauvilleOldMan())
{
case MAUVILLE_MAN_BARD:
sub_80F7EFC();
break;
case MAUVILLE_MAN_HIPSTER:
sub_80F7F0C();
break;
case MAUVILLE_MAN_STORYTELLER:
sub_80F7F24();
break;
case MAUVILLE_MAN_TRADER:
sub_80F7F18();
break;
case MAUVILLE_MAN_GIDDY:
break;
}
sub_80F83D0();
}
void sub_80F7F80(u8 a)
{
u8 taskId = CreateTask(sub_80F8184, 0x50);
gTasks[taskId].data[5] = a;
}
void BardSingWord(struct Task *task, struct UnkBard2 *b)
{
switch (task->data[0])
{
case 0:
{
struct MauvilleManBard *bard = &gSaveBlock1.oldMan.bard;
u16 *r2;
s32 i;
if (gSpecialVar_0x8004 == 0)
r2 = bard->songLyrics;
else
r2 = bard->mauvilleOldMan_ecArray2;
for (i = 0; i < 6; i++)
b->var0C[i] = r2[i];
for (i = 0; i < 6; i++)
{
b->var18[i].var00 = 0xFFFF;
b->var18[i].var02 = 0;
b->var18[i].var04 = 0;
b->var18[i].var06 = 0;
}
b->var00 = 0;
b->var01 = 0;
b->var04 = 0;
}
break;
case 1:
break;
case 2:
{
u16 r4 = b->var0C[b->var00];
// TODO: fix this return type
struct UnkBard *r1 = (struct UnkBard *)sub_814A2D0(r4 / 0x200, r4 % 0x200);
b->var04 = 0;
sub_814A2EC(b, r1, (r4 % 4) + ((r4 / 8) & 1));
}
break;
case 3:
case 4:
{
struct UnkBard3 *r7 = &b->var18[b->var01];
switch (b->var03)
{
case 0:
if (b->var02 == 0)
{
if (b->var01 == 6 || r7->var00 == 0xFF)
{
b->var03 = 0xFE;
break;
}
b->var02 = r7->var02;
if (r7->var00 <= 50)
{
u16 r1 = r7->var00 / 3;
m4aSongNumStart(249 + r1 * 3);
}
b->var03 = 1;
}
else
{
if (b->var0A > 10)
b->volume -= 2;
if (b->var0A & 1)
b->pitch += 64;
else
b->pitch -= 64;
m4aMPlayVolumeControl(&gMPlay_SE2, 0xFFFF, b->volume);
m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, b->pitch);
b->var0A++;
}
b->var02--;
break;
case 1:
b->var01++;
b->var03 = 0;
if (r7->var00 <= 50)
{
b->volume = 0x100 + r7->var06 * 16;
m4aMPlayVolumeControl(&gMPlay_SE2, 0xFFFF, b->volume);
b->pitch = 0x200 + r7->var04;
m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, b->pitch);
}
break;
case 0xFE:
m4aMPlayStop(&gMPlay_SE2);
b->var03 = 0xFF;
break;
}
}
break;
case 5:
break;
}
}
void sub_80F8184(u8 taskId)
{
struct Task *task = &gTasks[taskId]; // r5
BardSingWord(task, &gUnknown_03005DA0);
switch (task->data[0])
{
case 0:
sub_80F7BA0();
InitWindowFromConfig(gMenuWindowPtr, &gWindowConfig_81E6CE4);
sub_8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15);
task->data[1] = 0;
task->data[2] = 0;
task->data[3] = 0;
task->data[4] = 0;
FadeOutBGMTemporarily(4);
task->data[0] = 1;
break;
case 1:
if (IsBGMPausedOrStopped())
task->data[0] = 2;
break;
case 2:
{
struct MauvilleManBard *bard = &gSaveBlock1.oldMan.bard;
u8 *string = gStringVar4 + task->data[3];
u16 wordLen = 0;
// Can't get it to match without hacking
u32 temp;
register s16 zero asm("r1");
while (*string != CHAR_SPACE
&& *string != CHAR_NEWLINE
&& *string != EXT_CTRL_CODE_BEGIN
&& *string != EOS)
{
string++;
wordLen++;
}
if (task->data[5] == 0)
gUnknown_020388BC = MACRO1(bard->songLyrics[task->data[4]]);
else
gUnknown_020388BC = MACRO1(bard->mauvilleOldMan_ecArray2[task->data[4]]);
temp = gUnknown_03005DA0.var04 / wordLen;
zero = 0;
gUnknown_03005DA0.var04 = temp;
if (gUnknown_03005DA0.var04 <= 0)
gUnknown_03005DA0.var04 = 1;
task->data[4]++;
if (task->data[2] == 0)
task->data[0] = 3;
else
task->data[0] = 5;
task->data[1] = zero;
}
break;
case 5:
if (task->data[2] == 0)
task->data[0] = 3;
else
task->data[2]--;
break;
case 3:
if (gStringVar4[task->data[3]] == EOS)
{
FadeInNewBGM(BGM_POKECEN, 6);
m4aMPlayFadeOutTemporarily(&gMPlay_SE2, 2);
EnableBothScriptContexts();
DestroyTask(taskId);
}
else if (gStringVar4[task->data[3]] == CHAR_SPACE)
{
sub_8003418(gMenuWindowPtr);
task->data[3]++;
task->data[0] = 2;
task->data[2] = 0;
}
else if (gStringVar4[task->data[3]] == CHAR_NEWLINE)
{
task->data[3]++;
task->data[0] = 2;
task->data[2] = 0;
}
else if (gStringVar4[task->data[3]] == EXT_CTRL_CODE_BEGIN)
{
task->data[3] += 2; // skip over control codes
task->data[0] = 2;
task->data[2] = 8;
}
else if (gStringVar4[task->data[3]] == 0x37) // What is 0x37 supposed to be?
{
gStringVar4[task->data[3]] = 0;
sub_8003418(gMenuWindowPtr);
task->data[3]++;
task->data[2] = 0;
}
else
{
switch (task->data[1])
{
case 0:
sub_8003418(gMenuWindowPtr);
task->data[1]++;
break;
case 1:
task->data[1]++;
break;
case 2:
task->data[3]++;
task->data[1] = 0;
task->data[2] = gUnknown_03005DA0.var04;
task->data[0] = 4;
break;
}
}
break;
case 4:
task->data[2]--;
if (task->data[2] == 0)
task->data[0] = 3;
break;
}
}
void sub_80F83D0(void)
{
VarSet(0x4010, 0x45 + GetCurrentMauvilleOldMan());
}
void StorytellerSetup(void)
{
struct MauvilleManStoryteller *storyteller = &gSaveBlock1.oldMan.storyteller;
s32 i;
storyteller->id = MAUVILLE_MAN_STORYTELLER;
storyteller->unk1 = 0;
for (i = 0; i < 4; i++)
{
storyteller->unk4[i] = 0;
storyteller->unk8[0][i] = EOS; // Maybe they meant storyteller->unk8[i][0] instead?
}
}
void sub_80F8428(void)
{
struct MauvilleManStoryteller *storyteller = &gSaveBlock1.oldMan.storyteller;
storyteller->id = MAUVILLE_MAN_STORYTELLER;
storyteller->unk1 = 0;
}
u32 sub_80F8438(u8 stat)
{
if (stat == 50)
stat = 0;
GetGameStat(stat);
}
struct UnknownStruct1
{
u8 unk0;
u8 unk1;
const u8 *unk4;
const u8 *unk8;
const u8 *unkC;
};
extern const struct UnknownStruct1 gUnknown_083E53E0[];
const struct UnknownStruct1 *sub_80F844C(u32 a)
{
s32 i;
for (i = 0; i < 36; i++)
{
if (gUnknown_083E53E0[i].unk0 == a)
return &gUnknown_083E53E0[i];
}
return &gUnknown_083E53E0[35];
}
const u8 *sub_80F8478(u32 a)
{
return sub_80F844C(a)->unk4;
}
const u8 *sub_80F8484(u32 a)
{
return sub_80F844C(a)->unkC;
}
const u8 *sub_80F8490(u32 a)
{
return sub_80F844C(a)->unk8;
}
u8 sub_80F849C(void)
{
u8 i;
for (i = 0; i < 4; i++)
{
struct MauvilleManStoryteller *storyteller = &gSaveBlock1.oldMan.storyteller;
if (storyteller->unk4[i] == 0)
break;
}
return i;
}
u32 sub_80F84C8(u32 a)
{
u8 *ptr = gSaveBlock1.oldMan.storyteller.unk24[a];
return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24);
}
void sub_80F84EC(u32 a, u32 b)
{
u8 *ptr = gSaveBlock1.oldMan.storyteller.unk24[a];
ptr[0] = b;
ptr[1] = b >> 8;
ptr[2] = b >> 16;
ptr[3] = b >> 24;
}
bool8 sub_80F8508(u32 a)
{
struct MauvilleManStoryteller *storyteller = &gSaveBlock1.oldMan.storyteller;
if (sub_80F8438(storyteller->unk4[a]) > sub_80F84C8(a))
return TRUE;
else
return FALSE;
}
void sub_80F8534(u32 a, void *b)
{
u8 *ptr = gSaveBlock1.oldMan.storyteller.unk8[a];
memset(b, 0xFF, 8);
memcpy(b, ptr, 7);
}
void sub_80F8560(u32 a, const u8 *b)
{
u8 *ptr = gSaveBlock1.oldMan.storyteller.unk8[a];
u8 len = StringLength(b);
memset(ptr, 0xFF, 7);
StringCopyN(ptr, b, len);
}
void sub_80F8598(u32 a, u32 b)
{
struct MauvilleManStoryteller *storyteller = &gSaveBlock1.oldMan.storyteller;
storyteller->unk4[a] = b;
sub_80F8560(a, gSaveBlock2.playerName);
sub_80F84EC(a, sub_80F8438(b));
ConvertIntToDecimalStringN(gStringVar1, sub_80F8438(b), 0, 10);
StringCopy(gStringVar2, sub_80F8490(b));
}