// source: SPHINX C--
// Jesli ktos chce miec ten jezyk (szybki i krotki kod, szybko
// przyswajalny) - niech pisze: solo@alpha.bet.pl
// zrodlo w sumie troche chamskie, ale coz, ja na pc = amateur :-).
// nie ma tez jakiejs zajebistej optymalizacji.
// A najdziwniejsze jest to, ze na celeronie300 chodzi TAK SAMO
// jak na p133 (w miare plynnie)
// solo/ng^atd
 
?include "d:\\sphinx\\file.h--"
?include "d:\\sphinx\\video.h--"
?include "d:\\sphinx\\vga.h--"
?include "d:\\sphinx\\write.h--"
?include "d:\\sphinx\\keycodes.h--"
?include "d:\\sphinx\\dos.h--"

byte sin [450];
byte paleta[768];
byte POZX[1560];
byte POZY[1560];

word filehandle;
byte kl;  // numer klatki w prekalkowanym obiekcie
byte z;
byte przes;
word tab1; 
int x,y;
int suma;

?define _przes 5
?define _addy 2
?define _ile 60

main ()
{
set();
do {
obiekt();
dom3d();
spal();
} while (@KBHIT() == 0);
}

void obiekt()   // jakies pixle :)
word N,A;
{
N=_ile;
y=10;
A=tab1;
do {
DI=A;
x=sin[DI]+1;
putpixel19(x+1,y+1,255);
putpixel19(x,y+1,200);
putpixel19(x+2,y+1,200);
putpixel19(x+1,y+2,200);
putpixel19(x+1,y,200);
A=A+przes;
y=y+_addy; N--;
} while (N>0);
tab1++;
if (tab1>360) {tab1=tab1-360;}
}

void spal()
word p1,p2,p3,p4,a;
{
x=0;y=0;suma=0;
ES=0xA000;
do {
a=320*y+x;
BX=a+1;p1=ESBYTE[BX]; //1
BX=a+320;p2=ESBYTE[BX]; //320
BX=a+322;p3=ESBYTE[BX];  //642
suma=p1+p2+p3;
suma=suma/3;
BX=a+321;
ESBYTE[BX]=suma;
x++;
if (x>257) {x=0;y++;}
} while (y<185);
}

void dom3d()
word a;
{
a=kl*13;
DI=a;

line19(POZX[DI],POZY[DI],POZX[DI+1],POZY[DI+1],255);
DI=a;
line19(POZX[DI+1],POZY[DI+1],POZX[DI+2],POZY[DI+2],255);
DI=a;
line19(POZX[DI+2],POZY[DI+2],POZX[DI+3],POZY[DI+3],255);
DI=a;
line19(POZX[DI+3],POZY[DI+3],POZX[DI],POZY[DI],255);
DI=a;
line19(POZX[DI+4],POZY[DI+4],POZX[DI+5],POZY[DI+5],255);
DI=a;
line19(POZX[DI+5],POZY[DI+5],POZX[DI+6],POZY[DI+6],255);
DI=a;
line19(POZX[DI+6],POZY[DI+6],POZX[DI+7],POZY[DI+7],255);
DI=a;
line19(POZX[DI+7],POZY[DI+7],POZX[DI+4],POZY[DI+4],255);
DI=a;
line19(POZX[DI+4],POZY[DI+4],POZX[DI],POZY[DI],255);
DI=a;

line19(POZX[DI+5],POZY[DI+5],POZX[DI+1],POZY[DI+1],255);
DI=a;
line19(POZX[DI+2],POZY[DI+2],POZX[DI+6],POZY[DI+6],255);
DI=a;
line19(POZX[DI+3],POZY[DI+3],POZX[DI+7],POZY[DI+7],255);
DI=a;
line19(POZX[DI+7],POZY[DI+7],POZX[DI+8],POZY[DI+8],255);
DI=a;
line19(POZX[DI+8],POZY[DI+8],POZX[DI+6],POZY[DI+6],255);
DI=a;
line19(POZX[DI+5],POZY[DI+5],POZX[DI+8],POZY[DI+8],255);
DI=a;
line19(POZX[DI+8],POZY[DI+8],POZX[DI+6],POZY[DI+6],255);
DI=a;
line19(POZX[DI+11],POZY[DI+11],POZX[DI+9],POZY[DI+9],255);
DI=a;
line19(POZX[DI+9],POZY[DI+9],POZX[DI+10],POZY[DI+10],255);
DI=a;
line19(POZX[DI+10],POZY[DI+10],POZX[DI+12],POZY[DI+12],255);
DI=a;

kl++; 
if (kl>119) {kl=0;}
}

// PODPROCKI

void set()
{
kl=0;
przes=_przes;
tab1=0;
SETVIDEOMODE(3);
load_sin();
load_pal();
load_pozx();
load_pozy();
SETVIDEOMODE(19);
SETVGAPALETTE(,0,256,#paleta);
}

void load_sin ()
{
filehandle = open("d:\\_solo\\SIN.DAT",F_READ);  
IF(filehandle == 0)               
{WRITESTR("Loading sux -  SIN.TAB!\n"); }
ELSE{WRITESTR("SIN loaded. \n");}
read(filehandle,#sin,450);
}

void load_pal ()
{
filehandle = open("d:\\_solo\\MONO.PAL",F_READ);  
IF(filehandle == 0)               
{WRITESTR("Loading sux -  MONO.PAL!\n"); }
ELSE{WRITESTR("MONO.PAL loaded. \n");}
read(filehandle,#paleta,768);
}

void load_pozx ()
{
filehandle = open("d:\\_solo\\DOM_X.DAT",F_READ);  
IF(filehandle == 0)               
{WRITESTR("Loading sux -  DOM_X.DAT!\n"); }
ELSE{WRITESTR("POZX.DAT loaded. \n");}
read(filehandle,#POZX,1560);
}
void load_pozy ()
{
filehandle = open("d:\\_solo\\DOM_Y.DAT",F_READ);  
IF(filehandle == 0)               
{WRITESTR("Loading sux -  DOM_Y.DAT!\n"); }
ELSE{WRITESTR("POZY.DAT loaded. \n");}
read(filehandle,#POZY,1560);
}
