summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKDSKardabox <bollygame94@gmail.com>2018-04-16 16:22:13 +0530
committerKDSKardabox <bollygame94@gmail.com>2018-04-16 16:22:13 +0530
commit936bb5925ae797a9cf59ef43940f52547c8f60a7 (patch)
tree6a282f33df865f22a6537ead87e3381b6be61103 /src
parentda719a1541d760e13110eece1217ffbdbc919897 (diff)
Decompile dewford trend
Diffstat (limited to 'src')
-rw-r--r--src/dewford_trend.c340
1 files changed, 340 insertions, 0 deletions
diff --git a/src/dewford_trend.c b/src/dewford_trend.c
new file mode 100644
index 000000000..3ceec6563
--- /dev/null
+++ b/src/dewford_trend.c
@@ -0,0 +1,340 @@
+#include "global.h"
+#include "dewford_trend.h"
+#include "easy_chat.h"
+#include "constants/easy_chat.h"
+#include "event_data.h"
+#include "link.h"
+#include "malloc.h"
+#include "random.h"
+#include "text.h"
+#include "tv.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 sub_812287C(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;
+}