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 FluteBitfield : cmp.b #$FF : beq + 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 FluteBitfield : cmp.b #$FF : beq .cancel lda.l OWFlags+1 : and.b #$01 : beq + lda.b Joy1B_All : cmp.b #$40 : bne + .cancel 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