Programm-Version v1.13 von RandomXmas vom 07.05.2002 (ca. 225 KB)
Readme.txt: 07.05.2002  (324 Zeilen)
Texturen: *.bmp: 05.05.2002 (77.512 Bytes)
makefile: 16.04.2002  (51 Zeilen) 
Programmierer: Stefan Ziegler
Mails an: stefan.ziegler@s1998.tu-chemnitz.de
Webseite: http://www.tu-chemnitz.de/~zst/weihnachten/weihprogs.html

(English version in readme_EN.txt)

			Lizenz/License

/* RandomXmas v1.13 zu Weihnachten 2001 
 * Frei kopierbar, aber nur vollstaendig mit allen zugehoerigen Quelltexten, 
 * Makefile, readme.txt und tex*.bmp. Veraenderungen moeglich, bei Weitergabe 
 * aber immer Original-Quelltexte mit beilegen (gleicht moegliche Fehler im 
 * geaenderten Teil aus),
 * Keine Patentierungen auf Teile des oder ganzes Programm(s)*/
/* RandomXmas v1.13 for Christmas 2001
 * Free Copying, only with all belonging program files, Makefile, Readme.txt,
 * and tex*.bmp. Changes are possible, but republishing only with all original
 * files (to have an original if there will be any mistakes in changes).
 * I don't want any software patents on parts or all of the program.*/

			Inhalt:

1. Anleitungen

1.1 Bedienung
1.2 Spielbeschreibung
1.3 Benutzung
1.4 Texturen

2. Programmierung

2.1 Geschichte des Programms
2.2 Geplante Verbesserungen
2.3 Klassen

			1. Anleitungen
			==============

			1.1 Bedienung:

- Spielfigur bewegen auch mit Maus: Taste links gedrueckt halten und Maus
  verschieben. Spielfigur bewegt sich dann in diese Richtung. Aufladen fuer
  Sprung mit mittlerer Maustaste. Je nach Programmgeschwindigkeit ist die
  Bewegung per Maus unterschiedlich sensibel, (einstellbar in "konstanten.h"). 
- Tasten 'x', 'y', 'z' drehen Spielfeld auf der entsprechenden Achse,
  je um 30 Grad in positiver Richtung.
- Tasten 'X', 'Y', 'Z' drehen Spielfeld entsprechend in negativer Richtung.
- Mit Taste 'i' drehen sie das Spielfeld wieder in die Ausgangsrichtung.
- Mit 'd', 'v', 'r' schalten Sie zwischen (D)rehen, (V)erschieben und 
  (R)eshape (Fenstergroesse) um. 
  Bei allen funktioniert 'X'/'x', 'Y', 'y', 'i', beim Verschieben/Drehen
  natuerlich auch 'z'/'Z'.
- Taste 'p' schaltet Punktanzeige an/aus.
- 'Esc'-Taste beendet Spiel vorzeitig mit Punktzahl 0.
- Spielfigur bewegen Sie mit Cursortasten (oder Maus).
- Mit Taste 'Ende' aufladen fuer Sprung, ausgefuehrt mit Cursortasten.
- Scrollen bei Highscore mit 'Bild hoch' oder 'Bild herunter'(Page Up/Down)
  oder mit Maus("Rollen" im Menue) mit gedrueckter linker Maustaste hoch/runter.
- Umschalten auf Blick von Spielfigur/von aussen mit 'b'. ausgefuehrt nach
  einer Bewegung der Spielfigur.
- Weitere Spielfiguren mit 'n', Auswaehlen der Figur mit 's'. Es zaehlen die
  Punkte der Figur, die als letztes im Spiel benutzt wurde.
- Pull-down-Menue mit rechter Maus-Taste erreichbar, dort sind alle Funktionen
  drin, die auch mit der Tastatur benutzt werden koennen.
- Theoretisch auch mit Joystick (ab GLUT-API 4, nur mit Windows, nicht getestet).
Die Groesse des Fensters ist variabel, sollte aber quadratisch gehalten 
werden, sonst verdreht sich in Extremfaellen das Spielfeld nach unten.

		     1.2. Spielbeschreibung:

  Sammeln Sie Punkte unter (zufaellige Werte) und ueber (zufaellig, aber 
gleicher Buchstabe(nur noch 6 verschiedene) - gleiche Veraenderung)
den Baeumen (hineinlaufen/springen).
In einigen Faellen aendert sich dabei die Maximalpunktzahl (nicht zufaellig).
  Mit groesseren Huegeln wechseln sie in andere Ebenen. In einigen Faellen
verlieren sie aber auch(siehe Konstanten). Bei kleineren passiert nichts. Fuer
die Buchstaben darueber gilt das gleiche wie bei den Baeumen.
  Wenn die Maximalpunktzahl erreicht ist (rechts von den Punkten), dann
gehen sie in einen Huegel und das Spiel ist beendet (oder mit 'Esc'). 
Dann kommt die TopTen und darunter ihre Punktzahl (bei verlorenen -1, 
abgebrochenen Spielen 0) mit Datum, Uhrzeit und Namen (soweit angegeben).
Mit 'Esc'-Taste beendet sich dann das Programm.

			1.3. Benutzung:

Braucht Libraries GL, GLU, GLUT und andere Standardbibliotheken.
Download-Hinweise bei www.opengl.org -> Downloads
Glut: http://www.opengl.org/developers/documentation/glut.html
glut.dll fuer Windows bei http://www.xmission.com/~nate/glut.html
Uebersetzungs-Hinweise bei: http://www.lighthouse3d.com/opengl/glut/

Variable DETAILS in konstanten.h: 10 ist Standard, d.h. 100 Polygone je Kugel,
50 Polygone je Kegel(-stumpf).

1. spiel113.tar.gz in ein Verzeichnis kopieren, auspacken mit 
   'tar -xzvf spiel113.tar.gz'
2. Programm uebersetzen mit 'make spiel'
3. Bei fehlerfreier Uebersetzung ist eine Datei 'spiel' angelegt worden.
4. Mit './spiel' starten sie das Programm
5. Mit './spiel highscore' wird das Punktergebnis in dieses File eingetragen.
   Die Filelaenge ist beliebig (sollte in den Speicher passen), je Zeile 
   werden 100 Zeichen gelesen (sonst Umbruch) und nach Einordnung der 
   erspielten Punkte die Zeilen zurueckgeschrieben.
6. Mit './spiel highscore Name' oder 'spiel highscore Vorname Nachname' wird
   der Name ins Highscorefile mit eingetragen.
7. Also am besten Variante 6 in Script/Batch-Datei stecken und damit starten.

			   1.4 Texturen

Als Texturen koennen beliebige BMP-Dateien genutzt werden. Diese werden dann
auf das entsprechende Objekt draufgelegt(gestreckt/gezerrt) und dargestellt.
Durch die erwaehnte Zerrung sieht das Bild dann nicht immer so aus wie 
erwartet. Auf der Ebene wird es nur verkleinert/vergroessert.

Voreingestellt sind folgende Dateinamen entsprechend ihrer Bestimmung:
Im Verzeichnis "textures/"
- "texebene.bmp"          Dateiname fuer Textur auf Ebene
- "texhuegel.bmp"         Dateiname fuer Textur auf Huegel
- "texbaum.bmp"           Dateiname fuer Textur auf Baeumen
- "texcap.bmp"            Dateiname fuer Textur auf Muetze des Weihnachtsmannes
- "texhead.bmp"           Dateiname fuer Textur auf Kopf des Weihnachtsmannes
- "texbody.bmp"           Dateiname fuer Textur auf Mantel des Weihnachtsmannes
- "texshoes.bmp"          Dateiname fuer Textur auf Schuhen

Mitgeliefert wurden folgende 10 Bilder (erstellt mit 'xfig' und 'xv'):
  Dateiname		  empfohlene Nutzung (per Link/Kopieren)
- "baum.bmp"		  Baum-Textur fuer Baum
- "beton.bmp"		  Beton-Textur fuer Huegel/Ebene
- "colorgrid.bmp"	  Farbiges Gitter, zum Testen auf runden Oberflaechen
- "eis.bmp"		  Eis-Textur fuer Huegel/Ebene
- "erde.bmp"		  Erd-Textur fuer Huegel/Ebene
- "gesicht.bmp"		  Gesicht fuer Kopf der Spielfigur
- "holz.bmp"		  Holz-Textur fuer Baum/Huegel/Ebene
- "sand.bmp"		  Sand-Textur fuer Huegel/Ebene
- "schnee.bmp"		  Schnee-Textur fuer Huegel/Ebene
- "stein.bmp"		  Stein-Textur fuer Huegel/Ebene

Zum Testen, ob das Bild im Programm ladbar ist, kann man "testtexturen"
verwenden (make testtexturen). Starten mit "testtexturen <Bilddatei.bmp>"
Das geladene Bild kann man dann genauso drehen und verschieben wie die Ebene
oder das Highscorefile im Spiel (nur mit Tastatur).
Es muessen nicht alle Dateien vorhanden sein! Wenn eine fehlt, sieht die 
Darstellung genauso aus wie in Version 1.11 . Es entsteht kein Programmfehler.
Die Groesse ist beliebig, sollte aber in den Speicher passen(4 Byte pro Pixel
und Zusatzinfos). Bei grossen Bildern dauert aber das Laden am Programmstart
laenger und diese werden meist stark verkleinert, damit sie "passen".

			2. Programmierung
			=================

			  2.1 History:

21.12.2000: erste Beta-Version, einige kleinere Macken, aber keine schweren
		Fehler, spielbar
22.12.2000: v1.00 Erste nahezu fehlerfreie Version
25.12.2000: v1.01 -Anzeige der Geschenke ausschaltbar,
		  -eine schon vorhandene Ebene wird nicht neu angelegt, wenn in
		   sie gewechselt wird (sonst Speicher belegt, der nicht
		   wieder freigegeben werden kann)
		  -Readme mit History
		  -Versionsnummern eingefuehrt.
05.01.2001: v1.02 Punktanzeige korrigiert, jetzt FELDEINHEIT ueberall
		  Mass fuer Abstand, statt MAXFELDHOEHE zwischen grossen und
		  kleinen Geschenken.
06.01.2001: v1.03 Zeitausgabe am Ende umprogrammiert auf gettimeofday. und ohne
		  doppeltes Newline
		  Makefile erweitert auf alle X-Libs
09.11.2001: v1.10 - Punkteanzeige mit Ziffern, Schriftverwendung,
		  - Highscorefile-Verarbeitung/Anzeige,
		  - Punktesammeln erweitert,
		  - globales Licht in Szene und entsprechende Farben,
		  - Joystickfunktion eingebaut aber nicht getestet,
		  - Aufteilen des Codes in Files mit den entsprechende Klassen,
		  - Standard-Sicht veraendert.
		  - ToDoList eingefuegt in readme
23.12.2001: v1.11 - Sprunghoehe abhaengig von MAXFELDHOEHE
		  - Quadrics geloescht bei Ebenenwechsel
		  - Schriftanzeige deutlicher, von 64 auf ca. 128 Zeichen
		  - auch bei Highscore X-Drehung(vorher nur Y/Z) moeglich
		  - Highscore zeigt jetzt auch beliebiges File ohne Probleme 
		    an (bei Readonly-Rechten auch nicht veraendert)
		  - Filelaenge beliebig durch Nutzung von Listen
		  - Scrolling bei Highscore-Dateianzeige.
		  - Displaylisten in extra Programmstueck ausprobiert
		  - Detaillevel einstellbar fuer Baeume/Huegel
		  - Klassen-Beschreibung eingefuehrt in Readme.txt
09.01.2002: v1.12 - Tabulator in Grafikausgabe korrigiert, 1 als erste Position
		  - Displaylisten und Texturen vollstaendig in Ebene/Feld,
		    auch ungerade Anzahl in MAXFELD unterstuetzt
		  - Mann mit Texturen, auf eigenen Blickwinkel umschaltbar,
		    bei Bedarf auch mit DETAILS anpassbar, Displaylist
		  - nur noch 6 verschiedene Buchstaben zum Punktesammeln
		  - Klasse Texturen, kann sie auch selber darstellen
		  - Klasse Stringlist geaendert, nur noch strlen in FindText
		    abhaengig von Grundtyp char-Feld.
		  - Readme mit Inhalt, Abschnitte Texturen, Lizenz,
		    Teile in Englisch.
		  - Vier Textur-Dateien mitgeliefert, Makefile neu geschrieben
		  - Darstellung von Mann/Ebene/Feld weniger Push-/Popmatrix,
		    beschleunigt
		  - Double-Buffer eingefuehrt gegen Flimmern beim Neu-Zeichnen
06.05.2002: v1.13 - Warnings bei Uebersetzung aufgeloest
   (allgemein)    - einige System-Header-Files hinzugefuegt
		    (sont manchmal Probleme beim Uebersetzen)
		  - readme.txt angepasst, Englische Version extra
		  - neue Texturen, alte verbessert, in Unterverzeichnis.
   (ebenefeld)    - Ebenenummer und Text in extra Funktion, extra Fensterbereich
		    und unabhaengig von MAXFELD (jetzt feste Groessen)
		  - Ebene Bodenflaeche ohne GEN_TEXTUR(ausgeschaltet),
		    alle anderen jetzt mit GEN_TEXTUR	
   (geschenke)	  - TriggerPunktAnz gibt keinen Wert mehr zurueck
		  - Punktanzeige auf fester Position (ohne MAXFELD)
   (grafikausg)	  - Funktion DrawGlutChar zeichnet mit GLUT-Strich-Schrift
		  - Diese nur genutzt bei gesetzter Konstante USE_GLUT_FONT
		  - Fuer Groesse nur noch positive Werte angenommen
		  - bei Divisionen float Werte als Divisor(Teiler)
   (highsboard)   - ausgegliedert aus Datei spiel.cpp
		  - Uebergabe Punkte, Name, Dateiname an Konstruktor
		  - CloseSublist, GetListLine extra Funktion, vereinfacht
		    Readfile, Writefile -> keine doppelten Zeilen drin
		  - Variablen uebersetzt/umbenannt ins Englische
		  - Fehler bei Punktzahl -1 speichern entfernt (-2 als Abbruch)
   (konstanen.h)  - Farb-, Licht- und Materialwerte dorthin
		  - Unterteilt in 4 Abschnitte -> umgeordnet
		  - einige (v.a. boolesche) Variablen als char statt short
		  - neu: MANN_NUMBER, MANN_CAP, USE_GLUT_FONT, MOUSE_SENSE,
			 USE_TEXTURES 
   (makefile)	  - neue Regeln fuer highsboard, spielraum
		  - SPIELOBJ aufgeteilt
		  - Regel zum Kompilieren von C-Files (inkl. CLFAGS)
   (mann)	  - extra Funktion DrawPunkte fuer Punktausgabe in extra Bereich
		  - Blickwinkel des Spielers in extra Prozedur und verbessert
		  - Fuer Klasse spielraum angepasst, Ebenegenerierung dort
		  - in Addpos neue x- und y-Position zusammengelegt
		  - bekommt Punkte des Feldes von spielraum  
		  - Kopf-Sphere richtig gedreht, damit Textur richtig liegt
		  - durch MANN_CAP mit/ohne Muetze zeichnen
   (spiel.cpp)	  - Winkelneuberechnung bei Drehen in negativer Richtung
  		    korrigiert (und in neue DoRotate)
		  - Mausunterstuetzung fuer Bewegung der Spielfigur,
		    und Drehen/verschieben/Scrollen -> mousemodifmodes
		    MOUSE_SENSE in konstanten.h zur Sensibilitaet
		  - Maus-Menue, entspr. Funktionen damit wie Tastatur
		  - Joystick-Funktion wie MouseMotion angepasst,
		    (Joystick erst ab GLUT API 4, Win unterstuetzt), wird mit
		    dieser Bearbeitungsfunktion wohl falsch arbeiten (unab-
		    haengig von Unterstuetzung)
		  - Winkel, Verschiebungen in 2 Felder fuer je 3 Achsen
		    modifmodekey statt 3 Variablen -> Var.zahl verkleinert
		  - Name schon bei Uebergabe zusammengesetzt, so an highscore
		  - Mehrere Spielfiguren (Feld weihmann, Zeiger weihmann_id)
		    (CreateFigure, SwitchFigure)
		  - Punktlichter vorn und hinten(Pos) -> eigene AMB, DIF, SPEC,
		    in extra Funktion bei Draw da manchmal verstellt
		  - an Nutzung von Klasse spielraum angepasst
		  - InitHighscore aus display ausgelagert, mit Menue-Anpassung
		    in display auch gleich Darstellung -> ohne Taste druecken
		  - Funktion DrawGameScreen ausgelagert aus display, zwei
		    Fensterbereiche ->Viewport, LookAt, Perspective
		  - bei Reshape bei Blick Mann nicht LookAt veraendert
		  - Funktionen DoRotate, DoTranslate aus Eingabebehandlung
		    heraus (nicht mehr doppelt bei Maus, Joystick, Tastatur)
		    beide umgeschrieben,
		  - DoMove genauso ausgelagert aus Eingabebehandlung, total 
		    umgeschrieben (nur noch eine statt 15 lokalen Variablen)
		  - bei Tastaturbehandlung (void key(...) ) grosse/kleine 
		    Achsenangabe nur durch mult unterschieden
   (spielraum)	  - ausgegliedert aus ebenefeld, mann, spiel.cpp
		  - aus Struktur Klasse gemacht -> Methoden fuer Variablen
		  - Variablen umbenannt/uebersetzt
		  - Switchlevel: umschalten in andere Ebene, aus Mann heraus
		  - GetContent, GetAbove statt direkter Abfrage der Ebene
		  - SwitchEnd: umschalten auf highscore/Spielende zentral
		  - uebernimmt Laden der Texturen von spiel.cpp
		  - TriggerViewMann uebernimmt rueckschalten von spiel.cpp
		  - Draw-Funktionen fuer Zugriff auf entspr. Ebene-Fkt.
   (texturen)	  - neue Funktion Test_print_error zur Fehlerausgabe
		  - diese mit entspr. Fehlertexten eingefuegt
		  - 24-bit BMP: Farbreihenfolge umgedreht entspr. xv-Erzeugung
		  - Textur-Koordinaten generieren einschalten (OBJECT_LINEAR)
		  - Ausgabe auf Ebene: ohne Generierung; umgebaut

			2.2 ToDoList:

- Version fuer Nicht-Weihnachtszeit (Farben und Material der Felder/Spielfigur),
- gluLookat Zentrale Werte (nur an einem Platz)
- Klasse main ?
- Konfigurationsfile statt "konstanten.h",
- autoconf - Uebersetzung,
- Veroeffentlichung unter GPL 2.0 (nicht fuer Versionen vor 1.14),
- ladbare Schriften (Konsolefonts ?),
- Sound (Soundblaster-Beeps und Wavefile-Abspielung),
- Netzwerk- und Mehrspieler-Modus irgendwann

			2.3 Klassen:

Ebene: 		Darstellung eines Levels, nutzt Feld, Grafikausgabe und
(ebenefeld.h)	Texture
Feld: 		Darstellung eines Gegenstandes(Baum/Huegel),
(ebenefeld.h)	nutzt Grafikausgabe und Texture
Geschenke: 	Punkte eines Spielers, Darstellung dieser, nutzt Grafikausgabe
Grafikausgabe:	Darstellung/Aufbewahrung von Zahlen, char[]-Zeichenketten
(grafikausg.h)  mit eigener oder GLUT-Schrift
Highscoreboard: Darstellung des Highscore oder allgemein von Files, nutzt 
(highsboard.h)	Doublelist, Stringlist und Grafikausgabe
Simplelist: 	Grundklasse der Listen, einfach verkettet, fuer Zahlen
(listen.h)	Template spaeter ?
Stringlist: 	Listenklasse fuer char-Felder(Strings), abgeleitet von 
(listen.h)	Simplelist, Texttype derzeit nur fuer char-Felder,
	    	strlen fuer beliebige Felder ? dann Template-Klasse.
Doublelist: 	Doppeltverkettete Liste fuer Listenhierarchie (nimmt Listen 
(listen.h)	auf), abgeleitet von Simplelist. Template spaeter ?
Mann: 		Darstellung, Verwaltung eines Spielers, nutzt Geschenke, 
(mann.h)	Spielraum und Texture
Spielraum: 	Aufnahme aller noetigen Variablen eines Spiels, Nutzung von
(spielraum.h)  	Ebene, Texture, ohne Spieler. Verwaltung und Weitergabe der
		Werte an nutzende Klassen/Programme.
Texture:	Laden einer Textur aus BMP-Datei, Darstellung/Nutzen dieser
Haupt-Programm: nutzt Spielraum, Mann, Highscoreboard. Zusammenspiel aller 
(spiel.cpp)	wichtigen Klassen geregelt, GL-Grundfunktionen, Bedienung.
