Merge pull request #1871 from GriffinRichards/doc-trendy-sayings

Document the trendy sayings word group
This commit is contained in:
GriffinR 2023-03-24 08:05:51 -04:00 committed by GitHub
commit 6be9a79b8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 83 additions and 63 deletions

View File

@ -64,9 +64,9 @@ MauvilleCity_PokemonCenter_1F_EventScript_DeclineWritingLyrics::
MauvilleCity_PokemonCenter_1F_EventScript_Hipster::
lock
faceplayer
setflag FLAG_SYS_HIPSTER_MEET
setflag FLAG_UNLOCKED_TRENDY_SAYINGS
msgbox MauvilleCity_PokemonCenter_1F_Text_TeachWhatsHipAndHappening, MSGBOX_DEFAULT
special GetHipsterSpokenFlag
special HasHipsterTaughtWord
goto_if_eq VAR_RESULT, FALSE, MauvilleCity_PokemonCenter_1F_EventScript_TryTeachWord
msgbox MauvilleCity_PokemonCenter_1F_Text_IAlreadyTaughtYou, MSGBOX_DEFAULT
release
@ -80,8 +80,8 @@ MauvilleCity_PokemonCenter_1F_EventScript_TryTeachWord::
end
MauvilleCity_PokemonCenter_1F_EventScript_TeachWord::
msgbox MauvilleCity_PokemonCenter_1F_Text_HaveYouHeardOfPhrase, MSGBOX_DEFAULT
special SetHipsterSpokenFlag
msgbox MauvilleCity_PokemonCenter_1F_Text_HaveYouHeardOfWord, MSGBOX_DEFAULT
special SetHipsterTaughtWord
release
end
@ -969,7 +969,7 @@ MauvilleCity_PokemonCenter_1F_Text_IveGotNothingNewToTeach:
.string "what's hip and happening.\p"
.string "I've got nothing new to teach you!$"
MauvilleCity_PokemonCenter_1F_Text_HaveYouHeardOfPhrase:
MauvilleCity_PokemonCenter_1F_Text_HaveYouHeardOfWord:
.string "Hey, have you heard about\n"
.string "{STR_VAR_1}”?\p"
.string "What's it mean? Well…\n"

View File

@ -111,8 +111,8 @@ gSpecials::
def_special Script_GetCurrentMauvilleMan
def_special HasBardSongBeenChanged
def_special SaveBardSongLyrics
def_special GetHipsterSpokenFlag
def_special SetHipsterSpokenFlag
def_special HasHipsterTaughtWord
def_special SetHipsterTaughtWord
def_special HipsterTryTeachWord
def_special PlayBardSong
def_special SetMauvilleOldManObjEventGfx

View File

@ -1095,7 +1095,7 @@
#define EC_WORD_OLD ((EC_GROUP_TRENDY_SAYING << EC_MASK_BITS) | 30)
#define EC_WORD_YOUNG ((EC_GROUP_TRENDY_SAYING << EC_MASK_BITS) | 31)
#define EC_WORD_UGLY ((EC_GROUP_TRENDY_SAYING << EC_MASK_BITS) | 32)
#define NUM_ADDITIONAL_PHRASES 33
#define NUM_TRENDY_SAYINGS 33
// Special Berry Masters Wife phrases
#define NOT_SPECIAL_PHRASE 0

View File

@ -1348,7 +1348,7 @@
#define FLAG_UNUSED_0x863 (SYSTEM_FLAGS + 0x3) // Unused Flag
#define FLAG_SYS_GAME_CLEAR (SYSTEM_FLAGS + 0x4)
#define FLAG_SYS_CHAT_USED (SYSTEM_FLAGS + 0x5)
#define FLAG_SYS_HIPSTER_MEET (SYSTEM_FLAGS + 0x6)
#define FLAG_UNLOCKED_TRENDY_SAYINGS (SYSTEM_FLAGS + 0x6)
// Badges
#define FLAG_BADGE01_GET (SYSTEM_FLAGS + 0x7)

View File

@ -128,11 +128,11 @@ void InitializeEasyChatWordArray(u16 *words, u16 length);
u8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows);
bool8 IsBardWordInvalid(u16 word);
u16 GetRandomEasyChatWordFromGroup(u16 group);
u16 GetNewHipsterPhraseToTeach(void);
u16 UnlockRandomTrendySaying(void);
u16 EasyChat_GetNumWordsInGroup(u8);
u16 GetRandomEasyChatWordFromUnlockedGroup(u16);
void DoEasyChatScreen(u8 type, u16 *words, MainCallback callback, u8 displayedPersonType);
void InitQuestionnaireWords(void);
void UnlockAdditionalPhrase(u8 additionalPhraseId);
void UnlockTrendySaying(u8 wordIndex);
#endif // GUARD_EASYCHAT_H

View File

@ -133,7 +133,7 @@
// values that don't appear in the Pokedex. NATIONAL_DEX_COUNT does not include these values.
#define NUM_DEX_FLAG_BYTES ROUND_BITS_TO_BYTES(NUM_SPECIES)
#define NUM_FLAG_BYTES ROUND_BITS_TO_BYTES(FLAGS_COUNT)
#define NUM_ADDITIONAL_PHRASE_BYTES ROUND_BITS_TO_BYTES(NUM_ADDITIONAL_PHRASES)
#define NUM_TRENDY_SAYING_BYTES ROUND_BITS_TO_BYTES(NUM_TRENDY_SAYINGS)
// This produces an error at compile-time if expr is zero.
// It looks like file.c:line: size of array `id' is negative
@ -673,7 +673,7 @@ struct MauvilleManGiddy
struct MauvilleManHipster
{
u8 id;
bool8 alreadySpoken;
bool8 taughtWord;
u8 language;
};
@ -1031,7 +1031,7 @@ struct SaveBlock1
/*0x2BC8*/ u16 easyChatBattleWon[EASY_CHAT_BATTLE_WORDS_COUNT];
/*0x2BD4*/ u16 easyChatBattleLost[EASY_CHAT_BATTLE_WORDS_COUNT];
/*0x2BE0*/ struct Mail mail[MAIL_COUNT];
/*0x2E20*/ u8 additionalPhrases[NUM_ADDITIONAL_PHRASE_BYTES]; // bitfield for 33 additional phrases in easy chat system
/*0x2E20*/ u8 unlockedTrendySayings[NUM_TRENDY_SAYING_BYTES]; // Bitfield for unlockable Easy Chat words in EC_GROUP_TRENDY_SAYING
/*0x2E25*/ //u8 padding5[3];
/*0x2E28*/ OldMan oldMan;
/*0x2e64*/ struct DewfordTrend dewfordTrends[SAVED_TRENDS_COUNT];

View File

@ -5109,7 +5109,7 @@ static bool8 IsEasyChatGroupUnlocked(u8 groupId)
switch (groupId)
{
case EC_GROUP_TRENDY_SAYING:
return FlagGet(FLAG_SYS_HIPSTER_MEET);
return FlagGet(FLAG_UNLOCKED_TRENDY_SAYINGS);
case EC_GROUP_EVENTS:
case EC_GROUP_MOVE_1:
case EC_GROUP_MOVE_2:
@ -5425,80 +5425,99 @@ void BufferDeepLinkPhrase(void)
CopyEasyChatWord(gStringVar2, easyChatWord);
}
static bool8 IsAdditionalPhraseUnlocked(u8 additionalPhraseId)
/*
### Trendy Sayings
Not to be confused with Dewford Town's "trendy phrase".
This is a group of easy chat words (EC_GROUP_TRENDY_SAYING) that are normally inaccessible.
They can be unlocked either through Mystery Event (where they're referred to as "rare" words)
or from the "Hipster" variety of the Mauville Old Man. The Hipster can unlock one word each
time he is received via record mixing (and once if he is the player's default Old Man).
Which words have been unlocked is saved in the unlockedTrendySayings bitfield in SaveBlock1
Unlocked trendy saying words are only accessible if the flag FLAG_UNLOCKED_TRENDY_SAYINGS is set.
It's set any time the player talks to the Hipster, but is not apparently set by Mystery Event,
meaning trendy saying words unlocked via Mystery Event may not be available until the player has
talked to the Hipster.
*/
static bool8 IsTrendySayingUnlocked(u8 wordIndex)
{
int byteOffset = additionalPhraseId / 8;
int shift = additionalPhraseId % 8;
return (gSaveBlock1Ptr->additionalPhrases[byteOffset] >> shift) & 1;
int byteOffset = wordIndex / 8;
int shift = wordIndex % 8;
return (gSaveBlock1Ptr->unlockedTrendySayings[byteOffset] >> shift) & 1;
}
void UnlockAdditionalPhrase(u8 additionalPhraseId)
void UnlockTrendySaying(u8 wordIndex)
{
if (additionalPhraseId < NUM_ADDITIONAL_PHRASES)
if (wordIndex < NUM_TRENDY_SAYINGS)
{
int byteOffset = additionalPhraseId / 8;
int shift = additionalPhraseId % 8;
gSaveBlock1Ptr->additionalPhrases[byteOffset] |= 1 << shift;
int byteOffset = wordIndex / 8;
int shift = wordIndex % 8;
gSaveBlock1Ptr->unlockedTrendySayings[byteOffset] |= 1 << shift;
}
}
static u8 GetNumAdditionalPhrasesUnlocked(void)
static u8 GetNumTrendySayingsUnlocked(void)
{
u8 i;
u8 numAdditionalPhrasesUnlocked;
u8 numUnlocked;
for (i = 0, numAdditionalPhrasesUnlocked = 0; i < NUM_ADDITIONAL_PHRASES; i++)
for (i = 0, numUnlocked = 0; i < NUM_TRENDY_SAYINGS; i++)
{
if (IsAdditionalPhraseUnlocked(i))
numAdditionalPhrasesUnlocked++;
if (IsTrendySayingUnlocked(i))
numUnlocked++;
}
return numAdditionalPhrasesUnlocked;
return numUnlocked;
}
u16 GetNewHipsterPhraseToTeach(void)
u16 UnlockRandomTrendySaying(void)
{
u16 i;
u16 additionalPhraseId;
u8 numAdditionalPhrasesUnlocked = GetNumAdditionalPhrasesUnlocked();
if (numAdditionalPhrasesUnlocked == NUM_ADDITIONAL_PHRASES)
u16 numToSkip;
u8 numUnlocked = GetNumTrendySayingsUnlocked();
if (numUnlocked == NUM_TRENDY_SAYINGS)
return EC_EMPTY_WORD;
additionalPhraseId = Random() % (NUM_ADDITIONAL_PHRASES - numAdditionalPhrasesUnlocked);
for (i = 0; i < NUM_ADDITIONAL_PHRASES; i++)
numToSkip = Random() % (NUM_TRENDY_SAYINGS - numUnlocked);
for (i = 0; i < NUM_TRENDY_SAYINGS; i++)
{
if (!IsAdditionalPhraseUnlocked(i))
if (!IsTrendySayingUnlocked(i))
{
if (additionalPhraseId)
if (numToSkip)
{
additionalPhraseId--;
// Skip the first n locked words, as determined by the Random call above.
numToSkip--;
}
else
{
UnlockAdditionalPhrase(i);
UnlockTrendySaying(i);
return EC_WORD(EC_GROUP_TRENDY_SAYING, i);
}
}
}
// Would only be reached if there are no new words to teach, which is handled at the start.
return EC_EMPTY_WORD;
}
// Unused
u16 GetRandomTaughtHipsterPhrase(void)
static u16 GetRandomUnlockedTrendySaying(void)
{
u16 i;
u16 additionalPhraseId = GetNumAdditionalPhrasesUnlocked();
if (additionalPhraseId == 0)
u16 n = GetNumTrendySayingsUnlocked();
if (n == 0)
return EC_EMPTY_WORD;
additionalPhraseId = Random() % additionalPhraseId;
for (i = 0; i < NUM_ADDITIONAL_PHRASES; i++)
n = Random() % n;
for (i = 0; i < NUM_TRENDY_SAYINGS; i++)
{
if (IsAdditionalPhraseUnlocked(i))
if (IsTrendySayingUnlocked(i))
{
if (additionalPhraseId)
additionalPhraseId--;
if (n)
n--;
else
return EC_WORD(EC_GROUP_TRENDY_SAYING, i);
}
@ -5569,10 +5588,10 @@ void InitEasyChatPhrases(void)
// Mauville old man data is corrupted, which is initialized directly after
// this function is called when starting a new game.
for (i = 0; i < 64; i++)
gSaveBlock1Ptr->additionalPhrases[i] = 0;
gSaveBlock1Ptr->unlockedTrendySayings[i] = 0;
#else
for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->additionalPhrases); i++)
gSaveBlock1Ptr->additionalPhrases[i] = 0;
for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->unlockedTrendySayings); i++)
gSaveBlock1Ptr->unlockedTrendySayings[i] = 0;
#endif
}
@ -5611,7 +5630,7 @@ static void SetUnlockedEasyChatGroups(void)
sWordData->unlockedGroupIds[sWordData->numUnlockedGroups++] = EC_GROUP_MOVE_2;
}
if (FlagGet(FLAG_SYS_HIPSTER_MEET))
if (FlagGet(FLAG_UNLOCKED_TRENDY_SAYINGS))
sWordData->unlockedGroupIds[sWordData->numUnlockedGroups++] = EC_GROUP_TRENDY_SAYING;
if (IsNationalPokedexEnabled())
@ -5800,7 +5819,7 @@ static bool8 IsEasyChatIndexAndGroupUnlocked(u16 wordIndex, u8 groupId)
case EC_GROUP_MOVE_2:
return TRUE;
case EC_GROUP_TRENDY_SAYING:
return IsAdditionalPhraseUnlocked(wordIndex);
return IsTrendySayingUnlocked(wordIndex);
default:
return gEasyChatGroups[groupId].wordData.words[wordIndex].enabled;
}

View File

@ -88,7 +88,7 @@ static void SetupHipster(void)
struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster;
hipster->id = MAUVILLE_MAN_HIPSTER;
hipster->alreadySpoken = FALSE;
hipster->taughtWord = FALSE;
hipster->language = gGameLanguage;
}
@ -225,27 +225,28 @@ void PlayBardSong(void)
ScriptContext_Stop();
}
void GetHipsterSpokenFlag(void)
void HasHipsterTaughtWord(void)
{
gSpecialVar_Result = (&gSaveBlock1Ptr->oldMan.hipster)->alreadySpoken;
gSpecialVar_Result = (&gSaveBlock1Ptr->oldMan.hipster)->taughtWord;
}
void SetHipsterSpokenFlag(void)
void SetHipsterTaughtWord(void)
{
(&gSaveBlock1Ptr->oldMan.hipster)->alreadySpoken = TRUE;
(&gSaveBlock1Ptr->oldMan.hipster)->taughtWord = TRUE;
}
void HipsterTryTeachWord(void)
{
u16 phrase = GetNewHipsterPhraseToTeach();
u16 word = UnlockRandomTrendySaying();
if (phrase == EC_EMPTY_WORD)
if (word == EC_EMPTY_WORD)
{
// All words already unlocked
gSpecialVar_Result = FALSE;
}
else
{
CopyEasyChatWord(gStringVar1, phrase);
CopyEasyChatWord(gStringVar1, word);
gSpecialVar_Result = TRUE;
}
}
@ -369,7 +370,7 @@ static void ResetBardFlag(void)
static void ResetHipsterFlag(void)
{
(&gSaveBlock1Ptr->oldMan.hipster)->alreadySpoken = FALSE;
(&gSaveBlock1Ptr->oldMan.hipster)->taughtWord = FALSE;
}
static void ResetTraderFlag(void)

View File

@ -293,7 +293,7 @@ bool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx)
bool8 MEScrCmd_addrareword(struct ScriptContext *ctx)
{
UnlockAdditionalPhrase(ScriptReadByte(ctx));
UnlockTrendySaying(ScriptReadByte(ctx));
StringExpandPlaceholders(gStringVar4, gText_MysteryEventRareWord);
ctx->mStatus = MEVENT_STATUS_SUCCESS;
return FALSE;