GSCats/player.s

579 lines
9.2 KiB
ArmAsm
Raw Permalink Normal View History

2017-08-15 19:40:14 +00:00
;
; players
; Code and data structures related to the players
;
; Created by Quinn Dunki on 8/13/17
;
MAX_ANGER = 100
START_POWER = 2
START_TREATS = 7
2017-08-15 19:40:14 +00:00
playerData:
;;;;;;;;;;;; PLAYER 1 ;;;;;;;;;;;;;;
2017-08-15 19:40:14 +00:00
; gameobject data
.word 0 ; X pos in pixels (from left terrain edge)
.word 0 ; 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
.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
2017-08-15 19:40:14 +00:00
.word 0 ; Angle in degrees from +X
.word 0 ; Power
.word 0 ; Anger
2017-09-03 00:31:12 +00:00
.byte 8,"SPROCKET " ; Name
.word 29 ; Base Sprite
2024-01-22 00:27:12 +00:00
.word 0,5,7,1,1,0,0,0 ; Prices
2018-06-11 00:05:20 +00:00
.word 0 ; Current weapon
.word 0 ; Treats
.repeat 86
.byte 0 ; Padding to 256-byte boundary
.endrepeat
2017-09-03 00:31:12 +00:00
;;;;;;;;;;;; PLAYER 2 ;;;;;;;;;;;;;;
2017-09-03 00:31:12 +00:00
; gameobject data
.word 0 ; X pos in pixels (from left terrain edge)
.word 0 ; 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
.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
2017-09-03 00:31:12 +00:00
.word 0 ; Angle in degrees from +X
.word 0 ; Power
.word 0 ; Anger
2017-09-03 00:31:12 +00:00
.byte 8,"TINKER " ; Name
.word 20 ; Base Sprite
2024-01-22 00:27:12 +00:00
.word 0,5,7,1,1,0,0,0 ; Prices
2018-06-11 00:05:20 +00:00
.word 0 ; Current weapon
.word 0 ; Treats
2017-08-15 19:40:14 +00:00
.repeat 86
.byte 0 ; Padding to 256-byte boundary
.endrepeat
PD_ANGLE = 132
PD_POWER = 134
PD_ANGER = 136
PD_NAME = 138
2018-06-08 17:49:29 +00:00
PD_BASESPRITE = 148
PD_PRICES = 150
2018-06-11 00:05:20 +00:00
PD_CURRWEAPON = 166
PD_TREATS = 168
PD_SIZE = 256
MAX_POWER = 5
MAX_ANGLE = 180
.macro PLAYERPTR_Y
tya ; Pointer to player structure from index
asl
asl
asl
2017-09-03 00:31:12 +00:00
asl
asl
asl
asl
asl
tay
.endmacro
.macro PLAYERPTR_X
txa ; Pointer to player structure from index
asl
asl
asl
asl
asl
asl
asl
asl
tax
.endmacro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; playerCreate
;
; A = Player X pos
2017-09-03 00:31:12 +00:00
; Y = Index
; Trashes SCRATCHL
;
playerCreate:
2017-09-03 00:31:12 +00:00
pha
PLAYERPTR_Y
sty SCRATCHL
pla
; Starting position
2017-09-03 00:31:12 +00:00
sta playerData+GO_POSX,y
lda #playerData
2017-09-03 00:31:12 +00:00
clc
adc SCRATCHL
sta PARAML0
jsr placeGameObjectOnTerrainDefault
; Starting aim
lda playerData+GO_POSX,y
cmp #TERRAINWIDTH/2
bcc playerCreateLeft
lda #154
bra playerCreateInit
playerCreateLeft:
lda #24
playerCreateInit:
sta playerData+PD_ANGLE,y
; Initialize standard values
lda #START_POWER
sta playerData+PD_POWER,y
lda #START_TREATS
sta playerData+PD_TREATS,y
2024-01-22 01:21:05 +00:00
lda #0
sta playerData+PD_ANGER,y
sta playerData+PD_CURRWEAPON,y
lda #1
sta playersDirty
sta terrainDirty
sta projectilesDirty
sta inventoryDirty
lda #-1
sta gameOver
sta projectileActive
stz currentPlayer
jsr createProgressBar
rts
2017-09-03 00:31:12 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; playerDeltaAngle
;
; Y = Player index
; X = Delta
;
playerDeltaAngle:
SAVE_AXY
PLAYERPTR_Y
txa
clc
adc playerData+PD_ANGLE,y
bmi playerDeltaAngleClampLow
cmp #MAX_ANGLE
bpl playerDeltaAngleClampHigh
playerDeltaAngleStore:
sta playerData+PD_ANGLE,y
RESTORE_AXY
rts
playerDeltaAngleClampLow:
lda #0
bra playerDeltaAngleStore
playerDeltaAngleClampHigh:
lda #MAX_ANGLE
bra playerDeltaAngleStore
2017-08-15 19:40:14 +00:00
2017-09-05 19:55:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; playerDeltaPower
;
; Y = Player index
; X = Delta
;
playerDeltaPower:
SAVE_AXY
PLAYERPTR_Y
txa
clc
adc playerData+PD_POWER,y
beq playerDeltaPowerClampLow
cmp #MAX_POWER
2017-09-05 19:55:27 +00:00
bpl playerDeltaPowerClampHigh
playerDeltaPowerStore:
sta playerData+PD_POWER,y
RESTORE_AXY
rts
playerDeltaPowerClampLow:
lda #1
bra playerDeltaPowerStore
playerDeltaPowerClampHigh:
lda #MAX_POWER
2017-09-05 19:55:27 +00:00
bra playerDeltaPowerStore
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; playerFire
;
; Y = Player index
; Trashes SCRATCHL,SCRATCHL2
;
playerFire:
SAVE_AXY
sty SCRATCHL2
PLAYERPTR_Y
; Check that we can afford it
2018-06-11 23:22:34 +00:00
lda playerData+PD_CURRWEAPON,y
pha
asl
tax
2018-12-30 01:19:10 +00:00
stx SCRATCHL
lda #playerData+PD_PRICES
2018-12-30 01:19:10 +00:00
clc
adc SCRATCHL
sta SCRATCHL
lda (SCRATCHL),y
sta SCRATCHL
lda playerData+PD_TREATS,y
cmp SCRATCHL
bmi playerFire_abort
2018-06-11 23:22:34 +00:00
sec ; Spend money
sbc SCRATCHL
sta playerData+PD_TREATS,y
2018-06-11 23:22:34 +00:00
2024-01-22 00:27:12 +00:00
; Check for movement
lda playerData+PD_CURRWEAPON,y
2024-01-22 01:21:05 +00:00
cmp #PT_MOVELEFT
2024-01-22 00:27:12 +00:00
beq playerFireMoveLeft
2024-01-22 01:21:05 +00:00
cmp #PT_MOVERIGHT
2024-01-22 00:27:12 +00:00
beq playerFireMoveRight
; Animate the shooting
phy
ldy SCRATCHL2
jsr renderShootAnimation
ply
2018-06-11 23:22:34 +00:00
; Prepare projectile parameters
pla
sta projectileParams+8
lda playerData+GO_POSX,y
sta projectileParams
lda playerData+GO_POSY,y
sta projectileParams+2
lda playerData+PD_ANGLE,y
sta projectileParams+4
lda playerData+PD_POWER,y
sta projectileParams+6
jsr fireProjectile
2018-06-11 23:22:34 +00:00
playerFire_done:
RESTORE_AXY
2017-09-03 03:52:19 +00:00
rts
2018-06-11 23:22:34 +00:00
playerFire_abort:
pla ; Balance stack
jsr renderCrosshair ; Keep crosshair from disappearing on abort. Kinda hacky
2018-06-11 23:22:34 +00:00
bra playerFire_done
2024-01-22 00:27:12 +00:00
playerFireMoveLeft:
lda #-2
sta playerMoveRequested
bra playerFire_abort
playerFireMoveRight:
lda #2
sta playerMoveRequested
bra playerFire_abort
2017-09-03 03:52:19 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; playerIntersectRect
;
; X = Player index
2017-09-03 03:52:19 +00:00
; rectParams = Rectangle to intersect with us
; A => non zero if rectangle is intersecting player
;
playerIntersectRect:
phx
PLAYERPTR_X
2017-09-03 03:52:19 +00:00
lda playerData+GO_POSX,x
2017-09-03 03:52:19 +00:00
sta rectParams2+0
lda playerData+GO_POSY,x
2017-09-03 03:52:19 +00:00
sta rectParams2+2
lda #GAMEOBJECTWIDTH
sta rectParams2+4
lda #GAMEOBJECTHEIGHT
sta rectParams2+6
jsr intersectRectRect
plx
rts
2017-08-16 02:04:22 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; renderPlayers
;
;
renderPlayers:
SAVE_AXY
lda #playerData
sta PARAML0
2018-06-08 17:49:29 +00:00
lda playerData+PD_BASESPRITE
jsr renderGameObject
lda #playerData+PD_SIZE
sta PARAML0
2018-06-08 17:49:29 +00:00
lda playerData+PD_SIZE+PD_BASESPRITE
jsr renderGameObject
RESTORE_AXY
2017-08-16 02:04:22 +00:00
rts
2017-10-19 19:59:24 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; protectPlayers
;
; Trashes PARAML0
2017-10-19 19:59:24 +00:00
;
protectPlayers:
SAVE_AXY
lda #playerData
sta PARAML0
jsr vramPtr
cpx #$ffff
beq protectPlayerNext
2017-10-19 19:59:24 +00:00
lda #playerData+GO_BACKGROUND
sta PARAML0
2017-10-19 19:59:24 +00:00
jsr protectGameObject
protectPlayerNext:
lda #playerData+PD_SIZE
sta PARAML0
jsr vramPtr
cpx #$ffff
beq protectPlayerDone
2017-10-19 19:59:24 +00:00
lda #playerData+GO_BACKGROUND+PD_SIZE
sta PARAML0
2017-10-19 19:59:24 +00:00
jsr protectGameObject
protectPlayerDone:
2017-10-19 19:59:24 +00:00
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; unrenderPlayers
;
;
unrenderPlayers:
SAVE_AXY
lda #playerData
sta PARAML0
jsr unrenderGameObject
lda #playerData+PD_SIZE
sta PARAML0
jsr unrenderGameObject
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; renderHitAnimation
;
; Y = Player index to render
; Trashes PARAML0,SCRATCHL
;
renderHitAnimation:
SAVE_AXY
; Play hit sound
phy
ldy #SOUND_HOWL
jsr playSound
ply
PLAYERPTR_Y
jsr unrenderPlayers
jsr unrenderCrosshair
lda playerData+GO_POSX,y
sta renderAnimationPos
lda playerData+GO_POSY,y
clc
adc #GAMEOBJECTHEIGHT
sta renderAnimationPos+2
lda #renderAnimationPos
sta PARAML0
ldx #5
lda playerData+PD_BASESPRITE,y
inc ; Hit animation starts right above base sprite
tay
lda #ANIMATION_SIZE_16x32
jsr renderAnimation
jsr renderPlayers
RESTORE_AXY
rts
renderAnimationPos:
.word 0,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; renderShootAnimation
;
; Y = Player index to render
; Trashes PARAML0,SCRATCHL
;
renderShootAnimation:
SAVE_AXY
2023-07-06 18:03:41 +00:00
jsr playIterativeMeowSound
PLAYERPTR_Y
jsr unrenderPlayers
jsr unrenderCrosshair
lda playerData+GO_POSX,y
sta renderAnimationPos
lda playerData+GO_POSY,y
sta renderAnimationPos+2
lda #renderAnimationPos
sta PARAML0
ldx #3
lda playerData+PD_BASESPRITE,y
clc
adc #6 ; Shoot animation starts 6 above base sprite
tay
lda #ANIMATION_SIZE_16x16
jsr renderAnimation
jsr renderPlayers
RESTORE_AXY
rts
2017-08-15 19:40:14 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; renderPlayerHeader
;
; Y = Player index to render
;
renderPlayerHeader:
SAVE_AXY
PLAYERPTR_Y
2017-08-15 19:40:14 +00:00
2023-07-17 02:01:14 +00:00
; Erase header
phy
ldx #0000
ldy #10
jsr colorFill
ply
; Redraw header
2017-09-03 00:31:12 +00:00
tya
clc
adc #playerData
adc #PD_NAME
sta PARAML0
phy
2023-07-17 22:53:17 +00:00
ldy #$25a1
lda #1
jsl renderStringFar
ply
2017-08-15 19:40:14 +00:00
; lda playerData+PD_ANGLE,y
; ldx #56 + $2500
; jsr drawNumber
; lda playerData+PD_POWER,y
; ldx #76 + $2500
; jsr drawNumber
2017-09-04 00:20:24 +00:00
lda playerData+PD_TREATS,y
2023-07-17 22:53:17 +00:00
ldx #$25f0
jsr drawNumber
lda #treatsStr
sta PARAML0
2023-07-17 22:53:17 +00:00
ldy #$25d0
lda #1
jsl renderStringFar
lda #angerStr
sta PARAML0
ldy #$25ff
lda #1
jsl renderStringFar
jsr renderProgressBar
2017-08-15 19:40:14 +00:00
RESTORE_AXY
rts
treatsStr:
pstring "TREATS:$"
angerStr:
pstring "ANGER:"
2023-07-06 18:03:41 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; syncPlayerHeader
;
syncPlayerHeader:
SAVE_AY
ldy currentPlayer
PLAYERPTR_Y
; Convert anger to progress bar value
2024-01-22 01:21:05 +00:00
lda playerData+PD_ANGER,y
lsr
lsr
jsr setProgressBar
RESTORE_AY
rts
2023-07-06 18:03:41 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; playIterativeMeowSound
;
playIterativeMeowSound:
phy
ldy meowDex
jsr playSound
iny
iny
cpy #SOUND_MEOW4
bcc playIterativeMeowSoundDone
beq playIterativeMeowSoundDone
ldy #SOUND_MEOW1
playIterativeMeowSoundDone:
sty meowDex
ply
rts
meowDex:
.word SOUND_MEOW1