From b4fd96d8f9e6cfb0f1b0592f59b472fa1aadd988 Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 23 Feb 2024 12:10:28 -0500 Subject: [PATCH] Add head rotation logic to KydreeokHead, housekeeping --- Overworld/world_map.asm | 6 +- Sprites/Bosses/kydreeok.asm | 5 ++ Sprites/Bosses/kydreeok_head.asm | 117 +++++++++++++++++++++++++------ Sprites/Bosses/twinrova.asm | 20 +++--- Util/ram.asm | 9 +++ 5 files changed, 123 insertions(+), 34 deletions(-) diff --git a/Overworld/world_map.asm b/Overworld/world_map.asm index a616b50..499fe56 100644 --- a/Overworld/world_map.asm +++ b/Overworld/world_map.asm @@ -25,17 +25,17 @@ org $008FF3 org $3D8000 LWWorldMap_Tiles: - incbin world_map/LWMapTileset.bin + incbin world_map/LwMapTileset.bin LWWorldMap_Gfx: - incbin world_map/LWMapGfx.bin + incbin world_map/LwMapGfx.bin org $3E8000 DWWorldMap_Tiles: incbin world_map/DwMapTileset.bin DWWorldMap_Gfx: - incbin world_map/DWMapGfx.bin + incbin world_map/DwMapGfx.bin DMAOwMap: { diff --git a/Sprites/Bosses/kydreeok.asm b/Sprites/Bosses/kydreeok.asm index 61b9fe2..89eab7f 100644 --- a/Sprites/Bosses/kydreeok.asm +++ b/Sprites/Bosses/kydreeok.asm @@ -64,6 +64,11 @@ Sprite_Kydreeok_Prep: JSR SpawnLeftHead JSR SpawnRightHead + STZ.w Neck1_OffsetX + STZ.w Neck1_OffsetY + STZ.w Neck2_OffsetX + STZ.w Neck2_OffsetY + PLB RTL } diff --git a/Sprites/Bosses/kydreeok_head.asm b/Sprites/Bosses/kydreeok_head.asm index 435ce3d..c22e7f1 100644 --- a/Sprites/Bosses/kydreeok_head.asm +++ b/Sprites/Bosses/kydreeok_head.asm @@ -90,23 +90,31 @@ Sprite_KydreeokHead_Main: LDA.w tableSpeed, Y : STA.w SprYSpeed, X ; LDA #$40 : STA.w SprTimerA, X .noSpeedChange - + JSL Sprite_Move - JSR AdjustMovementSpeed + ; JSR AdjustMovementSpeed JSR KydreeokHead_NeckControl JSR MoveWithBody - ; JSL GetRandomInt : AND #$7F : BNE .no_attack - ; LDA #$CF - ; JSL Sprite_SpawnDynamically - ; JSL Sprite_SetSpawnedCoords - ; JSL $09B020 - ; LDA.b #$02 : STA $0D80, Y - ; LDA #$40 : STA.w SprTimerA, Y - ; RTS - ; .no_attack + JSR RotateHeadUsingSpeedValues - JSR RandomlyAttack + ; LDA Neck_Index : TAY + ; ; JSL GetRandomInt : AND #$04 : TAY + ; LDA X_Coords, Y : STA Neck1_OffsetX + ; ; JSL GetRandomInt : AND #$04 : TAY + ; ; LDA X_Coords, Y : STA Neck2_OffsetX + ; ; JSL GetRandomInt : AND #$0F : TAY + ; LDA Y_Coords, Y : STA Neck1_OffsetY + ; ; JSL GetRandomInt : AND #$04 : TAY + ; ; LDA Y_Coords, Y : STA Neck2_OffsetY + ; JSL GetRandomInt : AND #$3F : BNE .dont_increment + ; INC.w Neck_Index + ; .dont_increment + ; CPY #15 : BNE .not_full + ; LDA #0 : STA Neck_Index + ; .not_full + + JSR RandomlyAttack JSL Sprite_IsToRightOfPlayer : TYA : BNE .not_right %GotoAction(1) @@ -132,13 +140,13 @@ Sprite_KydreeokHead_Main: LDA.w tableSpeed, Y : STA.w SprYSpeed, X ; LDA #$40 : STA.w SprTimerA, X .noSpeedChange - - JSL Sprite_Move - JSR AdjustMovementSpeed + + ; JSR AdjustMovementSpeed JSR KydreeokHead_NeckControl JSR MoveWithBody + JSR RotateHeadUsingSpeedValues JSR RandomlyAttack JSL Sprite_IsToRightOfPlayer : TYA : BNE .not_right @@ -170,6 +178,68 @@ Sprite_KydreeokHead_Main: } +CoordinateBasedRotation: +{ + LDA Neck_Index : TAY + ; JSL GetRandomInt : AND #$04 : TAY + ; LDA X_Coords, Y : STA Neck1_OffsetX + ; JSL GetRandomInt : AND #$04 : TAY + LDA X_Coords, Y : STA Neck2_OffsetX + ; JSL GetRandomInt : AND #$0F : TAY + ; LDA Y_Coords, Y : STA Neck1_OffsetY + ; JSL GetRandomInt : AND #$04 : TAY + LDA Y_Coords, Y : STA Neck2_OffsetY + JSL GetRandomInt : AND #$3F : BNE .dont_increment + INC.w Neck_Index + .dont_increment + CPY #15 : BNE .not_full + LDA #0 : STA Neck_Index + .not_full + RTS +} + +; Table for X coordinates (based on a radius of 8) +X_Coords: + db 8, 11, 8, 3, -4, -9, -12, -9, -4, 3, 8, 11, 8, 3, -4, -9 ; X values + +; Table for Y coordinates (based on a radius of 8) +Y_Coords: + db 0, -3, -8, -11, -15, -15, -11, -8, -3, 0, 3, 8, 11, 15, 15, 11 ; Y values + +RotateHeadUsingSpeedValues: +{ + LDY.w Neck_Index + + LDA.w SprXSpeed, X : CLC : ADC.w XSpeedSin, Y : ASL : STA.w SprXSpeed, X + LDA.w SprYSpeed, X : CLC : ADC.w YSpeedSin, Y : ASL : STA.w SprYSpeed, X + + INY : CPY #$3F : BNE .not_full + LDY.b #$00 +.not_full + STY.w Neck_Index + JSL Sprite_MoveLong + + RTS +} + +XSpeedSin: +db 0, 3, 6, 9, 12, 15, 18, 20, 23, 25 +db 27, 28, 30, 31, 31, 32 +YSpeedSin: +db 32, 32, 31, 31 +db 30, 28, 27, 25, 23, 20, 18, 15, 12, 9 +db 6, 3, 0, -3, -6, -9, -12, -15, -18, -20 +db -23, -25, -27, -28, -30, -31, -31, -32, -32, -32 +db -31, -31, -30, -28, -27, -25, -23, -20, -18, -15 +db -12, -9, -6, -3 +db 0, 3, 6, 9, 12, 15, 18, 20, 23, 25 +db 27, 28, 30, 31, 31, 32, 32, 32, 31, 31 +db 30, 28, 27, 25, 23, 20, 18, 15, 12, 9 +db 6, 3, 0, -3, -6, -9, -12, -15, -18, -20 +db -23, -25, -27, -28, -30, -31, -31, -32, -32, -32 +db -31, -31, -30, -28, -27, -25, -23, -20, -18, -15 +db -12, -9, -6, -3 + RandomlyAttack: { JSL GetRandomInt : AND #$7F : BNE .no_attack @@ -178,6 +248,7 @@ RandomlyAttack: LDA #$CF JSL Sprite_SpawnDynamically JSL Sprite_SetSpawnedCoords + ;JSL $09B020 LDA.b #$02 : STA $0D80, Y LDA #$10 : STA.w SprTimerA, Y .no_attack @@ -281,6 +352,11 @@ KydreeokHead_NeckControl: LDA.w SprSubtype, X : BEQ .DoNeck1 JMP .DoNeck2 .DoNeck1 + + ; Set head pos + LDA $19EE : CLC : ADC.w Neck1_OffsetX : STA SprX, X + LDA $19EF : CLC : ADC.w Neck1_OffsetY : STA SprY, X + LDA.w SprX, X : STA.w SprMiscC, X LDA.w SprY, X : STA.w SprMiscD, X LDA.w SprXSpeed, X : STA $08 @@ -371,15 +447,16 @@ KydreeokHead_NeckControl: LDA.b $08 : STA.w SprXSpeed, X LDA.b $09 : STA.w SprYSpeed, X - ; Set head pos - LDA $19EE : STA SprX, X - LDA $19EF : CLC : SBC #$10 : STA SprY, X RTS ; ========================================================= .DoNeck2 + ; Set head pos + LDA $19F4 : CLC : ADC.w Neck2_OffsetX : STA SprX, X + LDA $19F5 : CLC : ADC.w Neck2_OffsetY : STA SprY, X + LDA.w SprX, X : STA.w SprMiscC, X LDA.w SprY, X : STA.w SprMiscD, X LDA.w SprXSpeed, X : STA $08 @@ -462,9 +539,7 @@ KydreeokHead_NeckControl: LDA.b $08 : STA.w SprXSpeed, X LDA.b $09 : STA.w SprYSpeed, X - ; Set head pos - LDA $19F4 : STA SprX, X - LDA $19F5 : CLC : SBC #$10 : STA SprY, X + RTS } diff --git a/Sprites/Bosses/twinrova.asm b/Sprites/Bosses/twinrova.asm index d342c54..f5b2dd3 100644 --- a/Sprites/Bosses/twinrova.asm +++ b/Sprites/Bosses/twinrova.asm @@ -523,16 +523,16 @@ org $09B5D6 org $09B33F TrinexxIce_Pool: { -.chr -db $2E -db $2E -db $2C -db $2C -.properties -db $35 -db $35 -db $35 -db $35 + .chr + db $2E + db $2E + db $2C + db $2C + .properties + db $35 + db $35 + db $35 + db $35 } org $09B34F diff --git a/Util/ram.asm b/Util/ram.asm index e8660cc..04fdc6b 100644 --- a/Util/ram.asm +++ b/Util/ram.asm @@ -12,5 +12,14 @@ MusicNoteValue: skip 2 OverworldLocationPointer: skip 2 HasGoldstar: skip 1 GoldstarOrHookshot: skip 1 +Neck_Index: skip 1 +Neck1_OffsetX: skip 1 +Neck1_OffsetY: skip 1 +Neck2_OffsetX: skip 1 +Neck2_OffsetY: skip 1 +Offspring1_Id: skip 1 +Offspring2_Id: skip 1 +Kydreeok_Id: skip 1 +SomariaOrByrna: skip 1 base off