diff --git a/constants.asm b/constants.asm index 99c6f47..4881c3b 100644 --- a/constants.asm +++ b/constants.asm @@ -871,9 +871,9 @@ NamesOfWeapons ;the comment is an index in the tables dta d"Parachute " ; 53 dta d"Battery " ; 54 dta d"Mag Deflector " ; 55 - dta d"Shield " ; 56 + dta d"Shield " ; 56 - shield for one shot dta d"Force Shield " ; 57 - dta d"Heavy Shield " ; 58 + dta d"Heavy Shield " ; 58 - shield with energy dta d"Super Mag " ; 59 dta d"Auto Defense " ; 60 dta d"Fuel Tank " ; 61 diff --git a/display.asm b/display.asm index 005a8fd..17371d4 100644 --- a/display.asm +++ b/display.asm @@ -166,7 +166,7 @@ NamesOfLevels textbuffer ; 0123456789012345678901234567890123456789 dta d"Player: " - dta d"Energy: Angle: Force: " + dta d"Energy: Angle: Force: " dta d" Round: Wind: " textbuffer2 dta d"Player: Cash: " diff --git a/grafproc.asm b/grafproc.asm index 55769d1..5bd871b 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -642,6 +642,7 @@ DrawTankNrX sta xdraw+1 lda ytankstable,x sta ydraw + mva #0 ydraw+1 jsr TypeChar @@ -694,9 +695,12 @@ NoPlayerMissile ; draw defensive weapons like shield ( tank number in X ) ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char lda ActiveDefenceWeapon,x - cmp #56 ; check shield activation + cmp #56 ; check one shot shield activation + beq ShieldDraw + cmp #58 ; check shield with energy activation bne NoShieldDraw - jsr DrawTankShield +ShieldDraw + jsr DrawTankShield.DrawInPosition NoShieldDraw DoNotDrawTankNr rts @@ -726,11 +730,21 @@ tankflash_loop ;-------------------------------------------------- .proc DrawTankShield +; X - tank number +; if use DrawInPosition entry point then: ; xdraw, ydraw - coordinates left LOWER corner of Tank char ; values remain there after a DrawTankNr proc. +; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- - + lda xtankstableL,x + sta xdraw + lda xtankstableH,x + sta xdraw+1 + lda ytankstable,x + sta ydraw + mva #0 ydraw+1 +DrawInPosition mva #1 color lda erase beq ShieldVisible diff --git a/scorch.asm b/scorch.asm index db74289..86b45a2 100644 --- a/scorch.asm +++ b/scorch.asm @@ -129,12 +129,12 @@ START jsr RandomizeSequence ; for the round #1 shooting sequence is random - ; activate shield for all players (test) - lda #56 + ; activate shield with energy for all players (test) ldx numberOfPlayers dex @ - sta ActiveDefenceWeapon,x + mva #58 ActiveDefenceWeapon,x + mva #99 ShieldEnergy,x ; set energy of shield dex bpl @- ; shield activated! (test) @@ -658,7 +658,7 @@ MetodOfDeath ;-------------------------------------------------- .proc DecreaseEnergyX -;Decreases energy of player nr X +;Decreases energy of player nr X by the value Y ;increases his financial loss ;increases gain of tank TankNr ;-------------------------------------------------- @@ -696,6 +696,33 @@ NotNegativeEnergy rts .endp +;-------------------------------------------------- +.proc DecreaseShieldEnergyX +; Decreases energy of shield player nr X by the value Y +; if shield energy is 0 after decrease then in Y we have +; rest of the energy - to decrease tank energy +;-------------------------------------------------- + sty EnergyDecrease + ldy #0 ; if Shield survive then no decrease tank anergy + ; Energy cannot be less than 0 + lda ShieldEnergy,x + cmp EnergyDecrease + bcc ldahashzero + ;sec + sbc EnergyDecrease + bpl NotNegativeEnergy +ldahashzero + ; now calculate rest of energy for future tank energy decrease + sec + lda EnergyDecrease + sbc ShieldEnergy,x + tay + lda #0 +NotNegativeEnergy + sta ShieldEnergy,x + rts +.endp + ;--------------------------------- .proc Seppuku lda #0 diff --git a/scorch.xex b/scorch.xex index 59e29f7..8ff3476 100644 Binary files a/scorch.xex and b/scorch.xex differ diff --git a/textproc.asm b/textproc.asm index f48bd10..cb64706 100644 --- a/textproc.asm +++ b/textproc.asm @@ -1709,6 +1709,28 @@ FinishResultDisplay mwa #textbuffer+48 displayposition jsr displaybyte + ;--------------------- + ;displaying the energy of a tank shield (if exist) + ;--------------------- + ; clear (if no shield) + lda #$00 ; space + sta textbuffer+40+10 + sta textbuffer+40+11 + sta textbuffer+40+12 + sta textbuffer+40+13 + ; check shield energy and display it + ldx TankNr + lda ShieldEnergy,x + beq NoShieldEnergy + sta decimal ; displayed value + lda #$08 ; ( + sta textbuffer+40+10 + mwa #textbuffer+40+11 displayposition + jsr displaybyte + lda #$09 ; ) + sta textbuffer+40+13 +NoShieldEnergy + ;========================= ;display Force ;========================= @@ -1717,7 +1739,7 @@ FinishResultDisplay sta decimal lda ForceTableH,x sta decimal+1 - mwa #textbuffer+40+34 displayposition + mwa #textbuffer+40+36 displayposition jsr displaydec ;========================= @@ -1729,9 +1751,9 @@ FinishResultDisplay lda AngleTable,x bmi AngleToLeft lda #$7f ; (tab) character - sta textbuffer+40+23 + sta textbuffer+40+25 lda #0 ;space - sta textbuffer+40+20 + sta textbuffer+40+22 lda #90 sec sbc AngleTable,x @@ -1748,12 +1770,12 @@ AngleToLeft lda BarrelTableL,y sta CharCode lda #$7e ;(del) char - sta textbuffer+40+20 + sta textbuffer+40+22 lda #0 ;space - sta textbuffer+40+23 + sta textbuffer+40+25 AngleDisplay - mwa #textbuffer+40+21 displayposition + mwa #textbuffer+40+23 displayposition jsr displaybyte ;========================= diff --git a/variables.asm b/variables.asm index 6f535a9..bafa6ce 100644 --- a/variables.asm +++ b/variables.asm @@ -66,6 +66,8 @@ looseL ;---------------------------------------------------- Energy .DS [MaxPlayers] +ShieldEnergy + .DS [MaxPlayers] EnergyDecrease .DS 1 eXistenZ .DS [MaxPlayers] diff --git a/weapons.asm b/weapons.asm index 46084c6..cde7e13 100644 --- a/weapons.asm +++ b/weapons.asm @@ -667,11 +667,26 @@ DistanceCheckLoop tay ; check shields lda ActiveDefenceWeapon,x - cmp #56 ; shield + cmp #56 ; one hit shield beq UseShield + cmp #58 ; shield with energy + beq UseShieldWithEnergy jsr DecreaseEnergyX jmp EndOfDistanceCheckLoop +UseShieldWithEnergy + jsr DecreaseShieldEnergyX + cpy #0 ; is necessary to reduce tenk energy ? + beq ShieldCoveredTank + jsr DecreaseEnergyX +ShieldCoveredTank + lda ShieldEnergy,x + jne EndOfDistanceCheckLoop +ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) UseShield + mva #1 Erase + phx + jsr DrawTankShield + plx mva #0 ActiveDefenceWeapon,x ; deactivate defense weapons TankIsNotWithinTheRange EndOfDistanceCheckLoop