From 00b9575bcb35764eeb414bc1b1e79858f0a6a5f0 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sun, 17 Jul 2022 12:42:54 +0200 Subject: [PATCH] Besto of the best laser And code ordering. --- grafproc.asm | 251 +++++++++++++++++++++++++++++++++++++++++++++ scorch.xex | Bin 41209 -> 41225 bytes variables.asm | 1 + weapons.asm | 276 +++----------------------------------------------- 4 files changed, 267 insertions(+), 261 deletions(-) diff --git a/grafproc.asm b/grafproc.asm index 3c1bbbd..79e977e 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -890,6 +890,257 @@ ShieldVisible bne @- rts .endp +;-------------------------------------------------- +.proc DrawTankParachute +;Tank number in X +;-------------------------------------------------- + lda #$34 ; parachute symbol + sta CharCode + lda Ytankstable,x + sec + sbc #8 + sta ydraw + lda XtanksTableL,x + sta xdraw + lda XtanksTableH,x + sta xdraw+1 + jsr TypeChar + rts +.endp + +;-------------------------------------------------- +.proc TankFalls; +;-------------------------------------------------- + lda #0 + sta PreviousFall ; bit 7 - left, bit 6 - right + sta EndOfTheFallFlag + sta Parachute + mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop + + ; let's check if the given tank has got the parachute + ldx TankNr + lda ActiveDefenceWeapon,x + cmp #ind_Parachute______ ; parachute + beq ParachuteActive + cmp #ind_StrongParachute ; strong parachute + beq ParachuteActive + cmp #ind_Force_Shield___ ; shield witch energy and parachute + bne TankFallsX +ParachuteActive + inc Parachute +TankFallsX + ; sound only if really falls + lda Parachute + and FallingSoundBit ; bit 1 + beq NoFallingSound + mva #0 FallingSoundBit + mva #sfx_shield_off sfx_effect +NoFallingSound + ; clear previous position + mva #1 Erase + jsr DrawTankNr + ; and the parachute (if present) + lda Parachute + and #01 + beq DoNotClearParachute + ; here we clear the parachute + ldx TankNr + jsr DrawTankParachute +DoNotClearParachute + mva #0 Erase + ldx TankNr + lda EndOfTheFallFlag ; We only get byte below the tank if still falling + bne NoGroundCheck + ; coordinates of the first pixel under the tank + ldx TankNr + lda XtankstableL,x + sta xdraw + lda XtankstableH,x + sta xdraw+1 + lda Ytankstable,x + clc + adc #1 ; in this point the comment helped us! For the very first + ; time in our lives! Tada! It opens a new chapter!!! + sta ydraw + ; +; UnderTank1 ; byte under tank +; UnderTank2 ; byte under tank reversed (for simple check right direction) + lda #08 + sta temp ; Loop Counter +ByteBelowTank + jsr point + beq EmptyPoint2 + sec + ror UnderTank2 + sec + bcs ROLPoint2 +EmptyPoint2 + clc + ror UnderTank2 + clc +ROLPoint2 + rol UnderTank1 + inw xdraw + dec temp + bne ByteBelowTank +NoGroundCheck + ldx TankNr + lda UnderTank1 + bne NoFallingDown + ; Tank falling down ---- + lda Parachute + and #1 + bne ParachutePresent + ; decreasing energy + ldy #2 ; how much energy to substract + jsr DecreaseEnergyX +ParachutePresent + ; check parachute type + lda ActiveDefenceWeapon,x + cmp #ind_StrongParachute ; strong parachute + bne OneTimeParachute + ; decreasing energy of parachute + ldy #2 ; how much energy to substract + jsr DecreaseShieldEnergyX + cpy #0 ; is necessary to reduce tenk energy ? + beq @+ + jsr DecreaseEnergyX +@ + ; check energy of parachute + lda ShieldEnergy,x + bne OneTimeParachute + mva #0 Parachute + mva #0 ActiveDefenceWeapon,x ; deactivate defence +OneTimeParachute + lda Parachute + ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) + sta Parachute + ; tank is falling down - modify coorinates + lda Ytankstable,x + clc + adc #1 + sta Ytankstable,x + jmp EndOfFCycle +NoFallingDown + ; check direction (left or right) + ldy #7 ; SlideLeftTable length -1 (from 0 to 7) +@ lda SlideLeftTable,y + cmp UnderTank1 + beq FallingRight + cmp UnderTank2 + beq FallingLeft + dey + bpl @- + bmi NoLeftOrRight +FallingLeft + ; tank is falling left + bit PreviousFall ; bit 6 - right + bvs EndLeftFall + ; we finish falling left if the tank reached the edge of the screen + lda XtanksTableL,x + bne NotLeftEdge + lda XtanksTableH,x + beq EndLeftFall +NotLeftEdge + ; tank is falling left - modify coorinates + clc + lda XtankstableL,x + adc #1 + sta XtankstableL,x + lda XtankstableH,x + adc #0 + sta XtankstableH,x + mva #%10000000 PreviousFall ; set bit 7 - left + bne EndOfFCycle +FallingRight + ; tank is falling right + bit PreviousFall ; bit 7 - left + bmi EndRightFall + ; we finish falling right if the tank reached the edge of the screen + clc + lda XtanksTableL,x + adc #$08 ; we'll check right side of the char + sta temp + lda XtanksTableH,x + adc #0 + sta temp+1 + cpw temp #screenwidth + beq EndRightFall + ; tank is falling right - modify coorinates + sec + lda XtankstableL,x + sbc #1 + sta XtankstableL,x + lda XtankstableH,x + sbc #0 + sta XtankstableH,x + mva #%01000000 PreviousFall ; set bit 6 - right + bne EndOfFCycle +EndLeftFall +EndRightFall +NoLeftOrRight + inc EndOfTheFallFlag ; after this is shouldn't fall +EndOfFCycle + ; draw tank on new position + jsr DrawTankNr ; ew have TankNr in X (I hope :) ) + ; checking is parachute present and if so, draw it + lda Parachute + cmp #3 ; parachute and falling + bne DoNotDrawParachute + ; here we draw parachute + ldx TankNr + jsr DrawTankParachute + wait ; onli if tank with patachute +RapidFalling +DoNotDrawParachute + lda EndOfTheFallFlag + jeq TankFallsX + ; Tank falling down already finished, but it is not sure that + ; the horizontal coordinate is even. + ; If it is odd then it must be corrected because otherwise + ; P/M graphics background would not look OK + ldx TankNr + lda XtanksTableL,x + and #$01 + beq EndOfFall ; if it is even then it is the end + ; and if not, we push it one pixel the way it was falling before + lda #%10000000 ; set "virtual ground" for right falling + ldy #%00000001 + bit PreviousFall + bmi ForceFallLeft + tay ; tricky - replaces ldy #%10000000 + lda #%00000001 ; set "virtual ground" for left falling +ForceFallLeft + sta UnderTank1 + sty UnderTank2 + jne TankFallsX +EndOfFall + mva #1 Erase + ldx TankNr + ; if tank was falling down having parachute, + ; we must deduct one parachute + lda Parachute + cmp #$03 ; was falling down and the parachute + bne NoParachuteWeapon + ; first we check type of parachute + lda ActiveDefenceWeapon,x + cmp #ind_Parachute______ ; deactivate weapon only if parachute (54) + bne NoParachuteWeapon + mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) +NoParachuteWeapon + ; now we clear parachute on the screen if present + lda Parachute + and #01 + beq ThereWasNoParachute + jsr DrawTankParachute +ThereWasNoParachute + mva #0 Erase + ldx TankNr + jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) + mva #sfx_silencer sfx_effect + rts + +.endp ;-------------------------------------------------- .proc ClearPMmemory diff --git a/scorch.xex b/scorch.xex index ea9d615f9294bd023a270df66c17dfffb36acf13..692842a935189bdbc8e5f035f89d9043102f6a5f 100644 GIT binary patch delta 14224 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 Dc#LIj delta 14181 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 DT`D1} diff --git a/variables.asm b/variables.asm index 6d5ba36..8e89e01 100644 --- a/variables.asm +++ b/variables.asm @@ -197,6 +197,7 @@ vx03 .DS [5] MirvDown .DS [5] ; is given missile down? MirvMissileCounter .DS 1 ; missile Counter (mainly for X) SmokeTracerFlag .DS 1 ; if Smoketracer +LaserFlag .DS 1 ; $ff if Laser XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen) YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) ;---------------------------------------------------- diff --git a/weapons.asm b/weapons.asm index af57fbe..ea44c7b 100644 --- a/weapons.asm +++ b/weapons.asm @@ -655,7 +655,8 @@ DiggerCharacter .endp ; ------------------------ .proc laser -; but where are xdraw and ydraw ???? !!!! +; in xdraw and ydraw we have hit point coordinates +; from Shoot/Flight procedures (invisible flight) ; ------------------------ ldx TankNr lda AngleTable,x @@ -1464,16 +1465,17 @@ RandomizeOffensiveText mva #1 plot4x4color jsr DisplayOffensiveTextNr - + mva #0 LaserFlag ; $ff - Laser ldx TankNr lda ActiveWeapon,x cmp #ind_Laser__________ ; laser bne NotStrongShoot - ; Laser: very strong - invisible - shot for laser beam end coordinates + ; Laser: (not)very strong - invisible - shot for laser beam end coordinates mva #0 color - lda #7 + lda #1 sta Force sta Force+1 + mva #$ff LaserFlag ; $ff - Laser bne AfterStrongShoot NotStrongShoot lda ForceTableL,x @@ -1528,257 +1530,6 @@ ShotUnderGround rts .endp -;-------------------------------------------------- -.proc TankFalls; -;-------------------------------------------------- - lda #0 - sta PreviousFall ; bit 7 - left, bit 6 - right - sta EndOfTheFallFlag - sta Parachute - mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop - - ; let's check if the given tank has got the parachute - ldx TankNr - lda ActiveDefenceWeapon,x - cmp #ind_Parachute______ ; parachute - beq ParachuteActive - cmp #ind_StrongParachute ; strong parachute - beq ParachuteActive - cmp #ind_Force_Shield___ ; shield witch energy and parachute - bne TankFallsX -ParachuteActive - inc Parachute -TankFallsX - ; sound only if really falls - lda Parachute - and FallingSoundBit ; bit 1 - beq NoFallingSound - mva #0 FallingSoundBit - mva #sfx_shield_off sfx_effect -NoFallingSound - ; clear previous position - mva #1 Erase - jsr DrawTankNr - ; and the parachute (if present) - lda Parachute - and #01 - beq DoNotClearParachute - ; here we clear the parachute - ldx TankNr - jsr DrawTankParachute -DoNotClearParachute - mva #0 Erase - ldx TankNr - lda EndOfTheFallFlag ; We only get byte below the tank if still falling - bne NoGroundCheck - ; coordinates of the first pixel under the tank - ldx TankNr - lda XtankstableL,x - sta xdraw - lda XtankstableH,x - sta xdraw+1 - lda Ytankstable,x - clc - adc #1 ; in this point the comment helped us! For the very first - ; time in our lives! Tada! It opens a new chapter!!! - sta ydraw - ; -; UnderTank1 ; byte under tank -; UnderTank2 ; byte under tank reversed (for simple check right direction) - lda #08 - sta temp ; Loop Counter -ByteBelowTank - jsr point - beq EmptyPoint2 - sec - ror UnderTank2 - sec - bcs ROLPoint2 -EmptyPoint2 - clc - ror UnderTank2 - clc -ROLPoint2 - rol UnderTank1 - inw xdraw - dec temp - bne ByteBelowTank -NoGroundCheck - ldx TankNr - lda UnderTank1 - bne NoFallingDown - ; Tank falling down ---- - lda Parachute - and #1 - bne ParachutePresent - ; decreasing energy - ldy #2 ; how much energy to substract - jsr DecreaseEnergyX -ParachutePresent - ; check parachute type - lda ActiveDefenceWeapon,x - cmp #ind_StrongParachute ; strong parachute - bne OneTimeParachute - ; decreasing energy of parachute - ldy #2 ; how much energy to substract - jsr DecreaseShieldEnergyX - cpy #0 ; is necessary to reduce tenk energy ? - beq @+ - jsr DecreaseEnergyX -@ - ; check energy of parachute - lda ShieldEnergy,x - bne OneTimeParachute - mva #0 Parachute - mva #0 ActiveDefenceWeapon,x ; deactivate defence -OneTimeParachute - lda Parachute - ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) - sta Parachute - ; tank is falling down - modify coorinates - lda Ytankstable,x - clc - adc #1 - sta Ytankstable,x - jmp EndOfFCycle -NoFallingDown - ; check direction (left or right) - ldy #7 ; SlideLeftTable length -1 (from 0 to 7) -@ lda SlideLeftTable,y - cmp UnderTank1 - beq FallingRight - cmp UnderTank2 - beq FallingLeft - dey - bpl @- - bmi NoLeftOrRight -FallingLeft - ; tank is falling left - bit PreviousFall ; bit 6 - right - bvs EndLeftFall - ; we finish falling left if the tank reached the edge of the screen - lda XtanksTableL,x - bne NotLeftEdge - lda XtanksTableH,x - beq EndLeftFall -NotLeftEdge - ; tank is falling left - modify coorinates - clc - lda XtankstableL,x - adc #1 - sta XtankstableL,x - lda XtankstableH,x - adc #0 - sta XtankstableH,x - mva #%10000000 PreviousFall ; set bit 7 - left - bne EndOfFCycle -FallingRight - ; tank is falling right - bit PreviousFall ; bit 7 - left - bmi EndRightFall - ; we finish falling right if the tank reached the edge of the screen - clc - lda XtanksTableL,x - adc #$08 ; we'll check right side of the char - sta temp - lda XtanksTableH,x - adc #0 - sta temp+1 - cpw temp #screenwidth - beq EndRightFall - ; tank is falling right - modify coorinates - sec - lda XtankstableL,x - sbc #1 - sta XtankstableL,x - lda XtankstableH,x - sbc #0 - sta XtankstableH,x - mva #%01000000 PreviousFall ; set bit 6 - right - bne EndOfFCycle -EndLeftFall -EndRightFall -NoLeftOrRight - inc EndOfTheFallFlag ; after this is shouldn't fall -EndOfFCycle - ; draw tank on new position - jsr DrawTankNr ; ew have TankNr in X (I hope :) ) - ; checking is parachute present and if so, draw it - lda Parachute - cmp #3 ; parachute and falling - bne DoNotDrawParachute - ; here we draw parachute - ldx TankNr - jsr DrawTankParachute - wait ; onli if tank with patachute -RapidFalling -DoNotDrawParachute - lda EndOfTheFallFlag - jeq TankFallsX - ; Tank falling down already finished, but it is not sure that - ; the horizontal coordinate is even. - ; If it is odd then it must be corrected because otherwise - ; P/M graphics background would not look OK - ldx TankNr - lda XtanksTableL,x - and #$01 - beq EndOfFall ; if it is even then it is the end - ; and if not, we push it one pixel the way it was falling before - lda #%10000000 ; set "virtual ground" for right falling - ldy #%00000001 - bit PreviousFall - bmi ForceFallLeft - tay ; tricky - replaces ldy #%10000000 - lda #%00000001 ; set "virtual ground" for left falling -ForceFallLeft - sta UnderTank1 - sty UnderTank2 - jne TankFallsX -EndOfFall - mva #1 Erase - ldx TankNr - ; if tank was falling down having parachute, - ; we must deduct one parachute - lda Parachute - cmp #$03 ; was falling down and the parachute - bne NoParachuteWeapon - ; first we check type of parachute - lda ActiveDefenceWeapon,x - cmp #ind_Parachute______ ; deactivate weapon only if parachute (54) - bne NoParachuteWeapon - mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) -NoParachuteWeapon - ; now we clear parachute on the screen if present - lda Parachute - and #01 - beq ThereWasNoParachute - jsr DrawTankParachute -ThereWasNoParachute - mva #0 Erase - ldx TankNr - jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) - mva #sfx_silencer sfx_effect - rts - -.endp - -;-------------------------------------------------- -.proc DrawTankParachute -;Tank number in X -;-------------------------------------------------- - lda #$34 ; parachute symbol - sta CharCode - lda Ytankstable,x - sec - sbc #8 - sta ydraw - lda XtanksTableL,x - sta xdraw - lda XtanksTableH,x - sta xdraw+1 - jsr TypeChar - rts -.endp ;-------------------------------------------------- .proc Flight ; Force(byte.byte), Wind(0.word) ; Angle(byte) 128=0, 255=maxright, 0=maxleft @@ -1802,7 +1553,7 @@ ThereWasNoParachute ldy #0 ldx TankNr lda ActiveWeapon,x - cmp #11 ; Smoke tracer + cmp #ind_Smoke_Tracer___ ; Smoke tracer bne noSmokeTracer iny noSmokeTracer @@ -1961,6 +1712,8 @@ Loopi sbc vy+3 sta ytraj+2 + bit LaserFlag ; no gravity if Laser + bmi NoGravity ;vy=vy-g (again without least significant byte of vy) sec lda vy+1 @@ -1979,9 +1732,9 @@ Loopi lda ActiveWeapon,x cmp #ind_MIRV___________ ; MIRV jeq MIRVdownLoop +NoGravity StillUp - clc ;xtraj=xtraj+vx (skipping least significant byte of vx) lda xtraj ;here of course Fight to right adc vx+1 @@ -1993,12 +1746,15 @@ StillUp adc vx+3 sta xtraj+2 + bit LaserFlag ; no wind if Laser + bmi NoWind clc .rept 4 lda vx+# adc Wind+# sta vx+# .endr +NoWind mwa xtrajold+1 xdraw mwa ytrajold+1 ydraw mwa xtraj+1 xbyte @@ -2019,10 +1775,8 @@ nowait lda HitFlag bne Hit ; --- only for Laser - ldx TankNr - lda ActiveWeapon,x - cmp #ind_Laser__________ ; Laser - bne NoCheckEdgesForLaser + bit LaserFlag + bpl NoCheckEdgesForLaser ; If laser fires, edges of the screen finish "flying" and laser hits. lda ytraj+2 bmi LaserHitEdge