// Track.c

#include "ult_64.h"

#include "define.h"
#include "ml.h"

#include "fastcode.h"
#include "track.h"


#define MAX_SLOTS 16

#define MADE_NO				0
#define MADE_YES			1
#define MADE_DONTCARE	2


typedef struct STrack
{
	u8 Type	: 2;
	u8 Made : 1;
} STrack;


static STrack
	Teams[2][MAX_SLOTS],
	Players[10][MAX_SLOTS];


void Track_Init()
{
	Set8s( Teams, 0, sizeof( Teams ) );
	Set8s( Players, 0, sizeof( Players ) );
}


void Track_Deinit()
{
}


void Track_Shot( playert *plyr, u32 type, s32 made )
{
	STrack
		*track;
	u32
		i;

	if (ft_flag)
		return;

#if 0
{
	char
		str[] = "track 0 0\n";

	str[6] = '1' + type;
	str[8] = made ? '1' : '0';
	PCwrite( -1, str, strlen( str ) );
}
#endif

	// Player...

	track = &Players[plyr->no][MAX_SLOTS-1];
	for (i=0; i<(MAX_SLOTS-1); i++)
	{
		track[0] = track[-1];
		track--;
	}
	track->Type = type;
	track->Made = made;


	// Team...

	track = &Teams[plyr->team][MAX_SLOTS-1];
	for (i=0; i<(MAX_SLOTS-1); i++)
	{
		track[0] = track[-1];
		track--;
	}
	track->Type = type;
	track->Made = made;
}


static u32
	NumTried,
	NumCount,
	CntTried,
	CntCount;


s32 Track_Check( const char *args, playert *plyr )
{
	STrack
		*track;
	u32
		i,
		type,
		made,
		check,
		num_tried,
		num_count,
		cnt_tried = 0,
		cnt_count = 0;

	switch (args[0])
	{
		case '2':		type = TRACK_2PT;		break;
		case '3':		type = TRACK_3PT;		break;
		case 'f':		type = TRACK_FG;		break;
	}

	switch (args[1])
	{
		case 'n':		made = MADE_NO;					break;
		case 'y':		made = MADE_YES;				break;
		case '-':		made = MADE_DONTCARE;		break;
	}

	num_count = (args[2] - '0');

	switch (args[3])
	{
		case 's':
			track = &Players[plyr->no][0];
			break;

		case 't':
			track = &Teams[plyr->team][0];
			break;

		case 'o':
			track = &Teams[1 - plyr->team][0];
			break;
	}

	num_tried = (args[4] - '0');

NumTried = num_tried;
NumCount = num_count;

	switch (args[5])
	{
		case 'r':			// In a row.
			i = 0;
			while (i < MAX_SLOTS && cnt_tried < num_tried)
			{
				if (track->Type & type)
				{
					cnt_tried++;

					switch (made)
					{
						case MADE_NO:
							if (!track->Made)
								cnt_count++;
							break;

						case MADE_YES:
							if (track->Made)
								cnt_count++;
							break;

						case MADE_DONTCARE:
							cnt_count++;
							break;
					}
				}

				track++;
				i++;
			}

CntTried = cnt_tried;
CntCount = cnt_count;

			if (cnt_tried >= num_tried &&
					cnt_count >= num_count)
				return( TRUE );
			break;


		case 'a':			// Any.
			for (i=0; i<MAX_SLOTS; i++)
			{
				if (track->Type & type)
				{
					cnt_tried++;

					switch (made)
					{
						case MADE_NO:
							if (!track->Made)
								cnt_count++;
							break;

						case MADE_YES:
							if (track->Made)
								cnt_count++;
							break;

						case MADE_DONTCARE:
							cnt_count++;
							break;
					}
				}

				track++;
			}

			if (cnt_tried >= num_tried &&
					cnt_count >= num_count)
				return( TRUE );
			break;
	}

	return( FALSE );
}


Gfx *Track_Show( Gfx *gp, Gfx *(*DrawNumber)( Gfx *gp, s32 num, s32 x, s32 y ) )
{
	STrack
		*track;
	s32
		i;

	gp = DrawNumber( gp, NumTried, 4, 5 );
	gp = DrawNumber( gp, NumCount, 4, 6 );
	gp = DrawNumber( gp, CntTried, 4, 7 );
	gp = DrawNumber( gp, CntCount, 4, 8 );

	track = &Teams[0][0];
	for (i=0; i<8; i++)
	{
		gp = DrawNumber( gp, (track->Type & 3)+1, 12, 3+i );
		gp = DrawNumber( gp, track->Made & 1, 14, 3+i );

		track++;
	}

	track = &Teams[1][0];
	for (i=0; i<8; i++)
	{
		gp = DrawNumber( gp, (track->Type & 3)+1, 20, 3+i );
		gp = DrawNumber( gp, track->Made & 1, 22, 3+i );

		track++;
	}

	return( gp );
}
