Files
oracle-of-secrets/Dungeons/Objects/object_handler.asm
2024-08-29 20:23:41 -04:00

342 lines
7.6 KiB
NASM

; Dungeon Object Handler
org $018262 ; Object ID 0x31
dw ExpandedObject
org $018264 ; Object ID 0x32
dw ExpandedObject2
org $0182A8 ; Object ID 0x54
dw SpriteBodyObjects
; RoomDraw_WeirdUglyPot
org $018650 ; Object ID 230
dw HeavyPot
; Tile types
TileBehavior_Nothing = $07DC54
TileBehavior_Pit = $07DC8B
TileBehavior_Door = $07DD0A
; Minecart Track tile types
org $07D938
#_07D938: dw TileBehavior_Nothing ; 0xB0 UW LR
#_07D93A: dw TileBehavior_Nothing ; 0xB1 UW UD
#_07D93C: dw TileBehavior_Nothing ; 0xB2 UW TL
#_07D93E: dw TileBehavior_Nothing ; 0xB3 UW BL
#_07D940: dw TileBehavior_Nothing ; 0xB4 UW TR
#_07D942: dw TileBehavior_Nothing ; 0xB5 UW BR
#_07D944: dw TileBehavior_Nothing ; 0xB6 UW Any
#_07D946: dw TileBehavior_Nothing ; 0xB7 UW Stop Top
#_07D948: dw TileBehavior_Nothing ; 0xB8 UW Stop Bottom
#_07D94A: dw TileBehavior_Nothing ; 0xB9 UW Stop Left
#_07D94C: dw TileBehavior_Nothing ; 0xBA UW Stop Right
#_07D94E: dw TileBehavior_Pit ; 0xBB UW Pit LR
#_07D950: dw TileBehavior_Pit ; 0xBC UW Pit UD
#_07D952: dw TileBehavior_Pit ; 0xBD UW Any
; Bank01 Free Space
org $01B53C
ExpandedObject:
JSL CustomObjectHandler
RTS
ExpandedObject2:
JSL CustomObjectHandler2
RTS
SpriteBodyObjects:
JSL SpriteObjectsDraw
RTS
HeavyPot:
JSL InitHeavyPot
JMP $B350
warnpc $01B560
org $2C8000
CustomObjectHandler:
{
PHB : PHK : PLB
PHX
STZ $03 ; 03 will be used to store the object ID for custom config
LDA $00 : PHA
LDA $02 : PHA
; $00 Will be used for tile count and tile to skip
LDA $B2 : ASL #2 : ORA $B4
;get the offset for the object data based on the object height
ASL : TAX
LDA .ObjOffset, X
TAX
.lineLoop
LDA .ObjData, X : BNE .continue
;break
BRA .Done
.continue
PHY ; Keep current position in the buffer
STA $00 ; we save the tile count + tile to skip
-- ;Tiles Loop
INX : INX
; Vhopppcc cccccccc
LDA .ObjData, X : BEQ +
STA [$BF], Y
+
INY : INY
LDA $00 : DEC : STA $00 : AND #$001F : BNE +
LDA $00 : XBA : AND #$00FF : STA $00
PLA ;Pull back position
CLC : ADC $00 : TAY
INX : INX
BRA .lineLoop
+
BRA --
.Done
PLA : STA $02
PLA : STA $00 ;Not sure if needed
PLX
PLB
RTL
.ObjOffset
dw .LeftRight-.ObjData ; 00
dw .UpDown-.ObjData ; 01
dw .TopLeft-.ObjData ; 02
dw .TopRight-.ObjData ; 03
dw .Bottomleft-.ObjData ; 04
dw .BottomRight-.ObjData ; 05
dw .UpDownFloor-.ObjData ; 06
dw .LeftRightFloor-.ObjData ; 07
dw .TopLeftFloor-.ObjData ; 08
dw .TopRightFloor-.ObjData ; 09
dw .BottomleftFloor-.ObjData ; 10
dw .BottomRightFloor-.ObjData ; 11
dw .FloorAny-.ObjData ; 12
dw .WallSwordHouse-.ObjData ; 13
dw .TrackAny-.ObjData ; 14
dw .SmallStatue-.ObjData ; 15
.ObjData
.LeftRight
incbin Data/track_LR.bin
.UpDown
incbin Data/track_UD.bin
.TopLeft
incbin Data/track_corner_TL.bin
.TopRight
incbin Data/track_corner_TR.bin
.Bottomleft
incbin Data/track_corner_BL.bin
.BottomRight
incbin Data/track_corner_BR.bin
.UpDownFloor
incbin Data/track_floor_UD.bin
.LeftRightFloor
incbin Data/track_floor_LR.bin
.TopLeftFloor
incbin Data/track_floor_corner_TL.bin
.TopRightFloor
incbin Data/track_floor_corner_TR.bin
.BottomleftFloor
incbin Data/track_floor_corner_BL.bin
.BottomRightFloor
incbin Data/track_floor_corner_BR.bin
.FloorAny
incbin Data/track_floor_any.bin
.WallSwordHouse
incbin Data/wall_sword_house.bin
.TrackAny
incbin Data/track_any.bin
.SmallStatue
incbin Data/small_statue.bin
}
; TODO: Fix the graphics used for the heavy pot in game
InitHeavyPot:
{
LDA.w #$1010
PHX
LDX.w $042C ; MANIPINDEX
LDA.w #$1111 : STA $0500, X ; M16BUFF500
; Store this object's position in the object buffer to $0520, X
LDA $BA : STA $0520, X
; Store it's tilemap position.
TYA : STA $0540, X
RTL
}
SpriteObjectsDraw:
{
PHB : PHK : PLB
PHX
STZ $03 ; 03 will be used to store the object ID for custom config
LDA $00 : PHA
LDA $02 : PHA
; $00 Will be used for tile count and tile to skip
LDA $B2 : ASL #2 : ORA $B4
;get the offset for the object data based on the object height
ASL : TAX
LDA .ObjOffset, X
TAX
.lineLoop
LDA .ObjData, X : BNE .continue
;break
BRA .Done
.continue
PHY ; Keep current position in the buffer
STA $00 ; we save the tile count + tile to skip
-- ;Tiles Loop
INX : INX
; Vhopppcc cccccccc
LDA .ObjData, X : BEQ +
ORA.w #$0300
STA [$BF], Y
+
INY : INY
LDA $00 : DEC : STA $00 : AND #$001F : BNE +
LDA $00 : XBA : AND #$00FF : STA $00
PLA ;Pull back position
CLC : ADC $00 : TAY
INX : INX
BRA .lineLoop
+
BRA --
.Done
PLA : STA $02
PLA : STA $00 ;Not sure if needed
PLX
PLB
RTL
.ObjOffset
dw .KydreeokBody-.ObjData ; 00
dw .ManhandlaBody1-.ObjData ; 01
.ObjData
.KydreeokBody
incbin Data/kydreeok_body.bin
.ManhandlaBody1
incbin Data/manhandla_body_1a.bin
}
CustomObjectHandler2:
{
PHB : PHK : PLB
PHX
STZ $03 ; 03 will be used to store the object ID for custom config
LDA $00 : PHA
LDA $02 : PHA
; $00 Will be used for tile count and tile to skip
LDA $B2 : ASL #2 : ORA $B4
;get the offset for the object data based on the object height
ASL : TAX
LDA .ObjOffset, X
TAX
.lineLoop
LDA .ObjData, X : BNE .continue
;break
BRA .Done
.continue
PHY ; Keep current position in the buffer
STA $00 ; we save the tile count + tile to skip
-- ;Tiles Loop
INX : INX
; Vhopppcc cccccccc
LDA .ObjData, X : BEQ +
STA [$BF], Y
+
INY : INY
LDA $00 : DEC : STA $00 : AND #$001F : BNE +
LDA $00 : XBA : AND #$00FF : STA $00
PLA ;Pull back position
CLC : ADC $00 : TAY
INX : INX
BRA .lineLoop
+
BRA --
.Done
PLA : STA $02
PLA : STA $00 ;Not sure if needed
PLX
PLB
RTL
.ObjOffset
dw .IceFurnace-.ObjData ; 00
dw .Firewood-.ObjData ; 01
dw .IceChair-.ObjData ; 02
.ObjData
.IceFurnace
incbin Data/furnace.bin
.Firewood
incbin Data/firewood.bin
.IceChair
incbin Data/ice_chair.bin
}
pushpc
; Item ID 22B
org $00A9AC
dw $0D28, $0D38, $4D28, $4D38
; org $01B306 ; RoomDraw_WeirdGloveRequiredPot
; LDA.w #$1010
; Normal Door
; #obj2716:
; #_00C268: dw $2888, $0808, $0818, $2889
; #_00C270: dw $09EF, $0878, $6889, $09EF
; #_00C278: dw $4878, $6888, $4808, $4818
; Unused door 3A
; #obj2866:
org $00C3B8
#_00C3B8: dw $2888, $0808, $0818, $2889
; 09
#_00C3C0: dw $282C, $082D, $6889, $682C
; 10
#_00C3C8: dw $482D, $6888, $4808, $4818
; 282D
; 682D
; $682C
; #obj2866:
; #_00C3B8: dw $282C, $0808, $080D, $282D
; #_00C3C0: dw $09EF, $0878, $682D, $09EF
; #_00C3C8: dw $4878, $682C, $4808, $480D