;/*
sc RESOPT DATA=NEAR UCHAR CONSTLIB STREQ NMINC STRMERGE NOSTKCHK NOSTDIO OPTIMIZE OPTSIZE IGNORE=73 Majiks.c
slink from LIB:c.o Majiks.o to //Clients/Majiks LIB LIB:sc.lib LIB:amiga.lib /lib/client.lib SC SD STRIPDEBUG NOICONS
delete Majiks.o
quit

 Majiks 1.0  (Client for BServer)

 Copyright © 1995 Stefano Reksten of 3AM - The Three Amigos!!!
 All rights reserved.
*/

#include <exec/types.h>
#include <exec/memory.h>

#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>

#include "/include/client.h"
#include "/include/bitmap/bitmap_pragmas.h"

char *ver = "$VER: Majiks 1.1 "__AMIGADATE__;

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Library *BitMapBase;
struct DisplayIDInformation *dinfo;

#define IDLE 0
#define FIRST_STEP 1
#define SECOND_STEP 2
#define THIRD_STEP 3
#define FOURTH_STEP 4
#define FIFTH_STEP 5
#define SIXTH_STEP 6
#define SEVENTH_STEP 7
#define EIGHTH_STEP 8

int status = FIRST_STEP, which_drawing, step;
UWORD x, y, count = 0, sw, sh, hsw, hsh;
BOOL still_blanking = TRUE;
struct Screen *scr;
struct RastPort *rp;


void MD( UWORD x1, UWORD y1, UWORD x2, UWORD y2 )
{
Move( rp, x1, y1 );
Draw( rp, x2, y2 );
}


void m1( void ) /* top 2 bottom (and back) */
{
if ( count <= sh )
	{
	MD( 0, count, sw, count );
	count += step;
	}
else if ( step == 1 || status == SECOND_STEP )
	status = IDLE;
else
	{
	status = SECOND_STEP;
	count = sh - 2;
	step = -2;
	}
}


void m2( void ) /* bottom 2 top (and back) */
{
if ( count <= sh )
	{
	MD( 0, sh - count, sw, sh - count );
	count += step;
	}
else if ( step == 1 || status == SECOND_STEP )
	status = IDLE;
else
	{
	status = SECOND_STEP;
	count = sh - 2;
	step = -2;
	}
}


void m3( void ) /* left 2 right (and back) */
{
if ( count <= sw )
	{
	MD( count, 0, count, sh );
	count += step;
	}
else if ( step == 1 || status == SECOND_STEP )
	status = IDLE;
else
	{
	status = SECOND_STEP;
	count = sw - 2;
	step = -2;
	}
}


void m4( void ) /* right to left (and back) */
{
if ( count <= sw )
	{
	MD( sw - count, 0, sw - count, sh );
	count += step;
	}
else if ( step == 1 || status == SECOND_STEP )
	status = IDLE;
else
	{
	status = SECOND_STEP;
	count = sw - 2;
	step = -2;
	}
}


void m5( void ) /* diag bl - br - tr (and back) */
{
if ( status == FIRST_STEP || status == FOURTH_STEP )
	{
	if ( count <= sw )
		{
		MD( 0, 0, count, sh );
		count += step;
		}
	else
		{
		count = ( status == FIRST_STEP ? 0 : sw - 1 );
		status = ( status == FIRST_STEP ? SECOND_STEP : IDLE );
		}
	}
else
	{
	if ( count <= sh )
		{
		MD( 0, 0, sw, sh - count );
		count += step;
		}
	else
		if ( step == 1 )
			status = IDLE;
		else if ( status == SECOND_STEP )
			{
			step = -2;
			status = THIRD_STEP;
			count = sh;
			}
		else
			{
			count = sw - 2;
			status = FOURTH_STEP;
			}
	}
}


void m6( void ) /* diag rb - lb - lt (and back) */
{
if ( status == FIRST_STEP || status == FOURTH_STEP )
	{
	if ( count <= sw )
		{
		MD( sw, 0, sw - count, sh );
		count += step;
		}
	else
		{
		count = ( status == FIRST_STEP ? 0 : sw - 1 );
		status = ( status == FIRST_STEP ? SECOND_STEP : IDLE );
		}
	}
else
	{
	if ( count <= sh )
		{
		MD( sw, 0, 0, sh - count );
		count += step;
		}
	else
		if ( step == 1 )
			status = IDLE;
		else if ( status == SECOND_STEP )
			{
			step = -2;
			status = THIRD_STEP;
			count = sh;
			}
		else
			{
			count = sw - 2;
			status = FOURTH_STEP;
			}
	}
}


void m7( void ) /* diag lt - rt - rb (and back) */
{
if ( status == FIRST_STEP || status == FOURTH_STEP )
	{
	if ( count <= sw )
		{
		MD( 0, sh, count, 0 );
		count += step;
		}
	else
		{
		count = ( status == FIRST_STEP ? 0 : sw - 1 );
		status = ( status == FIRST_STEP ? SECOND_STEP : IDLE );
		}
	}
else
	{
	if ( count <= sh )
		{
		MD( 0, sh, sw, count );
		count += step;
		}
	else
		if ( step == 1 )
			status = IDLE;
		else if ( status == SECOND_STEP )
			{
			step = -2;
			status = THIRD_STEP;
			count = sh;
			}
		else
			{
			count = sw - 2;
			status = FOURTH_STEP;
			}
	}
}


void m8( void ) /* diag rt - lt - lb (and back) */
{
if ( status == FIRST_STEP || status == FOURTH_STEP )
	{
	if ( count <= sw )
		{
		MD( sw, sh, sw - count, 0 );
		count += step;
		}
	else
		{
		count = ( status == FIRST_STEP ? 0 : sw - 1 );
		status = ( status == FIRST_STEP ? SECOND_STEP : IDLE );
		}
	}
else
	{
	if ( count <= sh )
		{
		MD( sw, sh, 0, count );
		count += step;
		}
	else
		if ( step == 1 )
			status = IDLE;
		else if ( status == SECOND_STEP )
			{
			step = -2;
			status = THIRD_STEP;
			count = sh;
			}
		else
			{
			count = sw - 2;
			status = FOURTH_STEP;
			}
	}
}


void m9( void ) /* a cross centered in the screen */
{
if ( status == FIRST_STEP || status == THIRD_STEP )
	{
	if ( count <= sw )
		{
		MD( count, 0, sw - count, sh );
		count += step;
		}
	else
		{
		count = status == FIRST_STEP ? 0 : 1;
		status = status == FIRST_STEP ? SECOND_STEP : FOURTH_STEP;
		}
	}
else
	{
	if ( count <= sh )
		{
		MD( sw, count, 0, sh - count );
		count += step;
		}
	else
		if ( step == 1 || status == FOURTH_STEP )
			status = IDLE;
		else
			{
			status = THIRD_STEP;
			count = 1;
			}
	}
}


void m10( void ) /* like m9 but starts from other corner */
{
if ( status == FIRST_STEP || status == THIRD_STEP )
	{
	if ( count <= sh )
		{
		MD( sw, count, 0, sh - count );
		count += step;
		}
	else
		{
		count = status == FIRST_STEP ? 0 : 1;
		status = status == FIRST_STEP ? SECOND_STEP : FOURTH_STEP;
		}
	}
else
	{
	if ( count <= sw )
		{
		MD( count, 0, sw - count, sh );
		count += step;
		}
	else
		if ( step == 1 || status == FOURTH_STEP )
			status = IDLE;
		else
			{
			status = THIRD_STEP;
			count = 1;
			}
	}
}


void m11( void ) /* circles thru the screen */
{
if ( status == FIRST_STEP || status == FIFTH_STEP )
	{
	if ( count <= sw )
		{
		MD( count, 0, hsw, hsh );
		count += step;
		}
	else
		{
		if ( status == FIRST_STEP )
			{ count = 0; status = SECOND_STEP; }
		else
			{ count = 1; status = SIXTH_STEP; }
		}
	}
else if ( status == SECOND_STEP || status == SIXTH_STEP )
	{
	if ( count <= sh )
		{
		MD( sw, count, hsw, hsh );
		count += step;
		}
	else
		{
		if ( status == SECOND_STEP )
			{ count = 0; status = THIRD_STEP; }
		else
			{ count = 1; status = SEVENTH_STEP; }
		}
	}
else if ( status == THIRD_STEP || status == SEVENTH_STEP )
	{
	if ( count <= sw )
		{
		MD( sw - count, sh, hsw, hsh );
		count += step;
		}
	else
		{
		if ( status == THIRD_STEP )
			{ count = 0; status = FOURTH_STEP; }
		else
			{ count = 1; status = EIGHTH_STEP; }
		}
	}
else
	{
	if ( count <= sh )
		{
		MD( 0, sh - count, hsw, hsh );
		count += step;
		}
	else
		if ( step == 1 || status == EIGHTH_STEP )
			status = IDLE;
		else
			{ count = 1; status = FIFTH_STEP; }
	}
}


void m12( void ) /* closing curtain */
{
if ( count <= sh >> (step-1) )
	{
	MD( 0, count, sw, count );
	MD( 0, sh - count, sw, sh - count );
	count += step;
	}
else status = IDLE;
}


void m13( void ) /* like 12 but 90 deg rev */
{
if ( count <= sw >> (step-1) )
	{
	MD( count, 0, count, sh );
	MD( sw - count, 0, sw - count, sh );
	count += step;
	}
else status = IDLE;
}


void m14( void ) /* shutting box */
{
if ( count <= hsh << (step-1) )
	{
	MD( 0, count, sw, count );
	MD( 0, sh - count, sw, sh - count );
	}
else status = IDLE;

if ( count <= hsw << (step-1) )
	{
	MD( count, 0, count, sh );
	MD( sw - count, 0, sw - count, sh );
	}
else status = IDLE;

count += step;
}


void m15( void )
{
if ( count <= sw )
	{
	MD( 0, 0, count, sh );
	MD( sw, sh, sw - count, 0 );
	}
if ( count <= sh )
	{
	MD( 0, sh, sw, sh - count );
	MD( sw, 0, 0, count );
	}
count += step;

if ( count > sw && count > sh )
	if ( step == 1 || status == SECOND_STEP )
		status = IDLE;
	else
		{ count = 1; status = SECOND_STEP; }
}


#define TOTFUNCS 15
APTR funcs[TOTFUNCS] = { m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15 };

void Blank( void )
{
ULONG secs, mics;

if ( scr = CloneFrontmostScreen( 100 ) )
	{
	sw = scr->Width - 1;
	sh = scr->Height - 1;
	hsw = sw >> 1;
	hsh = sh >> 1;
	rp = &scr->RastPort;
	SpritesOff();

	CurrentTime( &secs, &mics );

	which_drawing = secs % TOTFUNCS;
	step = secs % 2 + 1;
	SetAPen( rp, DarkestColorIndex( scr ) );

	while( status != IDLE )
		{
		if ( ( still_blanking = STILL_BLANKING ) == FALSE )
			break;

		((void (* )(void))funcs[which_drawing])();
		}

	if ( still_blanking )
		{
		WaitTOF();
		SetRGB4( &scr->ViewPort, 0, 0, 0, 0 );
		SetRast( rp, 0 );
		WaitServerCommand();
		}

	CloseScreen( scr );
	SpritesOn();
	}
else
	SendClientMsg( ACTION_FAILED );
}

extern ULONG RangeSeed;

void __main( char *line )
{
if ( IntuitionBase = (struct IntuitionBase *)OpenLibrary( "intuition.library", 37L ) )
	{
	if ( GfxBase = (struct GfxBase *)OpenLibrary( "graphics.library", 37L ) )
		{
		if ( dinfo = OpenCommunication() )
			{
			CurrentTime( &RangeSeed, &RangeSeed );
			Blank();
			CloseCommunication( dinfo );
			}
		CloseLibrary( (struct Library *)GfxBase );
		}
	CloseLibrary( (struct Library *)IntuitionBase );
	}
}
