diff options
-rw-r--r-- | constants/pokemon_data_constants.asm | 2 | ||||
-rwxr-xr-x | data/text/common_1.asm | 4 | ||||
-rw-r--r-- | data/wild/johto_grass.asm | 124 | ||||
-rw-r--r-- | data/wild/johto_water.asm | 78 | ||||
-rw-r--r-- | data/wild/kanto_grass.asm | 62 | ||||
-rw-r--r-- | data/wild/kanto_water.asm | 50 | ||||
-rw-r--r-- | data/wild/probabilities.asm | 18 | ||||
-rw-r--r-- | data/wild/roammon_maps.asm | 33 | ||||
-rw-r--r-- | data/wild/swarm_grass.asm | 8 | ||||
-rw-r--r-- | data/wild/swarm_water.asm | 4 | ||||
-rw-r--r-- | engine/overworld/wildmons.asm | 971 | ||||
-rw-r--r-- | layout.link | 7 | ||||
-rw-r--r-- | main.asm | 46 | ||||
-rw-r--r-- | wram.asm | 12 |
14 files changed, 1221 insertions, 198 deletions
diff --git a/constants/pokemon_data_constants.asm b/constants/pokemon_data_constants.asm index bff6e366..9edb9cab 100644 --- a/constants/pokemon_data_constants.asm +++ b/constants/pokemon_data_constants.asm @@ -102,6 +102,8 @@ NUM_WATERMON EQU 3 GRASS_WILDDATA_LENGTH EQU (NUM_GRASSMON * 2 + 1) * 3 + 2 WATER_WILDDATA_LENGTH EQU (NUM_WATERMON * 2 + 1) * 1 + 2 +NUM_ROAMMON_MAPS EQU 16 ; RoamMaps table size (see data/wild/roammon_maps.asm) + ; treemon sets ; TreeMons indexes (see data/wild/treemons.asm) const_def diff --git a/data/text/common_1.asm b/data/text/common_1.asm index fab936d0..169cc9a9 100755 --- a/data/text/common_1.asm +++ b/data/text/common_1.asm @@ -993,7 +993,7 @@ _ButNoSpaceText:: line "no space left…" done -UnknownText_0x1bd34b:: +_JustSawSomeRareMonText:: text "I just saw some" line "rare @" text_ram wStringBuffer1 @@ -1007,7 +1007,7 @@ UnknownText_0x1bd34b:: cont "#MON, OK?" prompt -UnknownText_0x1bd39e:: +_SavingRecordText:: text "SAVING RECORD…" line "DON'T TURN OFF!" done diff --git a/data/wild/johto_grass.asm b/data/wild/johto_grass.asm index f241dd5d..2567e9fc 100644 --- a/data/wild/johto_grass.asm +++ b/data/wild/johto_grass.asm @@ -1,6 +1,8 @@ ; Johto Pokémon in grass - map SPROUT_TOWER_2F +JohtoGrassWildMons: + + map_id SPROUT_TOWER_2F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 3, RATTATA @@ -27,7 +29,7 @@ db 5, RATTATA db 5, RATTATA - map SPROUT_TOWER_3F + map_id SPROUT_TOWER_3F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 3, RATTATA @@ -54,7 +56,7 @@ db 5, RATTATA db 5, RATTATA - map TIN_TOWER_2F + map_id TIN_TOWER_2F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 20, RATTATA @@ -81,7 +83,7 @@ db 24, RATTATA db 24, RATTATA - map TIN_TOWER_3F + map_id TIN_TOWER_3F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 20, RATTATA @@ -108,7 +110,7 @@ db 24, RATTATA db 24, RATTATA - map TIN_TOWER_4F + map_id TIN_TOWER_4F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 20, RATTATA @@ -135,7 +137,7 @@ db 24, RATTATA db 24, RATTATA - map TIN_TOWER_5F + map_id TIN_TOWER_5F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 20, RATTATA @@ -162,7 +164,7 @@ db 24, RATTATA db 24, RATTATA - map TIN_TOWER_6F + map_id TIN_TOWER_6F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 20, RATTATA @@ -189,7 +191,7 @@ db 24, RATTATA db 24, RATTATA - map TIN_TOWER_7F + map_id TIN_TOWER_7F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 20, RATTATA @@ -216,7 +218,7 @@ db 24, RATTATA db 24, RATTATA - map TIN_TOWER_8F + map_id TIN_TOWER_8F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 20, RATTATA @@ -243,7 +245,7 @@ db 24, RATTATA db 24, RATTATA - map TIN_TOWER_9F + map_id TIN_TOWER_9F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 20, RATTATA @@ -270,7 +272,7 @@ db 24, RATTATA db 24, RATTATA - map BURNED_TOWER_1F + map_id BURNED_TOWER_1F db 4 percent, 4 percent, 4 percent ; encounter rates: morn/day/nite ; morn db 13, RATTATA @@ -297,7 +299,7 @@ db 15, RATICATE db 15, RATICATE - map BURNED_TOWER_B1F + map_id BURNED_TOWER_B1F db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 14, RATTATA @@ -324,7 +326,7 @@ db 16, KOFFING db 16, WEEZING - map NATIONAL_PARK + map_id NATIONAL_PARK db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 12, NIDORAN_M @@ -351,7 +353,7 @@ db 12, VENONAT db 12, VENONAT - map RUINS_OF_ALPH_OUTSIDE + map_id RUINS_OF_ALPH_OUTSIDE db 4 percent, 4 percent, 4 percent ; encounter rates: morn/day/nite ; morn db 20, NATU @@ -378,7 +380,7 @@ db 22, QUAGSIRE db 22, QUAGSIRE - map RUINS_OF_ALPH_INNER_CHAMBER + map_id RUINS_OF_ALPH_INNER_CHAMBER db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 5, UNOWN @@ -405,7 +407,7 @@ db 5, UNOWN db 5, UNOWN - map UNION_CAVE_1F + map_id UNION_CAVE_1F db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 6, GEODUDE @@ -432,7 +434,7 @@ db 6, ONIX db 6, ONIX - map UNION_CAVE_B1F + map_id UNION_CAVE_B1F db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 8, GEODUDE @@ -459,7 +461,7 @@ db 8, RATTATA db 8, RATTATA - map UNION_CAVE_B2F + map_id UNION_CAVE_B2F db 4 percent, 4 percent, 4 percent ; encounter rates: morn/day/nite ; morn db 22, ZUBAT @@ -486,7 +488,7 @@ db 23, ONIX db 23, ONIX - map SLOWPOKE_WELL_B1F + map_id SLOWPOKE_WELL_B1F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 5, ZUBAT @@ -513,7 +515,7 @@ db 8, SLOWPOKE db 8, SLOWPOKE - map SLOWPOKE_WELL_B2F + map_id SLOWPOKE_WELL_B2F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 21, ZUBAT @@ -540,7 +542,7 @@ db 23, SLOWPOKE db 23, SLOWPOKE - map ILEX_FOREST + map_id ILEX_FOREST db 4 percent, 4 percent, 4 percent ; encounter rates: morn/day/nite ; morn db 5, CATERPIE @@ -567,7 +569,7 @@ db 6, PARAS db 6, PARAS - map MOUNT_MORTAR_1F_OUTSIDE + map_id MOUNT_MORTAR_1F_OUTSIDE db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 14, RATTATA @@ -594,7 +596,7 @@ db 16, RATICATE db 16, RATICATE - map MOUNT_MORTAR_1F_INSIDE + map_id MOUNT_MORTAR_1F_INSIDE db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 13, GEODUDE @@ -621,7 +623,7 @@ db 15, GOLBAT db 15, GOLBAT - map MOUNT_MORTAR_2F_INSIDE + map_id MOUNT_MORTAR_2F_INSIDE db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 31, GRAVELER @@ -648,7 +650,7 @@ db 32, GOLBAT db 32, GOLBAT - map MOUNT_MORTAR_B1F + map_id MOUNT_MORTAR_B1F db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 15, ZUBAT @@ -675,7 +677,7 @@ db 18, RATICATE db 18, RATICATE - map ICE_PATH_1F + map_id ICE_PATH_1F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 21, SWINUB @@ -702,7 +704,7 @@ db 22, GOLBAT db 22, GOLBAT - map ICE_PATH_B1F + map_id ICE_PATH_B1F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 22, SWINUB @@ -729,7 +731,7 @@ db 23, GOLBAT db 22, SNEASEL - map ICE_PATH_B2F_MAHOGANY_SIDE + map_id ICE_PATH_B2F_MAHOGANY_SIDE db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 23, SWINUB @@ -756,7 +758,7 @@ db 22, SNEASEL db 24, SNEASEL - map ICE_PATH_B2F_BLACKTHORN_SIDE + map_id ICE_PATH_B2F_BLACKTHORN_SIDE db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 23, SWINUB @@ -783,7 +785,7 @@ db 22, SNEASEL db 24, SNEASEL - map ICE_PATH_B3F + map_id ICE_PATH_B3F db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 24, SWINUB @@ -810,7 +812,7 @@ db 24, SNEASEL db 26, SNEASEL - map WHIRL_ISLAND_NW + map_id WHIRL_ISLAND_NW db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 22, KRABBY @@ -837,7 +839,7 @@ db 24, GOLBAT db 24, GOLBAT - map WHIRL_ISLAND_NE + map_id WHIRL_ISLAND_NE db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 22, KRABBY @@ -864,7 +866,7 @@ db 24, GOLBAT db 24, GOLBAT - map WHIRL_ISLAND_SW + map_id WHIRL_ISLAND_SW db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 22, KRABBY @@ -891,7 +893,7 @@ db 24, GOLBAT db 24, GOLBAT - map WHIRL_ISLAND_CAVE + map_id WHIRL_ISLAND_CAVE db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 22, KRABBY @@ -918,7 +920,7 @@ db 24, GOLBAT db 24, GOLBAT - map WHIRL_ISLAND_SE + map_id WHIRL_ISLAND_SE db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 22, KRABBY @@ -945,7 +947,7 @@ db 24, GOLBAT db 24, GOLBAT - map WHIRL_ISLAND_B1F + map_id WHIRL_ISLAND_B1F db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 23, KRABBY @@ -972,7 +974,7 @@ db 25, GOLBAT db 25, GOLBAT - map WHIRL_ISLAND_B2F + map_id WHIRL_ISLAND_B2F db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 24, KRABBY @@ -999,7 +1001,7 @@ db 26, GOLBAT db 26, GOLBAT - map WHIRL_ISLAND_LUGIA_CHAMBER + map_id WHIRL_ISLAND_LUGIA_CHAMBER db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 25, KRABBY @@ -1026,7 +1028,7 @@ db 27, GOLBAT db 27, GOLBAT - map SILVER_CAVE_ROOM_1 + map_id SILVER_CAVE_ROOM_1 db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 43, GRAVELER @@ -1053,7 +1055,7 @@ db 46, GOLBAT db 46, GOLBAT - map SILVER_CAVE_ROOM_2 + map_id SILVER_CAVE_ROOM_2 db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 48, GOLBAT @@ -1080,7 +1082,7 @@ db 45, MISDREAVUS db 45, MISDREAVUS - map SILVER_CAVE_ROOM_3 + map_id SILVER_CAVE_ROOM_3 db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 51, GOLBAT @@ -1107,7 +1109,7 @@ db 53, GOLBAT db 53, GOLBAT - map SILVER_CAVE_ITEM_ROOMS + map_id SILVER_CAVE_ITEM_ROOMS db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 48, GOLBAT @@ -1134,7 +1136,7 @@ db 50, PARASECT db 52, PARASECT - map DARK_CAVE_VIOLET_ENTRANCE + map_id DARK_CAVE_VIOLET_ENTRANCE db 4 percent, 4 percent, 4 percent ; encounter rates: morn/day/nite ; morn db 3, GEODUDE @@ -1161,7 +1163,7 @@ db 4, ZUBAT db 4, DUNSPARCE - map DARK_CAVE_BLACKTHORN_ENTRANCE + map_id DARK_CAVE_BLACKTHORN_ENTRANCE db 4 percent, 4 percent, 4 percent ; encounter rates: morn/day/nite ; morn db 23, GEODUDE @@ -1188,7 +1190,7 @@ db 23, GOLBAT db 23, GOLBAT - map ROUTE_29 + map_id ROUTE_29 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 2, PIDGEY @@ -1215,7 +1217,7 @@ db 3, HOOTHOOT db 3, HOOTHOOT - map ROUTE_30 + map_id ROUTE_30 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 3, LEDYBA @@ -1242,7 +1244,7 @@ db 4, HOOTHOOT db 4, HOOTHOOT - map ROUTE_31 + map_id ROUTE_31 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 4, LEDYBA @@ -1269,7 +1271,7 @@ db 5, GASTLY db 5, GASTLY - map ROUTE_32 + map_id ROUTE_32 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 4, EKANS @@ -1296,7 +1298,7 @@ db 7, GASTLY db 7, GASTLY - map ROUTE_33 + map_id ROUTE_33 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 6, RATTATA @@ -1323,7 +1325,7 @@ db 7, RATTATA db 7, RATTATA - map ROUTE_34 + map_id ROUTE_34 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 10, SNUBBULL @@ -1350,7 +1352,7 @@ db 10, DITTO db 10, DITTO - map ROUTE_35 + map_id ROUTE_35 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 12, SNUBBULL @@ -1377,7 +1379,7 @@ db 10, DITTO db 12, YANMA - map ROUTE_36 + map_id ROUTE_36 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 4, LEDYBA @@ -1404,7 +1406,7 @@ db 5, GASTLY db 5, GASTLY - map ROUTE_37 + map_id ROUTE_37 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 13, LEDYBA @@ -1431,7 +1433,7 @@ db 15, ARIADOS db 15, ARIADOS - map ROUTE_38 + map_id ROUTE_38 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 16, RATTATA @@ -1458,7 +1460,7 @@ db 16, MEOWTH db 16, MEOWTH - map ROUTE_39 + map_id ROUTE_39 db 2 percent, 2 percent, 2 percent ; encounter rates: morn/day/nite ; morn db 16, RATTATA @@ -1485,7 +1487,7 @@ db 18, MEOWTH db 18, MEOWTH - map ROUTE_42 + map_id ROUTE_42 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 13, EKANS @@ -1512,7 +1514,7 @@ db 16, GOLBAT db 16, GOLBAT - map ROUTE_43 + map_id ROUTE_43 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 15, SENTRET @@ -1539,7 +1541,7 @@ db 17, VENOMOTH db 17, VENOMOTH - map ROUTE_44 + map_id ROUTE_44 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 23, TANGELA @@ -1566,7 +1568,7 @@ db 26, POLIWHIRL db 26, POLIWHIRL - map ROUTE_45 + map_id ROUTE_45 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 23, GEODUDE @@ -1593,7 +1595,7 @@ db 27, GRAVELER db 27, GRAVELER - map ROUTE_46 + map_id ROUTE_46 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 2, GEODUDE @@ -1620,7 +1622,7 @@ db 2, RATTATA db 2, RATTATA - map SILVER_CAVE_OUTSIDE + map_id SILVER_CAVE_OUTSIDE db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 41, TANGELA diff --git a/data/wild/johto_water.asm b/data/wild/johto_water.asm index a4d957ef..83e33b2d 100644 --- a/data/wild/johto_water.asm +++ b/data/wild/johto_water.asm @@ -1,228 +1,230 @@ ; Johto Pokémon in water - map RUINS_OF_ALPH_OUTSIDE +JohtoWaterWildMons: + + map_id RUINS_OF_ALPH_OUTSIDE db 2 percent ; encounter rate db 15, WOOPER db 20, QUAGSIRE db 15, QUAGSIRE - map UNION_CAVE_1F + map_id UNION_CAVE_1F db 2 percent ; encounter rate db 15, WOOPER db 20, QUAGSIRE db 15, QUAGSIRE - map UNION_CAVE_B1F + map_id UNION_CAVE_B1F db 2 percent ; encounter rate db 15, WOOPER db 20, QUAGSIRE db 15, QUAGSIRE - map UNION_CAVE_B2F + map_id UNION_CAVE_B2F db 4 percent ; encounter rate db 15, TENTACOOL db 20, QUAGSIRE db 20, TENTACRUEL - map SLOWPOKE_WELL_B1F + map_id SLOWPOKE_WELL_B1F db 2 percent ; encounter rate db 15, SLOWPOKE db 20, SLOWPOKE db 10, SLOWPOKE - map SLOWPOKE_WELL_B2F + map_id SLOWPOKE_WELL_B2F db 2 percent ; encounter rate db 15, SLOWPOKE db 20, SLOWPOKE db 20, SLOWBRO - map ILEX_FOREST + map_id ILEX_FOREST db 2 percent ; encounter rate db 15, PSYDUCK db 10, PSYDUCK db 15, GOLDUCK - map MOUNT_MORTAR_1F_OUTSIDE + map_id MOUNT_MORTAR_1F_OUTSIDE db 4 percent ; encounter rate db 15, GOLDEEN db 20, MARILL db 20, SEAKING - map MOUNT_MORTAR_2F_INSIDE + map_id MOUNT_MORTAR_2F_INSIDE db 2 percent ; encounter rate db 20, GOLDEEN db 25, MARILL db 25, SEAKING - map MOUNT_MORTAR_B1F + map_id MOUNT_MORTAR_B1F db 2 percent ; encounter rate db 15, GOLDEEN db 20, MARILL db 20, SEAKING - map WHIRL_ISLAND_SW + map_id WHIRL_ISLAND_SW db 4 percent ; encounter rate db 20, TENTACOOL db 15, HORSEA db 20, TENTACRUEL - map WHIRL_ISLAND_B2F + map_id WHIRL_ISLAND_B2F db 4 percent ; encounter rate db 15, HORSEA db 20, HORSEA db 20, TENTACRUEL - map WHIRL_ISLAND_LUGIA_CHAMBER + map_id WHIRL_ISLAND_LUGIA_CHAMBER db 4 percent ; encounter rate db 20, HORSEA db 20, TENTACRUEL db 20, SEADRA - map SILVER_CAVE_ROOM_2 + map_id SILVER_CAVE_ROOM_2 db 2 percent ; encounter rate db 35, SEAKING db 35, GOLDUCK db 35, GOLDEEN - map DARK_CAVE_VIOLET_ENTRANCE + map_id DARK_CAVE_VIOLET_ENTRANCE db 2 percent ; encounter rate db 15, MAGIKARP db 10, MAGIKARP db 5, MAGIKARP - map DARK_CAVE_BLACKTHORN_ENTRANCE + map_id DARK_CAVE_BLACKTHORN_ENTRANCE db 2 percent ; encounter rate db 15, MAGIKARP db 10, MAGIKARP db 5, MAGIKARP - map DRAGONS_DEN_B1F + map_id DRAGONS_DEN_B1F db 4 percent ; encounter rate db 15, MAGIKARP db 10, MAGIKARP db 10, DRATINI - map OLIVINE_PORT + map_id OLIVINE_PORT db 2 percent ; encounter rate db 20, TENTACOOL db 15, TENTACOOL db 20, TENTACRUEL - map ROUTE_30 + map_id ROUTE_30 db 2 percent ; encounter rate db 20, POLIWAG db 15, POLIWAG db 20, POLIWHIRL - map ROUTE_31 + map_id ROUTE_31 db 2 percent ; encounter rate db 20, POLIWAG db 15, POLIWAG db 20, POLIWHIRL - map ROUTE_32 + map_id ROUTE_32 db 6 percent ; encounter rate db 15, TENTACOOL db 20, QUAGSIRE db 20, TENTACRUEL - map ROUTE_34 + map_id ROUTE_34 db 6 percent ; encounter rate db 20, TENTACOOL db 15, TENTACOOL db 20, TENTACRUEL - map ROUTE_35 + map_id ROUTE_35 db 4 percent ; encounter rate db 20, PSYDUCK db 15, PSYDUCK db 20, GOLDUCK - map ROUTE_40 + map_id ROUTE_40 db 6 percent ; encounter rate db 20, TENTACOOL db 15, TENTACOOL db 20, TENTACRUEL - map ROUTE_41 + map_id ROUTE_41 db 6 percent ; encounter rate db 20, TENTACOOL db 20, TENTACRUEL db 20, MANTINE - map ROUTE_42 + map_id ROUTE_42 db 4 percent ; encounter rate db 20, GOLDEEN db 15, GOLDEEN db 20, SEAKING - map ROUTE_43 + map_id ROUTE_43 db 2 percent ; encounter rate db 20, MAGIKARP db 15, MAGIKARP db 10, MAGIKARP - map ROUTE_44 + map_id ROUTE_44 db 2 percent ; encounter rate db 25, POLIWAG db 20, POLIWAG db 25, POLIWHIRL - map ROUTE_45 + map_id ROUTE_45 db 2 percent ; encounter rate db 20, MAGIKARP db 15, MAGIKARP db 5, MAGIKARP - map NEW_BARK_TOWN + map_id NEW_BARK_TOWN db 6 percent ; encounter rate db 20, TENTACOOL db 15, TENTACOOL db 20, TENTACRUEL - map CHERRYGROVE_CITY + map_id CHERRYGROVE_CITY db 6 percent ; encounter rate db 20, TENTACOOL db 15, TENTACOOL db 20, TENTACRUEL - map VIOLET_CITY + map_id VIOLET_CITY db 2 percent ; encounter rate db 20, POLIWAG db 15, POLIWAG db 20, POLIWHIRL - map CIANWOOD_CITY + map_id CIANWOOD_CITY db 6 percent ; encounter rate db 20, TENTACOOL db 15, TENTACOOL db 20, TENTACRUEL - map OLIVINE_CITY + map_id OLIVINE_CITY db 6 percent ; encounter rate db 20, TENTACOOL db 15, TENTACOOL db 20, TENTACRUEL - map ECRUTEAK_CITY + map_id ECRUTEAK_CITY db 2 percent ; encounter rate db 20, POLIWAG db 15, POLIWAG db 20, POLIWHIRL - map LAKE_OF_RAGE + map_id LAKE_OF_RAGE db 6 percent ; encounter rate db 15, MAGIKARP db 10, MAGIKARP db 15, GYARADOS - map BLACKTHORN_CITY + map_id BLACKTHORN_CITY db 4 percent ; encounter rate db 15, MAGIKARP db 10, MAGIKARP db 5, MAGIKARP - map SILVER_CAVE_OUTSIDE + map_id SILVER_CAVE_OUTSIDE db 2 percent ; encounter rate db 35, POLIWHIRL db 40, POLIWHIRL diff --git a/data/wild/kanto_grass.asm b/data/wild/kanto_grass.asm index e06627d1..ff172097 100644 --- a/data/wild/kanto_grass.asm +++ b/data/wild/kanto_grass.asm @@ -1,6 +1,8 @@ ; Kanto Pokémon in grass - map DIGLETTS_CAVE +KantoGrassWildMons: + + map_id DIGLETTS_CAVE db 4 percent, 2 percent, 8 percent ; encounter rates: morn/day/nite ; morn db 3, DIGLETT @@ -27,7 +29,7 @@ db 32, DUGTRIO db 32, DUGTRIO - map MOUNT_MOON + map_id MOUNT_MOON db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 6, ZUBAT @@ -54,7 +56,7 @@ db 12, CLEFAIRY db 12, CLEFAIRY - map ROCK_TUNNEL_1F + map_id ROCK_TUNNEL_1F db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 10, CUBONE @@ -81,7 +83,7 @@ db 15, ZUBAT db 15, ZUBAT - map ROCK_TUNNEL_B1F + map_id ROCK_TUNNEL_B1F db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 12, CUBONE @@ -108,7 +110,7 @@ db 15, GOLBAT db 15, GOLBAT - map VICTORY_ROAD + map_id VICTORY_ROAD db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 34, GRAVELER @@ -135,7 +137,7 @@ db 40, GRAVELER db 40, GRAVELER - map TOHJO_FALLS + map_id TOHJO_FALLS db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 22, ZUBAT @@ -162,7 +164,7 @@ db 23, SLOWPOKE db 23, SLOWPOKE - map ROUTE_1 + map_id ROUTE_1 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 2, PIDGEY @@ -189,7 +191,7 @@ db 4, HOOTHOOT db 4, HOOTHOOT - map ROUTE_2 + map_id ROUTE_2 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 3, CATERPIE @@ -216,7 +218,7 @@ db 4, NOCTOWL db 4, NOCTOWL - map ROUTE_3 + map_id ROUTE_3 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 5, SPEAROW @@ -243,7 +245,7 @@ db 6, CLEFAIRY db 6, CLEFAIRY - map ROUTE_4 + map_id ROUTE_4 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 5, SPEAROW @@ -270,7 +272,7 @@ db 6, CLEFAIRY db 6, CLEFAIRY - map ROUTE_5 + map_id ROUTE_5 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 13, PIDGEY @@ -297,7 +299,7 @@ db 14, ABRA db 14, ABRA - map ROUTE_6 + map_id ROUTE_6 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 13, RATTATA @@ -324,7 +326,7 @@ db 15, RATICATE db 15, RATICATE - map ROUTE_7 + map_id ROUTE_7 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 17, RATTATA @@ -351,7 +353,7 @@ db 16, ABRA db 16, ABRA - map ROUTE_8 + map_id ROUTE_8 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 17, SNUBBULL @@ -378,7 +380,7 @@ db 18, KADABRA db 18, KADABRA - map ROUTE_9 + map_id ROUTE_9 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 15, RATTATA @@ -405,7 +407,7 @@ db 18, RATICATE db 18, RATICATE - map ROUTE_10_NORTH + map_id ROUTE_10_NORTH db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 15, SPEAROW @@ -432,7 +434,7 @@ db 16, ELECTABUZZ db 16, ELECTABUZZ - map ROUTE_11 + map_id ROUTE_11 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 14, HOPPIP @@ -459,7 +461,7 @@ db 16, HYPNO db 16, HYPNO - map ROUTE_13 + map_id ROUTE_13 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 23, NIDORINO @@ -486,7 +488,7 @@ db 25, QUAGSIRE db 25, CHANSEY - map ROUTE_14 + map_id ROUTE_14 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 26, NIDORINO @@ -513,7 +515,7 @@ db 28, QUAGSIRE db 28, CHANSEY - map ROUTE_15 + map_id ROUTE_15 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 23, NIDORINO @@ -540,7 +542,7 @@ db 25, QUAGSIRE db 25, CHANSEY - map ROUTE_16 + map_id ROUTE_16 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 26, GRIMER @@ -567,7 +569,7 @@ db 30, MUK db 30, MUK - map ROUTE_17 + map_id ROUTE_17 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 30, FEAROW @@ -594,7 +596,7 @@ db 33, MUK db 33, MUK - map ROUTE_18 + map_id ROUTE_18 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 26, GRIMER @@ -621,7 +623,7 @@ db 30, MUK db 30, MUK - map ROUTE_21 + map_id ROUTE_21 db 6 percent, 6 percent, 6 percent ; encounter rates: morn/day/nite ; morn db 30, TANGELA @@ -648,7 +650,7 @@ db 28, TANGELA db 28, TANGELA - map ROUTE_22 + map_id ROUTE_22 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 3, RATTATA @@ -675,7 +677,7 @@ db 7, RATTATA db 7, RATTATA - map ROUTE_24 + map_id ROUTE_24 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 8, CATERPIE @@ -702,7 +704,7 @@ db 14, GLOOM db 14, GLOOM - map ROUTE_25 + map_id ROUTE_25 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 10, CATERPIE @@ -729,7 +731,7 @@ db 14, NOCTOWL db 14, NOCTOWL - map ROUTE_26 + map_id ROUTE_26 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 28, DODUO @@ -756,7 +758,7 @@ db 30, QUAGSIRE db 30, QUAGSIRE - map ROUTE_27 + map_id ROUTE_27 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 28, DODUO @@ -783,7 +785,7 @@ db 32, NOCTOWL db 32, NOCTOWL - map ROUTE_28 + map_id ROUTE_28 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 39, TANGELA diff --git a/data/wild/kanto_water.asm b/data/wild/kanto_water.asm index 558d56a2..c9abda73 100644 --- a/data/wild/kanto_water.asm +++ b/data/wild/kanto_water.asm @@ -1,144 +1,146 @@ ; Kanto Pokémon in water - map TOHJO_FALLS +KantoWaterWildMons: + + map_id TOHJO_FALLS db 4 percent ; encounter rate db 20, GOLDEEN db 20, SLOWPOKE db 20, SEAKING - map VERMILION_PORT + map_id VERMILION_PORT db 2 percent ; encounter rate db 35, TENTACOOL db 30, TENTACOOL db 35, TENTACRUEL - map ROUTE_4 + map_id ROUTE_4 db 4 percent ; encounter rate db 10, GOLDEEN db 5, GOLDEEN db 10, SEAKING - map ROUTE_6 + map_id ROUTE_6 db 2 percent ; encounter rate db 10, PSYDUCK db 5, PSYDUCK db 10, GOLDUCK - map ROUTE_9 + map_id ROUTE_9 db 4 percent ; encounter rate db 15, GOLDEEN db 10, GOLDEEN db 15, SEAKING - map ROUTE_10_NORTH + map_id ROUTE_10_NORTH db 4 percent ; encounter rate db 15, GOLDEEN db 10, GOLDEEN db 15, SEAKING - map ROUTE_12 + map_id ROUTE_12 db 6 percent ; encounter rate db 25, TENTACOOL db 25, QUAGSIRE db 25, TENTACRUEL - map ROUTE_13 + map_id ROUTE_13 db 6 percent ; encounter rate db 25, TENTACOOL db 25, QUAGSIRE db 25, TENTACRUEL - map ROUTE_19 + map_id ROUTE_19 db 6 percent ; encounter rate db 35, TENTACOOL db 30, TENTACOOL db 35, TENTACRUEL - map ROUTE_20 + map_id ROUTE_20 db 6 percent ; encounter rate db 35, TENTACOOL db 30, TENTACOOL db 35, TENTACRUEL - map ROUTE_21 + map_id ROUTE_21 db 6 percent ; encounter rate db 35, TENTACOOL db 30, TENTACOOL db 35, TENTACRUEL - map ROUTE_22 + map_id ROUTE_22 db 2 percent ; encounter rate db 10, POLIWAG db 5, POLIWAG db 10, POLIWHIRL - map ROUTE_24 + map_id ROUTE_24 db 4 percent ; encounter rate db 10, GOLDEEN db 5, GOLDEEN db 10, SEAKING - map ROUTE_25 + map_id ROUTE_25 db 4 percent ; encounter rate db 10, GOLDEEN db 5, GOLDEEN db 10, SEAKING - map ROUTE_26 + map_id ROUTE_26 db 6 percent ; encounter rate db 30, TENTACOOL db 25, TENTACOOL db 30, TENTACRUEL - map ROUTE_27 + map_id ROUTE_27 db 6 percent ; encounter rate db 20, TENTACOOL db 15, TENTACOOL db 20, TENTACRUEL - map ROUTE_28 + map_id ROUTE_28 db 2 percent ; encounter rate db 40, POLIWAG db 35, POLIWAG db 40, POLIWHIRL - map PALLET_TOWN + map_id PALLET_TOWN db 6 percent ; encounter rate db 35, TENTACOOL db 30, TENTACOOL db 35, TENTACRUEL - map VIRIDIAN_CITY + map_id VIRIDIAN_CITY db 2 percent ; encounter rate db 10, POLIWAG db 5, POLIWAG db 10, POLIWHIRL - map CERULEAN_CITY + map_id CERULEAN_CITY db 4 percent ; encounter rate db 10, GOLDEEN db 5, GOLDEEN db 10, SEAKING - map VERMILION_CITY + map_id VERMILION_CITY db 6 percent ; encounter rate db 35, TENTACOOL db 30, TENTACOOL db 35, TENTACRUEL - map CELADON_CITY + map_id CELADON_CITY db 2 percent ; encounter rate db 20, GRIMER db 15, GRIMER db 15, MUK - map FUCHSIA_CITY + map_id FUCHSIA_CITY db 2 percent ; encounter rate db 20, MAGIKARP db 15, MAGIKARP db 10, MAGIKARP - map CINNABAR_ISLAND + map_id CINNABAR_ISLAND db 6 percent ; encounter rate db 35, TENTACOOL db 30, TENTACOOL diff --git a/data/wild/probabilities.asm b/data/wild/probabilities.asm new file mode 100644 index 00000000..bf3144bb --- /dev/null +++ b/data/wild/probabilities.asm @@ -0,0 +1,18 @@ +mon_prob: MACRO +; percent, index + db \1, \2 * 2 +ENDM + +GrassMonProbTable: + mon_prob 30, 0 ; 30% chance + mon_prob 60, 1 ; 30% chance + mon_prob 80, 2 ; 20% chance + mon_prob 90, 3 ; 10% chance + mon_prob 95, 4 ; 5% chance + mon_prob 99, 5 ; 4% chance + mon_prob 100, 6 ; 1% chance + +WaterMonProbTable: + mon_prob 60, 0 ; 60% chance + mon_prob 90, 1 ; 30% chance + mon_prob 100, 2 ; 10% chance diff --git a/data/wild/roammon_maps.asm b/data/wild/roammon_maps.asm new file mode 100644 index 00000000..628a2679 --- /dev/null +++ b/data/wild/roammon_maps.asm @@ -0,0 +1,33 @@ +; Maps that roaming monsters can be on, and possible maps they can jump to. +; Notably missing are Route 40 and Route 41, which are water routes. + +roam_map: MACRO + map_id \1 + db _NARG - 1 +rept _NARG - 1 + map_id \2 + shift +endr + db 0 +ENDM + +RoamMaps: +; there are NUM_ROAMMON_MAPS entries + ; start map, ...other maps + roam_map ROUTE_29, ROUTE_30, ROUTE_46 + roam_map ROUTE_30, ROUTE_29, ROUTE_31 + roam_map ROUTE_31, ROUTE_30, ROUTE_32, ROUTE_36 + roam_map ROUTE_32, ROUTE_36, ROUTE_31, ROUTE_33 + roam_map ROUTE_33, ROUTE_32, ROUTE_34 + roam_map ROUTE_34, ROUTE_33, ROUTE_35 + roam_map ROUTE_35, ROUTE_34, ROUTE_36 + roam_map ROUTE_36, ROUTE_35, ROUTE_31, ROUTE_32, ROUTE_37 + roam_map ROUTE_37, ROUTE_36, ROUTE_38, ROUTE_42 + roam_map ROUTE_38, ROUTE_37, ROUTE_39, ROUTE_42 + roam_map ROUTE_39, ROUTE_38 + roam_map ROUTE_42, ROUTE_43, ROUTE_44, ROUTE_37, ROUTE_38 + roam_map ROUTE_43, ROUTE_42, ROUTE_44 + roam_map ROUTE_44, ROUTE_42, ROUTE_43, ROUTE_45 + roam_map ROUTE_45, ROUTE_44, ROUTE_46 + roam_map ROUTE_46, ROUTE_45, ROUTE_29 + db -1 ; end diff --git a/data/wild/swarm_grass.asm b/data/wild/swarm_grass.asm index 61d0d853..dd7110e1 100644 --- a/data/wild/swarm_grass.asm +++ b/data/wild/swarm_grass.asm @@ -1,7 +1,9 @@ -; swarms in grass +; Pokémon swarms in grass + +SwarmGrassWildMons: ; Dunsparce swarm - map DARK_CAVE_VIOLET_ENTRANCE + map_id DARK_CAVE_VIOLET_ENTRANCE db 4 percent, 4 percent, 4 percent ; encounter rates: morn/day/nite ; morn db 3, GEODUDE @@ -29,7 +31,7 @@ db 4, DUNSPARCE ; Yanma swarm - map ROUTE_35 + map_id ROUTE_35 db 10 percent, 10 percent, 10 percent ; encounter rates: morn/day/nite ; morn db 12, NIDORAN_M diff --git a/data/wild/swarm_water.asm b/data/wild/swarm_water.asm index 67751b2b..ec105c00 100644 --- a/data/wild/swarm_water.asm +++ b/data/wild/swarm_water.asm @@ -1,4 +1,6 @@ -; swarms in water +; Pokémon swarms in water + +SwarmWaterWildMons: ; No swarms encountered while surfing in Crystal diff --git a/engine/overworld/wildmons.asm b/engine/overworld/wildmons.asm new file mode 100644 index 00000000..4be921fd --- /dev/null +++ b/engine/overworld/wildmons.asm @@ -0,0 +1,971 @@ +LoadWildMonData: + call _GrassWildmonLookup + jr c, .copy + ld hl, wMornEncounterRate + xor a + ld [hli], a + ld [hli], a + ld [hl], a + jr .done_copy + +.copy + inc hl + inc hl + ld de, wMornEncounterRate + ld bc, 3 + call CopyBytes +.done_copy + call _WaterWildmonLookup + ld a, 0 + jr nc, .no_copy + inc hl + inc hl + ld a, [hl] +.no_copy + ld [wWaterEncounterRate], a + ret + +FindNest: +; Parameters: +; e: 0 = Johto, 1 = Kanto +; wNamedObjectIndexBuffer: species + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + ld a, e + and a + jr nz, .kanto + decoord 0, 0 + ld hl, JohtoGrassWildMons + call .FindGrass + ld hl, JohtoWaterWildMons + call .FindWater + call .RoamMon1 + call .RoamMon2 + call .RoamMon3 + ret + +.kanto + decoord 0, 0 + ld hl, KantoGrassWildMons + call .FindGrass + ld hl, KantoWaterWildMons + jp .FindWater + +.FindGrass: + ld a, [hl] + cp -1 + ret z + push hl + ld a, [hli] + ld b, a + ld a, [hli] + ld c, a + inc hl + inc hl + inc hl + ld a, NUM_GRASSMON * 3 + call .SearchMapForMon + jr nc, .next_grass + ld [de], a + inc de + +.next_grass + pop hl + ld bc, GRASS_WILDDATA_LENGTH + add hl, bc + jr .FindGrass + +.FindWater: + ld a, [hl] + cp -1 + ret z + push hl + ld a, [hli] + ld b, a + ld a, [hli] + ld c, a + inc hl + ld a, NUM_WATERMON + call .SearchMapForMon + jr nc, .next_water + ld [de], a + inc de + +.next_water + pop hl + ld bc, WATER_WILDDATA_LENGTH + add hl, bc + jr .FindWater + +.SearchMapForMon: + inc hl +.ScanMapLoop: + push af + ld a, [wNamedObjectIndexBuffer] + cp [hl] + jr z, .found + inc hl + inc hl + pop af + dec a + jr nz, .ScanMapLoop + and a + ret + +.found + pop af + jp .AppendNest + +.AppendNest: + push de + call GetWorldMapLocation + ld c, a + hlcoord 0, 0 + ld de, SCREEN_WIDTH * SCREEN_HEIGHT +.AppendNestLoop: + ld a, [hli] + cp c + jr z, .found_nest + dec de + ld a, e + or d + jr nz, .AppendNestLoop + ld a, c + pop de + scf + ret + +.found_nest + pop de + and a + ret + +.RoamMon1: + ld a, [wRoamMon1Species] + ld b, a + ld a, [wNamedObjectIndexBuffer] + cp b + ret nz + ld a, [wRoamMon1MapGroup] + ld b, a + ld a, [wRoamMon1MapNumber] + ld c, a + call .AppendNest + ret nc + ld [de], a + inc de + ret + +.RoamMon2: + ld a, [wRoamMon2Species] + ld b, a + ld a, [wNamedObjectIndexBuffer] + cp b + ret nz + ld a, [wRoamMon2MapGroup] + ld b, a + ld a, [wRoamMon2MapNumber] + ld c, a + call .AppendNest + ret nc + ld [de], a + inc de + ret + +.RoamMon3: + ld a, [wRoamMon3Species] + ld b, a + ld a, [wNamedObjectIndexBuffer] + cp b + ret nz + ld a, [wRoamMon3MapGroup] + ld b, a + ld a, [wRoamMon3MapNumber] + ld c, a + call .AppendNest + ret nc + ld [de], a + inc de + ret + +TryWildEncounter:: +; Try to trigger a wild encounter. + call .EncounterRate + jr nc, .no_battle + call ChooseWildEncounter + jr nz, .no_battle + call CheckRepelEffect + jr nc, .no_battle + xor a + ret + +.no_battle + xor a ; BATTLETYPE_NORMAL + ld [wTempWildMonSpecies], a + ld [wBattleType], a + ld a, 1 + and a + ret + +.EncounterRate: + call GetMapEncounterRate + call ApplyMusicEffectOnEncounterRate + call ApplyCleanseTagEffectOnEncounterRate + call Random + cp b + ret + +GetMapEncounterRate: + ld hl, wMornEncounterRate + call CheckOnWater + ld a, wWaterEncounterRate - wMornEncounterRate + jr z, .ok + ld a, [wTimeOfDay] +.ok + ld c, a + ld b, 0 + add hl, bc + ld b, [hl] + ret + +ApplyMusicEffectOnEncounterRate:: +; Pokemon March and Ruins of Alph signal double encounter rate. +; Pokemon Lullaby halves encounter rate. + ld a, [wMapMusic] + cp MUSIC_POKEMON_MARCH + jr z, .double + cp MUSIC_RUINS_OF_ALPH_RADIO + jr z, .double + cp MUSIC_POKEMON_LULLABY + ret nz + srl b + ret + +.double + sla b + ret + +ApplyCleanseTagEffectOnEncounterRate:: +; Cleanse Tag halves encounter rate. + ld hl, wPartyMon1Item + ld de, PARTYMON_STRUCT_LENGTH + ld a, [wPartyCount] + ld c, a +.loop + ld a, [hl] + cp CLEANSE_TAG + jr z, .cleansetag + add hl, de + dec c + jr nz, .loop + ret + +.cleansetag + srl b + ret + +ChooseWildEncounter: + call LoadWildMonDataPointer + jp nc, .nowildbattle + call CheckEncounterRoamMon + jp c, .startwildbattle + + inc hl + inc hl + inc hl + call CheckOnWater + ld de, WaterMonProbTable + jr z, .watermon + inc hl + inc hl + ld a, [wTimeOfDay] + ld bc, NUM_GRASSMON * 2 + call AddNTimes + ld de, GrassMonProbTable + +.watermon +; hl contains the pointer to the wild mon data, let's save that to the stack + push hl +.randomloop + call Random + cp 100 + jr nc, .randomloop + inc a ; 1 <= a <= 100 + ld b, a + ld h, d + ld l, e +; This next loop chooses which mon to load up. +.prob_bracket_loop + ld a, [hli] + cp b + jr nc, .got_it + inc hl + jr .prob_bracket_loop + +.got_it + ld c, [hl] + ld b, 0 + pop hl + add hl, bc ; this selects our mon + ld a, [hli] + ld b, a +; If the Pokemon is encountered by surfing, we need to give the levels some variety. + call CheckOnWater + jr nz, .ok +; Check if we buff the wild mon, and by how much. + call Random + cp 35 percent + jr c, .ok + inc b + cp 65 percent + jr c, .ok + inc b + cp 85 percent + jr c, .ok + inc b + cp 95 percent + jr c, .ok + inc b +; Store the level +.ok + ld a, b + ld [wCurPartyLevel], a + ld b, [hl] + ; ld a, b + call ValidateTempWildMonSpecies + jr c, .nowildbattle + + ld a, b ; This is in the wrong place. + cp UNOWN + jr nz, .done + + ld a, [wUnlockedUnowns] + and a + jr z, .nowildbattle + +.done + jr .loadwildmon + +.nowildbattle + ld a, 1 + and a + ret + +.loadwildmon + ld a, b + ld [wTempWildMonSpecies], a + +.startwildbattle + xor a + ret + +INCLUDE "data/wild/probabilities.asm" + +CheckRepelEffect:: +; If there is no active Repel, there's no need to be here. + ld a, [wRepelEffect] + and a + jr z, .encounter +; Get the first Pokemon in your party that isn't fainted. + ld hl, wPartyMon1HP + ld bc, PARTYMON_STRUCT_LENGTH - 1 +.loop + ld a, [hli] + or [hl] + jr nz, .ok + add hl, bc + jr .loop + +.ok +; to PartyMonLevel +rept 4 + dec hl +endr + + ld a, [wCurPartyLevel] + cp [hl] + jr nc, .encounter + and a + ret + +.encounter + scf + ret + +LoadWildMonDataPointer: + call CheckOnWater + jr z, _WaterWildmonLookup + +_GrassWildmonLookup: + ld hl, SwarmGrassWildMons + ld bc, GRASS_WILDDATA_LENGTH + call _SwarmWildmonCheck + ret c + ld hl, JohtoGrassWildMons + ld de, KantoGrassWildMons + call _JohtoWildmonCheck + ld bc, GRASS_WILDDATA_LENGTH + jr _NormalWildmonOK + +_WaterWildmonLookup: + ld hl, SwarmWaterWildMons + ld bc, WATER_WILDDATA_LENGTH + call _SwarmWildmonCheck + ret c + ld hl, JohtoWaterWildMons + ld de, KantoWaterWildMons + call _JohtoWildmonCheck + ld bc, WATER_WILDDATA_LENGTH + jr _NormalWildmonOK + +_JohtoWildmonCheck: + call IsInJohto + and a + ret z + ld h, d + ld l, e + ret + +_SwarmWildmonCheck: + call CopyCurrMapDE + ld a, [wDunsparceMapGroup] + cp d + jr nz, _NoSwarmWildmon + ld a, [wDunsparceMapNumber] + cp e + jr nz, _NoSwarmWildmon + call LookUpWildmonsForMapDE + jr nc, _NoSwarmWildmon + scf + ret + +_NoSwarmWildmon: + and a + ret + +_NormalWildmonOK: + call CopyCurrMapDE + jr LookUpWildmonsForMapDE + +CopyCurrMapDE: + ld a, [wMapGroup] + ld d, a + ld a, [wMapNumber] + ld e, a + ret + +LookUpWildmonsForMapDE: +.loop + push hl + ld a, [hl] + inc a + jr z, .nope + ld a, d + cp [hl] + jr nz, .next + inc hl + ld a, e + cp [hl] + jr z, .yup + +.next + pop hl + add hl, bc + jr .loop + +.nope + pop hl + and a + ret + +.yup + pop hl + scf + ret + +InitRoamMons: +; initialize wRoamMon structs + +; species + ld a, RAIKOU + ld [wRoamMon1Species], a + ld a, ENTEI + ld [wRoamMon2Species], a + ld a, SUICUNE + ld [wRoamMon3Species], a + +; level + ld a, 40 + ld [wRoamMon1Level], a + ld [wRoamMon2Level], a + ld [wRoamMon3Level], a + +; raikou starting map + ld a, GROUP_ROUTE_42 + ld [wRoamMon1MapGroup], a + ld a, MAP_ROUTE_42 + ld [wRoamMon1MapNumber], a + +; entei starting map + ld a, GROUP_ROUTE_37 + ld [wRoamMon2MapGroup], a + ld a, MAP_ROUTE_37 + ld [wRoamMon2MapNumber], a + +; suicune starting map + ld a, GROUP_ROUTE_38 + ld [wRoamMon3MapGroup], a + ld a, MAP_ROUTE_38 + ld [wRoamMon3MapNumber], a + +; hp + xor a ; generate new stats + ld [wRoamMon1HP], a + ld [wRoamMon2HP], a + ld [wRoamMon3HP], a + + ret + +CheckEncounterRoamMon: + push hl +; Don't trigger an encounter if we're on water. + call CheckOnWater + jr z, .DontEncounterRoamMon +; Load the current map group and number to de + call CopyCurrMapDE +; Randomly select a beast. + call Random + cp 100 ; 25/64 chance + jr nc, .DontEncounterRoamMon + and %00000011 ; Of that, a 3/4 chance. Running total: 75/256, or around 29.3%. + jr z, .DontEncounterRoamMon + dec a ; 1/3 chance that it's Entei, 1/3 chance that it's Raikou, 1/3 chance that it's Suicune +; Compare its current location with yours + ld hl, wRoamMon1MapGroup + ld c, a + ld b, 0 + ld a, 7 ; length of the roam_struct + call AddNTimes + ld a, d + cp [hl] + jr nz, .DontEncounterRoamMon + inc hl + ld a, e + cp [hl] + jr nz, .DontEncounterRoamMon +; We've decided to take on a beast, so stage its information for battle. + dec hl + dec hl + dec hl + ld a, [hli] + ld [wTempWildMonSpecies], a + ld a, [hl] + ld [wCurPartyLevel], a + ld a, BATTLETYPE_ROAMING + ld [wBattleType], a + + pop hl + scf + ret + +.DontEncounterRoamMon: + pop hl + and a + ret + +UpdateRoamMons: + ld a, [wRoamMon1MapGroup] + cp GROUP_N_A + jr z, .SkipRaikou + ld b, a + ld a, [wRoamMon1MapNumber] + ld c, a + call .Update + ld a, b + ld [wRoamMon1MapGroup], a + ld a, c + ld [wRoamMon1MapNumber], a + +.SkipRaikou: + ld a, [wRoamMon2MapGroup] + cp GROUP_N_A + jr z, .SkipEntei + ld b, a + ld a, [wRoamMon2MapNumber] + ld c, a + call .Update + ld a, b + ld [wRoamMon2MapGroup], a + ld a, c + ld [wRoamMon2MapNumber], a + +.SkipEntei: + ld a, [wRoamMon3MapGroup] + cp GROUP_N_A + jr z, .Finished + ld b, a + ld a, [wRoamMon3MapNumber] + ld c, a + call .Update + ld a, b + ld [wRoamMon3MapGroup], a + ld a, c + ld [wRoamMon3MapNumber], a + +.Finished: + jp _BackUpMapIndices + +.Update: + ld hl, RoamMaps +.loop +; Are we at the end of the table? + ld a, [hl] + cp -1 + ret z +; Is this the correct entry? + ld a, b + cp [hl] + jr nz, .next + inc hl + ld a, c + cp [hl] + jr z, .yes +; We don't have the correct entry yet, so let's continue. A 0 terminates each entry. +.next + ld a, [hli] + and a + jr nz, .next + jr .loop + +; We have the correct entry now, so let's choose a random map from it. +.yes + inc hl + ld d, h + ld e, l +.update_loop + ld h, d + ld l, e +; Choose which map to warp to. + call Random + and %00011111 ; 1/8n chance it moves to a completely random map, where n is the number of roaming connections from the current map. + jr z, JumpRoamMon + and %11 + cp [hl] + jr nc, .update_loop ; invalid index, try again + inc hl + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld a, [wRoamMons_LastMapGroup] + cp [hl] + jr nz, .done + inc hl + ld a, [wRoamMons_LastMapNumber] + cp [hl] + jr z, .update_loop + dec hl + +.done + ld a, [hli] + ld b, a + ld c, [hl] + ret + +JumpRoamMons: + ld a, [wRoamMon1MapGroup] + cp GROUP_N_A + jr z, .SkipRaikou + call JumpRoamMon + ld a, b + ld [wRoamMon1MapGroup], a + ld a, c + ld [wRoamMon1MapNumber], a + +.SkipRaikou: + ld a, [wRoamMon2MapGroup] + cp GROUP_N_A + jr z, .SkipEntei + call JumpRoamMon + ld a, b + ld [wRoamMon2MapGroup], a + ld a, c + ld [wRoamMon2MapNumber], a + +.SkipEntei: + ld a, [wRoamMon3MapGroup] + cp GROUP_N_A + jr z, .Finished + call JumpRoamMon + ld a, b + ld [wRoamMon3MapGroup], a + ld a, c + ld [wRoamMon3MapNumber], a + +.Finished: + jp _BackUpMapIndices + +JumpRoamMon: +.loop + ld hl, RoamMaps +.innerloop1 ; This loop happens to be unnecessary. + call Random ; Choose a random number. + maskbits NUM_ROAMMON_MAPS ; Mask the number to limit it between 0 and 15. + cp NUM_ROAMMON_MAPS ; If the number is not less than 16, try again. + jr nc, .innerloop1 ; I'm sure you can guess why this check is bogus. + inc a + ld b, a +.innerloop2 ; Loop to get hl to the address of the chosen roam map. + dec b + jr z, .ok +.innerloop3 ; Loop to skip the current roam map, which is terminated by a 0. + ld a, [hli] + and a + jr nz, .innerloop3 + jr .innerloop2 +; Check to see if the selected map is the one the player is currently in. If so, try again. +.ok + ld a, [wMapGroup] + cp [hl] + jr nz, .done + inc hl + ld a, [wMapNumber] + cp [hl] + jr z, .loop + dec hl +; Return the map group and number in bc. +.done + ld a, [hli] + ld b, a + ld c, [hl] + ret + +_BackUpMapIndices: + ld a, [wRoamMons_CurMapNumber] + ld [wRoamMons_LastMapNumber], a + ld a, [wRoamMons_CurMapGroup] + ld [wRoamMons_LastMapGroup], a + ld a, [wMapNumber] + ld [wRoamMons_CurMapNumber], a + ld a, [wMapGroup] + ld [wRoamMons_CurMapGroup], a + ret + +INCLUDE "data/wild/roammon_maps.asm" + +ValidateTempWildMonSpecies: +; Due to a development oversight, this function is called with the wild Pokemon's level, not its species, in a. + and a + jr z, .nowildmon ; = 0 + cp NUM_POKEMON + 1 ; 252 + jr nc, .nowildmon ; >= 252 + and a ; 1 <= Species <= 251 + ret + +.nowildmon + scf + ret + +; Finds a rare wild Pokemon in the route of the trainer calling, then checks if it's been Seen already. +; The trainer will then tell you about the Pokemon if you haven't seen it. +RandomUnseenWildMon: + farcall GetCallerLocation + ld d, b + ld e, c + ld hl, JohtoGrassWildMons + ld bc, GRASS_WILDDATA_LENGTH + call LookUpWildmonsForMapDE + jr c, .GetGrassmon + ld hl, KantoGrassWildMons + call LookUpWildmonsForMapDE + jr nc, .done + +.GetGrassmon: + push hl + ld bc, 5 + 4 * 2 ; Location of the level of the 5th wild Pokemon in that map + add hl, bc + ld a, [wTimeOfDay] + ld bc, NUM_GRASSMON * 2 + call AddNTimes +.randloop1 + call Random + and %11 + jr z, .randloop1 + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc +; We now have the pointer to one of the last (rarest) three wild Pokemon found in that area. + inc hl + ld c, [hl] ; Contains the species index of this rare Pokemon + pop hl + ld de, 5 + 0 * 2 + add hl, de + inc hl ; Species index of the most common Pokemon on that route + ld b, 4 +.loop2 + ld a, [hli] + cp c ; Compare this most common Pokemon with the rare one stored in c. + jr z, .done + inc hl + dec b + jr nz, .loop2 +; This Pokemon truly is rare. + push bc + dec c + ld a, c + call CheckSeenMon + pop bc + jr nz, .done +; Since we haven't seen it, have the caller tell us about it. + ld de, wStringBuffer1 + call CopyName1 + ld a, c + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, .JustSawSomeRareMonText + call PrintText + xor a + ld [wScriptVar], a + ret + +.done + ld a, $1 + ld [wScriptVar], a + ret + +.JustSawSomeRareMonText: + text_far _JustSawSomeRareMonText + text_end + +RandomPhoneWildMon: + farcall GetCallerLocation + ld d, b + ld e, c + ld hl, JohtoGrassWildMons + ld bc, GRASS_WILDDATA_LENGTH + call LookUpWildmonsForMapDE + jr c, .ok + ld hl, KantoGrassWildMons + call LookUpWildmonsForMapDE + +.ok + ld bc, 5 + 0 * 2 + add hl, bc + ld a, [wTimeOfDay] + inc a + ld bc, NUM_GRASSMON * 2 +.loop + dec a + jr z, .done + add hl, bc + jr .loop + +.done + call Random + and %11 + ld c, a + ld b, 0 + add hl, bc + add hl, bc + inc hl + ld a, [hl] + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wStringBuffer4 + ld bc, MON_NAME_LENGTH + jp CopyBytes + +RandomPhoneMon: +; Get a random monster owned by the trainer who's calling. + farcall GetCallerLocation + ld hl, TrainerGroups + ld a, d + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld a, BANK(TrainerGroups) + call GetFarHalfword + +.skip_trainer + dec e + jr z, .skipped +.skip + ld a, BANK(Trainers) + call GetFarByte + inc hl + cp -1 + jr nz, .skip + jr .skip_trainer +.skipped + +.skip_name + ld a, BANK(Trainers) + call GetFarByte + inc hl + cp "@" + jr nz, .skip_name + + ld a, BANK(Trainers) + call GetFarByte + inc hl + ld bc, 2 ; level, species + cp TRAINERTYPE_NORMAL + jr z, .got_mon_length + ld bc, 2 + NUM_MOVES ; level, species, moves + cp TRAINERTYPE_MOVES + jr z, .got_mon_length + ld bc, 2 + 1 ; level, species, item + cp TRAINERTYPE_ITEM + jr z, .got_mon_length + ; TRAINERTYPE_ITEM_MOVES + ld bc, 2 + 1 + NUM_MOVES ; level, species, item, moves +.got_mon_length + + ld e, 0 + push hl +.count_mon + inc e + add hl, bc + ld a, BANK(Trainers) + call GetFarByte + cp -1 + jr nz, .count_mon + pop hl + +.rand + call Random + maskbits PARTY_LENGTH + cp e + jr nc, .rand + + inc a +.get_mon + dec a + jr z, .got_mon + add hl, bc + jr .get_mon +.got_mon + + inc hl ; species + ld a, BANK(Trainers) + call GetFarByte + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wStringBuffer4 + ld bc, MON_NAME_LENGTH + jp CopyBytes + +;INCLUDE "data/wild/johto_grass.asm" +;INCLUDE "data/wild/johto_water.asm" +;INCLUDE "data/wild/kanto_grass.asm" +;INCLUDE "data/wild/kanto_water.asm" +;INCLUDE "data/wild/swarm_grass.asm" +;INCLUDE "data/wild/swarm_water.asm" diff --git a/layout.link b/layout.link index d9bf86e2..11fdb67c 100644 --- a/layout.link +++ b/layout.link @@ -50,14 +50,11 @@ ROMX $08 org $4000 "bank8" ROMX $09 - org $4000 "bank9" ROMX $0a - org $4000 - "banka" + "bankA" ROMX $0b - org $4000 - "bankb" + "bankB" ROMX $0c org $4000 "bankc" @@ -249,38 +249,26 @@ INCLUDE "engine/battle/consume_held_item.asm" INCLUDE "data/moves/effects.asm" -SECTION "banka", ROMX +SECTION "bankA", ROMX INCLUDE "engine/link/link.asm" INCLUDE "engine/link/mystery_gift.asm" +INCLUDE "engine/overworld/wildmons.asm" -LoadWildMonData:: - dr $2a539, $2a643 -TryWildEncounter:: - dr $2a643, $2a680 -ApplyMusicEffectOnEncounterRate:: - dr $2a680, $2a694 -ApplyCleanseTagEffectOnEncounterRate:: - dr $2a694, $2a73b -CheckRepelEffect:: - dr $2a73b, $2a7d7 -InitRoamMons:: - dr $2a7d7, $2a859 -UpdateRoamMons:: - dr $2a859, $2a8e0 -JumpRoamMons:: - dr $2a8e0, $2a9f7 -RandomUnseenWildMon:: - dr $2a9f7, $2aa6b -RandomPhoneWildMon:: - dr $2aa6b, $2aab3 -RandomPhoneMon:: - dr $2aab3, $2ab35 JohtoGrassWildMons:: - dr $2ab35, $2bee3 - - -SECTION "bankb", ROMX + dr $2ab35, $2b669 +JohtoWaterWildMons:: + dr $2b669, $2b7c0 +KantoGrassWildMons:: + dr $2b7c0, $2bd43 +KantoWaterWildMons:: + dr $2bd43, $2be1c +SwarmGrassWildMons:: + dr $2be1c, $2bed9 +SwarmWaterWildMons:: + dr $2bed9, $2bee3 + +SECTION "bankB", ROMX PrintItemDescription:: dr $2c000, $2c033 @@ -649,7 +637,9 @@ Script_SpecialBillCall:: PhoneCall:: dr $90298, $902df HangUp:: - dr $902df, $90641 + dr $902df, $90414 +GetCallerLocation:: + dr $90414, $90641 InitClock:: dr $90641, $908dc SetDayOfWeek:: @@ -1708,10 +1708,10 @@ wd140:: ds 1 ; d140 wCurDamage:: ds 2 ; d141 wd143:: ds 1 ; d143 wd144:: ds 1 ; d144 -wd145:: ds 1 ; d145 +wMornEncounterRate:: db ; d145 wd146:: ds 1 ; d146 wd147:: ds 1 ; d147 -wd148:: ds 1 ; d148 +wWaterEncounterRate:: db ; d148 wListMoves_MoveIndicesBuffer:: ds NUM_MOVES wPutativeTMHMMove:: db ; d14d wInitListType:: db ; d14e @@ -2646,10 +2646,10 @@ wRoamMon1:: roam_struct wRoamMon1 ; dd1a wRoamMon2:: roam_struct wRoamMon2 ; dd21 wRoamMon3:: roam_struct wRoamMon3 ; dd28 -wRoamMons_CurrentMapNumber:: ds 1 ; dd2f -wRoamMons_CurrentMapGroup:: ds 1 ; dd30 -wRoamMons_LastMapNumber:: ds 1 ; dd31 -wRoamMons_LastMapGroup:: ds 1 ; dd32 +wRoamMons_CurMapNumber:: db ; dd2f +wRoamMons_CurMapGroup:: db ; dd30 +wRoamMons_LastMapNumber:: db ; dd31 +wRoamMons_LastMapGroup:: db ; dd32 wBestMagikarpLengthFeet:: ds 1 ; dd33 wBestMagikarpLengthInches:: ds 1 ; dd34 |