/*  Chaos:		    The Chess HAppening Organisation System	V5.1a
    Copyright (C)   1993    Jochen Wiedmann

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.


    $RCSfile: Chaos.h,v $
    $Revision: 1.1 $
    $Date: 1993/08/19 14:07:32 $

    This is the include-file of the program. It defines the constants,
    structures and prototypes.

    Computer:	Amiga 1200		    Compiler:	Dice 2.07.54 (3.0)

    Author:	Jochen Wiedmann
		Am Eisteich 9
	  72555 Metzingen
		Tel. 07123 / 14881
		Internet: wiedmann@mailserv.zdv.uni-tuebingen.de
*/


#ifndef CHAOS_H
#define CHAOS_H

#ifndef CHAOS_CAT_CATALOG_H
#include "Chaos_Cat.h"
#endif

#ifndef INTUITION_INTUITION_H
#include <intuition/intuition.h>
#endif
#include "gadtools.h"

#ifndef EXEC_LISTS_H
#include <exec/lists.h>
#endif
#ifndef EXEC_MEMORY_H
#include <exec/memory.h>
#endif
#ifndef UTILITY_DATE_H
#include <utility/date.h>
#endif
#ifndef CLIB_EXEC_PROTOS_H
#include <clib/exec_protos.h>
#endif
#ifndef CLIB_INTUITION_PROTOS_H
#include <clib/intuition_protos.h>
#endif
#ifndef CLIB_GADTOOLS_PROTOS_H
#include <clib/gadtools_protos.h>
#endif
#ifndef __STDLIB_H
#include <stdlib.h>
#endif
#ifndef __STRING_H
#include <string.h>
#endif


#ifdef AZTEC_C
#ifndef __PRAGMAS_EXEC_LIB_H
#include <pragmas/exec_lib.h>
#endif
#ifndef __PRAGMAS_INTUITION_LIB_H
#include <pragmas/intuition_lib.h>
#endif
#ifndef __PRAGMAS_GADTOOLS_LIB_H
#include <pragmas/gadtools_lib.h>
#endif
#endif


#define TRNFILENAME_LEN 512
#define TRNNAME_LEN 60

#define TNMODEB_SCHWEIZER_SYSTEM    0
#define TNMODEB_JEDER_GEGEN_JEDEN   1
#define TNMODEB_BUCHHOLZ	    2
#define TNMODEB_VERF_BUCHHOLZ	    3
#define TNMODEB_SONNEBORN_BERGER    4
#define TNMODEB_RUTSCHSYSTEM	    5
#define TNMODEF_SCHWEIZER_SYSTEM (1 << TNMODEB_SCHWEIZER_SYSTEM)
#define TNMODEF_JEDER_GEGEN_JEDEN (1 << TNMODEB_JEDER_GEGEN_JEDEN)
#define TNMODEF_BUCHHOLZ (1 << TNMODEB_BUCHHOLZ)
#define TNMODEF_VERF_BUCHHOLZ (1 << TNMODEB_VERF_BUCHHOLZ)
#define TNMODEF_SONNEBORN_BERGER (1 << TNMODEB_SONNEBORN_BERGER)
#define TNMODE_TABMASK (TNMODEF_BUCHHOLZ|TNMODEF_VERF_BUCHHOLZ|TNMODEF_SONNEBORN_BERGER)
#define TNMODEF_RUTSCHSYSTEM (1 << TNMODEB_RUTSCHSYSTEM)


/*
    Die Struktur Teilnehmer enthält alle Daten eines Teilnehmers.
*/
#define NAMELEN 30
#define GEBDATLEN 10
#define TELNRLEN 20
#define DWZLEN 10
struct Teilnehmer
  { struct Node Tn_Node;	    /*	Node-Struktur bildet alphabetisch
					sortierte Teilnehmerliste	    */
    struct Teilnehmer *LT_Succ;     /*	Beim Losen wird eine eigene Liste   */
    struct Teilnehmer *LT_Pred;     /*	gebildet, die diese beiden Felder
					verwendet.			    */
    struct Teilnehmer *RangNext;    /*	Nächster in der Rangliste	    */
    struct Teilnehmer *Gegner;	    /*	Hilfsfeld für Auslosung 	    */
    void *Hilfszeiger;		    /*	Hilfsfeld für verschiedene Dinge    */
    struct Game *First_Game;	    /*	Zeiger auf Liste der Spiele	    */
    int Flags;			    /*	Mögliche Flags siehe unten	    */
    short Nr;			    /*	Hilfsfelder für Auslosung	    */
    short GFlags, BrettNr;
    short Punkte, Buchholz;	    /*	Punkte, Buchholzpunkte und ver-     */
    long  ExtBuchholz;		    /*	feinerte Buchholzpunkte 	    */
    short WieOftWeiss;		    /*	< 0 = Schwarz; > 0 = Weiss	    */
    short WieOftWeissZuletzt;	    /*	< 0 = Schwarz; > 0 = Weiss	    */
    short ELO;			    /*	Internationale ELO-Zahl 	    */
    char DWZ[DWZLEN+1]; 	    /*	Deutsche Wertungszahl		    */
    char Name[NAMELEN+1];	    /*	Name und Vorname des Teilnehmers    */
    char Strasse[NAMELEN+1];	    /*	Adresse des Teilnehmers 	    */
    char Wohnort[NAMELEN+1];
    char TelNr[TELNRLEN+1];
    char Schachclub[NAMELEN+1];     /*	Schachclub des Teilnehmers	    */
    char GebDatum[GEBDATLEN+1];     /*	Geburtsdatum des Teilnehmers	    */
  };
/*  Mögliche Flags in Teilnehmer-Struktur:
*/
#define TNFLAGSB_SENIOR 31
#define TNFLAGSB_JUNIOR 30
#define TNFLAGSB_DAME	29
#define TNFLAGSB_AJUGEND 28
#define TNFLAGSB_BJUGEND 27
#define TNFLAGSB_CJUGEND 26
#define TNFLAGSB_DJUGEND 25
#define TNFLAGSB_EJUGEND 24
#define TNFLAGSB_GELOESCHT 0	/*  Teilnehmer ausgeschieden		    */
#define TNFLAGSB_HATTEFREILOS 1 /*  Teilnehmer hatte bereits ein Freilos    */
#define TNFLAGSB_NICHTRUNTER 2	/*  Wird intern für Auslosung verwendet     */
#define TNFLAGSF_SENIOR (1 << TNFLAGSB_SENIOR)
#define TNFLAGSF_JUNIOR (1 << TNFLAGSB_JUNIOR)
#define TNFLAGSF_DAME	(1 << TNFLAGSB_DAME)
#define TNFLAGSF_AJUGEND (1 << TNFLAGSB_AJUGEND)
#define TNFLAGSF_BJUGEND (1 << TNFLAGSB_BJUGEND)
#define TNFLAGSF_CJUGEND (1 << TNFLAGSB_CJUGEND)
#define TNFLAGSF_DJUGEND (1 << TNFLAGSB_DJUGEND)
#define TNFLAGSF_EJUGEND (1 << TNFLAGSB_EJUGEND)
#define TNFLAGSF_GELOESCHT (1 << TNFLAGSB_GELOESCHT)
#define TNFLAGSF_HATTEFREILOS (1 << TNFLAGSB_HATTEFREILOS)
#define TNFLAGSF_NICHTRUNTER (1 << TNFLAGSB_NICHTRUNTER)


/*
    Die Game-Struktur enthält alle Daten eines Spieles. Die Spiele eines
    Teilnehmers bilden eine verkettete Liste. Zu jedem Spiel gibt es daher
    zwei Game-Strukturen: Beide Kontrahenten haben je eine Kopie in ihrer
    Liste.
*/
struct Game
  { struct Game *Next;		/*  Zeiger auf nächstes Spiel		    */
    struct Teilnehmer *Gegner;	/*  Zeiger auf Gegner			    */
    short BrettNr;		/*  Brettnummer des Spiels		    */
    short Ergebnis;		/*  Ergebnis (-1 = Ergebnis fehlt)          */
    short Flags;		/*  Mögliche Flags siehe unten		    */
  };
/*  Mögliche Flags in Game-Struktur:
*/
#define GMFLAGSB_KAMPFLOS   0
#define GMFLAGSB_FREILOS    1
#define GMFLAGSB_SELBERRAUS 2
#define GMFLAGSB_WEISS	    3
#define GMFLAGSF_KAMPFLOS (1 << GMFLAGSB_KAMPFLOS)
#define GMFLAGSF_FREILOS (1 << GMFLAGSB_FREILOS)
#define GMFLAGSF_SELBERRAUS (1 << GMFLAGSB_SELBERRAUS)
#define GMFLAGSF_WEISS (1 << GMFLAGSB_WEISS)


/*  Die GameNode-Struktur dient dazu, eine Liste aller Spiele einer
    Runde zu bilden.
*/
struct GameNode
  { struct Node gn_Node;
    struct Teilnehmer *Weiss, *Schwarz;
    short BrettNr;
    short Ergebnis, Flags;  /*	Von Weiß    */
    char Text[80];
  };



/*
    Globale Variablen
*/
extern struct IntuitionBase    *IntuitionBase;
extern struct Library	       *GadToolsBase;
extern struct GfxBase	       *GfxBase;
extern struct Library	       *AslBase;
extern struct Library	       *IFFParseBase;
extern struct Library	       *UtilityBase;
extern struct List	       Teilnehmerliste;
extern int		       IsSaved;
extern int		       OutputIsPrinter;
extern char		       Turnierfilename [];
extern int		       NumRunden;
extern struct Teilnehmer       *RanglistenErster;
extern int		       NumTeilnehmer;
extern int		       NumFehlendeSpiele;
extern char		       Turniername [TRNNAME_LEN+1];
extern int		       TurnierModus;
extern int		       MakeIcons;
extern char		       IconName[TRNFILENAME_LEN+1];
extern char		       ProgName[TRNFILENAME_LEN+1];
extern char		       *AVERSION;
extern char		       *PVERSION;

/*  main.c	*/
char *CatString(int, char *);
void FreeMemAll(void);
void Cleanup(int errcode, char *errmsg);
void main(int argc, char **argv);
void ShowError(char *, ...);
void MemoryError(void);
void InsertTeilnehmer(struct Teilnehmer *tn);
/*  project.c	*/
char *FileRequest(int, char *, char *);
void LoescheTurnier(void);
int SpeichereTurnier(char *name);
void LadeTurnier(char *name);
int TesteSpeichern(void);
void NeuesTurnier(void);
void Informationen(void);
/*  tlnhmr.c	*/
int BearbeiteTeilnehmer(struct Teilnehmer *);
void NeuerTeilnehmer(void);
void TeilnehmerAendern(void);
void TeilnehmerLoeschen(void);
/*  losen.c	*/
struct Game *SpielAdresse(struct Teilnehmer *, int);
void MakeRangliste(int *);
void LoseRunde(int);
/*  runde.c	*/
struct List *GetRunde(int, int, int);
void FreeRunde(struct List *);
void ErgebnisEingabe(int);
/*  out.c	*/
void punktetoa(char *, long);
void wertungtoa(char *, short);
short tdwz(struct Teilnehmer *);
int lprint(struct List *, char *);
int longlprint(struct List *, char *);
void FreeOutListe(struct List *);
void MyPrint(struct List *, char *, char *, char *, int);
void MakeTabelle(struct Teilnehmer **);
void OutTeilnehmerliste(int);
void OutRunde(int);
void OutTabelle(int);
void OutRangliste(void);
void OutFortschrittstabelle(void);
/*  Outsk.c	*/
void OutKreuztabelle(void);
void OutSpielerKarten(void);
/*  OutDWZ.c	*/
void OutDWZWertung(void);
int aToDate(char *, struct ClockData *);


/*  Zwei nützliche Makros
*/
#define ALLOCSTRUCT(s) ((struct s *) \
			AllocMem(sizeof(struct s), MEMF_ANY|MEMF_CLEAR))
#define FREESTRUCT(p) FreeMem(p, sizeof(*p))


/*  Es folgen zum Schluß einige Dinge, die das Compilieren mit 2.0-Includes
    ermöglichen. (Ich hätte nicht gedacht, daß es da solche Probleme geben
    würde!
*/
#ifdef GFLG_RELSPECIAL
#define V39_INCLUDES
#else

/*  Die folgende Definition soll verhindern, daß bei den 2.0-Includes die
    Datei libraries/mathffp.h eingebunden wird.
*/
#ifndef LIBRARIES_MATHFFP_H
#define LIBRARIES_MATHFFP_H
#endif

/*  In den 2.0-Includes fehlt der Prototyp der Funktion RangeRand(), weshalb
    er hier auftaucht.
*/
UWORD RangeRand( unsigned long maxValue );

#endif	/*  V39_INCLUDES    */
#endif
