diff --git a/Dungeons/keyblock.asm b/Dungeons/keyblock.asm index 4170b37..7c1a8b2 100644 --- a/Dungeons/keyblock.asm +++ b/Dungeons/keyblock.asm @@ -14,6 +14,10 @@ ; 00, 02, 04, 06, 08, 0A, 0C, 0E ; ============================================================================= +; Big chest key for compass +org $01EC1A + db $66 + org $01EB8C Object_KeyBlock: { @@ -52,6 +56,3 @@ Object_KeyBlock: ; ============================================================================= -; Big chest key for compass -org $01EC1A - db $66 \ No newline at end of file diff --git a/Events/house_tag.asm b/Events/house_tag.asm index 2695020..489f1fe 100644 --- a/Events/house_tag.asm +++ b/Events/house_tag.asm @@ -10,7 +10,7 @@ org $01CC18 ; override routine 0x39 "Holes(7)" org $01CC5A HouseTag_Return: -org $238000 +org $268000 HouseTag: { PHX @@ -95,8 +95,8 @@ HouseTag_WakeUpPlayer: LDA $7EF3C6 : ORA.b #$10 : STA $7EF3C6 ; Set the game mode - LDA #$00 : STA $7ef3C5 ; (0 - intro, 1 - pendants, 2 - crystals) - LDA #$00 : STA $7ef3CC ; disable telepathic message + LDA #$00 : STA $7EF3C5 ; (0 - intro, 1 - pendants, 2 - crystals) + LDA #$00 : STA $7EF3CC ; disable telepathic message JSL $00FC41 ; fix monsters RTS @@ -110,31 +110,12 @@ HouseTag_End: } ; ============================================================================== +; Dying Uncle Code Hook +; Uncle won't remove tagalong when interacting org $05DF3A LDA.b #$01 : STA $7EF3CC -; ============================================================================= -; Intro Modifier -; Skips the intro sequence with the rain - -; lorom - -; org $05DF12 -; JSL $04ECA0 -; NOP -; NOP - -; org $04ECA0 -; STZ $0DD0,x -; STZ $02E4 ; repeat native code overwritten by hook -; LDA #$02 -; STA $7ef3C5 ; store "part 2" -; LDA #$00 -; STA $7ef3CC ; disable telepathic message -; JSL $00FC41 ; fix monsters -; RTL - ; ============================================================================= ; SRM Start Modifier ; Credit: Conn, Euclid, MathOnNapkins diff --git a/Items/book_of_secrets.asm b/Items/book_of_secrets.asm index fbbb004..b4ec51f 100644 --- a/Items/book_of_secrets.asm +++ b/Items/book_of_secrets.asm @@ -23,35 +23,40 @@ BRA $1C ; make it always branch, so map isn't loaded anymore ; ============================================================================= ; long subroutine that is executed every frame org $068365 -JSL $3CA600 ; overwrite it (originally JSL $099F91) +JSL LinkItem_SecretsBook ; overwrite it (originally JSL $099F91) ; ============================================================================= ; go to expanded space to write our routine ; (keep EveryFrame.asm in mind for the right adresses) -org $3CA600 -LDA $1B ; load data that tells us whether we are in a building or not -AND #$01 ; are we in a building? -BEQ END ; if not, don't use the x-button-secret +; org $3CA600 +org $228000 +LinkItem_SecretsBook: +{ + LDA $1B ; load data that tells us whether we are in a building or not + AND #$01 ; are we in a building? + BEQ .end ; if not, don't use the x-button-secret - ; ---------- - LDA $7EF34D ; load book of mudora slot - CMP #$01 ; do we have the moon pearl? - BNE $0F ; if not, go to enable BG2 - LDA $F2 ; load unfiltered joypad 1 register (AXLR|????) - AND #$50 ; delete all bits except those for X and R - SEC ; set carry for the following subtraction - SBC #$50 ; X+R button pressed? (if yes, zero flag is set) - BNE $06 ; if not, go to enable BG2 - LDA $1C ; load layer flags - AND #$FD ; disable BG2 (0xFD = 11111101) - BRA $04 ; go to store layer flags - LDA $1C ; load layer flags - ORA #$02 ; enable BG2 (0x02 = 00000010) - STA $1C ; store layer flags - ; ---------- + ; ---------- + LDA $7EF34D ; load book of mudora slot + CMP #$01 ; do we have the moon pearl? + BNE $0F ; if not, go to enable BG2 + LDA $F2 ; load unfiltered joypad 1 register (AXLR|????) + AND #$50 ; delete all bits except those for X and R + SEC ; set carry for the following subtraction + SBC #$50 ; X+R button pressed? (if yes, zero flag is set) + BNE $06 ; if not, go to enable BG2 + LDA $1C ; load layer flags + AND #$FD ; disable BG2 (0xFD = 11111101) + BRA $04 ; go to store layer flags + LDA $1C ; load layer flags + ORA #$02 ; enable BG2 (0x02 = 00000010) + STA $1C ; store layer flags + ; ---------- + +.end + JSL $099F91 ; at least execute original code + RTL +} -END: -JSL $099F91 ; at least execute original code -RTL ; ============================================================================= \ No newline at end of file diff --git a/Items/bottle_net.asm b/Items/bottle_net.asm index 259aa4c..4f4fff6 100644 --- a/Items/bottle_net.asm +++ b/Items/bottle_net.asm @@ -138,7 +138,7 @@ org $07B085 ; ============================================================================= -org $338000 +org $238000 LinkItem_NewBottle: { ; Check if we have a bottle or not diff --git a/Items/jump_feather.asm b/Items/jump_feather.asm index 4b757b7..ff68f8d 100644 --- a/Items/jump_feather.asm +++ b/Items/jump_feather.asm @@ -17,7 +17,7 @@ org $07AFF8 ; ============================================================================= -org $348000 +org $218000 NewBookCode: { JSL $07983A ; Reset swim state diff --git a/Masks/deku_mask.asm b/Masks/deku_mask.asm index 3d66f7d..f0caa32 100644 --- a/Masks/deku_mask.asm +++ b/Masks/deku_mask.asm @@ -4,7 +4,7 @@ ; ============================================================================= ; Hooks -incsrc "../Sprites/sprite_functions_hooks.asm" +; incsrc "../Sprites/sprite_functions_hooks.asm" org $008A01 LDA $BC @@ -160,7 +160,7 @@ LinkItem_UsingQuake: ; ============================================================================= -org $288000 +org $318000 ;incsrc "link_handler.asm" LinkItem_UsingDekuMask: { diff --git a/Masks/wolf_mask.asm b/Masks/wolf_mask.asm index ddbe071..a308f66 100644 --- a/Masks/wolf_mask.asm +++ b/Masks/wolf_mask.asm @@ -1,6 +1,9 @@ ; ============================================================================= ; Wolf Mask - +; +; Talk to animals +; Dig for treasure ability (shovel) +; ; ============================================================================= org $07A3DB @@ -31,16 +34,9 @@ LinkItem_WolfMask: JSR LinkItem_Shovel .equip - ; JSR Link_CheckNewY_ButtonPress : BCC .return - - ; joypad 1 register (AXLR|????) - ; check for R button press + ; check for R button held LDA $F2 : CMP #$10 : BNE .return - LDA $46 : BNE .return - TSB $3A - SEC - ; LDA $F4 : AND.b #$10 : BEQ .return - + JSR Link_CheckNewY_ButtonPress : BCC .return LDA $3A : AND.b #$BF : STA $3A ; clear the Y button state LDA $6C : BNE .return ; in a doorway diff --git a/Masks/zora_mask.asm b/Masks/zora_mask.asm index 50cf9df..4e76f9d 100644 --- a/Masks/zora_mask.asm +++ b/Masks/zora_mask.asm @@ -85,38 +85,25 @@ LinkState_UsingZoraMask: LDA #$00 : STA $5E ; Reset speed to normal STA $037B JMP .return - + .swimming ; ----------------------------------------------------------------------------- ; Check if we are indoors or outdoors LDA $1B : BEQ .overworld ; z flag is 1 - CLC - REP #$30 - JSR Link_CheckNewY_ButtonPress : BCC .return_dungeon - LDA $3A : AND.b #$BF : STA $3A - SEP #$30 - ; Check if already underwater LDA $0AAB : BEQ .dive_dungeon - - JMP .return_dungeon ; Handle dungeon swimming (hard) .dive_dungeon - ; Set underwater walking mode - LDA #$01 : STA $5D - STA $0AAB - ; Splash visual effect + LDA #$01 : STA $5D + ; Else, restore to normal swimming state LDA.b #$15 : LDY.b #$00 JSL AddTransitionSplash - - ; Change the layer Link is on to BG2 LDA.b #$00 : STA $EE -.return_dungeon JSR $E8F0 ; HandleIndoorCameraAndDoors RTS @@ -130,9 +117,9 @@ LinkState_UsingZoraMask: ; Check if already underwater LDA $0AAB : BEQ .dive - STZ $55 ; Reset cape flag - STZ $0AAB ; Reset underwater flag - STZ $0351 ; Reset ripple flag + STZ $55 ; Reset cape flag + STZ $0AAB ; Reset underwater flag + STZ $0351 ; Reset ripple flag LDA #$00 : STA $037B ; Reset invincibility flag LDA #$04 : STA $5D diff --git a/Menu/menu_hud.asm b/Menu/menu_hud.asm index ca133d2..fb69ff9 100644 --- a/Menu/menu_hud.asm +++ b/Menu/menu_hud.asm @@ -45,7 +45,7 @@ org $0DF14F ; ============================================================================== ; New Code Region Starts Here -org $268000 +org $258000 ; ============================================================================== ; Main HUD Update Loop diff --git a/Oracle_main.asm b/Oracle_main.asm index 87c5210..ad5f39d 100644 --- a/Oracle_main.asm +++ b/Oracle_main.asm @@ -10,23 +10,25 @@ ; Intro skip after leaving house ; Key block link's awakening ; Lost Sea Area Combo + +; ; ; Expanded Banks Key: ; 20 - None -; 21 - None -; 22 - None -; 23 - House Tag +; 21 - Jump Feather +; 22 - Book of Secrets +; 23 - Bottle Net ; 24 - Menu -; 25 - None -; 26 - HUD +; 25 - HUD +; 26 - House Tag ; 27 - Mask Routines(?) -; 28 - Deku Link Code +; 28 - None ; 29 - Custom Sprite Jump Table ; 30 - Custom Sprite Functions -; 31 - None -; 32 - None -; 33 - Bottle / Net Item -; 34 - Jump Feather +; 31 - Deku Link Code +; 32 - Farore Sprite Code +; 33 - None +; 34 - None ; 35 - Deku Link GFX ; 36 - Zora Link GFX ; 37 - Bunny Link GFX @@ -44,6 +46,10 @@ namespace Oracle incsrc "Util/ram.asm" incsrc "Util/functions.asm" + + incsrc "Sprites/farore_and_maku.asm" + print "End of Sprites/farore_and_maku.asm", pc + ; --------------------------------------------------------- incsrc "Items/jump_feather.asm" print "End of Items/jump_feather.asm ", pc diff --git a/Sprites/happy_mask_salesman.asm b/Sprites/HappyMaskSalesman/happy_mask_salesman.asm similarity index 100% rename from Sprites/happy_mask_salesman.asm rename to Sprites/HappyMaskSalesman/happy_mask_salesman.asm diff --git a/Sprites/impa.asm b/Sprites/Impa/impa.asm similarity index 100% rename from Sprites/impa.asm rename to Sprites/Impa/impa.asm diff --git a/Sprites/farore_and_maku.asm b/Sprites/farore_and_maku.asm index adceb5b..25dc2fc 100644 --- a/Sprites/farore_and_maku.asm +++ b/Sprites/farore_and_maku.asm @@ -21,17 +21,17 @@ incsrc sprite_new_functions.asm ; Sprite Properties ;============================================================================== !SPRID = $73; The sprite ID you are overwriting (HEX) -!NbrTiles = 00 ; Number of tiles used in a frame +!NbrTiles = 2 ; Number of tiles used in a frame !Harmless = 00 ; 00 = Sprite is Harmful, 01 = Sprite is Harmless !HVelocity = 00 ; Is your sprite going super fast? put 01 if it is -!Health = 00 ; Number of Health the sprite have -!Damage = 00 ; (08 is a whole heart), 04 is half heart +!Health = 0 ; Number of Health the sprite have +!Damage = 0 ; (08 is a whole heart), 04 is half heart !DeathAnimation = 00 ; 00 = normal death, 01 = no death animation !ImperviousAll = 00 ; 00 = Can be attack, 01 = attack will clink on it !SmallShadow = 00 ; 01 = small shadow, 00 = no shadow !Shadow = 00 ; 00 = don't draw shadow, 01 = draw a shadow -!Palette = 00 ; Unused in this template (can be 0 to 7) -!Hitbox = 00 ; 00 to 31, can be viewed in sprite draw tool +!Palette = 0 ; Unused in this template (can be 0 to 7) +!Hitbox = 0 ; 00 to 31, can be viewed in sprite draw tool !Persist = 00 ; 01 = your sprite continue to live offscreen !Statis = 00 ; 00 = is sprite is alive?, (kill all enemies room) !CollisionLayer = 00 ; 01 = will check both layer for collision @@ -39,7 +39,7 @@ incsrc sprite_new_functions.asm !DeflectArrow = 00 ; 01 = deflect arrows !WaterSprite = 00 ; 01 = can only walk shallow water !Blockable = 00 ; 01 = can be blocked by link's shield? -!Prize = 00 ; 00-15 = the prize pack the sprite will drop from +!Prize = 0 ; 00-15 = the prize pack the sprite will drop from !Sound = 00 ; 01 = Play different sound when taking damage !Interaction = 00 ; ?? No documentation !Statue = 00 ; 01 = Sprite is statue @@ -55,60 +55,185 @@ incsrc sprite_new_functions.asm ;============================================================================== +Sprite_Farore_Long: +PHB : PHK : PLB -SpritePrep_FaroreAndMakuTree: -{ - ; farore forest during intro - ; activates impa sprite +JSR Sprite_Farore_Draw ; Call the draw code +JSL Sprite_CheckActive ; Check if game is not paused +BCC .SpriteIsNotActive ; Skip Main code is sprite is innactive - ; maku tree interaction in the forest - ; needs to be in part 1 of the game -} +JSR Sprite_Farore_Main ; Call the main sprite code + +.SpriteIsNotActive +PLB ; Get back the databank we stored previously +RTL ; Go back to original code ;============================================================================== -Sprite_FaroreAndMakuTree: -{ - LDA $0E90, X ; - - JSL UseImplicitRegIndexedLocalJumpTable - - dw Sprite_Farore - dw Sprite_MakuTree -} - -;============================================================================== - -Sprite_Farore: -{ - ; Main entry point for the Farore sprite in the overworld - JSL Farore_Draw - JSR Sprite2_CheckIfActive - - LDA $0E80, X +Sprite_Farore_Prep: +PHB : PHK : PLB - JSL UseImplicitRegIndexedLocalJumpTable +; LDA.l $7EF300 +; BEQ .PlayIntro +; STZ.w $0DD0, X ; Kill the sprite +; .PlayIntro + +PLB +RTL - dw Farore_IntroCutscene - dw Farore_FinaleCutscene -} ;============================================================================== -Farore_IntroCutscene: +Sprite_Farore_Main: +LDA.w SprAction, X; Load the SprAction +JSL UseImplicitRegIndexedLocalJumpTable; Goto the SprAction we are currently in +dw IntroStart +dw MoveUp +dw MoveLeft +dw WaitAndMessage + + +IntroStart: { - ; Link approaches Farore sprite with Impa sprite (Zelda) - - ; Activates Mantle style cutscene - - ; Jump to antagonist cutscene code + RTS } -;============================================================================== - -Sprite_MakuTree: +MoveUp: { - ; Main entry point for the MakuTree routines + LDA #$01 ; make link move up + STA $49 + + LDA $30 ; Link's Y Position + CMP #$C6 + BCC .linkistoofarleft + ; Here link reached the X position we want + ; goto next action + %GotoAction(2) + +.linkistoofarleft + + RTS +} + + +MoveLeft: +{ + LDA.b #$04 ; make link move left + STA.b $49 + + LDA.b $20 ; Link's Y Position + CMP.b #$88 + BCC .linkistoofarup + + ; Here link reached the X position we want + ; goto next action + + STZ.b $49 ; kill automove + LDA.b #$20 + STA.w SprTimerA, X ; set timer A to 0x10 + %GotoAction(3) + +.linkistoofarup + RTS +} + + +WaitAndMessage: +{ + LDA.w SprTimerA, X : BNE + + %ShowUnconditionalMessage($24) + LDA.b #$01 + STA.l $7EF300 ; prevent intro from playing again with sram set + STZ.w $0DD0, X ; Kill the sprite since it's not needed anymore + ; could goto next action too instead ++ + RTS +} + +;============================================================================== + +Sprite_Farore_Draw: +{ +JSL Sprite_PrepOamCoord +JSL Sprite_OAM_AllocateDeferToPlayer + +LDA $0DC0, X : CLC : ADC $0D90, X : TAY;Animation Frame +LDA .start_index, Y : STA $06 + + +PHX +LDX .nbr_of_tiles, Y ;amount of tiles -1 +LDY.b #$00 +.nextTile + +PHX ; Save current Tile Index? + +TXA : CLC : ADC $06 ; Add Animation Index Offset + +PHA ; Keep the value with animation index offset? + +ASL A : TAX + +REP #$20 + +LDA $00 : CLC : ADC .x_offsets, X : STA ($90), Y +AND.w #$0100 : STA $0E +INY +LDA $02 : CLC : ADC .y_offsets, X : STA ($90), Y +CLC : ADC #$0010 : CMP.w #$0100 +SEP #$20 +BCC .on_screen_y + +LDA.b #$F0 : STA ($90), Y ;Put the sprite out of the way +STA $0E +.on_screen_y + +PLX ; Pullback Animation Index Offset (without the *2 not 16bit anymore) +INY +LDA .chr, X : STA ($90), Y +INY +LDA .properties, X : STA ($90), Y + +PHY + +TYA : LSR #2 : TAY + +LDA .sizes, X : ORA $0F : STA ($92), Y ; store size in oam buffer + +PLY : INY + +PLX : DEX : BPL .nextTile + +PLX + +RTS + +;============================================================================== + +.start_index +db $00, $02, $04 +.nbr_of_tiles +db 1, 1, 1 +.x_offsets +dw 0, 0 +dw 0, 0 +dw 0, 0 +.y_offsets +dw 4, -8 +dw 4, -7 +dw 4, -8 +.chr +db $AA, $A8 +db $AA, $A8 +db $AA, $A8 +.properties +db $3B, $3B +db $7B, $3B +db $3B, $3B +.sizes +db $02, $02 +db $02, $02 +db $02, $02 } ;============================================================================== diff --git a/Sprites/sprite_functions_hooks.asm b/Sprites/sprite_functions_hooks.asm index 3bbca6b..5f3b015 100644 --- a/Sprites/sprite_functions_hooks.asm +++ b/Sprites/sprite_functions_hooks.asm @@ -1,12 +1,64 @@ -lorom +SprAction = $0D80 +SprFrame = $0D90 ; This is also used to do various things in different sprites +SprMiscA = $0DA0 ; This can be used to do anything in sprite +SprMiscB = $0DB0 ; This can be used to do anything in sprite +SprMiscC = $0DE0 ; This can be used to do anything in sprite (Mainly used for sprite direction) +SprMiscD = $0E90 ; This can be used to do anything in sprite +SprMiscE = $0EB0 ; This can be used to do anything in sprite +SprMiscF = $0EC0 ; This can be used to do anything in sprite +SprMiscG = $0ED0 ; This can be used to do anything in sprite + +SprStunTimer = $0B58 + +SprTimerA = $0DF0 ; This address value is decreased by one every frames +SprTimerB = $0E00 ; This address value is decreased by one every frames +SprTimerC = $0E10 ; This address value is decreased by one every frames +SprTimerD = $0EE0 ; This address value is decreased by one every frames +SprTimerE = $0F10 ; This address value is decreased by one every frames +SprTimerF = $0F80 ; This address value is decreased by 2 every frames is also used by the gravity routine + +SprPause = $0F00 ; Can probably be used for anything +SprFloor = $0F20 +SprType = $0E20 ; This contains the ID of the sprite 00 = raven, 01 = vulture, etc... +SprSubtype = $0E30 ; This contains the Sub ID of the sprite +SprState = $0DD0 ; This tells if the sprite is alive, dead, frozen, etc... + +SprNbrOAM = $0E40 ; Bits 0-4: define the number of OAM slots used by the sprite +SprHealth = $0E50 +SprGfxProps = $0E60 +SprCollision = $0E70 ; When a sprite hit a wall, this gets set to the direction in which the collision occurred. +SprDelay = $0E80 ; Used in sprite state 0x03 (falling in water), used as delay in most of the sprites +SprRecoil = $0EA0 ; Recoil Timer +SprDeath = $0EF0 + +SprProps = $0F50 ; DIWS UUUU - [D boss death][I Impervious to all attacks][W Water slash] [S Draw Shadow] [U Unused] +SprHitbox = $0F60 ; ISPH HHHH - [I ignore collisions][S Statis (not alive eg beamos)][P Persist code still run outside of camera][H Hitbox] +SprHeight = $0F70 ; Distance from the shadow +SprHeightS = $0F90 ; Distance from the shadow subpixel + +SprYRecoil = $0F30 +SprXRecoil = $0F40 + +SprGfx = $0DC0 ; Determine the GFX used for the sprite +OAMPtr = $90 +OAMPtrH = $92 + +SprY = $0D00 +SprX = $0D10 +SprYH = $0D20 +SprXH = $0D30 + +SprYSpeed = $0D40 +SprXSpeed = $0D50 + +SprYRound = $0D60 +SprXRound = $0D70 + +SprCachedX = $0FD8 ; This doesn't need to be indexed with X it contains the 16bit position of the sprite +SprCachedY = $0FDA ; This doesn't need to be indexed with X it contains the 16bit position of the sprite -!ADD = "CLC : ADC" -!SUB = "SEC : SBC" -!BLT = "BCC" -!BGE = "BCS" -;================================================================= org $09AE64 Sprite_SetSpawnedCoords: @@ -40,7 +92,6 @@ Sprite_AttemptDamageToPlayerPlusRecoil: org $06F864 Sprite_OAM_AllocateDeferToPlayer: - org $0DBA80 OAM_AllocateFromRegionA: org $0DBA84 @@ -163,9 +214,15 @@ Sprite_CheckDamageToPlayerIgnoreLayer: ;================================================================= ;Sound_SetSfx2PanLong LONG ;play a sound loaded in A +org $0DBB6E +Sound_SetSfx1PanLong: + org $0DBB7C Sound_SetSfx2PanLong: +org $0DBB8A +Sound_SetSfx3PanLong: + ;================================================================= ;Sprite_SpawnDynamically LONG ;spawn a new sprite on screen, A = sprite id @@ -190,8 +247,8 @@ Sprite_ApplyConveyorAdjustment: ;================================================================= ;SetupHitBox LONG ;set the hitbox of the player (i think) -org $0683EA -SetupHitBox: +;org $0683EA +;Sprite_SetupHitBoxLong: ;================================================================= ;Dungeon_SpriteInducedTilemapUpdate LONG @@ -275,4 +332,17 @@ org $06EA22 Sprite_ProjectSpeedTowardsEntityLong: org $0DDA06 -Sprite_SpawnFireball: \ No newline at end of file +Sprite_SpawnFireball: + +org $1D808C +Sprite_MoveLong: + +org $1EFF8D +Sprite_DrawRippleIfInWater: + +org $058008 +Sprite_SpawnSparkleGarnish: + + +org $06EA1A +Sprite_ProjectSpeedTowardsPlayer: \ No newline at end of file