mirror of
https://github.com/pret/pokeruby.git
synced 2026-10-05 17:02:45 -04:00
483 lines
8.1 KiB
C
483 lines
8.1 KiB
C
#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;
|
|
}
|
|
|