home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff249.lzh / Automata / Demon.c < prev    next >
C/C++ Source or Header  |  1989-09-14  |  7KB  |  346 lines

  1. /*
  2.       Demon.c        Gary Teachout     August  1989
  3.  
  4.       lc -L Demon    To compile and link with Lattice 5.0
  5. */
  6.  
  7.  #include <exec/types.h>
  8.  #include <exec/memory.h>
  9.  #include <intuition/intuition.h>
  10.  
  11.  #define DPEN        15
  12.  #define BPEN        14
  13.  #define SIZEX       160
  14.  #define SIZEY       94
  15.  #define CMAX        16
  16.  #define PLANES      4
  17.  #define COLORS      12
  18.  
  19.  struct IntuitionBase      *IntuitionBase  ;
  20.  struct GfxBase            *GfxBase  ;
  21.  
  22.  struct IntuiMessage       *mes  ;
  23.  struct Screen             *screen  ;
  24.  struct Window             *window  ;
  25.  
  26.  struct  NewScreen   ns =
  27.  {
  28.    0 , 0 , 320 , 200 , PLANES , DPEN , BPEN , 0 ,
  29.    CUSTOMSCREEN , NULL , "  DEMON" , NULL , NULL
  30.  }  ;
  31.  
  32.  struct  NewWindow   nw =
  33.  {
  34.    0 , 0 , 320 , 200 , DPEN , BPEN ,
  35.    MENUPICK | MOUSEBUTTONS | RAWKEY ,
  36.    SMART_REFRESH | ACTIVATE | BACKDROP | BORDERLESS ,
  37.    NULL , NULL , NULL , 
  38.    NULL , NULL , 0 , 0 , 0 , 0 , CUSTOMSCREEN
  39.  }  ;
  40.  
  41.  struct TextAttr  stext = { "topaz.font" , 8 , 0 , 0 }  ;
  42.  
  43.  UBYTE   *cells1 , *cells2 , *old , *new  ;
  44.  
  45.  UBYTE   ctab[ 16 ][ 3 ] =
  46.  {
  47.    { 9 , 1 , 0 } ,
  48.    { 12 , 5 , 0 } ,
  49.    { 15 , 0 , 0 } ,
  50.    { 10 , 0 , 8 } ,
  51.  
  52.    { 8 , 0 , 15 } ,
  53.    { 0 , 0 , 15 } ,
  54.    { 0 , 8 , 5 } ,
  55.    { 0 , 15 , 0 } ,
  56.  
  57.    { 8 , 8 , 8 } ,
  58.    { 15 , 15 , 0 } ,
  59.    { 15 , 5 , 0 } ,
  60.    { 6 , 2 , 0 } ,
  61.  
  62.    { 0 , 0 , 0 } ,
  63.    { 0 , 0 , 0 } ,
  64.    { 0 , 0 , 0 } ,
  65.    { 14 , 14 , 14 }
  66.  }  ;
  67.  
  68.  
  69.  char                   *AllocMem()  ;
  70.  struct Screen          *OpenScreen()  ;
  71.  struct Window          *OpenWindow()  ;
  72.  struct IntuiMessage    *GetMsg()  ;
  73.  
  74.  void cleanup( void )  ;
  75.  void stepauto( void )  ;
  76.  void display( void )  ;
  77.  UBYTE random( void )  ;
  78.  void scramble( void )  ;
  79.  
  80.  
  81.  void main()
  82.  {
  83.    short    i  ;
  84.  
  85.    IntuitionBase = ( struct IntuitionBase * )
  86.                    OpenLibrary( "intuition.library" , 33 )  ;
  87.    if ( ! IntuitionBase )
  88.       cleanup()  ;
  89.  
  90.    GfxBase = ( struct GfxBase * )
  91.              OpenLibrary( "graphics.library" , 33 )  ;
  92.    if ( ! GfxBase )
  93.       cleanup()  ;
  94.  
  95.    ns.Font = &stext  ;
  96.    screen = OpenScreen( &ns )  ;
  97.    if ( ! screen )
  98.       cleanup()  ;
  99.  
  100.    for ( i = 0 ; i < 16 ; i ++ )
  101.       SetRGB4( &screen->ViewPort , i , ctab[ i ][ 0 ] ,
  102.                                        ctab[ i ][ 1 ] ,
  103.                                        ctab[ i ][ 2 ] )  ;
  104.  
  105.    nw.Screen = screen  ;
  106.    window = OpenWindow( &nw )  ;
  107.    if ( ! window )
  108.       cleanup()  ;
  109.  
  110.    SetBPen( window->RPort , 0 )  ;
  111.    SetAPen( window->RPort , 15 )  ;
  112.    Move( window->RPort , 60 , 90 )  ;
  113.    Text( window->RPort , "Cyclic Space Automaton" , 22 )  ;
  114.    Move( window->RPort , 60 , 102 )  ;
  115.    Text( window->RPort , "by  Gary Teachout" , 17 )  ;
  116.    Move( window->RPort , 60 , 130 )  ;
  117.    Text( window->RPort , "Press any key to exit" , 21 )  ;
  118.  
  119.    cells1 = AllocMem( 2 * SIZEX * SIZEY , MEMF_FAST )  ;
  120.    if ( ! cells1 )
  121.       cleanup()  ;
  122.    cells2 = cells1 + ( SIZEX * SIZEY )  ;
  123.  
  124.    ShowTitle( screen , TRUE )  ;
  125.  
  126.    old = cells1  ;
  127.    new = cells2  ;
  128.  
  129.    scramble()  ;
  130.    display()  ;
  131.  
  132.    old = cells2  ;
  133.    new = cells1  ;
  134.  
  135.    for ( ; ; )
  136.    {
  137.       stepauto()  ;
  138.  
  139.       if ( mes = GetMsg( window->UserPort ) )
  140.       {
  141.          ReplyMsg( mes )  ;
  142.          break  ;
  143.       }
  144.  
  145.       display()  ;
  146.  
  147.       if ( old == cells2 )
  148.       {
  149.          old = cells1  ;
  150.          new = cells2  ;
  151.       }
  152.       else
  153.       {
  154.          old = cells2  ;
  155.          new = cells1  ;
  156.       }
  157.  
  158.       if ( mes = GetMsg( window->UserPort ) )
  159.       {
  160.          ReplyMsg( mes )  ;
  161.          break  ;
  162.       }
  163.    }
  164.  
  165.    cleanup()  ;
  166.  }
  167.  
  168.  
  169.  void cleanup()  
  170.  {
  171.    if ( cells1 )
  172.       FreeMem( cells1 , 2 * SIZEX * SIZEY )  ;
  173.  
  174.    if ( window )
  175.       CloseWindow( window )  ;
  176.  
  177.    if ( screen )
  178.       CloseScreen( screen )  ;
  179.  
  180.    if ( GfxBase )
  181.       CloseLibrary( GfxBase )  ;
  182.  
  183.    if ( IntuitionBase )
  184.       CloseLibrary( IntuitionBase )  ;
  185.  
  186.    exit()  ;
  187.  }
  188.  
  189.  
  190.  void stepauto()
  191.  {
  192.    short    x , y  ;
  193.    UBYTE    t , *oc , *n , *yp , *ym , *xp , *xm , *yy  ;
  194.  
  195.    oc = old  ;
  196.    n = new  ;
  197.    yy = old  ;
  198.  
  199.    for ( y = 0 ; y < SIZEY ; y ++ )
  200.    {
  201.       yp = old + ( ( ( y + 1 ) % SIZEY ) * SIZEX )  ;
  202.       ym = old + ( ( ( y + SIZEY - 1 ) % SIZEY ) * SIZEX )  ;
  203.       xp = yy + 1  ;
  204.  
  205.       t = ( *oc + 1 ) % COLORS  ;
  206.  
  207.       if (     ( *yp == t )
  208.             || ( *ym == t )
  209.             || ( *( yy + SIZEX - 1 ) == t )
  210.             || ( *xp == t ) )
  211.          *( n ++ ) = t  ;
  212.       else
  213.          *( n ++ ) = *oc  ;
  214.  
  215.       yp ++  ;
  216.       ym ++  ;
  217.       xp ++  ;
  218.       xm = yy  ;
  219.       oc ++  ;
  220.  
  221.       for ( x = 2 ; x < SIZEX ; x ++ )
  222.       {
  223.          t = ( *oc + 1 ) % COLORS  ;
  224.  
  225.          if (     ( *yp == t )
  226.                || ( *ym == t )
  227.                || ( *xm == t )
  228.                || ( *xp == t ) )
  229.             *( n ++ ) = t  ;
  230.          else
  231.             *( n ++ ) = *oc  ;
  232.  
  233.          yp ++  ;
  234.          ym ++  ;
  235.          xp ++  ;
  236.          xm ++  ;
  237.          oc ++  ;
  238.       }
  239.  
  240.       xp = yy  ;
  241.  
  242.       t = ( *oc + 1 ) % COLORS  ;
  243.  
  244.       if (     ( *yp == t )
  245.             || ( *ym == t )
  246.             || ( *xm == t )
  247.             || ( *xp == t ) )
  248.          *( n ++ ) = t  ;
  249.       else
  250.          *( n ++ ) = *oc  ;
  251.  
  252.       yy += SIZEX  ;
  253.       oc ++  ;
  254.    }
  255.  }
  256.  
  257.  
  258.  void display()
  259.  {
  260.    USHORT   x , y , d , i , j , k , m , *wp[ PLANES ] , *wpc[ PLANES ]  ;
  261.    UBYTE    cm , *c ;
  262.  
  263.    i = screen->BitMap.BytesPerRow >> 1  ;
  264.    wp[ 0 ] = ( USHORT * ) screen->BitMap.Planes[ 0 ] + ( 12 * i ) ;
  265.    wp[ 1 ] = ( USHORT * ) screen->BitMap.Planes[ 1 ] + ( 12 * i ) ;
  266.    wp[ 2 ] = ( USHORT * ) screen->BitMap.Planes[ 2 ] + ( 12 * i ) ;
  267.    wp[ 3 ] = ( USHORT * ) screen->BitMap.Planes[ 3 ] + ( 12 * i ) ;
  268.    wpc[ 0 ] = ( USHORT * ) screen->BitMap.Planes[ 0 ] + ( 13 * i ) ;
  269.    wpc[ 1 ] = ( USHORT * ) screen->BitMap.Planes[ 1 ] + ( 13 * i ) ;
  270.    wpc[ 2 ] = ( USHORT * ) screen->BitMap.Planes[ 2 ] + ( 13 * i ) ;
  271.    wpc[ 3 ] = ( USHORT * ) screen->BitMap.Planes[ 3 ] + ( 13 * i ) ;
  272.    c = new  ;
  273.  
  274.    for ( y = 0 ; y < SIZEY ; y ++ )
  275.    {
  276.       for ( x = 0 ; x < SIZEX ; x += 8 )
  277.       {
  278.          for ( cm = 1 , j = 0 ; j < PLANES ; j ++ , cm = cm << 1 )
  279.          {
  280.             d = 0  ;
  281.             for ( m = 0xc000 , k = 0 ; k < 8 ; m = m >> 2 , k ++ )
  282.             {
  283.                if ( *( c + k ) & cm )
  284.                   d |= m  ;
  285.             }
  286.             *wp[ j ] = d  ;
  287.             wp[ j ] ++  ;
  288.             *wpc[ j ] = d  ;
  289.             wpc[ j ] ++  ;
  290.          }
  291.          c += 8  ;
  292.       }
  293.       wp[ 0 ] += i  ;
  294.       wp[ 1 ] += i  ;
  295.       wp[ 2 ] += i  ;
  296.       wp[ 3 ] += i  ;
  297.       wpc[ 0 ] += i  ;
  298.       wpc[ 1 ] += i  ;
  299.       wpc[ 2 ] += i  ;
  300.       wpc[ 3 ] += i  ;
  301.    }
  302.  }
  303.  
  304.  
  305.  UBYTE random()
  306.  {
  307.    #define RANDSHIFT      8
  308.    #define RANDTAB        23
  309.    #define RANDCOMP       8388608
  310.    static UBYTE   fp = 1  ;
  311.    static long    v[ RANDTAB ] , rr ;
  312.    short          vi  ;
  313.  
  314.    if ( fp )
  315.    {
  316.       CurrentTime( &v[ 0 ] , &v[ 1 ] )  ;
  317.       srand( v[ 1 ] )  ;
  318.       for ( vi = 0 ; vi < RANDTAB ; vi ++ )
  319.          v[ vi ] = rand() >> RANDSHIFT  ;
  320.       rr = rand() >> RANDSHIFT  ;
  321.       fp = 0  ;
  322.    }
  323.  
  324.    vi = RANDTAB * rr / RANDCOMP  ;
  325.    rr = v[ vi ]  ;
  326.    v[ vi ] = rand() >> RANDSHIFT  ;
  327.  
  328.    return ( UBYTE ) ( ( COLORS * rr ) / RANDCOMP )  ;
  329.  }
  330.  
  331.  
  332.  void scramble()
  333.  {
  334.    short    x , y  ;
  335.  
  336.    for ( y = 0 ; y < SIZEY ; y ++ )
  337.    {
  338.       for ( x = 0 ; x < SIZEX ; x ++ )
  339.       {
  340.          *( new + x + ( y * SIZEX ) ) = random()  ;
  341.       }
  342.    }
  343.  }
  344.  
  345.  
  346.