// **************************************************************************
// **************************************************************************
// **************************************************************************
// **                                                                      **
// ** STATS.H                                                       MODULE **
// **                                                                      **
// ** Functions for managing the season, playoffs, and statistics.         **
// **                                                                      **
// ** Last modified : 20 Mar 1998 by John Brandwood                        **
// **                                                                      **
// **************************************************************************
// **************************************************************************
// **************************************************************************

#ifndef __STATS_h
#define __STATS_h

#ifndef __LFPTYPES_h
 #include "lfptypes.h"
#endif

/*
#ifndef __MENU_h
 #include "menu.h"
#endif
*/

//
// GLOBAL DATA STRUCTURES AND DEFINITIONS
//

typedef	struct SortNode_S
	{
	struct SortNode_S * pcl__parent;
	struct SortNode_S * pcl__lesser;
	struct SortNode_S * pcl__bigger;
	void *              pbf__data;
	SI                  si___key1;
	SI                  si___key2;
	SI                  si___key3;
	SI                  si___key4;
	} SortNode_T;

#define	STAT_STRING_GP      1
#define	STAT_STRING_GW      2
#define	STAT_STRING_GL      3
#define	STAT_STRING_GWP     4		// winning percentage
#define	STAT_STRING_MIN     5
#define	STAT_STRING_MPG     6
#define	STAT_STRING_PTS     7
#define	STAT_STRING_PPG     8
#define	STAT_STRING_FGMA    9
#define	STAT_STRING_FGM     10
#define	STAT_STRING_FGA     11
#define	STAT_STRING_FGP     12
#define	STAT_STRING_3PMA    13
#define	STAT_STRING_3PM     14
#define	STAT_STRING_3PA     15
#define	STAT_STRING_3PP     16
#define	STAT_STRING_FTMA    17
#define	STAT_STRING_FTM     18
#define	STAT_STRING_FTA     19
#define	STAT_STRING_FTP     20
#define	STAT_STRING_AST     21
#define	STAT_STRING_APG     22
#define	STAT_STRING_STL     23
#define	STAT_STRING_SPG     24
#define	STAT_STRING_BLK     25
#define	STAT_STRING_BPG     26
#define	STAT_STRING_REB     27
#define	STAT_STRING_RPG     28
#define	STAT_STRING_OFF     29
#define	STAT_STRING_OPG     30
#define	STAT_STRING_REBO    31
#define	STAT_STRING_TO      32
#define	STAT_STRING_TPG     33
#define	STAT_STRING_PF      34
#define	STAT_STRING_DQ      35
#define	STAT_STRING_TF      36	// team fouls
#define	STAT_STRING_5PMA	37
#define	STAT_STRING_10PMA	38
#define	STAT_STRING_15PMA	39
#define	STAT_STRING_5PP		40
#define	STAT_STRING_10PP	41	
#define	STAT_STRING_15PP	42


#define	ATTR_STRING_RANGE   43
#define	ATTR_STRING_FG      44
#define	ATTR_STRING_3P      45
#define	ATTR_STRING_FT      46
#define	ATTR_STRING_DRIBBLE 47
#define	ATTR_STRING_PASSING 48
#define	ATTR_STRING_SPEED   49
#define	ATTR_STRING_JUMPING 50
#define	ATTR_STRING_REB     51
#define	ATTR_STRING_STR     52
#define	ATTR_STRING_DUNKING 53
#define	ATTR_STRING_STL     54
#define	ATTR_STRING_BLK     55
#define	ATTR_STRING_STAMINA 56
#define	ATTR_STRING_OVERALL 57


#define MAX_TIMEOUTS	7

extern int DraftSortMode;

//
// GLOBAL VARIABLES
//

extern	Preferences_T *     pcl__gPreferences;
extern	Options_T *         pcl__gOptions;
extern	ThisMatch_T *       pcl__gMatch;

extern	Preferences_T       cl___gDemoPreferences;
extern	Options_T           cl___gDemoOptions;
extern	ThisMatch_T         cl___gDemoMatch;
extern	Preferences_T       DefaultPreferences;
 
extern	Preferences_T       cl___gPreferences;
extern	Options_T           acl__gOptions[4];
extern	Options_T           acl__gDefaultOptions[4];
extern	ThisMatch_T         cl___gMatch;

extern	SB                  sb___gRosterChanged;
extern	SB                  sb___gRosterSource;

extern	SI                  si___gRosterLen;

extern	UW *                apuw_gRoster [4];
extern	UW *                puw__gRoster;
extern	PlyrRomData_T *     apcl_gCustom [4];
extern	PlyrRomData_T *     pacl_gCustom;

extern	UW *                puw__gSchedule;

extern	SI                  si___gTeamRomSsn;
extern	SI                  si___gTeamRomCnt;
extern	TeamRomData_T *     pacl_gTeamRom;

extern	SI                  si___gPlyrRomSsn;			// NBA season plyrs
extern	SI                  si___gPlyrRomCnt;			// incl cheat plyrs
extern	SI                  si___gPlyrRomTot;			// incl custom plyrs
extern	PlyrRomData_T *     pacl_gPlyrRom;

extern	SI                  si___gTeamSsnStatCnt;
extern	TeamRamStat_T *     pacl_gTeamSsnStat;			// 28 bytes each
extern	SI                  si___gPlyrSsnStatCnt;
extern	PlyrRamStat_T *     pacl_gPlyrSsnStat;			// 32 bytes each

extern	SI                  si___gTeamPlyStatCnt;
extern	TeamRamStat_T *     pacl_gTeamPlyStat;			// 28 bytes each
extern	SI                  si___gPlyrPlyStatCnt;
extern	PlyrRamStat_T *     pacl_gPlyrPlyStat;			// 32 bytes each

extern	int                 si___gSortCount;
extern	SortNode_T **       ppcl_gSortList;

extern	int                 si___gTopTeamW;
extern	int                 si___gTopTeamL;

extern	UW                  uw___gMvpPlyr;
extern	SB                  sb___gMvpPlyr;
extern	SB                  sb___gMvpTeam;

extern	SB                  asb__gNbaTopTeams [16];
extern	SB                  asb__gSsnTopTeams [16];
extern	SB                  asb__gPlayoffTree [64];
extern	UB                  aub__gPlayoffSeed [8];

extern	SB                  sb___gPlyRound;
extern	SB                  sb___gPlyMatch;
extern	SB                  sb___gPlyConfr;
extern	SB                  sb___gPlyIndex;
extern	SB                  sb___gPlyHome;
extern	SB                  sb___gPlyAway;

extern	ExtraGameStats_T	*gExtraGameStats;	// should be NULL except in Arcade Mode


//
// GLOBAL DATA
//

extern	SW                  asw__gQuarterPts [2][8];

#define NUM_QTR_LENGTHS		4

extern	UW                  aub__gLenQuarter  [NUM_QTR_LENGTHS];
extern	UW                  aub__gLenOvertime [NUM_QTR_LENGTHS];
//extern	UB                  aub__gNumTimeOuts [NUM_QTR_LENGTHS];
extern	UB                  aub__gRegTimeOuts [NUM_QTR_LENGTHS];	// regulation timeouts
extern	UB                  aub__gOvrTimeOuts [NUM_QTR_LENGTHS];	// overtime timeouts
extern	UB                  aub__gTeamFoulsOK [NUM_QTR_LENGTHS];
//extern	UB                  aub__gPlyrFoulsOK [NUM_QTR_LENGTHS];

extern	void SetQuarterTime(void);

//
// GLOBAL FUNCTION PROTOTYPES
//

//	Memory Utilities

extern	void *              bytecpy                 (void *des, void *s, int size);
extern	int                 bytecmp                 (void *, void *, int);
extern	void *              wordclr                 (void *, int);
extern	void *              wordcpy                 (void *, void *, int);
extern	int                 wordcmp                 (void *, void *, int);

//	Ascii Conversion Functions For Statistics

extern	void                int2str                 (char *, int);
extern	void                dec2str                 (char *, int);
extern	void                pct2str                 (char *, int);
extern	void                pnum2str                (char *, int);
extern	void                attrval2str             (char *, int);

extern	void                GetTeamStatStr_ttl      (char *, int);
extern	void                GetTeamStatStr_xxx      (char *, TeamRamStat_T *, int);

extern	void                GetPlyrStatStr_ttl      (char *, int);
extern	void                GetPlyrStatStr_xxx      (char *, PlyrRamStat_T *, int);

// Season Schedule Functions.

extern	void                ClrSeason               (void);

extern	int                 SearchSchedule          (int, int, UD);
extern	int                 FindScheduleDate        (int);
extern	int                 TestScheduleGame        (void);
extern	int                 SkipScheduleGame        (void);
extern	int                 PlayScheduleGame        (int);

// Playoff Schedule Functions.

extern	void                ClrPlayoffs             (void);
extern	void                SetPlayoffTeams         (void);

extern	void                GetPlayoffGame          (Options_T *);
extern	void                NxtPlayoffGame          (void);
extern	int                 TestPlayoffGame         (void);
extern	int                 SkipPlayoffGame         (void);

extern	void                CalcSsnTopTeams         (SB *, int);
extern	void                CalcRndTopTeams         (SB *);

// Match Statistics Functions.

extern	void                XvertPlyrTimeOnCourt    (void);
extern	void                UpdateQuarterPts        (void);
extern	void                SetupNextQuarter        (void);

extern	int                 CountTeamBenchPlyrs     (PlyrRamData_T *);

extern	void                SimulateMatch           (void);

extern	int                 IsPlayoffWinner         (void);

extern	void                UpdateSsnMatchStats     (int simmedgame);
extern	void                UpdatePlyMatchStats     (int simmedgame);

extern	PlyrRamStat_T *     LocatePlyrStats         (PlyrRamStat_T *, int);

extern	void                CalculateMatchMVP       (void);

// Match Initialization Functions.

extern	int                 InitDemoMatch           (int demotype);	// call from outside of shell
extern	int                 InitDemoMatchFromShell  (int demotype);
//extern	int                 InitDemoMatch           (int, int, int);
extern	int                 DoneDemoMatch           (void);

extern	int                 InitMatch               (int, int, Options_T *);

extern	void                InitMatchStruct         (ThisMatch_T *);
extern	void                DoneMatchStruct         (ThisMatch_T *);

extern	void                InitMatchSettings       (ThisMatch_T *);

extern	TeamRamData_T *     InitMatchTeam           (SI, UW *);
extern	int                 LoadMatchTeam           (TeamRamData_T *);
extern	void                FreeMatchTeam           (TeamRamData_T *);

extern	int                 LoadTeamImg             (TeamRamData_T *);
extern	void                FreeTeamImg             (TeamRamData_T *);

extern	UB *                LoadPlyrImgNumber       (FH, int, UB *);

extern	int                 LoadPlyrImg             (PlyrRamData_T *, FH, UB *);
extern	void                FreePlyrImg             (PlyrRamData_T *);

extern	UW *                DecodePlyrImg           (PlyrRamData_T *, UW *);
extern	UW *                DecodeLoadedPlyrImg     (PlyrRamData_T *, UW *);

extern	UB *                LoadPlyrTexNumber       (FH, int, UB *);
extern	UB *                LoadCustomPlyrTex       (FH, int, UB *);

extern	int                 LoadPlyrTex             (PlyrRamData_T *, FH, UB *);
extern	void                FreePlyrTex             (PlyrRamData_T *);

extern	PlyrRamData_T **    MakeRosterList          (PlyrRamData_T **, TeamRamData_T *);

// Team Roster Functions.

extern	void                Substitute              (TeamRamData_T *, SB *, SB *);

extern	void                FixPlyrRomTeams         (void);

extern	int                 TeamSlotsUsed           (int);

extern	int                 RosterStarters          (TeamRamData_T *);

extern	int                 RosterPlyrPosn          (int, int);
extern	int                 RosterMovePlyr          (int, int, int);
extern	int                 RosterSwapPlyr          (int, int, int, int);

extern	void                SortTeamRoster          (UW *);
extern	void				SortTeamRosterAttr		(UW * puw__Roster, int sortattrib);	// based on attribute

extern	void                ResetRosters            (void);

// Sorting Functions.

extern	void                InitSorting             (void);
extern	void                FreeSorting             (void);

extern	void                SortStandings           (int, UB);
extern	void                SortPlayers             (int, int);

// Random Number Functions.

extern	void                InitRandomByte          (void);
extern	UI                  ReadRandomByte          (void);
extern	UI                  ReadBellCurve           (void);

// Statistics Simulation Functions.

extern	void                ShellInitSimulation     (void);
extern	void                ShellFreeSimulation     (void);
extern	void                SimulateMatch           (void);



extern int		SeasonTeamIsHuman(int teamnum);
void			CopySeasonOptionsToPlayoffOptions(void);
void			SetDefaultOptions(int optionset);	// SOURCE_SSN, SOURCE_PLY, etc

//
// End Of __STATS_h
//

#endif



// **************************************************************************
// **************************************************************************
// **************************************************************************
//	END OF STATS.H
// **************************************************************************
// **************************************************************************
// **************************************************************************

