summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xasm/field_specials.s212
-rwxr-xr-xdata/field_specials.s13
-rwxr-xr-xld_script.txt1
-rwxr-xr-xsrc/field_specials.c78
4 files changed, 78 insertions, 226 deletions
diff --git a/asm/field_specials.s b/asm/field_specials.s
index 1b5c88fed..5ac79cc5a 100755
--- a/asm/field_specials.s
+++ b/asm/field_specials.s
@@ -6,218 +6,6 @@
.text
- thumb_func_start sub_810FB10
-sub_810FB10: @ 810FB10
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- ldr r0, _0810FB54 @ =0x00004095
- bl VarGet
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x2
- bne _0810FB80
- ldr r0, _0810FB58 @ =gSaveBlock1
- ldr r1, _0810FB5C @ =0x000013c2
- adds r4, r0, r1
- ldrh r2, [r4]
- movs r1, 0x7F
- ands r1, r2
- ldr r0, _0810FB60 @ =gUnknown_083F8404
- adds r0, r5, r0
- ldrb r0, [r0]
- adds r1, r0
- cmp r1, 0x13
- ble _0810FB7C
- bl sub_810FCB0
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x2
- bhi _0810FB68
- bl sub_810FB9C
- ldrh r1, [r4]
- ldr r0, _0810FB64 @ =0x0000ff80
- ands r0, r1
- b _0810FB7E
- .align 2, 0
-_0810FB54: .4byte 0x00004095
-_0810FB58: .4byte gSaveBlock1
-_0810FB5C: .4byte 0x000013c2
-_0810FB60: .4byte gUnknown_083F8404
-_0810FB64: .4byte 0x0000ff80
-_0810FB68:
- ldrh r0, [r4]
- ldr r1, _0810FB78 @ =0x0000ff80
- ands r1, r0
- movs r0, 0x14
- orrs r1, r0
- strh r1, [r4]
- b _0810FB80
- .align 2, 0
-_0810FB78: .4byte 0x0000ff80
-_0810FB7C:
- adds r0, r2, r0
-_0810FB7E:
- strh r0, [r4]
-_0810FB80:
- ldr r0, _0810FB94 @ =gSaveBlock1
- ldr r1, _0810FB98 @ =0x000013c2
- adds r0, r1
- ldrb r1, [r0]
- movs r0, 0x7F
- ands r0, r1
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_0810FB94: .4byte gSaveBlock1
-_0810FB98: .4byte 0x000013c2
- thumb_func_end sub_810FB10
-
- thumb_func_start sub_810FB9C
-sub_810FB9C: @ 810FB9C
- push {r4-r7,lr}
- sub sp, 0x4
- movs r3, 0
- movs r5, 0
- ldr r7, _0810FBD8 @ =gSaveBlock1 + 0x13C2
- movs r6, 0x1
-_0810FBA8:
- ldrh r1, [r7]
- ldr r0, _0810FBDC @ =gUnknown_083F8408
- adds r0, r5, r0
- ldrb r4, [r0]
- asrs r1, r4
- ands r1, r6
- cmp r1, 0
- bne _0810FBE0
- adds r3, r5, 0
- str r3, [sp]
- bl Random
- adds r1, r6, 0
- ands r1, r0
- ldr r3, [sp]
- cmp r1, 0
- beq _0810FBE0
- adds r0, r6, 0
- lsls r0, r4
- ldrh r1, [r7]
- orrs r0, r1
- strh r0, [r7]
- b _0810FC00
- .align 2, 0
-_0810FBD8: .4byte gSaveBlock1 + 0x13C2
-_0810FBDC: .4byte gUnknown_083F8408
-_0810FBE0:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x7
- bls _0810FBA8
- ldr r2, _0810FC0C @ =gSaveBlock1
- ldr r0, _0810FC10 @ =0x000013c2
- adds r2, r0
- ldr r1, _0810FC14 @ =gUnknown_083F8408
- adds r1, r3, r1
- movs r0, 0x1
- ldrb r1, [r1]
- lsls r0, r1
- ldrh r1, [r2]
- orrs r0, r1
- strh r0, [r2]
-_0810FC00:
- adds r0, r3, 0
- add sp, 0x4
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0810FC0C: .4byte gSaveBlock1
-_0810FC10: .4byte 0x000013c2
-_0810FC14: .4byte gUnknown_083F8408
- thumb_func_end sub_810FB9C
-
- thumb_func_start sub_810FC18
-sub_810FC18: @ 810FC18
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x4
- movs r0, 0
- mov r8, r0
- bl sub_810FCB0
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1
- bne _0810FC3E
- movs r0, 0
- b _0810FC94
-_0810FC34:
- lsls r4, r6
- ldrh r0, [r2]
- eors r4, r0
- strh r4, [r2]
- b _0810FC92
-_0810FC3E:
- movs r5, 0
- ldr r2, _0810FCA0 @ =gSaveBlock1 + 0x13C2
- movs r4, 0x1
-_0810FC44:
- ldrh r1, [r2]
- ldr r7, _0810FCA4 @ =gUnknown_083F8410
- adds r0, r5, r7
- ldrb r6, [r0]
- asrs r1, r6
- ands r1, r4
- cmp r1, 0
- beq _0810FC66
- mov r8, r5
- str r2, [sp]
- bl Random
- adds r1, r4, 0
- ands r1, r0
- ldr r2, [sp]
- cmp r1, 0
- bne _0810FC34
-_0810FC66:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x7
- bls _0810FC44
- ldr r0, _0810FCA8 @ =gSaveBlock1
- ldr r1, _0810FCAC @ =0x000013c2
- adds r4, r0, r1
- ldrh r1, [r4]
- mov r2, r8
- adds r0, r2, r7
- ldrb r2, [r0]
- adds r0, r1, 0
- asrs r0, r2
- movs r3, 0x1
- ands r0, r3
- cmp r0, 0
- beq _0810FC92
- adds r0, r3, 0
- lsls r0, r2
- eors r1, r0
- strh r1, [r4]
-_0810FC92:
- mov r0, r8
-_0810FC94:
- add sp, 0x4
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0810FCA0: .4byte gSaveBlock1 + 0x13C2
-_0810FCA4: .4byte gUnknown_083F8410
-_0810FCA8: .4byte gSaveBlock1
-_0810FCAC: .4byte 0x000013c2
- thumb_func_end sub_810FC18
-
thumb_func_start sub_810FCB0
sub_810FCB0: @ 810FCB0
push {r4,r5,lr}
diff --git a/data/field_specials.s b/data/field_specials.s
deleted file mode 100755
index 191f4d947..000000000
--- a/data/field_specials.s
+++ /dev/null
@@ -1,13 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .section .rodata
-
-gUnknown_083F8404:: @ 83F8404
- .byte 2, 1, 2, 1
-
-gUnknown_083F8408:: @ 83F8408
- .byte 8, 9, 10, 11, 12, 13, 14, 15
-
-gUnknown_083F8410:: @ 83F8410
- .byte 8, 13, 14, 11, 10, 12, 15, 9
diff --git a/ld_script.txt b/ld_script.txt
index 24f018abc..41b9a7803 100755
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -439,7 +439,6 @@ SECTIONS {
data/fldeff_flash.o(.rodata);
src/time_events.o(.rodata);
src/field_specials.o(.rodata);
- data/field_specials.o(.rodata);
data/pokedex_area_screen.o(.rodata);
data/evolution_scene.o(.rodata);
data/roulette.o(.rodata);
diff --git a/src/field_specials.c b/src/field_specials.c
index 214afebf8..13a726ee3 100755
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -34,6 +34,7 @@
#include "battle_tower.h"
#include "field_weather.h"
#include "pokemon_summary_screen.h"
+#include "rng.h"
#if ENGLISH
#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD
@@ -2088,10 +2089,16 @@ void sub_810F9AC(void)
}
}
+const u8 gUnknown_083F8404[] = {2, 1, 2, 1};
+const u8 gUnknown_083F8408[] = {8, 9, 10, 11, 12, 13, 14, 15};
+const u8 gUnknown_083F8410[] = {8, 13, 14, 11, 10, 12, 15, 9};
+
bool8 sub_810FF30(void);
void sub_810FCE8(void);
void sub_810FF48(void);
void sub_810FD80(void);
+u16 sub_810FCB0(void);
+int sub_810FB9C(void);
void ResetFanClub(void)
{
@@ -2122,3 +2129,74 @@ void sub_810FAA0(void)
VarSet(VAR_0x4095, 1);
}
}
+
+u8 sub_810FB10(u8 a0)
+{
+ if (VarGet(VAR_0x4095) == 2)
+ {
+ if ((gSaveBlock1.vars[0x41] & 0x7f) + gUnknown_083F8404[a0] >= 20)
+ {
+ if (sub_810FCB0() < 3)
+ {
+ sub_810FB9C();
+ gSaveBlock1.vars[0x41] &= 0xff80;
+ }
+ else
+ {
+ gSaveBlock1.vars[0x41] = (gSaveBlock1.vars[0x41] & 0xff80) | 20;
+ }
+ }
+ else
+ {
+ gSaveBlock1.vars[0x41] += gUnknown_083F8404[a0];
+ }
+ }
+ return gSaveBlock1.vars[0x41] & 0x7f;
+}
+
+int sub_810FB9C(void)
+{
+ u8 i;
+ int retval = 0;
+ for (i=0; i<8; i++)
+ {
+ if (!((gSaveBlock1.vars[0x41] >> gUnknown_083F8408[i]) & 0x01))
+ {
+ retval = i;
+ if (Random() & 1)
+ {
+ gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[i]);
+ return retval;
+ }
+ }
+ }
+ gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[retval]);
+ return retval;
+}
+
+int sub_810FC18(void)
+{
+ u8 i;
+ int retval = 0;
+ if (sub_810FCB0() == TRUE)
+ {
+ return 0;
+ }
+ for (i=0; i<8; i++)
+ {
+ if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[i]) & 1)
+ {
+ retval = i;
+ if (Random() & 1)
+ {
+ gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[i]);
+ return retval;
+ }
+ }
+ }
+ if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[retval]) & 1)
+ {
+ gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[retval]);
+ }
+ return retval;
+}