// Banners.c

#include "ult_64.h"
#include "main.h"
#include "file.h"
#include "define.h"
#include "ml.h"

#include "misc.h"
#include "banners.h"


#define TEX_SIZE (128*32/2)


typedef struct
{
	VertexN64
		Verts[2][2][14];
	RGBA16
		Pal[256];
	u8
		Tex[8][TEX_SIZE];
} SBanners;


s32
	Banners_Scroll = 0,
	Banners_Which = 0;


static VertexN64
	*Verts;

static u8
	*Data;

static s32
	Count,
	Hold = 60;

static SBanners
	*Banners;


static s32 GetTeam( s32 team )
{
	if (team > TEAM_WAS)
	{
		if (team == TEAM_EAS || team == TEAM_WES)
			team = 0;
		else
			team = -1;
	}

	return( team );
}


void Banners_Init( void *workspace )
{
	FH
		file;
	s32
		offset;

	Banners = MemMalloc( sizeof( SBanners ), MEM_ANY );


	file = FileOpen( "BANNERS.TEX", "rb" );

	FileRead( Banners->Pal, (256*2), 1, file );
	FileRead( Banners->Tex, (8*TEX_SIZE), 1, file );

	offset = GetTeam( pcl__gMatch->asb__mTeam[0] );
	if (offset < 0)
		Count = 6;
	else
	{
		Count = 8;

		offset *= (16*2)+TEX_SIZE;
		FileSeek( file, offset, SEEK_CUR );

		FileRead( &Banners->Pal[6*16], 16*2, 1, file );
		FileRead( &Banners->Tex[6][0], TEX_SIZE, 1, file );
	}

	FileClose( file );
}


void Banners_Deinit()
{
	MemFree( Banners );
}


static Gfx *DrawBanners( Gfx *gp, VertexN64 *v, s32 x, s32 w, s32 h, s32 ban1, s32 ban2 )
{
	s16
		y;
	u8
		a;

	y = (h * 479 / ((32*64)-1));

	a = 128 - (u8)((h * 128) >> (5+6));

	gDPLoadTextureBlock_4b( gp++,
													&Banners->Tex[ban1][0],
													G_IM_FMT_CI,
													128, 32,
													ban1,
													G_TX_CLAMP,
													G_TX_CLAMP,
													7, 5,
													G_TX_NOLOD, G_TX_NOLOD );

	gSPVertex( gp++, v, 14, 0 );

	gDPSetRenderMode( gp++, G_RM_XLU_SURF, G_RM_XLU_SURF2 );


	v->x = 4280;
	v->y = -479;
	v->z = x;

	v->u = -32;
	v->v = h-32;

	v->a = 0;

	v++;


	v->x = 4280;
	v->y = -479;
	v->z = x-w;

	v->u = (128*64)-32;
	v->v = h-32;

	v->a = 0;

	v++;


	v->x = 4280;
	v->y = -y;
	v->z = x;

	v->u = -32;
	v->v = (32*64)-32;

	v->a = a;

	v++;


	v->x = 4280;
	v->y = -y;
	v->z = x-w;

	v->u = (128*64)-32;
	v->v = (32*64)-32;

	v->a = a;

	v++;


	gSP1Triangle( gp++, 2, 1, 3, 0 );
	gSP1Triangle( gp++, 2, 0, 1, 0 );


	gDPPipeSync( gp++ );
	gDPSetRenderMode( gp++, G_RM_AA_OPA_SURF, G_RM_AA_OPA_SURF2 );


	v->x = 4280;
	v->y = 479;
	v->z = x;

	v->u = -32;
	v->v = h-32;

	v->a = 255;

	v++;


	v->x = 4280;
	v->y = 479;
	v->z = x-w;

	v->u = (128*64)-32;
	v->v = h-32;

	v->a = 255;

	v++;


	v->x = 4280;
	v->y = y;
	v->z = x;

	v->u = -32;
	v->v = (32*64)-32;

	v->a = 255;

	v++;


	v->x = 4280;
	v->y = y;
	v->z = x-w;

	v->u = (128*64)-32;
	v->v = (32*64)-32;

	v->a = 255;

	v++;


	gSP1Triangle( gp++, 4, 7, 5, 0 );
	gSP1Triangle( gp++, 4, 6, 7, 0 );


	gDPLoadTextureBlock_4b( gp++,
													&Banners->Tex[ban2][0],
													G_IM_FMT_CI,
													128, 32,
													ban2,
													G_TX_CLAMP,
													G_TX_CLAMP,
													7, 5,
													G_TX_NOLOD, G_TX_NOLOD );

	gDPSetRenderMode( gp++, G_RM_XLU_SURF, G_RM_XLU_SURF2 );

	v->x = 4280;
	v->y = -y;
	v->z = x;

	v->u = -32;
	v->v = -32;

	v->a = a;

	v++;


	v->x = 4280;
	v->y = -y;
	v->z = x-w;

	v->u = (128*64)-32;
	v->v = -32;

	v->a = a;

	v++;


	v->x = 4280;
	v->y = 0;
	v->z = x;

	v->u = -32;
	v->v = h-32;

	v->a = 128;

	v++;


	v->x = 4280;
	v->y = 0;
	v->z = x-w;

	v->u = (128*64)-32;
	v->v = h-32;

	v->a = 128;

	v++;


	gSP1Triangle( gp++, 10, 9, 11, 0 );
	gSP1Triangle( gp++, 10, 8, 9, 0 );


	gDPPipeSync( gp++ );
	gDPSetRenderMode( gp++, G_RM_AA_OPA_SURF, G_RM_AA_OPA_SURF2 );

	v->x = 4280;
	v->y = y;
	v->z = x;

	v->u = -32;
	v->v = -32;

	v->a = 255;

	v++;


	v->x = 4280;
	v->y = y;
	v->z = x-w;

	v->u = (128*64)-32;
	v->v = -32;

	v->a = 255;

	v++;

	gSP1Triangle( gp++, 12, 11, 13, 0 );
	gSP1Triangle( gp++, 12, 10, 11, 0 );


	return( gp );
}


void Banners_Update()
{
	if (Paused)
		return;


	if (Hold)
	{
		Hold--;
	}
	else
	{
		Banners_Scroll = (Banners_Scroll + 16) & (32*64)-1;

		if (!Banners_Scroll)
		{
			Banners_Which = (Banners_Which + 1) % Count;

			Hold = 60;
		}
	}
}


Gfx *Banners_Draw( Gfx *gp, dyn *d )
{
	static s32
		db = 0;
	s32
		ban1,
		ban2;

	db = 1 - db;

	gDPPipeSync( gp++ );
	gDPSetCombineMode( gp++, G_CC_DECALRGB, G_CC_DECALRGB );
	gSPTexture( gp++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON );

	gDPLoadTLUT_pal256( gp++, Banners->Pal );

	ban1 = Banners_Which;
	ban2 = (ban1 + 1) % Count;
	gp = DrawBanners( gp, &Banners->Verts[db][0][0], 2314, 2314, Banners_Scroll, ban1, ban2 );

	ban1 = (Banners_Which + 2) % Count;
	ban2 = (ban1 + 1) % Count;
	gp = DrawBanners( gp, &Banners->Verts[db][1][0], 0, 2354, Banners_Scroll, ban1, ban2 );

	return( gp );
}
