74 Commits

Author SHA1 Message Date
8e53b6cc96 Merge branch 'GKNew' into FancyDoorsMap 2026-01-25 16:24:45 -06:00
d0d4cbaecb Reserve space for randomizer version 2026-01-25 16:20:51 -06:00
95edc6802d Update Hyrule Castle basement supertile to show platform 2026-01-23 03:58:08 -06:00
35bb076412 Fix kakariko music transition not happening 2026-01-21 18:23:47 -06:00
cc88f285f9 Add goal for total bosses including aga 2026-01-21 08:51:51 -06:00
03dc7b9d6d Show boss kills if hud bit set in door rando 2026-01-20 22:05:20 -06:00
30319ce476 Dark rooms don't show up on map with only visitation 2026-01-19 13:36:33 -06:00
ccc3e38b97 Fix hera staircase and desert triple connector tile 2026-01-18 18:20:09 -06:00
973bf35666 Fix multi pot loot icons, replace ugly slanted 10/11 2026-01-18 16:56:17 -06:00
ad1860147a More GK refactors 2026-01-18 11:18:56 -06:00
0b27d0f477 Big rename of gk files 2026-01-18 10:48:02 -06:00
798ee3fdd0 Remove mappable doors stuff 2026-01-18 07:57:41 -06:00
a3bc7dea0e Print label of end of bank B9 2026-01-18 06:59:46 -06:00
94ccbb70dc Fix pot junk not showing as uncollected 2026-01-17 13:56:20 -06:00
e2614b6f75 Fix check for overlord (which fixes boomerang chest guard) 2026-01-17 13:30:37 -06:00
9e2b148a57 Fix light cone not showing after torches extinguish 2026-01-16 18:27:32 -06:00
f8cc7d2ef8 Fix a chest in incorrect section 2026-01-16 15:44:05 -06:00
d504e33d52 Show button help on map screen 2026-01-16 14:36:43 -06:00
043a2d83b2 Add tier of item value for maps 2026-01-15 19:03:13 -06:00
8f75b8ec71 Merge branch 'GKNew' into FancyDoorsMap 2026-01-15 04:07:27 -06:00
32e7fe5454 Small bugfixes 2026-01-15 03:28:46 -06:00
2c601d2fc7 More split rooms, hide boss icon in HC, fix loot bug 2026-01-14 13:10:12 -06:00
902e14b3f4 Bugfixes! 2026-01-13 18:57:55 -06:00
a011bc9f4a Allow switching dungeons in doors mode 2026-01-13 11:00:31 -06:00
633453f386 Press Select for next entrance 2026-01-13 09:34:04 -06:00
831e6cc27f SW Pot Prison 2026-01-13 00:38:34 -06:00
8e45ef1bd2 Section off drops and warps, add more sections 2026-01-13 00:28:25 -06:00
9c5f0dd5f5 More separate-section implementation 2026-01-12 22:28:54 -06:00
17939339bc Start tracking separated sections 2026-01-12 20:30:08 -06:00
91fab07e5c Clean up CanSeeConnector 2026-01-12 16:39:32 -06:00
cacc640a4f Draw entrances 2026-01-12 16:24:22 -06:00
c38b3b6d0a Conditionally draw staircase labels 2026-01-12 15:49:09 -06:00
fcf17a6dff Fix ordering of several edges and spiral staircases 2026-01-12 14:37:42 -06:00
06aa3cb10f Fix some UI infinite loops 2026-01-11 22:25:03 -06:00
970d1f5db0 Show stairs, warps, and drops in doors map 2026-01-11 21:42:48 -06:00
e56b8a55fe Do not show unknown connectors 2026-01-11 06:05:46 -06:00
78eb8916fc Show boss icon 2026-01-11 05:04:39 -06:00
60c852bfa9 Rearrange gfx slightly 2026-01-11 04:12:07 -06:00
36a8eaee89 Handle In-Room staircases 2026-01-11 04:03:52 -06:00
527041b81b Show loot in doors map 2026-01-10 21:21:19 -06:00
5e7c4a65b8 Allow moving through doors map 2026-01-10 20:17:29 -06:00
1776daa43d Draw triple connections correctly 2026-01-10 14:44:15 -06:00
610607ece4 Refactor and open edges 2026-01-10 00:48:22 -06:00
278e428658 First steps 2026-01-09 13:45:00 -06:00
63065e34b7 Update supertile shapes 2026-01-07 20:56:14 -06:00
ba9f0c7555 Fix incorrect dungeon reminder appearing briefly out of map 2026-01-07 20:21:20 -06:00
aae220fb46 Update supertiles, fix incorrect linkpoint 2026-01-07 20:09:35 -06:00
a7c7fc4394 Map tile updates 2026-01-07 13:34:28 -06:00
b2b23b047f Remove custom sheet d4 2026-01-07 12:04:19 -06:00
3964c34658 Move loot icons to sheet with connectors 2026-01-07 12:00:16 -06:00
8cf0059f84 compress util takes offset and length parameters 2026-01-07 11:44:26 -06:00
0a98db7025 Clear unseen connections in custom map mode 2026-01-07 06:12:43 -06:00
bdb1272cb2 Clean up macros somewhat 2026-01-07 05:30:49 -06:00
d5917afb64 Read map data from bank $B9 in custom map mode 2026-01-07 05:12:07 -06:00
72e126a1b6 Separate sheet for door connections beginning 2026-01-06 18:16:20 -06:00
7764682f95 square connector? idk 2026-01-06 10:33:17 -06:00
b3f35f274b Draw door connections? prototype??? 2026-01-05 23:25:51 -06:00
5574eea4c7 WIP 2026-01-05 20:06:50 -06:00
d918e571ab Rearrange some tiles 2026-01-05 06:06:02 -06:00
23edb9a3e6 Supertile shapes, small fixes 2026-01-04 23:02:21 -06:00
21c6d0acfd Many more supertile tweaks 2026-01-04 12:23:56 -06:00
f75db2cac8 AlwaysShowCompass setting 2026-01-04 09:15:10 -06:00
fd8852d866 Lots of bugs fixes and supertile updates 2026-01-04 09:03:23 -06:00
7fc7c8fe0b Full words in supertile shapes file 2026-01-03 17:12:39 -06:00
7a12032067 More supertile shape updates 2026-01-03 13:19:29 -06:00
3489af82fa Add dungeon indicator lettering to maps 2026-01-03 09:58:23 -06:00
fecf9547a5 Sprites for entrances and update supertile shapes 2026-01-03 09:20:51 -06:00
688300d21a Tile warps on map 2026-01-02 17:29:57 -06:00
9b4d79247f Update supertile shapes 2026-01-02 15:01:12 -06:00
1b43799e6e Fix pot shuffle, implement map settings 2026-01-02 03:37:02 -06:00
58db28f8bf Check dungeon prizes, tweak gfx 2025-12-31 12:17:43 -06:00
443080c482 ShowItems settings 2025-12-31 00:21:40 -06:00
10ced3c9c6 Big pass at dungeon item indicators 2025-12-30 21:56:48 -06:00
9a40f28a86 Rename dungeonmap.asm -> bossicons.asm 2025-12-30 16:36:55 -06:00
20 changed files with 172 additions and 560 deletions

View File

@@ -74,8 +74,6 @@ function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<
!FLAG_OW_MIXED = $04 !FLAG_OW_MIXED = $04
!FLAG_OW_CROSSED = $02 !FLAG_OW_CROSSED = $02
!FLAG_OW_BONKDROP = $02 !FLAG_OW_BONKDROP = $02
!FLAG_OW_CUSTOM_MAP = $02
!FLAG_OW_ADJUST_DYNAMIC_MAP_SPRITE_POSITION = $04
incsrc hooks.asm incsrc hooks.asm
incsrc spriteswap.asm incsrc spriteswap.asm
@@ -334,8 +332,6 @@ DungeonMapDoorConnectors:
incbin "menu/door_connectors.3bppc" incbin "menu/door_connectors.3bppc"
MapSheetD4: MapSheetD4:
incbin "menu/map_sheet_d4.3bppc" incbin "menu/map_sheet_d4.3bppc"
DRSheet14:
incbin "menu/dr_sheet_14.3bppc"
org $8CD7DF org $8CD7DF
incsrc data/playernamecharmap.asm incsrc data/playernamecharmap.asm

View File

@@ -28,19 +28,16 @@ AddBonkTremors:
JSL AddDashTremor : JSL Player_ApplyRumbleToSprites ; things we wrote over JSL AddDashTremor : JSL Player_ApplyRumbleToSprites ; things we wrote over
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ValidDashCheck: BonkBreakableWall:
PHP PHX : PHP
SEP #$20 SEP #$30 ; set 8-bit accumulator and index registers
LDA.l BootsModifier : CMP.b #$01 : BEQ + LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA.l BootsEquipment : BEQ .exit LDA.l BootsEquipment : BNE + ; Check for Boots
+ LDA.w LinkDashing PLP : PLX : LDA.w #$0000 : RTL
.exit +
BEQ + PLP : PLX
PLP : REP #$02 LDA.w LinkDashing : AND.w #$00FF ; things we wrote over
RTL RTL
+
PLP : SEP #$02
RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
BonkRockPile: BonkRockPile:
LDA.l BootsModifier : CMP.b #$01 : BEQ + LDA.l BootsModifier : CMP.b #$01 : BEQ +
@@ -51,7 +48,10 @@ BonkRockPile:
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GravestoneHook: GravestoneHook:
JSL ValidDashCheck : BEQ .done ; things we wrote over LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA.l BootsEquipment : BEQ .done ; Check for Boots
+
LDA.w LinkDashing : BEQ .done ; things we wrote over
JML moveGravestone JML moveGravestone
.done .done
JML GravestoneHook_continue JML GravestoneHook_continue

View File

@@ -17,14 +17,15 @@ DoDungeonMapBossIcon:
ASL ASL
TAX TAX
; get sprite pointer table
LDA.l $89C298 : STA.b Scrap00
LDA.w #$0089 : STA.b Scrap02
TXY
; get sprite pointer for room ; get sprite pointer for room
LDA.b [Scrap00], Y LDA.l UWSpritesPointers,X
STA.b Scrap00 ; pointer in $00 STA.b Scrap00 ; pointer in $00
LDA.w #bank(UWSpritesData) : STA.b Scrap02 if !FEATURE_FIX_BASEROM
LDA.w #$0089
else
LDA.w #$0028 ; set the bank to 28 for now
endif
STA.b Scrap02
LDY.w #$0001 ; to skip the "sort" LDY.w #$0001 ; to skip the "sort"
; get first byte to make sure it isn't an empty room ; get first byte to make sure it isn't an empty room

View File

@@ -238,18 +238,6 @@ FixJingleGlitch:
.exit .exit
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FixSwimBump:
LDA.b LinkIncapacitatedTimer : BEQ .normal
LDA.b LinkJumping : BNE .normal
INC.b LinkJumping
BRA .not_diving
.normal
LDA.b LinkJumping : BNE .continue ; what we wrote over
.not_diving
PLA : PLA : PEA.w $87964E ; skip ahead, not diving
.continue
RTL
;--------------------------------------------------------------------------------
; Fix spawning with more hearts than capacity when less than 3 heart containers ; Fix spawning with more hearts than capacity when less than 3 heart containers
pushpc pushpc
org $09F4AC ; <- module_death.asm:331 org $09F4AC ; <- module_death.asm:331

View File

@@ -167,7 +167,9 @@ DrHudDungeonItemsAdditions:
jsr ConvertToDisplay2 : sta.w $1644, y jsr ConvertToDisplay2 : sta.w $1644, y
+ iny #2 : lda.w #$24f5 : sta.w $1644, y + iny #2 : lda.w #$24f5 : sta.w $1644, y
phx : ldx.b Scrap00 phx : ldx.b Scrap00
LDA.l MapField : ORA.l MapCountDisplay : AND.l DungeonMask, x : BEQ .key_info_done ; must have map LDA.l CompassMode : BIT.w #$0002 : BNE .skip_map_check
LDA.l MapField : AND.l DungeonMask, x : BEQ .key_info_done ; must have map
.skip_map_check
plx : sep #$30 : lda.l ChestKeys, x : sta.b Scrap02 plx : sep #$30 : lda.l ChestKeys, x : sta.b Scrap02
lda.l GenericKeys : bne +++ lda.l GenericKeys : bne +++
lda.b Scrap02 : !SUB.l DungeonCollectedKeys, x : sta.b Scrap02 lda.b Scrap02 : !SUB.l DungeonCollectedKeys, x : sta.b Scrap02

View File

@@ -23,7 +23,7 @@ JSL SpritePrep_OldManFollower : NOP #2 : db $F0 ; BEQ
org $9DFF18 org $9DFF18
JSL SpriteDraw_OldManFollower JSL SpriteDraw_OldManFollower
org $9EE9BC org $9EE9BC
JSL OldMan_WaitForCollision JSL Follower_CheckMessageCollision
org $9EE9CC org $9EE9CC
JSL OldMan_BecomeFollower : NOP #2 JSL OldMan_BecomeFollower : NOP #2
@@ -631,15 +631,6 @@ SpriteDraw_OldManFollower:
dw 0, 0 : db $AC, $00, $00, $02 dw 0, 0 : db $AC, $00, $00, $02
dw 0, 8 : db $AE, $00, $00, $02 dw 0, 8 : db $AE, $00, $00, $02
OldMan_WaitForCollision:
PHA
LDA.w LinkIFrames : BEQ +
PLA : CLC
RTL
+
PLA
JML Follower_CheckMessageCollision
OldMan_BecomeFollower: OldMan_BecomeFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BCC .set_follower_and_despawn LDA.l FollowerTravelAllowed : CMP.b #$02 : BCC .set_follower_and_despawn
PLA : PLA PLA : PLA

View File

@@ -368,13 +368,7 @@ CheckEnemies:
ASL A ASL A
TAX TAX
LDA.l UWSpritesPointers, X
; get sprite pointer table
LDA.l $89C298 : STA.b $04
LDA.w #$0089 : STA.b $06
TXY
; get sprite pointer for room
LDA.b [$04], Y
INC A ; skip the layered/unlayered indicator INC A ; skip the layered/unlayered indicator
STA.b $04 STA.b $04
LDA.w #bank(UWSpritesData) LDA.w #bank(UWSpritesData)

39
gk/data/analyze.rb Normal file
View File

@@ -0,0 +1,39 @@
File.open("supertile_shapes.asm", "r") do |file|
bytes = []
while line = file.gets
m = line.match(/dw \$(\h+), \$(\h+), \$(\h+), \$(\h+)/)
bytes += m.captures if m
break if bytes.length >= 4 * 0xE0
end
counts = []
for byte in bytes do
value = byte.to_i(16)
next if value == 0xFFFF
value = (value & 0x03FF) - 0x340
if not counts[value]
counts[value] = 0
end
counts[value] += 1
end
print(" ")
for col in 0...16
printf(" x%X", col)
end
puts
for row in 0...0xC
printf("%Xx", row + 4)
for col in 0...16
printf("%4d", counts[row * 16 + col] || 0)
end
puts
end
printf("Unused:")
for i in 0...0x80
printf(" %2X", i) unless counts[i]
end
puts
end

View File

@@ -1453,8 +1453,8 @@ MoveDoorsMapCursor:
BRA .done BRA .done
.no_move .no_move
; LDA.b #$3C LDA.b #$3C
; STA.w $012E STA.w $012E
.done .done
PLP PLP

View File

@@ -24,8 +24,6 @@ endmacro
%WriteGFXSheetPointer($62, DungeonMapIcons5) %WriteGFXSheetPointer($62, DungeonMapIcons5)
%WriteGFXSheetPointer($63, DungeonMapIcons6) %WriteGFXSheetPointer($63, DungeonMapIcons6)
%WriteGFXSheetPointer($14, DRSheet14)
pullpc pullpc
incsrc doors_dungeon_map.asm incsrc doors_dungeon_map.asm

View File

@@ -12,8 +12,7 @@ db $01
GKRomVersion: GKRomVersion:
; $01 = Dungeon Maps ; $01 = Dungeon Maps
; .., $01 = Dark rooms don't show on map from visition ; .., $01 = Dark rooms don't show on map from visition
; .., $02 = OW Fog and Grid modes db $01, $01, $00
db $01, $02, $00
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;================================================================================ ;================================================================================

View File

@@ -120,7 +120,7 @@ JSL AddBonkTremors : NOP #4
; Bonk Breakable Walls ; Bonk Breakable Walls
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $81CF8E ; CF8E <- Bank01.asm : 11641 (LDA $0372 : AND.w #$00FF) org $81CF8E ; CF8E <- Bank01.asm : 11641 (LDA $0372 : AND.w #$00FF)
JSL ValidDashCheck : NOP #2 JSL BonkBreakableWall : NOP #2
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;================================================================================ ;================================================================================
@@ -139,11 +139,6 @@ GravestoneHook_continue:
org $87C106 org $87C106
moveGravestone: moveGravestone:
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $899A30
JSL ValidDashCheck : NOP #2
org $899A3A
JSL ValidDashCheck : NOP #2
;--------------------------------------------------------------------------------
;================================================================================ ;================================================================================
; Jump Down Ledge ; Jump Down Ledge
@@ -2107,11 +2102,6 @@ JSL FlipperScrollWarp
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;org $878F51 ; <- 38F51 - Bank07.asm:2444 (JSR $AE54 ; $3AE54 IN ROM) ;org $878F51 ; <- 38F51 - Bank07.asm:2444 (JSR $AE54 ; $3AE54 IN ROM)
;JSL OnEnterWater : NOP ;JSL OnEnterWater : NOP
;--------------------------------------------------------------------------------
; Fixes getting bumped while swimming, unable to screen transition
org $879632
LinkState_Swimming:
JSL FixSwimBump
;================================================================================ ;================================================================================
; Floodgate Softlock Fix ; Floodgate Softlock Fix
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -89,8 +89,7 @@ org $80FDEE
InitializeMirrorHDMA: InitializeMirrorHDMA:
org $89D62E org $89D62E
;commenting out since this address can move UWSpritesPointers: ; 0x250 bytes for 0x128 rooms' 16-bit pointers
;UWSpritesPointers: ; 0x250 bytes for 0x128 rooms' 16-bit pointers
if !FEATURE_FIX_BASEROM if !FEATURE_FIX_BASEROM
org $81DB67 org $81DB67

Binary file not shown.

Binary file not shown.

View File

@@ -40,7 +40,7 @@ dw $0000
warnpc $8ABE2E warnpc $8ABE2E
org $8ABE2E org $8ABE2E
; located posx/posy, dislocated posx/posy, prize posx/posy ; located posx/posy, dislocated posx/posy, prize pox/posy
; located = proper location of icon (default: if you have map) ; located = proper location of icon (default: if you have map)
; dislocated = location of icon if proper location is hidden from player ; dislocated = location of icon if proper location is hidden from player
; highest bit on first posx indicates which world it should show in ; highest bit on first posx indicates which world it should show in
@@ -49,27 +49,27 @@ WorldMapIcon_pos:
.hc .hc
dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00 dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00
.ep .ep
dw $0F40, $0660, $FF00, $FF00, $0F40, $0660 dw $0F31, $0620, $FF00, $FF00, $0F31, $0620
.dp .dp
dw $0140, $0D00, $FF00, $FF00, $0140, $0D00 dw $0108, $0D70, $FF00, $FF00, $0108, $0D70
.at .at
dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00 dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00
.sp .sp
dw $8778, $0F50, $FF00, $FF00, $8778, $0F50 dw $8759, $0ED0, $FF00, $FF00, $8759, $0ED0
.pod .pod
dw $8F40, $0660, $FF00, $FF00, $8F40, $0660 dw $8F40, $0620, $FF00, $FF00, $8F40, $0620
.mm .mm
dw $8148, $0D00, $FF00, $FF00, $8148, $0D00 dw $8100, $0CA0, $FF00, $FF00, $8100, $0CA0
.sw .sw
dw $80B0, $00C0, $FF00, $FF00, $80B0, $00C0 dw $8082, $00B0, $FF00, $FF00, $8082, $00B0
.ip .ip
dw $8CA0, $0E00, $FF00, $FF00, $8CA0, $0E00 dw $8CA0, $0DA0, $FF00, $FF00, $8CA0, $0DA0
.toh .toh
dw $0900, $0100, $FF00, $FF00, $0900, $0100 dw $08D0, $0080, $FF00, $FF00, $08D0, $0080
.tt .tt
dw $81F8, $0800, $FF00, $FF00, $81F8, $0800 dw $81D0, $0780, $FF00, $FF00, $81D0, $0780
.tr .tr
dw $8F20, $0100, $FF00, $FF00, $8F20, $0100 dw $8F11, $0103, $FF00, $FF00, $8F11, $0103
.gt .gt
dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00 dw $FF00, $FF00, $FF00, $FF00, $FF00, $FF00
@@ -262,8 +262,8 @@ DrawPrizesOverride:
; determine if draw and/or continue ; determine if draw and/or continue
JSR WorldMap_ValidateCoords : BCS .advance JSR WorldMap_ValidateCoords : BCS .advance
JSR WorldMap_DrawTile
JSR WorldMap_DrawTileOverlay JSR WorldMap_DrawTileOverlay
JSR WorldMap_DrawTile
.advance .advance
LDY.b Scrap05 : DEY #2 : BMI + : JMP .next_dungeon : + LDY.b Scrap05 : DEY #2 : BMI + : JMP .next_dungeon : +
PLB PLB
@@ -321,35 +321,24 @@ RTS
WorldMap_DrawTile: WorldMap_DrawTile:
LDA.b Scrap00 : PHA LDA.b Scrap00 : PHA
LDA.l $7EC10A : BIT.w #$4000 : SEP #$20 : BNE .raw_coords ; use raw OAM coordinates SEP #$20
JSR WorldMap_CalculateOAMCoordinates
BCS .apply_offsets
REP #$20
BRA .exit
.raw_coords
STA.b Scrap0E
LDA.l $7EC108 : STA.b Scrap0F
.apply_offsets
LDX.b Scrap0A : BNE .aligned ; prize number/overlay: no offset
LDX.b Scrap0B : BEQ +
; 16x16 sprite: -8 pixels
LDA.b Scrap0E : SEC : SBC.b #$08 : STA.b Scrap0E
LDA.b Scrap0F : SBC.b #$08 : STA.b Scrap0F
BRA .aligned
+
; 8x8 sprite: -4 pixels
LDA.b Scrap0E : SEC : SBC.b #$04 : STA.b Scrap0E
LDA.b Scrap0F : SBC.b #$04 : STA.b Scrap0F
.aligned
LDX.b Scrap0B : TXA : STA.b (OAMPtr+2) LDX.b Scrap0B : TXA : STA.b (OAMPtr+2)
INC.b OAMPtr+2 INC.b OAMPtr+2
JSR WorldMap_CalculateOAMCoordinates
LDX.b Scrap0A : BEQ +
LDA.b Scrap0E : CLC : ADC.b #$04 : STA.b Scrap0E
LDA.b Scrap0F : CLC : ADC.b #$04 : STA.b Scrap0F
+
LDX.b Scrap0B : BEQ +
LDA.b Scrap0E : SEC : SBC.b #$04 : STA.b Scrap0E
LDA.b Scrap0F : SEC : SBC.b #$04 : STA.b Scrap0F
+
REP #$20 REP #$20
PLA : STA.b Scrap00
LDA.b Scrap0E : STA.b (OAMPtr) LDA.b Scrap0E : STA.b (OAMPtr)
INC.b OAMPtr : INC.b OAMPtr INC.b OAMPtr : INC.b OAMPtr
LDA.b Scrap0C : STA.b (OAMPtr) LDA.b Scrap0C : STA.b (OAMPtr)
INC.b OAMPtr : INC.b OAMPtr INC.b OAMPtr : INC.b OAMPtr
.exit
PLA : STA.b Scrap00
RTS RTS
; Y - dungeon index ; Y - dungeon index
@@ -434,117 +423,6 @@ WorldMap_CheckPrizeCollected:
RTS RTS
warnpc $8AC3B1 warnpc $8AC3B1
org $8AC3B6
; ---------------------------------------------------------------------------------------------------
; Y coordinate calculation: Quadratic approximation
; Formula: Y_oam = 0x16 + (Y * 118 >> 12) + ((Y>>4)^2 * 49 >> 8)
; Accurate to within ±1.5 pixels across entire range
; ---------------------------------------------------------------------------------------------------
REP #$20
LDA.l $7EC108 : ASL #4 ; world Y coordinate
PHA
; calculate linear term: (Y * 118) >> 12
SEP #$20
LDA.b #$76
JSR WorldMap_MultiplyAxB ; (Y>>4) * 118
REP #$20
STA.b Scrap00 ; linear term stored at high byte (Scrap01)
; calculate quadratic term: ((Y>>4)^2 * 49) >> 8
LDA.b 1,S
SEP #$20
XBA : TAX : XBA : TXA
JSR WorldMap_MultiplyAxB ; (Y>>4) ^ 2
LDA.b #$31
JSR WorldMap_MultiplyAxB ; multiply by 49
XBA ; quadratic term
; combine: 0x16 + linear_term + quadratic_term
CLC : ADC.b Scrap01 ; add linear term
ADC.b #$16 ; add fixed offset
STA.b Scrap0F
REP #$20
PLA ; world Y coordinate
; ---------------------------------------------------------------------------------------------------
; Calculate half_width for perspective: 91 + (Y_shifted * 28 / 256)
; The world map appears wider at the bottom than at the top, simulating perspective
; Top (Y=0): X range 0x26-0xDC (half-width: 91), Bottom (Y=FFF): X range 0x08-0xF6 (half-width: 119)
; ---------------------------------------------------------------------------------------------------
SEP #$20
LDA.b #$1C ; width increase factor
JSR WorldMap_MultiplyAxB
XBA : CLC : ADC.b #$5B ; add fixed half-width
STA.b Scrap00
; ---------------------------------------------------------------------------------------------------
; Calculate X offset: X_offset = (X_from_center * half_width * 2) / 256
; where X_from_center = (world_X >> 4) - 128
; The center X is at 129 (0x81)
; ---------------------------------------------------------------------------------------------------
REP #$20
LDA.l $7EC10A : LSR #4 ; world X coordinate
SEP #$20
SEC : SBC.b #$80 ; subtract 128 (center point)
PHP ; preserve carry
BPL + : EOR.b #$FF : INC : + ; absolute value
PHA
LDA.b Scrap00 : ASL : XBA ; half-width x 2
PLA
JSR WorldMap_MultiplyAxB
XBA
PLP : BCS +
STA.b Scrap00
LDA.b #$81 : SEC : SBC.b Scrap00 ; center X position - offset
BRA .store_and_exit
+ CLC : ADC.b #$81 ; center X position + offset
.store_and_exit
STA.b Scrap0E
SEP #$30
JMP WorldMap_CalculateOAMCoordinates_exit_successfully
warnpc $8AC433
; most of this function is copied from the original, but rearranged
org $8AB7F3
FluteMenu_HandleSprites:
LDA.l $7EC108 : PHA
LDA.l $7EC109 : PHA
LDA.l $7EC10A : PHA
LDA.l $7EC10B : PHA
JSL FluteMenu_MoveLinkSprite ; override vanilla (LDA.b $1A : AND.b #$10)
BEQ .continue
JSR WorldMap_CalculateOAMCoordinates : BCC .continue
LDA.b Scrap0E : SEC : SBC.b #$04 : STA.b Scrap0E
LDA.b Scrap0F : SEC : SBC.b #$04 : STA.b Scrap0F
LDA.b #$00 : STA.b Scrap0D
LDA.b #$3E : STA.b Scrap0C
JSL OWMapFluteCancelIcon ; override vanilla (LDA.b #$02 : STA.b Scrap0B)
LDX.b #$10 : JSR WorldMap_HandleSpriteBlink
.continue
warnpc $8AB831
; most of this function is copied from the original, but rearranged
org $8ABF78
WorldMap_HandleSprites:
LDA.l $7EC108 : PHA
LDA.l $7EC109 : PHA
LDA.l $7EC10A : PHA
LDA.l $7EC10B : PHA
JSL WorldMap_SkipHandleSprites ; override vanilla (LDA.b $1A : AND.b #$10)
BEQ .continue
JSR WorldMap_CalculateOAMCoordinates : BCC .continue
LDA.b Scrap0E : SEC : SBC.b #$04 : STA.b Scrap0E
LDA.b Scrap0F : SEC : SBC.b #$04 : STA.b Scrap0F
LDA.b #$00 : STA.b Scrap0D
LDA.b #$3E : STA.b Scrap0C
LDA.b #$02 : STA.b Scrap0B
LDX.b #$00 : JSR WorldMap_HandleSpriteBlink
.continue
warnpc $8ABFB6
pullpc pullpc
WorldMap_LoadChrHalfSlot: WorldMap_LoadChrHalfSlot:

View File

@@ -1190,7 +1190,7 @@ MaybeFlagCompassTotalPickup:
RTL RTL
MaybeFlagMapTotalPickup: MaybeFlagMapTotalPickup:
LDA.l MapHUDMode : AND.b #$0F : BEQ .done ; LDA.l MapHUDMode : AND.b #$0F : BEQ .done
LDA.w DungeonID : BMI .done LDA.w DungeonID : BMI .done
LDA.w ItemReceiptID : CMP.b #$33 : BEQ .set_flag LDA.w ItemReceiptID : CMP.b #$33 : BEQ .set_flag
REP #$20 REP #$20
@@ -1212,7 +1212,7 @@ MaybeFlagDungeonTotalsEntrance:
LDA.l CompassMode : AND.w #$000F : BEQ .maps ; Skip if we're not showing compass counts LDA.l CompassMode : AND.w #$000F : BEQ .maps ; Skip if we're not showing compass counts
JSR FlagCompassCount JSR FlagCompassCount
.maps .maps
LDA.l MapHUDMode : AND.w #$000F : BEQ .done LDA.l MapHUDMode : AND.w #$000F
LDX.w DungeonID LDX.w DungeonID
JSR FlagMapCount JSR FlagMapCount
.done .done

View File

@@ -6,18 +6,18 @@ OWFlags:
dw 0 dw 0
OWReserved: OWReserved:
dw 0 dw 0
OWFog:
db 0 ; 0: disabled - 1: fog clears after visiting either world version of a screen - 2: fog clears after visiting the current world version of a screen
org $aa8010 org $aa8010
OWVersionInfo: OWVersionInfo:
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
;Hooks ;Hooks
org $82a92C org $82a929
JSL OWDetectEdgeTransition ; JSL Link_CheckForEdgeScreenTransition OWDetectTransitionReturn:
org $82a936 org $82a939
OverworldHandleTransitions_PerformEdgeTransition: OverworldHandleTransitions_SpecialTrigger:
JSL OWDetectEdgeTransition
BCS OWDetectTransitionReturn
org $82a999 org $82a999
jsl OWEdgeTransition : nop #4 ;LDA $02A4E3,X : ORA $7EF3CA jsl OWEdgeTransition : nop #4 ;LDA $02A4E3,X : ORA $7EF3CA
@@ -78,6 +78,8 @@ org $8ab7af ;LDA $F2 : ORA $F0 : AND #$C0
jml OWFluteCancel2 : nop jml OWFluteCancel2 : nop
org $8ab90d ;JSL $02E99D org $8ab90d ;JSL $02E99D
jsl OWFluteCancel jsl OWFluteCancel
org $8ab816
JSL OWMapFluteCancelIcon
; allows Frog sprite to spawn in LW and also allows his friend to spawn in their house ; 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) org $868a76 ; < 30a76 - sprite_prep.asm:785 (LDA $7EF3CA : AND.w #$40)
@@ -104,36 +106,20 @@ jsl OWOldManSpeed
org $8aba6c ; < ? - Bank0a.asm:474 () org $8aba6c ; < ? - Bank0a.asm:474 ()
jsl OWMapWorldCheck16 : nop jsl OWMapWorldCheck16 : nop
; Custom Overworld Map ; Mixed Overworld Map
org $8ABA52
JSL OverworldMap_InitGfx_InitScrap
org $8ABA99 org $8ABA99
WorldMap_LoadDarkWorldMap: WorldMap_LoadDarkWorldMap:
LDA.b GameMode : CMP.b #$14 ; attract module LDA.b GameMode : CMP.b #$14 ; attract module
BEQ .vanilla_light BEQ .vanilla_light
LDA.l OWFlags : AND.b #!FLAG_OW_CUSTOM_MAP : BNE .custom LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BNE .mixed
LDA.b OverworldIndex : AND.b #$40 LDA.b OverworldIndex : AND.b #$40
BEQ .vanilla_light BEQ .vanilla_light
.custom .mixed
STZ.b ScrapBuffer72 ; clear tile swap flag PHB : PHK : PLB
JSL LoadMapDarkOrCustom_long JSL LoadMapDarkOrMixed
NOP #2 PLB
warnpc $8ABAB5
.vanilla_light ; $0ABAB5 .vanilla_light ; $0ABAB5
org $8ABD12
JSL MoveZoomedInPositionY
org $8ABD2F
JSL MoveZoomedInPositionX
org $8ABB32
JSL LoadMapOppositeWorld
org $8ABFF0
JSL MoveMirrorPortalMapSprite
; Could insert similar hooks at $8AB860 and $8AB8AC for flute spots
;(replacing -> LDA $8A : AND.b #$40) ;(replacing -> LDA $8A : AND.b #$40)
org $80d8c4 ; < ? - Bank00.asm:4068 () org $80d8c4 ; < ? - Bank00.asm:4068 ()
jsl OWWorldCheck jsl OWWorldCheck
@@ -241,7 +227,6 @@ OWMapWorldCheck16:
{ {
lda.b GameMode : cmp.w #$0014 : beq .return ; attract module, return with Z flag cleared lda.b GameMode : cmp.w #$0014 : beq .return ; attract module, return with Z flag cleared
jsl OWWorldCheck16 jsl OWWorldCheck16
eor.b ScrapBuffer72 ; apply tile swap flag
.return .return
rtl rtl
} }
@@ -356,7 +341,7 @@ OWFluteCancel2:
} }
OWMapFluteCancelIcon: OWMapFluteCancelIcon:
{ {
LDA.b #$02 : STA.b Scrap0B ; what we wrote over STA.b Scrap0B : LDX.b #$10 ; what we wrote over
LDA.l OWFlags+1 : AND.b #$01 : BEQ .return LDA.l OWFlags+1 : AND.b #$01 : BEQ .return
LDA.b GameSubMode : CMP.b #$0A : BNE .return LDA.b GameSubMode : CMP.b #$0A : BNE .return
LDA.b FrameCounter : AND.b #$10 : BNE .return LDA.b FrameCounter : AND.b #$10 : BNE .return
@@ -402,110 +387,51 @@ OWMarkVisited:
RTL RTL
} }
LoadMapDarkOrCustom: LoadMapDarkOrMixed:
{ {
CMP.b #!FLAG_OW_CUSTOM_MAP : REP #$30 : BEQ .custom CMP.b #!FLAG_OW_MIXED : REP #$30 : BEQ .mixed
LDX.w #$03FE ; draw vanilla Dark World (what we wrote over) LDX.w #$03FE ; draw vanilla Dark World (what we wrote over)
.copy_next .copy_next
LDA.w WorldMap_DarkWorldTilemap,X : STA.w GFXStripes,X LDA.w WorldMap_DarkWorldTilemap,X : STA.w GFXStripes,X
DEX : DEX : BPL .copy_next DEX : DEX : BPL .copy_next
BRL .end BRL .end
.custom .mixed
LDX.b OverworldIndex LDX.b OverworldIndex
LDA.l OWTileWorldAssoc,X LDA.l OWTileWorldAssoc,X
AND.w #$0040
EOR.b ScrapBuffer72 ; apply tile swap flag
BEQ .draw_lw
LDA.w #OWMapGridDark
BRA .draw_dw
.draw_lw
LDA.w #OWMapGridLight
.draw_dw
STA.b Scrap00 STA.b Scrap00
LDA.w #OWMapGridLight>>16 ; current program bank LDY.w #$139C
STA.b Scrap02 LDX.w #$003F
LDX.w #$139C .next_screen
LDY.w #$003F PHX
.next_cell LDA.l OWTileWorldAssoc,X
PHY EOR.b Scrap00
JSR GetOWMapTilemapOffsetToCopy AND.w #$0040
.copy_cell ; more efficient to have X on the right side BEQ .light
TAY TYX : BRA .copy_screen
LDA.w WorldMap_LightWorldTilemap+$00,Y : STA.b $00,X .light
LDA.w WorldMap_LightWorldTilemap+$02,Y : STA.b $02,X TXA : AND.w #$0024 : LSR : TAX
LDA.w WorldMap_LightWorldTilemap+$20,Y : STA.b $20,X TYA : SEC : SBC.l LWQuadrantOffsets,X
LDA.w WorldMap_LightWorldTilemap+$22,Y : STA.b $22,X TYX : TAY
LDA.w WorldMap_LightWorldTilemap+$40,Y : STA.b $40,X .copy_screen ; more efficient to have X on the right side
LDA.w WorldMap_LightWorldTilemap+$42,Y : STA.b $42,X LDA.w $C739+$00,Y : STA.b $00,X
LDA.w WorldMap_LightWorldTilemap+$60,Y : STA.b $60,X LDA.w $C739+$02,Y : STA.b $02,X
LDA.w WorldMap_LightWorldTilemap+$62,Y : STA.b $62,X LDA.w $C739+$20,Y : STA.b $20,X
PLY LDA.w $C739+$22,Y : STA.b $22,X
DEX : DEX : DEX : DEX ; move one screen left LDA.w $C739+$40,Y : STA.b $40,X
TYA : AND.w #$0007 : BNE .same_row LDA.w $C739+$42,Y : STA.b $42,X
TXA : SEC : SBC.w #$0060 : TAX ; move one screen row up 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 .same_row
DEY DEX
BPL .next_cell BPL .next_screen
.end .end
SEP #$30 SEP #$30
LDA.b #$15 : STA.b NMIINCR ; what we wrote over LDA.b #$15 : STA.b NMIINCR ; what we wrote over
RTS RTL
}
GetOWMapTilemapOffsetToCopy:
{
LDA.l OWFog : AND.w #$00FF
CMP.w #$0001 : BEQ .parallel_fog
CMP.w #$0002 : BNE .no_fog
LDA.b [Scrap00],Y : AND.w #$00FF
PHX
TAX
BIT.w #$0040
BEQ .light_fog
LDA.l Overworld_ActualScreenID-$40,X : ORA.w #$0040
BRA .dark_fog
.light_fog
LDA.l Overworld_ActualScreenID,X
.dark_fog
AND.w #$00FF
TAX
LDA.l OverworldEventDataWRAM,X
.check_visited_flag
PLX
AND.w #$0080 : BNE .no_fog
LDA.w #($D350-$C739)
RTS
.parallel_fog
LDA.b [Scrap00],Y : AND.w #$003F
PHX
TAX
LDA.l Overworld_ActualScreenID,X
AND.w #$00FF
TAX
LDA.l OverworldEventDataWRAM,X
ORA.l OverworldEventDataWRAM+$40,X
BRA .check_visited_flag
.no_fog
LDA.b [Scrap00],Y : AND.w #$0038 : ASL : ASL : ASL : ASL
STA.b Scrap03
LDA.b [Scrap00],Y
BIT.w #$0040
BEQ .light
AND.w #$0007
ASL : ASL : ADC.w #$1000 : ADC.b Scrap03
RTS
.light
PHX
AND.w #$0024 : LSR : TAX
LDA.b [Scrap00],Y
AND.w #$0007
ASL : ASL : ADC.w #$1000 : ADC.b Scrap03
SEC : SBC.l LWQuadrantOffsets,X
PLX
RTS
LWQuadrantOffsets: LWQuadrantOffsets:
dw $1000-$0210 ; top left dw $1000-$0210 ; top left
@@ -515,143 +441,6 @@ GetOWMapTilemapOffsetToCopy:
dw $0400+$0210 ; bottom right dw $0400+$0210 ; bottom right
} }
OverworldMap_InitGfx_InitScrap:
{
STZ.b ScrapBuffer72 ; clear tile swap flag
LDA.b #$11 : STA.b MAINDESQ ; what we wrote over
RTL
}
LoadMapDarkOrCustom_long:
{
PHB : LDA.b #WorldMap_DarkWorldTilemap>>16 : PHA : PLB
LDA.l OWFlags : AND.b #!FLAG_OW_CUSTOM_MAP
JSR LoadMapDarkOrCustom
PLB
RTL
}
LoadMapOppositeWorld:
{
LDA.l OWFlags : AND.b #!FLAG_OW_ADJUST_DYNAMIC_MAP_SPRITE_POSITION : BEQ .vanilla
LDA.b ScrapBuffer72 : BEQ +
LDA.b Joy1B_All : AND.b #$30 : BNE .vanilla
STZ.b ScrapBuffer72 ; clear tile swap flag
BRA .new_tiles
+ LDA.b Joy1B_New : AND.b #$30 : BEQ .vanilla
LDA.b #$40 : STA.b ScrapBuffer72 ; set tile swap flag
.new_tiles
JSL OverworldMap_InitGfx+$10 ; load palette
DEC.w SubModuleInterface
LDA.b #$0F : STA.b INIDISPQ
JSL LoadMapDarkOrCustom_long
LDA.b #$24 : STA.w SFX3
PLA : PLA : PEA.w $BBAF ; skip everything upon return
.vanilla
LDA.b Joy1B_New : AND.b #$70 ; what we wrote over
RTL
}
FluteMenu_MoveLinkSprite:
{
JSR MoveMapSprite
BRA WorldMap_SkipHandleSprites_vanilla
}
WorldMap_SkipHandleSprites:
{
JSR MoveMapSprite : BEQ .vanilla
LDA.b ScrapBuffer72 : BEQ .vanilla ; skip draw if no tile swap
PLA : PLA : PEA.w $C39B ; exit without drawing sprites
RTL
.vanilla
LDA.b FrameCounter : AND.b #$10 ; what we wrote over
RTL
}
MoveMirrorPortalMapSprite:
{
STA.l $7EC109 ; what we overwrote
JSR MoveMapSprite
RTL
}
MoveZoomedInPositionY:
{
LDA.l OWFlags : AND.w #!FLAG_OW_ADJUST_DYNAMIC_MAP_SPRITE_POSITION : BEQ .vanilla
SEP #$20
JSR MoveMapSprite_Setup
JSR MoveMapSprite_GetYCoordHighByte
PHA
REP #$20
LDA.l $7EC108 : XBA
SEP #$20
PLA : XBA
REP #$20
RTL
.vanilla
LDA.l $7EC108 ; what we overwrote
RTL
}
MoveZoomedInPositionX:
{
LDA.l OWFlags : AND.w #!FLAG_OW_ADJUST_DYNAMIC_MAP_SPRITE_POSITION : BEQ .vanilla
SEP #$20
JSR MoveMapSprite_Setup
JSR MoveMapSprite_GetXCoordHighByte
PHA
REP #$20
LDA.l $7EC10A : XBA
SEP #$20
PLA : XBA
REP #$20
RTL
.vanilla
LDA.l $7EC10A ; what we overwrote
RTL
}
MoveMapSprite:
{
LDA.l OWFlags : AND.b #!FLAG_OW_ADJUST_DYNAMIC_MAP_SPRITE_POSITION : BEQ .return
PHP
JSR MoveMapSprite_Setup
JSR MoveMapSprite_GetXCoordHighByte : STA.l $7EC10B
JSR MoveMapSprite_GetYCoordHighByte : STA.l $7EC109
PLP
.return
RTS
}
MoveMapSprite_Setup:
{
LDA.l $7EC10B : AND.b #$0E : LSR
STA.b Scrap00
LDA.l $7EC109 : AND.b #$0E : ASL : ASL
ADC.b Scrap00
STA.b Scrap00
LDX.b OverworldIndex
LDA.l OWTileWorldAssoc,X
LDX.b Scrap00
AND.b #$40
BEQ .light
LDA.l OWMapGridDarkPositionByAbsolutePosition,X
BRA .dark
.light
LDA.l OWMapGridLightPositionByAbsolutePosition,X
.dark
TAX
AND.b #$07 : ASL
STA.b Scrap00
RTS
}
MoveMapSprite_GetXCoordHighByte:
{
LDA.l $7EC10B : AND.b #$01 : ORA.b Scrap00
RTS
}
MoveMapSprite_GetYCoordHighByte:
{
TXA : AND.b #$38 : LSR : LSR : STA.b Scrap00
LDA.l $7EC109 : AND.b #$01 : ORA.b Scrap00
RTS
}
OWBonkDropPrepSprite: OWBonkDropPrepSprite:
{ {
LDA.b IndoorsFlag : BEQ + LDA.b IndoorsFlag : BEQ +
@@ -820,26 +609,27 @@ OWBonkDrops:
JSL OWBonkSpritePrep JSL OWBonkSpritePrep
.mark_collected ; S = Collected, FlagBitmask, X (row + 2) .mark_collected ; S = Collected, FlagBitmask, X (row + 2)
PLA : BEQ + : - : JMP .return : + ; S = FlagBitmask, X (row + 2) PLA : BNE + ; S = FlagBitmask, X (row + 2)
TYX : JSL Sprite_IsOnscreen : BCC - TYX : JSL Sprite_IsOnscreen : BCC +
LDA.b IndoorsFlag : BEQ + LDA.b IndoorsFlag : BEQ ++
LDA.l RoomDataWRAM[$0120].high : ORA.b 1,S : STA.l RoomDataWRAM[$0120].high LDA.l RoomDataWRAM[$0120].high : ORA.b 1,S : STA.l RoomDataWRAM[$0120].high
LDA.w $0400 : ORA.b 1,S : STA.w $0400 LDA.w $0400 : ORA.b 1,S : STA.w $0400
BRA .increment_collection BRA .increment_collection
+ ++
LDA.b OverworldIndex LDA.b OverworldIndex
BIT.b #$40 : BEQ + BIT.b #$40 : BEQ +
LDA.l ProgressIndicator : CMP.b #$02 LDA.l ProgressIndicator : CMP.b #$02
LDA.b OverworldIndex : BCS + : AND.b #$BF LDA.b OverworldIndex : BCS ++ : AND.b #$BF
++
+ +
TAX : LDA.l OverworldEventDataWRAM,X : ORA.b 1,S : STA.l OverworldEventDataWRAM,X TAX : LDA.l OverworldEventDataWRAM,X : ORA.b 1,S : STA.l OverworldEventDataWRAM,X
.increment_collection .increment_collection
REP #$20 REP #$20
LDA.l TotalItemCounter : INC : STA.l TotalItemCounter LDA.l TotalItemCounter : INC : STA.l TotalItemCounter
INC.w UpdateHUDFlag
SEP #$20 SEP #$20
LDA.b #$01 : STA.l UpdateHUDFlag + BRA .return
BRA .return
; spawn itemget item ; spawn itemget item
.spawn_item ; A = item id ; Y = bonk sprite slot ; S = Collected, FlagBitmask, X (row + 2) .spawn_item ; A = item id ; Y = bonk sprite slot ; S = Collected, FlagBitmask, X (row + 2)
@@ -948,29 +738,20 @@ OWBonkSpritePrep:
org $aa9000 org $aa9000
OWDetectEdgeTransition: OWDetectEdgeTransition:
{ {
JSL Link_CheckForEdgeScreenTransition ; what we wrote over JSL OWDestroyItemSprites
BCS .return
STZ.w RandoOverworldWalkDist STZ.w RandoOverworldWalkDist
LDA.l OWMode : ORA.l OWMode+1 : BEQ .vanilla LDA.l OWMode : ORA.l OWMode+1 : BEQ .vanilla
PHY
JSR OWShuffle JSR OWShuffle
PLY LDA.w RandoOverworldTargetEdge : BMI .special
LDA.w RandoOverworldTargetEdge : BMI .specialOrDisabled
.vanilla .vanilla
CLC ; allow transition REP #$31 : LDX.b Scrap02 : LDA.b OverworldMap16Buffer ; what we wrote over
RTL RTL
.specialOrDisabled
CMP.b #$FF : BNE .special
STZ.w RandoOverworldTargetEdge
PHB
JML Link_CheckForEdgeScreenTransition_prevent_transition
.special .special
REP #$30 REP #$30
AND.w #$0003 : TAY : ASL : TAX AND.w #$0003 : TAY : ASL : TAX
LDA.w #$007F : STA.w RandoOverworldTargetEdge LDA.w #$007F : STA.w RandoOverworldTargetEdge
JSR OWLoadSpecialArea JSR OWLoadSpecialArea
SEC SEC
.return
RTL RTL
} }
OWDetectSpecialTransition: OWDetectSpecialTransition:
@@ -980,23 +761,17 @@ OWDetectSpecialTransition:
TXA : AND.w #$0002 : LSR TXA : AND.w #$0002 : LSR
STA.w RandoOverworldTerrain STA.w RandoOverworldTerrain
LDA.l OWSpecialDestIndex,X : BIT.w #$0080 : BEQ .switch_to_edge LDA.l OWSpecialDestIndex,X : BIT.w #$0080 : BEQ .switch_to_edge
AND.w #$00FF : CMP.w #$00FF : BEQ .disabled
AND.w #$0003 : TAY : ASL : TAX AND.w #$0003 : TAY : ASL : TAX
.normal .normal
JSR OWLoadSpecialArea JSR OWLoadSpecialArea
.return .return
RTL RTL
.disabled
SEP #$30
STZ.w RandoOverworldTargetEdge
RTL
.switch_to_edge .switch_to_edge
STA.w RandoOverworldTargetEdge STA.w RandoOverworldTargetEdge
LDA.l OWEdgeDataOffset,X : STA.w RandoOverworldEdgeAddr LDA.l OWEdgeDataOffset,X : STA.w RandoOverworldEdgeAddr
PLA : SEP #$30 : PLA ; delete 3 bytes from stack PLA : SEP #$30 : PLA ; delete 3 bytes from stack
JSL Link_CheckForEdgeScreenTransition : BCS .return JSL Link_CheckForEdgeScreenTransition : BCS .return ; Link_CheckForEdgeScreenTransition
LDA.l Overworld_CheckForSpecialOverworldTrigger_Direction,X : STA.b Scrap00 : CMP.b #$08 : BNE .hobo 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 LSR : STA.b LinkPosY : STZ.b BG2V ; move Link and camera to edge
LDA.b #$06 : STA.b Scrap02 LDA.b #$06 : STA.b Scrap02
@@ -1015,15 +790,16 @@ OWDetectSpecialTransition:
LDA.b #$FF : STA.b LinkRecoilZ : STA.b $C7 LDA.b #$FF : STA.b LinkRecoilZ : STA.b $C7
STZ.b $3D : STZ.b LinkSpeed : STZ.w $032B : STZ.w LinkDashing : STZ.b LinkState STZ.b $3D : STZ.b LinkSpeed : STZ.w $032B : STZ.w LinkDashing : STZ.b LinkState
.not_dashing .not_dashing
PLA : PLA : PLA ; delete 3 bytes from stack PLA : REP #$31 : PLA ; delete 3 bytes from stack
JML OverworldHandleTransitions_PerformEdgeTransition LDX.b Scrap02
LDA.b OverworldMap16Buffer
JML OverworldHandleTransitions_SpecialTrigger+6
} }
OWEdgeTransition: OWEdgeTransition:
{ {
LDA.l OWMode : ORA.l OWMode+1 : BEQ .unshuffled LDA.l OWMode : ORA.l OWMode+1 : BEQ .unshuffled
LDY.w RandoOverworldTargetEdge : STZ.w RandoOverworldTargetEdge LDY.w RandoOverworldTargetEdge : STZ.w RandoOverworldTargetEdge
CPY.b #$7F : BEQ .unshuffled CPY.b #$7F : BEQ .unshuffled
JSL OWDestroyItemSprites
REP #$10 REP #$10
LDX.w RandoOverworldEdgeAddr LDX.w RandoOverworldEdgeAddr
PHB : PHK : PLB PHB : PHK : PLB
@@ -1341,7 +1117,6 @@ OWWorldTerrainUpdate: ; x = owid of destination screen, y = 1 for land to water,
STZ.w RandoOverworldForceTrans STZ.w RandoOverworldForceTrans
CMP.b #$02 : BNE + CMP.b #$02 : BNE +
DEC : STA.w LinkDeepWater : STZ.w LinkSwimDirection DEC : STA.w LinkDeepWater : STZ.w LinkSwimDirection
LDA.b FlagBY : AND.b #$7F : STA.b FlagBY
LDA.b #$04 : BRA .set_state LDA.b #$04 : BRA .set_state
+ +
CMP.b #$03 : BNE ++ CMP.b #$03 : BNE ++
@@ -1362,7 +1137,6 @@ OWWorldTerrainUpdate: ; x = owid of destination screen, y = 1 for land to water,
LDA.b #$01 : STA.w LinkDeepWater LDA.b #$01 : STA.w LinkDeepWater
LDA.l FlippersEquipment : BEQ .no_flippers ; check if flippers obtained LDA.l FlippersEquipment : BEQ .no_flippers ; check if flippers obtained
LDA.b LinkState : CMP.b #$17 : BEQ .no_flippers ; check if bunny LDA.b LinkState : CMP.b #$17 : BEQ .no_flippers ; check if bunny
LDA.b FlagBY : AND.b #$7F : STA.b FlagBY
LDA.b #$04 : STA.b LinkState : STZ.w LinkSwimDirection : RTS LDA.b #$04 : STA.b LinkState : STZ.w LinkSwimDirection : RTS
.no_flippers .no_flippers
PHX PHX
@@ -1714,7 +1488,7 @@ dw $0b28, $0b38, $0010, $0b30, $1515, $1018, $0001, $000e
dw $0b70, $0ba0, $0030, $0b88, $1515, $1020, $0000, $000f dw $0b70, $0ba0, $0030, $0b88, $1515, $1020, $0000, $000f
dw $0a40, $0b10, $00d0, $0aa8, $1d1d, $1006, $0000, $0010 dw $0a40, $0b10, $00d0, $0aa8, $1d1d, $1006, $0000, $0010
dw $0350, $0390, $0040, $0370, $1821, $2060, $0000, $0011 dw $0350, $0390, $0040, $0370, $1821, $2060, $0000, $0011
dw $0670, $06a8, $0038, $068c, $1b23, $2004, $0000, $0012 dw $0670, $06a8, $0038, $068c, $1b23, $2002, $0000, $0012
dw $0898, $09b0, $0118, $0924, $1b24, $2054, $0000, $0013 dw $0898, $09b0, $0118, $0924, $1b24, $2054, $0000, $0013
dw $0a40, $0ba0, $0160, $0af0, $2525, $100e, $0000, $0014 dw $0a40, $0ba0, $0160, $0af0, $2525, $100e, $0000, $0014
dw $0c70, $0c90, $0020, $0c80, $1e26, $2002, $0000, $0015 dw $0c70, $0c90, $0020, $0c80, $1e26, $2002, $0000, $0015
@@ -1746,7 +1520,7 @@ dw $0b28, $0b38, $0010, $0b30, $5555, $1018, $0001, $002e
dw $0b70, $0ba0, $0030, $0b88, $5555, $1020, $0000, $002f dw $0b70, $0ba0, $0030, $0b88, $5555, $1020, $0000, $002f
dw $0a40, $0b10, $00d0, $0aa8, $5d5d, $1006, $0000, $0030 dw $0a40, $0b10, $00d0, $0aa8, $5d5d, $1006, $0000, $0030
dw $0350, $0390, $0040, $0370, $5861, $2060, $0000, $0031 dw $0350, $0390, $0040, $0370, $5861, $2060, $0000, $0031
dw $0670, $06a8, $0038, $068c, $5b63, $2004, $0000, $0032 dw $0670, $06a8, $0038, $068c, $5b63, $2002, $0000, $0032
dw $0898, $09b0, $0118, $0924, $5b64, $2054, $0000, $0033 dw $0898, $09b0, $0118, $0924, $5b64, $2054, $0000, $0033
dw $0a40, $0ba0, $0160, $0af0, $6565, $100e, $0000, $0034 dw $0a40, $0ba0, $0160, $0af0, $6565, $100e, $0000, $0034
dw $0c70, $0c90, $0020, $0c80, $5e66, $2002, $0000, $0035 dw $0c70, $0c90, $0020, $0c80, $5e66, $2002, $0000, $0035
@@ -2053,42 +1827,16 @@ db $74, $4e, $10, $b1, $00, $1c
UWBonkPrizeData: UWBonkPrizeData:
db $ff, $00, $02, $b5, $00, $08 db $ff, $00, $02, $b5, $00, $08
org $AABC80 ;PC 153C80 ; temporary fix - murahdahla replaces one of the bonk tree prizes
OWMapGridLight: ; so we copy the sprite table here and update the pointer
db $00, $01, $02, $03, $04, $05, $06, $07 ; longterm solution should be to spawn in murahdahla separately
db $08, $09, $0A, $0B, $0C, $0D, $0E, $0F org $89AE2A
db $10, $11, $12, $13, $14, $15, $16, $17 Overworld_Sprites_Screen1A_2:
db $18, $19, $1A, $1B, $1C, $1D, $1E, $1F db $08, $0F, $41 ; yx:{ 0x080, 0x0F0 }
db $20, $21, $22, $23, $24, $25, $26, $27 db $0E, $0C, $41 ; yx:{ 0x0E0, 0x0C0 }
db $28, $29, $2A, $2B, $2C, $2D, $2E, $2F db $11, $0D, $E3 ; yx:{ 0x110, 0x0D0 }
db $30, $31, $32, $33, $34, $35, $36, $37 db $18, $0A, $D8 ; yx:{ 0x180, 0x0A0 }
db $38, $39, $3A, $3B, $3C, $3D, $3E, $3F db $18, $0F, $45 ; yx:{ 0x180, 0x0F0 }
OWMapGridDark: db $FF ; END
db $40, $41, $42, $43, $44, $45, $46, $47 org $89CA55
db $48, $49, $4A, $4B, $4C, $4D, $4E, $4F dw Overworld_Sprites_Screen1A_2&$FFFF
db $50, $51, $52, $53, $54, $55, $56, $57
db $58, $59, $5A, $5B, $5C, $5D, $5E, $5F
db $60, $61, $62, $63, $64, $65, $66, $67
db $68, $69, $6A, $6B, $6C, $6D, $6E, $6F
db $70, $71, $72, $73, $74, $75, $76, $77
db $78, $79, $7A, $7B, $7C, $7D, $7E, $7F
org $AABD00 ;PC 153D00
OWMapGridLightPositionByAbsolutePosition:
db $00, $01, $02, $03, $04, $05, $06, $07
db $08, $09, $0A, $0B, $0C, $0D, $0E, $0F
db $10, $11, $12, $13, $14, $15, $16, $17
db $18, $19, $1A, $1B, $1C, $1D, $1E, $1F
db $20, $21, $22, $23, $24, $25, $26, $27
db $28, $29, $2A, $2B, $2C, $2D, $2E, $2F
db $30, $31, $32, $33, $34, $35, $36, $37
db $38, $39, $3A, $3B, $3C, $3D, $3E, $3F
OWMapGridDarkPositionByAbsolutePosition:
db $00, $01, $02, $03, $04, $05, $06, $07
db $08, $09, $0A, $0B, $0C, $0D, $0E, $0F
db $10, $11, $12, $13, $14, $15, $16, $17
db $18, $19, $1A, $1B, $1C, $1D, $1E, $1F
db $20, $21, $22, $23, $24, $25, $26, $27
db $28, $29, $2A, $2B, $2C, $2D, $2E, $2F
db $30, $31, $32, $33, $34, $35, $36, $37
db $38, $39, $3A, $3B, $3C, $3D, $3E, $3F

View File

@@ -65,8 +65,6 @@ LinkSubPixelVelocty = $7E002A ; Word length
LinkAnimationStep = $7E002E ; LinkAnimationStep = $7E002E ;
LinkDirection = $7E002F ; $00 = Up | $02 = Down | $04 = Left | $06 = Right LinkDirection = $7E002F ; $00 = Up | $02 = Down | $04 = Left | $06 = Right
; ;
FlagBY = $7E003A ; Bitfield for B and Y buttons.
;
OAMOffsetY = $7E0044 ; OAMOffsetY = $7E0044 ;
OAMOffsetX = $7E0045 ; OAMOffsetX = $7E0045 ;
LinkIncapacitatedTimer = $7E0046 ; Countdown when Link takes damage, not same as I-frames LinkIncapacitatedTimer = $7E0046 ; Countdown when Link takes damage, not same as I-frames
@@ -237,8 +235,6 @@ CurrentYItem = $7E0303 ;
AButtonAct = $7E0308 ; Bitfield for A-actions. $80 = Carry/toss | $02 Prayer | $01 = Tree pull AButtonAct = $7E0308 ; Bitfield for A-actions. $80 = Carry/toss | $02 Prayer | $01 = Tree pull
CarryAct = $7E0309 ; Bitfield for carrying. $02 = Tossing | $01 = Lifting CarryAct = $7E0309 ; Bitfield for carrying. $02 = Tossing | $01 = Lifting
; ;
LinkIFrames = $7E031F ; Countdown for Link's invincibility frames after taking damage.
;
LinkSwimDirection = $7E0340 ; Bitfield for swim direction. (.... udlr) LinkSwimDirection = $7E0340 ; Bitfield for swim direction. (.... udlr)
; ;
LinkDeepWater = $7E0345 ; Set when Link is in deep water. LinkDeepWater = $7E0345 ; Set when Link is in deep water.
@@ -781,7 +777,6 @@ endmacro
%assertRAM(LinkRecoilZ, $7E0029) %assertRAM(LinkRecoilZ, $7E0029)
%assertRAM(LinkAnimationStep, $7E002E) %assertRAM(LinkAnimationStep, $7E002E)
%assertRAM(LinkDirection, $7E002F) %assertRAM(LinkDirection, $7E002F)
%assertRAM(FlagBY, $7E003A)
%assertRAM(OAMOffsetY, $7E0044) %assertRAM(OAMOffsetY, $7E0044)
%assertRAM(OAMOffsetX, $7E0045) %assertRAM(OAMOffsetX, $7E0045)
%assertRAM(LinkIncapacitatedTimer, $7E0046) %assertRAM(LinkIncapacitatedTimer, $7E0046)
@@ -879,8 +874,6 @@ endmacro
%assertRAM(UseY1, $7E0301) %assertRAM(UseY1, $7E0301)
%assertRAM(CurrentYItem, $7E0303) %assertRAM(CurrentYItem, $7E0303)
%assertRAM(AButtonAct, $7E0308) %assertRAM(AButtonAct, $7E0308)
%assertRAM(CarryAct, $7E0309)
%assertRAM(LinkIFrames, $7E031F)
%assertRAM(LinkSwimDirection, $7E0340) %assertRAM(LinkSwimDirection, $7E0340)
%assertRAM(LinkDeepWater, $7E0345) %assertRAM(LinkDeepWater, $7E0345)
%assertRAM(TileActIce, $7E0348) %assertRAM(TileActIce, $7E0348)

View File

@@ -99,7 +99,6 @@ HandleFollowersAfterMirroring = $87AA8B
LinkHop_FindArbitraryLandingSpot = $87E359 LinkHop_FindArbitraryLandingSpot = $87E359
Link_HandleMovingAnimation_FullLongEntry = $87E68F Link_HandleMovingAnimation_FullLongEntry = $87E68F
Link_CheckForEdgeScreenTransition = $87F413 Link_CheckForEdgeScreenTransition = $87F413
Link_CheckForEdgeScreenTransition_prevent_transition = $87F42C
Sprite_CheckIfPlayerPreoccupied = $87F4AA Sprite_CheckIfPlayerPreoccupied = $87F4AA
FlashGanonTowerPalette_next_thunder = $87FA81 FlashGanonTowerPalette_next_thunder = $87FA81
FlashGanonTowerPalette_bright_white = $87FAAC FlashGanonTowerPalette_bright_white = $87FAAC
@@ -222,8 +221,6 @@ Ancilla29_MilestoneItemReceipt_skip_crystal_sfx = $88CAE5
Ancilla29_MilestoneItemReceipt_no_sparkle = $88CB2E Ancilla29_MilestoneItemReceipt_no_sparkle = $88CB2E
Ancilla_SetOAM_XY = $88F6F3 Ancilla_SetOAM_XY = $88F6F3
Ancilla_AddAncilla = $899CCE Ancilla_AddAncilla = $899CCE
WorldMap_CalculateOAMCoordinates_exit_successfully = $8AC51F
WorldMap_MultiplyAxB = $8AC57F
UpdateHUD = $8DDFA9 UpdateHUD = $8DDFA9
UpdateEquippedItem = $8DDFAF UpdateEquippedItem = $8DDFAF
DrawProgressIcons = $8DE9C8 DrawProgressIcons = $8DE9C8
@@ -298,7 +295,6 @@ WorldMap_RedXChars = $8ABF70
WorldMap_CalculateOAMCoordinates = $8AC3B1 WorldMap_CalculateOAMCoordinates = $8AC3B1
WorldMap_HandleSpriteBlink = $8AC52E WorldMap_HandleSpriteBlink = $8AC52E
WorldMapIcon_AdjustCoordinate = $8AC59B WorldMapIcon_AdjustCoordinate = $8AC59B
WorldMap_LightWorldTilemap = $8AC739
WorldMap_DarkWorldTilemap = $8AD739 WorldMap_DarkWorldTilemap = $8AD739
DungeonMapRoomMarkerYBase = $8AE803 DungeonMapRoomMarkerYBase = $8AE803
DungeonMapBossRooms = $8AE817 DungeonMapBossRooms = $8AE817