Files
2016-05-31 16:28:07 +10:00

249 lines
3.9 KiB
ArmAsm

include "includes.i"
xdef InitialisePickups
xdef UsePickup
xdef PickupEye
xdef PickupClock
xdef PickupArrow
xdef FlashPickup
xdef ResetPickups
PICKUP_OFFSET equ (SCREEN_WIDTH_BYTES*PANEL_BIT_DEPTH*17)+(272/8)
PICKUP_NUM_FLASHES equ 6
PICKUP_DEBOUNCE_FRAMES equ 10
PICKUP_SAFE_TILE1 equ $f02
PICKUP_SAFE_TILE2 equ $1682
ResetPickupItem: macro
move.w #0,pickup\1FlashCounter
cmp.w #0,has\1Pickup
beq .\@skip
bsr Show\1Pickup
.\@skip:
endm
ResetPickups:
move.l #0,lastPickupFrameCount
ResetPickupItem Arrow
ResetPickupItem Clock
ResetPickupItem Eye
rts
InitialisePickups:
move.w #0,hasEyePickup
move.w #0,hasArrowPickup
move.w #0,hasClockPickup
move.w #0,pickupEyeFlashCounter
move.w #0,pickupArrowFlashCounter
move.w #0,pickupClockFlashCounter
bsr HideEyePickup
bsr HideArrowPickup
bsr HideClockPickup
rts
UsePickup:
move.l frameCount,d0
sub.l lastPickupFrameCount,d0
cmp.l #PICKUP_DEBOUNCE_FRAMES,d0
blt .done
move.l frameCount,lastPickupFrameCount
cmp.w #0,hasEyePickup
bne .useEye
cmp.w #0,hasClockPickup
bne .useClock
cmp.w #0,hasArrowPickup
bne .useArrow
bra .done
.useEye:
PlaySound Whoosh
bsr HideEyePickup
move.w #0,hasEyePickup
move.w #PICKUP_NUM_FLASHES,pickupEyeFlashCounter
jsr RevealPathway
bra .done
.useClock:
PlaySound Whoosh
bsr HideClockPickup
move.w #0,hasClockPickup
move.w #PICKUP_NUM_FLASHES,pickupClockFlashCounter
jsr FreezeScrolling
bra .done
.useArrow:
move.l foregroundPlayerTileAddress,a0
cmp.w #0,a0
beq .done
move.w (a0),d0
cmp.w #PICKUP_SAFE_TILE1,d0 ; dont active on safe columns
beq .done
cmp.w #PICKUP_SAFE_TILE2,d0 ; dont active on safe zones
beq .done
PlaySound Whoosh
move.w #0,hasArrowPickup
move.w #PICKUP_NUM_FLASHES,pickupArrowFlashCounter
jsr SpriteEnableAuto
bra .done
.done:
rts
FlashItem: macro
move.w pickup\1FlashCounter,d0
cmp.w #0,d0
beq .\@skip
cmp.w #1,d0
bgt .\@continue
cmp.w #0,has\1Pickup
bne .\@has
bsr Hide\1Pickup
bra .\@done
.\@has:
bsr Show\1Pickup
bra .\@done
.\@continue:
btst #0,d0
bne .\@on
bsr Hide\1Pickup
bra .\@done
.\@on:
bsr Show\1Pickup
.\@done:
sub.w #1,pickup\1FlashCounter
.\@skip:
endm
FlashPickup:
cmp.w #0,flashCount
bgt .skip
move.w #8,flashCount
FlashItem Arrow
FlashItem Clock
FlashItem Eye
.skip:
sub.w #1,flashCount
rts
PickupItem: macro
PlaySound Whoosh
cmp.w #0,has\1Pickup
beq .\@doPickup
jsr \2
bra .\@done
.\@doPickup:
bsr Show\1Pickup
move.w #1,has\1Pickup
move.w #PICKUP_NUM_FLASHES,pickup\1FlashCounter
.\@done:
endm
PickupClock:
PickupItem Clock,FreezeScrolling
rts
PickupEye:
PickupItem Eye,RevealPathway
rts
PickupArrow:
PickupItem Arrow,SpriteEnableAuto
rts
ShowEyePickup:
move.w #0,d0
move.w #0,d1
bsr BlitPickup
rts
HideEyePickup:
move.w #0,d0
move.w #1,d1
bsr BlitPickup
rts
ShowClockPickup:
move.w #1,d0
move.w #0,d1
bsr BlitPickup
rts
HideClockPickup:
move.w #1,d0
move.w #1,d1
bsr BlitPickup
rts
ShowArrowPickup:
move.w #2,d0
move.w #0,d1
bsr BlitPickup
rts
HideArrowPickup:
move.w #2,d0
move.w #1,d1
bsr BlitPickup
rts
BlitPickup:
WaitBlitter
;; d0.w pickup index
;; 0 - eye, 1 - clock, 2 - arrow, 3 - blank
;; d1.w blank
;; 0 - not blank, 1 - blank
move.w #BC0F_SRCA|BC0F_DEST|$f0,BLTCON0(a6)
lea pickups,a0
move.l #panel+PICKUP_OFFSET,a1
lsl.w #1,d0
cmp.w #0,d1
adda.w d0,a1
beq .notBlank
move.w #48/8,d0
.notBlank:
adda.w d0,a0
move.w #0,BLTCON1(a6)
move.w #$ffff,BLTALWM(a6)
move.w #$ffff,BLTAFWM(a6)
move.w #(64-16)/8,BLTAMOD(a6)
move.w #SCREEN_WIDTH_BYTES-2,BLTDMOD(a6)
move.l a0,BLTAPTH(a6) ;source graphic top left corner
move.l a1,BLTDPTH(a6) ;destination top left corner
move.w #(14*PANEL_BIT_DEPTH)<<6|(1),BLTSIZE(a6)
rts
hasClockPickup:
dc.w 0
hasEyePickup:
dc.w 0
hasArrowPickup:
dc.w 0
pickupArrowFlashCounter:
dc.w 0
pickupEyeFlashCounter:
dc.w 0
pickupClockFlashCounter:
dc.w 0
lastPickupFrameCount:
dc.l 0
flashCount:
dc.w 0
pickups:
incbin "out/pickups.bin"