summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/lilycove_lady.s378
-rw-r--r--include/global.h44
-rw-r--r--include/vars.h2
-rw-r--r--ld_script.txt1
-rw-r--r--src/lilycove_lady.c187
5 files changed, 234 insertions, 378 deletions
diff --git a/asm/lilycove_lady.s b/asm/lilycove_lady.s
index fca8cb29b..75f9458a3 100644
--- a/asm/lilycove_lady.s
+++ b/asm/lilycove_lady.s
@@ -4,382 +4,6 @@
.syntax unified
.text
-
- thumb_func_start GetLilycoveLadyId
-GetLilycoveLadyId: @ 818D9AC
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r1, =0x00003b58
- adds r0, r1
- ldrb r0, [r0]
- bx lr
- .pool
- thumb_func_end GetLilycoveLadyId
-
- thumb_func_start sub_818D9C0
-sub_818D9C0: @ 818D9C0
- push {r4,r5,lr}
- ldr r5, =0x00004010
- ldr r4, =gUnknown_0860B07E
- bl GetLilycoveLadyId
- lsls r0, 24
- lsrs r0, 23
- adds r0, r4
- ldrh r1, [r0]
- adds r0, r5, 0
- bl VarSet
- bl GetLilycoveLadyId
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x2
- bne _0818DA20
- ldr r0, =gSaveBlock1Ptr
- ldr r1, [r0]
- ldr r0, =0x00003b58
- adds r1, r0
- ldr r0, =0x00004011
- ldr r2, =gUnknown_0860B074
- ldrb r1, [r1, 0xD]
- lsls r1, 1
- adds r1, r2
- ldrh r1, [r1]
- bl VarSet
- ldr r1, =gScriptResult
- movs r0, 0x1
- b _0818DA24
- .pool
-_0818DA20:
- ldr r1, =gScriptResult
- movs r0, 0
-_0818DA24:
- strh r0, [r1]
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_818D9C0
-
- thumb_func_start SetLilycoveLady
-SetLilycoveLady: @ 818DA30
- push {lr}
- ldr r0, =gSaveBlock2Ptr
- ldr r0, [r0]
- ldrb r1, [r0, 0xB]
- lsls r1, 8
- ldrb r0, [r0, 0xA]
- orrs r0, r1
- movs r1, 0x6
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 17
- adds r1, r0, 0
- cmp r0, 0x1
- beq _0818DA68
- cmp r0, 0x1
- bgt _0818DA5C
- cmp r0, 0
- beq _0818DA62
- b _0818DA72
- .pool
-_0818DA5C:
- cmp r1, 0x2
- beq _0818DA6E
- b _0818DA72
-_0818DA62:
- bl SetLilycoveQuizLady
- b _0818DA72
-_0818DA68:
- bl SetLilycoveFavourLady
- b _0818DA72
-_0818DA6E:
- bl SetLilycoveContestLady
-_0818DA72:
- pop {r0}
- bx r0
- thumb_func_end SetLilycoveLady
-
- thumb_func_start sub_818DA78
-sub_818DA78: @ 818DA78
- push {lr}
- bl GetLilycoveLadyId
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _0818DA9C
- cmp r0, 0x1
- bgt _0818DA90
- cmp r0, 0
- beq _0818DA96
- b _0818DAA6
-_0818DA90:
- cmp r0, 0x2
- beq _0818DAA2
- b _0818DAA6
-_0818DA96:
- bl sub_818E004
- b _0818DAA6
-_0818DA9C:
- bl sub_818DBC4
- b _0818DAA6
-_0818DAA2:
- bl sub_818E674
-_0818DAA6:
- pop {r0}
- bx r0
- thumb_func_end sub_818DA78
-
-@ unused
- thumb_func_start SetLilycoveLadyRandomly
-SetLilycoveLadyRandomly: @ 818DAAC
- push {lr}
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x3
- bl __umodsi3
- lsls r0, 24
- lsrs r0, 24
- adds r1, r0, 0
- cmp r0, 0x1
- beq _0818DADC
- cmp r0, 0x1
- bgt _0818DAD0
- cmp r0, 0
- beq _0818DAD6
- b _0818DAE6
-_0818DAD0:
- cmp r1, 0x2
- beq _0818DAE2
- b _0818DAE6
-_0818DAD6:
- bl SetLilycoveQuizLady
- b _0818DAE6
-_0818DADC:
- bl SetLilycoveFavourLady
- b _0818DAE6
-_0818DAE2:
- bl SetLilycoveContestLady
-_0818DAE6:
- pop {r0}
- bx r0
- thumb_func_end SetLilycoveLadyRandomly
-
- thumb_func_start sub_818DAEC
-sub_818DAEC: @ 818DAEC
- push {r4,lr}
- ldr r4, =gScriptResult
- bl GetLilycoveLadyId
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4]
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_818DAEC
-
- thumb_func_start sub_818DB04
-sub_818DB04: @ 818DB04
- push {lr}
- adds r1, r0, 0
- movs r2, 0
- b _0818DB14
-_0818DB0C:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- adds r1, 0x2
-_0818DB14:
- ldrh r0, [r1]
- cmp r0, 0
- bne _0818DB0C
- adds r0, r2, 0
- pop {r1}
- bx r1
- thumb_func_end sub_818DB04
-
- thumb_func_start sub_818DB20
-sub_818DB20: @ 818DB20
- push {r4-r6,lr}
- bl Random
- ldr r5, =gUnknown_0203CD64
- ldr r4, [r5]
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x6
- bl __umodsi3
- strb r0, [r4, 0xC]
- ldr r6, =gUnknown_0860B2EC
- ldr r0, [r5]
- ldrb r0, [r0, 0xC]
- lsls r0, 2
- adds r0, r6
- ldr r0, [r0]
- bl sub_818DB04
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- bl Random
- lsls r0, 16
- lsrs r0, 16
- adds r1, r4, 0
- bl __modsi3
- lsls r0, 24
- ldr r2, [r5]
- ldrb r1, [r2, 0xC]
- lsls r1, 2
- adds r1, r6
- ldr r1, [r1]
- lsrs r0, 23
- adds r0, r1
- ldrh r0, [r0]
- strh r0, [r2, 0x10]
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_818DB20
-
- thumb_func_start SetLilycoveFavourLady
-SetLilycoveFavourLady: @ 818DB7C
- push {lr}
- ldr r2, =gUnknown_0203CD64
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r1, =0x00003b58
- adds r0, r1
- str r0, [r2]
- movs r3, 0
- movs r1, 0x1
- strb r1, [r0]
- ldr r0, [r2]
- strb r3, [r0, 0x1]
- ldr r1, [r2]
- movs r0, 0xFF
- strb r0, [r1, 0x4]
- ldr r0, [r2]
- strb r3, [r0, 0x2]
- ldr r0, [r2]
- strb r3, [r0, 0x3]
- ldr r1, [r2]
- strh r3, [r1, 0xE]
- ldr r0, =gGameLanguage
- ldrb r0, [r0]
- strb r0, [r1, 0x12]
- bl sub_818DB20
- pop {r0}
- bx r0
- .pool
- thumb_func_end SetLilycoveFavourLady
-
- thumb_func_start sub_818DBC4
-sub_818DBC4: @ 818DBC4
- ldr r3, =gUnknown_0203CD64
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r1, =0x00003b58
- adds r0, r1
- str r0, [r3]
- movs r2, 0
- movs r1, 0x1
- strb r1, [r0]
- ldr r0, [r3]
- strb r2, [r0, 0x1]
- bx lr
- .pool
- thumb_func_end sub_818DBC4
-
- thumb_func_start sub_818DBE8
-sub_818DBE8: @ 818DBE8
- push {lr}
- ldr r1, =gUnknown_0203CD64
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r2, =0x00003b58
- adds r0, r2
- str r0, [r1]
- ldrb r0, [r0, 0x1]
- cmp r0, 0x2
- bne _0818DC0C
- movs r0, 0x2
- b _0818DC16
- .pool
-_0818DC0C:
- cmp r0, 0x1
- beq _0818DC14
- movs r0, 0
- b _0818DC16
-_0818DC14:
- movs r0, 0x1
-_0818DC16:
- pop {r1}
- bx r1
- thumb_func_end sub_818DBE8
-
- thumb_func_start sub_818DC1C
-sub_818DC1C: @ 818DC1C
- lsls r0, 24
- ldr r1, =gUnknown_0860B224
- lsrs r0, 22
- adds r0, r1
- ldr r0, [r0]
- bx lr
- .pool
- thumb_func_end sub_818DC1C
-
- thumb_func_start sub_818DC2C
-sub_818DC2C: @ 818DC2C
- push {r4,lr}
- ldr r1, =gUnknown_0203CD64
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r2, =0x00003b58
- adds r0, r2
- str r0, [r1]
- ldr r4, =gStringVar1
- ldrb r0, [r0, 0xC]
- bl sub_818DC1C
- adds r1, r0, 0
- adds r0, r4, 0
- bl StringCopy
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_818DC2C
-
- thumb_func_start sub_818DC60
-sub_818DC60: @ 818DC60
- push {r4,r5,lr}
- ldr r5, =gUnknown_0203CD64
- ldr r0, =gSaveBlock1Ptr
- ldr r1, [r0]
- ldr r2, =0x00003b58
- adds r0, r1, r2
- str r0, [r5]
- ldrb r0, [r0, 0x4]
- cmp r0, 0xFF
- bne _0818DC84
- movs r0, 0
- b _0818DC9C
- .pool
-_0818DC84:
- ldr r4, =gStringVar3
- ldr r0, =0x00003b5c
- adds r1, r0
- adds r0, r4, 0
- bl StringCopy7
- ldr r0, [r5]
- ldrb r1, [r0, 0x12]
- adds r0, r4, 0
- bl ConvertInternationalString
- movs r0, 0x1
-_0818DC9C:
- pop {r4,r5}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_818DC60
thumb_func_start sub_818DCAC
sub_818DCAC: @ 818DCAC
@@ -1927,5 +1551,5 @@ sub_818E990: @ 818E990
.pool
thumb_func_end sub_818E990
-
+
.align 2, 0 @ Don't pad with nop.
diff --git a/include/global.h b/include/global.h
index 33c6771c3..64ed869ef 100644
--- a/include/global.h
+++ b/include/global.h
@@ -661,6 +661,48 @@ struct DaycareData
#define FLAGS_COUNT 300
#define VARS_COUNT 256
+enum {
+ LILYCOVE_LADY_QUIZ,
+ LILYCOVE_LADY_FAVOUR,
+ LILYCOVE_LADY_CONTEST
+};
+
+typedef union // TODO
+{
+ struct
+ {
+ /*0x000*/ u8 id;
+ /*0x001*/ u8 language;
+ } quiz;
+
+ struct
+ {
+ /*0x000*/ u8 id;
+ /*0x001*/ u8 unk_001;
+ /*0x002*/ u8 unk_002;
+ /*0x003*/ u8 unk_003;
+ /*0x004*/ u8 unk_004[8];
+ /*0x00c*/ u8 unk_00c;
+ /*0x00d*/ u8 filler_00d;
+ /*0x00e*/ u16 unk_00e;
+ /*0x010*/ u16 unk_010;
+ /*0x012*/ u8 language;
+ } favour;
+
+ struct
+ {
+ /*0x000*/ u8 id;
+ /*0x001*/ u8 filler_001[12];
+ /*0x00d*/ u8 category; // maybe?
+ } contest;
+
+ struct
+ {
+ /*0x000*/ u8 id;
+ /*0x001*/ u8 filler_001[535];
+ } common;
+} LilycoveLady;
+
struct SaveBlock1
{
/*0x00*/ struct Coords16 pos;
@@ -744,7 +786,7 @@ struct SaveBlock1
/*0x3728*/ struct RamScript ramScript;
/*0x3B14*/ struct RecordMixingGift recordMixingGift;
/*0x3B24*/ u8 seen2[52];
- /*0x3B58*/ u8 lilycoveLady[536]; // TODO: convert to a union
+ /*0x3B58*/ LilycoveLady lilycoveLady; // TODO: convert to a union
/*0x3D70*/ u8 babyPhrase[24]; // TODO: convert to a struct
// sizeof: 0x3D88
};
diff --git a/include/vars.h b/include/vars.h
index 5da960640..7c0edeb77 100644
--- a/include/vars.h
+++ b/include/vars.h
@@ -12,6 +12,8 @@
#define VAR_0x4008 0x4008
#define VAR_0x4009 0x4009
#define VAR_0x400A 0x400A
+#define VAR_0x4010 0x4010
+#define VAR_0x4011 0x4011
#define VAR_0x401F 0x401F
#define VAR_RECYCLE_GOODS 0x4020
#define VAR_REPEL_STEP_COUNT 0x4021
diff --git a/ld_script.txt b/ld_script.txt
index 0fb325602..e8ea0b629 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -240,6 +240,7 @@ SECTIONS {
asm/battle_controller_recorded_opponent.o(.text);
asm/battle_controller_recorded_player.o(.text);
asm/battle_dome_cards.o(.text);
+ src/lilycove_lady.o(.text);
asm/lilycove_lady.o(.text);
asm/battle_frontier_1.o(.text);
asm/new_menu_helpers.o(.text);
diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c
new file mode 100644
index 000000000..578280115
--- /dev/null
+++ b/src/lilycove_lady.c
@@ -0,0 +1,187 @@
+//
+// Created by Scott Norton on 9/19/17.
+//
+
+#include "global.h"
+#include "main.h"
+#include "event_data.h"
+#include "rng.h"
+#include "string_util.h"
+#include "text.h"
+#include "lilycove_lady.h"
+
+void SetLilycoveQuizLady(void);
+void SetLilycoveFavourLady(void);
+void SetLilycoveContestLady(void);
+void sub_818E004(void);
+void sub_818DBC4(void);
+void sub_818E674(void);
+
+extern const u16 gUnknown_0860B074[5];
+extern const u16 gUnknown_0860B07E[3];
+extern const u8 *const gUnknown_0860B224[];
+extern const u16 *const gUnknown_0860B2EC[6];
+
+EWRAM_DATA LilycoveLady *gUnknown_0203CD64 = NULL;
+
+u8 GetLilycoveLadyId(void)
+{
+ return gSaveBlock1Ptr->lilycoveLady.common.id;
+}
+
+void sub_818D9C0(void)
+{
+ LilycoveLady *lilycoveLady;
+
+ VarSet(VAR_0x4010, gUnknown_0860B07E[GetLilycoveLadyId()]);
+ if (GetLilycoveLadyId() == LILYCOVE_LADY_CONTEST)
+ {
+ lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
+ VarSet(VAR_0x4011, gUnknown_0860B074[lilycoveLady->contest.category]);
+ gScriptResult = TRUE;
+ }
+ else
+ {
+ gScriptResult = FALSE;
+ }
+}
+
+void SetLilycoveLady(void)
+{
+ u16 id;
+
+ id = ((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]);
+ id %= 6;
+ id >>= 1;
+ switch (id)
+ {
+ case LILYCOVE_LADY_QUIZ:
+ SetLilycoveQuizLady();
+ break;
+ case LILYCOVE_LADY_FAVOUR:
+ SetLilycoveFavourLady();
+ break;
+ case LILYCOVE_LADY_CONTEST:
+ SetLilycoveContestLady();
+ break;
+ }
+}
+
+void sub_818DA78(void)
+{
+ switch (GetLilycoveLadyId())
+ {
+ case LILYCOVE_LADY_QUIZ:
+ sub_818E004();
+ break;
+ case LILYCOVE_LADY_FAVOUR:
+ sub_818DBC4();
+ break;
+ case LILYCOVE_LADY_CONTEST:
+ sub_818E674();
+ break;
+ }
+}
+
+void SetLilycoveLadyRandomly(void)
+{
+ u8 id;
+
+ id = Random() % 3;
+ switch (id)
+ {
+ case LILYCOVE_LADY_QUIZ:
+ SetLilycoveQuizLady();
+ break;
+ case LILYCOVE_LADY_FAVOUR:
+ SetLilycoveFavourLady();
+ break;
+ case LILYCOVE_LADY_CONTEST:
+ SetLilycoveContestLady();
+ break;
+ }
+}
+
+void sub_818DAEC(void)
+{
+ gScriptResult = GetLilycoveLadyId();
+}
+
+u8 sub_818DB04(const u16 *data)
+{
+ u8 len;
+
+ for (len = 0; *data != 0; len ++, data ++);
+ return len;
+}
+
+void sub_818DB20(void)
+{
+ u8 size;
+ u8 idx;
+
+ gUnknown_0203CD64->favour.unk_00c = Random() % 6;
+ size = sub_818DB04(gUnknown_0860B2EC[gUnknown_0203CD64->favour.unk_00c]);
+ idx = Random() % size;
+ gUnknown_0203CD64->favour.unk_010 = gUnknown_0860B2EC[gUnknown_0203CD64->favour.unk_00c][idx];
+}
+
+void SetLilycoveFavourLady(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady;
+ gUnknown_0203CD64->favour.id = LILYCOVE_LADY_FAVOUR;
+ gUnknown_0203CD64->favour.unk_001 = 0;
+ gUnknown_0203CD64->favour.unk_004[0] = EOS;
+ gUnknown_0203CD64->favour.unk_002 = 0;
+ gUnknown_0203CD64->favour.unk_003= 0;
+ gUnknown_0203CD64->favour.unk_00e = 0;
+ gUnknown_0203CD64->favour.language = gGameLanguage;
+ sub_818DB20();
+}
+
+void sub_818DBC4(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady;
+ gUnknown_0203CD64->favour.id = LILYCOVE_LADY_FAVOUR;
+ gUnknown_0203CD64->favour.unk_001 = 0;
+}
+
+u8 sub_818DBE8(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady;
+ if (gUnknown_0203CD64->favour.unk_001 == 2)
+ {
+ return 2;
+ }
+ else if (gUnknown_0203CD64->favour.unk_001 == 1)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+const u8 *sub_818DC1C(u8 idx)
+{
+ return gUnknown_0860B224[idx];
+}
+
+void sub_818DC2C(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady;
+ StringCopy(gStringVar1, sub_818DC1C(gUnknown_0203CD64->favour.unk_00c));
+}
+
+bool8 sub_818DC60(void)
+{
+ gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady;
+ if (gUnknown_0203CD64->favour.unk_004[0] != EOS)
+ {
+ StringCopy7(gStringVar3, gSaveBlock1Ptr->lilycoveLady.favour.unk_004);
+ ConvertInternationalString(gStringVar3, gUnknown_0203CD64->favour.language);
+ return TRUE;
+ }
+ return FALSE;
+}