Added support for multiple active projectiles

This commit is contained in:
blondie7575 2018-12-23 17:39:22 -07:00
parent 2e92ac118e
commit 35413e6ad0
7 changed files with 390 additions and 167 deletions

View File

@ -63,3 +63,5 @@ JD_VY = 138
JD_TYPE = 140 JD_TYPE = 140
JD_NEW = 142 JD_NEW = 142
MAXPROJECTILES = 3

7
fan.s
View File

@ -30,12 +30,12 @@ deployFan:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; updateFan ; updateFan
; ;
; Y = Offset to projectile structure
; ;
updateFan: updateFan:
SAVE_AY SAVE_AXY
; Wait for fan to collide with us as it falls from the sky ; Wait for fan to collide with us as it falls from the sky
ldy #0
lda projectileData+GO_POSX,y lda projectileData+GO_POSX,y
sta rectParams sta rectParams
lda projectileData+GO_POSY,y lda projectileData+GO_POSY,y
@ -45,12 +45,13 @@ updateFan:
lda #GAMEOBJECTHEIGHT lda #GAMEOBJECTHEIGHT
sta rectParams+6 sta rectParams+6
ldx currentPlayer
jsr playerIntersectRect jsr playerIntersectRect
cmp #0 cmp #0
beq updateFanDone beq updateFanDone
updateFanDone: updateFanDone:
RESTORE_AY RESTORE_AXY
rts rts

View File

@ -130,12 +130,12 @@ gameplayLoopProjectiles:
beq gameplayLoopProjectilesSkip beq gameplayLoopProjectilesSkip
jsr unrenderProjectiles jsr unrenderProjectiles
jsr updateProjectilePhysics jsr updateProjectilesPhysics
jsr protectProjectiles jsr protectProjectiles
jsr renderProjectiles jsr renderProjectiles
gameplayLoopProjectilesSkip: gameplayLoopProjectilesSkip:
jsr updateProjectileCollisions jsr updateProjectilesCollisions
lda inventoryDirty lda inventoryDirty
beq gameplayLoopVictoryCondition beq gameplayLoopVictoryCondition
@ -268,7 +268,7 @@ scrollMap:
jsr unrenderPlayers jsr unrenderPlayers
jsr unrenderProjectiles jsr unrenderProjectiles
jsr updateProjectilePhysics ; Good idea? ; jsr updateProjectilePhysics ; Good idea?
sta mapScrollPos sta mapScrollPos
asl asl

View File

@ -135,286 +135,284 @@ renderGameobjectDone:
; protectGameObject ; protectGameObject
; ;
; Saves background behind this game object ; Saves background behind this game object
; A = Pointer to gameobject background data ; PARAML0 = Pointer to gameobject background data
; X = VRAM position of upper left of game object ; X = VRAM position of upper left of game object
; ;
; Trashes SCRATCHL ; Trashes PARAML0
; ;
protectGameObject: protectGameObject:
phy phy
ldy #0 ldy #0
sta SCRATCHL
lda SHADOWVRAMBANK,x lda SHADOWVRAMBANK,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+2,x lda SHADOWVRAMBANK+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+4,x lda SHADOWVRAMBANK+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+6,x lda SHADOWVRAMBANK+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160,x lda SHADOWVRAMBANK+160,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160+2,x lda SHADOWVRAMBANK+160+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160+4,x lda SHADOWVRAMBANK+160+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160+6,x lda SHADOWVRAMBANK+160+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*2,x lda SHADOWVRAMBANK+160*2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*2+2,x lda SHADOWVRAMBANK+160*2+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*2+4,x lda SHADOWVRAMBANK+160*2+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*2+6,x lda SHADOWVRAMBANK+160*2+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*3,x lda SHADOWVRAMBANK+160*3,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*3+2,x lda SHADOWVRAMBANK+160*3+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*3+4,x lda SHADOWVRAMBANK+160*3+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*3+6,x lda SHADOWVRAMBANK+160*3+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*4,x lda SHADOWVRAMBANK+160*4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*4+2,x lda SHADOWVRAMBANK+160*4+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*4+4,x lda SHADOWVRAMBANK+160*4+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*4+6,x lda SHADOWVRAMBANK+160*4+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*5,x lda SHADOWVRAMBANK+160*5,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*5+2,x lda SHADOWVRAMBANK+160*5+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*5+4,x lda SHADOWVRAMBANK+160*5+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*5+6,x lda SHADOWVRAMBANK+160*5+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*6,x lda SHADOWVRAMBANK+160*6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*6+2,x lda SHADOWVRAMBANK+160*6+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*6+4,x lda SHADOWVRAMBANK+160*6+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*6+6,x lda SHADOWVRAMBANK+160*6+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*7,x lda SHADOWVRAMBANK+160*7,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*7+2,x lda SHADOWVRAMBANK+160*7+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*7+4,x lda SHADOWVRAMBANK+160*7+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*7+6,x lda SHADOWVRAMBANK+160*7+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*8,x lda SHADOWVRAMBANK+160*8,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*8+2,x lda SHADOWVRAMBANK+160*8+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*8+4,x lda SHADOWVRAMBANK+160*8+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*8+6,x lda SHADOWVRAMBANK+160*8+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*9,x lda SHADOWVRAMBANK+160*9,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*9+2,x lda SHADOWVRAMBANK+160*9+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*9+4,x lda SHADOWVRAMBANK+160*9+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*9+6,x lda SHADOWVRAMBANK+160*9+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*10,x lda SHADOWVRAMBANK+160*10,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*10+2,x lda SHADOWVRAMBANK+160*10+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*10+4,x lda SHADOWVRAMBANK+160*10+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*10+6,x lda SHADOWVRAMBANK+160*10+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*11,x lda SHADOWVRAMBANK+160*11,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*11+2,x lda SHADOWVRAMBANK+160*11+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*11+4,x lda SHADOWVRAMBANK+160*11+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*11+6,x lda SHADOWVRAMBANK+160*11+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*12,x lda SHADOWVRAMBANK+160*12,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*12+2,x lda SHADOWVRAMBANK+160*12+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*12+4,x lda SHADOWVRAMBANK+160*12+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*12+6,x lda SHADOWVRAMBANK+160*12+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*13,x lda SHADOWVRAMBANK+160*13,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*13+2,x lda SHADOWVRAMBANK+160*13+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*13+4,x lda SHADOWVRAMBANK+160*13+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*13+6,x lda SHADOWVRAMBANK+160*13+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*14,x lda SHADOWVRAMBANK+160*14,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*14+2,x lda SHADOWVRAMBANK+160*14+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*14+4,x lda SHADOWVRAMBANK+160*14+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*14+6,x lda SHADOWVRAMBANK+160*14+6,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*15,x lda SHADOWVRAMBANK+160*15,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*15+2,x lda SHADOWVRAMBANK+160*15+2,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*15+4,x lda SHADOWVRAMBANK+160*15+4,x
sta (SCRATCHL),y sta (PARAML0),y
iny iny
iny iny
lda SHADOWVRAMBANK+160*15+6,x lda SHADOWVRAMBANK+160*15+6,x
sta (SCRATCHL),y sta (PARAML0),y
ply ply
rts rts

Binary file not shown.

View File

@ -70,6 +70,20 @@ PD_SIZE = 256
.endmacro .endmacro
.macro PLAYERPTR_X
txa ; Pointer to player structure from index
asl
asl
asl
asl
asl
asl
asl
asl
tax
.endmacro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; playerCreate ; playerCreate
; ;
@ -204,17 +218,17 @@ playerFire_abort:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; playerIntersectRect ; playerIntersectRect
; ;
; Y = Player index ; X = Player index
; rectParams = Rectangle to intersect with us ; rectParams = Rectangle to intersect with us
; A => non zero if rectangle is intersecting player ; A => non zero if rectangle is intersecting player
; ;
playerIntersectRect: playerIntersectRect:
phy phx
PLAYERPTR_Y PLAYERPTR_X
lda playerData+GO_POSX,y lda playerData+GO_POSX,x
sta rectParams2+0 sta rectParams2+0
lda playerData+GO_POSY,y lda playerData+GO_POSY,x
sta rectParams2+2 sta rectParams2+2
lda #GAMEOBJECTWIDTH lda #GAMEOBJECTWIDTH
sta rectParams2+4 sta rectParams2+4
@ -222,7 +236,7 @@ playerIntersectRect:
sta rectParams2+6 sta rectParams2+6
jsr intersectRectRect jsr intersectRectRect
ply plx
rts rts
@ -250,6 +264,7 @@ RESTORE_AXY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; protectPlayers ; protectPlayers
; ;
; Trashes PARAML0
; ;
protectPlayers: protectPlayers:
SAVE_AXY SAVE_AXY
@ -261,6 +276,7 @@ protectPlayers:
bmi protectPlayerNext bmi protectPlayerNext
lda #playerData+GO_BACKGROUND lda #playerData+GO_BACKGROUND
sta PARAML0
jsr protectGameObject jsr protectGameObject
protectPlayerNext: protectPlayerNext:
@ -271,6 +287,7 @@ protectPlayerNext:
bmi protectPlayerDone bmi protectPlayerDone
lda #playerData+GO_BACKGROUND+PD_SIZE lda #playerData+GO_BACKGROUND+PD_SIZE
sta PARAML0
jsr protectGameObject jsr protectGameObject
protectPlayerDone: protectPlayerDone:

View File

@ -26,7 +26,48 @@ projectileData:
.byte 0 ; Padding to 256-byte boundary .byte 0 ; Padding to 256-byte boundary
.endrepeat .endrepeat
; Byte offsets for that ^ data structure can be found in equates.s
; Gameobject data (we're a subclass, effectively)
.word -1 ; Pos X in pixels (from left terrain edge)
.word 0 ; Pos Y 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
.word 0 ; Pos X (12.4 fixed point)
.word 0 ; Pos Y (12.4 fixed point)
.word 0 ; Velocity X (8.8 fixed point)
.word 0 ; Velocity Y (8.8 fixed point)
.word 0 ; Type
.word 1 ; New?
.repeat 112
.byte 0 ; Padding to 256-byte boundary
.endrepeat
; Gameobject data (we're a subclass, effectively)
.word -1 ; Pos X in pixels (from left terrain edge)
.word 0 ; Pos Y 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
.word 0 ; Pos X (12.4 fixed point)
.word 0 ; Pos Y (12.4 fixed point)
.word 0 ; Velocity X (8.8 fixed point)
.word 0 ; Velocity Y (8.8 fixed point)
.word 0 ; Type
.word 1 ; New?
.repeat 112
.byte 0 ; Padding to 256-byte boundary
.endrepeat
; Byte offsets for that-^ data structure can be found in equates.s
GRAVITY = $ffff ; 8.8 fixed point GRAVITY = $ffff ; 8.8 fixed point
@ -104,7 +145,14 @@ PT_RENDER = 14
tay tay
.endmacro .endmacro
.macro PROJECTILETYPEPTR_X
txa ; Pointer to projectile type structure from index
asl
asl
asl
asl
tax
.endmacro
projectileParams: projectileParams:
.word 0 ; Starting pos X .word 0 ; Starting pos X
@ -114,6 +162,30 @@ projectileParams:
.word 0 ; Type .word 0 ; Type
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; allocProjectile
;
; Returns offset of projectile structure in Y, or -1 if none available
;
allocProjectile:
SAVE_AX
ldx #0
allocProjectileLoop:
txy
PROJECTILEPTR_Y
lda projectileData+GO_POSX,y
bmi allocProjectileDone
inx
cpx MAXPROJECTILES
bne allocProjectileLoop
ldy #-1
allocProjectileDone:
RESTORE_AX
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; fireProjectile ; fireProjectile
; ;
@ -121,10 +193,12 @@ projectileParams:
fireProjectile: fireProjectile:
SAVE_AXY SAVE_AXY
; Set up projectile structure ; Allocate a projectile
ldy #0 ; Only one active at a time for now jsr allocProjectile
PROJECTILEPTR_Y cpy #-1
beq fireProjectileDone
; Set up projectile structure
lda projectileParams ; X pos lda projectileParams ; X pos
sta projectileData+GO_POSX,y sta projectileData+GO_POSX,y
lda projectileParams+2 ; Y pos lda projectileParams+2 ; Y pos
@ -169,6 +243,7 @@ fireProjectileFinish:
sta projectileData+JD_NEW,y sta projectileData+JD_NEW,y
stz projectileActive stz projectileActive
fireProjectileDone:
RESTORE_AXY RESTORE_AXY
rts rts
@ -217,27 +292,49 @@ prepareProjectilePhysics:
rts rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; updateProjectilesPhysics
;
;
updateProjectilesPhysics:
SAVE_AXY
ldx #0
updateProjectilesPhysicsLoop:
txy
PROJECTILEPTR_Y
jsr updateProjectilePhysics
updateProjectilesPhysicsSkip:
inx
cpx #MAXPROJECTILES
bne updateProjectilesPhysicsLoop
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; updateProjectilePhysics ; updateProjectilePhysics
; ;
; Trashes SCRATCHL ; Y = Offset to projectile structure
; ;
updateProjectilePhysics: updateProjectilePhysics:
SAVE_AY SAVE_AXY
lda projectileData+GO_POSX lda projectileData+GO_POSX,y
bpl updateProjectilePhysicsActive bpl updateProjectilePhysicsActive
jmp updateProjectilePhysicsDone jmp updateProjectilePhysicsDone
updateProjectilePhysicsActive: updateProjectilePhysicsActive:
; Integrate gravity over velocity ; Integrate gravity over velocity
lda projectileData+JD_VY lda projectileData+JD_VY,y
clc clc
adc #GRAVITY adc #GRAVITY
sta projectileData+JD_VY sta projectileData+JD_VY,y
; Integrate X velocity over position ; Integrate X velocity over position
lda projectileData+JD_VX lda projectileData+JD_VX,y
; Convert 8.8 to 12.4 ; Convert 8.8 to 12.4
cmp #$8000 cmp #$8000
ror ror
@ -248,22 +345,22 @@ updateProjectilePhysicsActive:
cmp #$8000 cmp #$8000
ror ror
clc clc
adc projectileData+JD_PRECISEX adc projectileData+JD_PRECISEX,y
sta projectileData+JD_PRECISEX sta projectileData+JD_PRECISEX,y
; Convert to integer for rendering ; Convert to integer for rendering
lsr lsr
lsr lsr
lsr lsr
lsr lsr
sta projectileData+GO_POSX sta projectileData+GO_POSX,y
bmi updateProjectilePhysicsDelete bmi updateProjectilePhysicsDelete
cmp #TERRAINWIDTH-GAMEOBJECTWIDTH-1 cmp #TERRAINWIDTH-GAMEOBJECTWIDTH-1
bpl updateProjectilePhysicsDelete bpl updateProjectilePhysicsDelete
updateProjectilePhysicsContinue: updateProjectilePhysicsContinue:
; Integrate Y velocity over position ; Integrate Y velocity over position
lda projectileData+JD_VY lda projectileData+JD_VY,y
; Convert 8.8 to 12.4 ; Convert 8.8 to 12.4
cmp #$8000 cmp #$8000
ror ror
@ -274,58 +371,85 @@ updateProjectilePhysicsContinue:
cmp #$8000 cmp #$8000
ror ror
clc clc
adc projectileData+JD_PRECISEY adc projectileData+JD_PRECISEY,y
sta projectileData+JD_PRECISEY sta projectileData+JD_PRECISEY,y
; Convert to integer for rendering ; Convert to integer for rendering
lsr lsr
lsr lsr
lsr lsr
lsr lsr
sta projectileData+GO_POSY sta projectileData+GO_POSY,y
cmp #GAMEOBJECTHEIGHT cmp #GAMEOBJECTHEIGHT
bmi updateProjectilePhysicsDelete bmi updateProjectilePhysicsDelete
; Check for special update code ; Check for special update code
ldy #0 phy
lda projectileData+JD_TYPE,y lda projectileData+JD_TYPE,y
tay tay
PROJECTILETYPEPTR_Y PROJECTILETYPEPTR_Y
lda projectileTypes+PT_UPDATE,y lda projectileTypes+PT_UPDATE,y
beq updateProjectilePhysicsDone beq updateProjectilePhysicsNormalUpdate
ply
JSRA JSRA
updateProjectilePhysicsDone: updateProjectilePhysicsDone:
RESTORE_AY RESTORE_AXY
rts rts
updateProjectilePhysicsDelete: updateProjectilePhysicsDelete:
jsr endProjectile jsr endProjectile
bra updateProjectilePhysicsDone bra updateProjectilePhysicsDone
updateProjectilePhysicsNormalUpdate:
ply
bra updateProjectilePhysicsDone
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; updateProjectilesCollisions
;
;
updateProjectilesCollisions:
SAVE_AXY
ldx #0
updateProjectilesCollisionsLoop:
txy
PROJECTILEPTR_Y
jsr updateProjectileCollisions
updateProjectilesCollisionsSkip:
inx
cpx #MAXPROJECTILES
bne updateProjectilesCollisionsLoop
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; updateProjectileCollisions ; updateProjectileCollisions
; ;
; Trashes SCRATCHL ; Y = Offset to projectile structure
; ;
updateProjectileCollisions: updateProjectileCollisions:
SAVE_AY SAVE_AXY
; Check for player collisions ; Check for player collisions
ldy #0 lda projectileData+GO_POSX,y
lda projectileData+GO_POSX
bmi updateProjectileCollisionsDone ; Projectile not active bmi updateProjectileCollisionsDone ; Projectile not active
sta rectParams sta rectParams
lda projectileData+GO_POSY lda projectileData+GO_POSY,y
sta rectParams+2 sta rectParams+2
lda #GAMEOBJECTWIDTH lda #GAMEOBJECTWIDTH
sta rectParams+4 sta rectParams+4
lda #GAMEOBJECTHEIGHT lda #GAMEOBJECTHEIGHT
sta rectParams+6 sta rectParams+6
ldx #0
updateProjectileCollisionsPlayerLoop: updateProjectileCollisionsPlayerLoop:
cpy currentPlayer cpx currentPlayer
beq updateProjectileCollisionsPlayerNext beq updateProjectileCollisionsPlayerNext
jsr playerIntersectRect jsr playerIntersectRect
@ -333,16 +457,16 @@ updateProjectileCollisionsPlayerLoop:
bne updateProjectileCollisionsPlayerHit bne updateProjectileCollisionsPlayerHit
updateProjectileCollisionsPlayerNext: updateProjectileCollisionsPlayerNext:
iny inx
cpy #NUMPLAYERS cpx #NUMPLAYERS
bne updateProjectileCollisionsPlayerLoop bne updateProjectileCollisionsPlayerLoop
; Check for terrain collisions ; Check for terrain collisions
lda projectileData+GO_POSX lda projectileData+GO_POSX,y
inc inc
inc inc
sta rectParams sta rectParams
lda projectileData+GO_POSY lda projectileData+GO_POSY,y
clc clc
inc inc
inc inc
@ -357,7 +481,7 @@ updateProjectileCollisionsPlayerNext:
bne updateProjectileCollisionsTerrainHit bne updateProjectileCollisionsTerrainHit
updateProjectileCollisionsDone: updateProjectileCollisionsDone:
RESTORE_AY RESTORE_AXY
rts rts
updateProjectileCollisionsPlayerHit: updateProjectileCollisionsPlayerHit:
@ -409,90 +533,145 @@ deleteProjectile:
protectProjectiles: protectProjectiles:
SAVE_AXY SAVE_AXY
lda projectileData ldx #0
bmi protectProjectilesDone
lda #projectileData protectProjectilesLoop:
txy
PROJECTILEPTR_Y
lda projectileData+GO_POSX,y
bpl protectProjectilesGotOne
protectProjectilesContinue:
inx
cpx #MAXPROJECTILES
beq protectProjectilesDone
bra protectProjectilesLoop
protectProjectilesGotOne:
lda #projectileData+GO_POSX
sta PARAML0 sta PARAML0
clc
tya
adc PARAML0
sta PARAML0
phx
jsr vramPtr jsr vramPtr
cpx #0 cpx #-1
bmi protectProjectilesDone beq protectProjectilesOffscreen
lda #projectileData+GO_BACKGROUND lda #projectileData+GO_BACKGROUND
sta PARAML0
clc
tya
adc PARAML0
sta PARAML0
jsr protectGameObject jsr protectGameObject
plx
bra protectProjectilesContinue
protectProjectilesDone: protectProjectilesDone:
RESTORE_AXY RESTORE_AXY
rts rts
protectProjectilesOffscreen:
plx
bra protectProjectilesContinue
UPANGLE = $00af UPANGLE = $00af
DNANGLE = $ffaf DNANGLE = $ffaf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; renderProjectiles ; renderProjectiles
; ;
; ;
renderProjectiles: renderProjectiles:
SAVE_AY SAVE_AXY
ldx #0
lda projectileData renderProjectilesLoop:
bpl renderProjectilesDoIt txy
jmp renderProjectilesDone PROJECTILEPTR_Y
jsr renderProjectile
renderProjectilesDoIt: renderProjectilesSkip:
inx
cpx #MAXPROJECTILES
bne renderProjectilesLoop
lda projectileData+JD_TYPE RESTORE_AXY
tay rts
PROJECTILETYPEPTR_Y
lda #projectileData
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; renderProjectile
;
; Y = Offset to projectile structure
;
renderProjectile:
SAVE_AXY
PROJECTILEPTR_Y
lda projectileData+GO_POSX,y
bpl renderProjectileDoIt
jmp renderProjectileDone
renderProjectileDoIt:
lda projectileData+JD_TYPE,y
tax
PROJECTILETYPEPTR_X
lda #projectileData ; Calculate pointer for game object render
sta PARAML0
clc
tya
adc PARAML0
sta PARAML0 sta PARAML0
; Determine which sprite to use ; Determine which sprite to use
lda projectileData+JD_VX lda projectileData+JD_VX,y
bmi renderProjectilesNegX bmi renderProjectileNegX
lda projectileData+JD_VY lda projectileData+JD_VY,y
bmi renderProjectilesNegYPosX bmi renderProjectileNegYPosX
cmp #UPANGLE cmp #UPANGLE
bmi renderProjectilesFlat bmi renderProjectileFlat
renderProjectilesUpAngle: renderProjectileUpAngle:
lda projectileTypes+PT_FRAME0,y ; Up angle lda projectileTypes+PT_FRAME0,x ; Up angle
bra renderProjectilesGoSprite bra renderProjectileGoSprite
renderProjectilesNegYPosX: renderProjectileNegYPosX:
cmp #DNANGLE cmp #DNANGLE
bpl renderProjectilesFlat bpl renderProjectileFlat
renderProjectilesDownAngle: renderProjectileDownAngle:
lda projectileTypes+PT_FRAME2,y ; Down angle lda projectileTypes+PT_FRAME2,x ; Down angle
bra renderProjectilesGoSprite bra renderProjectileGoSprite
renderProjectilesNegX: renderProjectileNegX:
lda projectileData+JD_VY lda projectileData+JD_VY,y
bmi renderProjectilesNegYNegX bmi renderProjectileNegYNegX
cmp #UPANGLE cmp #UPANGLE
bmi renderProjectilesFlat bmi renderProjectileFlat
bra renderProjectilesDownAngle bra renderProjectileDownAngle
renderProjectilesNegYNegX: renderProjectileNegYNegX:
cmp #DNANGLE cmp #DNANGLE
bpl renderProjectilesFlat bpl renderProjectileFlat
bra renderProjectilesUpAngle bra renderProjectileUpAngle
renderProjectilesFlat: renderProjectileFlat:
lda projectileTypes+PT_FRAME1,y ; Flat lda projectileTypes+PT_FRAME1,x ; Flat
renderProjectilesGoSprite: renderProjectileGoSprite:
jsr renderGameObject jsr renderGameObject
renderProjectilesDone: renderProjectileDone:
RESTORE_AY RESTORE_AXY
rts rts
@ -501,23 +680,51 @@ renderProjectilesDone:
; ;
; ;
unrenderProjectiles: unrenderProjectiles:
SAVE_AXY
ldx #0
unrenderProjectilesLoop:
txy
PROJECTILEPTR_Y
jsr unrenderProjectile
unrenderProjectilesSkip:
inx
cpx #MAXPROJECTILES
bne unrenderProjectilesLoop
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; unrenderProjectile
;
; Y = Offset to projectile structure
;
unrenderProjectile:
pha pha
lda projectileData lda projectileData+GO_POSX,y
bpl unrenderProjectilesActive bpl unrenderProjectileActive
jmp unrenderProjectilesDone jmp unrenderProjectileDone
unrenderProjectilesActive: unrenderProjectileActive:
lda projectileData+JD_NEW lda projectileData+JD_NEW,y
beq unrenderProjectilesDoIt beq unrenderProjectileDoIt
stz projectileData+JD_NEW lda #0
jmp unrenderProjectilesDone sta projectileData+JD_NEW,y
jmp unrenderProjectileDone
unrenderProjectilesDoIt: unrenderProjectileDoIt:
lda #projectileData lda #projectileData
sta PARAML0 sta PARAML0
clc
tya
adc PARAML0
sta PARAML0
jsr unrenderGameObject jsr unrenderGameObject
unrenderProjectilesDone: unrenderProjectileDone:
pla pla
rts rts
@ -525,14 +732,12 @@ unrenderProjectilesDone:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; processPlayerImpact ; processPlayerImpact
; ;
; Y = Index of player that was hit ; X = Index of player that was hit
; Y = Offset to projectile structure
; ;
processPlayerImpact: processPlayerImpact:
PLAYERPTR_Y PLAYERPTR_X
tyx
ldy #0 ; Assume projectile 0
PROJECTILEPTR_Y
lda projectileData+JD_TYPE,y lda projectileData+JD_TYPE,y
tay tay
PROJECTILETYPEPTR_Y PROJECTILETYPEPTR_Y