From b06048a9d9bcfc8219f2fd466e092ac64fd6a085 Mon Sep 17 00:00:00 2001 From: blondie7575 Date: Wed, 26 Dec 2018 17:10:25 -0700 Subject: [PATCH] Many bug fixes to multi-projectile support --- equates.s | 1 + fan.s | 8 ++++++++ gamemanager.s | 32 ++++++++++++++++++++++---------- gscats.2mg | Bin 819264 -> 819264 bytes projectile.s | 50 ++++++++++++++++++++++++++++++++++---------------- 5 files changed, 65 insertions(+), 26 deletions(-) diff --git a/equates.s b/equates.s index 9ae651b..264ad45 100644 --- a/equates.s +++ b/equates.s @@ -62,6 +62,7 @@ JD_VX = 136 JD_VY = 138 JD_TYPE = 140 JD_NEW = 142 +JD_STATIC = 144 MAXPROJECTILES = 3 diff --git a/fan.s b/fan.s index f2c6fb6..5ae01f2 100644 --- a/fan.s +++ b/fan.s @@ -35,6 +35,9 @@ deployFan: updateFan: SAVE_AXY + lda projectileData+JD_STATIC,y + bne updateFanDone ; We're already static, so no work to do + ; Wait for fan to collide with us as it falls from the sky lda projectileData+GO_POSX,y sta rectParams @@ -50,6 +53,11 @@ updateFan: cmp #0 beq updateFanDone + ; Once fan is in place, make it static + lda #1 + sta projectileData+JD_STATIC,y + jsr endProjectile + updateFanDone: RESTORE_AXY diff --git a/gamemanager.s b/gamemanager.s index fa2feef..5793d96 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -65,7 +65,14 @@ beginGameplay: gameplayLoop: jsr kbdScan - jsr syncVBL +; BORDER_COLOR #$F + jsr nextVBL + +; BORDER_COLOR #$0 + + ; Check for pause + lda paused + bne gameplayLoopEndFrame ;;;;;;;;;;; ; Update @@ -74,16 +81,13 @@ gameplayLoop: sta projectilesDirty lda projectileActive bpl gameplayLoopShotTracking ; Skip input during shots - - ; Check for pause -; lda paused -; bne gameplayLoopEndFrame - bra gameplayLoopScroll gameplayLoopShotTracking: jsr trackActiveShot +; BORDER_COLOR #$1 + gameplayLoopScroll: ; Scroll map if needed @@ -108,8 +112,10 @@ gameplayLoopFire: beq gameplayLoopRender jsr fire +; BORDER_COLOR #$2 + gameplayLoopRender: - sta KBDSTROBE +; sta KBDSTROBE ;;;;;;;;;;; ; Render @@ -126,6 +132,9 @@ gameplayLoopRender: jsr renderPlayers gameplayLoopProjectiles: + +; BORDER_COLOR #$3 + lda projectilesDirty beq gameplayLoopProjectilesSkip @@ -142,6 +151,8 @@ gameplayLoopProjectilesSkip: stz inventoryDirty jsr renderInventory +; BORDER_COLOR #$4 + gameplayLoopVictoryCondition: lda gameOver bmi gameplayEndTurnCondition @@ -168,7 +179,8 @@ gameplayLoopContinue: ; Trashes SCRATCHL ; trackActiveShot: - lda projectileData+JD_PRECISEX + ldy projectileActive + lda projectileData+JD_PRECISEX,y lsr ; Convert to integer and divide by two for byte distance lsr lsr @@ -176,7 +188,7 @@ trackActiveShot: lsr sta SCRATCHL ; Save this for later - lda projectileData+JD_VX + lda projectileData+JD_VX,y bmi trackActiveShotNeg ; Left-to-right @@ -369,7 +381,7 @@ currentPlayer: gameOver: .word -1 ; Player index of winner projectileActive: - .word -1 + .word -1 ; Y offset of active shot paused: .word 0 diff --git a/gscats.2mg b/gscats.2mg index 857dc3c3d51f5d26a6fec0ae5fa6e20c720dd99d..5cd9fa09bcc13bc50b1caf3bf5476448ff8e40d2 100644 GIT binary patch delta 1768 zcmZuxZ)_7~7=Q1McI~x=@?qF*0bZE|hzbWzGx38Ph~dv7oq&YGq_~*9cj>KLOiXBk zJs^#V;Yb9bE9;;P*m_NGG|R$v=n_IgVnvcB%|gJah#%a{kRzf-6RFR8H*iERd3sNO z_q@ON_xyR^E6SQH%9_GrhxgP{_k4tYL@scSKkuk}X*MvQMa$Q3ePhGA=C`(NSS<($ zA?Md-*F zj=4Nqm||Y7_P$FJP7NXaIir1){Ou95Ildx_U-sj}^Dvr+zaZGn>X%4K))=Jbi9SO7 ztioZnL(dR_!+&?^{lw((8ls=4@AX6Qe!UF#HTv>;M51aNcig_?kP65Y5={9HOi!g_(!7FlF2R0||uAg13A#dm$M zZ8}TB5Trav7l`r$&G0k{@4@Tm;p;vStBw&q(HRhXk$RaxHMB|vcEP87G=&2`$bv4( zk#wGffjfuCyzm0*bpH%+_c3rDHW~l{Cr+?uJ8b#C)&g1hsz6o$wAS`#BwQ7!10>+U zp0)!Bu-J(005V`9;KW5rb%|^O{}KiBg=8PY)@>UiVT3k@v@cO=Levy*YL^7~+`aKsMf`oSXiU^r*(3EPIaCLO_5yP(JxPxME za+QN!6fcW{d-4v4N22qvzG zl&37Pf2RcE=|nu-j2|Bc%vLAkBC39;x$LS4w%D?QHf`-tg}siYHfq*AaW zs{9dC9>THhN2s@lkJJ3%$>PsCpH>WFcTm~E|7{tpo`y+x*?lXmn!LlJ(mjZ;t+nF= z;6RtXR+r)TToCI)XmQDF=~&%Gr98xYcU#W1Ru-YC!`t8>;w4c9(b>!rI+!CQ3@@kw zy=!dIwq)pFS@gT8YIB(~X)y$P-ghRPxAA+ecVIHAwVTO<3)$uEpGKd~4c2ijlToNs z?h{Iuo3)sp{u(H>z!xtfVafQ-h=Pk3EB?UvHxXq4{ZK_exRv`9WtH#7Z$)srHF@8` zE?CNU&Dw~{<62gA8T%v{Y#7Xa68zK3$<{?|P5eoZ#_K(ef0iSrQ<&3N@1d88I!wYD zgsd^8@@S#~(S;IDI6I9~ew1*{YVkxQiwEc0cPXtATo3=Q?17twhr24_${bn-)x+1i z0CJ)19!uzhnfW~0&>hlP6u>XC`G)S9^KmN@3t7l)LZjJpqoKRxj)gRj6|XmRn=1lD sMEu6A#v@?R8%*`Edr{vl~%Y)s7FyWF}hkq=at zULcK$@i38S>2^RFu=Q%+F`;2x%#x*9kRq5F6F=;O+0eu-j(8vtScvs`ubbP%OP}6z zzk8qG^ZcIoxpz$2Hl}PFuCsfSo1a;W(67h|&avn1H7_p**7E4t-EX|UXIJCiwmmNi z0z$}f9qmAyy3yh?<{Ud@ulbjV0Y}pIk+hw=c4||W5OrQQ`rPUr**M`2h<>Erm5n-& zdS5o4_NWhJynf{9Ic@{T<&$)PJ6btF=1HV^GW=SiOE2xL*{*vVZsn7qL9UU@k9;x6 z)$ZahjSSCnuU2})B;n8z!ryXwEP3y5t~KuK#IN}AkqV3|@MVHsyv`vtL+CK^^NJ0B z)=o7d*zm)4dXktnyp_;2yYD2lpWQ>`bN|>B9U!I)x2(|y2=4LG3^BcUvJ+qIz(9Wh zeo>kwrbEjTtaQ;KMtG;4o&|zB{9QZk1t%z=pu3$mNv-TkRMA#R2+(|Ty2L#h*9grM zbIrM`fcO=oUY*F#9v2)^lqEZSKTfknz~Ek~4TCaRZ2 z@a_uyy$?!L^TeHq2E;z3ULqh}FO^tiua6bn;M8RWu)u?(r+Q) zd?Yfe3#0}73k=NVlBYSorYTDz2sMZGt0*-t>WVkjEWzfcTBTG_idiFJ6h!qz$QT#Z zQz0D&>9qBKCNufwjME=Y_Rhi;ssG~&irPZ_#<5^l?MwylE+FV zvxVM~Qw5RUl_4GYZn#oS53!Lq9X%WmC!Fvi;lOXb15(Q9{&$ywAg&zWk5HeL%gTp;?3kId zp^3SLx1il`3${g#pcD{GCFqIKDix8k!UBhyB+$_IwLAN<3qIDEccjh1->clurVzvm zO~p>$-v}I!M>b2)aBJPTSo9;ICT#4L7RCP{oBo*E5(V+B9y}dQezTr`s^wtxzeNh6 z|J@=GHwQ!QEbr6Ai!)O^nz#j`s;jN_$#u0nj@NYovvL==Sob--AVT9VyqSh?{85xm z+F8QJY?wrr8U+9-V<*PS2C{}ZS#{N--VvM%n&z;bh?5Av#vdd^;H-su^tl%!5M?(GR6^Cf>^^qQ=! zV=q>-7cS*bhVsfUqgQ3D?R$Lh<1lRa!SWi)d273jkYu{pClQi@wOz|{LyJhns>rHp zY2QXSdbU3-$fiSBbz-B39Wm+BC!~`S@ZNKu(mg`geOl+R^&%u+F0Zeu2-`cU#dJ`#2sfO#+**eWnPm;-Dz Qm=nwe<_7Z&Hehe$AL&uMZ2$lO diff --git a/projectile.s b/projectile.s index 8ed0e16..5e8cb6a 100644 --- a/projectile.s +++ b/projectile.s @@ -21,8 +21,9 @@ projectileData: .word 0 ; Velocity Y (8.8 fixed point) .word 0 ; Type .word 1 ; New? + .word 0 ; Static? - .repeat 112 + .repeat 110 .byte 0 ; Padding to 256-byte boundary .endrepeat @@ -41,8 +42,9 @@ projectileData: .word 0 ; Velocity Y (8.8 fixed point) .word 0 ; Type .word 1 ; New? + .word 0 ; Static? - .repeat 112 + .repeat 110 .byte 0 ; Padding to 256-byte boundary .endrepeat @@ -61,8 +63,9 @@ projectileData: .word 0 ; Velocity Y (8.8 fixed point) .word 0 ; Type .word 1 ; New? + .word 0 ; Static? - .repeat 112 + .repeat 110 .byte 0 ; Padding to 256-byte boundary .endrepeat @@ -177,7 +180,7 @@ allocProjectileLoop: lda projectileData+GO_POSX,y bmi allocProjectileDone inx - cpx MAXPROJECTILES + cpx #MAXPROJECTILES bne allocProjectileLoop ldy #-1 @@ -203,6 +206,9 @@ fireProjectile: sta projectileData+GO_POSX,y lda projectileParams+2 ; Y pos sta projectileData+GO_POSY,y + lda #0 + sta projectileData+JD_STATIC,y + sty projectileActive lda projectileParams ; Fixed point version of X pos asl @@ -241,7 +247,6 @@ fireProjectileStandardDeploy: fireProjectileFinish: lda #1 sta projectileData+JD_NEW,y - stz projectileActive fireProjectileDone: RESTORE_AXY @@ -323,7 +328,12 @@ updateProjectilePhysics: SAVE_AXY lda projectileData+GO_POSX,y - bpl updateProjectilePhysicsActive + bmi updateProjectilePhysicsSkip ; Not allocated + lda projectileData+JD_STATIC,y + bne updateProjectilePhysicsSkip ; Static + bra updateProjectilePhysicsActive + +updateProjectilePhysicsSkip: jmp updateProjectilePhysicsDone updateProjectilePhysicsActive: @@ -398,7 +408,7 @@ updateProjectilePhysicsDone: rts updateProjectilePhysicsDelete: - jsr endProjectile + jsr endDeleteProjectile bra updateProjectilePhysicsDone updateProjectilePhysicsNormalUpdate: @@ -437,8 +447,10 @@ updateProjectileCollisions: SAVE_AXY ; Check for player collisions + lda projectileData+JD_STATIC,y + bne updateProjectileCollisionsDone ; Static lda projectileData+GO_POSX,y - bmi updateProjectileCollisionsDone ; Projectile not active + bmi updateProjectileCollisionsDone ; Not allocated sta rectParams lda projectileData+GO_POSY,y sta rectParams+2 @@ -486,26 +498,34 @@ updateProjectileCollisionsDone: updateProjectileCollisionsPlayerHit: jsr processPlayerImpact - jsr endProjectile + jsr endDeleteProjectile bra updateProjectileCollisionsDone updateProjectileCollisionsTerrainHit: jsr processTerrainImpact - jsr endProjectile + jsr endDeleteProjectile bra updateProjectileCollisionsDone ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; endProjectile +; endDeleteProjectile ; ; Trashes A and Y ; -endProjectile: +endDeleteProjectile: lda #projectileData sta PARAML0 jsr unrenderGameObject - ldy #0 + ldy projectileActive jsr deleteProjectile + bra endProjectile + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; endProjectile +; +; Trashes A +; +endProjectile: lda #1 sta turnRequested lda #-1 @@ -516,11 +536,10 @@ endProjectile: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; deleteProjectile ; -; Y = Projectile index +; Y = Projectile offset ; Trashes A ; deleteProjectile: - PROJECTILEPTR_Y lda #-1 sta projectileData+GO_POSX,y rts @@ -611,7 +630,6 @@ renderProjectilesSkip: renderProjectile: SAVE_AXY - PROJECTILEPTR_Y lda projectileData+GO_POSX,y bpl renderProjectileDoIt jmp renderProjectileDone