mirror of
https://github.com/blondie7575/GSCats.git
synced 2024-11-22 06:31:48 +00:00
243 lines
4.2 KiB
ArmAsm
243 lines
4.2 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 = $20 ; 12.4 fixed point speed delta, in pixels
|
|
FAN_AGE = 10
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; 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
|
|
|
|
lda #1
|
|
sta projectileData+JD_DEPLOYDELAY,y ; Let player admire new fan
|
|
|
|
RESTORE_AY
|
|
rts
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; updateFan
|
|
;
|
|
; Y = Offset to projectile structure
|
|
;
|
|
updateFan:
|
|
SAVE_AXY
|
|
|
|
lda projectileData+JD_AGE,y
|
|
cmp #FAN_AGE
|
|
bcs updateFanWornOut
|
|
|
|
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 projectileData+GO_POSY,y
|
|
inc
|
|
inc
|
|
sta projectileData+GO_POSY,y
|
|
lda #1
|
|
sta projectileData+JD_STATIC,y
|
|
jsr endProjectile
|
|
|
|
; Now set up the stand
|
|
jsr allocGameObject
|
|
cpx #-1
|
|
beq updateFanDone
|
|
txa
|
|
sta projectileData+JD_SCRATCH,y ; Remember where our stand is
|
|
lda projectileData+GO_POSX,y
|
|
sta gameObjectPool+GO_POSX,x
|
|
lda projectileData+GO_POSY,y
|
|
sec
|
|
sbc #GAMEOBJECTHEIGHT
|
|
sta gameObjectPool+GO_POSY,x
|
|
|
|
updateFanDone:
|
|
RESTORE_AXY
|
|
rts
|
|
|
|
updateFanWornOut:
|
|
jsr deleteVisibleProjectile
|
|
bra updateFanDone
|
|
|
|
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 projectileData+JD_SCRATCH,y
|
|
sta PARAML0
|
|
clc
|
|
lda #gameObjectPool
|
|
adc PARAML0
|
|
sta PARAML0
|
|
lda #14
|
|
jsr renderGameObject
|
|
|
|
; Do deployment delay after first render
|
|
lda projectileData+JD_DEPLOYDELAY,y
|
|
beq renderFanDone
|
|
jsr delayLong
|
|
lda #0
|
|
sta projectileData+JD_DEPLOYDELAY,y
|
|
|
|
renderFanDone:
|
|
RESTORE_AXY
|
|
rts
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; unrenderFan
|
|
;
|
|
; Y = Offset to projectile structure
|
|
;
|
|
unrenderFan:
|
|
SAVE_AXY
|
|
|
|
; Unrender the stand under the fan
|
|
lda projectileData+JD_SCRATCH,y
|
|
sta PARAML0
|
|
clc
|
|
lda #gameObjectPool
|
|
adc PARAML0
|
|
sta PARAML0
|
|
jsr unrenderGameObject
|
|
|
|
RESTORE_AXY
|
|
rts
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; protectFan
|
|
;
|
|
; Y = Offset to projectile structure
|
|
;
|
|
protectFan:
|
|
SAVE_AXY
|
|
|
|
; Protect the stand under the fan
|
|
lda projectileData+JD_SCRATCH,y
|
|
sta PARAML0
|
|
clc
|
|
lda #gameObjectPool
|
|
adc PARAML0
|
|
sta PARAML0
|
|
jsr vramPtr
|
|
cpx #$ffff
|
|
beq protectFanDone
|
|
|
|
lda PARAML0
|
|
clc
|
|
adc #GO_BACKGROUND
|
|
sta PARAML0
|
|
jsr protectGameObject
|
|
|
|
protectFanDone:
|
|
RESTORE_AXY
|
|
rts
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; deleteFan
|
|
;
|
|
; Y = Offset to projectile structure
|
|
;
|
|
deleteFan:
|
|
SAVE_AX
|
|
|
|
lda projectileData+JD_SCRATCH,y
|
|
tax
|
|
|
|
; Unrender the stand
|
|
lda #gameObjectPool
|
|
sta PARAML0
|
|
txa
|
|
clc
|
|
adc PARAML0
|
|
sta PARAML0
|
|
jsr unrenderGameObject
|
|
|
|
jsr deleteGameObject
|
|
jsr renderPlayers
|
|
|
|
RESTORE_AX
|
|
rts
|