Merge pull request #162 from pkali/develop

Develop me baby
This commit is contained in:
2023-05-21 10:09:47 -04:00
committed by GitHub
46 changed files with 8925 additions and 6639 deletions
+2 -4
View File
@@ -1,7 +1,5 @@
.project .project
*.bak *.bak
scorch.lab *.lab
scorch.lst *.lst
textproc.lab
textproc.lst
artwork/talk.as_ artwork/talk.as_
@@ -113,11 +113,6 @@ OptionsTitle
dta d" scorch "* dta d" scorch "*
.ELIF TARGET = 5200 .ELIF TARGET = 5200
dta d" scorch supersystem "* dta d" scorch supersystem "*
; dta d" scorch "*
; dta d"5"
; dta d"k"*
; dta d"2"
; dta d" "*
.ENDIF .ENDIF
DifficultyTitle DifficultyTitle
dta d" difficulty "* dta d" difficulty "*
+679
View File
@@ -0,0 +1,679 @@
.IF *>0 ;this is a trick that prevents compiling this file alone
; Basic hardware-dependent graphics routines.
; -----------------------------------------
.proc unPlot
; plots a point and saves the plotted byte, reverts the previous plot.
; -----------------------------------------
ldx #0 ; only one pixel
unPlotAfterX
stx WhichUnPlot
; first remake the oldie
lda oldplotL,x
sta oldplot
lda oldplotH,x
sta oldplot+1
lda oldply,x
tay
lda oldora,x
sta (oldplot),y
; is it not out of the screen ????
cpw ydraw #screenheight
jcc CheckX
mwa #0 ydraw
CheckX
cpw xdraw #screenwidth
jcs EndOfUnPlot
MakeUnPlot
; let's count coordinates taken from xdraw and ydraw
;xbyte = xbyte/8
lda xdraw+1
lsr
lda xdraw
ror ;just one bit over 256. Max screenwidth = 512!!!
lsr
lsr
;---
tay
ldx WhichUnPlot
tya
sta oldply,x
ldx ydraw
lda linetableL,x
sta xbyte
sta oldplot
lda linetableH,x
sta xbyte+1
sta oldplot+1
lda xdraw
and #$7
tax
lda color
bne ClearUnPlot
;plotting here
lda (xbyte),y
sta OldOraTemp
ora bittable,x
sta (xbyte),y
bne ContinueUnPlot ; allways <>0
ClearUnPlot
lda (xbyte),y
sta OldOraTemp
and bittable2,x
sta (xbyte),y
ContinueUnPlot
ldx WhichUnPlot
lda OldOraTemp
sta oldora,x
lda oldplot
sta oldplotL,x
lda oldplot+1
sta oldplotH,x
; and now we must solve the problem of several plots
; in one byte
ldx #4
ldy WhichUnPlot
LetsCheckOverlapping
cpx WhichUnPlot
beq SkipThisPlot
lda oldplotL,x
cmp oldplotL,y
bne NotTheSamePlot
lda oldplotH,x
cmp oldplotH,y
bne NotTheSamePlot
lda oldply,x
cmp oldply,y
bne NotTheSamePlot
; the pixel is in the same byte so let's take correct contents
lda oldora,x
sta oldora,y
NotTheSamePlot
SkipThisPlot
dex
bpl LetsCheckOverlapping
EndOfUnPlot
rts
.endp
; -----------------------------------------
.proc plot ;plot (xdraw, ydraw, color)
; color == 1 --> put pixel
; color == 0 --> erase pixel
; this is one of the most important routines in the whole
; game. If you are going to speed up the game, start with
; plot - it is used by every single effect starting from explosions
; through line drawing and small text output!!!
;
; Optimized by 0xF (Fox) THXXXX!!!
; -----------------------------------------
; is it not over the screen ???
cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
bcs unPlot.EndOfUnPlot ;nearest RTS
CheckX02
cpw xdraw #screenwidth
bcs EndOfPlot
MakePlot
; let's calculate coordinates from xdraw and ydraw
;xbyte = xbyte/8
lda xdraw+1
lsr
lda xdraw
ror ;just one bit over 256. Max screenwidth = 512!!!
lsr
lsr
sta xbyte
;---
ldx ydraw
ldy linetableL,x
lda linetableH,x
sta xbyte+1
lda xdraw
and #$7
tax
lda color
bne ClearPlot
lda (xbyte),y
ora bittable,x
sta (xbyte),y
EndOfPlot
rts
ClearPlot
lda (xbyte),y
and bittable2,x
sta (xbyte),y
rts
.endp
; -----------------------------------------
.proc point_plot
; -----------------------------------------
; checks state of the pixel (coordinates in xdraw and ydraw)
; result is in A (zero or appropriate bit is set)
; let's calculate coordinates from xdraw and ydraw
;xbyte = xbyte/8
lda xdraw+1
lsr
lda xdraw
ror ;just one bit over 256. Max screenwidht = 512!!!
lsr
lsr
sta xbyte
;---
ldx ydraw
ldy linetableL,x
lda linetableH,x
sta xbyte+1
lda xdraw
and #$7
tax
lda (xbyte),y
eor #$ff
and bittable,x
rts
.endp
;--------------------------------------------------
.proc drawmountains
;--------------------------------------------------
mwa #0 xdraw
mwa #mountaintable modify
mva #1 color
drawmountainsloop
ldy #0
lda (modify),y
cmp #screenheight
beq NoMountain
sta ydraw
sty ydraw+1
.IF FASTER_GRAF_PROCS = 1
; there was Drawline proc
lda #screenheight
sec
sbc ydraw
sta tempbyte01
jsr plot.MakePlot
; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit)
; jmp IntoDraw ; jumps inside Draw routine
; because one pixel is already plotted (and who cares? :) )
@
lda (xbyte),y
and bittable2,x
sta (xbyte),y
;IntoDraw
adw xbyte #screenBytes
dec tempbyte01
bne @-
; end of Drawline proc
.ELSE
; there was Drawline proc
drawline
jsr plot.MakePlot
inc ydraw
lda ydraw
cmp #screenheight
bne drawline
; end of Drawline proc
.ENDIF
NoMountain
inw modify
inw xdraw
cpw xdraw #screenwidth
bne drawmountainsloop
rts
.endp
;--------------------------------------------------
.proc TypeChar
; puts char on the graphics screen
; in: CharCode
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
;--------------------------------------------------
; char to the table
lda CharCode
sta fontind
lda #$00
sta fontind+1
; char intex times 8
aslw fontind
rolw fontind
rolw fontind
adw fontind #TankFont
; and 8 bytes to the table
ldy #7
CopyChar
lda (fontind),y
eor #$ff
sta char1,y
lda #$ff
sta char2,y
dey
bpl CopyChar
; and 8 subsequent bytes as a mask
adw fontind #8
ldy #7
CopyMask
lda (fontind),y
eor #$ff
sta mask1,y
lda #$00
sta mask2,y
dey
bpl CopyMask
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa xdraw xbyte
lda xbyte
and #$7
sta ybit
lsrw xbyte ; div 8
rorw xbyte
rorw xbyte
;---
ldy xbyte
lda ydraw ; y = y - 7 because left lower. shouldn't it be 8?
sec
sbc #7
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK00
MakeMask00
.rept 8
lsr mask1+#
ror mask2+#
.endr
sec
.rept 8
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask00
MaskOK00
; here x=0
lda Erase
beq CharLoopi ; it works, because x=0
lda #$ff
ldx #7
EmptyChar
sta char1,x
sta char2,x
dex
bpl EmptyChar
ldx #0
CharLoopi
lda (xbyte),y
ora mask1,x
and char1,x
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
and char2,x
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #8
bne CharLoopi
.ELSE
mvx #7 temp ; line counter (Y)
CharLoop1
mva #7 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda Erase
bne ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #8
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
clc
lda ydraw
adc #8
sta ydraw
bne EndPutChar
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPutChar
rts
.endp
;--------------------------------------------------
.proc PutChar4x4
; puts 4x4 pixels char on the graphics screen
; in: dx, dy (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/255)
; all pixels are being drawn
; (empty and not empty)
;--------------------------------------------------
cpw dy #(screenheight-1)
jcs TypeChar.EndPutChar ;nearest RTS
cpw dy #(4)
jcc TypeChar.EndPutChar ;nearest RTS
cpw dx #(screenwidth-4)
jcs TypeChar.EndPutChar ;nearest RTS
; checks ommited.
; char to the table
lda CharCode4x4
and #%00000001
beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits
sta nibbler4x4
lda CharCode4x4
lsr
sta fontind
lda #$00
sta fontind+1
adw fontind #font4x4
; and 4 bytes to the table
ldy #0
ldx #3
CopyChar
lda (fontind),y ; Y must be 0 !!!!
bit nibbler4x4
bpl GetUpper4bits
:4 rol
GetUpper4bits
ora #$0f
sta char1,x
lda #$ff
sta char2,x
; and 4 bytes as a mask
lda #$f0
sta mask1,x
lda #$00
sta mask2,x
adw fontind #32 ; next byte of 4x4 font
dex
bpl CopyChar
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa dx xbyte
lda xbyte
and #$7
sta ybit
:3 lsrw xbyte ; div 8
; rorw xbyte
; rorw xbyte
;---
ldy xbyte ; horizontal byte offet stored in Y
lda dy ; y = y - 3 because left lower.
sec
sbc #3
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK01
MakeMask01
.rept 4
lsr mask1+#
ror mask2+#
.endr
sec
.rept 4
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask01
MaskOK01
ldx #0
CharLoopi4x4
lda (xbyte),y
ora mask1,x
bit plot4x4color
bpl PutInColor0_1 ; only mask - no char
and char1,x
PutInColor0_1
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
bit plot4x4color
bpl PutInColor0_2 ; only mask - no char
and char2,x
PutInColor0_2
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #4
bne CharLoopi4x4
.ELSE
mwa xdraw char2
mwa ydraw mask2
mva color mask2+2
mwa dx xdraw
mwa dy ydraw
mvx #3 temp ; line counter (Y)
CharLoop1
mva #3 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda plot4x4color
beq ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #4
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
mwa char2 xdraw
mwa mask2 ydraw
mva mask2+2 color
bpl EndPut4x4
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPut4x4
rts
.endp
;--------------------------------------------------
.proc ClearScreen
;--------------------------------------------------
mwa #display temp
ldy #0
@ lda #$ff
sta (temp),y
inw temp
cpw temp #display+screenheight*screenBytes+1
bne @-
rts
.endp
;--------------------------------------------------
.proc GenerateLineTable
mwa #display temp
mwa #linetableL temp2
mwa #linetableH modify
ldy #0
@ lda temp
sta (temp2),y
lda temp+1
sta (modify),y
adw temp #40
iny
cpy #screenheight+1
bne @-
rts
.endp
;--------------------------------------------------
.proc SetMainScreen
; mva #0 dmactls
SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen
mwa #dl dlptrs ; issue #72 (glitches when switches)
lda #%00111110
; and #$fc
; ora #$02 ; 2=normal, 3 = wide screen width
sta dmactls
mva WallsType COLBAKS ; set color of background
jmp WaitOneFrame
; rts
.endp
;--------------------------------------------------
; ******* This is weapon .... but ... *******
; -------------------------------------------------
.proc AtomicWinter
; -------------------------------------------------
; This routine is run from inside of the main loop
; and replaces Shoot and Flight routines
; X and TankNr - index of shooting tank
; -------------------------------------------------
mva #sfx_sandhog sfx_effect
.IF FASTER_GRAF_PROCS = 1
ldy #0 ; byte counter (from 0 to 39)
NextColumn
; big loop - we repat internal loops for each column of bytes
sty magic
ldx #120 ; line counter (from 0 to 60 )
; first loop - inverse column of bytes for a while
ldy magic
NextLine1
jsr InverseScreenByte
dex
dex
bpl NextLine1
;
jsr WaitOneFrame ; wait uses A only
; second loop - inverse again and put random "snow" to column of bytes
ldx #120
ldy magic
mva #$55 magic+1
NextLine2
jsr InverseScreenByte
lda random
ora magic+1
and (temp),y
sta (temp),y
lda magic+1
eor #$ff
sta magic+1
dex
dex
bpl NextLine2
; and go to next column
iny
cpy #40
bne NextColumn
.ELSE
mva #1 color
mwa #120 ydraw
NextLineSlow
lda #0
sta xdraw
sta xdraw+1
NextPixelSlow
bit random
bpl NoPlot
bvc NoPlot
jsr plot.MakePlot
NoPlot
inw xdraw
cpw xdraw #screenwidth
bne NextPixelSlow
dec ydraw
dec ydraw
bpl NextLineSlow
.ENDIF
; and we have "snow" :)
lda #0
ldx TankNr
sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
jsr SetFullScreenSoilRange
jmp SoilDown2.NoClearTanks
; rts
; in order to optimize the fragment repeated in both internal loops
; we save 15 bytes :)
InverseScreenByte
lda LineTableL,x
sta temp
lda LineTableH,x
sta temp+1
lda (temp),y
eor #$ff
sta (temp),y
rts
.endp
.ENDIF
+9 -9
View File
@@ -170,7 +170,15 @@ nextlinedisplay
; bne EndOfCreditsVBI ; bne EndOfCreditsVBI
mwa #Credits DLCreditsAddr mwa #Credits DLCreditsAddr
EndOfCreditsVBI EndOfCreditsVBI
.IF TARGET = 5200 .IF TARGET = 800
; support for joysticks :)
ldx JoystickNumber
lda STICK0,x
sta STICK0
lda STRIG0,x
sta STRIG0
jmp XITVBV
.ELIF TARGET = 5200
lda SkStatSimulator lda SkStatSimulator
bmi @+ bmi @+
inc SkStatSimulator inc SkStatSimulator
@@ -225,14 +233,6 @@ EndOfCreditsVBI
tax tax
pla pla
rti rti
.ELSE
; support for joysticks :)
ldx JoystickNumber
lda STICK0,x
sta STICK0
lda STRIG0,x
sta STRIG0
jmp XITVBV
.ENDIF .ENDIF
.endp .endp
.IF TARGET = 5200 .IF TARGET = 5200
+107 -323
View File
@@ -58,7 +58,6 @@
jsr drawtanks ;finally draw tanks jsr drawtanks ;finally draw tanks
pla pla
sta NumberOfPlayers sta NumberOfPlayers
; --------
mva #0 OptionsY mva #0 OptionsY
@@ -122,6 +121,7 @@ OptionsNoReturn
OptionsNoTab OptionsNoTab
jmp OptionsMainLoop jmp OptionsMainLoop
.endp .endp
.proc SelectNextGradient .proc SelectNextGradient
lda OptionsY ; if "Wind" option selected lda OptionsY ; if "Wind" option selected
cmp #$03 cmp #$03
@@ -144,6 +144,7 @@ NoGradientLoop
sta GradientColors+1 sta GradientColors+1
rts rts
.endp .endp
;-------- ;--------
; inversing selected option (cursor) ; inversing selected option (cursor)
;-------- ;--------
@@ -154,7 +155,7 @@ optionWidth = 6
nameWidth = 10 nameWidth = 10
mwa #OptionsHere temp ; offset of the first option=11 mwa #OptionsHere temp ; offset of the first option=11
mva #0 YPos ;option number pointer mva #0 YPos ;option number pointer
mva #0 Xpos ;X position in the menu sta Xpos ;X position in the menu
tay ; Y is zero here... tay ; Y is zero here...
OptionsSetMainLoop OptionsSetMainLoop
ldx YPos ; Y position in the menu ldx YPos ; Y position in the menu
@@ -204,69 +205,10 @@ invertme
rts rts
.endp .endp
; -------------------------------------- .proc CallPurchaseForEveryTank
; Sets the appropriate variables based on the options table
;
.proc SetVariablesFromOptions
;first option
ldy OptionsTable
iny
iny
sty NumberOfPlayers ;1=1 player (but minimum is 2)
;second option (cash)
ldy OptionsTable+1
ldx #0
@
lda CashOptionL,y
sta moneyL,x
lda CashOptionH,y
sta moneyH,x
inx
cpx NumberOfPlayers
bne @-
;third option (gravity)
ldy OptionsTable+2
lda GravityTable,y
sta gravity
;fourth option (wind)
ldy OptionsTable+3
lda MaxWindTable,y
sta MaxWind
;fifth option (no of rounds)
ldy OptionsTable+4
lda RoundsTable,y
sta RoundsInTheGame
;6th option (shell speed)
ldy OptionsTable+5
lda flyDelayTable,y
sta flyDelay
;7th option (Airstrike after how many missess)
ldy OptionsTable+6
lda seppukuTable,y
sta seppukuVal
;8th option (how aggressive are mountains)
ldy OptionsTable+7
lda mountainsDeltaTableH,y
sta mountainDeltaH
lda mountainsDeltaTableL,y
sta mountainDeltaL
rts
.endp
;------------------------------------------- ;-------------------------------------------
; call of the purchase (and activate) screens for each tank ; call of the purchase (and activate) screens for each tank
.proc CallPurchaseForEveryTank ;-------------------------------------------
mva #0 TankNr mva #0 TankNr
sta isInventory sta isInventory
@@ -406,7 +348,7 @@ AfterPurchase
cmp IndexesOfWeaponsL1,y cmp IndexesOfWeaponsL1,y
beq ?weaponfound beq ?weaponfound
iny iny
cpy #(last_offensive_____ - first_offensive____)+1 ; maxOffensiveWeapons cpy #(last_offensive - first_offensive )+1 ; maxOffensiveWeapons
bne @- bne @-
; not found apparently? ; not found apparently?
; TODO: check border case (the last weapon) ; TODO: check border case (the last weapon)
@@ -541,7 +483,7 @@ DeffensiveSelected
jmp ChoosingItemForPurchase jmp ChoosingItemForPurchase
.endp .endp
;
;-------------------------------------------------- ;--------------------------------------------------
.proc CreateList .proc CreateList
;-------------------------------------------------- ;--------------------------------------------------
@@ -697,7 +639,7 @@ notInventory
NotTheSameAsLastTime NotTheSameAsLastTime
; increase appropriate counter ; increase appropriate counter
txa txa
cpx #last_offensive_____+1 cpx #last_offensive +1
bcs DefenceList bcs DefenceList
ldy HowManyOnTheListOff ldy HowManyOnTheListOff
sta IndexesOfWeaponsL1,y sta IndexesOfWeaponsL1,y
@@ -715,14 +657,14 @@ NoWeapon
; next weapon. If no more weapons then finish! ; next weapon. If no more weapons then finish!
inx inx
cpx #last_offensive_____+1 cpx #last_offensive +1
bne NoDefense bne NoDefense
; if we got to the defense weapons, ; if we got to the defense weapons,
; we switch address to the second table. ; we switch address to the second table.
mwa #ListOfDefensiveWeapons xbyte mwa #ListOfDefensiveWeapons xbyte
NoDefense NoDefense
cpx #last_defensive_____+1 cpx #last_defensive +1
jne CreateList jne CreateList
@@ -835,7 +777,7 @@ positiveMoney
; but if we purchasing "Buy me!" then we must draw the winning weapon. ; but if we purchasing "Buy me!" then we must draw the winning weapon.
cpy #ind_Buy_me_________ cpy #ind_Buy_me
bne NoSuprise bne NoSuprise
Suprise ; get a random weapon Suprise ; get a random weapon
@@ -843,13 +785,13 @@ Suprise ; get a random weapon
cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1) cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1)
bcc GetRandomDefensive bcc GetRandomDefensive
GetRandomOffensive GetRandomOffensive
randomize ind_Missile________ last_offensive_____ randomize ind_Missile last_offensive
;cmp #ind_Buy_me_________ ; buy me do not buy buy me :) ;cmp #ind_Buy_me ; buy me do not buy buy me :)
;beq GetRandomOffensive ;beq GetRandomOffensive
tay tay
bne NoSuprise ; Y always <> 0 bne NoSuprise ; Y always <> 0
GetRandomDefensive GetRandomDefensive
randomize ind_Battery________ last_defensive_____ randomize ind_Battery last_defensive
tay tay
; lda WeaponUnits,y ; check if weapon exist ; lda WeaponUnits,y ; check if weapon exist
; beq GetRandomDefensive ; beq GetRandomDefensive
@@ -888,7 +830,7 @@ invSelectDef
lda IndexesOfWeaponsL2,y lda IndexesOfWeaponsL2,y
tay tay
ldx tankNr ldx tankNr
cmp #ind_Battery________ cmp #ind_Battery
bne NotBattery bne NotBattery
; if activate battery, we do it differently ; if activate battery, we do it differently
mva #sfx_battery sfx_effect mva #sfx_battery sfx_effect
@@ -898,38 +840,38 @@ invSelectDef
ply ply
jmp DecreaseDefensive ; bypass activation jmp DecreaseDefensive ; bypass activation
NotBattery NotBattery
cmp #ind_Auto_Defense___ cmp #ind_Auto_Defense
bne NoAutoDefense bne NoAutoDefense
; Auto Defense - do it like battery ; Auto Defense - do it like battery
mva #sfx_auto_defense sfx_effect mva #sfx_auto_defense sfx_effect
mva #$A1 AutoDefenseFlag,x ; this is "A" in inverse - for status line :) mva #$A1 AutoDefenseFlag,x ; this is "A" in inverse - for status line :)
jmp DecreaseDefensive ; bypass activation jmp DecreaseDefensive ; bypass activation
NoAutoDefense NoAutoDefense
cmp #ind_Lazy_Boy_______ cmp #ind_Lazy_Boy
bne NoLazyBoy bne NoLazyBoy
; Lazy Boy - do it like battery ; Lazy Boy - do it like battery
mva #%01000000 LazyFlag mva #%01000000 LazyFlag
jmp DecreaseDefensive ; bypass activation jmp DecreaseDefensive ; bypass activation
NoLazyBoy NoLazyBoy
cmp #ind_Lazy_Darwin____ cmp #ind_Lazy_Darwin
bne NoLazyDarwin bne NoLazyDarwin
; Lazy Darwin - do it like battery ; Lazy Darwin - do it like battery
mva #%11000000 LazyFlag mva #%11000000 LazyFlag
jmp DecreaseDefensive ; bypass activation jmp DecreaseDefensive ; bypass activation
NoLazyDarwin NoLazyDarwin
cmp #ind_Spy_Hard_______ cmp #ind_Spy_Hard
bne NotSpy bne NotSpy
mva #$ff SpyHardFlag mva #$ff SpyHardFlag
jmp DecreaseDefensive ; bypass activation jmp DecreaseDefensive ; bypass activation
NotSpy NotSpy
cmp #ind_Long_Barrel____ cmp #ind_Long_Barrel
bne NotBarrel bne NotBarrel
; if activate long barrel, we do it differently too ; if activate long barrel, we do it differently too
mva #sfx_long_barrel sfx_effect mva #sfx_long_barrel sfx_effect
mva #LongBarrel BarrelLength,x mva #LongBarrel BarrelLength,x
bne DecreaseDefensive ; bypass activation bne DecreaseDefensive ; bypass activation
NotBarrel NotBarrel
cmp #ind_White_Flag_____ cmp #ind_White_Flag
bne NotWhiteFlag bne NotWhiteFlag
cmp ActiveDefenceWeapon,x cmp ActiveDefenceWeapon,x
bne NoDeactivateWhiteFlag bne NoDeactivateWhiteFlag
@@ -958,11 +900,12 @@ DecreaseDefensive
DefActivationEnd DefActivationEnd
jmp WaitForKeyRelease ; rts jmp WaitForKeyRelease ; rts
.endp .endp
; -----------------------------------------------------
;--------------------------------------------------
.proc calcPosDefensive .proc calcPosDefensive
; calculate positionOnTheList from the activeWeapon (defensives) ; calculate positionOnTheList from the activeWeapon (defensives)
;--------------------------------------------------
ldx tankNr ldx tankNr
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
beq ?noWeaponActive beq ?noWeaponActive
@@ -971,7 +914,7 @@ DefActivationEnd
cmp IndexesOfWeaponsL2,y cmp IndexesOfWeaponsL2,y
beq ?weaponfound beq ?weaponfound
iny iny
cpy #(last_defensive_____ - first_defensive____)+1 ; maxDefensiveWeapon cpy #(last_defensive - first_defensive )+1 ; maxDefensiveWeapon
bne @- bne @-
; not found apparently? ; not found apparently?
; TODO: check border case (the last weapon) ; TODO: check border case (the last weapon)
@@ -994,7 +937,7 @@ DefActivationEnd
cmp IndexesOfWeaponsL1,y cmp IndexesOfWeaponsL1,y
beq ?weaponfound beq ?weaponfound
iny iny
cpy #(last_offensive_____ - first_offensive____) ; maxOffensiveWeapon cpy #(last_offensive - first_offensive ) ; maxOffensiveWeapon
bne @- bne @-
; not found apparently? ; not found apparently?
; TODO: check border case (the last weapon) ; TODO: check border case (the last weapon)
@@ -1006,11 +949,13 @@ DefActivationEnd
sty positionOnTheList sty positionOnTheList
rts rts
.endp .endp
; -----------------------------------------------------
;--------------------------------------------------
.proc PutLitteChar .proc PutLitteChar
;--------------------------------------------------
; first let's clear both lists from little chars ; first let's clear both lists from little chars
mwa #ListOfWeapons xbyte mwa #ListOfWeapons xbyte
ldx #last_defensive_____ ; there are xx lines total ldx #last_defensive ; there are xx lines total
ldy #$00 ldy #$00
EraseLoop EraseLoop
tya ; lda #$00 tya ; lda #$00
@@ -1027,10 +972,10 @@ EraseLoop
mwa #ListOfDefensiveWeapons xbyte mwa #ListOfDefensiveWeapons xbyte
ldx PositionOnTheList ldx PositionOnTheList
beq SelectList2 ; if there is 0 we add nothing beq SelectList2 ; if there is 0 we add nothing
AddLoop2 @
adw xbyte #32 ; narrow screen adw xbyte #32 ; narrow screen
dex dex
bne AddLoop2 bne @-
SelectList2 SelectList2
lda #$7f ; little char (tab) - this is the pointer lda #$7f ; little char (tab) - this is the pointer
sta (xbyte),y sta (xbyte),y
@@ -1048,10 +993,10 @@ CharToList1
mwa #ListOfWeapons xbyte mwa #ListOfWeapons xbyte
ldx PositionOnTheList ldx PositionOnTheList
beq SelectList1 ; if there is 0 we add nothing beq SelectList1 ; if there is 0 we add nothing
AddLoop1 @
adw xbyte #32 ; narrow screen adw xbyte #32 ; narrow screen
dex dex
bne AddLoop1 bne @-
SelectList1 SelectList1
lda #$7f ; pointer = little char = (tab) lda #$7f ; pointer = little char = (tab)
sta (xbyte),y sta (xbyte),y
@@ -1059,10 +1004,10 @@ SelectList1
mwa #ListOfWeapons xbyte mwa #ListOfWeapons xbyte
ldx OffsetDL1 ldx OffsetDL1
beq SetWindowList1 ; if zero then add nothing beq SetWindowList1 ; if zero then add nothing
LoopWindow1 @
adw xbyte #32 ; narrow screen adw xbyte #32 ; narrow screen
dex dex
bne LoopWindow1 bne @-
SetWindowList1 SetWindowList1
mwa xbyte WeaponsListDL ; and we change Display List mwa xbyte WeaponsListDL ; and we change Display List
@@ -1135,13 +1080,6 @@ NoArrowDown
lda digits+1,x lda digits+1,x
sta NameScreen2+7 sta NameScreen2+7
; clear tank name editor field - not necessary
; ldx #8
; lda #0
;@ sta NameAdr,x
; dex
; bpl @-
; copy existing name and place cursor at end ; copy existing name and place cursor at end
lda TankNr lda TankNr
:3 asl :3 asl
@@ -1149,7 +1087,6 @@ NoArrowDown
ldy #0 ldy #0
@ lda TanksNames,x @ lda TanksNames,x
; beq endOfTankName
sta NameAdr,y sta NameAdr,y
inx inx
iny iny
@@ -1164,9 +1101,8 @@ endOfTankName
bpl @- bpl @-
LastNameChar LastNameChar
cpy #7 cpy #7
beq @+ seq:iny
iny sty PositionInName
@ sty PositionInName
CheckKeys CheckKeys
jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc) jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc)
@@ -1200,9 +1136,8 @@ YesLetter
sta NameAdr,x sta NameAdr,x
inx inx
cpx #$08 ; is there 8 characters? cpx #$08 ; is there 8 characters?
bne @+ sne:dex
dex stx PositionInName ; if not, we store
@ stx PositionInName ; if not, we store
jmp CheckKeys jmp CheckKeys
.ENDIF .ENDIF
CheckFurtherX01 ; here we check Tab, Return and Del CheckFurtherX01 ; here we check Tab, Return and Del
@@ -1254,34 +1189,23 @@ ChangeOfJoyUp
ChangeOfLevelUp ; change difficulty level of computer opponent ChangeOfLevelUp ; change difficulty level of computer opponent
inc:lda DifficultyLevel inc:lda DifficultyLevel
cmp #9 ; 9 levels are possible cmp #9 ; 9 levels are possible
bne DoNotLoopLevelUp sne:mva #$0 DifficultyLevel ; DoNotLoopLevelUp
mva #$0 DifficultyLevel
DoNotLoopLevelUp
jmp CheckKeys jmp CheckKeys
;---- ;----
ChangeOfLevelDown ChangeOfLevelDown
dec:lda DifficultyLevel dec:lda DifficultyLevel
bpl DoNotLoopLevelDown spl:mva #$8 DifficultyLevel ; DoNotLoopLevelDown
mva #$8 DifficultyLevel
DoNotLoopLevelDown
jmp CheckKeys jmp CheckKeys
;---- ;----
ChangeOfLevel3Up ChangeOfLevel3Up
adb DifficultyLevel #3 adb DifficultyLevel #3
cmp #9 cmp #9
bcc DoNotLoopLevel3Up scc:sbb DifficultyLevel #9 ; DoNotLoopLevel3Up
sbb DifficultyLevel #9
DoNotLoopLevel3Up
jmp CheckKeys jmp CheckKeys
;---- ;----
ChangeOfLevel3Down ChangeOfLevel3Down
sbb DifficultyLevel #3 sbb DifficultyLevel #3
bpl @+ spl:adb DifficultyLevel #9
adb DifficultyLevel #9
@
jmp CheckKeys jmp CheckKeys
;---- ;----
ChangeOfShapeUp ChangeOfShapeUp
@@ -1340,23 +1264,23 @@ NotRobot
beq MakeDefaultName beq MakeDefaultName
ldy #0 ldy #0
nextchar04 @
lda NameAdr,y lda NameAdr,y
and #$7f ; remove inverse (Cursor) and #$7f ; remove inverse (Cursor)
sta tanksnames,x sta tanksnames,x
inx inx
iny iny
cpy #$08 cpy #$08
bne nextchar04 bne @-
rts rts
MakeDefaultName MakeDefaultName
nextchar05 @
lda tanksnamesDefault,x lda tanksnamesDefault,x
sta tanksnames,x sta tanksnames,x
inx inx
iny iny
cpy #$08 cpy #$08
bne nextchar05 bne @-
rts rts
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
@@ -1603,173 +1527,6 @@ displayloop1
rts rts
.endp .endp
;--------------------------------
.proc DisplayResults ;
;displays results of the round
;using 4x4 font
jsr RoundOverSprites
mva #$ff plot4x4color
;centering the result screen
mva #((ScreenHeight/2)-(8*4)) ResultY
;upper frame
mva ResultY LineYdraw
jsr TL4x4_top
adb ResultY #4 ;next line
;Header1
;Displays round number
lda CurrentRoundNr
cmp RoundsInTheGame
beq GameOver4x4
sta decimal
mwa #RoundNrDisplay displayposition
jsr displaybyte ;decimal (byte), displayposition (word)
mwa #LineHeader1 LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw
jsr TypeLine4x4
beq @+ ;unconditional jump, because TypeLine4x4 ends with beq
GameOver4x4
RmtSong song_round_over
mwa #LineGameOver LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw
jsr TypeLine4x4
mva #1 GameIsOver
@
adb ResultY #4 ;next line
;Empty line
mva ResultY LineYdraw
jsr TL4x4_empty
adb ResultY #2 ;next line
;Header2
mwa #LineHeader2 LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw
jsr TypeLine4x4
adb ResultY #4 ;next line
;Empty line
mva ResultY LineYdraw
jsr TL4x4_empty
sbb ResultY #2 ;next line (was empty)
ldx NumberOfPlayers ;we start from the highest (best) tank
dex ;and it is the last one
stx ResultOfTankNr ;in TankSequence table
mwa #TanksNames tempXROLLER
ResultOfTheNextPlayer
ldx ResultOfTankNr ;we are after a round, so we can use TankNr
lda TankSequence,x ;and we keep here real number if the tank
sta TankNr ;for which we are displaying results
adb ResultY #4 ;next line
;there are at least 2 players, so we can safely
;start displaying the result
lda #3 ;it means |
sta ResultLineBuffer
ldy TankNr
lda ResultsTable,y
sta decimal
mva #0 decimal+1
mwa #(ResultLineBuffer+8) displayposition
jsr displaydec5 ;decimal (byte), displayposition (word)
; overwrite the second digit of the points (max 255)
;it means ":"
mva #26 ResultLineBuffer+9
ldx #0
lda TankNr
asl
asl ; times 8, because it is lengtgh
asl ; of the names of the tanks
tay
TankNameCopyLoop
lda (tempXROLLER),y ;XROLLER is not working now
and #$3f ;always CAPITAL letters
inx
sta ResultLineBuffer,x
iny
cpx #8 ; end of name
bne TankNameCopyLoop
; last letter of tank name overwrites first digit of the points (max 255)
;just after the digits
;it means |
mva #$3 ResultLineBuffer+13
;result line display
mwa #ResultLineBuffer LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw
jsr TypeLine4x4
adb ResultY #4 ;next line
;Empty line
mva ResultY LineYdraw
jsr TL4x4_empty
dec ResultOfTankNr
bmi FinishResultDisplay
sbb ResultY #2 ;distance between lines is smaller
jmp ResultOfTheNextPlayer
FinishResultDisplay
mva ResultY LineYdraw
;jmp TL4x4_bottom ; just go
.endp
.proc TL4x4_bottom
;bottom of the frame
mwa #LineBottom LineAddress4x4
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 GameOverScreen .proc GameOverScreen
;-------------------------------------------------- ;--------------------------------------------------
@@ -1853,8 +1610,26 @@ NextChar
adw temp #19 displayposition adw temp #19 displayposition
jsr displaydec5 jsr displaydec5
mva #0 displayposition ; overwrite first digit mva #0 displayposition ; overwrite first digit
; put earned money on the screen ; put AI symbol or joystick
ldx TankNr ldx TankNr
lda SkillTable,x
tay
bne ThisIsAI
ldy JoyNumber,x
iny ; tricky
ThisIsAI
lda digits,y
ldy #39
sta (temp),y ; AI level or joy number
ldy #$0a ; Joystick symbol
lda SkillTable,x
beq NotAItank
ldy #$5e ; Computer symbol
NotAItank
tya
ldy #38
sta (temp),y
; put earned money on the screen
lda EarnedMoneyL,x lda EarnedMoneyL,x
sta decimal sta decimal
lda EarnedMoneyH,x lda EarnedMoneyH,x
@@ -1902,9 +1677,7 @@ AllTanksFloatingDown
lda Ytankstable,x lda Ytankstable,x
cmp #(72-7) ; tank under screen - no erase cmp #(72-7) ; tank under screen - no erase
bcs NoEraseTank bcs NoEraseTank
mva #1 Erase jsr ClearTankNr
jsr DrawTankNr
mva #0 Erase
sta ATRACT ; reset atract mode sta ATRACT ; reset atract mode
NoEraseTank NoEraseTank
ldx TankNr ldx TankNr
@@ -1923,7 +1696,7 @@ NotFastTank
TankUnderScreen TankUnderScreen
jsr RandomizeTankPos jsr RandomizeTankPos
TankOnScreen TankOnScreen
jsr DrawTankNr jsr PutTankNr
DrawOnlyParachute DrawOnlyParachute
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
bne FastTank bne FastTank
@@ -1936,8 +1709,8 @@ FastTank
bne MainTanksFloatingLoop ; neverending loop bne MainTanksFloatingLoop ; neverending loop
mva #$00 ScrollFlag ; credits scroll off mva #$00 ScrollFlag ; credits scroll off
jsr MakeDarkScreen jsr MakeDarkScreen
jsr GameOverResultsClear jmp GameOverResultsClear
rts ; rts
RandomizeTankPos RandomizeTankPos
randomize 10 (32-7) ; 10 not 8 - barrel !! :) randomize 10 (32-7) ; 10 not 8 - barrel !! :)
sta Ytankstable,x sta Ytankstable,x
@@ -2030,20 +1803,49 @@ EndOfCredits
rts rts
.endp .endp
;------------------------------------------------- ;-------------------------------------------------
.proc PutTankNameOnScreen
;-------------------------------------------------
; puts name of the tank on the screen
ldy #$00
; lda TankNr
txa ; TankNr in X !
asl
asl
asl ; 8 chars per name
tax
NextChar02
lda tanksnames,x
sta statusBuffer+7,y
inx
iny
cpy #$08
bne NextChar02
;=========================
; displaying number of active controller port or AI level
;=========================
ldx TankNr
ldy #$5e ; Computer symbol
lda SkillTable,x
tax
bne ThisIsAI
ldy #$0a ; Joystick symbol
ldx JoystickNumber
inx ; tricky
ThisIsAI
sty statusBuffer+16
lda digits,x
sta statusBuffer+17
; rts
.endp
;-------------------------------------------------
.proc DisplayStatus .proc DisplayStatus
;------------------------------------------------- ;-------------------------------------------------
;========================= ldx TankNr
; displaying number of active controller port
;=========================
ldy JoystickNumber
lda digits+1,y
sta statusBuffer+17
;========================= ;=========================
;displaying symbol of the weapon ;displaying symbol of the weapon
;========================= ;=========================
ldx TankNr
ldy ActiveWeapon,x ldy ActiveWeapon,x
lda WeaponSymbols,y lda WeaponSymbols,y
sta statusBuffer+19 sta statusBuffer+19
@@ -2239,24 +2041,6 @@ AngleDisplay
rts rts
.endp .endp
;------------------------------------------------- ;-------------------------------------------------
.proc PutTankNameOnScreen
; puts name of the tank on the screen
ldy #$00
lda TankNr
asl
asl
asl ; 8 chars per name
tax
NextChar02
lda tanksnames,x
sta statusBuffer+7,y
inx
iny
cpy #$08
bne NextChar02
rts
.endp
;-------------------------------------------------
.proc RoundOverSprites .proc RoundOverSprites
; fill sprites with bytes ; fill sprites with bytes
ldy numberOfPlayers ldy numberOfPlayers
+708
View File
@@ -0,0 +1,708 @@
.IF *>0 ;this is a trick that prevents compiling this file alone
; Basic hardware-dependent graphics routines.
; -----------------------------------------
.proc unPlot
; plots a point and saves the plotted byte, reverts the previous plot.
; -----------------------------------------
ldx #0 ; only one pixel
unPlotAfterX
stx WhichUnPlot
; first remake the oldie
lda oldplotL,x
sta oldplot
lda oldplotH,x
sta oldplot+1
ldy #0
lda oldora,x
sta (oldplot),y
; is it not out of the screen ????
cpw ydraw #screenheight
jcc CheckX
mwa #0 ydraw
CheckX
cpw xdraw #screenwidth
jcs EndOfUnPlot
MakeUnPlot
; let's count coordinates taken from xdraw and ydraw
lda xdraw
and #%11111000
;sta xbyte
;---
ldx ydraw
clc
adc linetableL,x
sta xbyte
sta oldplot
lda linetableH,x
adc xdraw+1
sta xbyte+1
sta oldplot+1
lda xdraw
and #$7
tax
ldy #0
lda color
bne ClearUnPlot
;plotting here
lda (xbyte),y
sta OldOraTemp
ora bittable,x
sta (xbyte),y
bne ContinueUnPlot ; allways <>0
ClearUnPlot
lda (xbyte),y
sta OldOraTemp
and bittable2,x
sta (xbyte),y
ContinueUnPlot
ldx WhichUnPlot
lda OldOraTemp
sta oldora,x
lda oldplot
sta oldplotL,x
lda oldplot+1
sta oldplotH,x
; and now we must solve the problem of several plots
; in one byte
ldx #4
ldy WhichUnPlot
LetsCheckOverlapping
cpx WhichUnPlot
beq SkipThisPlot
lda oldplotL,x
cmp oldplotL,y
bne NotTheSamePlot
lda oldplotH,x
cmp oldplotH,y
bne NotTheSamePlot
; the pixel is in the same byte so let's take correct contents
lda oldora,x
sta oldora,y
NotTheSamePlot
SkipThisPlot
dex
bpl LetsCheckOverlapping
EndOfUnPlot
rts
.endp
; -----------------------------------------
.proc plot ;plot (xdraw, ydraw, color)
; color == 1 --> put pixel
; color == 0 --> erase pixel
; this is one of the most important routines in the whole
; game. If you are going to speed up the game, start with
; plot - it is used by every single effect starting from explosions
; through line drawing and small text output!!!
;
; Optimized by 0xF (Fox) THXXXX!!!
; -----------------------------------------
; is it not over the screen ???
cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
bcs unPlot.EndOfUnPlot ;nearest RTS
CheckX02
cpw xdraw #screenwidth
bcs EndOfPlot
MakePlot
; let's calculate coordinates from xdraw and ydraw
lda xdraw
and #%11111000
;sta xbyte
;---
ldx ydraw
clc
adc linetableL,x
sta xbyte
lda linetableH,x
adc xdraw+1
sta xbyte+1
lda xdraw
and #$7
tax
ldy #0
lda color
bne ClearPlot
lda (xbyte),y
ora bittable,x
sta (xbyte),y
EndOfPlot
rts
ClearPlot
lda (xbyte),y
and bittable2,x
sta (xbyte),y
rts
.endp
; -----------------------------------------
.proc point_plot
; -----------------------------------------
; checks state of the pixel (coordinates in xdraw and ydraw)
; result is in A (zero or appropriate bit is set)
; let's calculate coordinates from xdraw and ydraw
lda xdraw
and #%11111000
;sta xbyte
;---
ldx ydraw
clc
adc linetableL,x
sta xbyte
lda linetableH,x
adc xdraw+1
sta xbyte+1
lda xdraw
and #$7
tax
ldy #0
lda (xbyte),y
eor #$ff
and bittable,x
rts
.endp
;--------------------------------------------------
.proc drawmountains
;--------------------------------------------------
mwa #0 xdraw
mwa #mountaintable modify
mva #1 color
drawmountainsloop
ldy #0
lda (modify),y
cmp #screenheight
beq NoMountain
sta ydraw
sty ydraw+1
.IF FASTER_GRAF_PROCS = 1
; there was Drawline proc
lda #screenheight
sec
sbc ydraw
sta tempbyte01
jsr plot.MakePlot
; X - index in bittable (number of bit) and nothing more (for use) in C64 :)
; jmp IntoDraw ; jumps inside Draw routine
; because one pixel is already plotted (and who cares? :) )
@
lda (xbyte),y
and bittable2,x
sta (xbyte),y
;IntoDraw
inc ydraw
lda xdraw
and #%11111000
;sta xbyte
;---
ldy ydraw
clc
adc linetableL,y
sta xbyte
lda linetableH,y
adc xdraw+1
sta xbyte+1
ldy #0
dec tempbyte01
bne @-
; end of Drawline proc
.ELSE
; there was Drawline proc
drawline
jsr plot.MakePlot
inc ydraw
lda ydraw
cmp #screenheight
bne drawline
; end of Drawline proc
.ENDIF
NoMountain
inw modify
inw xdraw
cpw xdraw #screenwidth
bne drawmountainsloop
rts
.endp
;--------------------------------------------------
.proc TypeChar
; puts char on the graphics screen
; in: CharCode
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
;--------------------------------------------------
; char to the table
lda CharCode
sta fontind
lda #$00
sta fontind+1
; char intex times 8
aslw fontind
rolw fontind
rolw fontind
adw fontind #TankFont
; and 8 bytes to the table
ldy #7
CopyChar
lda (fontind),y
eor #$ff
sta char1,y
lda #$ff
sta char2,y
dey
bpl CopyChar
; and 8 subsequent bytes as a mask
adw fontind #8
ldy #7
CopyMask
lda (fontind),y
eor #$ff
sta mask1,y
lda #$00
sta mask2,y
dey
bpl CopyMask
.IF FASTER_GRAF_PROCS = 1
; mask preparation and character shifting
lda xdraw
and #$7
tax
beq MaskOK00
MakeMask00
.rept 8
lsr mask1+#
ror mask2+#
.endr
sec
.rept 8
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask00
MaskOK00
lda ydraw
sec
sbc #7
sta ydraw
; X = 0 !
lda Erase
beq CharLoopi ; it works, because x=0
lda #$ff
ldx #7
EmptyChar
sta char1,x
sta char2,x
dex
bpl EmptyChar
ldx #0
CharLoopi
; calculating coordinates from xdraw and ydraw
ldy ydraw
lda xdraw
and #%11111000
clc
adc linetableL,y
sta xbyte
lda linetableH,y
adc xdraw+1
sta xbyte+1
;--
ldy #0
lda (xbyte),y
ora mask1,x
and char1,x
sta (xbyte),y
ldy #8
lda (xbyte),y
ora mask2,x
and char2,x
sta (xbyte),y
inc ydraw
inx
cpx #8
bne CharLoopi
.ELSE
mvx #7 temp ; line counter (Y)
CharLoop1
mva #7 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda Erase
bne ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #8
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
clc
lda ydraw
adc #8
sta ydraw
bne EndPutChar
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPutChar
rts
.endp
;--------------------------------------------------
.proc PutChar4x4
; puts 4x4 pixels char on the graphics screen
; in: dx, dy (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/255)
; all pixels are being drawn
; (empty and not empty)
;--------------------------------------------------
cpw dy #(screenheight-1)
jcs TypeChar.EndPutChar ;nearest RTS
cpw dy #(4)
jcc TypeChar.EndPutChar ;nearest RTS
cpw dx #(screenwidth-4)
jcs TypeChar.EndPutChar ;nearest RTS
; checks ommited.
; char to the table
lda CharCode4x4
and #%00000001
beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits
sta nibbler4x4
lda CharCode4x4
lsr
sta fontind
lda #$00
sta fontind+1
adw fontind #font4x4
; and 4 bytes to the table
ldy #0
ldx #3
CopyChar
lda (fontind),y ; Y must be 0 !!!!
bit nibbler4x4
bpl GetUpper4bits
:4 rol
GetUpper4bits
ora #$0f
sta char1,x
lda #$ff
sta char2,x
; and 4 bytes as a mask
lda #$f0
sta mask1,x
lda #$00
sta mask2,x
adw fontind #32 ; next byte of 4x4 font
dex
bpl CopyChar
.IF FASTER_GRAF_PROCS = 1
; mask preparation and character shifting
lda dx
and #$7
tax
beq MaskOK01
MakeMask01
.rept 4
lsr mask1+#
ror mask2+#
.endr
sec
.rept 4
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask01
MaskOK01
lda dy
sec
sbc #3
sta dy
ldx #0
CharLoopi4x4
; calculating coordinates from xdraw and ydraw
ldy dy
lda dx
and #%11111000
clc
adc linetableL,y
sta xbyte
lda linetableH,y
adc dx+1
sta xbyte+1
;--
ldy #0
lda (xbyte),y
ora mask1,x
bit plot4x4color
bpl PutInColor0_1 ; only mask - no char
and char1,x
PutInColor0_1
sta (xbyte),y
ldy #8
lda (xbyte),y
ora mask2,x
bit plot4x4color
bpl PutInColor0_2 ; only mask - no char
and char2,x
PutInColor0_2
sta (xbyte),y
inc dy
inx
cpx #4
bne CharLoopi4x4
.ELSE
mwa xdraw char2
mwa ydraw mask2
mva color mask2+2
mwa dx xdraw
mwa dy ydraw
mvx #3 temp ; line counter (Y)
CharLoop1
mva #3 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda plot4x4color
beq ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #4
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
mwa char2 xdraw
mwa mask2 ydraw
mva mask2+2 color
bpl EndPut4x4
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPut4x4
rts
.endp
;--------------------------------------------------
.proc ClearScreen
;--------------------------------------------------
mwa #displayC64 temp
ldy #0
@ lda #$ff
sta (temp),y
inw temp
cpw temp #displayC64+screenheight*screenBytes+1
bne @-
rts
.endp
;--------------------------------------------------
.proc GenerateLineTable
mwa #displayC64 temp
mwa #linetableL temp2
mwa #linetableH modify
ldy #0
ldx #0
@ lda temp
sta (temp2),y
lda temp+1
sta (modify),y
cpx #7
bne NotChar
ldx #0
adw temp #(320-7)
jmp next8lines
NotChar
inw temp
inx
next8lines
iny
cpy #screenheight+1
bne @-
rts
.endp
;--------------------------------------------------
.proc SetMainScreen
lda #$b ; Grey background and border
lda WallsType
:4 rol
sta $d020
sta $d021
lda $dd00 ; Set video bank to start at 0
and #252
ora #3
sta $dd00
lda #$18
sta $d018
; SwitchVICBank(0)
; SetScreenMemory($2000)
SetHiresBitmapMode ; Hires mode on
lda #$00
sta 53281
; clear color RAM
ldx #0
@ lda #1
sta $d800,x
sta $d900,x
sta $da00,x
sta $db00,x
lda #$0f
sta $0400,x
sta $0500,x
sta $0600,x
sta $0700,x
inx
bne @-
rts
.endp
;--------------------------------------------------
; ******* This is weapon .... but ... *******
; -------------------------------------------------
.proc AtomicWinter
; -------------------------------------------------
; This routine is run from inside of the main loop
; and replaces Shoot and Flight routines
; X and TankNr - index of shooting tank
; -------------------------------------------------
mva #sfx_sandhog sfx_effect
.IF FASTER_GRAF_PROCS = 1
mvy #0 magic ; byte counter (from 0 to 39)
NextColumn
; big loop - we repat internal loops for each column of bytes
ldx #120 ; line counter (from 0 to 60 )
; first loop - inverse column of bytes for a while
NextLine1
jsr InverseScreenByte
dex
dex
bpl NextLine1
;
jsr WaitOneFrame ; wait uses A only
; second loop - inverse again and put random "snow" to column of bytes
ldx #120
mva #$55 magic+1
NextLine2
jsr InverseScreenByte
lda random
ora magic+1
and (temp),y
sta (temp),y
lda magic+1
eor #$ff
sta magic+1
dex
dex
bpl NextLine2
; and go to next column
inc magic
ldy magic
cpy #40
bne NextColumn
.ELSE
mva #1 color
mwa #120 ydraw
NextLineSlow
lda #0
sta xdraw
sta xdraw+1
NextPixelSlow
bit random
bpl NoPlot
bvc NoPlot
jsr plot.MakePlot
NoPlot
inw xdraw
cpw xdraw #screenwidth
bne NextPixelSlow
dec ydraw
dec ydraw
bpl NextLineSlow
.ENDIF
; and we have "snow" :)
lda #0
ldx TankNr
sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
jsr SetFullScreenSoilRange
jmp SoilDown2.NoClearTanks
; rts
; in order to optimize the fragment repeated in both internal loops
; we save 15 bytes :)
InverseScreenByte
ldy magic
sty temp
ldy #0
sty temp+1
aslw temp
rolw temp
rolw temp
lda temp
adc LineTableL,x
sta temp
lda LineTableH,x
adc temp+1
sta temp+1
lda (temp),y
eor #$ff
sta (temp),y
rts
.endp
.ENDIF
+22
View File
@@ -0,0 +1,22 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0 ;this is a trick that prevents compiling this file alone
DLIinterruptGraph = 0
;--------------------------------------------------
.macro SetDLI
; SetDLI #WORD
; Initialises Display List Interrupts
LDY # <:1
LDX # >:1
jsr _SetDLIproc
.endm
.proc _SetDLIproc
; LDA #$C0
; STY VDSLST
; STX VDSLST+1
; STA NMIEN
rts
.endp
.ENDIF
+49
View File
@@ -0,0 +1,49 @@
vic_spr0_x = $D000
vic_spr0_y = $D001
vic_spr1_x = $D002
vic_spr1_y = $D003
vic_spr2_x = $D004
vic_spr2_y = $D005
vic_spr3_x = $D006
vic_spr3_y = $D007
vic_spr4_x = $D008
vic_spr4_y = $D009
vic_spr5_x = $D00A
vic_spr5_y = $D00B
vic_spr6_x = $D00C
vic_spr6_y = $D00D
vic_spr7_x = $D00E
vic_spr7_y = $D00F
vic_spr_hi_x = $D010
vic_cr1 = $D011
vic_raster = $D012
vic_lp_x = $D013
vic_lp_y = $D014
vic_spr_ena = $D015
vic_cr2 = $D016
vic_spr_exp_y = $D017
vic_mem = $D018
vic_irq = $D019
vic_irq_ena = $D01A
vic_spr_dp = $D01B
vic_spr_mcolor = $D01C
vic_spr_exp_x = $D01D
vic_spr_ss_col = $D01E
vic_spr_sd_col = $D01F
vic_border = $D020
vic_bg_color0 = $D021
vic_bg_color1 = $D022
vic_bg_color2 = $D023
vic_bg_color3 = $D024
vic_spr_color1 = $D025
vic_spr_color2 = $D026
vic_spr0_color = $D027
vic_spr1_color = $D028
vic_spr2_color = $D029
vic_spr3_color = $D02A
vic_spr4_color = $D02B
vic_spr5_color = $D02C
vic_spr6_color = $D02D
vic_spr7_color = $D02E
RANDOM = $D41B
+352
View File
@@ -0,0 +1,352 @@
;****************************************************************************
;* ATARI PERSONAL COMPUTER *
;* SYSTEM EQUATES *
;****************************************************************************
FAKEADDR EQU $0002
ATRACT EQU FAKEADDR
RTCLOK EQU $12 ;REAL TIME CLOCK
;
; PAGE TWO RAM ASSIGNMENTS
;
VDSLST EQU FAKEADDR ;DSP LIST NMI VECTOR
VPRCED EQU FAKEADDR ;PROCEED IRQ VECTOR
VINTER EQU FAKEADDR ;INTERUPT IRQ VECTOR
VBREAK EQU FAKEADDR ;BRK INST IRQ VECTOR
VKEYBD EQU FAKEADDR ;POKEY KB IRQ VECTOR
VSERIN EQU FAKEADDR ;POKEY INPUT RDY IRQ
VSEROR EQU FAKEADDR ;POKEY OUTPUT RDY
VSEROC EQU FAKEADDR ;POKEY OUTPUT DONE
VTIMR1 EQU FAKEADDR ;POKEY TIMER 1 IRQ
VTIMR2 EQU FAKEADDR ;POKEY TIMER 2 IRQ
VTIMR4 EQU FAKEADDR ;POKEY TIMER 4 IRQ
VIMIRQ EQU FAKEADDR ;IMMED IRQ VECTOR
CDTMV1 EQU FAKEADDR ;COUNT DOWN TIMER 1
CDTMV2 EQU FAKEADDR ;COUNT DOWN TIMER 2
CDTMV3 EQU FAKEADDR ;COUNT DOWN TIMER 3
CDTMV4 EQU FAKEADDR ;COUNT DOWN TIMER 4
CDTMV5 EQU FAKEADDR ;COUNT DOWN TIMER 5
VVBLKI EQU FAKEADDR ;IMM VBLK NMI VECTOR
VVBLKD EQU FAKEADDR ;DEF VBLK NMI VECTOR
CDTMA1 EQU FAKEADDR ;CDTMV1 JSR ADDRESS
CDTMA2 EQU FAKEADDR ;CDTMV2 JSR ADDRESS
CDTMF3 EQU FAKEADDR ;CDTMV3 FLAG
SRTIMR EQU FAKEADDR ;SOFTWARE REPEAT TMR
CDTMF4 EQU FAKEADDR ;CDTMV4 FLAG
INTEMP EQU FAKEADDR ;IAN'S TEMP
CDTMF5 EQU FAKEADDR ;CDTMV5 FLAG
DMACTLS EQU FAKEADDR ;SAVE DMACTL REG
DLPTRS EQU FAKEADDR ;SAVE DISP LIST LO
;SDLSTH EQU $0231 ;SAVE DISP LIST HI
SSKCTL EQU FAKEADDR ;SKCTL REGISTER RAM
LCOUNT EQU FAKEADDR ;LOADER TEMP
LPENH EQU FAKEADDR ;LIGHT PEN HORIZONTAL
LPENV EQU FAKEADDR ;LIGHT PEN VERTICAL
BRKKY EQU FAKEADDR ;BREAK KEY VECTOR
RELADR EQU FAKEADDR ;LOADER REL ADDR
CDEVIC EQU FAKEADDR ;COMMAND BUFFER-DEV
CCOMND EQU FAKEADDR ;COMMAND BUFFER-CMND
CAUX1 EQU FAKEADDR ;COMMAND BUFFER AUX1
CAUX2 EQU FAKEADDR ;COMMAND BUFFER AUX2
;TEMP EQU $023E ;TEMPORARY RAM CELL
ERRFLG EQU FAKEADDR ;DEVICE ERROR FLAG
DFLAGS EQU FAKEADDR ;DISK FLAGS(SECTOR1)
DBSECT EQU FAKEADDR ;# DISK BOOT SECTORS
BOOTAD EQU FAKEADDR ;DISK BOOT ADDRESS
COLDST EQU FAKEADDR ;COLDSTART FLAG 1=CS
RECLEN EQU FAKEADDR ;LOADER LENGTH
DSKTIM EQU FAKEADDR ;DISK TIME OUT REG
VSFLAG EQU FAKEADDR ;FINE SCROLL TEMP
KEYDIS EQU FAKEADDR ;KEY DISABLE FLAG
FINE EQU FAKEADDR ;FINE SCROLL ENABLE(A1200)
GPRIOR EQU FAKEADDR ;GLOBAL PRIORITY
PADDL0 EQU FAKEADDR ;POT 0 RAM CELL
PADDL1 EQU FAKEADDR
PADDL2 EQU FAKEADDR
PADDL3 EQU FAKEADDR
STICK0 EQU FAKEADDR ;JOYSTICK 0 RAM CELL
STICK1 EQU FAKEADDR
PTRIG0 EQU FAKEADDR ;PADDLE TRIGGER 0
PTRIG1 EQU FAKEADDR
PTRIG2 EQU FAKEADDR
PTRIG3 EQU FAKEADDR
STRIG0 EQU FAKEADDR ;JOYSTICK TRIGGER 0
STRIG1 EQU FAKEADDR
HIBYTE EQU FAKEADDR ;LOADER
WMODE EQU FAKEADDR ;CASSETTE R/W MODE
BLIM EQU FAKEADDR ;CASSETTE RECORD SIZE
IMASK EQU FAKEADDR
JVECK EQU FAKEADDR ;JUMP VECTOR
NEWADR EQU FAKEADDR ;LOADER NEW ADDRESS
TXTROW EQU FAKEADDR ;TEXT ROWCRS
TXTCOL EQU FAKEADDR ;TEXT COLCRS
TINDEX EQU FAKEADDR ;TEXT INDEX
TXTMSC EQU FAKEADDR ;TEXT WINDOW MEM ADD
TXTOLD EQU FAKEADDR ;TEXT OLDROW & COL
CRETRY EQU FAKEADDR ;# COMMAND RETRIES
HOLD3 EQU FAKEADDR
SUBTMP EQU FAKEADDR
HOLD2 EQU FAKEADDR
DMASK EQU FAKEADDR ;PIXEL LOCATION MASK
TMPLBT EQU FAKEADDR
ESCFLG EQU FAKEADDR ;ESCAPE FLAG
TABMAP EQU FAKEADDR ;TAB STOP MAP
LOGMAP EQU FAKEADDR ;LINE START BIT MAP
INVFLG EQU FAKEADDR ;INVERSE VIDEO FLAG
FILFLG EQU FAKEADDR ;FILL FLAG FOR DRAW
TMPROW EQU FAKEADDR
TMPCOL EQU FAKEADDR
SCRFLG EQU FAKEADDR ;SET IF SCROLLING
HOLD4 EQU FAKEADDR ;TEMP USED BY DRAW
DRETRY EQU FAKEADDR ;# OF DEVICE RETRIES
SHFLOK EQU FAKEADDR ;SHIFT/CTL LOCK FLAG
BOTSCR EQU FAKEADDR ;BOTTOM OF SCREEN
PCOLR0 EQU FAKEADDR ;P0 COLOR
PCOLR1 EQU FAKEADDR ;P1 COLOR
PCOLR2 EQU FAKEADDR ;P2 COLOR
PCOLR3 EQU FAKEADDR ;P3 COLOR
COLOR0 EQU FAKEADDR ;COLOR 0
COLOR1 EQU FAKEADDR
COLOR2 EQU FAKEADDR
COLOR3 EQU FAKEADDR
COLOR4 EQU FAKEADDR
COLBAKS EQU COLOR4
CHBAS EQU FAKEADDR ;CHBAS REGISTER RAM
;
; COLLEEN MNEMONICS
;
; ---------------------------------------------------------------------------
POKEY EQU FAKEADDR
; ---------------------------------------------------------------------------
;
; READ
;
POT0 EQU POKEY+$00
POT1 EQU POKEY+$00
POT2 EQU POKEY+$00
POT3 EQU POKEY+$00
POT4 EQU POKEY+$00
POT5 EQU POKEY+$00
POT6 EQU POKEY+$00
POT7 EQU POKEY+$00
ALLPOT EQU POKEY+$00
KBCODE EQU POKEY+$00
; !!!!!
;RANDOM EQU POKEY+$00
;
POTGO EQU POKEY+$00
SERIN EQU POKEY+$00
IRQST EQU POKEY+$00
SKSTAT EQU POKEY+$00
;
; WRITE
;
AUDF1 EQU POKEY+$00
AUDC1 EQU POKEY+$00
AUDF2 EQU POKEY+$00
AUDC2 EQU POKEY+$00
AUDF3 EQU POKEY+$00
AUDC3 EQU POKEY+$00
AUDF4 EQU POKEY+$00
AUDC4 EQU POKEY+$00
AUDCTL EQU POKEY+$00
STIMER EQU POKEY+$00
SKRES EQU POKEY+$00
SEROUT EQU POKEY+$00
IRQEN EQU POKEY+$00
SKCTL EQU POKEY+$00
;
;
;
; ---------------------------------------------------------------------------
GTIA EQU FAKEADDR
; ---------------------------------------------------------------------------
;
; WRITE
;
HPOSP0 EQU GTIA+$00
HPOSP1 EQU GTIA+$00
HPOSP2 EQU GTIA+$00
HPOSP3 EQU GTIA+$00
HPOSM0 EQU GTIA+$00
HPOSM1 EQU GTIA+$00
HPOSM2 EQU GTIA+$00
HPOSM3 EQU GTIA+$00
SIZEP0 EQU GTIA+$00
SIZEP1 EQU GTIA+$00
SIZEP2 EQU GTIA+$00
SIZEP3 EQU GTIA+$00
SIZEM EQU GTIA+$00
GRAFP0 EQU GTIA+$00
GRAFP1 EQU GTIA+$00
GRAFP2 EQU GTIA+$00
GRAFP3 EQU GTIA+$00
GRAFM EQU GTIA+$00
COLPM0 EQU GTIA+$00
COLPM1 EQU GTIA+$00
COLPM2 EQU GTIA+$00
COLPM3 EQU GTIA+$00
COLPF0 EQU GTIA+$00
COLPF1 EQU GTIA+$00
COLPF2 EQU GTIA+$00
COLPF3 EQU GTIA+$00
COLBAK EQU GTIA+$00
PRIOR EQU GTIA+$00
VDELAY EQU GTIA+$00
GRACTL EQU GTIA+$00
HITCLR EQU GTIA+$00
CONSOL EQU GTIA+$00
;
; READ
;
M0PF EQU GTIA+$00
M1PF EQU GTIA+$00
M2PF EQU GTIA+$00
M3PF EQU GTIA+$00
P0PF EQU GTIA+$00
P1PF EQU GTIA+$00
P2PF EQU GTIA+$00
P3PF EQU GTIA+$00
M0PL EQU GTIA+$00
M1PL EQU GTIA+$00
M2PL EQU GTIA+$00
M3PL EQU GTIA+$00
P0PL EQU GTIA+$00
P1PL EQU GTIA+$00
P2PL EQU GTIA+$00
P3PL EQU GTIA+$00
TRIG0 EQU GTIA+$00
TRIG1 EQU GTIA+$00
TRIG2 EQU GTIA+$00
TRIG3 EQU GTIA+$00
PAL EQU GTIA+$00
;
;
; ---------------------------------------------------------------------------
ANTIC EQU FAKEADDR
; ---------------------------------------------------------------------------
;
DMACTL EQU ANTIC+$00
CHACTL EQU ANTIC+$00
DLPTR EQU ANTIC+$00
;DLISTH EQU ANTIC+$00
HSCROL EQU ANTIC+$00
VSCROL EQU ANTIC+$00
PMBASE EQU ANTIC+$00
CHBASE EQU ANTIC+$00
WSYNC EQU ANTIC+$00
; !!!!
VCOUNT EQU ANTIC+$00
; ----
PENH EQU ANTIC+$00
PENV EQU ANTIC+$00
NMIEN EQU ANTIC+$00
NMIRES EQU ANTIC+$00
NMIST EQU ANTIC+$00
;
;
; ---------------------------------------------------------------------------
PIA EQU FAKEADDR
; ---------------------------------------------------------------------------
;
PORTA EQU PIA+0
PORTB EQU PIA+0
PACTL EQU PIA+0
PBCTL EQU PIA+0
;
; ---------------------------------------------------------------------------
; Atari ANTIC chip display list equates
; ---------------------------------------------------------------------------
;
JUMP EQU $01 ; display list jump instruction (3 byte)
JVB EQU $41 ; display list jump and wait for vblank instruction (3)
;
SCH EQU $10 ; display list horizontal scrolling
SCV EQU $20 ; display list vertical scrolling
LMS EQU $40 ; display list load memory scan instruction (3 byte)
DLII EQU $80 ; display list interrupt instruction
;
SKIP1 EQU $00 ; display list skip 1 scan line instruction
SKIP2 EQU $10 ; display list skip 2 scan lines instruction
SKIP3 EQU $20 ; display list skip 3 scan lines instruction
SKIP4 EQU $30 ; display list skip 4 scan lines instruction
SKIP5 EQU $40 ; display list skip 5 scan lines instruction
SKIP6 EQU $50 ; display list skip 6 scan lines instruction
SKIP7 EQU $60 ; display list skip 7 scan lines instruction
SKIP8 EQU $70 ; display list skip 8 scan lines instruction
;
MODE2 EQU $02 ; display list mode 2
MODE4 EQU $04 ; display list mode 4
MODE8 EQU $08 ; display list mode 8
MODEE EQU $0E ; display list mode E
MODEF EQU $0F ; display list mode F
; ---------------------------------------------------------------------------
; KBCODEs
; ---------------------------------------------------------------------------
.enum @kbcode
_none = 255
_esc = 28
_1 = 31
_2 = 30
_3 = 26
_4 = 24
_5 = 29
_6 = 27
_7 = 51
_8 = 53
_9 = 48
_0 = 50
_lt = 54
_gt = 55
_del = 52
_tab = 44
_Q = 47
_W = 46
_E = 42
_R = 40
_T = 45
_Y = 43
_U = 11
_I = 13
_O = 8
_P = 10
_min = 14
_up = 14 ; cursor function
_eq = 15
_down = 15 ; cursor function
_ret = 12
_A = 63
_S = 62
_D = 58
_F = 56
_G = 61
_H = 57
_J = 1
_K = 5
_L = 0
_semicolon = 2
_plus = 6
_left = 6 ; cursor function
_asterisk = 7
_right = 7 ; cursor function
_caps = 60
_Z = 23
_X = 22
_C = 18
_V = 16
_B = 21
_N = 36
_M = 37
_comma = 32
_dot = 34
_slash = 38
_atari = 39
_help = 17
_F1 = 3
_F2 = 4
_F3 = 19
_F4 = 20
_space = 33
.ende
+296
View File
@@ -0,0 +1,296 @@
.macro basic_start(addr)
.word upstartEnd // link address
.word 10 // line num
.byte $9e // sys
?a=0
?b=0
?c=0
?d=0
?e=0
?v = %%addr
ift ?v>=10000
?a=?v/10000
?v=?v-(?a*10000)
eif
ift ?v>=1000
?b=?v/1000
?v=?v-(?b*1000)
eif
ift ?v>=100
?c=?v/100
?v=?v-(?c*100)
eif
ift ?v>=10
?d=?v/10
?v=?v-(?d*10)
eif
?e=?v%10
dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30
.byte 0
upstartEnd
.word 0 // empty link signals the end of the program
.endm
//
// Switch bank in VIC-II
//
// Args:
// bank: bank number to switch to. Valid values: 0-3.
//
.macro SwitchVICBank(bank)
//
// The VIC-II chip can only access 16K bytes at a time. In order to
// have it access all of the 64K available, we have to tell it to look
// at one of four banks.
//
// This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2).
//
// +------+-------+----------+-------------------------------------+
// | BITS | BANK | STARTING | VIC-II CHIP RANGE |
// | | | LOCATION | |
// +------+-------+----------+-------------------------------------+
// | 00 | 3 | 49152 | ($C000-$FFFF)* |
// | 01 | 2 | 32768 | ($8000-$BFFF) |
// | 10 | 1 | 16384 | ($4000-$7FFF)* |
// | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) |
// +------+-------+----------+-------------------------------------+
?bits=%11
ift (%%bank==0)
?bits=%11
eli (%%bank==1)
?bits=%10
eli (%%bank==2)
?bits=%01
eli (%%bank==3)
?bits=%00
eif
//
// Set Data Direction for CIA #2, Port A to output
//
lda $dd02
and #%11111100 // Mask the bits were interested in.
ora #$03 // Set bits 0 and 1.
sta $dd02
//
// Tell VIC-II to switch to bank
//
lda $dd00
and #%11111100
ora #?bits
sta $dd00
.endm
//
// Enter hires bitmap mode (a.k.a. standard bitmap mode)
//
.macro SetHiresBitmapMode
//
// Clear extended color mode (bit 6) and set bitmap mode (bit 5)
//
lda $d011
and #%10111111
ora #%00100000
sta $d011
//
// Clear multi color mode (bit 4)
//
lda $d016
and #%11101111
sta $d016
.endm
//
// Enter hires bitmap mode (a.k.a. standard bitmap mode)
//
.macro SetMulticolorBitmapMode
//
// Clear extended color mode (bit 6) and set bitmap mode (bit 5)
//
lda $d011
and #%10111111
ora #%00100000
sta $d011
//
// Clear multi color mode (bit 4)
//
lda $d016
ora #%00010000
sta $d016
.endm
//
// Switch location of screen memory.
//
// Args:
// address: Address relative to current VIC-II bank base address.
// Valid values: $0000-$3c00. Must be a multiple of $0400.
//
.macro SetScreenMemory(address)
//
// The most significant nibble of $D018 selects where the screen is
// located in the current VIC-II bank.
//
// +------------+-----------------------------+
// | | LOCATION* |
// | BITS +---------+-------------------+
// | | DECIMAL | HEX |
// +------------+---------+-------------------+
// | 0000XXXX | 0 | $0000 |
// | 0001XXXX | 1024 | $0400 (DEFAULT) |
// | 0010XXXX | 2048 | $0800 |
// | 0011XXXX | 3072 | $0C00 |
// | 0100XXXX | 4096 | $1000 |
// | 0101XXXX | 5120 | $1400 |
// | 0110XXXX | 6144 | $1800 |
// | 0111XXXX | 7168 | $1C00 |
// | 1000XXXX | 8192 | $2000 |
// | 1001XXXX | 9216 | $2400 |
// | 1010XXXX | 10240 | $2800 |
// | 1011XXXX | 11264 | $2C00 |
// | 1100XXXX | 12288 | $3000 |
// | 1101XXXX | 13312 | $3400 |
// | 1110XXXX | 14336 | $3800 |
// | 1111XXXX | 15360 | $3C00 |
// +------------+---------+-------------------+
//
?bits = (%%address / $0400) << 4
lda $d018
and #%00001111
ora #?bits
sta $d018
.endm
//
// Set location of bitmap.
//
// Args:
// address: Address relative to VIC-II bank address.
// Valid values: $0000 (bitmap at $0000-$1FFF)
// $2000 (bitmap at $2000-$3FFF)
//
.macro SetBitmapAddress(address)
//
// In standard bitmap mode the location of the bitmap area can
// be set to either BANK address + $0000 or BANK address + $2000
//
// By setting bit 3, we can configure which of the locations to use.
//
lda $d018
ift %%address == $0000
and #%11110111
eli %%address == $2000
ora #%00001000
eif
sta $d018
.endm
//
// Once this is done, random values appear in location $D41B (RANDOM)
//
.macro InitializeSIDrnd
LDA #$FF ; maximum frequency value
STA $D40E ; voice 3 frequency low byte
STA $D40F ; voice 3 frequency high byte
LDA #$80 ; noise waveform, gate bit off
STA $D412 ; voice 3 control register
.endm
;-------------------------------------
.MACRO rolw
ROL :1
ROL :1+1
.ENDM
;-------------------------------------
.MACRO aslw
ASL :1
ROL :1+1
.ENDM
;-------------------------------------
.MACRO rorw
ROR :1+1
ROR :1
.ENDM
;-------------------------------------
.MACRO lsrw
LSR :1+1
ROR :1
.ENDM
;-------------------------------------
.macro randomize
;usage: randomize floor ceiling
;returns (in A) a random .byte between "floor" and "ceiling"
.if :2 < :1
.error "floor higher than ceiling"
.endif
?rand
lda random
cmp #:1 ;floor
bcc ?rand
cmp #:2+1 ;ceiling
bcs ?rand
.endm
;-------------------------------------
.macro phx
txa
pha
.endm
;-------------------------------------
.macro phy
tya
pha
.endm
;-------------------------------------
.macro plx
pla
tax
.endm
;-------------------------------------
.macro ply
pla
tay
.endm
;-------------------------------------
.MACRO WAIT
; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
?ze LDA $D012
cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
bcc ?ze
sbc #10 ; last lines correction
?wa cmp $D012
bcc ?wa
?wf cmp $D012
bcs ?wf
.ENDM
;-------------------------------------
.macro halt
?s jmp ?s
.endm
+333
View File
@@ -0,0 +1,333 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0
WeaponsListDL = 0
NamesOfLevels = 0
;----------------------------------------
; this module contains routines used in text mode
; like shop and start-up options
;----------------------------------------
;--------------------------------------------------
.proc Options
;--------------------------------------------------
; start-up screen - options, etc.
; this function returns:
; - number of players (NumberOfPlayers)
; - money each player has on the beginning of the game (moneyL i moneyH)
; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight
ldx #$08
@ lda Autoplay_OptionsTable,x
sta OptionsTable,x
dex
bpl @-
rts
Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4
.endp
.proc SelectNextGradient
lda OptionsY ; if "Wind" option selected
cmp #$03
bne NotWind
lda WindChangeInRound ; wind change after each turn (not round only) flag
eor #$1f ; '?' character
sta WindChangeInRound
rts
NotWind
ldy GradientNr
iny
cpy #$03
bne NoGradientLoop
ldy #$00
NoGradientLoop
sty GradientNr
lda GradientAddrL,y
sta GradientColors
lda GradientAddrH,y
sta GradientColors+1
rts
.endp
;-------------------------------------------
; call of the purchase (and activate) screens for each tank
.proc CallPurchaseForEveryTank
mva #0 TankNr
sta isInventory
@
ldx TankNr
lda SkillTable,x
beq ManualPurchase
jsr PurchaseAI ; remember to make ActivateAI :) !!!
jmp AfterManualPurchase
ManualPurchase
lda JoyNumber,x
sta JoystickNumber ; set joystick port for player
mva #0 isInventory
jsr Purchase ; purchase weapons
bit escFlag
spl:rts
jsr DefensivesActivate ; activate weapons
bit escFlag
spl:rts
AfterManualPurchase
inc:lda TankNr
cmp NumberOfPlayers
bne @-
rts
.endp
;--------------------------------------------------
.proc DefensivesActivate
;--------------------------------------------------
; This proc call Inventory and set Defensives activation first
mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons
mva #$ff IsInventory
mva #%10000000 WhichList
; offensive weapon - 0, defensive - %10000000
jmp Purchase.GoToActivation
.endp
;--------------------------------------------------
.proc Purchase ;
;--------------------------------------------------
; In tanknr there is a number of the tank (player)
; that is buying weapons now (from 0).
; Rest of the data is taken from appropriate tables
; and during the purchase these tables are modified.
; we are clearing list of the weapons
mva #$00 WhichList
; offensive weapon - 0, deffensive - %10000000
GoToActivation
rts
.endp
; -----------------------------------------------------
.proc EnterPlayerNames
;entering names of players
mva #0 TankNr
sta COLBAKS ; set color of background
@ tax
lda TankStatusColoursTable,x
sta COLOR2 ; set color of player name line
jsr EnterPlayerName
bit escFlag
spl:rts
jsr CheckTankCheat
inc TankNr
lda TankNr
cmp NumberOfPlayers
bne @-
rts
.endp
; -----------------------------------------------------
.proc EnterPlayerName
; in: TankNr
; Out: TanksNames, SkillTable
; this little thing is for choosing Player's skill (if computer)
; and entering his name
; If no name entered, there should be name "1st Tank", etc.
; Default tanks names are in table TanksNamesDefault
; -----------------------------------------------------
;
EndOfNick
; storing name of the player and its level
; level of the computer opponent goes to
; the table of levels (difficulties)
ldx tanknr
lda #6 ; Spoiler
sta DifficultyLevel
sta skilltable,x
beq NotRobot
lda #$03 ; shape for robotanks
sta TankShape,x
NotRobot
; storing name of the tank in the right space
; (without cursor!)
ldy #$00
txa ; ldx TankNr
asl
asl
asl ; 8 chars per name
tax ; in X where to put new name
mva #sfx_next_player sfx_effect
; check if all chars are empty (" ")
ldy #7
lda #0
@ ora #0 ; NameAdr,y
and #$7F ; remove inverse (Cursor)
dey
bpl @-
tay
beq MakeDefaultName
ldy #0
nextchar04
lda #0 ; NameAdr,y
and #$7f ; remove inverse (Cursor)
sta tanksnames,x
inx
iny
cpy #$08
bne nextchar04
rts
MakeDefaultName
nextchar05
lda tanksnamesDefault,x
sta tanksnames,x
inx
iny
cpy #$08
bne nextchar05
rts
.endp
;--------------------------------------------------
.proc displaydec5 ;decimal (word), displayposition (word)
;--------------------------------------------------
; displays decimal number as in parameters (in text mode)
; leading zeroes are removed
; the range is (00000..65565 - two bytes)
ldy #4 ; there will be 5 digits
NextDigit
ldx #16 ; 16-bit dividee so Rotate 16 times
lda #$00
Rotate000
aslw decimal
rol ; scroll dividee
; (as highest byte - additional - byte is A)
cmp #10 ; divider
bcc TooLittle000 ; if A is smaller than divider
; there is nothing to substract
sbc #10 ; divider
inc decimal ; lowest bit set to 1
; because it is 0 and this is the fastest way
TooLittle000 dex
bne Rotate000 ; and Rotate 16 times, Result will be in decimal
tax ; and the rest in A
; (and it goes to X because
; it is our decimal digit)
lda digits,x
sta decimalresult,y
dey
bpl NextDigit ; Result again /10 and we have next digit
;rightnumber
; displaying without leading zeroes (if zeroes exist then display space at this position)
ldy #0
ldx #0 ; digit flag (cut leading zeroes)
displayloop
lda decimalresult,y
cpx #0
bne noleading0
cpy #4
beq noleading0 ; if 00000 - last 0 must stay
cmp zero
bne noleading0
lda #space
beq displaychar ; space = 0 !
noleading0
inx ; set flag (no leading zeroes to cut)
displaychar
sta (displayposition),y
nexdigit
iny
cpy #5
bne displayloop
rts
.endp
;--------------------------------------------------
.proc displaybyte ;decimal (byte), displayposition (word)
;--------------------------------------------------
; displays decimal number as in parameters (in text mode)
; leading zeores are removed
; the range is (00..99 - one byte)
ldy #1 ; there will be 2 digits
NextDigit2
ldx #8 ; 8-bit dividee so Rotate 8 times
lda #$00
Rotate001
asl decimal
rol ; scroll dividee
; (as highest byte - additional - byte is A)
cmp #10 ; divider
bcc TooLittle001 ; if A is smaller than divider
; there is nothing to substract
sbc #10 ; divider
inc decimal ; because it is 0 and this is the fastest way
TooLittle001 dex
bne Rotate001 ; and Rotate 8 times, Result will be in decimal
tax ; and the rest in A
; (and it goes to X because
; it is our decimal digit)
lda digits,x
sta decimalresult,y
dey
bpl NextDigit2 ; Result again /10 and we have next digit
; now cut leading zeroes (02 goes 2)
lda decimalresult
cmp zero
bne decimalend1
lda #space
sta decimalresult
decimalend1
; displaying
ldy #1
displayloop1
lda decimalresult,y
sta (displayposition),y
dey
bpl displayloop1
rts
.endp
;-------------------------------------------------
.proc RoundOverSprites
; fill sprites with bytes
rts
.endp
;--------------------------------------------------
.proc GameOverScreen
;--------------------------------------------------
rts
.endp
;-------------------------------------------------
.proc PutTankNameOnScreen
;-------------------------------------------------
.endp
;-------------------------------------------------
.proc DisplayStatus
;-------------------------------------------------
DisplayAngle
ldx TankNr
rts
.endp
;-------------------------------------------------
.endif
+21 -7
View File
@@ -3,12 +3,18 @@
You can play using the keyboard (all functionality) or the joystick in the first port (all functionality necessary for gameplay). You can play using the keyboard (all functionality) or the joystick in the first port (all functionality necessary for gameplay).
## 1. Game Option Selection. ## 1. Game Option Selection.
![Game options screen.](images/MainMenu.png)
On the first screen, you can configure gameplay options: On the first screen, you can configure gameplay options:
* number of players (2 - 6) includes both human and computer-controlled players * number of players (2 - 6) includes both human and computer-controlled players
* the initial amount of cash of each player (2K is the optimal value we chose, but for short games, it is worth choosing a higher value) * the initial amount of cash of each player (2K is the optimal value we chose, but for short games, it is worth choosing a higher value)
* gravity * gravity
* maximum wind strength (wind is drawn at the beginning of each round or during the round between turns, here we can choose how strong it can be) * maximum wind strength (wind is drawn at the beginning of each round or during the round between turns, here we can choose how strong it can be):
* 1B - maximum wind strength: 5
* 3B - maximum wind strength: 20
* 5B - maximum wind strength: 40
* 7B - maximum wind strength: 70
* 9B - maximum wind strength: 99
* number of rounds in a game * number of rounds in a game
* missile speed (does not affect the flight path - only changes the apparent missile speed - does not change anything in the gameplay itself) * missile speed (does not affect the flight path - only changes the apparent missile speed - does not change anything in the gameplay itself)
* frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose. * frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose.
@@ -29,6 +35,7 @@ The [TAB] or [SELECT] key, and on the Atari 5200 console, the [5] controller key
The [RETURN] key or a joystick button moves to the next screen. The [RETURN] key or a joystick button moves to the next screen.
## 2. Entering the name of players and selecting the level of computer-controlled players ## 2. Entering the name of players and selecting the level of computer-controlled players
![Name of players and game level screen.](images/DiffMenu.png)
The second screen is shown for each player. Here you can use the cursor keys or joystick to select whether the tank will be driven by a human (HUMAN option) or a computer (other options). The second screen is shown for each player. Here you can use the cursor keys or joystick to select whether the tank will be driven by a human (HUMAN option) or a computer (other options).
The [TAB] or [SELECT] key, and on the Atari 5200 console the [5] controller key allow you to choose which joystick port the player will use. The [TAB] or [SELECT] key, and on the Atari 5200 console the [5] controller key allow you to choose which joystick port the player will use.
@@ -40,20 +47,27 @@ The player's name can also be entered with the joystick. After pressing and hold
If the name is not entered, it will be supplemented with the default name. If the name is not entered, it will be supplemented with the default name.
## 3. Shopping screen (before each round) ## 3. Shopping screen (before each round)
![Shopping offensives screen.](images/PurOffensive.png)
![Shopping defensives screen.](images/PurDefensive.png)
On this screen, you can make purchases of offensive and defensive weapons. Only those weapons that the player can afford are visible, along with information about the price and the number of units of a given weapon that will be obtained for that price. The information on the screen probably needs no more description. You move through the lists with the cursor keys (up and down) or with the joystick, the [TAB] key or the left arrow or the left joystick tilt change the screen to defensive or offensive weapons, the [SPACE] key or the right arrow and also the joystick to the right does the purchase of the indicated weapon. On this screen, you can make purchases of offensive and defensive weapons. Only those weapons that the player can afford are visible, along with information about the price and the number of units of a given weapon that will be obtained for that price. The information on the screen probably needs no more description. You move through the lists with the cursor keys (up and down) or with the joystick, the [TAB] key or the left arrow or the left joystick tilt change the screen to defensive or offensive weapons, the [SPACE] key or the right arrow and also the joystick to the right does the purchase of the indicated weapon.
The [RETURN] key or the joystick button press switches to the defensive weapon activation screen. Here you can activate previously bought defensive (or offensive after switching with [TAB], etc) weapons. This makes it possible to activate shields and others before the round starts. The [RETURN] key or the joystick button press switches to the defensive weapon activation screen. Here you can activate previously bought defensive (or offensive after switching with [TAB], etc) weapons.
![Defensives activation screen.](images/ActDefensive.png)
This makes it possible to activate shields and others before the round starts.
Another [RETURN] key or joystick button press switches to the next player's shopping screen. Another [RETURN] key or joystick button press switches to the next player's shopping screen.
(For computer players this screen is not shown.) (For computer players this screen is not shown.)
## 4. The main screen of the game ## 4. The main screen of the game
![Main game screen.](images/StatusLine.png)
The status line shows which player is currently allowed to take a shot and a set of other information: The status line shows which player is currently allowed to take a shot and a set of other information:
* player's tank name, * player's tank name,
* active joystick number * active joystick number or difficulty level of computer-controlled player (1-**Moron** - 8-**Unknown**),
* currently selected offensive weapon, * currently selected offensive weapon (symbol quantity and name),
* the player's remaining energy points and if he has an active defensive weapon that has its energy - in parentheses the energy level, * the player's remaining energy points and if he has an active defensive weapon that has its energy - in parentheses the energy level,
* the angle and the direction of the barrel set by the player, * the angle and the direction of the barrel set by the player,
* the shot strength set by the player (the maximum shot strength is limited by the player's energy - it can not exceed the energy * 10 . This means that you can fire weaker shots only when having a small amount of energy, * the shot strength set by the player (the maximum shot strength is limited by the player's energy - it can not exceed the energy * 10 . This means that you can fire weaker shots only when having a small amount of energy,
@@ -208,13 +222,13 @@ The game has 8 difficulty levels of computer-controlled opponents. Or actually 7
* **Poolshark** - When attacking, he sets the nearest tank as his target, then selects the angle of the shot, and tries to select its strength by drawing it from the selected range. He always shoots with the best weapon he has. He uses defensive weapons. With a probability of 1:3, he activates the best defensive weapon he owns (the highest on the list of weapons he owns - that is, not necessarily the best) before firing. If his energy level drops below 30 units - he uses **Battery** (of course, if he bought it before), if the energy drops below 5 and he has no **Battery** he surrenders - **White Flag**. At the beginning of the round he makes 1 attemp to buy defensive weapons and 6 offensive weapons. * **Poolshark** - When attacking, he sets the nearest tank as his target, then selects the angle of the shot, and tries to select its strength by drawing it from the selected range. He always shoots with the best weapon he has. He uses defensive weapons. With a probability of 1:3, he activates the best defensive weapon he owns (the highest on the list of weapons he owns - that is, not necessarily the best) before firing. If his energy level drops below 30 units - he uses **Battery** (of course, if he bought it before), if the energy drops below 5 and he has no **Battery** he surrenders - **White Flag**. At the beginning of the round he makes 1 attemp to buy defensive weapons and 6 offensive weapons.
** **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons. * **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons.
** **Chooser** - Takes as a target the weakest opponent (with the least amount of energy) and aims very precisely, but before the shot the energy of the shot is modified by the parameter of luck :) , that is, despite the precise aiming it does not always hit. He shoots with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He always activates the best defensive weapon he has before shooting and, like **Poolshark**, uses **Battery** and **White Flag**. He purchases just like **Tosser**. * **Chooser** - Takes as a target the weakest opponent (with the least amount of energy) and aims very precisely, but before the shot the energy of the shot is modified by the parameter of luck :) , that is, despite the precise aiming it does not always hit. He shoots with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He always activates the best defensive weapon he has before shooting and, like **Poolshark**, uses **Battery** and **White Flag**. He purchases just like **Tosser**.
* **Spoiler** - He shoots exactly like **Chooser** except that he has more luck :) , which means that even if he doesn't hit the target of his choice, it can be a more precise shot than **Chooser**. He uses defensive weapons exactly like **Chooser**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/320) attempts to buy offensive weapons. When buying defensive weapons, he buys only strong and precise weapons - that is, weapons that won't accidentally hurt him. * **Spoiler** - He shoots exactly like **Chooser** except that he has more luck :) , which means that even if he doesn't hit the target of his choice, it can be a more precise shot than **Chooser**. He uses defensive weapons exactly like **Chooser**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/320) attempts to buy offensive weapons. When buying defensive weapons, he buys only strong and precise weapons - that is, weapons that won't accidentally hurt him.
** **Cyborg** - Takes aim at the weakest opponent (with the least amount of energy) but prefers human-controlled opponents. Aims very accurately and in the vast majority of cases hits on the first shot. He fires the shot with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He uses defensive weapons exactly like **Chooser**. He shops exactly like **Spoiler**. * **Cyborg** - Takes aim at the weakest opponent (with the least amount of energy) but prefers human-controlled opponents. Aims very accurately and in the vast majority of cases hits on the first shot. He fires the shot with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He uses defensive weapons exactly like **Chooser**. He shops exactly like **Spoiler**.
* **Unknown** - Before firing each shot, he randomly chooses a course of action from **Poolshark** to **Cyborg** and applies his tactics. However, the tactics of weapon purchases are always identical to **Tosser**. * **Unknown** - Before firing each shot, he randomly chooses a course of action from **Poolshark** to **Cyborg** and applies his tactics. However, the tactics of weapon purchases are always identical to **Tosser**.
+18 -3
View File
@@ -3,11 +3,18 @@
Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce). Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce).
## 1. Wybór opcji gry. ## 1. Wybór opcji gry.
![Ekran wyboru opcji gry.](images/MainMenu.png)
Na pierwszym ekranie możemy skonfigurować opcje rozgrywki: Na pierwszym ekranie możemy skonfigurować opcje rozgrywki:
* ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer * ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer
* początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, lecz przy krótkich rozgrywkach warto wybrać większą wartość) * początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, lecz przy krótkich rozgrywkach warto wybrać większą wartość)
* grawitacja * grawitacja
* maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund lub w czasie rundy pomiędzy turami, tu możemy wybrać jak silny może być) * maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund lub w czasie rundy pomiędzy turami, tu możemy wybrać jak silny może być):
* 1B - maksymalna siła wiatru: 5
* 3B - maksymalna siła wiatru: 20
* 5B - maksymalna siła wiatru: 40
* 7B - maksymalna siła wiatru: 70
* 9B - maksymalna siła wiatru: 99
* liczba rozgrywanych rund * liczba rozgrywanych rund
* szybkość lotu pocisków (nie ma wpływu na tor lotu - zmienia jedynie widoczną prędkość rysowania - nie zmienia nic w samej rozgrywce) * szybkość lotu pocisków (nie ma wpływu na tor lotu - zmienia jedynie widoczną prędkość rysowania - nie zmienia nic w samej rozgrywce)
* częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania. * częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania.
@@ -28,6 +35,8 @@ Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera zmien
Klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu. Klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu.
## 2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer ## 2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer
![Ekran wyboru graczy i poziomu trudności.](images/DiffMenu.png)
Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joystickiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też komputer (pozostałe opcje). Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joystickiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też komputer (pozostałe opcje).
Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera pozwalają wybrać z którego portu joysticka będzie korzystał gracz. Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera pozwalają wybrać z którego portu joysticka będzie korzystał gracz.
Klawisz [INVERSE] lub [OPTION] umożliwiają wybór jednego z 3 dostępnych kształtów czołgów. Na konsoli Atari 5200 uzyskuje się to poprzez cykliczne wybieranie kolejnych portów joysticka klawiszem [5]. Klawisz [INVERSE] lub [OPTION] umożliwiają wybór jednego z 3 dostępnych kształtów czołgów. Na konsoli Atari 5200 uzyskuje się to poprzez cykliczne wybieranie kolejnych portów joysticka klawiszem [5].
@@ -38,21 +47,27 @@ Nazwę gracza można wprowadzać także przy pomocy joysticka. Po wciśnięciu i
Jeśli nazwa nie zostanie wpisana, to zostanie uzupełniona nazwą domyślną. Jeśli nazwa nie zostanie wpisana, to zostanie uzupełniona nazwą domyślną.
## 3. Ekran zakupów (przed każdą rundą) ## 3. Ekran zakupów (przed każdą rundą)
![Ekran zakupów broni ofensywnych.](images/PurOffensive.png)
![Ekran zakupów broni defensywnych.](images/PurDefensive.png)
Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni. Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni.
Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych.
![Ekran aktywacji broni defensywnych.](images/ActDefensive.png)
Na ekranie tym można aktywować zakupione wcześniej bronie defensywne czy też ofensywne. Obsługiwany jest identycznie jak ekran zakupów, jednak [SPACJA] lub strzałka w prawo a także joystick w prawo realizują aktywacje wskazanej broni. Umożliwia to aktywowanie osłon jeszcze przed rozpoczęciem rundy. Na ekranie tym można aktywować zakupione wcześniej bronie defensywne czy też ofensywne. Obsługiwany jest identycznie jak ekran zakupów, jednak [SPACJA] lub strzałka w prawo a także joystick w prawo realizują aktywacje wskazanej broni. Umożliwia to aktywowanie osłon jeszcze przed rozpoczęciem rundy.
Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza.
(oczywiście dla graczy komputerowych ten ekran się nie pojawia) (oczywiście dla graczy komputerowych ten ekran się nie pojawia)
## 4. Główny ekran gry ## 4. Główny ekran gry
![Główny ekran gry.](images/StatusLine.png)
W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji: W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji:
* nazwa czołgu gracza * nazwa czołgu gracza
* numer aktywnego joysticka * numer aktywnego joysticka lub poziom gracza sterowanego przez komputer (1-**Moron** - 8-**Unknown**),
* wybrana aktualnie broń ofensywna * wybrana aktualnie broń ofensywna (symbol ilość nazwa),
* pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób * pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób
* ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia * ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia
* ustawiona przez gracza siła strzału (maksymalna siła strzału jest ograniczana przez energię gracza - nie może przekroczyć energii * 10 . Oznacza to, że mając małą ilość energii możemy oddać słabsze strzały * ustawiona przez gracza siła strzału (maksymalna siła strzału jest ograniczana przez energię gracza - nie może przekroczyć energii * 10 . Oznacza to, że mając małą ilość energii możemy oddać słabsze strzały
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

+141 -123
View File
@@ -27,33 +27,51 @@ You can contact us via [AtariAge](https://atariage.com) or [AtariOnLine](https:/
This source code was originally compiled with [OMC65 crossassembler](https://github.com/pkali/omc65) and on 2012-06-21 translated to [mads](https://github.com/tebe6502/Mad-Assembler). This source code was originally compiled with [OMC65 crossassembler](https://github.com/pkali/omc65) and on 2012-06-21 translated to [mads](https://github.com/tebe6502/Mad-Assembler).
Compilation: `mads scorch.asm -o:scorch.xex` Compilation:
- `mads scorch.asm -o:scorch.xex -d:TARGET=800` for Atari800 version
- `mads scorch.asm -o:scorch.bin -d:TARGET=5200` for Atari 5200 version
- `mads scorchC64.asm -o:scorchC64.prg` for C64 version (WIP, not playable yet)
Game source code is split into several parts: Game source code is split into several parts:
- scorch.asm is the main game code (with many assorted routines) - `scorch.asm` is the main game startup code
- grafproc.asm - graphics routines like line or circle - `game.asm` - it all happens here
- textproc.asm - text routines like list of weapons and shop - `grafproc.asm` - graphics routines like line or circle
- variables.asm - all non-zero page variables - `textproc.asm` - text routines like list of weapons and shop
- constants.asm - various tables of constants - `variables.asm` - all non-zero page variables
- display_*.asm - display lists and text screen definitions - `constants.asm` - various tables of constants
- ai.asm - artificial stupidity of computer opponents - `display_*.asm` - display lists and text screen definitions
- weapons.asm - general arsenal of tankies - `ai.asm` - artificial stupidity of computer opponents
- definitions.asm - label definitions, moved to make it work better with Altirra debug (it doesn't). - `weapons.asm` - general arsenal of tankies
- `definitions.asm` - label definitions, moved to make it work better with Altirra debug (it doesn't).
We were trying to use macros, pseudo-ops and simple graphics primitives as much as possible. We were trying to use macros, pseudo-ops, and simple graphics primitives as much as possible. This way, it should be relatively easy to port this code to, for example, the C64.
This way it should be relatively easy to port this code to e.g. C64
After those N years of working on this piece of code we are sure it would be much wiser to write it in C, Action! or MadPascal but on the other hand it is so much fun to type 150 chars where all you want to have y=a*x+b :) After working on this piece of code for N years, we are sure it would be much wiser to write it in C, Action!, or MadPascal. On the other hand, it is so much fun to type 150 characters when all you want to have is y = a * x + b. :)
Originally most variables were in Polish, comments were sparse, but we wanted to release this piece of code to public. Originally, most variables were in Polish, and comments were sparse. However, we wanted to release this piece of code to the public. Because we were always short of time and energy (to finish the game), we decided to translate it into English so that other people could work on it. This never happened, but we received some encouraging comments, and we are still trying to do something from time to time.
Because of being always short of time/energy (to finish the game) we decided it must go in 'English' to let other people work on it.
It never happened, but we got some encouraging comments and we are still trying to do something from time to time.
With the advent of [fujinet](https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see. With the advent of [fujinet](https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see.
## Changelog: ## Changelog:
###### Version 1.30
2023-05-21
Okay, okay, we promised that the single-machine game was done, and it was. However, some bug reports came in, and development of the C64 version unearthed some mostly peaceful and dormant pests. As a result, it appears that a new release is happening.
The most important changes:
- Most machine-dependent code moved to appropriate folders (`Atari/` and `C64/`).
- Game Over results table improved by sorting all 3 values - points, hits and money earned. It was possible in the past to get a lower podium place with e.g., more money.
- Game Over screen now displays level of robo tanks and controller number for organic players.
- Gains calculations bug fixed.
- Manuals now include pictures!
- More than 6 tanks possible (not for Atari / 5200 where sprites and memory are the limiting factor)
- Shield stays up after White Flag bug fixed https://github.com/pkali/scorch_src/issues/138. Finally!!!
- Quit from game and quit to Game Over is now checked much more often, especially when robo tanks are fighting.
- Numerous binary size and source code clarity improvements, mainly to facilitate the above changes.
###### Version 1.28 ###### Version 1.28
2023-04-22 2023-04-22
@@ -145,11 +163,11 @@ Other (dubious) improvements:
We couldn't resist! This is the Senior Executive Director's Cut. We couldn't resist! This is the Senior Executive Director's Cut.
By virtue of byte misering we squeezed in a few new features: By virtue of byte misering we squeezed in a few new features:
* new selectable tank shapes - change the controller enough times to get a different tank model - new selectable tank shapes - change the controller enough times to get a different tank model
* lonely bad pixel after Liquid Dirt fixed - lonely bad pixel after Liquid Dirt fixed
* mountain colors (or shades) possible, switch with [Tab] in the main menu - mountain colors (or shades) possible, switch with [Tab] in the main menu
* active controller number display in the game, store, and inventory screens - active controller number display in the game, store, and inventory screens
* a very special terminator mode for Moron - a very special terminator mode for Moron
###### Version 1.20 ###### Version 1.20
@@ -158,72 +176,72 @@ By virtue of byte misering we squeezed in a few new features:
It's the final cut. Director's Cut. It's the final cut. Director's Cut.
We squeezed the code and saved some bytes to add the joystick/controller selection. No more fights for the stick, up to 4 players can have fun with their own manipulators. And the fifth one can still use the keyboard :). We squeezed the code and saved some bytes to add the joystick/controller selection. No more fights for the stick, up to 4 players can have fun with their own manipulators. And the fifth one can still use the keyboard :).
Our most prolific testers Arek and Alex called for a number of fixes. Thank you, guys! Our most prolific testers Arek and Alex called for a number of fixes. Thank you, guys!
* Players can select their controllers. - Players can select their controllers.
* Better Auto Defense symbol in the status line. - Better Auto Defense symbol in the status line.
* Battery performance in AI and Auto Defense fixed. - Battery performance in AI and Auto Defense fixed.
* More accurate and faster Laser. - More accurate and faster Laser.
* Boost For Gifts includes a secret, quite powerful weapon. - Boost For Gifts includes a secret, quite powerful weapon.
* Points counting fix-up (edge cases eliminated). - Points counting fix-up (edge cases eliminated).
* Long lists in inventory and shop were pointing to a weapon outside the screen. Fixed. - Long lists in inventory and shop were pointing to a weapon outside the screen. Fixed.
* Lazy Boys now remember the last weapon used. - Lazy Boys now remember the last weapon used.
* Especially for XEGS - SELECT key changes the joystick similarly to TAB. - Especially for XEGS - SELECT key changes the joystick similarly to TAB.
* Rare P/M glitches fixed. - Rare P/M glitches fixed.
* ExplosionRange variable glitched (rarely) due to byte/word mix-up. Fixed. - ExplosionRange variable glitched (rarely) due to byte/word mix-up. Fixed.
* Bouncy Castle was bouncing the laser from inside. Fixed. - Bouncy Castle was bouncing the laser from inside. Fixed.
* Shielded tanks were autodestructing when shooting with angle 0. Fixed. - Shielded tanks were autodestructing when shooting with angle 0. Fixed.
* Physics of bouncing off the walls was incorrect for some weapons. Fixed. - Physics of bouncing off the walls was incorrect for some weapons. Fixed.
###### Version 1.19 ###### Version 1.19
2022-11-04 2022-11-04
This is the final round of weapon additions! Also. our beloved testers and players found a number of issues and we were extremely happy to address them. This is the final round of weapon additions! Also. our beloved testers and players found a number of issues and we were extremely happy to address them.
* New defensive weapon "Lazy Boy" - aims at the closest enemy. - New defensive weapon "Lazy Boy" - aims at the closest enemy.
* New defensive weapon "Lazy Darwin" - aims at the weakest link, an enemy I mean. - New defensive weapon "Lazy Darwin" - aims at the weakest link, an enemy I mean.
* New defensive weapon "Auto Defense" - activate it to be automatically protected by shields and stuff (where available) - New defensive weapon "Auto Defense" - activate it to be automatically protected by shields and stuff (where available)
* New defensive weapon "Spy Hard" - quickly view energies, weapons and shields of your opponents. - New defensive weapon "Spy Hard" - quickly view energies, weapons and shields of your opponents.
* New SFXes, improvements in SFX, and music by @mikerro - New SFXes, improvements in SFX, and music by @mikerro
* Shooting with angle 0 caused the sudden death of the operator. Fixed. - Shooting with angle 0 caused the sudden death of the operator. Fixed.
* Angles were asymmetrical, now you can go from 0 to 90 and to 0 again (181 degrees of freedom). Fixed with an improved arithmetic rounding of our sub-pixel accuracy. - Angles were asymmetrical, now you can go from 0 to 90 and to 0 again (181 degrees of freedom). Fixed with an improved arithmetic rounding of our sub-pixel accuracy.
* Drawing a barrel when a tank was on the edge of X==256 pixels caused a lonely pixel to appear randomly. Fixed. - Drawing a barrel when a tank was on the edge of X==256 pixels caused a lonely pixel to appear randomly. Fixed.
* Liquid Dirt was overflowing from the right edge of the screen to the left. Fixed. - Liquid Dirt was overflowing from the right edge of the screen to the left. Fixed.
* Liquid Dirt volume increased significantly, it is now a formidable attack! - Liquid Dirt volume increased significantly, it is now a formidable attack!
* A single pixel was erroneously plotted when measuring distance (was visible in e.g., Death's Head). Fixed. - A single pixel was erroneously plotted when measuring distance (was visible in e.g., Death's Head). Fixed.
* Not all traces were correctly erased after Funky Bomb, fixed again (for the 3rt time I guess). - Not all traces were correctly erased after Funky Bomb, fixed again (for the 3rt time I guess).
* Soil sedimentation speed after Funky Bomb improved. - Soil sedimentation speed after Funky Bomb improved.
* Pressing [ESC] when in inventory/store was quitting the game, now it quits the menu only. - Pressing [ESC] when in inventory/store was quitting the game, now it quits the menu only.
* A bug in MADS optimization was causing parts of SEPPUKU message to stay on screen. - A bug in MADS optimization was causing parts of SEPPUKU message to stay on screen.
* BIGGEST OF ALL: the lonely pixel after Nuclear Winter was eliminated. https://github.com/pkali/scorch_src/issues/103 We have spent a disproportionately large amount of time trying to slap this bug. It is still there, but is not manifesting itself ;) - BIGGEST OF ALL: the lonely pixel after Nuclear Winter was eliminated. https://github.com/pkali/scorch_src/issues/103 We have spent a disproportionately large amount of time trying to slap this bug. It is still there, but is not manifesting itself ;)
###### Version 1.18 ###### Version 1.18
2022-11-07 2022-11-07
Possibly the final single-player version of the game, unless our dear players find another breaking issue! Possibly the final single-player version of the game, unless our dear players find another breaking issue!
* 5200 keypad works as it should. You can now press these finicky foils to your heart's desire. - 5200 keypad works as it should. You can now press these finicky foils to your heart's desire.
* "Unknown" type Robotanks were attacking with Nuclear Winter every time. Fixed! - "Unknown" type Robotanks were attacking with Nuclear Winter every time. Fixed!
* One of the variables was declared as a byte but used as a word that might cause some rare instabilities. - One of the variables was declared as a byte but used as a word that might cause some rare instabilities.
* Page zero variables are cleared prior to the game start to eliminate rare issues in some software/hardware configurations. - Page zero variables are cleared prior to the game start to eliminate rare issues in some software/hardware configurations.
* The new version of music in NTSC eliminates issues with tempo (not that anyone but the artist noticed that, but still it is an improvement!) - The new version of music in NTSC eliminates issues with tempo (not that anyone but the artist noticed that, but still it is an improvement!)
* You can now wrap around inventory and shop to faster access these options far down below. - You can now wrap around inventory and shop to faster access these options far down below.
* Visual improvement of the main menu and fixed some color issues with the title headers. - Visual improvement of the main menu and fixed some color issues with the title headers.
* Hovercraft was always flying to the top of the screen, it was not intended, it is now hovering just above the mountains! - Hovercraft was always flying to the top of the screen, it was not intended, it is now hovering just above the mountains!
* The main menu does not blink now when changing options. This was a very minor thing but it bothered me to some extent. Fixing it required a complete rewrite of this portion of the menu. - The main menu does not blink now when changing options. This was a very minor thing but it bothered me to some extent. Fixing it required a complete rewrite of this portion of the menu.
###### Version 1.17 ###### Version 1.17
2022-10-31 2022-10-31
Mostly 5200 console port and NTSC improvements. Mostly 5200 console port and NTSC improvements.
* Updated songs from Miker do not require skipping frames on NTSC machines. Crucial for the next point. - Updated songs from Miker do not require skipping frames on NTSC machines. Crucial for the next point.
* Bouncy Castle bouncing of Funky Bomb fixed https://github.com/pkali/scorch_src/issues/129 - Bouncy Castle bouncing of Funky Bomb fixed https://github.com/pkali/scorch_src/issues/129
* 5200 version had various graphical and sound glitches. Although mostly harmless, it hurt our sense of aesthetics. First of all the flickering credits roll is all good now. - 5200 version had various graphical and sound glitches. Although mostly harmless, it hurt our sense of aesthetics. First of all the flickering credits roll is all good now.
* Rare hang-ups on NTSC machines fixed - Rare hang-ups on NTSC machines fixed
* Screen lowered down by 7 scan lines to help top status line on NTSC CRTs. - Screen lowered down by 7 scan lines to help top status line on NTSC CRTs.
* 5200 ATTRACT mode not going away fixed - 5200 ATTRACT mode not going away fixed
* Autorepeat added to menus what should help 5200 users with their non-centering abomination of a controller. - Autorepeat added to menus what should help 5200 users with their non-centering abomination of a controller.
* DLI interrupts optimized, few cycles saved. - DLI interrupts optimized, few cycles saved.
* 5200 keypad sort-of-works. Please refer to manual for key bindings. - 5200 keypad sort-of-works. Please refer to manual for key bindings.
###### Version 1.16 ###### Version 1.16
@@ -236,7 +254,7 @@ Cramming the game into a 32KiB cart and 16KiB RAM was a big task - it required a
The release is not perfect - we have a number of glitches and improvements to the 5200 controller procedures to work on, but the game is playable. The release is not perfect - we have a number of glitches and improvements to the 5200 controller procedures to work on, but the game is playable.
Changes: Changes:
* numerous, but not very visible - numerous, but not very visible
###### Version 1.14 ###### Version 1.14
@@ -246,12 +264,12 @@ Minor bugfixes and optimizations.
Just a small update to allow for more testing and having fun before the bigger release. Just a small update to allow for more testing and having fun before the bigger release.
Changes: Changes:
* Numerous optimizations that require a solid test. Please have fun and report issues! - Numerous optimizations that require a solid test. Please have fun and report issues!
* Small DrawTanks fix. - Small DrawTanks fix.
* Bouncy Castle bounces like it should. - Bouncy Castle bounces like it should.
* Tracer and Smoke Tracer are not causing defense weapons to trigger anymore. - Tracer and Smoke Tracer are not causing defense weapons to trigger anymore.
* In rare cases direct hit was not accounted for correctly. - In rare cases direct hit was not accounted for correctly.
* Manuals updated. https://github.com/pkali/scorch_src/releases/tag/v1.16 - Manuals updated. https://github.com/pkali/scorch_src/releases/tag/v1.16
###### Version 1.13 ###### Version 1.13
@@ -262,13 +280,13 @@ Getting ready for porting the game!
Several heavy optimizations and code cleanups in preparation for an unexpected port. Several heavy optimizations and code cleanups in preparation for an unexpected port.
Changes: Changes:
* Overhaul of AI - Cyborgs, Spoilers, and Choosers aim much better. - Overhaul of AI - Cyborgs, Spoilers, and Choosers aim much better.
* Cyborgs prefer to kill humans. - Cyborgs prefer to kill humans.
* Fine tuning of AI purchases makes the difficulty level aligned with the robot level. - Fine tuning of AI purchases makes the difficulty level aligned with the robot level.
* Fixed a very difficult and elusive bug that was causing tanks to freeze when falling close to the right edge of the screen fixed. - Fixed a very difficult and elusive bug that was causing tanks to freeze when falling close to the right edge of the screen fixed.
* Updated music by @Miker - Updated music by @Miker
* It is now possible to enter tank names with a joystick - all essential game functions are available without touching the keyboard! - It is now possible to enter tank names with a joystick - all essential game functions are available without touching the keyboard!
* Manuals updated with AI strategy information and more. - Manuals updated with AI strategy information and more.
###### Version 1.12 ###### Version 1.12
@@ -277,12 +295,12 @@ Changes:
What is going on? Are we getting crazy or what? What is going on? Are we getting crazy or what?
Changes: Changes:
* Background color indicates the type of walls. This is very useful when the rand option is selected. - Background color indicates the type of walls. This is very useful when the rand option is selected.
* XEGS users requested that console keys are used when no keyboard is attached! We delivered! [SELECT] to select an offensive weapon, [OPTION] to jump into inventory, defensive section, [START] + [OPTION] - immediate Game Over (no confirmation for you keyboardless folks) - XEGS users requested that console keys are used when no keyboard is attached! We delivered! [SELECT] to select an offensive weapon, [OPTION] to jump into inventory, defensive section, [START] + [OPTION] - immediate Game Over (no confirmation for you keyboardless folks)
* A very silly bug detected by our young testers fixed - the game crashed when you built a very high mountain using Dirt Balls :) - A very silly bug detected by our young testers fixed - the game crashed when you built a very high mountain using Dirt Balls :)
* Boxy infinite bounce bug fixed. - Boxy infinite bounce bug fixed.
* Funky bombs bounce off the walls! - Funky bombs bounce off the walls!
* The first letter entered for a tank name was inserted in the wrong spot. How did it work at all? Magic. - The first letter entered for a tank name was inserted in the wrong spot. How did it work at all? Magic.
[ESC] now correctly exits the purchase screen. [ESC] now correctly exits the purchase screen.
@@ -294,8 +312,8 @@ A release lollapalooza.
The silliness indicator crashed. What are we doing? The silliness indicator crashed. What are we doing?
Changes: Changes:
* A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values. - A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values.
* Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change. - Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change.
###### Version 1.10 ###### Version 1.10
2022-08-21 2022-08-21
@@ -307,22 +325,22 @@ This release brings a swath of gameplay updates and a generous dose of a new sil
Version number bump reflects number of unreleased versions and amount of changes. Version number bump reflects number of unreleased versions and amount of changes.
Changes: Changes:
* Defensive weapons can be activated before the round to make for the unbeatable aiming precision of the robotanks. - Defensive weapons can be activated before the round to make for the unbeatable aiming precision of the robotanks.
* Fixed bug with Long Schlong activation taking one Schlong too many. - Fixed bug with Long Schlong activation taking one Schlong too many.
* Smoke Tracer not disappearing smoke fixed. - Smoke Tracer not disappearing smoke fixed.
* Bug allowing for infinite shooting outside the screen fixed. - Bug allowing for infinite shooting outside the screen fixed.
* Tank colors and P/M sequence as devised by Adam, the gfx artist. Tanks differ more and look better. https://github.com/pkali/scorch_src/issues/119 - Tank colors and P/M sequence as devised by Adam, the gfx artist. Tanks differ more and look better. https://github.com/pkali/scorch_src/issues/119
* New item in the shop - loot box "Buy me!" with a surprise inside. https://github.com/pkali/scorch_src/issues/97 - New item in the shop - loot box "Buy me!" with a surprise inside. https://github.com/pkali/scorch_src/issues/97
* Tank names can have s p a c e s now! https://github.com/pkali/scorch_src/issues/120 - Tank names can have s p a c e s now! https://github.com/pkali/scorch_src/issues/120
* Tanks are mobile now thanks to the new defensive option - Hovercraft https://github.com/pkali/scorch_src/issues/52 - Tanks are mobile now thanks to the new defensive option - Hovercraft https://github.com/pkali/scorch_src/issues/52
* Main atari library switched to a more standard version based on Mapping the Atari - Main atari library switched to a more standard version based on Mapping the Atari
* Huge memory optimizations to allow for the new features. - Huge memory optimizations to allow for the new features.
* Narrow screen in shop / inventory (many bytes saved). - Narrow screen in shop / inventory (many bytes saved).
* Explosion range corrections for a rare event of non-lethal Nuke explosions. - Explosion range corrections for a rare event of non-lethal Nuke explosions.
* Pressing [A] jumps into defensive weapons activation directly. - Pressing [A] jumps into defensive weapons activation directly.
* Elusive randomize force error causing rare hangups for Tosser fixed. - Elusive randomize force error causing rare hangups for Tosser fixed.
* Activation of defensive weapons moved to front. - Activation of defensive weapons moved to front.
* Additional SFX for new weapons. - Additional SFX for new weapons.
###### Version 1.00 ###### Version 1.00
2022-08-13 2022-08-13
@@ -336,18 +354,18 @@ All 48KB+ 8-bit Atari computers are supported.
Thank you @Pecusx and @Miker for your hard work over the last few weeks - I was almost entirely absent because of the real-world attack. Thank you @Pecusx and @Miker for your hard work over the last few weeks - I was almost entirely absent because of the real-world attack.
Most important changes: Most important changes:
* New Game Over screen with a summary of wins, direct hits and earned cash. https://github.com/pkali/scorch_src/issues/9 - New Game Over screen with a summary of wins, direct hits and earned cash. https://github.com/pkali/scorch_src/issues/9
* Tank barrels are drawn procedurally to make aiming easier.. - Tank barrels are drawn procedurally to make aiming easier..
* Various SFX and music updates with new tunes for all parts of the game. https://github.com/pkali/scorch_src/issues/112 - Various SFX and music updates with new tunes for all parts of the game. https://github.com/pkali/scorch_src/issues/112
* AI can use White Flag. - AI can use White Flag.
* 3 different tank shapes https://github.com/pkali/scorch_src/issues/64. - 3 different tank shapes https://github.com/pkali/scorch_src/issues/64.
* All AI levels are programmed. Cyborg is tough! https://github.com/pkali/scorch_src/issues/40 - All AI levels are programmed. Cyborg is tough! https://github.com/pkali/scorch_src/issues/40
* New weapon - Long Schlong! - New weapon - Long Schlong!
* New splash screen. - New splash screen.
* Game mechanics improved. - Game mechanics improved.
* [O] key skips to the Game Over screen. - [O] key skips to the Game Over screen.
* The game works on Atari 800. - The game works on Atari 800.
* Huge amount of optimizations to squeeze the game into 48K. - Huge amount of optimizations to squeeze the game into 48K.
And now the new adventure begins! And now the new adventure begins!
@@ -423,10 +441,10 @@ The new inventory system has been added. Call it by pressing the "I" key or shor
Another significant playability change is #54 - it is not finished yet, but keeping the joystick up or down makes force increase/decrease faster. Also - short press of fire calls Inventory, long press fires the shell. The timings are experimental, please let me know if this needs a modification/improvement. Another significant playability change is #54 - it is not finished yet, but keeping the joystick up or down makes force increase/decrease faster. Also - short press of fire calls Inventory, long press fires the shell. The timings are experimental, please let me know if this needs a modification/improvement.
Tickets closed: Tickets closed:
* https://github.com/pkali/scorch_src/issues/92 - less unnecessary cleaning of the offensive texts - https://github.com/pkali/scorch_src/issues/92 - less unnecessary cleaning of the offensive texts
* https://github.com/pkali/scorch_src/issues/89 - improved collisions with tank - https://github.com/pkali/scorch_src/issues/89 - improved collisions with tank
* https://github.com/pkali/scorch_src/issues/71 - ditto - https://github.com/pkali/scorch_src/issues/71 - ditto
* https://github.com/pkali/scorch_src/issues/11, https://github.com/pkali/scorch_src/issues/26, https://github.com/pkali/scorch_src/issues/8, https://github.com/pkali/scorch_src/issues/20 - new inventory system - https://github.com/pkali/scorch_src/issues/11, https://github.com/pkali/scorch_src/issues/26, https://github.com/pkali/scorch_src/issues/8, https://github.com/pkali/scorch_src/issues/20 - new inventory system
###### Build 143 ###### Build 143
2022-06-05 2022-06-05
+23 -21
View File
@@ -83,7 +83,7 @@ AIRoutines
mwa #800 RandBoundaryHigh mwa #800 RandBoundaryHigh
jsr RandomizeForce jsr RandomizeForce
; choose the best weapon ; choose the best weapon
ldy #ind_Buy_me_________+1 ; if the cheat is active it will fire the BFG :) ldy #ind_Buy_me +1 ; if the cheat is active it will fire the BFG :)
jmp ChooseBestOffensive.NotFromAll jmp ChooseBestOffensive.NotFromAll
;rts ;rts
.endp .endp
@@ -203,8 +203,8 @@ forceNow
endo endo
; choose the best weapon ; choose the best weapon
jsr ChooseBestOffensive jmp ChooseBestOffensive
rts ; rts
;---------------------------------------------- ;----------------------------------------------
AngleTable ; 16 bytes ;ba w $348b L$3350 AngleTable ; 16 bytes ;ba w $348b L$3350
@@ -219,8 +219,10 @@ AngleTable ; 16 bytes ;ba w $348b L$3350
cmp #5 cmp #5
bcs EnoughEnergy bcs EnoughEnergy
; lower than 5 units - white flag ; lower than 5 units - white flag
lda #ind_White_Flag_____ jsr ClearTankNr ; we must hide tank to erase shields (issue #138)
lda #ind_White_Flag
sta ActiveDefenceWeapon,x sta ActiveDefenceWeapon,x
jsr PutTankNr ; and draw tank witch Flag
EnoughEnergy EnoughEnergy
rts rts
.endp .endp
@@ -231,7 +233,7 @@ EnoughEnergy
cmp #30 cmp #30
bcs EnoughEnergy bcs EnoughEnergy
; lower than 30 units - check battery ; lower than 30 units - check battery
ldy #ind_Battery________ ldy #ind_Battery
lda (temp),y ; has address of TanksWeaponsTable lda (temp),y ; has address of TanksWeaponsTable
beq NoBatteries beq NoBatteries
; we have batteries - use one ; we have batteries - use one
@@ -258,7 +260,7 @@ NoBatteries
ldy #last_real_defensive+1 ;the last defensive weapon ldy #last_real_defensive+1 ;the last defensive weapon
@ @
dey dey
cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use)
beq NoUseDefensive beq NoUseDefensive
lda (temp),y ; has address of TanksWeaponsTable lda (temp),y ; has address of TanksWeaponsTable
beq @- beq @-
@@ -293,7 +295,7 @@ DefensiveInUse
ldy #last_real_defensive+1 ;the last defensive weapon ldy #last_real_defensive+1 ;the last defensive weapon
@ @
dey dey
cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use)
beq NoUseDefensive beq NoUseDefensive
lda (temp),y ; has address of TanksWeaponsTable lda (temp),y ; has address of TanksWeaponsTable
beq @- beq @-
@@ -337,7 +339,7 @@ NotNegativeEnergy
jsr GetDistance jsr GetDistance
cmp #6 ; 24/4 cmp #6 ; 24/4
bcs HighForce bcs HighForce
lda #ind_Baby_Missile___ lda #ind_Baby_Missile
sta ActiveWeapon,x sta ActiveWeapon,x
HighForce HighForce
rts rts
@@ -369,7 +371,7 @@ NotNegativeEnergy
jsr GetDistance jsr GetDistance
cmp #6 ; 24/4 cmp #6 ; 24/4
bcs HighForce bcs HighForce
lda #ind_Baby_Missile___ lda #ind_Baby_Missile
sta ActiveWeapon,x sta ActiveWeapon,x
HighForce HighForce
rts rts
@@ -387,7 +389,7 @@ HighForce
jsr TakeAim ; direction still in A (0 - left, >0 - right) jsr TakeAim ; direction still in A (0 - left, >0 - right)
; choose the best weapon ; choose the best weapon
ldy #ind_Nuke___________+1 ldy #ind_Nuke +1
jsr ChooseBestOffensive.NotFromAll jsr ChooseBestOffensive.NotFromAll
lda Force lda Force
@@ -398,7 +400,7 @@ HighForce
jsr GetDistance jsr GetDistance
cmp #8 ;32/4 cmp #8 ;32/4
bcs HighForce bcs HighForce
lda #ind_Baby_Missile___ lda #ind_Baby_Missile
sta ActiveWeapon,x sta ActiveWeapon,x
HighForce HighForce
rts rts
@@ -554,7 +556,7 @@ RepeatAim
adc temp2 adc temp2
sta NewAngle sta NewAngle
; set virtual weapon :) ; set virtual weapon :)
lda #ind_Baby_Missile___ lda #ind_Baby_Missile
sta ActiveWeapon,x sta ActiveWeapon,x
; now we have initial valuses ; now we have initial valuses
mva #%11000000 TestFlightFlag mva #%11000000 TestFlightFlag
@@ -871,7 +873,7 @@ SorryNoPurchase
; mva #2 tempXroller; number of offensive purchases to perform ; mva #2 tempXroller; number of offensive purchases to perform
ldx TankNr ldx TankNr
@ @
randomize ind_Battery________ ind_StrongParachute randomize ind_Battery ind_StrongParachute
jsr TryToPurchaseOnePiece jsr TryToPurchaseOnePiece
; dec tempXroller ; dec tempXroller
; bne @- ; bne @-
@@ -880,7 +882,7 @@ SorryNoPurchase
mva #4 tempXroller; number of offensive purchases to perform mva #4 tempXroller; number of offensive purchases to perform
;ldx TankNr ;ldx TankNr
@ @
randomize ind_Missile________ ind_Heavy_Roller___ randomize ind_Missile ind_Heavy_Roller
jsr TryToPurchaseOnePiece jsr TryToPurchaseOnePiece
dec tempXroller dec tempXroller
bne @- bne @-
@@ -893,7 +895,7 @@ SorryNoPurchase
; mva #2 tempXroller; number of offensive purchases to perform ; mva #2 tempXroller; number of offensive purchases to perform
ldx TankNr ldx TankNr
@ @
randomize ind_Battery________ ind_Bouncy_Castle__ randomize ind_Battery ind_Bouncy_Castle
jsr TryToPurchaseOnePiece jsr TryToPurchaseOnePiece
dec tempXroller dec tempXroller
; bpl @- ; bpl @-
@@ -902,7 +904,7 @@ SorryNoPurchase
mva #6 tempXroller; number of purchases to perform mva #6 tempXroller; number of purchases to perform
;ldx TankNr ;ldx TankNr
@ @
randomize ind_Missile________ ind_Dirt_Charge____ randomize ind_Missile ind_Dirt_Charge
jsr TryToPurchaseOnePiece jsr TryToPurchaseOnePiece
dec tempXroller dec tempXroller
bne @- bne @-
@@ -920,7 +922,7 @@ SorryNoPurchase
; first try to buy defensives ; first try to buy defensives
; mva #1 tempXroller; number of defensive purchases to perform ; mva #1 tempXroller; number of defensive purchases to perform
@ @
randomize ind_Battery________ ind_Bouncy_Castle__ randomize ind_Battery ind_Bouncy_Castle
jsr TryToPurchaseOnePiece jsr TryToPurchaseOnePiece
dec tempXroller dec tempXroller
bpl @- bpl @-
@@ -930,7 +932,7 @@ SorryNoPurchase
asl ;*2 asl ;*2
sta tempXroller ; perform this many purchase attempts sta tempXroller ; perform this many purchase attempts
@ @
randomize ind_Missile________ ind_Dirt_Charge____ randomize ind_Missile ind_Dirt_Charge
jsr TryToPurchaseOnePiece jsr TryToPurchaseOnePiece
dec tempXroller dec tempXroller
bpl @- bpl @-
@@ -948,7 +950,7 @@ SorryNoPurchase
; first try to buy defensives ; first try to buy defensives
; mva #1 tempXroller; number of defensive purchases to perform ; mva #1 tempXroller; number of defensive purchases to perform
@ @
randomize ind_Battery________ ind_Bouncy_Castle__ randomize ind_Battery ind_Bouncy_Castle
jsr TryToPurchaseOnePiece2 jsr TryToPurchaseOnePiece2
dec tempXroller dec tempXroller
bpl @- bpl @-
@@ -958,7 +960,7 @@ SorryNoPurchase
:3 asl ;*8 :3 asl ;*8
sta tempXroller ; perform this many purchase attempts sta tempXroller ; perform this many purchase attempts
@ @
randomize first_offensive____ last_offensive_____ randomize first_offensive last_offensive
jsr TryToPurchaseOnePiece2 jsr TryToPurchaseOnePiece2
dec tempXroller dec tempXroller
bpl @- bpl @-
@@ -970,7 +972,7 @@ SorryNoPurchase
; choose the best weapon ; choose the best weapon
; X - TankNr ; X - TankNr
;---------------------------------------------- ;----------------------------------------------
ldy #ind_Dirt_Charge____+1 ;the last weapon to choose +1 (not BFG or Laser :) ) ldy #ind_Dirt_Charge +1 ;the last weapon to choose +1 (not BFG or Laser :) )
NotFromAll NotFromAll
; Y - the last offensive weapon to use + 1 ; Y - the last offensive weapon to use + 1
lda TanksWeaponsTableL,x lda TanksWeaponsTableL,x
-1
View File
@@ -17,4 +17,3 @@ pressed
jmp @- jmp @-
run joytest run joytest
+1 -1
View File
@@ -620,7 +620,7 @@ rmt_p5
.IF TARGET = 800 .IF TARGET = 800
ldx #$10 ; pseudo stereo ldx #$10 ; pseudo stereo
bne SetPokey_OffsetX ; pseudo stereo bne SetPokey_OffsetX ; pseudo stereo
.ELSE .ELIF TARGET = 5200
rts rts
.ENDIF .ENDIF
SetPokey SetPokey
-1
View File
@@ -150,4 +150,3 @@ skip
stereo_buff ; stereo stereo_buff ; stereo
.ds 9 ; stereo .ds 9 ; stereo
+4 -4
View File
@@ -77,7 +77,7 @@ L72 dta d"FAREWELL, CRUEL WORLD."
L73 dta d"REMEMBER THE ALAMO!" L73 dta d"REMEMBER THE ALAMO!"
L74 dta d"OH MAN!" L74 dta d"OH MAN!"
L75 dta d"DOOUGH!" L75 dta d"DOOUGH!"
L76 dta d"ANOTHER DAY, ANOTHER BOMB." L76 dta d"NEW DAY, NEW BOMB."
L77 dta d"THIS IS THE END, MY ONLY FRIEND." L77 dta d"THIS IS THE END, MY ONLY FRIEND."
L78 dta d"VERY FUNNY." L78 dta d"VERY FUNNY."
L79 dta d"THE FAT LADY SANG." L79 dta d"THE FAT LADY SANG."
@@ -89,7 +89,7 @@ L84 dta d"POW!"
L85 dta d"BIF!" L85 dta d"BIF!"
L86 dta d"BAM!" L86 dta d"BAM!"
L87 dta d"ZONK!" L87 dta d"ZONK!"
L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER..." L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER."
L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..." L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..."
L90 dta d"WHAT WAS THAT NOISE?" L90 dta d"WHAT WAS THAT NOISE?"
L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS." L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS."
@@ -114,8 +114,8 @@ L109 dta d"I'VE FALLEN AND I CAN'T GET UP!"
L110 dta d"911?" L110 dta d"911?"
L111 dta d"OH NO! HERE I BLOW AGAIN!" L111 dta d"OH NO! HERE I BLOW AGAIN!"
L112 dta d"I'LL BE BACK..." L112 dta d"I'LL BE BACK..."
L113 dta d"HEY - I'VE GOT LAWYERS." L113 dta d"I'VE GOT LAWYERS!"
L114 dta d"TIME TO CALL 1-900-SUE-TANK." L114 dta d"CALL 1-900-SUE-TANK."
L115 dta d"YOU BIG DUMMY!" ;(sanford and son) L115 dta d"YOU BIG DUMMY!" ;(sanford and son)
LEND LEND
OffensiveTextTableL OffensiveTextTableL
+238 -232
View File
@@ -32,9 +32,13 @@ LevelNameBeginH
.by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) .by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84)
;-------------- ;--------------
TanksWeaponsTableL TanksWeaponsTableL
.by <TanksWeapon1,<TanksWeapon2,<TanksWeapon3,<TanksWeapon4,<TanksWeapon5,<TanksWeapon6 .REPT MaxPlayers, #+1
.by <TanksWeapon:1
.ENDR
TanksWeaponsTableH TanksWeaponsTableH
.by >TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 .REPT MaxPlayers, #+1
.by >TanksWeapon:1
.ENDR
;-------------- ;--------------
XtankOffsetGO_L XtankOffsetGO_L
.by 6,56,106,156,206,0 .by 6,56,106,156,206,0
@@ -55,7 +59,12 @@ LineGameOver
seppukuText seppukuText
dta d"# SEPPUKU! #" dta d"# SEPPUKU! #"
areYouSureText areYouSureText
.IF TARGET = 800
dta d"# SURE? Y/N #" dta d"# SURE? Y/N #"
.ELIF TARGET = 5200
dta d"#END? Y-1/N-0#"
.ENDIF
lineClear lineClear
dta d" " dta d" "
@@ -69,12 +78,12 @@ GradientAddrH
.by >dliColorsFore, >dliColorsFore, >dliColorsFore2 .by >dliColorsFore, >dliColorsFore, >dliColorsFore2
dliColorsFore2 ; colors for NTSC dliColorsFore2 ; colors for NTSC
.by $0a ; one mountains color .by $0a ; one mountains color
.by $7e,$7a,$7c,$6a,$6c,$58,$5a,$48,$4a,$38 .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a
.by $3a,$16,$18,$e6,$e8,$d4,$d6,$b4,$b6,$b6 .by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8
dliColorsFore2PAL ; colors for PAL dliColorsFore2PAL ; colors for PAL
.by $0a ; one mountains color .by $0a ; one mountains color
.by $7e,$7a,$7c,$6a,$6c,$58,$5a,$48,$4a,$38 .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a
.by $3a,$16,$18,$e6,$e8,$c4,$c6,$a4,$a6,$a6 .by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8
;----------- ;-----------
pmtableL ; addressess of the P/M memory for 6 tanks pmtableL ; addressess of the P/M memory for 6 tanks
@@ -197,12 +206,9 @@ bittable2
;---------------------------- ;----------------------------
disktance ;tanks distance disktance ;tanks distance
.by 0,0 .by 0,0
.by screenwidth/3 .REPT MaxPlayers-1, #+3
.by screenwidth/4 .by screenwidth/:1
.by screenwidth/5 .ENDR
.by screenwidth/6
.by screenwidth/7
;max number of players=6
; this table is for deciding where a tank should slide ; this table is for deciding where a tank should slide
; accordingly to what is below the tank ; accordingly to what is below the tank
@@ -222,113 +228,113 @@ TanksNamesDefault
dta d"1st.Tank" dta d"1st.Tank"
dta d"2nd.Tank" dta d"2nd.Tank"
dta d"3rd.Tank" dta d"3rd.Tank"
dta d"4th.Tank" .REPT MaxPlayers-3, #+4
dta d"5th.Tank" dta d":1th.Tank"
dta d"6th.Tank" .ENDR
;------------------------------------------------- ;-------------------------------------------------
TankShapesTable .BYTE char_tank1___________ TankShapesTable .BYTE char_tank1
.BYTE char_tank2___________ .BYTE char_tank2
.BYTE char_tank3___________ .BYTE char_tank3
.BYTE char_tank4___________ .BYTE char_tank4
;------------------------------------------------- ;-------------------------------------------------
WeaponPriceH ; weapons prices (tables with prices of weapons) WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Baby_Missile___ .by >price_Baby_Missile
.by >price_Missile________ .by >price_Missile
.by >price_Baby_Nuke______ .by >price_Baby_Nuke
.by >price_Nuke___________ .by >price_Nuke
.by >price_LeapFrog_______ .by >price_LeapFrog
.by >price_Funky_Bomb_____ .by >price_Funky_Bomb
.by >price_MIRV___________ .by >price_MIRV
.by >price_Death_s_Head___ .by >price_Death_s_Head
.by >price_Napalm_________ .by >price_Napalm
.by >price_Hot_Napalm_____ .by >price_Hot_Napalm
.by >price_Tracer_________ .by >price_Tracer
.by >price_Smoke_Tracer___ .by >price_Smoke_Tracer
.by >price_Baby_Roller____ .by >price_Baby_Roller
.by >price_Roller_________ .by >price_Roller
.by >price_Heavy_Roller___ .by >price_Heavy_Roller
.by >price_Riot_Charge____ .by >price_Riot_Charge
.by >price_Riot_Blast_____ .by >price_Riot_Blast
.by >price_Riot_Bomb______ .by >price_Riot_Bomb
.by >price_Heavy_Riot_Bomb .by >price_Heavy_Riot_Bomb
.by >price_Baby_Digger____ .by >price_Baby_Digger
.by >price_Digger_________ .by >price_Digger
.by >price_Heavy_Digger___ .by >price_Heavy_Digger
.by >price_Baby_Sandhog___ .by >price_Baby_Sandhog
.by >price_Sandhog________ .by >price_Sandhog
.by >price_Heavy_Sandhog__ .by >price_Heavy_Sandhog
.by >price_Dirt_Clod______ .by >price_Dirt_Clod
.by >price_Dirt_Ball______ .by >price_Dirt_Ball
.by >price_Ton_of_Dirt____ .by >price_Ton_of_Dirt
.by >price_Liquid_Dirt____ .by >price_Liquid_Dirt
.by >price_Dirt_Charge____ .by >price_Dirt_Charge
.by >price_Buy_me_________ .by >price_Buy_me
.by >price_Laser__________ .by >price_Laser
.by >price_White_Flag_____ .by >price_White_Flag
.by >price_Battery________ .by >price_Battery
.by >price_Hovercraft_____ .by >price_Hovercraft
.by >price_Parachute______ .by >price_Parachute
.by >price_StrongParachute .by >price_StrongParachute
.by >price_Mag_Deflector__ .by >price_Mag_Deflector
.by >price_Shield_________ .by >price_Shield
.by >price_Heavy_Shield___ .by >price_Heavy_Shield
.by >price_Force_Shield___ .by >price_Force_Shield
.by >price_Bouncy_Castle__ .by >price_Bouncy_Castle
.by >price_Long_Barrel____ .by >price_Long_Barrel
.by >price_Nuclear_Winter_ .by >price_Nuclear_Winter_
.by >price_Lazy_Boy_______ .by >price_Lazy_Boy
.by >price_Lazy_Darwin____ .by >price_Lazy_Darwin
.by >price_Auto_Defense___ .by >price_Auto_Defense
.by >price_Spy_Hard_______ .by >price_Spy_Hard
WeaponPriceL WeaponPriceL
.by <price_Baby_Missile___ .by <price_Baby_Missile
.by <price_Missile________ .by <price_Missile
.by <price_Baby_Nuke______ .by <price_Baby_Nuke
.by <price_Nuke___________ .by <price_Nuke
.by <price_LeapFrog_______ .by <price_LeapFrog
.by <price_Funky_Bomb_____ .by <price_Funky_Bomb
.by <price_MIRV___________ .by <price_MIRV
.by <price_Death_s_Head___ .by <price_Death_s_Head
.by <price_Napalm_________ .by <price_Napalm
.by <price_Hot_Napalm_____ .by <price_Hot_Napalm
.by <price_Tracer_________ .by <price_Tracer
.by <price_Smoke_Tracer___ .by <price_Smoke_Tracer
.by <price_Baby_Roller____ .by <price_Baby_Roller
.by <price_Roller_________ .by <price_Roller
.by <price_Heavy_Roller___ .by <price_Heavy_Roller
.by <price_Riot_Charge____ .by <price_Riot_Charge
.by <price_Riot_Blast_____ .by <price_Riot_Blast
.by <price_Riot_Bomb______ .by <price_Riot_Bomb
.by <price_Heavy_Riot_Bomb .by <price_Heavy_Riot_Bomb
.by <price_Baby_Digger____ .by <price_Baby_Digger
.by <price_Digger_________ .by <price_Digger
.by <price_Heavy_Digger___ .by <price_Heavy_Digger
.by <price_Baby_Sandhog___ .by <price_Baby_Sandhog
.by <price_Sandhog________ .by <price_Sandhog
.by <price_Heavy_Sandhog__ .by <price_Heavy_Sandhog
.by <price_Dirt_Clod______ .by <price_Dirt_Clod
.by <price_Dirt_Ball______ .by <price_Dirt_Ball
.by <price_Ton_of_Dirt____ .by <price_Ton_of_Dirt
.by <price_Liquid_Dirt____ .by <price_Liquid_Dirt
.by <price_Dirt_Charge____ .by <price_Dirt_Charge
.by <price_Buy_me_________ .by <price_Buy_me
.by <price_Laser__________ .by <price_Laser
.by <price_White_Flag_____ .by <price_White_Flag
.by <price_Battery________ .by <price_Battery
.by <price_Hovercraft_____ .by <price_Hovercraft
.by <price_Parachute______ .by <price_Parachute
.by <price_StrongParachute .by <price_StrongParachute
.by <price_Mag_Deflector__ .by <price_Mag_Deflector
.by <price_Shield_________ .by <price_Shield
.by <price_Heavy_Shield___ .by <price_Heavy_Shield
.by <price_Force_Shield___ .by <price_Force_Shield
.by <price_Bouncy_Castle__ .by <price_Bouncy_Castle
.by <price_Long_Barrel____ .by <price_Long_Barrel
.by <price_Nuclear_Winter_ .by <price_Nuclear_Winter_
.by <price_Lazy_Boy_______ .by <price_Lazy_Boy
.by <price_Lazy_Darwin____ .by <price_Lazy_Darwin
.by <price_Auto_Defense___ .by <price_Auto_Defense
.by <price_Spy_Hard_______ .by <price_Spy_Hard
;------------------------------------------------- ;-------------------------------------------------
; how many units (bulletd) of a given weapon we get for a given price ; how many units (bulletd) of a given weapon we get for a given price
@@ -337,54 +343,54 @@ WeaponPriceL
; is not present in the game. ; is not present in the game.
; This is the slot for adding new weapons. ; This is the slot for adding new weapons.
WeaponUnits WeaponUnits
.by 10 ;Baby_Missile___;_00 .by 10 ;Baby_Missile ;_00
.by 5 ;Missile________;_01 .by 5 ;Missile ;_01
.by 2 ;Baby_Nuke______;_02 .by 2 ;Baby_Nuke ;_02
.by 1 ;Nuke___________;_03 .by 1 ;Nuke ;_03
.by 2 ;LeapFrog_______;_04 .by 2 ;LeapFrog ;_04
.by 3 ;Funky_Bomb_____;_05 .by 3 ;Funky_Bomb ;_05
.by 2 ;MIRV___________;_06 .by 2 ;MIRV ;_06
.by 1 ;Death_s_Head___;_07 .by 1 ;Death_s_Head ;_07
.by 4 ;Napalm_________;_08 .by 4 ;Napalm ;_08
.by 2 ;Hot_Napalm_____;_09 .by 2 ;Hot_Napalm ;_09
.by 20 ;Tracer_________;_10 .by 20 ;Tracer ;_10
.by 10 ;Smoke_Tracer___;_11 .by 10 ;Smoke_Tracer ;_11
.by 5 ;Baby_Roller____;_12 .by 5 ;Baby_Roller ;_12
.by 3 ;Roller_________;_13 .by 3 ;Roller ;_13
.by 2 ;Heavy_Roller___;_14 .by 2 ;Heavy_Roller ;_14
.by 5 ;Riot_Charge____;_15 .by 5 ;Riot_Charge ;_15
.by 2 ;Riot_Blast_____;_16 .by 2 ;Riot_Blast ;_16
.by 5 ;Riot_Bomb______;_17 .by 5 ;Riot_Bomb ;_17
.by 2 ;Heavy_Riot_Bomb;_18 .by 2 ;Heavy_Riot_Bomb;_18
.by 10 ;Baby_Digger____;_19 .by 10 ;Baby_Digger ;_19
.by 5 ;Digger_________;_20 .by 5 ;Digger ;_20
.by 2 ;Heavy_Digger___;_21 .by 2 ;Heavy_Digger ;_21
.by 10 ;Baby_Sandhog___;_22 .by 10 ;Baby_Sandhog ;_22
.by 5 ;Sandhog________;_23 .by 5 ;Sandhog ;_23
.by 2 ;Heavy_Sandhog__;_24 .by 2 ;Heavy_Sandhog ;_24
.by 5 ;Dirt_Clod______;_25 .by 5 ;Dirt_Clod ;_25
.by 3 ;Dirt_Ball______;_26 .by 3 ;Dirt_Ball ;_26
.by 1 ;Ton_of_Dirt____;_27 .by 1 ;Ton_of_Dirt ;_27
.by 4 ;Liquid_Dirt____;_28 .by 4 ;Liquid_Dirt ;_28
.by 2 ;Dirt_Charge____;_29 .by 2 ;Dirt_Charge ;_29
.by 1 ;Buy_me_________;_30 .by 1 ;Buy_me ;_30
.by 5 ;Laser__________;_31 .by 5 ;Laser ;_31
.by 1 ;White_Flag_____;_32 .by 1 ;White_Flag ;_32
.by 3 ;Battery________;_33 .by 3 ;Battery ;_33
.by 2 ;Floating_Tank__;_34 .by 2 ;Floating_Tank ;_34
.by 3 ;Parachute______;_35 .by 3 ;Parachute ;_35
.by 2 ;StrongParachute;_36 .by 2 ;StrongParachute;_36
.by 2 ;Mag_Deflector__;_37 .by 2 ;Mag_Deflector ;_37
.by 3 ;Shield_________;_38 .by 3 ;Shield ;_38
.by 2 ;Heavy_Shield___;_39 .by 2 ;Heavy_Shield ;_39
.by 3 ;Force_Shield___;_40 .by 3 ;Force_Shield ;_40
.by 1 ;Auto_Defense___;_41 .by 1 ;Auto_Defense ;_41
.by 2 ;Long_Barrel____;_42 .by 2 ;Long_Barrel ;_42
.by 1 ;Nuclear_Winter_;_43 .by 1 ;Nuclear_Winter_;_43
.by 2 ;Lazy_Boy_______;_44 .by 2 ;Lazy_Boy ;_44
.by 2 ;Lazy_Darwin____;_45 .by 2 ;Lazy_Darwin ;_45
.by 2 ;Auto_Defense___;_46 .by 2 ;Auto_Defense ;_46
.by 4 ;Spy_Hard_______;_47 .by 4 ;Spy_Hard ;_47
PurchaseMeTable ;weapons good to be purchased by the robot PurchaseMeTable ;weapons good to be purchased by the robot
;the comment is an index in the tables ;the comment is an index in the tables
@@ -431,54 +437,54 @@ PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg)
;------------------------------------------------- ;-------------------------------------------------
; Screen codes of icons (chars) representing a given weapon ; Screen codes of icons (chars) representing a given weapon
WeaponSymbols WeaponSymbols
.by $40 ;ind_Baby_Missile___ ;_00 .by $40 ;ind_Baby_Missile ;_00
.by $41 ;ind_Missile________ ;_01 .by $41 ;ind_Missile ;_01
.by $42 ;ind_Baby_Nuke______ ;_02 .by $42 ;ind_Baby_Nuke ;_02
.by $43 ;ind_Nuke___________ ;_03 .by $43 ;ind_Nuke ;_03
.by $44 ;ind_LeapFrog_______ ;_04 .by $44 ;ind_LeapFrog ;_04
.by $45 ;ind_Funky_Bomb_____ ;_05 .by $45 ;ind_Funky_Bomb ;_05
.by $46 ;ind_MIRV___________ ;_06 .by $46 ;ind_MIRV ;_06
.by $47 ;ind_Death_s_Head___ ;_07 .by $47 ;ind_Death_s_Head ;_07
.by $48 ;ind_Napalm_________ ;_08 .by $48 ;ind_Napalm ;_08
.by $49 ;ind_Hot_Napalm_____ ;_09 .by $49 ;ind_Hot_Napalm ;_09
.by $4a ;ind_Tracer_________ ;_10 .by $4a ;ind_Tracer ;_10
.by $4b ;ind_Smoke_Tracer___ ;_11 .by $4b ;ind_Smoke_Tracer ;_11
.by $4c ;ind_Baby_Roller____ ;_12 .by $4c ;ind_Baby_Roller ;_12
.by $4d ;ind_Roller_________ ;_13 .by $4d ;ind_Roller ;_13
.by $4e ;ind_Heavy_Roller___ ;_14 .by $4e ;ind_Heavy_Roller ;_14
.by $4f ;ind_Riot_Charge____ ;_15 .by $4f ;ind_Riot_Charge ;_15
.by $50 ;ind_Riot_Blast_____ ;_16 .by $50 ;ind_Riot_Blast ;_16
.by $51 ;ind_Riot_Bomb______ ;_17 .by $51 ;ind_Riot_Bomb ;_17
.by $52 ;ind_Heavy_Riot_Bomb ;_18 .by $52 ;ind_Heavy_Riot_Bomb ;_18
.by $53 ;ind_Baby_Digger____ ;_19 .by $53 ;ind_Baby_Digger ;_19
.by $54 ;ind_Digger_________ ;_20 .by $54 ;ind_Digger ;_20
.by $55 ;ind_Heavy_Digger___ ;_21 .by $55 ;ind_Heavy_Digger ;_21
.by $56 ;ind_Baby_Sandhog___ ;_22 .by $56 ;ind_Baby_Sandhog ;_22
.by $57 ;ind_Sandhog________ ;_23 .by $57 ;ind_Sandhog ;_23
.by $58 ;ind_Heavy_Sandhog__ ;_24 .by $58 ;ind_Heavy_Sandhog ;_24
.by $59 ;ind_Dirt_Clod______ ;_25 .by $59 ;ind_Dirt_Clod ;_25
.by $5a ;ind_Dirt_Ball______ ;_26 .by $5a ;ind_Dirt_Ball ;_26
.by $5b ;ind_Ton_of_Dirt____ ;_27 .by $5b ;ind_Ton_of_Dirt ;_27
.by $60 ;ind_Liquid_Dirt____ ;_28 .by $60 ;ind_Liquid_Dirt ;_28
.by $7b ;ind_Dirt_Charge____ ;_29 .by $7b ;ind_Dirt_Charge ;_29
.by $1f ;ind_Buy_me_________ ;_30 .by $1f ;ind_Buy_me ;_30
.by $20 ;ind_Laser__________ ;_31 .by $20 ;ind_Laser ;_31
.by $5f ;ind_White_Flag_____ ;_32 .by $5f ;ind_White_Flag ;_32
.by $1c ;ind_Battery________ ;_33 .by $1c ;ind_Battery ;_33
.by $06 ;ind_Floating_Tank__ ;_34 .by $06 ;ind_Floating_Tank ;_34
.by $1b ;ind_Parachute______ ;_35 .by $1b ;ind_Parachute ;_35
.by $1b ;ind_StrongParachute ;_36 .by $1b ;ind_StrongParachute ;_36
.by $1e ;ind_Mag_Deflector__ ;_37 .by $1e ;ind_Mag_Deflector ;_37
.by $3b ;ind_Shield_________ ;_38 .by $3b ;ind_Shield ;_38
.by $3d ;ind_Heavy_Shield___ ;_39 .by $3d ;ind_Heavy_Shield ;_39
.by $3c ;ind_Force_Shield___ ;_40 .by $3c ;ind_Force_Shield ;_40
.by $3f ;ind_Bouncy_Castle__ ;_41 .by $3f ;ind_Bouncy_Castle ;_41
.by $1d ;ind_Long_Barrel____ ;_42 .by $1d ;ind_Long_Barrel ;_42
.by $7d ;ind_Nuclear_Winter_ ;_43 .by $7d ;ind_Nuclear_Winter_ ;_43
.by $02 ;ind_Lazy_Boy_______ ;_44 .by $02 ;ind_Lazy_Boy ;_44
.by $03 ;ind_Lazy_Darwin____ ;_45 .by $03 ;ind_Lazy_Darwin ;_45
.by $5e ;ind_Auto_Defense___ ;_46 .by $5e ;ind_Auto_Defense ;_46
.by $7c ;ind_Spy_Hard_______ ;_47 .by $7c ;ind_Spy_Hard ;_47
; Names of weapons (16 chars long) ; Names of weapons (16 chars long)
NamesOfWeapons ;the comment is an index in the tables NamesOfWeapons ;the comment is an index in the tables
@@ -532,7 +538,7 @@ NamesOfWeapons ;the comment is an index in the tables
dta d"Auto Defense " ; 46 dta d"Auto Defense " ; 46
dta d"Spy Hard " ; 47 dta d"Spy Hard " ; 47
DefensiveEnergy = *-(last_offensive_____ - first_offensive____ +1) ; to fake the table for ALL weapons DefensiveEnergy = *-(last_offensive - first_offensive +1) ; to fake the table for ALL weapons
.by 00 ; White Flag .by 00 ; White Flag
.by 00 ; Heat Guidance .by 00 ; Heat Guidance
.by 98 ; Let's go! .by 98 ; Let's go!
@@ -550,22 +556,22 @@ DefensiveEnergy = *-(last_offensive_____ - first_offensive____ +1) ; to fake th
.by 00 ; Auto Defense .by 00 ; Auto Defense
.by 00 ; Spy Hard .by 00 ; Spy Hard
weaponsOfDeath ; weapons used in tank death animations weaponsOfDeath ; weapons used in tank death animations
dta ind_Missile________ dta ind_Missile
dta ind_Baby_Nuke______ dta ind_Baby_Nuke
dta ind_Nuke___________ dta ind_Nuke
dta ind_Death_s_Head___ dta ind_Death_s_Head
dta ind_Hot_Napalm_____ ; why not? dta ind_Hot_Napalm ; why not?
dta ind_Riot_Bomb______ dta ind_Riot_Bomb
dta ind_Heavy_Riot_Bomb dta ind_Heavy_Riot_Bomb
dta ind_Baby_Digger____ dta ind_Baby_Digger
dta ind_Digger_________ dta ind_Digger
dta ind_Heavy_Digger___ dta ind_Heavy_Digger
dta ind_Baby_Sandhog___ dta ind_Baby_Sandhog
dta ind_Sandhog________ dta ind_Sandhog
dta ind_Heavy_Sandhog__ dta ind_Heavy_Sandhog
dta ind_Dirt_Clod______ dta ind_Dirt_Clod
dta ind_Dirt_Ball______ dta ind_Dirt_Ball
dta ind_Ton_of_Dirt____ dta ind_Ton_of_Dirt
weaponsOfDeathEnd weaponsOfDeathEnd
joyToKeyTable joyToKeyTable
.by $ff ;00 .by $ff ;00
@@ -599,17 +605,15 @@ scrcodes
dta d"ijklmnop" dta d"ijklmnop"
dta d"qrstuvwx" dta d"qrstuvwx"
dta d"yz" dta d"yz"
;-------decimal constans + end of scrcodes
zero zero
digits ; decimal constans digits
dta d"0123456" dta d"0123456"
dta d"789. " ; "-" dta d"789. " ; "-"
;-------decimal constans
;zero
;digits dta d"0123456789"
;----------------------------------- ;-----------------------------------
gameOverSpritesTop gameOverSpritesTop
; end of the Gover sprites by number of players ; end of the GameOver sprites by number of players
; 1 2 3 4 5 6 ; 1 2 3 4 5 6
.by 130+7,130+7,136+7,142+7,148+7,154+7 .by 130+7,130+7,136+7,142+7,148+7,154+7
;------credits ;------credits
@@ -627,7 +631,7 @@ CreditsStart
dta d"SFX, Music and Suppor",d"t"* dta d"SFX, Music and Suppor",d"t"*
dta d"Michal 'Miker' Szpilowsk",d"i"* dta d"Michal 'Miker' Szpilowsk",d"i"*
dta d" "* dta d" "*
.IF target != 5200 .IF TARGET = 800
dta d"Additional Musi",d"c"* dta d"Additional Musi",d"c"*
dta d"Mario 'Emkay' Kri",d"x"* dta d"Mario 'Emkay' Kri",d"x"*
dta d" "* dta d" "*
@@ -637,7 +641,7 @@ CreditsStart
dta d" "* dta d" "*
dta d"Ar",d"t"* dta d"Ar",d"t"*
dta d"Adam Wachowsk",d"i"* dta d"Adam Wachowsk",d"i"*
.IF target != 5200 .IF TARGET = 800
dta d"Roman 'xorcerer' Fierfa",d"s"* dta d"Roman 'xorcerer' Fierfa",d"s"*
.ENDIF .ENDIF
dta d" "* dta d" "*
@@ -647,12 +651,12 @@ CreditsStart
dta d"Beeblebrox, KrzysRog, lopezpb",d","* dta d"Beeblebrox, KrzysRog, lopezpb",d","*
dta d"brad-colbert, archon800, nowy80",d","* dta d"brad-colbert, archon800, nowy80",d","*
dta d"Shaggy the Atarian, RetroBorsuk, ZPH" dta d"Shaggy the Atarian, RetroBorsuk, ZPH"
.IF target = 5200 .IF TARGET = 800
dta d" "*
.ELIF TARGET = 5200
dta d","* dta d","*
dta d"x-usr(1536), Aking, JAC!, phaeron",d","* dta d"x-usr(1536), Aking, JAC!, phaeron",d","*
dta d"RB520",d"0"* dta d"RB520",d"0"*
.ELSE
dta d" "*
.ENDIF .ENDIF
dta d" "* dta d" "*
dta d"Additional testin",d"g"* dta d"Additional testin",d"g"*
@@ -660,20 +664,22 @@ CreditsStart
dta d" "* dta d" "*
dta d"Special thank",d"s"* dta d"Special thank",d"s"*
dta d"Krzysztof 'Kaz' Ziembi",d"k"* dta d"Krzysztof 'Kaz' Ziembi",d"k"*
.IF target != 5200 .IF TARGET = 800
dta d" "* dta d" "*
dta d"Stay tuned for the FujiNet version",d"!"* dta d"Stay tuned for the FujiNet version",d"!"*
.ENDIF .ENDIF
dta d" "* dta d" "*
CreditsEnd CreditsEnd
.IF target = 5200 .IF TARGET = 800
CreditsLines=34 + 7; add 7 for scrollout
.ELSE
CreditsLines=40 + 7 ; add 7 for scrollout CreditsLines=40 + 7 ; add 7 for scrollout
.ELIF TARGET = 5200
CreditsLines=34 + 7; add 7 for scrollout
.ENDIF .ENDIF
.IF target = 5200
.IF TARGET = 5200
; Atari 5200 splash ; Atari 5200 splash
NewSplashText=* NewSplashText=*
dta d"copyright 2023 atari" dta d" 2023 atariage", $4e, "com " ; $4e - non blinking dot
.ENDIF .ENDIF
.endif
.endif ; .IF *>0
+1 -1
View File
@@ -22,4 +22,4 @@ RoundsTable .by 10,20,30,40,50
AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity
flyDelayTable .by 255,150,75,35,1 flyDelayTable .by 255,150,75,35,1
seppukuTable .by 255, 45,25,15,9 seppukuTable .by 255, 45,25,15,9
.endif .ENDIF
+108 -108
View File
@@ -28,123 +28,123 @@ space = 0 ; space in screencodes
KeyRepeatSpeed = 10 ; (max 127 !!!) KeyRepeatSpeed = 10 ; (max 127 !!!)
;character codes for symbols (tank, parachute, etc. ) ;character codes for symbols (tank, parachute, etc. )
char_parachute_______ = $02 char_parachute = $02
char_flag____________ = $1e char_flag = $1e
char_flame___________ = $14 char_flame = $14
char_clear_flame_____ = $1c char_clear_flame = $1c
char_digger__________ = $04 char_digger = $04
char_sandhog_________ = $0c char_sandhog = $0c
char_sandhog_offset = char_sandhog_________ - char_digger__________ char_sandhog_offset = char_sandhog - char_digger
char_tank1___________ = $20 char_tank1 = $20
char_tank2___________ = $24 char_tank2 = $24
char_tank3___________ = $2c char_tank3 = $2c
char_tank4___________ = $28 ; robotank shape char_tank4 = $28 ; robotank shape
;Weapon prices (*10 on screen) ;Weapon prices (*10 on screen)
price_Baby_Missile___ = 0 ;_00 price_Baby_Missile = 0 ;_00
price_Missile________ = 96 ;_01 price_Missile = 96 ;_01
price_Baby_Nuke______ = 111 ;_02 price_Baby_Nuke = 111 ;_02
price_Nuke___________ = 144 ;_03 price_Nuke = 144 ;_03
price_LeapFrog_______ = 192 ;_04 price_LeapFrog = 192 ;_04
price_Funky_Bomb_____ = 293 ;_05 price_Funky_Bomb = 293 ;_05
price_MIRV___________ = 456 ;_06 price_MIRV = 456 ;_06
price_Death_s_Head___ = 337 ;_07 price_Death_s_Head = 337 ;_07
price_Napalm_________ = 125 ;_08 price_Napalm = 125 ;_08
price_Hot_Napalm_____ = 162 ;_09 price_Hot_Napalm = 162 ;_09
price_Tracer_________ = 102 ;_10 price_Tracer = 102 ;_10
price_Smoke_Tracer___ = 291 ;_11 price_Smoke_Tracer = 291 ;_11
price_Baby_Roller____ = 211 ;_12 price_Baby_Roller = 211 ;_12
price_Roller_________ = 244 ;_13 price_Roller = 244 ;_13
price_Heavy_Roller___ = 326 ;_14 price_Heavy_Roller = 326 ;_14
price_Riot_Charge____ = 230 ;_15 price_Riot_Charge = 230 ;_15
price_Riot_Blast_____ = 241 ;_16 price_Riot_Blast = 241 ;_16
price_Riot_Bomb______ = 259 ;_17 price_Riot_Bomb = 259 ;_17
price_Heavy_Riot_Bomb = 272 ;_18 price_Heavy_Riot_Bomb = 272 ;_18
price_Baby_Digger____ = 136 ;_19 price_Baby_Digger = 136 ;_19
price_Digger_________ = 176 ;_20 price_Digger = 176 ;_20
price_Heavy_Digger___ = 207 ;_21 price_Heavy_Digger = 207 ;_21
price_Baby_Sandhog___ = 158 ;_22 price_Baby_Sandhog = 158 ;_22
price_Sandhog________ = 191 ;_23 price_Sandhog = 191 ;_23
price_Heavy_Sandhog__ = 223 ;_24 price_Heavy_Sandhog = 223 ;_24
price_Dirt_Clod______ = 104 ;_25 price_Dirt_Clod = 104 ;_25
price_Dirt_Ball______ = 130 ;_26 price_Dirt_Ball = 130 ;_26
price_Ton_of_Dirt____ = 171 ;_27 price_Ton_of_Dirt = 171 ;_27
price_Liquid_Dirt____ = 330 ;_28 price_Liquid_Dirt = 330 ;_28
price_Dirt_Charge____ = 343 ;_29 price_Dirt_Charge = 343 ;_29
price_Buy_me_________ = 170 ;_30 price_Buy_me = 170 ;_30
price_Laser__________ = 277 ;_31 price_Laser = 277 ;_31
price_White_Flag_____ = $0 ;_32 price_White_Flag = $0 ;_32
price_Battery________ = 300 ;_33 price_Battery = 300 ;_33
price_Hovercraft_____ = 352 ;_34 price_Hovercraft = 352 ;_34
price_Parachute______ = 234 ;_35 price_Parachute = 234 ;_35
price_StrongParachute = 1000 ;_36 price_StrongParachute = 1000 ;_36
price_Mag_Deflector__ = 745 ;_37 price_Mag_Deflector = 745 ;_37
price_Shield_________ = 224 ;_38 price_Shield = 224 ;_38
price_Heavy_Shield___ = 628 ;_39 price_Heavy_Shield = 628 ;_39
price_Force_Shield___ = 1100 ;_40 price_Force_Shield = 1100 ;_40
price_Bouncy_Castle__ = 512 ;_41 price_Bouncy_Castle = 512 ;_41
price_Long_Barrel____ = 2100 ;_42 price_Long_Barrel = 2100 ;_42
price_Nuclear_Winter_ = 1000 ;_43 price_Nuclear_Winter_ = 1000 ;_43
price_Lazy_Boy_______ = 500 ;_44 price_Lazy_Boy = 500 ;_44
price_Lazy_Darwin____ = 730 ;_45 price_Lazy_Darwin = 730 ;_45
price_Auto_Defense___ = 250 ;_46 price_Auto_Defense = 250 ;_46
price_Spy_Hard_______ = 83 ;_47 price_Spy_Hard = 83 ;_47
;Weapon indexes (numbers) ;Weapon indexes (numbers)
ind_Baby_Missile___ = 0 ind_Baby_Missile = 0
first_offensive____ = ind_Baby_Missile___ first_offensive = ind_Baby_Missile
ind_Missile________ = 1 ind_Missile = 1
ind_Baby_Nuke______ = 2 ind_Baby_Nuke = 2
ind_Nuke___________ = 3 ind_Nuke = 3
ind_LeapFrog_______ = 4 ind_LeapFrog = 4
ind_Funky_Bomb_____ = 5 ind_Funky_Bomb = 5
ind_MIRV___________ = 6 ind_MIRV = 6
ind_Death_s_Head___ = 7 ind_Death_s_Head = 7
ind_Napalm_________ = 8 ind_Napalm = 8
ind_Hot_Napalm_____ = 9 ind_Hot_Napalm = 9
ind_Tracer_________ = 10 ind_Tracer = 10
ind_Smoke_Tracer___ = 11 ind_Smoke_Tracer = 11
ind_Baby_Roller____ = 12 ind_Baby_Roller = 12
ind_Roller_________ = 13 ind_Roller = 13
ind_Heavy_Roller___ = 14 ind_Heavy_Roller = 14
ind_Riot_Charge____ = 15 ind_Riot_Charge = 15
ind_Riot_Blast_____ = 16 ind_Riot_Blast = 16
ind_Riot_Bomb______ = 17 ind_Riot_Bomb = 17
ind_Heavy_Riot_Bomb = 18 ind_Heavy_Riot_Bomb = 18
ind_Baby_Digger____ = 19 ind_Baby_Digger = 19
ind_Digger_________ = 20 ind_Digger = 20
ind_Heavy_Digger___ = 21 ind_Heavy_Digger = 21
ind_Baby_Sandhog___ = 22 ind_Baby_Sandhog = 22
ind_Sandhog________ = 23 ind_Sandhog = 23
ind_Heavy_Sandhog__ = 24 ind_Heavy_Sandhog = 24
ind_Dirt_Clod______ = 25 ind_Dirt_Clod = 25
ind_Dirt_Ball______ = 26 ind_Dirt_Ball = 26
ind_Ton_of_Dirt____ = 27 ind_Ton_of_Dirt = 27
ind_Liquid_Dirt____ = 28 ind_Liquid_Dirt = 28
ind_Dirt_Charge____ = 29 ind_Dirt_Charge = 29
ind_Buy_me_________ = 30 ind_Buy_me = 30
ind_Laser__________ = 31 ind_Laser = 31
last_offensive_____ = ind_Laser__________ last_offensive = ind_Laser
ind_White_Flag_____ = 32 ind_White_Flag = 32
first_defensive____ = ind_White_Flag_____ first_defensive = ind_White_Flag
ind_Battery________ = 33 ind_Battery = 33
ind_Hovercraft_____ = 34 ind_Hovercraft = 34
ind_Parachute______ = 35 ind_Parachute = 35
ind_StrongParachute = 36 ind_StrongParachute = 36
ind_Mag_Deflector__ = 37 ind_Mag_Deflector = 37
ind_Shield_________ = 38 ind_Shield = 38
ind_Heavy_Shield___ = 39 ind_Heavy_Shield = 39
ind_Force_Shield___ = 40 ind_Force_Shield = 40
ind_Bouncy_Castle__ = 41 ind_Bouncy_Castle = 41
ind_Long_Barrel____ = 42 ind_Long_Barrel = 42
ind_Nuclear_Winter_ = 43 ind_Nuclear_Winter_ = 43
ind_Lazy_Boy_______ = 44 ind_Lazy_Boy = 44
ind_Lazy_Darwin____ = 45 ind_Lazy_Darwin = 45
ind_Auto_Defense___ = 46 ind_Auto_Defense = 46
ind_Spy_Hard_______ = 47 ind_Spy_Hard = 47
last_defensive_____ = ind_Spy_Hard_______ last_defensive = ind_Spy_Hard
last_real_defensive = ind_Bouncy_Castle__ last_real_defensive = ind_Bouncy_Castle
number_of_offensives = last_offensive_____ - first_offensive____+1 number_of_offensives = last_offensive - first_offensive +1
number_of_defensives = (last_defensive_____ - first_defensive____+1) number_of_defensives = (last_defensive - first_defensive +1)
number_of_weapons = number_of_offensives + number_of_defensives number_of_weapons = number_of_offensives + number_of_defensives
;-------------------------------- ;--------------------------------
; names of RMT instruments (sfx) ; names of RMT instruments (sfx)
+1392
View File
File diff suppressed because it is too large Load Diff
+28 -592
View File
@@ -473,19 +473,6 @@ endcircleloop
RTS RTS
.endp .endp
;--------------------------------------------------
.proc ClearScreen
;--------------------------------------------------
mwa #display temp
ldy #0
@ lda #$ff
sta (temp),y
inw temp
cpw temp #display+screenheight*screenBytes+1
bne @-
rts
.endp
;-------------------------------*------------------ ;-------------------------------*------------------
.proc placetanks .proc placetanks
;-------------------------------------------------- ;--------------------------------------------------
@@ -508,7 +495,7 @@ endcircleloop
mwa #0 temptankX mwa #0 temptankX
mva #0 temptankNr ;player number sta temptankNr ;player number
StillRandomize StillRandomize
ldx NumberOfPlayers ldx NumberOfPlayers
lda random lda random
@@ -626,6 +613,11 @@ DrawNextTank
rts rts
.endp .endp
;--------- ;---------
ClearTankNr
mva #1 Erase
bne DrawTankNr
PutTankNr
mva #0 Erase
.proc DrawTankNr .proc DrawTankNr
ldx tankNr ldx tankNr
; let's check the energy ; let's check the energy
@@ -764,17 +756,17 @@ noTankNoPM
; in xdraw, ydraw we have coordinates left LOWER corner of Tank char ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char
ldx TankNr ldx TankNr
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
cmp #ind_Shield_________ ; one shot shield cmp #ind_Shield ; one shot shield
beq DrawTankSh beq DrawTankSh
cmp #ind_Force_Shield___ ; shield with energy and parachute cmp #ind_Force_Shield ; shield with energy and parachute
beq DrawTankShieldBold beq DrawTankShieldBold
cmp #ind_Heavy_Shield___ ; shield with energy cmp #ind_Heavy_Shield ; shield with energy
beq DrawTankShieldBold beq DrawTankShieldBold
cmp #ind_Bouncy_Castle__ ; Auto Defence cmp #ind_Bouncy_Castle ; Auto Defence
beq DrawTankShieldWihHorns beq DrawTankShieldWihHorns
cmp #ind_Mag_Deflector__ ; Mag Deflector cmp #ind_Mag_Deflector ; Mag Deflector
beq DrawTankShieldWihHorns beq DrawTankShieldWihHorns
cmp #ind_White_Flag_____ ; White Flag cmp #ind_White_Flag ; White Flag
beq DrawTankFlag beq DrawTankFlag
bne NoShieldDraw bne NoShieldDraw
DrawTankSh DrawTankSh
@@ -789,7 +781,7 @@ DrawTankShieldBold
jsr DrawTankShieldBoldLine jsr DrawTankShieldBoldLine
jmp NoShieldDraw jmp NoShieldDraw
DrawTankFlag DrawTankFlag
lda #char_flag____________ ; flag symbol lda #char_flag ; flag symbol
sta CharCode sta CharCode
lda Ytankstable,x lda Ytankstable,x
sec sec
@@ -924,7 +916,7 @@ tankflash_loop
.proc DrawTankParachute .proc DrawTankParachute
;Tank number in X ;Tank number in X
;-------------------------------------------------- ;--------------------------------------------------
lda #char_parachute_______ ; parachute symbol lda #char_parachute ; parachute symbol
sta CharCode sta CharCode
lda Ytankstable,x lda Ytankstable,x
cmp #16 cmp #16
@@ -1036,11 +1028,11 @@ ToHighToParachute
; let's check if the given tank has got the parachute ; let's check if the given tank has got the parachute
ldx TankNr ldx TankNr
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
cmp #ind_Parachute______ ; parachute cmp #ind_Parachute ; parachute
beq ParachuteActive beq ParachuteActive
cmp #ind_StrongParachute ; strong parachute cmp #ind_StrongParachute ; strong parachute
beq ParachuteActive beq ParachuteActive
cmp #ind_Force_Shield___ ; shield witch energy and parachute cmp #ind_Force_Shield ; shield witch energy and parachute
bne TankFallsX bne TankFallsX
ParachuteActive ParachuteActive
inc Parachute inc Parachute
@@ -1054,7 +1046,7 @@ TankFallsX
NoFallingSound NoFallingSound
; clear previous position ; clear previous position
mva #1 Erase mva #1 Erase
jsr DrawTankNr jsr ClearTankNr
; and the parachute (if present) ; and the parachute (if present)
lda Parachute lda Parachute
and #01 and #01
@@ -1245,7 +1237,7 @@ EndOfFall
bne NoParachuteWeapon bne NoParachuteWeapon
; first we check type of parachute ; first we check type of parachute
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
cmp #ind_Parachute______ ; deactivate weapon only if parachute (54) cmp #ind_Parachute ; deactivate weapon only if parachute (54)
bne NoParachuteWeapon bne NoParachuteWeapon
mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute)
NoParachuteWeapon NoParachuteWeapon
@@ -1255,9 +1247,8 @@ NoParachuteWeapon
beq ThereWasNoParachute beq ThereWasNoParachute
jsr DrawTankParachute jsr DrawTankParachute
ThereWasNoParachute ThereWasNoParachute
mva #0 Erase
; ldx TankNr ; ldx TankNr
jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) jsr PutTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) )
mva #sfx_silencer sfx_effect mva #sfx_silencer sfx_effect
rts rts
@@ -1279,55 +1270,6 @@ ThereWasNoParachute
rts rts
.endp .endp
;--------------------------------------------------
.proc drawmountains
;--------------------------------------------------
mwa #0 xdraw
mwa #mountaintable modify
mva #1 color
drawmountainsloop
ldy #0
lda (modify),y
cmp #screenheight
beq NoMountain
sta ydraw
sty ydraw+1
.IF FASTER_GRAF_PROCS = 1
; there was Drawline proc
lda #screenheight
sec
sbc ydraw
sta tempbyte01
jsr plot.MakePlot
; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit)
; jmp IntoDraw ; jumps inside Draw routine
; because one pixel is already plotted (and who cares? :) )
@
lda (xbyte),y
and bittable2,x
sta (xbyte),y
;IntoDraw
adw xbyte #screenBytes
dec tempbyte01
bne @-
; end of Drawline proc
.ELSE
; there was Drawline proc
drawline
jsr plot.MakePlot
inc ydraw
lda ydraw
cmp #screenheight
bne drawline
; end of Drawline proc
.ENDIF
NoMountain
inw modify
inw xdraw
cpw xdraw #screenwidth
bne drawmountainsloop
rts
/* /*
;-------------------------------------------------- ;--------------------------------------------------
drawmountainspixel ; never used ? drawmountainspixel ; never used ?
@@ -1346,7 +1288,6 @@ drawmountainspixelloop
bne drawmountainspixelloop bne drawmountainspixelloop
rts rts
*/ */
.endp
;-------------------------------------------------- ;--------------------------------------------------
.proc SoilDown2 .proc SoilDown2
;-------------------------------------------------- ;--------------------------------------------------
@@ -1478,6 +1419,9 @@ ColumnIsReady
bcc FalloutOfLine bcc FalloutOfLine
beq FalloutOfLine beq FalloutOfLine
jsr CheckExitKeys ; Check for O, Esc or Start+Option keys
spl:rts ; exit if pressed 'Exit keys'
lda IsEndOfTheFallFlag lda IsEndOfTheFallFlag
; we repeat untill at some point first table reaches ; we repeat untill at some point first table reaches
; level of the mountains ; level of the mountains
@@ -1486,8 +1430,8 @@ ColumnIsReady
sta color ; Pozor! :) we know - now A=1 sta color ; Pozor! :) we know - now A=1
NothingToFall NothingToFall
mva #sfx_silencer sfx_effect mva #sfx_silencer sfx_effect
jsr DrawTanks jmp DrawTanks
rts ; rts
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
@@ -1643,501 +1587,6 @@ NotHigher
rts rts
.endp .endp
; -----------------------------------------
.proc unPlot
; plots a point and saves the plotted byte, reverts the previous plot.
; -----------------------------------------
ldx #0 ; only one pixel
unPlotAfterX
stx WhichUnPlot
; first remake the oldie
lda oldplotL,x
sta oldplot
lda oldplotH,x
sta oldplot+1
lda oldply,x
tay
lda oldora,x
sta (oldplot),y
; is it not out of the screen ????
cpw ydraw #screenheight
jcc CheckX
mwa #0 ydraw
CheckX
cpw xdraw #screenwidth
jcs EndOfUnPlot
MakeUnPlot
; let's count coordinates taken from xdraw and ydraw
mwa xdraw xbyte
lda xbyte
and #$7
sta ybit
lsrw xbyte
rorw xbyte
rorw xbyte
;---
ldy xbyte
ldx WhichUnPlot
tya
sta oldply,x
ldx ydraw
lda linetableL,x
sta xbyte
sta oldplot
lda linetableH,x
sta xbyte+1
sta oldplot+1
ldx ybit
lda color
bne ClearUnPlot
;plotting here
lda (xbyte),y
sta OldOraTemp
ora bittable,x
sta (xbyte),y
jmp ContinueUnPlot
ClearUnPlot
lda (xbyte),y
sta OldOraTemp
and bittable2,x
sta (xbyte),y
ContinueUnPlot
ldx WhichUnPlot
lda OldOraTemp
sta oldora,x
lda oldplot
sta oldplotL,x
lda oldplot+1
sta oldplotH,x
; and now we must solve the problem of several plots
; in one byte
ldx #4
ldy WhichUnPlot
LetsCheckOverlapping
cpx WhichUnPlot
beq SkipThisPlot
lda oldplotL,x
cmp oldplotL,y
bne NotTheSamePlot
lda oldplotH,x
cmp oldplotH,y
bne NotTheSamePlot
lda oldply,x
cmp oldply,y
bne NotTheSamePlot
; the pixel is in the same byte so let's take correct contents
lda oldora,x
sta oldora,y
NotTheSamePlot
SkipThisPlot
dex
bpl LetsCheckOverlapping
EndOfUnPlot
rts
.endp
; -----------------------------------------
.proc plot ;plot (xdraw, ydraw, color)
; color == 1 --> put pixel
; color == 0 --> erase pixel
; this is one of the most important routines in the whole
; game. If you are going to speed up the game, start with
; plot - it is used by every single effect starting from explosions
; through line drawing and small text output!!!
;
; Optimized by 0xF (Fox) THXXXX!!!
; -----------------------------------------
; is it not over the screen ???
cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
bcs unPlot.EndOfUnPlot ;nearest RTS
CheckX02
cpw xdraw #screenwidth
bcs EndOfPlot
MakePlot
; let's calculate coordinates from xdraw and ydraw
;xbyte = xbyte/8
lda xdraw+1
lsr
lda xdraw
ror ;just one bit over 256. Max screenwidth = 512!!!
lsr
lsr
sta xbyte
;---
ldx ydraw
ldy linetableL,x
lda linetableH,x
sta xbyte+1
lda xdraw
and #$7
tax
lda color
bne ClearPlot
lda (xbyte),y
ora bittable,x
sta (xbyte),y
EndOfPlot
rts
ClearPlot
lda (xbyte),y
and bittable2,x
sta (xbyte),y
rts
.endp
; -----------------------------------------
.proc point_plot
; -----------------------------------------
; checks state of the pixel (coordinates in xdraw and ydraw)
; result is in A (zero or appropriate bit is set)
; let's calculate coordinates from xdraw and ydraw
;xbyte = xbyte/8
lda xdraw+1
lsr
lda xdraw
ror ;just one bit over 256. Max screenwidht = 512!!!
lsr
lsr
sta xbyte
;---
ldx ydraw
ldy linetableL,x
lda linetableH,x
sta xbyte+1
lda xdraw
and #$7
tax
lda (xbyte),y
eor #$ff
and bittable,x
rts
.endp
;--------------------------------------------------
.proc TypeChar
; puts char on the graphics screen
; in: CharCode
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
;--------------------------------------------------
; char to the table
lda CharCode
sta fontind
lda #$00
sta fontind+1
; char intex times 8
aslw fontind
rolw fontind
rolw fontind
adw fontind #TankFont
; and 8 bytes to the table
ldy #7
CopyChar
lda (fontind),y
eor #$ff
sta char1,y
lda #$ff
sta char2,y
dey
bpl CopyChar
; and 8 subsequent bytes as a mask
adw fontind #8
ldy #7
CopyMask
lda (fontind),y
eor #$ff
sta mask1,y
lda #$00
sta mask2,y
dey
bpl CopyMask
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa xdraw xbyte
lda xbyte
and #$7
sta ybit
lsrw xbyte ; div 8
rorw xbyte
rorw xbyte
;---
ldy xbyte
lda ydraw ; y = y - 7 because left lower. shouldn't it be 8?
sec
sbc #7
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK00
MakeMask00
.rept 8
lsr mask1+#
ror mask2+#
.endr
sec
.rept 8
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask00
MaskOK00
; here x=0
lda Erase
beq CharLoopi ; it works, because x=0
lda #$ff
ldx #7
EmptyChar
sta char1,x
sta char2,x
dex
bpl EmptyChar
ldx #0
CharLoopi
lda (xbyte),y
ora mask1,x
and char1,x
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
and char2,x
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #8
bne CharLoopi
.ELSE
mvx #7 temp ; line counter (Y)
CharLoop1
mva #7 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda Erase
bne ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #8
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
clc
lda ydraw
adc #8
sta ydraw
bne EndPutChar
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPutChar
rts
.endp
;--------------------------------------------------
.proc PutChar4x4
; puts 4x4 pixels char on the graphics screen
; in: dx, dy (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/255)
; all pixels are being drawn
; (empty and not empty)
;--------------------------------------------------
cpw dy #(screenheight-1)
jcs TypeChar.EndPutChar ;nearest RTS
cpw dy #(4)
jcc TypeChar.EndPutChar ;nearest RTS
cpw dx #(screenwidth-4)
jcs TypeChar.EndPutChar ;nearest RTS
; checks ommited.
; char to the table
lda CharCode4x4
and #%00000001
beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits
sta nibbler4x4
lda CharCode4x4
lsr
sta fontind
lda #$00
sta fontind+1
adw fontind #font4x4
; and 4 bytes to the table
ldy #0
ldx #3
CopyChar
lda (fontind),y ; Y must be 0 !!!!
bit nibbler4x4
bpl GetUpper4bits
:4 rol
GetUpper4bits
ora #$0f
sta char1,x
lda #$ff
sta char2,x
; and 4 bytes as a mask
lda #$f0
sta mask1,x
lda #$00
sta mask2,x
adw fontind #32 ; next byte of 4x4 font
dex
bpl CopyChar
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa dx xbyte
lda xbyte
and #$7
sta ybit
:3 lsrw xbyte ; div 8
; rorw xbyte
; rorw xbyte
;---
ldy xbyte ; horizontal byte offet stored in Y
lda dy ; y = y - 3 because left lower.
sec
sbc #3
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK01
MakeMask01
.rept 4
lsr mask1+#
ror mask2+#
.endr
sec
.rept 4
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask01
MaskOK01
ldx #0
CharLoopi4x4
lda (xbyte),y
ora mask1,x
bit plot4x4color
bpl PutInColor0_1 ; only mask - no char
and char1,x
PutInColor0_1
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
bit plot4x4color
bpl PutInColor0_2 ; only mask - no char
and char2,x
PutInColor0_2
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #4
bne CharLoopi4x4
.ELSE
mwa xdraw char2
mwa ydraw mask2
mva color mask2+2
mwa dx xdraw
mwa dy ydraw
mvx #3 temp ; line counter (Y)
CharLoop1
mva #3 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda plot4x4color
beq ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #4
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
mwa char2 xdraw
mwa mask2 ydraw
mva mask2+2 color
bpl EndPut4x4
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPut4x4
rts
.endp
;-------------------------------------------------------- ;--------------------------------------------------------
.proc DisplayOffensiveTextNr ; .proc DisplayOffensiveTextNr ;
ldx TextNumberOff ldx TextNumberOff
@@ -2301,8 +1750,8 @@ end_found
iny iny
sty fx sty fx
ldy tankNr ldy tankNr
jsr Display4x4AboveTank jmp Display4x4AboveTank
rts ; rts
.endp .endp
;------------------------------- ;-------------------------------
@@ -2442,19 +1891,6 @@ quit_seppuku
.endp .endp
;--------------------------------------------------
.proc SetMainScreen
; mva #0 dmactls
SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen
mwa #dl dlptrs ; issue #72 (glitches when switches)
lda #%00111110
; and #$fc
; ora #$02 ; 2=normal, 3 = wide screen width
sta dmactls
mva WallsType COLBAKS ; set color of background
jsr WaitOneFrame
rts
.endp
; ------------------------------------- ; -------------------------------------
.proc SetupXYdraw .proc SetupXYdraw
lda ytankstable,x lda ytankstable,x
@@ -2490,8 +1926,8 @@ X lda XtanksTableL,x
sta yc ; current tank barrel length sta yc ; current tank barrel length
lda angleTable,x lda angleTable,x
sta Angle sta Angle
jsr DrawBarrelTech jmp DrawBarrelTech
rts ; rts
.endp .endp
.proc DrawBarrelTech .proc DrawBarrelTech
+92 -1201
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+444
View File
@@ -0,0 +1,444 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
;C64 8-bit Scorched Earth source code
;---------------------------------------------------
;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski
;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013
;Miami & Warsaw 2022, 2023
;---------------------------------------------------
.def TARGET = 64 ; :)
;---------------------------------------------------
.def XCORRECTION_FOR_PM = 0
; if 1 - active x position of tanks correction fo PMG
.def FASTER_GRAF_PROCS = 1
; if 1 - activates faster graphics routines
; (direct writes to screen memory - C64 only :) )
;---------------------------------------------------
opt h-f+
org $801
org [a($801)],$801
basic_start(FirstSTART)
;---------------------------------------------------
.macro build
dta d"1.28" ; number of this build (4 bytes)
.endm
.macro RMTSong
lda #:1 ; do nothing in C64
.endm
;---------------------------------------------------
icl 'definitions.asm'
;---------------------------------------------------
FirstZpageVariable = $58 ; $57
.zpvar DliColorBack .byte = FirstZpageVariable
.zpvar GradientNr .byte
.zpvar GradientColors .word
.zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn)
.zpvar JoystickNumber .byte
.zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing
.zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory
.zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on)
.zpvar xdraw .word ;= $64 ;variable X for plot
.zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen)
.zpvar xbyte .word
.zpvar ybyte .word
.zpvar CharCode .byte
.zpvar fontind .word
.zpvar tanknr .byte
.zpvar TankSequencePointer .byte
.zpvar oldplot .word
.zpvar xc .word
.zpvar temp .word ;temporary word for the most embeded loops only
.zpvar temp2 .word ;same as above
.zpvar modify .word ;origially used to replace self-modyfying code
.zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine)
.zpvar xtempDRAW .word ;same as above for XDRAW routine
.zpvar ytempDRAW .word ;same as above for XDRAW routine
.zpvar tempor2 .word
.zpvar CreditsVScrol .byte
;--------------temps used in circle routine
.zpvar xi .word ;X (word) in draw routine
.zpvar fx .byte
.zpvar yi .word ;Y (word) in draw routine
.zpvar fy .byte
.zpvar xk .word
.zpvar fs .byte
.zpvar yc .byte ;ycircle - temporary for circle
.zpvar dx .word
.zpvar dy .word
.zpvar dd .word
.zpvar di .word
.zpvar dp .word
;----------------------------
.zpvar UnderTank1 .byte
.zpvar UnderTank2 .byte
;----------------------------
.zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight)
.zpvar weaponPointer .word
.zpvar dliCounter .byte
.zpvar pressTimer .byte
.zpvar NTSCcounter .byte
.zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling
.zpvar sfx_effect .byte
.zpvar RMT_blocked .byte
.zpvar ScrollFlag .byte
.zpvar SkStatSimulator .byte
.zpvar FloatingAlt .byte ; floating tank altitude
.zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen
; --------------OPTIMIZATION VARIABLES--------------
.zpvar Force .word
.zpvar Force_ .byte ; Force is 3 bytes long
.zpvar Angle .byte
.zpvar Parachute .byte ; are you insured with parachute?
.zpvar color .byte
.zpvar Erase .byte ; if 1 only mask of the character is printed
; on the graphics screen. if 0 character is printed normally
.zpvar radius .byte
.zpvar decimal .word
.zpvar NumberOfPlayers .byte ;current number of players (counted from 1)
.zpvar Counter .byte ;temporary Counter for outside loops
.zpvar ExplosionRadius .byte
.zpvar FunkyBombCounter .byte
.zpvar ResultY .byte
.zpvar xcircle .word
.zpvar ycircle .word
.zpvar vy .word
.zpvar vy_ .word ; 4 bytes
.zpvar vx .word
.zpvar vx_ .word ; 4 bytes
.zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
.zpvar PositionOnTheList .byte ; pointer position on the list being displayed
.zpvar XHit .word
.zpvar delta .word
.zpvar HowMuchToFall .byte
.zpvar magic .word
.zpvar xtraj .word
.zpvar xtraj_ .byte ; 3 bytes
.zpvar ytraj .word
.zpvar ytraj_ .byte ; 3 bytes
.zpvar Wind .word
.zpvar Wind_ .word ; 4 bytes
.zpvar RangeLeft .word
.zpvar RangeRight .word
.zpvar NewAngle .byte
.zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing
.zpvar LineYdraw .byte
.zpvar LineXdraw .word
.zpvar plot4x4color .byte ; $00 / $ff
.zpvar Multiplier .word
.zpvar Multiplier_ .byte ; 3 bytes
.zpvar HowToDraw .byte
.zpvar gravity .byte
.zpvar LineLength .word
.zpvar tracerflag .byte
.zpvar isInventory .byte
.zpvar DifficultyLevel .byte
.zpvar goleft .byte
.zpvar OffsetDL1 .byte
.zpvar L1 .byte
HotNapalmFlag = FunkyBombCounter ; reuse variable!
;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65
displayposition = modify
LineAddress4x4 = xcircle
;-----------------------------------------------
; libraries
;-----------------------------------------------
icl 'C64/lib/C64_ATARISYS.ASM'
icl 'C64/lib/C64SYS.ASM'
icl 'C64/lib/MACRO.ASM'
;-----------------------------------------------
; variable declarations in RAM (no code)
;-----------------------------------------------
; Game loading address
ORG $4100
icl 'variables.asm'
WeaponFont
ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt'
;--------------------------------------------------
; Game Code
;--------------------------------------------------
FirstSTART
DL = 0
StatusBufferROM = 0
;StatusBufferCopy = 0
StatusBufferCopyEnd = 0
TRACKS = 4
DisplayCopyPurchaseEnd = 0
DisplayCopyPurchaseStart = 0
displayC64 = $2000 ; graphics screen memory start
SEI ; disable IRQ
LDA #$36
STA $0001 ; Turn Off BASIC ROM
LDA #<NMI ;
STA $0318 ; change NMI vector
LDA #>NMI ; to our routine
STA $0319 ;
LDA #$00 ; stop Timer A
STA $DD0E ;
STA $DD04 ; set Timer A to 0, after starting
STA $DD05 ; NMI will occur immediately
LDA #$81 ;
STA $DD0D ; set Timer A as source for NMI
LDA #$01 ;
STA $DD0E ; start Timer A -> NMI
; from here on NMI is disabled
jsr MakeDarkScreen
; one time zero variables in RAM (non zero page)
lda #0
ldy #OneTimeZeroVariablesCount-1
@ sta OneTimeZeroVariables,y
dey
bpl @-
; one time zero variables in RAM (zero page)
ldy #FirstZpageVariable
@ sta $0000,y
iny
bne @-
; initialize variables in RAM (non zero page)
ldy #initialvaluesCount-1
@ lda initialvaluesStart,y
sta variablesToInitialize,y
dey
bpl @-
; generate linetables
jsr GenerateLineTable
; Random INIT
InitializeSIDrnd
;--------------------------------------------------
; Main program of the game
icl 'game.asm'
;--------------------------------------------------
;--------------------------------------------------
.proc GetKey
; waits for pressing a key and returns pressed value in A
; when [ESC] is pressed, escFlag is set
; result: A=keycode
;--------------------------------------------------
jsr WaitForKeyRelease
lda #0
sta escFlag
lda #$ff
rts
.endp
;--------------------------------------------------
.proc getkeynowait
;--------------------------------------------------
jsr WaitForKeyRelease
lda kbcode
and #$3f ;CTRL and SHIFT ellimination
rts
.endp
;--------------------------------------------------
.proc WaitForKeyRelease
;--------------------------------------------------
StillWait
rts
.endp
;--------------------------------------------------
.proc IsKeyPressed
; result: A=0 - yes , A>0 - no
;--------------------------------------------------
lda #1
rts
.endp
;--------------------------------------------------
.proc DemoModeOrKey
; Waits for the key pressed if at least one human is playing.
; Otherwise, waits 3 seconds (demo mode).
;--------------------------------------------------
;check demo mode
ldx numberOfPlayers
dex
checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE
lda skillTable,x
beq peopleAreHere
dex
bpl checkForHuman
; no people, just wait a bit
;pause 150
ldy #75
jmp PauseYFrames
; rts
peopleAreHere
jmp getkey ; jsr:rts
.endp
;--------------------------------------------------
MakeDarkScreen
;--------------------------------------------------
; mva #0 dmactls ; dark screen
; and wait one frame :)
;--------------------------------------------------
.proc WaitOneFrame
;--------------------------------------------------
wait ; or waitRTC ?
rts
.endp
;--------------------------------------------------
.proc PauseYFrames
; Y - number of frames to wait (divided by 2)
; pauses for maximally 510 frames (255 * 2)
;--------------------------------------------------
@ jsr WaitOneFrame
jsr WaitOneFrame
dey
bne @-
rts
.endp
;--------------------------------------------------
.proc CheckExitKeys
;--------------------------------------------------
; Checks keyboard and sets appropriate flags for exit procedures
; If START+OPTION is pressed - exit to GameOver screen
; If 'O' key is pressed - displays "Are you sure?" and - exit to GameOver screen
; If 'Esc' key is pressed - displays "Are you sure?" and - exit to Menu screen
; Just setting the right flags!!!
rts
;
.endp
;--------------------------------------------------
.proc ShellDelay
ldx flyDelay
DelayLoop
lda $d012
@ cmp $d012
beq @-
lda $d012
@ cmp $d012
beq @-
dex
bne DelayLoop
noShellDelay
rts
.endp
;--------------------------------------------------
.proc RmtSongSelect
; starting song line 0-255 to A reg
;--------------------------------------------------
rts
.endp
.proc CopyFromRom
rts
.endp
;--------------------------------------------------
icl 'C64/interrupts.asm'
;----------------------------------------------
icl 'constants.asm'
;----------------------------------------------
icl 'C64/textproc.asm'
;----------------------------------------------
icl 'grafproc.asm'
icl 'C64/gr_basics.asm'
;----------------------------------------------
icl 'weapons.asm'
;----------------------------------------------
icl 'ai.asm'
;----------------------------------------------
icl 'artwork/talk.asm'
;----------------------------------------------
TankFont
ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only
;----------------------------------------------
font4x4
ins 'artwork/font4x4s.bmp',+62
;-------------------------------------------------
.proc CheckTankCheat
ldy #$07
lda TankNr
asl
asl
asl ; 8 chars per name
tax
@
lda CheatName,y
sec
sbc tanksnames,x
cmp #$27
bne NoCheat
inx
dey
bpl @-
YesCheat
ldx TankNr
lda TanksWeaponsTableL,x
sta temp
lda TanksWeaponsTableH,x
sta temp+1
lda #99
@ iny
sta (temp),y
cpy #(number_of_weapons - 1)
bne @-
NoCheat
rts
.endp
CheatName
dta d" 008.T"+$27
;----------------------------------------------
.proc DLIinterruptBFG
pha
lda dliCounter
bne EndofBFGDLI
lda dliColorsFore
bit random
bmi @+
lda DliColorBack
@ sta COLPF2
lda dliColorsFore
bit random
bmi @+
lda DliColorBack
@ sta COLPF1
EndofBFGDLI
inc dliCounter
pla
rti
.endp
; ------------------------
.proc BFGblink
; SetDLI DLIinterruptBFG ; blinking on
ldy #50
jsr PauseYFrames
; SetDLI DLIinterruptGraph ; blinking off
rts
.endp
;----------------------------------------------
icl 'constants_top.asm'
;----------------------------------------------
NMI
INC $D020 ; change border colour, indication for a NMI
RTI ; exit interrupt
; (not acknowledged!)
BIN
View File
Binary file not shown.
+6 -15
View File
@@ -23,7 +23,7 @@ GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4
;---------------------------------------------------- ;----------------------------------------------------
TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24
;:6 dta d" " ;:6 dta d" "
.ds 6*8 .ds MaxPlayers*8
;---------------------------------------------------- ;----------------------------------------------------
skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
.DS MaxPlayers .DS MaxPlayers
@@ -287,9 +287,9 @@ AfterBFGflag .DS 1
; tables with indexes of weapons on the right lists ; tables with indexes of weapons on the right lists
; OK (2022) so, L1 is list of offensive weapons, L2 - defensive ; OK (2022) so, L1 is list of offensive weapons, L2 - defensive
IndexesOfWeaponsL1 IndexesOfWeaponsL1
.ds (last_offensive_____ - first_offensive____+1) .ds (last_offensive - first_offensive +1)
IndexesOfWeaponsL2 IndexesOfWeaponsL2
.ds (last_defensive_____ - first_defensive____+1) .ds (last_defensive - first_defensive +1)
;---------------------------------------------------- ;----------------------------------------------------
; variables storing amount of weapons on the first and second ; variables storing amount of weapons on the first and second
@@ -341,19 +341,10 @@ LaserCoordinate .DS 8 ; 2,2,2,2
; Let 0 be "baby missile" ; Let 0 be "baby missile"
; from $30 the defensive weapons begin ; from $30 the defensive weapons begin
TanksWeapons TanksWeapons
TanksWeapon1 .REPT MaxPlayers, #+1
TanksWeapon:1
.DS number_of_weapons .DS number_of_weapons
TanksWeapon2 .ENDR
.DS number_of_weapons
TanksWeapon3
.DS number_of_weapons
TanksWeapon4
.DS number_of_weapons
TanksWeapon5
.DS number_of_weapons
TanksWeapon6
.DS number_of_weapons
mountaintable ;table of mountains (size=screenwidth) mountaintable ;table of mountains (size=screenwidth)
.DS [screenwidth] .DS [screenwidth]
.DS 1 ; additional byte for fallout (sometimes 1 pixel) .DS 1 ; additional byte for fallout (sometimes 1 pixel)
+127 -264
View File
@@ -22,38 +22,38 @@
pha pha
rts rts
ExplosionRoutines ExplosionRoutines
.word babymissile-1 ;Baby_Missile___;_00 .word babymissile-1 ;Baby_Missile ;_00
.word missile-1 ;Missile________;_01 .word missile-1 ;Missile ;_01
.word babynuke-1 ;Baby_Nuke______;_02 .word babynuke-1 ;Baby_Nuke ;_02
.word nuke-1 ;Nuke___________;_03 .word nuke-1 ;Nuke ;_03
.word leapfrog-1 ;LeapFrog_______;_04 .word leapfrog-1 ;LeapFrog ;_04
.word funkybomb-1 ;Funky_Bomb_____;_05 .word funkybomb-1 ;Funky_Bomb ;_05
.word mirv-1 ;MIRV___________;_06 .word mirv-1 ;MIRV ;_06
.word deathshead-1 ;Death_s_Head___;_07 .word deathshead-1 ;Death_s_Head ;_07
.word napalm-1 ;Napalm_________;_08 .word napalm-1 ;Napalm ;_08
.word hotnapalm-1 ;Hot_Napalm_____;_09 .word hotnapalm-1 ;Hot_Napalm ;_09
.word tracer-1 ;Tracer_________;_10 .word tracer-1 ;Tracer ;_10
.word tracer-1 ;Smoke_Tracer___;_11 .word tracer-1 ;Smoke_Tracer ;_11
.word babyroller-1 ;Baby_Roller____;_12 .word babyroller-1 ;Baby_Roller ;_12
.word roller-1 ;Roller_________;_13 .word roller-1 ;Roller ;_13
.word heavyroller-1 ;Heavy_Roller___;_14 .word heavyroller-1 ;Heavy_Roller ;_14
.word riotcharge-1 ;Riot_Charge____;_15 .word riotcharge-1 ;Riot_Charge ;_15
.word riotblast-1 ;Riot_Blast_____;_16 .word riotblast-1 ;Riot_Blast ;_16
.word riotbomb-1 ;Riot_Bomb______;_17 .word riotbomb-1 ;Riot_Bomb ;_17
.word heavyriotbomb-1 ;Heavy_Riot_Bomb;_18 .word heavyriotbomb-1 ;Heavy_Riot_Bomb;_18
.word babydigger-1 ;Baby_Digger____;_19 .word babydigger-1 ;Baby_Digger ;_19
.word digger-1 ;Digger_________;_20 .word digger-1 ;Digger ;_20
.word heavydigger-1 ;Heavy_Digger___;_21 .word heavydigger-1 ;Heavy_Digger ;_21
.word babysandhog-1 ;Baby_Sandhog___;_22 .word babysandhog-1 ;Baby_Sandhog ;_22
.word sandhog-1 ;Sandhog________;_23 .word sandhog-1 ;Sandhog ;_23
.word heavysandhog-1 ;Heavy_Sandhog__;_24 .word heavysandhog-1 ;Heavy_Sandhog ;_24
.word dirtclod-1 ;Dirt_Clod______;_25 .word dirtclod-1 ;Dirt_Clod ;_25
.word dirtball-1 ;Dirt_Ball______;_26 .word dirtball-1 ;Dirt_Ball ;_26
.word tonofdirt-1 ;Ton_of_Dirt____;_27 .word tonofdirt-1 ;Ton_of_Dirt ;_27
.word liquiddirt-1 ;Liquid_Dirt____;_28 .word liquiddirt-1 ;Liquid_Dirt ;_28
.word dirtcharge-1 ;Dirt_Charge____;_29 .word dirtcharge-1 ;Dirt_Charge ;_29
.word BFG-1 ;Buy_me_________;_30 .word BFG-1 ;Buy_me ;_30
.word laser-1 ;Laser__________;_31 .word laser-1 ;Laser ;_31
VOID VOID
tracer tracer
@@ -288,10 +288,10 @@ RepeatFlame ; internal loop (draw flames)
lda random lda random
and #%00000110 and #%00000110
clc clc
adc #char_flame___________ adc #char_flame
bne PutFlameChar bne PutFlameChar
LastNapalmRepeat LastNapalmRepeat
lda #char_clear_flame_____ ; clear flame symbol lda #char_clear_flame ; clear flame symbol
PutFlameChar PutFlameChar
sta CharCode sta CharCode
; check coordinates ; check coordinates
@@ -536,7 +536,7 @@ DiggerCharacter
lda random lda random
and #$06 and #$06
clc clc
adc #char_digger__________ adc #char_digger
adc sandhogflag adc sandhogflag
sta CharCode sta CharCode
cpw xdraw #(screenwidth-6) cpw xdraw #(screenwidth-6)
@@ -813,15 +813,15 @@ DistanceCheckLoop
tay tay
; check shields ; check shields
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
cmp #ind_Shield_________ ; one hit shield cmp #ind_Shield ; one hit shield
beq UseShield beq UseShield
cmp #ind_Force_Shield___ ; shield with energy and parachute cmp #ind_Force_Shield ; shield with energy and parachute
beq UseShieldWithEnergy beq UseShieldWithEnergy
cmp #ind_Heavy_Shield___ ; shield with energy cmp #ind_Heavy_Shield ; shield with energy
beq UseShieldWithEnergy beq UseShieldWithEnergy
cmp #ind_Bouncy_Castle__ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc) cmp #ind_Bouncy_Castle ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
beq UseShieldWithEnergy beq UseShieldWithEnergy
cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc) cmp #ind_Mag_Deflector ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
beq UseShieldWithEnergy beq UseShieldWithEnergy
jsr DecreaseEnergyX jsr DecreaseEnergyX
jmp EndOfDistanceCheckLoop jmp EndOfDistanceCheckLoop
@@ -835,15 +835,13 @@ ShieldCoveredTank
jne EndOfDistanceCheckLoop jne EndOfDistanceCheckLoop
ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :)
UseShield UseShield
mva #1 Erase
lda TankNr lda TankNr
pha ; store TankNr pha ; store TankNr
stx TankNr ; store X in TankNr :) stx TankNr ; store X in TankNr :)
jsr DrawTankNr ; now erase tank with shield (to erase shield) jsr ClearTankNr ; now erase tank with shield (to erase shield)
lda #0 lda #0
sta ActiveDefenceWeapon,x ; deactivate defense weapons sta ActiveDefenceWeapon,x ; deactivate defense weapons
sta Erase jsr PutTankNr ; draw tank without shield
jsr DrawTankNr ; draw tank without shield
ldx TankNr ; restore X value :) ldx TankNr ; restore X value :)
pla pla
sta TankNr ; restore TankNr value :) sta TankNr ; restore TankNr value :)
@@ -936,7 +934,7 @@ ExplodeNow
; finally a little explosion ; finally a little explosion
mva #sfx_baby_missile sfx_effect mva #sfx_baby_missile sfx_effect
jmp xmissile jmp xmissile
rts ; rts
.endp .endp
; -------------------------------------------------- ; --------------------------------------------------
.proc checkRollDirection .proc checkRollDirection
@@ -1081,11 +1079,10 @@ ContinueToCheckMaxForce2
lda MaxForceTableL,x lda MaxForceTableL,x
sta ForceTableL,x sta ForceTableL,x
@ @
mva #0 Erase
jsr DisplayStatus ;all digital values like force, angle, wind, etc.
jsr PutTankNameOnScreen jsr PutTankNameOnScreen
; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen
jsr DrawTankNr jsr PutTankNr
jsr WaitOneFrame ; best after drawing a tank jsr WaitOneFrame ; best after drawing a tank
@@ -1101,13 +1098,13 @@ ContinueToCheckMaxForce2
; $f3 - shift+key ; $f3 - shift+key
notpressed notpressed
jsr CheckExitKeys ; Check for O, Esc or Start+Option keys
spl:rts ; exit if pressed 'Exit keys'
ldx TankNr ; for optimize ldx TankNr ; for optimize
; Select and Option ; Select and Option
lda CONSOL lda CONSOL
tay tay
and #%00000101 ; Start + Option
beq QuitToGameover
tya
and #%00000100 and #%00000100
beq callActivation ; Option key beq callActivation ; Option key
tya tya
@@ -1122,24 +1119,6 @@ notpressed
lda kbcode lda kbcode
and #%10111111 ; SHIFT elimination and #%10111111 ; SHIFT elimination
cmp #@kbcode._O ; $08 ; O
bne @+
jsr AreYouSure
bit escFlag
bpl notpressed
;---O pressed-quit game to game over screen---
QuitToGameover
mva #$40 escFlag
rts
@
cmp #@kbcode._esc ; 28 ; ESC
bne @+
jsr AreYouSure
bit escFlag
bpl notpressed
;---esc pressed-quit game---
rts
@
cmp #@kbcode._A ; $3f ; A cmp #@kbcode._A ; $3f ; A
bne @+ bne @+
callActivation callActivation
@@ -1385,9 +1364,9 @@ pressedTAB
mva #sfx_purchase sfx_effect mva #sfx_purchase sfx_effect
;ldx TankNr ; optimized ;ldx TankNr ; optimized
lda ActiveWeapon,x lda ActiveWeapon,x
cmp #last_offensive_____ ; the last possible offensive weapon cmp #last_offensive ; the last possible offensive weapon
bne ?notlasttofirst bne ?notlasttofirst
lda #first_offensive____ ; #0 lda #first_offensive ; #0
sta ActiveWeapon,x sta ActiveWeapon,x
beq @+ ; allways = 0 beq @+ ; allways = 0
?notlasttofirst ?notlasttofirst
@@ -1402,9 +1381,9 @@ CTRLpressedTAB
mva #sfx_purchase sfx_effect mva #sfx_purchase sfx_effect
;ldx TankNr ; optimized ;ldx TankNr ; optimized
lda ActiveWeapon,x lda ActiveWeapon,x
cmp #first_offensive____ ; #0 cmp #first_offensive ; #0
bne ?notfirsttolast bne ?notfirsttolast
lda #last_offensive_____ ; the last possible offensive weapon lda #last_offensive ; the last possible offensive weapon
sta ActiveWeapon,x sta ActiveWeapon,x
bne @+ ; allways <> 0 bne @+ ; allways <> 0
?notfirsttolast ?notfirsttolast
@@ -1473,7 +1452,7 @@ AfterOffensiveText
mva #0 LaserFlag ; $ff - Laser mva #0 LaserFlag ; $ff - Laser
ldx TankNr ldx TankNr
lda ActiveWeapon,x lda ActiveWeapon,x
cmp #ind_Laser__________ ; laser cmp #ind_Laser ; laser
bne NotStrongShoot bne NotStrongShoot
; Laser: (not)very strong - invisible - shot for laser beam end coordinates ; Laser: (not)very strong - invisible - shot for laser beam end coordinates
bit Vdebug bit Vdebug
@@ -1549,7 +1528,7 @@ ShotUnderGround
bmi noSmokeTracer ; no Smoke Tracer display bmi noSmokeTracer ; no Smoke Tracer display
ldx TankNr ldx TankNr
lda ActiveWeapon,x lda ActiveWeapon,x
cmp #ind_Smoke_Tracer___ ; Smoke tracer cmp #ind_Smoke_Tracer ; Smoke tracer
bne noSmokeTracer bne noSmokeTracer
iny iny
noSmokeTracer noSmokeTracer
@@ -1728,7 +1707,7 @@ Loopi
bmi NoTestForMIRV bmi NoTestForMIRV
ldx TankNr ldx TankNr
lda ActiveWeapon,x lda ActiveWeapon,x
cmp #ind_MIRV___________ ; MIRV cmp #ind_MIRV ; MIRV
jeq MIRVdownLoop jeq MIRVdownLoop
NoTestForMIRV NoTestForMIRV
NoGravity NoGravity
@@ -1782,7 +1761,11 @@ nolaserwait
bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) ) bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) )
nonowait nonowait
jsr shellDelay jsr shellDelay
;
jsr CheckExitKeys ; Check for O, Esc or Start+Option keys
spl:rts ; exit if pressed 'Exit keys'
ldx TankNr
;
nowait nowait
lda HitFlag lda HitFlag
bne Hit bne Hit
@@ -1876,16 +1859,16 @@ EndOfFlight2
dex ; index of hitted tank in X dex ; index of hitted tank in X
ldy TankNr ldy TankNr
lda ActiveWeapon,y lda ActiveWeapon,y
cmp #ind_Tracer_________ ; defence not fire by tracers cmp #ind_Tracer ; defence not fire by tracers
beq JNoDefence beq JNoDefence
cmp #ind_Smoke_Tracer___ cmp #ind_Smoke_Tracer
beq JNoDefence beq JNoDefence
cmp #ind_Laser__________ ; Bouncy and Mag not fire by Laser cmp #ind_Laser ; Bouncy and Mag not fire by Laser
beq JNoDefence beq JNoDefence
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
cmp #ind_Bouncy_Castle__ ; Auto Defence cmp #ind_Bouncy_Castle ; Auto Defence
jeq BouncyCastle jeq BouncyCastle
cmp #ind_Mag_Deflector__ ; Mag Deflector cmp #ind_Mag_Deflector ; Mag Deflector
beq MagDeflector beq MagDeflector
JNoDefence JNoDefence
jmp NoDefence jmp NoDefence
@@ -1915,16 +1898,14 @@ RightDeflection
bcs EndOfMagDeflector ; hit of course but we need RTS bcs EndOfMagDeflector ; hit of course but we need RTS
sbw XHit #36 ; change to left sbw XHit #36 ; change to left
EndOfMagDeflector EndOfMagDeflector
mva #1 Erase
lda TankNr lda TankNr
pha ; store TankNr pha ; store TankNr
stx TankNr ; store X in TankNr :) stx TankNr ; store X in TankNr :)
jsr DrawTankNr ; now erase tank with shield (to erase shield) jsr ClearTankNr ; now erase tank with shield (to erase shield)
lda #0 lda #0
sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon
sta ShieldEnergy,x sta ShieldEnergy,x
sta Erase jsr PutTankNr ; draw tank without shield
jsr DrawTankNr ; draw tank without shield
ldx TankNr ; restore X value :) ldx TankNr ; restore X value :)
pla pla
sta TankNr ; restore TankNr value :) sta TankNr ; restore TankNr value :)
@@ -1938,17 +1919,16 @@ BouncyCastle
; now in Y we have number of of the attacking player (TankNr) ! ; now in Y we have number of of the attacking player (TankNr) !
lda ActiveWeapon,y lda ActiveWeapon,y
; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down
cmp #ind_Funky_Bomb_____ cmp #ind_Funky_Bomb
bne @+ bne @+
jsr SetFullScreenSoilRange jsr SetFullScreenSoilRange
@ @
mva #sfx_shield_on sfx_effect mva #sfx_shield_on sfx_effect
; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)! ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)!
mva #1 Erase
lda TankNr lda TankNr
pha ; store TankNr pha ; store TankNr
stx TankNr ; store X in TankNr :) stx TankNr ; store X in TankNr :)
jsr DrawTankNr ; now erase tank with shield (to erase shield) jsr ClearTankNr ; now erase tank with shield (to erase shield)
lda #0 lda #0
sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon
sta ShieldEnergy,x sta ShieldEnergy,x
@@ -1956,8 +1936,7 @@ BouncyCastle
sta ytraj sta ytraj
; sta xtraj+2 ; sta xtraj+2
; sta ytraj+2 ; sta ytraj+2
sta Erase jsr PutTankNr ; draw tank without shield
jsr DrawTankNr ; draw tank without shield
; ldx TankNr ; restore X value :) ... but we don't need X now .. ; ldx TankNr ; restore X value :) ... but we don't need X now ..
pla pla
sta TankNr ; restore TankNr value :) sta TankNr ; restore TankNr value :)
@@ -2120,6 +2099,15 @@ mrLoopi
sta vy+3 sta vy+3
jsr ShellDelay jsr ShellDelay
;
phx
jsr CheckExitKeys ; Check for O, Esc or Start+Option keys
bpl ExitnotPressed
plx
rts ; exit if pressed 'Exit keys'
ExitnotPressed
plx
;
MIRVdoNotChangeY MIRVdoNotChangeY
@@ -2382,8 +2370,7 @@ NoWall
; ------------------------------------------------- ; -------------------------------------------------
mva #sfx_death_begin sfx_effect mva #sfx_death_begin sfx_effect
jsr FlashTank ; first we flash tank jsr FlashTank ; first we flash tank
mva #1 Erase jsr ClearTankNr ; and erase tank
jsr DrawTankNr ; and erase tank
lda #0 lda #0
sta Erase sta Erase
ldx TankNr ldx TankNr
@@ -2397,89 +2384,6 @@ NoWall
rts rts
.endp .endp
; -------------------------------------------------
.proc AtomicWinter
; -------------------------------------------------
; This routine is run from inside of the main loop
; and replaces Shoot and Flight routines
; X and TankNr - index of shooting tank
; -------------------------------------------------
mva #sfx_sandhog sfx_effect
.IF FASTER_GRAF_PROCS = 1
ldy #0 ; byte counter (from 0 to 39)
NextColumn
; big loop - we repat internal loops for each column of bytes
sty magic
ldx #120 ; line counter (from 0 to 60 )
; first loop - inverse column of bytes for a while
ldy magic
NextLine1
jsr InverseScreenByte
dex
dex
bpl NextLine1
;
jsr WaitOneFrame ; wait uses A only
; second loop - inverse again and put random "snow" to column of bytes
ldx #120
ldy magic
mva #$55 magic+1
NextLine2
jsr InverseScreenByte
lda random
ora magic+1
and (temp),y
sta (temp),y
lda magic+1
eor #$ff
sta magic+1
dex
dex
bpl NextLine2
; and go to next column
iny
cpy #40
bne NextColumn
.ELSE
mva #1 color
mwa #120 ydraw
NextLineSlow
lda #0
sta xdraw
sta xdraw+1
NextPixelSlow
bit random
bpl NoPlot
bvc NoPlot
jsr plot.MakePlot
NoPlot
inw xdraw
cpw xdraw #screenwidth
bne NextPixelSlow
dec ydraw
dec ydraw
bpl NextLineSlow
.ENDIF
; and we have "snow" :)
lda #0
ldx TankNr
sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
jsr SetFullScreenSoilRange
jsr SoilDown2.NoClearTanks
rts
; in order to optimize the fragment repeated in both internal loops
; we save 15 bytes :)
InverseScreenByte
lda LineTableL,x
sta temp
lda LineTableH,x
sta temp+1
lda (temp),y
eor #$ff
sta (temp),y
rts
.endp
; ------------------------------------------------- ; -------------------------------------------------
.proc AutoDefense .proc AutoDefense
; ------------------------------------------------- ; -------------------------------------------------
@@ -2488,8 +2392,8 @@ InverseScreenByte
; ------------------------------------------------- ; -------------------------------------------------
jsr PrepareAIShoot.WepTableToTemp jsr PrepareAIShoot.WepTableToTemp
jsr UseBattery jsr UseBattery
jsr TosserDefensives jmp TosserDefensives
rts ; rts
.endp .endp
; ------------------------------------------------- ; -------------------------------------------------
.proc SpyHard .proc SpyHard
@@ -2527,15 +2431,15 @@ SelectNextTank
beq RepeatSpy beq RepeatSpy
SpyHardEnd SpyHardEnd
mvx TargetTankNr TankNr ; restore mvx TargetTankNr TankNr ; restore
jsr DisplaySpyInfo jmp DisplaySpyInfo
rts ; rts
.endp .endp
.proc DisplaySpyInfo .proc DisplaySpyInfo
lda TankStatusColoursTable,x lda TankStatusColoursTable,x
sta COLOR2 ; set color of status line sta COLOR2 ; set color of status line
jsr PutTankNameOnScreen jmp PutTankNameOnScreen
jsr DisplayStatus ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen
rts ; rts
.endp .endp
; ------------------------------------------------- ; -------------------------------------------------
.proc LazyBoys .proc LazyBoys
@@ -2570,8 +2474,8 @@ EndLazy
sta ForceTableL,x sta ForceTableL,x
lda Force+1 lda Force+1
sta ForceTableH,x sta ForceTableH,x
jsr MoveBarrelToNewPosition jmp MoveBarrelToNewPosition
rts ; rts
.endp .endp
; ------------------------------------------------- ; -------------------------------------------------
.proc TankFlying .proc TankFlying
@@ -2594,14 +2498,7 @@ StoreMaxAlt
mva #sfx_plasma_2_2 sfx_effect mva #sfx_plasma_2_2 sfx_effect
; display text 4x4 - fuel full ; display text 4x4 - fuel full
jsr SetFuelFullText
mwa #hoverFull LineAddress4x4
mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
mva #hoverFullEnd-hoverFull-1 fx ; length
sec
lda FloatingAlt
sbc #12
sta LineYdraw
jsr TypeLine4x4.variableLength jsr TypeLine4x4.variableLength
ldx TankNr ldx TankNr
@@ -2614,19 +2511,17 @@ TankGoUp
cmp FloatingAlt ; Floating altitude cmp FloatingAlt ; Floating altitude
bcc ReachSky bcc ReachSky
; first erase old tank position ; first erase old tank position
mva #1 Erase jsr ClearTankNr
jsr DrawTankNr
lda modify lda modify
cmp #5 cmp #5
bcc NoEngineClear bcc NoEngineClear
mva #0 color mva #0 color
jsr DrawTankRocketEngine jsr DrawTankRocketEngine
NoEngineClear NoEngineClear
mva #0 Erase
dec ytankstable,x dec ytankstable,x
inc modify inc modify
; then draw tank on new position ; then draw tank on new position
jsr DrawTankNr jsr PutTankNr
lda modify lda modify
cmp #5 cmp #5
bcc NoEngine bcc NoEngine
@@ -2644,13 +2539,7 @@ ReachSky
jsr DrawTankRocketEngine jsr DrawTankRocketEngine
; display text 4x4 - fuel full (clear text) ; display text 4x4 - fuel full (clear text)
mwa #hoverFull LineAddress4x4 jsr SetFuelFullText
mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
mva #(hoverFullEnd-hoverFull-1) fx ; length
sec
lda FloatingAlt
sbc #12
sta LineYdraw
lda #$00 lda #$00
jsr TypeLine4x4.staplot4x4color jsr TypeLine4x4.staplot4x4color
; and Soildown at the start (for correct mountaintable if tank was buried) ; and Soildown at the start (for correct mountaintable if tank was buried)
@@ -2689,18 +2578,15 @@ KeyboardAndJoyCheck
bne LotOfFuel bne LotOfFuel
; display text 4x4 - low fuel ; display text 4x4 - low fuel
mwa #hoverEmpty LineAddress4x4 jsr SetLowFuelText
mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
mva #hoverEmptyEnd-hoverEmpty-1 fx ; length
sec
lda FloatingAlt
sbc #12
sta LineYdraw
jsr TypeLine4x4.variableLength jsr TypeLine4x4.variableLength
ldx TankNr
LotOfFuel LotOfFuel
notpressed notpressed
jsr CheckExitKeys
spl:rts ;---Exit key pressed-quit game---
ldx TankNr
; let's animate "engine" ; let's animate "engine"
jsr DrawTankEngine jsr DrawTankEngine
; enimation ends ; enimation ends
@@ -2714,14 +2600,6 @@ notpressed
lda kbcode lda kbcode
and #%00111111 ; CTRL and SHIFT elimination and #%00111111 ; CTRL and SHIFT elimination
cmp #@kbcode._esc ; 28 ; ESC
bne @+
jsr AreYouSure
bit escFlag
bpl notpressed
;---esc pressed-quit game---
rts
@
jumpFromStick jumpFromStick
cmp #@kbcode._left ; $6 cmp #@kbcode._left ; $6
jeq pressedLeft jeq pressedLeft
@@ -2754,8 +2632,7 @@ pressedRight
ldy #1 ldy #1
jsr DecreaseShieldEnergyX jsr DecreaseShieldEnergyX
; first erase old tank position ; first erase old tank position
mva #1 Erase jsr ClearTankNr
jsr DrawTankNr
mva #0 Erase mva #0 Erase
lda XtankstableH,x lda XtankstableH,x
cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 cmp #>(screenwidth-TankWidth-4) ; tank width correction +4
@@ -2778,9 +2655,7 @@ pressedLeft
ldy #1 ldy #1
jsr DecreaseShieldEnergyX jsr DecreaseShieldEnergyX
; first erase old tank position ; first erase old tank position
mva #1 Erase jsr ClearTankNr
jsr DrawTankNr
mva #0 Erase
lda XtankstableH,x lda XtankstableH,x
cmp #0 cmp #0
bne @+ bne @+
@@ -2798,7 +2673,7 @@ NoLEdge
mva #162 AngleTable,x mva #162 AngleTable,x
; then draw tank on new position ; then draw tank on new position
DrawFloatingTank DrawFloatingTank
jsr DrawTankNr jsr PutTankNr
jsr DisplayStatus jsr DisplayStatus
jsr WaitOneFrame jsr WaitOneFrame
jsr CalculateSoildown jsr CalculateSoildown
@@ -2806,13 +2681,7 @@ DrawFloatingTank
pressedSpace pressedSpace
; display text 4x4 - low fuel (clear text) ; display text 4x4 - low fuel (clear text)
mwa #hoverEmpty LineAddress4x4 jsr SetLowFuelText
mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
mva #hoverEmptyEnd-hoverEmpty-1 fx ; length
sec
lda FloatingAlt
sbc #12
sta LineYdraw
lda #$00 lda #$00
jsr TypeLine4x4.staplot4x4color jsr TypeLine4x4.staplot4x4color
ldx TankNr ldx TankNr
@@ -2876,9 +2745,7 @@ TankBelow
; tank below - we must move our tank ; tank below - we must move our tank
ldx TankNr ldx TankNr
; first erase old tank position ; first erase old tank position
mva #1 Erase jsr ClearTankNr
jsr DrawTankNr
mva #0 Erase
bit OverTankDir bit OverTankDir
bmi PassLeft bmi PassLeft
PassRight PassRight
@@ -2894,7 +2761,7 @@ PassLeft
mva #162 AngleTable,x mva #162 AngleTable,x
Bypassing Bypassing
; then draw tank on new position ; then draw tank on new position
jsr DrawTankNr jsr PutTankNr
jmp CheckForTanksBelow jmp CheckForTanksBelow
RightFromTheTank RightFromTheTank
LeftFromTheTank LeftFromTheTank
@@ -2904,8 +2771,7 @@ ItIsMe
bpl CheckCollisionWithTankLoop bpl CheckCollisionWithTankLoop
ldx TankNr ldx TankNr
mva #sfx_shield_off sfx_effect mva #sfx_shield_off sfx_effect
mva #1 Erase jsr ClearTankNr
jsr DrawTankNr
mva #0 Erase mva #0 Erase
; x correction for P/M ; x correction for P/M
; -- ; --
@@ -2934,13 +2800,11 @@ FloatDown
cmp OverTankDir cmp OverTankDir
bcs OnGround bcs OnGround
; first erase old tank position ; first erase old tank position
mva #1 Erase jsr ClearTankNr
jsr DrawTankNr
jsr DrawTankParachute jsr DrawTankParachute
mva #0 Erase
inc ytankstable,x inc ytankstable,x
; then draw tank on new position ; then draw tank on new position
jsr DrawTankNr jsr PutTankNr
jsr DrawTankParachute jsr DrawTankParachute
jsr WaitOneFrame jsr WaitOneFrame
jmp FloatDown jmp FloatDown
@@ -2955,6 +2819,7 @@ OnGround
lda FloatingAlt lda FloatingAlt
cmp #18 cmp #18
beq NotHighest beq NotHighest
SoilDownAfterLanding
jsr ClearScreenSoilRange jsr ClearScreenSoilRange
NotHighest NotHighest
; calculate range ; calculate range
@@ -2974,8 +2839,25 @@ CalculateSoildown
adc #0 adc #0
sta xdraw+1 sta xdraw+1
mva #$04 ExplosionRadius mva #$04 ExplosionRadius
jsr CalculateExplosionRange jmp CalculateExplosionRange
; rts
SetFuelFullText
mwa #hoverFull LineAddress4x4
mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
mva #hoverFullEnd-hoverFull fx ; length
bne SetTextLevel ; !! length<>0
SetLowFuelText
mwa #hoverEmpty LineAddress4x4
mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
mva #hoverEmptyEnd-hoverEmpty fx ; length
SetTextLevel
sec
lda FloatingAlt
sbc #12
sta LineYdraw
rts rts
.endp .endp
; ------------------------------------------------- ; -------------------------------------------------
@@ -3003,9 +2885,9 @@ CheckCollisionWithTankLoop
; with or without shield ? ; with or without shield ?
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
cmp #ind_Mag_Deflector__ ; first shielded weapon cmp #ind_Mag_Deflector ; first shielded weapon
bcc CheckCollisionWithNotShieldedTank bcc CheckCollisionWithNotShieldedTank
cmp #ind_Bouncy_Castle__+1 ; last shielded weapon cmp #ind_Bouncy_Castle +1 ; last shielded weapon
bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :)
;lda ShieldEnergy,x ; there is wrong method to check shield :) ;lda ShieldEnergy,x ; there is wrong method to check shield :)
@@ -3203,24 +3085,5 @@ noBullets
rts rts
.endp .endp
;--------------------------------------------------
.proc ShellDelay
lda CONSOL
and #%00000101 ; Start + Option
bne @+
mva #$40 escFlag
@ and #%00000001
beq noShellDelay
ldx flyDelay
DelayLoop
lda VCOUNT
@ cmp VCOUNT
beq @-
dex
bne DelayLoop
noShellDelay
rts
.endp
.ENDIF .ENDIF