Files
alttpr-baserom/owrando.asm

1839 lines
66 KiB
NASM

org $aa8000 ;150000
db $4f, $52 ;OR
OWMode:
dw 0
OWFlags:
dw 0
OWReserved:
dw 0
org $aa8010
OWVersionInfo:
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
;Hooks
org $82a929
OWDetectTransitionReturn:
org $82a939
OverworldHandleTransitions_SpecialTrigger:
JSL OWDetectEdgeTransition
BCS OWDetectTransitionReturn
org $82a999
jsl OWEdgeTransition : nop #4 ;LDA $02A4E3,X : ORA $7EF3CA
org $82aa07
JSL OWMarkVisited : NOP
org $84e8ae
JSL OWDetectSpecialTransition
RTL : NOP
org $82e809
JSL OWSpecialExit
org $82bfe8
JSL OWAdjustExitPosition
org $82c1a9
JSL OWEndScrollTransition
org $84E881
Overworld_LoadSpecialOverworld_RoomId:
org $84E8B4
Overworld_LoadSpecialOverworld:
org $84E96A
JSL OWSpecialReturnTriggerClear
org $82A9DA
JSL OWSkipPalettes
BCC OverworldHandleTransitions_change_palettes : NOP #4
org $87982A
Link_ResetSwimmingState:
; mirror hooks
org $8283DC ; override world check when spawning mirror portal sprite in Crossed OWR
jsl OWLightWorldOrCrossed
org $85AF75
Sprite_6C_MirrorPortal:
jsl OWMirrorSpriteDisable ; LDA $7EF3CA
org $85AF88
jsl OWMirrorSpriteSkipDraw : NOP ; LDA.w $0FC6 : CMP.b #$03
org $85AFDF
Sprite_6C_MirrorPortal_missing_mirror:
org $8ABFB6
jsl OWMirrorSpriteOnMap : NOP ; LDA.w $008A : CMP.b #$40
; whirlpool shuffle cross world change
org $82b3bd
jsl OWWhirlpoolUpdate ;JSL $02EA6C
org $82B44E
jsl OWWhirlpoolEnd ; STZ.b $11 : STZ.b $B0
; flute menu cancel
org $8ab7af ;LDA $F2 : ORA $F0 : AND #$C0
jml OWFluteCancel2 : nop
org $8ab90d ;JSL $02E99D
jsl OWFluteCancel
org $8ab816
JSL OWMapFluteCancelIcon
; allows Frog sprite to spawn in LW and also allows his friend to spawn in their house
org $868a76 ; < 30a76 - sprite_prep.asm:785 (LDA $7EF3CA : AND.w #$40)
lda.b IndoorsFlag : eor.b #1 : nop #2
; allows Frog to be accepted at Blacksmith
org $86b3ee ; < 333ee - sprite_smithy_bros.asm:347 (LDA $7EF3CC : CMP.b #$08 : BEQ .no_returning_smithy_tagalong)
jsl OWSmithAccept : nop #2
db #$b0 ; BCS to replace BEQ
; load Stumpy per screen's original world, not current world flag
org $86907f ; < 3107f - sprite_prep.asm:2170 (LDA $7EF3CA)
lda.b OverworldIndex : and.b #$40
; override Link speed with Old Man following
org $89a32e ; < bank_09.asm:7457 (LDA.b #$0C : STA.b $5E)
jsl OWOldManSpeed
; Dark Bonk Rocks Rain Sequence Guards (allowing Tile Swap on Dark Bonk Rocks)
;org $89c957 ; <- 4c957
;dw #$cb5f ; matches value on Central Bonk Rocks screen
; override world check when viewing overworld (incl. title screen portion)
org $8aba6c ; < ? - Bank0a.asm:474 ()
jsl OWMapWorldCheck16 : nop
; Mixed Overworld Map
org $8ABA99
WorldMap_LoadDarkWorldMap:
LDA.b GameMode : CMP.b #$14 ; attract module
BEQ .vanilla_light
LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BNE .mixed
LDA.b OverworldIndex : AND.b #$40
BEQ .vanilla_light
.mixed
PHB : PHK : PLB
JSL LoadMapDarkOrMixed
PLB
.vanilla_light ; $0ABAB5
;(replacing -> LDA $8A : AND.b #$40)
org $80d8c4 ; < ? - Bank00.asm:4068 ()
jsl OWWorldCheck
org $82aa36 ; < ? - Bank02.asm:6559 ()
jsl OWWorldCheck
org $82aeca ; < ? - Bank02.asm:7257 ()
jsl OWWorldCheck16 : nop
org $82b349 ; < ? - Bank02.asm:7902 ()
jsl OWWorldCheck
org $82c40a ; < ? - Bank02.asm:10547 ()
jsl OWWorldCheck
org $85afd9 ; < ? - sprite_warp_vortex.asm:60 ()
jsl OWWorldCheck
org $87a3f0 ; < ? - Bank07.asm:5772 () ; flute activation/use
jsl OWWorldCheck
org $87a967 ; < ? - Bank07.asm:6578 ()
jsl OWWorldCheck
org $87a9a1 ; < ? - Bank07.asm:6622 ()
jsl OWWorldCheck
org $87a9ed ; < ? - Bank07.asm:6677 ()
jsl OWWorldCheck
org $87aa34 ; < ? - Bank07.asm:6718 ()
jsl OWWorldCheck
org $88d408 ; < ? - ancilla_morph_poof.asm:48 ()
jsl OWWorldCheck
org $8bfeab ; < ? - Bank0b.asm:36 ()
jsl OWWorldCheck16 : nop
org $8cffb6 ; < ? - ?.asm ? ()
jsl OWWorldCheck16 : nop
org $8cffe8 ; < ? - ?.asm ? ()
jsl OWWorldCheck16 : nop
org $9beca2 ; < ? - palettes.asm:556 ()
jsl OWWorldCheck16 : nop
org $9bed95 ; < ? - palettes.asm:748 ()
jsl OWWorldCheck16 : nop
org $82B16C ; LDA $8A : AND #$3F : ORA 7EF3CA
JSL OWApplyWorld : BRA + : NOP #2 : +
org $89C3C4
jsl OWBonkDropPrepSprite : nop #2
org $89C801
jsl OWBonkDropPrepSprite : nop #2
org $86D052
jsl OWBonkDropSparkle
org $86AD49
jsl OWBonkDropsOverworld : nop
org $9EDE6A
jsl OWBonkDropSparkle : BNE GoldBee_Dormant_exit
jsl OWBonkDropsUnderworld : bra +
GoldBee_SpawnSelf_SetProperties:
phb : lda.b #$1E : pha : plb ; switch to bank 1E
jsr GoldBee_SpawnSelf+12
plb : rtl
nop #2
+
;Code
org $aa8800
OWTransitionDirection:
dw 3, 2, 1, 0 ; $02 after $02A932
OWEdgeDataOffset:
dw OWSouthEdges, OWEastEdges, OWSouthEdges
OWCoordIndex: ; Horizontal 1st
db 2, 2, 0, 0 ; Coordinate Index $20-$23
OWOppCoordIndex: ; Horizontal 1st
db 0, 0, 2, 2 ; Coordinate Index $20-$23
OWBGIndex: ; Horizontal 1st
db 0, 0, 6, 6 ; BG Scroll Index $e0-$eb
OWOppBGIndex: ; Horizontal 1st
db 6, 6, 0, 0 ; BG Scroll Index $e0-$eb
OWCameraIndex: ; Horizontal 1st
db 4, 4, 0, 0 ; Camera Index $0618-$61f
OWOppCameraIndex: ; Horizontal 1st
db 0, 0, 4, 4 ; Camera Index $0618-$61f
OWOppSlotOffset: ; Amount to offset OW Slot
db 8, -8, 1, -1 ; OW Slot x2 $700
OWOppDirectionOffset: ; Amount to offset coord calc
db $10, $f0, $02, $fe
OWCameraRangeIndex:
db 2, 2, 0, 0 ; For OWCameraRange
OWCameraRange:
dw $011E, $0100 ; Length of the range the camera can move on small screens
OWAutoWalk:
db $04, $08, $01, $02
DivideByTwoPreserveSign:
{
asl : php : ror : plp : ror : rtl
}
OWWorldCheck:
{
phx
ldx.b OverworldIndex : lda.l OWTileWorldAssoc,x
plx : and.b #$ff : rtl
}
OWWorldCheck16:
{
phx
ldx.b OverworldIndex : lda.l OWTileWorldAssoc,x
plx : and.w #$00ff : rtl
}
OWMapWorldCheck16:
{
lda.b GameMode : cmp.w #$0014 : beq .return ; attract module, return with Z flag cleared
jsl OWWorldCheck16
.return
rtl
}
OWApplyWorld:
{
LDX.b OverworldIndex
.fromScreen
LDA.l OWTileWorldAssoc,X : CMP.l CurrentWorld : BEQ .keepWorld ; if dest screen mismatches the current world
TXA : EOR.b #$40 : RTL
.keepWorld
TXA : RTL
}
OWWhirlpoolUpdate:
{
jsl FindPartnerWhirlpoolExit ; what we wrote over
ldx.b OverworldIndex : ldy.b #$03 : jsr OWWorldTerrainUpdate
rtl
}
OWWhirlpoolEnd:
{
STZ.b SubSubModule ; what we wrote over
LDA.w RandoOverworldForceTrans : BEQ .normal
LDA.b #$3C : STA.w SFX2 ; play error sound before forced transition
RTL
.normal
STZ.b GameSubMode ; end whirlpool transition
RTL
}
OWDestroyItemSprites:
{
PHX : LDX.b #$0F
.nextSprite
LDA.w SpriteTypeTable,X
CMP.b #$D8 : BCC .continue
CMP.b #$EC : BCS .continue
.killSprite ; need to kill sprites from D8 to EB on screen transition
STZ.w SpriteAITable,X
.continue
DEX : BPL .nextSprite
PLX : RTL
}
OWMirrorSpriteOnMap:
{
JSL OWWorldCheck
CMP.b #$40 ; part of what we wrote over
RTL
}
OWMirrorSpriteDisable:
{
LDA.b GameMode : CMP.b #$0F : BNE + ; avoid rare freeze during mirror superbunny
PLA : PLA : PLA : JML Sprite_6C_MirrorPortal_missing_mirror
+
lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .vanilla
lda.l InvertedMode : beq +
lda.b #$40
+ rtl
.vanilla
lda.l CurrentWorld ; what we wrote over
rtl
}
OWMirrorSpriteSkipDraw:
{
lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .vanilla
lda.l InvertedMode : beq +
lda.l CurrentWorld : eor.b #$40
bra ++
+ lda.l CurrentWorld : ++ beq .vanilla
stz.w SpriteMovement,x ; disables collision
sec : rtl
.vanilla
LDA.w GfxChrHalfSlotVerify : CMP.b #$03 ; what we wrote over
RTL
}
OWLightWorldOrCrossed:
{
lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq ++
lda.l InvertedMode : beq +
lda.b #$40
+ rtl
++ jsl OWWorldCheck : rtl
}
OWFluteCancel:
{
lda.l OWFlags+1 : and.b #$01 : bne +
jsl FluteMenu_LoadTransport : rtl
+ lda.w RandoOverworldTargetEdge : bne +
jsl FluteMenu_LoadTransport
+ stz.w RandoOverworldTargetEdge : rtl
}
OWFluteCancel2:
{
lda.b Joy1B_All : ora.b Joy1A_All : and.b #$c0 : bne +
jml FluteMenu_HandleSelection_NoSelection
+ inc.w SubModuleInterface
lda.l OWFlags+1 : and.b #$01 : beq +
lda.b Joy1B_All : cmp.b #$40 : bne +
lda.b #$01 : sta.w RandoOverworldTargetEdge
+ rtl
}
OWMapFluteCancelIcon:
{
STA.b Scrap0B : LDX.b #$10 ; what we wrote over
LDA.l OWFlags+1 : AND.b #$01 : BEQ .return
LDA.b GameSubMode : CMP.b #$0A : BNE .return
LDA.b FrameCounter : AND.b #$10 : BNE .return
LDA.b #$7E : STA.b Scrap0D
LDA.b #$34 : STA.b Scrap0C
STZ.b Scrap0B
LDA.b Scrap0E : CLC : ADC.b #$04 : STA.b Scrap0E
LDA.b Scrap0F : CLC : ADC.b #$04 : STA.b Scrap0F
.return
RTL
}
OWSmithAccept:
{
lda.l FollowerIndicator : cmp.b #$07 : beq +
cmp.b #$08 : beq +
clc : rtl
+ sec : rtl
}
OWOldManSpeed:
{
lda.b IndoorsFlag : beq .outdoors
lda.b RoomIndex : and.b #$fe : cmp.b #$f0 : beq .vanilla ; if in cave where you find Old Man
bra .normalspeed
.outdoors
lda.b OverworldIndex : cmp.b #$03 : beq .vanilla ; if on WDM screen
.normalspeed
lda.b LinkSpeed : cmp.b #$0c : rtl
stz.b LinkSpeed : rtl
.vanilla
lda.b #$0c : sta.b LinkSpeed ; what we wrote over
rtl
}
OWMarkVisited:
{
LDX.b OverworldIndex : STZ.w $0412 ; what we wrote over
LDA.b GameMode : CMP.b #$14 : BCS .return
LDA.l OverworldEventDataWRAM,X
ORA.b #$80 : STA.l OverworldEventDataWRAM,X
.return
RTL
}
LoadMapDarkOrMixed:
{
CMP.b #!FLAG_OW_MIXED : REP #$30 : BEQ .mixed
LDX.w #$03FE ; draw vanilla Dark World (what we wrote over)
.copy_next
LDA.w WorldMap_DarkWorldTilemap,X : STA.w GFXStripes,X
DEX : DEX : BPL .copy_next
BRL .end
.mixed
LDX.b OverworldIndex
LDA.l OWTileWorldAssoc,X
STA.b Scrap00
LDY.w #$139C
LDX.w #$003F
.next_screen
PHX
LDA.l OWTileWorldAssoc,X
EOR.b Scrap00
AND.w #$0040
BEQ .light
TYX : BRA .copy_screen
.light
TXA : AND.w #$0024 : LSR : TAX
TYA : SEC : SBC.l LWQuadrantOffsets,X
TYX : TAY
.copy_screen ; more efficient to have X on the right side
LDA.w $C739+$00,Y : STA.b $00,X
LDA.w $C739+$02,Y : STA.b $02,X
LDA.w $C739+$20,Y : STA.b $20,X
LDA.w $C739+$22,Y : STA.b $22,X
LDA.w $C739+$40,Y : STA.b $40,X
LDA.w $C739+$42,Y : STA.b $42,X
LDA.w $C739+$60,Y : STA.b $60,X
LDA.w $C739+$62,Y : STA.b $62,X
TXY : PLX
DEY : DEY : DEY : DEY ; move one screen left
TXA : AND.w #$0007 : BNE .same_row
TYA : SEC : SBC.w #$0060 : TAY ; move one screen row up
.same_row
DEX
BPL .next_screen
.end
SEP #$30
LDA.b #$15 : STA.b NMIINCR ; what we wrote over
RTL
LWQuadrantOffsets:
dw $1000-$0210 ; top left
dw $0C00-$01F0 ; top right
dw 0,0,0,0,0,0
dw $0800+$01F0 ; bottom left
dw $0400+$0210 ; bottom right
}
OWBonkDropPrepSprite:
{
LDA.b IndoorsFlag : BEQ +
LDA.w $0FB5 ; what we wrote over
PHA
BRA .continue
+
STZ.w SpriteLayer,X : STZ.w SpriteAux,X ; what we wrote over
PHA
.continue
LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BEQ .return
+ LDA.w SpriteTypeTable,X : CMP.b #$D9 : BNE +
LDA.b #$03 : STA.w SpriteLayer,X
BRA .prep
+ CMP.b #$B2 : BEQ .prep
PLA : RTL
.prep
STZ.w SprRedrawFlag,X
PHB : PHK : PLB : PHY
TXY : JSR OWBonkDropLookup : BCC .done
; found match ; X = rec + 1
INX : LDA.w OWBonkPrizeData,X : PHA
JSR OWBonkDropCollected : PLA : BCC .done
TYX : LDA.b #$01 : STA.w SprRedrawFlag,X
.done
TYX : PLY : PLB
.return
PLA : RTL
}
OWBonkDropSparkle:
{
LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BEQ .nosparkle
LDA.w $0E90,X : BEQ .nosparkle
LDA.w SprRedrawFlag,X : BNE .nosparkle
LDA.b GameMode : CMP.b #$0E : BEQ .nosparkle
LDA.b LinkState : CMP.b #$08 : BCC + : CMP.b #$0A+1 : BCS + : BRA .nosparkle : + ; skip if we're mid-medallion
JSL Sprite_SpawnSparkleGarnish
; move sparkle down 1 tile
PHX : TYX : PLY
LDA.l $7FF81E,X : CLC : ADC.b #$10 : STA.l $7FF81E,X
LDA.l $7FF85A,X : ADC.b #$00 : STA.l $7FF85A,X
PHY : TXY : PLX
.nosparkle
LDA.w SpriteTypeTable,X : CMP.b #$D9 : BEQ .greenrupee
CMP.b #$B2 : BEQ .goodbee
RTL
.goodbee
LDA.w $0E90,X ; what we wrote over
RTL
.greenrupee
JSL Sprite_DrawRippleIfInWater ; what we wrote over
RTL
}
OWBonkDropsUnderworld:
{
LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BNE .shuffled
.vanilla ; what we wrote over
STZ.w SpriteAITable,X
LDA.l BottleContentsOne : ORA.l BottleContentsTwo
ORA.l BottleContentsThree : ORA.l BottleContentsFour
RTL
.shuffled
LDA.w SpriteAITable,X : BNE +
BRA .return+1
+ PHY : TXY
JSL OWBonkDrops
.return
PLY
LDA.b #$08 ; makes original good bee not spawn
RTL
}
OWBonkDropsOverworld:
{
LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BNE .shuffled
BRA .vanilla
.shuffled
LDA.w SpriteAITable,Y : BNE +
BRA .vanilla
+ LDA.w SpriteTypeTable,Y : CMP.b #$D9 : BEQ +
BRA .vanilla+3
+
LDA.b #$00 : STA.w SpriteLayer,Y ; restore proper layer
JSL OWBonkDrops
.vanilla
LDA.w SpriteTypeTable,Y : CMP.b #$D8 ; what we wrote over
RTL
}
OWBonkDrops:
{
PHB : PHK : PLB
LDA.b IndoorsFlag : BEQ +
LDX.b #((UWBonkPrizeData-OWBonkPrizeData)+1)
BRA .found_match
+
JSR OWBonkDropLookup : BCS .found_match
JMP .return+2
.found_match
INX : LDA.w OWBonkPrizeData,X : PHX : PHA ; S = FlagBitmask, X (row + 2)
JSR OWBonkDropCollected : PHA : BCS .load_item_and_mw ; S = Collected, FlagBitmask, X (row + 2)
LDA.b #$1B : STA.w SFX3 ; JSL Sound_SetSfx3PanLong ; seems that when you bonk, there is a pending bonk sfx, so we clear that out and replace with reveal secret sfx
; JSLSpriteSFX_QueueSFX3WithPan
.load_item_and_mw
LDA.b 3,S : TAX : INX : LDA.w OWBonkPrizeData,X
PHA : INX : LDA.w OWBonkPrizeData,X : BEQ +
; multiworld item
DEX : PLA ; A = item id; X = row + 3
JMP .spawn_item
+ DEX : PLA ; A = item id; X = row + 3
.determine_type ; A = item id; X = row + 3; S = Collected, FlagBitmask, X (row + 2)
CMP.b #$D0 : BNE +
LDA.b #$79 : JMP .sprite_transform ; transform to bees
+ CMP.b #$42 : BNE +
JSL Sprite_TransmuteToBomb ; transform a heart to bomb, vanilla behavior
JMP .mark_collected
+ CMP.b #$34 : BNE +
LDA.b #$D9 : JMP .sprite_transform ; transform to single rupee
+ CMP.b #$35 : BNE +
LDA.b #$DA : JMP .sprite_transform ; transform to blue rupee
+ CMP.b #$36 : BNE +
LDA.b #$DB : BRA .sprite_transform ; transform to red rupee
+ CMP.b #$27 : BNE +
LDA.b #$DC : BRA .sprite_transform ; transform to 1 bomb
+ CMP.b #$28 : BNE +
LDA.b #$DD : BRA .sprite_transform ; transform to 4 bombs
+ CMP.b #$31 : BNE +
LDA.b #$DE : BRA .sprite_transform ; transform to 8 bombs
+ CMP.b #$45 : BNE +
LDA.b #$DF : BRA .sprite_transform ; transform to small magic
+ CMP.b #$D4 : BNE +
LDA.b #$E0 : BRA .sprite_transform ; transform to big magic
+ CMP.b #$D6 : BNE +
LDA.b #$79 : JSL OWBonkSpritePrep
JSL GoldBee_SpawnSelf_SetProperties ; transform to good bee
BRA .mark_collected
+ CMP.b #$44 : BNE +
LDA.b #$E2 : BRA .sprite_transform ; transform to 10 arrows
+ CMP.b #$D1 : BNE +
LDA.b #$AC : BRA .sprite_transform ; transform to apples
+ CMP.b #$D2 : BNE +
LDA.b #$E3 : BRA .sprite_transform ; transform to fairy
+ CMP.b #$D3 : BNE .spawn_item
INX : INX : LDA.w OWBonkPrizeData,X ; X = row + 5
CLC : ADC.b #$08 : PHA
LDA.w SpritePosYLow,Y : SEC : SBC.b 1,S : STA.w SpritePosYLow,Y
LDA.w SpritePosYHigh,Y : SBC.b #$00 : STA.w SpritePosYHigh,Y : PLX
LDA.b #$0B ; BRA .sprite_transform ; transform to chicken
.sprite_transform
JSL OWBonkSpritePrep
.mark_collected ; S = Collected, FlagBitmask, X (row + 2)
PLA : BNE + ; S = FlagBitmask, X (row + 2)
TYX : JSL Sprite_IsOnscreen : BCC +
LDA.b IndoorsFlag : BEQ ++
LDA.l RoomDataWRAM[$0120].high : ORA.b 1,S : STA.l RoomDataWRAM[$0120].high
LDA.w $0400 : ORA.b 1,S : STA.w $0400
BRA .increment_collection
++
LDA.b OverworldIndex
BIT.b #$40 : BEQ +
LDA.l ProgressIndicator : CMP.b #$02
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
++
+
TAX : LDA.l OverworldEventDataWRAM,X : ORA.b 1,S : STA.l OverworldEventDataWRAM,X
.increment_collection
REP #$20
LDA.l TotalItemCounter : INC : STA.l TotalItemCounter
INC.w UpdateHUDFlag
SEP #$20
+ BRA .return
; spawn itemget item
.spawn_item ; A = item id ; Y = bonk sprite slot ; S = Collected, FlagBitmask, X (row + 2)
PLX : BEQ + : LDA.b #$00 : STA.w SpriteAITable,Y : BRA .return ; S = FlagBitmask, X (row + 2)
+ PHA
LDA.b #$EB
JSL Sprite_SpawnDynamically+15 ; +15 to skip finding a new slot, use existing sprite
PLA : STA.w SprSourceItemId, Y
PHX : TYX : PLY
JSL RequestStandingItemVRAMSlot
PHY : TXY : PLX
; affects the rate the item moves in the Y/X direction
LDA.b #$00 : STA.w SpriteVelocityY,Y
LDA.b #$0A : STA.w SpriteVelocityX,Y
LDA.b #$1A : STA.w SpriteVelocityZ,Y ; amount of force (gives height to the arch)
LDA.b #$FF : STA.w EnemyStunTimer,Y ; stun timer
LDA.b #$30 : STA.w SpriteTimerE,Y ; aux delay timer 4 ?? dunno what that means
LDA.b #$00 : STA.w SpriteLayer,Y ; layer the sprite is on
LDA.b IndoorsFlag : BEQ +
; sets the tile type that is underneath the sprite, water
TYX : LDA.b #$09 : STA.l $7FF9C2,X ; TODO: Figure out how to get the game to set this
+
; sets bitmask flag, uses free RAM
PLA : STA.w SpriteSpawnStep,Y ; S = X (row + 2)
; sets MW player
PLX : INX : INX
LDA.w OWBonkPrizeData,X : STA.w SprItemMWPlayer,Y
; determines the initial spawn point of item
INX
LDA.w SpritePosYLow,Y : SEC : SBC.w OWBonkPrizeData,X : STA.w SpritePosYLow,Y
LDA.w SpritePosYHigh,Y : SBC.b #$00 : STA.w SpritePosYHigh,Y
BRA .return+2
.return
PLA : PLA : PLB
RTL
}
; Y = sprite slot; returns X = row + 1
OWBonkDropLookup:
{
; loop thru rando bonk table to find match
LDA.b OverworldIndex
BIT.b #$40 : BEQ +
LDA.l ProgressIndicator : AND.b #$FF : CMP.b #$02
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
++
+
LDX.b #((UWBonkPrizeData-OWBonkPrizeData)-sizeof(OWBonkPrizeTable)) ; 41 bonk items, 6 bytes each
- CMP.w OWBonkPrizeData,X : BNE +
INX
PHA
LDA.w SpritePosXLow,Y : LSR A : LSR A : LSR A : LSR A
EOR.w SpritePosYLow,Y : CMP.w OWBonkPrizeData,X : BNE ++ ; X = row + 1
PLA : SEC : RTS
++ DEX : PLA
+ CPX.b #$00 : BNE +
CLC : RTS
+ DEX : DEX : DEX : DEX : DEX : DEX : BRA -
}
; S = FlagBitmask ; returns SEC if collected
OWBonkDropCollected:
{
; check if collected
LDA.b IndoorsFlag : BEQ +
LDA.l RoomDataWRAM[$0120].high : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
SEC : RTS
+
LDA.b OverworldIndex
BIT.b #$40 : BEQ +
LDA.l ProgressIndicator : CMP.b #$02
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
++
+
TAX
LDA.l OverworldEventDataWRAM,X : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
SEC : RTS
.return
CLC : RTS
}
; A = SprItemReceipt, Y = Sprite Slot Index, X = free/overwritten
OWBonkSpritePrep:
{
STA.w SpriteTypeTable,Y
TYX : JSL SpritePrep_LoadProperties
BEQ +
; these are sprite properties that make it fall out of the tree to the east
LDA.b #$30 : STA.w SpriteVelocityZ,Y ; amount of force (related to speed)
LDA.b #$10 : STA.w SpriteVelocityX,Y ; eastward rate of speed
LDA.b #$FF : STA.w EnemyStunTimer,Y ; expiration timer
+ RTL
}
org $aa9000
OWDetectEdgeTransition:
{
JSL OWDestroyItemSprites
STZ.w RandoOverworldWalkDist
LDA.l OWMode : ORA.l OWMode+1 : BEQ .vanilla
JSR OWShuffle
LDA.w RandoOverworldTargetEdge : BMI .special
.vanilla
REP #$31 : LDX.b Scrap02 : LDA.b OverworldMap16Buffer ; what we wrote over
RTL
.special
REP #$30
AND.w #$0003 : TAY : ASL : TAX
LDA.w #$007F : STA.w RandoOverworldTargetEdge
JSR OWLoadSpecialArea
SEC
RTL
}
OWDetectSpecialTransition:
{
STZ.w RandoOverworldWalkDist
LDA.l OWMode : BEQ .normal
TXA : AND.w #$0002 : LSR
STA.w RandoOverworldTerrain
LDA.l OWSpecialDestIndex,X : BIT.w #$0080 : BEQ .switch_to_edge
AND.w #$0003 : TAY : ASL : TAX
.normal
JSR OWLoadSpecialArea
.return
RTL
.switch_to_edge
STA.w RandoOverworldTargetEdge
LDA.l OWEdgeDataOffset,X : STA.w RandoOverworldEdgeAddr
PLA : SEP #$30 : PLA ; delete 3 bytes from stack
JSL Link_CheckForEdgeScreenTransition : BCS .return ; Link_CheckForEdgeScreenTransition
LDA.l Overworld_CheckForSpecialOverworldTrigger_Direction,X : STA.b Scrap00 : CMP.b #$08 : BNE .hobo
LSR : STA.b LinkPosY : STZ.b BG2V ; move Link and camera to edge
LDA.b #$06 : STA.b Scrap02
STZ.w TransitionDirection
BRA .continue
.hobo
STA.b Scrap02 : STA.w TransitionDirection
ASL : STA.b LinkPosX : STZ.b BG2H ; move Link and camera to edge
LDA.b #$0A : STA.b LinkPosX+1 : STA.b BG2H+1
.continue
STZ.b Scrap03
; copied from DeleteCertainAncillaeStopDashing at $028A0E
JSL Ancilla_TerminateSelectInteractives
LDA.w LinkDashing : BEQ .not_dashing
STZ.b LinkJumping : STZ.b LinkIncapacitatedTimer
LDA.b #$FF : STA.b LinkRecoilZ : STA.b $C7
STZ.b $3D : STZ.b LinkSpeed : STZ.w $032B : STZ.w LinkDashing : STZ.b LinkState
.not_dashing
PLA : REP #$31 : PLA ; delete 3 bytes from stack
LDX.b Scrap02
LDA.b OverworldMap16Buffer
JML OverworldHandleTransitions_SpecialTrigger+6
}
OWEdgeTransition:
{
LDA.l OWMode : ORA.l OWMode+1 : BEQ .unshuffled
LDY.w RandoOverworldTargetEdge : STZ.w RandoOverworldTargetEdge
CPY.b #$7F : BEQ .unshuffled
REP #$10
LDX.w RandoOverworldEdgeAddr
PHB : PHK : PLB
JSR OWNewDestination
PLB
SEP #$30
RTL
.unshuffled
LDA.l Overworld_ActualScreenID,X : ORA.l CurrentWorld ; what we wrote over
TAX : LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BEQ .vanilla
JML OWApplyWorld_fromScreen
.vanilla
TXA : RTL
}
OWSpecialExit:
{
LDA.l OWMode : ORA.l OWMode+1 : BEQ .vanilla
PHY
LDY.b #$00
LDA.w TransitionDirection : LSR : BNE +
LDY.w RandoOverworldTerrain : BRA ++
+
LDA.w RandoOverworldTerrain : BNE ++
LDY.b #$02
++
JSR OWWorldTerrainUpdate
PLY
.vanilla
LDA.l $7EFD40,X ; what we wrote over
RTL
}
OWShuffle:
{
;determine direction of edge transition
phx : lsr.w OverworldSlotPosition
tyx : lda.l OWTransitionDirection,X : sta.w TransitionDirection
.setOWID
;look up transitions in current area in table OWEdgeOffsets
;offset is (8bytes * OW Slot ID) + (2bytes * direction)
asl : rep #$20 : and.w #$00ff : pha : sep #$20 ;2 bytes per direction
ldx.b OverworldIndex : lda.l OWTileWorldAssoc,X : eor.l CurrentWorld : beq +
; fake world, will treat this OW area as opposite world
txa : eor.b #$40 : tax
+ txa : and.b #$40 : !ADD.w OverworldSlotPosition : rep #$30 : and.w #$00ff : asl #3
adc.b 1,S : tax
asl.w OverworldSlotPosition : pla
;x = offset to edgeoffsets table
sep #$20 : lda.l OWEdgeOffsets,x : and.b #$ff : beq .noTransition : pha ;get number of transitions
;s1 = number of transitions left to check
inx : lda.l OWEdgeOffsets,x ;record id of first transition in table
;multiply ^ by 16, 16bytes per record
sta.w CPUMULTA : lda.b #16 : sta.w CPUMULTB ;wait 8 cycles
pla ;a = number of trans
rep #$20
and.w #$00ff
ldx.w CPUPRODUCT ;x = offset to first record
.nextTransition
pha
jsr OWSearchTransition_entry : bcs .newDestination
txa : !ADD.w #$0010 : tax
pla : dec : bne .nextTransition : bra .noTransition
.newDestination
pla : sep #$30 : plx : rts
.noTransition
sep #$30 : plx
lda.b #$7f : sta.w RandoOverworldTargetEdge
.return
rts
}
OWSearchTransition:
{
.exitloop ; moved here because of branch distance
clc : rts
.entry
;A-16 XY-16
lda.w TransitionDirection : bne + ;north
lda.l OWNorthEdges,x : dec
cmp.b LinkPosX : !BGE .exitloop
lda.l OWNorthEdges+2,x : cmp.b LinkPosX : !BLT .exitloop
;MATCH
lda.l OWNorthEdges+14,x : tay ;y = record id of dest
lda.l OWNorthEdges+12,x ;a = current terrain
ldx.w #OWSouthEdges ;x = address of table
bra .matchfound
+ dec : bne + ;south
lda.l OWSouthEdges,x : dec
cmp.b LinkPosX : !BGE .exitloop
lda.l OWSouthEdges+2,x : cmp.b LinkPosX : !BLT .exitloop
;MATCH
lda.l OWSouthEdges+14,x : tay ;y = record id of dest
lda.l OWSouthEdges+12,x ;a = current terrain
ldx.w #OWNorthEdges ;x = address of table
bra .matchfound
+ dec : bne + ; west
lda.l OWWestEdges,x : dec
cmp.b LinkPosY : !BGE .exitloop
lda.l OWWestEdges+2,x : cmp.b LinkPosY : !BLT .exitloop
;MATCH
lda.l OWWestEdges+14,x : tay ;y = record id of dest
lda.l OWWestEdges+12,x ;a = current terrain
ldx.w #OWEastEdges ;x = address of table
bra .matchfound
+ lda.l OWEastEdges,x : dec ;east
cmp.b LinkPosY : !BGE .exitloop
lda.l OWEastEdges+2,x : cmp.b LinkPosY : !BLT .exitloop
;MATCH
lda.l OWEastEdges+14,x : tay ;y = record id of dest
lda.l OWEastEdges+12,x ;a = current terrain
ldx.w #OWWestEdges ;x = address of table
.matchfound
stx.w RandoOverworldEdgeAddr : sty.w RandoOverworldTargetEdge : sta.w RandoOverworldTerrain : sec : rts
plx : pla : pea.w $0001 : phx
sec : rts
}
OWNewDestination:
{
tya : sta.w CPUMULTA : lda.b #16 : sta.w CPUMULTB ;wait 8 cycles
rep #$20 : txa : nop : !ADD.w CPUPRODUCT : tax ;a = offset to dest record
lda.w $0008,x : sta.b Scrap04 ;save dest OW slot/ID
ldy.b LinkPosY : lda.w TransitionDirection : dec #2 : bpl + : ldy.b LinkPosX : + sty.b Scrap06
;;22 e0 e2 61c 61e - X
;;20 e6 e8 618 61a - Y
;keep current position if within incoming gap
lda.w $0000,x : and.w #$01ff : pha : lda.w $0002,x : and.w #$01ff : pha
LDA.l OWMode : AND.w #$0007 : BEQ .noLayoutShuffle ;temporary fix until VRAM issues are solved
lda.w $0006,x : sta.b Scrap06 ;set coord
lda.w $000a,x : sta.b OverworldMap16Buffer ;VRAM
tya : and.w #$01ff : cmp.b 3,s : !BLT .adjustMainAxis
dec : cmp.b 1,s : !BGE .adjustMainAxis
inc : pha : lda.b Scrap06 : and.w #$fe00 : !ADD.b 1,s : sta.b Scrap06 : pla
; adjust and set other VRAM addresses
lda.w $0006,x : pha : lda.b Scrap06 : !SUB 1,s
jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : pha ; number of tiles
lda.w TransitionDirection : dec #2 : bmi +
pla : pea.w $0000 : bra ++ ;pla : asl #7 : pha : bra ++ ; y-axis shifts VRAM by increments of 0x80 (disabled for now)
+ pla : asl : pha ; x-axis shifts VRAM by increments of 0x02
++ lda.b OverworldMap16Buffer : !ADD.b 1,s : sta.b OverworldMap16Buffer : pla : pla
.adjustMainAxis
LDA.b OverworldMap16Buffer : SEC : SBC.w #$0400 : AND.w #$0F00 : ASL : XBA : STA.b OverworldTilemapIndexY ; vram
LDA.b OverworldMap16Buffer : SEC : SBC.w #$0010 : AND.w #$003E : LSR : STA.b OverworldTilemapIndexX
.noLayoutShuffle
LDA.w $000F,X : AND.w #$00FF : STA.w RandoOverworldWalkDist ; position to walk to after transition (if non-zero)
LDY.w #$0000
LDA.w $000C,X : AND.w #$0001 : BEQ + ; check if going to water transition
LDA.w RandoOverworldTerrain : AND.w #$0001 : BNE ++ ; check if coming from water transition
INY : BRA ++
+
LDA.w RandoOverworldTerrain : BEQ ++ ; check if coming from water transition
LDY.w #$0002
++
STY.b Scrap08
pla : pla : sep #$10 : ldy.w TransitionDirection
ldx.w OWCoordIndex,y : lda.b LinkPosY,x : and.w #$fe00 : pha
lda.b LinkPosY,x : and.w #$01ff : pha ;s1 = relative cur, s3 = ow cur
lda.b Scrap06 : and.w #$fe00 : !SUB.b 3,s : pha ;set coord, s1 = ow diff, s3 = relative cur, s5 = ow cur
lda.b Scrap06 : and.w #$01ff : !SUB.b 3,s : pha ;s1 = rel diff, s3 = ow diff, s5 = relative cur, s7 = ow cur
lda.b Scrap06 : sta.b LinkPosY,x : and.w #$fe00 : sta.b Scrap06 ;set coord
ldx.w OWBGIndex,y : lda.b BG2H,x : !ADD.b 1,s : adc.b 3,s : sta.b BG2H,x
ldx.w OWCameraIndex,y : lda.w CameraScrollN,x : !ADD.b 1,s : adc.b 3,s : sta.w CameraScrollN,x
ldx.w OWCameraIndex,y : lda.w CameraScrollS,x : !ADD.b 1,s : adc.b 3,s : sta.w CameraScrollS,x
pla : jsl DivideByTwoPreserveSign : pha
ldx.w OWBGIndex,y : lda.b BG1H,x : !ADD.b 1,s : sta.b BG1H,x : pla
ldx.w OWBGIndex,y : lda.b BG1H,x : !ADD.b 1,s : sta.b BG1H,x : pla
pla : pla
;fix camera unlock
lda.b BG2H,x : !SUB.b Scrap06 : bpl +
pha : lda.b Scrap06 : sta.b BG2H,x
ldx.w OWCameraIndex,y : lda.w CameraScrollN,x : !SUB.b 1,s : sta.w CameraScrollN,x
lda.w CameraScrollS,x : !SUB.b 1,s : sta.w CameraScrollS,x : pla
bra .adjustOppositeAxis
+ lda.b Scrap06 : ldx.w OWCameraRangeIndex,y : !ADD.w OWCameraRange,x : sta.b Scrap06
ldx.w OWBGIndex,y : !SUB.b BG2H,x : bcs .adjustOppositeAxis
pha : lda.b Scrap06 : sta.b BG2H,x
ldx.w OWCameraIndex,y : lda.w CameraScrollN,x : !ADD.b 1,s : sta.w CameraScrollN,x
lda.w CameraScrollS,x : !ADD.b 1,s : sta.w CameraScrollS,x : pla
.adjustOppositeAxis
;opposite coord stuff
rep #$30 : lda.w OWOppDirectionOffset,y : and.w #$00ff : bit.w #$0080 : beq +
ora.w #$ff00 ;extend 8-bit negative to 16-bit negative
+ pha : cpy.w #$0002 : lda.w OverworldSlotPosition : !BGE +
and.w #$00f0 : pha : lda.b Scrap04 : asl : and.w #$0070 : !SUB.b 1,s : tax : pla : txa
!ADD.b 1,s : tax : pla : txa : asl : asl : asl : asl : asl : pha : bra ++
+ and.w #$000f : pha : lda.b Scrap04 : asl : and.w #$000f : !SUB.b 1,s : !ADD.b 3,s
sep #$10 : tax : phx : ldx.b #$0 : phx : rep #$10 : pla : plx : plx : pha
++ sep #$10 : ldx.w OWOppCoordIndex,y : lda.b LinkPosY,x : !ADD.b 1,s : sta.b LinkPosY,x ;set coord
ldx.w OWOppBGIndex,y : lda.b BG2H,x : !ADD.b 1,s : sta.b BG2H,x
ldx.w OWOppCameraIndex,y : lda.w CameraScrollN,x : !ADD.b 1,s : sta.w CameraScrollN,x
ldx.w OWOppCameraIndex,y : lda.w CameraScrollS,x : !ADD.b 1,s : sta.w CameraScrollS,x
ldx.w OWOppBGIndex,y : lda.b BG1H,x : !ADD.b 1,s : sta.b BG1H,x
lda.w TransitionDirection : asl : tax : lda.w CameraTargetN,x : !ADD.b 1,s : sta.w CameraTargetN,x : pla
sep #$30 : lda.b Scrap04 : and.b #$3f : !ADD.w OWOppSlotOffset,y : asl : sta.w OverworldSlotPosition
; crossed OW shuffle and terrain
ldx.b Scrap05 : ldy.b Scrap08 : jsr OWWorldTerrainUpdate
ldx.b OverworldIndex : lda.b Scrap05 : sta.b OverworldIndex : stx.b Scrap05 ; $05 is prev screen id, $8a is dest screen
jsr OWGfxUpdate
lda.b OverworldIndex
rep #$30 : rts
}
OWLoadSpecialArea:
{
LDA.l Overworld_LoadSpecialOverworld_RoomId,X : STA.b RoomIndex
JSL Overworld_LoadSpecialOverworld ; sets M and X flags
TYX
LDY.b #$00
CPX.b #$01 : BNE + ; check if going to water transition
LDA.w RandoOverworldTerrain : BNE ++ ; check if coming from water transition
INY : BRA ++
+
LDA.w RandoOverworldTerrain : BEQ ++ ; check if coming from water transition
LDY.b #$02
++
LDA.l OWSpecialDestSlot,X : TAX
JSR OWWorldTerrainUpdate
.return
RTS
}
OWWorldTerrainUpdate: ; x = owid of destination screen, y = 1 for land to water, 2 for water to land, 3 for whirlpools and 0 else
{
LDA.l OWMode+1 : AND.b #!FLAG_OW_CROSSED : BEQ .not_crossed
LDA.l OWTileWorldAssoc,x : CMP.l CurrentWorld : BNE .crossed
.not_crossed
JMP .normal
.crossed
sta.l CurrentWorld ; change world
; moving mirror portal off screen when in DW
cmp.b #0 : beq + : lda.b #1
+ cmp.l InvertedMode : bne +
lda.w MirrorPortalPosXH : and.b #$0f : sta.w MirrorPortalPosXH : bra .playSfx ; bring portal back into position
+ lda.w MirrorPortalPosXH : ora.b #$40 : sta.w MirrorPortalPosXH ; move portal off screen
.playSfx
lda.b #$38 : sta.w SFX3 ; play sfx - #$3b is an alternative
; toggle bunny mode
lda.l MoonPearlEquipment : beq + : jmp .nobunny
+ lda.l InvertedMode : bne .inverted
lda.l CurrentWorld : bra +
.inverted lda.l CurrentWorld : eor.b #$40
+ and.b #$40 : beq .nobunny
LDA.w RandoOverworldForceTrans : BEQ + ; check if forced transition
CPY.b #$03 : BEQ ++
LDA.b #$17 : STA.b LinkState
LDA.b #$01 : STA.w BunnyFlag : STA.b BunnyFlagDP
LDA.w RandoOverworldForceTrans : JSR OWLoadGearPalettes : BRA .end_forced_edge
++ JSR OWLoadGearPalettes : BRA .end_forced_whirlpool
+
CPY.b #$01 : BEQ .auto ; check if going from land to water
CPY.b #$02 : BEQ .to_bunny_reset_swim ; bunny state if swimming to land
LDA.b LinkState : CMP.b #$04 : BNE .to_bunny ; check if swimming
.auto
PHX
LDA.b #$01
LDX.b LinkState : CPX.b #$04 : BNE +
INC
+
STA.w RandoOverworldForceTrans
CPY.b #$03 : BEQ .whirlpool
LDA.b #$01 : STA.w LinkDeepWater
LDX.w TransitionDirection
LDA.l OWAutoWalk,X : STA.b ForceMove
STZ.b LinkState
PLX
BRA .to_pseudo_bunny
.whirlpool
PLX : JMP OWLoadGearPalettes
.to_bunny_reset_swim
LDA.b LinkState : CMP.b #$04 : BNE .to_bunny ; check if swimming
JSL Link_ResetSwimmingState
STZ.w LinkDeepWater
.to_bunny
LDA.b #$17 : STA.b LinkState
.to_pseudo_bunny
LDA.b #$01 : STA.w BunnyFlag : STA.b BunnyFlagDP
JMP OWLoadGearPalettes
.nobunny
lda.b LinkState : cmp.b #$17 : bne + ; retain current state unless bunny
stz.b LinkState
+ stz.w BunnyFlag : stz.b BunnyFlagDP
.normal
LDA.w RandoOverworldForceTrans : BEQ .not_forced ; check if forced transition
CPY.b #$03 : BEQ .end_forced_whirlpool
.end_forced_edge
STZ.b ForceMove : STZ.w LinkDeepWater
.end_forced_whirlpool
STZ.w RandoOverworldForceTrans
CMP.b #$02 : BNE +
DEC : STA.w LinkDeepWater : STZ.w LinkSwimDirection
LDA.b #$04 : BRA .set_state
+
CMP.b #$03 : BNE ++
LDA.b #$17
.set_state
STA.b LinkState
++
RTS
.not_forced
CPY.b #$02 : BNE + ; check if going from water to land
LDA.b LinkState : CMP.b #$04 : BNE .return ; check if swimming
JSL Link_ResetSwimmingState
STZ.w LinkDeepWater
STZ.b LinkState
+
CPY.b #$01 : BNE .return ; check if going from land to water
LDA.b LinkState : CMP.b #$04 : BEQ .return ; check if swimming
LDA.b #$01 : STA.w LinkDeepWater
LDA.l FlippersEquipment : BEQ .no_flippers ; check if flippers obtained
LDA.b LinkState : CMP.b #$17 : BEQ .no_flippers ; check if bunny
LDA.b #$04 : STA.b LinkState : STZ.w LinkSwimDirection : RTS
.no_flippers
PHX
INC : STA.w RandoOverworldForceTrans
LDX.w TransitionDirection
LDA.l OWAutoWalk,X : STA.b ForceMove
PLX
LDA.b LinkState : CMP.b #$17 : BNE .return ; check if bunny
LDA.b #$03 : STA.w RandoOverworldForceTrans
STZ.b LinkState
.return
RTS
}
OWGfxUpdate:
{
REP #$20 : LDA.l OWMode : AND.w #$0207 : BEQ .is_only_mixed : SEP #$20
;;;;PLA : AND.b #$3F : BEQ .leaving_woods
LDA.b OverworldIndex : AND.b #$3F : BEQ .entering_woods
;LDA.b Scrap05 : JSL OWSkipPalettes : BCS .skip_palettes
LDA.b OverworldIndex : JSR OWDetermineScreensPaletteSet
CPX.w $0AB3 : BEQ .skip_palettes ; check if next screen's palette is different
LDA.b Scrap00 : PHA
JSL OverworldLoadScreensPaletteSet_long ; loading correct OW palette
PLA : STA.b Scrap00
.leaving_woods
.entering_woods
.is_only_mixed
.skip_palettes
SEP #$20
}
OWLoadGearPalettes:
{
PHX : PHY : LDA.b Scrap00 : PHA
LDA.w BunnyFlag : BEQ +
JSL LoadGearPalettes_bunny
BRA .return
+
JSL LoadGearPalettes_link
.return
PLA : STA.b Scrap00 : PLY : PLX
RTS
}
OWDetermineScreensPaletteSet: ; A = OWID to check
{
LDX.b #$02
PHA : AND.b #$3F
CMP.b #$03 : BEQ .death_mountain
CMP.b #$05 : BEQ .death_mountain
CMP.b #$07 : BEQ .death_mountain
LDX.b #$00
.death_mountain
PLA : PHX : TAX : LDA.l OWTileWorldAssoc,X : BEQ +
PLX : INX : RTS
+ PLX : RTS
}
OWSkipPalettes:
{
STA.b Scrap05 ; A = previous screen, also stored in $05
; only skip mosaic if OWR Layout or Crossed
PHP : REP #$20 : LDA.l OWMode : AND.w #$0207 : BEQ .vanilla : PLP
; checks to see if going to from any DM screens
;LDA.b Scrap05 : JSR OWDetermineScreensPaletteSet : TXA : AND.b #$FE : STA.b Scrap04
;LDA.b OverworldIndex : JSR OWDetermineScreensPaletteSet : TXA : AND.b #$FE
;CMP.b Scrap04 : BNE .skip_palettes
BRA .vanilla+1
.vanilla
PLP
LDA.b Scrap05 : AND.b #$3F : BEQ .skip_palettes ; what we
LDA.b OverworldIndex : AND.b #$BF : BNE .change_palettes ; wrote over, kinda
.skip_palettes
SEC : RTL ; mosaic transition occurs
.change_palettes
CLC : RTL
}
OWAdjustExitPosition:
{
LDA.w RandoOverworldWalkDist : CMP.b #$60 : BEQ .stone_bridge
CMP.b #$B0 : BNE .normal
LDA.b #$80 : STA.b LinkPosY : STZ.b LinkPosY+1
BRA .normal
.stone_bridge
LDA.b #$A0 : STA.b BG2H
LDA.b #$3D : STA.w CameraScrollW
LDA.b #$3B : STA.w CameraScrollE
INC.b LinkPosX+1 : INC.w CameraScrollW+1 : INC.w CameraScrollE+1
.normal
LDA.w RandoOverworldForceTrans : BEQ +
LDA.b #$3C : STA.w SFX2 ; play error sound before forced transition
+
INC.b GameSubMode : STZ.b SubSubModule ; what we wrote over
RTL
}
OWEndScrollTransition:
{
LDY.w RandoOverworldWalkDist : BEQ .normal
CMP.w RandoOverworldWalkDist
RTL
.normal
CMP.l Overworld_FinalizeEntryOntoScreen_Data,X ; what we wrote over
RTL
}
OWSpecialReturnTriggerClear:
{
STZ.b SubSubModule : STZ.b RoomIndex ; what we wrote over
STZ.w RandoOverworldTargetEdge
RTL
}
;Data
org $aaa000
OWEdgeOffsets:
;2 bytes per each direction per each OW Slot, order is NSWE per value at $0418
;AABB, A = offset to the transition table, B = number of transitions
dw $0000, $0000, $0000, $0000 ;OW Slot 00, OWID 0x00 Lost Woods
dw $0000, $0000, $0000, $0001 ;OW Slot 01, OWID 0x00
dw $0000, $0001, $0001, $0000 ;OW Slot 02, OWID 0x02 Lumberjack
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0101
dw $0000, $0000, $0101, $0000
dw $0000, $0000, $0000, $0201
dw $0000, $0000, $0201, $0000
dw $0000, $0102, $0000, $0000
dw $0000, $0301, $0000, $0000
dw $0101, $0401, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0301
dw $0000, $0000, $0301, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0501, $0000, $0000 ;Zora
dw $0302, $0602, $0000, $0000
dw $0501, $0801, $0000, $0402
dw $0601, $0902, $0402, $0602
dw $0000, $0000, $0602, $0801
dw $0000, $0000, $0801, $0901
dw $0000, $0b03, $0901, $0a03
dw $0000, $0000, $0a03, $0d02
dw $0701, $0000, $0d02, $0000
dw $0802, $0000, $0000, $0000 ;OW Slot 18, OWID 0x18 Kakariko
dw $0a01, $0000, $0000, $0000
dw $0b02, $0000, $0000, $0f01
dw $0000, $0000, $0f01, $0000
dw $0000, $0000, $0000, $0000
dw $0d03, $0e01, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0f01, $0000, $1001
dw $0000, $0000, $1001, $0000
dw $0000, $1001, $0000, $0000
dw $0000, $1101, $0000, $1101
dw $1001, $1201, $1101, $0000
dw $0000, $1301, $0000, $0000
dw $0000, $1401, $0000, $0000
dw $0000, $0000, $0000, $1201
dw $1101, $0000, $1201, $1301
dw $0000, $1502, $1301, $0000
dw $1201, $1701, $0000, $1403
dw $1301, $1801, $1403, $1701 ;Links
dw $1401, $1901, $1801, $1802 ;Hobo
dw $1501, $1a02, $1902, $0000
dw $1601, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000 ;OW Slot 30, OWID 0x30 Desert
dw $0000, $0000, $0000, $0000
dw $1702, $0000, $0000, $1a01
dw $1901, $1c01, $1b01, $1b03
dw $1a01, $1d01, $1c03, $0000
dw $1b01, $0000, $0000, $0000
dw $1c02, $0000, $0000, $0000
dw $0000, $1e02, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $1e02
dw $0000, $0000, $1f02, $2002
dw $1e01, $0000, $2102, $2201
dw $1f01, $0000, $2301, $2301
dw $0000, $0000, $2401, $0000
dw $0000, $0000, $0000, $2402
dw $2002, $0000, $2502, $0000
dw $0000, $0000, $0000, $0000 ;OW Slot 40, OWID 0x40 Skull Woods
dw $0000, $0000, $0000, $2601
dw $0000, $2001, $2701, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $2701
dw $0000, $0000, $2801, $0000
dw $0000, $0000, $0000, $2801
dw $0000, $0000, $2901, $0000
dw $0000, $2102, $0000, $0000
dw $0000, $2301, $0000, $0000
dw $2201, $2401, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $2901
dw $0000, $0000, $2a01, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $2501, $0000, $0000
dw $2302, $2602, $0000, $0000
dw $2501, $2801, $0000, $2a02
dw $2601, $2902, $2b02, $2c02
dw $0000, $0000, $2d02, $2e01
dw $0000, $0000, $2f01, $2f01
dw $0000, $2b03, $3001, $3003
dw $0000, $0000, $3103, $3302
dw $2701, $0000, $3402, $0000
dw $2802, $0000, $0000, $0000 ;OW Slot 58, OWID 0x58 Village of Outcasts
dw $2a01, $0000, $0000, $0000
dw $2b02, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $2d03, $2e01, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $2f01, $0000, $3501
dw $0000, $0000, $3601, $0000
dw $0000, $3001, $0000, $0000
dw $0000, $3101, $0000, $3601
dw $3001, $3201, $3701, $0000
dw $0000, $3301, $0000, $0000
dw $0000, $3401, $0000, $0000
dw $0000, $0000, $0000, $3702
dw $3101, $0000, $3802, $3901
dw $0000, $3502, $3a01, $0000
dw $3201, $3701, $0000, $3a03
dw $3301, $3801, $3b03, $3d01
dw $3401, $3901, $3e01, $3e02
dw $3501, $3a02, $3f02, $0000
dw $3601, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000 ;OW Slot 70, OWID 0x70 Mire
dw $0000, $0000, $0000, $0000
dw $3702, $0000, $0000, $4001
dw $3901, $3c01, $4101, $4103
dw $3a01, $3d01, $4203, $0000
dw $3b01, $0000, $0000, $0000
dw $3c02, $0000, $0000, $0000
dw $0000, $3e02, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $0000
dw $0000, $0000, $0000, $4402
dw $3e01, $0000, $4502, $4601
dw $3f01, $0000, $4701, $4701
dw $0000, $0000, $4801, $0000
dw $0000, $0000, $0000, $4802
dw $4002, $0000, $4902, $0000
dw $0000, $4001, $0000, $0000
dw $0000, $0000, $0000, $4a01
dw $0000, $4101, $0000, $0000
OWSpecialDestSlot:
db $80, $80, $81
org $aaa800 ;PC 152800
OWNorthEdges:
; Min Max Width Mid OW Slot/OWID VRAM Terrain Dest Index
dw $00a0, $00a0, $0000, $00a0, $0000, $0284, $0000, $B040 ;Lost Woods (exit only)
dw $0458, $0540, $00e8, $04cc, $0a0a, $180a, $0000, $0000
dw $0f38, $0f60, $0028, $0f4c, $0f0f, $009a, $0000, $2041 ;Waterfall (exit only)
dw $0058, $0058, $0000, $0058, $1010, $1800, $0000, $0001
dw $0178, $0178, $0000, $0178, $1010, $181e, $0000, $0002
dw $0388, $0388, $0000, $0388, $1111, $1820, $0000, $0003
dw $0480, $05b0, $0130, $0518, $1212, $1812, $0000, $0004
dw $0f70, $0f90, $0020, $0f80, $1717, $1820, $0000, $0005
dw $0078, $0098, $0020, $0088, $1818, $1802, $0000, $0006 ;Kakariko
dw $0138, $0158, $0020, $0148, $1818, $181a, $0000, $0007
dw $02e8, $0348, $0060, $0318, $1819, $1854, $0000, $0008
dw $0478, $04d0, $0058, $04a4, $1a1a, $1806, $0000, $0009
dw $0510, $0538, $0028, $0524, $1a1a, $1816, $0000, $000a
dw $0a48, $0af0, $00a8, $0a9c, $1d1d, $1804, $0000, $000b
dw $0b28, $0b38, $0010, $0b30, $1d1d, $1818, $0001, $000c
dw $0b70, $0ba0, $0030, $0b88, $1d1d, $1820, $0000, $000d
dw $0a40, $0b10, $00d0, $0aa8, $2525, $1806, $0000, $000e
dw $0350, $0390, $0040, $0370, $2929, $1820, $0000, $000f
dw $0670, $06a8, $0038, $068c, $2b2b, $1802, $0000, $0010
dw $0898, $09b0, $0118, $0924, $2c2c, $1814, $0000, $0011 ;Links House
dw $0a40, $0ba0, $0160, $0af0, $2d2d, $180e, $0000, $0012
dw $0c70, $0c90, $0020, $0c80, $2e2e, $1802, $0000, $0013
dw $0f70, $0f80, $0010, $0f78, $2f2f, $1820, $0000, $0014
dw $0430, $0468, $0038, $044c, $3232, $1800, $0000, $0015
dw $04d8, $04f8, $0020, $04e8, $3232, $180c, $0000, $0016
dw $0688, $06b0, $0028, $069c, $3333, $1804, $0000, $0017
dw $08d0, $08f0, $0020, $08e0, $3434, $180e, $0000, $0018
dw $0a80, $0b40, $00c0, $0ae0, $3535, $180c, $0000, $0019
dw $0d38, $0d58, $0020, $0d48, $3536, $185a, $0001, $001a
dw $0d90, $0da0, $0010, $0d98, $3536, $1860, $0000, $001b
dw $06a0, $07b0, $0110, $0728, $3b3b, $1816, $0000, $001c
dw $0830, $09b0, $0180, $08f0, $3c3c, $1810, $0000, $001d
dw $0e78, $0e88, $0010, $0e80, $3f3f, $1802, $0001, $001e
dw $0ee0, $0fc0, $00e0, $0f50, $3f3f, $181c, $0000, $001f
dw $0458, $0540, $00e8, $04cc, $4a4a, $180a, $0000, $0020
dw $0058, $0058, $0000, $0058, $5050, $181e, $0000, $0021
dw $0178, $0178, $0000, $0178, $5050, $1800, $0000, $0022
dw $0388, $0388, $0000, $0388, $5151, $1820, $0000, $0023
dw $0480, $05b0, $0130, $0518, $5252, $1812, $0000, $0024
dw $0f70, $0f90, $0020, $0f80, $5757, $1820, $0000, $0025
dw $0078, $0098, $0020, $0088, $5858, $1802, $0000, $0026 ;Village of Outcasts
dw $0138, $0158, $0020, $0148, $5858, $181a, $0000, $0027
dw $02e8, $0348, $0060, $0318, $5859, $1854, $0000, $0028
dw $0478, $04d0, $0058, $04a4, $5a5a, $1806, $0000, $0029
dw $0510, $0538, $0028, $0524, $5a5a, $1816, $0000, $002a
dw $0a48, $0af0, $00a8, $0a9c, $5d5d, $1804, $0000, $002b
dw $0b28, $0b38, $0010, $0b30, $5d5d, $1818, $0001, $002c
dw $0b70, $0ba0, $0030, $0b88, $5d5d, $1820, $0000, $002d
dw $0a40, $0b10, $00d0, $0aa8, $6565, $1806, $0000, $002e
dw $0350, $0390, $0040, $0370, $6969, $1820, $0000, $002f
dw $0670, $06a8, $0038, $068c, $6b6b, $1802, $0000, $0030
dw $0898, $09b0, $0118, $0924, $6c6c, $1814, $0000, $0031
dw $0a40, $0ba0, $0160, $0af0, $6d6d, $180e, $0000, $0032
dw $0c70, $0c90, $0020, $0c80, $6e6e, $1802, $0000, $0033
dw $0f70, $0f80, $0010, $0f78, $6f6f, $1820, $0000, $0034
dw $0430, $0468, $0038, $044c, $7272, $1800, $0000, $0035
dw $04d8, $04f8, $0020, $04e8, $7272, $180c, $0000, $0036
dw $0688, $06b0, $0028, $069c, $7373, $1804, $0000, $0037
dw $08d0, $08f0, $0020, $08e0, $7474, $180e, $0000, $0038
dw $0a80, $0b40, $00c0, $0ae0, $7575, $180c, $0000, $0039
dw $0d38, $0d58, $0020, $0d48, $7576, $185a, $0001, $003a
dw $0d90, $0da0, $0010, $0d98, $7576, $1860, $0000, $003b
dw $06a0, $07b0, $0110, $0728, $7b7b, $1816, $0000, $003c
dw $0830, $09b0, $0180, $08f0, $7c7c, $1810, $0000, $003d
dw $0e78, $0e88, $0010, $0e80, $7f7f, $1802, $0001, $003e
dw $0ee0, $0fc0, $00e0, $0f50, $7f7f, $181c, $0000, $003f
OWSouthEdges:
dw $0458, $0540, $00e8, $04cc, $0202, $100a, $0000, $0001
dw $0058, $0058, $0000, $0058, $0008, $2000, $0000, $0003
dw $0178, $0178, $0000, $0178, $0008, $2020, $0000, $0004
dw $0388, $0388, $0000, $0388, $0009, $2060, $0000, $0005
dw $0480, $05b0, $0130, $0518, $0a0a, $1012, $0000, $0006
dw $0f70, $0f90, $0020, $0f80, $0f0f, $1020, $0000, $0007
dw $0078, $0098, $0020, $0088, $1010, $1002, $0000, $0008
dw $0138, $0158, $0020, $0148, $1010, $101a, $0000, $0009
dw $02e8, $0348, $0060, $0318, $1111, $1014, $0000, $000a
dw $0478, $04d0, $0058, $04a4, $1212, $1006, $0000, $000b
dw $0510, $0538, $0028, $0524, $1212, $1016, $0000, $000c
dw $0a48, $0af0, $00a8, $0a9c, $1515, $1004, $0000, $000d
dw $0b28, $0b38, $0010, $0b30, $1515, $1018, $0001, $000e
dw $0b70, $0ba0, $0030, $0b88, $1515, $1020, $0000, $000f
dw $0a40, $0b10, $00d0, $0aa8, $1d1d, $1006, $0000, $0010
dw $0350, $0390, $0040, $0370, $1821, $2060, $0000, $0011
dw $0670, $06a8, $0038, $068c, $1b23, $2002, $0000, $0012
dw $0898, $09b0, $0118, $0924, $1b24, $2054, $0000, $0013
dw $0a40, $0ba0, $0160, $0af0, $2525, $100e, $0000, $0014
dw $0c70, $0c90, $0020, $0c80, $1e26, $2002, $0000, $0015
dw $0f70, $0f80, $0010, $0f78, $1e27, $2060, $0000, $0016
dw $0430, $0468, $0038, $044c, $2a2a, $1000, $0000, $0017
dw $04d8, $04f8, $0020, $04e8, $2a2a, $100c, $0000, $0018
dw $0688, $06b0, $0028, $069c, $2b2b, $1004, $0000, $0019
dw $08d0, $08f0, $0020, $08e0, $2c2c, $100e, $0000, $001a
dw $0a80, $0b40, $00c0, $0ae0, $2d2d, $100c, $0000, $001b
dw $0d38, $0d58, $0020, $0d48, $2e2e, $101a, $0001, $001c
dw $0d90, $0da0, $0010, $0d98, $2e2e, $1020, $0000, $001d
dw $06a0, $07b0, $0110, $0728, $3333, $1016, $0000, $001e
dw $0830, $09b0, $0180, $08f0, $3434, $1010, $0000, $001f
dw $0e78, $0e88, $0010, $0e80, $3737, $1002, $0001, $0020
dw $0ee0, $0fc0, $00e0, $0f50, $3737, $101c, $0000, $0021
dw $0458, $0540, $00e8, $04cc, $4242, $100a, $0000, $0022
dw $0058, $0058, $0000, $0058, $4048, $2000, $0000, $0023
dw $0178, $0178, $0000, $0178, $4048, $2020, $0000, $0024
dw $0388, $0388, $0000, $0388, $4049, $2060, $0000, $0025
dw $0480, $05b0, $0130, $0518, $4a4a, $1012, $0000, $0026
dw $0f70, $0f90, $0020, $0f80, $4f4f, $1020, $0000, $0027
dw $0078, $0098, $0020, $0088, $5050, $1002, $0000, $0028
dw $0138, $0158, $0020, $0148, $5050, $101a, $0000, $0029
dw $02e8, $0348, $0060, $0318, $5151, $1014, $0000, $002a
dw $0478, $04d0, $0058, $04a4, $5252, $1006, $0000, $002b
dw $0510, $0538, $0028, $0524, $5252, $1016, $0000, $002c
dw $0a48, $0af0, $00a8, $0a9c, $5555, $1004, $0000, $002d
dw $0b28, $0b38, $0010, $0b30, $5555, $1018, $0001, $002e
dw $0b70, $0ba0, $0030, $0b88, $5555, $1020, $0000, $002f
dw $0a40, $0b10, $00d0, $0aa8, $5d5d, $1006, $0000, $0030
dw $0350, $0390, $0040, $0370, $5861, $2060, $0000, $0031
dw $0670, $06a8, $0038, $068c, $5b63, $2002, $0000, $0032
dw $0898, $09b0, $0118, $0924, $5b64, $2054, $0000, $0033
dw $0a40, $0ba0, $0160, $0af0, $6565, $100e, $0000, $0034
dw $0c70, $0c90, $0020, $0c80, $5e66, $2002, $0000, $0035
dw $0f70, $0f80, $0010, $0f78, $5e67, $2060, $0000, $0036
dw $0430, $0468, $0038, $044c, $6a6a, $1000, $0000, $0037
dw $04d8, $04f8, $0020, $04e8, $6a6a, $100c, $0000, $0038
dw $0688, $06b0, $0028, $069c, $6b6b, $1004, $0000, $0039
dw $08d0, $08f0, $0020, $08e0, $6c6c, $100e, $0000, $003a
dw $0a80, $0b40, $00c0, $0ae0, $6d6d, $100c, $0000, $003b
dw $0d38, $0d58, $0020, $0d48, $6e6e, $101a, $0001, $003c
dw $0d90, $0da0, $0010, $0d98, $6e6e, $1020, $0000, $003d
dw $06a0, $07b0, $0110, $0728, $7373, $1016, $0000, $003e
dw $0830, $09b0, $0180, $08f0, $7474, $1010, $0000, $003f
dw $0e78, $0e88, $0010, $0e80, $7777, $1002, $0001, $0040
dw $0ee0, $0fc0, $00e0, $0f50, $7777, $101c, $0000, $0041
dw $0080, $0080, $0000, $0080, $8080, $0000, $0000, $0000 ;Pedestal (unused)
dw $0288, $02c0, $0038, $02a4, $8189, $1782, $0000, $0002 ;Zora (unused)
OWWestEdges:
dw $0070, $00a0, $0030, $0088, $0202, $00e0, $0000, $0000
dw $0068, $0078, $0010, $0070, $0505, $0060, $0000, $0001
dw $0068, $0088, $0020, $0078, $0707, $00e0, $0000, $0002
dw $0318, $0368, $0050, $0340, $050d, $1660, $0000, $0003
dw $0450, $0488, $0038, $046c, $1212, $00e0, $0000, $0004
dw $0560, $05a0, $0040, $0580, $1212, $08e0, $0000, $0005
dw $0488, $0500, $0078, $04c4, $1313, $0360, $0000, $0006
dw $0538, $05a8, $0070, $0570, $1313, $08e0, $0000, $0007
dw $0470, $05a8, $0138, $050c, $1414, $04e0, $0000, $0008
dw $0470, $0598, $0128, $0504, $1515, $04e0, $0000, $0009
dw $0480, $0488, $0008, $0484, $1616, $01e0, $0001, $000a
dw $04b0, $0510, $0060, $04e0, $1616, $04e0, $0000, $000b
dw $0560, $0588, $0028, $0574, $1616, $08e0, $0000, $000c
dw $0450, $0458, $0008, $0454, $1717, $00e0, $0001, $000d
dw $0480, $04a8, $0028, $0494, $1717, $01e0, $0000, $000e
dw $0718, $0738, $0020, $0728, $1b1b, $06e0, $0000, $000f
dw $0908, $0948, $0040, $0928, $2222, $05e0, $0000, $0010
dw $0878, $08a8, $0030, $0890, $2525, $01e0, $0000, $0011
dw $0bb8, $0bc8, $0010, $0bc0, $2929, $0960, $0000, $0012
dw $0b60, $0ba0, $0040, $0b80, $2a2a, $0960, $0000, $0013
dw $0ab0, $0ad0, $0020, $0ac0, $2c2c, $0360, $0000, $0014
dw $0af0, $0b40, $0050, $0b18, $2c2c, $05e0, $0000, $0015
dw $0b78, $0ba0, $0028, $0b8c, $2c2c, $08a0, $0000, $0016
dw $0b10, $0b28, $0018, $0b1c, $2d2d, $061c, $0001, $604a ;Stone Bridge (exit only)
dw $0b68, $0b98, $0030, $0b80, $2d2d, $08e0, $0000, $0017
dw $0a68, $0ab8, $0050, $0a90, $2e2e, $01e0, $0000, $0018
dw $0b00, $0b78, $0078, $0b3c, $2e2e, $0660, $0001, $0019
dw $0c50, $0db8, $0168, $0d04, $3333, $05e0, $0000, $001a
dw $0c78, $0ce3, $006b, $0cad, $3434, $02e0, $0000, $001b
dw $0ce4, $0d33, $004f, $0d0b, $3434, $05e0, $0001, $001c
dw $0d34, $0db8, $0084, $0d76, $3434, $08e0, $0000, $001d
dw $0ea8, $0f20, $0078, $0ee4, $3a3a, $03e0, $0000, $001e
dw $0f78, $0fa8, $0030, $0f90, $3a3a, $0860, $0000, $001f
dw $0f18, $0f18, $0000, $0f18, $3b3b, $0660, $0000, $0020
dw $0fc8, $0fc8, $0000, $0fc8, $3b3b, $08e0, $0000, $0021
dw $0e28, $0fb8, $0190, $0ef0, $3c3c, $04e0, $0000, $0022
dw $0f78, $0fb8, $0040, $0f98, $353d, $1860, $0000, $0023
dw $0f20, $0f40, $0020, $0f30, $3f3f, $05e0, $0001, $0024
dw $0f70, $0fb8, $0048, $0f94, $3f3f, $0860, $0000, $0025
dw $0070, $00a0, $0030, $0088, $4242, $00e0, $0000, $0026
dw $0068, $0078, $0010, $0070, $4545, $0060, $0000, $0027
dw $0068, $0088, $0020, $0078, $4747, $00e0, $0000, $0028
dw $0318, $0368, $0050, $0340, $454d, $1660, $0000, $0029
dw $0450, $0488, $0038, $046c, $5252, $00e0, $0000, $002a
dw $0560, $05a0, $0040, $0580, $5252, $08e0, $0000, $002b
dw $0488, $0500, $0078, $04c4, $5353, $0360, $0000, $002c
dw $0538, $05a8, $0070, $0570, $5353, $08e0, $0000, $002d
dw $0470, $05a8, $0138, $050c, $5454, $04e0, $0000, $002e
dw $0470, $0598, $0128, $0504, $5555, $04e0, $0000, $002f
dw $0480, $0488, $0008, $0484, $5656, $01e0, $0001, $0030
dw $04b0, $0510, $0060, $04e0, $5656, $04e0, $0000, $0031
dw $0560, $0588, $0028, $0574, $5656, $08e0, $0000, $0032
dw $0450, $0458, $0008, $0454, $5757, $00e0, $0001, $0033
dw $0480, $04a8, $0028, $0494, $5757, $01e0, $0000, $0034
dw $0908, $0948, $0040, $0928, $6262, $05e0, $0000, $0035
dw $0878, $08a8, $0030, $0890, $6565, $01e0, $0000, $0036
dw $0b60, $0b68, $0008, $0b64, $6969, $08e0, $0000, $0037
dw $0bb8, $0bc8, $0010, $0bc0, $6969, $0960, $0000, $0038
dw $0b60, $0ba0, $0040, $0b80, $6a6a, $0960, $0000, $0039
dw $0ab0, $0ad0, $0020, $0ac0, $6c6c, $0360, $0000, $003a
dw $0af0, $0b40, $0050, $0b18, $6c6c, $05e0, $0000, $003b
dw $0b78, $0ba0, $0028, $0b8c, $6c6c, $08a0, $0000, $003c
dw $0b68, $0b98, $0030, $0b80, $6d6d, $08e0, $0000, $003d
dw $0a68, $0ab8, $0050, $0a90, $6e6e, $01e0, $0000, $003e
dw $0b00, $0b78, $0078, $0b3c, $6e6e, $0660, $0001, $003f
dw $0c50, $0db8, $0168, $0d04, $7373, $05e0, $0000, $0040
dw $0c78, $0ce3, $006b, $0cad, $7474, $02e0, $0000, $0041
dw $0ce4, $0d33, $004f, $0d0b, $7474, $05e0, $0001, $0042
dw $0d34, $0db8, $0084, $0d76, $7474, $08e0, $0000, $0043
dw $0f18, $0f18, $0000, $0f18, $7b7b, $0660, $0000, $0044
dw $0fc8, $0fc8, $0000, $0fc8, $7b7b, $08e0, $0000, $0045
dw $0e28, $0fb8, $0190, $0ef0, $7c7c, $04e0, $0000, $0046
dw $0f78, $0fb8, $0040, $0f98, $757d, $1860, $0000, $0047
dw $0f20, $0f40, $0020, $0f30, $7f7f, $05e0, $0001, $0048
dw $0f70, $0fb8, $0048, $0f94, $7f7f, $0860, $0000, $0049
OWEastEdges:
dw $0070, $00a0, $0030, $0088, $0001, $0180, $0000, $0000
dw $0068, $0078, $0010, $0070, $0304, $0180, $0000, $0001
dw $0068, $0088, $0020, $0078, $0506, $0180, $0000, $0002
dw $0318, $0368, $0050, $0340, $030c, $1780, $0000, $0003
dw $0450, $0488, $0038, $046c, $1111, $00c0, $0000, $0004
dw $0560, $05a0, $0040, $0580, $1111, $08c0, $0000, $0005
dw $0488, $0500, $0078, $04c4, $1212, $0340, $0000, $0006
dw $0538, $05a8, $0070, $0570, $1212, $08c0, $0000, $0007
dw $0470, $05a8, $0138, $050c, $1313, $04c0, $0000, $0008
dw $0470, $0598, $0128, $0504, $1414, $04c0, $0000, $0009
dw $0480, $0488, $0008, $0484, $1515, $01c0, $0001, $000a
dw $04b0, $0510, $0060, $04e0, $1515, $04c0, $0000, $000b
dw $0560, $0588, $0028, $0574, $1515, $08c0, $0000, $000c
dw $0450, $0458, $0008, $0454, $1616, $00c0, $0001, $000d
dw $0480, $04a8, $0028, $0494, $1616, $01c0, $0000, $000e
dw $0718, $0738, $0020, $0728, $1a1a, $06c0, $0000, $000f
dw $0908, $0948, $0040, $0928, $1821, $1680, $0000, $0010
dw $0878, $08a8, $0030, $0890, $1b24, $1280, $0000, $0011
dw $0bb8, $0bc8, $0010, $0bc0, $2828, $0940, $0000, $0012 ;Race Game
dw $0b60, $0ba0, $0040, $0b80, $2929, $0940, $0000, $0013
dw $0ab0, $0ad0, $0020, $0ac0, $2b2b, $0340, $0000, $0014
dw $0af0, $0b40, $0050, $0b18, $2b2b, $05c0, $0000, $0015
dw $0b78, $0ba0, $0028, $0b8c, $2b2b, $08c0, $0000, $0016
dw $0b68, $0b98, $0030, $0b80, $2c2c, $08c0, $0000, $0018
dw $0a68, $0ab8, $0050, $0a90, $2d2d, $01c0, $0000, $0019
dw $0b00, $0b78, $0078, $0b3c, $2d2d, $0640, $0001, $001a
dw $0c50, $0db8, $0168, $0d04, $3232, $05c0, $0000, $001b
dw $0c78, $0ce3, $006b, $0cad, $3333, $02c0, $0000, $001c
dw $0ce4, $0d33, $004f, $0d0b, $3333, $05c0, $0001, $001d
dw $0d34, $0db8, $0084, $0d76, $3333, $08c0, $0000, $001e
dw $0ea8, $0f20, $0078, $0ee4, $3039, $1480, $0000, $001f
dw $0f78, $0fa8, $0030, $0f90, $3039, $1980, $0000, $0020
dw $0f18, $0f18, $0000, $0f18, $3a3a, $0640, $0000, $0021
dw $0fc8, $0fc8, $0000, $0fc8, $3a3a, $08c0, $0000, $0022
dw $0e28, $0fb8, $0190, $0ef0, $3b3b, $04c0, $0000, $0023
dw $0f78, $0fb8, $0040, $0f98, $3c3c, $08c0, $0000, $0024
dw $0f20, $0f40, $0020, $0f30, $353e, $1680, $0001, $0025
dw $0f70, $0fb8, $0048, $0f94, $353e, $1880, $0000, $0026
dw $0070, $00a0, $0030, $0088, $4041, $0180, $0000, $0027 ;Skull Woods
dw $0068, $0078, $0010, $0070, $4344, $0180, $0000, $0028
dw $0068, $0088, $0020, $0078, $4546, $0180, $0000, $0029
dw $0318, $0368, $0050, $0340, $434c, $1780, $0000, $002a
dw $0450, $0488, $0038, $046c, $5151, $00c0, $0000, $002b
dw $0560, $05a0, $0040, $0580, $5151, $08c0, $0000, $002c
dw $0488, $0500, $0078, $04c4, $5252, $0340, $0000, $002d
dw $0538, $05a8, $0070, $0570, $5252, $08c0, $0000, $002e
dw $0470, $05a8, $0138, $050c, $5353, $04c0, $0000, $002f
dw $0470, $0598, $0128, $0504, $5454, $04c0, $0000, $0030
dw $0480, $0488, $0008, $0484, $5555, $01c0, $0001, $0031
dw $04b0, $0510, $0060, $04e0, $5555, $04c0, $0000, $0032
dw $0560, $0588, $0028, $0574, $5555, $08c0, $0000, $0033
dw $0450, $0458, $0008, $0454, $5656, $00c0, $0001, $0034
dw $0480, $04a8, $0028, $0494, $5656, $01c0, $0000, $0035
dw $0908, $0948, $0040, $0928, $5861, $1680, $0000, $0036
dw $0878, $08a8, $0030, $0890, $5b64, $1280, $0000, $0037
dw $0b60, $0b68, $0008, $0b64, $6868, $08c0, $0000, $0038 ;Dig Game
dw $0bb8, $0bc8, $0010, $0bc0, $6868, $0940, $0000, $0039
dw $0b60, $0ba0, $0040, $0b80, $6969, $0940, $0000, $003a
dw $0ab0, $0ad0, $0020, $0ac0, $6b6b, $0340, $0000, $003b
dw $0af0, $0b40, $0050, $0b18, $6b6b, $05c0, $0000, $003c
dw $0b78, $0ba0, $0028, $0b8c, $6b6b, $08c0, $0000, $003d
dw $0b68, $0b98, $0030, $0b80, $6c6c, $08c0, $0000, $003e
dw $0a68, $0ab8, $0050, $0a90, $6d6d, $01c0, $0000, $003f
dw $0b00, $0b78, $0078, $0b3c, $6d6d, $0640, $0001, $0040
dw $0c50, $0db8, $0168, $0d04, $7272, $05c0, $0000, $0041
dw $0c78, $0ce3, $006b, $0cad, $7373, $02c0, $0000, $0042
dw $0ce4, $0d33, $004f, $0d0b, $7373, $05c0, $0001, $0043
dw $0d34, $0db8, $0084, $0d76, $7373, $08c0, $0000, $0044
dw $0f18, $0f18, $0000, $0f18, $7a7a, $0640, $0000, $0045
dw $0fc8, $0fc8, $0000, $0fc8, $7a7a, $08c0, $0000, $0046
dw $0e28, $0fb8, $0190, $0ef0, $7b7b, $04c0, $0000, $0047
dw $0f78, $0fb8, $0040, $0f98, $7c7c, $08c0, $0000, $0048
dw $0f20, $0f40, $0020, $0f30, $757e, $1680, $0001, $0049
dw $0f70, $0fb8, $0048, $0f94, $757e, $1880, $0000, $004a
dw $0058, $00c0, $0068, $008c, $8080, $0020, $0001, $0017 ;Hobo (unused)
org $aab9a0 ;PC 1539a0
OWSpecialDestIndex:
dw $0080, $0081, $0082
org $aab9b0 ;PC 1539b0
OWTileWorldAssoc:
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db $40, $40, $40, $40, $40, $40, $40, $40
db $40, $40, $40, $40, $40, $40, $40, $40
db $40, $40, $40, $40, $40, $40, $40, $40
db $40, $40, $40, $40, $40, $40, $40, $40
db $40, $40, $40, $40, $40, $40, $40, $40
db $40, $40, $40, $40, $40, $40, $40, $40
db $40, $40, $40, $40, $40, $40, $40, $40
db $40, $40, $40, $40, $40, $40, $40, $40
db $00, $00
org $aaba70 ;PC 153a70
OWTileMapAlt:
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0
;================================================================================
; Bonk Prize Data ($AABB00 - $AABBFB)
;--------------------------------------------------------------------------------
; This table stores data relating to bonk locations for Bonk Drop Shuffle
;
; Example: We can use OWBonkPrizeTable[$09].loot to read what item is in the
; east tree on the Sanctuary screen
;--------------------------------------------------------------------------------
; Search Criteria - The following two fields are used as a unique index
; .owid = OW screen ID
; .yx = Y & X coordinate data *see below*
;
; .flag = OW event flag bitmask
; .loot = Loot ID
; .mw_player = Multiworld player ID
; .vert_offset = Vertical offset, # of pixels the sprite moves up when activated
;
; .yx field is a combination of both the least significant digits of the Y and X
; coordinates of the static location of the sprite located in a bonk location.
; All sprites, when initialized, are aligned by a 16 pixel increment.
; The coordinate system in LTTP is handled by two bytes:
; (high) (low)
; - - - w w w w s s s s s s s s s
; w = world absolute coords, every screen is $200 pixels in each dimension
; s = local screen coords, coords relative to the bounds of the current screen
; Because of the 16 pixel alignment of sprites, the last four bits of the coords
; are unset. This leaves 5 bits remaining, we simply disregard the highest bit
; and then combine the Y and X coords together to be used as search criteria.
; This does open the possibility of a false positive match from 3 other coords
; on the same screen (15 on megatile screens) but there are no bonk sprites that
; have collision in this regard.
;--------------------------------------------------------------------------------
struct OWBonkPrizeTable $AABB00
.owid: skip 1
.yx: skip 1
.flag: skip 1
.loot: skip 1
.mw_player: skip 1
.vert_offset: skip 1
endstruct align 6
org $aabb00 ;PC 153b00
OWBonkPrizeData:
; OWID YX Flag Item MW Offset
db $00, $59, $10, $b0, $00, $20
db $05, $04, $10, $b2, $00, $00
db $0a, $4e, $10, $b0, $00, $20
db $0a, $a9, $08, $b1, $00, $20
db $10, $c7, $10, $b1, $00, $20
db $10, $f7, $08, $b4, $00, $20
db $11, $08, $10, $27, $00, $00
db $12, $a4, $10, $b2, $00, $20
db $13, $c7, $10, $31, $00, $20
db $13, $98, $08, $b1, $00, $20
db $15, $a4, $10, $b1, $00, $20
db $15, $fb, $08, $b2, $00, $20
db $18, $a8, $10, $b2, $00, $20
db $18, $36, $08, $35, $00, $20
db $1a, $8a, $10, $42, $00, $20
db $1a, $1d, $08, $b2, $00, $20
;db $1a, $77, $04, $35, $00, $20 ; pre aga ONLY ; hijacked murahdahla bonk tree
db $1b, $46, $10, $b1, $00, $10
db $1d, $6b, $10, $b1, $00, $20
db $1e, $72, $10, $b2, $00, $20
db $2a, $8f, $10, $36, $00, $20
db $2a, $45, $08, $36, $00, $20
db $2b, $d6, $10, $b2, $00, $20
db $2e, $9c, $10, $b2, $00, $20
db $2e, $b4, $08, $b0, $00, $20
db $32, $29, $10, $42, $00, $20
db $32, $9a, $08, $b2, $00, $20
;db $34, $xx, $10, $xx, $00, $1c ; pre aga ONLY
db $42, $66, $10, $b2, $00, $20
db $51, $08, $10, $b2, $00, $04
db $51, $09, $08, $b2, $00, $04
db $54, $b5, $10, $27, $00, $14
db $54, $ef, $08, $b2, $00, $08
db $54, $b9, $04, $36, $00, $00
db $55, $aa, $10, $b0, $00, $20
db $55, $fb, $08, $35, $00, $20
db $56, $e4, $10, $b0, $00, $20
db $5b, $a7, $10, $b2, $00, $20
db $5e, $00, $10, $b2, $00, $20
db $6e, $8c, $10, $35, $00, $10
db $6e, $90, $08, $b0, $00, $10
db $6e, $a4, $04, $b1, $00, $10
db $74, $4e, $10, $b1, $00, $1c
UWBonkPrizeData:
db $ff, $00, $02, $b5, $00, $08
; temporary fix - murahdahla replaces one of the bonk tree prizes
; so we copy the sprite table here and update the pointer
; longterm solution should be to spawn in murahdahla separately
org $89AE2A
Overworld_Sprites_Screen1A_2:
db $08, $0F, $41 ; yx:{ 0x080, 0x0F0 }
db $0E, $0C, $41 ; yx:{ 0x0E0, 0x0C0 }
db $11, $0D, $E3 ; yx:{ 0x110, 0x0D0 }
db $18, $0A, $D8 ; yx:{ 0x180, 0x0A0 }
db $18, $0F, $45 ; yx:{ 0x180, 0x0F0 }
db $FF ; END
org $89CA55
dw Overworld_Sprites_Screen1A_2&$FFFF