 /* Fichier plasma_cycle.dark.c				*/
/* Module appele par le programme principal	*/
/* pour effectuer un effet defini..appele par	*/
/* loadseg					*/

#include	<exec/types.h>
#include	<dos/dos.h>
#include	<intuition/intuition.h>
#include	<intuition/gadgetclass.h>
#include	<graphics/gfx.h>
#include	<graphics/gfxmacros.h>
#include	<graphics/rastport.h>
#include	<clib/exec_protos.h>
#include	<clib/intuition_protos.h>
#include	"bug.c"
#include	"struct.h"
#include	"tom_gadget.h"

extern	struct	RastPort	*rp;
extern	struct	Screen	*s;
extern	struct	appel_proc	*p_data_proc;

#define	WIDTH	320
#define	HEIGHT	256

char	*p_text_info="Effet 'Plasma_Cycle'\nPar T.Landspurg";

#define reg register
extern	void __asm MultiPlot(reg __a0 struct Screen *,reg __d0 WORD, reg __d1 WORD,reg __d2 WORD);

struct NewScreen    Screen = {
    0, 0, WIDTH,  HEIGHT, 4, 0,0, 0, CUSTOMSCREEN, NULL, NULL ,NULL, NULL};

UWORD  ScreenColors[] = {
    0x000,
    0xF00,
    0xF30,
    0xF50,
    0xF70,
    0xF90,
    0xFA0,
    0xFB0,
    0xFC0,
    0xFD0,
    0xFE0,
    0xFF0,
    0xBF0,
    0x8F0,
    0x7D0,
    0x5B0,
    0x000,
    0x490,
    0x360,
    0x340,
    0x444,
    0x555,
    0x666,
    0x777,
    0x888,
    0x999,
    0xAAA,
    0xBBB,
    0xCCC,
    0xDDD,
    0xEEE,
    0xFFF,
    0x000 };

#define	MAX_LEVEL	8

struct tom_gadget my_gadg[]={
	{"_Level",SLIDER,	125,14,139,9,1, 1,MAX_LEVEL,0,0},
	{0,		END_LISTE,  0,  0,   0, 0, 0,0,0,0,0}
};


UBYTE	t[1<<MAX_LEVEL][1<<MAX_LEVEL];

unsigned	int	seed;

void	my_text(rp,x,y,p_c)
struct	RastPort	*rp;
int	x,y;
char	*p_c;
{
	if(rp!=0){
		Move(rp,x,y);
		Text(rp,p_c,strlen(p_c));
	}
}

unsigned        int     my_rand()
{
        
        seed=25173*seed+138490;
        return(seed);
}

void	moyenne(int x1,int y1,int x2,int y2,int level)
{
	int	deltax,deltay,moyenne;
	deltax=(x2-x1)/2;
	deltay=(y2-y1)/2;
	moyenne=(t[x1][y1]+t[x2][y2])/2;
	alt=rand()%(level*10)+moyenne;
	t[x+deltax][y+deltay]=alt;
	MultiPlot(s,(WORD)(x+deltax),(WORD)(y+deltay),alt);
}

void	calcul(int x,int y,int pas)
{
	pas=pas/2;
	if(pas!=pas_min){
		if(x==0)moyenne(x,y,x+pas,y,level);
		if(y==0)moyenne(x,y,x,y+pas,level);
		moyenne(x,y,x+pas,y+pas,level);
		moyenne(x+pas,y,x+pas,y+pas,level);
		moyenne(x,y+pas,x+pas,y+pas,level);

		calcul(x,y,pas);
		calcul(x+pas,y,pas);
		calcul(x,y+pas,pas);
		calcul(x+pas,y+pas,pas);
	}

}

/********************************************************** dark ***/

void	__saveds	dark()
{
	int	d,i;

        if ( NOT( s = OpenScreen(&Screen)))
        return;

	rp = &(s->RastPort);
	d=1<<(s->BitMap.Depth);
	LoadRGB4(&s->ViewPort,ScreenColors,d);

	SetRast(rp,0);

	for(i=0;i<MAX_LEVEL;i++){
		for(j=0;j<MAX_LEVEL;j++){
			t[i][j]=0;
		}
	}
	pas_min=1;
	calcul(0,0,1<<MAX_LEVEL);

	wait_end();

	CloseScreen(s);
}

void	proc_init()
{
        seed=VBeamPos();
}
void	proc_save()
{
}

void	proc_end()
{
}

