home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Vectronix 2
/
VECTRONIX2.iso
/
FILES_01
/
MIDNIGHT.LZH
/
MIDNIGHT
/
SOURCE
/
WURM.C
< prev
Wrap
C/C++ Source or Header
|
1993-03-21
|
5KB
|
177 lines
#include <aes.h>
#include <vdi.h>
#include <tos.h>
#include <ext.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <portab.h>
#include "midnight.h" /* ACC_str + MOD_str + defines für Module + ACC */
extern MOD_str MOD_struct; /* Aus MOSTART.S importieren. */
#define Ms MOD_struct /* zur Schreiberleichterung... */
Value Values[6] =
{ T_POPUP,0,(long)"ziemlich müde\0normal\0nervös\0hektisch\0\0",
"Bewegungen",
T_SLIDER,0,200,"Länge des Würmchens",
T_SLIDER,1,10,"Dicke des Würmchens",
T_POPUP,0,(long)"langsam\0wurmartig\0frisch\0Flucht\0Turbo!\0\0",
"Kriechgeschwindigkeit",
T_SLIDER,(long)"nie\0alle16\0alle 8\0alle 4\0alle 2\0immer\0\0",6,
"Farbwechsel:",
T_TITEL|T_END,0,0,"V1.3, HzN 3.93 (krabbel...)"
};
Value *Value_s = Values; /* zeigt auf eine Liste von Pointern */
/*
GRUNDLEGENDES !
Da die Module ab und zu einmal aufgerufen werden und eben nicht
kontinuierlich die Kontrolle über die Register haben, kann es bei
Benutzung einer Variablen über mehrere Programmteile (M_INIT,M_SWITCH...)
zu Problemen kommen, da ja inzwischen wieder 'Sonstwer' in den Registern
'rumgespielt hat. Deshalb sind solche Variablen als 'static' zu deklarieren,
im Notfall (wenn's nicht klappt) auch als Volatile.
Sicher ist sicher...
*/
int pxy[10];
ACC_str *As;
volatile static int handle; /* darf nicht im Register stehn */
/* Um die Mathe-Lib zu sparen (ca. 5 KB Ersparnis): */
static int trigo[72] = /* Sinus in 5 Grad-Schritten * 256 */
{
0,22,44,66,87,108,128,146,164,181,196,209,
221,232,240,247,252,255,256,255,252,247,240,232,
221,209,196,181,164,146,128,108,87,66,44,22,
0,-22,-44,-66,-87,-108,-128,-146,-164,-181,-196,-209,
-221,-232,-240,-247,-252,-255,-256,-255,-252,-247,-240,-232,
-221,-209,-196,-181,-164,-146,-128,-108,-87,-66,-44,-22,
};
void wackel( int Hektik,int Tail,int Quick );
ULONG MOD_main( int Mode, ACC_str *ACCs )
{
int x1,x2;
As= ACCs; /* 'As' ist jetzt global zu benutzen. */
switch( Mode )
{ case M_INIT:
MOD_struct.U.b = 0x003f;
if( As->planes==1 ) Values[4]=Values[5];
/* Bei Monochrom verschwindet der 5. Eintrag. */
v_opnvwk( As->work_in,&handle,As->work_out );
if( !handle ) return( 0 );
pxy[0]=As->x; /* Clipbereich = Schonbereich. */
pxy[1]=As->y;
pxy[2]=As->x+As->w;
pxy[3]=As->y+As->h;
vs_clip( handle,1,pxy );
break;
case M_SWITCH:
pxy[1]= As->y; /* Als Umblende senkrechtes Gitter */
pxy[3]= pxy[1]+ As->h;
for( x1=0;(x1<8)&&!EVNT_ask( 50 );x1++ )
{ for( x2=As->x+ As->w+x1;x2>= As->x;x2-=8 )
{ pxy[0]= pxy[2]= x2;
v_pline( handle,2,pxy );
}
}
break;
case M_DO_IT:
if( As->planes>1 ) /* Nicht Monochrom ? Dann...*/
{ pxy[0]=pxy[1]=pxy[2]= 1000;
vs_color( handle,2,pxy ); /* Farbe 2 auf wei₧ setzen. */
}
vsf_perimeter( handle,0 );
x1= 4-Ms.Werte[3]; /* Parameter holen. */
wackel( Ms.Werte[0]*15+2,Ms.Werte[1],x1*x1*5 );
break;
case M_EXIT:
if( handle ) v_clsvwk( handle );
break;
}
return( 1 );
}
void set_segment( int *xx,int *yy,int *Wink,long *nr,
int div,int Hektik,int col )
{
int x;
/* Zufällige RichtungsWinkelÄnderung */
*Wink= (*Wink+360-Hektik+(*nr=rnd24(*nr))%(1+(Hektik<<1))) % 360;
x= *xx-trigo[((*Wink+90)%360)/5]/div; /* Neuen X-Wert errechnen */
if( (x<0)||(x>As->w*div) ) *Wink= (360-*Wink)%360;
/* Abprallen am Rand */
*xx-= trigo[*Wink/5]/div;
x= *yy-trigo[((*Wink+90)%360)/5]/div; /* Nun Y-Wert errechnen. */
if( (x<0)||(x>As->h*div) ) *Wink= (540-*Wink)%360;
*yy-= trigo[((*Wink+90)%360)/5]/div;
pxy[0]= *xx/div+As->x; /* Umrechnen in Bildschirmkoordinaten. */
pxy[1]= *yy/div+As->y;
if( Ms.Werte[2]<2 ) /* bei '1' wird der Polymarker genommen,*/
{ vsm_color( handle,col );
v_pmarker( handle,1,pxy );
}
else /* sonst ein Kreis mit entsprechendem Radius. */
{ vsf_color( handle,col );
v_circle( handle,pxy[0],pxy[1],Ms.Werte[2]-1 );
}
}
void wackel( int Hektik,int Tail,int Quick )
{
int x1,y1,x2,y2, h,i,c,mod,count=0,xm,ym, Wink1,Wink2;
int div;
long nr1,nr2;
nr1= nr2= Random()+1;
mod= 1;
if( (As->planes>1) && Ms.Werte[4] )
mod= ((1<<As->planes)-2)<<(5-Ms.Werte[4]);
if( mod>256 ) mod= 256;
div= 16;
if( Ms.Werte[2]>1 ) div= 8;
x1=y1=x2=y2= As->y*div+As->h*div/2;
Wink1=Wink2= 0;
i=0;
while( !EVNT_ask( Quick ) )
{ if( i<=Tail ) i++;
for(h=0;(h<5);h++)
{ if( i>=Tail ) set_segment( &x2,&y2,&Wink2,&nr2,div,Hektik,1 );
/* Schwanz löschen. */
++count %= mod;
c= As->planes>1?(count>>(5-Ms.Werte[4]))+2:0;
set_segment( &x1,&y1,&Wink1,&nr1,div,Hektik,c );
/* Kopf setzen. */
}
}
}