2018-05-02 16:31:58 +01:00
|
|
|
#include "global.h"
|
|
|
|
#include "main.h"
|
|
|
|
#include "constants/easy_chat.h"
|
|
|
|
#include "mauville_old_man.h"
|
2018-05-02 21:57:34 +01:00
|
|
|
#include "event_data.h"
|
|
|
|
#include "string_util.h"
|
|
|
|
#include "text.h"
|
|
|
|
#include "easy_chat.h"
|
|
|
|
#include "script.h"
|
|
|
|
#include "random.h"
|
|
|
|
#include "event_scripts.h"
|
|
|
|
|
|
|
|
#define CHAR_SONG_WORD_SEPARATOR 0x37
|
2018-05-02 16:31:58 +01:00
|
|
|
|
|
|
|
void sub_8120E08(void); // StorytellerSetup
|
|
|
|
void sub_81339F8(void); // TraderSetup
|
|
|
|
void sub_8120B5C(void);
|
2018-05-02 21:57:34 +01:00
|
|
|
void sub_81206C0(u8 a0); // StartBardSong
|
|
|
|
void sub_81204DC(void);
|
2018-05-02 16:31:58 +01:00
|
|
|
|
|
|
|
static const u16 sDefaultBardSongLyrics[6] = {
|
|
|
|
EC_WORD_SHAKE,
|
|
|
|
EC_WORD_IT,
|
|
|
|
EC_WORD_DO,
|
|
|
|
EC_WORD_THE,
|
|
|
|
EC_WORD_DIET,
|
|
|
|
EC_WORD_DANCE
|
|
|
|
};
|
|
|
|
|
2018-05-02 21:57:34 +01:00
|
|
|
static const u8 * const sGiddyAdjectives[] = {
|
|
|
|
gText_SoPretty,
|
|
|
|
gText_SoDarling,
|
|
|
|
gText_SoRelaxed,
|
|
|
|
gText_SoSunny,
|
|
|
|
gText_SoDesirable,
|
|
|
|
gText_SoExciting,
|
|
|
|
gText_SoAmusing,
|
|
|
|
gText_SoMagical
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 * const sGiddyQuestions[] = {
|
|
|
|
gUnknown_08294313,
|
|
|
|
gUnknown_08294359,
|
|
|
|
gUnknown_08294398,
|
|
|
|
gUnknown_082943DA,
|
|
|
|
gUnknown_0829441C,
|
|
|
|
gUnknown_08294460,
|
|
|
|
gUnknown_082944A0,
|
|
|
|
gUnknown_082944D5
|
|
|
|
};
|
|
|
|
|
2018-05-02 16:31:58 +01:00
|
|
|
static void SetupBard(void)
|
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
|
|
|
|
|
|
|
|
bard->id = MAUVILLE_MAN_BARD;
|
|
|
|
bard->hasChangedSong = FALSE;
|
|
|
|
bard->language = gGameLanguage;
|
|
|
|
for (i = 0; i < 6; i++)
|
|
|
|
bard->songLyrics[i] = sDefaultBardSongLyrics[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
static void SetupHipster(void)
|
|
|
|
{
|
|
|
|
struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster;
|
|
|
|
|
|
|
|
hipster->id = MAUVILLE_MAN_HIPSTER;
|
|
|
|
hipster->alreadySpoken = FALSE;
|
|
|
|
hipster->language = gGameLanguage;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void SetupStoryteller(void)
|
|
|
|
{
|
|
|
|
sub_8120E08();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void SetupGiddy(void)
|
|
|
|
{
|
|
|
|
struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy;
|
|
|
|
|
|
|
|
giddy->id = MAUVILLE_MAN_GIDDY;
|
|
|
|
giddy->taleCounter = 0;
|
|
|
|
giddy->language = gGameLanguage;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void SetupTrader(void)
|
|
|
|
{
|
|
|
|
sub_81339F8();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SetMauvilleOldMan(void)
|
|
|
|
{
|
|
|
|
u16 trainerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];
|
|
|
|
|
|
|
|
|
|
|
|
// Determine man based on the last digit of the player's trainer ID.
|
|
|
|
switch ((trainerId % 10) / 2)
|
|
|
|
{
|
|
|
|
case MAUVILLE_MAN_BARD:
|
|
|
|
SetupBard();
|
|
|
|
break;
|
|
|
|
case MAUVILLE_MAN_HIPSTER:
|
|
|
|
SetupHipster();
|
|
|
|
break;
|
|
|
|
case MAUVILLE_MAN_TRADER:
|
|
|
|
SetupTrader();
|
|
|
|
break;
|
|
|
|
case MAUVILLE_MAN_STORYTELLER:
|
|
|
|
SetupStoryteller();
|
|
|
|
break;
|
|
|
|
case MAUVILLE_MAN_GIDDY:
|
|
|
|
SetupGiddy();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
sub_8120B5C();
|
|
|
|
}
|
2018-05-02 21:57:34 +01:00
|
|
|
|
|
|
|
u8 sub_81201C8(void) // GetCurrentMauvilleOldMan
|
|
|
|
{
|
|
|
|
struct MauvilleManCommon *common = &gSaveBlock1Ptr->oldMan.common;
|
|
|
|
|
|
|
|
return common->id;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_81201DC(void) // ScrSpecial_GetCurrentMauvilleMan
|
|
|
|
{
|
|
|
|
gSpecialVar_Result = sub_81201C8();
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_81201F4(void) // ScrSpecial_HasBardSongBeenChanged
|
|
|
|
{
|
|
|
|
u16 *scriptResult = &gSpecialVar_Result; // why??
|
|
|
|
struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
|
|
|
|
|
|
|
|
*scriptResult = bard->hasChangedSong;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_8120210(void) // ScrSpecial_SaveBardSongLyrics
|
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
|
|
|
|
|
|
|
|
StringCopy(bard->playerName, gSaveBlock2Ptr->playerName);
|
|
|
|
|
|
|
|
for (i = 0; i < 4; i++)
|
|
|
|
bard->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
|
|
|
|
|
|
|
|
for (i = 0; i < 6; i++)
|
|
|
|
bard->songLyrics[i] = bard->temporaryLyrics[i];
|
|
|
|
|
|
|
|
bard->hasChangedSong = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Copies lyrics into gStringVar4
|
|
|
|
void sub_8120280(void)
|
|
|
|
{
|
|
|
|
struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
|
|
|
|
u16 specialVar = gSpecialVar_0x8004; // It's a bit odd to use this temp variable, but it seems needed to match.
|
|
|
|
u16 *lyrics;
|
|
|
|
u16 lineNum;
|
|
|
|
u8 *wordEnd;
|
|
|
|
u8 *str;
|
|
|
|
|
|
|
|
lyrics = bard->temporaryLyrics;
|
|
|
|
if (specialVar == 0)
|
|
|
|
lyrics = bard->songLyrics;
|
|
|
|
wordEnd = gStringVar4;
|
|
|
|
str = wordEnd;
|
|
|
|
// Put three words on each line
|
|
|
|
for (lineNum = 0; lineNum < 2; lineNum++)
|
|
|
|
{
|
|
|
|
wordEnd = CopyEasyChatWord(wordEnd, *(lyrics++));
|
|
|
|
while (wordEnd != str)
|
|
|
|
{
|
|
|
|
if (*str == CHAR_SPACE)
|
|
|
|
*str = CHAR_SONG_WORD_SEPARATOR;
|
|
|
|
str++;
|
|
|
|
}
|
|
|
|
|
|
|
|
str++;
|
|
|
|
*(wordEnd++) = CHAR_SPACE;
|
|
|
|
|
|
|
|
wordEnd = CopyEasyChatWord(wordEnd, *(lyrics++));
|
|
|
|
while (wordEnd != str)
|
|
|
|
{
|
|
|
|
if (*str == CHAR_SPACE)
|
|
|
|
*str = CHAR_SONG_WORD_SEPARATOR;
|
|
|
|
str++;
|
|
|
|
}
|
|
|
|
|
|
|
|
str++;
|
|
|
|
*(wordEnd++) = CHAR_NEWLINE;
|
|
|
|
|
|
|
|
wordEnd = CopyEasyChatWord(wordEnd, *(lyrics++));
|
|
|
|
while (wordEnd != str)
|
|
|
|
{
|
|
|
|
if (*str == CHAR_SPACE)
|
|
|
|
*str = CHAR_SONG_WORD_SEPARATOR;
|
|
|
|
str++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lineNum == 0)
|
|
|
|
{
|
|
|
|
*(wordEnd++) = EXT_CTRL_CODE_BEGIN;
|
|
|
|
*(wordEnd++) = 15;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_8120340(void) // ScrSpecial_PlayBardSong
|
|
|
|
{
|
|
|
|
sub_81206C0(gSpecialVar_0x8004);
|
|
|
|
ScriptContext1_Stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_8120358(void) // ScrSpecial_GetHipsterSpokenFlag
|
|
|
|
{
|
|
|
|
u16 *scriptResult = &gSpecialVar_Result; // again??
|
|
|
|
struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster;
|
|
|
|
|
|
|
|
*scriptResult = hipster->alreadySpoken;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_8120374(void) // ScrSpecial_SetHipsterSpokenFlag
|
|
|
|
{
|
|
|
|
struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster;
|
|
|
|
|
|
|
|
hipster->alreadySpoken = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_812038C(void) // ScrSpecial_HipsterTeachWord
|
|
|
|
{
|
|
|
|
u16 var = sub_811F01C();
|
|
|
|
|
|
|
|
if (var == 0xFFFF)
|
|
|
|
{
|
|
|
|
gSpecialVar_Result = FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
CopyEasyChatWord(gStringVar1, var);
|
|
|
|
gSpecialVar_Result = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_81203C4(void) // ScrSpecial_GiddyShouldTellAnotherTale
|
|
|
|
{
|
|
|
|
struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy;
|
|
|
|
|
|
|
|
if (giddy->taleCounter == 10)
|
|
|
|
{
|
|
|
|
gSpecialVar_Result = FALSE;
|
|
|
|
giddy->taleCounter = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gSpecialVar_Result = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_81203FC(void) // ScrSpecial_GenerateGiddyLine
|
|
|
|
{
|
|
|
|
struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy;
|
|
|
|
|
|
|
|
if (giddy->taleCounter == 0)
|
|
|
|
sub_81204DC();
|
|
|
|
|
|
|
|
if (giddy->randomWords[giddy->taleCounter] != 0xFFFF) // is not the last element of the array?
|
|
|
|
{
|
|
|
|
u8 *stringPtr;
|
|
|
|
u32 adjective = Random();
|
|
|
|
|
|
|
|
adjective %= 8;
|
|
|
|
stringPtr = CopyEasyChatWord(gStringVar4, giddy->randomWords[giddy->taleCounter]);
|
|
|
|
stringPtr = StringCopy(stringPtr, gOtherText_Is);
|
|
|
|
stringPtr = StringCopy(stringPtr, sGiddyAdjectives[adjective]);
|
|
|
|
StringCopy(stringPtr, gOtherText_DontYouAgree);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
StringCopy(gStringVar4, sGiddyQuestions[giddy->questionList[giddy->questionNum++]]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(Random() % 10))
|
|
|
|
giddy->taleCounter = 10;
|
|
|
|
else
|
|
|
|
giddy->taleCounter++;
|
|
|
|
|
|
|
|
gSpecialVar_Result = TRUE;
|
|
|
|
}
|