diff --git a/constants.asm b/constants.asm index 8b12e22..192eb5e 100644 --- a/constants.asm +++ b/constants.asm @@ -227,62 +227,62 @@ BarrelTable .by $04,$04,$04,$02,$02,$02,$02,$02,$02,$02, .by $02, -EndOfTheBarrelX - ; right angles from 0 (horizontally right) to 90 (up) - - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,6,6,6,6,6,6,6,6,6, - .by 5,5,5,5,5,5,5,5,5,5, - .by 4,4,4,4,4,4,4,4,4,4, - ;.by 4, - - ; left angles from 90 (vertical) to 180 (horizontally left) - .by 3,3,3,3,3,3,3,3,3,3, - .by 3,2,2,2,2,2,2,2,2,2, - .by 2,1,1,1,1,1,1,1,1,1, - .by 0,0,0,0,0,0,0,0,0,0, - .by 0,0,0,0,0,0,0,0,0,0, - .by 0,0,0,0,0,0,0,0,0,0, - .by 0,0,0,0,0,0,0,0,0,0, - .by 0,0,0,0,0,0,0,0,0,0, - .by 0,0,0,0,0,0,0,0,0,0, - .by 0 - -EndOfTheBarrelY -; right angles from 0 (horizontally right) to 90 (up) - - ; one pixel Up for fix problems with colision check - ;.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 - .by 4,4,4,4,4,4,4,4,4,4, - .by 4,4,4,4,4,4,4,4,4,4, - .by 4,4,4,4,4,4,4,5,5,5, - .by 5,5,5,5,5,5,5,6,6,6, - .by 6,6,6,6,6,6,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - ;.by 7, - -; left angles from 90 (vertical) to 180 (horizontally left) - - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,7,7,7,7,7, - .by 7,7,7,7,7,6,6,6,6,6, - .by 6,6,6,6,5,5,5,5,5,5, - .by 5,5,5,5,4,4,4,4,4,4, - .by 4,4,4,4,4,4,4,4,4,4, - .by 4,4,4,4,4,4,4,4,4,4, - .by 4, - ; one pixel Up for fix problems with colision check - ;.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 +;EndOfTheBarrelX +; ; right angles from 0 (horizontally right) to 90 (up) +; +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,6,6,6,6,6,6,6,6,6, +; .by 5,5,5,5,5,5,5,5,5,5, +; .by 4,4,4,4,4,4,4,4,4,4, +; ;.by 4, +; +; ; left angles from 90 (vertical) to 180 (horizontally left) +; .by 3,3,3,3,3,3,3,3,3,3, +; .by 3,2,2,2,2,2,2,2,2,2, +; .by 2,1,1,1,1,1,1,1,1,1, +; .by 0,0,0,0,0,0,0,0,0,0, +; .by 0,0,0,0,0,0,0,0,0,0, +; .by 0,0,0,0,0,0,0,0,0,0, +; .by 0,0,0,0,0,0,0,0,0,0, +; .by 0,0,0,0,0,0,0,0,0,0, +; .by 0,0,0,0,0,0,0,0,0,0, +; .by 0 +; +;EndOfTheBarrelY +;; right angles from 0 (horizontally right) to 90 (up) +; +; ; one pixel Up for fix problems with colision check +; ;.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 +; .by 4,4,4,4,4,4,4,4,4,4, +; .by 4,4,4,4,4,4,4,4,4,4, +; .by 4,4,4,4,4,4,4,5,5,5, +; .by 5,5,5,5,5,5,5,6,6,6, +; .by 6,6,6,6,6,6,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; ;.by 7, +; +;; left angles from 90 (vertical) to 180 (horizontally left) +; +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,7,7,7,7,7, +; .by 7,7,7,7,7,6,6,6,6,6, +; .by 6,6,6,6,5,5,5,5,5,5, +; .by 5,5,5,5,4,4,4,4,4,4, +; .by 4,4,4,4,4,4,4,4,4,4, +; .by 4,4,4,4,4,4,4,4,4,4, +; .by 4, +; ; one pixel Up for fix problems with colision check +; ;.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3 ;------------------------------------------------- diff --git a/grafproc.asm b/grafproc.asm index 4a7d21b..c21a1bc 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -637,13 +637,7 @@ SkipHidingPM sta CharCode DrawTankNrX ldx tanknr - lda xtankstableL,x - sta xdraw - lda xtankstableH,x - sta xdraw+1 - lda ytankstable,x - sta ydraw - mva #0 ydraw+1 + jsr SetupXYdraw jsr TypeChar @@ -760,12 +754,10 @@ DrawTankFlag sec sbc #8 sta ydraw - lda XtanksTableL,x - sta xdraw - lda XtanksTableH,x - sta xdraw+1 + jsr SetupXYdraw.X jsr TypeChar NoShieldDraw + DrawBarrel DoNotDrawTankNr rts .endp @@ -801,13 +793,7 @@ tankflash_loop ; ; 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 + jsr SetupXYdraw DrawInPosition mva #1 color lda erase @@ -900,10 +886,7 @@ ShieldVisible sec sbc #8 sta ydraw - lda XtanksTableL,x - sta xdraw - lda XtanksTableH,x - sta xdraw+1 + jsr SetupXYdraw.X jsr TypeChar rts .endp @@ -953,10 +936,7 @@ DoNotClearParachute bne NoGroundCheck ; coordinates of the first pixel under the tank ldx TankNr - lda XtankstableL,x - sta xdraw - lda XtankstableH,x - sta xdraw+1 + jsr SetupXYdraw.X lda Ytankstable,x clc adc #1 ; in this point the comment helped us! For the very first @@ -1909,7 +1889,7 @@ EndPut4x4 rts .endp ; ------------------------------------- -.proc _XtanksTableLHX +.proc SetupXYdraw lda ytankstable,x sta ydraw mva #0 ydraw+1 @@ -1921,43 +1901,58 @@ X lda XtanksTableL,x .endp ;-------------------------------------------------- .proc DrawBarrel -; X - tank number -; +; X - tankNr ; changes xdraw, ydraw, fx, fy ;-------------------------------------------------- - jsr _XtanksTableLHX + jsr SetupXYdraw ;vx calculation ;vx = sin(90-Angle) for Angle <=90 ;vx = -sin(Angle-90) for 90 < Angle <= 180 + ; erase previous barrel + ;cos(Angle) (but we use sin table only so some shenanigans happen) - lda AngleTable,x + mva #0 color + lda previousBarrelAngle,x sta Angle - tax + jsr DrawBarrelTech + + mva #1 color + ldx TankNr + jsr SetupXYdraw + lda angleTable,x + sta Angle + jsr DrawBarrelTech + rts +.endp - ;Angle works like this: - ;0 'degrees' is horizontally right - ;90 'degrees' is straight up - ;180 horizontally left - - ; (we have to set goleft used in rolling weapons) - - cpx #91 +.proc DrawBarrelTech + ; angle in Angle and A + + mvx #0 goleft + cmp #91 bcc angleUnder90 ;over 90 sec - txa ; lda # Angle sbc #90 tax - jmp @+ + ; barrel start offset over 90deg + adw xdraw #6 xdraw + sbw ydraw #2 ydraw + mva #1 goleft + bpl @+ ; jmp @+ angleUnder90 - mva #0 goleft sec ; X = 90-Angle lda #90 sbc Angle tax + ; barrel start offset under 90deg + adw xdraw #1 xdraw + sbw ydraw #2 ydraw + + @ lda sintable,x ; cos(X) sta vx @@ -1967,18 +1962,16 @@ angleUnder90 ;vy = sin(180-Angle) for 90 < Angle <= 180 ;-- - ldx Angle - cpx #91 + lda Angle + cmp #91 bcc YangleUnder90 lda #180 sec sbc Angle - tax - YangleUnder90 + tax lda sintable,x - sta vy lda #0 ; all arithmetic to zero @@ -1987,21 +1980,17 @@ YangleUnder90 sta fx sta fy - ; barrel start offset - adw xdraw #4 xdraw - sbw ydraw #4 ydraw - - ; draw by vx vy ; in each step ; 1. plot(xdraw, ydraw) ; 2. add vx and vy to 3 byte variables xdraw.fx, ydraw.fy ; 3 check length, if shorter, go to 1. - mva #5 yc ; barrel length - mva #1 color -@ - jsr plot.MakePlot + mva #20 yc ; barrel length +barrelLoop + + lda goleft + bne @+ clc lda fx adc vx @@ -2012,23 +2001,39 @@ YangleUnder90 lda xdraw+1 adc #0 sta xdraw+1 - - clc + jmp ybarrel +@ + sec + lda fx + sbc vx + sta fx + lda xdraw + sbc #0 + sta xdraw + lda xdraw+1 + sbc #0 + sta xdraw+1 + +ybarrel + sec lda fy - adc vy + sbc vy sta fy lda ydraw - adc #0 + sbc #0 sta ydraw lda ydraw+1 - adc #0 + sbc #0 sta ydraw+1 + jsr plot.MakePlot + dec yc - bne @- + bne barrelLoop + + mwa xdraw EndOfTheBarrelX + mva ydraw EndOfTheBarrelY - - rts .endp diff --git a/scorch.asm b/scorch.asm index cc69038..53afad3 100644 --- a/scorch.asm +++ b/scorch.asm @@ -325,6 +325,13 @@ SettingEnergies sta colpf2s ; status line "off" sta colpf1s + lda #90 ; barrel fully erect + ldx #MaxPlayers-1 +@ sta previousBarrelAngle,x + dex + bpl @- + + jsr drawmountains ;draw them jsr drawtanks ;finally draw tanks @@ -789,12 +796,7 @@ NotNegativeShieldEnergy lda #0 ; turn off defense weapons when hara-kiring sta ActiveDefenceWeapon,x sta ShieldEnergy,x - lda xtankstableL,x - sta xdraw - lda xtankstableH,x - sta xdraw+1 - lda yTanksTable,x - sta ydraw + jsr SetupXYdraw lda #1 ; Missile jsr ExplosionDirect jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku diff --git a/scorch.xex b/scorch.xex index a752062..129c7e0 100644 Binary files a/scorch.xex and b/scorch.xex differ diff --git a/variables.asm b/variables.asm index c01a59c..9a16f35 100644 --- a/variables.asm +++ b/variables.asm @@ -100,10 +100,6 @@ MaxForceTableH .DS [MaxPlayers] ;---------------------------------------------------- -AngleTable ;Angle of the barrel of each tank during the round - .DS [MaxPlayers] -NewAngle .DS 1 -;---------------------------------------------------- ActiveWeapon ;number of the selected weapon .DS [MaxPlayers] @@ -347,7 +343,18 @@ escFlag .ds 1 ;-------------- CurrentResult .DS 1 -;-------------- +;-------------- +AngleTable ;Angle of the barrel of each tank during the round + .DS [MaxPlayers] +NewAngle ; used in AI + .DS 1 +previousBarrelAngle + .DS [MaxPlayers] +EndOfTheBarrelX + .ds 2 +EndOfTheBarrelY + .ds 1 +;---------------------------------------------------- previousAngle .DS [MaxPlayers] previousEnergyL @@ -356,8 +363,6 @@ previousLeftRange .DS [MaxPlayers] previousEnergyH .DS [MaxPlayers] -previousRightAngle - .DS [MaxPlayers] RandBoundaryLow .ds 2 RandBoundaryHigh diff --git a/weapons.asm b/weapons.asm index ea44c7b..9a06391 100644 --- a/weapons.asm +++ b/weapons.asm @@ -661,20 +661,25 @@ DiggerCharacter ldx TankNr lda AngleTable,x tay - clc - lda xtankstableL,x - adc EndOfTheBarrelX,y ; correction of the end of the barrel point (X) - sta xbyte - lda xtankstableH,x - adc #0 - sta xbyte+1 - sec - lda ytankstable,x - sbc EndOfTheBarrelY,y ; correction of the end of the barrel point (Y) - sta ybyte - lda #$00 - sbc #$00 - sta ybyte+1 + + mwa EndOfTheBarrelX xbyte + mva EndOfTheBarrelY ybyte + mva #0 ybyte+1 + + ;clc + ;lda xtankstableL,x + ;adc EndOfTheBarrelX,y ; correction of the end of the barrel point (X) + ;sta xbyte + ;lda xtankstableH,x + ;adc #0 + ;sta xbyte+1 + ;sec + ;lda ytankstable,x + ;sbc EndOfTheBarrelY,y ; correction of the end of the barrel point (Y) + ;sta ybyte + ;lda #$00 + ;sbc #$00 + ;sta ybyte+1 mwa xdraw LaserCoordinate mwa ydraw LaserCoordinate+2 @@ -1325,61 +1330,70 @@ CTRLPressedDown jmp BeforeFire pressedRight + ldx TankNr + lda AngleTable,x + sta previousBarrelAngle,x lda pressTimer spl:mva #0 pressTimer ; if >128 then reset to 0 cmp #25 ; 1/2s bcs CTRLPressedRight mva #sfx_set_power_2 sfx_effect - ldx TankNr + dec AngleTable,x lda AngleTable,x cmp #255 ; -1 jne BeforeFire - lda #180 + lda #179 sta AngleTable,x jmp BeforeFire CTRLPressedRight - mva #sfx_set_power_2 sfx_effect ldx TankNr lda AngleTable,x + sta previousBarrelAngle,x + mva #sfx_set_power_2 sfx_effect + lda AngleTable,x sec sbc #4 sta AngleTable,x - cmp #4 ; smalles angle for speed rotating + cmp #4 ; smallest angle for speed rotating jcs BeforeFire - lda #180 + lda #179 sta AngleTable,x jmp BeforeFire pressedLeft + ldx TankNr + lda AngleTable,x + sta previousBarrelAngle,x lda pressTimer spl:mva #0 pressTimer ; if >128 then reset to 0 cmp #25 ; 1/2s bcs CTRLPressedLeft mva #sfx_set_power_2 sfx_effect - ldx TankNr INC AngleTable,x lda AngleTable,x - cmp #181 + cmp #180 jne BeforeFire - lda #0 + lda #1 sta AngleTable,x jmp BeforeFire CTRLPressedLeft - mva #sfx_set_power_2 sfx_effect ldx TankNr lda AngleTable,x + sta previousBarrelAngle,x + mva #sfx_set_power_2 sfx_effect + lda AngleTable,x clc adc #4 sta AngleTable,x - cmp #181-4 + cmp #180-4 jcc BeforeFire - lda #0 + lda #1 sta AngleTable,x jmp BeforeFire @@ -1498,21 +1512,26 @@ AfterStrongShoot ; to start where the tank's barrel ends ; (without it bullet would go from the left lower corner of the tank) ;ldx TankNr - ldy Angle - clc - lda xtankstableL,x - adc EndOfTheBarrelX,y ; correction of X - sta xtraj+1 - lda xtankstableH,x - adc #$00 - sta xtraj+2 - sec - lda ytankstable,x - sbc EndOfTheBarrelY,y ; correction of Y - sta ytraj+1 - lda #$00 - sbc #$00 - sta ytraj+2 + + mwa EndOfTheBarrelX xtraj+1 + mva EndOfTheBarrely ytraj+1 + mva #0 ytraj+2 + + ;ldy Angle + ;clc + ;lda xtankstableL,x + ;adc EndOfTheBarrelX,y ; correction of X + ;sta xtraj+1 + ;lda xtankstableH,x + ;adc #$00 + ;sta xtraj+2 + ;sec + ;lda ytankstable,x + ;sbc EndOfTheBarrelY,y ; correction of Y + ;sta ytraj+1 + ;lda #$00 + ;sbc #$00 + ;sta ytraj+2 ; checking if the shot is underground (no Flight but Hit :) ) ldy #0 @@ -1918,30 +1937,25 @@ AutoDefence sta xtraj sta ytraj - lda xtankstableL,x - sta xtraj+1 - lda xtankstableH,x - sta xtraj+2 - lda ytankstable,x - sta ytraj+1 - lda #$00 - sta ytraj+2 + mwa EndOfTheBarrelX xbyte + mva EndOfTheBarrelY ybyte + mva #0 ybyte+1 - ldy Angle - clc - lda xtraj+1 - adc EndOfTheBarrelX,y ; correction of X - sta xtraj+1 - lda xtraj+2 - adc #0 - sta xtraj+2 - sec - lda ytraj+1 - sbc EndOfTheBarrelY,y ; correction of Y - sta ytraj+1 - lda ytraj+2 - sbc #0 - sta ytraj+2 +; ldy Angle +; clc +; lda xtraj+1 +; adc EndOfTheBarrelX,y ; correction of X +; sta xtraj+1 +; lda xtraj+2 +; adc #0 +; sta xtraj+2 +; sec +; lda ytraj+1 +; sbc EndOfTheBarrelY,y ; correction of Y +; sta ytraj+1 +; lda ytraj+2 +; sbc #0 +; sta ytraj+2 ldy #100 ; ??? mva #1 tracerflag ; I do not know (I mean I think I know ;) )