summaryrefslogtreecommitdiff
path: root/engine/events_3.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/events_3.asm')
-rwxr-xr-xengine/events_3.asm863
1 files changed, 863 insertions, 0 deletions
diff --git a/engine/events_3.asm b/engine/events_3.asm
new file mode 100755
index 000000000..f9f8ffedc
--- /dev/null
+++ b/engine/events_3.asm
@@ -0,0 +1,863 @@
+ReturnFromMapSetupScript:: ; b8000
+ xor a
+ ld [hBGMapMode], a
+ ; For some reson, GameFreak chose to use a callba here instead of just falling through.
+ ; No other function in the game references the function at 2E:400A, here labeled
+ ; ReturnFromMapSetupScript.inefficientcallba.
+ callba .inefficientcallba ; this is a waste of 6 ROM bytes and 2 stack bytes
+ ret
+; b800a
+
+.inefficientcallba: ; b800a
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+ call GetWorldMapLocation
+ ld [wCurrentLandmark], a
+ call .CheckNationalParkGate
+ jr z, .nationalparkgate
+
+ call GetMapPermission
+ cp GATE
+ jr nz, .not_gate
+
+.nationalparkgate
+ ld a, -1
+ ld [wCurrentLandmark], a
+
+.not_gate
+ ld hl, wEnteredMapFromContinue
+ bit 1, [hl]
+ res 1, [hl]
+ jr nz, .dont_do_map_sign
+
+ call .CheckMovingWithinLandmark
+ jr z, .dont_do_map_sign
+ ld a, [wCurrentLandmark]
+ ld [wPreviousLandmark], a
+
+ call .CheckSpecialMap
+ jr z, .dont_do_map_sign
+
+; Display for 60 frames
+ ld a, 60
+ ld [wLandmarkSignTimer], a
+ call LoadMapNameSignGFX
+ call InitMapNameFrame
+ callba Function104303
+ ret
+
+.dont_do_map_sign
+ ld a, [wCurrentLandmark]
+ ld [wPreviousLandmark], a
+ ld a, $90
+ ld [rWY], a
+ ld [hWY], a
+ xor a
+ ld [hLCDStatCustom], a
+ ret
+; b8064
+
+.CheckMovingWithinLandmark: ; b8064
+ ld a, [wCurrentLandmark]
+ ld c, a
+ ld a, [wPreviousLandmark]
+ cp c
+ ret z
+ cp $0
+ ret
+; b8070
+
+.CheckSpecialMap: ; b8070
+ cp -1
+ ret z
+ cp SPECIAL_MAP
+ ret z
+ cp RADIO_TOWER
+ ret z
+ cp LAV_RADIO_TOWER
+ ret z
+ cp UNDERGROUND
+ ret z
+ cp INDIGO_PLATEAU
+ ret z
+ cp POWER_PLANT
+ ret z
+ ld a, $1
+ and a
+ ret
+; b8089
+
+.CheckNationalParkGate: ; b8089
+ ld a, [MapGroup]
+ cp GROUP_ROUTE_35_NATIONAL_PARK_GATE
+ ret nz
+ ld a, [MapNumber]
+ cp MAP_ROUTE_35_NATIONAL_PARK_GATE
+ ret z
+ cp MAP_ROUTE_36_NATIONAL_PARK_GATE
+ ret
+; b8098
+
+
+PlaceMapNameSign:: ; b8098 (2e:4098)
+ ld hl, wLandmarkSignTimer
+ ld a, [hl]
+ and a
+ jr z, .disappear
+ dec [hl]
+ cp 60
+ ret z
+ cp 59
+ jr nz, .skip2
+ call InitMapNameFrame
+ call PlaceMapNameCenterAlign
+ callba Function104303
+.skip2
+ ld a, $80
+ ld a, $70
+ ld [rWY], a
+ ld [hWY], a
+ ret
+
+.disappear
+ ld a, $90
+ ld [rWY], a
+ ld [hWY], a
+ xor a
+ ld [hLCDStatCustom], a
+ ret
+
+
+LoadMapNameSignGFX: ; b80c6
+ ld de, MapEntryFrameGFX
+ ld hl, VTiles2 tile $60
+ lb bc, BANK(MapEntryFrameGFX), $e
+ call Get2bpp
+ ret
+; b80d3
+
+InitMapNameFrame: ; b80d3
+ hlcoord 0, 0
+ ld b, 2
+ ld c, 18
+ call InitMapSignAttrMap
+ call PlaceMapNameFrame
+ ret
+; b80e1
+
+
+PlaceMapNameCenterAlign: ; b80e1 (2e:40e1)
+ ld a, [wCurrentLandmark]
+ ld e, a
+ callba GetLandmarkName
+ call .GetNameLength
+ ld a, SCREEN_WIDTH
+ sub c
+ srl a
+ ld b, $0
+ ld c, a
+ hlcoord 0, 2
+ add hl, bc
+ ld de, StringBuffer1
+ call PlaceString
+ ret
+
+.GetNameLength: ; b8101 (2e:4101)
+ ld c, 0
+ push hl
+ ld hl, StringBuffer1
+.loop
+ ld a, [hli]
+ cp "@"
+ jr z, .stop
+ cp "%"
+ jr z, .loop
+ inc c
+ jr .loop
+.stop
+ pop hl
+ ret
+
+
+InitMapSignAttrMap: ; b8115
+ ld de, AttrMap - TileMap
+ add hl, de
+rept 2
+ inc b
+endr
+rept 2
+ inc c
+endr
+ ld a, $87
+.loop
+ push bc
+ push hl
+.inner_loop
+ ld [hli], a
+ dec c
+ jr nz, .inner_loop
+ pop hl
+ ld de, SCREEN_WIDTH
+ add hl, de
+ pop bc
+ dec b
+ jr nz, .loop
+ ret
+; b812f
+
+PlaceMapNameFrame: ; b812f
+ hlcoord 0, 0
+ ; top left
+ ld a, $61
+ ld [hli], a
+ ; top row
+ ld a, $62
+ call .FillTopBottom
+ ; top right
+ ld a, $64
+ ld [hli], a
+ ; left, first line
+ ld a, $65
+ ld [hli], a
+ ; first line
+ call .FillMiddle
+ ; right, first line
+ ld a, $6b
+ ld [hli], a
+ ; left, second line
+ ld a, $66
+ ld [hli], a
+ ; second line
+ call .FillMiddle
+ ; right, second line
+ ld a, $6c
+ ld [hli], a
+ ; bottom left
+ ld a, $67
+ ld [hli], a
+ ; bottom
+ ld a, $68
+ call .FillTopBottom
+ ; bottom right
+ ld a, $6a
+ ld [hl], a
+ ret
+; b815b
+
+.FillMiddle: ; b815b
+ ld c, 18
+ ld a, $6d
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+; b8164
+
+.FillTopBottom: ; b8164
+ ld c, 5
+ jr .enterloop
+
+.continueloop
+rept 2
+ ld [hli], a
+endr
+
+.enterloop
+ inc a
+rept 2
+ ld [hli], a
+endr
+ dec a
+ dec c
+ jr nz, .continueloop
+ ret
+; b8172
+
+CheckForSignpostItems: ; b8172
+; Checks to see if there are hidden items on the screen that have not yet been found. If it finds one, returns carry.
+ call GetMapScriptHeaderBank
+ ld [Buffer1], a
+; Get the coordinate of the bottom right corner of the screen, and load it in wd1ec/wd1ed.
+ ld a, [XCoord]
+ add SCREEN_WIDTH / 4
+ ld [wd1ed], a
+ ld a, [YCoord]
+ add SCREEN_HEIGHT / 4
+ ld [wd1ec], a
+; Get the pointer for the first signpost header in the map...
+ ld hl, wdc02
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+; ... before even checking to see if there are any signposts on this map.
+ ld a, [wCurrentMapSignpostCount]
+ and a
+ jr z, .nosignpostitems
+; For i = 1:wCurrentMapSignpostCount...
+.loop
+; Store the counter in Buffer2, and store the signpost header pointer in the stack.
+ ld [Buffer2], a
+ push hl
+; Get the Y coordinate of the signpost.
+ call .GetFarByte
+ ld e, a
+; Is the Y coordinate of the signpost on the screen? If not, go to the next signpost.
+ ld a, [wd1ec]
+ sub e
+ jr c, .next
+ cp SCREEN_HEIGHT / 2
+ jr nc, .next
+; Is the X coordinate of the signpost on the screen? If not, go to the next signpost.
+ call .GetFarByte
+ ld d, a
+ ld a, [wd1ed]
+ sub d
+ jr c, .next
+ cp SCREEN_WIDTH / 2
+ jr nc, .next
+; Is this signpost a hidden item? If not, go to the next signpost.
+ call .GetFarByte
+ cp SIGNPOST_ITEM
+ jr nz, .next
+; Has this item already been found? If not, set off the Itemfinder.
+ ld a, [Buffer1]
+ call GetFarHalfword
+ ld a, [Buffer1]
+ call GetFarHalfword
+ ld d, h
+ ld e, l
+ ld b, CHECK_FLAG
+ call EventFlagAction
+ ld a, c
+ and a
+ jr z, .itemnearby
+
+.next
+; Restore the signpost header pointer and increment it by the length of a signpost header.
+ pop hl
+ ld bc, 5
+ add hl, bc
+; Restore the signpost counter and decrement it. If it hits zero, there are no hidden items in range.
+ ld a, [Buffer2]
+ dec a
+ jr nz, .loop
+
+.nosignpostitems
+ xor a
+ ret
+
+.itemnearby
+ pop hl
+ scf
+ ret
+; b81e2
+
+.GetFarByte: ; b81e2
+ ld a, [Buffer1]
+ call GetFarByte
+ inc hl
+ ret
+; b81ea
+
+
+TreeMonEncounter: ; b81ea
+ callba MobileFn_1060ef
+
+ xor a
+ ld [TempWildMonSpecies], a
+ ld [CurPartyLevel], a
+
+ ld hl, TreeMonMaps
+ call GetTreeMonSet
+ jr nc, .no_battle
+
+ call GetTreeMons
+ jr nc, .no_battle
+
+ call GetTreeMon
+ jr nc, .no_battle
+
+ ld a, BATTLETYPE_TREE
+ ld [BattleType], a
+ ld a, 1
+ ld [ScriptVar], a
+ ret
+
+.no_battle
+ xor a
+ ld [ScriptVar], a
+ ret
+; b8219
+
+RockMonEncounter: ; b8219
+
+ xor a
+ ld [TempWildMonSpecies], a
+ ld [CurPartyLevel], a
+
+ ld hl, RockMonMaps
+ call GetTreeMonSet
+ jr nc, .no_battle
+
+ call GetTreeMons
+ jr nc, .no_battle
+
+ ld a, 10
+ call RandomRange
+ cp 4
+ jr nc, .no_battle
+
+ call SelectTreeMon
+ jr nc, .no_battle
+
+ ret
+
+.no_battle
+ xor a
+ ret
+; b823e
+
+ db $05 ; ????
+
+GetTreeMonSet: ; b823f
+; Return carry and treemon set in a
+; if the current map is in table hl.
+ ld a, [MapNumber]
+ ld e, a
+ ld a, [MapGroup]
+ ld d, a
+.loop
+ ld a, [hli]
+ cp -1
+ jr z, .not_in_table
+
+ cp d
+ jr nz, .skip2
+
+ ld a, [hli]
+ cp e
+ jr nz, .skip1
+
+ jr .in_table
+
+.skip2
+ inc hl
+.skip1
+ inc hl
+ jr .loop
+
+.not_in_table
+ xor a
+ ret
+
+.in_table
+ ld a, [hl]
+ scf
+ ret
+; b825e
+
+TreeMonMaps: ; b825e
+treemon_map: macro
+ map \1
+ db \2 ; treemon set
+endm
+ treemon_map ROUTE_26, 4
+ treemon_map ROUTE_27, 4
+ treemon_map ROUTE_28, 0
+ treemon_map ROUTE_29, 3
+ treemon_map ROUTE_30, 3
+ treemon_map ROUTE_31, 3
+ treemon_map ROUTE_32, 4
+ treemon_map ROUTE_33, 2
+ treemon_map ROUTE_34, 3
+ treemon_map ROUTE_35, 3
+ treemon_map ROUTE_36, 3
+ treemon_map ROUTE_37, 3
+ treemon_map ROUTE_38, 3
+ treemon_map ROUTE_39, 3
+ treemon_map ROUTE_40, 0
+ treemon_map ROUTE_41, 0
+ treemon_map ROUTE_42, 2
+ treemon_map ROUTE_43, 5
+ treemon_map ROUTE_44, 1
+ treemon_map ROUTE_45, 1
+ treemon_map ROUTE_46, 1
+ treemon_map NEW_BARK_TOWN, 0
+ treemon_map CHERRYGROVE_CITY, 0
+ treemon_map VIOLET_CITY, 0
+ treemon_map AZALEA_TOWN, 2
+ treemon_map CIANWOOD_CITY, 0
+ treemon_map GOLDENROD_CITY, 0
+ treemon_map OLIVINE_CITY, 0
+ treemon_map ECRUTEAK_CITY, 0
+ treemon_map MAHOGANY_TOWN, 0
+ treemon_map LAKE_OF_RAGE, 5
+ treemon_map BLACKTHORN_CITY, 0
+ treemon_map SILVER_CAVE_OUTSIDE, 0
+ treemon_map ILEX_FOREST, 6
+ db -1
+; b82c5
+
+RockMonMaps: ; b82c5
+ treemon_map CIANWOOD_CITY, 7
+ treemon_map ROUTE_40, 7
+ treemon_map DARK_CAVE_VIOLET_ENTRANCE, 7
+ treemon_map SLOWPOKE_WELL_B1F, 7
+ db -1
+; b82d2
+
+GetTreeMons: ; b82d2
+; Return the address of TreeMon table a in hl.
+; Return nc if table a doesn't exist.
+
+ cp 8
+ jr nc, .quit
+
+ and a
+ jr z, .quit
+
+ ld e, a
+ ld d, 0
+ ld hl, TreeMons
+rept 2
+ add hl, de
+endr
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ scf
+ ret
+
+.quit
+ xor a
+ ret
+; b82e8
+
+TreeMons: ; b82e8
+ dw TreeMons1
+ dw TreeMons1
+ dw TreeMons2
+ dw TreeMons3
+ dw TreeMons4
+ dw TreeMons5
+ dw TreeMons6
+ dw RockMons
+ dw TreeMons1
+
+; Two tables each (normal, rare).
+; Structure:
+; db %, species, level
+
+TreeMons1: ; b82fa
+ db 50, SPEAROW, 10
+ db 15, SPEAROW, 10
+ db 15, SPEAROW, 10
+ db 10, AIPOM, 10
+ db 5, AIPOM, 10
+ db 5, AIPOM, 10
+ db -1
+
+ db 50, SPEAROW, 10
+ db 15, HERACROSS, 10
+ db 15, HERACROSS, 10
+ db 10, AIPOM, 10
+ db 5, AIPOM, 10
+ db 5, AIPOM, 10
+ db -1
+
+TreeMons2: ; b8320
+ db 50, SPEAROW, 10
+ db 15, EKANS, 10
+ db 15, SPEAROW, 10
+ db 10, AIPOM, 10
+ db 5, AIPOM, 10
+ db 5, AIPOM, 10
+ db -1
+
+ db 50, SPEAROW, 10
+ db 15, HERACROSS, 10
+ db 15, HERACROSS, 10
+ db 10, AIPOM, 10
+ db 5, AIPOM, 10
+ db 5, AIPOM, 10
+ db -1
+
+TreeMons3: ; b8346
+ db 50, HOOTHOOT, 10
+ db 15, SPINARAK, 10
+ db 15, LEDYBA, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+ db 50, HOOTHOOT, 10
+ db 15, PINECO, 10
+ db 15, PINECO, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+TreeMons4: ; b836c
+ db 50, HOOTHOOT, 10
+ db 15, EKANS, 10
+ db 15, HOOTHOOT, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+ db 50, HOOTHOOT, 10
+ db 15, PINECO, 10
+ db 15, PINECO, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+TreeMons5: ; b8392
+ db 50, HOOTHOOT, 10
+ db 15, VENONAT, 10
+ db 15, HOOTHOOT, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+ db 50, HOOTHOOT, 10
+ db 15, PINECO, 10
+ db 15, PINECO, 10
+ db 10, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db 5, EXEGGCUTE, 10
+ db -1
+
+TreeMons6: ; b83b8
+ db 50, HOOTHOOT, 10
+ db 15, PINECO, 10
+ db 15, PINECO, 10
+ db 10, NOCTOWL, 10
+ db 5, BUTTERFREE, 10
+ db 5, BEEDRILL, 10
+ db -1
+
+ db 50, HOOTHOOT, 10
+ db 15, CATERPIE, 10
+ db 15, WEEDLE, 10
+ db 10, HOOTHOOT, 10
+ db 5, METAPOD, 10
+ db 5, KAKUNA, 10
+ db -1
+
+RockMons: ; b83de
+ db 90, KRABBY, 15
+ db 10, SHUCKLE, 15
+ db -1
+; b83e5
+
+GetTreeMon: ; b83e5
+ push hl
+ call GetTreeScore
+ pop hl
+ and a
+ jr z, .bad
+ cp 1
+ jr z, .good
+ cp 2
+ jr z, .rare
+ ret
+
+.bad
+ ld a, 10
+ call RandomRange
+ and a
+ jr nz, NoTreeMon
+ jr SelectTreeMon
+
+.good
+ ld a, 10
+ call RandomRange
+ cp 5
+ jr nc, NoTreeMon
+ jr SelectTreeMon
+
+.rare
+ ld a, 10
+ call RandomRange
+ cp 8
+ jr nc, NoTreeMon
+ jr .skip
+.skip
+ ld a, [hli]
+ cp -1
+ jr nz, .skip
+ call SelectTreeMon
+ ret
+; b841f
+
+SelectTreeMon: ; b841f
+; Read a TreeMons table and pick one monster at random.
+
+ ld a, 100
+ call RandomRange
+.loop
+ sub [hl]
+ jr c, .ok
+rept 3
+ inc hl
+endr
+ jr .loop
+
+.ok
+ ld a, [hli]
+ cp $ff
+ jr z, NoTreeMon
+
+ ld a, [hli]
+ ld [TempWildMonSpecies], a
+ ld a, [hl]
+ ld [CurPartyLevel], a
+ scf
+ ret
+
+NoTreeMon: ; b843b
+ xor a
+ ld [TempWildMonSpecies], a
+ ld [CurPartyLevel], a
+ ret
+; b8443
+
+GetTreeScore: ; b8443
+ call .CoordScore
+ ld [Buffer1], a
+ call .OTIDScore
+ ld [Buffer2], a
+ ld c, a
+ ld a, [Buffer1]
+ sub c
+ jr z, .rare
+ jr nc, .ok
+ add 10
+.ok
+ cp 5
+ jr c, .good
+
+.bad
+ xor a
+ ret
+
+.good
+ ld a, 1
+ ret
+
+.rare
+ ld a, 2
+ ret
+; b8466
+
+.CoordScore: ; b8466
+ call GetFacingTileCoord
+ ld hl, 0
+ ld c, e
+ ld b, 0
+ ld a, d
+
+ and a
+ jr z, .next
+.loop
+ add hl, bc
+ dec a
+ jr nz, .loop
+.next
+
+ add hl, bc
+ ld c, d
+ add hl, bc
+
+ ld a, h
+ ld [hDividend], a
+ ld a, l
+ ld [hDividend + 1], a
+ ld a, 5
+ ld [hDivisor], a
+ ld b, 2
+ call Divide
+
+ ld a, [hQuotient + 1]
+ ld [hDividend], a
+ ld a, [hQuotient + 2]
+ ld [hDividend + 1], a
+ ld a, 10
+ ld [hDivisor], a
+ ld b, 2
+ call Divide
+
+ ld a, [hQuotient + 3]
+ ret
+; b849d
+
+.OTIDScore: ; b849d
+ ld a, [PlayerID]
+ ld [hDividend], a
+ ld a, [PlayerID + 1]
+ ld [hDividend + 1], a
+ ld a, 10
+ ld [hDivisor], a
+ ld b, 2
+ call Divide
+ ld a, [hQuotient + 3]
+ ret
+; b84b3
+
+LoadFishingGFX: ; b84b3
+ ld a, [rVBK]
+ push af
+ ld a, $1
+ ld [rVBK], a
+
+ ld de, FishingGFX
+ ld a, [PlayerGender]
+ bit 0, a
+ jr z, .got_gender
+ ld de, KrisFishingGFX
+.got_gender
+
+ ld hl, VTiles0 tile $02
+ call .LoadGFX
+ ld hl, VTiles0 tile $06
+ call .LoadGFX
+ ld hl, VTiles0 tile $0a
+ call .LoadGFX
+ ld hl, VTiles1 tile $7c
+ call .LoadGFX
+
+ pop af
+ ld [rVBK], a
+ ret
+; b84e3
+
+.LoadGFX: ; b84e3
+ lb bc, BANK(FishingGFX), 2
+ push de
+ call Get2bpp
+ pop de
+ ld hl, 2 tiles
+ add hl, de
+ ld d, h
+ ld e, l
+ ret
+; b84f2
+
+FishingGFX: ; b84f2
+INCBIN "gfx/overworld/chris_fish.2bpp"
+; b8582
+
+KrisFishingGFX: ; b8582
+INCBIN "gfx/overworld/kris_fish.2bpp"
+; b8612