GSCats/fan.s

144 lines
2.8 KiB
ArmAsm

;
; fan
; Code and data structures related to the special fan weapon
;
; Created by Quinn Dunki on 8/15/18
;
FANRANGE = 100 ; In pixels
FANMAGNITUDE = $10 ; 12.4 fixed point speed delta, in pixels
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; deployFan
;
; Y: Index to projectile structure
;
deployFan:
SAVE_AY
lda #200 ; Drop in from the top of the view
sta projectileData+GO_POSY,y
lda #$c80
sta projectileData+JD_PRECISEY,y
lda #0
sta projectileData+JD_VX,y
sta projectileData+JD_VY,y
RESTORE_AY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; updateFan
;
; Y = Offset to projectile structure
;
updateFan:
SAVE_AXY
lda projectileData+JD_STATIC,y
bne updateFanWind ; We're set up, so apply our wind
; Wait for fan to collide with us as it falls from the sky
lda projectileData+GO_POSX,y
sta rectParams
lda projectileData+GO_POSY,y
sta rectParams+2
lda #GAMEOBJECTWIDTH
sta rectParams+4
lda #GAMEOBJECTHEIGHT
sta rectParams+6
ldx currentPlayer
jsr playerIntersectRect
cmp #0
beq updateFanDone
; Once fan is in place, make it static
lda #1
sta projectileData+JD_STATIC,y
jsr endProjectile
; Now set up the stand
lda projectileData+GO_POSX,y
sta standGameObjectData+GO_POSX
lda projectileData+GO_POSY,y
sec
sbc #GAMEOBJECTHEIGHT
sta standGameObjectData+GO_POSY,y
updateFanDone:
RESTORE_AXY
rts
updateFanWind:
lda projectileData+JD_OWNER,y
cmp currentPlayer ; We're not affected by our own fan
beq updateFanDone
tyx
ldy projectileActive
bmi updateFanDone ; No active projectile
; Calculate distance to fan
lda projectileData+GO_POSX,y
sta SCRATCHL
lda projectileData+GO_POSX,x
sec
sbc SCRATCHL
ABSA
cmp #FANRANGE ; Check if we're within range
bcs updateFanDone
; Apply wind
lda projectileData+JD_FACING,y
bne updateFanWindNeg
sec
lda projectileData+JD_PRECISEX,y
sbc #FANMAGNITUDE
sta projectileData+JD_PRECISEX,y
bra updateFanDone
updateFanWindNeg:
clc
lda projectileData+JD_PRECISEX,y
adc #FANMAGNITUDE
sta projectileData+JD_PRECISEX,y
bra updateFanDone
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; renderFan
;
; Y = Offset to projectile structure
;
renderFan:
SAVE_AXY
lda projectileData+JD_STATIC,y
beq renderFanDone ; Don't render the stand until we're static
; Render the stand under the fan
lda #standGameObjectData
sta PARAML0
lda #14
jsr renderGameObject
renderFanDone:
RESTORE_AXY
rts
; Fake game object for rendering the stand
standGameObjectData:
.word 40 ; X pos in pixels (from right terrain edge)
.word 38 ; Y pos in pixels (from bottom terrain edge)
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Saved background 64 bytes
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0