GSCats/gamemanager.s

220 lines
3.6 KiB
ArmAsm
Raw Normal View History

2017-08-16 02:04:22 +00:00
;
; gamemanager
; The manager for overall game logic
;
; Created by Quinn Dunki on 8/15/17
;
2017-09-03 00:31:12 +00:00
NUMPLAYERS = 2
2017-08-16 02:04:22 +00:00
beginGameplay:
; Set up palette for terrain and players
lda #basePalette
sta PARAML0
lda #0
jsr setPalette
; Erase the screen
ldx #$2222
jsr colorFill
; Generate, compile, and clip terrain
jsr generateTerrain
jsr compileTerrain
jsr clipTerrain
; Create players
2017-09-03 00:31:12 +00:00
lda #40
ldy #0
jsr playerCreate
lda #190
ldy #1
jsr playerCreate
2017-08-16 02:04:22 +00:00
ldy #0
jsr renderPlayerHeader
gameplayLoop:
jsr syncVBL
; Render the terrain if needed
lda terrainDirty
beq gameplayLoopKbd
jsr renderTerrain
stz terrainDirty
; Render players
jsr renderPlayers
gameplayLoopKbd:
2017-09-05 19:48:30 +00:00
lda projectileActive
bpl gameplayLoopProjectiles ; Skip input during shots
2017-08-16 02:04:22 +00:00
; Check for keys down
jsr kbdScan
; Scroll map if needed
lda mapScrollRequested
bmi gameplayLoopAngle
2017-08-16 02:04:22 +00:00
jsr scrollMap
gameplayLoopAngle:
; Update aim angle if needed
2017-08-16 02:04:22 +00:00
lda angleDeltaRequested
beq gameplayLoopFire
2017-08-16 02:04:22 +00:00
jsr changeAngle
gameplayLoopFire:
lda fireRequested
2017-08-23 03:33:07 +00:00
beq gameplayLoopProjectiles
jsr fire
2017-08-23 03:33:07 +00:00
gameplayLoopProjectiles:
2017-09-05 19:48:30 +00:00
sta KBDSTROBE
jsr unrenderProjectiles
2017-08-23 03:33:07 +00:00
jsr updateProjectiles
jsr renderProjectiles
2017-08-23 03:33:07 +00:00
2017-09-03 00:31:12 +00:00
lda turnRequested
2017-09-04 00:20:24 +00:00
beq gameplayLoopVictoryCondition
2017-09-03 00:31:12 +00:00
jsr endTurn
2017-08-16 02:04:22 +00:00
2017-09-04 00:20:24 +00:00
gameplayLoopVictoryCondition:
lda gameOver
bmi gameplayLoopEndFrame
jsr endGame
2017-09-03 00:31:12 +00:00
gameplayLoopEndFrame:
2017-08-16 02:04:22 +00:00
lda quitRequested
beq gameplayLoop
jmp quitGame
2017-09-03 00:31:12 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; endTurn
;
; Handles changing the active player
;
endTurn:
lda currentPlayer
inc
cmp #NUMPLAYERS
beq endTurnWrap
sta currentPlayer
endTurnRefresh:
ldy currentPlayer
jsr renderPlayerHeader
stz turnRequested
rts
endTurnWrap:
stz currentPlayer
bra endTurnRefresh
2017-09-04 00:20:24 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; endGame
;
; Handles someone winning
;
endGame:
lda #1
sta quitRequested
rts
2017-08-16 02:04:22 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; scrollMap
;
; Handles updating the state of the terrain in response to scrolling
;
scrollMap:
jsr unclipTerrain
sta mapScrollPos
asl
sta leftScreenEdge
clc
2017-09-05 19:48:30 +00:00
adc #160-GAMEOBJECTWIDTH/4-1
sta rightScreenEdge
2017-08-16 02:04:22 +00:00
jsr clipTerrain
lda #$ffff
sta mapScrollRequested
lda #1
sta terrainDirty
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; changeAngle
;
; Handles changing a player's aim
;
changeAngle:
2017-09-03 00:31:12 +00:00
ldy currentPlayer
2017-08-16 02:04:22 +00:00
tax
jsr playerDeltaAngle
2017-09-03 00:31:12 +00:00
ldy currentPlayer
2017-08-16 02:04:22 +00:00
jsr renderPlayerHeader
stz angleDeltaRequested
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; fire
;
; Handles firing a player's weapon
;
fire:
stz fireRequested
2017-09-03 00:31:12 +00:00
ldy currentPlayer
jsr playerFire
rts
2017-08-16 02:04:22 +00:00
basePalette:
.word $0000,$0080,$0000,$000F,$0FFF,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0FFF
quitRequested:
.word $0000
mapScrollRequested:
.word $FFFF
angleDeltaRequested:
.word $0000
fireRequested:
.word $0000
2017-09-03 00:31:12 +00:00
turnRequested:
.word $0000
2017-08-16 02:04:22 +00:00
terrainDirty:
.word 1
2017-08-16 02:20:47 +00:00
activePlayer:
.word 0
2017-09-03 00:31:12 +00:00
currentPlayer:
.word 0
2017-09-04 00:20:24 +00:00
gameOver:
.word -1 ; Player index of winner
2017-09-05 19:48:30 +00:00
projectileActive:
.word -1
2017-09-03 00:31:12 +00:00
2017-08-16 02:04:22 +00:00
; Position of map viewing window. Can be visualized in two ways:
; a) Word-distance from right edge of terrain data (which is in memory right-to-left) to left edge of visible screen
; b) Byte-distance from left edge of logical terrain to left edge of visible screen
; c) Byte-distance from left edge of logical terrain to right edge of visible screen minus game object width in words
2017-08-16 02:04:22 +00:00
mapScrollPos:
.word 0
leftScreenEdge:
.word 0
rightScreenEdge:
2017-09-05 19:48:30 +00:00
.word 160-GAMEOBJECTWIDTH/4-1