/*********************************/
/* MatrixGenerator für ShadowRun */
/* written by Thomas Reinhardt   */
/*                               */
/* Draw-Funktionen der Grafik    */
/* Special-Amiga-Routinen        */
/*********************************/
#include <time.h>
#include <math.h>
#include <string.h>
#include <exec/interrupts.h>
#include <exec/libraries.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <exec/nodes.h>
#include <exec/ports.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/diskfont.h>
#include <stdio.h>
#include <stdlib.h>

#include "MatrixGen.h"
#include "all.h"

extern LONG SaveNamePointer;
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct Library *DosBase;
extern struct NewScreen MyNewScreen;
extern struct Screen *MyScreen;
extern struct BitMapHeader BMHD;
extern struct ColorRegister Colors[16];
extern struct CommodoreAmiga CAMG;
extern LONG Len,xi,yi,b;
extern ULONG ChunkLen;
extern char *WohinDamit;
extern char GfxName[255];
extern char StatusName[255];
extern char StandardName[255];
extern char DatenFeld[255];
extern BOOL success,AllDone;
extern int i;
extern char inread[5];
extern int cBitmaps,AnzahlKnoten,AusgangsKnoten,AnzahlWichtigeDaten,Stufenwert;
extern int MaxSAN;
extern UBYTE xPos,yPos,MaxFarben,Language,OutputType;
extern struct MatrixKomponenten Matrix[12*12];
extern struct MatrixGenType MatrixDatas[1];
extern BOOL CPUInSystem,Beenden,RandomDSValue;
extern BOOL Zufallsstufen,KeineDatenspeicher,StatusFile,PrefsFile,BlaueKnoten;
extern BOOL Schatten,SaveDatenfeld,InstallNoIC,AlwaysICInfo;
extern UBYTE AnzahlCPU,AnzahlSPU,AnzahlDS,AnzahlSAN,AnzahlSN,AnzahlIOP,AnzahlBlueNodes;

void DrawCPU(ULONG xx,ULONG yy,UBYTE farbe){
	SetAPen(&MyScreen->RastPort,farbe);
	Move(&MyScreen->RastPort,xx,yy);
	Draw(&MyScreen->RastPort,xx+5,yy-10);
	Draw(&MyScreen->RastPort,xx+25,yy-10);
	Draw(&MyScreen->RastPort,xx+30,yy);
	Draw(&MyScreen->RastPort,xx+25,yy+10);
	Draw(&MyScreen->RastPort,xx+5,yy+10);
	Draw(&MyScreen->RastPort,xx,yy);
	Move(&MyScreen->RastPort,xx+2,yy);
	Draw(&MyScreen->RastPort,xx+6,yy-8);
	Draw(&MyScreen->RastPort,xx+24,yy-8);
	Draw(&MyScreen->RastPort,xx+28,yy);
	Draw(&MyScreen->RastPort,xx+24,yy+8);
	Draw(&MyScreen->RastPort,xx+6,yy+8);
	Draw(&MyScreen->RastPort,xx+2,yy);
	if(Schatten==TRUE){
		SetAPen(&MyScreen->RastPort,15);
		Move(&MyScreen->RastPort,xx+11,yy+13);
		Draw(&MyScreen->RastPort,xx+29,yy+13);
		Move(&MyScreen->RastPort,xx+10,yy+12);
		Draw(&MyScreen->RastPort,xx+30,yy+12);
		Move(&MyScreen->RastPort,xx+9,yy+11);
		Draw(&MyScreen->RastPort,xx+30,yy+11);
		Move(&MyScreen->RastPort,xx+26,yy+10);
		Draw(&MyScreen->RastPort,xx+31,yy+10);
		Move(&MyScreen->RastPort,xx+26,yy+9);
		Draw(&MyScreen->RastPort,xx+31,yy+9);
		Move(&MyScreen->RastPort,xx+27,yy+8);
		Draw(&MyScreen->RastPort,xx+32,yy+8);
		Move(&MyScreen->RastPort,xx+27,yy+7);
		Draw(&MyScreen->RastPort,xx+32,yy+7);
		Move(&MyScreen->RastPort,xx+28,yy+6);
		Draw(&MyScreen->RastPort,xx+33,yy+6);
		Move(&MyScreen->RastPort,xx+28,yy+5);
		Draw(&MyScreen->RastPort,xx+33,yy+5);
		Move(&MyScreen->RastPort,xx+29,yy+4);
		Draw(&MyScreen->RastPort,xx+34,yy+4);
		Move(&MyScreen->RastPort,xx+29,yy+3);
		Draw(&MyScreen->RastPort,xx+34,yy+3);
		Move(&MyScreen->RastPort,xx+30,yy+2);
		Draw(&MyScreen->RastPort,xx+33,yy+2);
		Move(&MyScreen->RastPort,xx+30,yy+1);
		Draw(&MyScreen->RastPort,xx+33,yy+1);
		Move(&MyScreen->RastPort,xx+31,yy);
		Draw(&MyScreen->RastPort,xx+32,yy);
		Move(&MyScreen->RastPort,xx+31,yy-1);
		Draw(&MyScreen->RastPort,xx+32,yy-1);
		Move(&MyScreen->RastPort,xx+30,yy-2);
		Draw(&MyScreen->RastPort,xx+31,yy-2);
		Move(&MyScreen->RastPort,xx+30,yy-3);
		Draw(&MyScreen->RastPort,xx+31,yy-3);
		Move(&MyScreen->RastPort,xx+29,yy-4);
		Draw(&MyScreen->RastPort,xx+30,yy-4);
		Move(&MyScreen->RastPort,xx+29,yy-5);
		Draw(&MyScreen->RastPort,xx+30,yy-5);
		Move(&MyScreen->RastPort,xx+28,yy-6);
		Draw(&MyScreen->RastPort,xx+29,yy-6);
		Move(&MyScreen->RastPort,xx+28,yy-7);
		Draw(&MyScreen->RastPort,xx+29,yy-7);
		}
	}

void DrawSPU(ULONG xx,ULONG yy,UBYTE farbe){
	SetAPen(&MyScreen->RastPort,farbe);
	Move(&MyScreen->RastPort,xx,yy);
	Draw(&MyScreen->RastPort,xx+5,yy-10);
	Draw(&MyScreen->RastPort,xx+25,yy-10);
	Draw(&MyScreen->RastPort,xx+30,yy);
	Draw(&MyScreen->RastPort,xx+25,yy+10);
	Draw(&MyScreen->RastPort,xx+5,yy+10);
	Draw(&MyScreen->RastPort,xx,yy);
	if(Schatten==TRUE){
		SetAPen(&MyScreen->RastPort,15);
		Move(&MyScreen->RastPort,xx+11,yy+13);
		Draw(&MyScreen->RastPort,xx+29,yy+13);
		Move(&MyScreen->RastPort,xx+10,yy+12);
		Draw(&MyScreen->RastPort,xx+30,yy+12);
		Move(&MyScreen->RastPort,xx+9,yy+11);
		Draw(&MyScreen->RastPort,xx+30,yy+11);
		Move(&MyScreen->RastPort,xx+26,yy+10);
		Draw(&MyScreen->RastPort,xx+31,yy+10);
		Move(&MyScreen->RastPort,xx+26,yy+9);
		Draw(&MyScreen->RastPort,xx+31,yy+9);
		Move(&MyScreen->RastPort,xx+27,yy+8);
		Draw(&MyScreen->RastPort,xx+32,yy+8);
		Move(&MyScreen->RastPort,xx+27,yy+7);
		Draw(&MyScreen->RastPort,xx+32,yy+7);
		Move(&MyScreen->RastPort,xx+28,yy+6);
		Draw(&MyScreen->RastPort,xx+33,yy+6);
		Move(&MyScreen->RastPort,xx+28,yy+5);
		Draw(&MyScreen->RastPort,xx+33,yy+5);
		Move(&MyScreen->RastPort,xx+29,yy+4);
		Draw(&MyScreen->RastPort,xx+34,yy+4);
		Move(&MyScreen->RastPort,xx+29,yy+3);
		Draw(&MyScreen->RastPort,xx+34,yy+3);
		Move(&MyScreen->RastPort,xx+30,yy+2);
		Draw(&MyScreen->RastPort,xx+33,yy+2);
		Move(&MyScreen->RastPort,xx+30,yy+1);
		Draw(&MyScreen->RastPort,xx+33,yy+1);
		Move(&MyScreen->RastPort,xx+31,yy);
		Draw(&MyScreen->RastPort,xx+32,yy);
		Move(&MyScreen->RastPort,xx+31,yy-1);
		Draw(&MyScreen->RastPort,xx+32,yy-1);
		Move(&MyScreen->RastPort,xx+30,yy-2);
		Draw(&MyScreen->RastPort,xx+31,yy-2);
		Move(&MyScreen->RastPort,xx+30,yy-3);
		Draw(&MyScreen->RastPort,xx+31,yy-3);
		Move(&MyScreen->RastPort,xx+29,yy-4);
		Draw(&MyScreen->RastPort,xx+30,yy-4);
		Move(&MyScreen->RastPort,xx+29,yy-5);
		Draw(&MyScreen->RastPort,xx+30,yy-5);
		Move(&MyScreen->RastPort,xx+28,yy-6);
		Draw(&MyScreen->RastPort,xx+29,yy-6);
		Move(&MyScreen->RastPort,xx+28,yy-7);
		Draw(&MyScreen->RastPort,xx+29,yy-7);
		}
	}

void DrawSN(ULONG xx,ULONG yy,UBYTE farbe){
	SetAPen(&MyScreen->RastPort,farbe);
	Move(&MyScreen->RastPort,xx,yy);
	DrawEllipse(&MyScreen->RastPort,xx+15,yy,10,10);
	if(Schatten==TRUE){
		SetAPen(&MyScreen->RastPort,15);
		Move(&MyScreen->RastPort,xx+19,yy+13);
		Draw(&MyScreen->RastPort,xx+25,yy+13);
		Move(&MyScreen->RastPort,xx+17,yy+12);
		Draw(&MyScreen->RastPort,xx+27,yy+12);
		Move(&MyScreen->RastPort,xx+16,yy+11);
		Draw(&MyScreen->RastPort,xx+28,yy+11);
		Move(&MyScreen->RastPort,xx+19,yy+10);
		Draw(&MyScreen->RastPort,xx+29,yy+10);
		Move(&MyScreen->RastPort,xx+21,yy+9);
		Draw(&MyScreen->RastPort,xx+30,yy+9);
		Move(&MyScreen->RastPort,xx+22,yy+8);
		Draw(&MyScreen->RastPort,xx+31,yy+8);
		Move(&MyScreen->RastPort,xx+23,yy+7);
		Draw(&MyScreen->RastPort,xx+31,yy+7);
		Move(&MyScreen->RastPort,xx+24,yy+6);
		Draw(&MyScreen->RastPort,xx+32,yy+6);
		Move(&MyScreen->RastPort,xx+25,yy+5);
		Draw(&MyScreen->RastPort,xx+32,yy+5);
		Move(&MyScreen->RastPort,xx+25,yy+4);
		Draw(&MyScreen->RastPort,xx+32,yy+4);
		Move(&MyScreen->RastPort,xx+26,yy+3);
		Draw(&MyScreen->RastPort,xx+32,yy+3);
		Move(&MyScreen->RastPort,xx+26,yy+2);
		Draw(&MyScreen->RastPort,xx+32,yy+2);
		Move(&MyScreen->RastPort,xx+26,yy+1);
		Draw(&MyScreen->RastPort,xx+32,yy+1);
		Move(&MyScreen->RastPort,xx+26,yy);
		Draw(&MyScreen->RastPort,xx+32,yy);
		Move(&MyScreen->RastPort,xx+26,yy-1);
		Draw(&MyScreen->RastPort,xx+31,yy-1);
		Move(&MyScreen->RastPort,xx+26,yy-2);
		Draw(&MyScreen->RastPort,xx+31,yy-2);
		Move(&MyScreen->RastPort,xx+26,yy-3);
		Draw(&MyScreen->RastPort,xx+30,yy-3);
		Move(&MyScreen->RastPort,xx+25,yy-4);
		Draw(&MyScreen->RastPort,xx+29,yy-4);
		Move(&MyScreen->RastPort,xx+25,yy-5);
		Draw(&MyScreen->RastPort,xx+28,yy-5);
		Move(&MyScreen->RastPort,xx+24,yy-6);
		Draw(&MyScreen->RastPort,xx+26,yy-6);
		}
	}

void DrawSAN(ULONG xx,ULONG yy,UBYTE farbe){
	SetAPen(&MyScreen->RastPort,farbe);
	Move(&MyScreen->RastPort,xx,yy-5);
	Draw(&MyScreen->RastPort,xx+30,yy-5);
	Draw(&MyScreen->RastPort,xx+30,yy+5);
	Draw(&MyScreen->RastPort,xx,yy+5);
	Draw(&MyScreen->RastPort,xx,yy-5);
	if(Schatten==TRUE){
		SetAPen(&MyScreen->RastPort,15);
		Move(&MyScreen->RastPort,xx+4,yy+8);
		Draw(&MyScreen->RastPort,xx+33,yy+8);
		Move(&MyScreen->RastPort,xx+4,yy+7);
		Draw(&MyScreen->RastPort,xx+33,yy+7);
		Move(&MyScreen->RastPort,xx+4,yy+6);
		Draw(&MyScreen->RastPort,xx+33,yy+6);
		Move(&MyScreen->RastPort,xx+31,yy+5);
		Draw(&MyScreen->RastPort,xx+33,yy+5);
		Move(&MyScreen->RastPort,xx+31,yy+4);
		Draw(&MyScreen->RastPort,xx+33,yy+4);
		Move(&MyScreen->RastPort,xx+31,yy+3);
		Draw(&MyScreen->RastPort,xx+33,yy+3);
		Move(&MyScreen->RastPort,xx+31,yy+2);
		Draw(&MyScreen->RastPort,xx+33,yy+2);
		Move(&MyScreen->RastPort,xx+31,yy+1);
		Draw(&MyScreen->RastPort,xx+33,yy+1);
		Move(&MyScreen->RastPort,xx+31,yy);
		Draw(&MyScreen->RastPort,xx+33,yy);
		Move(&MyScreen->RastPort,xx+31,yy-1);
		Draw(&MyScreen->RastPort,xx+33,yy-1);
		Move(&MyScreen->RastPort,xx+31,yy-2);
		Draw(&MyScreen->RastPort,xx+33,yy-2);
		}
	}

void DrawIOP(ULONG xx,ULONG yy,UBYTE farbe){
	SetAPen(&MyScreen->RastPort,farbe);
	Move(&MyScreen->RastPort,xx,yy+10);
	Draw(&MyScreen->RastPort,xx+15,yy-10);
	Draw(&MyScreen->RastPort,xx+30,yy+10);
	Draw(&MyScreen->RastPort,xx,yy+10);
	if(Schatten==TRUE){
		SetAPen(&MyScreen->RastPort,15);
		Move(&MyScreen->RastPort,xx+4,yy+13);
		Draw(&MyScreen->RastPort,xx+34,yy+13);
		Move(&MyScreen->RastPort,xx+5,yy+12);
		Draw(&MyScreen->RastPort,xx+33,yy+12);
		Move(&MyScreen->RastPort,xx+6,yy+11);
		Draw(&MyScreen->RastPort,xx+33,yy+11);
		Move(&MyScreen->RastPort,xx+31,yy+10);
		Draw(&MyScreen->RastPort,xx+32,yy+10);
		Move(&MyScreen->RastPort,xx+30,yy+9);
		Draw(&MyScreen->RastPort,xx+31,yy+9);
		Move(&MyScreen->RastPort,xx+30,yy+8);
		Draw(&MyScreen->RastPort,xx+31,yy+8);
		Move(&MyScreen->RastPort,xx+29,yy+7);
		Draw(&MyScreen->RastPort,xx+30,yy+7);
		Move(&MyScreen->RastPort,xx+28,yy+6);
		Draw(&MyScreen->RastPort,xx+29,yy+6);
		Move(&MyScreen->RastPort,xx+27,yy+5);
		Draw(&MyScreen->RastPort,xx+28,yy+5);
		Move(&MyScreen->RastPort,xx+27,yy+4);
		Draw(&MyScreen->RastPort,xx+28,yy+4);
		Move(&MyScreen->RastPort,xx+26,yy+3);
		Draw(&MyScreen->RastPort,xx+27,yy+3);
		Move(&MyScreen->RastPort,xx+25,yy+2);
		Draw(&MyScreen->RastPort,xx+26,yy+2);
		Move(&MyScreen->RastPort,xx+24,yy+1);
		Draw(&MyScreen->RastPort,xx+25,yy+1);
		Move(&MyScreen->RastPort,xx+24,yy);
		Draw(&MyScreen->RastPort,xx+25,yy);
		Move(&MyScreen->RastPort,xx+23,yy-1);
		Draw(&MyScreen->RastPort,xx+24,yy-1);
		Move(&MyScreen->RastPort,xx+22,yy-2);
		Draw(&MyScreen->RastPort,xx+23,yy-2);
		Move(&MyScreen->RastPort,xx+21,yy-3);
		Draw(&MyScreen->RastPort,xx+22,yy-3);
		Move(&MyScreen->RastPort,xx+21,yy-4);
		Draw(&MyScreen->RastPort,xx+22,yy-4);
		Move(&MyScreen->RastPort,xx+20,yy-5);
		Draw(&MyScreen->RastPort,xx+21,yy-5);
		Move(&MyScreen->RastPort,xx+20,yy-6);
		Draw(&MyScreen->RastPort,xx+20,yy-6);
		}
	}

void DrawDS(ULONG xx,ULONG yy,UBYTE farbe){
	SetAPen(&MyScreen->RastPort,farbe);
	Move(&MyScreen->RastPort,xx+5,yy-10);
	Draw(&MyScreen->RastPort,xx+25,yy-10);
	Draw(&MyScreen->RastPort,xx+25,yy+10);
	Draw(&MyScreen->RastPort,xx+5,yy+10);
	Draw(&MyScreen->RastPort,xx+5,yy-10);
	if(Schatten==TRUE){
		SetAPen(&MyScreen->RastPort,15);
		Move(&MyScreen->RastPort,xx+8,yy+13);
		Draw(&MyScreen->RastPort,xx+28,yy+13);
		Move(&MyScreen->RastPort,xx+8,yy+12);
		Draw(&MyScreen->RastPort,xx+28,yy+12);
		Move(&MyScreen->RastPort,xx+8,yy+11);
		Draw(&MyScreen->RastPort,xx+28,yy+11);
		Move(&MyScreen->RastPort,xx+26,yy+10);
		Draw(&MyScreen->RastPort,xx+28,yy+10);
		Move(&MyScreen->RastPort,xx+26,yy+9);
		Draw(&MyScreen->RastPort,xx+28,yy+9);
		Move(&MyScreen->RastPort,xx+26,yy+8);
		Draw(&MyScreen->RastPort,xx+28,yy+8);
		Move(&MyScreen->RastPort,xx+26,yy+7);
		Draw(&MyScreen->RastPort,xx+28,yy+7);
		Move(&MyScreen->RastPort,xx+26,yy+6);
		Draw(&MyScreen->RastPort,xx+28,yy+6);
		Move(&MyScreen->RastPort,xx+26,yy+5);
		Draw(&MyScreen->RastPort,xx+28,yy+5);
		Move(&MyScreen->RastPort,xx+26,yy+4);
		Draw(&MyScreen->RastPort,xx+28,yy+4);
		Move(&MyScreen->RastPort,xx+26,yy+3);
		Draw(&MyScreen->RastPort,xx+28,yy+3);
		Move(&MyScreen->RastPort,xx+26,yy+2);
		Draw(&MyScreen->RastPort,xx+28,yy+2);
		Move(&MyScreen->RastPort,xx+26,yy+1);
		Draw(&MyScreen->RastPort,xx+28,yy+1);
		Move(&MyScreen->RastPort,xx+26,yy);
		Draw(&MyScreen->RastPort,xx+28,yy);
		Move(&MyScreen->RastPort,xx+26,yy-1);
		Draw(&MyScreen->RastPort,xx+28,yy-1);
		Move(&MyScreen->RastPort,xx+26,yy-2);
		Draw(&MyScreen->RastPort,xx+28,yy-2);
		Move(&MyScreen->RastPort,xx+26,yy-3);
		Draw(&MyScreen->RastPort,xx+28,yy-3);
		Move(&MyScreen->RastPort,xx+26,yy-4);
		Draw(&MyScreen->RastPort,xx+28,yy-4);
		Move(&MyScreen->RastPort,xx+26,yy-5);
		Draw(&MyScreen->RastPort,xx+28,yy-5);
		Move(&MyScreen->RastPort,xx+26,yy-6);
		Draw(&MyScreen->RastPort,xx+28,yy-6);
		Move(&MyScreen->RastPort,xx+26,yy-7);
		Draw(&MyScreen->RastPort,xx+28,yy-7);
		}
	}

void DrawLinie(ULONG xStart,ULONG yStart,ULONG xEnd,ULONG yEnd){
	SetAPen(&MyScreen->RastPort,1);
	Move(&MyScreen->RastPort,xStart+15,yStart);
	Draw(&MyScreen->RastPort,xEnd+15,yEnd);
	}

void DrawIC(ULONG xx,ULONG yy){
	SetAPen(&MyScreen->RastPort,1);
	Move(&MyScreen->RastPort,xx-1,yy-2);
	Draw(&MyScreen->RastPort,xx-1,yy-3);
	Move(&MyScreen->RastPort,xx+1,yy-2);
	Draw(&MyScreen->RastPort,xx+1,yy-3);
	Move(&MyScreen->RastPort,xx,yy-4);
	Draw(&MyScreen->RastPort,xx,yy-6);
	Move(&MyScreen->RastPort,xx-2,yy-4);
	Draw(&MyScreen->RastPort,xx-1,yy-5);
	Move(&MyScreen->RastPort,xx+2,yy-4);
	Draw(&MyScreen->RastPort,xx+1,yy-5);
	}
