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 / Life.c < prev    next >
C/C++ Source or Header  |  1989-09-14  |  16KB  |  640 lines

  1. /*
  2.       Life.c        Gary Teachout     August  1989
  3.  
  4.       lc -L Life    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 FPEN        1
  12.  #define DPEN        1
  13.  #define BPEN        0
  14.  #define SIZEX       160
  15.  #define SIZEY       94
  16.  #define PLANES      1
  17.  
  18.  struct menubox
  19.  {
  20.    struct MenuItem      item  ;
  21.    struct IntuiText     text  ;
  22.  }  ;
  23.  
  24.  struct IntuitionBase      *IntuitionBase  ;
  25.  struct GfxBase            *GfxBase  ;
  26.  
  27.  struct IntuiMessage       *mes  ;
  28.  struct Screen             *screen  ;
  29.  struct Window             *window  ;
  30.  
  31.  ULONG   class  ;
  32.  USHORT  code  ;
  33.  
  34.  struct  NewScreen   ns =
  35.  {
  36.    0 , 0 , 320 , 200 , PLANES , DPEN , BPEN , 0 ,
  37.    CUSTOMSCREEN , NULL , NULL , NULL , NULL
  38.  }  ;
  39.  
  40.  UBYTE   *title[ 2 ] =
  41.  {
  42.    "  Life" ,
  43.    "  Edit Seed"
  44.  }  ;
  45.  
  46.  struct  NewWindow
  47.    nw =
  48.    {
  49.       0 , 0 , 320 , 200 , DPEN , BPEN ,
  50.       MENUPICK | MENUVERIFY | MOUSEBUTTONS ,
  51.       SMART_REFRESH | ACTIVATE | BACKDROP | BORDERLESS ,
  52.       NULL , NULL , NULL , 
  53.       NULL , NULL , 0 , 0 , 0 , 0 , CUSTOMSCREEN
  54.    }  ;
  55.  
  56.  USHORT chip   pointer[ 20 ] =
  57.  {
  58.    0x0000 , 0x0000 ,
  59.    0x8000 , 0x0000 ,
  60.    0xc000 , 0x0000 ,
  61.    0xa000 , 0x0000 ,
  62.    0x9000 , 0x0000 ,
  63.    0x8800 , 0x0000 ,
  64.    0x8400 , 0x0000 ,
  65.    0x8000 , 0x0000 ,
  66.    0x0000 , 0x0000 ,
  67.    0x0000 , 0x0000
  68.  }  ;
  69.  
  70.  struct Menu
  71.    menulist[ 2 ] =
  72.    {
  73.       {  NULL , 1   , 0 , 90 , 8  , MENUENABLED , " Control" , NULL } ,
  74.       {  NULL , 1   , 0 , 90 , 8  , MENUENABLED , " Edit" , NULL }
  75.    }  ;
  76.  
  77.  struct menubox 
  78.    controlmenu[ 5 ] =
  79.    {
  80.       {
  81.          {  NULL , 0 , 0  , 140 , 11 , 
  82.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  83.             0 , NULL , NULL , 'S' , NULL , NULL } ,
  84.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Stop" , NULL } 
  85.       } ,
  86.       {
  87.          {  NULL , 0 , 11 , 140 , 11 , 
  88.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  89.             0 , NULL , NULL , 'G' , NULL , NULL } ,
  90.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Go" , NULL } 
  91.       } ,
  92.       {
  93.          {  NULL , 0 , 22 , 140 , 11 , 
  94.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  95.             0 , NULL , NULL , 'C' , NULL , NULL } ,
  96.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Custom Seed" , NULL } 
  97.       } ,
  98.       {
  99.          {  NULL , 0 , 33 , 140 , 11 , 
  100.             ITEMTEXT | ITEMENABLED | HIGHCOMP ,
  101.             0 , NULL , NULL , 0 , NULL , NULL } ,
  102.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Random Seed" , NULL } 
  103.       } ,
  104.       {
  105.          {  NULL , 0 , 50 , 140 , 11 , 
  106.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  107.             0 , NULL , NULL , 'Q' , NULL , NULL } ,
  108.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Quit" , NULL } 
  109.       } 
  110.    } ,
  111.    seedsub[ 3 ] =
  112.    {
  113.       {
  114.          {  NULL , 130 , 0  , 120 , 11 , 
  115.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  116.             0 , NULL , NULL , '1' , NULL , NULL } ,
  117.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Small" , NULL } 
  118.       } ,
  119.       {
  120.          {  NULL , 130 , 11 , 120 , 11 , 
  121.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ,
  122.             0 , NULL , NULL , '2' , NULL , NULL } ,
  123.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Medium" , NULL } 
  124.       } ,
  125.       {
  126.          {  NULL , 130 , 22 , 120 , 11 , 
  127.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  128.             0 , NULL , NULL , '3' , NULL , NULL } ,
  129.          {  FPEN , BPEN , JAM1 , 10 , 2 , NULL , "Large" , NULL } 
  130.       }
  131.    } ,
  132.    editmenu[ 4 ] =
  133.    {
  134.       {
  135.          {  NULL , 0 , 0  , 170 , 11 , 
  136.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ | CHECKIT ,
  137.             0x02 , NULL , NULL , 'A' , NULL , NULL } ,
  138.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Alive (White)" , NULL } 
  139.       } ,
  140.       {
  141.          {  NULL , 0 , 11 , 170 , 11 , 
  142.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ | CHECKIT ,
  143.             0x01 , NULL , NULL , 'D' , NULL , NULL } ,
  144.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Dead  (Black)" , NULL } 
  145.       } ,
  146.       {
  147.          {  NULL , 0 , 22 , 170 , 11 , 
  148.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  149.             0 , NULL , NULL , 'B' , NULL , NULL } ,
  150.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Blank Field" , NULL } 
  151.       } ,
  152.       {
  153.          {  NULL , 0 , 33 , 170 , 11 , 
  154.             ITEMTEXT | ITEMENABLED | HIGHCOMP | COMMSEQ ,
  155.             0 , NULL , NULL , 'C' , NULL , NULL } ,
  156.          {  FPEN , BPEN , JAM1 , 25 , 2 , NULL , "Continue" , NULL } 
  157.       } 
  158.    }  ;
  159.  
  160.  struct TextAttr  stext = { "topaz.font" , 8 , 0 , 0 }  ;
  161.  
  162.  UBYTE   *cells1 , *cells2 , *old , *new  ;
  163.  
  164.  short   stopflag = 0 , reseed = 0  ;
  165.  
  166.  char                   *AllocMem()  ;
  167.  struct Screen          *OpenScreen()  ;
  168.  struct Window          *OpenWindow()  ;
  169.  struct IntuiMessage    *GetMsg()  ;
  170.  
  171.  void    cleanup( void )  ;
  172.  void    stepauto( void )  ;
  173.  void    display( void )  ;
  174.  UBYTE   random( UBYTE )  ;
  175.  void    scramble( short )  ;
  176.  short   stringreq( UBYTE * , short )  ;
  177.  void    handlemsg( void )  ;
  178.  void    handlemenu( void )  ;
  179.  void    randrule( void )  ;
  180.  void    stoploop( void )  ;
  181.  void    editmode( void )  ;
  182.  
  183.  void main()
  184.  {
  185.    IntuitionBase = ( struct IntuitionBase * )
  186.                    OpenLibrary( "intuition.library" , 33 )  ;
  187.    if ( ! IntuitionBase )
  188.       cleanup()  ;
  189.  
  190.    GfxBase = ( struct GfxBase * )
  191.              OpenLibrary( "graphics.library" , 33 )  ;
  192.    if ( ! GfxBase )
  193.       cleanup()  ;
  194.  
  195.    ns.Font = &stext  ;
  196.    screen = OpenScreen( &ns )  ;
  197.    if ( ! screen )
  198.       cleanup()  ;
  199.  
  200.    SetRGB4( &screen->ViewPort , 0 , 0 , 0 , 0 )  ;
  201.    SetRGB4( &screen->ViewPort , 1 , 15 , 15 , 15 )  ;
  202.  
  203.    nw.Screen = screen  ;
  204.    window = OpenWindow( &nw )  ;
  205.    if ( ! window )
  206.       cleanup()  ;
  207.  
  208.    SetBPen( window->RPort , 0 )  ;
  209.    SetAPen( window->RPort , 15 )  ;
  210.    Move( window->RPort , 60 , 90 )  ;       
  211.    Text( window->RPort , "The Game of Life" , 16 )  ;
  212.    Move( window->RPort , 60 , 102 )  ;
  213.    Text( window->RPort , "by  Gary Teachout" , 17 )  ;
  214.  
  215.    cells1 = AllocMem( 2 * SIZEX * SIZEY , MEMF_FAST | MEMF_CLEAR )  ;
  216.    if ( ! cells1 )
  217.       cleanup()  ;
  218.    cells2 = cells1 + ( SIZEX * SIZEY )  ;
  219.  
  220.    menulist[ 0 ].FirstItem = &controlmenu[ 0 ].item  ;
  221.  
  222.    controlmenu[ 0 ].item.ItemFill = ( APTR ) &controlmenu[ 0 ].text  ;
  223.    controlmenu[ 0 ].item.NextItem = &controlmenu[ 1 ].item  ;
  224.    controlmenu[ 1 ].item.ItemFill = ( APTR ) &controlmenu[ 1 ].text  ;
  225.    controlmenu[ 1 ].item.NextItem = &controlmenu[ 2 ].item  ;
  226.    controlmenu[ 2 ].item.ItemFill = ( APTR ) &controlmenu[ 2 ].text  ;
  227.    controlmenu[ 2 ].item.NextItem = &controlmenu[ 3 ].item  ;
  228.    controlmenu[ 3 ].item.ItemFill = ( APTR ) &controlmenu[ 3 ].text  ;
  229.    controlmenu[ 3 ].item.NextItem = &controlmenu[ 4 ].item  ;
  230.    controlmenu[ 4 ].item.ItemFill = ( APTR ) &controlmenu[ 4 ].text  ;
  231.  
  232.    controlmenu[ 3 ].item.SubItem = &seedsub[ 0 ].item  ;
  233.       seedsub[ 0 ].item.ItemFill = ( APTR ) &seedsub[ 0 ].text  ;
  234.       seedsub[ 0 ].item.NextItem = &seedsub[ 1 ].item  ;
  235.       seedsub[ 1 ].item.ItemFill = ( APTR ) &seedsub[ 1 ].text  ;
  236.       seedsub[ 1 ].item.NextItem = &seedsub[ 2 ].item  ;
  237.       seedsub[ 2 ].item.ItemFill = ( APTR ) &seedsub[ 2 ].text  ;
  238.  
  239.    menulist[ 1 ].FirstItem = &editmenu[ 0 ].item  ;
  240.  
  241.    editmenu[ 0 ].item.ItemFill = ( APTR ) &editmenu[ 0 ].text  ;
  242.    editmenu[ 0 ].item.NextItem = &editmenu[ 1 ].item  ;
  243.    editmenu[ 1 ].item.ItemFill = ( APTR ) &editmenu[ 1 ].text  ;
  244.    editmenu[ 1 ].item.NextItem = &editmenu[ 2 ].item  ;
  245.    editmenu[ 2 ].item.ItemFill = ( APTR ) &editmenu[ 2 ].text  ;
  246.    editmenu[ 2 ].item.NextItem = &editmenu[ 3 ].item  ;
  247.    editmenu[ 3 ].item.ItemFill = ( APTR ) &editmenu[ 3 ].text  ;
  248.  
  249.    SetMenuStrip( window , &menulist[ 0 ] ) ;
  250.    SetWindowTitles( window , NULL , title[ 0 ] )  ;
  251.    ShowTitle( screen , TRUE )  ;
  252.  
  253.    Delay( 100 )  ;
  254.  
  255.    old = cells1  ;
  256.    new = cells2  ;
  257.  
  258.    scramble( 25 )  ;
  259.    display()  ;
  260.  
  261.    old = cells2  ;
  262.    new = cells1  ;
  263.  
  264.    for ( ; ; )
  265.    {
  266.       stepauto()  ;
  267.  
  268.       display()  ;
  269.  
  270.       if ( old == cells2 )
  271.       {
  272.          old = cells1  ;
  273.          new = cells2  ;
  274.       }
  275.       else
  276.       {
  277.          old = cells2  ;
  278.          new = cells1  ;
  279.       }
  280.  
  281.    }
  282.  
  283.    cleanup()  ;
  284.  }
  285.  
  286.  
  287.  void cleanup()  
  288.  {
  289.    if ( cells1 )
  290.       FreeMem( cells1 , 2 * SIZEX * SIZEY )  ;
  291.  
  292.    if ( window )
  293.       CloseWindow( window )  ;
  294.  
  295.    if ( screen )
  296.       CloseScreen( screen )  ;
  297.  
  298.    if ( GfxBase )
  299.       CloseLibrary( GfxBase )  ;
  300.  
  301.    if ( IntuitionBase )
  302.       CloseLibrary( IntuitionBase )  ;
  303.  
  304.    exit()  ;
  305.  }
  306.  
  307.  
  308.  void stepauto()
  309.  {
  310.    short    x , y  ;
  311.    UBYTE    *oc , *n , *yp , *ym , *xp , *xm , *yy ,
  312.                        *mm , *pm , *mp , *pp , t  ;
  313.  
  314.    oc = old  ;
  315.    n = new  ;
  316.    yy = old  ;
  317.  
  318.    for ( y = 0 ; y < SIZEY ; y ++ )
  319.    {
  320.       yp = old + ( ( ( y + 1 ) % SIZEY ) * SIZEX )  ;
  321.       ym = old + ( ( ( y + SIZEY - 1 ) % SIZEY ) * SIZEX )  ;
  322.       xp = yy + 1  ;
  323.       xm = yy + SIZEX - 1  ;
  324.  
  325.       mm = ym + SIZEX - 1  ;
  326.       mp = yp + SIZEX - 1  ;
  327.       pm = ym + 1  ;
  328.       pp = yp + 1  ;
  329.  
  330.       t =      *yp + *ym + *( xp ++ ) + *xm
  331.             +  *mm + *( pm ++ ) + *mp + *( pp ++ )  ;
  332.  
  333.       if ( *( oc ++ ) )
  334.          *( n ++ ) = ( ( t == 2 ) || ( t == 3 ) ) ? 1 : 0  ;
  335.       else
  336.          *( n ++ ) = ( t == 3 ) ? 1 : 0  ;
  337.  
  338.       mm = ym  ;
  339.       mp = yp  ;
  340.       yp ++  ;
  341.       ym ++  ;
  342.       xm = yy  ;
  343.  
  344.       for ( x = 2 ; x < SIZEX ; x ++ )
  345.       {
  346.          t =      *( yp ++ ) + *( ym ++ ) + *( xp ++ ) + *( xm ++ )
  347.                +  *( mm ++ ) + *( pm ++ ) + *( mp ++ ) + *( pp ++ )  ;
  348.  
  349.          if ( *( oc ++ ) )
  350.             *( n ++ ) = ( ( t == 2 ) || ( t == 3 ) ) ? 1 : 0  ;
  351.          else
  352.             *( n ++ ) = ( t == 3 ) ? 1 : 0  ;
  353.       }
  354.  
  355.       xp = yy  ;
  356.       pm -= SIZEX  ;
  357.       pp -= SIZEX  ;
  358.  
  359.       t = *yp + *ym + *xp + *xm + *mm + *pm + *mp + *pp  ;
  360.  
  361.       if ( *( oc ++ ) )
  362.          *( n ++ ) = ( ( t == 2 ) || ( t == 3 ) ) ? 1 : 0  ;
  363.       else
  364.          *( n ++ ) = ( t == 3 ) ? 1 : 0  ;
  365.  
  366.       yy += SIZEX  ;
  367.    }
  368.  }
  369.  
  370.  
  371.  void display()
  372.  {
  373.    USHORT   x , y , d , i , k , m , *wp , *wpc  ;
  374.    UBYTE    *c ;
  375.  
  376.    do
  377.    {
  378.       reseed = 0  ;
  379.  
  380.       i = screen->BitMap.BytesPerRow >> 1  ;
  381.       wp = ( USHORT * ) screen->BitMap.Planes[ 0 ] + ( 12 * i ) ;
  382.       wpc = ( USHORT * ) screen->BitMap.Planes[ 0 ] + ( 13 * i ) ;
  383.       c = new  ;
  384.  
  385.       for ( y = 0 ; y < SIZEY ; y ++ )
  386.       {
  387.          for ( x = 0 ; x < SIZEX ; x += 8 )
  388.          {
  389.             d = 0  ;
  390.             for ( m = 0xc000 , k = 0 ; k < 8 ; m = m >> 2 , k ++ )
  391.             {
  392.                if ( *( c + k ) & 1 )
  393.                   d |= m  ;
  394.             }
  395.             *wp = d  ;
  396.             wp ++  ;
  397.             *wpc = d  ;
  398.             wpc ++  ;
  399.             c += 8  ;
  400.          }
  401.          wp += i  ;
  402.          wpc += i  ;
  403.  
  404.          handlemsg()  ;
  405.          if ( reseed )
  406.             break  ;
  407.       }
  408.    } while ( reseed )  ;
  409.  }
  410.  
  411.  
  412.  UBYTE random( a )
  413.    UBYTE    a  ;
  414.  {
  415.    #define RANDSHIFT      8
  416.    #define RANDTAB        23
  417.    #define RANDCOMP       8388608
  418.    static UBYTE   fp = 1  ;
  419.    static long    v[ RANDTAB ] , rr ;
  420.    short          vi  ;
  421.  
  422.    if ( fp )
  423.    {
  424.       CurrentTime( &v[ 0 ] , &v[ 1 ] )  ;
  425.       srand( v[ 1 ] )  ;
  426.       for ( vi = 0 ; vi < RANDTAB ; vi ++ )
  427.          v[ vi ] = rand() >> RANDSHIFT  ;
  428.       rr = rand() >> RANDSHIFT  ;
  429.       fp = 0  ;
  430.    }
  431.  
  432.    vi = RANDTAB * rr / RANDCOMP  ;
  433.    rr = v[ vi ]  ;
  434.    v[ vi ] = rand() >> RANDSHIFT  ;
  435.  
  436.    return ( UBYTE ) ( ( a * rr ) / RANDCOMP )  ;
  437.  }
  438.  
  439.  
  440.  void scramble( s )
  441.    short    s  ;
  442.  {
  443.    short    x , y  ;
  444.  
  445.    for ( x = 0 ; x < ( SIZEX * SIZEY ) ; x ++ )
  446.       *( new + x ) = 0  ;
  447.  
  448.    for ( y = ( SIZEY - s ) >> 1 ; y < ( ( SIZEY + s ) >> 1 ) ; y ++ )
  449.    {
  450.       for ( x = ( SIZEX - s ) >> 1 ; x < ( ( SIZEX + s ) >> 1 ) ; x ++ )
  451.       {
  452.          *( new + x + ( y * SIZEX ) ) = random( 2 )  ;
  453.       }
  454.    }
  455.  }
  456.  
  457.  
  458.  void handlemsg()
  459.  {
  460.    while ( mes = GetMsg( window->UserPort ) )
  461.    {
  462.       class = mes->Class  ;
  463.       code = mes->Code  ;
  464.       ReplyMsg( mes )  ;
  465.       switch ( class )
  466.       {
  467.       case MENUVERIFY :
  468.          Wait( 1 << window->UserPort->mp_SigBit )  ;
  469.          while ( class != MENUPICK )
  470.          {
  471.             if ( mes = GetMsg( window->UserPort ) )
  472.             {
  473.                class = mes->Class  ;
  474.                code = mes->Code  ;
  475.                ReplyMsg( mes )  ;
  476.             }
  477.          }
  478.       case MENUPICK :
  479.          handlemenu()  ;
  480.          break  ;
  481.       }
  482.    }
  483.  }
  484.  
  485.  
  486.  void handlemenu()
  487.  {
  488.    if ( ! MENUNUM( code ) )
  489.    {
  490.       switch ( ITEMNUM( code ) )
  491.       {
  492.       case 0 :
  493.          stoploop()  ;
  494.          break  ;
  495.       case 1 :
  496.          stopflag = 0  ;
  497.          break  ;
  498.       case 2 :
  499.          editmode()  ;
  500.          break  ;
  501.       case 3 :
  502.          switch ( SUBNUM( code ) )
  503.          {
  504.          case 0 :
  505.             scramble( 5 )  ;
  506.             break  ;
  507.          case 1 :
  508.             scramble( 25 )  ;
  509.             break  ;
  510.          case 2 :
  511.             scramble( 80 )  ;
  512.             break  ;
  513.          }
  514.          reseed = 1  ;
  515.          break  ;
  516.       case 4 : /* quit */
  517.          cleanup()  ;
  518.          break  ;
  519.       }
  520.    }
  521.  }
  522.  
  523.  
  524.  void stoploop()
  525.  {
  526.    if ( ! stopflag )
  527.    {
  528.       stopflag = 1  ;
  529.       while ( stopflag )
  530.       {
  531.          Wait( 1 << window->UserPort->mp_SigBit )  ;
  532.          handlemsg()  ;
  533.       }
  534.    }
  535.  }
  536.  
  537.  
  538.  void editmode()
  539.  {
  540.    UBYTE    live = 1  ;
  541.    short    x , y , ox , oy , mx , my  ;
  542.  
  543.    SetWindowTitles( window , NULL , title[ 1 ] )  ;
  544.    ClearMenuStrip( window )  ;
  545.    display()  ;
  546.    editmenu[ 0 ].item.Flags = editmenu[ 0 ].item.Flags | CHECKED  ;
  547.    editmenu[ 1 ].item.Flags = editmenu[ 1 ].item.Flags & ( ~ CHECKED )  ;
  548.    SetMenuStrip( window , &menulist[ 1 ] )  ;
  549.  
  550.    SetPointer( window , pointer , 7 , 7 , -1 , 0 )  ;
  551.  
  552.    stopflag = 0  ;
  553.    reseed = 0  ;
  554.    while( ! reseed )
  555.    {
  556.       Wait( 1 << window->UserPort->mp_SigBit )  ;
  557.       while ( mes = GetMsg( window->UserPort ) )
  558.       {
  559.          class = mes->Class  ;
  560.          code = mes->Code  ;
  561.          ReplyMsg( mes )  ;
  562.          switch ( class )
  563.          {
  564.          case MENUVERIFY :
  565.             Wait( 1 << window->UserPort->mp_SigBit )  ;
  566.             while ( class != MENUPICK )
  567.             {
  568.                if ( mes = GetMsg( window->UserPort ) )
  569.                {
  570.                   class = mes->Class  ;
  571.                   code = mes->Code  ;
  572.                   ReplyMsg( mes )  ;
  573.                }
  574.             }
  575.          case MENUPICK :
  576.             switch ( ITEMNUM( code ) )
  577.             {
  578.             case 0 :
  579.                live = 1  ;
  580.                break  ;
  581.             case 1 :
  582.                live = 0  ;
  583.                break  ;
  584.             case 2 :
  585.                for ( y = 0 ; y < ( SIZEY * SIZEX ) ; y ++ )
  586.                   *( new + y ) = 0  ;
  587.                SetRast( window->RPort , 0 )  ;
  588.                break  ;
  589.             case 3 :
  590.                reseed = 1  ;
  591.                break  ;
  592.             }
  593.             break  ;
  594.          case MOUSEBUTTONS :
  595.             if ( code == SELECTDOWN )
  596.             {
  597.                ox = oy = -1  ;
  598.                while ( code != SELECTUP )
  599.                {
  600.                   mx = window->MouseX & 0xfffe  ;
  601.                   my = window->MouseY & 0xfffe  ;
  602.                   x = mx >> 1  ;
  603.                   y = ( my >> 1 ) - 6  ;
  604.                   if ( ( ( x != ox ) || ( y != oy ) ) && ( y >= 0 ) )
  605.                   {
  606.                      *( new + x + ( y * SIZEX ) ) = live  ;
  607.                      if ( live )
  608.                         SetAPen( window->RPort , 1 )  ;
  609.                      else
  610.                         SetAPen( window->RPort , 0 )  ;
  611.                      WritePixel( window->RPort , mx , my )  ;
  612.                      WritePixel( window->RPort , mx + 1 , my )  ;
  613.                      WritePixel( window->RPort , mx , my + 1 )  ;
  614.                      WritePixel( window->RPort , mx + 1 , my + 1 )  ;
  615.                      ox = x  ;
  616.                      oy = y  ;
  617.                   }
  618.                   while ( mes = GetMsg( window->UserPort ) )
  619.                   {
  620.                      if ( mes->Class == MOUSEBUTTONS )
  621.                         code = mes->Code  ;
  622.                      ReplyMsg( mes )  ;
  623.                   }
  624.                }
  625.             }
  626.             break  ;
  627.          }
  628.       }
  629.    }
  630.  
  631.    ClearPointer( window )  ;
  632.  
  633.    ClearMenuStrip( window )  ;
  634.    SetMenuStrip( window , &menulist[ 0 ] )  ;
  635.    SetWindowTitles( window , NULL , title[ 0 ] )  ;
  636.  }
  637.  
  638.  
  639.  
  640.