Compare commits

..

64 Commits

Author SHA1 Message Date
Pirx 7ff3858433 Merge pull request #83 from pkali/develop
build 142
2022-05-30 09:05:04 -04:00
Pirx eae8cb08d8 build 142 2022-05-30 09:04:09 -04:00
Pirx f13d7ac801 death weapons fix 2022-05-30 08:36:30 -04:00
Pecusx 0ddbe41005 Hit one pixel over ground 2022-05-30 14:34:58 +02:00
Pecusx 7cd31450c7 Better ground hit handling and small bugfix
But.... no effect in #66 :(
2022-05-30 14:17:46 +02:00
Pirx a556e50e53 seppuku fix 2022-05-30 07:12:10 -04:00
Pirx 9f1720e970 work in progress... 2022-05-30 05:54:00 -04:00
Pirx 2df28af79c WIP: hunting for #47 2022-05-29 08:00:23 -04:00
Pirx defbde5b87 cosmetics 2022-05-29 00:25:19 -04:00
Pirx 0820124f9f LimitForce added #70 2022-05-28 21:43:55 -04:00
Pirx aa74cf133b draw jmp(indirect) ellimination 2022-05-28 13:42:42 -04:00
Pirx 2c640c370a Shooter shooting too strong #70 2022-05-28 09:42:38 -04:00
Pirx 636e121bf7 funkybomb traces deleted #5 2022-05-28 08:38:46 -04:00
Pirx 3c1b0a02aa cosmetic edits 2022-05-28 01:50:59 -04:00
Pirx be5652074a font4x4 xy check removed 2022-05-27 21:40:15 -04:00
Pirx a425500d4e seppuku turbo mode 2022-05-27 21:26:18 -04:00
Pirx a721b82944 chmod fix 2022-05-27 21:12:46 -04:00
Pirx 762b56567b chmod fix 2022-05-27 21:10:35 -04:00
Pecusx b11d22d1bb Correct x position of 4x4 characters 2022-05-26 09:43:12 +02:00
Pirx c68ba09103 blinking seppuku 2022-05-25 20:47:09 -04:00
Pecusx e399754e0c One unified procedure for 4x4 fonts 2022-05-25 20:36:15 +02:00
Pecusx 381495fb5a Sepuku error :)
4x4 texts were drawn 4 pixels too high
2022-05-25 19:31:09 +02:00
Pecusx 17b57d1ed2 Better (and faster!) 4x4 char handling.
New PutChar4x4FULL proc.
2022-05-25 12:05:24 +02:00
Pecusx 2fb04cabff Description of the EndOfTheBarrel arrays.
Description only. No code changes.
2022-05-23 08:59:45 +02:00
Pirx 457af6d6b9 Merge pull request #78 from pkali/develop
README updt
2022-05-22 22:01:11 -04:00
Pirx bdf0f10cc0 README updt 2022-05-22 22:00:24 -04:00
Pirx 347e59d5a2 Merge pull request #77 from pkali/develop
build 141
2022-05-22 21:55:20 -04:00
Pirx 61ff5e47e1 build 141 2022-05-22 21:54:34 -04:00
Pirx 2d8c71e9ff smalls and #13 2022-05-22 21:23:56 -04:00
Pirx fd1a61c1f9 display fix 2022-05-22 14:14:23 -04:00
Pecusx 571b3c137e Revert "First attempt to 2 bytes Y"
This reverts commit 7e24e44f1b.
2022-05-22 19:17:17 +02:00
Pecusx bd8ecad2dd Merge branch 'develop' of https://github.com/pkali/scorch_src into develop 2022-05-22 19:11:19 +02:00
Pecusx 7e24e44f1b First attempt to 2 bytes Y 2022-05-22 19:10:52 +02:00
Pirx eb8360dcd0 Merge branch 'develop' of github.com:pkali/scorch_src into develop 2022-05-22 13:09:04 -04:00
Pirx 3d8ec72da0 glich #55 2022-05-22 13:08:42 -04:00
Pecusx 2f099897c7 Cleanup 2022-05-22 18:25:31 +02:00
Pirx 26f82b59c1 code cleanup 2022-05-22 11:25:40 -04:00
Pirx 9a3cf1251f ESC updt #74 2022-05-22 10:59:06 -04:00
Pirx ec5838ebaf ESCape from menus #74 2022-05-22 10:12:52 -04:00
Pirx 491dc2861c speed up when [START] #73 2022-05-22 09:39:17 -04:00
Pirx 5e476eb742 [SHIFT] bug #61 2022-05-21 19:21:42 -04:00
Pirx 661d4776c7 cosinus angle fix #65 2022-05-21 18:50:13 -04:00
Pirx 3701accfc9 glitches when switches #72 2022-05-21 18:29:56 -04:00
Pirx fb54230ea7 white flag #62 2022-05-21 13:19:55 -04:00
Pirx fb86876d9f cos table removed #65 2022-05-21 13:12:54 -04:00
Pirx 80bc302689 too much force for AI #70 2022-05-21 11:20:16 -04:00
Pirx d9645b9c37 post intro glitch fix #67 2022-05-21 08:45:26 -04:00
Pecusx 620bcf5aa8 Small bugfix and optymalisation
Bugfix in drawnountains (now ground 0 is possible: ) )
Otymized flight proc - explosions no wrap around screen - why? :)
2022-05-18 20:00:27 +02:00
Pirx d0a9fb0fbe Merge pull request #60 from pkali/develop
build 140
2022-05-15 23:22:19 -04:00
Pirx 68bf4a9541 build 140 2022-05-15 23:21:47 -04:00
Pecusx 7dd3ecd2bf Merge pull request #59 from pkali/develop
Colors on tanks names screen
2022-05-14 20:33:59 +02:00
Pecusx 08f7680563 Colors on tanks names screen 2022-05-14 20:28:14 +02:00
Pirx d9322221a3 Merge pull request #58 from pkali/develop
master reconciliation
2022-05-14 08:14:25 -04:00
Pirx d766088b66 colors upd+weapon change sfx 2022-05-14 08:13:32 -04:00
Pecusx de5bfab2a8 Tank colors bugfix & new DLI for purchase screen
He, he.
The tank colors were not taken from the table :)
2022-05-13 09:18:50 +02:00
Pecusx 91b39e736b Minor optimizations
LiquidDirt and TypeChar (8x8 on graphics screen - like tanks) are little faster now.
2022-05-12 19:45:42 +02:00
Pecusx 572bee982a Test
I'am in develop branch :)
2022-05-12 19:02:26 +02:00
Pirx b37dc73f52 WIP: colors test 2022-05-12 09:53:56 -04:00
Pecusx 11ddf69de9 Merge branch 'master' of https://github.com/pkali/scorch_src 2022-05-11 19:03:42 +02:00
Pecusx 0ba4594712 Playfield in niverse
Playfield is now drawn in inverse for better color control (in future ;) )
Problems in DLI!
2022-05-11 19:03:35 +02:00
Pirx 8556dfe0d7 joytest for real hardware 2022-05-11 10:51:22 -04:00
Pecusx 860d0917ad Fixed bugs in LiqudDirt and Roller
Correct operation of dirt at the edges of the screen, and now dirt counter is two bytes (more and more dirt is possible).
Correction of the roller's (and LiquidDirtoperation on the right side of the screen. (old stiupid error)
2022-05-09 17:58:07 +02:00
Pecusx 2de2c24373 Very old bug fixed!
In the second (and next) round, the ground was drawn one pixel lower than it should have been.
2022-05-09 11:20:42 +02:00
Pirx a6382c5dc0 README UPDT 2022-05-09 01:32:02 -04:00
25 changed files with 794 additions and 830 deletions
+2
View File
@@ -0,0 +1,2 @@
*.bak
Executable → Regular
View File
Executable → Regular
+47 -14
View File
@@ -8,14 +8,15 @@ by Tomasz 'Pecus' Pecko and Pawel 'pirx' Kalinowski
Warsaw, Miami 2000, 2001, 2002, 2003, 2009, 2012, 2013, 2022
Contributors:
Kaz - splash screen, ideas
Adam - font, ideas
Emkay - splash screen music
Miker - game sfx, ideas
Bocianu - important ideas, FujiNet implementation
- Kaz - splash screen, ideas
- Miker (@mikerro) - game sfx, ideas, QA
- Adam (@6502adam) - font, ideas, QA
- Bocianu (@bocianu) - important ideas, FujiNet implementation, QA
- Emkay - splash screen music
QA: Probabilitydragon, KrzysRog, Beeblebrox, EnderDude, lopezpb, Dracon, brad-colbert
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](https://github.com/tebe6502/Mad-Assembler).
@@ -31,12 +32,12 @@ Game source code is split into 5+4 parts:
- display.asm - display lists and text screen definitions
- ai.asm - artificial stupidity of computer opponents
- weapons.asm - general arsenal of tankies
- definitions.asm - label definitions, moved to make it work better with Altirra debug.
- definitions.asm - label definitions, moved to make it work better with Altirra debug (it doesn't).
We were trying to use as much macros and pseudo-ops as possible.
They are defined in atari.hea and macro.hea files together with many atari constants. This way it should be relatively easy to port this code to e.g. C64
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 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=ax+b :)
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 :)
Originally most variables were in Polish, comments were sparse, but we wanted to release this piece of code to public.
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.
@@ -46,10 +47,42 @@ With the advent of fujinet (https://fujinet.online/) we are thinking about makin
## Changes:
###### Build 138
###### Build 142
2022-05-30
Late build. The bugs we tried to squelch turned out to be more difficult than usual. Some progress has been made though even if it is not yet visible.
- 4x4 font rewritten by @Pecusx as a prep for Y standarization. It makes the messages to appear faster. This is a good change.
- https://github.com/pkali/scorch_src/issues/5 and #80 fixed (again) - no funkybomb traces staying on the screen
- https://github.com/pkali/scorch_src/issues/70 too strong Shooters fixed
- https://github.com/pkali/scorch_src/issues/63 - tank say goodbye when (mostly) visible
- several other small changes and improvements that will pay off in the following releases.
###### Build 141
2022-05-22
Debug build. Thanks to all testers for finding numerous bugs. We tried to fix some of them and we have introduced some new for your enjoyment.
- https://github.com/pkali/scorch_src/issues/73 Fast forward. Press [START] to speed up the game where it can be sped up. Not in many places, mind you.
- https://github.com/pkali/scorch_src/issues/72 Screen glitches improved
- https://github.com/pkali/scorch_src/issues/70 AI shoot with more force than their energy allows. We might still have to revise this one
- https://github.com/pkali/scorch_src/issues/69 Explosions wrapping around the screen
- https://github.com/pkali/scorch_src/issues/67 Screen glitches after intro
- https://github.com/pkali/scorch_src/issues/65 Saved ~90 bytes by removing cosinus table
- https://github.com/pkali/scorch_src/issues/62 Empty list of defensive weapons gets corrupted. Plunged it with a new defensive weapon - "White Flag". Honor of the tank crew prohibits them from buying it (yet)
- https://github.com/pkali/scorch_src/issues/61 [SHIFT] was repeating the last key
- https://github.com/pkali/scorch_src/issues/57 Fire too sensitive on a real machine. Switched to shadow registers. First recorded use of Atari OS :O
- https://github.com/pkali/scorch_src/issues/55 Glitches in the status bar. This one was surprisingly tough.
###### Build 140
2022-05-15
Huge internal changes by @Pecusx. The whole game screen has been inverted - ground is now background color, "sky" and empty areas are in fact pixels. This allowed for introducing better tank colorization, fully devised and lead by Adam. The process started and results are already promising - the colors of tanks and the status bar are closer. We might get even better ones in the next builds.
- few new sfx added (end of round, weapon change, soil eating weapons)
- added colors to tank name and level selection screen
- Bug https://github.com/pkali/scorch_src/issues/57 possibly alleviated by using TRIG0S instead of TRIG0. Please test - it did not show for me.
Other unlisted minor bugs and typos fixed.
"Nightly" version moved to `develop` branch. `master` will be updated with stablish and playablish builds only.
###### Build 139
2022-05-09
The post midnight release with great, heavy new features:
- https://github.com/pkali/scorch_src/issues/48, https://github.com/pkali/scorch_src/issues/10 - thanks to Miker we have a bunch of fresh sound effects. Not everything is perfectly implemented, but the game definitely got nicer! Thank you again Miker!
- https://github.com/pkali/scorch_src/issues/48, https://github.com/pkali/scorch_src/issues/10 - thanks to @mikerro we have a bunch of fresh sound effects. Not everything is perfectly implemented, but the game definitely got nicer! Thank you again Miker!
- https://github.com/pkali/scorch_src/issues/42 New weapon - Liquid Dirt by Pecus. Try it from directly from the weapon store!
- (fix) https://github.com/pkali/scorch_src/issues/53 - non-existing weapons are not displayed. This makes the defense menu empty when you are poor, but it is still better than the old way with "$0" prices
- (fix) https://github.com/pkali/scorch_src/issues/49 - seppuku should always kill now
@@ -91,7 +124,7 @@ Other small fixes:
2022-04-10
- https://github.com/pkali/scorch_src/issues/34 - plot pointer visible only when missile is out of the screen
- https://github.com/pkali/scorch_src/issues/33 - Poor AIs do not purchase non-working weapons
- https://github.com/pkali/scorch_src/issues/32 - Basic is turned off right on the beginning of loading. Dracon reported problems with running the game in Altirra, this was the best idea I had about it. Maybe next will be removing from zero page LZSS routine by @dmsc
- https://github.com/pkali/scorch_src/issues/32 - Basic is turned off right on the beginning of loading. Dracon reported problems with running the game in Altirra, this was the best idea I had about it. Maybe next will be removing LZSS routine by @dmsc from zero page
- https://github.com/pkali/scorch_src/issues/31 - STA WSYNC removed from missile flight delay
- https://github.com/pkali/scorch_src/issues/30 - player level remembered between rounds, thx @KrzysRog
- https://github.com/pkali/scorch_src/issues/5 - funkybomb smoke stays on the edges of the screen
@@ -102,7 +135,7 @@ Other small fixes:
- enhancement: https://github.com/pkali/scorch_src/issues/15 Add player colors to purchase screen. Still room to improvement!
- enhancement: https://github.com/pkali/scorch_src/issues/22 Redesign information panel (top 2 lines of the game screen). Now game might make some sense for a newcomer :)
- change: https://github.com/pkali/scorch_src/issues/28 remove white lines around out-of-the-screen point tracker. Now it is visible and looks better!
- enhancement: https://github.com/pkali/scorch_src/issues/25 Missiles are too fast. Thanks @bocianu and @miker for the hint. Speed of the shell is configurable now, 5 speeds available.
- enhancement: https://github.com/pkali/scorch_src/issues/25 Missiles are too fast. Thanks @bocianu and @mikerro for the hint. Speed of the shell is configurable now, 5 speeds available.
- enhancement: https://github.com/pkali/scorch_src/issues/27 Remember game settings between games.
- enhancement: https://github.com/pkali/scorch_src/issues/24 Remember player names between games. Thanks @bocianu
-90
View File
@@ -1,90 +0,0 @@
MOVED TO: https://github.com/pkali/scorch_src/issues
TODO and BUGS file
---------------------------------------------------------
Known bugs (+ means bug is fixed)
004. when parachute is on and the tank dies (e.g. hit by a powerful
weapon) the dead (invisible) tank falls on parachute
(and uses one parachute more than necessary)
005. tank stands still on a one pixel spike - it should fall
(possibly all that is necessary is adjust of WhereToSlideTable)
017: Observed MIRV loops - it shoots and shoots MIRV all over the screen. Very rare.
020: sometimes leftmost or rightmost remains of the funkybomb smoke do not get cleared
I think it happens when one of the bombs goes out of the screen
023: NEW BUG. After the last change (bug 007) now the last shell of any weapon gets removed and
the game switches to Baby missile.
Fixed:
+001. when bullet goes straight down very fast it misses the tank
it happens only when tank is standing on the bottom of
the screen (no ground below)
+002. points after the round are not calculated correctly
+003. if death's head explodes low, the lowest explosion wraps
and appears on the top of the screen
+006. After some attacks (like MIRV and leapfrog the OffensiveText
stays on the screen (and becomes a static decoration)
It possibly happens when a tank kills itself with mirv or leapfrog.
+008. After a round the last tank sprite stays on the screen.
This hurts only when the last tank is under the table with results!
+010. Even MORONS shoot their feet too often - increase min. randomised energy.
+011. High flying bullets sometimes cause brief screen garbage - like a DL damaged
for a fraction of a frame.
Update - these are NOT high flying bullets - it just happens during bullet flight
+012. (newly introduced) Death explosions are offset right and possibly up.
+013. sometimes demo mode does not work (it stops on results display)
+014: FunkyBomb shoots with too high angle
+015: Only first shoot of FunkyBomb is correct (with smoke and fast),
the next are like missiles
+016: Additional explosions after Frogger do not have falling soil (?)
-018: MINOR: ydraw, yhit, ybyte variable is sometimes treated as WORD, sometimes as BYTE.
Making it consistent would save both time and space (not much)
REJECTED: too much work - different routines depend on checking high byte.
+019: AI menu does not recognize keyboard up (prints "-" in tank name)
+021: check MWA, ADW, SBW macros - bad modifications of bytes found!!!
+009. When result in points is >99 then only 2 first digits are displayed
-022: shooting funkybomb decreases number of bombs too much! (2 instead of 1?)
+007. Decreasing of number of bullets after a shoot does not work correctly
(e.g. 2 bullets are deducted instead of 1) FUNKYBOMB!!!
it looks like it is fixed, although what I did was moving decreasing before jsr shoot
+000, Game crashes from time to time, code and/or screen gets corrupted
---------------------------------------------------------
To do
*004. The game has no end!!! Add ending!!!
A good idea for an ending - a TIP pic - Red Army taking Berlin :)
Another - vector tanks like in BattleZone
Another - stickman tankmen
006. Add sound effects (maybe sampled? or mp0 (sound based on fft))
007. There is no defensive weapon handling (only parachute works,
but also provisionally
009. Make AI in the existing framework (ongoing)
010. It is impossible to look up a number of parachutes left.
018. Speed up soil down after soil eating weapons - correctly calculate
ranges as now range is very broad even when very little soil is eaten.
019. Purchase impossible with joystick only. Add buy on e.g. joystick right.
020. Not a bug per se, but ydraw variable is word, possibly it can be switched to byte
021. Add player colors to purchase screen
022. Make colors more contrasting
024. no visual indication of using defensive weapons
Done:
+001. Start each round with a)worst tank or b)random tank
(Worst tank starts first)
+002. Start each round with random angles (not always 45 degrees left)
+003. Add colour of the given tank to the screen
E.g. when a given tank is shooting it's colour could be behind
tank name on the text screen
+005. Add number of rounds to the options menu
+008. No computer operated opponents - make a framework for AI!!!
+011. Colouring the top status lines in a colour of the active tank.
+014. Demo mode - when all tanks are CPUs let them play non-stop!
(replace waiting for a key-press after a round with a small delay)
+015. Switch to mads for easier development (mads speeds it up, no doubt)
+016. Speed up death's head (e.g.: draw each second circle)
-017. Wide screen mode (with scroll?)
+012. Decreased number of bullets should be displayed just after the shoot.
+013. Check LineTable - possibly it is unnecessarily long. Checked. It is OK
+023. Make not implemented weapons raise NotImplementedError :] Done by making it impossible to purchase free weapons (price == $0)
Executable → Regular
+17 -17
View File
@@ -33,7 +33,7 @@ loop
ArtificialIntelligence .proc ;
; A - skill of the TankNr
; returns shoot energy and angle in
; EnergyTable/L/H and AngleTable
; ForceTable/L/H and AngleTable
;----------------------------------------------
asl
tax
@@ -77,24 +77,22 @@ Shooter .proc
lda PreviousAngle,x
clc
adc #5
bmi leftQuadrant
bmi @+
cmp #90
bcc continue
bcc @+
lda #(-90)
bne continue
leftQuadrant
continue
@
sta NewAngle
sec
lda PreviousEnergyL,x
sta EnergyTableL,x
lda PreviousEnergyH,x
sta EnergyTableH,x
sbc #5
sta ForceTableL,x
lda PreviousEnergyH,x
sbc #0
sta ForceTableH,x
jmp endo
firstShoot
; compare the x position with the middle of the screen
lda xTanksTableL,x
@@ -108,7 +106,6 @@ firstShoot
and #$1F
clc
adc #5
;lda #45
sta NewAngle
jmp forceNow
@@ -123,15 +120,17 @@ tankIsOnTheRight
forceNow
mwa #100 RandBoundaryLow
mwa #800 RandBoundaryHigh
ldx TankNr ;this is possibly not necessary
jsr RandomizeForce
endo
ldx TankNr ;this is possibly not necessary
jsr RandomizeForce.LimitForce
lda NewAngle
sta PreviousAngle,x
lda EnergyTableL,x
lda ForceTableL,x
sta PreviousEnergyL,x
lda EnergyTableH,x
lda ForceTableH,x
sta PreviousEnergyH,x
; choose the best weapon
@@ -214,6 +213,7 @@ skipThisPlayer
forceNow
mwa #300 RandBoundaryLow
mwa #700 RandBoundaryHigh
ldx TankNr
jsr RandomizeForce
endo
+28 -3
View File
@@ -45,11 +45,16 @@ regX .ds 1
regY .ds 1
; --- MAIN PROGRAM
org $2000
ant dta $F0
ant dta $80
dta $42,a(scr),$02,$02,$02,$02,$02,$02,$02,$02,$02,$82,$02,$02,$02,$02,$82
dta $02,$02,$02,$82,$82,$82,$02,$82,$02,$02,$02,$82,$70
dta $02,$02,$02,$82,$82,$82,$02,$82,$02,$02,$02,$82
dta $42,a(verline)
dta $41,a(ant)
verline
:37 dta d" "
build
scr ins "HIMARS14.scr"
.ds 2*40
@@ -202,6 +207,19 @@ main
lda:cmp:req $14 ;wait 1 frame
; copy system font to $a000
ldx #0
@ lda $e000,x
sta $a000,x
;lda $e100,x ; i need digits only :]
;sta $a100,x
;lda $e200,x
;sta $a200,x
;lda $e300,x
;sta $a300,x
inx
bne @-
sei ;stop IRQ interrupts
mva #$00 nmien ;stop NMI interrupts
sta dmactl
@@ -249,6 +267,11 @@ stop
@ sta POKEY,x
dex
bpl @-
;no glitching please (issue #67)
lda #0
sta $D400 ;dmactl
sta $022F ;dmactls
rts ;return to ... DOS
; --- DLI PROGRAM
@@ -339,8 +362,10 @@ dli7
dli11
sta regA
lda #$01
lda #>$a000 ; system font
sta wsync ;line=232
sta chbase
lda #$01
sta gtictl
lda regA
Executable → Regular
View File
Executable → Regular
View File
Executable → Regular
View File

Before

Width:  |  Height:  |  Size: 190 B

After

Width:  |  Height:  |  Size: 190 B

+20
View File
@@ -0,0 +1,20 @@
icl '../lib/atari.hea'
org $2000
joytest
mva #0 dmactls
@
lda trig0
beq pressed
mva #0 colbak
beq @-
pressed
lda #$0f
;ora jstick0
sta colbak
jmp @-
run joytest
Binary file not shown.
Executable → Regular
View File
Executable → Regular
View File
Executable → Regular
View File
Executable → Regular
View File
+35 -118
View File
@@ -5,13 +5,20 @@
;===================================================================================
;==========================CONSTANT TABLES, do not erase!===========================
;===================================================================================
TankColoursTable .BYTE $52,$32,$72,$92,$B2,$02
TankColoursTable .BYTE $88,$cc,$38,$1c,$6a,$02
TankStatusColoursTable .BYTE $80,$c0,$30,$10,$60,$00
dliColorsBack
:10 .by $02,$00
dliColorsFore
.by $0a
TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor
TextForegroundColor = $0c
CashOptionL ;(one zero less than on the screen)
.by 0,<200,<500,<800,<1000
CashOptionH
.by 0,>200,>500,>800,>1000
GravityTable .by 10,20,25,30,40
MaxWindTable .by 5,20,40,60,80
MaxWindTable .by 5,20,40,70,99
RoundsTable .by 10,20,30,40,50
flyDelayTable .by 255,150,75,35,1
seppukuTable .by 255, 45,25,15,9
@@ -189,99 +196,6 @@ sintable
.by 255
.by 255 ;anti self destruction byte
costable
.by 255 ;anti self destruction byte
.by 255
.by 255
.by 255
.by 255
.by 255
.by 254
.by 254
.by 253
.by 252
.by 252
.by 251
.by 250
.by 249
.by 248
.by 247
.by 246
.by 244
.by 243
.by 242
.by 240
.by 238
.by 237
.by 235
.by 233
.by 232
.by 230
.by 228
.by 226
.by 223
.by 221
.by 219
.by 217
.by 214
.by 212
.by 209
.by 207
.by 204
.by 201
.by 198
.by 196
.by 193
.by 190
.by 187
.by 184
.by 181
.by 177
.by 174
.by 171
.by 167
.by 164
.by 161
.by 157
.by 154
.by 150
.by 146
.by 143
.by 139
.by 135
.by 131
.by 128
.by 124
.by 120
.by 116
.by 112
.by 108
.by 104
.by 100
.by 95
.by 91
.by 87
.by 83
.by 79
.by 74
.by 70
.by 66
.by 61
.by 57
.by 53
.by 48
.by 44
.by 40
.by 35
.by 31
.by 26
.by 22
.by 17
.by 13
.by 8
.by 4
.by 0
linetableL
:screenheight+1 .by <(display+screenBytes*#)
linetableH
@@ -569,6 +483,7 @@ WhereToSlideTable
.BY %000 ; 11111111
EndOfTheBarrelX
; right angles from 0 (vertically up) to 90 (horizontally to the right)
.by 4,4,4,4,4,4,4,4,4,4,4
.by 5,5,5,5,5,5,5,5,5,5
.by 6,6,6,6,6,6,6,6,6
@@ -578,15 +493,16 @@ EndOfTheBarrelX
.by 7,7,7,7,7,7,7,7,7,7,7,7,7
.by 7,7,7,7,7,7,7,7,7,7,7,7,7,7
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0 ; not used
; left angles from 90 (horizontally to the left) to 1 (vertically up)
.by 0,0,0,0,0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
@@ -597,6 +513,7 @@ EndOfTheBarrelX
.by 3,3,3,3,3,3,3,3,3,3,3
EndOfTheBarrelY
; right angles from 0 (vertically up) to 90 (horizontally to the right)
.by 7,7,7,7,7,7,7,7,7,7,7
.by 7,7,7,7,7,7,7,7,7,7
.by 7,7,7,7,7,7,7,7,7
@@ -606,15 +523,16 @@ EndOfTheBarrelY
.by 4,4,4,4,4,4,4,4,4,4,4,4,4
.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0
.by 0,0,0,0
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0,0,0,0,0,0,0 ; not used
.by 0,0,0,0 ; not used
; left angles from 90 (horizontally to the left) to 1 (vertically up)
.by 3,3,3,3,3,3,3,3,3,3,3,3,3,3
.by 4,4,4,4,4,4,4,4,4,4,4,4,4
.by 5,5,5,5,5,5,5,5,5,5
@@ -698,7 +616,7 @@ WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Auto_Defense___
.by >price_Fuel_Tank______
.by >price_Contact_Trigger
.by >price______________63
.by >price_White_Flag_____
WeaponPriceL
.by <price_Baby_Missile___
@@ -764,7 +682,7 @@ WeaponPriceL
.by <price_Auto_Defense___
.by <price_Fuel_Tank______
.by <price_Contact_Trigger
.by <price______________63
.by <price_White_Flag_____
;-------------------------------------------------
; how many units (bulletd) of a given weapon we get for a given price
@@ -836,7 +754,7 @@ WeaponUnits
.by 1 ;Auto_Defense___
.by 10 ;Fuel_Tank______
.by 25 ;Contact_Trigger
.by 0 ;_____________63
.by 1 ;_____________63
PurchaseMeTable ;weapons good to be purchased by the robot
;the comment is an index in the tables
@@ -968,9 +886,10 @@ NamesOfWeapons ;the comment is an index in the tables
dta d"Auto Defense " ; 60
dta d"Fuel Tank " ; 61
dta d"Contact Trigger " ; 62
dta d"----------------" ; 63
dta d"White Flag " ; 63
weaponsOfDeath
dta 0,1,2,3,7,8,9,15,16,17,18,19,20,21,22,23,24,25,26,27
dta 1,2,3,7,15,16,17,18,19,20,21,22,23,24,25,26,27
weaponsOfDeathEnd
joyToKeyTable
; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15
.by $ff,$ff,$ff,$ff,$ff,$ff,$ff,$07,$ff,$ff,$ff,$06,$ff,$0f,$0e,$ff
@@ -989,7 +908,5 @@ scrcodes
dta d"qrstuvwx"
dta d"yz123456"
dta d"7890." ; "-"
dliColors
:10 .by $02,$00
.endif
+29 -29
View File
@@ -74,35 +74,35 @@ price_Super_Mag______ = $ffff ;_59
price_Auto_Defense___ = $ffff ;_60
price_Fuel_Tank______ = $ffff ;_61
price_Contact_Trigger = $ffff ;_62
price______________63 = $ffff
price_White_Flag_____ = $0 ;_63
;--------------------------------
; names of RMT instruments (sfx)
;--------------------------------
sfx_set_power_1 = $00
sfx_set_power_2 = $01
sfx_lightning = $02
sfx_dunno = $03
sfx_nuke = $04
sfx_baby_missile= $05
sfx_death_begin = $06
sfx_plasma_1_2 = $07
sfx_plasma_2_2 = $08
sfx_napalm = $09
sfx_dirt_charge = $0a
sfx_missile_hit = $0b
sfx_funky_hit = $0c
sfx_shield_on = $0d
sfx_shield_off = $0e
sfx_parachute = $0f
sfx_smoke_cloud = $10
sfx_riot_blast = $11
sfx_sandhog = $12
sfx_dirt_chrg_s = $13
sfx_digger = $14
sfx_silencer = $15
sfx_next_player = $16
sfx_purchase = $17
sfx_keyclick = $18
sfx_shoot = $19
sfx_seppuku = $1a
sfx_liquid_dirt = $1b
sfx_set_power_1 = $00 ;A
sfx_set_power_2 = $01 ;b
sfx_lightning = $02 ;c
sfx_dunno = $03 ;d
sfx_nuke = $04 ;e
sfx_baby_missile= $05 ;f
sfx_death_begin = $06 ;g
sfx_plasma_1_2 = $07 ;h
sfx_plasma_2_2 = $08 ;i
sfx_napalm = $09 ;j
sfx_dirt_charge = $0a ;k
sfx_missile_hit = $0b ;l
sfx_funky_hit = $0c ;m
sfx_shield_on = $0d ;n
sfx_shield_off = $0e ;o
sfx_parachute = $0f ;p
sfx_smoke_cloud = $10 ;q
sfx_riot_blast = $11 ;r
sfx_sandhog = $12 ;s
sfx_dirt_chrg_s = $13 ;t
sfx_digger = $14 ;u
sfx_silencer = $15 ;v
sfx_next_player = $16 ;w
sfx_purchase = $17 ;x
sfx_keyclick = $18 ;y
sfx_shoot = $19 ;z
sfx_seppuku = $1a ;1
sfx_liquid_dirt = $1b ;2
Executable → Regular
+7 -7
View File
@@ -40,8 +40,8 @@ NameDL
.byte $42
.word NameScreen
.byte $30
.byte $02,$30,$2
.byte $10,2,2,2,$30,2,2
.byte $02,$30+$80,$02
.byte $10,$02,$02,$02,$30,$02,$02
.byte $41
.word NameDL
; -------------------------------------------------
@@ -142,7 +142,7 @@ WeaponsDescription
EmptyLine
dta d" "
LastLine
:40 dta $ff
:40 dta $00
; -------------------------------------------------
.ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!!
NameScreen
@@ -154,7 +154,7 @@ NameAdr
dta d" "
NamesOfLevels
dta d" HUMAN Moron Shooter "
dta d" Poolshark Toosser Chooser "
dta d" Poolshark Tosser Chooser "
dta d" Spoiler Cyborg Unknown "
dta d" "
dta d"Tab"*
@@ -166,10 +166,10 @@ NamesOfLevels
textbuffer
; 0123456789012345678901234567890123456789
dta d"Player: "
dta d"Energy: 99 Angle: <99> Force: 9999 "
dta d" Round: 99 Wind: <99> "
dta d"Energy: Angle: Force: "
dta d" Round: Wind: "
textbuffer2
dta d"Player: ******** Cash: 99990 "
dta d"Player: Cash: "
dta d"----------------------------------------"
Executable → Regular
+205 -243
View File
@@ -214,37 +214,20 @@ LineGoesLeft
; line goes left - we are reversing X
sbw xtempDRAW temp xdraw ; XI
PutPixelinDraw
jsr DrawJumpPad
; end of the special PLOT for DRAW
; XI=XI+1
; UNTIL XI=XK
inw XI
cpw XI XK
jne DrawLoop
EndOfDraw
mwa xtempDRAW xdraw
mva ytempDRAW ydraw
rts
.endp
;-------------JumpPad-------------
DrawJumpPad
jmp (DrawJumpAddr)
Drawplot
jmp plot
DrawLen
inw LineLength
rts
;-------------JumpPad-------------
DrawCheck .proc
lda tracerflag
ora SmokeTracerFlag
; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
bit drawFunction
bpl @+
inw LineLength
bne ContinueDraw ; ==jmp
@
bvc @+
DrawCheck
lda tracerflag
ora SmokeTracerFlag
yestrace
beq notrace
jsr plot
beq notrace
jsr plot
notrace
;aftertrace
lda HitFlag
@@ -267,17 +250,34 @@ CheckCollisionDraw
cmp (temp),y
bcc StopHitChecking
mva #1 HitFlag
mwa xdraw XHit
mwa ydraw YHit
lda (temp),y
sec
sbc #1
sta YHit
mva #0 YHit+1
;mwa ydraw YHit
mva #1 HitFlag
StopHitChecking
jmp ContinueDraw
@
jsr plot
ContinueDraw
; XI=XI+1
; UNTIL XI=XK
inw XI
cpw XI XK
jne DrawLoop
EndOfDraw
mwa xtempDRAW xdraw
mva ytempDRAW ydraw
rts
.endp
.endp
;--------------------------------------------------
circle .proc ;fxxxing good circle drawing :)
.proc circle ;fxxxing good circle drawing :)
;--------------------------------------------------
;Turbo Basic source
; R=30
@@ -441,8 +441,9 @@ splot8 .proc
;--------------------------------------------------
clearscreen .proc
;--------------------------------------------------
lda #0
tax
lda #$ff
ldx #0
@
:31 sta display+($100*#),x
sta display+$1e50,x ; this is so no space outside of the screen is cleared
@@ -559,11 +560,10 @@ UnequalTanks
bpl CheckNextTank
rts
.endp
;-------------------------------------------------
drawtanks
;-------------------------------------------------
;-------------------------------------------------
.proc drawtanks
;-------------------------------------------------
lda tanknr
pha
ldx #$00
@@ -580,8 +580,9 @@ DrawNextTank
sta tankNr
rts
.endp
;---------
drawtanknr
.proc DrawTankNr
ldx tanknr
; let's check the energy
lda eXistenZ,x
@@ -629,7 +630,7 @@ DrawTankNrX
rorw xbyte ; divide by 2 (carry does not matter)
lda xbyte
clc
adc #$24 ; P/M to graphics offser
adc #$24 ; P/M to graphics offset
cpx #$4 ; 5th tank are joined missiles and offset is defferent
bne NoMissile
clc
@@ -669,25 +670,27 @@ ZeroesToGo
NoPlayerMissile
DoNotDrawTankNr
rts
.endp
;--------------------------------------------------
drawmountains .proc
.proc drawmountains
;--------------------------------------------------
mwa #0 xdraw
mwa #mountaintable modify
mva #1 color
drawmountainsloop
ldy #0
lda (modify),y
cmp #screenheight
beq NoMountain
sta ydraw
jsr DrawLine
NoMountain
inw modify
inw xdraw
cpw xdraw #screenwidth
bne drawmountainsloop
rts
;--------------------------------------------------
drawmountainspixel
@@ -709,7 +712,7 @@ drawmountainspixelloop
rts
.endp
;--------------------------------------------------
SoilDown2 .proc
.proc SoilDown2
;--------------------------------------------------
; how it is supposed to work:
@@ -837,8 +840,9 @@ ColumnIsReady
mva #sfx_silencer sfx_effect
rts
.endp
;--------------------------------------------------
calculatemountains .proc
.proc calculatemountains
;--------------------------------------------------
mwa #0 xdraw
@@ -940,15 +944,15 @@ EndDrawing
.endp
; ****************************************************
;--------------------------------------------------
calculatemountains0 .proc
; Only for testing - makes ground flat (one pixel)
.proc calculatemountains0
; Only for testing - makes ground flat (0 pixels)
; and places tanks on it
; remember to remove in final compilation :)
;--------------------------------------------------
mwa #0 xdraw
nextPointDrawing
adw xdraw #mountaintable modify
lda #screenheight-1
lda #screenheight
ldy #0
sta (modify),y
inw xdraw
@@ -957,15 +961,16 @@ nextPointDrawing
ldx NumberOfPlayers
dex
SetYofNextTank
lda #screenheight-2
lda #screenheight-1
sta ytankstable,x
dex
bpl SetYofNextTank
rts
.endp
; ****************************************************
; -----------------------------------------
unPlot .proc
.proc unPlot
; plots a point and saves the plotted byte, reverts the previous plot.
; -----------------------------------------
ldx #0 ; only one pixel
@@ -1021,7 +1026,7 @@ MakeUnPlot
lda color
beq ClearUnPlot
bne ClearUnPlot
;plotting here
lda (xbyte),y
@@ -1033,7 +1038,7 @@ ClearUnPlot
lda (xbyte),y
sta OldOraTemp
and bittable2,x
; sta (xbyte),y
sta (xbyte),y
ContinueUnPlot
ldx WhichUnPlot
lda OldOraTemp
@@ -1068,8 +1073,9 @@ SkipThisPlot
EndOfUnPlot
rts
.endp
; -----------------------------------------
plot .proc ;plot (xdraw, ydraw, color)
.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
@@ -1102,11 +1108,7 @@ MakePlot
lsr
lsr
tay ;save
;---
;---
ldx ydraw
lda linetableL,x
sta xbyte
@@ -1115,7 +1117,7 @@ MakePlot
ldx ybit
lda color
beq ClearPlot
bne ClearPlot
lda (xbyte),y
ora bittable,x
@@ -1128,17 +1130,16 @@ ClearPlot
sta (xbyte),y
rts
.endp
; -----------------------------------------
point .proc
.proc point
; -----------------------------------------
; 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
mwa xdraw xbyte
lda xbyte
and #$7
sta ybit
@@ -1150,9 +1151,7 @@ point .proc
lsr
lsr
tay ;save
;---
;---
ldx ydraw
lda linetableL,x
sta xbyte
@@ -1163,37 +1162,36 @@ point .proc
lda (xbyte),y
and bittable,x
eor bittable,x
rts
.endp
;--------------------------------------------------
DrawLine .proc
.proc DrawLine
;--------------------------------------------------
mva #0 ydraw+1
lda #screenheight
sec
sbc ydraw
sta tempbyte01
jsr plot
jsr plot.MakePlot
;rts
jmp IntoDraw ; jumps inside Draw routine
; because one pixel is already plotted
; because one pixel is already plotted
loopdraw
lda (xbyte),y
ora bittable,x
sta (xbyte),y
IntoDraw adw xbyte #screenBytes
dec tempbyte01
bne loopdraw
@
lda (xbyte),y
and bittable2,x
sta (xbyte),y
IntoDraw
adw xbyte #screenBytes
dec tempbyte01
bne @-
rts
.endp
;
; ------------------------------------------
TypeChar .proc
.proc TypeChar
; puts char on the graphics screen
; in: CharCode
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
@@ -1214,8 +1212,9 @@ TypeChar .proc
ldy #7
CopyChar
lda (fontind),y
eor #$ff
sta char1,y
lda #$00
lda #$ff
sta char2,y
dey
bpl CopyChar
@@ -1224,8 +1223,9 @@ CopyChar
ldy #7
CopyMask
lda (fontind),y
eor #$ff
sta mask1,y
lda #$ff
lda #$00
sta mask2,y
dey
bpl CopyMask
@@ -1240,7 +1240,6 @@ CopyMask
lsrw xbyte ; div 8
rorw xbyte
rorw xbyte
;---
ldy xbyte
@@ -1257,53 +1256,22 @@ CopyMask
ldx ybit
beq MaskOK00
MakeMask00
sec
ror mask1
ror mask2
sec
ror mask1+1
ror mask2+1
sec
ror mask1+2
ror mask2+2
sec
ror mask1+3
ror mask2+3
sec
ror mask1+4
ror mask2+4
sec
ror mask1+5
ror mask2+5
sec
ror mask1+6
ror mask2+6
sec
ror mask1+7
ror mask2+7
lsr char1
ror char2
ror char1+1
ror char2+1
ror char1+2
ror char2+2
ror char1+3
ror char2+3
ror char1+4
ror char2+4
ror char1+5
ror char2+5
ror char1+6
ror char2+6
ror char1+7
ror char2+7
.rept 8
lsr mask1+#
ror mask2+#
.endr
.rept 8
sec
ror char1+#
ror char2+#
.endr
dex
bne MakeMask00
MaskOK00
; here x=0
lda Erase
beq CharLoopi ; it works, because x=0
lda #0
lda #$ff
ldx #7
EmptyChar
sta char1,x
@@ -1313,145 +1281,139 @@ EmptyChar
ldx #0
CharLoopi
lda (xbyte),y
and mask1,x
ora char1,x
ora mask1,x
and char1,x
sta (xbyte),y
iny
lda (xbyte),y
and mask2,x
ora char2,x
ora mask2,x
and char2,x
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #8
bne CharLoopi
EndPutChar
rts
.endp
; ------------------------------------------
PutChar4x4 .proc ;puts 4x4 pixels char on the graphics screen
; in: xdraw, ydraw (upper left corner of the char)
.proc PutChar4x4
; puts 4x4 pixels char on the graphics screen
; in: xdraw, ydraw (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/1)
; all pixels are being drawn
; (empty and not empty)
;--------------------------------------------------
lda plot4x4color
sta color
; calculating address of the first byte
mva #4 LoopCounter4x4
; cpw ydraw #(screenheight-4)
; jcs TypeChar.EndPutChar ;nearest RTS
; cpw xdraw #(screenwidth-4)
; jcs TypeChar.EndPutChar ;nearest RTS
; checks ommited.
lda plot4x4color
beq FontColor0
lda #$ff ; better option to check (plot4x4color = $00 or $ff)
sta plot4x4color
FontColor0
; char to the table
lda CharCode4x4
and #1
beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits
sta nibbler4x4
lda CharCode4x4
ror
; in carry there is which nibble of the byte is to be taken
clc
adc #(3*32)
sta y4x4
nextline4x4
mva #4 Xcounter4x4
ldy y4x4
lda font4x4,y ;there was a problem with OMC here, but it works now
lsr
sta fontind
lda #$00
sta fontind+1
adw fontind #font4x4
ldx nibbler4x4
beq uppernibble
; 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
asl
asl
asl
asl
uppernibble
rol
sta StoreA4x4
bcs EmptyPixel ; the font I drawn is in inverse ...
;lda plot4x4color ;these lines are not necessary
;sta color ;if a plots are one color only
jsr plot
;jmp Loop4x4Continued
EmptyPixel
;lda #1 ;reverse color (color==1-color)
;sec
;sbc plot4x4color
;sta color
;jsr plot
;this is turned off for speed
;anyway we assume the text is being drawn
;over an empty space
Loop4x4Continued
inw xdraw
lda StoreA4x4
dec Xcounter4x4
ldx Xcounter4x4
bne uppernibble
; here we have on screen one line of the char
inw ydraw
sbw xdraw #4
sbw y4x4 #32
dec:lda LoopCounter4x4
bne nextline4x4
; calculating coordinates from xdraw and ydraw
mwa xdraw xbyte
rts
.endp
; ------------------------------------------
PutChar4x4FULL .proc;
;this routine works just like PutChar4x4,
;but this time all pixels are being drawn
;(empty and not empty)
;--------------------------------------------------
lda xbyte
and #$7
sta ybit
; calculating address of the first byte
mva #4 LoopCounter4x4
lda CharCode4x4
and #1
sta nibbler4x4
lda CharCode4x4
ror
; in carry there is which nibble of the byte is to be taken clc
clc
adc #(3*32)
sta y4x4
nextline4x4FULL
mva #4 Xcounter4x4
ldy y4x4
lda font4x4,y
ldx nibbler4x4
beq uppernibbleFULL
asl
asl
asl
asl
uppernibbleFULL
rol
sta StoreA4x4
bcs EmptyPixelFULL
lda plot4x4color ;these lines are not necessary
sta color ;if a plots are one color only
jsr plot
jmp Loop4x4ContinuedFULL
EmptyPixelFULL
lda #1 ;reverse color (color==1-color)
lsrw xbyte ; div 8
rorw xbyte
rorw xbyte
;---
ldy xbyte
lda ydraw ; y = y - 3 because left lower.
sec
sbc plot4x4color
sta color
jsr plot
;this is turned on now
;of course it is slower
Loop4x4ContinuedFULL
inw xdraw
lda StoreA4x4
dec Xcounter4x4
ldx Xcounter4x4
bne uppernibbleFULL
; here we have on screen one line of the char
inw ydraw
sbw xdraw #4
sbw y4x4 #32 ; why? possibly because of width of the 4x4 font
dec:lda LoopCounter4x4
bne nextline4x4FULL
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
.rept 4
sec
ror char1+#
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
EndPut4x4
rts
.endp
+4
View File
@@ -76,6 +76,9 @@
.MACRO WAIT
; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
lda CONSOL
cmp #6 ; START KEY
beq ?nowait
LDA VCOUNT
ldy vcount
?WA cpy VCOUNT
@@ -83,6 +86,7 @@
?wframe
cmp vcount
bne ?wframe
?nowait
.ENDM
;-------------------------------------
.macro negw
+180 -144
View File
@@ -3,7 +3,7 @@
;---------------------------------------------------
;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski
;Warsaw 2000,2001,2002,2003,2009,2012,2013
;Miami 2022
;Miami&Warsaw 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
@@ -36,7 +36,7 @@
;we decided it must go in 'English' to let other people work on it
.macro build
dta d"139" ; number of this build (3 bytes)
dta d"142" ; number of this build (3 bytes)
.endm
icl 'definitions.asm'
@@ -116,54 +116,35 @@ START
; Startup sequence
jsr Initialize
VMAIN VBLinterrupt,6 ; jsr SetVBL
mwa #OptionsDL dlptrs
lda dmactls
and #$fc
ora #$02 ; normal screen width
sta dmactls
jsr Options ;startup screen
lda escFlag
bne START
;entering names of players
mwa #NameDL dlptrs
lda dmactls
and #$fc
ora #$01 ; narrow screen (32 chars)
sta dmactls
mva #0 TankNr
@ jsr EnterPlayerName
inc TankNr
lda TankNr
cmp NumberOfPlayers
bne @-
mwa #dl dlptrs
lda dmactls
and #$fc
ora #$02 ; normal screen width
sta dmactls
jsr EnterPlayerNames
jsr RandomizeSequence
; for the round #1 shooting sequence is random
MainGameLoop
VDLI DLIinterrupt ; jsr SetDLI
VDLI DLIinterruptText ; jsr SetDLI for text (purchase) screen
jsr CallPurchaseForEveryTank
mwa #dl dlptrs
; issue #72 (glitches when switches)
mva #0 dmactl
lda dmactls
and #$fc
ora #$02 ; 2=normal, 3 = wide screen width
;ora #$02 ; 2=normal, 3 = wide screen width, 0 = no screen
sta dmactls
jsr GetRandomWind
jsr Round
jsr RoundInit
jsr MainRoundLoop
mva #0 TankNr ;
jsr SortSequence
@@ -180,15 +161,7 @@ MainGameLoop
; Results are number of other deaths
; before the player dies itself
; add gains and substract losses
; gain is what player gets for lost energy of opponents
; energy lost by opponents is added during Round and
; little below in source, multiplied by 2 to get "dollars".
; By analogy, loss is energy that given player losses during
; each Round.
; Important! If player has 10 energy and gets a central hit
; from nuke that would take 90 energy points, his loss
; is 90, not 10
jsr DisplayResults
;check demo mode
@@ -209,6 +182,16 @@ noKey
ldx NumberOfPlayers
dex
CalculateGains
; add gains and substract losses
; gain is what player gets for lost energy of opponents
; energy lost by opponents is added during Round and
; little below in source, multiplied by 2 to get "dollars".
; By analogy, loss is energy that given player losses during
; each Round.
; Important! If player has 10 energy and gets a central hit
; from nuke that would take 90 energy points, his loss
; is 90, not 10
; add gain * 2
asl gainL,x
rol gainH,x
@@ -249,13 +232,14 @@ skipzeroing
lda GameIsOver
jne START
inc CurrentRoundNr
mva #0 dmactl ; issue #72
mva #sfx_silencer sfx_effect
jmp MainGameLoop
;--------------------------------------------------
Round .proc ;
.proc RoundInit
;--------------------------------------------------
; at the beginning of each Round we set energy
; of all players to 99
@@ -264,16 +248,16 @@ Round .proc ;
; the shooting angle is randomized
; of course gains an looses are zeroed
jsr StatusDisplay
;jsr StatusDisplay
lda #0
tax
@
sta previousAngle,x
sta singleRoundVars,x
inx
cpx #(singleRoundVarsEnd-PreviousAngle)
cpx #(singleRoundVarsEnd-singleRoundVars)
bne @-
ldx #5
ldx #(MaxPlayers-1)
SettingEnergies
lda #$00
sta gainL,x
@@ -286,20 +270,20 @@ SettingEnergies
sta LASTeXistenZ,x
; anything in eXistenZ table means that this tank exist
; in the given round
lda #232
sta MaxEnergyTableL,x
lda #3
sta MaxEnergyTableH,x
lda #94
sta EnergyTableL,x
lda #1
sta EnergyTableH,x
lda #<1000
sta MaxForceTableL,x
lda #>1000
sta MaxForceTableH,x
lda #<350
sta ForceTableL,x
lda #>350
sta ForceTableH,x
;lda #(255-45)
;it does not look good when all tanks have
;barrels pointing the same direction
;so it would be nice to have more or less random
;angles
jsr RandomizeAngle
sta AngleTable,x
@@ -313,18 +297,27 @@ SettingEnergies
jsr PMoutofScreen ;let P/M disappear
jsr clearscreen ;let the screen be clean
jsr placetanks ;let the tanks be evenly placed
jsr calculatemountains ;let mountains be nice for the eye
; jsr calculatemountains0 ;only fort tests - makes mountains flat and one pixel height
jsr calculatemountains ;let mountains be easy for the eye
;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height
VDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen
mwa #dl dlptrs ; issue #72 (glitches when switches)
lda dmactls
and #$fc
ora #$02 ; 2=normal, 3 = wide screen width
sta dmactls
jsr drawmountains ;draw them
jsr drawtanks ;finally draw tanks
.endp ; not really end of the procedure, but just for now. TODO: revisit.
;--------------------round screen is ready---------
mva #0 TankSequencePointer
;--------------------round screen is ready---------
rts
.endp
MainRoundLoop
;--------------------------------------------------
.proc MainRoundLoop
; here we must check if by a chance there is only one
; tank with energy greater than 0 left
@@ -395,7 +388,7 @@ DoNotFinishTheRound
mva #1 color ;to display flying point
lda TankColoursTable,x
lda TankStatusColoursTable,x
sta colpf2s ; set color of status line
lda SkillTable,x
@@ -481,20 +474,19 @@ missed
jsr DisplayOffensiveTextNr
NextPlayerShoots
mva #1 Erase
jsr drawtanks
;mva #1 Erase
;jsr drawtanks
;before it shoots, the eXistenZ table must be
;updated accordingly to actual energy (was forgotten, sorry to ourselves)
ldx #5
ldx #(MaxPlayers-1)
SeteXistenZ
lda Energy,x
sta eXistenZ,x
sta L1
;DATA L1,L2
;RESULT WH*256+L1
;Multiplication 8bit*8bit,
;result 16bit
;this algiorithm is a little longer than in Ruszczyc 6502 book
@@ -508,32 +500,29 @@ LP0
ROR L1
BCC B0
CLC
ADC #10 ; multiplication by 10
ADC #10 ; (L2) multiplication by 10
B0 DEY
BNE LP0
ror
ROR L1
STA MaxEnergyTableH,x
STA MaxForceTableH,x
lda L1
sta MaxEnergyTableL,x
sta MaxForceTableL,x
dex
bpl SeteXistenZ
;was setup of maximum energy for players
mva #0 Erase
jsr drawtanks
;mva #0 Erase
;jsr drawtanks
;inc TankNr
;lda TankNr
inc:lda TankSequencePointer
cmp NumberOfPlayers
bne PlayersAgain
;mva 0 TankNr
mva #0 TankSequencePointer
PlayersAgain .proc
PlayersAgain
; In LASTeXistenZ there are values of eXistenZ before shoot
; from the next tank.
@@ -564,20 +553,28 @@ NoPlayerNoDeath
bpl CheckingPlayersDeath
; if processor is here it means there are no more explosions
jmp MainRoundLoop
.endp
.endp
;---------------------------------
.proc Seppuku
lda #0
sta FallDown1
sta FallDown2
lda #1
sta ydraw+1
; get position of the tank
ldx TankNr
lda xtankstableL,x
sta xdraw
lda xtankstableH,x
sta xdraw+1
lda yTanksTable,x
sta ydraw
lda #1 ; Missile
jsr ExplosionDirect
jmp continueMainRoundLoopAfterSeppuku
jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku
.endp
;---------------------------------
PlayerXdeath .proc
.proc PlayerXdeath
; this tank should not explode anymore:
; there is 0 in A, and Tank Number in X, so...
@@ -600,11 +597,8 @@ PlayerXdeath .proc
adc ResultsTable,x
sta ResultsTable,x
inc CurrentResult
.endp
mva #sfx_death_begin sfx_effect
;RandomizeDeffensiveText
randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1)
sta TextNumberOff
@@ -619,8 +613,6 @@ PlayerXdeath .proc
mva #0 plot4x4color
jsr DisplayOffensiveTextNr
; calculate position of the explosion (the post-death one)
ldx TankTempY
clc
@@ -653,12 +645,12 @@ PlayerXdeath .proc
MetodOfDeath
lda random
and #%00011111 ; range 0-31
cmp #20 ; we have 20 weapons in table (from 0 to 19)
cmp #(weaponsOfDeathEnd-weaponsOfDeath) ; we have 20 weapons in table (from 0 to 19)
bcs MetodOfDeath
tay
lda weaponsOfDeath,y
jsr ExplosionDirect
mva #$15 sfx_effect
mva #sfx_silencer sfx_effect
; jump to after explosion routines (soil fallout, etc.)
@@ -667,10 +659,11 @@ MetodOfDeath
; a deadly shot here again.
jmp AfterExplode
jmp MainRoundLoop.AfterExplode
.endp
;--------------------------------------------------
DecreaseEnergyX .proc
.proc DecreaseEnergyX
;Decreases energy of player nr X
;increases his financial loss
;increases gain of tank TankNr
@@ -756,7 +749,7 @@ loop05
.endp
;--------------------------------------------------
Initialize .proc
.proc Initialize
;Initialization sequence
;--------------------------------------------------
deletePtr = temp
@@ -765,7 +758,7 @@ deletePtr = temp
sta Erase
sta tracerflag
sta GameIsOver
sta escFlag
; clean variables
tay
@@ -784,8 +777,8 @@ deletePtr = temp
jsr WeaponCleanup
mva #$2 colpf2s
mva #12 colpf3s
mva #TextBackgroundColor colpf2s
mva #TextForegroundColor colpf3s
mva #>WeaponFont chbas
;parameter for old plot (unPlot) max 5 points
@@ -797,6 +790,7 @@ SetunPlots
sta oldplotH,x
lda #0
sta oldply,x
lda #$ff
sta oldora,x
dex
bpl SetunPlots
@@ -818,21 +812,21 @@ SetunPlots
lda #$10 ; P/M priorities (bit 4 joins missiles)
sta gtictls
jsr PMoutofScreen
lda #$50 ; temporary colours of sprites under tanks
sta $2c0
lda #$30
sta $2c1
lda #$70
sta $2c2
lda #$90
sta $2c3
LDA #$B0
STA COLPF3S
lda TankColoursTable ; temporary colours of sprites under tanks
sta COLPM0S
lda TankColoursTable+1
sta COLPM1S
lda TankColoursTable+2
sta COLPM2S
lda TankColoursTable+3
sta COLPM3S
LDA TankColoursTable+4
STA COLPF3S ; joined missiles (5th tank)
mva #0 hscrol
;let the tanks be visible!
ldx #5
ldx #(maxPlayers-1)
lda #1 ; tank is visible
MakeTanksVisible
sta eXistenZ,x
@@ -862,24 +856,38 @@ ClearResults
lda #0 ;starting song line 0-255 to A reg
jsr RASTERMUSICTRACKER ;Init
;
VMAIN VBLinterrupt,6 ;jsr SetVBL
rts
.endp
DLIinterrupt .proc
DLIinterruptGraph .proc
pha
phy
ldy dliCounter
lda dliColors,y
;lda #$02 ; color of playground
sta WSYNC
sta COLPF2
lda dliColorsBack,y
ldy dliColorsFore
nop
nop
nop
sta COLPF1
sty COLPF2
inc dliCounter
ply
pla
rti
.endp
DLIinterruptText .proc
pha
sta WSYNC
mva #TextBackgroundColor colpf2
mva #TextForegroundColor colpf3
pla
DLIinterruptNone
rti
.endp
VBLinterrupt .proc
pha
phx
@@ -906,7 +914,19 @@ lab2
jmp SYSVBV
.endp
;----------------------------------------------
RandomizeSequence .proc
.proc RandomizeSequence0
ldx #0
@ txa
sta TankSequence,x
inx
cpx #MaxPlayers
bne @-
rts
.endp
.proc RandomizeSequence
; in: NumberOfPlayers
; out: TankSequence
; how: get random number lower than NumberOfPlayers
@@ -979,7 +999,7 @@ RandomizeAngle .proc ;
.endp
;----------------------------------------------
RandomizeForce .proc
; routine returns in EnergyTable/L/H
; routine returns in ForceTable/L/H
; valid force of shooting for TankNr
; in X must be TankNr
; low and high randomize boundary passed as word value
@@ -987,40 +1007,45 @@ RandomizeForce .proc
; RandBoundaryHigh
;----------------------------------------------
lda MaxEnergyTableL,x
sta temp
lda MaxEnergyTableH,x
sta temp+1
GetRandomAgain
lda RANDOM
; gets values in range(256,765)
sta temp2
lda RANDOM ; :)
lda RANDOM
and #%00000011 ;(0..1023)
sta temp2+1
cpw RandBoundaryLow temp2
bcs GetRandomAgain
bcs RandomizeForce
cpw RandBoundaryHigh temp2
bcc GetRandomAgain
bcc RandomizeForce
cpw temp temp2
bcs EnergyInRange
mwa temp temp2
EnergyInRange
lda temp2
sta EnergyTableL,x
sta ForceTableL,x
lda temp2+1
sta EnergyTableH,x
sta ForceTableH,x
;---------
LimitForce
; in X must be TankNr
; cuts force to MaxForceTable
lda MaxForceTableH,x
cmp ForceTableH,x
bne @+
lda MaxForceTableL,x
cmp ForceTableL,x
@ bcs @+
lda MaxForceTableL,x
sta ForceTableL,x
lda MaxForceTableH,x
sta ForceTableH,x
@
rts
.endp
;----------------------------------------------
MoveBarrelToNewPosition .proc
.proc MoveBarrelToNewPosition
jsr DrawTankNr
ldx TankNr
lda AngleTable,x
@@ -1038,14 +1063,14 @@ rotateRight;older is lower
bne MoveBarrelToNewPosition
mva #$30 CharCode ; if angle goes through 0 we clear the barrel
jsr drawtankNrX
jsr DrawTankNr.drawtankNrX
jmp MoveBarrelToNewPosition
rotateLeft
dec angleTable,x
bpl MoveBarrelToNewPosition
mva #$2e CharCode
jsr drawtankNrX
jsr DrawTankNr.drawtankNrX
jmp MoveBarrelToNewPosition
@@ -1055,7 +1080,7 @@ BarrelPositionIsFine
.endp
;----------------------------------------------
SortSequence .proc ;
.proc SortSequence ;
;----------------------------------------------
; here we try to get a sequence of tanks for two
; purposes:
@@ -1143,18 +1168,23 @@ nextishigher
.endp
;--------------------------------------------------
getkey .proc; waits for pressing a key and returns pressed value in A
.proc getkey ; waits for pressing a key and returns pressed value in A
;--------------------------------------------------
jsr WaitForKeyRelease
@
lda SKSTAT
cmp #$ff
beq checkJoyGetKey ; key not pressed, check Joy
cmp #$f7 ; SHIFT
beq checkJoyGetKey
mva #sfx_keyclick sfx_effect
lda kbcode
and #$3f ;CTRL and SHIFT ellimination
rts
cmp #28 ; ESC
bne getkeyend
mvx #1 escFlag
bne getkeyend
checkJoyGetKey
;------------JOY-------------
;happy happy joy joy
@@ -1165,13 +1195,19 @@ checkJoyGetKey
beq notpressedJoyGetKey
tay
lda joyToKeyTable,y
rts
bne getkeyend
notpressedJoyGetKey
;fire
lda TRIG0
lda TRIG0S
bne @-
lda #$0c ;Return key
getkeyend
mvx #sfx_keyclick sfx_effect
rts
.endp
;--------------------------------------------------
getkeynowait .proc;
@@ -1188,7 +1224,7 @@ WaitForKeyRelease .proc
and #$0f
cmp #$0f
bne WaitForKeyRelease
lda TRIG0
lda TRIG0S
beq WaitForKeyRelease
lda SKSTAT
cmp #$ff
BIN
View File
Binary file not shown.
Executable → Regular
+99 -58
View File
@@ -16,13 +16,24 @@ Options .proc
; - 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
mwa #OptionsDL dlptrs
lda dmactls
and #$fc
ora #$02 ; normal screen width
sta dmactls
VDLI DLIinterruptText.DLIinterruptNone ; jsr SetDLI for text screen without DLIs
mva #0 OptionsY
OptionsMainLoop
jsr OptionsInversion
jsr getkey
cmp #$f ;cursor down
ldx escFlag
seq:rts
cmp #$f ;cursor down
bne OptionsNoDown
inc:lda OptionsY
cmp #maxoptions
@@ -190,6 +201,7 @@ OptionsYLoop
;-------------------------------------------
; call of the purchase screens for each tank
.proc CallPurchaseForEveryTank
jsr PMoutofScreen
mwa #PurchaseDL dlptrs
lda dmactls
and #$fc
@@ -197,21 +209,20 @@ OptionsYLoop
sta dmactls
mva #0 TankNr
loop03
ldx TankNr
lda SkillTable,x
beq ManualPurchase
jsr PurchaseAI
jmp AfterManualPurchase
@
ldx TankNr
lda SkillTable,x
beq ManualPurchase
jsr PurchaseAI
jmp AfterManualPurchase
ManualPurchase
jsr Purchase
jsr Purchase
AfterManualPurchase
inc TankNr
lda TankNr
cmp NumberOfPlayers
bne loop03
inc:lda TankNr
cmp NumberOfPlayers
bne @-
rts
.endp
@@ -223,12 +234,10 @@ AfterManualPurchase
; Rest of the data is taken from appropriate tables
; and during the purchase these tables are modified.
mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons
jsr PMoutofScreen
ldx tankNr
lda TankColoursTable,x
lda TankStatusColoursTable,x
sta colpf2s
; we are clearing list of the weapons
@@ -238,12 +247,9 @@ AfterManualPurchase
; there is a tank (player) number in tanknr
; we are displaying name of the player
tay ; from 0 to y
tay ; 0 to y
lda tanknr
asl
asl
asl ; 8 chars per name
:3 asl ; 8 chars per name
tax
NextChar03
lda tanksnames,x
@@ -553,16 +559,17 @@ ChoosingItemForPurchase
cmp #$2c ; Tab
jeq ListChange
cmp #$0c ; Return
beq EndOfPurchase
sne:rts
cmp #$e
beq PurchaseKeyUp
cmp #$f
beq PurchaseKeyDown
cmp #$21 ; Space
jeq PurchaseWeaponNow
cmp #$07 ; cursor right
jeq PurchaseWeaponNow
bne ChoosingItemForPurchase
jmp PurchaseWeaponNow
EndOfPurchase
rts
PurchaseKeyUp
lda WhichList
beq GoUp1
@@ -816,6 +823,29 @@ NoArrowDown
rts
.endp
; -----------------------------------------------------
.proc EnterPlayerNames
;entering names of players
mwa #NameDL dlptrs
lda dmactls
and #$fc
ora #$01 ; narrow screen (32 chars)
sta dmactls
VDLI DLIinterruptText ; jsr SetDLI for text (names) screen
mva #0 TankNr
@ tax
lda TankStatusColoursTable,x
sta colpf2s ; set color of player name line
jsr EnterPlayerName
lda escFlag
jne START
inc TankNr
lda TankNr
cmp NumberOfPlayers
bne @-
rts
.endp
; -----------------------------------------------------
.proc EnterPlayerName
; in: TankNr
; Out: TanksNames, SkillTable
@@ -867,6 +897,9 @@ endOfTankName
CheckKeys
jsr getkey
ldx escFlag
seq:rts
; is the char to be recorded?
ldx #keycodesEnd-keycodes ;table was 38 chars long
IsLetter
@@ -1322,7 +1355,8 @@ TypeLine4x4Loop
sta CharCode4x4
mwa LineXdraw Xdraw
mva LineYdraw Ydraw
jsr PutChar4x4FULL ;type empty pixels as well!
mva #1 plot4x4color
jsr PutChar4x4 ;type empty pixels as well!
adw LineXdraw #4
inc LineCharNr
jmp TypeLine4x4Loop
@@ -1340,11 +1374,12 @@ EndOfTypeLine4x4
mwa Xdraw xk
mva Ydraw yc
mva #15 fs ; temp, how many times blink the billboard
@
lda fs
and #$01
sta plot4x4color
mva #20 fs ; temp, how many times blink the billboard
seppuku_loop
lda CONSOL ; turbo mode
cmp #6 ; START
sne:mva #1 fs ; finish it
mva #4 ResultY ; where seppuku text starts Y-wise on the screen
;top frame
@@ -1366,12 +1401,10 @@ EndOfTypeLine4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering
mva ResultY LineYdraw
jsr TypeLine4x4
dec fs
bne @-
;clean seppuku
mva #3 fs
mva #3 dx
mva #4 ResultY
@
mva #1 plot4x4color
@@ -1381,9 +1414,13 @@ EndOfTypeLine4x4
jsr TypeLine4x4
adb ResultY #4 ;next line
dec fs
bne @-
dec dx
bne @-
dec fs
jne seppuku_loop
quit_seppuku
;restore vars
mva yc Ydraw
mwa xk Xdraw
@@ -1393,6 +1430,8 @@ EndOfTypeLine4x4
.proc DisplayResults ;
;displays results of the round
;using 4x4 font
mva #sfx_smoke_cloud sfx_effect
;centering the result screen
mwa #((ScreenWidth/2)-(8*4)) ResultX
@@ -1581,15 +1620,6 @@ FinishResultDisplay
lda WeaponSymbols,y
sta TextBuffer+18
;---------------------
;displaying the energy of a tank
;---------------------
lda Energy,x
sta decimal
mwa #textbuffer+48 displayposition
jsr displaybyte
;---------------------
;displaying quantity of the given weapon
;---------------------
@@ -1608,28 +1638,39 @@ FinishResultDisplay
sta temp ;get back number of the weapon
mva #0 temp+1
; times 16 (because this is length of weapon name)
ldy #3 ; rotate 4 times
RotateDISP02
aslw temp
dey
bpl RotateDISP02
ldy #3 ; shift left 4 times
@
aslw temp
dey
bpl @-
adw temp #NamesOfWeapons
ldy #6 ; from 6th character
ldy #15
loop06
lda (temp),y
sta textbuffer+23,y
dey
bpl loop06
@
lda (temp),y
sta textbuffer+23,y
dey
bpl @-
;---------------------
;displaying the energy of a tank
;---------------------
lda Energy,x
sta decimal
mwa #textbuffer+48 displayposition
jsr displaybyte
;=========================
;display Force
;=========================
ldx TankNr
lda EnergyTableL,x
lda ForceTableL,x
sta decimal
lda EnergyTableH,x
lda ForceTableH,x
sta decimal+1
mwa #textbuffer+40+34 displayposition
jsr displaydec
Executable → Regular
+13 -10
View File
@@ -15,7 +15,7 @@ TanksNames ; DO NOT ZERO - ticket #24
:6 dta d" "
;----------------------------
;Options DO NOT ZERO - ticket #27
OptionsTable .by 0,0,2,2,0,1,4
OptionsTable .by 0,0,2,2,0,1,3
RoundsInTheGame .by 10 ;how many rounds in the current game
seppukuVal .by 75
;--------------------------------------------------
@@ -33,6 +33,9 @@ RoundNrDisplay
.byte $ff
variablesStart ; zeroing starts here
drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
;--------------
escFlag .ds 1
;--------------
sfx_effect .ds 1
;--------------
@@ -43,7 +46,7 @@ flyDelay .ds 1
;--------------
NumberOfPlayers .DS 1 ;current number of players (counted from 1)
TankSequence .DS [MaxPlayers] ;sequence of shooting during the Round
GameIsOver .DS 1 ; 1 - it was the last round in the game
GameIsOver .DS 1 ; 1 means it was the last round in the game
;-----------------------------------
moneyH ;we place zero at the end of prices and money
;and have range from 0 to 99990 (not too much)
@@ -81,14 +84,14 @@ TempResults
CurrentResult
.DS 1
;-----------------------------------
EnergyTableL ;shooting Force of the tank during the round
ForceTableL ;shooting Force of the tank during the round
.DS [MaxPlayers]
EnergyTableH
ForceTableH
.DS [MaxPlayers] ;maxplayers=6
MaxEnergyTableL ;Energy of the tank during the round
MaxForceTableL ;Energy of the tank during the round
;(limes superior force of the Shoot)
.DS [MaxPlayers] ;1000 is the default
MaxEnergyTableH
MaxForceTableH
.DS [MaxPlayers]
;-----------------------------------
@@ -125,11 +128,11 @@ xtankstableH
.DS [MaxPlayers]
ytankstable ;Y positions of tanks (lower left point)
.DS [MaxPlayers]
LowResDistances ; coarse stank positions divided by 4 (to be in just one byte)
LowResDistances ; coarse tank positions divided by 4 (to be in just one byte)
.DS [MaxPlayers]
;-----------------------------------
Erase .DS 1 ; if 1 only mask of the character is printed
; on the graphics screen. if 0 character is printed normally
; on the graphics screen. if 0 character is printed normally
;-----------------------------------
RangeLeft .DS 2 ;range of the soil to be fallen down
@@ -152,13 +155,12 @@ digtabyL .DS [8]
digtabyH .DS [8]
; liquiddirt
TempXfill .ds 2
FillCounter .ds 1
FillCounter .ds 2
;sandhog
sandhogflag .DS 1 ; (0 digger, 8 sandhog)
;ofdirt
magic .DS 2 ; was tempor2, but it was not compiling!!! (bug in OMC65)
;draw
DrawJumpAddr .DS 2
HowToDraw .DS 1
; bits here mean
; 0 - negative X (go up)
@@ -332,6 +334,7 @@ TextNumberOff .DS 1
TankTempY
.DS 1
;-------------- single round variables --------------
singleRoundVars
previousAngle
.DS [MaxPlayers]
previousEnergyL
Executable → Regular
+108 -97
View File
@@ -13,7 +13,7 @@
ldx TankNr
lda ActiveWeapon,x
.endp
ExplosionDirect .proc
.proc ExplosionDirect
asl
tax
lda ExplosionRoutines+1,x
@@ -50,7 +50,7 @@ ExplosionRoutines
.word dirtclod-1
.word dirtball-1
.word tonofdirt-1
.word liquiddirt-1 ;liquiddirt
.word liquiddirt-1
.word dirtcharge-1
.word VOID-1 ;earthdisrupter
.word VOID-1 ;plasmablast
@@ -214,9 +214,7 @@ FunkyBombLoop
lda random
lsr
and #%00011111
bcc DoNotEor
eor #$ff
DoNotEor
scc:eor #$ff
sta Angle
lda #0
@@ -231,6 +229,7 @@ DoNotEor
lda HitFlag
beq NoExplosionInFunkyBomb
mva #sfx_baby_missile sfx_effect
mva #11 ExplosionRadius
jsr xmissile
NoExplosionInFunkyBomb
dec FunkyBombCounter
@@ -523,6 +522,12 @@ DiggerCharacter
jmp cleanDirt
.endp
; ------------------------
.proc liquiddirt
mva #sfx_liquid_dirt sfx_effect
mwa #254 FillCounter
jmp xliquiddirt
.endp
; ------------------------
.proc laser
ldx TankNr
lda AngleTable,x
@@ -539,7 +544,7 @@ DiggerCharacter
sbc EndOfTheBarrelY,y
sta ybyte
mva #0 ybyte+1
mwa #Drawplot DrawJumpAddr
mva #0 drawFunction
mwa xdraw LaserCoordinate
mwa ydraw LaserCoordinate+2
mwa xbyte LaserCoordinate+4
@@ -610,7 +615,7 @@ ExplosionLoop2
;check tanks' distance from the centre of the explosion
mwa #DrawLen DrawJumpAddr
mva #%10000000 drawFunction
;the above switches Draw to measuring length
;trick is easy - how many pixels does it take to draw
;a line from one point to another
@@ -652,9 +657,7 @@ DistanceCheckLoop
;multiply difference by 8
clc
adc #1
asl
asl
asl
:3 asl
tay
jsr DecreaseEnergyX
@@ -686,6 +689,7 @@ dirtLoop
; -----------------
.proc xriotbomb ;
; -----------------
mva #sfx_riot_blast sfx_effect
lda #0
sta radius
sta color
@@ -746,13 +750,13 @@ UpNotYet
beq HowMuchToFallRight2
.nowarn dew xdraw
lda xdraw
bne RollinContinues
jne RollinContinues ; like cpw xdraw #0
lda xdraw+1
jne RollinContinues
beq ExplodeNow
HowMuchToFallRight2
inw xdraw
cpw xdraw screenwidth
cpw xdraw #screenwidth
jne RollinContinues
ExplodeNow
mwa xdraw xcircle ; we must store somewhere (BAD)
@@ -890,17 +894,15 @@ EndOfTheDirt
rts
.endp
; ----------------
.proc liquiddirt ;
mva #sfx_liquid_dirt sfx_effect
.proc xliquiddirt ;
mva xdraw TempXfill
mva #254 FillCounter
RepeatFill
mva TempXfill xdraw
jsr checkRollDirection
; HowMuchToFall - direction
; $FF - we are in a hole (flying in missile direction)
; 1 - right, 2 - left
adw xdraw #mountaintable tempXROLLER
adw xdraw #mountaintable tempXROLLER
ldy #0
lda (tempXROLLER),y
sta HeightRol ; relative point
@@ -911,7 +913,6 @@ RollinContinuesLiquid
ldy #0
lda (tempXROLLER),y
sta ydraw
beq FillNow
cmp HeightRol
beq UpNotYet2
bcc FillNow
@@ -924,14 +925,12 @@ UpNotYet2
cmp #1
beq HowMuchToFallRight3
.NOWARN dew xdraw
lda xdraw
bne RollinContinuesLiquid
lda xdraw+1
cpw xdraw #$ffff
jne RollinContinuesLiquid
beq FillNow
HowMuchToFallRight3
inw xdraw
cpw xdraw screenwidth
cpw xdraw #(screenwidth+1)
jne RollinContinuesLiquid
FillNow
; finally one pixel more
@@ -948,12 +947,15 @@ FillHole
adw xdraw #mountaintable tempXROLLER
lda (tempXROLLER),y
sta ydraw
beq ToHighFill ; if we filled all playfield (very rare but possible)
dec ydraw ; one pixel up
ToHighFill
lda ydraw
sta (tempXROLLER),y ;mountaintable update
mva #1 color
jsr plot
dec FillCounter
jsr plot.MakePlot
.nowarn dew FillCounter
cpw FillCounter #0
jne RepeatFill
rts
.endp
@@ -973,17 +975,17 @@ FillHole
ldx TankNr
;Checking the maximal force
lda MaxEnergyTableH,x
cmp EnergyTableH,x
lda MaxForceTableH,x
cmp ForceTableH,x
bne ContinueToCheckMaxForce2
lda MaxEnergyTableL,x
cmp EnergyTableL,x
lda MaxForceTableL,x
cmp ForceTableL,x
ContinueToCheckMaxForce2
bcs @+
lda MaxEnergyTableH,x
sta EnergyTableH,x
lda MaxEnergyTableL,x
sta EnergyTableL,x
lda MaxForceTableH,x
sta ForceTableH,x
lda MaxForceTableL,x
sta ForceTableL,x
@
jsr StatusDisplay ;all digital values like force, angle, wind, etc.
jsr PutTankNameOnScreen
@@ -1001,12 +1003,12 @@ ContinueToCheckMaxForce2
; $f3 - shift+key
notpressed
lda TRIG0
lda TRIG0S
beq notpressed
lda SKSTAT
cmp #$ff
beq checkJoy
cmp #$f7
cmp #$f7 ; SHIFT
beq checkJoy
lda kbcode
@@ -1046,7 +1048,7 @@ checkJoy
jmp jumpFromStick
notpressedJoy
;fire
lda TRIG0
lda TRIG0S
jeq pressedSpace
jmp notpressed
@@ -1054,36 +1056,36 @@ notpressedJoy
pressedUp
;force increaseeee!
ldx TankNr
inc EnergyTableL,x
inc ForceTableL,x
bne CheckingMaxForce
inc EnergyTableH,x
inc ForceTableH,x
CheckingMaxForce
mva #sfx_set_power_1 sfx_effect
lda MaxEnergyTableH,x
cmp EnergyTableH,x
lda MaxForceTableH,x
cmp ForceTableH,x
bne FurtherCheckMaxForce
lda MaxEnergyTableL,x
cmp EnergyTableL,x
lda MaxForceTableL,x
cmp ForceTableL,x
FurtherCheckMaxForce
jcs BeforeFire
lda MaxEnergyTableH,x
sta EnergyTableH,x
lda MaxEnergyTableL,x
sta EnergyTableL,x
lda MaxForceTableH,x
sta ForceTableH,x
lda MaxForceTableL,x
sta ForceTableL,x
jmp BeforeFire
CTRLPressedUp
ldx TankNr
lda EnergyTableL,x
lda ForceTableL,x
clc
adc #10
sta EnergyTableL,x
sta ForceTableL,x
bcc CheckingMaxForce
inc EnergyTableH,x
inc ForceTableH,x
jmp CheckingMaxForce
@@ -1091,16 +1093,16 @@ pressedDown
mva #sfx_set_power_1 sfx_effect
ldx TankNr
dec EnergyTableL,x
lda EnergyTableL,x
dec ForceTableL,x
lda ForceTableL,x
cmp #$ff
bne @+
dec EnergyTableH,x
dec ForceTableH,x
bpl @+
ForceGoesZero
lda #0
sta EnergyTableH,x
sta EnergyTableL,x
sta ForceTableH,x
sta ForceTableL,x
@
jmp BeforeFire
@@ -1109,11 +1111,11 @@ CTRLPressedDown
ldx TankNr
sec
lda EnergyTableL,x
lda ForceTableL,x
sbc #10
sta EnergyTableL,x
sta ForceTableL,x
jcs BeforeFire
dec EnergyTableH,x
dec ForceTableH,x
bmi ForceGoesZero
jmp BeforeFire
@@ -1125,7 +1127,7 @@ pressedLeft
cmp #$ff ; if angle goes through 0 we clear the barrel
bne NotThrough90DegreesLeft
mva #$2e CharCode
jsr drawtankNrX
jsr DrawTankNr.drawtankNrX
NotThrough90DegreesLeft
cmp #(255-91)
jne BeforeFire
@@ -1140,7 +1142,7 @@ pressedRight
lda AngleTable,x
bne NotThrough90DegreesRight
mva #$30 CharCode ; if angle goes through 0 we clear the barrel
jsr drawtankNrX
jsr DrawTankNr.drawtankNrX
NotThrough90DegreesRight
cmp #91
jne BeforeFire
@@ -1149,6 +1151,7 @@ NotThrough90DegreesRight
jmp BeforeFire
pressedTAB
mva #sfx_purchase sfx_effect
ldx TankNr
inc ActiveWeapon,x
lda ActiveWeapon,x
@@ -1216,9 +1219,9 @@ RandomizeOffensiveText
sta Force+1
bne AfterStrongShoot
NotStrongShoot
lda EnergyTableL,x
lda ForceTableL,x
sta Force
lda EnergyTableH,x
lda ForceTableH,x
sta Force+1
AfterStrongShoot
lda #$0
@@ -1268,7 +1271,7 @@ AfterStrongShoot
;--------------------------------------------------
TankFalls .proc;
.proc TankFalls;
;--------------------------------------------------
mva #sfx_shield_off sfx_effect
lda #0
@@ -1530,7 +1533,7 @@ noSmokeTracer
RepeatIfSmokeTracer
mwa ytraj+1 Ytrajold+1
mwa xtraj+1 Xtrajold+1
mwa #DrawCheck DrawJumpAddr
mva #%01000000 drawFunction
lda #0
sta Result
@@ -1550,7 +1553,7 @@ RepeatIfSmokeTracer
stx LeapFrogAngle ; we will need it later
;Angle works like this:
;0 'degrees' is sraight up
;0 'degrees' is straight up
;90 'degrees' is horizontally right
;255 is straight up (same as 0)
;255-90 (165) horizontally left
@@ -1623,8 +1626,11 @@ DoNotAdd
sta Result+1
sta Result+2
;--
ldx Angle
lda costable,x
lda #90
sec
sbc Angle
tax
lda sintable,x
sta Multiplee ;cos(Angle)*Force
mwa Force Multiplier
@@ -1725,13 +1731,13 @@ FlightLeft
lda goleft
bne FlightsLeft ;blow on bullet flighting left
lda WindOrientation
bne WindToLeft
bne LWindToRight
beq LWindToLeft
FlightsLeft
lda WindOrientation
beq LWindToRight
LWindToLeft
LWindToLeft
; here Wind to right, bullet goes right as well, so vx=vx+Wind
; here Wind to left, bullet goes left as well, so vx=vx+Wind
clc
@@ -1748,23 +1754,23 @@ LWindToLeft
adc #0
sta vx+3
jmp @+
WindToLeft
LWindToRight
;Wind to left, bullet right, so vx=vx-Wind
;Wind to right, bullet left, so vx=vx-Wind
sec
lda vx
sbc Wind
sta vx
lda vx+1
sbc Wind+1
sta vx+1
lda vx+2
sbc #0
sta vx+2
lda vx+3
sbc #0
sta vx+3
;Wind to left, bullet right, so vx=vx-Wind
;Wind to right, bullet left, so vx=vx-Wind
sec
lda vx
sbc Wind
sta vx
lda vx+1
sbc Wind+1
sta vx+1
lda vx+2
sbc #0
sta vx+2
lda vx+3
sbc #0
sta vx+3
@
mwa xtrajold+1 xdraw
mwa ytrajold+1 ydraw
@@ -1804,8 +1810,7 @@ SkipCollisionCheck
jsr UnPlot
NoUnPlot
; jsr PlotPointer
jmp Loopi
Hit
@@ -1815,12 +1820,14 @@ Hit
jsr unPlot
EndOfFlight
mwa xdraw xcircle ; we must store for a little while
mva ydraw ycircle ; xdraw and ydraw
mva ydraw ycircle ; xdraw and ydraw .... but this values are in YHit and XHit !!!
mwa #0 xdraw
mva #screenheight-1 ydraw
jsr unPlot
mwa xcircle xdraw
mva ycircle ydraw
; mwa XHit xdraw
; mva YHit ydraw
ldy SmokeTracerFlag
beq EndOfFlight2
@@ -1836,9 +1843,9 @@ SecondFlight .proc
; ---------------- copied code fragment from before firing. not too elegant.
; ---------------- get fire parameters again
ldx TankNr
lda EnergyTableL,x
lda ForceTableL,x
sta Force
lda EnergyTableH,x
lda ForceTableH,x
sta Force+1
lda #$0
sta Force+2
@@ -1875,7 +1882,7 @@ SecondFlight .proc
sbc #0
sta ytraj+2
ldy #100
ldy #100 ; ???
mva #1 tracerflag ; I do not know (I mean I think I know ;) )
; 10 years later - I do not know!!!
; 20 years later - still do not know :]
@@ -1964,12 +1971,10 @@ MIRVcopyParameters
ldx #$FF ; it will turn 0 in a moment anyway
stx MirvMissileCounter
mrLoopi
inc MirvMissileCounter
lda MirvMissileCounter
inc:lda MirvMissileCounter
cmp #5
bne mrLoopix
mva #0 MirvMissileCounter
mrLoopix
sne:mva #0 MirvMissileCounter
ldx MirvMissileCounter
; Y changes only for bullet number 0
; because rest of the bullets have the same Y (height)
@@ -2131,7 +2136,7 @@ MIRVcheckCollision
lda xtraj02,x
adc #>mountaintable
sta temp+1
; adw mountaintable --- it does not work!!!!!!!! and should! (OMC bug?) #temp
ldy #0
lda ytraj+1
cmp (temp),y
@@ -2158,7 +2163,7 @@ mrHit
; we have to make unPlot over the screen (to initialise it)
; before actual explosion
mwa #0 xdraw
mva #screenheight-1 ydraw
mwa #screenheight-1 ydraw
jsr unPlot.unPlotAfterX
ldx MirvMissileCounter
ldy #0
@@ -2173,6 +2178,8 @@ mrHit
adc #>mountaintable
sta temp+1
lda (temp),y
sec
sbc #1
sta ydraw
sty ydraw+1 ;we know that y=0
jsr missile ; explode ....
@@ -2279,9 +2286,9 @@ CalculateExplosionRange0
lda #0
sta RangeRight
sta RangeRight+1
mva #11 ExplosionRadius
mva #11 ExplosionRadius ; what is this magic value?
;--------------------------------------------------
CalculateExplosionRange .proc
.proc CalculateExplosionRange
;--------------------------------------------------
;calculates total horizontal range of explosion by
;"summing up" ranges of all separate explosions
@@ -2369,6 +2376,9 @@ HowManyBullets .proc
;--------------------------------------------------
ShellDelay .proc
lda CONSOL
cmp #6
beq noShellDelay
ldx flyDelay
DelayLoop
lda VCOUNT
@@ -2376,6 +2386,7 @@ DelayLoop
beq @-
dex
bne DelayLoop
noShellDelay
rts
.endp