mirror of
https://github.com/pkali/scorch_src.git
synced 2026-05-21 06:39:46 +02:00
860d0917ad
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)
388 lines
10 KiB
NASM
Executable File
388 lines
10 KiB
NASM
Executable File
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
|
|
|
|
.IF *>0 ;this is a trick that prevents compiling this file alone
|
|
;=====================================================
|
|
; most important non-zero page variables
|
|
; used by the given subroutines
|
|
; moved to one place for easier
|
|
; compilation to e.g. cartridge
|
|
; zero page variables are declared in program.s65 module
|
|
;=====================================================
|
|
;--------------------------------------------------
|
|
;Variables
|
|
;--------------
|
|
TanksNames ; DO NOT ZERO - ticket #24
|
|
:6 dta d" "
|
|
;----------------------------
|
|
;Options DO NOT ZERO - ticket #27
|
|
OptionsTable .by 0,0,2,2,0,1,4
|
|
RoundsInTheGame .by 10 ;how many rounds in the current game
|
|
seppukuVal .by 75
|
|
;--------------------------------------------------
|
|
skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
|
|
.DS [MaxPlayers]
|
|
;-----------------------------------
|
|
; 4x4 text buffer
|
|
ResultLineBuffer
|
|
dta d" "
|
|
.byte $ff
|
|
LineHeader1
|
|
dta d"# ROUND: "
|
|
RoundNrDisplay
|
|
dta d" #"
|
|
.byte $ff
|
|
|
|
variablesStart ; zeroing starts here
|
|
;--------------
|
|
sfx_effect .ds 1
|
|
;--------------
|
|
noDeathCounter .ds 1
|
|
;--------------
|
|
OptionsY .ds 1 ;vertical position of cursor on Options screen
|
|
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
|
|
;-----------------------------------
|
|
moneyH ;we place zero at the end of prices and money
|
|
;and have range from 0 to 99990 (not too much)
|
|
;money players have (maybe one more byte is needed?)
|
|
.DS [MaxPlayers]
|
|
moneyL
|
|
.DS [MaxPlayers]
|
|
;-----------------------------------
|
|
gainH ;how much money player gets after the round
|
|
;it is gathered during the round basing on energy
|
|
;opponents loose after player's shoots
|
|
.DS [MaxPlayers]
|
|
gainL
|
|
.DS [MaxPlayers]
|
|
;-----------------------------------
|
|
looseH ;how much player looses after the round
|
|
;calculated from REAL energy loss
|
|
;(not only to zero energy)
|
|
.DS [MaxPlayers]
|
|
looseL
|
|
.DS [MaxPlayers]
|
|
;-----------------------------------
|
|
Energy
|
|
.DS [MaxPlayers]
|
|
EnergyDecrease .DS 1
|
|
eXistenZ
|
|
.DS [MaxPlayers]
|
|
LASTeXistenZ ; eXistenZ before shoot
|
|
.DS [MaxPlayers]
|
|
|
|
ResultsTable ;the results in the gameeeeee
|
|
.DS [MaxPlayers]
|
|
TempResults
|
|
.DS [MaxPlayers]
|
|
CurrentResult
|
|
.DS 1
|
|
;-----------------------------------
|
|
EnergyTableL ;shooting Force of the tank during the round
|
|
.DS [MaxPlayers]
|
|
EnergyTableH
|
|
.DS [MaxPlayers] ;maxplayers=6
|
|
MaxEnergyTableL ;Energy of the tank during the round
|
|
;(limes superior force of the Shoot)
|
|
.DS [MaxPlayers] ;1000 is the default
|
|
MaxEnergyTableH
|
|
.DS [MaxPlayers]
|
|
;-----------------------------------
|
|
|
|
AngleTable ;Angle of the barrel of each tank during the round
|
|
.DS [MaxPlayers]
|
|
NewAngle .DS 1
|
|
;-----------------------------------
|
|
|
|
ActiveWeapon ;number of the selected weapon
|
|
.DS [MaxPlayers]
|
|
WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile
|
|
;-----------------------------------
|
|
|
|
;format of the 3-byte static point number used in the game
|
|
; 20203.5 => 128 : <20203 : >20203
|
|
;-----------------------------------
|
|
|
|
L1 .DS 1 ; variable used in multiplications (by 10:)
|
|
gravity .DS 1 ;only the decimal part (1/10 = 25)
|
|
;-----------------------------------
|
|
|
|
Wind .ds 2 ;walue displayed on the screen
|
|
;multiplied by 16 (decimal part only)
|
|
;-----------------------------------
|
|
MaxWind .ds 1 ;
|
|
WindOrientation .DS 1 ;(0-right,1-left)
|
|
;-----------------------------------
|
|
Counter .DS 1 ;temporary Counter for outside loops
|
|
HitFlag .DS 1 ;1 when missile hit anything
|
|
;-----------------------------------
|
|
xtankstableL ;X positions of tanks (lower left point)
|
|
.DS [MaxPlayers]
|
|
xtankstableH
|
|
.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)
|
|
.DS [MaxPlayers]
|
|
;-----------------------------------
|
|
Erase .DS 1 ; if 1 only mask of the character is printed
|
|
; on the graphics screen. if 0 character is printed normally
|
|
|
|
;-----------------------------------
|
|
RangeLeft .DS 2 ;range of the soil to be fallen down
|
|
RangeRight .DS 2 ;it is being set by all Explosions
|
|
;-----------------------------------
|
|
WeaponRangeLeft .DS 2 ;Range of the Explosion of the given weapon
|
|
WeaponRangeRight .DS 2
|
|
;--------------------------------------------------
|
|
;xroller
|
|
HowMuchToFall .ds 1
|
|
HeightRol .DS 1
|
|
;digger
|
|
digstartx .DS 2
|
|
digstarty .DS 2
|
|
diggery .DS 1
|
|
DigLong .DS 1
|
|
digtabxL .DS [8]
|
|
digtabxH .DS [8]
|
|
digtabyL .DS [8]
|
|
digtabyH .DS [8]
|
|
; liquiddirt
|
|
TempXfill .ds 2
|
|
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)
|
|
; 1 - negative Y (left)
|
|
; 2 - directional value > 1 (more than 45 degrees)
|
|
; if all 0 then standart routine
|
|
XHit .DS 2
|
|
YHit .DS 2
|
|
LineLength .DS 2
|
|
;circle
|
|
radius .DS 1
|
|
xcircle .DS 2
|
|
ycircle .DS 1
|
|
tempcir .DS 2
|
|
;TankFalls
|
|
IfFallDown .DS 1
|
|
PreviousFall .DS 1
|
|
EndOfTheFallFlag .DS 1 ; in case of the infinite fall
|
|
Parachute .DS 1 ; are you insured with parachute?
|
|
; -------------------------------------------------
|
|
;Flight
|
|
;variables for 5 missiles (used for mirv)
|
|
xtraj00 .DS [5] ; 3 bytes of xtraj times 5. Lowest byte
|
|
xtraj01 .DS [5] ; middle byte
|
|
xtraj02 .DS [5] ; high byte
|
|
vx00 .DS [5]
|
|
vx01 .DS [5]
|
|
vx02 .DS [5]
|
|
vx03 .DS [5]
|
|
MirvDown .DS [5] ; is given missile down?
|
|
MirvMissileCounter .DS 1 ; missile Counter (mainly for X)
|
|
SmokeTracerFlag .DS 1 ; if Smoketracer
|
|
; -------------------------------------------------
|
|
;CheckCollisionWithTank
|
|
vx .ds 4 ; 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA)
|
|
vy .ds 4 ;0,0,0,0
|
|
xtraj .ds 3 ; 0,0,0
|
|
ytraj .ds 3 ; 0,0,0
|
|
xtrajold .ds 3 ; 0,0,0
|
|
ytrajold .ds 3 ; 0,0,0
|
|
Angle .DS 1
|
|
Force .ds 3 ; 0,0,0
|
|
Multiplier .ds 3 ; 0,0,0
|
|
Multiplee .ds 2 ; 0,0
|
|
Result .ds 3 ; 0,0,0
|
|
goleft .DS 1 ;if 1 then flights left
|
|
;--------------------------------------------------
|
|
;SoilDown2
|
|
IsEndOfTheFallFlag .DS 1
|
|
; -------------------------------------------------
|
|
;unPlot
|
|
WhichUnPlot .DS 1
|
|
; max 5 concurrent unPlots
|
|
oldplotH .DS [5]
|
|
oldplotL .DS [5]
|
|
oldora .DS [5]
|
|
oldply .DS [5]
|
|
OldOraTemp .DS 1
|
|
FunkyBombCounter .DS 1
|
|
xtrajfb .DS 2
|
|
ytrajfb .DS 2
|
|
;
|
|
tracerflag .DS 1
|
|
; -------------------------------------------------
|
|
;TypeChar
|
|
mask1 .DS [8]
|
|
mask2 .DS [8]
|
|
|
|
char1 .DS [8]
|
|
char2 .DS [8]
|
|
color .DS 1
|
|
ybit .DS 1
|
|
tempbyte01 .DS 1
|
|
delta .DS 2
|
|
yfloat .DS 2
|
|
deltaX .DS 1
|
|
UpNdown .DS 1
|
|
|
|
temptankX .DS 2
|
|
temptankNr .DS 1
|
|
|
|
; -------------------------------------------------
|
|
;Variables from textproc.s65
|
|
; tables with numbers of weapons on the right lists
|
|
; to be honest - I do not know at the moment what the above
|
|
; comment was supposed to mean...
|
|
; OK (2022) so, L1 is list of offensive weapons, L2 - defensive
|
|
NubersOfWeaponsL1
|
|
.ds 8*5 ; :(8*5) .by $ff
|
|
NubersOfWeaponsL2
|
|
.ds 8*2 ; :(8*2) .by $ff
|
|
; -------------------------------------------------
|
|
|
|
; variables storing amount of weapons on the first and second
|
|
; list and pointer position
|
|
|
|
HowManyOnTheList1
|
|
.DS 1
|
|
HowManyOnTheList2
|
|
.DS 1
|
|
PositionOnTheList ; pointer position on the list being displayed
|
|
.DS 1
|
|
LastWeapon
|
|
; number of the last previously purchased weapon
|
|
; it is necessary when after purchase some weapon
|
|
; is removed from the list (because too expensive)
|
|
; and the cursor must be placed elsewhere
|
|
.DS 1
|
|
WhichList ; list currently on the screen
|
|
; (0-offensive, 1-defensive)
|
|
.DS 1
|
|
OffsetDL1 ; offset of the list screen (how many lines)....
|
|
.DS 1
|
|
|
|
; -------------------------------------------------
|
|
|
|
;mark the level
|
|
PositionInName ; cursor position in name of the player when name input
|
|
.DS 1
|
|
DifficultyLevel ; Difficulty Level (human/cpu)
|
|
.DS 1
|
|
;-------------------------------------------------
|
|
;displaydecimal
|
|
decimal .DS 2
|
|
decimalresult .DS 4
|
|
|
|
;xmissile
|
|
ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte
|
|
;round
|
|
CurrentRoundNr .DS 1
|
|
FallDown1 .DS 1
|
|
FallDown2 .DS 1
|
|
;leapfrog
|
|
LeapFrogAngle .DS 1
|
|
;laser
|
|
LaserCoordinate .DS 8 ; 2,2,2,2
|
|
; -------------------------------------------------
|
|
; Here go tables with weapons possesed by a given tank
|
|
; Index in the table means weapon type
|
|
; number entered means ammo for given weapon possessed (max 99)
|
|
; Let 0 be "baby missile"
|
|
; from $30 the defensive weapons begin
|
|
TanksWeapons
|
|
TanksWeapon1
|
|
.DS [64]
|
|
TanksWeapon2
|
|
.DS [64]
|
|
TanksWeapon3
|
|
.DS [64]
|
|
TanksWeapon4
|
|
.DS [64]
|
|
TanksWeapon5
|
|
.DS [64]
|
|
TanksWeapon6
|
|
.DS [64]
|
|
|
|
mountaintable ;table of mountains (size=screenwidth)
|
|
.DS [screenwidth]
|
|
.DS 1 ; additional byte for fallout (sometimes 1 pixel)
|
|
mountaintable2 ;table of mountains (size=screenwidth)
|
|
.DS [screenwidth]
|
|
.DS 1 ; additional byte for fallout (sometimes 1 pixel)
|
|
MountaintableEnd ;good for table clearing
|
|
;----------------------------------------------
|
|
TextPositionX .DS 2
|
|
TextPositionY .DS 1
|
|
TextAddress .DS 2
|
|
TextCounter .DS 1
|
|
TextNumberOff .DS 1
|
|
;--------------
|
|
TankTempY
|
|
.DS 1
|
|
;-------------- single round variables --------------
|
|
previousAngle
|
|
.DS [MaxPlayers]
|
|
previousEnergyL
|
|
.DS [MaxPlayers]
|
|
previousLeftRange
|
|
.DS [MaxPlayers]
|
|
previousEnergyH
|
|
.DS [MaxPlayers]
|
|
previousRightAngle
|
|
.DS [MaxPlayers]
|
|
RandBoundaryLow
|
|
.ds 2
|
|
RandBoundaryHigh
|
|
.ds 2
|
|
AngleTablePointer
|
|
.DS 1
|
|
singleRoundVarsEnd
|
|
;----------------------------------------------
|
|
; 4x4 texts
|
|
;----------------------------------------------
|
|
LineAddress4x4
|
|
.DS 2
|
|
LineCharNr
|
|
.DS 1
|
|
LineXdraw
|
|
.DS 2
|
|
LineYdraw
|
|
.DS 1
|
|
|
|
;-----------
|
|
ResultX
|
|
.DS 2
|
|
ResultY
|
|
.DS 1
|
|
ResultOfTankNr
|
|
.DS 1
|
|
|
|
;----------------------------
|
|
;PutChar4x4
|
|
LoopCounter4x4 .DS 1
|
|
y4x4 .DS 1
|
|
StoreA4x4 .DS 1
|
|
Xcounter4x4 .DS 1
|
|
nibbler4x4 .DS 1
|
|
CharCode4x4 .DS 1
|
|
plot4x4color .DS 1 ;1-white, 0-background
|
|
|
|
|
|
|
|
variablesEnd
|
|
;----------------------------
|
|
|
|
.endif
|