summaryrefslogtreecommitdiff
path: root/src/mauville_old_man.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mauville_old_man.c')
-rw-r--r--src/mauville_old_man.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
index 592b5c4ce..f39f80ab7 100644
--- a/src/mauville_old_man.c
+++ b/src/mauville_old_man.c
@@ -2,10 +2,21 @@
#include "main.h"
#include "constants/easy_chat.h"
#include "mauville_old_man.h"
+#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
void sub_8120E08(void); // StorytellerSetup
void sub_81339F8(void); // TraderSetup
void sub_8120B5C(void);
+void sub_81206C0(u8 a0); // StartBardSong
+void sub_81204DC(void);
static const u16 sDefaultBardSongLyrics[6] = {
EC_WORD_SHAKE,
@@ -16,6 +27,28 @@ static const u16 sDefaultBardSongLyrics[6] = {
EC_WORD_DANCE
};
+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
+};
+
static void SetupBard(void)
{
u16 i;
@@ -82,3 +115,177 @@ void SetMauvilleOldMan(void)
}
sub_8120B5C();
}
+
+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;
+}