Compare commits

...

66 Commits

Author SHA1 Message Date
Pirx 8b29184886 Merge pull request #126 from pkali/develop
Develop
2022-08-22 15:05:42 -04:00
Pirx 4218791068 readme updt 2022-08-22 15:05:21 -04:00
Pecusx 90eff39dda Manuals update 2022-08-22 20:30:24 +02:00
Pecusx 662bc1304a v 1.11
Manuals update
2022-08-22 20:25:41 +02:00
Pecusx 8052add0ab Veeeeeery long tank names fix 2022-08-22 19:48:46 +02:00
Pecusx 7f85a7ed6a Walls added! #50
And Battery activation fix :)
2022-08-22 19:27:02 +02:00
Pirx 99a0fde92a Merge pull request #125 from pkali/develop
ver fix
2022-08-22 01:13:02 -04:00
Pirx 18dfe4a725 ver fix 2022-08-22 01:12:16 -04:00
Pirx b5bf94b7e6 Merge pull request #124 from pkali/develop
ver fix
2022-08-22 01:11:17 -04:00
Pirx 3c841e409b ver fix 2022-08-22 01:09:59 -04:00
Pirx ea5098e274 Merge pull request #123 from pkali/develop
Develop
2022-08-22 01:09:04 -04:00
Pirx 64a7650992 v1.10 2022-08-22 01:08:31 -04:00
Pirx 2b38f64d17 manual pl 2022-08-21 22:16:07 -04:00
Pirx cd57bc3522 manual.md 2022-08-21 21:33:19 -04:00
Pecusx 1dce1f1777 PL manual update 2022-08-21 23:09:49 +02:00
Pecusx f2ec211b52 Press A to defensives activate 2022-08-21 23:05:45 +02:00
Pecusx bd2239e434 Defenses first to be activated after purchase 2022-08-21 22:23:46 +02:00
Pecusx 514638e1ca Hovercraft fix for buried tank 2022-08-21 21:13:43 +02:00
Pirx 8f9e5d018b randomizeforce fix 2022-08-21 14:04:20 -04:00
Pecusx fa5451e646 Fix for underground falling 2022-08-21 19:35:48 +02:00
Pecusx a609a1b331 Better Hovercraft text and good price :) 2022-08-21 17:32:26 +02:00
Pecusx b67c3230be Hovercraft fly high and low 2022-08-21 16:53:07 +02:00
Pecusx 1c55872935 Fix for very high Hovercraft fly 2022-08-21 15:26:06 +02:00
Pecusx bc01eec78e Small fixes and explosion range corrections 2022-08-21 13:39:04 +02:00
Pecusx de7bea2fa7 Hovercraft works fine at all #52 2022-08-21 11:35:18 +02:00
Pirx 132f2afd67 WIP: my hovercraft is full of eels 2022-08-21 01:11:58 -04:00
Pirx ed3952e89e narrow purchase screen #118 2022-08-21 00:13:22 -04:00
Pirx 1dc5a40633 zpage var opt #3 2022-08-20 18:37:10 -04:00
Pirx b4f1e42f78 zpage opt part 2 2022-08-20 16:51:25 -04:00
Pirx 0967ffbe19 text overflow fix 2022-08-20 16:28:39 -04:00
Pirx 9108c7c857 hovercraft erase optymiz 2022-08-20 12:22:49 -04:00
Pecusx 1ad9b6760d Small Hovercraft animation fix and updated PL manual 2022-08-20 16:58:37 +02:00
Pecusx c7e87c67ec Hovercraft animations and Tank falls bugfix 2022-08-20 15:18:57 +02:00
Pirx fb4585fbb5 git ignore updt. 2022-08-20 02:46:59 -04:00
Pirx 3e78ed016b eels talking texts 2022-08-20 02:46:11 -04:00
Pirx 0219fe8d14 linetable ellimination 2022-08-20 02:33:24 -04:00
Pirx a4d4e5f466 repo cleanup 2022-08-20 02:10:54 -04:00
Pirx 5a7e9bd769 library switch 2022-08-20 01:56:28 -04:00
Pecusx 1215065fbe Hovercraft SFX 2022-08-19 20:06:57 +02:00
Pecusx 5e558235c8 Flying tank bypasses the others 2022-08-19 18:53:56 +02:00
Pecusx 827658ab42 I forgot about the xex 2022-08-19 14:24:42 +02:00
Pecusx 338a4a0eaf Carrect tank fuel :) (for P/M "problems") 2022-08-19 14:22:46 +02:00
Pecusx 2e62350165 Mobile tank use fuel - test build 2022-08-19 14:08:52 +02:00
Pecusx e18c9714fd First attempt at mobile tanks 2022-08-19 13:17:14 +02:00
Pirx 38345c3359 check all chars for non-default tank name 2022-08-18 08:58:29 -04:00
Pirx ff1965a402 spaces in 4x4 text fix 2022-08-18 08:43:05 -04:00
Pecusx 39463ed0bb Spaces in tank names #120 2022-08-18 13:48:36 +02:00
Pecusx 316cf9569f "Buy me!" icon 2022-08-18 09:53:46 +02:00
Pecusx 8a3d3ae0a9 New offensive(defensive) weapon - "Buy me!" #97 2022-08-18 09:36:41 +02:00
Pecusx 63adc066da Tanks colors mapping and order from Adam 2022-08-17 20:14:11 +02:00
Pecusx 347635ff99 Real tanks colors from Adam (but order still not) 2022-08-17 19:46:40 +02:00
Pecusx 863d77d872 Correct number of lines in credits 2022-08-17 09:06:56 +02:00
Pecusx 0e9914316b New tester in credits :) 2022-08-16 23:17:51 +02:00
Pecusx a4b3a403b5 0 weapon bug fixed!
It allowed for multiple firing of weapons despite the lack of missiles
2022-08-16 22:53:29 +02:00
Pecusx 069fd55c28 More labels for understanding 2022-08-16 13:42:26 +02:00
Pecusx 1e3cfcf5a1 Funky Bomb fix after Smoke Tracer fix :) 2022-08-16 13:31:59 +02:00
Pecusx 84c4e0dcdd Smoke Tracer fixed! 2022-08-16 11:57:00 +02:00
Pecusx 185ca5db05 Rearranging display.asm and fix for Long Schlong activation :) 2022-08-16 11:29:41 +02:00
Pecusx 86c810d030 Merge branch 'develop' of https://github.com/pkali/scorch_src into develop 2022-08-15 14:34:18 +02:00
Pecusx bccb931433 Purchase/Activate description as constant text
Prepare to new DL (with jumps :) )
2022-08-15 14:33:51 +02:00
Pirx 255c240d7a minor label changes 2022-08-14 23:38:20 -04:00
Pecusx b5ea72ac93 Rest of the screen titles 2022-08-14 17:59:04 +02:00
Pecusx b6bf1532d7 Purchase/Inventory titles added 2022-08-14 17:37:06 +02:00
Pirx 045bdacf65 zpage opt 2022-08-14 11:03:45 -04:00
Pecusx b46b275b66 Inventory song added 2022-08-14 16:44:04 +02:00
Pecusx c413837ffd Activate defensives before round 2022-08-14 15:06:54 +02:00
22 changed files with 2371 additions and 1217 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
.project
*.bak *.bak
scorch.lab scorch.lab
scorch.lst scorch.lst
+193
View File
@@ -0,0 +1,193 @@
# Basic instruction manual:
You can play using the keyboard (all functionality) or the joystick in the first port (all functionality necessary for gameplay).
## 1. Game Option Selection.
On the first screen, you can configure gameplay options:
* number of players (2 - 6) includes both human and computer-controlled players
* the initial amount of cash of each player (2K is the optimal value we chose, but for short games, it is worth choosing a higher value)
* gravity
* maximum wind strength (wind is drawn at the beginning of each round, here you can choose how strong it can be)
* number of rounds in a game
* missile speed (does not affect the flight path - only changes the apparent missile speed - does not change anything in the gameplay itself)
* frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose.
* The height (and undulation) of the mountains from almost flat (NL - Kingdom of the Netherlands), to soaring and high (NP - Federal Democratic Republic of Nepal)
* the way the walls (edges of the screen) work:
1. none - projectiles that flew off the screen do not return
2. wrap - the screen "wraps" and projectiles that flew to the right appear on the left side (and vice versa)
3. bump - the right and left walls deflect projectiles that want to fly through them
4. boxy - just like bump, except that the "ceiling" also reflects projectiles
5. rand - at the beginning of each round, one of the above 4 ways the walls work is drawn.
Translated with www.DeepL.com/Translator (free version)
Select options with cursor keys or joystick.
The [RETURN] key or Joystick button moves to the next screen.
## 2. Entering the name of players and selecting the level of computer-controlled players
The second screen is shown for each player. Here you can use the cursor keys or joystick to select whether the tank will be driven by a human (HUMAN option) or a computer (other options). At the same time, you can enter the name of the selected player from the keyboard.
When you press the [RETURN] key or the joystick button, the screen switches to the next player until the difficulty levels for each player are selected.
If the name is not entered (because, for example, you use a joystick only), it will be supplemented with the default name.
## 3. Shopping screen (before each round)
On this screen, you can make purchases of offensive and defensive weapons. Only those weapons that the player can afford are visible, along with information about the price and the number of units of a given weapon that will be obtained for that price. The information on the screen probably needs no more description. You move through the lists with the cursor keys (up and down) or with the joystick, the [TAB] key or the left arrow or the left joystick tilt change the screen to defensive or offensive weapons, the [SPACE] key or the right arrow and also the joystick to the right does the purchase of the indicated weapon.
The [RETURN] key or the joystick button press switches to the defensive weapon activation screen. Here you can activate previously bought defensive (or offensive after switching with [TAB], etc) weapons. This makes it possible to activate shields and others before the round starts.
Another [RETURN] key or joystick button press switches to the next player's shopping screen.
(For computer players this screen is not shown.)
## 4. The main screen of the game
The status line shows which player is currently allowed to take a shot and a set of other information:
* player's tank name,
* currently selected offensive weapon,
* the player's remaining energy points and if he has an active defensive weapon that has its energy - in parentheses the energy level,
* the angle and the direction of the barrel set by the player,
* the shot strength set by the player (the maximum shot strength is limited by the player's energy - it can not exceed the energy * 10 . This means that you can fire weaker shots only when having a small amount of energy,
* the current round number,
* wind speed and direction,
* in parentheses is the name of the active defensive weapon - if there is any activated by the player.
The keyboard controls here are simple, cursor keys or joystick: left/right - change the angle of the barrel, up/down - change the the force of the shot.
* [SPACE] or joystick button pressed briefly - firing a shot.
* [TAB] - selection of offensive weapons (this option is not available directly with the joystick - you need to select Inventory).
* [I] or longer holding the joystick button - go to Inventory. It is a screen (actually two) with the same layout as the shopping menu, it also works similarly except that here you don't buy weapons, but choose one of the offensive ones to shoot or activate a defensive weapon.
* [A] - go directly to the defensive weapons activation.
* [M] key - disable/enable background music.
* [S] key - disable/enable effect sounds.
* [START] - speed up some game animations.
* [ESC] - during the entire game at any time (unless the computer is playing, then sometimes you have to wait a while) you can press the [ESC] key, which allows you to abort the game and return to the beginning (of course, there is protection against accidental pressing).
* [O] - end the current game and jump to the Game Over screen with a summary.
## 5. Game mechanics
And here's a rundown of the description of how each weapon works, scoring rules, etc:
### First, what we know about tank energy
- Tanks have energy (and Ogres have layers - like an onion) - 99 units at the start of a round.
- Energy of tanks is depleted in 3 ways:
1. one unit after firing each shot,
2. while falling (one pixel down takes 2 units of energy),
3. when a projectile hits a tank or its proximity. The amount of energy subtracted depends on the distance from the center of the explosion and the type/power of the projectile.
### How energy subtraction works (and makes money!)
After each round, the amount of money gained/lost is calculated. This is done on the basis of two variables accumulated by each tank during the round. These variables are:
`gain` - energy "captured" from hit tanks (also when you hit yourself :) and here's the catch, if you have very little energy left it may be profitable to hit yourself with a powerful weapon!
`lose` - energy lost due to explosion/fall (important - the total potential loss of energy is taken into account even if the tank has less at the time of the hit).
In addition, the tank that won the round has a `gain` parameter (captured energy from tanks hit) increased by the energy remaining at the end of the round (because it did not die and should have it - although the survival of the fittest is not guaranteed :) )
Specifically:
### After each round:
`money = money + (2 * (gain + energy))`
`money = money - lose`
`if money < 0 then money = 0`
(at the start of each round `gain` and `lose` have a value of 0)
During a round, if another tank is hit as a result of a shot fired by a tank, the tank firing the shot "gets the energy" taken away from the hit tank.
### For tank firing a shot:
`gain = gain + EnergyDecrease`
### Tank being hit:
`lose = lose + EnergyDecrease`
Where `EnergyDecrease` is the loss of energy due to a hit.
Of course, at the same time, the hit tank loses the amount of energy stored in `EnergyDecrease`, except that here the loss can not exceed the energy held.
Note that the screen representation of money has an extra 0 added at the end so you actually have 10 times more cash than the above calculation shows :)
## How the hit works.
Each weapon that results in an explosion has a radius of fire (`ExplosionRadius`).
After the explosion, every tank in its range loses energy.
The way it works is that the distance of the hit tank from the center of the explosion is calculated, the `ExplosionRadius` reduced by this distance is multiplied by 8 and the result is `EnergyDecrease`.
That is, in the case of hitting a tank centrally:
`EnergyDecrease = ExplosionRadius * 8`
and with each pixel farther from the center, 8 fewer units are lost.
I don't know if it's understandable - I do understand it :)
For example, if a tank is hit centrally with a Baby Missile - it is subtracted 88 units of energy (11 * 8), which also means that when this missile hits at a distance of 12 pixels from the tank - it does not lose energy at all.
And here are the `ExplosionRadius` values for each weapon:
| Weapon | `ExplosionRadius` |
| --- | --- |
| Baby Missile | 11 |
| Missile | 17 |
| Baby Nuke | 25 |
| Nuke | 30 |
| LeapFrog| 17 15 13 |
| Funky Bomb | 21 11 (* 5) |
| MIRV | 17 (* 5) |
| Death's Head | 30 (* 5) |
| Napalm | x 40 (this weapon is different and the distance from the center is not determined, simply any tank within range of the flames loses 40 units of energy - the ExplosionRadius variable is not used) |
| Hot Napalm | x 80 (the same principle as in Napalm) |
| Baby Roller | 11 |
| Roller | 21 |
| Heavy Roller | 30 |
| Riot Charge | 31 |
| Riot Blast | 0 (in reality - 61 but with these weapons it is not taken into account when counting energy loss only the width of the ground to fall) |
| Riot Bomb | 17 |
| Heavy Riot Bomb | 29 |
| Baby Digger | 0 (60 - as in Riot Blast) |
| Digger | 0 (60 - as above) |
| Heavy Digger | 0 (60 - as above) |
| Baby Sandhog | 0 (60 - as above) |
| Sandhog | 0 (60 - as above) |
| Heavy Sandhog | 0 (60 - as above) |
| Dirt Clod | 12 |
| Dirt Ball | 22 |
| Ton of Dirt | 31 |
| Liquid Dirt | 0 (maybe it's worth changing?) |
| Dirt Charge | 0 (61 - as above) |
| Laser | x 100 (but here it is also different - equally 100 only in the case of a direct hit, the `ExplosionRadius` variable is not used, so there is no multiplication by 8 - we simply subtract 100 units of energy - that is, the tank always dies).|
The big points received by the player are the number of tanks that died earlier than him. If any of the other tanks capitulated earlier (White Flag) is not added to those that died and does not give points.
Only these points determine the order in the summary
## 6. And now defensive weapons:
* **White Flag** - causes the surrender of the player (can sometimes be useful in a hopeless situation). The advantage is that by surrendering you don't give a big point to your opponents and don't cause one of them to gain by killing us, you also limit the loss of your energy and also cash. An important note - this is the only defensive weapon that can be deactivated. All you have to do is re-enter inventory and once again select its activation.
* **Battery** - when activated, it recharges the tank's energy to full (99 units) and at the same time is the only defensive weapon that does not deactivate other defensive weapons when used.
* **Hovercraft** - a weapon that allows the tank to move. It has its own fuel supply in form of electric eels and in addition, it can be activated multiple times during the same turn, and after using it, you can activate another defensive weapon and fire a shot in the same turn. After using it, the tank rises above the mountains and using the cursor keys or a joystick you can move the tank to a new position. [SPACE] or the joystick button cause the tank to land in a new place. You can fly until the tank runs out of eels (presented on the status bar like the energy of a defensive weapon), if the eel fuel runs out the tank will fall down on its own. It is not possible to land on other tanks.
* **Parachute** - does not protect against loss of energy due to a neighboring explosion, makes you not lose energy during ONE fall. After such a fall, it deactivates and a new parachute must be activated.
* **Shield** - the simplest shield works exactly the opposite of **Parachute**, it does not protect against energy loss while falling, instead it protects against energy loss caused by ONE adjacent explosion. It protects once, no matter how strong the explosion is (whether it's just a "scratch" or a direct hit with a nuke), and deactivates immediately afterward.
* **Heavy Shield** - a shield with its own energy (at the start of 99 units), it works the same as **Shield** (does not protect against falling) with the exception that it has its own energy resource. When exploding, the energy of this shield is reduced first, and if it reaches 0, the shield deactivates and further reduces the tank's energy. Due to this action, a tank with this type of shield can be "killed" by undermining it, because falling reduces the energy of the tank and not the shield.
* **Force Shield** - the strongest shield - works just like Heavy Shield only that it is combined with **Parachute**. What is important in this case, falling does not take energy away from the shield or the tank. It is only taken away by hits.
* **Bouncy Castle** - a passive-aggressive weapon :) . It works as follows. In case of a direct hit on the tank (and cover), it causes the projectile to "bounce" in the opposite direction with the same force with which it was fired. In the absence of wind and a difference in level, the weapon then hits the tank that fired it. After such a bounce, it deactivates. As the weapon reacts in this way only to precise hits, it is also a shield that corresponds to the action of **Heavy Shield** and has 99 units at the start (you will probably have to rethink this value and give a smaller one here).
* **Mag Deflector** - the second passive-aggressive weapon :) . In case of a direct hit on a tank (and shield), it causes the hit point to move randomly to the left or right side of the protected tank, but not very far, so you can get "shrapnel" with stronger weapons. As in the case of **Bouncy Castle**, it is also a shield that corresponds to the action of **Heavy Shield** and has 99 units at the start (probably here we will have also to rethink this value and give a smaller one).
* **Nuclear Winter** - adds nothing, takes nothing away :) - in fact, it is not so much a defensive weapon as a double-edged one. It floods the area with "radioactive" fallout, which is ordinary soil. If you do not have at hand any weapon that digs up the terrain, and for that a shield (preferably disposable), then after such "fallout" you will have to shoot yourself - because being underground is otherwise impossible. Alternatively, **White Flag** always remains.
* **Long Schlong** - a special weapon :) - Costs a lot, doesn't really help with anything (except possibly digging yourself out but only when slightly buried but it has a cool name and looks cool :) - It can be activated independently of other defensive weapons and remains active until the end of the round (it cannot be deactivated).
Due to the different operations of **MIRV** weapons, **Bouncy Castle** and **Mag Deflector** only use the shielding function when hit by these weapons.
In addition, none of the shields protect against **Napalm**. **Bouncy Castle** or **Mag Deflector** on a direct hit will deflect it or carry it past, but just hit very close to a tank and its shield will not work.
**White Flag**, **Hovercraft** and **Nuclear Winter** weapons, when selected, require activation, this is accomplished by "firing a shot" after the selection of that weapon. Of course, the shot of the offensive weapon is then not fired, but only the selected defensive weapon is activated.
You can only have one defensive weapon active at a time (except **Long Schlong** of course :) ). You can always change the decision and activate another defensive weapon or deactivate **White Flag** before firing.
And of course, activating a weapon when you already have some other weapon activated causes the loss of the previous one (no returns :) ).
## 7. "Other" weapons:
* **Buy me!** - this 'weapon' cannot be used in gameplay. Buying it draws one of the offensive or (more rarely) defensive weapons and adds it to the player's arsenal. It is a lottery in which you can lose (if you draw a weapon cheaper than the "Buy Me!" price) but also gain. You can get a weapon otherwise not affordable at all!
+188
View File
@@ -0,0 +1,188 @@
# Podstawowa instrukcja:
Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce).
## 1. Wybór opcji gry.
Na pierwszym ekranie możemy skonfigurować opcje rozgrywwki:
* ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer
* początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, jecz przy krótkich rozgrywkach warto wybrać większą wartość)
* grawitacja
* maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund, tu możemy wybrać jak silny może być)
* liczba rozgrywanych rund
* szybkość lotu pocisków (nie ma wpływu na tor lotu - zmienia jedynie widoczną prędkość rysowania - nie zmienia nic w samej rozgrywce)
* częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania.
* wysokość (i pofałdowanie) gór od prawie płaskich (NL - Królestwo Niderlandów), do strzelistych i wysokich (NP - Federalna Demokratyczna Republika Nepalu)
* sposób działania ścian (krawędzi ekranu):
1. none - pociski, które wyleciały poza ekran nie wracają
2. wrap - ekran "zawija się" i pociski, które wyleciały w prawo pojawiają się z lewej strony (i odwrotnie)
3. bump - prawa i lewa ściana odbijają pociski, które chcą przez nie przelecieć
4. boxy - tak jak bump, tyle że "sufit" także odbija pociski
5. rand - na początku każdej rundy losowany jest jeden z 4 powyższych sposobów działania ścian
Wybór opcji klawiszami kursora lub joystickiem.
Klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu.
## 2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer
Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joysticjiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też kompute (pozostałe opcje). Jednocześnie z klawiatury można wprowadzić nazwę wybranego gracza.
Po naciśnięciu klawisza [RETURN] lub przycisku Joysticka ekran przechodzi na następnego gracza aż zostaną wybrane poziomy trudności dla każdego z nich.
Jeśli nazwa nie zostanie wpisana (bo np operujemy wyłącznie joystickiem), to zostanie uzupełniona nazwą domyślną.
## 3. Ekran zakupów (przed każdą rundą)
Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni.
Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych.
Na ekranie tym można aktywować zakupione wcześniej bronie defensywne czy też ofensywne. Obsługiwany jest identycznie jak ekran zakupów, jednak [SPACJA] lub strzałka w prawo a także joystick w prawo realizują aktywacje wskazanej broni. Umożliwia to aktywowanie osłon jeszcze przed rozpoczęciem rundy.
Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza.
(oczywiście dla graczy komputerowych ten ekran się nie pojawia)
## 4. Główny ekran gry
W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji:
* nazwa czołgu gracza
* wybrana aktualnie broń ofensywna
* pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób
* ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia
* ustawiona przez gracza siła strzału (maksymalna siła strzału jest ograniczana przez energię gracza - nie może przekroczyć energii * 10 . Oznacza to, że mając małą ilość energii możemy oddać słabsze strzały
* numer aktualnej rundy rozgrywki
* prędkość i kierunek wiatru
* w nawiasie nazwę aktywnej broni defensywnej - jeśli jest jakaś aktywowana przez gracz
Tutaj klawiszologia jest prosta, klawisze kursora lub joystick: lewo/prawo - zmiana kąta nachylenia lufy, góra/dół - zmiana ustawienia siły strzału.
* [SPACJA] lub przycisk joysticka naciśnięte krótko - oddanie strzału
* [TAB] - wybór broni ofensywnej (ta opcja nie jest dostępna bezpośrednio joystickiem - trzeba wybrać Inventory)
* Klawisz [I] lub dłuższe przytrzymanie przycisku joysticka - przejście do Inventory (aktywacji broni). Inventory to ekran (a w zasadzie dwa) bliźniaczo podobny do ekranu zakupów. Zasady poruszania się są identyczne z tym, że tu nie kupujemy broni, ale wybieramy jedną z ofensywnych, którą będziemy strzelać lub aktywujemy broń defensywną.
* Klawisz [A] - bezpośrednie przejście na ekran Inventory aktywacji broni defensywnych.
* Klawisz [M] - wyłączenie/włączenie muzyki w tle
* Klawisz [S] - wyłączenie/włączenie dźwięków efektów.
* Klawisz [O] - wymuszenie zakończenia gry (Game Over). W podsumowaniu wyników nie jest brana pod uwagę przerwana właśnie runda rozgrywki, a wyłącznie rundy zakończone wcześniej. Odpowiada to wciśnięciu klawisza [ESC] z tą różnicą, że wyświetlane jest podsumowanie oraz creditsy.
* [ESC] - w czasie całej gry w dowolnym momencie (chyba że akurat gra komputer, wtedy czasem trzeba chwilę poczekać) można nacisnąć klawisz [ESC], który umożliwia przerwanie gry i powrót na początek (oczywiście jest zabezpieczenie przed przypadkowym naciśnięciem).
## 5. Zasady gry
A tutaj zręby opisu działania poszczególnych broni, zasad punktacji itp:
### Najpierw co wiemy o energii czołgów
- Czołgi mają energię (a Ogry warstwy - jak cebula) - na starcie 99 jednostek
- Energii czołgom ubywa na 3 sposoby:
1. jedna jednostka po oddaniu każdego strzału
2. w czasie spadania (jeden piksel w dół 2 jednostki)
3. w chwili trafienia w czołg lub obok niego jakiegoś pocisku - i tu ilość odejmowanej energii zależy od odległości od centrum eksplozji i typu/siły rażenia pocisku.
### Jak działa odejmowanie energii (i zarabianie kasy!)
Po każdej rundzie wyliczana jest ilość zdobytych/straconych pieniędzy robione jest to na podstawie dwóch zmiennych gromadzonych przez każdy z czołgów w trakcie rundy. Te zmienne to:
`gain` - energia "przechwycona" od trafionych czołgów (także jeśli trafimy w samego siebie :) i tu haczyk, jeśli pozostało nam bardzo mało energii opłacalne może być trafienie w siebie mocną bronią!
`lose` - energia stracona w wyniku eksplozji/upadku (i tu ważne liczona jest całkowita utrata energii nawet jeśli czołg ma w chwili trafienia mniej).
Dodatkowo czołg który wygrał rundę ma parametr gain (przechwyconej od trafionych czołgów energii) zwiększany o pozostałą mu na koniec rundy energię (bo nie zginął i powinien ją mieć - choć bywa też inaczej :) )
Konkretnie:
### Po każdej rundzie:
`money = money + (2 * (gain+energy))`
`money = money - lose`
`if money <0 then money=0`
(na starcie każdej rundy `gain` i `lose` mają wartość 0)
W czasie rundy, jeśli w wyniku strzału oddanego przez czołg inny czołg zostanie trafiony, czołg oddający strzał "dostaje energię" zabraną czołgowi trafionemu.
### czołg oddający strzał:
`gain = gain + EnergyDecrease`
### czołg trafiony:
`lose = lose + EnergyDecrease`
gdzie `EnergyDecrease` to utrata energii w wyniku trafienia.
Oczywiście jednocześnie trafiony czołg traci ilość energii zapisaną w `EnergyDecrease`, z tym że tutaj strata nie może przekroczyć posiadanej energii.
Uwaga! Ekranowa reprezentacja pieniędzy ma na końcu dopisane dodatkowe 0 więc faktyczne mamy 10 razy więcej kasy niż wynika z powyższych obliczeń :)
## Jak działa trafienie.
Każda broń, która skutkuje eksplozją, ma swój promień rażenia (`ExplosionRadius`).
Po eksplozji każdy czołg w jej zasięgu traci energię.
Działa to tak, że obliczana jest odległość trafianego czołgu od centrum eksplozji, zmniejszony o tę odległość ExplosionRadius jest mnożony przez 8 i w wyniku otrzymujemy `EnergyDecrease`.
Czyli w przypadku trafienia centralnie w czołg:
`EnergyDecrease = ExplosionRadius * 8`
a z każdym pikselem dalej od centrum ubywa o 8 jednostek mniej.
Nie wiem czy to zrozumiałe - ja rozumiem :)
Przykładowo, jeśli czołg zostanie trafiony centralnie przy pomocy Baby Missile - odejmowane jest mu 88 jednostek energii (11 * 8), co także oznacza, że przy trafieniu tym pociskiem w odległości 12 pikseli od czołgu - nie traci on energii wcale.
A oto wartości promienia rażenia (ExplosionRadius) dla poszczególnych broni:
| Weapon | `ExplosionRadius` |
| --- | --- |
| Baby Missile | 11 |
| Missile | 17 |
| Baby Nuke | 25 |
| Nuke | 30 |
| LeapFrog| 17 15 13 |
| Funky Bomb | 21 11 (* 5) |
| MIRV | 17 (* 5) |
| Death's Head | 30 (* 5) |
| Napalm | x 40 (ta broń jest inna i nie jest wyznaczana odległość od centrum, po prostu każdy czołg znajdujący się w zasięgu płomieni traci 40 jednostek energii - zmienna ExplosionRadius nie jest używana) |
| Hot Napalm | x 80 (zasada taka jak w Napalm) |
| Baby Roller | 11 |
| Roller | 21 |
| Heavy Roller | 30 |
| Riot Charge | 31 |
| Riot Blast | 0 (tak na prawdę - 61 ale przy tych broniach nie jest brana pod uwagę przy liczeniu ubytku energii tylko szerokości gruntu do opadnięcia) |
| Riot Bomb | 17 |
| Heavy Riot Bomb | 29 |
| Baby Digger | 0 (60 - jak w Riot Blast) |
| Digger | 0 (60 - jak wyżej) |
| Heavy Digger | 0 (60 - jak wyżej) |
| Baby Sandhog | 0 (60 - jak wyżej) |
| Sandhog | 0 (60 - jak wyżej) |
| Heavy Sandhog | 0 (60 - jak wyżej) |
| Dirt Clod | 12 |
| Dirt Ball | 22 |
| Ton of Dirt | 31 |
| Liquid Dirt | 0 (może warto to zmienić?) |
| Dirt Charge | 0 (61 - jak wyżej) |
| Laser | x 100 (ale tu także jest inaczej - równo 100 tylko w przypadku bezpośredniego trafienia, zmienna ExplosionRadius nie jest używana, więc nie ma mnożenia przez 8 - po prostu odejmujemy 100 jednostek energii - czyli czołg zawsze ginie).|
Duże punkty otrzymane przez gracza to ilość czołgów, które zginęły wcześniej niż on. Jeśli któryś z innych czołgów skapitulował wcześniej (Biała Flaga) nie jest doliczany do tych które zginęły i nie daje punktów.
Tylko te punkty decydują o kolejności w podsumowaniu
## 6. A teraz bronie defensywne:
* **White Flag** - powoduje poddanie gracza (może czasem przydać się w sytuacji beznadziejnej). Zaletą jest to, że poddając się nie dajemy dużego punktu przeciwnikom i nie powodujemy, że któryś zyska na tym, że nas zgładzi, ograniczamy też stratę swojej energii czyli także kasy. I tu także ważna uwaga - to jedyna broń defensywna, którą można deaktywować. Wystarczy ponownie wejść do inventory i jeszcze raz wybrać jej aktywację.
* **Battery** - w momencie aktywacji doładowuje energię czołgu do pełna (99 jednostek) i jednocześnie jest to jedyna broń defensywna, która nie deaktywuje innych broni defensywnych w przypadku jej użycia.
* **Hovercraft** - broń umożliwiająca przemieszczanie się czołgu. Posiada własny zasób paliwa a dodatkowo może być aktywowana wielokrotnie w czasie tej samej tury, a po jej użyciu możemy w tej samej turze aktywować inną broń defensywną i oddać strzał. Po jej użyciu czołg uniesie się ponad góry i za pomocą klawiszy kursora lub joysticka: lewo/prawo możemy przemieścić czołg na nową pozycję a [SPACJA] lub przycisk joysticka powodują wylądowanie czołgu w nowym miejscu. Latać można do chwili skończenia się "paliwa" (prezentowanego na pasku statusu tak jak energia broni defensywnej), jeśli paliwo się skończy czołg opadnie samodzielnie. Nie da się lądować na innych czołgach.
* **Parachute** - nie chroni przed ubytkiem energii z powodu sąsiedniej eksplozji, powoduje że nie ubywa energii w czasie JEDNEGO spadania. Po takim upadku deaktywuje się i trzeba aktywować nowy spadochron.
* **Strong Parachute** - spadochron z własną energią (na starcie 99 jednostek), działa tak samo jak Parachute (nie chroni przed eksplozjami) ma za to swój własny zasób energii przy spadaniu w pierwszej kolejności zmniejszana jest energia tego spadochronu (1 jednostka na jeden pixel opadania - inaczej niż czołg!) i jeśli dojdzie ona do 0 to spadochron deaktywuje się i dalej zmniejszana jest energia czołgu (tutaj już standardowo - 2 jednoski na jeden pikxel).
* **Shield** - najprostsza osłona działa dokładnie przeciwnie niż Parachute, nie chroni przed ubytkiem energii w czasie spadania, chroni za to przed ubytkiem energii spowodowanym JEDNĄ sąsiednią eksplozją. Chroni jednorazowo, bez znaczenia jak silna jest eksplozja (czy jest to tylko "draśnięcie", czy też bezpośrednie trafienie atomówką) i od razu po niej deaktywuje się.
* **Heavy Shield** - osłona z własną energią (na starcie 99 jednostek), działa tak samo jak Shield (nie chroni przed upadkiem) z tym wyjątkiem, że ma własny zasób energii. Przy eksplozji w pierwszej kolejności zmniejszana jest energia tej osłony i jeśli dojdzie ona do 0 to osłona deaktywuje się i dalej zmniejszana jest energia czołgu. W związku z takim działaniem, czołg z tym typem osłony można "zabić" podkopując go, bo spadanie zmniejsza energię czołgu a nie osłony.
* **Force Shield** - najmocniejsza osłona - działa tak jak Heavy Shield tyle że połączona z Parachute. Co ważne w jej przypadku upadek nie zabiera energii osłonie ani czołgowi. Zabierają ją tylko trafienia.
* **Bouncy Castle** - broń agresywna :) . Działa następująco. W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje "odbicie" pocisku w przeciwnym kierunku z tą samą siłą z jaką był wystrzelony. W przypadku braku wiatru i różnicy poziomów broń trafia wtedy w czołg, który ją wystrzelił. Po takim odbiciu deaktywuje się. W związku z tym, że broń ta reaguje w ten sposób tylko na precyzyjne trafienia, jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie trzeba będzie przemyśleć tę wartość i dać tu mniejszą).
* **Mag Deflector** - druga broń agresywna :) . W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje przesunięcie punktu trafienia losowo w lewo lub prawą stronę chronionego czołgu, ale niezbyt daleko, więc można dostać "odłamkiem" przy silniejszej broni. Tak jak w przypadku Bouncy Castle jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie i tutaj trzeba będzie przemyśleć tę wartość i dać mniejszą).
* **Nuclear Winter** - nic nie dodaje, nic nie zabiera :) - w zasadzie to broń nie tyle defensywna co obosieczna. Zasypuje teren opadem "radioaktywnym", który jest zwyczajną glebą. Jeśli nie mamy pod ręką żadnej broni odkopującej teren i do tego osłony (najlepiej jednorazowej), to po takim "opadzie" będzie trzeba strzelić do siebie - bo będąc pod ziemią inaczej się nie da. Ewentualnie pozostaje zawsze White Flag.
* **Long Schlong** - broń specjalna :) - kosztuje dużo, nie bardzo w czymkolwiek pomaga (poza ewentualnym odkopaniem się ale tylko przy niewielkim przysypaniu ale fanie się nazywa i wygląda :) - Można ją aktywować niezależnie od innych broni defensywnych i pozostaje aktywna do końca rundy (nie da się jej deaktywować).
W związku z odmiennym działaniem broni **MIRV**, **Bouncy Castle** i **Mag Deflector** wykorzystują tylko funkcję osłony przy trafieniu tą bronią.
Dodatkowo, żadna z osłon nie chroni przed Napalmem. Auto Defense czy Mag Deflector przy bezpośrednim trafieniu odbije je lub przeniesie obok, ale wystarczy trafić bardzo blisko czołgu i nie zadziała jego osłona.
Bronie **White Flag**, **Hovercraft** i **Nuclear Winter** po aktywacji wymagają uruchomienia, jest to realizowanie przez "oddanie strzału" po aktywacji tej broni. Oczywiście strzał bronią ofensywną nie jest wtedy oddawany, a jedynie uruchamiana jest wybrana broń defensywna.
Można mieć aktywną tylko jedną broń defensywną w danej chwili (za wyjątkiem **Long Schlong** oczywiście :) ). Zawsze przed oddaniem strzału możemy zmienić decyzję i aktywować inną broni defensywną czy też dezaktywować **White Flag**.
Oczywiście aktywacja broni w momencie kiedy mamy już aktywowaną jakąś inną powoduje utratę tej poprzedniej (nie ma zwrotów :) ).
## 7. Bronie 'inne' :) :
* **Buy me!** - tej 'broni' nie można używać w rozgrywce. Jej zakup powoduje wylosowanie jesdnej z broni ofensywnych lub (żadziej) defensywnych i dodanie jej do arsenału gracza. Jest to loteria w której można stracić (jeśli wylosuje się broń tańsza niż cena **Buy Me!** ale też zyskać. Jeśli wylosuje się broń dużo droższa możemy otrzymać do dyspozycji broń, na którą nie było nas stać!
+40 -2
View File
@@ -19,7 +19,7 @@ QA: Probabilitydragon, KrzysRog, Beeblebrox, EnderDude, lopezpb, Dracon, brad-co
You can contact us via [AtariAge](https://atariage.com) or [AtariOnLine](https://atarionline.pl) forums. You can contact us via [AtariAge](https://atariage.com) or [AtariOnLine](https://atarionline.pl) forums.
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). This source code was originally compiled with [OMC65 crossassembler](https://github.com/pkali/omc65) and on 2012-06-21 translated to [mads](https://github.com/tebe6502/Mad-Assembler).
Compilation: `mads scorch.asm -o:scorch.xex` Compilation: `mads scorch.asm -o:scorch.xex`
@@ -44,10 +44,48 @@ Originally most variables were in Polish, comments were sparse, but we wanted to
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. Because of being always short of time/energy (to finish the game) we decided it must go in 'English' to let other people work on it.
It never happened, but we got some encouraging comments and we are still trying to do something from time to time. It never happened, but we got some encouraging comments and we are still trying to do something from time to time.
With the advent of fujinet (https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see. With the advent of [fujinet](https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see.
## Changes: ## Changes:
###### Version 1.11
2022-08-22
A release lollapalooza.
The silliness indicator crashed. What are we doing?
Changes:
* A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values.
* Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change.
###### Version 1.10
2022-08-21
My hovercraft is full of eels.
This release brings a swath of gameplay updates and a generous dose of a new silliness.
[English](https://github.com/pkali/scorch_src/blob/master/MANUAL_EN.md) and [Polish](https://github.com/pkali/scorch_src/blob/master/MANUAL_PL.md) language manual drafts are available in the repository. Please help us with the English one as we are not native speakers.
Version number bump reflects number of unreleased versions and amount of changes.
Changes:
* Defensive weapons can be activated before the round to make for the unbeatable aiming precision of the robotanks.
* Fixed bug with Long Schlong activation taking one Schlong too many.
* Smoke Tracer not disappearing smoke fixed.
* Bug allowing for infinite shooting outside the screen fixed.
* Tank colors and P/M sequence as devised by Adam, the gfx artist. Tanks differ more and look better. https://github.com/pkali/scorch_src/issues/119
* New item in the shop - loot box "Buy me!" with a surprise inside. https://github.com/pkali/scorch_src/issues/97
* Tank names can have s p a c e s now! https://github.com/pkali/scorch_src/issues/120
* Tanks are mobile now thanks to the new defensive option - Hovercraft https://github.com/pkali/scorch_src/issues/52
* Main atari library switched to a more standard version based on Mapping the Atari
* Huge memory optimizations to allow for the new features.
* Narrow screen in shop / inventory (many bytes saved).
* Explosion range corrections for a rare event of non-lethal Nuke explosions.
* Pressing [A] jumps into defensive weapons activation directly.
* Elusive randomize force error causing rare hangups for Tosser fixed.
* Activation of defensive weapons moved to front.
* Additional SFX for new weapons.
###### Version 1.00 ###### Version 1.00
2022-08-13 2022-08-13
+42 -42
View File
@@ -4,6 +4,8 @@
/***************************************/ /***************************************/
;icl "Scorch50.h" ;icl "Scorch50.h"
;icl "../lib/ATARISYS.ASM"
;icl "../lib/macro.hea"
; --- dmsc LZSS player routine on zero page ; --- dmsc LZSS player routine on zero page
org $80 org $80
@@ -64,8 +66,6 @@ song_data
ins 'mmm_16.lzs' ins 'mmm_16.lzs'
song_end song_end
POKEY = $D200
buffers buffers
.ds 256 * 9 .ds 256 * 9
@@ -216,7 +216,7 @@ main
ift USESPRITES ift USESPRITES
mva >pmg pmbase ;missiles and players data address mva >pmg pmbase ;missiles and players data address
mva #$03 pmcntl ;enable players and missiles mva #$03 GRACTL ;enable players and missiles
eif eif
lda:cmp:req $14 ;wait 1 frame lda:cmp:req $14 ;wait 1 frame
@@ -228,13 +228,13 @@ main
;mwa #NMI $fffa ;new NMI handler ;mwa #NMI $fffa ;new NMI handler
sta colbaks sta COLOR4
lda #$0E lda #$0E
sta colpf1s sta COLOR1
lda #$84 lda #$84
sta colpf2s sta COLOR2
lda #$0E lda #$0E
sta colpf3s sta COLOR3
lda #$02 lda #$02
@@ -267,7 +267,7 @@ stop
cli cli
vmain sysvbv,6 vmain sysvbv,6
mva #$00 pmcntl ;PMG disabled mva #$00 GRACTL ;PMG disabled
tax tax
sta:rne hposp0,x+ sta:rne hposp0,x+
@@ -408,7 +408,7 @@ x16 lda #$4A
sta hposp1 sta hposp1
c10 lda #$D4 c10 lda #$D4
sta wsync ;line=133 sta wsync ;line=133
sta color2 sta colpf2
s8 lda #$C3 s8 lda #$C3
x17 ldx #$5A x17 ldx #$5A
sta wsync ;line=134 sta wsync ;line=134
@@ -464,7 +464,7 @@ c13 ldy #$02
sta wsync ;line=157 sta wsync ;line=157
c14 lda #$04 c14 lda #$04
sta wsync ;line=158 sta wsync ;line=158
sta color0 sta colpf0
DLINEW dli7 1 1 1 DLINEW dli7 1 1 1
dli7 dli7
@@ -497,7 +497,7 @@ c16 ldx #$0E
c17 lda #$0A c17 lda #$0A
c18 ldx #$34 c18 ldx #$34
sta wsync ;line=188 sta wsync ;line=188
sta color1 sta colpf1
stx colpm3 stx colpm3
s13 lda #$43 s13 lda #$43
x23 ldx #$49 x23 ldx #$49
@@ -507,47 +507,47 @@ x23 ldx #$49
c19 lda #$08 c19 lda #$08
c20 ldx #$34 c20 ldx #$34
sta wsync ;line=190 sta wsync ;line=190
sta color1 sta colpf1
stx colpm2 stx colpm2
sta wsync ;line=191 sta wsync ;line=191
c21 lda #$0A c21 lda #$0A
sta wsync ;line=192 sta wsync ;line=192
sta color1 sta colpf1
c22 lda #$08 c22 lda #$08
sta wsync ;line=193 sta wsync ;line=193
sta color1 sta colpf1
c23 lda #$0A c23 lda #$0A
sta wsync ;line=194 sta wsync ;line=194
sta color1 sta colpf1
c24 lda #$34 c24 lda #$34
sta wsync ;line=195 sta wsync ;line=195
sta color2 sta colpf2
c25 lda #$0C c25 lda #$0C
sta wsync ;line=196 sta wsync ;line=196
sta color1 sta colpf1
c26 lda #$0A c26 lda #$0A
sta wsync ;line=197 sta wsync ;line=197
sta color1 sta colpf1
c27 lda #$0C c27 lda #$0C
sta wsync ;line=198 sta wsync ;line=198
sta color1 sta colpf1
sta wsync ;line=199 sta wsync ;line=199
sta wsync ;line=200 sta wsync ;line=200
c28 lda #$0E c28 lda #$0E
sta wsync ;line=201 sta wsync ;line=201
sta color1 sta colpf1
c29 lda #$0C c29 lda #$0C
sta wsync ;line=202 sta wsync ;line=202
sta color1 sta colpf1
c30 lda #$0E c30 lda #$0E
sta wsync ;line=203 sta wsync ;line=203
sta color1 sta colpf1
c31 lda #$0C c31 lda #$0C
sta wsync ;line=204 sta wsync ;line=204
sta color1 sta colpf1
c32 lda #$0E c32 lda #$0E
sta wsync ;line=205 sta wsync ;line=205
sta color1 sta colpf1
DLINEW dli16 1 1 1 DLINEW dli16 1 1 1
dli16 dli16
@@ -557,13 +557,13 @@ dli16
sta wsync ;line=209 sta wsync ;line=209
c33 lda #$0C c33 lda #$0C
sta wsync ;line=210 sta wsync ;line=210
sta color1 sta colpf1
c34 lda #$0E c34 lda #$0E
sta wsync ;line=211 sta wsync ;line=211
sta color1 sta colpf1
c35 lda #$0C c35 lda #$0C
sta wsync ;line=212 sta wsync ;line=212
sta color1 sta colpf1
DLINEW dli9 1 0 0 DLINEW dli9 1 0 0
dli9 dli9
@@ -574,15 +574,15 @@ dli9
c36 ldx #$0A c36 ldx #$0A
sta wsync ;line=216 sta wsync ;line=216
sta chbase sta chbase
stx color1 stx colpf1
c37 lda #$0C c37 lda #$0C
sta wsync ;line=217 sta wsync ;line=217
sta color1 sta colpf1
c38 lda #$0A c38 lda #$0A
x24 ldx #$9D x24 ldx #$9D
c39 ldy #$34 c39 ldy #$34
sta wsync ;line=218 sta wsync ;line=218
sta color1 sta colpf1
stx hposm1 stx hposm1
sty colpm1 sty colpm1
s14 lda #$03 s14 lda #$03
@@ -594,7 +594,7 @@ c40 lda #$08
s15 ldx #$13 s15 ldx #$13
x26 ldy #$45 x26 ldy #$45
sta wsync ;line=220 sta wsync ;line=220
sta color1 sta colpf1
stx sizem stx sizem
sty hposm2 sty hposm2
s16 lda #$03 s16 lda #$03
@@ -612,8 +612,8 @@ x29 ldy #$79
c41 lda #$06 c41 lda #$06
c42 ldx #$00 c42 ldx #$00
sta wsync ;line=223 sta wsync ;line=223
sta color1 sta colpf1
stx color2 stx colpf2
lda >fnt+$400*$01 lda >fnt+$400*$01
s18 ldx #$50 s18 ldx #$50
x30 ldy #$44 x30 ldy #$44
@@ -624,15 +624,15 @@ x30 ldy #$44
sta wsync ;line=225 sta wsync ;line=225
c43 lda #$08 c43 lda #$08
sta wsync ;line=226 sta wsync ;line=226
sta color1 sta colpf1
c44 lda #$0C c44 lda #$0C
sta wsync ;line=227 sta wsync ;line=227
sta color1 sta colpf1
sta wsync ;line=228 sta wsync ;line=228
sta wsync ;line=229 sta wsync ;line=229
c45 lda #$0E c45 lda #$0E
sta wsync ;line=230 sta wsync ;line=230
sta color1 sta colpf1
DLINEW dli10 1 1 1 DLINEW dli10 1 1 1
dli10 dli10
@@ -699,15 +699,15 @@ VBL
c0 lda #$00 c0 lda #$00
sta colbak sta colbak
c1 lda #$0E c1 lda #$0E
sta color1 sta colpf1
c2 lda #$84 c2 lda #$84
sta color2 sta colpf2
c3 lda #$0E c3 lda #$0E
sta color3 sta colpf3
lda #$02 lda #$02
sta chrctl sta CHACTL
lda #$01 lda #$01
sta gtictl sta PRIOR
sta sizep0 sta sizep0
s0 lda #$03 s0 lda #$03
sta sizem sta sizem
@@ -741,7 +741,7 @@ x6 lda #$A4
x7 lda #$A6 x7 lda #$A6
sta hposm1 sta hposm1
c8 lda #$00 c8 lda #$00
sta color0 sta colpf0
mwa #DLI.dli_start dliv ;set the first address of DLI interrupt mwa #DLI.dli_start dliv ;set the first address of DLI interrupt
+2 -2
View File
@@ -1,11 +1,11 @@
STEREOMODE equ 0 STEREOMODE equ 0
;* --------BEGIN-------- ;* --------BEGIN--------
;* C:\Atari\rmt\rmt128\schorch_str2.rmt ;* C:\Atari\rmt\rmt128\scorch_str4.rmt
FEAT_SFX equ 1 FEAT_SFX equ 1
FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable
FEAT_NOSTARTINGSONGLINE equ 0 FEAT_NOSTARTINGSONGLINE equ 0
FEAT_INSTRSPEED equ 1 FEAT_INSTRSPEED equ 1
FEAT_CONSTANTSPEED equ 0 ;(19 times) FEAT_CONSTANTSPEED equ 0 ;(21 times)
FEAT_COMMAND1 equ 1 ;(18 times) FEAT_COMMAND1 equ 1 ;(18 times)
FEAT_COMMAND2 equ 0 ;(0 times) FEAT_COMMAND2 equ 0 ;(0 times)
FEAT_COMMAND3 equ 0 ;(0 times) FEAT_COMMAND3 equ 0 ;(0 times)
Binary file not shown.
Binary file not shown.
+5
View File
@@ -1,4 +1,5 @@
.proc talk .proc talk
; Maximum text length is 63 characters!!!
L0 dta d"IN TIMES OF TROUBLE, GO WITH WHAT YOU KNOW." L0 dta d"IN TIMES OF TROUBLE, GO WITH WHAT YOU KNOW."
L1 dta d"DIE!" L1 dta d"DIE!"
L2 dta d"EAT MY SHORTS!" L2 dta d"EAT MY SHORTS!"
@@ -126,3 +127,7 @@ OffensiveTextTableH
NumberOfOffensiveTexts=54 NumberOfOffensiveTexts=54
NumberOfDeffensiveTexts=60 NumberOfDeffensiveTexts=60
.endp .endp
hoverFull dta d"MY HOVERCRAFT IS FULL OF EELS!", $ff
hoverFullEnd
hoverEmpty dta d"RUNNING OUT OF EELS", $ff
hoverEmptyEnd
+36 -29
View File
@@ -4,7 +4,7 @@
; initial values for some variables ; initial values for some variables
initialvaluesStart initialvaluesStart
I_OptionsTable .by 0,1,2,2,0,1,3,2 I_OptionsTable .by 0,1,2,2,0,1,3,2,0
I_RoundsInTheGame .by 10 ;how many rounds in the current game I_RoundsInTheGame .by 10 ;how many rounds in the current game
I_seppukuVal .by 75 I_seppukuVal .by 75
I_mountainDeltaH .by 3 I_mountainDeltaH .by 3
@@ -21,8 +21,11 @@ initialvaluesCount = *-initialvaluesstart ; MAX 128 bytes !
;=================================================================================== ;===================================================================================
;==========================CONSTANT TABLES, do not erase!=========================== ;==========================CONSTANT TABLES, do not erase!===========================
;=================================================================================== ;===================================================================================
TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$de TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed
TankStatusColoursTable .BYTE $54,$24,$94,$c4,$74,$d4 ;TankStatusColoursTable .BYTE $54,$24,$92,$c4,$74,$e4 ; standard order
;TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3
TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order
TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3
TankShapesTable .BYTE char_tank1___________,char_tank2___________,char_tank3___________ TankShapesTable .BYTE char_tank1___________,char_tank2___________,char_tank3___________
.BYTE char_tank1___________,char_tank2___________,char_tank3___________ .BYTE char_tank1___________,char_tank2___________,char_tank3___________
dliColorsBack dliColorsBack
@@ -188,10 +191,10 @@ sintable
.by 255 .by 255
.by 255 ;anti self destruction byte .by 255 ;anti self destruction byte
linetableL ;linetableL
:screenheight+1 .by <(display+screenBytes*#) ; :screenheight+1 .by <(display+screenBytes*#)
linetableH ;linetableH
:screenheight+1 .by >(display+screenBytes*#) ; :screenheight+1 .by >(display+screenBytes*#)
;---------------------------- ;----------------------------
bittable bittable
.by $80,$40,$20,$10,$08,$04,$02,$01 .by $80,$40,$20,$10,$08,$04,$02,$01
@@ -260,7 +263,7 @@ WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Ton_of_Dirt____ .by >price_Ton_of_Dirt____
.by >price_Liquid_Dirt____ .by >price_Liquid_Dirt____
.by >price_Dirt_Charge____ .by >price_Dirt_Charge____
.by >price_Earth_Disrupter .by >price_Buy_me_________
.by >price_Plasma_Blast___ .by >price_Plasma_Blast___
.by >price_Laser__________ .by >price_Laser__________
.by >price______________33 .by >price______________33
@@ -282,7 +285,7 @@ WeaponPriceH ; weapons prices (tables with prices of weapons)
.by >price_Battery________ .by >price_Battery________
.by >price_Bal_Guidance___ .by >price_Bal_Guidance___
.by >price_Horz_Guidance__ .by >price_Horz_Guidance__
.by >price_Vert_Guidance__ .by >price_Floating_Tank__
.by >price_Lazy_Boy_______ .by >price_Lazy_Boy_______
.by >price_Parachute______ .by >price_Parachute______
.by >price_StrongParachute .by >price_StrongParachute
@@ -326,7 +329,7 @@ WeaponPriceL
.by <price_Ton_of_Dirt____ .by <price_Ton_of_Dirt____
.by <price_Liquid_Dirt____ .by <price_Liquid_Dirt____
.by <price_Dirt_Charge____ .by <price_Dirt_Charge____
.by <price_Earth_Disrupter .by <price_Buy_me_________
.by <price_Plasma_Blast___ .by <price_Plasma_Blast___
.by <price_Laser__________ .by <price_Laser__________
.by <price______________33 .by <price______________33
@@ -348,7 +351,7 @@ WeaponPriceL
.by <price_Battery________ .by <price_Battery________
.by <price_Bal_Guidance___ .by <price_Bal_Guidance___
.by <price_Horz_Guidance__ .by <price_Horz_Guidance__
.by <price_Vert_Guidance__ .by <price_Floating_Tank__
.by <price_Lazy_Boy_______ .by <price_Lazy_Boy_______
.by <price_Parachute______ .by <price_Parachute______
.by <price_StrongParachute .by <price_StrongParachute
@@ -398,8 +401,8 @@ WeaponUnits
.by 1 ;Ton_of_Dirt____ .by 1 ;Ton_of_Dirt____
.by 4 ;Liquid_Dirt____ .by 4 ;Liquid_Dirt____
.by 2 ;Dirt_Charge____ .by 2 ;Dirt_Charge____
.by 10 ;Earth_Disrupter .by 1 ;Buy_me_________
.by 5 ;Plasma_Blast___ .by 0 ;Plasma_Blast___
.by 5 ;Laser__________ .by 5 ;Laser__________
.by 0 ;_____________33 .by 0 ;_____________33
.by 0 ;_____________34 .by 0 ;_____________34
@@ -418,17 +421,17 @@ WeaponUnits
.by 0 ;_____________47 .by 0 ;_____________47
.by 1 ;White_Flag___48 .by 1 ;White_Flag___48
.by 3 ;Battery________ .by 3 ;Battery________
.by 2 ;Bal_Guidance___ .by 0 ;Bal_Guidance___
.by 5 ;Horz_Guidance__ .by 0 ;Horz_Guidance__
.by 5 ;Vert_Guidance__ .by 2 ;Floating_Tank__
.by 2 ;Lazy_Boy_______ .by 0 ;Lazy_Boy_______
.by 3 ;Parachute______ .by 3 ;Parachute______
.by 2 ;StrongParachute .by 2 ;StrongParachute
.by 2 ;Mag_Deflector__ .by 2 ;Mag_Deflector__
.by 3 ;Shield_________ .by 3 ;Shield_________
.by 2 ;Heavy_Shield___ .by 2 ;Heavy_Shield___
.by 3 ;Force_Shield___ .by 3 ;Force_Shield___
.by 2 ;Super_Mag______ .by 0 ;Super_Mag______
.by 1 ;Auto_Defense___ .by 1 ;Auto_Defense___
.by 2 ;Long_Barrel____ .by 2 ;Long_Barrel____
.by 1 ;Nuclear_Winter_ .by 1 ;Nuclear_Winter_
@@ -445,13 +448,13 @@ PurchaseMeTable ;weapons good to be purchased by the robot
; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog " ; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog "
.by %00000000 .by %00000000
; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt " ; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt "
; "Liquid Dirt ","Dirt Charge ","Earth Disrupter ","Plasma Blast " ; "Liquid Dirt ","Dirt Charge ","Buy me! ","Plasma Blast "
.by %00000000 .by %00000000
; "Laser " ; "Laser "
.by %00000000 .by %00000000
.by 0 ; offset to defensives .by 0 ; offset to defensives
; "White Flag ","Battery ","Bal Guidance ","Horz Guidance " ; "White Flag ","Battery ","Bal Guidance ","Horz Guidance "
; "Vert Guidance ","Lazy Boy ","Parachute ","Strong Parachute" ; "Hovercraft ","Lazy Boy ","Parachute ","Strong Parachute"
.by %01000011 .by %01000011
; "Mag Deflector ","Shield ","Heavy Shield ","Force Shield " ; "Mag Deflector ","Shield ","Heavy Shield ","Force Shield "
; "Super Mag ","Bouncy Castle ","Long Barrel ","Nuclear Winter " ; "Super Mag ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
@@ -469,13 +472,13 @@ PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg)
; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog " ; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog "
.by %00000000 .by %00000000
; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt " ; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt "
; "Liquid Dirt ","Dirt Charge ","Earth Disrupter ","Plasma Blast " ; "Liquid Dirt ","Dirt Charge ","Buy me! ","Plasma Blast "
.by %00000000 .by %00000000
; "Laser " ; "Laser "
.by %00000000 .by %00000000
.by 0 ; offset to defensives .by 0 ; offset to defensives
; "White Flag ","Battery ","Bal Guidance ","Horz Guidance " ; "White Flag ","Battery ","Bal Guidance ","Horz Guidance "
; "Vert Guidance ","Lazy Boy ","Parachute ","Strong Parachute" ; "Hovercraft ","Lazy Boy ","Parachute ","Strong Parachute"
.by %01000001 .by %01000001
; "Mag Deflector ","Shield ","Heavy Shield ","Force Shield " ; "Mag Deflector ","Shield ","Heavy Shield ","Force Shield "
; "Super Mag ","Bouncy Castle ","Long Barrel ","Nuclear Winter " ; "Super Mag ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
@@ -487,10 +490,10 @@ WeaponSymbols
.by $40,$41,$42,$43,$44,$45,$46,$47 .by $40,$41,$42,$43,$44,$45,$46,$47
.by $48,$49,$4a,$4b,$4c,$4d,$4e,$4f .by $48,$49,$4a,$4b,$4c,$4d,$4e,$4f
.by $50,$51,$52,$53,$54,$55,$56,$57 .by $50,$51,$52,$53,$54,$55,$56,$57
.by $58,$59,$5a,$5b,$60,$7b,$7c,$7d .by $58,$59,$5a,$5b,$60,$7b,$1f,$7d
.by $20,$00,$00,$00,$00,$00,$00,$00 .by $20,$00,$00,$00,$00,$00,$00,$00
.by $00,$00,$00,$00,$00,$00,$00,$00 .by $00,$00,$00,$00,$00,$00,$00,$00
.by $5f,$1c,$03,$06,$1d,$0a,$1b,$1b ; defensives .by $5f,$1c,$03,$06,$06,$0a,$1b,$1b ; defensives
.by $1e,$3b,$3d,$3c,$3e,$3f,$1d,$7d .by $1e,$3b,$3d,$3c,$3e,$3f,$1d,$7d
; Names of weapons (16 chars long) ; Names of weapons (16 chars long)
@@ -525,7 +528,7 @@ NamesOfWeapons ;the comment is an index in the tables
dta d"Ton of Dirt " ; 27 dta d"Ton of Dirt " ; 27
dta d"Liquid Dirt " ; 28 dta d"Liquid Dirt " ; 28
dta d"Dirt Charge " ; 29 dta d"Dirt Charge " ; 29
dta d"Earth Disrupter " ; 30 dta d"Buy me! " ; 30
dta d"Plasma Blast " ; 31 dta d"Plasma Blast " ; 31
dta d"Laser " ; 32 dta d"Laser " ; 32
dta d"----------------" ; 33 dta d"----------------" ; 33
@@ -548,7 +551,7 @@ NamesOfWeapons ;the comment is an index in the tables
dta d"Battery " ; 49 dta d"Battery " ; 49
dta d"Bal Guidance " ; 50 dta d"Bal Guidance " ; 50
dta d"Horz Guidance " ; 51 dta d"Horz Guidance " ; 51
dta d"Vert Guidance " ; 52 dta d"Hovercraft " ; 52
dta d"Lazy Boy " ; 53 dta d"Lazy Boy " ; 53
dta d"Parachute " ; 54 - no energy dta d"Parachute " ; 54 - no energy
dta d"Strong Parachute" ; 55 - with energy (earlier Battery) dta d"Strong Parachute" ; 55 - with energy (earlier Battery)
@@ -565,7 +568,7 @@ DefensiveEnergy = * - 48
.by 00 ; Heat Guidance .by 00 ; Heat Guidance
.by 00 ; Bal Guidance .by 00 ; Bal Guidance
.by 00 ; Horz Guidance .by 00 ; Horz Guidance
.by 00 ; Vert Guidance .by 98 ; Let's go!
.by 00 ; Lazy Boy .by 00 ; Lazy Boy
.by 00 ; Parachute .by 00 ; Parachute
.by 99 ; Strong Parachute .by 99 ; Strong Parachute
@@ -590,14 +593,14 @@ keycodes ;tables for converting KeyCode to Screen Code (38 -1 characters)
.by $0d,$01,$05,$00,$25,$23,$08,$0a .by $0d,$01,$05,$00,$25,$23,$08,$0a
.by $2f,$28,$3e,$2d,$0b,$10,$2e,$16 .by $2f,$28,$3e,$2d,$0b,$10,$2e,$16
.by $2b,$17,$1f,$1e,$1a,$18,$1d,$1b .by $2b,$17,$1f,$1e,$1a,$18,$1d,$1b
.by $33,$35,$30,$32,$22 ;,$0e <-- hyphen removed from the table, sorry hyphen lovers .by $33,$35,$30,$32,$22,$21 ;,$0e <-- hyphen removed from the table, sorry hyphen lovers
keycodesEnd keycodesEnd
scrcodes scrcodes
dta d"abcdefgh" dta d"abcdefgh"
dta d"ijklmnop" dta d"ijklmnop"
dta d"qrstuvwx" dta d"qrstuvwx"
dta d"yz123456" dta d"yz123456"
dta d"7890." ; "-" dta d"7890. " ; "-"
;----------------------------------- ;-----------------------------------
gameOverSpritesTop gameOverSpritesTop
; end of the Gover sprites by number of players ; end of the Gover sprites by number of players
@@ -640,8 +643,12 @@ CreditsStart
dta d"Beeblebrox, KrzysRog, lopezpb, Dracon",d","* dta d"Beeblebrox, KrzysRog, lopezpb, Dracon",d","*
dta d"brad-colbert, archon800, nowy80",d","* dta d"brad-colbert, archon800, nowy80",d","*
dta d"Shaggy the Atarian, RetroBorsuk, ZP",d"H"* dta d"Shaggy the Atarian, RetroBorsuk, ZP",d"H"*
dta d" "*
dta d"Additional testin",d"g"*
dta d"Arek Peck",d"o"*
dta d" "* dta d" "*
dta d"Stay tuned for the FujiNet version",d"!"* dta d"Stay tuned for the FujiNet version",d"!"*
dta d" "* dta d" "*
CreditsEnd CreditsEnd
CreditsLines=44
.endif .endif
+19 -11
View File
@@ -1,17 +1,23 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
;----------------------------------------------
; Player/missile memory
PMGraph = $0800
display = $1010 ;screen takes $2K due to clearing routine
screenheight = 200 screenheight = 200
screenBytes = 40 screenBytes = 40
screenwidth = screenBytes*8 ; Max screenwidth = 512!!! screenwidth = screenBytes*8 ; Max screenwidth = 512!!!
;----------------------------------------------
; Player/missile memory
PMGraph = $0800 ; real PM start = $0b00
; Generated tables
linetableL = $0b00 - (screenHeight+1)*2
linetableH = $0b00 - (screenHeight+1)
display = $1010 ;screen takes $2K due to clearing routine
margin = 40 ;mountain drawing Y variable margin margin = 40 ;mountain drawing Y variable margin
MaxPlayers = 6 MaxPlayers = 6
maxOptions = 8 ;number of all options maxOptions = 9 ;number of all options
PMOffsetX = $2C ; P/M to graphics offset PMOffsetX = $2C ; P/M to graphics offset
PMOffsetY = $23 ; P/M to graphics offset PMOffsetY = $23 ; P/M to graphics offset
napalmRadius = 10 napalmRadius = 10
@@ -65,7 +71,7 @@ price_Dirt_Ball______ = 130 ;_26
price_Ton_of_Dirt____ = 171 ;_27 price_Ton_of_Dirt____ = 171 ;_27
price_Liquid_Dirt____ = 330 ;_28 price_Liquid_Dirt____ = 330 ;_28
price_Dirt_Charge____ = 343 ;_29 price_Dirt_Charge____ = 343 ;_29
price_Earth_Disrupter = $ffff ;430 ;_30 price_Buy_me_________ = 170 ;430 ;_30
price_Plasma_Blast___ = $ffff ;274 ;_31 price_Plasma_Blast___ = $ffff ;274 ;_31
price_Laser__________ = 277 ;_32 price_Laser__________ = 277 ;_32
price______________33 = 0 price______________33 = 0
@@ -87,7 +93,7 @@ price_White_Flag_____ = $0 ;_48_($30)
price_Battery________ = 300 ;_49 price_Battery________ = 300 ;_49
price_Bal_Guidance___ = $ffff ;_50 price_Bal_Guidance___ = $ffff ;_50
price_Horz_Guidance__ = $ffff ;_51 price_Horz_Guidance__ = $ffff ;_51
price_Vert_Guidance__ = $ffff ;_52 price_Floating_Tank__ = 352 ;_52
price_Lazy_Boy_______ = $ffff ;_53 price_Lazy_Boy_______ = $ffff ;_53
price_Parachute______ = 234 ;_54 price_Parachute______ = 234 ;_54
price_StrongParachute = 1000 ;_55 price_StrongParachute = 1000 ;_55
@@ -130,7 +136,7 @@ ind_Dirt_Ball______ = 26
ind_Ton_of_Dirt____ = 27 ind_Ton_of_Dirt____ = 27
ind_Liquid_Dirt____ = 28 ind_Liquid_Dirt____ = 28
ind_Dirt_Charge____ = 29 ind_Dirt_Charge____ = 29
ind_Earth_Disrupter = 30 ind_Buy_me_________ = 30
ind_Plasma_Blast___ = 31 ind_Plasma_Blast___ = 31
ind_Laser__________ = 32 ind_Laser__________ = 32
ind______________33 = 0 ind______________33 = 0
@@ -152,7 +158,7 @@ ind_White_Flag_____ = 48
ind_Battery________ = 49 ind_Battery________ = 49
ind_Bal_Guidance___ = 50 ind_Bal_Guidance___ = 50
ind_Horz_Guidance__ = 51 ind_Horz_Guidance__ = 51
ind_Vert_Guidance__ = 52 ind_Floating_Tank__ = 52
ind_Lazy_Boy_______ = 53 ind_Lazy_Boy_______ = 53
ind_Parachute______ = 54 ind_Parachute______ = 54
ind_StrongParachute = 55 ind_StrongParachute = 55
@@ -198,6 +204,7 @@ sfx_liquid_dirt = $1b ;2
sfx_battery = $1c ;3 sfx_battery = $1c ;3
sfx_white_flag = $1d ;4 sfx_white_flag = $1d ;4
sfx_long_barrel = $1e sfx_long_barrel = $1e
sfx_tank_move = $1f
;-------------------------------- ;--------------------------------
; RMT songs (lines) ; RMT songs (lines)
;-------------------------------- ;--------------------------------
@@ -207,3 +214,4 @@ song_ingame = $06
song_round_over = $0b song_round_over = $0b
song_ending_looped = $0e song_ending_looped = $0e
song_supermarket = $1b song_supermarket = $1b
song_inventory = $1d
+151 -113
View File
@@ -1,15 +1,69 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0 ;this is a trick that prevents compiling this file alone .IF *>0 ;this is a trick that prevents compiling this file alone
; -------------------------------------------------
; .ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!!
;-----------------------------------------------
;------------------------
; start of "variables" (RAM)
; ---------------
OptionsHere
; 0123456789012345678901234567890123456789
dta d"Players : 2 3 4 5 6 "
dta d"Cash : none 2K 8K 12K 20K "
dta d"Gravity : 0.2G 0.5G 1G 2G 4G "
dta d"Wind : 1B 3B 5B 7B 9B "
dta d"Rounds : 10 20 30 40 50 "
dta d"Missiles : slug slow norm fast hare "
dta d"Seppuku : nevr rare norm oftn alws "
dta d"Mountains: NL BE CZ CH NP "
dta d"Walls : none wrap bump boxy rand "
OptionsScreenEnd
;-----------------------------------------------
ListOfWeapons
; 0123456789012345678901234567890123456789
:36 dta d" "
ListOfWeapons1End
ListOfDefensiveWeapons
:16 dta d" "
ListOfDefensiveWeaponsEnd ;constant useful when clearing
NameScreen
dta d" Enter names of players "
dta d" Tank 01 Name:"
NameAdr
dta d" "
dta d" Human/Atari (difficulty level) "
dta d" "
NamesOfLevels
dta d" HUMAN Moron Shooter "
dta d" Poolshark Tosser Chooser "
dta d" Spoiler Cyborg Unknown "
dta d" "
dta d"Tab"*
dta d" - Player/Difficulty level "
dta d" "
dta d"Return"*
dta d" - Proceed "
;---------------------------------------------------
textbuffer
; 0123456789012345678901234567890123456789
dta d"Player: "
dta d"Energy: Angle: Force: "
dta d"Round: Wind: "
textbuffer2
dta d"Player: Cash: 0" ; ZERO TO MAKE YOU RICHER ON THE SCREEN
;----------------------------------------------------- ; DLs fragments (modified by game code)
;-------------display-lists--------------------------- ; all Purchase DL :)
;-----------------------------------------------------
PurchaseDL PurchaseDL
.byte $70,$70,$20 .byte $70
.byte $47
DLPurTitleAddr
.word PurchaseTitle
.byte $50
.byte $42+$80 .byte $42+$80
.word textbuffer2 .word textbuffer2
.byte $02,$10,$42 .byte $60,$42
MoreUpdl MoreUpdl
.word EmptyLine .word EmptyLine
.byte 0,$42 .byte 0,$42
@@ -19,18 +73,95 @@ WeaponsListDL
.byte 0, $42 .byte 0, $42
MoreDownDL MoreDownDL
.word EmptyLine .word EmptyLine
.byte $10,$42 .byte $40,$42
.word WeaponsDescription .word WeaponsDescription
.byte 2 .byte $0,$42
PurActDescAddr
.word PurchaseDescription
.byte $41 .byte $41
.word PurchaseDL .word PurchaseDL
;------------------------ ;------------------------
DLCreditsFragm
.byte $60+$80
.byte $42+$20 ; VSCRL
DLCreditsAddr
.word Credits
:6 .byte $02+$20
.byte $02
.byte $41
.word GameOverDL
;------------------------
; end of "variables" (RAM)
; ---------------
; start of "constants" (ROM)
;-----------------------------------------------
;Screen displays go first to avoid crossing 4kb barrier
;-----------------------------------------------
OptionsScreen
dta d"Welcome to Scorch v. "
build ; 4 bytes from scorch.asm (fancy method) :)
dta d" (un)2000-2022"
dta d" Please select option with cursor keys "
dta d" and press (Return) to proceed "
MoreUp
dta d" "
dta 92,92,92
dta d" more "
dta 92,92,92
dta d" "
.ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!!
MoreDown
dta d" "
dta 93,93,93
dta d" more "
dta 93,93,93
dta d" "
WeaponsDescription
; 0123456789012345678901234567890123456789
dta d"Tab"*
dta d ": Defensive/Offensive weapon "
PurchaseDescription
; 0123456789012345678901234567890123456789
dta d"Space"*
dta d": Purchase "
dta d"Return"*
dta d": Finish "
ActivateDescription
; 0123456789012345678901234567890123456789
dta d"Space"*
dta d": Activate "
dta d"Return"*
dta d": Finish "
EmptyLine
dta d" "
;---------------------------------------------------
OptionsTitle
dta d" scorch "*
DifficultyTitle
dta d" difficulty "*
PurchaseTitle
dta d"purchase weapons"
InventoryTitle
dta d"activate weapons"*
GameOverTitle
dta d" game over "*
GameOverTitle2
dta d" Player Points Hits Earned Money "
;-----------------------------------------------------
;-------------display-lists---------------------------
;-----------------------------------------------------
OptionsDL OptionsDL
:5 .byte $70 .byte $70
.byte $42 .byte $47
.word OptionsTitle
.byte $70,$70
.byte $42
.word OptionsScreen .word OptionsScreen
.byte $30,$02,$02,$70 .byte $30,$02,$02,$70
:maxOptions .by $02,$10 .byte $42
.word OptionsHere
.byte $10
:maxOptions-1 .by $02,$10
:(9-maxOptions) .by $70,$10 :(9-maxOptions) .by $70,$10
.byte $80 .byte $80
.byte $4f .byte $4f
@@ -41,7 +172,10 @@ OptionsDL
;------------------------ ;------------------------
;Enter names of tanks DL ;Enter names of tanks DL
NameDL NameDL
:5 .byte $70 .byte $70
.byte $47
.word DifficultyTitle
.byte $70,$70
.byte $42 .byte $42
.word NameScreen .word NameScreen
.byte $30 .byte $30
@@ -98,64 +232,9 @@ dl ; MAIN game display list
.byte $41 .byte $41
.word dl .word dl
;----------------------------------------------- ;-----------------------------------------------
;Screen displays go first to avoid crossing 4kb barrier
;-----------------------------------------------
OptionsScreen
dta d"Welcome to Scorch v. "
build ; 4 bytes from scorch.asm (fancy method) :)
dta d" (un)2000-2022"
dta d" Please select option with cursor keys "
dta d" and press (Return) to proceed "
OptionsHere
; 0123456789012345678901234567890123456789
dta d"Players : 2 3 4 5 6 "
dta d"Cash : none 2K 8K 12K 20K "
dta d"Gravity : 0.2G 0.5G 1G 2G 4G "
dta d"Wind : 1B 3B 5B 7B 9B "
dta d"Rounds : 10 20 30 40 50 "
dta d"Missiles : slug slow norm fast hare "
dta d"Seppuku : nevr rare norm oftn alws "
dta d"Mountains: NL BE CZ CH NP "
OptionsScreenEnd
;-----------------------------------------------
MoreUp
dta d" "
dta 92,92,92
dta d" more "
dta 92,92,92
dta d" "
MoreDown
dta d" "
dta 93,93,93
dta d" more "
dta 93,93,93
dta d" "
ListOfWeapons
:36 dta d" "
ListOfWeapons1End
;GameOverResults ; reuse after game (remember to clear on start new)
ListOfDefensiveWeapons
:16 dta d" "
ListOfDefensiveWeaponsEnd ;constant useful when clearing
WeaponsDescription
dta d" "
dta d"Tab"*
dta d" - Defensive/Offensive weapon "
dta d" "
dta d"Space"*
dta d" - "
purchaseActivate
dta d"Purchase "
dta d"Return"*
dta d" - Finish "
EmptyLine
dta d" "
; -------------------------------------------------
.ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!!
;-----------------------------------------------
GameOverResults = display+$0ff0 ; reuse after game GameOverResults = display+$0ff0 ; reuse after game
Credits = GameOverResults +(6*40) Credits = GameOverResults +(6*40)
CreditsLastLine = Credits + (41*40) CreditsLastLine = Credits + (CreditsLines*40)
GameOverDL GameOverDL
.byte $70,$40 .byte $70,$40
.byte $47 ; 16 gr8 lines .byte $47 ; 16 gr8 lines
@@ -178,50 +257,9 @@ GameOverDL
.byte $42 .byte $42
.word GameOverResults .word GameOverResults
:5 .byte $00+$80,$02 :5 .byte $00+$80,$02
.byte $70+$80 .byte $01
.byte $42+$20 ; VSCRL .word DLCreditsFragm
DLCreditsAddr ; ---------------
.word Credits ; end of "constants" (ROM)
:6 .byte $02+$20 ;-----------------------------------------------
.byte $02
.byte $41
.word GameOverDL
NameScreen
dta d" Enter names of players "
dta d" Tank 01 Name:"
NameAdr
dta d" "
dta d" Human/Atari (difficulty level) "
dta d" "
NamesOfLevels
dta d" HUMAN Moron Shooter "
dta d" Poolshark Tosser Chooser "
dta d" Spoiler Cyborg Unknown "
dta d" "
dta d"Tab"*
dta d" - Player/Difficulty level "
dta d" "
dta d"Return"*
dta d" - Proceed "
;---------------------------------------------------
textbuffer
; 0123456789012345678901234567890123456789
dta d"Player: "
dta d"Energy: Angle: Force: "
dta d"Round: Wind: "
textbuffer2
dta d"Player: Cash: 0 " ; ZERO TO MAKE YOU RICHER ON THE SCREEN
dta d"----------------------------------------"
;---------------------------------------------------
activateText
dta d"Activate"
activateTextEnd
purchaseText
dta d"Purchase"
purchaseTextEnd
GameOverTitle
dta d" game over "*
GameOverTitle2
dta d" Player Points Hits Earned Money "
.endif .endif
+150 -34
View File
@@ -611,6 +611,8 @@ DrawNextTank
bne SkipHidingPM ; if energy=0 then no tank bne SkipHidingPM ; if energy=0 then no tank
; hide P/M ; hide P/M
lda TanksPMOrder,x
tax
lda #0 lda #0
cpx #$4 ; 5th tank is defferent cpx #$4 ; 5th tank is defferent
bne No5thTankHide bne No5thTankHide
@@ -626,6 +628,7 @@ No5thTankHide
No6thTankHide No6thTankHide
sta hposp0,x sta hposp0,x
@ @
ldx TankNr
jmp DoNotDrawTankNr jmp DoNotDrawTankNr
SkipHidingPM SkipHidingPM
@@ -646,6 +649,8 @@ DrawTankNrX
; now P/M graphics on the screen (only for 5 tanks) ; now P/M graphics on the screen (only for 5 tanks)
; horizontal position ; horizontal position
ldx TankNr ldx TankNr
lda TanksPMOrder,x
tax
mwa xdraw xbyte mwa xdraw xbyte
rorw xbyte ; divide by 2 (carry does not matter) rorw xbyte ; divide by 2 (carry does not matter)
lda xbyte lda xbyte
@@ -909,6 +914,91 @@ ToHighToParachute
rts rts
.endp .endp
;--------------------------------------------------
.proc DrawTankRocketEngine
; X - tank number
;
; this proc change xdraw, ydraw and temp!
;--------------------------------------------------
clc
lda Ytankstable,x
adc #2 ; 1 pixel down
sta ydraw
mva #0 ydraw+1
clc
lda XtanksTableL,x
adc #2 ; 2 pixels to right
sta xdraw
lda XtanksTableH,x
adc #0
sta xdraw+1
; draw first horizontal line
mva #5 temp
@
jsr plot
inw xdraw
dec temp
bne @-
sbw xdraw #2 ; 2 pixels left
inw ydraw ; 1 pixel down
; draw second horizontal line
mva #3 temp
@
jsr plot
.nowarn dew xdraw
dec temp
bne @-
adw xdraw #2 ; 2 pixels right
inw ydraw ; 1 pixel down
; and last pixel
jsr plot
ldx TankNr
rts
.endp
;--------------------------------------------------
.proc DrawTankEngine
; X - tank number
;
; this proc change xdraw, ydraw and temp!
;--------------------------------------------------
; one pixel under tank
clc
lda Ytankstable,x
adc #1
sta ydraw
mva #0 ydraw+1
lda XtankstableL,x
sta xdraw
lda XtankstableH,x
sta xdraw+1
; clear first pixel under tank
mva #0 color
jsr plot
inw xdraw
; plot 6 random color pixels
mva #6 temp
@ lda Erase
eor #%00000001
and random
and #%00000001
sta color
jsr plot
inw xdraw
dec temp
bne @-
; clear last pixel under tank
mva #0 color
jsr plot
ldx TankNr
rts
.endp
;-------------------------------------------------- ;--------------------------------------------------
.proc TankFalls; .proc TankFalls;
;-------------------------------------------------- ;--------------------------------------------------
@@ -966,7 +1056,7 @@ DoNotClearParachute
lda #08 lda #08
sta temp ; Loop Counter sta temp ; Loop Counter
ByteBelowTank ByteBelowTank
jsr point jsr point_plot
beq EmptyPoint2 beq EmptyPoint2
sec sec
ror UnderTank2 ror UnderTank2
@@ -983,6 +1073,9 @@ ROLPoint2
bne ByteBelowTank bne ByteBelowTank
NoGroundCheck NoGroundCheck
ldx TankNr ldx TankNr
lda Ytankstable,x
cmp #screenheight-1 ; tank on lowest position (no falling down)
jcs EndOfFall
lda UnderTank1 lda UnderTank1
bne NoFallingDown bne NoFallingDown
; Tank falling down ---- ; Tank falling down ----
@@ -990,7 +1083,7 @@ NoGroundCheck
and #1 and #1
bne ParachutePresent bne ParachutePresent
; decreasing energy ; decreasing energy
ldy #2 ; how much energy to substract ldy #2 ; how much energy to substract if no parachute
jsr DecreaseEnergyX jsr DecreaseEnergyX
ParachutePresent ParachutePresent
; check parachute type ; check parachute type
@@ -998,7 +1091,7 @@ ParachutePresent
cmp #ind_StrongParachute ; strong parachute cmp #ind_StrongParachute ; strong parachute
bne OneTimeParachute bne OneTimeParachute
; decreasing energy of parachute ; decreasing energy of parachute
ldy #2 ; how much energy to substract ldy #1 ; how much parachute energy to substract
jsr DecreaseShieldEnergyX jsr DecreaseShieldEnergyX
cpy #0 ; is necessary to reduce tenk energy ? cpy #0 ; is necessary to reduce tenk energy ?
beq @+ beq @+
@@ -1024,37 +1117,16 @@ NoFallingDown
ldy #7 ; SlideLeftTable length -1 (from 0 to 7) ldy #7 ; SlideLeftTable length -1 (from 0 to 7)
@ lda SlideLeftTable,y @ lda SlideLeftTable,y
cmp UnderTank1 cmp UnderTank1
beq FallingRight
cmp UnderTank2
beq FallingLeft beq FallingLeft
cmp UnderTank2
beq FallingRight
dey dey
bpl @- bpl @-
bmi NoLeftOrRight bmi NoLeftOrRight
FallingLeft
; tank is falling left
bit PreviousFall ; bit 6 - right
bvs EndLeftFall
; we finish falling left if the tank reached the edge of the screen
lda XtanksTableH,x
bne NotLeftEdge
lda XtanksTableL,x
cmp #2 ; 2 pixels correction due to a barrel wider than tank
beq EndLeftFall
NotLeftEdge
; tank is falling left - modify coorinates
clc
lda XtankstableL,x
adc #1
sta XtankstableL,x
lda XtankstableH,x
adc #0
sta XtankstableH,x
mva #%10000000 PreviousFall ; set bit 7 - left
bne EndOfFCycle
FallingRight FallingRight
; tank is falling right ; tank is falling right
bit PreviousFall ; bit 7 - left bit PreviousFall ; bit 6 - left
bmi EndRightFall bvs EndRightFall
; we finish falling right if the tank reached the edge of the screen ; we finish falling right if the tank reached the edge of the screen
clc clc
lda XtanksTableL,x lda XtanksTableL,x
@@ -1064,8 +1136,29 @@ FallingRight
adc #0 adc #0
sta temp+1 sta temp+1
cpw temp #screenwidth-2 ; 2 pixels correction due to a barrel wider than tank cpw temp #screenwidth-2 ; 2 pixels correction due to a barrel wider than tank
beq EndRightFall bcs EndRightFall
NotLeftEdge
; tank is falling right - modify coorinates ; tank is falling right - modify coorinates
clc
lda XtankstableL,x
adc #1
sta XtankstableL,x
lda XtankstableH,x
adc #0
sta XtankstableH,x
mva #%10000000 PreviousFall ; set bit 7 - right
bne EndOfFCycle
FallingLeft
; tank is falling left
bit PreviousFall ; bit 7 - right
bmi EndLeftFall
; we finish falling left if the tank reached the edge of the screen
lda XtanksTableH,x
bne NotLeftEdge
lda XtanksTableL,x
cmp #3 ; 2 pixels correction due to a barrel wider than tank
bcc EndLeftFall
; tank is falling left - modify coorinates
sec sec
lda XtankstableL,x lda XtankstableL,x
sbc #1 sbc #1
@@ -1073,7 +1166,7 @@ FallingRight
lda XtankstableH,x lda XtankstableH,x
sbc #0 sbc #0
sta XtankstableH,x sta XtankstableH,x
mva #%01000000 PreviousFall ; set bit 6 - right mva #%01000000 PreviousFall ; set bit 6 - left
bne EndOfFCycle bne EndOfFCycle
EndLeftFall EndLeftFall
EndRightFall EndRightFall
@@ -1238,7 +1331,7 @@ drawmountainspixelloop
NextColumn1 NextColumn1
mwa #0 ydraw mwa #0 ydraw
NextPoint1 NextPoint1
jsr point jsr point_plot
beq StillNothing beq StillNothing
ldy #0 ldy #0
lda ydraw lda ydraw
@@ -1289,7 +1382,7 @@ FalloutOfLine
sta (tempor2),y sta (tempor2),y
; and checking if there is a pixel there ; and checking if there is a pixel there
sta ydraw sta ydraw
jsr point jsr point_plot
bne ThereIsPixelHere bne ThereIsPixelHere
; if no pixel we plot it ; if no pixel we plot it
mva #1 color mva #1 color
@@ -1431,6 +1524,7 @@ EndDrawing
rts rts
.endp .endp
/* /*
;-------------------------------------------------- ;--------------------------------------------------
.proc calculatemountains0 .proc calculatemountains0
@@ -1456,7 +1550,29 @@ SetYofNextTank
bpl SetYofNextTank bpl SetYofNextTank
rts rts
.endp .endp
*/ */
;--------------------------------------------------
.proc CheckMaxMountain
; in A return y coordinate of highest mountain
;--------------------------------------------------
mwa #mountaintable modify
ldy #0
ldx #screenheight-1
nextPointChecking
txa
cmp (modify),y
bcc NotHigher
lda (modify),y
tax
NotHigher
inw modify
cpw modify #(mountaintable+screenwidth)
bne nextPointChecking
txa
rts
.endp
; ----------------------------------------- ; -----------------------------------------
.proc unPlot .proc unPlot
@@ -1617,7 +1733,7 @@ ClearPlot
.endp .endp
; ----------------------------------------- ; -----------------------------------------
.proc point .proc point_plot
; ----------------------------------------- ; -----------------------------------------
; checks state of the pixel (coordinates in xdraw and ydraw) ; checks state of the pixel (coordinates in xdraw and ydraw)
; result is in A (zero or appropriate bit is set) ; result is in A (zero or appropriate bit is set)
-157
View File
@@ -1,157 +0,0 @@
Podstawowa instrukcja:
Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce).
1 Wybór opcji gry.
Na pierwszym ekranie możemy skonfigurować opcje rozgrywwki:
- ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer
- początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, jecz przy krótkich rozgrywkach warto wybrać większą wartość)
- grawitacja
- maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund, tu możemy wybrać jak silny może być)
- ilość rozgrywanych rund
- szybkość lotu pocisków (nie ma wpływu na tor lotu - zmienia jedynie widoczną prędkość rysowania - nie zmienia nic w samej rozgrywce)
- częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania.
- wysokość (i pofałdowanie) gór od prawie płaskich (NL), do strzelistych i wysokich (NP)
Wybór opcji klawiszami kursora lub joystickiem.
klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu.
2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer
Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joysticjiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też kompute (pozostałe opcje). Jednocześnie z klawiatury można wprowadzić nazwę wybranego gracza.
Po naciśnięciu klawisza [RETURN] lub przycisku Joysticka ekran przechodzi na następnego gracza aż zostaną wybrane poziomy trudności dla każdego z nich.
Jeśli nazwa nie zostanie wpisana (bo np operujemy wyłącznie joystickiem), to zostanie uzupełniona nazwą domyślną.
3. Ekran zakupów (przed każdą rundą)
Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni.
Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza.
(oczywiście dla graczy komputerowych ten ekran się nie pojawia)
4. Główny ekran gry
W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji:
- nazwa czołgu gracza
- wybrana aktualnie broń ofensywna
- pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób
- ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia
- ustawiona przez gracza siła strzału (maksymalna siła strzału jest ograniczana przez energię gracza - nie może przekroczyć energii * 10 . Oznacza to, że mając małą ilość energii możemy oddać słabsze strzały
- numer aktualnej rundy rozgrywki
- prędkość i kierunek wiatru
- w nawiasie nazwę aktywnej broni defensywnej - jeśli jest jakaś aktywowana przez gracz
Tutaj klawiszologia jest prosta, klawisze kursora lub joustick: lewo/prawo - zmiana kąta nachylenia lufy, góra/dół - zmiana ustawienia siły strzału.
[SPACJA] lub przycisk joysticka naciśnięte krótko - oddanie strzału
[TAB] - wybór broni ofensywnej (ta opcja nie jest dostępna bezpośrednio joystickiem - trzeba wybrać Inventory)
klawisz [I] lub dłuższe przytrzymanie przycisku joysticka - przejście do Inventory
Inventory to ekran (a w zasadzie dwa) bliźniaczo podobny do ekranu zakupów. Zasady poruszania się są identyczne z tym, że tu nie kupujemy broni, ale wybieramy jedną z ofensywnych, którą będziemy strzelać lub aktywujemy broń defensywną.
Klawisz [M] - wyłączenie/włączenie muzyki w tle
Klawisz [S] - wyłączenie/włączenie dźwięków efektów.
Klawisz [O] - wymuszenie zakończenia gry (Game Over). W podsumowaniu wyników nie jest brana pod uwagę przerwana właśnie runda rozgrywki, a wyłącznie rundy zakończone wcześniej. Odpowiada to wciśnięciu klawisza [ESC] z tą różnicą, że wyświetlane jest podsumowanie oraz creditsy.
W czasie całej gry w dowolnym momencie (chyba że akurat gra komputer, wtedy czasem trzeba chwilę poczekać) można nacisnąć klawisz [ESC], który umożliwia przerwanie gry i powrót na początek (oczywiście jest zabezpieczenie przed przypadkowym naciśnięciem).
A tutaj zręby opisu działania poszczególnych broni, zasad punktacji itp:
—-----------------------
Najpierw co wiemy o energii czołgów
- Czołgi mają energię (a Ogry warstwy - jak cebula) - na starcie 99 jednostek
- Energii czołgom ubywa na 3 sposoby:
1. 1 jednostka po oddaniu każdego strzału
2. w czasie spadania (jeden piksel w dół 2 jednostki)
3. w chwili trafienia w czołg lub obok niego jakiegoś pocisku - i tu ilość odejmowanej energii zależy od odległości od centrum eksplozji i typu/siły rażenia pocisku.
Jak działa odejmowanie energii (i zarabianie kasy!)
Po każdej rundzie wyliczana jest ilość zdobytych/straconych pieniędzy robione jest to na podstawie dwóch zmiennych gromadzonych przez każdy z czołgów w trakcie rundy. Te zmienne to:
gain - energia "przechwycona" od trafionych czołgów (także jeśli trafimy w samego siebie :) i tu haczyk, jeśli pozostało nam bardzo mało energii opłacalne może być trafienie w siebie mocną bronią!
loose - energia stracona w wyniku eksplozji/upadku (i tu ważne liczona jest całkowita utrata energii nawet jeśli czołg ma w chwili trafienia mniej).
Dodatkowo czołg który wygrał rundę ma parametr gain (przechwyconej od trafionych czołgów energii) zwiększany o pozostałą mu na koniec rundy energię (bo nie zginął i powinien ją mieć - choć bywa też inaczej :) )
Konkretnie:
Po każdej rundzie:
money = money + (2 * (gain+energy))
money = money - loose
if money <0 then money=0
(na starcie każdej rundy gain i loose mają wartość 0)
W czasie rundy, jeśli w wyniku strzału oddanego przez czołg inny czołg zostanie trafiony, czołg oddający strzał "dostaje energię" zabraną czołgowi trafionemu.
czołg oddający strzał:
gain = gain + EnergyDecrease
czołg trafiony:
loose = loose + EnergyDecrease
gdzie EnergyDecrease to utrata energii w wyniku trafienia.
Oczywiście jednocześnie trafiony czołg traci ilość energii zapisaną w EnergyDecrease, z tym że tutaj strata nie może przekroczyć posiadanej energii.
Uwaga! Ekranowa reprezentacja pieniędzy ma na końcu dopisane dodatkowe 0 więc faktyczne mamy 10 razy więcej kasy niż wynika z powyższych obliczeń :)
Jak działa trafienie.
Każda broń, która skutkuje eksplozją, ma swój promień rażenia (ExplosionRadius).
Po eksplozji każdy czołg w jej zasięgu traci energię.
Działa to tak, że obliczana jest odległość trafianego czołgu od centrum eksplozji, zmniejszony o tę odległość ExplosionRadius jest mnożony przez 8 i w wyniku otrzymujemy EnergyDecrease.
Czyli w przypadku trafienia centralnie w czołg:
EnergyDecrease = ExplosionRadius * 8
a z każdym pikselem dalej od centrum ubywa o 8 jednostek mniej.
Nie wiem czy to zrozumiałe - ja rozumiem :)
Przykładowo, jeśli czołg zostanie trafiony centralnie przy pomocy Baby Missile - odejmowane jest mu 88 jednostek energii (11 * 8), co także oznacza, że przy trafieniu tym pociskiem w odległości 12 pikseli od czołgu - nie traci on energii wcale.
A oto wartości promienia rażenia (ExplosionRadius) dla poszczególnych broni:
Baby Missile - 11
Missile - 17
Baby Nuke - 25
Nuke - 31
LeapFrog - 17 15 13
Funky Bomb - 21 11 (* 5)
MIRV - 17 (* 5)
Death's Head - 31 (* 5)
Napalm - x 40 (ta broń jest inna i nie jest wyznaczana odległość od centrum, po prostu każdy czołg znajdujący się w zasięgu płomieni traci 40 jednostek energii - zmienna ExplosionRadius nie jest używana)
Hot Napalm - x 80 (zasada taka jak w Napalm)
Baby Roller - 11
Roller - 21
Heavy Roller - 31
Riot Charge - 31
Riot Blast - 0 (tak na prawdę - 61 ale przy tych broniach nie jest brana pod uwagę przy liczeniu ubytku energii tylko szerokości gruntu do opadnięcia)
Riot Bomb - 17
Heavy Riot Bomb - 29
Baby Digger - 0 (60 - jak w Riot Blast)
Digger - 0 (60 - jak wyżej)
Heavy Digger - 0 (60 - jak wyżej)
Baby Sandhog - 0 (60 - jak wyżej)
Sandhog - 0 (60 - jak wyżej)
Heavy Sandhog - 0 (60 - jak wyżej)
Dirt Clod - 12
Dirt Ball - 22
Ton of Dirt - 31
Liquid Dirt - 0 (może warto to zmienić?)
Dirt Charge - 0 (61 - jak wyżej)
Laser - x 100 (ale tu także jest inaczej - równo 100 tylko w przypadku bezpośredniego trafienia, zmienna ExplosionRadius nie jest używana, więc nie ma mnożenia przez 8 - po prostu odejmujemy 100 jednostek energii - czyli czołg zawsze ginie).
Duże punkty otrzymane przez gracza to ilość czołgów, które zginęły wcześniej niż on. Jeśli któryś z innych czołgów skapitulował wcześniej (Biała Flaga) nie jest doliczany do tych które zginęły i nie daje punktów.
Tylko te punkty decydują o kolejności w podsumowaniu
A teraz bronie defensywne:
White Flag - powoduje poddanie gracza (może czasem przydać się w sytuacji beznadziejnej). Zaletą jest to, że poddając się nie dajemy dużego punktu przeciwnikom i nie powodujemy, że któryś zyska na tym, że nas zgładzi, ograniczamy też stratę swojej energii czyli także kasy. I tu także ważna uwaga - to jedyna broń defensywna, którą można deaktywować. Wystarczy ponownie wejść do inventory i jeszcze raz wybrać jej aktywację.
Battery - w momencie aktywacji doładowuje energię czołgu do pełna (99 jednostek) i jednocześnie jest to jedyna broń defensywna, która nie deaktywuje innych broni defensywnych w przypadku jej użycia.
Parachute - nie chroni przed ubytkiem energii z powodu sąsiedniej eksplozji, powoduje że nie ubywa energii w czasie JEDNEGO spadania. Po takim upadku deaktywuje się i trzeba aktywować nowy spadochron.
Shield - najprostsza osłona działa dokładnie przeciwnie niż Parachute, nie chroni przed ubytkiem energii w czasie spadania, chroni za to przed ubytkiem energii spowodowanym JEDNĄ sąsiednią eksplozją. Chroni jednorazowo, bez znaczenia jak silna jest eksplozja (czy jest to tylko "draśnięcie", czy też bezpośrednie trafienie atomówką) i od razu po niej deaktywuje się.
Heavy Shield - osłona z własną energią (na starcie 99 jednostek), działa tak samo jak Shield (nie chroni przed upadkiem) z tym wyjątkiem, że ma własny zasób energii. Przy eksplozji w pierwszej kolejności zmniejszana jest energia tej osłony i jeśli dojdzie ona do 0 to osłona deaktywuje się i dalej zmniejszana jest energia czołgu. W związku z takim działaniem, czołg z tym typem osłony można "zabić" podkopując go, bo spadanie zmniejsza energię czołgu a nie osłony.
Force Shield - najmocniejsza osłona - działa tak jak Heavy Shield tyle że połączona z Parachute. Co ważne w jej przypadku upadek nie zabiera energii osłonie ani czołgowi. Zabierają ją tylko trafienia.
Bouncy Castle - broń agresywna :) . Działa następująco. W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje "odbicie" pocisku w przeciwnym kierunku z tą samą siłą z jaką był wystrzelony. W przypadku braku wiatru i różnicy poziomów broń trafia wtedy w czołg, który ją wystrzelił. Po takim odbiciu deaktywuje się. W związku z tym, że broń ta reaguje w ten sposób tylko na precyzyjne trafienia, jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie trzeba będzie przemyśleć tę wartość i dać tu mniejszą).
Mag Deflector - druga broń agresywna :) . W przypadku bezpośredniego trafienia w czołg (i osłonę) powoduje przesunięcie punktu trafienia losowo w lewo lub prawą stronę chronionego czołgu, ale niezbyt daleko, więc można dostać "odłamkiem" przy silniejszej broni. Tak jak w przypadku Bouncy Castle jest także osłoną odpowiadającą działaniu Heavy Shield i ma na starcie 99 jednostek (prawdopodobnie i tutaj trzeba będzie przemyśleć tę wartość i dać mniejszą).
Nuclear Winter - nic nie dodaje, nic nie zabiera :) - w zasadzie to broń nie tyle defensywna co obosieczna. Zasypuje teren opadem "radioaktywnym", który jest zwyczajną glebą. Jeśli nie mamy pod ręką żadnej broni odkopującej teren i do tego osłony (najlepiej jednorazowej), to po takim "opadzie" będzie trzeba strzelić do siebie - bo będąc pod ziemią inaczej się nie da. Ewentualnie pozostaje zawsze White Flag.
Long Schlong - broń specjalna :) - kosztuje dużo, nie bardzo w czymkolwiek pomaga (poza ewentualnym odkopaniem się ale tylko przy niewielkim przysypaniu ale fanie się nazywa i wygląda :) - Można ją aktywować niezależnie od innych broni defensywnych i pozostaje aktywna do końca rundy (nie da się jej deaktywować).
W związku z odmiennym działaniem broni MIRV, Auto Defense i Mag Deflector wykorzystują tylko funkcję osłony przy trafieniu tą bronią.
Dodatkowo, żadna z osłon nie chroni przed Napalmem. Auto Defense czy Mag Deflector przy bezpośrednim trafieniu odbije je lub przeniesie obok, ale wystarczy trafić bardzo blisko czołgu i nie zadziała jego osłona.
Bronie White Flag i Nuclear Winter po aktywacji wymagają uruchomienia, jest to realizowanie przez "oddanie strzału" po aktywacji tej broni. Oczywiście strzał bronią ofensywną nie jest wtedy oddawany, a jedynie uruchamiana jest wybrana broń defensywna.
Można mieć aktywną tylko jedną broń defensywną w danej chwili (za wyjątkiem Long Schlong oczywiście :) ). Zawsze przed oddaniem strzału możemy zmienić decyzję i aktywować inną broni defensywną czy też dezaktywować White Flag.
Oczywiście aktywacja broni w momencie kiedy mamy już aktywowaną jakąś inną powoduje utratę tej poprzedniej (nie ma zwrotów :) ).
+653
View File
@@ -0,0 +1,653 @@
;****************************************************************************
;* ATARI PERSONAL COMPUTER *
;* SYSTEM EQUATES *
;****************************************************************************
;
; OPERATING SYSTEM EQUATE FILE
;
; MODULE ORIGIN TABLE
;
; VECTOR TABLE
;
; HANDLER ENTRY POINTS ARE CALL-
; ED OUT IN THE FOLLOWING VECTOR
; TABLE. THESE ARE THE ADDRESSES
; MINUS ONE.
;
; EXAMPLE FOR EDITOR
;
; E400 OPEN
; 2 CLOSE
; 4 GET
; 6 PUT
; 8 STATUS
; A SPECIAL
; C JUMP TO POWER ON INIT
; F NOT USED
;
EDITRV EQU $E400 ;EDITOR
SCRENV EQU $E410 ;TV SCREEN
KEYBDV EQU $E420 ;KEYBOARD
PRINTV EQU $E430 ;PRINTER
CASETV EQU $E440 ;CASSETTE
;
; JUMP VECTOR TABLE
;
; THE FOLLOWING IS A TABLE OF
; JUMP INSTRUCTIONS TO VARIOUS
; ENTRY POINTS IN THE OPERATING
; SYSTEM
;
DISKIV EQU $E450 ;DISK INITIALIZATION
DSKINV EQU $E453 ;DISK INTERFACE
CIOV EQU $E456 ;CENTRAL I/O ROUTINE
SIOV EQU $E459 ;SERIAL I/O ROUTINE
SETVBV EQU $E45C ;SET SYSTEM TIMERS
SYSVBV EQU $E45F ;VBLANK CALCULATIONS
XITVBV EQU $E462 ;EXIT VBLANK
SIOINV EQU $E465 ;SIO INITIALIZATION
SENDEV EQU $E468 ;SEND ENABLE ROUTINE
INTINV EQU $E46B ;INTRPT HANDLER INIT
CIOINV EQU $E46E ;CIO INITIALIZATION
BLKBDV EQU $E471 ;BLACKBOARD MODE
WARMSV EQU $E474 ;WARM START VECTOR
COLDSV EQU $E477 ;COLD START VECTOR
RBLOKV EQU $E47A ;CASSETTE READ BLOCK
CSOPIV EQU $E47D ;CASSETTE INPUT OPEN
;
; VECTORS ADDED FOR 800XL
;
PUPDIV EQU $E480 ;POWER UP DISPLAY
SLFTSV EQU $E483 ;SELF TEST PROGRAM
PHENTV EQU $E486 ;UPLOADED HANDLER ENTER
PHULNV EQU $E489 ;UPLOADED HANDLER UNLINK
PHINIV EQU $E48C ;UPLOADED HANDLER INIT
;
; OPERATING SYSTEM EQUATES
;
; COMMAND CODES FOR IOCBS
;
OPEN EQU $03 ;OPEN FOR I/O
GETREC EQU $05 ;GET RECORD (TEXT)
GETCHR EQU $07 ;GET CHARACTER(S)
PUTREC EQU $09 ;PUT RECORD (TEXT)
PUTCHR EQU $0B ;PUT CHARACTER(S)
CLOSE EQU $0C ;CLOSE DEVICE
STATIS EQU $0D ;STATUS REQUEST
SPECIL EQU $0E ;SPECIAL ENTRY COMMAND
;
; SPECIAL ENTRY COMMANDS
;
DRAWLN EQU $11 ;DRAW LINE
FILLIN EQU $12 ;FILL
RENAME EQU $20 ;RENAME DISK FILE
DELETE EQU $21 ;DELETE DISK FILE
FORMAT EQU $22 ;FORMAT DISK
LOCKFL EQU $23 ;LOCK FILE
UNLOCK EQU $24 ;UNLOCK FILE
POINT EQU $25 ;POINT SECTOR
NOTE EQU $26 ;NOTE SECTOR
IOCFRE EQU $FF ;IOCB "FREE"
;
; AUX1 EQUATES
; () INDICATES WHICH DEVICES
;
APPEND EQU $01 ;WR APPEND(D)-SCN RD(E)
DIRECT EQU $02 ;OPEN DIRECTORY(D)
OPNIN EQU $04 ;OPEN FOR INPUT(ALL)
OPNOT EQU $08 ;OPEN FOR OUTPUT(ALL)
OPNINO EQU $0C ;OPEN INPUT&OUTPUT(ALL)
MXDMOD EQU $10 ;OPEN MIXED MODE(E,S)
INSCLR EQU $20 ;OPEN W/O CLEAR(E,S)
;
; DEVICE NAMES
;
SCREDT EQU 'E' ;SCREEN EDITOR (R/W)
KBD EQU 'K' ;KEYBOARD (R ONLY)
DISPLY EQU 'S' ;SCREEN DISPLAY (R/W)
PRINTR EQU 'P' ;PRINTER (W ONLY)
CASSET EQU 'C' ;CASSETTE (R/W)
RS232 EQU 'R' ;MODEM (R/W)
DISK EQU 'D' ;DISK (R/W)
;
;
;
; OPERATING SYSTEM STATUS CODES
;
SUCCES EQU $01 ;SUCCESSFUL OPERATION
BRKABT EQU $80 ;BREAK KEY ABORT
PRVOPN EQU $81 ;IOCB ALREADY OPEN
NONDEV EQU $82 ;NON-EXISTANT DEVICE
WRONLY EQU $83 ;IOCB OPEN FOR W ONLY
NVALID EQU $84 ;INVALID COMMAND
NOTOPN EQU $85 ;DEVICE/FILE NOT OPEN
BADIOC EQU $86 ;INVALID IOCB #
RDONLY EQU $87 ;IOCB OPEN FOR R ONLY
EOFERR EQU $88 ;END OF FILE
TRNRCD EQU $89 ;TRUNCATED RECORD
TIMOUT EQU $8A ;PERIPHERAL TIMEOUT
DNACK EQU $8B ;DEVICE NO ACKNOWLEDGE
FRMERR EQU $8C ;SERIAL BUS FRAME ERR
CRSROR EQU $8D ;CURSOR OVERRANGE
OVRRUN EQU $8E ;SERIAL DATA OVERRUN
CHKERR EQU $8F ;SERIAL CHECKSUM ERR
DERRER EQU $90 ;PERIPHRAL DEVICE ERR
BADMOD EQU $91 ;BAD SCREEN MODE #
FNCNOT EQU $92 ;NONEXISTANT FUNCTION
SCRMEM EQU $93 ;SCREEN MEM TOO SMALL
;
; PAGE ZERO RAM ASSIGNMENTS
;
LNFLG EQU $00 ;LINBUG RAM
NGFLAG EQU $01 ;POWER-UP SELF-TEST FLAG
;
; THESE LOCATIONS NOT CLEARED
;
CASINI EQU $02 ;CASSETTE INIT LOC
RAMLO EQU $04 ;RAM POINTER MEM TST
TRAMSZ EQU $06 ;TEMP REG RAM SIZE
TSTDAT EQU $07 ;RAM TEST DATA REG
;
;CLEARED ON COLDSTART ONLY
;
WARMST EQU $08 ;WARM START FLAG
BOOTQ EQU $09 ;SUCCESSFUL BOOT FLG
DOSVEC EQU $0A ;DOS START VECTOR
DOSINI EQU $0C ;DOS INIT ADDRESS
APPMHI EQU $0E ;APPL MEM HI LIMIT
;
;CLEARED ON COLD OR WARM START
;
POKMSK EQU $10 ;MASK POKEY IRQ
BRKKEY EQU $11 ;BREAK KEY FLAG
RTCLOK EQU $12 ;REAL TIME CLOCK
BUFADR EQU $15 ;INDIRECT BUFF ADDR
ICCOMT EQU $17 ;COMMAND FOR VECTOR
DSKFMS EQU $18 ;FMS POINTER
DSKUTL EQU $1A ;DISK UTILITIES PTR
ABUFPT EQU $1C ;RESERVED
ICHIDZ EQU $20 ;HANDLER INDEX #
ICDNOZ EQU $21 ;DEVICE NUMBER
ICCOMZ EQU $22 ;COMMAND CODE
ICSTAZ EQU $23 ;STATUS RETURN
ICBALZ EQU $24 ;BUFFER ADDRESS
ICBAHZ EQU $25
ICPTLZ EQU $26 ;PUT BYTE ROUTINE-1
ICPTHZ EQU $27
ICBLLZ EQU $28 ;BUFFER LENGTH
ICBLHZ EQU $29
ICAX1Z EQU $2A ;AUXILIARY BYTES
ICAX2Z EQU $2B
ICSPRZ EQU $2C ;SPARE BYTES
ICIDNO EQU $2E ;IOCB # X 16
CIOCHR EQU $2F ;CIO CHARACTER BYTE
STATUS EQU $30 ;INTERNAL STATUS
CHKSUM EQU $31 ;CHECKSUM
BUFRLO EQU $32 ;DATA BUFFER LO BYTE
BUFRHI EQU $33 ;DATA BUFFER HI BYTE
BFENLO EQU $34 ;NEXT BYTE PAST DATA
BFENHI EQU $35 ;BUFFER (HI & LO)
LTEMP EQU $36 ;LOADER TEMP
BUFRFL EQU $38 ;DATA BUFFR FULL FLG
RECVDN EQU $39 ;RECIEVE DONE FLAG
XMTDON EQU $3A ;XMIT DONE FLAG
CHKSNT EQU $3B ;CHECKSUM SENT FLAG
NOCKSM EQU $3C ;NO CHKSUM SENT FLAG
;BPTR EQU $3D ;CASSETTE DATA INDEX
FTYPE EQU $3E ;INTERRECORD GAP TYPE
FEOF EQU $3F ;END OF FILE FLAG
FREQ EQU $40 ;BEEP COUNT
SOUNDR EQU $41 ;NOISY I/O FLAG
CRITIC EQU $42 ;CRITICAL MODE
FMSZPG EQU $43 ;FMS ZERO PAGE
ZCHAIN EQU $4A ;HANDLER LOADER TEMP
DSTAT EQU $4C ;DISPLAY STATUS
ATRACT EQU $4D ;ATTRACT FLAG
DRKMSK EQU $4E ;DARK ATTRACT MASK
COLRSH EQU $4F ;COLOR SHIFTER
TMPCHR EQU $50 ;TEMP STORAGE
HOLD1 EQU $51 ;TEMP STORAGE
LMARGN EQU $52 ;LEFT MARGIN (1)
RMARGN EQU $53 ;RIGHT MARGIN (38)
ROWCRS EQU $54 ;CURSOR COUNTERS
COLCRS EQU $55
DINDEX EQU $57 ;DISPLAY MODE #
SAVMSC EQU $58 ;SCREEN MEM ADDR
OLDROW EQU $5A ;DRAW START POSIT
OLDCOL EQU $5B
OLDCHR EQU $5D ;DATA UNDER CURSOR
OLDADR EQU $5E ;CURSOR MEM ADDR
FKDEF EQU $60 ;FUNC KEY DEFEAT POINTER
PALNTS EQU $62 ;PAL/NTSC FLAG
LOGCOL EQU $63 ;COL IN LOGICAL LINE
ADRESS EQU $64 ;TEMP STORAGE
MLTEMP EQU $66 ;TEMP STORAGE
SAVADR EQU $68 ;TEMP STORAGE
RAMTOP EQU $6A ;AVAILABLE RAM PAGES
BUFCNT EQU $6B ;BUFFER COUNT
BUFSTR EQU $6C ;EDITOR GETCH POINTR
BITMSK EQU $6E ;BIT MASK
SHFAMT EQU $6F ;PIXEL JUSTIFICATION
ROWAC EQU $70 ;ROW ACCUMULATOR
COLAC EQU $72 ;COLUMN ACCUMULATOR
ENDPT EQU $74 ;LINE LENGTH
DELTAR EQU $76 ;DELTA ROW
DELTAC EQU $77 ;DELTA COLUMN
KEYDEF EQU $79 ;KEY DEFEAT POINTER
SWPFLG EQU $7B ;SPLIT SCN CURS CNTL
HOLDCH EQU $7C ;KB CHAR TEMP HOLD
INSDAT EQU $7D ;TEMP STORAGE
COUNTR EQU $7E ;DRAW ITERATION CNT
;
; 80-FF ARE RESERVED FOR USER
;
; NOTE: SEE FLOATING POINT
; SUBROUTINE AREA FOR ZERO
; PAGE CELLS
;
; PAGE 1 - HARDWARE STACK
;
; PAGE TWO RAM ASSIGNMENTS
;
VDSLST EQU $0200 ;DSP LIST NMI VECTOR
VPRCED EQU $0202 ;PROCEED IRQ VECTOR
VINTER EQU $0204 ;INTERUPT IRQ VECTOR
VBREAK EQU $0206 ;BRK INST IRQ VECTOR
VKEYBD EQU $0208 ;POKEY KB IRQ VECTOR
VSERIN EQU $020A ;POKEY INPUT RDY IRQ
VSEROR EQU $020C ;POKEY OUTPUT RDY
VSEROC EQU $020E ;POKEY OUTPUT DONE
VTIMR1 EQU $0210 ;POKEY TIMER 1 IRQ
VTIMR2 EQU $0212 ;POKEY TIMER 2 IRQ
VTIMR4 EQU $0214 ;POKEY TIMER 4 IRQ
VIMIRQ EQU $0216 ;IMMED IRQ VECTOR
CDTMV1 EQU $0218 ;COUNT DOWN TIMER 1
CDTMV2 EQU $021A ;COUNT DOWN TIMER 2
CDTMV3 EQU $021C ;COUNT DOWN TIMER 3
CDTMV4 EQU $021E ;COUNT DOWN TIMER 4
CDTMV5 EQU $0220 ;COUNT DOWN TIMER 5
VVBLKI EQU $0222 ;IMM VBLK NMI VECTOR
VVBLKD EQU $0224 ;DEF VBLK NMI VECTOR
CDTMA1 EQU $0226 ;CDTMV1 JSR ADDRESS
CDTMA2 EQU $0228 ;CDTMV2 JSR ADDRESS
CDTMF3 EQU $022A ;CDTMV3 FLAG
SRTIMR EQU $022B ;SOFTWARE REPEAT TMR
CDTMF4 EQU $022C ;CDTMV4 FLAG
INTEMP EQU $022D ;IAN'S TEMP
CDTMF5 EQU $022E ;CDTMV5 FLAG
DMACTLS EQU $022F ;SAVE DMACTL REG
DLPTRS EQU $0230 ;SAVE DISP LIST LO
;SDLSTH EQU $0231 ;SAVE DISP LIST HI
SSKCTL EQU $0232 ;SKCTL REGISTER RAM
LCOUNT EQU $0233 ;LOADER TEMP
LPENH EQU $0234 ;LIGHT PEN HORIZONTAL
LPENV EQU $0235 ;LIGHT PEN VERTICAL
BRKKY EQU $0236 ;BREAK KEY VECTOR
RELADR EQU $0238 ;LOADER REL ADDR
CDEVIC EQU $023A ;COMMAND BUFFER-DEV
CCOMND EQU $023B ;COMMAND BUFFER-CMND
CAUX1 EQU $023C ;COMMAND BUFFER AUX1
CAUX2 EQU $023D ;COMMAND BUFFER AUX2
;TEMP EQU $023E ;TEMPORARY RAM CELL
ERRFLG EQU $023F ;DEVICE ERROR FLAG
DFLAGS EQU $0240 ;DISK FLAGS(SECTOR1)
DBSECT EQU $0241 ;# DISK BOOT SECTORS
BOOTAD EQU $0242 ;DISK BOOT ADDRESS
COLDST EQU $0244 ;COLDSTART FLAG 1=CS
RECLEN EQU $0245 ;LOADER LENGTH
DSKTIM EQU $0246 ;DISK TIME OUT REG
VSFLAG EQU $026C ;FINE SCROLL TEMP
KEYDIS EQU $026D ;KEY DISABLE FLAG
FINE EQU $026E ;FINE SCROLL ENABLE(A1200)
GPRIOR EQU $026F ;GLOBAL PRIORITY
PADDL0 EQU $0270 ;POT 0 RAM CELL
PADDL1 EQU $0271
PADDL2 EQU $0272
PADDL3 EQU $0273
STICK0 EQU $0278 ;JOYSTICK 0 RAM CELL
STICK1 EQU $0279
PTRIG0 EQU $027C ;PADDLE TRIGGER 0
PTRIG1 EQU $027D
PTRIG2 EQU $027E
PTRIG3 EQU $027F
STRIG0 EQU $0284 ;JOYSTICK TRIGGER 0
STRIG1 EQU $0285
HIBYTE EQU $0288 ;LOADER
WMODE EQU $0289 ;CASSETTE R/W MODE
BLIM EQU $028A ;CASSETTE RECORD SIZE
IMASK EQU $028B
JVECK EQU $028C ;JUMP VECTOR
NEWADR EQU $028E ;LOADER NEW ADDRESS
TXTROW EQU $0290 ;TEXT ROWCRS
TXTCOL EQU $0291 ;TEXT COLCRS
TINDEX EQU $0293 ;TEXT INDEX
TXTMSC EQU $0294 ;TEXT WINDOW MEM ADD
TXTOLD EQU $0296 ;TEXT OLDROW & COL
CRETRY EQU $029C ;# COMMAND RETRIES
HOLD3 EQU $029D
SUBTMP EQU $029E
HOLD2 EQU $029F
DMASK EQU $02A0 ;PIXEL LOCATION MASK
TMPLBT EQU $02A1
ESCFLG EQU $02A2 ;ESCAPE FLAG
TABMAP EQU $02A3 ;TAB STOP MAP
LOGMAP EQU $02B2 ;LINE START BIT MAP
INVFLG EQU $02B6 ;INVERSE VIDEO FLAG
FILFLG EQU $02B7 ;FILL FLAG FOR DRAW
TMPROW EQU $02B8
TMPCOL EQU $02B9
SCRFLG EQU $02BB ;SET IF SCROLLING
HOLD4 EQU $02BC ;TEMP USED BY DRAW
DRETRY EQU $02BD ;# OF DEVICE RETRIES
SHFLOK EQU $02BE ;SHIFT/CTL LOCK FLAG
BOTSCR EQU $02BF ;BOTTOM OF SCREEN
PCOLR0 EQU $02C0 ;P0 COLOR
PCOLR1 EQU $02C1 ;P1 COLOR
PCOLR2 EQU $02C2 ;P2 COLOR
PCOLR3 EQU $02C3 ;P3 COLOR
COLOR0 EQU $02C4 ;COLOR 0
COLOR1 EQU $02C5
COLOR2 EQU $02C6
COLOR3 EQU $02C7
COLOR4 EQU $02C8
RUNADR EQU $02C9 ;LOADER
HIUSED EQU $02CB ;LOADER
ZHIUSE EQU $02CD ;LOADER
GBYTEA EQU $02CF ;LOADER
LOADAD EQU $02D1 ;LOADER
ZLOADA EQU $02D3 ;LOADER
DSCTLN EQU $02D5 ;DISK SECTOR LENGTH
ACMISR EQU $02D7 ;RESERVED
KRPDEL EQU $02D9 ;KEY REPEAT DELAY
KEYREP EQU $02DA ;KEY REPEAT RATE(VBLANKS)
NOCLIK EQU $02DB ;CLICK ENABLE/DISABLE
HELPFG EQU $02DC ;HELP KEY FLAG
DMASAV EQU $02DD ;DMA SAVE STATE
PBPNT EQU $02DE ;PRINT BUFFER POINTER
PBUFSZ EQU $02DF ;PRINT BUFFER SIZE
DOSRUN EQU $02E0 ;DOS RUN/INIT ADDRESSES
RAMSIZ EQU $02E4 ;RAM SIZE-HIGH BYTE
MEMTOP EQU $02E5 ;TOP OF AVAIL MEMORY
MEMLO EQU $02E7 ;BOTTOM OF AVAIL MEM
HNDLOD EQU $02E9 ;POLL FLAG (1200)
DVSTAT EQU $02EA ;STATUS BUFFER
CBAUDL EQU $02EE ;CASSETTE BAUD RATE
CBAUDH EQU $02EF
CRSINH EQU $02F0 ;CURSOR INHIBIT 0=ON
KEYDEL EQU $02F1 ;KEY DELAY
CH1 EQU $02F2 ;PRIOR KB CHAR CODE
CHACT EQU $02F3 ;CHACTL REGISTER RAM
CHBAS EQU $02F4 ;CHBAS REGISTER RAM
NEWROW EQU $02F5 ;POINT DRAW GOES TO
NEWCOL EQU $02F6
ROWINC EQU $02F8 ;ROW INCREMENT VALUE
COLINC EQU $02F9 ;COL INCREMENT VALUE
CHAR EQU $02FA ;INTERNAL CHAR CODE
ATACHR EQU $02FB ;ATASCII CHARACTER
CHKEY EQU $02FC ;KB CHAR CODE (FIFO)
FILDAT EQU $02FD ;RIGHT FILL DATA
DSPFLG EQU $02FE ;DISPLAY FLAG
SSFLAG EQU $02FF ;START/STOP FLAG
;
; PAGE THREE RAM ASSIGNMENTS
;
DDEVIC EQU $0300 ;BUS I.D. NUMBER
DUNIT EQU $0301 ;UNIT NUMBER
DCOMND EQU $0302 ;BUS COMMAND
DSTATS EQU $0303 ;COMMAND TYPE/STATUS
DBUFLO EQU $0304 ;DATA BUFFER LO BYTE
DBUFHI EQU $0305 ;DATA BUFFER HI BYTE
DTIMLO EQU $0306 ;DEVICE TIMEOUT SECS
DUNUSE EQU $0307 ;UNUSED BYTE
DBYTLO EQU $0308 ;# OF BYTES XFERRED
DBYTHI EQU $0309
DAUX1 EQU $030A ;COMMAND AUX BYTE 1
DAUX2 EQU $030B ;COMMAND AUX BYTE 2
TIMER1 EQU $030C ;INITIAL TIMER VALUE
JMPERS EQU $030E ;OPTIONS (1200)
CASFLG EQU $030F ;CASSETE MODE IF SET
TIMER2 EQU $0310 ;FINAL TIMER VALUE
;TEMP1 EQU $0312 ;TEMP STORAGE
;TEMP2 EQU $0313 ;TEMP STORAGE
PTIMOT EQU $0314 ;PRINTER TIMEOUT REG
;TEMP3 EQU $0315 ;TEMP STORAGE
SAVIO EQU $0316 ;SAVE SERIAL IN DATA
TIMFLG EQU $0317 ;TIMEOUT FLAG C BAUD
STACKP EQU $0318 ;SIO STACK PTR SAVE
TSTAT EQU $0319 ;TEMP STATUS HOLDER
HATABS EQU $031A ;HANDLER ADDR TABLE
PUPBT1 EQU $033D ;POWER/UP RESET
PUPBT2 EQU $033E
PUPBT3 EQU $033F
ICHID EQU $0340 ;HANDLER INDEX #
ICDNO EQU $0341 ;DEVICE NUMBER
ICCOM EQU $0342 ;COMMAND CODE
ICSTA EQU $0343 ;STATUS
ICBAL EQU $0344 ;BUFFER ADDR LO BYTE
ICBAH EQU $0345 ;BUFFER ADDR HI BYTE
ICPTL EQU $0346 ;PUT ROUTINE ADDR-1
ICPTH EQU $0347
ICBLL EQU $0348 ;BUFFER LENGTH LO
ICBLH EQU $0349 ;BUFFER LENGTH HI
ICAX1 EQU $034A ;AUX BYTE 1
ICAX2 EQU $034B ;AUX BYTE 2
ICSPR EQU $034C ;SPARE BYTES
PRNBUF EQU $03C0 ;PRINTER BUFFER (40 BYTES)
SUPERF EQU $03E8 ;SCREEN EDITOR
CKEY EQU $03E9 ;START KEY FLAG
CASSBT EQU $03EA ;CASSETTE BOOT FLAG
CARTCK EQU $03EB ;CARTRIDGE CHECKSUM
ACMVAR EQU $03ED ;RESERVED
MINTLK EQU $03F9 ;RESERVED
GINTLK EQU $03FA ;CART INTERLOCK
CHLINK EQU $03FB ;HANDLER CHAIN
;
; PAGE FOUR RAM ASSIGNMENTS
;
CASBUF EQU $03FD ;CASSETTE BUFFER (131 BYTES)
USAREA EQU $0480 ;USER AREA
;
; PAGE FIVE AND SIX ARE RESERVED
; FOR USER WORK SPACE
;
; COLLEEN MNEMONICS
;
; ---------------------------------------------------------------------------
POKEY EQU $D200
; ---------------------------------------------------------------------------
;
; READ
;
POT0 EQU POKEY+$00
POT1 EQU POKEY+$01
POT2 EQU POKEY+$02
POT3 EQU POKEY+$03
POT4 EQU POKEY+$04
POT5 EQU POKEY+$05
POT6 EQU POKEY+$06
POT7 EQU POKEY+$07
ALLPOT EQU POKEY+$08
KBCODE EQU POKEY+$09
RANDOM EQU POKEY+$0a
POTGO EQU POKEY+$0b
SERIN EQU POKEY+$0d
IRQST EQU POKEY+$0e
SKSTAT EQU POKEY+$0f
;
; WRITE
;
AUDF1 EQU POKEY+$00
AUDC1 EQU POKEY+$01
AUDF2 EQU POKEY+$02
AUDC2 EQU POKEY+$03
AUDF3 EQU POKEY+$04
AUDC3 EQU POKEY+$05
AUDF4 EQU POKEY+$06
AUDC4 EQU POKEY+$07
AUDCTL EQU POKEY+$08
STIMER EQU POKEY+$09
SKRES EQU POKEY+$0a
SEROUT EQU POKEY+$0d
IRQEN EQU POKEY+$0e
SKCTL EQU POKEY+$0f
;
;
;
; ---------------------------------------------------------------------------
GTIA EQU $D000
; ---------------------------------------------------------------------------
;
; WRITE
;
HPOSP0 EQU GTIA+$00
HPOSP1 EQU GTIA+$01
HPOSP2 EQU GTIA+$02
HPOSP3 EQU GTIA+$03
HPOSM0 EQU GTIA+$04
HPOSM1 EQU GTIA+$05
HPOSM2 EQU GTIA+$06
HPOSM3 EQU GTIA+$07
SIZEP0 EQU GTIA+$08
SIZEP1 EQU GTIA+$09
SIZEP2 EQU GTIA+$0a
SIZEP3 EQU GTIA+$0b
SIZEM EQU GTIA+$0c
GRAFP0 EQU GTIA+$0d
GRAFP1 EQU GTIA+$0e
GRAFP2 EQU GTIA+$0f
GRAFP3 EQU GTIA+$10
GRAFM EQU GTIA+$11
COLPM0 EQU GTIA+$12
COLPM1 EQU GTIA+$13
COLPM2 EQU GTIA+$14
COLPM3 EQU GTIA+$15
COLPF0 EQU GTIA+$16
COLPF1 EQU GTIA+$17
COLPF2 EQU GTIA+$18
COLPF3 EQU GTIA+$19
COLBAK EQU GTIA+$1a
PRIOR EQU GTIA+$1b
VDELAY EQU GTIA+$1c
GRACTL EQU GTIA+$1d
HITCLR EQU GTIA+$1e
CONSOL EQU GTIA+$1f
;
; READ
;
M0PF EQU GTIA+$00
M1PF EQU GTIA+$01
M2PF EQU GTIA+$02
M3PF EQU GTIA+$03
P0PF EQU GTIA+$04
P1PF EQU GTIA+$05
P2PF EQU GTIA+$06
P3PF EQU GTIA+$07
M0PL EQU GTIA+$08
M1PL EQU GTIA+$09
M2PL EQU GTIA+$0a
M3PL EQU GTIA+$0b
P0PL EQU GTIA+$0c
P1PL EQU GTIA+$0d
P2PL EQU GTIA+$0e
P3PL EQU GTIA+$0f
TRIG0 EQU GTIA+$10
TRIG1 EQU GTIA+$11
TRIG2 EQU GTIA+$12
TRIG3 EQU GTIA+$13
PAL EQU GTIA+$14
;
;
; ---------------------------------------------------------------------------
ANTIC EQU $D400
; ---------------------------------------------------------------------------
;
DMACTL EQU ANTIC+$00
CHACTL EQU ANTIC+$01
DLPTR EQU ANTIC+$02
;DLISTH EQU ANTIC+$03
HSCROL EQU ANTIC+$04
VSCROL EQU ANTIC+$05
PMBASE EQU ANTIC+$07
CHBASE EQU ANTIC+$09
WSYNC EQU ANTIC+$0a
VCOUNT EQU ANTIC+$0b
PENH EQU ANTIC+$0c
PENV EQU ANTIC+$0d
NMIEN EQU ANTIC+$0e
NMIRES EQU ANTIC+$0f
NMIST EQU ANTIC+$0f
;
;
; ---------------------------------------------------------------------------
PIA EQU $D300
; ---------------------------------------------------------------------------
;
PORTA EQU PIA+0
PORTB EQU PIA+1
PACTL EQU PIA+2
PBCTL EQU PIA+3
;
; ---------------------------------------------------------------------------
; Atari ANTIC chip display list equates
; ---------------------------------------------------------------------------
;
JUMP EQU $01 ; display list jump instruction (3 byte)
JVB EQU $41 ; display list jump and wait for vblank instruction (3)
;
SCH EQU $10 ; display list horizontal scrolling
SCV EQU $20 ; display list vertical scrolling
LMS EQU $40 ; display list load memory scan instruction (3 byte)
DLII EQU $80 ; display list interrupt instruction
;
SKIP1 EQU $00 ; display list skip 1 scan line instruction
SKIP2 EQU $10 ; display list skip 2 scan lines instruction
SKIP3 EQU $20 ; display list skip 3 scan lines instruction
SKIP4 EQU $30 ; display list skip 4 scan lines instruction
SKIP5 EQU $40 ; display list skip 5 scan lines instruction
SKIP6 EQU $50 ; display list skip 6 scan lines instruction
SKIP7 EQU $60 ; display list skip 7 scan lines instruction
SKIP8 EQU $70 ; display list skip 8 scan lines instruction
;
MODE2 EQU $02 ; display list mode 2
MODE4 EQU $04 ; display list mode 4
MODE8 EQU $08 ; display list mode 8
MODEE EQU $0E ; display list mode E
MODEF EQU $0F ; display list mode F
; ---------------------------------------------------------------------------
; ENUMS
; ---------------------------------------------------------------------------
.enum @dmactl
blank = %00
narrow = %01
standard= %10
wide = %11
missiles= %100
players = %1000
lineX1 = %10000
lineX2 = %00000
dma = %100000
.ende
scr48 = @dmactl(wide|dma|players|missiles|lineX1)
scr40 = @dmactl(standard|dma|players|missiles|lineX1)
scr32 = @dmactl(narrow|dma|players|missiles|lineX1)
.enum @pmcntl
missiles= %1
players = %10
trigs = %100
.ende
.enum @gtictl
prior0 = %0
prior1 = %1
prior2 = %10
prior4 = %100
prior8 = %1000
ply5 = %10000 ; Fifth Player Enable
mlc = %100000 ; Multiple Color Player Enable
mode9 = %01000000
mode10 = %10000000
mode11 = %11000000
.ende
-514
View File
@@ -1,514 +0,0 @@
.enum @dmactl
blank = %00
narrow = %01
standard= %10
wide = %11
missiles= %100
players = %1000
lineX1 = %10000
lineX2 = %00000
dma = %100000
.ende
scr48 = @dmactl(wide|dma|players|missiles|lineX1)
scr40 = @dmactl(standard|dma|players|missiles|lineX1)
scr32 = @dmactl(narrow|dma|players|missiles|lineX1)
.enum @pmcntl
missiles= %1
players = %10
trigs = %100
.ende
.enum @gtictl
prior0 = %0
prior1 = %1
prior2 = %10
prior4 = %100
prior8 = %1000
ply5 = %10000 ; Fifth Player Enable
mlc = %100000 ; Multiple Color Player Enable
mode9 = %01000000
mode10 = %10000000
mode11 = %11000000
.ende
* ---------------------------------------------------------------------------------------------
* --- GTIA
* ---------------------------------------------------------------------------------------------
HPOSP0 = $D000 ; pozioma pozycja gracza 0 (Z)
HPOSP1 = $D001 ; pozioma pozycja gracza 1 (Z)
HPOSP2 = $D002 ; pozioma pozycja gracza 2 (Z)
HPOSP3 = $D003 ; pozioma pozycja gracza 3 (Z)
HPOSM0 = $D004 ; pozioma pozycja pocisku 0 (Z)
HPOSM1 = $D005 ; pozioma pozycja pocisku 1 (Z)
HPOSM2 = $D006 ; pozioma pozycja pocisku 2 (Z)
HPOSM3 = $D007 ; pozioma pozycja pocisku 3 (Z)
SIZEP0 = $D008 ; poziomy rozmiar gracza 0 (Z)
SIZEP1 = $D009 ; poziomy rozmiar gracza 1 (Z)
SIZEP2 = $D00A ; poziomy rozmiar gracza 2 (Z)
SIZEP3 = $D00B ; poziomy rozmiar gracza 3 (Z)
SIZEM = $D00C ; poziomy rozmiar pociskw (Z)
GRAFP0 = $D00D ; rejestr grafiki gracza 0 (Z)
GRAFP1 = $D00E ; rejestr grafiki gracza 1 (Z)
GRAFP2 = $D00F ; rejestr grafiki gracza 2 (Z)
GRAFP3 = $D010 ; rejestr grafiki gracza 3 (Z)
GRAFM = $D011 ; rejestr grafiki pociskw (Z)
COLPM0 = $D012 ; rejestr koloru gracza i pocisku 0 (Z)
COLPM1 = $D013 ; rejestr koloru gracza i pocisku 1 (Z)
COLPM2 = $D014 ; rejestr koloru gracza i pocisku 2 (Z)
COLPM3 = $D015 ; rejestr koloru gracza i pocisku 3 (Z)
COLPF0 = $D016 ; rejestr koloru pola gry 0 (Z)
COLPF1 = $D017 ; rejestr koloru pola gry 1 (Z)
COLPF2 = $D018 ; rejestr koloru pola gry 2 (Z)
COLPF3 = $D019 ; rejestr koloru pola gry 3 (Z)
COLBAK = $D01A ; rejestr koloru ta (Z)
COLOR0 = colpf0
COLOR1 = colpf1
COLOR2 = colpf2
COLOR3 = colpf3
KOLM0PF = $D000 ; kolizja pocisku 0 z polem gry (O)
KOLM1PF = $D001 ; kolizja pocisku 1 z polem gry (O)
KOLM2PF = $D002 ; kolizja pocisku 2 z polem gry (O)
KOLM3PF = $D003 ; kolizja pocisku 3 z polem gry (O)
KOLP0PF = $D004 ; kolizja gracza 0 z polem gry (O)
KOLP1PF = $D005 ; kolizja gracza 1 z polem gry (O)
KOLP2PF = $D006 ; kolizja gracza 2 z polem gry (O)
KOLP3PF = $D007 ; kolizja gracza 3 z polem gry (O)
KOLM0P = $D008 ; kolizja pocisku 0 z graczem (O)
KOLM1P = $D009 ; kolizja pocisku 1 z graczem (O)
KOLM2P = $D00A ; kolizja pocisku 2 z graczem (O)
KOLM3P = $D00B ; kolizja pocisku 3 z graczem (O)
KOLP0P = $D00C ; kolizja gracza 0 z innym graczem (O)
KOLP1P = $D00D ; kolizja gracza 1 z innym graczem (O)
KOLP2P = $D00E ; kolizja gracza 2 z innym graczem (O)
KOLP3P = $D00F ; kolizja gracza 3 z innym graczem (O)
TRIG0 = $D010 ; stan przycisku joysticka 0 (O)
TRIG1 = $D011 ; stan przycisku joysticka 1 (O)
TRIG3 = $D013 ; znacznik doczenia cartridge-a (O)
PAL = $D014 ; znacznik systemu TV (O)
GTICTL = $D01B ; rejestr kontroli ukadu GTIA
GTIACTL = gtictl
VDELAY = $D01C ; licznik opnienia pionowego P/MG
PMCNTL = $D01D ; rejestr kontroli graczy i pociskw
HITCLR = $D01E ; rejestr kasowania rejestrw kolizji
CONSOL = $D01F ; rejestr stanu klawiszy konsoli Start (bit 0), Select (bit 1), Option (bit 2)
* ---------------------------------------------------------------------------------------------
* --- POKEY
* ---------------------------------------------------------------------------------------------
IRQENS = $0010 ; shadow register IRQEN
IRQSTAT = $0011 ; shadow register IRQST
AUDF3 = $D204 ; czstotliwo pracy generatora 3 (Z)
AUDCTL = $D208 ; rejestr kontroli generatorw dwiku (Z)
STIMER = $D209 ; rejestr zerowania licznikw (Z)
KBCODE = $D209 ; kod ostatnio nacinitego klawisza (O)
SKSTRES = $D20A ; rejestr statusu zcza szeregowego (Z)
RANDOM = $D20A ; rejestr liczby losowej (O)
SEROUT = $D20D ; szeregowy rejestr wyjciowy (Z)
SERIN = $D20D ; szeregowy rejestr wejciowy (O)
IRQEN = $D20E ; zezwolenie przerwa IRQ (Z)
IRQST = $D20E ; status przerwa IRQ (O)
SKCTL = $D20F ; rejestr kontroli zcza szeregowego (Z)
SKSTAT = $D20F ; rejestr statusu zcza szeregowego (O)
* ---------------------------------------------------------------------------------------------
* --- PIA
* ---------------------------------------------------------------------------------------------
PORTA = $D300 ; port A ukadu PIA
PORTB = $D301 ; port B ukadu PIA
PACTL = $D302 ; rejestr kontroli portu A
PBCTL = $D303 ; rejestr kontroli portu B
* ---------------------------------------------------------------------------------------------
* --- ANTIC
* ---------------------------------------------------------------------------------------------
DMACTL = $D400 ; rejestr kontroli dostpu do pamici
CHRCTL = $D401 ; rejestr kontroli wywietlania znakw
DLPTR = $D402 ; adres programu ANTIC-a
HSCROL = $D404 ; znacznik poziomego przesuwu obrazu
VSCROL = $D405 ; znacznik pionowego przesuwu obrazu
PMBASE = $D407 ; adres pamici graczy i pociskw
CHBASE = $D409 ; adres zestawu znakw
WSYNC = $D40A ; znacznik oczekiwania na synchronizacj poziom
VCOUNT = $D40B ; licznik linii obrazu
LPENH = $D40C ; poziome pooenie pira wietlengo
LPENV = $D40D ; pionowe pooenie pira wietlnego
NMIEN = $D40E ; rejestr zezwole na przerwania NMI
NMIST = $D40F ; rejestr statusu przerwa NMI
;-------------------------------------
;additional system variables
;-------------------------------------
ATRACT = $004D
COLPM0S = $02C0 ;- - shadow register COLPM0
COLPM1S = $02C1 ;- - shadow register COLPM1
COLPM2S = $02C2 ;- - shadow register COLPM2
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 ;- - shadow register GTIACTL
DMACTLS = $022F ;- - rejestr kontroli dostpu do pamici - cie
DLPTRS = $0230 ;- - adres programu ANTIC-a - cie
CHBAS = $02F4 ;- - shadow register CHBASE
KBCODES = $02FC ;- - shadow register KBCODE
SETVBV = $E45C
XITVBV = $E462
SYSVBV = $E45F
RTCLOK = $0012
MEMTOP = $02E5 ;- - adres grnej granicy wolnej pamici RAM
MEMLO = $02E7 ;- - adres dolnej granicy wolnej pamici RAM
JSTICK0 = $0278 ;- - pooenie joysticka 0
JSTICK1 = $0279 ;- JSTICK1 - pooenie joysticka 1
JSTICK2 = $027A ;- JSTICK2 - pooenie joysticka 0
JSTICK3 = $027B ;- JSTICK3 - pooenie joysticka 1
PTRIG0 = $027C ;- PTRIG0 - przycisk potencjometru 0
PTRIG1 = $027D ;- PTRIG1 - przycisk potencjometru 1
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
/*
Rejestry OS w pamici RAM
$08 - WARMST - znacznik gorcego startu
$0E - APPMHI - najwyszy adres RAM zajty przez program
$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 przejciowy kodu operacji I/O
$20 - ZIOCB - zerostronicowy blok kontroli I/O
$20 - ICHIDZ - indeks wpisu urzdzenia w HATABS
$21 - ICDNOZ - numer urzdzenia
$22 - ICCOMZ - kod operacji wejcia/wyjcia
$23 - ICSTZ - status operacji wejcia/wyjcia
$24 - ICBAZ - adres bufora danych dla operacji I/O
$26 - ICPTZ - adres procedury obsugi dla operacji
$28 - ICBLZ - dugo bufora danych dla operacji I/O
$2A - ICAX1Z - rejestr pomocniczy ZIOCB
$2B - ICAX2Z - rejestr pomocniczy ZIOCB
$2C - ICAX3Z - rejestr pomocniczy ZIOCB
$2D - ICAX4Z - rejestr pomocniczy ZIOCB
$2E - ICAX5Z - rejestr pomocniczy ZIOCB
$2F - ICAX6Z - rejestr pomocniczy ZIOCB
$30 - STATUS - status aktualnej operacji SIO
$31 - CHKSUM - suma kontrolna dla operacji SIO
$32 - BUFR - adres bufora danych dla SIO
$34 - BUFEN - adres koca bufora danych dla SIO
$36 - LTEMP - pomocniczy wektor odczytu listy liniowej
$38 - BUFRFL - znacznik zapenienia bufora SIO
$39 - RECVND - znacznik koca odczytu
$3A - XMTDON - znacznik koca transmisji
$3B - CHKSNT - znacznik nadania sumy kontrolnej
$3C - NOCKSM - znacznik braku sumy kontrolnej
$3D - BPTR - licznik bufora magnetofonu
$3E - GAPTYP - znacznik dugoci przerwy midzy blokami
$3F - FEOF - znacznik koca zbioru
$40 - FREQ - licznik dwiku przy otwarciu magnetofonu
$41 - IOSNDEN - znacznik dwiku przy transmisji
$42 - CRITIC - znacznik krytycznych czasowo operacji I/O
$4A - ZCHAIN - rejestr nastpstwa listy liniowej
$4C - DSTAT - status klawiatury i ekranu
$50 - TEMP - pomocniczy rejestr przejciowy
$51 - HOLD1 - pomocniczy rejestr przejciowy
$52 - LMARGIN - lewy margines obrazu
$53 - RMARGIN - prawy margines obrazu
$54 - ROWCRS - pionowa pozycja kursora
$55 - COLCRS - pozioma pozycja kursora
$57 - DINDEX - numer trybu graficznego OS
$58 - SAVMSC - adres pamici obrazu
$5A - OLDROW - poprzednia pionowa pozycja kursora
$5B - OLDCOL - poprzednia pozioma pozycja kursora
$5D - OLDCHR - poprzedni znak na ekranie
$5E - OLDADR - poprzedni adres znaku na ekranie
$60 - FKDEFP - wektor tabeli definicji klawiszy F1-F4
$62 - PALNTS - wskanik systemu TV
$63 - LOGCOL - adres kursora w wierszu logicznym
$64 - ADRESS - rejestr adresowy dla procedur edytora
$66 - MLTTMP - pomocniczy rejestr przejciowy
$68 - SAVADR - pomocniczy rejestr adresowy
$6A - RAMTOP - liczba stron pamici RAM
$6B - BUFCNT - licznik bufora edytora
$6C - BUFSTR - adres bufora dla edytora
$6E - BITMSK - maska bitowa do wywietlenia znaku
$6F - SHFAMT - liczba przesuni punktu
$70 - ROWAC - aktualny wiersz przy rysowaniu
$72 - COLAC - aktualna kolumna przy rysowaniu
$74 - ENDPT - znacznik koca rysowanej linii
$76 - DELTAR - przyrost pionowej pozycji kursora
$77 - DELTAC - przyrost poziomej pozycji kursora
$79 - KEYDEFP - wektor tabeli definicji klawiszy
$7B - SWPFLG - znacznik kursora w trybach z oknem
$7C - HOLDCH - przechowywanie wartoci znaku
$7D - INSDAT - rejestr pomocniczy edytora
$7E - COUNTR - licznik pamici obrazu dla DOSCR i DRAW
$0100 - STACK - stos mikroprocesora 6502
$0200 - DLIV - wektor przerwania programu ANTIC-a
$0210 - VTIMR1 - wektor przerwania licznika 1 POKEY-a
$0212 - VTIMR2 - wektor przerwania licznika 2 POKEY-a
$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 - shadow register DMACTL
$0230 - DLPTRS - shadow register DLPTR
$0232 - SKCTLS - shadow register SKCTL
$0233 - LCOUNT - licznik odczytu dla nowego urzdzenia
$0234 - LPENHS - shadow register LPENH
$0235 - LPENVS - shadow register LPENV
$023A - CDEVIC - kod urzdzenia dla SIO
$023B - CCMND - kod operacji dla SIO
$023C - CAUX1 - pierwszy bajt pomocniczy dla SIO
$023D - CAUX2 - drugi bajt pomocniczy dla SIO
$023E - TEMP - tymczasowy rejestr odpowiedzi urzdzenia
$023F - ERRFLG - znacznik bdu operacji SIO
$0244 - COLDST - znacznik zimnego startu systemu
$0245 - RECLEN - dugo rekordu z nowego urzdzenia
$0246 - DSKTIM - warto Timeout dla stacji dyskw
$0247 - PDVMSK - maska obecnoci nowych urzdze
$0248 - PDVRS - shadow register PDVREG
$024A - RELADR - adres procedury przemieszczalnej
$024C - PPTMPA - rejestr przechowania zawartoci akumulatora
$024D - PPTMPX - rejestr przechowania zawartoci rejestru X
$026B - CHSPTR - wektor nieuywanego zestawu znakw
$026C - VSFLAG - znacznik przesuwu pionowego obrazu
$026E - FINE - znacznik delikatnego przesuwu obrazu
$026F - GTICTLS - shadow register GTIACTL
$0270 - PADDL0 - shadow register POT0
$0278 - JSTICK0 - pooenie joysticka 0
$0279 - JSTICK1 - pooenie joysticka 1
$027A - JSTICK2 - pooenie joysticka 0
$027B - JSTICK3 - pooenie joysticka 1
$027C - PTRIG0 - przycisk potencjometru 0
$027D - PTRIG1 - przycisk potencjometru 1
$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 urzdzenia
$0289 - WMODE - znacznik sposobu dostpu do magnetofonu
$028A - BLIM - dugo bufora magnetofonu
$028E - NEWADR - adres procedury nowego urzdzenia
$0290 - TXTROW - wiersz kursora w oknie tekstowym
$0291 - TXTCOL - kolumna kursora w oknie tekstowym
$0293 - TINDEX - tryb graficzny OS w oknie tekstowym
$0294 - TXTMSC - adres pamici okna tekstowego
$029C - CRETRY - liczba powtrze rozkazu operacji
$029D - HOLD3 - pomocniczy rejestr przejciowy
$029E - SUBTMP - pomocniczy rejestr przejciowy
$02A0 - DMASK - maska punktw obrazu
$02A2 - ESCFLG - znacznik klawisza ESC
$02A3 - TABMAP - mapa pozycji tabulacji
$02B2 - LOGMAP - mapa linii logicznych
$02B6 - INVFLG - znacznik klawisza inverse video
$02B7 - FILFLG - znacznik wypeniania obrazu
$02B8 - TMPROW - tymczasowy rejestr pozycji kursora
$02B9 - TMPCOL - tymczasowy rejestr pozycji kursora
$02BB - SCRFLG - znacznik przesuwu obrazu
$02BC - HOLD4 - pomocniczy rejestr przejciowy
$02BD - DRETRY - liczba powtrze wywoa urzdzenia
$02BE - SHFLOK - znacznik klawiszy SHIFT i CONTROL
$02BF - BOTSCR - liczba wierszy tekstu
$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 urzdzenia
$02CB - HIUSED - adres kocowy procedury nowego urzdzenia
$02CF - GBYTEA - adres procedury nowego urzdzenia
$02D1 - LOADAD - adres wczytywania z nowego urzdzenia
$02D3 - ZLOADA - pomocniczy rejestr adresu wczytywania
$02D5 - DSCTLN - dugo sektora dyskowego
$02DB - NOCLIK - znacznik dwiku klawiatury
$02DE - PBPNT - licznik bufora drukarki
$02DF - PBUFSZ - dugo bufora drukarki
$02E5 - MEMTOP - adres grnej granicy wolnej pamici RAM
$02E7 - MEMLO - adres dolnej granicy wolnej pamici RAM
$02E9 - HNDLOD - znacznik relokowalnej procedury obsugi I/O
$02EA - DVSTAT - dodatkowy rejestr statusu urzdzenia
$02EC - DVTMOT - dodatkowy rejestr Timeout urzdzenia
$02ED - REVNUM - numer wersji nowego urzdzenia
$02EE - CBAUD - prdko transmisji z magnetofonu
$02F0 - CRSINH - znacznik widocznoci kursora
$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 wewntrzny znaku
$02FB - ATACHR - kod ATASCII znaku
$02FC - KBCODES - shadow register KBCODE
$02FD - FILDAT - numer koloru dla wypeniania
$02FE - DSPFLG - znacznik wywietlania znakw kontrolnych
$02FF - SSFLAG - znacznik start/stop dla przesuwu obrazu
$0300 - DDEVIC - kod identyfikacyjny urzdzenia
$0301 - DUNIT - numer identyfikacyjny urzdzenia
$0302 - DCMND - bajt rozkazu dla urzdzenia
$0303 - DSTATS - status urzdzenia
$0304 - DBUFA - adres bufora danych
$0306 - DTIMLO - warto Timeout dla urzdzenia
$0308 - DBYT - dugo bufora danych
$030A - DAUX1 - rejestr pomocniczy dla operacji I/O
$030B - DAUX2 - rejestr pomocniczy dla operacji I/O
$030C - INTIM1 - rejestr czasu przy odczycie z magnetofonu
$030F - CASFLG - znacznik operacji z magnetofonem
$0310 - INTIM2 - rejestr czasu przy odczycie z magnetofonu
$0312 - TEMP1 - pomocniczy rejestr przejciowy
$0313 - TEMP2 - pomocniczy rejestr przejciowy
$0314 - PTIMOT - warto Timeout dla drukarki
$0315 - TEMP3 - pomocniczy rejestr przejciowy
$0316 - SAVIO - rejestr przejciowy dla operacji SIO
$0317 - TIMFLG - znacznik upynicia czasu Timeout
$0318 - STACKP - rejestr wskanika stosu dla SIO
$0319 - TSTAT - przejciowy rejestr statusu SIO
$031A - HATABS - tabela wektorw procedur obsugi
$0340 - IOCB0 - blok kontroli I/O numer 0
$0350 - IOCB1 - blok kontroli I/O numer 1
$0360 - IOCB2 - blok kontroli I/O numer 2
$0370 - IOCB3 - blok kontroli I/O numer 3
$0380 - IOCB4 - blok kontroli I/O numer 4
$0390 - IOCB5 - blok kontroli I/O numer 5
$03A0 - IOCB6 - blok kontroli I/O numer 6
$03B0 - IOCB7 - blok kontroli I/O numer 7
$0340 - ICCHID - indeks wpisu urzdzenia w HATABS
$0341 - ICDNO - numer urzdzenia
$0342 - ICCMD - kod rozkazu operacji I/O
$0343 - ICSTAT - status operacji I/O
$0344 - ICBUFA - adres bufora danych dla operacji I/O
$0346 - ICPUTB - adres procedury przesyania danych
$0348 - ICBUFL - dugo bufora danych dla operacji I/O
$034A - ICAX1 - rejestr pomocniczy dla operacji I/O
$034B - ICAX2 - rejestr pomocniczy dla operacji I/O
$034C - ICAX3 - rejestr pomocniczy dla operacji I/O
$034D - ICAX4 - rejestr pomocniczy dla operacji I/O
$034E - ICAX5 - rejestr pomocniczy dla operacji I/O
$034F - ICAX6 - rejestr pomocniczy dla operacji I/O
$03C0 - PRNBUF - bufor drukarki
$03E8 - SUPERF - znacznik stosowany przy odczycie klawiatury
$03E9 - CKEY - znacznik klawisza START przy zimnym starcie
$03EC - DERRF - znacznik bdu przy otwieraniu edytora
$03FB - CHLINK - rejestr elementw listy liniowej
$03FD - CSCB - bajty kontroli szybkoci magnetofonu
$03FF - CRCB - bajt dugoci rekordu magnetofonowego
$0400 - CASBUF - bufor magnetofonu
$047F - CASBEN - koniec bufora magnetofonu
$D000 - HPOSP0 - pozioma pozycja gracza 0 (Z)
$D000 - KOLM0PF - kolizja pocisku 0 z polem gry (O)
$D001 - HPOSP1 - pozioma pozycja gracza 1 (Z)
$D001 - KOLM1PF - kolizja pocisku 1 z polem gry (O)
$D002 - HPOSP2 - pozioma pozycja gracza 2 (Z)
$D002 - KOLM2PF - kolizja pocisku 2 z polem gry (O)
$D003 - HPOSP3 - pozioma pozycja gracza 3 (Z)
$D003 - KOLM3PF - kolizja pocisku 3 z polem gry (O)
$D004 - HPOSM0 - pozioma pozycja pocisku 0 (Z)
$D004 - KOLP0PF - kolizja gracza 0 z polem gry (O)
$D005 - HPOSM1 - pozioma pozycja pocisku 1 (Z)
$D005 - KOLP1PF - kolizja gracza 1 z polem gry (O)
$D006 - HPOSM2 - pozioma pozycja pocisku 2 (Z)
$D006 - KOLP2PF - kolizja gracza 2 z polem gry (O)
$D007 - HPOSM3 - pozioma pozycja pocisku 3 (Z)
$D007 - KOLP3PF - kolizja gracza 3 z polem gry (O)
$D008 - SIZEP0 - poziomy rozmiar gracza 0 (Z)
$D008 - KOLM0P - kolizja pocisku 0 z graczem (O)
$D009 - SIZEP1 - poziomy rozmiar gracza 1 (Z)
$D009 - KOLM1P - kolizja pocisku 1 z graczem (O)
$D00A - SIZEP2 - poziomy rozmiar gracza 2 (Z)
$D00A - KOLM2P - kolizja pocisku 2 z graczem (O)
$D00B - SIZEP3 - poziomy rozmiar gracza 3 (Z)
$D00B - KOLM3P - kolizja pocisku 3 z graczem (O)
$D00C - SIZEM - poziomy rozmiar pociskw (Z)
$D00C - KOLP0P - kolizja gracza 0 z innym graczem (O)
$D00D - GRAFP0 - rejestr grafiki gracza 0 (Z)
$D00D - KOLP1P - kolizja gracza 1 z innym graczem (O)
$D00E - GRAFP1 - rejestr grafiki gracza 1 (Z)
$D00E - KOLP2P - kolizja gracza 2 z innym graczem (O)
$D00F - GRAFP2 - rejestr grafiki gracza 2 (Z)
$D00F - KOLP3P - kolizja gracza 3 z innym graczem (O)
$D010 - GRAFP3 - rejestr grafiki gracza 3 (Z)
$D010 - TRIG0 - stan przycisku joysticka 0 (O)
$D011 - GRAFM - rejestr grafiki pociskw (Z)
$D011 - TRIG1 - stan przycisku joysticka 1 (O)
$D012 - COLPM0 - rejestr koloru gracza i pocisku 0 (Z)
$D013 - COLPM1 - rejestr koloru gracza i pocisku 1 (Z)
$D013 - TRIG3 - znacznik doczenia cartridge'a (O)
$D014 - COLPM2 - rejestr koloru gracza i pocisku 2 (Z)
$D014 - PAL - znacznik systemu TV (O)
$D015 - COLPM3 - rejestr koloru gracza i pocisku 3 (Z)
$D016 - COLPF0 - rejestr koloru pola gry 0 (Z)
$D017 - COLPF1 - rejestr koloru pola gry 1 (Z)
$D018 - COLPF2 - rejestr koloru pola gry 2 (Z)
$D019 - COLPF3 - rejestr koloru pola gry 3 (Z)
$D01A - COLBAK - rejestr koloru ta (Z)
$D01B - GTIACTL - rejestr kontroli ukadu GTIA
$D01C - VDELAY - licznik opnienia pionowego P/MG
$D01D - PMCNTL - rejestr kontroli graczy i pociskw
$D01E - HITCLR - rejestr kasowania rejestrw kolizji
$D01F - CONSOL - rejestr stanu klawiszy konsoli
$D1FF - PDVREG - rejestr wyboru nowego urzdzenia
$D200 - AUDF1 - czstotliwo pracy generatora 1 (Z)
$D200 - POT0 - rejestr pooenia potencjometru 0 (O)
$D201 - AUDC1 - rejestr kontroli dwiku generatora 1 (Z)
$D201 - POT1 - rejestr pooenia potencjometru 1 (O)
$D202 - AUDF2 - czstotliwo pracy generatora 2 (Z)
$D202 - POT2 - rejestr pooenia potencjometru 2 (O)
$D203 - AUDC2 - rejestr kontroli dwiku generatora 2 (Z)
$D203 - POT3 - rejestr pooenia potencjometru 3 (O)
$D204 - AUDF3 - czstotliwo pracy generatora 3 (Z)
$D205 - AUDC3 - rejestr kontroli dwiku generatora 3 (Z)
$D206 - AUDF4 - czstotliwo pracy generatora 4 (Z)
$D207 - AUDC4 - rejestr kontroli dwiku generatora 4 (Z)
$D208 - AUDCTL - rejestr kontroli generatorw dwiku (Z)
$D208 - POTST - status odczytu potencjometrw (O)
$D209 - STIMER - rejestr zerowania licznikw (Z)
$D209 - KBCODE - kod ostatnio nacinitego klawisza (O)
$D20A - SKSTRES - reset statusu zcza szeregowego (Z)
$D20A - RANDOM - rejestr liczby losowej (O)
$D20B - POTG0 - znacznik przetwornika analogowo-cyfrowego (Z)
$D20D - SEROUT - szeregowy rejestr wyjciowy (Z)
$D20D - SERIN - szeregowy rejestr wejciowy (O)
$D20E - IRQEN - zezwolenia przerwa IRQ (Z)
$D20E - IRQST - status przerwa IRQ (O)
$D20F - SKCTL - rejestr kontroli zcza szeregowego (Z)
$D20F - SKSTAT - rejestr statusu zcza szeregowego (O)
$D300 - PORTA - port A ukadu PIA
$D301 - PORTB - port B ukadu PIA
$D302 - PACTL - rejestr kontroli portu A
$D303 - PBCTL - rejestr kontroli portu B
$D400 - DMACTL - rejestr kontroli dostpu do pamici
$D401 - CHRCTL - rejestr kontroli wywietlania znakw
$D402 - DLPTR - adres programu ANTIC-a
$D404 - HSCROL - znacznik poziomego przesuwu obrazu
$D405 - VSCROL - znacznik pionowego przesuwu obrazu
$D407 - PMBASE - adres pamici graczy i pociskw
$D409 - CHBASE - adres zestawu znakw
$D40A - WSYNC - znacznik oczekiwania na synchronizacj poziom
$D40B - VCOUNT - licznik linii obrazu
$D40C - LPENH - poziome pooenie pira wietlengo
$D40D - LPENV - pionowe pooenie pira wietlnego
$D40E - NMIEN - rejestr zezwole na przerwania NMI
$D40F - NMIST - rejestr statusu przerwa NMI
*/
+162 -72
View File
@@ -36,14 +36,13 @@
;we decided it must go in 'English' to let other people work on it ;we decided it must go in 'English' to let other people work on it
.macro build .macro build
dta d"1.00" ; number of this build (3 bytes) dta d"1.11" ; number of this build (3 bytes)
.endm .endm
icl 'definitions.asm' icl 'definitions.asm'
; icl 'artwork/sfx/rmt_feat.asm'
.zpvar xdraw .word = $80 ;variable X for plot .zpvar xdraw .word = $64 ;variable X for plot
.zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen)
.zpvar xbyte .word .zpvar xbyte .word
.zpvar ybyte .word .zpvar ybyte .word
@@ -89,36 +88,75 @@
;.zpvar dliY .byte ;.zpvar dliY .byte
.zpvar sfx_effect .byte .zpvar sfx_effect .byte
.zpvar RMT_blocked .byte .zpvar RMT_blocked .byte
;--------------
displayposition = modify ; --------------OPTIMIZATION VARIABLES--------------
.zpvar Force .word
.zpvar Force_ .byte ; Force is 3 bytes long
.zpvar Angle .byte
.zpvar Parachute .byte ; are you insured with parachute?
.zpvar color .byte
.zpvar Erase .byte ; if 1 only mask of the character is printed
; on the graphics screen. if 0 character is printed normally
.zpvar radius .byte
.zpvar decimal .word
.zpvar NumberOfPlayers .byte ;current number of players (counted from 1)
.zpvar Counter .byte ;temporary Counter for outside loops
.zpvar ExplosionRadius .word ;because when adding in xdraw it is double byte
.zpvar ResultY .byte
.zpvar FallDown2 .byte
.zpvar xcircle .word
.zpvar ycircle .word
.zpvar vy .word
.zpvar vy_ .word ; 4 bytes
.zpvar vx .word
.zpvar vx_ .word ; 4 bytes
.zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
.zpvar PositionOnTheList .byte ; pointer position on the list being displayed
.zpvar XHit .word
.zpvar delta .word
.zpvar HowMuchToFall .byte
.zpvar magic .word
.zpvar xtraj .word
.zpvar xtraj_ .byte ; 3 bytes
.zpvar ytraj .word
.zpvar ytraj_ .byte ; 3 bytes
.zpvar Wind .word
.zpvar Wind_ .word ; 4 bytes
.zpvar RangeLeft .word
.zpvar RangeRight .word
.zpvar NewAngle .byte
.zpvar escFlag .byte
.zpvar LineYdraw .byte
.zpvar LineXdraw .word
.zpvar plot4x4color .byte
.zpvar Multiplier .word
.zpvar Multiplier_ .byte ; 3 bytes
.zpvar HowToDraw .byte
.zpvar gravity .byte
.zpvar LineLength .word
;.zpvar LineAddress4x4 .word
.zpvar tracerflag .byte
.zpvar isInventory .byte
.zpvar DifficultyLevel .byte
.zpvar goleft .byte
.zpvar OffsetDL1 .byte
.zpvar L1 .byte
;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65
;* RMT ZeroPage addresses
.zpvar RMT_Zero_Page_V .byte .zpvar RMT_Zero_Page_V .byte
; .zpvar p_tis .word
; .zpvar p_trackslbstable .word displayposition = modify
; .zpvar p_trackshbstable .word LineAddress4x4 = temp
; .zpvar p_song .word
; .zpvar ns .word
; .zpvar nr .word
; .zpvar nt .word
; .zpvar reg1 .byte
; .zpvar reg2 .byte
; .zpvar reg3 .byte
; .zpvar tmp .byte
; IFT FEAT_COMMAND2
; .zpvar frqaddcmd2 .byte
; EIF
; p_instrstable = p_tis
;------------------------------- ;-------------------------------
icl 'lib/atari.hea' icl 'lib/ATARISYS.ASM'
icl 'lib/macro.hea' icl 'lib/macro.hea'
;splash screen and musix ;splash screen and musix
icl 'artwork/Scorch50.asm' icl 'artwork/Scorch50.asm'
;Game loading address ;Game loading address
ORG $3000 ORG $3000
WeaponFont WeaponFont
@@ -150,6 +188,22 @@ FirstSTART
dey dey
bpl @- bpl @-
; generate linetables
mwa #display temp
mwa #linetableL temp2
mwa #linetableH modify
ldy #0
@ lda temp
sta (temp2),y
lda temp+1
sta (modify),y
adw temp #40
iny
cpy #screenheight+1
bne @-
; RMT INIT ; RMT INIT
lda #$f0 ;initial value lda #$f0 ;initial value
sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240)
@@ -188,6 +242,16 @@ START
; for the round #1 shooting sequence is random ; for the round #1 shooting sequence is random
MainGameLoop MainGameLoop
jsr SetWallsType
; first set default barrel lengths (fix for Long Schlong activation :) )
; we must do it before purchase/activate
ldx #(MaxPlayers-1)
SettingBarrel
lda #StandardBarrel ; standard barrel length
sta BarrelLength,x
dex
bpl SettingBarrel
jsr CallPurchaseForEveryTank jsr CallPurchaseForEveryTank
; issue #72 (glitches when switches) ; issue #72 (glitches when switches)
@@ -348,8 +412,8 @@ NoGameOverYet
jsr SetPMWidth jsr SetPMWidth
lda #0 lda #0
sta colpf2s ; status line "off" sta COLOR2 ; status line "off"
sta colpf1s sta COLOR1
tax tax
@ sta singleRoundVars,x @ sta singleRoundVars,x
@@ -368,8 +432,6 @@ SettingEnergies
sta Energy,x sta Energy,x
sta eXistenZ,x sta eXistenZ,x
sta LASTeXistenZ,x sta LASTeXistenZ,x
lda #StandardBarrel ; standard barrel length
sta BarrelLength,x
; anything in eXistenZ table means that this tank exist ; anything in eXistenZ table means that this tank exist
; in the given round ; in the given round
lda #<1000 lda #<1000
@@ -416,7 +478,7 @@ SettingEnergies
mva #$00 TankSequencePointer mva #$00 TankSequencePointer
;---------round screen is ready--------- ;---------round screen is ready---------
mva #TextForegroundColor colpf1s ; status line "on" mva #TextForegroundColor COLOR1 ; status line "on"
rts rts
.endp .endp
@@ -497,7 +559,7 @@ DoNotFinishTheRound
ldx tankNr ldx tankNr
lda TankStatusColoursTable,x lda TankStatusColoursTable,x
sta colpf2s ; set color of status line sta COLOR2 ; set color of status line
jsr PutTankNameOnScreen jsr PutTankNameOnScreen
jsr DisplayStatus jsr DisplayStatus
@@ -535,6 +597,8 @@ AfterManualShooting
; defensive weapons without flight handling ; defensive weapons without flight handling
ldx TankNr ldx TankNr
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
cmp #ind_Floating_Tank__ ; Floating Tank
beq GoFloat
cmp #ind_White_Flag_____ ; White Flag cmp #ind_White_Flag_____ ; White Flag
beq ShootWhiteFlag beq ShootWhiteFlag
cmp #ind_Nuclear_Winter_ cmp #ind_Nuclear_Winter_
@@ -547,6 +611,13 @@ ShootWhiteFlag
; --- white flag --- ; --- white flag ---
jsr WhiteFlag jsr WhiteFlag
jmp NextPlayerShoots ; and we skip shoot jmp NextPlayerShoots ; and we skip shoot
GoFloat
jsr TankFlying
lda #0
sta ActiveDefenceWeapon,x ; deactivate after use
bit escFlag
bpl ManualShooting ; after floating tank can shoot
rts
StandardShoot StandardShoot
inc noDeathCounter inc noDeathCounter
@@ -579,14 +650,6 @@ continueMainRoundLoopAfterSeppuku
AfterExplode AfterExplode
; TODO: IS IT OK??? possibly a fix here needed for #56
ldy WeaponDepleted
bne @+
ldx TankNr
tya
sta ActiveWeapon,x
@
;temporary tanks removal (would fall down with soil) ;temporary tanks removal (would fall down with soil)
mva #1 Erase mva #1 Erase
jsr drawtanks jsr drawtanks
@@ -608,9 +671,17 @@ TanksFallDown
NoExistNoFall NoExistNoFall
dex dex
bpl TanksFallDown bpl TanksFallDown
mva tempor2 TankNr mvx tempor2 TankNr
missed missed
; TODO: IS IT OK??? possibly a fix here needed for #56
ldy WeaponDepleted
bne @+
ldx TankNr
tya
sta ActiveWeapon,x
@
;here we clear offensive text (after a shoot) ;here we clear offensive text (after a shoot)
;shit -- it's second time, but it must be like this ;shit -- it's second time, but it must be like this
ldy TankNr ldy TankNr
@@ -927,15 +998,15 @@ B0 DEY
;-------------------------------------------------- ;--------------------------------------------------
.proc ColorsOfSprites .proc ColorsOfSprites
lda TankColoursTable ; colours of sprites under tanks lda TankColoursTable ; colours of sprites under tanks
sta COLPM0S sta PCOLR0
lda TankColoursTable+1 lda TankColoursTable+1
sta COLPM1S sta PCOLR1
lda TankColoursTable+2 lda TankColoursTable+2
sta COLPM2S sta PCOLR2
lda TankColoursTable+3 lda TankColoursTable+3
sta COLPM3S sta PCOLR3
LDA TankColoursTable+4 LDA TankColoursTable+4
STA COLPF3S ; joined missiles (5th tank) STA COLOR3 ; joined missiles (5th tank)
rts rts
.endp .endp
@@ -973,6 +1044,7 @@ deletePtr = temp
; clean variables ; clean variables
lda #0 lda #0
sta escFlag
tay tay
mwa #variablesStart deletePtr mwa #variablesStart deletePtr
@ tya @ tya
@@ -1008,14 +1080,11 @@ SetunPlots
;setting up P/M graphics ;setting up P/M graphics
lda #>pmgraph lda #>pmgraph
sta pmbase sta pmbase
; lda dmactls
; ora #$38 ; Players and Missiles single lined
; sta dmactls
lda #$03 ; P/M on lda #$03 ; P/M on
sta pmcntl sta GRACTL
jsr SetPMWidth jsr SetPMWidth
lda #%00100000 ; P/M priorities (multicolor players on) lda #%00100001 ; P/M priorities (multicolor players on) - prior=1
sta gtictls sta GPRIOR
jsr PMoutofScreen jsr PMoutofScreen
;let the tanks be visible! ;let the tanks be visible!
@@ -1029,18 +1098,6 @@ MakeTanksVisible
mva #1 CurrentRoundNr ;we start from round 1 mva #1 CurrentRoundNr ;we start from round 1
mva #6 NTSCcounter mva #6 NTSCcounter
; ; RMT INIT
; lda #$f0 ;initial value
; sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240)
;
; lda #$ff ;initial value
; sta sfx_effect
;
; lda #0
; jsr RmtSongSelect
;
; VMAIN VBLinterrupt,7 ;jsr SetVBL
rts rts
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
@@ -1105,16 +1162,16 @@ MakeTanksVisible
phy phy
lda dliCounter lda dliCounter
bne EndofPMG bne EndofPMG
lda #%00100000 ; playfield after P/M lda #%00100001 ; playfield after P/M - prior=1
STA WSYNC STA WSYNC
sta gtictl sta PRIOR
bne EndOfDLI_GO bne EndOfDLI_GO
EndofPMG EndofPMG
cmp #1 cmp #1
bne ColoredLines bne ColoredLines
lda #%00100100 ; playfield before P/M lda #%00100100 ; playfield before P/M
STA WSYNC STA WSYNC
sta gtictl sta PRIOR
bne EndOfDLI_GO bne EndOfDLI_GO
ColoredLines ColoredLines
cmp #9 cmp #9
@@ -1306,7 +1363,7 @@ UsageLoop
sta temp2+1 sta temp2+1
cpw RandBoundaryLow temp2 cpw RandBoundaryLow temp2
bcs RandomizeForce seq:bcs RandomizeForce
cpw RandBoundaryHigh temp2 cpw RandBoundaryHigh temp2
bcc RandomizeForce bcc RandomizeForce
@@ -1452,7 +1509,24 @@ nextishigher
rts rts
.endp .endp
;--------------------------------------------------
.proc SetWallsType
;--------------------------------------------------
mva #0 WallsType
lda OptionsTable+8
cmp #4
beq SetRandomWalls
lsr
ror WallsType
lsr
ror WallsType
rts
SetRandomWalls
lda random
and #%11000000
sta WallsType
rts
.endp
;-------------------------------------------------- ;--------------------------------------------------
.proc GetKey ; waits for pressing a key and returns pressed value in A .proc GetKey ; waits for pressing a key and returns pressed value in A
; when [ESC] is pressed, escFlag is set to 1 ; when [ESC] is pressed, escFlag is set to 1
@@ -1476,7 +1550,7 @@ checkJoyGetKey
;------------JOY------------- ;------------JOY-------------
;happy happy joy joy ;happy happy joy joy
;check for joystick now ;check for joystick now
lda JSTICK0 lda STICK0
and #$0f and #$0f
cmp #$0f cmp #$0f
beq notpressedJoyGetKey beq notpressedJoyGetKey
@@ -1486,7 +1560,7 @@ checkJoyGetKey
notpressedJoyGetKey notpressedJoyGetKey
;fire ;fire
lda TRIG0S lda STRIG0
bne @- bne @-
lda #$0c ;Return key lda #$0c ;Return key
@@ -1507,11 +1581,11 @@ getkeyend
;-------------------------------------------------- ;--------------------------------------------------
.proc WaitForKeyRelease .proc WaitForKeyRelease
;-------------------------------------------------- ;--------------------------------------------------
lda JSTICK0 lda STICK0
and #$0f and #$0f
cmp #$0f cmp #$0f
bne WaitForKeyRelease bne WaitForKeyRelease
lda TRIG0S lda STRIG0
beq WaitForKeyRelease beq WaitForKeyRelease
lda SKSTAT lda SKSTAT
cmp #$ff cmp #$ff
@@ -1525,7 +1599,7 @@ getkeyend
and #%00000100 and #%00000100
beq @+ beq @+
lda #1 lda #1
@ and TRIG0S @ and STRIG0
rts rts
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
@@ -1571,8 +1645,11 @@ noKey
.proc RmtSongSelect .proc RmtSongSelect
;-------------------------------------------------- ;--------------------------------------------------
; starting song line 0-255 to A reg ; starting song line 0-255 to A reg
cmp #song_ingame
bne noingame ; noMusic blck onlu ingame song
bit noMusic bit noMusic
spl:lda #song_silencio spl:lda #song_silencio
noingame
mvx #$ff RMT_blocked mvx #$ff RMT_blocked
ldx #<MODUL ;low byte of RMT module to X reg ldx #<MODUL ;low byte of RMT module to X reg
ldy #>MODUL ;hi byte of RMT module to Y reg ldy #>MODUL ;hi byte of RMT module to Y reg
@@ -1580,6 +1657,19 @@ noKey
mva #0 RMT_blocked mva #0 RMT_blocked
rts rts
.endp .endp
;;--------------------------------------------------
;.proc Randomizer
;;--------------------------------------------------
; ;usage: randomize floor ceiling
; ;returns (in A) a random .byte between "floor" and "ceiling"
;?rand
; lda random
; cmp #:1 ;floor
; bcc ?rand
; cmp #:2+1 ;ceiling
; bcs ?rand
; rts
;.endp
;---------------------------------------------- ;----------------------------------------------
icl 'weapons.asm' icl 'weapons.asm'
;---------------------------------------------- ;----------------------------------------------
@@ -1611,7 +1701,7 @@ PLAYER
MODUL equ $b000 ;address of RMT module MODUL equ $b000 ;address of RMT module
opt h- ;RMT module is standard Atari binary file already opt h- ;RMT module is standard Atari binary file already
ins "artwork/sfx/schorch_str2.rmt" ;include music RMT module ins "artwork/sfx/scorch_str4.rmt" ;include music RMT module
opt h+ opt h+
; ;
; ;
BIN
View File
Binary file not shown.
+170 -132
View File
@@ -26,9 +26,9 @@
lda #%00111110 ; normal screen width, DL on, P/M on lda #%00111110 ; normal screen width, DL on, P/M on
sta dmactls sta dmactls
jsr SetPMWidth jsr SetPMWidth
mva #TextBackgroundColor colpf2s mva #TextBackgroundColor COLOR2
mva #TextForegroundColor colpf3s jsr ColorsOfSprites
mva #$ca colpf1s mva #$ca COLOR1
VDLI DLIinterruptOptions ; jsr SetDLI for Options text screen VDLI DLIinterruptOptions ; jsr SetDLI for Options text screen
@@ -45,7 +45,6 @@
jsr ClearPMmemory jsr ClearPMmemory
jsr placetanks ;let the tanks be evenly placed jsr placetanks ;let the tanks be evenly placed
jsr calculatemountains ;let mountains be easy for the eye jsr calculatemountains ;let mountains be easy for the eye
jsr ColorsOfSprites
jsr drawmountains ;draw them jsr drawmountains ;draw them
ldx NumberOfPlayers ldx NumberOfPlayers
dex dex
@@ -205,7 +204,7 @@ OptionSetLoop
; next option ; next option
adw temp #40 ;jump to next line adw temp #40 ;jump to next line
inc:lda temp2 inc:lda temp2
cmp #maxoptions ;number of options cmp #maxOptions ;number of options
bne OptionsSetMainLoop bne OptionsSetMainLoop
;inversing the first few chars of the selected line (OptionsY) ;inversing the first few chars of the selected line (OptionsY)
@@ -240,68 +239,78 @@ OptionsYLoop
.endp .endp
;------------------------------------------- ;-------------------------------------------
; call of the purchase screens for each tank ; call of the purchase (and activate) screens for each tank
.proc CallPurchaseForEveryTank .proc CallPurchaseForEveryTank
mva #0 TankNr mva #0 TankNr
sta isInventory sta isInventory
@ @
ldx TankNr ldx TankNr
lda SkillTable,x lda SkillTable,x
beq ManualPurchase beq ManualPurchase
jsr PurchaseAI jsr PurchaseAI ; remember to make ActivateAI :) !!!
jmp AfterManualPurchase jmp AfterManualPurchase
ManualPurchase ManualPurchase
jsr Purchase mva #0 isInventory
bit escFlag jsr Purchase ; purchase weapons
spl:rts bit escFlag
spl:rts
jsr DefensivesActivate ; activate weapons
bit escFlag
spl:rts
AfterManualPurchase AfterManualPurchase
inc:lda TankNr
inc:lda TankNr cmp NumberOfPlayers
cmp NumberOfPlayers bne @-
bne @- rts
rts
.endp .endp
;--------------------------------------------------
.proc DefensivesActivate
;--------------------------------------------------
; This proc call Inventory and set Defensives activation first
mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons
mva #$ff IsInventory
mva #$01 WhichList
; offensive weapon - 0, deffensive - 1
jmp Purchase.GoToActivation
.endp
;-------------------------------------------------- ;--------------------------------------------------
.proc Purchase ; .proc Purchase ;
;-------------------------------------------------- ;--------------------------------------------------
; TODO: when round ends with a weapon depleted the pointer points to an empty line
; In tanknr there is a number of the tank (player) ; In tanknr there is a number of the tank (player)
; that is buying weapons now (from 0). ; that is buying weapons now (from 0).
; Rest of the data is taken from appropriate tables ; Rest of the data is taken from appropriate tables
; and during the purchase these tables are modified. ; and during the purchase these tables are modified.
mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons
; we are clearing list of the weapons
mva #$00 WhichList
; offensive weapon - 0, deffensive - 1
GoToActivation
mva #$ff LastWeapon
; mva #0 dmactl ; mva #0 dmactl
VDLI DLIinterruptText ; jsr SetDLI for text (purchase) screen VDLI DLIinterruptText ; jsr SetDLI for text (purchase) screen
jsr PMoutofScreen jsr PMoutofScreen
mwa #PurchaseDL dlptrs mwa #PurchaseDL dlptrs
; lda dmactls lda #@dmactl(narrow|dma) ; narro screen width, DL on, P/M off
; and #$fc
; ora #$02 ; normal screen width
lda #%00110010 ; normal screen width, DL on, P/M off
sta dmactls sta dmactls
lda #song_supermarket lda #song_supermarket
jsr RmtSongSelect bit IsInventory
bpl @+
mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons lda #song_inventory
@ jsr RmtSongSelect
ldx tankNr ldx tankNr
lda TankStatusColoursTable,x lda TankStatusColoursTable,x
sta colpf2s sta COLOR2
; we are clearing list of the weapons
mva #$ff LastWeapon
mva #$00 WhichList
; offensive weapon - 0, deffensive - 1
; there is a tank (player) number in tanknr ; there is a tank (player) number in tanknr
; we are displaying name of the player ; we are displaying name of the player
tay ; 0 to y ldy #0
lda tanknr lda tanknr
:3 asl ; 8 chars per name :3 asl ; 8 chars per name
tax tax
@@ -325,7 +334,7 @@ AfterPurchase
sta decimal sta decimal
lda moneyH,x lda moneyH,x
sta decimal+1 sta decimal+1
mwa #textbuffer2+28 displayposition mwa #textbuffer2+26 displayposition
jsr displaydec5 jsr displaydec5
; in xbyte there is the address of the line that ; in xbyte there is the address of the line that
@@ -351,11 +360,9 @@ CreateList
jmi itIsInventory jmi itIsInventory
; put "Purchase" on the screen ; put "Purchase" on the screen
ldx #[purchaseTextEnd-purchaseText-1] mwa #PurchaseDescription PurActDescAddr
@ lda purchaseText,x ; and Title
sta purchaseActivate,x mwa #PurchaseTitle DLPurTitleAddr
dex
bpl @-
; checking if we can afford buying this weapon ; checking if we can afford buying this weapon
ldx temp ldx temp
@@ -372,34 +379,34 @@ CreateList
; first parentheses and other special chars ; first parentheses and other special chars
; (it's easier this way) ; (it's easier this way)
ldy #22 ;ldy #22
lda #08 ; "(" ;lda #08 ; "("
STA (XBYTE),y ;STA (XBYTE),y
ldy #32 ;ldy #32
lda #09 ; ")" ;lda #09 ; ")"
sta (xbyte),y ;sta (xbyte),y
ldy #25 ldy #24
lda #15 ; "/" lda #15 ; "/"
sta (xbyte),y sta (xbyte),y
ldy #31 ldy #30
lda #16 ; "0" lda #16 ; "0"
sta (xbyte),y sta (xbyte),y
;now number of units (shells) to be purchased ;now number of units (shells) to be purchased
adw xbyte #23 displayposition ; 23 chars from the beginning of the line adw xbyte #22 displayposition ; 23 chars from the beginning of the line
lda WeaponUnits,x lda WeaponUnits,x
sta decimal sta decimal
jsr displaybyte jsr displaybyte
ldx temp ;getting back index of the weapon ldx temp ;getting back index of the weapon
; and now price of the weapon ; and now price of the weapon
adw xbyte #26 displayposition ; 26 chars from the beginning of the line adw xbyte #25 displayposition ; 26 chars from the beginning of the line
lda WeaponPriceL,x lda WeaponPriceL,x
sta decimal sta decimal
lda WeaponPriceH,x lda WeaponPriceH,x
sta decimal+1 sta decimal+1
jsr displaydec5 jsr displaydec5
ldy #26 ; overwrite first digit (allways space - no digit :) ) ldy #25 ; overwrite first digit (allways space - no digit :) )
lda #04 ; "$" lda #04 ; "$"
sta (xbyte),y sta (xbyte),y
@@ -407,11 +414,9 @@ CreateList
itIsInventory itIsInventory
; put "Activate" on the screen ; put "Activate" on the screen
ldx #[purchaseTextEnd-purchaseText-1] mwa #ActivateDescription PurActDescAddr
@ lda activateText,x ; and Title
sta purchaseActivate,x mwa #InventoryTitle DLPurTitleAddr
dex
bpl @-
ldx temp ldx temp
lda TanksWeaponsTableL,y lda TanksWeaponsTableL,y
@@ -423,11 +428,11 @@ itIsInventory
jeq noWeapon jeq noWeapon
; clear price area ; clear price area
ldy #22 ; beginning of the price area ldy #21 ; beginning of the price area
lda #0 lda #0
@ sta (XBYTE),y @ sta (XBYTE),y
iny iny
cpy #32+1 ; end of price cpy #32 ; end of price
bne @- bne @-
notInventory notInventory
@@ -503,7 +508,7 @@ DefenceList
inc HowManyOnTheListDef inc HowManyOnTheListDef
; If everything is copied then next line ; If everything is copied then next line
NextLineOfTheList NextLineOfTheList
adw xbyte #40 adw xbyte #32
TooLittleCash TooLittleCash
NoWeapon NoWeapon
@@ -532,26 +537,19 @@ WeHaveOffset
; now we have to erase empty position of both lists. ; now we have to erase empty position of both lists.
; Multiply number on list 1 by 40 and set address ; Multiply number on list 1 by 32 and set address
; of the first erased char. ; of the first erased char.
; (multiplying taken from book of Ruszczyc 'Assembler 6502' ; (multiplying taken from book of Ruszczyc 'Assembler 6502'
lda HowManyOnTheListOff lda HowManyOnTheListOff
sta xbyte+1 ; multiplier (temporarily here, it will be erased anyway) sta xbyte ; multiplier (temporarily here, it will be erased anyway)
lda #$00 ; higher byte of the Result lda #$00 ;
sta xbyte ; lower byte of the Result sta xbyte+1 ; higher byte of the Result
ldx #$08 ldx #$05 ; 2^5
Rotate04 @ asl xbyte
lsr xbyte+1 rol xbyte+1
bcc DoNotAddX01 dex
clc bne @-
adc #40
DoNotAddX01
ror
ror xbyte
dex
bne Rotate04
sta xbyte+1
; add to the address of the list ; add to the address of the list
clc clc
@@ -580,21 +578,14 @@ DoNotIncHigher1
; Multiply number on list 1 by 40 and set address ; Multiply number on list 1 by 40 and set address
; of the first erased char. ; of the first erased char.
lda HowManyOnTheListDef lda HowManyOnTheListDef
sta xbyte+1 ; multiplier sta xbyte ; multiplier (temporarily here, it will be erased anyway)
lda #$00 ; higher byte of the Result lda #$00 ;
sta xbyte ; lower byte of the Result sta xbyte+1 ; higher byte of the Result
ldx #$08 ldx #$05 ; 2^5
Rotate05 @ asl xbyte
lsr xbyte+1 rol xbyte+1
bcc DoNotAddX02 dex
clc bne @-
adc #40
DoNotAddX02
ror
ror xbyte
dex
bne Rotate05
sta xbyte+1
; add to the address of the list ; add to the address of the list
clc clc
@@ -678,17 +669,19 @@ ChoosingItemForPurchase
PurchaseKeyUp PurchaseKeyUp
lda WhichList lda WhichList
beq GoUp1 beq GoUpOffensive
dec PositionOnTheList dec PositionOnTheList
bpl EndUpX bpl EndUpX
lda #$00 ldy #0 ;HowManyOnTheListDef
sta PositionOnTheList ;dey
sty PositionOnTheList
jmp ChoosingItemForPurchase jmp ChoosingItemForPurchase
GoUp1 GoUpOffensive
dec PositionOnTheList dec PositionOnTheList
bpl MakeOffsetUp bpl MakeOffsetUp
lda #$00 ldy #0 ;HowManyOnTheListOff
sta PositionOnTheList ;dey
sty PositionOnTheList
MakeOffsetUp MakeOffsetUp
; If offset is larger than pointer position, ; If offset is larger than pointer position,
@@ -701,7 +694,7 @@ EndUpX
jmp ChoosingItemForPurchase jmp ChoosingItemForPurchase
PurchaseKeyDown PurchaseKeyDown
lda WhichList lda WhichList
beq GoDown1 beq GoDownOffensive
inc:lda PositionOnTheList inc:lda PositionOnTheList
cmp HowManyOnTheListDef cmp HowManyOnTheListDef
bne EndGoDownX bne EndGoDownX
@@ -709,7 +702,7 @@ PurchaseKeyDown
dey dey
sty PositionOnTheList sty PositionOnTheList
jmp ChoosingItemForPurchase jmp ChoosingItemForPurchase
GoDown1 GoDownOffensive
inc:lda PositionOnTheList inc:lda PositionOnTheList
cmp HowManyOnTheListOff cmp HowManyOnTheListOff
bne MakeOffsetDown bne MakeOffsetDown
@@ -795,6 +788,33 @@ positiveMoney
; the table of the weapon of the tank ; the table of the weapon of the tank
; and add appropriate number of shells ; and add appropriate number of shells
sty LastWeapon ; store last purchased weapon
; because we must put screen pointer next to it
; but if we purchasing "Buy me!" then we must draw the winning weapon.
cpy #ind_Buy_me_________
bne NoSuprise
Suprise ; get a random weapon
lda random
cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1)
bcc GetRandomDefensive
GetRandomOffensive
randomize ind_Missile________ ind_Laser__________
cmp #ind_Buy_me_________
beq GetRandomOffensive
tay
lda WeaponUnits,y ; check if weapon exist
beq GetRandomOffensive
bne NoSuprise ; Y always <> 0
GetRandomDefensive
randomize ind_Battery________ ind_Nuclear_Winter_
tay
lda WeaponUnits,y ; check if weapon exist
beq GetRandomDefensive
NoSuprise
lda TanksWeaponsTableL,x lda TanksWeaponsTableL,x
sta weaponPointer sta weaponPointer
lda TanksWeaponsTableH,x lda TanksWeaponsTableH,x
@@ -809,8 +829,6 @@ positiveMoney
lda #99 lda #99
sta (weaponPointer),y sta (weaponPointer),y
LessThan100 LessThan100
sty LastWeapon ; store last purchased weapon
; because we must put screen pointer next to it
mva #0 PositionOnTheList ; to move the pointer to the top when no more monies mva #0 PositionOnTheList ; to move the pointer to the top when no more monies
jmp Purchase.AfterPurchase jmp Purchase.AfterPurchase
@@ -835,7 +853,9 @@ invSelectDef
; if activate battery, we do it differently ; if activate battery, we do it differently
mva #sfx_battery sfx_effect mva #sfx_battery sfx_effect
mva #99 Energy,x mva #99 Energy,x
phy
jsr MaxForceCalculate jsr MaxForceCalculate
ply
jmp DecreaseDefensive ; bypass activation jmp DecreaseDefensive ; bypass activation
NotBattery NotBattery
cmp #ind_Long_Barrel____ cmp #ind_Long_Barrel____
@@ -931,7 +951,7 @@ DefActivationEnd
EraseLoop EraseLoop
tya ; lda #$00 tya ; lda #$00
sta (xbyte),y sta (xbyte),y
adw xbyte #40 adw xbyte #32
dex dex
bpl EraseLoop bpl EraseLoop
@@ -944,7 +964,7 @@ EraseLoop
ldx PositionOnTheList ldx PositionOnTheList
beq SelectList2 ; if there is 0 we add nothing beq SelectList2 ; if there is 0 we add nothing
AddLoop2 AddLoop2
adw xbyte #40 adw xbyte #32
dex dex
bne AddLoop2 bne AddLoop2
SelectList2 SelectList2
@@ -966,7 +986,7 @@ CharToList1
ldx PositionOnTheList ldx PositionOnTheList
beq SelectList1 ; if there is 0 we add nothing beq SelectList1 ; if there is 0 we add nothing
AddLoop1 AddLoop1
adw xbyte #40 adw xbyte #32
dex dex
bne AddLoop1 bne AddLoop1
SelectList1 SelectList1
@@ -977,7 +997,7 @@ SelectList1
ldx OffsetDL1 ldx OffsetDL1
beq SetWindowList1 ; if zero then add nothing beq SetWindowList1 ; if zero then add nothing
LoopWindow1 LoopWindow1
adw xbyte #40 adw xbyte #32
dex dex
bne LoopWindow1 bne LoopWindow1
SetWindowList1 SetWindowList1
@@ -1024,7 +1044,7 @@ NoArrowDown
mva #0 TankNr mva #0 TankNr
@ tax @ tax
lda TankStatusColoursTable,x lda TankStatusColoursTable,x
sta colpf2s ; set color of player name line sta COLOR2 ; set color of player name line
jsr EnterPlayerName jsr EnterPlayerName
bit escFlag bit escFlag
spl:rts spl:rts
@@ -1070,7 +1090,7 @@ NoArrowDown
ldy #0 ldy #0
@ lda TanksNames,x @ lda TanksNames,x
beq endOfTankName ; beq endOfTankName
sta NameAdr,y sta NameAdr,y
inx inx
iny iny
@@ -1078,9 +1098,16 @@ NoArrowDown
bne @- bne @-
endOfTankName endOfTankName
@ lda NameAdr,y
bne LastNameChar
dey
bpl @-
LastNameChar
iny
lda #$80 ; place cursor on the end lda #$80 ; place cursor on the end
sta NameAdr,y sta NameAdr,y
dey
sty PositionInName sty PositionInName
@@ -1199,10 +1226,18 @@ EndOfNick
mva #sfx_next_player sfx_effect mva #sfx_next_player sfx_effect
lda NameAdr ; check if first char is " "
and #$7F ; remove inverse (Cursor) ; check if all chars are empty (" ")
ldy #7
lda #0
@ ora NameAdr,y
and #$7F ; remove inverse (Cursor)
dey
bpl @-
tay
beq MakeDefaultName beq MakeDefaultName
ldy #0
nextchar04 nextchar04
lda NameAdr,y lda NameAdr,y
and #$7f ; remove inverse (Cursor) and #$7f ; remove inverse (Cursor)
@@ -1379,18 +1414,19 @@ displayloop1
lda xtankstableH,y lda xtankstableH,y
sta temp+1 sta temp+1
;now we should substract length of the text-1 ;now we should substract length of the text-1
;temp2 = (fx-1)*2
ldy fx ldy fx
dey dey
tya tya
asl asl
sta temp2 sta temp2
mva #0 temp2+1 mva #0 temp2+1
;here we assume max length of text
;to display is 127 chars!
;now we have HALF length in pixels ;now we have HALF length in pixels
;stored in temp2 ;stored in temp2
;here we assume max length of text
;to display is 127 chars, but later it turns out it must be max 63!
sbw temp temp2 ; here begin of the text is in TEMP !!!! sbw temp temp2 ; here begin of the text is in TEMP !!!!
;now we should check overflows ;now we should check overflows
;lda temp+1 ; opty ;lda temp+1 ; opty
@@ -1420,14 +1456,14 @@ DOTNnotLessThanZero
;so check if not greater than screenwitdth ;so check if not greater than screenwitdth
cpw temp2 #screenwidth cpw temp2 #screenwidth
bcc DOTNnoOverflow bcc DOTNnoOverflow
;if end is greater than screenwidth ;if end is greater than screenwidth
;then screenwidth - length is fine ;then screenwidth - length is fine
lda fx lda fx
asl asl
asl asl
sta temp sta temp
mva #0 temp+1
sec sec
lda #<(screenwidth-1) lda #<(screenwidth-1)
@@ -1539,14 +1575,12 @@ DOTNcharloop
mwa temp TextAddress mwa temp TextAddress
;find length of the tank's name ;find length of the tank's name
ldy #0 ldy #7
@ @
lda (temp),y lda (temp),y
beq end_found bne end_found
iny dey
cpy #8
bne @- bne @-
dey
end_found end_found
iny iny
@@ -1560,18 +1594,22 @@ end_found
.proc TypeLine4x4 ; .proc TypeLine4x4 ;
;------------------------------- ;-------------------------------
;this routine prints line ending with $ff ;this routine prints line ending with $ff
;address in LineAddress4x4 ;address in LineAddress4x4 (it is the same as `temp`)
;starting from LineXdraw, LineYdraw ;starting from LineXdraw, LineYdraw
lda #1
staplot4x4color
sta plot4x4color
ldy #0 ldy #0
sty LineCharNr sty LineCharNr
mva #1 plot4x4color
TypeLine4x4Loop TypeLine4x4Loop
ldy LineCharNr ldy LineCharNr
mwa LineAddress4x4 temp ;mwa LineAddress4x4 temp ; LineAddress4x4 === temp
lda (temp),y lda (temp),y
cmp #$ff cmp #$ff
beq EndOfTypeLine4x4 beq EndOfTypeLine4x4
@@ -1871,12 +1909,12 @@ FinishResultDisplay
lda #%00111110 ; normal screen width, DL on, P/M on lda #%00111110 ; normal screen width, DL on, P/M on
sta dmactls sta dmactls
lda #%00100100 ; playfield before P/M lda #%00100100 ; playfield before P/M
sta gtictls sta GPRIOR
jsr SetPMWidth jsr SetPMWidth
jsr ColorsOfSprites jsr ColorsOfSprites
mva #0 colpf1s mva #0 COLOR1
sta CreditsVScrol sta CreditsVScrol
mva #TextForegroundColor colpf2s mva #TextForegroundColor COLOR2
VDLI DLIinterruptGameOver ; jsr SetDLI for Game Over screen VDLI DLIinterruptGameOver ; jsr SetDLI for Game Over screen
; make text and color lines for each tank ; make text and color lines for each tank
ldx NumberOfPlayers ;we start from the highest (best) tank ldx NumberOfPlayers ;we start from the highest (best) tank
@@ -2364,8 +2402,8 @@ NextChar02
mva #GOSbeg hposp0 mva #GOSbeg hposp0
mva #GOSbeg+12 hposp0+1 mva #GOSbeg+12 hposp0+1
mva #15 COLPM0S mva #15 PCOLR0
sta COLPM1S sta PCOLR1
rts rts
.endp .endp
+58 -57
View File
@@ -10,6 +10,10 @@
;===================================================== ;=====================================================
OneTimeZeroVariables OneTimeZeroVariables
OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 128 bytes ! OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 128 bytes !
.if OneTimeZeroVariablesCount > 127
.error "OneTimeZeroVariablesCount too large, ",OneTimeZeroVariablesCount
.endif
noMusic .by 0 ; 0 - play music, $ff - do not play music noMusic .by 0 ; 0 - play music, $ff - do not play music
noSfx .by 0 ; 0 - play SFX, $ff - do not play SFX noSfx .by 0 ; 0 - play SFX, $ff - do not play SFX
;---------------------------------------------------- ;----------------------------------------------------
@@ -17,7 +21,7 @@ noSfx .by 0 ; 0 - play SFX, $ff - do not play SFX
.by $00 ; labels line color .by $00 ; labels line color
GameOverColoursTable .BYTE $80,$40,$c4,$20,$c0,$e4 GameOverColoursTable .BYTE $80,$40,$c4,$20,$c0,$e4
;---------------------------------------------------- ;----------------------------------------------------
TanksNames ; DO NOT ZERO ON RESTART GAME - ticket #24 TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24
:6 dta d" " :6 dta d" "
;---------------------------------------------------- ;----------------------------------------------------
skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
@@ -25,7 +29,7 @@ skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning
;---------------------------------------------------- ;----------------------------------------------------
variablesToInitialize variablesToInitialize
;Options DO NOT ZERO ON RESTART GAME - ticket #27 ;Options DO NOT ZERO ON RESTART GAME - ticket #27
OptionsTable .by 0,1,2,2,0,1,3,2 OptionsTable .by 0,1,2,2,0,1,3,2,0
RoundsInTheGame .by 10 ;how many rounds in the current game RoundsInTheGame .by 10 ;how many rounds in the current game
seppukuVal .by 75 seppukuVal .by 75
mountainDeltaH .by 3 mountainDeltaH .by 3
@@ -42,7 +46,7 @@ RoundNrDisplay
;===================================================== ;=====================================================
variablesStart ; zeroing starts here variablesStart ; zeroing starts here
;===================================================== ;=====================================================
isInventory .ds 1 ; 0 - purchase, $ff - inventory ;isInventory .ds 1 ; 0 - purchase, $ff - inventory
;-------------- ;--------------
drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
;-------------- ;--------------
@@ -51,7 +55,7 @@ noDeathCounter .ds 1
OptionsY .ds 1 ;vertical position of cursor on Options screen OptionsY .ds 1 ;vertical position of cursor on Options screen
flyDelay .ds 1 flyDelay .ds 1
;-------------- ;--------------
NumberOfPlayers .DS 1 ;current number of players (counted from 1) ;NumberOfPlayers .DS 1 ;current number of players (counted from 1)
TankSequence .DS [MaxPlayers] ;sequence of shooting during the Round TankSequence .DS [MaxPlayers] ;sequence of shooting during the Round
GameIsOver .DS 1 ; 1 means it was the last round in the game GameIsOver .DS 1 ; 1 means it was the last round in the game
;---------------------------------------------------- ;----------------------------------------------------
@@ -122,19 +126,20 @@ WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile
; 20203.5 => 128 : <20203 : >20203 ; 20203.5 => 128 : <20203 : >20203
;---------------------------------------------------- ;----------------------------------------------------
L1 .DS 1 ; variable used in multiplications (by 10:) ;L1 .DS 1 ; variable used in multiplications (by 10:)
gravity .DS 1 ;only the decimal part (1/10 = 25) ;gravity .DS 1 ;only the decimal part (1/10 = 25)
;---------------------------------------------------- ;----------------------------------------------------
Wind .ds 4 ;format: 0000.hhll ;Wind .ds 4 ;format: 0000.hhll
;walue displayed on the screen is ;walue displayed on the screen is
;decimal portion divided by 16 (>>4) ;decimal portion divided by 16 (>>4)
;---------------------------------------------------- ;----------------------------------------------------
MaxWind .ds 1 ; MaxWind .ds 1 ;
WindOrientation .DS 1 ;(0-right,1-left) WindOrientation .DS 1 ;(0-right,1-left)
;---------------------------------------------------- ;----------------------------------------------------
Counter .DS 1 ;temporary Counter for outside loops ;Counter .DS 1 ;temporary Counter for outside loops
HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank ;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy
;---------------------------------------------------- ;----------------------------------------------------
xtankstableL ;X positions of tanks (lower left point) xtankstableL ;X positions of tanks (lower left point)
.DS [MaxPlayers] .DS [MaxPlayers]
@@ -148,22 +153,22 @@ LowResDistances ; coarse tank positions divided by 4 (to be in just one byte)
TargetTankNr ; Target tank index (for AI routines) TargetTankNr ; Target tank index (for AI routines)
.DS 1 .DS 1
;---------------------------------------------------- ;----------------------------------------------------
Erase .DS 1 ; if 1 only mask of the character is printed ;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 ;RangeLeft .DS 2 ;range of the soil to be fallen down
RangeRight .DS 2 ;it is being set by all Explosions ;RangeRight .DS 2 ;it is being set by all Explosions
;---------------------------------------------------- ;----------------------------------------------------
WeaponRangeLeft .DS 2 ;Range of the Explosion of the given weapon WeaponRangeLeft .DS 2 ;Range of the Explosion of the given weapon
WeaponRangeRight .DS 2 WeaponRangeRight .DS 2
;---------------------------------------------------- ;----------------------------------------------------
;xroller ;xroller
HowMuchToFall .ds 1 ;HowMuchToFall .ds 1
HeightRol .DS 1 HeightRol .DS 1
;digger ;digger
digstartx .DS 2 ;digstartx .DS 2
digstarty .DS 2 ;digstarty .DS 2
diggery .DS 1 diggery .DS 1
DigLong .DS 1 DigLong .DS 1
digtabxL .DS [8] digtabxL .DS [8]
@@ -176,34 +181,35 @@ FillCounter .ds 2
;sandhog ;sandhog
sandhogflag .DS 1 ; (0 digger, 8 sandhog) sandhogflag .DS 1 ; (0 digger, 8 sandhog)
;ofdirt ;ofdirt
magic .DS 2 ; was tempor2, but it was not compiling!!! (bug in OMC65) ;magic .DS 2 ; was tempor2, but it was not compiling!!! (bug in OMC65)
;draw ;draw
HowToDraw .DS 1 ;HowToDraw .DS 1
; bits here mean ; bits here mean
; 0 - negative X (go up) ; 0 - negative X (go up)
; 1 - negative Y (left) ; 1 - negative Y (left)
; 2 - directional value > 1 (more than 45 degrees) ; 2 - directional value > 1 (more than 45 degrees)
; if all 0 then standart routine ; if all 0 then standart routine
XHit .DS 2 ;XHit .DS 2
YHit .DS 2 YHit .DS 2
LineLength .DS 2 ;LineLength .DS 2
;circle ;circle
radius .DS 1 ;radius .DS 1
xcircle .DS 2 ;xcircle .DS 2
ycircle .DS 2 ;ycircle .DS 2
tempcir .DS 2 tempcir .DS 2
;TankFalls ;TankFalls
FallingSoundBit .DS 1 FallingSoundBit .DS 1
PreviousFall .DS 1 PreviousFall .DS 1
EndOfTheFallFlag .DS 1 ; in case of the infinite fall EndOfTheFallFlag .DS 1 ; in case of the infinite fall
Parachute .DS 1 ; are you insured with parachute? ;Parachute .DS 1 ; are you insured with parachute?
FloatingAlt .DS 1 ; floating tank altitude
;---------------------------------------------------- ;----------------------------------------------------
;Flight ;Flight
;variables for 5 missiles (used for mirv) ;variables for 5 missiles (used for mirv)
xtraj00 .DS [5] ; 3 bytes of xtraj times 5. Lowest byte xtraj00 .DS [5] ; 3 bytes of xtraj times 5. Lowest byte
xtraj01 .DS [5] ; middle byte xtraj01 .DS [5] ; middle byte
xtraj02 .DS [5] ; high byte xtraj02 .DS [5] ; high byte
vx00 .DS [5] ;vx00 .DS [5] ; looks like it is not really used anywhere
vx01 .DS [5] vx01 .DS [5]
vx02 .DS [5] vx02 .DS [5]
vx03 .DS [5] vx03 .DS [5]
@@ -215,17 +221,17 @@ XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen)
YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen)
;---------------------------------------------------- ;----------------------------------------------------
;CheckCollisionWithTank ;CheckCollisionWithTank
vx .ds 4 ; 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA) ;vx .ds 4 ; 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA)
vy .ds 4 ;0,0,0,0 ;vy .ds 4 ;0,0,0,0
xtraj .ds 3 ; 0,0,0 ;xtraj .ds 3 ; 0,0,0
ytraj .ds 3 ; 0,0,0 ;ytraj .ds 3 ; 0,0,0
xtrajold .ds 3 ; 0,0,0 xtrajold .ds 3 ; 0,0,0
ytrajold .ds 3 ; 0,0,0 ytrajold .ds 3 ; 0,0,0
Angle .DS 1 ;Angle .DS 1
Force .ds 3 ; 0,0,0 ;Force .ds 3 ; 0,0,0
Multiplier .ds 3 ; 0,0,0 ;Multiplier .ds 3 ; 0,0,0
Multiplee .ds 2 ; 0,0 Multiplee .ds 2 ; 0,0
goleft .DS 1 ;if 1 then flights left ;goleft .DS 1 ;if 1 then flights left
;---------------------------------------------------- ;----------------------------------------------------
;unPlot ;unPlot
WhichUnPlot .DS 1 WhichUnPlot .DS 1
@@ -239,7 +245,7 @@ FunkyBombCounter .DS 1
xtrajfb .DS 2 xtrajfb .DS 2
ytrajfb .DS 2 ytrajfb .DS 2
; ;
tracerflag .DS 1 ;tracerflag .DS 1
;---------------------------------------------------- ;----------------------------------------------------
;TypeChar ;TypeChar
mask1 .DS [8] mask1 .DS [8]
@@ -247,10 +253,10 @@ mask2 .DS [8]
char1 .DS [8] char1 .DS [8]
char2 .DS [8] char2 .DS [8]
color .DS 1 ;color .DS 1
ybit .DS 1 ybit .DS 1
tempbyte01 .DS 1 tempbyte01 .DS 1
delta .DS 2 ;delta .DS 2
yfloat .DS 2 yfloat .DS 2
deltaX .DS 1 deltaX .DS 1
UpNdown .DS 1 UpNdown .DS 1
@@ -275,8 +281,8 @@ HowManyOnTheListOff
.DS 1 .DS 1
HowManyOnTheListDef HowManyOnTheListDef
.DS 1 .DS 1
PositionOnTheList ; pointer position on the list being displayed ;PositionOnTheList ; pointer position on the list being displayed
.DS 1 ; .DS 1
LastWeapon LastWeapon
; number of the last previously purchased weapon ; number of the last previously purchased weapon
; it is necessary when after purchase some weapon ; it is necessary when after purchase some weapon
@@ -286,27 +292,27 @@ LastWeapon
WhichList ; list currently on the screen WhichList ; list currently on the screen
; (0-offensive, 1-defensive) ; (0-offensive, 1-defensive)
.DS 1 .DS 1
OffsetDL1 ; offset of the list screen (how many lines).... ;OffsetDL1 .DS 1 ; offset of the list screen (how many lines)....
.DS 1
;---------------------------------------------------- ;----------------------------------------------------
;mark the level ;mark the level
PositionInName ; cursor position in name of the player when name input PositionInName ; cursor position in name of the player when name input
.DS 1 .DS 1
DifficultyLevel ; Difficulty Level (human/cpu) ;DifficultyLevel .DS 1 ; Difficulty Level (human/cpu)
.DS 1
;---------------------------------------------------- ;----------------------------------------------------
;displaydecimal ;displaydecimal
decimal .DS 2 ;decimal .DS 2
decimalresult .DS 5 decimalresult .DS 5
;xmissile ;xmissile
ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte ;ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte
;round ;round
CurrentRoundNr .DS 1 CurrentRoundNr .DS 1
FallDown1 .DS 1 FallDown1 .DS 1
FallDown2 .DS 1 ;FallDown2 .DS 1
;leapfrog ;leapfrog
LeapFrogAngle .DS 1 LeapFrogAngle .DS 1
;laser ;laser
@@ -352,14 +358,14 @@ TankTempY
;---------------------------------------------------- ;----------------------------------------------------
singleRoundVars singleRoundVars
;-------------- ;--------------
escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed ;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed
;-------------- ;--------------
CurrentResult CurrentResult
.DS 1 .DS 1
;-------------- ;--------------
AngleTable ;Angle of the barrel of each tank during the round AngleTable ;Angle of the barrel of each tank during the round
.DS [MaxPlayers] .DS [MaxPlayers]
NewAngle ; used in AI ;NewAngle ; used in AI
.DS 1 .DS 1
;previousBarrelAngle ;previousBarrelAngle
; .DS [MaxPlayers] ; .DS [MaxPlayers]
@@ -386,20 +392,15 @@ singleRoundVarsEnd
;---------------------------------------------------- ;----------------------------------------------------
; 4x4 texts ; 4x4 texts
;---------------------------------------------------- ;----------------------------------------------------
LineAddress4x4 ;LineAddress4x4 .DS 2
.DS 2 LineCharNr .DS 1
LineCharNr ;LineXdraw .DS 2
.DS 1 ;LineYdraw .DS 1
LineXdraw
.DS 2
LineYdraw
.DS 1
;----------- ;-----------
ResultX ResultX
.DS 2 .DS 2
ResultY ;ResultY .DS 1
.DS 1
ResultOfTankNr ResultOfTankNr
.DS 1 .DS 1
@@ -412,7 +413,7 @@ StoreA4x4 .DS 1
Xcounter4x4 .DS 1 Xcounter4x4 .DS 1
nibbler4x4 .DS 1 nibbler4x4 .DS 1
CharCode4x4 .DS 1 CharCode4x4 .DS 1
plot4x4color .DS 1 ;1-white, 0-background ;plot4x4color .DS 1 ;1-white, 0-background
+493 -43
View File
@@ -90,7 +90,7 @@ tracer
.proc nuke .proc nuke
mva #sfx_nuke sfx_effect mva #sfx_nuke sfx_effect
inc FallDown2 inc FallDown2
mva #31 ExplosionRadius mva #30 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
jmp xmissile jmp xmissile
.endp .endp
@@ -194,7 +194,7 @@ EndOfLeapping
mva #0 Erase mva #0 Erase
pla pla
sta TankNr sta TankNr
mva #1 color
mva #5 FunkyBombCounter mva #5 FunkyBombCounter
FunkyBombLoop FunkyBombLoop
mva #1 tracerflag mva #1 tracerflag
@@ -229,28 +229,28 @@ NoExplosionInFunkyBomb
; ------------------------ ; ------------------------
.proc deathshead .proc deathshead
inc FallDown2 inc FallDown2
mva #31 ExplosionRadius mva #30 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
mva #sfx_nuke sfx_effect mva #sfx_nuke sfx_effect
SaveDrawXY SaveDrawXY
jsr xmissile jsr xmissile
UnSaveDrawXY UnSaveDrawXY
sbw xdraw #35 sbw xdraw #34
jsr CalculateExplosionRange jsr CalculateExplosionRange
mva #sfx_nuke sfx_effect mva #sfx_nuke sfx_effect
SaveDrawXY SaveDrawXY
jsr xmissile jsr xmissile
UnSaveDrawXY UnSaveDrawXY
adw xdraw #70 adw xdraw #68
jsr CalculateExplosionRange jsr CalculateExplosionRange
mva #sfx_nuke sfx_effect mva #sfx_nuke sfx_effect
SaveDrawXY SaveDrawXY
jsr xmissile jsr xmissile
UnSaveDrawXY UnSaveDrawXY
sbw xdraw #35 sbw xdraw #34
; ;
sbw ydraw #35 sbw ydraw #34
;jsr CalculateExplosionRange ;jsr CalculateExplosionRange
cpw ydraw #screenHeight cpw ydraw #screenHeight
bcs NoUpperCircle bcs NoUpperCircle
@@ -259,7 +259,7 @@ NoExplosionInFunkyBomb
jsr xmissile jsr xmissile
UnSaveDrawXY UnSaveDrawXY
NoUpperCircle NoUpperCircle
adw ydraw #70 adw ydraw #68
;jsr CalculateExplosionRange ;jsr CalculateExplosionRange
cpw ydraw #screenHeight cpw ydraw #screenHeight
bcs NoLowerCircle bcs NoLowerCircle
@@ -419,7 +419,7 @@ EndNurnedCheckLoop
; ------------------------ ; ------------------------
.proc heavyroller .proc heavyroller
inc FallDown2 inc FallDown2
mva #31 ExplosionRadius mva #30 ExplosionRadius
jmp xroller jmp xroller
.endp .endp
; ------------------------ ; ------------------------
@@ -465,8 +465,8 @@ EndNurnedCheckLoop
.endp .endp
; ------------------------ ; ------------------------
.proc xdigger .proc xdigger
mwa xdraw digstartx ;mwa xdraw digstartx
mwa ydraw digstarty ;mwa ydraw digstarty
ldx diggery ldx diggery
WriteToBranches WriteToBranches
lda xdraw lda xdraw
@@ -1207,6 +1207,16 @@ notpressed
bpl notpressed bpl notpressed
;---esc pressed-quit game--- ;---esc pressed-quit game---
rts rts
@
cmp #$3f ; A
bne @+
callActivation
; Hide all tanks - after inventory they may have other shapes
mva #1 Erase
jsr DrawTanks
mva #0 Erase
jsr DefensivesActivate
jmp afterInventory
@ @
cmp #$0d ; I cmp #$0d ; I
@@ -1219,6 +1229,7 @@ callInventory
; ;
mva #$ff isInventory mva #$ff isInventory
jsr Purchase jsr Purchase
afterInventory
mva #0 dmactls ; dark screen mva #0 dmactls ; dark screen
jsr WaitOneFrame jsr WaitOneFrame
lda #song_ingame lda #song_ingame
@@ -1261,7 +1272,7 @@ checkJoy
;------------JOY------------- ;------------JOY-------------
;happy happy joy joy ;happy happy joy joy
;check for joystick now ;check for joystick now
lda JSTICK0 lda STICK0
and #$0f and #$0f
cmp #$0f cmp #$0f
beq notpressedJoy beq notpressedJoy
@@ -1270,7 +1281,7 @@ checkJoy
jmp jumpFromStick jmp jumpFromStick
notpressedJoy notpressedJoy
;fire ;fire
lda TRIG0S lda STRIG0
jeq pressedSpace jeq pressedSpace
mva #$ff pressTimer ; stop counting frames mva #$ff pressTimer ; stop counting frames
jmp notpressed jmp notpressed
@@ -1787,16 +1798,22 @@ NoWind
mwa ytraj+1 ybyte mwa ytraj+1 ybyte
jsr draw jsr draw
;key ;key
bit LaserFlag
bmi LaserNoWalls
; Check for walls
jsr MakeWalls
;
LaserNoWalls
mwa xtraj+1 XtrajOld+1 mwa xtraj+1 XtrajOld+1
mwa ytraj+1 YtrajOld+1 mwa ytraj+1 YtrajOld+1
bit TestFlightFlag bit TestFlightFlag
bmi nowait bmi nowait
lda tracerflag
bne nowait
lda color lda color
beq nowait beq nonowait ; smoke tracer erases slowly
lda tracerflag
bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) )
nonowait
jsr shellDelay jsr shellDelay
nowait nowait
@@ -1966,40 +1983,31 @@ BouncyCastle
.proc SecondFlight .proc SecondFlight
; ---------------- copied code fragment from before firing. not too elegant. ; ---------------- copied code fragment from before firing. not too elegant.
; ---------------- get fire parameters again ; ---------------- get fire parameters again
ldx TankNr
ldx TankNr
lda ActiveWeapon,x
lda ForceTableL,x lda ForceTableL,x
sta Force sta Force
lda ForceTableH,x lda ForceTableH,x
sta Force+1 sta Force+1
lda #$0
sta Force+2
lda AngleTable,x lda AngleTable,x
sta Angle sta Angle
; Shoots tank nr X !!! :)
; set the starting coordinates of bullet with correction
; to start where the tank's barrel ends
; (without it bullet would go from the left lower corner of the tank)
;ldx TankNr
mwa EndOfTheBarrelX xtraj+1
mva EndOfTheBarrely ytraj+1
lda #0 lda #0
sta color sta Force+2
sta ytraj+2
sta xtraj sta xtraj
sta ytraj sta ytraj
sta color
mwa EndOfTheBarrelX xbyte
mva EndOfTheBarrelY ybyte
mva #0 ybyte+1
; ldy Angle
; clc
; lda xtraj+1
; adc EndOfTheBarrelX,y ; correction of X
; sta xtraj+1
; lda xtraj+2
; adc #0
; sta xtraj+2
; sec
; lda ytraj+1
; sbc EndOfTheBarrelY,y ; correction of Y
; sta ytraj+1
; lda ytraj+2
; sbc #0
; sta ytraj+2
ldy #100 ; ??? ldy #100 ; ???
mva #1 tracerflag ; I do not know (I mean I think I know ;) ) mva #1 tracerflag ; I do not know (I mean I think I know ;) )
@@ -2021,8 +2029,8 @@ MIRVcopyParameters
sta xtraj01,x sta xtraj01,x
lda xtraj+2 lda xtraj+2
sta xtraj02,x sta xtraj02,x
lda vx ;lda vx
sta vx00,x ;sta vx00,x
lda vx+1 lda vx+1
sta vx01,x sta vx01,x
lda vx+2 lda vx+2
@@ -2331,7 +2339,49 @@ MIRValreadyAll
;jsr drawtanks ;jsr drawtanks
rts rts
.endp .endp
; -------------------------------------------------
.proc MakeWalls
; -------------------------------------------------
bit WallsType ; ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy
bpl WrapAndNone
bvc MakeBump
; top bounce
bit ytraj+2
bpl NoOnTop
sec
.rept 4
lda #$00
sbc vy+#
sta vy+#
.endr
NoOnTop
MakeBump
cpw xtraj+1 #screenwidth
bcc OnScreen
; inverse vx (bouncing wall)
sec
.rept 4
lda #$00
sbc vx+#
sta vx+#
.endr
rts
WrapAndNone
bvc NoWall
cpw xtraj+1 #screenwidth
bcc OnScreen
; (wrapping wall)
bit xtraj+2
bmi LeftWrap
RightWrap
sbw xtraj+1 #screenwidth
rts
LeftWrap
adw xtraj+1 #screenwidth
OnScreen
NoWall
rts
.endp
; ------------------------------------------------- ; -------------------------------------------------
.proc WhiteFlag .proc WhiteFlag
; ------------------------------------------------- ; -------------------------------------------------
@@ -2423,6 +2473,406 @@ InverseScreenByte
rts rts
.endp .endp
; -------------------------------------------------
.proc TankFlying
; -------------------------------------------------
; This routine is run from inside of the main loop
; and replaces Shoot and Flight routines
; X and TankNr - index of flying tank
; -------------------------------------------------
; Let's designate the flight altitude.
jsr CheckMaxMountain
cmp #(12+18) ; tank witch shield (12) and max alt (18) check
bcc IsToHigh
sbc #12 ; tank witch shield high correction
bne StoreMaxAlt
IsToHigh
lda #18
StoreMaxAlt
sta FloatingAlt
; mva #18 FloatingAlt ; for testing
mva #sfx_plasma_2_2 sfx_effect
; display text 4x4 - fuel full
mwa #hoverFull LineAddress4x4
mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
sec
lda FloatingAlt
sbc #12
sta LineYdraw
jsr TypeLine4x4
ldx TankNr
; TankNr in X reg.
; now animate Up
mva #0 modify ; it's a counter
TankGoUp
lda ytankstable,x
cmp FloatingAlt ; Floating altitude
bcc ReachSky
; first erase old tank position
mva #1 Erase
jsr DrawTankNr
lda modify
cmp #5
bcc NoEngineClear
mva #0 color
jsr DrawTankRocketEngine
NoEngineClear
mva #0 Erase
dec ytankstable,x
inc modify
; then draw tank on new position
jsr DrawTankNr
lda modify
cmp #5
bcc NoEngine
lda random
and #%00000001
sta color
jsr DrawTankRocketEngine
NoEngine
; jsr WaitOneFrame
jmp TankGoUp
ReachSky
; engine symbol erase
mva #0 color
jsr DrawTankRocketEngine
; display text 4x4 - fuel full (clear text)
mwa #hoverFull LineAddress4x4
mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
sec
lda FloatingAlt
sbc #12
sta LineYdraw
lda #0
jsr TypeLine4x4.staplot4x4color
; and Soildown at the start (for correct mountaintable if tank was buried)
; calculate range
ldx TankNr
sec
lda XtankstableL,x
sbc #2
sta RangeLeft
lda XtankstableH,x
sbc #0
sta RangeLeft+1
clc
lda XtankstableL,x
adc #10
sta RangeRight
lda XtankstableH,x
adc #0
sta RangeRight+1
; hide tanks and ...
mva #1 Erase
jsr DrawTanks
jsr SoilDown2
mva #0 Erase
jsr DrawTanks
ldx TankNr
; check keyboard/joy and move tank left/right - code copied from BeforeFire
;keyboard reading
; KBCODE keeps code of last keybi
; SKSTAT $ff - nothing pressed
; $FB - any key
; $f7 - shift
; $f3 - shift+key
KeyboardAndJoyCheck
mva #sfx_tank_move sfx_effect
lda ShieldEnergy,x
cmp #20
bne notpressed
nop
; display text 4x4 - low fuel
mwa #hoverEmpty LineAddress4x4
mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
sec
lda FloatingAlt
sbc #12
sta LineYdraw
;lda #0
jsr TypeLine4x4 ;.staplot4x4color
ldx TankNr
notpressed
; let's animate "engine"
jsr DrawTankEngine
; enimation ends
lda SKSTAT
cmp #$ff
jeq checkJoy
cmp #$f7 ; SHIFT
jeq checkJoy
lda kbcode
and #%00111111 ; CTRL and SHIFT elimination
cmp #28 ; ESC
bne @+
jsr AreYouSure
bit escFlag
bpl notpressed
;---esc pressed-quit game---
rts
@
jumpFromStick
cmp #$6
jeq pressedLeft
cmp #$7
jeq pressedRight
cmp #$21
jeq pressedSpace
jmp notpressed
checkJoy
;------------JOY-------------
;happy happy joy joy
;check for joystick now
lda STICK0
and #$0f
cmp #$0f
beq notpressedJoy
tay
lda joyToKeyTable,y
jmp jumpFromStick
notpressedJoy
;fire
lda STRIG0
jeq pressedSpace
jmp notpressed
pressedRight
lda ShieldEnergy,x
jeq pressedSpace
ldy #1
jsr DecreaseShieldEnergyX
; first erase old tank position
mva #1 Erase
jsr DrawTankNr
mva #0 Erase
lda XtankstableH,x
cmp #>(screenwidth-12) ; tank width correction +4
bne @+
lda XtankstableL,x
cmp #<(screenwidth-12) ; tank width correction +4 pixels
@ bcs RightScreenEdge
inc XtankstableL,x
sne:inc XtankstableH,x
jmp NoREdge
RightScreenEdge
mva #sfx_dunno sfx_effect
NoREdge
mva #18 AngleTable,x
; then draw tank on new position
jsr DrawTankNr
jsr DisplayStatus
jsr WaitOneFrame
jmp KeyboardAndJoyCheck
pressedLeft
lda ShieldEnergy,x
beq pressedSpace
ldy #1
jsr DecreaseShieldEnergyX
; first erase old tank position
mva #1 Erase
jsr DrawTankNr
mva #0 Erase
lda XtankstableH,x
cmp #0
bne @+
lda XtankstableL,x
cmp #5 ; 4 pixles from left edge
@ bcc LeftScreenEdge
dec XtankstableL,x
lda XtankstableL,x
cmp #$ff
sne:dec XtankstableH,x
jmp NoLEdge
LeftScreenEdge
mva #sfx_dunno sfx_effect
NoLEdge
mva #162 AngleTable,x
; then draw tank on new position
jsr DrawTankNr
jsr DisplayStatus
jsr WaitOneFrame
jmp KeyboardAndJoyCheck
pressedSpace
; display text 4x4 - low fuel (clear text)
mwa #hoverEmpty LineAddress4x4
mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
sec
lda FloatingAlt
sbc #12
sta LineYdraw
lda #0
jsr TypeLine4x4.staplot4x4color
ldx TankNr
;=================================
; left or right from center of screen ?
ldy #0
lda XtankstableH,x
cmp #>((screenwidth/2)-8)
bne @+
lda XtankstableL,x
cmp #<((screenwidth/2)-8)
@ bcc TankOnLeftSide
TankOnRightSide
dey
TankOnLeftSide
sty FloatingAlt ; I know, not elegant byt this variable it's free now (0 go right, $ff go left)
; now we have direction of bypassing tanks on screen
; clear "engine pixels" under tank
mva #1 erase
jsr DrawTankEngine
CheckForTanksBelow
lda XtankstableL,x
sta xdraw
lda XtankstableH,x
sta xdraw+1
ldx NumberOfPlayers
dex
CheckCollisionWithTankLoop
cpx TankNr
beq ItIsMe
lda eXistenZ,x
beq DeadTank
; now we use Y as low byte and A as high byte of checked position (left right edgs of shield)
; it is tricky but fast and much shorter
lda xtankstableL,x
sec
sbc #9 ; 2 pixels more on left side + tan width
tay
lda xtankstableH,x
sbc #0
; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!!
cmp xdraw+1
bne @+
cpy xdraw
@
bcs LeftFromTheTank
tya ;add 20 (tank size*2 +2 and +2)
clc
adc #20
tay
lda xtankstableH,x
adc #0
cmp xdraw+1
bne @+
cpy xdraw
@
bcc RightFromTheTank
TankBelow
; tank below - we must move our tank
ldx TankNr
; first erase old tank position
mva #1 Erase
jsr DrawTankNr
mva #0 Erase
bit FloatingAlt
bmi PassLeft
PassRight
inc XtankstableL,x
sne:inc XtankstableH,x
mva #18 AngleTable,x
bne Bypassing
PassLeft
dec XtankstableL,x
lda XtankstableL,x
cmp #$ff
sne:dec XtankstableH,x
mva #162 AngleTable,x
Bypassing
; then draw tank on new position
jsr DrawTankNr
jmp CheckForTanksBelow
RightFromTheTank
LeftFromTheTank
DeadTank
ItIsMe
dex
bpl CheckCollisionWithTankLoop
ldx TankNr
mva #sfx_shield_off sfx_effect
mva #1 Erase
jsr DrawTankNr
mva #0 Erase
lda XtankstableL,x
and #%11111110 ; correction for PM
sta XtankstableL,x
GoDown
mwa #mountaintable temp
clc
lda temp
adc XtankstableL,x
sta temp
lda temp+1
adc XtankstableH,x
sta temp+1
adw temp #4 ; center of the tank
ldy #0
lda (temp),y
sta FloatingAlt
FloatDown
lda ytankstable,x
cmp FloatingAlt
beq OnGround
; first erase old tank position
mva #1 Erase
jsr DrawTankNr
jsr DrawTankParachute
mva #0 Erase
inc ytankstable,x
; then draw tank on new position
jsr DrawTankNr
jsr DrawTankParachute
jsr WaitOneFrame
jmp FloatDown
OnGround
; clear parachute
mva #1 Erase
jsr DrawTankParachute
mva #0 Erase
jsr WaitForKeyRelease
; and Soildown at the end (for correct mountaintable)
; calculate range
sec
lda XtankstableL,x
sbc #2
sta RangeLeft
lda XtankstableH,x
sbc #0
sta RangeLeft+1
clc
lda XtankstableL,x
adc #10
sta RangeRight
lda XtankstableH,x
adc #0
sta RangeRight+1
; hide tanks and ...
mva #1 Erase
jsr DrawTanks
jsr SoilDown2
mva #0 Erase
jsr DrawTanks
ldx TankNr
rts
.endp
; ------------------------------------------------- ; -------------------------------------------------
.proc CheckCollisionWithTank .proc CheckCollisionWithTank
; ------------------------------------------------- ; -------------------------------------------------