#ifndef GUARD_EASYCHAT_H #define GUARD_EASYCHAT_H #include "main.h" #include "constants/easy_chat.h" struct EasyChatScreenTemplate { u8 type; u8 numColumns; u8 numRows; u8 frameId:7; u8 fourFooterOptions:1; const u8 *titleText; const u8 *instructionsText1; const u8 *instructionsText2; const u8 *confirmText1; const u8 *confirmText2; }; struct EasyChatScreen { /*0x00*/ u8 type; /*0x01*/ u8 templateId; /*0x02*/ u8 numColumns; /*0x03*/ u8 numRows; /*0x04*/ u8 inputState; /*0x05*/ s8 mainCursorColumn; /*0x06*/ s8 mainCursorRow; /*0x07*/ u8 maxWords; /*0x08*/ u8 inputStateBackup; /*0x09*/ bool8 inAlphabetMode; /*0x0A*/ s8 keyboardColumn; /*0x0B*/ s8 keyboardRow; /*0x0C*/ u8 keyboardScrollOffset; /*0x0D*/ u8 keyboardLastRow; /*0x0E*/ u8 wordSelectScrollOffset; /*0x0F*/ u8 wordSelectLastRow; /*0x10*/ s8 wordSelectColumn; /*0x11*/ s8 wordSelectRow; /*0x12*/ u8 displayedPersonType; /*0x13*/ u8 unused; // Set to 0, never read /*0x14*/ u8 quizTitle[32]; /*0x34*/ const u8 *titleText; /*0x38*/ u16 *savedPhrase; /*0x3C*/ u16 currentPhrase[9]; }; struct EasyChatScreenControl { u16 funcState; u16 windowId; u16 currentFuncId; u8 curWindowAnimState; u8 destWindowAnimState; s8 windowAnimStateDir; u8 modeWindowState; bool8 fourFooterOptions; // Never read (template is used directly instead) u8 phrasePrintBuffer[193]; u8 wordSelectPrintBuffer[514]; u16 scrollOffset; int scrollDest; int scrollSpeed; struct Sprite *mainCursorSprite; struct Sprite *rectangleCursorSpriteRight; struct Sprite *rectangleCursorSpriteLeft; struct Sprite *wordSelectCursorSprite; struct Sprite *buttonWindowSprite; struct Sprite *modeWindowSprite; struct Sprite *scrollIndicatorUpSprite; struct Sprite *scrollIndicatorDownSprite; struct Sprite *startButtonSprite; struct Sprite *selectButtonSprite; u16 bg1TilemapBuffer[BG_SCREEN_SIZE / 2]; u16 bg3TilemapBuffer[BG_SCREEN_SIZE / 2]; }; struct EasyChatPhraseFrameDimensions { u8 left:5; u8 top:3; u8 width; u8 height; u8 footerId; }; struct EasyChatWordInfo { const u8 *text; int alphabeticalOrder; int enabled; }; typedef union { const u16 *valueList; const struct EasyChatWordInfo *words; } EasyChatGroupWordData; struct EasyChatGroup { EasyChatGroupWordData wordData; u16 numWords; u16 numEnabledWords; }; struct EasyChatScreenWordData { u16 numUnlockedGroups; u16 unlockedGroupIds[EC_NUM_GROUPS]; u16 numUnlockedAlphabetWords[EC_NUM_ALPHABET_GROUPS]; u16 unlockedAlphabetWords[EC_NUM_ALPHABET_GROUPS][EC_MAX_WORDS_IN_GROUP]; u8 unused[44]; u16 selectedGroupWords[EC_MAX_WORDS_IN_GROUP]; u16 numSelectedGroupWords; }; /*size = 0x3BA4*/ struct EasyChatWordsByLetter { const u16 *words; int numWords; }; void InitEasyChatPhrases(void); void ShowEasyChatScreen(void); u8 * CopyEasyChatWord(u8 *dest, u16 word); bool32 IsEasyChatAnswerUnlocked(int word); 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 EasyChat_GetNumWordsInGroup(u8); u16 GetRandomEasyChatWordFromUnlockedGroup(u16); void DoEasyChatScreen(u8 type, u16 *words, MainCallback callback, u8 displayedPersonType); void InitQuestionnaireWords(void); void UnlockAdditionalPhrase(u8 additionalPhraseId); #endif // GUARD_EASYCHAT_H