summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--asm/lottery_corner.s389
-rw-r--r--data/specials.s2
-rw-r--r--ld_script.txt2
-rw-r--r--src/lottery_corner.c167
-rw-r--r--sym_ewram.txt6
6 files changed, 170 insertions, 397 deletions
diff --git a/Makefile b/Makefile
index f51f7bbd0..f186adc94 100644
--- a/Makefile
+++ b/Makefile
@@ -144,7 +144,6 @@ asm/field_effect_helpers.o \
asm/contest_ai.o \
asm/rom_81258BC.o \
asm/rom_813BA94.o \
-asm/lottery_corner.o \
asm/berry_tag_screen.o \
asm/mystery_event_menu.o \
asm/save_failed_screen.o \
diff --git a/asm/lottery_corner.s b/asm/lottery_corner.s
deleted file mode 100644
index 732e94ed7..000000000
--- a/asm/lottery_corner.s
+++ /dev/null
@@ -1,389 +0,0 @@
- .include "constants/gba_constants.s"
- .include "constants/species_constants.s"
- .include "asm/macros.s"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_8145A78
-sub_8145A78: @ 8145A78
- push {r4,lr}
- bl Random
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- bl Random
- lsls r0, 16
- orrs r0, r4
- bl sub_8145D14
- ldr r0, _08145AA0 @ =0x00004045
- movs r1, 0
- bl VarSet
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08145AA0: .4byte 0x00004045
- thumb_func_end sub_8145A78
-
- thumb_func_start sub_8145AA4
-sub_8145AA4: @ 8145AA4
- push {r4,r5,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- bl Random
- lsls r0, 16
- lsrs r1, r0, 16
- subs r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- ldr r0, _08145AE0 @ =0x0000ffff
- cmp r4, r0
- beq _08145AD4
- ldr r5, _08145AE4 @ =0x41c64e6d
- ldr r3, _08145AE8 @ =0x00003039
- adds r2, r0, 0
-_08145AC4:
- adds r0, r1, 0
- muls r0, r5
- adds r1, r0, r3
- subs r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, r2
- bne _08145AC4
-_08145AD4:
- adds r0, r1, 0
- bl sub_8145D14
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08145AE0: .4byte 0x0000ffff
-_08145AE4: .4byte 0x41c64e6d
-_08145AE8: .4byte 0x00003039
- thumb_func_end sub_8145AA4
-
- thumb_func_start sub_8145AEC
-sub_8145AEC: @ 8145AEC
- push {lr}
- bl sub_8145D3C
- ldr r1, _08145AFC @ =gScriptResult
- strh r0, [r1]
- pop {r0}
- bx r0
- .align 2, 0
-_08145AFC: .4byte gScriptResult
- thumb_func_end sub_8145AEC
-
- thumb_func_start sub_8145B00
-sub_8145B00: @ 8145B00
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- ldr r1, _08145C24 @ =gUnknown_0202E8CC
- movs r0, 0
- strh r0, [r1]
- movs r0, 0
- mov r10, r0
- mov r9, r0
- movs r6, 0
-_08145B18:
- movs r0, 0x64
- adds r1, r6, 0
- muls r1, r0
- ldr r0, _08145C28 @ =gPlayerParty
- adds r4, r1, r0
- adds r0, r4, 0
- movs r1, 0xB
- bl GetMonData
- cmp r0, 0
- beq _08145B74
- adds r0, r4, 0
- movs r1, 0x2D
- bl GetMonData
- cmp r0, 0
- bne _08145B6A
- adds r0, r4, 0
- movs r1, 0x1
- bl GetMonData
- adds r1, r0, 0
- ldr r0, _08145C2C @ =gScriptResult
- ldrh r0, [r0]
- lsls r1, 16
- lsrs r1, 16
- bl sub_8145C8C
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08145C24 @ =gUnknown_0202E8CC
- ldrh r2, [r1]
- cmp r0, r2
- bls _08145B6A
- cmp r0, 0x1
- bls _08145B6A
- subs r0, 0x1
- strh r0, [r1]
- movs r0, 0xE
- mov r9, r0
- mov r10, r6
-_08145B6A:
- adds r0, r6, 0x1
- lsls r0, 16
- lsrs r6, r0, 16
- cmp r6, 0x5
- bls _08145B18
-_08145B74:
- movs r6, 0
-_08145B76:
- movs r5, 0
- adds r1, r6, 0x1
- mov r8, r1
- lsls r0, r6, 2
- adds r7, r0, r6
-_08145B80:
- lsls r2, r7, 4
- subs r2, r7
- lsls r2, 5
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 4
- ldr r1, _08145C30 @ =gUnknown_020300A4
- adds r0, r1
- adds r4, r2, r0
- adds r0, r4, 0
- movs r1, 0xB
- bl GetBoxMonData
- cmp r0, 0
- beq _08145BD8
- adds r0, r4, 0
- movs r1, 0x2D
- bl GetBoxMonData
- cmp r0, 0
- bne _08145BD8
- adds r0, r4, 0
- movs r1, 0x1
- bl GetBoxMonData
- adds r1, r0, 0
- ldr r0, _08145C2C @ =gScriptResult
- ldrh r0, [r0]
- lsls r1, 16
- lsrs r1, 16
- bl sub_8145C8C
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08145C24 @ =gUnknown_0202E8CC
- ldrh r2, [r1]
- cmp r0, r2
- bls _08145BD8
- cmp r0, 0x1
- bls _08145BD8
- subs r0, 0x1
- strh r0, [r1]
- mov r9, r6
- mov r10, r5
-_08145BD8:
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
- cmp r5, 0x1D
- bls _08145B80
- mov r1, r8
- lsls r0, r1, 16
- lsrs r6, r0, 16
- cmp r6, 0xD
- bls _08145B76
- ldr r3, _08145C24 @ =gUnknown_0202E8CC
- ldrh r0, [r3]
- cmp r0, 0
- beq _08145C72
- ldr r2, _08145C34 @ =gUnknown_0202E8CE
- ldr r1, _08145C38 @ =gUnknown_0840CB04
- subs r0, 0x1
- lsls r0, 1
- adds r0, r1
- ldrh r0, [r0]
- strh r0, [r2]
- mov r2, r9
- cmp r2, 0xE
- bne _08145C44
- ldr r1, _08145C3C @ =gUnknown_0202E8D0
- movs r0, 0
- strh r0, [r1]
- movs r0, 0x64
- mov r1, r10
- muls r1, r0
- adds r0, r1, 0
- ldr r1, _08145C28 @ =gPlayerParty
- adds r0, r1
- ldr r2, _08145C40 @ =gStringVar1
- movs r1, 0x2
- bl GetMonData
- b _08145C6C
- .align 2, 0
-_08145C24: .4byte gUnknown_0202E8CC
-_08145C28: .4byte gPlayerParty
-_08145C2C: .4byte gScriptResult
-_08145C30: .4byte gUnknown_020300A4
-_08145C34: .4byte gUnknown_0202E8CE
-_08145C38: .4byte gUnknown_0840CB04
-_08145C3C: .4byte gUnknown_0202E8D0
-_08145C40: .4byte gStringVar1
-_08145C44:
- ldr r1, _08145C80 @ =gUnknown_0202E8D0
- movs r0, 0x1
- strh r0, [r1]
- mov r2, r9
- lsls r1, r2, 2
- add r1, r9
- lsls r0, r1, 4
- subs r0, r1
- lsls r0, 5
- mov r2, r10
- lsls r1, r2, 2
- add r1, r10
- lsls r1, 4
- ldr r2, _08145C84 @ =gUnknown_020300A4
- adds r1, r2
- adds r0, r1
- ldr r2, _08145C88 @ =gStringVar1
- movs r1, 0x2
- bl GetBoxMonData
-_08145C6C:
- ldr r0, _08145C88 @ =gStringVar1
- bl StringGetEnd10
-_08145C72:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08145C80: .4byte gUnknown_0202E8D0
-_08145C84: .4byte gUnknown_020300A4
-_08145C88: .4byte gStringVar1
- thumb_func_end sub_8145B00
-
- thumb_func_start sub_8145C8C
-sub_8145C8C: @ 8145C8C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- lsls r0, 16
- lsrs r6, r0, 16
- lsls r1, 16
- lsrs r5, r1, 16
- movs r0, 0
- mov r8, r0
- movs r7, 0
- ldr r1, _08145D0C @ =gUnknown_02039328
- mov r10, r1
- ldr r0, _08145D10 @ =gUnknown_0203932A
- mov r9, r0
-_08145CAC:
- adds r0, r6, 0
- movs r1, 0xA
- bl __umodsi3
- adds r4, r0, 0
- mov r1, r10
- strh r4, [r1]
- adds r0, r5, 0
- movs r1, 0xA
- bl __umodsi3
- mov r1, r9
- strh r0, [r1]
- lsls r4, 16
- lsls r0, 16
- cmp r4, r0
- bne _08145CFA
- adds r0, r6, 0
- movs r1, 0xA
- bl __udivsi3
- lsls r0, 16
- lsrs r6, r0, 16
- adds r0, r5, 0
- movs r1, 0xA
- bl __udivsi3
- lsls r0, 16
- lsrs r5, r0, 16
- mov r0, r8
- adds r0, 0x1
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- adds r0, r7, 0x1
- lsls r0, 24
- lsrs r7, r0, 24
- cmp r7, 0x4
- bls _08145CAC
-_08145CFA:
- mov r0, r8
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08145D0C: .4byte gUnknown_02039328
-_08145D10: .4byte gUnknown_0203932A
- thumb_func_end sub_8145C8C
-
- thumb_func_start sub_8145D14
-sub_8145D14: @ 8145D14
- push {r4,lr}
- adds r1, r0, 0
- lsrs r4, r1, 16
- lsls r1, 16
- lsrs r1, 16
- ldr r0, _08145D34 @ =0x0000404b
- bl VarSet
- ldr r0, _08145D38 @ =0x0000404c
- adds r1, r4, 0
- bl VarSet
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08145D34: .4byte 0x0000404b
-_08145D38: .4byte 0x0000404c
- thumb_func_end sub_8145D14
-
- thumb_func_start sub_8145D3C
-sub_8145D3C: @ 8145D3C
- push {r4,lr}
- ldr r0, _08145D5C @ =0x0000404b
- bl VarGet
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- ldr r0, _08145D60 @ =0x0000404c
- bl VarGet
- lsls r0, 16
- orrs r0, r4
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08145D5C: .4byte 0x0000404b
-_08145D60: .4byte 0x0000404c
- thumb_func_end sub_8145D3C
-
- thumb_func_start unref_sub_8145D64
-unref_sub_8145D64: @ 8145D64
- push {lr}
- lsls r0, 16
- lsrs r0, 16
- bl sub_8145D14
- pop {r0}
- bx r0
- thumb_func_end unref_sub_8145D64
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/specials.s b/data/specials.s
index 3b13fab37..71715b2c6 100644
--- a/data/specials.s
+++ b/data/specials.s
@@ -258,7 +258,7 @@ gSpecials::
.4byte sub_804DB2C
.4byte GetWeekCount
.4byte sub_8145AEC
- .4byte sub_8145B00
+ .4byte PickLotteryCornerTicket
.4byte ShowBerryBlenderRecordWindow
.4byte ResetTrickHouseEndRoomFlag
.4byte SetTrickHouseEndRoomFlag
diff --git a/ld_script.txt b/ld_script.txt
index 4f67527a7..7c2e952aa 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -172,7 +172,7 @@ SECTIONS {
asm/rom_81258BC.o(.text);
src/intro.o(.text);
asm/rom_813BA94.o(.text);
- asm/lottery_corner.o(.text);
+ src/lottery_corner.o(.text);
src/diploma.o(.text);
asm/berry_tag_screen.o(.text);
asm/mystery_event_menu.o(.text);
diff --git a/src/lottery_corner.c b/src/lottery_corner.c
new file mode 100644
index 000000000..67499f6d2
--- /dev/null
+++ b/src/lottery_corner.c
@@ -0,0 +1,167 @@
+#include "gba/gba.h"
+#include "global.h"
+#include "pokemon.h"
+#include "rng.h"
+#include "string_util.h"
+
+extern bool8 VarSet(u16 id, u16 value);
+extern u16 VarGet(u16 id);
+
+extern u16 gScriptResult;
+extern u16 gUnknown_0202E8CC;
+extern struct Pokemon gPlayerParty[6];
+extern struct PokemonStorage gPokemonStorage;
+extern u16 gUnknown_0202E8CE;
+extern u16 gUnknown_0840CB04[];
+extern u16 gUnknown_0202E8D0;
+static EWRAM_DATA u16 sWinNumberDigit = 0;
+static EWRAM_DATA u16 sOtIdDigit = 0;
+
+void sub_8145D14(u32);
+u32 sub_8145D3C(void);
+static u8 GetMatchingDigits(u16, u16);
+
+void sub_8145A78(void)
+{
+ u16 rand = Random();
+
+ sub_8145D14((Random() << 16) | rand);
+ VarSet(0x4045, 0);
+}
+
+void sub_8145AA4(u16 a)
+{
+ u32 var = Random();
+
+ while(--a != 0xFFFF)
+ {
+ var = var * 1103515245 + 12345;
+ }
+ sub_8145D14(var);
+}
+
+void sub_8145AEC(void)
+{
+ u16 a = sub_8145D3C();
+ gScriptResult = a;
+}
+
+//Script special function
+void PickLotteryCornerTicket(void)
+{
+ u16 i;
+ u16 j;
+ u32 box;
+ u32 slot;
+
+ gUnknown_0202E8CC = 0;
+ slot = 0;
+ box = 0;
+ for(i = 0; i < 6; i++)
+ {
+ struct Pokemon *pkmn = &gPlayerParty[i];
+
+ // UB: Too few arguments for function GetMonData
+ if(GetMonData(pkmn, MON_DATA_SPECIES) != 0)
+ {
+ if(!GetMonData(pkmn, MON_DATA_IS_EGG))
+ {
+ u32 otId = GetMonData(pkmn, MON_DATA_OT_ID);
+ u8 a = GetMatchingDigits(gScriptResult, otId);
+
+ if(a > gUnknown_0202E8CC && a > 1)
+ {
+ gUnknown_0202E8CC = a - 1;
+ box = 14;
+ slot = i;
+ }
+ }
+ }
+ else
+ break;
+ }
+
+ for(i = 0; i < 14; i++)
+ {
+ for(j = 0; j < 0x1E; j++)
+ {
+ struct BoxPokemon *pkmn = &gPokemonStorage.boxes[i][j];
+
+ // UB: Too few arguments for function GetMonData
+ if(GetBoxMonData(pkmn, MON_DATA_SPECIES) != 0 &&
+ !GetBoxMonData(pkmn, MON_DATA_IS_EGG))
+ {
+ u32 otId = GetBoxMonData(pkmn, MON_DATA_OT_ID);
+ u8 a = GetMatchingDigits(gScriptResult, otId);
+
+ if(a > gUnknown_0202E8CC && a > 1)
+ {
+ gUnknown_0202E8CC = a - 1;
+ box = i;
+ slot = j;
+ }
+ }
+ }
+ }
+
+ if(gUnknown_0202E8CC != 0)
+ {
+ gUnknown_0202E8CE = gUnknown_0840CB04[gUnknown_0202E8CC - 1];
+
+ if(box == 14)
+ {
+ gUnknown_0202E8D0 = 0;
+ GetMonData(&gPlayerParty[slot], MON_DATA_NICKNAME, gStringVar1);
+ }
+ else
+ {
+ gUnknown_0202E8D0 = 1;
+ GetBoxMonData(&gPokemonStorage.boxes[box][slot], MON_DATA_NICKNAME, gStringVar1);
+ }
+ StringGetEnd10(gStringVar1);
+ }
+}
+
+static u8 GetMatchingDigits(u16 winNumber, u16 otId)
+{
+ u8 i;
+ u8 matchingDigits = 0; //Why not just use i?
+
+ for(i = 0; i < 5; i++)
+ {
+ sWinNumberDigit = winNumber % 10;
+ sOtIdDigit = otId % 10;
+
+ if(sWinNumberDigit == sOtIdDigit)
+ {
+ winNumber = winNumber / 10;
+ otId = otId / 10;
+ matchingDigits++;
+ }
+ else
+ break;
+ }
+ return matchingDigits;
+}
+
+void sub_8145D14(u32 a)
+{
+ u16 b = a >> 16;
+ u16 c = a;
+
+ VarSet(0x404B, c);
+ VarSet(0x404C, b);
+}
+
+u32 sub_8145D3C(void)
+{
+ u16 var1 = VarGet(0x404B);
+ u16 var2 = VarGet(0x404C);
+
+ return (var2 << 16) | var1;
+}
+
+void unref_sub_8145D64(u16 a)
+{
+ sub_8145D14(a);
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index cf1d64fc3..21c3fe7fa 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -1126,11 +1126,7 @@ gUnknown_02039324: @ 2039324
gUnknown_02039325: @ 2039325
.space 0x3
-gUnknown_02039328: @ 2039328
- .space 0x2
-
-gUnknown_0203932A: @ 203932A
- .space 0x2
+ .include "src/lottery_corner.o"
gUnknown_0203932C: @ 203932C
.space 0x2