summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/battle_2.s4
-rw-r--r--asm/roamer.s451
-rw-r--r--data/roamer.s28
-rw-r--r--data/specials.inc2
-rw-r--r--include/asm.inc.h8
-rw-r--r--include/global.h4
-rw-r--r--include/roamer.h11
-rw-r--r--ld_script.txt4
-rw-r--r--src/new_game.c5
-rw-r--r--src/roamer.c226
-rw-r--r--src/rom4.c13
-rw-r--r--src/wild_encounter.c9
-rw-r--r--sym_ewram.txt9
13 files changed, 261 insertions, 513 deletions
diff --git a/asm/battle_2.s b/asm/battle_2.s
index a28ae518c..004d1eadf 100644
--- a/asm/battle_2.s
+++ b/asm/battle_2.s
@@ -10752,14 +10752,14 @@ _08013EE0:
cmp r0, 0
beq _08013F1C
ldr r0, _08013F50 @ =gEnemyParty
- bl sub_8134504
+ bl UpdateRoamerHPStatus
ldrb r0, [r5]
cmp r0, 0x1
beq _08013F18
cmp r0, 0x7
bne _08013F1C
_08013F18:
- bl sub_813452C
+ bl SetRoamerInactive
_08013F1C:
movs r0, 0x5A
bl m4aSongNumStop
diff --git a/asm/roamer.s b/asm/roamer.s
deleted file mode 100644
index 404405a3f..000000000
--- a/asm/roamer.s
+++ /dev/null
@@ -1,451 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_81341F8
-sub_81341F8: @ 81341F8
- push {lr}
- ldr r0, _08134208 @ =gSaveBlock1 + 0x3144
- movs r1, 0
- movs r2, 0x1C
- bl memset
- pop {r0}
- bx r0
- .align 2, 0
-_08134208: .4byte gSaveBlock1 + 0x3144
- thumb_func_end sub_81341F8
-
- thumb_func_start sub_813420C
-sub_813420C: @ 813420C
- push {r4-r6,lr}
- movs r2, 0
- ldr r6, _08134238 @ =gRoamerLocation
- ldr r4, _0813423C @ =gUnknown_020392FC
- movs r3, 0
- adds r5, r4, 0x1
-_08134218:
- lsls r1, r2, 1
- adds r0, r1, r4
- strb r3, [r0]
- adds r1, r5
- strb r3, [r1]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x2
- bls _08134218
- movs r0, 0
- strb r0, [r6]
- strb r0, [r6, 0x1]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08134238: .4byte gRoamerLocation
-_0813423C: .4byte gUnknown_020392FC
- thumb_func_end sub_813420C
-
- thumb_func_start sub_8134240
-sub_8134240: @ 8134240
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- sub sp, 0x10
- ldr r5, _081342FC @ =gEnemyParty
- .ifdef SAPPHIRE
- ldr r6, _sub_8134240_Latias @ =407
- .else
- movs r6, 0xCC
- lsls r6, 1
- .endif
- movs r0, 0
- str r0, [sp]
- str r0, [sp, 0x4]
- str r0, [sp, 0x8]
- str r0, [sp, 0xC]
- adds r0, r5, 0
- adds r1, r6, 0
- movs r2, 0x28
- movs r3, 0x20
- bl CreateMon
- ldr r4, _08134300 @ =gSaveBlock1 + 0x3144
- movs r0, 0
- mov r8, r0
- strh r6, [r4, 0x8]
- movs r0, 0x28
- strb r0, [r4, 0xC]
- mov r0, r8
- strb r0, [r4, 0xD]
- movs r0, 0x1
- strb r0, [r4, 0x13]
- adds r0, r5, 0
- movs r1, 0x42
- bl GetMonData
- str r0, [r4]
- adds r0, r5, 0
- movs r1, 0
- bl GetMonData
- str r0, [r4, 0x4]
- adds r0, r5, 0
- movs r1, 0x3A
- bl GetMonData
- strh r0, [r4, 0xA]
- adds r0, r5, 0
- movs r1, 0x16
- bl GetMonData
- strb r0, [r4, 0xE]
- adds r0, r5, 0
- movs r1, 0x17
- bl GetMonData
- strb r0, [r4, 0xF]
- adds r0, r5, 0
- movs r1, 0x18
- bl GetMonData
- strb r0, [r4, 0x10]
- adds r0, r5, 0
- movs r1, 0x21
- bl GetMonData
- strb r0, [r4, 0x11]
- adds r0, r5, 0
- movs r1, 0x2F
- bl GetMonData
- strb r0, [r4, 0x12]
- ldr r4, _08134304 @ =gRoamerLocation
- mov r0, r8
- strb r0, [r4]
- bl Random
- ldr r5, _08134308 @ =gRoamerLocations
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x14
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 16
- lsls r1, r0, 1
- adds r1, r0
- lsls r1, 1
- adds r1, r5
- ldrb r0, [r1]
- strb r0, [r4, 0x1]
- add sp, 0x10
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_081342FC: .4byte gEnemyParty
- .ifdef SAPPHIRE
-_sub_8134240_Latias: .4byte 407
- .endif
-_08134300: .4byte gSaveBlock1 + 0x3144
-_08134304: .4byte gRoamerLocation
-_08134308: .4byte gRoamerLocations
- thumb_func_end sub_8134240
-
- thumb_func_start sub_813430C
-sub_813430C: @ 813430C
- push {lr}
- bl sub_81341F8
- bl sub_813420C
- bl sub_8134240
- pop {r0}
- bx r0
- thumb_func_end sub_813430C
-
- thumb_func_start mapnumbers_history_shift_sav1_0_2_4_out
-mapnumbers_history_shift_sav1_0_2_4_out: @ 8134320
- ldr r0, _08134340 @ =gUnknown_020392FC
- ldrb r1, [r0, 0x2]
- strb r1, [r0, 0x4]
- ldrb r1, [r0, 0x3]
- strb r1, [r0, 0x5]
- ldrb r1, [r0]
- strb r1, [r0, 0x2]
- ldrb r1, [r0, 0x1]
- strb r1, [r0, 0x3]
- ldr r2, _08134344 @ =gSaveBlock1
- ldrb r1, [r2, 0x4]
- strb r1, [r0]
- ldrb r1, [r2, 0x5]
- strb r1, [r0, 0x1]
- bx lr
- .align 2, 0
-_08134340: .4byte gUnknown_020392FC
-_08134344: .4byte gSaveBlock1
- thumb_func_end mapnumbers_history_shift_sav1_0_2_4_out
-
- thumb_func_start sub_8134348
-sub_8134348: @ 8134348
- push {r4,r5,lr}
- movs r1, 0
- ldr r0, _08134388 @ =gSaveBlock1 + 0x3144
- ldrb r0, [r0, 0x13]
- cmp r0, 0
- beq _08134380
- ldr r0, _0813438C @ =gRoamerLocation
- strb r1, [r0]
- ldr r5, _08134390 @ =gRoamerLocations
- adds r4, r0, 0
-_0813435C:
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x14
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 16
- lsls r1, r0, 1
- adds r1, r0
- lsls r1, 1
- adds r1, r5
- ldrb r1, [r1]
- ldrb r0, [r4, 0x1]
- cmp r0, r1
- beq _0813435C
- strb r1, [r4, 0x1]
-_08134380:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08134388: .4byte gSaveBlock1 + 0x3144
-_0813438C: .4byte gRoamerLocation
-_08134390: .4byte gRoamerLocations
- thumb_func_end sub_8134348
-
- thumb_func_start sub_8134394
-sub_8134394: @ 8134394
- push {r4-r7,lr}
- movs r4, 0
- bl Random
- lsls r0, 16
- movs r1, 0xF0
- lsls r1, 12
- ands r1, r0
- cmp r1, 0
- bne _081343AE
- bl sub_8134348
- b _08134416
-_081343AE:
- ldr r0, _081343FC @ =gSaveBlock1 + 0x3144
- ldrb r0, [r0, 0x13]
- cmp r0, 0
- beq _08134416
- ldr r7, _08134400 @ =gRoamerLocation
- ldr r3, _08134404 @ =gRoamerLocations
-_081343BA:
- lsls r0, r4, 1
- adds r0, r4
- lsls r2, r0, 1
- adds r1, r2, r3
- ldrb r0, [r7, 0x1]
- ldrb r1, [r1]
- cmp r0, r1
- bne _0813440C
- ldr r6, _08134404 @ =gRoamerLocations
- adds r5, r2, 0x1
- ldr r4, _08134408 @ =gUnknown_020392FC
-_081343D0:
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x5
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 16
- adds r0, r5
- adds r0, r6
- ldrb r1, [r0]
- ldrb r0, [r4, 0x4]
- cmp r0, 0
- bne _081343F4
- ldrb r0, [r4, 0x5]
- cmp r0, r1
- beq _081343D0
-_081343F4:
- cmp r1, 0xFF
- beq _081343D0
- strb r1, [r7, 0x1]
- b _08134416
- .align 2, 0
-_081343FC: .4byte gSaveBlock1 + 0x3144
-_08134400: .4byte gRoamerLocation
-_08134404: .4byte gRoamerLocations
-_08134408: .4byte gUnknown_020392FC
-_0813440C:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x13
- bls _081343BA
-_08134416:
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_8134394
-
- thumb_func_start sub_813441C
-sub_813441C: @ 813441C
- push {lr}
- lsls r0, 24
- lsrs r2, r0, 24
- lsls r1, 24
- lsrs r1, 24
- ldr r0, _08134440 @ =gSaveBlock1 + 0x3144
- ldrb r0, [r0, 0x13]
- cmp r0, 0
- beq _08134448
- ldr r0, _08134444 @ =gRoamerLocation
- ldrb r3, [r0]
- cmp r2, r3
- bne _08134448
- ldrb r0, [r0, 0x1]
- cmp r1, r0
- bne _08134448
- movs r0, 0x1
- b _0813444A
- .align 2, 0
-_08134440: .4byte gSaveBlock1 + 0x3144
-_08134444: .4byte gRoamerLocation
-_08134448:
- movs r0, 0
-_0813444A:
- pop {r1}
- bx r1
- thumb_func_end sub_813441C
-
- thumb_func_start sub_8134450
-sub_8134450: @ 8134450
- push {r4,r5,lr}
- sub sp, 0x4
- ldr r4, _081344C4 @ =gEnemyParty
- ldr r5, _081344C8 @ =gSaveBlock1 + 0x3144
- ldrh r1, [r5, 0x8]
- ldrb r2, [r5, 0xC]
- ldr r3, [r5]
- ldr r0, [r5, 0x4]
- str r0, [sp]
- adds r0, r4, 0
- bl CreateMonWithIVsPersonality
- adds r2, r5, 0
- adds r2, 0xD
- adds r0, r4, 0
- movs r1, 0x37
- bl SetMonData
- adds r2, r5, 0
- adds r2, 0xA
- adds r0, r4, 0
- movs r1, 0x39
- bl SetMonData
- adds r2, r5, 0
- adds r2, 0xE
- adds r0, r4, 0
- movs r1, 0x16
- bl SetMonData
- adds r2, r5, 0
- adds r2, 0xF
- adds r0, r4, 0
- movs r1, 0x17
- bl SetMonData
- adds r2, r5, 0
- adds r2, 0x10
- adds r0, r4, 0
- movs r1, 0x18
- bl SetMonData
- adds r2, r5, 0
- adds r2, 0x11
- adds r0, r4, 0
- movs r1, 0x21
- bl SetMonData
- adds r2, r5, 0
- adds r2, 0x12
- adds r0, r4, 0
- movs r1, 0x2F
- bl SetMonData
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081344C4: .4byte gEnemyParty
-_081344C8: .4byte gSaveBlock1 + 0x3144
- thumb_func_end sub_8134450
-
- thumb_func_start sub_81344CC
-sub_81344CC: @ 81344CC
- push {lr}
- ldr r1, _081344F8 @ =gSaveBlock1
- ldrb r0, [r1, 0x4]
- ldrb r1, [r1, 0x5]
- bl sub_813441C
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _081344FC
- bl Random
- lsls r0, 16
- movs r1, 0xC0
- lsls r1, 10
- ands r1, r0
- cmp r1, 0
- bne _081344FC
- bl sub_8134450
- movs r0, 0x1
- b _081344FE
- .align 2, 0
-_081344F8: .4byte gSaveBlock1
-_081344FC:
- movs r0, 0
-_081344FE:
- pop {r1}
- bx r1
- thumb_func_end sub_81344CC
-
- thumb_func_start sub_8134504
-sub_8134504: @ 8134504
- push {r4,r5,lr}
- adds r5, r0, 0
- movs r1, 0x39
- bl GetMonData
- ldr r4, _08134528 @ =gSaveBlock1 + 0x3144
- strh r0, [r4, 0xA]
- adds r0, r5, 0
- movs r1, 0x37
- bl GetMonData
- strb r0, [r4, 0xD]
- bl sub_8134348
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08134528: .4byte gSaveBlock1 + 0x3144
- thumb_func_end sub_8134504
-
- thumb_func_start sub_813452C
-sub_813452C: @ 813452C
- ldr r1, _08134534 @ =gSaveBlock1 + 0x3144
- movs r0, 0
- strb r0, [r1, 0x13]
- bx lr
- .align 2, 0
-_08134534: .4byte gSaveBlock1 + 0x3144
- thumb_func_end sub_813452C
-
- thumb_func_start GetRoamerLocation
-GetRoamerLocation: @ 8134538
- ldr r3, _08134544 @ =gRoamerLocation
- ldrb r2, [r3]
- strb r2, [r0]
- ldrb r0, [r3, 0x1]
- strb r0, [r1]
- bx lr
- .align 2, 0
-_08134544: .4byte gRoamerLocation
- thumb_func_end GetRoamerLocation
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/roamer.s b/data/roamer.s
deleted file mode 100644
index e7c03c617..000000000
--- a/data/roamer.s
+++ /dev/null
@@ -1,28 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .section .rodata
-
- .align 2
-gRoamerLocations:: @ 8402E80
- .byte 0x19,0x1A,0x20,0x21,0x31,0xFF
- .byte 0x1A,0x19,0x20,0x21,0xFF,0xFF
- .byte 0x20,0x1A,0x19,0x21,0xFF,0xFF
- .byte 0x21,0x20,0x19,0x1A,0x22,0x26
- .byte 0x22,0x21,0x23,0xFF,0xFF,0xFF
- .byte 0x23,0x22,0x24,0xFF,0xFF,0xFF
- .byte 0x24,0x23,0x25,0x26,0xFF,0xFF
- .byte 0x25,0x24,0x26,0xFF,0xFF,0xFF
- .byte 0x26,0x25,0x21,0xFF,0xFF,0xFF
- .byte 0x27,0x24,0x28,0x29,0xFF,0xFF
- .byte 0x28,0x27,0x2A,0xFF,0xFF,0xFF
- .byte 0x29,0x27,0x2A,0xFF,0xFF,0xFF
- .byte 0x2A,0x28,0x29,0x2B,0xFF,0xFF
- .byte 0x2B,0x2A,0x2C,0xFF,0xFF,0xFF
- .byte 0x2C,0x2B,0x2D,0xFF,0xFF,0xFF
- .byte 0x2D,0x2C,0x2E,0xFF,0xFF,0xFF
- .byte 0x2E,0x2D,0x2F,0xFF,0xFF,0xFF
- .byte 0x2F,0x2E,0x30,0xFF,0xFF,0xFF
- .byte 0x30,0x2F,0x31,0xFF,0xFF,0xFF
- .byte 0x31,0x30,0x19,0xFF,0xFF,0xFF
- .byte 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
diff --git a/data/specials.inc b/data/specials.inc
index 76763781d..941fd12a8 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -297,7 +297,7 @@ gSpecials::
.4byte GetLeadMonEVCount
.4byte sub_8064EAC
.4byte sub_8064ED4
- .4byte sub_813430C
+ .4byte InitRoamer
.4byte sub_810F5BC
.4byte IsGrassTypeInParty
.4byte sub_8081334
diff --git a/include/asm.inc.h b/include/asm.inc.h
index 23156e756..eb3cec985 100644
--- a/include/asm.inc.h
+++ b/include/asm.inc.h
@@ -416,14 +416,6 @@ u8 IsThereStorageSpaceForDecoration(u8);
u8 sub_8134074(u8);
s8 sub_81340A8(u8);
-// asm/roamer.o
-void sub_81341F8(void);
-void sub_813420C(void);
-void mapnumbers_history_shift_sav1_0_2_4_out(void);
-void sub_8134348(void);
-void sub_8134394();
-u8 sub_81344CC(void);
-
// asm/battle_tower.o
void sub_8134AC0(void *);
diff --git a/include/global.h b/include/global.h
index ce17d78a1..ca5335697 100644
--- a/include/global.h
+++ b/include/global.h
@@ -156,7 +156,8 @@ struct Roamer
/*0x10*/ u8 cute;
/*0x11*/ u8 smart;
/*0x12*/ u8 tough;
- /*0x13*/ u8 active;
+ /*0x13*/ bool8 active;
+ /*0x14*/ u8 filler[0x8];
};
struct RamScriptData
@@ -408,7 +409,6 @@ struct SaveBlock1 /* 0x02025734 */
/*0x3110*/ u8 giftRibbons[7];
/*0x3117*/ u8 filler_311B[0x2D];
/*0x3144*/ struct Roamer roamer;
- /*0x3158*/ u8 filler_3158[0x8];
/*0x3160*/ struct EnigmaBerry enigmaBerry;
/*0x3690*/ struct RamScript ramScript;
/*0x3A7C*/ u8 filler_3A7C[0x10];
diff --git a/include/roamer.h b/include/roamer.h
new file mode 100644
index 000000000..9d5f3c4ed
--- /dev/null
+++ b/include/roamer.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_ROAMER_H
+#define GUARD_ROAMER_H
+
+void ClearRoamerData(void);
+void ClearRoamerLocationData(void);
+void UpdateLocationHistoryForRoamer(void);
+void RoamerMoveToOtherLocationSet(void);
+void RoamerMove();
+u8 TryStartRoamerEncounter(void);
+
+#endif
diff --git a/ld_script.txt b/ld_script.txt
index dd0f01e97..06d134243 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -255,7 +255,7 @@ SECTIONS {
asm/learn_move.o(.text);
src/fldeff_softboiled.o(.text);
asm/decoration_inventory.o(.text);
- asm/roamer.o(.text);
+ src/roamer.o(.text);
asm/battle_tower.o(.text);
asm/use_pokeblock.o(.text);
asm/battle_anim_8137220.o(.text);
@@ -463,7 +463,7 @@ SECTIONS {
data/battle_anim_812C144.o(.rodata);
data/learn_move.o(.rodata);
data/decoration_inventory.o(.rodata);
- data/roamer.o(.rodata);
+ src/roamer.o(.rodata);
data/battle_tower.o(.rodata);
data/use_pokeblock.o(.rodata);
data/battle_anim_8137220.o(.rodata);
diff --git a/src/new_game.c b/src/new_game.c
index e058280af..3b93d37cc 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -9,6 +9,7 @@
#include "pokedex.h"
#include "pokemon_size_record.h"
#include "rng.h"
+#include "roamer.h"
#include "rom4.h"
#include "rtc.h"
#include "script.h"
@@ -135,8 +136,8 @@ void NewGameInitData(void)
gPlayerPartyCount = 0;
ZeroPlayerPartyMons();
sub_80961D8();
- sub_81341F8();
- sub_813420C();
+ ClearRoamerData();
+ ClearRoamerLocationData();
gSaveBlock1.registeredItem = 0;
sub_80A3714();
NewGameInitPCItems();
diff --git a/src/roamer.c b/src/roamer.c
new file mode 100644
index 000000000..394f81c75
--- /dev/null
+++ b/src/roamer.c
@@ -0,0 +1,226 @@
+#include "global.h"
+#include "pokemon.h"
+#include "rng.h"
+#include "roamer.h"
+#include "species.h"
+
+#ifdef SAPPHIRE
+#define ROAMER_SPECIES SPECIES_LATIAS
+#else
+#define ROAMER_SPECIES SPECIES_LATIOS
+#endif
+
+enum
+{
+ MAP_GRP = 0, // map group
+ MAP_NUM = 1, // map number
+};
+
+EWRAM_DATA static u8 sLocationHistory[3][2] = {0};
+EWRAM_DATA static u8 sRoamerLocation[2] = {0};
+
+static const u8 sRoamerLocations[][6] =
+{
+ { 0x19, 0x1A, 0x20, 0x21, 0x31, 0xFF },
+ { 0x1A, 0x19, 0x20, 0x21, 0xFF, 0xFF },
+ { 0x20, 0x1A, 0x19, 0x21, 0xFF, 0xFF },
+ { 0x21, 0x20, 0x19, 0x1A, 0x22, 0x26 },
+ { 0x22, 0x21, 0x23, 0xFF, 0xFF, 0xFF },
+ { 0x23, 0x22, 0x24, 0xFF, 0xFF, 0xFF },
+ { 0x24, 0x23, 0x25, 0x26, 0xFF, 0xFF },
+ { 0x25, 0x24, 0x26, 0xFF, 0xFF, 0xFF },
+ { 0x26, 0x25, 0x21, 0xFF, 0xFF, 0xFF },
+ { 0x27, 0x24, 0x28, 0x29, 0xFF, 0xFF },
+ { 0x28, 0x27, 0x2A, 0xFF, 0xFF, 0xFF },
+ { 0x29, 0x27, 0x2A, 0xFF, 0xFF, 0xFF },
+ { 0x2A, 0x28, 0x29, 0x2B, 0xFF, 0xFF },
+ { 0x2B, 0x2A, 0x2C, 0xFF, 0xFF, 0xFF },
+ { 0x2C, 0x2B, 0x2D, 0xFF, 0xFF, 0xFF },
+ { 0x2D, 0x2C, 0x2E, 0xFF, 0xFF, 0xFF },
+ { 0x2E, 0x2D, 0x2F, 0xFF, 0xFF, 0xFF },
+ { 0x2F, 0x2E, 0x30, 0xFF, 0xFF, 0xFF },
+ { 0x30, 0x2F, 0x31, 0xFF, 0xFF, 0xFF },
+ { 0x31, 0x30, 0x19, 0xFF, 0xFF, 0xFF },
+ { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+};
+
+void ClearRoamerData(void)
+{
+ memset(&gSaveBlock1.roamer, 0, sizeof(gSaveBlock1.roamer));
+}
+
+void ClearRoamerLocationData(void)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ sLocationHistory[i][MAP_GRP] = 0;
+ sLocationHistory[i][MAP_NUM] = 0;
+ }
+
+ sRoamerLocation[MAP_GRP] = 0;
+ sRoamerLocation[MAP_NUM] = 0;
+}
+
+void CreateInitialRoamerMon(void)
+{
+ struct Roamer *roamer;
+ CreateMon(&gEnemyParty[0], ROAMER_SPECIES, 40, 0x20, 0, 0, 0, 0);
+ roamer = &gSaveBlock1.roamer;
+ roamer->species = ROAMER_SPECIES;
+ roamer->level = 40;
+ roamer->status = 0;
+ roamer->active = TRUE;
+ roamer->ivs = GetMonData(&gEnemyParty[0], MON_DATA_IVS);
+ roamer->personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY);
+ roamer->hp = GetMonData(&gEnemyParty[0], MON_DATA_MAX_HP);
+ roamer->cool = GetMonData(&gEnemyParty[0], MON_DATA_COOL);
+ roamer->beauty = GetMonData(&gEnemyParty[0], MON_DATA_BEAUTY);
+ roamer->cute = GetMonData(&gEnemyParty[0], MON_DATA_CUTE);
+ roamer->smart = GetMonData(&gEnemyParty[0], MON_DATA_SMART);
+ roamer->tough = GetMonData(&gEnemyParty[0], MON_DATA_TOUGH);
+ sRoamerLocation[MAP_GRP] = 0;
+ sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % 20][0];
+}
+
+void InitRoamer(void)
+{
+ ClearRoamerData();
+ ClearRoamerLocationData();
+ CreateInitialRoamerMon();
+}
+
+void UpdateLocationHistoryForRoamer(void)
+{
+ sLocationHistory[2][MAP_GRP] = sLocationHistory[1][MAP_GRP];
+ sLocationHistory[2][MAP_NUM] = sLocationHistory[1][MAP_NUM];
+
+ sLocationHistory[1][MAP_GRP] = sLocationHistory[0][MAP_GRP];
+ sLocationHistory[1][MAP_NUM] = sLocationHistory[0][MAP_NUM];
+
+ sLocationHistory[0][MAP_GRP] = gSaveBlock1.location.mapGroup;
+ sLocationHistory[0][MAP_NUM] = gSaveBlock1.location.mapNum;
+}
+
+void RoamerMoveToOtherLocationSet(void)
+{
+ u8 val = 0;
+ struct Roamer *roamer = &gSaveBlock1.roamer;
+
+ if (!roamer->active)
+ return;
+
+ sRoamerLocation[MAP_GRP] = val;
+
+ while (1)
+ {
+ val = sRoamerLocations[Random() % 20][0];
+ if (sRoamerLocation[MAP_NUM] != val)
+ {
+ sRoamerLocation[MAP_NUM] = val;
+ return;
+ }
+ }
+}
+
+void RoamerMove(void)
+{
+ u8 locSet = 0;
+
+ if ((Random() % 16) == 0)
+ {
+ RoamerMoveToOtherLocationSet();
+ }
+ else
+ {
+ struct Roamer *roamer = &gSaveBlock1.roamer;
+
+ if (!roamer->active)
+ return;
+
+ while (locSet < 20)
+ {
+ if (sRoamerLocation[MAP_NUM] == sRoamerLocations[locSet][0])
+ {
+ u8 mapNum;
+ while (1)
+ {
+ mapNum = sRoamerLocations[locSet][(Random() % 5) + 1];
+ if (!(sLocationHistory[2][MAP_GRP] == 0 && sLocationHistory[2][MAP_NUM] == mapNum) && mapNum != 0xFF)
+ break;
+ }
+ sRoamerLocation[MAP_NUM] = mapNum;
+ return;
+ }
+ locSet++;
+ }
+ }
+}
+
+bool8 IsRoamerAt(u8 mapGroup, u8 mapNum)
+{
+ struct Roamer *roamer = &gSaveBlock1.roamer;
+
+ if (roamer->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM])
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void CreateRoamerMonInstance(void)
+{
+ struct Pokemon *mon = &gEnemyParty[0];
+ struct Roamer *roamer = &gSaveBlock1.roamer;
+ CreateMonWithIVsPersonality(mon, roamer->species, roamer->level, roamer->ivs, roamer->personality);
+ SetMonData(mon, MON_DATA_STATUS, (u8 *)&roamer->status);
+ SetMonData(mon, MON_DATA_HP, (u8 *)&roamer->hp);
+ SetMonData(mon, MON_DATA_COOL, (u8 *)&roamer->cool);
+ SetMonData(mon, MON_DATA_BEAUTY, (u8 *)&roamer->beauty);
+ SetMonData(mon, MON_DATA_CUTE, (u8 *)&roamer->cute);
+ SetMonData(mon, MON_DATA_SMART, (u8 *)&roamer->smart);
+ SetMonData(mon, MON_DATA_TOUGH, (u8 *)&roamer->tough);
+}
+
+bool8 TryStartRoamerEncounter(void)
+{
+ if (IsRoamerAt(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) == TRUE && (Random() % 4) == 0)
+ {
+ CreateRoamerMonInstance();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+void UpdateRoamerHPStatus(struct Pokemon *mon)
+{
+ struct Roamer *roamer;
+ u16 hp;
+ u8 status;
+
+ hp = GetMonData(mon, MON_DATA_HP);
+
+ roamer = &gSaveBlock1.roamer;
+ roamer->hp = hp;
+
+ status = GetMonData(mon, MON_DATA_STATUS);
+
+ roamer->status = status;
+
+ RoamerMoveToOtherLocationSet();
+}
+
+void SetRoamerInactive(void)
+{
+ struct Roamer *roamer = &gSaveBlock1.roamer;
+ roamer->active = FALSE;
+}
+
+void GetRoamerLocation(u8 *mapGroup, u8 *mapNum)
+{
+ *mapGroup = sRoamerLocation[MAP_GRP];
+ *mapNum = sRoamerLocation[MAP_NUM];
+}
diff --git a/src/rom4.c b/src/rom4.c
index 39c182731..5beb698ab 100644
--- a/src/rom4.c
+++ b/src/rom4.c
@@ -25,6 +25,7 @@
#include "palette.h"
#include "play_time.h"
#include "rng.h"
+#include "roamer.h"
#include "safari_zone.h"
#include "script.h"
#include "script_pokemon_80C4.h"
@@ -164,8 +165,8 @@ void sub_805308C(void)
FlagReset(SYS_SAFARI_MODE);
sub_8054164();
ResetCyclingRoadChallengeData();
- mapnumbers_history_shift_sav1_0_2_4_out();
- sub_8134348();
+ UpdateLocationHistoryForRoamer();
+ RoamerMoveToOtherLocationSet();
}
void ResetGameStats(void)
@@ -531,8 +532,8 @@ void sub_80538F0(u8 mapGroup, u8 mapNum)
sub_807D874(i);
sub_8072ED0();
- mapnumbers_history_shift_sav1_0_2_4_out();
- sub_8134394();
+ UpdateLocationHistoryForRoamer();
+ RoamerMove();
DoCurrentWeather();
ResetFieldTasksArgs();
mapheader_run_script_with_tag_x5();
@@ -561,8 +562,8 @@ void sub_8053994(u32 a1)
sub_8053C98();
sav1_reset_battle_music_maybe();
mapheader_run_script_with_tag_x3();
- mapnumbers_history_shift_sav1_0_2_4_out();
- sub_8134348();
+ UpdateLocationHistoryForRoamer();
+ RoamerMoveToOtherLocationSet();
not_trainer_hill_battle_pyramid();
if (a1 != 1 && v3)
{
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index 408dc69ce..9dfcf0e5c 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -7,6 +7,7 @@
#include "field_player_avatar.h"
#include "metatile_behavior.h"
#include "rng.h"
+#include "roamer.h"
#include "rom4.h"
#include "safari_zone.h"
#include "script.h"
@@ -3323,7 +3324,7 @@ bool8 StandardWildEncounter(u16 a, u16 b)
if (DoWildEncounterTest(gWildMonHeaders[headerNum].landMonsInfo->encounterRate, 0) == TRUE)
{
- if (sub_81344CC() == TRUE)
+ if (TryStartRoamerEncounter() == TRUE)
{
roamer = &gSaveBlock1.roamer;
if (RepelCheck(roamer->level))
@@ -3357,7 +3358,7 @@ bool8 StandardWildEncounter(u16 a, u16 b)
if (DoWildEncounterTest(gWildMonHeaders[headerNum].waterMonsInfo->encounterRate, 0) == TRUE)
{
- if (sub_81344CC() == TRUE)
+ if (TryStartRoamerEncounter() == TRUE)
{
roamer = &gSaveBlock1.roamer;
if (RepelCheck(roamer->level))
@@ -3425,7 +3426,7 @@ bool8 SweetScentWildEncounter(void)
wildPokemonInfo = gWildMonHeaders[headerNum].landMonsInfo;
if (wildPokemonInfo == NULL)
return FALSE;
- if (sub_81344CC() == TRUE)
+ if (TryStartRoamerEncounter() == TRUE)
{
StartBattle_Roamer();
return TRUE;
@@ -3442,7 +3443,7 @@ bool8 SweetScentWildEncounter(void)
wildPokemonInfo = gWildMonHeaders[headerNum].waterMonsInfo;
if (wildPokemonInfo == NULL)
return FALSE;
- if (sub_81344CC() == TRUE)
+ if (TryStartRoamerEncounter() == TRUE)
{
StartBattle_Roamer();
return TRUE;
diff --git a/sym_ewram.txt b/sym_ewram.txt
index c42ba4c5b..bf976e5dd 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -958,14 +958,9 @@ gLastSaveSectorStatus: @ 2039284
gUnknown_02039288: @ 2039288
.space 0x74
-gUnknown_020392FC: @ 20392FC
- .space 0x6
-
-@ Latios/Latias location
-@ map group, map num.
-gRoamerLocation: @ 2039302
- .space 0x2
+ .include "src/roamer.o"
+ .align 2
gUnknown_02039304: @ 2039304
.space 0x4