From c72e8c125bdedbc297100523419d066fd5cb3129 Mon Sep 17 00:00:00 2001 From: blondie7575 Date: Sat, 29 Dec 2018 17:45:40 -0700 Subject: [PATCH] Added projectile aging and subclass cleanup --- equates.s | 1 + fan.s | 38 +++++++++++++++++++-- gamemanager.s | 2 ++ gscats.2mg | Bin 819264 -> 819264 bytes projectile.s | 92 ++++++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 120 insertions(+), 13 deletions(-) diff --git a/equates.s b/equates.s index d5d5f01..d4d907c 100644 --- a/equates.s +++ b/equates.s @@ -66,6 +66,7 @@ JD_STATIC = 144 JD_OWNER = 146 JD_FACING = 148 JD_SCRATCH = 150 +JD_AGE = 152 MAXPROJECTILES = 3 diff --git a/fan.s b/fan.s index 2647e1d..3eb74c4 100644 --- a/fan.s +++ b/fan.s @@ -7,7 +7,7 @@ FANRANGE = 100 ; In pixels FANMAGNITUDE = $10 ; 12.4 fixed point speed delta, in pixels - +FAN_AGE = 4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; deployFan @@ -39,6 +39,10 @@ deployFan: 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 @@ -68,7 +72,6 @@ updateFan: ; Now set up the stand jsr allocGameObject cpx #-1 -BREAK beq updateFanDone txa sta projectileData+JD_SCRATCH,y ; Remember where our stand is @@ -83,6 +86,10 @@ 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 @@ -144,3 +151,30 @@ renderFan: renderFanDone: 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 diff --git a/gamemanager.s b/gamemanager.s index 6752d41..c9038f5 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -235,6 +235,8 @@ endTurn: sta currentPlayer endTurnRefresh: + jsr processTurnForProjectiles + ldy currentPlayer beq endTurnFocusPlayer0 diff --git a/gscats.2mg b/gscats.2mg index 392534c33485848af95d7a2ae111889da46da19e..c51ba4008c8bfeb293516c0438aee9904f48f605 100644 GIT binary patch delta 2081 zcmZuye@qj16#w28YALOrW9XG1+gBNbWzJQzL>NItMgVmaqa=>)k0$D*CVc6oC)EDa zb4z35b}q(*(g=!kjFxeeiCAu|nYt`nv#Ai{j1WX(5Eu~8s4?!J?tR-DtFF!K_uaeq z`+eTG7o@cpq_ur3QjM#YB6J5CI`UT?dpk9E&9ld)EGn$n`a$K!@{cxGuCZDXLi)eZ zdi0YEfpW}>GRF?2<|drb$1gflL!GJ2m6Q1sq(ROW)ssd!LsU;0c{_*XOi|5CmzRrb ze!6TC@p>_Itc%HIm^t5%-!Vrr$H>18w(8OP60ai|Ez2$nnl>!V`F3TAZp4+b_1b5>Cqq+S$1iC?bCw;%?u&4LNYj}_a?rfK=H1+BC z<9s5AOIFH&8(<)6oB;{AiA&-PNN&U=z?^NOuBJ&1@Y7TX!A5e~Y|jL-Ayi!-`~&$1 z96`zCFBV|t{u04oD!5}vQ8x>b6x6pA0c`f07N70mpOR0%Qvm(1u-!-*L7&aBb$idjZPLM9~zyszfe;zOm8EP47 zjql=XY-Vots9GcR1RvFT^@sUAdaoXz-;U?&U^Ec2dt@KOg#Lb=<=CTzobT=mmV@&Z z9nv9F?0c^1N>huY)p2wM@2MXB2BG6^#>6K8$yw88ZtKwSKb_HNe4TKvcmayED;c7{ z-=SoRv;)w`3cw!waCFl@-_LfjRAakjG|u&bH8~5Ak^HoPQ}a;6Dq7 z80*vwO)}W;;2Wplas)&HTJgbVi36Ee-}V$|k{M=n~Z3bC}KvCiJUQ z)62)3p=#TEF9+;*a0VJqE0AVlj`=nU;8Fb9Ho8ff!I01O23zRSx4bw$PPfJ0k`yS( zn%<8V7?IT&IfJY#!y%`HBWI!(f@Ude4{1NkE4og}xTGT+q@e#>)kGO3DIS)?kZwfi~h976Rdd^r9#I5X_p=QIHO| zGm-BQTPH%#Ego+-Ag?}gfp`sSS9VO#cYRDWNs_`=re7X(4X3&5gXu8?WzeO)#W&cIu{sbm pB571R*v3mQ$Cv%5 zr%PjEJog7lOSLF|FgWCfF3ZS;kuZ}vtH>H=3}J*IbFLC}XLK=|EZy^7>x5<3Joi5L zywCG{pU=0$@`hn~!^KxK?arkL{f2BEMb5UhnR)A9d@f~C$-BGXE8kMK>;3Zef`AaR zj-Yo?ZYu(1(~2@}2Q%~1AoTN#&dh<%OlI_S(Ilx=MkW2UUAZFZXY5>^3n^D6y}+Sd zlk_5oG9uxJ(m-1mlgBWL@TISq<2mExS*^EX!m}~xQg{x|uR2F%arz z^0qLu1K-|b_OEarBSEW*5FTXIzHmV%yCaa%jNf$OBTI0`5L>nhY7T&oyI!^GRY;A%VPCV9(&o^Sg z-_?wFHffW@utp~dZf((~DOe%VZV_X*1wXCVMgXN!K$WHSeKSPo#U1nsy7hcf;IssZ zRUxCG%UyaegnlG~TdhLMC;_>#xXaDeh0u*z;<7|XiC3E%*l1;~%L94J6zQ8HhAX9u z?`Fff(Obj|TJpo_6p?S!5J!j?Z(D+Y&IV_d1hEGRS9cOAvjnoCCX;XqK9x;FIFt=h zP>XRAogiL-?#16bVFBc5JT18UTrjo>4!Q{rgs$fumC(%XH?xhfSJugiRQSA7kE?#qrL zWV{WVJjGy8q*%m86TV(OolI6}{S8JI2)|rCe7hFa8q1DG)`j5|xA5x^|Mi}Ft#@GuFK zAB0W^XN{Njb>ScK*_?q#`K-$l*nsTFV*X&_;Gw+J{9S6e-q7MpN$I;{;w(ZZ=OruT z6S5N1kgnOzWHL2MI4%t*lSYkpMT&%c+Es~$3<)b1kIfKmibP68!$xzkMwID5MFML? z(53kYA3@*baz$-aimVhpJ?3dWdZ%P$`IWtm7$G^sk82t!M4?F20#RurrWrMbG1sn1 z_THh3-k=TSK`TD|F_bGMl=sgQLIJ@%{6+!$Qs8o<8OK~25Rxmj(87MCW09*%CZXCe zQ!yleI-j_MyjXvifa7%RAYNf>tbuivfzf<5%5w*EMd%$J3+QJh z!{t{tH9>&X2Rzv%Kk>_tA-IJ($DcJV^c0+|rtVh#Z~uYu9Q2GW)r9fa6Voh;-v@o3 zPw8{OoU00NEo9w+S6b+?k8zo~&Z!|ES3d*y9{z4Gv>g7sNk))%XtRD$0hfYW`j`b&9+|VgWUQRa_(TyzmPby{QsiCNZ zJNFEomkg^i(hRu{uPLJLNQtFxh?H9guv8<_LYyS!cM!50>%{!?gL;U4r9v$+Q@ zw6s&J9y2o!(>;2eZ}q4w;_z#1AK#julc?nPn3DfoYB%`Sc$VLzI!t|yZ#7nPwROl| w(WBZCAZYx+uf=Q))8@6EIK#uOsCC(530SjO#{r~^~ diff --git a/projectile.s b/projectile.s index 97376ca..6243eea 100644 --- a/projectile.s +++ b/projectile.s @@ -25,8 +25,9 @@ projectileData: .word 0 ; Owner (player index) .word 0 ; Facing (0,1) = (+X,-X) .word 0 ; Scratch space for subclasses + .word 0 ; Age (in turns) - .repeat 104 + .repeat 102 .byte 0 ; Padding to 256-byte boundary .endrepeat @@ -49,8 +50,9 @@ projectileData: .word 0 ; Owner (player index) .word 0 ; Facing (0,1) = (+X,-X) .word 0 ; Scratch space for subclasses + .word 0 ; Age (in turns) - .repeat 104 + .repeat 102 .byte 0 ; Padding to 256-byte boundary .endrepeat @@ -73,8 +75,9 @@ projectileData: .word 0 ; Owner (player index) .word 0 ; Facing (0,1) = (+X,-X) .word 0 ; Scratch space for subclasses + .word 0 ; Age (in turns) - .repeat 104 + .repeat 102 .byte 0 ; Padding to 256-byte boundary .endrepeat @@ -98,8 +101,11 @@ projectileTypes: .addr 0 ; Deploy .addr 0 ; Update .addr 0 ; Render + .addr 0 ; Cleanup - ;.word ; Padding to 16-byte boundary (none needed) + .repeat 14 + .byte 0 ; Padding to 32-byte boundary + .endrepeat ; Bomb .word 50 ; Damage @@ -110,8 +116,11 @@ projectileTypes: .addr 0 ; Deploy .addr 0 ; Update .addr 0 ; Render + .addr 0 ; Cleanup - ;.word ; Padding to 16-byte boundary (none needed) + .repeat 14 + .byte 0 ; Padding to 32-byte boundary + .endrepeat ; Fan .word 3 ; Damage @@ -122,8 +131,11 @@ projectileTypes: .addr deployFan ; Deploy .addr updateFan ; Update .addr renderFan ; Render + .addr deleteFan ; Cleanup - ;.word ; Padding to 16-byte boundary (none needed) + .repeat 14 + .byte 0 ; Padding to 32-byte boundary + .endrepeat PT_DAMAGE = 0 ; Byte offsets into projectile type data structure @@ -134,6 +146,7 @@ PT_FRAME2 = 8 PT_DEPLOY = 10 PT_UPDATE = 12 PT_RENDER = 14 +PT_CLEANUP = 16 .macro PROJECTILEPTR_Y tya ; Pointer to projectile structure from index @@ -154,6 +167,7 @@ PT_RENDER = 14 asl asl asl + asl tay .endmacro @@ -163,6 +177,7 @@ PT_RENDER = 14 asl asl asl + asl tax .endmacro @@ -217,6 +232,7 @@ fireProjectile: sta projectileData+GO_POSY,y lda #0 sta projectileData+JD_STATIC,y + sta projectileData+JD_AGE,y sty projectileActive lda currentPlayer sta projectileData+JD_OWNER,y @@ -427,7 +443,7 @@ updateProjectilePhysicsDone: rts updateProjectilePhysicsDelete: - jsr endDeleteProjectile + jsr endDeleteCurrProjectile bra updateProjectilePhysicsDone updateProjectilePhysicsNormalUpdate: @@ -517,21 +533,46 @@ updateProjectileCollisionsDone: updateProjectileCollisionsPlayerHit: jsr processPlayerImpact - jsr endDeleteProjectile + jsr endDeleteCurrProjectile bra updateProjectileCollisionsDone updateProjectileCollisionsTerrainHit: jsr processTerrainImpact - jsr endDeleteProjectile + jsr endDeleteCurrProjectile bra updateProjectileCollisionsDone ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; endDeleteProjectile +; processTurnForProjectiles +; +; +processTurnForProjectiles: + SAVE_AXY + ldx #0 + +processTurnForProjectilesLoop: + txy + PROJECTILEPTR_Y + + lda projectileData+JD_AGE,y + inc + sta projectileData+JD_AGE,y + +processTurnForProjectilesSkip: + inx + cpx #MAXPROJECTILES + bne processTurnForProjectilesLoop + + RESTORE_AXY + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; endDeleteCurrProjectile ; ; Trashes A and Y ; -endDeleteProjectile: +endDeleteCurrProjectile: lda #projectileData clc adc projectileActive @@ -541,6 +582,24 @@ endDeleteProjectile: jsr deleteProjectile bra endProjectile + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; deleteVisibleProjectile +; +; Y = Projectile offset +; Trashes A +; +deleteVisibleProjectile: + lda #projectileData + sta PARAML0 + tya + clc + adc PARAML0 + sta PARAML0 + jsr unrenderGameObject + bra deleteProjectile + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; endProjectile ; @@ -563,6 +622,17 @@ endProjectile: deleteProjectile: lda #-1 sta projectileData+GO_POSX,y + + ; Check for special cleanup code + lda projectileData+JD_TYPE,y + tax ; Find projectile type data + PROJECTILETYPEPTR_X + + lda projectileTypes+PT_CLEANUP,x + beq deleteProjectileDone + JSRA + +deleteProjectileDone: rts