From 9d6e2c770d3e6b6d7bb066b8e5192b859e5f9d09 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 1 Oct 2023 06:13:36 -0500 Subject: [PATCH] New solution for mirror portal disabling in Crossed OWR Map check correctly displays mirror portal sprite --- Rom.py | 2 +- asm/owrando.asm | 113 +++++++++++++++++++----------------------- data/base2current.bps | Bin 107648 -> 107671 bytes 3 files changed, 52 insertions(+), 63 deletions(-) diff --git a/Rom.py b/Rom.py index de4d9cbc..a99e98c7 100644 --- a/Rom.py +++ b/Rom.py @@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '86a1b18573f57f5035a6937463d5d2cc' +RANDOMIZERBASEHASH = '52317b2dd4fb303887f26ecc40a4cae3' class JsonRom(object): diff --git a/asm/owrando.asm b/asm/owrando.asm index d74718dd..adc7635e 100644 --- a/asm/owrando.asm +++ b/asm/owrando.asm @@ -56,16 +56,17 @@ Link_ResetSwimmingState: ; mirror hooks -org $02FBAB -JSL OWMirrorSpriteRestore : NOP +org $0283DC ; override world check when spawning mirror portal sprite in Crossed OWR +jsl.l OWLightWorldOrCrossed org $05AF75 Sprite_6C_MirrorPortal: -jsl OWPreserveMirrorSprite : nop #2 ; LDA $7EF3CA : BNE $05AFDF +jsl OWMirrorSpriteDisable ; LDA $7EF3CA +org $05AF88 +jsl OWMirrorSpriteSkipDraw : NOP ; LDA.w $0FC6 : CMP.b #$03 org $05AFDF Sprite_6C_MirrorPortal_missing_mirror: -JML OWMirrorSpriteDelete : NOP ; STZ $0DD0,X : BRA $05AFF1 -org $0ABFBF -JSL OWMirrorSpriteOnMap : BRA + : NOP #6 : + +org $0ABFB6 +jsl OWMirrorSpriteOnMap : NOP ; LDA.w $008A : CMP.b #$40 ; whirlpool shuffle cross world change org $02b3bd @@ -100,10 +101,6 @@ jsl OWOldManSpeed ;org $09c957 ; <- 4c957 ;dw #$cb5f ; matches value on Central Bonk Rocks screen -; override world check when spawning mirror portal sprite in Crossed OWR -org $0283dc -jsl.l OWLightWorldOrCrossed - ; override world check when viewing overworld (incl. title screen portion) org $0aba6c ; < ? - Bank0a.asm:474 () jsl.l OWMapWorldCheck16 : nop @@ -172,6 +169,11 @@ plb : rtl nop #3 + +; follower hooks +;org $8689D9 +;SpritePrep_BombShoppe: +;JML BombShoppe_ConditionalSpawn : NOP + ;Code org $aa8800 OWTransitionDirection: @@ -257,66 +259,42 @@ OWDestroyItemSprites: DEX : BPL .nextSprite PLX : RTL } + OWMirrorSpriteOnMap: { - lda.w $1ac0,x : bit.b #$f0 : beq .continue - lda.b #$00 : rtl - .continue - ora.w $1ab0,x - ora.w $1ad0,x - ora.w $1ae0,x - rtl + JSL OWWorldCheck + CMP.b #$40 ; part of what we wrote over + RTL } -OWPreserveMirrorSprite: +OWMirrorSpriteDisable: { - lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .vanilla ; if OW Crossed, skip world check and continue - lda.b $10 : cmp.b #$0f : beq .vanilla ; if performing mirror superbunny - rtl + LDA.b $10 : 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 InvertedMode : beq + - lda.l CurrentWorld : beq .deleteMirror - rtl - + lda.l CurrentWorld : bne .deleteMirror - rtl - - .deleteMirror - lda.b $10 : cmp.b #$0f : bne + - jsr.w OWMirrorSpriteMove ; if performing mirror superbunny - + pla : pla : pla : jml Sprite_6C_MirrorPortal_missing_mirror -} -OWMirrorSpriteMove: -{ - lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq + - lda.w $1acf : ora.b #$40 : sta.w $1acf - + rts -} -OWMirrorSpriteBonk: -{ - jsr.w OWMirrorSpriteMove - lda.b #$2c : jml SetGameModeLikeMirror ; what we wrote over -} -OWMirrorSpriteDelete: -{ - stz.w $0dd0,x ; what we wrote over - jsr.w OWMirrorSpriteMove - jml Sprite_6C_MirrorPortal_dont_do_warp -} -OWMirrorSpriteRestore: -{ - lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .return - lda.l InvertedMode : beq + - lda.l CurrentWorld : beq .return - bra .restorePortal - + lda.l CurrentWorld : bne .return - - .restorePortal - lda.w $1acf : and.b #$0f : sta.w $1acf - - .return - rep #$30 : lda.w $04AC ; what we wrote over + 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 $0D90,x ; disables collision + sec : rtl + + .vanilla + LDA.w $0FC6 : CMP.b #$03 ; what we wrote over + RTL +} OWLightWorldOrCrossed: { lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq ++ @@ -563,6 +541,7 @@ OWBonkDrops: INX : LDA.w OWBonkPrizeData,X : PHX : PHA ; S = FlagBitmask, X (row + 2) LDX.b $8A : LDA.l OverworldEventDataWRAM,X : AND 1,S : PHA : BNE + ; S = Collected, FlagBitmask, X (row + 2) LDA.b #$1B : STA $12F ; 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 + LDA 3,S : TAX : INX : LDA.w OWBonkPrizeData,X PHA : INX : LDA.w OWBonkPrizeData,X : BEQ + @@ -894,6 +873,7 @@ OWNewDestination: ++ lda $84 : !add 1,s : sta $84 : pla : pla .adjustMainAxis + ;LDA $84 : SEC : SBC #$0400 : AND #$0F80 : ASL : XBA : STA $88 ; vram LDA $84 : SEC : SBC #$0400 : AND #$0F00 : ASL : XBA : STA $88 ; vram LDA $84 : SEC : SBC #$0010 : AND #$003E : LSR : STA $86 @@ -956,6 +936,7 @@ OWNewDestination: sep #$30 : lda $04 : and #$3f : !add OWOppSlotOffset,y : asl : sta $700 ; crossed OW shuffle and terrain + ;lda $8a : JSR OWDetermineScreensPaletteSet : STX $04 ldx $05 : ldy $08 : jsr OWWorldTerrainUpdate ldx $8a : lda $05 : sta $8a : stx $05 ; $05 is prev screen id, $8a is dest screen @@ -1180,6 +1161,14 @@ OWEndScrollTransition: RTL } +; BombShoppe_ConditionalSpawn: +; { +; nop +; INC.w $0BA0,X : LDA.b #$B5 ; what we wrote over +; JML SpritePrep_BombShoppe+5 +; nop#20 +; } + ;Data org $aaa000 OWEdgeOffsets: diff --git a/data/base2current.bps b/data/base2current.bps index b8fe1dc27a4202adcb7a7bd05c87e9f74a961d59..3c56274a00f1b9d319f2082083e17de09264ec86 100644 GIT binary patch delta 489 zcmVP`fsrDWh^p#XfwQp>PBH=t zih}_{mjOZnE==|B`fDOUh^omzYo!p$56}l_XlPvDuLZ9IfT}41@V^Rr+Lul@rhyrk zZ+n)OQ3s%bfR}q+1%Rmqo{$YVYpuo)$pfEkS{;C=t>u?-LID~oj}(BJsQ`}#P=9Nd zR(GVK&;(q)w+ik60+*Sk@C>E$$w1HssR5I!uRoW!LIGg`_Lmt$0b~JmmwrP58!Hft zkBfbQ$*|A`sd-HBipfII2O?Ol22Avd$u!Ufso6~Mipe$51*zIh@R!6x0XP94m;FNl zJ^>$>JVXIp0YI0TL;*%MD-!~Mg(Cr<6b%A^(W3*Z=)C~DNa(!)yYL0dXiU6}%4nOS zg_4Y;gvFMO$u!Ugso5Azl9v=k0cIXkBDt4bZIQEdGp3PD8;$z#mw9snfQd{SjbDHS zbeEV#0WJd{m2sEJMFBPf5J#5*Mgiss8gK)Eflr@Ox9>&)9RmplD;1ugtNd8 zPBH@giGvVAmk>e$E<%a#`fHP6bAXdl5Z<|5->(I)1AwY20`MrD#t)Ye8I6`v2cUs~ zmV94?p$Mr1jm8h2&<(p6JC2t^H>Rg=H>MGQmx@9G8Z086=>n+$j|NbGYnDzHpP|qM zT)npn?f?RpVmPLy@C>E$$w1HssR5I!uOpYvLIGg`=$9}<0c1yJi&~qnLGpen0!YvW zsT++i0j~hOs_>UPZjXfmi;s(afyuDY1*v&V;)=;a&<7$|tp-fyipez41*zFg;)=;N z&;_a5OyZZ@LjgDe5tkH10X_i{ms3OmTmdAPutWhy3J((kfQ2IgpLh(GMFA8Su8hiP zo1%q;jH86bh>XcJ&<3g57)*qhD@6fj9ycPnmt1X;vsg2xkxUJZ`tX-sa{_>gObv}+ zfM|1