mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-11-17 12:07:38 +01:00
3909b6408c
Some of the INVALID_ are likely erroneously placed, due to lack of documentation
342 lines
8.5 KiB
C
342 lines
8.5 KiB
C
#include "global.h"
|
|
#include "dewford_trend.h"
|
|
#include "easy_chat.h"
|
|
#include "event_data.h"
|
|
#include "link.h"
|
|
#include "alloc.h"
|
|
#include "random.h"
|
|
#include "text.h"
|
|
#include "tv.h"
|
|
#include "string_util.h"
|
|
#include "constants/easy_chat.h"
|
|
|
|
// static functions
|
|
static void sub_8122804(struct EasyChatPair *s, u16 b, u8 c);
|
|
static bool8 sub_8122A58(struct EasyChatPair *a, struct EasyChatPair *b, u8 c);
|
|
static void sub_8122B28(struct EasyChatPair *s);
|
|
static bool8 SB1ContainsWords(u16 *a);
|
|
static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2);
|
|
static s16 GetEqualEasyChatPairIndex(struct EasyChatPair *s, struct EasyChatPair *a, u16 b);
|
|
|
|
// text
|
|
void InitDewfordTrend(void)
|
|
{
|
|
u16 i;
|
|
|
|
for (i = 0; i < 5; i++)
|
|
{
|
|
gSaveBlock1Ptr->easyChatPairs[i].words[0] = sub_811EE38(EC_GROUP_CONDITIONS);
|
|
|
|
if (Random() & 1)
|
|
gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_LIFESTYLE);
|
|
else
|
|
gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_HOBBIES);
|
|
|
|
gSaveBlock1Ptr->easyChatPairs[i].unk1_6 = Random() & 1;
|
|
sub_8122B28(&(gSaveBlock1Ptr->easyChatPairs[i]));
|
|
}
|
|
sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0);
|
|
}
|
|
|
|
void UpdateDewfordTrendPerDay(u16 a)
|
|
{
|
|
u16 i;
|
|
|
|
if (a != 0)
|
|
{
|
|
u32 sp0 = a * 5;
|
|
|
|
for (i = 0; i < 5; i++)
|
|
{
|
|
u32 r4;
|
|
u32 r2 = sp0;
|
|
struct EasyChatPair *r5 = &(gSaveBlock1Ptr->easyChatPairs[i]);
|
|
|
|
if (r5->unk1_6 == 0)
|
|
{
|
|
if (r5->unk0_0 >= (u16)r2)
|
|
{
|
|
r5->unk0_0 -= r2;
|
|
if (r5->unk0_0 == 0)
|
|
r5->unk1_6 = 1;
|
|
continue;
|
|
}
|
|
r2 -= r5->unk0_0;
|
|
r5->unk0_0 = 0;
|
|
r5->unk1_6 = 1;
|
|
}
|
|
r4 = r5->unk0_0 + r2;
|
|
if ((u16)r4 > r5->unk0_7)
|
|
{
|
|
u32 sp4 = r4 % r5->unk0_7;
|
|
r4 = r4 / r5->unk0_7;
|
|
|
|
r5->unk1_6 = r4 ^ 1;
|
|
if (r5->unk1_6)
|
|
r5->unk0_0 = sp4;
|
|
else
|
|
r5->unk0_0 = r5->unk0_7 - sp4;
|
|
}
|
|
else
|
|
{
|
|
r5->unk0_0 = r4;
|
|
|
|
if (r5->unk0_0 == r5->unk0_7)
|
|
r5->unk1_6 = 0;
|
|
}
|
|
}
|
|
sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0);
|
|
}
|
|
}
|
|
|
|
|
|
bool8 sub_81226D8(u16 *a)
|
|
{
|
|
struct EasyChatPair s = {0};
|
|
u16 i;
|
|
|
|
if (!SB1ContainsWords(a))
|
|
{
|
|
if (!FlagGet(FLAG_SYS_POPWORD_INPUT))
|
|
{
|
|
FlagSet(FLAG_SYS_POPWORD_INPUT);
|
|
if (!FlagGet(FLAG_SYS_MIX_RECORD))
|
|
{
|
|
gSaveBlock1Ptr->easyChatPairs[0].words[0] = a[0];
|
|
gSaveBlock1Ptr->easyChatPairs[0].words[1] = a[1];
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
s.words[0] = a[0];
|
|
s.words[1] = a[1];
|
|
s.unk1_6 = 1;
|
|
sub_8122B28(&s);
|
|
|
|
for (i = 0; i < 5; i++)
|
|
{
|
|
if (sub_8122A58(&s, &(gSaveBlock1Ptr->easyChatPairs[i]), 0))
|
|
{
|
|
u16 r3 = 4;
|
|
|
|
while (r3 > i)
|
|
{
|
|
gSaveBlock1Ptr->easyChatPairs[r3] = gSaveBlock1Ptr->easyChatPairs[r3 - 1];
|
|
r3--;
|
|
}
|
|
gSaveBlock1Ptr->easyChatPairs[i] = s;
|
|
if(i == 4)
|
|
sub_80EDC60(a);
|
|
return (i == 0);
|
|
}
|
|
}
|
|
gSaveBlock1Ptr->easyChatPairs[4] = s;
|
|
sub_80EDC60(a);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
static void sub_8122804(struct EasyChatPair *s, u16 b, u8 c)
|
|
{
|
|
u16 h;
|
|
|
|
for (h = 0; h < b; h++)
|
|
{
|
|
u16 i;
|
|
|
|
for (i = h + 1; i < b; i++)
|
|
{
|
|
if (sub_8122A58(&s[i], &s[h], c))
|
|
{
|
|
struct EasyChatPair temp;
|
|
|
|
temp = s[i];
|
|
s[i] = s[h];
|
|
s[h] = temp;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ReceiveEasyChatPairsData(void *a, u32 b, u8 unused)
|
|
{
|
|
u16 i, j, r3, players;
|
|
struct EasyChatPair *buffer1, *buffer2, *src, *dst, *foo_of_buffer2;
|
|
|
|
buffer1 = Alloc(0x100);
|
|
if(buffer1 != NULL)
|
|
{
|
|
buffer2 = Alloc(0x100);
|
|
if(buffer2 == NULL)
|
|
{
|
|
Free(buffer1);
|
|
}
|
|
else
|
|
{
|
|
players = GetLinkPlayerCount();
|
|
for (i = 0; i < players; i++)
|
|
memcpy(&(buffer1[i * 5]), (u8 *)a + i * b, 40);
|
|
src = buffer1;
|
|
dst = buffer2;
|
|
r3 = 0;
|
|
for (i = 0; i < players; i++)
|
|
{
|
|
for (j = 0; j < 5; j++)
|
|
{
|
|
s16 foo = GetEqualEasyChatPairIndex(buffer2, src, r3);
|
|
if (foo < 0)
|
|
{
|
|
*(dst++) = *src;
|
|
r3++;
|
|
}
|
|
else
|
|
{
|
|
foo_of_buffer2 = (struct EasyChatPair *)((u32)buffer2 + (foo * 8)); //required to do this to reverse the order of register operands in add ASM statement
|
|
if (foo_of_buffer2->unk0_0 < src->unk0_0)
|
|
{
|
|
*foo_of_buffer2 = *src;
|
|
}
|
|
}
|
|
src++;
|
|
}
|
|
}
|
|
sub_8122804(buffer2, r3, 2);
|
|
src = buffer2;
|
|
dst = gSaveBlock1Ptr->easyChatPairs;
|
|
for (i = 0; i < 5; i++)
|
|
*(dst++) = *(src++);
|
|
Free(buffer1);
|
|
Free(buffer2);
|
|
}
|
|
}
|
|
}
|
|
|
|
void BufferTrendyPhraseString(void)
|
|
{
|
|
struct EasyChatPair *s = &gSaveBlock1Ptr->easyChatPairs[gSpecialVar_0x8004];
|
|
|
|
ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1);
|
|
}
|
|
|
|
void TrendyPhraseIsOld(void)
|
|
{
|
|
u16 result = 0;
|
|
|
|
if (gSaveBlock1Ptr->easyChatPairs[0].unk0_0 - gSaveBlock1Ptr->easyChatPairs[1].unk0_0 < 2)
|
|
{
|
|
asm("":::"r2"); //Force the compiler to store address of gSaveBlock1 in r3 instead of r2
|
|
if (!gSaveBlock1Ptr->easyChatPairs[0].unk1_6 && gSaveBlock1Ptr->easyChatPairs[1].unk1_6)
|
|
result = 1;
|
|
}
|
|
gSpecialVar_Result = result;
|
|
}
|
|
|
|
void GetDewfordHallPaintingNameIndex(void)
|
|
{
|
|
gSpecialVar_Result = (gSaveBlock1Ptr->easyChatPairs[0].words[0] + gSaveBlock1Ptr->easyChatPairs[0].words[1]) & 7;
|
|
}
|
|
|
|
static bool8 sub_8122A58(struct EasyChatPair *a, struct EasyChatPair *b, u8 c)
|
|
{
|
|
switch (c)
|
|
{
|
|
case 0:
|
|
if (a->unk0_0 > b->unk0_0)
|
|
return 1;
|
|
if (a->unk0_0 < b->unk0_0)
|
|
return 0;
|
|
if (a->unk0_7 > b->unk0_7)
|
|
return 1;
|
|
if (a->unk0_7 < b->unk0_7)
|
|
return 0;
|
|
break;
|
|
case 1:
|
|
if (a->unk0_7 > b->unk0_7)
|
|
return 1;
|
|
if (a->unk0_7 < b->unk0_7)
|
|
return 0;
|
|
if (a->unk0_0 > b->unk0_0)
|
|
return 1;
|
|
if (a->unk0_0 < b->unk0_0)
|
|
return 0;
|
|
break;
|
|
case 2:
|
|
if (a->unk0_0 > b->unk0_0)
|
|
return 1;
|
|
if (a->unk0_0 < b->unk0_0)
|
|
return 0;
|
|
if (a->unk0_7 > b->unk0_7)
|
|
return 1;
|
|
if (a->unk0_7 < b->unk0_7)
|
|
return 0;
|
|
if (a->unk2 > b->unk2)
|
|
return 1;
|
|
if (a->unk2 < b->unk2)
|
|
return 0;
|
|
if (a->words[0] > b->words[0])
|
|
return 1;
|
|
if (a->words[0] < b->words[0])
|
|
return 0;
|
|
if (a->words[1] > b->words[1])
|
|
return 1;
|
|
if (a->words[1] < b->words[1])
|
|
return 0;
|
|
return 1;
|
|
}
|
|
return Random() & 1;
|
|
}
|
|
|
|
static void sub_8122B28(struct EasyChatPair *s)
|
|
{
|
|
u16 r4;
|
|
|
|
r4 = Random() % 98;
|
|
if (r4 > 50)
|
|
{
|
|
r4 = Random() % 98;
|
|
if (r4 > 80)
|
|
r4 = Random() % 98;
|
|
}
|
|
s->unk0_7 = r4 + 30;
|
|
s->unk0_0 = (Random() % (r4 + 1)) + 30;
|
|
s->unk2 = Random();
|
|
}
|
|
|
|
static bool8 SB1ContainsWords(u16 *a)
|
|
{
|
|
u16 i;
|
|
|
|
for (i = 0; i < 5; i++)
|
|
{
|
|
if (IsEasyChatPairEqual(a, gSaveBlock1Ptr->easyChatPairs[i].words) != 0)
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2)
|
|
{
|
|
u16 i;
|
|
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
if (*(words1++) != *(words2++))
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
static s16 GetEqualEasyChatPairIndex(struct EasyChatPair*s, struct EasyChatPair *a, u16 b)
|
|
{
|
|
s16 i;
|
|
|
|
for (i = 0; i < b; i++)
|
|
{
|
|
if (IsEasyChatPairEqual(a->words, s->words))
|
|
return i;
|
|
s++;
|
|
}
|
|
return -1;
|
|
}
|