From 04baad9a5f9a2d7b622326e3bc5c17378cb73601 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 18 Apr 2024 09:17:17 -0500 Subject: [PATCH] Base ROM GFX Fixes and more --- Rom.py | 6 +- asm/owrando.asm | 148 ++++++++++++++++++++++++------------------ data/base2current.bps | Bin 132072 -> 132323 bytes 3 files changed, 88 insertions(+), 66 deletions(-) diff --git a/Rom.py b/Rom.py index b6a39375..c2f7999c 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '168c7d6e330a134e7565baedab79aa15' +RANDOMIZERBASEHASH = '59bea5ff31ed36e1235b897efade6595' class JsonRom(object): @@ -631,7 +631,7 @@ def patch_rom(world, rom, player, team, is_mystery=False): from OverworldShuffle import can_reach_smith if not can_reach_smith(world, player): - rom.write_byte(0x18005d, 0x01) # patch for deleting smith on S+Q + rom.write_byte(0x180043, 0x01) # patch for deleting smith on S+Q # patch entrance/exits/holes for region in world.regions: @@ -1217,7 +1217,7 @@ def patch_rom(world, rom, player, team, is_mystery=False): rom.initial_sram.set_starting_equipment(world, player) rom.write_byte(0x18004A, 0x00 if world.mode[player] != 'inverted' else 0x01) # Inverted mode - rom.write_byte(0x180043, 0x00) # Hammer always breaks barrier + rom.write_byte(0x18005D, 0x00) # Hammer always breaks barrier rom.write_byte(0x02AF79, 0xD0 if world.mode[player] != 'inverted' else 0xF0) # vortexes: Normal (D0=light to dark, F0=dark to light, 42 = both) rom.write_byte(0x03A943, 0xD0 if world.mode[player] != 'inverted' else 0xF0) # Mirror: Normal (D0=Dark to Light, F0=light to dark, 42 = both) rom.write_byte(0x03A96D, 0xF0 if world.mode[player] != 'inverted' else 0xD0) # Residual Portal: Normal (F0= Light Side, D0=Dark Side, 42 = both (Darth Vader)) diff --git a/asm/owrando.asm b/asm/owrando.asm index ee1afb53..1e91896a 100644 --- a/asm/owrando.asm +++ b/asm/owrando.asm @@ -43,6 +43,9 @@ Overworld_LoadSpecialOverworld_RoomId: org $84E8B4 Overworld_LoadSpecialOverworld: +org $84E96A +JSL OWSpecialReturnTriggerClear + org $82A9DA JSL OWSkipPalettes BCC OverworldHandleTransitions_change_palettes : NOP #4 @@ -151,8 +154,8 @@ jsl OWWorldCheck16 : nop org $9bed95 ; < ? - palettes.asm:748 () jsl OWWorldCheck16 : nop -org $82b16e ; AND #$3F : ORA 7EF3CA -and #$7f : eor #$40 : nop #2 +org $82B16C ; LDA $8A : AND #$3F : ORA 7EF3CA +JSL OWApplyWorld : BRA + : NOP #2 : + org $89C3C4 jsl OWBonkDropPrepSprite : nop #2 @@ -225,6 +228,17 @@ OWMapWorldCheck16: .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: { @@ -290,7 +304,7 @@ OWMirrorSpriteSkipDraw: sec : rtl .vanilla - LDA.w $0FC6 : CMP.b #$03 ; what we wrote over + LDA.w GfxChrHalfSlotVerify : CMP.b #$03 ; what we wrote over RTL } OWLightWorldOrCrossed: @@ -322,7 +336,7 @@ OWFluteCancel2: } OWSmithAccept: { - lda FollowerIndicator : cmp.b #$07 : beq + + lda.l FollowerIndicator : cmp.b #$07 : beq + cmp.b #$08 : beq + clc : rtl + sec : rtl @@ -359,7 +373,7 @@ 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 $1000,X + LDA.w WorldMap_DarkWorldTilemap,X : STA.w GFXStripes,X DEX : DEX : BPL .copy_next BRL .end .mixed @@ -526,7 +540,7 @@ OWBonkDrops: ; JSLSpriteSFX_QueueSFX3WithPan .load_item_and_mw - LDA 3,S : TAX : INX : LDA.w OWBonkPrizeData,X + 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 @@ -579,11 +593,11 @@ OWBonkDrops: PLA : BNE + ; S = FlagBitmask, X (row + 2) TYX : JSL Sprite_IsOnscreen : BCC + LDA.b IndoorsFlag : BEQ ++ - LDA.l RoomDataWRAM[$0120].high : ORA 1,S : STA.l RoomDataWRAM[$0120].high - LDA.w $0400 : ORA 1,S : STA.w $0400 + 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 ++ - LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : ORA 1,S : STA.l OverworldEventDataWRAM,X + LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : ORA.b 1,S : STA.l OverworldEventDataWRAM,X .increment_collection REP #$20 @@ -623,10 +637,13 @@ OWBonkDrops: ; 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 - PLX : INX : INX : INX + INX LDA.w SpritePosYLow,Y : SEC : SBC.w OWBonkPrizeData,X : STA.w SpritePosYLow,Y - LDA.w SpritePosYHigh,Y : SBC #$00 : STA.w SpritePosYHigh,Y + LDA.w SpritePosYHigh,Y : SBC.b #$00 : STA.w SpritePosYHigh,Y BRA .return+2 @@ -661,7 +678,7 @@ OWBonkDropCollected: LDA.l RoomDataWRAM[$0120].high : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2) SEC : RTS + - LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : AND 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2) + LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2) SEC : RTS .return @@ -744,8 +761,8 @@ OWDetectSpecialTransition: OWEdgeTransition: { LDA.l OWMode : ORA.l OWMode+1 : BEQ .unshuffled - LDY.w RandoOverworldTargetEdge : CPY.b #$7F - BEQ .unshuffled + LDY.w RandoOverworldTargetEdge : STZ.w RandoOverworldTargetEdge + CPY.b #$7F : BEQ .unshuffled REP #$10 LDX.w RandoOverworldEdgeAddr PHB : PHK : PLB @@ -757,8 +774,7 @@ OWEdgeTransition: .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 - LDA.l OWTileWorldAssoc,X : CMP.l CurrentWorld : BEQ .vanilla ; if dest screen mismatches the current world - TXA : EOR #$40 : RTL + JML OWApplyWorld_fromScreen .vanilla TXA : RTL @@ -794,18 +810,18 @@ OWShuffle: 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 #$40 : !add.w OverworldSlotPosition : rep #$30 : and #$00ff : asl #3 + + txa : and.b #$40 : !ADD.w OverworldSlotPosition : rep #$30 : and.w #$00ff : asl #3 - adc 1,S : tax + adc.b 1,S : tax asl.w OverworldSlotPosition : pla ;x = offset to edgeoffsets table - sep #$20 : lda.l OWEdgeOffsets,x : and #$ff : beq .noTransition : pha ;get number of transitions + 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 #16 : sta.w CPUMULTB ;wait 8 cycles + sta.w CPUMULTA : lda.b #16 : sta.w CPUMULTB ;wait 8 cycles pla ;a = number of trans rep #$20 and.w #$00ff @@ -814,7 +830,7 @@ OWShuffle: .nextTransition pha jsr OWSearchTransition_entry : bcs .newDestination - txa : !add.w #$0010 : tax + txa : !ADD.w #$0010 : tax pla : dec : bne .nextTransition : bra .noTransition .newDestination @@ -836,8 +852,8 @@ OWSearchTransition: ;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 + 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 @@ -845,8 +861,8 @@ OWSearchTransition: 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 + 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 @@ -854,16 +870,16 @@ OWSearchTransition: 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 + 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 + 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 @@ -877,7 +893,7 @@ OWSearchTransition: 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 + 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 @@ -888,21 +904,21 @@ OWNewDestination: 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 + 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 + 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 1,s : sta.b OverworldMap16Buffer : pla : pla + ++ lda.b OverworldMap16Buffer : !ADD.b 1,s : sta.b OverworldMap16Buffer : pla : pla .adjustMainAxis - LDA.b OverworldMap16Buffer : SEC : SBC #$0400 : AND #$0F00 : ASL : XBA : STA.b OverworldTilemapIndexY ; vram - LDA.b OverworldMap16Buffer : SEC : SBC #$0010 : AND #$003E : LSR : STA.b OverworldTilemapIndexX + 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) @@ -920,47 +936,47 @@ OWNewDestination: 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 #$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 : 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 + 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 + 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 + + 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 + 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 + + 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 + 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 OWOppDirectionOffset,y : and.w #$00ff : bit.w #$0080 : beq + + 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 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 + + 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 OWOppCoordIndex,y : lda.b LinkPosY,x : !add.b 1,s : sta.b LinkPosY,x ;set coord - ldx OWOppBGIndex,y : lda.b BG2H,x : !add.b 1,s : sta.b BG2H,x - ldx OWOppCameraIndex,y : lda.w CameraScrollN,x : !add.b 1,s : sta.w CameraScrollN,x - ldx OWOppCameraIndex,y : lda.w CameraScrollS,x : !add.b 1,s : sta.w CameraScrollS,x - ldx 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 #$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 OWOppSlotOffset,y : asl : sta.w OverworldSlotPosition + 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 @@ -1186,6 +1202,12 @@ OWEndScrollTransition: 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 diff --git a/data/base2current.bps b/data/base2current.bps index 65e2169a50a1e09db4111c00824e8e0d6a6595b4..b2b4f3e67b88695b751d7c0b301976ad5b3aa6ce 100644 GIT binary patch delta 13748 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