From 0f6e171e5cea70339a05850bac45af9c1743ce83 Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 10 Apr 2022 11:18:29 -0400 Subject: [PATCH] build 134 --- README.md | 12 ++++-- ai.asm | 55 --------------------------- artwork/HIMARS14.asm | 33 +++++++++-------- constants.asm | 71 +++++++++++++++++++++++++++++------ display.asm | 8 +--- grafproc.asm | 32 ++-------------- lib/atari.hea | 86 +++++++++++++++++++++---------------------- scorch.asm | 2 - scorch.xex | Bin 33853 -> 33774 bytes textproc.asm | 14 ++++--- variables.asm | 12 +++--- weapons.asm | 14 +++---- 12 files changed, 154 insertions(+), 185 deletions(-) diff --git a/README.md b/README.md index 5e25491..45ef4f2 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ -# Atari 8-bit Scorched Earth source code +# Scorch - Atari 8-bit Scorched Earth clone source code --------------------------------------------------- + +Scorch is a multi-player, turn-based, artillery video game. Tanks do turn-based battle in two-dimensional terrain, with each player adjusting the angle and power of their tank turret before each shot. + by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski Warsaw, Miami 2000, 2001, 2002, 2003, 2009, 2012, 2013, 2022 @@ -7,9 +10,10 @@ Warsaw, Miami 2000, 2001, 2002, 2003, 2009, 2012, 2013, 2022 You can contact us at pecus@poczta.fm or pirx@5oft.pl home page of this project is https://github.com/pkali/scorch_src -This source code was originally compiled under OMC65 crossassembler -(https://github.com/pkali/omc65) -and on 2012-06-21 translated to mads +This source code was originally compiled under [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` + Game source code is split into 5+3 parts: - scorch.asm is the main game code (with many assorted routines) diff --git a/ai.asm b/ai.asm index 9e13183..1dd7530 100755 --- a/ai.asm +++ b/ai.asm @@ -345,58 +345,3 @@ loop rts .endp - - -PurchaseMeTable .proc ;weapons good to be purchased by the robot - ;the comment is an index in the tables - dta 1 ;"Baby Missile " ; 0 - dta 1 ;"Missile " ; 1 - dta 1 ;"Baby Nuke " ; 2 - dta 1 ;"Nuke " ; 3 - dta 1 ;"LeapFrog " ; 4 - dta 1 ;"Funky Bomb " ; 5 - dta 1 ;"MIRV " ; 6 - dta 1 ;"Death's Head " ; 7 - dta 0 ;"Napalm " ; 8 - dta 0 ;"Hot Napalm " ; 9 - dta 0 ;"Tracer " ; 10 - dta 0 ;"Smoke Tracer " ; 11 - dta 1 ;"Baby Roller " ; 12 - dta 1 ;"Roller " ; 13 - dta 1 ;"Heavy Roller " ; 14 - dta 0 ;"Riot Charge " ; 15 - dta 0 ;"Riot Blast " ; 16 - dta 0 ;"Riot Bomb " ; 17 - dta 0 ;"Heavy Riot Bomb " ; 18 - dta 0 ;"Baby Digger " ; 19 - dta 0 ;"Digger " ; 20 - dta 0 ;"Heavy Digger " ; 21 - dta 0 ;"Baby Sandhog " ; 22 - dta 0 ;"Sandhog " ; 23 - dta 0 ;"Heavy Sandhog " ; 24 - dta 0 ;"Dirt Clod " ; 25 - dta 0 ;"Dirt Ball " ; 26 - dta 0 ;"Ton of Dirt " ; 27 - dta 1 ;"Liquid Dirt " ; 28 - dta 0 ;"Dirt Charge " ; 29 - dta 0 ;"Earth Disrupter " ; 30 - dta 1 ;"Plasma Blast " ; 31 - dta 1 ;"Laser " ; 32 - dta 0 ;"----------------" ; 33 - dta 0 ;"----------------" ; 34 - dta 0 ;"----------------" ; 35 - dta 0 ;"----------------" ; 36 - dta 0 ;"----------------" ; 37 - dta 0 ;"----------------" ; 38 - dta 0 ;"----------------" ; 39 - dta 0 ;"----------------" ; 40 - dta 0 ;"----------------" ; 41 - dta 0 ;"----------------" ; 42 - dta 0 ;"----------------" ; 43 - dta 0 ;"----------------" ; 44 - dta 0 ;"----------------" ; 45 - dta 0 ;"----------------" ; 46 - dta 0 ;"----------------" ; 47 - -.endp - \ No newline at end of file diff --git a/artwork/HIMARS14.asm b/artwork/HIMARS14.asm index 88cd952..12637ab 100644 --- a/artwork/HIMARS14.asm +++ b/artwork/HIMARS14.asm @@ -7,7 +7,15 @@ ;icl "HIMARS14.h" ;ICL '../lib/atari.hea' - org $80 + +WIDTH = 40 +HEIGHT = 30 + +; --- BASIC switch OFF + org $2000\ mva #$ff portb\ rts\ ini $2000 + +; --- dmsc LZSS player routine on zero page + org $80 chn_copy .ds 9 chn_pos .ds 9 @@ -26,22 +34,15 @@ skip rts .endp song_ptr = get_byte + 1 - - -fcnt .ds 2 -fadr .ds 2 -fhlp .ds 2 -cloc .ds 1 -regA .ds 1 -regX .ds 1 -regY .ds 1 - -WIDTH = 40 -HEIGHT = 30 - -; --- BASIC switch OFF - org $2000\ mva #$ff portb\ rts\ ini $2000 + +fcnt .ds 2 +fadr .ds 2 +fhlp .ds 2 +cloc .ds 1 +regA .ds 1 +regX .ds 1 +regY .ds 1 ; --- MAIN PROGRAM org $2000 ant dta $F0 diff --git a/constants.asm b/constants.asm index b595e1b..bb2308c 100644 --- a/constants.asm +++ b/constants.asm @@ -13,7 +13,6 @@ CashOptionH GravityTable .by 10,20,25,30,40 MaxWindTable .by 5,20,40,60,80 RoundsTable .by 10,20,30,40,50 -RoundsInTheGame .by 10 ;how many rounds in the current game flyDelayTable .by 255,150,75,35,1 ;------------------------------------------------ @@ -284,12 +283,8 @@ costable linetableL :screenheight .by <(display+screenBytes*#) - ;:20 .by <(display+screenBytes*#) - .by (display+screenBytes*#) - ;:20 .by >(display+screenBytes*#) - .by >PlotLine ;---------------------------- bittable .by $80,$40,$20,$10,$08,$04,$02,$01 @@ -327,7 +322,7 @@ WhereToSlideTable .BY %000 ; 00001001 .BY %000 ; 00001010 .BY %000 ; 00001011 - .BY %000 ; 00001100 + .BY %100 ; 00001100 .BY %000 ; 00001101 .BY %000 ; 00001110 .BY %000 ; 00001111 @@ -630,12 +625,12 @@ EndOfTheBarrelY ;------------------------------------------------- TanksNamesDefault - dta d"1st Tank" - dta d"2nd Tank" - dta d"3rd Tank" - dta d"4th Tank" - dta d"5th Tank" - dta d"6th Tank" + dta d"1st.Tank" + dta d"2nd.Tank" + dta d"3rd.Tank" + dta d"4th.Tank" + dta d"5th.Tank" + dta d"6th.Tank" ;Weapon prices (*10 on screen) price_Baby_Missile___ = 0 ;_0 @@ -907,6 +902,58 @@ WeaponUnits .by 25 ;Contact_Trigger .by 0 ;_____________63 +PurchaseMeTable ;weapons good to be purchased by the robot + ;the comment is an index in the tables + dta 1 ;"Baby Missile " ; 0 + dta 1 ;"Missile " ; 1 + dta 1 ;"Baby Nuke " ; 2 + dta 1 ;"Nuke " ; 3 + dta 1 ;"LeapFrog " ; 4 + dta 1 ;"Funky Bomb " ; 5 + dta 1 ;"MIRV " ; 6 + dta 1 ;"Death's Head " ; 7 + dta 0 ;"Napalm " ; 8 + dta 0 ;"Hot Napalm " ; 9 + dta 0 ;"Tracer " ; 10 + dta 0 ;"Smoke Tracer " ; 11 + dta 1 ;"Baby Roller " ; 12 + dta 1 ;"Roller " ; 13 + dta 1 ;"Heavy Roller " ; 14 + dta 0 ;"Riot Charge " ; 15 + dta 0 ;"Riot Blast " ; 16 + dta 0 ;"Riot Bomb " ; 17 + dta 0 ;"Heavy Riot Bomb " ; 18 + dta 0 ;"Baby Digger " ; 19 + dta 0 ;"Digger " ; 20 + dta 0 ;"Heavy Digger " ; 21 + dta 0 ;"Baby Sandhog " ; 22 + dta 0 ;"Sandhog " ; 23 + dta 0 ;"Heavy Sandhog " ; 24 + dta 0 ;"Dirt Clod " ; 25 + dta 0 ;"Dirt Ball " ; 26 + dta 0 ;"Ton of Dirt " ; 27 + dta 0 ;"Liquid Dirt " ; 28 + dta 0 ;"Dirt Charge " ; 29 + dta 0 ;"Earth Disrupter " ; 30 + dta 0 ;"Plasma Blast " ; 31 + dta 1 ;"Laser " ; 32 + dta 0 ;"----------------" ; 33 + dta 0 ;"----------------" ; 34 + dta 0 ;"----------------" ; 35 + dta 0 ;"----------------" ; 36 + dta 0 ;"----------------" ; 37 + dta 0 ;"----------------" ; 38 + dta 0 ;"----------------" ; 39 + dta 0 ;"----------------" ; 40 + dta 0 ;"----------------" ; 41 + dta 0 ;"----------------" ; 42 + dta 0 ;"----------------" ; 43 + dta 0 ;"----------------" ; 44 + dta 0 ;"----------------" ; 45 + dta 0 ;"----------------" ; 46 + dta 0 ;"----------------" ; 47 + + ;------------------------------------------------- ; Screen codes of icons (chars) representing a given weapon WeaponSymbols diff --git a/display.asm b/display.asm index c03043e..d2244ef 100755 --- a/display.asm +++ b/display.asm @@ -51,10 +51,7 @@ dl ; MAIN game display list .byte $42 .word textbuffer .byte $02, $02 +$80 ;DLI - .byte $00 - - .byte $4f - .word PlotLine + .byte $10 ; 2 blank lines .byte $4f .word display @@ -66,12 +63,11 @@ dl ; MAIN game display list :97 .byte $0f .byte $41 .word dl -PlotLine = display + screenHeight*screenBytes ; the last line is plot pointer ;----------------------------------------------- ;Screen displays go first to avoid crossing 4kb barrier ;----------------------------------------------- OptionsScreen - dta d"Welcome to Scorch ver. 133 (un)2000-2022" + dta d"Welcome to Scorch ver. 134 (un)2000-2022" dta d" Please select option with cursor keys " dta d" and press (Return) to proceed " OptionsHere diff --git a/grafproc.asm b/grafproc.asm index 9096c3a..095e20c 100755 --- a/grafproc.asm +++ b/grafproc.asm @@ -977,6 +977,7 @@ EndDrawing .endp ; ----------------------------------------- unPlot .proc +; plots a point and saves the plotted byte, reverts the previous plot. ; ----------------------------------------- ldx #0 ; only one pixel unPlotAfterX @@ -996,7 +997,8 @@ unPlotAfterX ; is it not out of the screen ???? cpw ydraw #screenheight - jcs EndOfUnPlot + jcc CheckX + mwa #0 ydraw CheckX cpw xdraw #screenwidth jcs EndOfUnPlot @@ -1032,6 +1034,7 @@ MakeUnPlot lda color beq ClearUnPlot + ;plotting here lda (xbyte),y sta OldOraTemp ora bittable,x @@ -1174,33 +1177,6 @@ point .proc rts .endp -; ----------------------------------------- -PlotPointer .proc -; ----------------------------------------- -; draws pointer that shows where is the bullet -; when it is over the screen -; (it is on the top of the screen) - - - mwa xdraw tempCir - - mva #0 color - mwa #screenHeight ydraw - mwa oldPlotPointerX xdraw - jsr plot - - - mwa tempCir xdraw - - mva #1 color - mwa #screenHeight ydraw - jsr plot - - mwa xdraw oldPlotPointerX - - rts - -.endp ;-------------------------------------------------- DrawLine .proc ;-------------------------------------------------- diff --git a/lib/atari.hea b/lib/atari.hea index 35f0629..2d5e17b 100755 --- a/lib/atari.hea +++ b/lib/atari.hea @@ -103,8 +103,8 @@ CONSOL = $D01F ; rejestr stanu klawiszy konsoli Start (bit 0), Select (bit 1), * --- POKEY * --------------------------------------------------------------------------------------------- -IRQENS = $0010 ; rejestr-cie� IRQEN -IRQSTAT = $0011 ; rejestr-cie� IRQST +IRQENS = $0010 ; shadow register IRQEN +IRQSTAT = $0011 ; shadow register IRQST AUDF3 = $D204 ; cz�stotliwo�� pracy generatora 3 (Z) AUDCTL = $D208 ; rejestr kontroli generator�w d�wi�ku (Z) @@ -147,22 +147,22 @@ NMIST = $D40F ; rejestr statusu przerwa� NMI ;------------------------------------- ;additional system variables ;------------------------------------- -COLPM0S = $02C0 ;- - rejestr-cie� COLPM0 -COLPM1S = $02C1 ;- - rejestr-cie� COLPM1 -COLPM2S = $02C2 ;- - rejestr-cie� COLPM2 -COLPM3S = $02C3 ;- - rejestr-cie� COLPM3 -COLPF0S = $02C4 ;- - rejestr-cie� COLPF0 -COLPF1S = $02C5 ;- - rejestr-cie� COLPF1 -COLPF2S = $02C6 ;- - rejestr-cie� COLPF2 -COLPF3S = $02C7 ;- - rejestr-cie� COLPF3 +COLPM0S = $02C0 ;- - shadow register COLPM0 +COLPM1S = $02C1 ;- - shadow register COLPM1 +COLPM2S = $02C2 ;- - shadow register COLPM2 +COLPM3S = $02C3 ;- - shadow register COLPM3 +COLPF0S = $02C4 ;- - shadow register COLPF0 +COLPF1S = $02C5 ;- - shadow register COLPF1 +COLPF2S = $02C6 ;- - shadow register COLPF2 +COLPF3S = $02C7 ;- - shadow register COLPF3 COLBAKS = $02C8 -GTICTLS = $026F ;- - rejestr-cie� GTIACTL +GTICTLS = $026F ;- - shadow register GTIACTL DMACTLS = $022F ;- - rejestr kontroli dost�pu do pami�ci - cie� DLPTRS = $0230 ;- - adres programu ANTIC-a - cie� -CHBAS = $02F4 ;- - rejestr-cie� CHBASE -KBCODES = $02FC ;- - rejestr-cie� KBCODE +CHBAS = $02F4 ;- - shadow register CHBASE +KBCODES = $02FC ;- - shadow register KBCODE SETVBV = $E45C XITVBV = $E462 @@ -178,10 +178,10 @@ JSTICK2 = $027A ;- JSTICK2 - po�o�enie joysticka 0 JSTICK3 = $027B ;- JSTICK3 - po�o�enie joysticka 1 PTRIG0 = $027C ;- PTRIG0 - przycisk potencjometru 0 PTRIG1 = $027D ;- PTRIG1 - przycisk potencjometru 1 -TRIG0S = $0284 ;- TRIG0S - przycisk joysticka 0, rejestr-cie� TRIG0 -TRIG1S = $0285 ;- TRIG1S - przycisk joysticka 1, rejestr-cie� TRIG1 -TRIG2S = $0286 ;- TRIG2S - rejestr-cie� TRIG0 -TRIG3S = $0287 ;- TRIG3S - rejestr-cie� TRIG1 +TRIG0S = $0284 ;- TRIG0S - przycisk joysticka 0, shadow register TRIG0 +TRIG1S = $0285 ;- TRIG1S - przycisk joysticka 1, shadow register TRIG1 +TRIG2S = $0286 ;- TRIG2S - shadow register TRIG0 +TRIG3S = $0287 ;- TRIG3S - shadow register TRIG1 /* @@ -189,8 +189,8 @@ Rejestry OS w pami�ci RAM $08 - WARMST - znacznik gor�cego startu $0E - APPMHI - najwy�szy adres RAM zaj�ty przez program - $10 - IRQENS - rejestr-cie� IRQEN - $11 - IRQSTAT - rejestr-cie� IRQST + $10 - IRQENS - shadow register IRQEN + $11 - IRQSTAT - shadow register IRQST $12 - RTCLOK - zegar czasu rzeczywistego $15 - BUFADR - adres bufora dla operacji dyskowych $17 - ICCOMT - rejestr przej�ciowy kodu operacji I/O @@ -267,12 +267,12 @@ $0214 - VTIMR4 - wektor przerwania licznika 4 POKEY-a $0218 - TIMCNT1 - pierwszy licznik systemu $0226 - TIMVEC1 - wektor przerwania licznika TIMCNT1 $022A - TIMFLG3 - znacznik wyzerowania licznika TIMCNT3 -$022F - DMACTLS - rejestr-cie� DMACTL -$0230 - DLPTRS - rejestr-cie� DLPTR -$0232 - SKCTLS - rejestr-cie� SKCTL +$022F - DMACTLS - shadow register DMACTL +$0230 - DLPTRS - shadow register DLPTR +$0232 - SKCTLS - shadow register SKCTL $0233 - LCOUNT - licznik odczytu dla nowego urz�dzenia -$0234 - LPENHS - rejestr-cie� LPENH -$0235 - LPENVS - rejestr-cie� LPENV +$0234 - LPENHS - shadow register LPENH +$0235 - LPENVS - shadow register LPENV $023A - CDEVIC - kod urz�dzenia dla SIO $023B - CCMND - kod operacji dla SIO $023C - CAUX1 - pierwszy bajt pomocniczy dla SIO @@ -283,25 +283,25 @@ $0244 - COLDST - znacznik zimnego startu systemu $0245 - RECLEN - d�ugo�� rekordu z nowego urz�dzenia $0246 - DSKTIM - warto�� Timeout dla stacji dysk�w $0247 - PDVMSK - maska obecno�ci nowych urz�dze� -$0248 - PDVRS - rejestr-cie� PDVREG +$0248 - PDVRS - shadow register PDVREG $024A - RELADR - adres procedury przemieszczalnej $024C - PPTMPA - rejestr przechowania zawarto�ci akumulatora $024D - PPTMPX - rejestr przechowania zawarto�ci rejestru X $026B - CHSPTR - wektor nieu�ywanego zestawu znak�w $026C - VSFLAG - znacznik przesuwu pionowego obrazu $026E - FINE - znacznik delikatnego przesuwu obrazu -$026F - GTICTLS - rejestr-cie� GTIACTL -$0270 - PADDL0 - rejestr-cie� POT0 +$026F - GTICTLS - shadow register GTIACTL +$0270 - PADDL0 - shadow register POT0 $0278 - JSTICK0 - po�o�enie joysticka 0 $0279 - JSTICK1 - po�o�enie joysticka 1 $027A - JSTICK2 - po�o�enie joysticka 0 $027B - JSTICK3 - po�o�enie joysticka 1 $027C - PTRIG0 - przycisk potencjometru 0 $027D - PTRIG1 - przycisk potencjometru 1 -$0284 - TRIG0S - przycisk joysticka 0, rejestr-cie� TRIG0 -$0285 - TRIG1S - przycisk joysticka 1, rejestr-cie� TRIG1 -$0286 - TRIG2S - rejestr-cie� TRIG0 -$0287 - TRIG3S - rejestr-cie� TRIG1 +$0284 - TRIG0S - przycisk joysticka 0, shadow register TRIG0 +$0285 - TRIG1S - przycisk joysticka 1, shadow register TRIG1 +$0286 - TRIG2S - shadow register TRIG0 +$0287 - TRIG3S - shadow register TRIG1 $0288 - HIBYTE - indeks operacji nowego urz�dzenia $0289 - WMODE - znacznik sposobu dost�pu do magnetofonu $028A - BLIM - d�ugo�� bufora magnetofonu @@ -326,15 +326,15 @@ $02BC - HOLD4 - pomocniczy rejestr przej�ciowy $02BD - DRETRY - liczba powt�rze� wywo�a� urz�dzenia $02BE - SHFLOK - znacznik klawiszy SHIFT i CONTROL $02BF - BOTSCR - liczba wierszy tekstu -$02C0 - COLPM0S - rejestr-cie� COLPM0 -$02C1 - COLPM1S - rejestr-cie� COLPM1 -$02C2 - COLPM2S - rejestr-cie� COLPM2 -$02C3 - COLPM3S - rejestr-cie� COLPM3 -$02C4 - COLPF0S - rejestr-cie� COLPF0 -$02C5 - COLPF1S - rejestr-cie� COLPF1 ;gr.8 letters -$02C6 - COLPF2S - rejestr-cie� COLPF2 ;gr.8 background -$02C7 - COLPF3S - rejestr-cie� COLPF3 -$02C8 - COLBAKS - rejestr-cie� COLBAK +$02C0 - COLPM0S - shadow register COLPM0 +$02C1 - COLPM1S - shadow register COLPM1 +$02C2 - COLPM2S - shadow register COLPM2 +$02C3 - COLPM3S - shadow register COLPM3 +$02C4 - COLPF0S - shadow register COLPF0 +$02C5 - COLPF1S - shadow register COLPF1 ;gr.8 letters +$02C6 - COLPF2S - shadow register COLPF2 ;gr.8 background +$02C7 - COLPF3S - shadow register COLPF3 +$02C8 - COLBAKS - shadow register COLBAK $02C9 - RUNADR - adres procedury nowego urz�dzenia $02CB - HIUSED - adres ko�cowy procedury nowego urz�dzenia $02CF - GBYTEA - adres procedury nowego urz�dzenia @@ -352,15 +352,15 @@ $02EC - DVTMOT - dodatkowy rejestr Timeout urz�dzenia $02ED - REVNUM - numer wersji nowego urz�dzenia $02EE - CBAUD - pr�dko�� transmisji z magnetofonu $02F0 - CRSINH - znacznik widoczno�ci kursora -$02F3 - CHACT - rejestr-cie� CHRCTL -$02F4 - CHBAS - rejestr-cie� CHBASE +$02F3 - CHACT - shadow register CHRCTL +$02F4 - CHBAS - shadow register CHBASE $02F5 - NEWROW - nowa pozycja pionowa kursora $02F6 - NEWCOL - nowa pozycja pozioma kursora $02F8 - ROWINC - zmiana pionowej pozycji kursora $02F9 - COLINC - zmiana poziomej pozycji kursora $02FA - CHAR - kod wewn�trzny znaku $02FB - ATACHR - kod ATASCII znaku -$02FC - KBCODES - rejestr-cie� KBCODE +$02FC - KBCODES - shadow register KBCODE $02FD - FILDAT - numer koloru dla wype�niania $02FE - DSPFLG - znacznik wy�wietlania znak�w kontrolnych $02FF - SSFLAG - znacznik start/stop dla przesuwu obrazu diff --git a/scorch.asm b/scorch.asm index ddc4d26..8b1aa03 100644 --- a/scorch.asm +++ b/scorch.asm @@ -715,8 +715,6 @@ deletePtr = temp lda #0 sta Erase sta tracerflag - sta oldPlotPointerX - sta oldPlotPointerX+1 sta GameIsOver diff --git a/scorch.xex b/scorch.xex index 500356ac65fac339d6672cb346dd9c61ee5d16d2..87d5dbca6d9f1ffd7a46c093ed28a60f081d7c52 100644 GIT binary patch delta 12165 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 delta 12276 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 G^S=T4;GaJL diff --git a/textproc.asm b/textproc.asm index fe72a05..c802281 100755 --- a/textproc.asm +++ b/textproc.asm @@ -823,11 +823,13 @@ NoArrowDown jsr PMoutofScreen ; display tank number ldx tanknr + lda skillTable,x + sta difficultyLevel inx stx decimal mwa #(NameScreen+41) displayposition jsr displaybyte - jsr SelectLevel ; setting choosen level of the opponent (Moron, etc) + jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc) ; clear tank name editor field ldx #8 @@ -919,7 +921,7 @@ ChangeOfLevelUp ; change difficulty level of computer opponent bne DoNotLoopLevelUp mva #$0 DifficultyLevel DoNotLoopLevelUp - jsr SelectLevel + jsr HighlightLevel jmp CheckKeys ;---- ChangeOfLevelDown @@ -927,7 +929,7 @@ ChangeOfLevelDown bpl DoNotLoopLevelDown mva #$8 DifficultyLevel DoNotLoopLevelDown - jsr SelectLevel + jsr HighlightLevel jmp CheckKeys ;---- ChangeOfLevel3Up @@ -939,7 +941,7 @@ ChangeOfLevel3Up sbb DifficultyLevel #9 DoNotLoopLevel3Up - jsr SelectLevel + jsr HighlightLevel jmp CheckKeys ;---- ChangeOfLevel3Down @@ -947,7 +949,7 @@ ChangeOfLevel3Down bpl @+ adb DifficultyLevel #9 @ - jsr SelectLevel + jsr HighlightLevel jmp CheckKeys ;---- EndOfNick @@ -992,7 +994,7 @@ nextchar05 .endp -.proc SelectLevel +.proc HighlightLevel ; this routine highlights the choosen ; level of the computer opponent ldx #8 ; 9 possible levels diff --git a/variables.asm b/variables.asm index 0bd7e95..f4996e9 100755 --- a/variables.asm +++ b/variables.asm @@ -16,7 +16,13 @@ TanksNames ; DO NOT ZERO - ticket #24 ;---------------------------- ;Options DO NOT ZERO - ticket #27 OptionsTable .by 0,0,2,2,0,1 +RoundsInTheGame .by 10 ;how many rounds in the current game ;-------------------------------------------------- +skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) + .DS [MaxPlayers] +;----------------------------------- + + variablesStart ; zeroing starts here ;-------------- OptionsY .ds 0 ;vertical position of cursor on Options screen @@ -26,9 +32,6 @@ NumberOfPlayers .DS 1 ;current number of players (counted from 1) TankSequence .DS [MaxPlayers] ;sequence of shooting during the Round GameIsOver .DS 1 ; 1 - it was the last round in the game ;----------------------------------- -skilltable ; computer controlled players' skills (1-8), 0 - human - .DS [MaxPlayers] -;----------------------------------- moneyH ;we place zero at the end of prices and money ;and have range from 0 to 99990 (not too much) ;money players have (maybe one more byte is needed?) @@ -354,9 +357,6 @@ ResultOfTankNr .DS 1 ;---------------------------- -oldPlotPointerX - .ds 2 -;---------------------------- ;PutChar4x4 LoopCounter4x4 .DS 1 y4x4 .DS 1 diff --git a/weapons.asm b/weapons.asm index faa6966..ee989b4 100755 --- a/weapons.asm +++ b/weapons.asm @@ -218,10 +218,10 @@ DoNotEor mwa ytrajfb ytraj+1 jsr Flight + jsr CalculateExplosionRange lda HitFlag beq NoExplosionInFunkyBomb - jsr CalculateExplosionRange - jsr xmissile + jsr xmissile NoExplosionInFunkyBomb dec FunkyBombCounter bne FunkyBombLoop @@ -1673,7 +1673,7 @@ SkipCollisionCheck jsr UnPlot NoUnPlot - jsr PlotPointer + ; jsr PlotPointer jmp Loopi @@ -2020,7 +2020,6 @@ mrSkipCollisionCheck jsr unPlot.unPlotAfterX ldx MirvMissileCounter jne mrLoopi - jsr PlotPointer ; pointer only for bullet nr 0 jmp mrLoopi @@ -2241,9 +2240,10 @@ HowManyBullets .proc ShellDelay .proc ldx flyDelay DelayLoop - sta wsync - sta wsync - dex + lda VCOUNT +@ cmp VCOUNT + beq @- + dex bne DelayLoop rts .endp