*********************************************************************

Dieses Billardspiel ist Shareware !!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Es darf erst gespielt werden nach Zahlung von DM 5 oder $ 3 an:

                              Stefan Salewski
                              Stolper Weg 3
                              D-2160 Stade

                              Bankverbindung: Stadt-Sparkasse Stade
                                              Bankleitzahl 24151005
                                              Kontonummer: 823864

*********************************************************************

Da das Erstellen von guter Software nicht nur mit einem groen
Zeitaufwand, sondern auch mit einigen Unkosten verbunden ist, und ich
als Student keine Einnahmen habe, habe ich mich entschloen, dieses
Spiel im Gegensatz zu meinen bisherigen Werken nicht als
Public-Domain, sondern als Shareware zu verffentlichen. (Am Ende der
Anleitung zu meinem Mathematikprogramm R.o.M.(AMOK#11) hatte ich
bereits darum gebeten, da mir diejenigen, die das Programm viel
benutzen, eine kleine Spende zukommen lassen sollten. Das ist jetzt
weit ber ein Jahr her und bislang habe ich von Niemanden etwas
erhalten.) Dieses Spiel ist also Shareware. Das bedeutet, da alle
Rechte an diesem Programm weiterhin bei mir liegen und da es nur von
Personen benutzt werden darf, die mir den Betrag von DM 5 ($3)
geschickt bzw. auf mein Konto berwiesen haben. Befreit von dieser
Sharewaregebhr sind alle Programmierer, die mindestens ein gutes
Programm (was gut ist, mu jeder Programmierer selbst entscheiden)
als PD oder Shareware verffentlicht haben, und Herausgeber von
PD-Serien und Diskmagazinen.

Jetzt zum eigentlichen Spiel: Die vorliegende Version luft nur auf
PAL-Amigas. (Fr NTSC-Amigas mssen einige Konstanten gendert werden,
und das Bild BillardTable mu natrlich auch angepat werden) Starten
knnen Sie das Programm wie blich durch Doppelklicken von der
Workbench aus oder von CLI durch:"[run] Billard". Starten Sie das
Programm von der Workbench, so mu sich in der gleichen Schublade, in
der sich das Programm Billard befindet, auch das Bild BillardTable
befinden. Beim Start von CLI mu das Bild BillardTable im aktuellen
Directory vorhanden sein, andernfalls bricht das Programm ab. Nach
kurzer Ladezeit und dem Hinweis, bitte die Sharewaregebhr zu
bezahlen, sehen sie vor sich einen Billardtisch, auf dem momentan
sieben Kugeln liegen. Um Miverstndnisse zu vermeiden, mchte ich nun
einige Begriffe definieren:

Anklicken: Den Mauspfeil auf ein Objekt bewegen, die linke Maustaste
           drcken und wieder loslassen.
Gadget:    Oder auch Schalter, Taster.
           Eines der 12 bzw. 13 Kstchen am unteren Bildschirmrand.
Spielball: Die Billardkugel, die mit dem Stock (Queue) angestoen wird.
Bande:     Der Rahmen des Billardtisches, an dem die Kugeln abprallen
           knnen.
Queue:     Der Stock, mit dem eine Kugel angestoen wird.
Maus:      Rollkugeleingabegert, mit welchen der Mauszeiger auf dem
           Bildschirm bewegt wird. Mit Mausposition ist die Position des
           Mauszeigers (Kreuz) auf dem Bildschirm gemeint.

Nun zum Spiel. Klicken Sie einen Ball an und bewegen Sie den Mauspfeil
etwas. Wie sie sehen, wird von der Mitte des selektierten Balles zur
aktuellen Mausposition jeweils eine Linie gezogen. Diese Linie
symbolisiert den Billardqueue. Wenn Sie nochmals den linken Mausknopf
drcken und wieder loslassen, wird die Kugel in die Richtung der Linie
angestoen, wobei die Anfangsgeschwindigkeit proportional zur Lnge
der Linie ist. Sobald die Kugeln zur Ruhe gekommen sind, knnen Sie
auf die gleiche Weise eine weitere Kugel anstoen.

Jetzt zu der Beschreibung der 13 Gadgets am unteren Bildschirmrand.
Die Gadget knnen mit der Maus angeklickt werden und veranlassen dann
eine bestimmte Reaktion. Danach kann sofort wieder normal
weitergespielt werden. (Mit Ausnahme der Gadgets "Quit" und "Set",
s.u.) Nun zu der Funktion der Gadget von links nach rechts:

Quit: Damit knnen Sie das Spiel beenden.
Set:  Dieses Gadget hat eine gewisse Sonderstellung. Durch Anklicken
      schalten Sie in einen anderen Modus, in dem Sie die Blle
      beliebig positionieren knnen. Sie whlen einen Ball durch
      anklicken aus, verschieben ihn dann an die gewnschte Position
      und legen ihn dort durch erneutes Klicken ab. Danach knnen Sie
      mit dem nchsten Ball fortfahren. Sie knnen auch Blle vom Rahmen
      aufnehmen oder dort ablegen. Alle Blle, die sich beim Beenden
      dieses Modus auf dem Spielfeldrahmen befinden, werden
      automatisch entfernt. Sie beenden diesen Modus durch erneutes
      Anklicken des "Set"-Gadgets.

0     Dieses Gadget rumt alle Blle von Tisch.
7,11,16:Es werden 7, 11 oder 16 Blle auf dem Tisch in einer
      vorgegebenen Position aufgebaut. Auerdem werden die 5 Zhler
      (s.u), die am oberen rechten Bildschirmrand angezeigt werden,
      zurckgesetzt.
RND:  Die momentan auch den Tisch befindlichen Blle werden zufllig
      verteilt.
P:    (Power) Wie schon erwhnt, ist die Anfangsgeschwindigkeit der
      Blle proportional zur Lnge der Linie bzw. des Queues. Da man
      die Maus nicht ber den Bildschirmrand positionieren kann, ist
      die Lnge dieser Linie bei Bllen, die nahe am Spielfeldrand
      liegen, begrenzt. Deshalb kann man den Ball nicht auf die
      Maximalgeschwindigkeit beschleunigen. Hier tritt nun das Gadget
      "Power" in Aktion. Nach anklicken von "Power" wird die maximale
      Queuelnge verringert, wobei aber weiterhin die Maximallnge der
      maximalen Geschwindigkeit entspricht. Da in diesem Power-Modus
      die Queuelnge geringer ist, ist natrlich auch die
      Zielgenauigkeit eingeschrnkt. Deshalb sollte man diesen Modus
      durch erneutes anklicken des Powergadgets wieder verlassen,
      sobald der Spielball weit genug von der Bande entfernt ist.
<R R>:Mit diesen beiden Gadgets kann man die Reibung, die die Blle
      auf dem Tisch erfahren, einstellen. Die Zahl zwischen den beiden
      R's gibt an, wie oft der Spielball bei einen maximalen Ansto
      den Tisch in horizontaler Richtung berqueren kann, bevor er
      durch die Reibung zur Ruhe gekommen ist. Das linke Gadget
      erniedrigt diese Zahl, das rechte erhht sie bei jedem
      Anklicken. Diese Zahl ist aber auf Werte zwischen 1 und 9
      begrentzt.
Digi: Fr einige Spielversionen mag es ntzlich sein, wenn die Blle
      Nummern tragen. Durch anklicken dieses Gadgets erhalten sie
      welche, allerdings wird dadurch die Illusion, da die Blle
      rollen, zerstrt. Erneutes Anklicken dieses Gadgets lscht die
      Nummern wieder. Auch hierbei ist ein Zugriff auf BillardTable
      ntig.
Pool: Dieses Programm untersttzt zwei Billardvarianten. Pool, bei
      dem es darum geht, die Blle in den Lchern zu versenken, und
      eine andere Spielforn, bei der der Tisch keine Lcher hat, und
      die Spieler versuchen, bestimmte Blle auf eine bestimmte Weise
      anzustoen. Mit diesem Gadget kann man zwischen den beiden
      Versionen umschalten. Dabei wird auf das Bild "BillardTable"
      zugegriffen. Deshalb mu die entsprechende Diskette in einem
      Laufwerk liegen.
Undo: Hiermit knnen einige Aktionen rckgngig gemacht werden. Undo
      wirkt auf den zuletzt ausgefhrten Sto, oder auf die Gadgets
      Set, 0, 7, 11, 16, und RND. Insbesondere ist "Undo" beim ben
      ntzlich, da man damit einfach verunglckte Ste zurcknehmen
      kann.

Zhler:
  Auf dem oberen rechten Rahmem des Tisches werden 5 Zhler angezeigt,
  die bei einigen Spielvarianten vielleicht ntzlich sein knnen. Der
  erste Zhler zeigt die Anzahl der gemachten Ste an. An dieser Zahl
  kann man bei zwei Spielern auch erkennen, wer gerade dran ist
  (gerader oder ungerader Zhlerstand). Der nchste Zhler summiert
  alle Punkte, die bei geraden Stonummern erziehlt werden (Spieler 1
  bei zwei Spielern), der andere die Punkte, die bei ungeraden
  Stonummern erziehlt werden. Der nchste Zhler gibt die Summe der
  beiden vorherigen an. (Mit Punkten ist die Nummer gemeint, die die
  Blle im Digi-Modus tragen, und man bekonnt sie gutgeschrieben, wenn
  die Kugel in ein Loch fllt.) Der letzte Zhler zeigt an, wie viele
  Blle momentan auf dem Tisch liegen.

Rechte Maustaste:
  Durch Drcken der rechten Maustaste ist es mglich, den
  Billard-Screen in den Hintergrund zu bringen und dadurch die
  Workbench wieder sichtbar zu machen, ohne das Spiel zu verlassen.

Jetzt zu den Spielregeln:
~~~~~~~~~~~~~~~~~~~~~~~~
Da ich bislang noch nie echtes Billard gespielt habe, kann ich hierzu
keine genauen Aussagen machen. Allerdings soll dieses Spiel auch gar
nicht nach starren Regeln gespielt werden. Dieses Programm simuliert
einen Billardtisch. Wie beim echten Billard knnen sie jederzeit eine
beliebige Kugel anstoen, Kugeln verschieben (mogeln), neue Stellungen
aufbauen und einiges mehr. Wenn Sie Pool-Billard spielen, ist es
vermutlich ihr Ziel, die Kugeln in den Lchern zu versenken. Die
Kugeln direkt in die Lcher zu stoen, wird ihnen wohl nach einiger
Zeit zu leicht erscheinen. Dann sollte man vielleicht dazu bergehen,
mit dem Spielball eine andere Kugel so anzustoen, da diese in ein
Loch fllt. Weiter kann man sich das Spiel erschweren, indem man nur
das Anstoen einer bestimmten Kugel zult und eventuell auch noch
ansagt, welche Kugel man in welchem Loch versenken will. Bei der
anderen Version ohne Lcher geht es darum, da der Spielball, bevor er
einen anderen Ball trifft, zuvor mehrmals die Bande berhrt haben mu.
Beispielsweise spielen zwei Spieler mit drei Bllen. Jeder Spieler hat
einen eigenen Ball und mu diesen so anstoen, da er mindestens ein
oder zwei mal die Bande berhrt, bevor er den dritten Ball trifft.
Zwei Spieler knnten auch folgendermaem die Poolvariante Spielen: 16
Blle werden durch anklicken von "16" und "RND" auf dem Tisch
verteilt. Dem einen Spieler gehren die Blle mit geraden Nummern, dem
anderen die mit ungeraden Nummern. Die Spieler versuchen nun
abwechselnd, die Blle des anderen Spielers in die Lcher zu stoen.
Man kann sich also beliebige Spielregeln ausdenken und nach diesen
dann mit beliebig vielen Personen spielen.

Jetzt noch einige Hinweise: Das Spiel ist voll multitaskingtauglich.
Allerdings wird, wenn viele Blle eng beieinander liegen, fr die
Simulation der Ballbewegung sehr viel Rechenzeit verbraucht. Dies
erkennt man daran, da die grafische Darstellung der Blle etwas
ruckartig wird, und das andere Programme stark abgebremmst werden. Das
Spiel benutzt alle 4 Soundkanle des Amiga. Da der Sound aber fr das
Spiel nicht wichtig ist, werden die Soundkanle nur mit einer geringen
Prioritt angefordert. Deshalb knnen die Soundkanle von anderen,
gleichzeitig laufenden Programmen dem Billardspiel entzogen werden.
Sie knnen dann entweder mit weniger Billard-Sound weiterspielen, oder
das andere Programm und Billard beenden und dann Billard wieder neu
starten. Der Hintergrund des Spieles besteht aus einem ILBM-Bild mit
Namen BillardTable. Sie knnen es mit jedem Malprogramm bearbeiten.
Insbesondere kann man die Farben der Blle oder des Tisches verndern
oder auch die Blle anders beschriften, mit einem Muster versehen usw.
Allerdings darf die Position der Blle im Bild nicht gendert werden,
da sie sonst vom Programm nicht gefunden werden. Beim echten Billard
knnen die Blle auch einen Spin bzw. Drall haben, was zu gekrmmten
Bahnen und anderen Stowinkeln fhrt. Das ist in dieser Simulation
nicht bercksichtigt.

Zum Schlu noch einige Hinweise fr Programmierer: Das Programm ist in
Modula geschrieben und mit dem  Compiler M2Amiga V3.3d compiliert worden.
Das Programm benutzt neben den Standardmodulen mein Modul
ILBMHandler1.1, welches wiederum das Modul TurboFiles verwendet.
TurboFiles ist auf Amok#24 verffentlicht worden. Die alte, langsame
Version vom ILBMHandler ist auf Amok#17 erschienen. Obwohl ich die 50%
schnellere und erweiterte Version 1.1 bereits im July 89 an einen der
AMOK-Herausgeber (Friedtjof Siebert) geschickt hatte, ist sie bisher
leider nicht verffentlicht worden, aber mit der alten Version mte
es auch funktionieren. Ausserdem benutze ich MemSystem von Nicolas
Benezan. Es ist auf AMOK#16 enthalten, allergings mute ich es etwas
an die Compilerversion 3.3 anpassen. (Ich habe die Definition "TYPE
LevelKey=LONGINT" von Implementations- ins Definitionsmodul verlagert.)
Fr die Bewegung der Blle ist die Prozedur Control verantwortlich.
Sie wird als VBlank-Interrupthandler installiert. Deshalb wird sie
garantiert 50 mal pro Sekunde aufgerufen, und die Bewegung der Blle
kann in Echtzeit erfolgen, auch wenn nicht alle Bewegungsphasen auf
dem Bildschirm dargestellt werden. Die Darstellung der Blle geschieht
als Bobs. Zuerst hatte ich mit VSprites experimentiert, aber bei der
Benutzung von verschiedenen Farben und mehr als 8 Sprites bekommt man
merkwrdige Effekte, z.B. das verschwinden von Sprites oder
Farbfehler. Die Bobs verhalten sich dagegen sehr ordentlich, allerdings
sind sie nicht besonders schnell. Bei einem Screen mit 32 Farben und
16 Bobs mit einer Gre von 16x16 Pixel kann man die Bobs mit der
Funktion DrawGList maximal 10 mal pro Sekunde darstellen lassen. Da
fr die Kollisionsabfrage, die ich direkt ber die Position der Blle
vornehme, noch viel Rechenzeit verbraucht wird, kann man die Blle
leider nur wenige Male pro Sekunde zeichnen lassen, was zu etwas
ruckartigen Bewegungen fhrt. Eine Verbesserung knnte man sicher
erziehlen, wenn man die Prozedur Control in Assebler bersetzt, aber
erstens ist es nicht ganz einfach, von Assembler aus auf die globalen
Variablen zuzugreifen, und zweitens ist es nicht sicher, ob es sich
wirklich lohnt, da die meiste Zeit wohl fr FFP-Berechnungen
verbraucht wird. Andere Optimierungen, wie Zugriff auf Arrayelemente
ber Pointer statt ber Index habe ich bereits ausgeschpft. Die
Prozedur Control ist in dieser Form sicher unverstndlich. Die
Herleiting der Formeln fllen einige DIN-A4 Seiten; wer sie haben
mchte, kann Sie bei mir anfordern. (Die Bewegungsgleichungen beruhen
natrlich darauf, da bei Sten Energie- und Impulserhaltung gilt,
und da auf die Kugeln whrend der Bewegung eine konstante
Reibungskraft entgegen der Bewegungsrichtung wirkt.) Die brigen
Prozeduren sollten eigentlich verstndlich sein und knnen eventuell
verbessert oder erweitert werden.

Stefan Salewski, 16.12.89


