diff options
author | JaceCearK1 <JaceCearK1@users.noreply.github.com> | 2017-07-01 21:04:18 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-01 21:04:18 +0200 |
commit | 0dd804a99e5455a0eac8ff6ed87d9de16c7380b7 (patch) | |
tree | 7b3567978b63ee6548a7b945e075ea8ba37bef51 /src/easy_chat.c | |
parent | f1344efd2aff92292f58f7323bd9297a38fe9b02 (diff) | |
parent | 8d82578d3a101b06f9d2ced31738021007c4e533 (diff) |
Merge pull request #1 from pret/master
Update fork to match main fork.
Diffstat (limited to 'src/easy_chat.c')
-rw-r--r-- | src/easy_chat.c | 482 |
1 files changed, 482 insertions, 0 deletions
diff --git a/src/easy_chat.c b/src/easy_chat.c new file mode 100644 index 000000000..cc2cd7030 --- /dev/null +++ b/src/easy_chat.c @@ -0,0 +1,482 @@ +#include "global.h" +#include "easy_chat.h" +#include "data2.h" +#include "event_data.h" +#include "field_message_box.h" +#include "pokedex.h" +#include "rng.h" +#include "string_util.h" +#include "strings.h" +#include "strings2.h" +#include "text.h" + +static bool8 sub_80EB680(u16 *, u16, u16, u16); +static u16 sub_80EB9D8(void); +static u16 sub_80EB960(void); + +extern void *gEasyChatGroupWords[]; +extern const u8 gEasyChatGroupSizes[]; + +extern u16 gSpecialVar_0x8004; + +#ifdef NONMATCHING +u8 *sub_80EB3FC(u8 *dst, u16 word) { + int group, wordIndex; + u8 *src; + u16 i; + + + if (sub_80EB37C(word)) + { + return StringCopy(dst, gOtherText_ThreeQuestions); + } + + if (word != 0xFFFF) + { + group = word >> 9; + wordIndex = word & 0x1FF; + switch (group) + { + case EC_GROUP_POKEMON: // 0 + case EC_GROUP_POKEMON_2: // 21 + dst = StringCopy(dst, gSpeciesNames[wordIndex]); + break; + + case EC_GROUP_MOVE_1: // 18 + case EC_GROUP_MOVE_2: // 19 + dst = StringCopy(dst, gMoveNames[wordIndex]); + break; + + default: + src = gEasyChatGroupWords[group]; + + i = wordIndex - 1; + while (i != 0xFFFF) + { + while (*src++ != EOS) + { + } + i--; + } + dst = StringCopy(dst, src); + break; + } + } + + dst[0] = EOS; + return dst; +} +#endif + +u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3) { + u16 i; + u16 n; + + const u16 i1 = arg2 - 1; + + for (i = 0; i < arg3; i++) + { + u16 word; + + for (n = 0; n < i1; n++) + { + dst = sub_80EB3FC(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = sub_80EB3FC(dst, word); + + dst[0] = 0xFE; + dst++; + } + + dst--; + dst[0] = EOS; + + return dst; +} + +u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3) { + u16 i; + u16 n; + + const u16 i1 = arg2 - 1; + + for (i = 0; i < arg3; i++) + { + u16 word; + + for (n = 0; n < i1; n++) + { + dst = sub_80EB3FC(dst, words[0]); + + if (words[0] != 0xFFFF) + { + dst[0] = CHAR_SPACE; + dst++; + } + + words++; + } + + word = words[0]; + words++; + dst = sub_80EB3FC(dst, word); + + // Only difference with ConvertEasyChatWordsToString + dst[0] = (i == 0) ? 0xFE : 0xFA; + dst++; + } + + dst--; + dst[0] = EOS; + + return dst; +} + + +u16 unref_sub_80EB5E0(u16 arg0) { + u8 *chars; + u16 i; + u16 strlen; + int group, word; + + + if (arg0 == 0xFFFF) + { + return 0; + } + + group = arg0 >> 9; + word = arg0 & 0x1FF; + switch (group) + { + case EC_GROUP_POKEMON: // 0 + case EC_GROUP_POKEMON_2: // 21 + chars = (u8 *) gSpeciesNames[word]; + break; + + case EC_GROUP_MOVE_1: // 18 + case EC_GROUP_MOVE_2: // 19 + chars = gMoveNames[word]; + break; + + default: + chars = gEasyChatGroupWords[group]; + + i = word - 1; + while (i != 0xFFFF) + { + while (*chars++ != EOS) + { + } + i--; + } + break; + } + + strlen = 0; + while (*chars != EOS) + { + chars++; + strlen += 1; + } + + return strlen; +} + +static bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3) { + return FALSE; +} + +void unref_sub_80EB684(u8 arg0, u16 arg1) { + u16 *ptr; + u16 c; + + // FIXME: find actual tv shows used + switch (arg0) + { + case 5: + c = 6; + ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x04); + break; + case 7: + c = 2; + ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x1C); + break; + case 8: + c = 1; + ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x02); + break; + + default: + return; + } + + c -= 1; + while (c != 0xFFFF) + { + *ptr = -1; + ptr++; + c -= 1; + } +} + +void sub_80EB6FC(u16 *arg0, u16 arg1) { + u16 i; + + for (i = arg1 - 1; i != 0xFFFF; i--) + { + *arg0 = 0xFFFF; + arg0++; + } + +} + +u16 sub_80EB72C(u16 group) { + u16 local1; + + local1 = Random() % gEasyChatGroupSizes[group]; + + if (group == EC_GROUP_POKEMON || + group == EC_GROUP_POKEMON_2 || + group == EC_GROUP_MOVE_1 || + group == EC_GROUP_MOVE_2) + { + local1 = ((u16 *) gEasyChatGroupWords[group])[local1]; + } + + + return ((group & 0x7F) << 9) | (local1 & 0x1FF); +} + +u16 sub_80EB784(u16 group) { + if (!sub_80EAD7C(group)) + { + return -1; + } + + if (group != EC_GROUP_POKEMON) + { + if (group == EC_GROUP_TRENDY_SAYING) + { + return sub_80EB960(); + } + } + else + { + return sub_80EB9D8(); + } + + return sub_80EB72C(group); +} + +void sub_80EB7C4(void) { + u16 *words; + u16 arg1, arg2; + + + switch (gSpecialVar_0x8004) + { + case 0: + words = gSaveBlock1.unk2B1C; + arg1 = 2; + arg2 = 2; + break; + + case 1: + words = gSaveBlock1.unk2B28; + if (sub_80EB680(gSaveBlock1.unk2B28, 3, 2, 20)) + { + arg1 = 2; + arg2 = 3; + } + else + { + arg1 = 3; + arg2 = 2; + } + break; + + case 2: + words = gSaveBlock1.unk2B34; + arg1 = 3; + arg2 = 2; + break; + + case 3: + words = gSaveBlock1.unk2B40; + arg1 = 3; + arg2 = 2; + break; + + default: + return; + } + + ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2); + ShowFieldAutoScrollMessage(gStringVar4); +} + +void sub_80EB83C(void) { + u16 group, local2; + + if (Random() & 1) + { + group = EC_GROUP_HOBBIES; + } + else + { + group = EC_GROUP_LIFESTYLE; + } + + local2 = sub_80EB784(group); + sub_80EB3FC(gStringVar2, local2); +} + +u8 sub_80EB868(u8 arg0) { + int offset; + int index; + + index = arg0 / 8; + offset = arg0 & 7; + return (gSaveBlock1.unk2D8C[index] >> offset) & 1; +} + +void sub_80EB890(u8 arg0) { + int offset; + int index; + + if (arg0 > 32) + { + return; + } + + index = arg0 / 8; + offset = arg0 & 7; + gSaveBlock1.unk2D8C[index] |= 1 << offset; +} + +u8 sub_80EB8C0(void) { + u8 i, retval; + + i = 0; + retval = 0; + for (; i < 33; i++) + { + if (sub_80EB868(i)) + { + retval += 1; + } + } + + return retval; +} + +u16 sub_80EB8EC(void) { + u16 i; + u16 local1, local2; + + local1 = sub_80EB8C0(); + if (local1 == 33) + { + return -1; + } + + local2 = Random() % (33 - local1); + + for (i = 0; i <= 0x20; i++) + { + if (sub_80EB868(i) == 0) + { + if (local2 == 0) + { + sub_80EB890(i); + return (i & 0x1FF) | 0x2800; + } + + local2--; + } + } + + return -1; +} + +static u16 sub_80EB960(void) { + u16 i; + u16 local1; + + local1 = sub_80EB8C0(); + if (local1 == 0) + { + return -1; + } + + local1 = Random() % local1; + + for (i = 0; i <= 0x20; i++) + { + if (sub_80EB868(i)) + { + if (local1 == 0) + { + return (i & 0x1FF) | 0x2800; + } + + local1--; + } + } + + return -1; +} + +u8 sub_80EB9C8(void) { + return IsNationalPokedexEnabled(); +} + +static u16 sub_80EB9D8(void) { + u16 *speciesList; + u16 local1; + u16 i; + + local1 = sub_80EAE88(0); + + if (local1 == 0) + { + return -1; + } + + local1 = Random() % local1; + speciesList = (u16 *) gEasyChatGroupWords[EC_GROUP_POKEMON]; + + for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON]; i++) + { + const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList); + + const u8 local2 = GetNationalPokedexFlag(dexNum, 0); + + if (local2) + { + if (local1 == 0) + { + return *speciesList & 0x1FF; + } + + local1--; + } + + speciesList++; + } + + return -1; +} + |