home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / MIDNIGHT.LZH / MIDNIGHT / SOURCE / BALL.C next >
C/C++ Source or Header  |  1993-01-07  |  4KB  |  137 lines

  1.  
  2. #include <vdi.h>
  3. #include <tos.h>
  4. #include <stdio.h>
  5. #include <portab.h>
  6.  
  7. #include "midnight.h"    /* ACC_str + MOD_str + defines für Module + ACC */
  8.  
  9.         /* Funktionen aus MOSTART.S, die über Pointer aufgerufen werden    */
  10. extern int        EVNT_ask( long wait_ms );
  11. extern long        rnd24( long wert );
  12. extern int        Sound( SND_str *SND_struct );
  13. extern int        ScreenSave( int flag, char *Name );
  14.  
  15. extern MOD_str MOD_struct;
  16.  
  17. Value    *Value_s = NULL;        /* zeigt auf eine Liste von Pointern    */
  18.  
  19.  
  20. /*
  21.     GRUNDLEGENDES !
  22.     Da die Module ab und zu einmal aufgerufen werden und eben nicht 
  23.     kontinuierlich die Kontrolle über die Register haben, kann es bei
  24.     Benutzung einer Variablen über mehrere Programmteile (M_INIT,M_SWITCH...)
  25.     zu Problemen kommen, da ja inzwischen wieder 'Sonstwer' in den Registern
  26.     'rumgespielt hat. Deshalb sind solche Variablen als 'static' zu deklarieren,
  27.     im Notfall (wenn's nicht klappt) auch als Volatile.
  28.     Sicher ist sicher...
  29. */
  30.  
  31. void shift_col( void );
  32.  
  33.  
  34. int        pxy[10];
  35. int        Copy[8];
  36. MFDB    mfs,mfd;
  37. volatile static int handle;        /* darf nicht im Register stehn            */
  38.  
  39. ULONG MOD_main( int Mode, ACC_str *As )
  40. {
  41.     static int    add_x,add_y, x1,x2,y1,y2, dim,i;
  42.  
  43.     switch( Mode )
  44.     {    case M_INIT:
  45.             MOD_struct.U.b = 0x003f;
  46.             v_opnvwk( As->work_in,&handle,As->work_out );
  47.             if( !handle ) return( 0 );
  48.             mfs.fd_addr= mfd.fd_addr= NULL;    /* Bildschirm nehmen        */
  49.             vsf_interior( handle,2 );
  50.             vsf_style( handle,8 );
  51.             vsf_perimeter( handle,0 );
  52.             pxy[0]=As->x;
  53.             pxy[1]=As->y;
  54.             pxy[2]=As->x+As->w;
  55.             pxy[3]=As->y+As->h;
  56.             vs_clip( handle,1,pxy );
  57.             break;
  58.         case M_SWITCH:
  59.             vswr_mode( handle,MD_TRANS );
  60.             for( x1=1;(x1<9)&&!EVNT_ask( 50 );x1++ )
  61.             {    vsf_style( handle,x1 );
  62.                 v_bar( handle,pxy );
  63.             }
  64.             break;
  65.         case M_DO_IT:
  66.             vswr_mode( handle,MD_REPLACE );
  67.             v_bar( handle,pxy );
  68.             vsf_color( handle,2 );
  69.  
  70.             shift_col();
  71.  
  72.             dim= 133;
  73.             x2= (x1= As->x)+As->w - dim;
  74.             y2= (y1= As->y)+As->h - dim;
  75.             add_y= dim>>1;
  76.             if( As->planes <= 2 )
  77.                 for( add_x=7;add_x>=0;add_x-- )
  78.                 {    vsf_style( handle,add_x );
  79.                     if( !add_x ) vsf_interior( handle,0 );
  80.                     v_circle( handle,add_y-add_y*(7-add_x)/32,
  81.                                     add_y-add_y*(7-add_x)/32,
  82.                                     (add_y-5)*(add_x+1)/8 );
  83.                 }
  84.             else
  85.             {    vsf_style( handle,8 );
  86.                 for( add_x=15;add_x>1;add_x-- )
  87.                 {    vsf_color( handle,add_x );
  88.                     v_circle( handle,add_y-add_y/64*(15-add_x),
  89.                                     add_y-add_y/64*(15-add_x),
  90.                                     (add_y-5)/15*add_x );
  91.                 }
  92.             }
  93.  
  94.             Copy[4]= x1;
  95.             Copy[5]= y1;
  96.             add_x=3;
  97.             add_y=4;
  98.             while( !EVNT_ask( 20 ) )
  99.             {    Copy[2]= (Copy[0]=Copy[4]) + dim;
  100.                 Copy[3]= (Copy[1]=Copy[5]) + dim;
  101.                 if( (Copy[4]+add_x >= x2)||(Copy[4]+add_x < x1) )
  102.                 {    add_x= (add_x<0?1:-1)*((Random()%3)+2);
  103.                     if( As->planes >= 2 ) shift_col();
  104.                 }
  105.                 Copy[6]= (Copy[4]+= add_x) + dim;
  106.                 if( (Copy[5]+add_y >= y2)||(Copy[5]+add_y < y1) )
  107.                 {    add_y= (add_y<0?1:-1)*((Random()%3)+2);
  108.                     if( As->planes >= 2 ) shift_col();
  109.                 }
  110.                 Copy[7]= (Copy[5]+= add_y) + dim;
  111.                 vro_cpyfm( handle,S_ONLY,Copy,&mfs,&mfd );
  112.             }
  113.  
  114.             break;
  115.         case M_EXIT:
  116.             if( handle ) v_clsvwk( handle );
  117.             break;
  118.     }
  119.  
  120.     return( 1 );
  121. }
  122.  
  123.  
  124. void shift_col( void )
  125. {
  126.     int i,j,cb=0, col[3] = {0,0,0};
  127.  
  128.     while( !cb ) cb = Random() & 0x7;
  129.     if( cb & 0x4 ) col[0] = 1000;
  130.     if( cb & 0x2 ) col[1] = 1000;
  131.     if( cb & 0x1 ) col[2] = 1000;
  132.     for( i=0;i<14;i++)
  133.     {    for( j=0;j<3;j++ ) if(col[j]) col[j]-=50;
  134.         vs_color( handle,i+2,col );
  135.     }
  136. }
  137.