diff options
author | YamaArashi <shadow962@live.com> | 2017-05-08 13:55:31 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2017-05-08 15:47:45 -0700 |
commit | e6868bbdb2b9a0f00085029817d3a451781973cd (patch) | |
tree | a67f4e64f6850944f5b25c94df415923b1c325a5 | |
parent | f6e3598f5efbda472c6605c94b5597d1196ea619 (diff) |
decompile roamer.s
-rw-r--r-- | asm/battle_2.s | 4 | ||||
-rw-r--r-- | asm/roamer.s | 451 | ||||
-rw-r--r-- | data/roamer.s | 28 | ||||
-rw-r--r-- | data/specials.inc | 2 | ||||
-rw-r--r-- | include/asm.inc.h | 8 | ||||
-rw-r--r-- | include/global.h | 4 | ||||
-rw-r--r-- | include/roamer.h | 11 | ||||
-rw-r--r-- | ld_script.txt | 4 | ||||
-rw-r--r-- | src/new_game.c | 5 | ||||
-rw-r--r-- | src/roamer.c | 226 | ||||
-rw-r--r-- | src/rom4.c | 13 | ||||
-rw-r--r-- | src/wild_encounter.c | 9 | ||||
-rw-r--r-- | sym_ewram.txt | 9 |
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 |