Merge pull request #90 from pkali/develop

build 143
This commit is contained in:
2022-06-06 00:23:46 -04:00
committed by GitHub
9 changed files with 573 additions and 515 deletions
+10
View File
@@ -47,6 +47,16 @@ With the advent of fujinet (https://fujinet.online/) we are thinking about makin
## Changes:
###### Build 143
2022-06-05
Rewrite build. We redone several important parts of the game to allow for bug fixes and requested features. Generally it was a great success, but some new bugs appeared. This build is nice for the eye, but beware, no mercy for testers again :)
Only visible changes listed, because you are possibly not as excited as we are for the new Flight routine and ground collisions by @Pecusx.
- https://github.com/pkali/scorch_src/issues/84, https://github.com/pkali/scorch_src/issues/63 - tanks now say good bye properly!
- https://github.com/pkali/scorch_src/issues/74 - Press [ESC] to quit the game at any point, with a confirmation when the round has already started. Please note the keyboard is not checked all the time, so press it for a while, especially when AI tanks are ru(i/n)ning the show.
- https://github.com/pkali/scorch_src/issues/56 - there should be no occurrences of frivolous weapon purchases. Please report all tanks getting their munitions from uncertified sources!
- https://github.com/pkali/scorch_src/issues/47 - It seems that the bad sequence of turns has been ameliorated. Fix is trivial, finding the culprit - far from it. Please pay special attention to fairness of shooting in case the fix is still longing for the fjords.
- ATTRACT mode works how it should - screensaver saves screen only when HUMAN should input something.
###### Build 142
2022-05-30
Late build. The bugs we tried to squelch turned out to be more difficult than usual. Some progress has been made though even if it is not yet visible.
+12 -20
View File
@@ -23,7 +23,6 @@ RoundsTable .by 10,20,30,40,50
flyDelayTable .by 255,150,75,35,1
seppukuTable .by 255, 45,25,15,9
;------------------------------------------------
LevelNameBeginL ; begins of level names
.by <NamesOfLevels,<(NamesOfLevels+10),<(NamesOfLevels+20)
.by <(NamesOfLevels+32),<(NamesOfLevels+42),<(NamesOfLevels+52)
@@ -37,31 +36,25 @@ TanksWeaponsTableL
.by <TanksWeapon1,<TanksWeapon2,<TanksWeapon3,<TanksWeapon4,<TanksWeapon5,<TanksWeapon6
TanksWeaponsTableH
.by >TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6
;-----4x4 texts-----
;-----4x4 texts-----
LineTop
dta d"(%%%%%%%%%%%%)"
.byte $ff
dta d"(%%%%%%%%%%%%)", $ff
;# - vertical, () * +, % - horizontal
LineBottom
dta d"*%%%%%%%%%%%%+"
.byte $ff
dta d"*%%%%%%%%%%%%+", $ff
LineEmpty
dta d"# #"
.byte $ff
dta d"# #", $ff
LineHeader2
dta d"# RESULTS #"
.byte $ff
dta d"# RESULTS #", $ff
LineGameOver
dta d"# GAME OVER #"
.byte $ff
dta d"# GAME OVER #", $ff
seppukuText
dta d"# SEPPUKU! #"
.byte $ff
dta d"# SEPPUKU! #", $ff
areYouSureText
dta d"# SURE? Y/N #", $ff
lineClear
dta d" "
.byte $ff
dta d" ", $ff
;-----------
pmtableL ; addressess of the P/M memory for 5 tanks (6th is without P/M background)
@@ -541,8 +534,8 @@ EndOfTheBarrelY
.by 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,7
;-------------------------------------------------
;-------------------------------------------------
TanksNamesDefault
dta d"1st.Tank"
dta d"2nd.Tank"
@@ -551,7 +544,6 @@ TanksNamesDefault
dta d"5th.Tank"
dta d"6th.Tank"
WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Baby_Missile___
.by >price_Missile________
@@ -889,7 +881,7 @@ NamesOfWeapons ;the comment is an index in the tables
dta d"White Flag " ; 63
weaponsOfDeath
dta 1,2,3,7,15,16,17,18,19,20,21,22,23,24,25,26,27
weaponsOfDeathEnd
weaponsOfDeathEnd
joyToKeyTable
; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15
.by $ff,$ff,$ff,$ff,$ff,$ff,$ff,$07,$ff,$ff,$ff,$06,$ff,$0f,$0e,$ff
+64 -16
View File
@@ -4,7 +4,7 @@
;--------------------------------------------------
draw .proc ;;fuxxing good draw :)
.proc draw ;;fuxxing good draw :)
;--------------------------------------------------
;creditz to Dr Jankowski / MIM U.W.
; (xi,yi)-----(xk,yk)
@@ -43,9 +43,9 @@ draw .proc ;;fuxxing good draw :)
;cpw ybyte #screenheight
;bcc DrawOnTheScreen
lda ydraw+1
bne DrawOutOfTheScreen
bmi DrawOutOfTheScreen
lda ybyte+1
beq DrawOnTheScreen
bpl DrawOnTheScreen
DrawOutOfTheScreen
;jsr DrawJumpPad
rts
@@ -230,20 +230,26 @@ yestrace
jsr plot
notrace
;aftertrace
;key
lda HitFlag
bne StopHitChecking
CheckCollisionDraw
; checking collision!
lda ydraw+1
bne StopHitChecking
bmi StopHitChecking
jsr CheckCollisionWithTank
lda HitFlag
bne StopHitChecking
mwa xdraw temp
adw temp #mountaintable
clc
lda xdraw
adc #<mountaintable
sta temp
lda xdraw+1
adc #>mountaintable
sta temp+1
ldy #0
lda ydraw
@@ -255,7 +261,7 @@ CheckCollisionDraw
sec
sbc #1
sta YHit
mva #0 YHit+1
sty YHit+1
;mwa ydraw YHit
mva #1 HitFlag
StopHitChecking
@@ -272,7 +278,7 @@ ContinueDraw
EndOfDraw
mwa xtempDRAW xdraw
mva ytempDRAW ydraw
mwa ytempDRAW ydraw
rts
.endp
@@ -298,7 +304,7 @@ EndOfDraw
; splot8
mwa xdraw xcircle
mva ydraw ycircle
mwa ydraw ycircle
mwa #0 xc
mva radius yc
@@ -354,7 +360,7 @@ endcircleloop
jsr splot8
mwa xcircle xdraw
mva ycircle ydraw
mwa ycircle ydraw
rts
.endp
;----
@@ -381,12 +387,19 @@ splot8 .proc
adc YC
sta ydraw
sta tempcir
lda ycircle+1
adc #$00
sta ydraw+1
sta tempcir+1
jsr plot
sec
lda ycircle
sbc YC
sta ydraw
lda ycircle+1
sbc #$00
sta ydraw+1
jsr plot
sec
@@ -400,6 +413,8 @@ splot8 .proc
lda tempcir
sta ydraw
lda tempcir+1
sta ydraw+1
jsr plot
;---
clc
@@ -414,12 +429,19 @@ splot8 .proc
adc xC
sta ydraw
sta tempcir
lda ycircle+1
adc #$00
sta ydraw+1
sta tempcir+1
jsr plot
sec
lda ycircle
sbc xC
sta ydraw
lda ycircle+1
sbc #$00
sta ydraw+1
jsr plot
sec
@@ -433,6 +455,8 @@ splot8 .proc
lda tempcir
sta ydraw
lda tempcir+1
sta ydraw+1
jsr plot
RTS
@@ -583,7 +607,7 @@ DrawNextTank
.endp
;---------
.proc DrawTankNr
ldx tanknr
ldx tankNr
; let's check the energy
lda eXistenZ,x
bne SkipRemovigPM ; if energy=0 then no tank
@@ -672,6 +696,28 @@ DoNotDrawTankNr
rts
.endp
; -------------------------------------
.proc FlashTank
; -------------------------------------
; number of blinking tank in TankNr
mva #18 fs ; temp, how many times flash the tank
tankflash_loop
lda CONSOL ; turbo mode
cmp #6 ; START
sne:mva #1 fs ; finish it
mva #1 Erase
ldx TankNr
jsr DrawTankNr.SkipRemovigPM ; it's necessary becouse DrawTankNr skips tanks with no energy !
PAUSE 2
mva #0 Erase
ldx TankNr
jsr DrawTankNr.SkipRemovigPM
PAUSE 2
dec fs
jne tankflash_loop
rts
.endp
;--------------------------------------------------
.proc drawmountains
;--------------------------------------------------
@@ -685,6 +731,7 @@ drawmountainsloop
cmp #screenheight
beq NoMountain
sta ydraw
sty ydraw+1
jsr DrawLine
NoMountain
inw modify
@@ -703,6 +750,7 @@ drawmountainspixelloop
ldy #0
lda (modify),y
sta ydraw
sty ydraw+1
jsr plot
inw modify
inw xdraw
@@ -749,7 +797,7 @@ drawmountainspixelloop
adw RangeLeft #mountaintable2 tempor2
NextColumn1
mva #0 ydraw
mwa #0 ydraw
NextPoint1
jsr point
beq StillNothing
@@ -1260,9 +1308,9 @@ MakeMask00
lsr mask1+#
ror mask2+#
.endr
.rept 8
sec
ror char1+#
.rept 8
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
@@ -1383,9 +1431,9 @@ MakeMask01
lsr mask1+#
ror mask2+#
.endr
.rept 4
sec
ror char1+#
.rept 4
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
+1
View File
@@ -147,6 +147,7 @@ NMIST = $D40F ; rejestr statusu przerwa NMI
;-------------------------------------
;additional system variables
;-------------------------------------
ATRACT = $004D
COLPM0S = $02C0 ;- - shadow register COLPM0
COLPM1S = $02C1 ;- - shadow register COLPM1
COLPM2S = $02C2 ;- - shadow register COLPM2
+120 -108
View File
@@ -36,7 +36,7 @@
;we decided it must go in 'English' to let other people work on it
.macro build
dta d"142" ; number of this build (3 bytes)
dta d"143" ; number of this build (3 bytes)
.endm
icl 'definitions.asm'
@@ -98,6 +98,7 @@
icl 'lib/atari.hea'
icl 'lib/macro.hea'
;splash screen and musix
icl 'artwork/HIMARS14.asm'
;Game loading address
ORG $3000
@@ -117,13 +118,14 @@ START
; Startup sequence
jsr Initialize
jsr Options ;startup screen
lda escFlag
bne START
jsr EnterPlayerNames
lda escFlag
bne START
jsr RandomizeSequence
; for the round #1 shooting sequence is random
@@ -144,6 +146,9 @@ MainGameLoop
jsr RoundInit
jsr MainRoundLoop
lda escFlag
bne START
mva #0 TankNr ;
jsr SortSequence
@@ -248,51 +253,46 @@ skipzeroing
; the shooting angle is randomized
; of course gains an looses are zeroed
;jsr StatusDisplay
lda #0
tax
@
sta singleRoundVars,x
inx
cpx #(singleRoundVarsEnd-singleRoundVars)
@ sta singleRoundVars,x
inx
cpx #(singleRoundVarsEnd-singleRoundVars)
bne @-
ldx #(MaxPlayers-1)
SettingEnergies
lda #$00
sta gainL,x
sta gainH,x
sta looseL,x
sta looseH,x
lda #99
sta Energy,x
sta eXistenZ,x
sta LASTeXistenZ,x
; anything in eXistenZ table means that this tank exist
; in the given round
lda #<1000
sta MaxForceTableL,x
lda #>1000
sta MaxForceTableH,x
lda #<350
sta ForceTableL,x
lda #>350
sta ForceTableH,x
;lda #(255-45)
;it does not look good when all tanks have
;barrels pointing the same direction
;so it would be nice to have more or less random
;angles
jsr RandomizeAngle
sta AngleTable,x
dex
lda #$00
sta gainL,x
sta gainH,x
sta looseL,x
sta looseH,x
lda #99
sta Energy,x
sta eXistenZ,x
sta LASTeXistenZ,x
; anything in eXistenZ table means that this tank exist
; in the given round
lda #<1000
sta MaxForceTableL,x
lda #>1000
sta MaxForceTableH,x
lda #<350
sta ForceTableL,x
lda #>350
sta ForceTableH,x
;lda #(255-45)
;it does not look good when all tanks have
;barrels pointing the same direction
;so it would be nice to have more or less random
;angles
jsr RandomizeAngle
sta AngleTable,x
dex
bpl SettingEnergies
mva #0 CurrentResult
;generating the new landscape
jsr PMoutofScreen ;let P/M disappear
jsr clearscreen ;let the screen be clean
@@ -322,6 +322,7 @@ SettingEnergies
; tank with energy greater than 0 left
ldy #0 ; in Y - number of tanks with energy greater than zero
sty ATRACT ; reset atract mode
ldx NumberOfPlayers
dex
CheckingIfRoundIsFinished
@@ -343,8 +344,7 @@ WhichTankWonLoop
bne ThisOneWon
dex
bpl WhichTankWonLoop
;error here!!!
;stop
;error was here!!!
; somehow I believed program will be never here
; but it was a bad assumption
; god knows when there is such a situation
@@ -354,7 +354,6 @@ WhichTankWonLoop
; second tank explodes and kills the first one.
; and code lands here...
; looks like no one won!
rts
ThisOneWon
@@ -376,7 +375,6 @@ DoNotFinishTheRound
jsr DisplaySeppuku
jmp Seppuku
;ldx TankNr
@
ldx TankSequencePointer
lda TankSequence,x
@@ -394,12 +392,20 @@ DoNotFinishTheRound
lda SkillTable,x
beq ManualShooting
RoboTanks
RoboTanks
; robotanks shoot here
jsr ArtificialIntelligence
jsr MoveBarrelToNewPosition
jsr StatusDisplay ;all digital values like force, angle, wind, etc.
jsr DisplayStatus ;all digital values like force, angle, wind, etc.
jsr PutTankNameOnScreen
lda kbcode
cmp #28 ; ESC
bne @+
jsr AreYouSure
lda escFlag
seq:rts
@
; let's move the tank's barrel so it points the right
; direction
jmp AfterManualShooting
@@ -408,12 +414,14 @@ ManualShooting
jsr WaitForKeyRelease
jsr BeforeFire
lda escFlag
seq:rts
AfterManualShooting
inc noDeathCounter
jsr DecreaseWeaponBeforeShoot
jsr StatusDisplay
jsr DisplayStatus
ldx TankNr
dec Energy,x ; lower energy to eventually let tanks commit suicide
@@ -437,6 +445,7 @@ continueMainRoundLoopAfterSeppuku
AfterExplode
; TODO: IS IT OK??? possibly a fix here needed for #56
ldy WeaponDepleted
bne @+
ldx TankNr
@@ -474,11 +483,8 @@ missed
jsr DisplayOffensiveTextNr
NextPlayerShoots
;mva #1 Erase
;jsr drawtanks
;before it shoots, the eXistenZ table must be
;updated accordingly to actual energy (was forgotten, sorry to ourselves)
;before it shoots, the eXistenZ table must be updated
;accordingly to actual energy (was forgotten, sorry to ourselves)
ldx #(MaxPlayers-1)
SeteXistenZ
@@ -489,7 +495,7 @@ SeteXistenZ
;DATA L1,L2
;Multiplication 8bit*8bit,
;result 16bit
;this algiorithm is a little longer than in Ruszczyc 6502 book
;this algiorithm is a little longer than one in Ruszczyc 6502 book
;but it is faster
LDy #8
@@ -514,13 +520,6 @@ B0 DEY
;was setup of maximum energy for players
;mva #0 Erase
;jsr drawtanks
inc:lda TankSequencePointer
cmp NumberOfPlayers
bne PlayersAgain
mva #0 TankSequencePointer
PlayersAgain
@@ -552,27 +551,14 @@ NoPlayerNoDeath
dex
bpl CheckingPlayersDeath
; if processor is here it means there are no more explosions
inc:lda TankSequencePointer
cmp NumberOfPlayers
sne:mva #0 TankSequencePointer
jmp MainRoundLoop
.endp
;---------------------------------
.proc Seppuku
lda #0
sta FallDown1
sta FallDown2
sta ydraw+1
; get position of the tank
ldx TankNr
lda xtankstableL,x
sta xdraw
lda xtankstableH,x
sta xdraw+1
lda yTanksTable,x
sta ydraw
lda #1 ; Missile
jsr ExplosionDirect
jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku
.endp
;---------------------------------
.proc PlayerXdeath
@@ -605,8 +591,13 @@ NoPlayerNoDeath
ldy TankTempY
mva #1 plot4x4color
jsr DisplayOffensiveTextNr
; tank flash
ldy TankTempY
mva TankNr temp2 ; not elegant, and probably unnecessary
sty TankNr
jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) )
mva temp2 TankNr
PAUSE 75
;Deffensive text cleanup
;here we clear Deffensive text (after a shoot)
ldy TankTempY
@@ -627,7 +618,7 @@ NoPlayerNoDeath
sbc #4
sta ydraw
lda #0
sta ydraw+1 ; there is 0 left in A, so... TODO: bad code above. revisit when transitioning ydraw to byte
sta ydraw+1 ; there is 0 left in A, so... TODO: bad code above. revisit
;cleanup of the soil fall down ranges (left and right)
sta RangeRight
@@ -636,12 +627,9 @@ NoPlayerNoDeath
sta FallDown2
mwa #screenwidth RangeLeft
; We are randomizing the weapon now.
; jumping into the middle of the explosion
; routine
MetodOfDeath
lda random
and #%00011111 ; range 0-31
@@ -652,13 +640,10 @@ MetodOfDeath
jsr ExplosionDirect
mva #sfx_silencer sfx_effect
; jump to after explosion routines (soil fallout, etc.)
; After going through these routines we are back
; to checking if a tank exploded and maybe we have
; a deadly shot here again.
jmp MainRoundLoop.AfterExplode
.endp
@@ -702,20 +687,52 @@ NotNegativeEnergy
rts
.endp
;---------------------------------
.proc Seppuku
lda #0
sta FallDown1
sta FallDown2
sta ydraw+1
; get position of the tank
ldx TankNr
lda xtankstableL,x
sta xdraw
lda xtankstableH,x
sta xdraw+1
lda yTanksTable,x
sta ydraw
lda #1 ; Missile
jsr ExplosionDirect
jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku
.endp
;--------------------------------------------------
GetRandomWind .proc
;in: MaxWind (byte)
;out: Wind (word)
;uses: _
;--------------------------------------------------
lda random
cmp MaxWind
bcs GetRandomWind ; if more than MaxWind then randomize again
sta Wind
mva #$00 Wind+1
; multiply Wind by 16 and take it as a decimal part (0.Wind)
sta Wind+2
sta Wind+3
; multiply Wind by 16
; two bytes of Wind are treated as a decimal part of vx variable
:4 aslw Wind
; decide the direction
lda random
and #$01
sta WindOrientation
rts
beq @+
sec ; Wind = -Wind
.rept 4
lda #$00
sbc Wind+#
sta Wind+#
.endr
@ rts
.endp
;--------------------------------------------------
@@ -733,34 +750,28 @@ PMoutofScreen .proc
;--------------------------------------------------
ldx #$3f
lda #$0
loop05
sta TanksWeapon1,x
sta TanksWeapon2,x
sta TanksWeapon3,x
sta TanksWeapon4,x
sta TanksWeapon5,x
sta TanksWeapon6,x
dex
bne @+
lda #99
bne loop05
@ bpl loop05
@
sta TanksWeapon1,x
sta TanksWeapon2,x
sta TanksWeapon3,x
sta TanksWeapon4,x
sta TanksWeapon5,x
sta TanksWeapon6,x
dex
sne:lda #99
bpl @-
rts
.endp
;--------------------------------------------------
.proc Initialize
;Initialization sequence
;uses: temp, ...
;--------------------------------------------------
deletePtr = temp
lda #0
sta Erase
sta tracerflag
sta GameIsOver
sta escFlag
; clean variables
lda #0
tay
mwa #variablesStart deletePtr
@ tya
@@ -1168,7 +1179,8 @@ nextishigher
.endp
;--------------------------------------------------
.proc getkey ; waits for pressing a key and returns pressed value in A
.proc GetKey ; waits for pressing a key and returns pressed value in A
; when [ESC] is pressed, escFlag is set to 1
;--------------------------------------------------
jsr WaitForKeyRelease
@
BIN
View File
Binary file not shown.
+108 -59
View File
@@ -218,6 +218,8 @@ OptionsYLoop
ManualPurchase
jsr Purchase
ldx escFlag
seq:rts
AfterManualPurchase
inc:lda TankNr
@@ -556,6 +558,8 @@ ChoosingItemForPurchase
;--------------------------------------------------
jsr PutLitteChar ; Places pointer at the right position
jsr getkey
ldx escFlag
seq:rts
cmp #$2c ; Tab
jeq ListChange
cmp #$0c ; Return
@@ -838,7 +842,7 @@ NoArrowDown
sta colpf2s ; set color of player name line
jsr EnterPlayerName
lda escFlag
jne START
seq:rts
inc TankNr
lda TankNr
cmp NumberOfPlayers
@@ -1342,11 +1346,9 @@ DOTNcharloop
ldy #0
sty LineCharNr
TypeLine4x4Loop
ldy LineCharNr
mwa LineAddress4x4 temp
lda (temp),y
cmp #$ff
@@ -1366,6 +1368,63 @@ EndOfTypeLine4x4
.endp
;--------------------------------
.proc AreYouSure
;using 4x4 font
;save vars (messed in TypeLine4x4)
mwa Xdraw xk
mva Ydraw yc
mva #4 ResultY ; where seppuku text starts Y-wise on the screen
;top frame
mva ResultY LineYdraw
jsr TL4x4_top
adb ResultY #4 ;next line
;seppuku
mwa #areYouSureText LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering
mva ResultY LineYdraw
jsr TypeLine4x4
adb ResultY #4 ;next line
;bottom frame
mva ResultY LineYdraw
jsr TL4x4_bottom
jsr GetKey
cmp #$2b ; "Y"
bne @+
mva #1 escFlag
bne skip01
@ mva #0 escFlag
jsr WaitForKeyRelease
skip01
;clean
mva #3 dx
mva #4 ResultY
@
mva #1 plot4x4color
mwa #lineClear LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering
mva ResultY LineYdraw
jsr TypeLine4x4
adb ResultY #4 ;next line
dec dx
bne @-
quit_areyousure
;restore vars
mva yc Ydraw
mwa xk Xdraw
rts
.endp
;--------------------------------
.proc DisplaySeppuku
;using 4x4 font
@@ -1383,10 +1442,8 @@ seppuku_loop
mva #4 ResultY ; where seppuku text starts Y-wise on the screen
;top frame
mwa #LineTop LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering
mva ResultY LineYdraw
jsr TypeLine4x4
jsr TL4x4_top
adb ResultY #4 ;next line
;seppuku
@@ -1397,17 +1454,14 @@ seppuku_loop
adb ResultY #4 ;next line
;bottom frame
mwa #LineBottom LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering
mva ResultY LineYdraw
jsr TypeLine4x4
jsr TL4x4_bottom ; just go
;clean seppuku
mva #3 dx
mva #4 ResultY
@
mva #1 plot4x4color
mwa #lineClear LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering
mva ResultY LineYdraw
@@ -1432,18 +1486,15 @@ quit_seppuku
;using 4x4 font
mva #sfx_smoke_cloud sfx_effect
mva #1 plot4x4color
;centering the result screen
mwa #((ScreenWidth/2)-(8*4)) ResultX
mva #((ScreenHeight/2)-(8*4)) ResultY
;upper frame
mwa #LineTop LineAddress4x4
mwa ResultX LineXdraw
mva ResultY LineYdraw
mva #1 plot4x4color
jsr TypeLine4x4
jsr TL4x4_top
adb ResultY #4 ;next line
@@ -1458,17 +1509,15 @@ quit_seppuku
jsr displaybyte ;decimal (byte), displayposition (word)
mwa #LineHeader1 LineAddress4x4
mwa ResultX LineXdraw
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw
mva #1 plot4x4color
jsr TypeLine4x4
beq @+ ;unconditional jump, because TypeLine4x4 ends with beq
GameOver4x4
mwa #LineGameOver LineAddress4x4
mwa ResultX LineXdraw
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw
mva #1 plot4x4color
jsr TypeLine4x4
mva #1 GameIsOver
@@ -1476,30 +1525,23 @@ GameOver4x4
adb ResultY #4 ;next line
;Empty line
mwa #LineEmpty LineAddress4x4
mwa ResultX LineXdraw
mva ResultY LineYdraw
mva #1 plot4x4color
jsr TypeLine4x4
jsr TL4x4_empty
adb ResultY #2 ;next line
;Header2
mwa #LineHeader2 LineAddress4x4
mwa ResultX LineXdraw
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw
mva #1 plot4x4color
jsr TypeLine4x4
adb ResultY #4 ;next line
;Empty line
mwa #LineEmpty LineAddress4x4
mwa ResultX LineXdraw
mva ResultY LineYdraw
mva #1 plot4x4color
jsr TypeLine4x4
jsr TL4x4_empty
sbb ResultY #2 ;next line (was empty)
@@ -1564,24 +1606,17 @@ TankNameCopyLoop
;result line display
mwa #ResultLineBuffer LineAddress4x4
mwa ResultX LineXdraw
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw
mva #1 plot4x4color
jsr TypeLine4x4
adb ResultY #4 ;next line
;Empty line
mwa #LineEmpty LineAddress4x4
mwa ResultX LineXdraw
mva ResultY LineYdraw
mva #1 plot4x4color
jsr TypeLine4x4
jsr TL4x4_empty
dec ResultOfTankNr
bmi FinishResultDisplay
sbb ResultY #2 ;distance between lines is smaller
@@ -1589,25 +1624,35 @@ TankNameCopyLoop
jmp ResultOfTheNextPlayer
FinishResultDisplay
mva ResultY LineYdraw
;jmp TL4x4_bottom ; just go
.endp
.proc TL4x4_bottom
;bottom of the frame
mwa #LineBottom LineAddress4x4
mwa ResultX LineXdraw
mva ResultY LineYdraw
mva #1 plot4x4color
jsr TypeLine4x4
rts
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
jmp TypeLine4x4 ; jsr:rts
.endp
.proc TL4x4_top
;bottom of the frame
mwa #LineTop LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
jmp TypeLine4x4 ; jsr:rts
.endp
.proc TL4x4_empty
;empty frame
mwa #LineEmpty LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
jmp TypeLine4x4 ; jsr:rts
.endp
;-------------------------------------------------
.proc StatusDisplay
.proc DisplayStatus
;-------------------------------------------------
;lda noDeathCounter
;sta decimal
;mwa #textbuffer+80+37 displayposition
;jsr displaybyte
;---------------------
;displaying symbol of the weapon
;---------------------
@@ -1711,35 +1756,39 @@ AngleDisplay
mwa #textbuffer+40+21 displayposition
jsr displaybyte
;=========================
;display Wind
;=========================
lda WindOrientation
bne DisplayLeftWind
mwa Wind temp
lda Wind+3 ; highest byte of 4 byte wind
bmi DisplayLeftWind
lda #$7f ; (tab) char
sta textbuffer+80+28
lda #0 ;space
sta textbuffer+80+25
beq DisplayWindValue
DisplayLeftWind
sec ; Wind = -Wind
lda #$00
sbc temp
sta temp
lda #$00
sbc temp+1
sta temp+1
lda #$7e ;(del) char
sta textbuffer+80+25
lda #0 ;space
sta textbuffer+80+28
DisplayWindValue
mwa Wind temp
lsrw temp ;divide by 16 to have
lsrw temp ;a nice view on a screen
lsrw temp
lsrw temp
:4 lsrw temp ;divide by 16 to have a nice value on a screen
lda temp
sta decimal
mwa #textbuffer+80+26 displayposition
jsr displaybyte
;=========================
;display round number
;=========================
lda CurrentRoundNr
sta decimal
mwa #textbuffer+80+14 displayposition
+54 -50
View File
@@ -8,35 +8,30 @@
; compilation to e.g. cartridge
; zero page variables are declared in program.s65 module
;=====================================================
;--------------------------------------------------
;Variables
;--------------
TanksNames ; DO NOT ZERO - ticket #24
:6 dta d" "
;----------------------------
;----------------------------------------------------
;Options DO NOT ZERO - ticket #27
OptionsTable .by 0,0,2,2,0,1,3
RoundsInTheGame .by 10 ;how many rounds in the current game
seppukuVal .by 75
;--------------------------------------------------
;----------------------------------------------------
skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
.DS [MaxPlayers]
;-----------------------------------
;----------------------------------------------------
; 4x4 text buffer
ResultLineBuffer
dta d" "
.byte $ff
dta d" ", $ff
LineHeader1
dta d"# ROUND: "
RoundNrDisplay
dta d" #"
.byte $ff
dta d" #", $ff
;=====================================================
variablesStart ; zeroing starts here
;=====================================================
drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
;--------------
escFlag .ds 1
;--------------
sfx_effect .ds 1
;--------------
noDeathCounter .ds 1
@@ -47,28 +42,28 @@ flyDelay .ds 1
NumberOfPlayers .DS 1 ;current number of players (counted from 1)
TankSequence .DS [MaxPlayers] ;sequence of shooting during the Round
GameIsOver .DS 1 ; 1 means it was the last round in the game
;-----------------------------------
;----------------------------------------------------
moneyH ;we place zero at the end of prices and money
;and have range from 0 to 99990 (not too much)
;money players have (maybe one more byte is needed?)
.DS [MaxPlayers]
moneyL
.DS [MaxPlayers]
;-----------------------------------
;----------------------------------------------------
gainH ;how much money player gets after the round
;it is gathered during the round basing on energy
;opponents loose after player's shoots
.DS [MaxPlayers]
gainL
.DS [MaxPlayers]
;-----------------------------------
;----------------------------------------------------
looseH ;how much player looses after the round
;calculated from REAL energy loss
;(not only to zero energy)
.DS [MaxPlayers]
looseL
.DS [MaxPlayers]
;-----------------------------------
;----------------------------------------------------
Energy
.DS [MaxPlayers]
EnergyDecrease .DS 1
@@ -81,9 +76,7 @@ ResultsTable ;the results in the gameeeeee
.DS [MaxPlayers]
TempResults
.DS [MaxPlayers]
CurrentResult
.DS 1
;-----------------------------------
;----------------------------------------------------
ForceTableL ;shooting Force of the tank during the round
.DS [MaxPlayers]
ForceTableH
@@ -93,35 +86,36 @@ MaxForceTableL ;Energy of the tank during the round
.DS [MaxPlayers] ;1000 is the default
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]
WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile
;-----------------------------------
;----------------------------------------------------
;format of the 3-byte static point number used in the game
; 20203.5 => 128 : <20203 : >20203
;-----------------------------------
;----------------------------------------------------
L1 .DS 1 ; variable used in multiplications (by 10:)
gravity .DS 1 ;only the decimal part (1/10 = 25)
;-----------------------------------
;----------------------------------------------------
Wind .ds 2 ;walue displayed on the screen
;multiplied by 16 (decimal part only)
;-----------------------------------
Wind .ds 4 ;format: 0000.hhll
;walue displayed on the screen is
;decimal portion divided by 16 (>>4)
;----------------------------------------------------
MaxWind .ds 1 ;
WindOrientation .DS 1 ;(0-right,1-left)
;-----------------------------------
;----------------------------------------------------
Counter .DS 1 ;temporary Counter for outside loops
HitFlag .DS 1 ;1 when missile hit anything
;-----------------------------------
;----------------------------------------------------
xtankstableL ;X positions of tanks (lower left point)
.DS [MaxPlayers]
xtankstableH
@@ -130,17 +124,17 @@ ytankstable ;Y positions of tanks (lower left point)
.DS [MaxPlayers]
LowResDistances ; coarse tank positions divided by 4 (to be in just one byte)
.DS [MaxPlayers]
;-----------------------------------
;----------------------------------------------------
Erase .DS 1 ; if 1 only mask of the character is printed
; on the graphics screen. if 0 character is printed normally
;-----------------------------------
;----------------------------------------------------
RangeLeft .DS 2 ;range of the soil to be fallen down
RangeRight .DS 2 ;it is being set by all Explosions
;-----------------------------------
;----------------------------------------------------
WeaponRangeLeft .DS 2 ;Range of the Explosion of the given weapon
WeaponRangeRight .DS 2
;--------------------------------------------------
;----------------------------------------------------
;xroller
HowMuchToFall .ds 1
HeightRol .DS 1
@@ -173,14 +167,14 @@ LineLength .DS 2
;circle
radius .DS 1
xcircle .DS 2
ycircle .DS 1
ycircle .DS 2
tempcir .DS 2
;TankFalls
IfFallDown .DS 1
PreviousFall .DS 1
EndOfTheFallFlag .DS 1 ; in case of the infinite fall
Parachute .DS 1 ; are you insured with parachute?
; -------------------------------------------------
;----------------------------------------------------
;Flight
;variables for 5 missiles (used for mirv)
xtraj00 .DS [5] ; 3 bytes of xtraj times 5. Lowest byte
@@ -193,7 +187,9 @@ vx03 .DS [5]
MirvDown .DS [5] ; is given missile down?
MirvMissileCounter .DS 1 ; missile Counter (mainly for X)
SmokeTracerFlag .DS 1 ; if Smoketracer
; -------------------------------------------------
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)
;----------------------------------------------------
;CheckCollisionWithTank
vx .ds 4 ; 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA)
vy .ds 4 ;0,0,0,0
@@ -205,12 +201,11 @@ Angle .DS 1
Force .ds 3 ; 0,0,0
Multiplier .ds 3 ; 0,0,0
Multiplee .ds 2 ; 0,0
Result .ds 3 ; 0,0,0
goleft .DS 1 ;if 1 then flights left
;--------------------------------------------------
;----------------------------------------------------
;SoilDown2
IsEndOfTheFallFlag .DS 1
; -------------------------------------------------
;----------------------------------------------------
;unPlot
WhichUnPlot .DS 1
; max 5 concurrent unPlots
@@ -224,7 +219,7 @@ xtrajfb .DS 2
ytrajfb .DS 2
;
tracerflag .DS 1
; -------------------------------------------------
;----------------------------------------------------
;TypeChar
mask1 .DS [8]
mask2 .DS [8]
@@ -242,7 +237,7 @@ UpNdown .DS 1
temptankX .DS 2
temptankNr .DS 1
; -------------------------------------------------
;----------------------------------------------------
;Variables from textproc.s65
; tables with numbers of weapons on the right lists
; to be honest - I do not know at the moment what the above
@@ -252,7 +247,7 @@ NubersOfWeaponsL1
.ds 8*5 ; :(8*5) .by $ff
NubersOfWeaponsL2
.ds 8*2 ; :(8*2) .by $ff
; -------------------------------------------------
;----------------------------------------------------
; variables storing amount of weapons on the first and second
; list and pointer position
@@ -275,14 +270,14 @@ WhichList ; list currently on the screen
OffsetDL1 ; offset of the list screen (how many lines)....
.DS 1
; -------------------------------------------------
;----------------------------------------------------
;mark the level
PositionInName ; cursor position in name of the player when name input
.DS 1
DifficultyLevel ; Difficulty Level (human/cpu)
.DS 1
;-------------------------------------------------
;----------------------------------------------------
;displaydecimal
decimal .DS 2
decimalresult .DS 4
@@ -297,7 +292,7 @@ FallDown2 .DS 1
LeapFrogAngle .DS 1
;laser
LaserCoordinate .DS 8 ; 2,2,2,2
; -------------------------------------------------
;----------------------------------------------------
; Here go tables with weapons possesed by a given tank
; Index in the table means weapon type
; number entered means ammo for given weapon possessed (max 99)
@@ -324,7 +319,7 @@ mountaintable2 ;table of mountains (size=screenwidth)
.DS [screenwidth]
.DS 1 ; additional byte for fallout (sometimes 1 pixel)
MountaintableEnd ;good for table clearing
;----------------------------------------------
;----------------------------------------------------
TextPositionX .DS 2
TextPositionY .DS 1
TextAddress .DS 2
@@ -333,8 +328,16 @@ TextNumberOff .DS 1
;--------------
TankTempY
.DS 1
;----------------------------------------------------
;-------------- single round variables --------------
;----------------------------------------------------
singleRoundVars
;--------------
escFlag .ds 1
;--------------
CurrentResult
.DS 1
;--------------
previousAngle
.DS [MaxPlayers]
previousEnergyL
@@ -352,9 +355,9 @@ RandBoundaryHigh
AngleTablePointer
.DS 1
singleRoundVarsEnd
;----------------------------------------------
;----------------------------------------------------
; 4x4 texts
;----------------------------------------------
;----------------------------------------------------
LineAddress4x4
.DS 2
LineCharNr
@@ -372,8 +375,9 @@ ResultY
ResultOfTankNr
.DS 1
;----------------------------
;----------------------------------------------------
;PutChar4x4
;----------------------------------------------------
LoopCounter4x4 .DS 1
y4x4 .DS 1
StoreA4x4 .DS 1
@@ -385,6 +389,6 @@ plot4x4color .DS 1 ;1-white, 0-background
variablesEnd
;----------------------------
;----------------------------------------------------
.endif
+204 -262
View File
@@ -262,7 +262,7 @@ NoExplosionInFunkyBomb
mva #sfx_nuke sfx_effect
jsr xmissile
NoUpperCircle
adb ydraw #70
adw ydraw #70
;jsr CalculateExplosionRange
cpw ydraw #screenHeight
bcs NoLowerCircle
@@ -529,21 +529,25 @@ DiggerCharacter
.endp
; ------------------------
.proc laser
; but where are xdraw and ydraw ???? !!!!
; ------------------------
ldx TankNr
lda AngleTable,x
tay
clc
lda xtankstableL,x
adc EndOfTheBarrelX,y ; correction of the end of the barrel point
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
sbc EndOfTheBarrelY,y ; correction of the end of the barrel point (Y)
sta ybyte
mva #0 ybyte+1
lda #$00
sbc #$00
sta ybyte+1
mva #0 drawFunction
mwa xdraw LaserCoordinate
mwa ydraw LaserCoordinate+2
@@ -677,9 +681,9 @@ EndOfDistanceCheckLoop
sta color
dirtLoop
jsr circle
inc ydraw
inw ydraw
jsr circle
dec ydraw
.nowarn dew ydraw
inc radius
lda radius
cmp ExplosionRadius
@@ -725,6 +729,7 @@ RollinContinues
ldy #0
lda (tempXROLLER),y
sta ydraw
sty ydraw+1
beq ExplodeNow
cmp HeightRol
beq UpNotYet
@@ -737,8 +742,6 @@ UpNotYet
;check tank collision prior to PLOT
sty HitFlag
mwa xdraw xtraj+1
mwa ydraw ytraj+1
jsr CheckCollisionWithTank
lda HitFlag
@@ -760,12 +763,12 @@ HowMuchToFallRight2
jne RollinContinues
ExplodeNow
mwa xdraw xcircle ; we must store somewhere (BAD)
mva ydraw ycircle ; xdraw and ydraw (BAD)
mwa ydraw ycircle ; xdraw and ydraw (BAD)
mwa #0 xdraw
mva #screenheight-1 ydraw
mwa #screenheight-1 ydraw
jsr unPlot
mwa xcircle xdraw ;(bad)
mva ycircle ydraw ;(bad)
mwa ycircle ydraw ;(bad)
; finally a little explosion
jsr CalculateExplosionRange
@@ -782,6 +785,7 @@ ExplodeNow
adw tempXROLLER xdraw
lda (tempXROLLER),y
sta ydraw
sty ydraw+1
lda vx+3
; if horizontal velocity is negative then change the direction
@@ -852,7 +856,7 @@ DirectionChecked
mva #1 color
NoColor ; jump here with color=0 to clean dirt
mwa xdraw xcircle
mva ydraw ycircle
mwa ydraw ycircle
lda #1
; current dirt width
sta magic
@@ -890,14 +894,14 @@ DoNotPlot
bne NextRow
EndOfTheDirt
mwa xcircle xdraw
mva ycircle ydraw
mwa ycircle ydraw
rts
.endp
; ----------------
.proc xliquiddirt ;
mva xdraw TempXfill
mwa xdraw TempXfill
RepeatFill
mva TempXfill xdraw
mwa TempXfill xdraw
jsr checkRollDirection
; HowMuchToFall - direction
; $FF - we are in a hole (flying in missile direction)
@@ -987,7 +991,7 @@ ContinueToCheckMaxForce2
lda MaxForceTableL,x
sta ForceTableL,x
@
jsr StatusDisplay ;all digital values like force, angle, wind, etc.
jsr DisplayStatus ;all digital values like force, angle, wind, etc.
jsr PutTankNameOnScreen
jsr DrawTankNr
@@ -1012,7 +1016,17 @@ notpressed
beq checkJoy
lda kbcode
and #$Bf
and #%10111111 ; SHIFT elimination
cmp #28 ; ESC
bne @+
jsr AreYouSure
lda escFlag
beq notpressed
;---esc pressed-quit game---
rts
@
cmp #$8e
jeq CTRLPressedUp
cmp #$8f
@@ -1100,9 +1114,9 @@ pressedDown
dec ForceTableH,x
bpl @+
ForceGoesZero
lda #0
sta ForceTableH,x
sta ForceTableL,x
lda #0
sta ForceTableH,x
sta ForceTableL,x
@
jmp BeforeFire
@@ -1235,33 +1249,24 @@ AfterStrongShoot
mva #sfx_shoot sfx_effect
; Shoots tank nr X !!! :)
;ldx TankNr
lda xtankstableL,x
sta xtraj+1
lda xtankstableH,x
sta xtraj+2
lda ytankstable,x
sta ytraj+1
lda #$00
sta ytraj+2
; correction of the starting coordinates of bullet
; set the starting coordinates of bullet with correction
; to start where the tank's barrel ends
; (without it bullet would go from the left lower corner of the tank)
ldy Angle
clc
lda xtraj+1
adc EndOfTheBarrelX,y ; correction of X
;ldx TankNr
ldy Angle
clc
lda xtankstableL,x
adc EndOfTheBarrelX,y ; correction of X
sta xtraj+1
lda xtraj+2
adc #0
lda xtankstableH,x
adc #$00
sta xtraj+2
sec
lda ytraj+1
sbc EndOfTheBarrelY,y ; correction of Y
sec
lda ytankstable,x
sbc EndOfTheBarrelY,y ; correction of Y
sta ytraj+1
lda ytraj+2
sbc #0
lda #$00
sbc #$00
sta ytraj+2
jsr Flight
@@ -1506,7 +1511,8 @@ ThereWasNoParachute
.endp
;--------------------------------------------------
.proc Flight ; Force(byte.byte), Angle(byte), Wind(.byte) 128=0, 255=maxright, 0=maxleft
.proc Flight ; Force(byte.byte), Wind(0.word)
; Angle(byte) 128=0, 255=maxright, 0=maxleft
;--------------------------------------------------
;g=-0.1
;vx=Force*sin(Angle)
@@ -1536,9 +1542,9 @@ RepeatIfSmokeTracer
mva #%01000000 drawFunction
lda #0
sta Result
sta Result+1
sta Result+2
sta vx
sta vx+1
sta vx+2
sta HitFlag
sta xdraw
sta xdraw+1
@@ -1559,7 +1565,7 @@ RepeatIfSmokeTracer
;255-90 (165) horizontally left
bpl FlightRight
;and if the highest bit is set then
;Flight to LEFT
;calculate Angle with this formula:
@@ -1568,24 +1574,23 @@ RepeatIfSmokeTracer
sec
txa
sbc #165 ;(Angle-165)
sta temp ;dirty trick with selfmodifying code (REMOVED)
lda #90 ;
sta temp
lda #90
sbc temp ;90-(Angle-165)
;and we have rady angle here ... and we go LEFT!
tax
sta Angle
mva #1 goleft
; and now we contine as if nothing happened
; (but we have goleft set to 1!!!)
bne dontzerogoleft
mva #1 goleft
bne @+
FlightRight
mva #0 goleft
dontzerogoleft
@
lda sintable,x ;sin(Angle)
sta Multiplee ;sin(Angle)*Force
sta Multiplee ;sin(Angle)*Force
mwa Force Multiplier
lda #$0
sta Multiplier+2
@@ -1595,14 +1600,14 @@ MultiplyLoop
bcc DoNotAdd
clc
lda Multiplier
adc Result
sta Result
adc vx
sta vx
lda Multiplier+1
adc Result+1
sta Result+1
adc vx+1
sta vx+1
lda Multiplier+2
adc Result+2
sta Result+2
adc vx+2
sta vx+2
DoNotAdd
;clc ;carry always cleared here (anyway we hope so :)
rol Multiplier
@@ -1610,21 +1615,24 @@ DoNotAdd
rol Multiplier+2
dex
bne MultiplyLoop
; here in Result there is a number xxxx.yyy = sin(Angle)*Force
lda Result ;vx=sin(Angle)*Force
sta vx
lda Result+1
sta vx+1
lda Result+2
sta vx+2
mva #0 vx+3
; here in vx there is a number
; xxxx.xx00 = sin(Angle)*Force
; negate it if going left
lda goleft
beq @+
.rept 4
lda #$00
sbc vx+#
sta vx+#
.endr
@
;======vy
lda #0 ;cos(Angle)
sta Result
sta Result+1
sta Result+2
sta vy
sta vy+1
sta vy+2
;--
lda #90
sec
@@ -1642,14 +1650,14 @@ MultiplyLoopY
bcc DoNotAddY
clc
lda Multiplier
adc Result
sta Result
adc vy
sta vy
lda Multiplier+1
adc Result+1
sta Result+1
adc vy+1
sta vy+1
lda Multiplier+2
adc Result+2
sta Result+2
adc vy+2
sta vy+2
DoNotAddY
;clc ;carry always cleared here (anyway we hope so :)
rol Multiplier
@@ -1657,15 +1665,10 @@ DoNotAddY
rol Multiplier+2
dex
bne MultiplyLoopY
; here in Result there is a number xxxx.yyy=cos(Angle)*Force
; here in vy there is a number
; yyyy.yy=cos(Angle)*Force
lda Result ;vy=cos(Angle)*Force
sta vy
lda Result+1
sta vy+1
lda Result+2
sta vy+2
mva #0 vy+3
mva #0 vy+3 ;vy=cos(Angle)*Force
Loopi
;ytraj=ytraj-vy (skipping least significant byte of vy)
@@ -1699,8 +1702,7 @@ Loopi
cmp #6 ; MIRV
jeq MIRVdownLoop
StillUp
lda goleft
bne FlightLeft
clc ;xtraj=xtraj+vx (skipping least significant byte of vx)
lda xtraj ;here of course Fight to right
@@ -1712,66 +1714,13 @@ StillUp
lda xtraj+2
adc vx+3
sta xtraj+2
jmp @+ ;skipping substracting for Flight to left
FlightLeft
sec ;xtraj=xtraj-vx (skipping least significant byte of vx)
lda xtraj ;here of course Fight to left
sbc vx+1
sta xtraj
lda xtraj+1
sbc vx+2
sta xtraj+1
lda xtraj+2
sbc vx+3
sta xtraj+2
@
;vx=vx-Wind (also without least significan byte of vx)
lda goleft
bne FlightsLeft ;blow on bullet flighting left
lda WindOrientation
bne LWindToRight
beq LWindToLeft
FlightsLeft
lda WindOrientation
beq LWindToRight
LWindToLeft
; here Wind to right, bullet goes right as well, so vx=vx+Wind
; here Wind to left, bullet goes left as well, so vx=vx+Wind
clc
lda vx
adc Wind
sta vx
lda vx+1
adc Wind+1
sta vx+1
lda vx+2
adc #0
sta vx+2
lda vx+3
adc #0
sta vx+3
jmp @+
LWindToRight
;Wind to left, bullet right, so vx=vx-Wind
;Wind to right, bullet left, so vx=vx-Wind
sec
lda vx
sbc Wind
sta vx
lda vx+1
sbc Wind+1
sta vx+1
lda vx+2
sbc #0
sta vx+2
lda vx+3
sbc #0
sta vx+3
@
.rept 4
lda vx+#
adc Wind+#
sta vx+#
.endr
mwa xtrajold+1 xdraw
mwa ytrajold+1 ydraw
mwa xtraj+1 xbyte
@@ -1792,7 +1741,7 @@ nowait
lda HitFlag
bne Hit
cpw ytraj+1 #screenheight
cpw ytraj+1 #screenheight+1
bcc YTrayLowerThanScreenHeight
lda ytraj+2
bpl EndOfFlight
@@ -1820,12 +1769,12 @@ Hit
jsr unPlot
EndOfFlight
mwa xdraw xcircle ; we must store for a little while
mva ydraw ycircle ; xdraw and ydraw .... but this values are in YHit and XHit !!!
mwa ydraw ycircle ; xdraw and ydraw .... but this values are in YHit and XHit !!!
mwa #0 xdraw
mva #screenheight-1 ydraw
mwa #screenheight-1 ydraw
jsr unPlot
mwa xcircle xdraw
mva ycircle ydraw
mwa ycircle ydraw
; mwa XHit xdraw
; mva YHit ydraw
@@ -1839,7 +1788,7 @@ EndOfFlight2
rts
.endp
SecondFlight .proc
.proc SecondFlight
; ---------------- copied code fragment from before firing. not too elegant.
; ---------------- get fire parameters again
ldx TankNr
@@ -1890,7 +1839,7 @@ SecondFlight .proc
.endp
; -------------------------------------------------
MIRVdownLoop .proc
.proc MIRVdownLoop
; MIRV loop - here mirv bullets fall down
; -------------------------------------------------
; copy Flight parameters to the table
@@ -2011,8 +1960,6 @@ MIRVdoNotChangeY
lda MirvDown,x ; if bullet is already down we go with the next one
jne MIRVnextBullet
lda goleft
bne mrFlightLeft
clc ;xtraj=xtraj+vx (skipping the least significant byte of vx)
lda xtraj00,x ;and here of course Flight to the right
@@ -2024,104 +1971,90 @@ MIRVdoNotChangeY
lda xtraj02,x
adc vx03,x
sta xtraj02,x
jmp mrskip07 ;skip substracting for Flight to the left
mrFlightLeft
sec ;xtraj=xtraj-vx (skipping the least significant byte of vx)
lda xtraj00,x ;here of course Flight to the left
sbc vx01,x
sta xtraj00,x
lda xtraj01,x
sbc vx02,x
sta xtraj01,x
lda xtraj02,x
sbc vx03,x
sta xtraj02,x
;vx=vx+Wind
mrskip07
;vx=vx-Wind (also without least significan byte of vx)
lda goleft
bne mrFlightsLeft ;blow on bullet flighting left
lda WindOrientation
bne mrWindToLeft
beq mrLWindToLeft
mrFlightsLeft
lda WindOrientation
beq mrLWindToRight
mrLWindToLeft
; here Wind to right, bullet goes right as well, so vx=vx+Wind
; here Wind to left, bullet goes left as well, so vx=vx+Wind
clc
lda vx00,x
adc Wind
sta vx00,x
lda vx01,x
adc Wind+1
sta vx01,x
lda vx02,x
adc #0
sta vx02,x
lda vx03,x
adc #0
sta vx03,x
Jmp mrskip08
mrWindToLeft
mrLWindToRight
;Wind to left, bullet right, so vx=vx-Wind
;Wind to right, bullet left, so vx=vx-Wind
sec
lda vx00,x
sbc Wind
sta vx00,x
lda vx01,x
sbc Wind+1
sta vx01,x
lda vx02,x
sbc #0
sta vx02,x
lda vx03,x
sbc #0
sta vx03,x
mrskip08
.rept 4
lda vx+#
adc Wind+#
sta vx+#
.endr
; isn't it over the screen????
lda ytraj+2 ;attention! this checks getting out of the screen through bottom
bmi MIRVcheckX ;but not that accurately....
lda ytraj+1
cmp #screenheight
jcs mrEndOfFlight ; if smaller than screenheight then continue (and it will always fall down...)
MIRVcheckX
lda xtraj02,x
; rules for a falling MIRV bulets.
; if Y is negative and any X (bullet over the screen) - continue flying
; if (Y>=0 and Y<=screenhight) and X>screenwidth (bullet off-screen on the left or right side) - continue flying
; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision
; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit
; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit)
; check bullet position and set flags:
; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen)
; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen)
lda #$00
sta XposFlag
sta YposFlag
lda ytraj+2 ; Y high byte
bpl @+
mva #%10000000 YposFlag ; bullet over the screen (Y)
bmi MIRVsetXflag
@
lda ytraj+1 ; Y low byte
cmp #screenheight
bcc MIRVsetXflag ; bullet on screen (Y)
mva #%01000000 YposFlag ; bullet under the screen (Y)
MIRVsetXflag
lda xtraj02,x ; X high byte
cmp #>screenwidth
beq MIRVcheckLowerX
bcc MIRVcheckCollision
; it's over the screen horizontally (to the left or right)
mwa #0 xdraw
mva #screenheight-1 ydraw
jsr unPlot.unPlotAfterX
jmp mrLoopi
MIRVcheckLowerX
lda xtraj01,x
bne @+
lda xtraj01,x ; X low byte
cmp #<screenwidth
bcc MIRVcheckCollision
; it's over the screen horizontally (to the left or right)
@
bcc MIRVXonscreen
mva #%10000000 XposFlag ; bullet off-screen (X)
MIRVXonscreen
; X and Y position flags sets
; then realize rules
lda YposFlag
jmi MIRVcontinueFly ; Y over the screen
bne MIRVYunderscreen ; Y under the screen
; Y on screen
bit XposFlag
jmi MIRVcontinueFly ; Y on screen and X off-screen
jpl MIRVcheckCollision ; X and Y on screen
MIRVYunderscreen
bit XposFlag
jpl MIRVcheckCollision ; X on screen and Y under screen
; Y under screen and X off-screen
; stop flying
jmi mrEndOfFlight
MIRVcontinueFly
mwa #0 xdraw
mva #screenheight-1 ydraw
mwa #screenheight-1 ydraw
bit XposFlag
bmi @+ ; no pixels to plot
; plot bullets over the screen
mwa #0 ydraw
;mwa xtraj01 xdraw
lda xtraj01,x
sta xdraw
lda xtraj02,x
sta xdraw+1
@
jsr unPlot.unPlotAfterX
jmp mrLoopi
MIRVcheckCollision
; checking the collision!
lda ytraj+2
bne mrSkipCollisionCheck
; checking works only with xtraj so copy there all we need
; checking works only with xdraw and ydraw so copy there all we need
lda xtraj01,x
sta xtraj+1
sta xdraw
lda xtraj02,x
sta xtraj+2
sta xdraw+1
mwa ytraj+1 ydraw
mva #0 HitFlag
jsr CheckCollisionWithTank
ldx MirvMissileCounter
@@ -2139,13 +2072,10 @@ MIRVcheckCollision
ldy #0
lda ytraj+1
cmp (temp),y
cmp (temp),y ; check collision witch mountains
bcs mrHit
mrSkipCollisionCheck
;mwa xtraj01 xdraw
lda xtraj01,x
sta xdraw
@@ -2183,10 +2113,11 @@ mrHit
sta ydraw
sty ydraw+1 ;we know that y=0
jsr missile ; explode ....
mrEndOfFlight
ldx MirvMissileCounter
mwa #0 xdraw
mva #screenheight-1 ydraw
mwa #screenheight-1 ydraw
jsr unPlot.unPlotAfterX
ldx MirvMissileCounter
lda #1
@@ -2204,13 +2135,13 @@ MIRVstillNotAll
jmp mrLoopi
MIRValreadyAll
mwa xdraw xcircle ; we must store them (for a while)
mva ydraw ycircle ; xdraw and ydraw
mwa ydraw ycircle ; xdraw and ydraw
mwa #0 xdraw
mva #screenheight-1 ydraw
mwa #screenheight-1 ydraw
ldx MirvMissileCounter
jsr unPlot.unPlotAfterX
mwa xcircle xdraw
mva ycircle ydraw
mwa ycircle ydraw
; we must do it manually because of the VOID pointer
@@ -2232,16 +2163,24 @@ MIRValreadyAll
.endp
; -------------------------------------------------
CheckCollisionWithTank .proc
.proc CheckCollisionWithTank
; -------------------------------------------------
; Check collision with Tank :)
; xdraw , ydraw - coordinates of the checked point
; results:
; HitFlag - 1 - hit, 0 - no hit
; XHit , YHit - coordinates of hit
; X - index of the hit tank
ldx #0
CheckCollisionWithTankLoop
lda eXistenZ,x
beq DeadTank
lda xtankstableH,x
cmp xtraj+2
cmp xdraw+1
bne Condition01
lda xtankstableL,x
cmp xtraj+1
cmp xdraw
Condition01
bcs LeftFromTheTank ;add 8 double byte
clc
@@ -2249,26 +2188,27 @@ Condition01
tay
lda xtankstableH,x
adc #0
cmp xtraj+2
cmp xdraw+1
bne Condition02
cpy xtraj+1
cpy xdraw
Condition02
bcc RightFromTheTank
lda ytankstable,x
cmp ytraj+1 ; check range
cmp ydraw ; check range
bcc BelowTheTank ;(ytankstable,ytankstable+3)
sbc #4
cmp ytraj+1
cmp ydraw
bcs OverTheTank
mva #1 HitFlag
mwa xtraj+1 XHit
mwa ytraj+1 YHit
mwa xdraw XHit
mwa ydraw YHit
rts ; in X there is an index of the hit tank
RightFromTheTank
LeftFromTheTank
OverTheTank
BelowTheTank
DeadTank
inx
cpx NumberOfPlayers
bne CheckCollisionWithTankLoop
@@ -2320,7 +2260,7 @@ RangesChecked
.endp
;--------------------------------------------------
DecreaseWeaponBeforeShoot .proc
.proc DecreaseWeaponBeforeShoot
;--------------------------------------------------
ldx TankNr
lda ActiveWeapon,x
@@ -2342,26 +2282,28 @@ DecreaseWeaponBeforeShoot .proc
.endp
;--------------------------------------------------
DecreaseWeapon .proc
.proc DecreaseWeapon
; in: A: Weapon number, TankNr
; out: A: number of shells left, Y: weapon number
; decreases 1 bullet from a weapon(A) of tank(TankNr)
;--------------------------------------------------
jsr HowManyBullets
beq noBullets ; no bullets - no decreasing (additional check)
cpy #0
beq defaultWeapon ; no decreasing Baby Missile
sec
sbc #1
sta (weaponPointer),y ; we have good values after HowManyBullets
defaultWeapon
noBullets
rts
.endp
;--------------------------------------------------
HowManyBullets .proc
.proc HowManyBullets
; in: A <-- Weapon number, TankNr
; out: A <-- How many bullets in the weapon, Y: weapon number
; how many bullets weapon of tank(TankNr) has, Result w A
; how many bullets weapon of tank(TankNr) has, Result in A
;--------------------------------------------------
tay
ldx TankNr
@@ -2375,7 +2317,7 @@ HowManyBullets .proc
.endp
;--------------------------------------------------
ShellDelay .proc
.proc ShellDelay
lda CONSOL
cmp #6
beq noShellDelay