home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / bomb.tar.gz / bomb.tar / bomb / acidlife.c next >
C/C++ Source or Header  |  1997-06-02  |  6KB  |  252 lines

  1. /*
  2.     bomb - automatic interactive visual stimulation
  3.     Copyright (C) 1994  Scott Draves <spot@cs.cmu.edu>
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. #include "defs.h"
  21. #include "bomb.h"
  22.  
  23. #define nbrains 3
  24.  
  25. int
  26. high_growth_game(rule_t *p)
  27. {
  28.    return ((iclamp(p->brain,nbrains) == 2) &&
  29.        ((p->rule == rule_acidlife1) ||
  30.         (p->rule == rule_acidlife2)));
  31. }
  32.      
  33.  
  34. /* should simplify use of lp? */
  35.  
  36. void step_rule_acidlife1(int frame, rule_t *p, image8_t *fb)
  37. {
  38.    int x, y, bx, by, q1;
  39.    board_t *s_heat_board, *d_heat_board;
  40.    board_t *s_game_board, *d_game_board;
  41.    u_char *lp0, *lp1;
  42.    int br = iclamp(p->brain,nbrains);
  43.  
  44.    s_heat_board=&board[dbuf];
  45.    d_heat_board=&board[1-dbuf];
  46.    s_game_board=&board2[dbuf];
  47.    d_game_board=&board2[1-dbuf];
  48.    dbuf = 1-dbuf;
  49.  
  50.    switch (br) {
  51.     case 0:
  52.       for (y=0;y<=SMALL_YSIZE;y++) {
  53.      (*s_game_board)[0][y] = R;
  54.      x = R;
  55.      x = (x & 1) && (x & 2);
  56.      (*s_game_board)[SMALL_XSIZE+1][y] = x;
  57.       }
  58.       for (x=0;x<=SMALL_XSIZE;x++) {
  59.      (*s_game_board)[x][0] = R;
  60.      (*s_game_board)[x][SMALL_YSIZE+1] = R;
  61.       }
  62.       break;
  63.     case 1:
  64.       break;
  65.     case 2:
  66.       for (y=0;y<=SMALL_YSIZE;y++) {
  67.      int t;
  68.      (*s_game_board)[0][y] = 0;
  69.      (*s_game_board)[SMALL_XSIZE+1][y] = 0;
  70.      (*s_heat_board)[0][y] = 0;
  71.      (*s_heat_board)[SMALL_XSIZE+1][y] = 0;
  72.       }
  73.       for (x=0;x<=SMALL_XSIZE;x++) {
  74.      int t;
  75.      (*s_game_board)[x][0] = 0;
  76.      (*s_game_board)[x][SMALL_YSIZE+1] = 0;
  77.      (*s_heat_board)[x][0] = 0;
  78.      (*s_heat_board)[x][SMALL_YSIZE+1] = 0;
  79.       }
  80.       break;
  81.    }
  82.  
  83.    for (y=1;y<=SMALL_YSIZE;y++) {
  84.       lp0 = fb->p + (fb->stride * 2 * (y - 1));
  85.       lp1 = lp0 + XSIZE - 1;
  86.       for (x=1;x<=SMALL_XSIZE;x++) {
  87.      int heat, t;
  88.      heat = ((((*s_heat_board)[x  ][y-1])+
  89.           ((*s_heat_board)[x-1][y  ])+
  90.           ((*s_heat_board)[x  ][y  ])+
  91.           ((*s_heat_board)[x+1][y  ])+
  92.           ((*s_heat_board)[x  ][y+1])
  93.           + p->speed)
  94.          / 5) & p->mask;
  95.      t = (((*s_game_board)[x+1][y+1]&LIVE_BIT)+
  96.           ((*s_game_board)[x+1][y-1]&LIVE_BIT)+
  97.           ((*s_game_board)[x-1][y+1]&LIVE_BIT)+
  98.           ((*s_game_board)[x-1][y-1]&LIVE_BIT)+
  99.           ((*s_game_board)[x  ][y-1]&LIVE_BIT)+
  100.           ((*s_game_board)[x-1][y  ]&LIVE_BIT)+
  101.           ((*s_game_board)[x+1][y  ]&LIVE_BIT)+
  102.           ((*s_game_board)[x  ][y+1]&LIVE_BIT));
  103.      q1 = (*s_game_board)[x][y]&LIVE_BIT;
  104.      switch (br) {
  105.       case 0:
  106.         /* adding || (heat > 200) interesting? */
  107.         if (q1) {
  108.            t = (t == 2 || t == 3);
  109.         } else {
  110.            t = (t == 3);
  111.         }
  112.         if (t) heat = p->mask;
  113.         break;
  114.       case 1:
  115.         t += q1;
  116.         /* 0001010111 */
  117.         t = ((t > 6) || (t == 3) || (t == 5));
  118.         if (t) heat = p->mask>>1;
  119.         break;
  120.       case 2:
  121.         t += q1;
  122.         t = t&1;
  123.         if (t) heat = p->mask;
  124.         break;
  125.      }
  126.      t = ((*s_game_board)[x][y] << 1) | t;
  127.      (*d_game_board)[x][y]= t;
  128.      (*d_heat_board)[x][y]= heat;
  129.      t = (heat > 100) ? (t|128) : (heat&127);
  130. #if 0
  131.      t = heat;
  132. #endif
  133.      if (0==t) t = 1;
  134.      else if (255==t) t = 254;
  135.      /* use stride+-1 for effect, nix idea */
  136.      lp0[fb->stride] = t;
  137.      *lp0++ = t;
  138.      lp1[fb->stride] = t;
  139.      *lp1-- = t;
  140.       }
  141.    }
  142. }
  143.  
  144. #define feedback 0
  145. #define flevel 20
  146.  
  147. void step_rule_acidlife2(int frame, rule_t *p, image8_t *fb)
  148. {
  149.    int x, y, bx, by;
  150.    board_t *s_heat_board, *d_heat_board;
  151.    board_t *s_game_board, *d_game_board;
  152.    u_char *lp0, *lp1, *lp2, *lp3;
  153.    int br = iclamp(p->brain,nbrains);
  154.    int q0, q1;
  155.  
  156.    s_heat_board=&board[dbuf];
  157.    d_heat_board=&board[1-dbuf];
  158.    s_game_board=&board2[dbuf];
  159.    d_game_board=&board2[1-dbuf];
  160.    dbuf = 1-dbuf;
  161.  
  162.    switch (br) {
  163.     case 0:
  164.       for (y=0;y<=SMALL_YSIZE;y++) {
  165.      int t;
  166.      (*s_game_board)[0][y] = R;
  167.      t = R;
  168.      (*s_game_board)[SMALL_XSIZE+1][y] = t;
  169.       }
  170.       for (x=0;x<=SMALL_XSIZE;x++) {
  171.      int t;
  172.      (*s_game_board)[x][0] = R;
  173.      (*s_game_board)[x][SMALL_YSIZE+1] = R;
  174.       }
  175.       break;
  176.     case 1:
  177.     case 2:
  178.       for (y=0;y<=SMALL_YSIZE;y++) {
  179.      int t;
  180.      (*s_game_board)[0][y] = 0;
  181.      (*s_game_board)[SMALL_XSIZE+1][y] = 0;
  182.      (*s_heat_board)[0][y] = 0;
  183.      (*s_heat_board)[SMALL_XSIZE+1][y] = 0;
  184.       }
  185.       for (x=0;x<=SMALL_XSIZE;x++) {
  186.      int t;
  187.      (*s_game_board)[x][0] = 0;
  188.      (*s_game_board)[x][SMALL_YSIZE+1] = 0;
  189.      (*s_heat_board)[x][0] = 0;
  190.      (*s_heat_board)[x][SMALL_YSIZE+1] = 0;
  191.       }
  192.       break;
  193.    }
  194.  
  195.    for(y=1;y<=SMALL_YSIZE;y++) {
  196.       lp0 = fb->p + (fb->stride * (y - 1));
  197.       lp1 = fb->p + (fb->stride * (YSIZE - y - 1));
  198.       lp2 = fb->p + (fb->stride * (y - 1)) + XSIZE - 1;
  199.       lp3 = fb->p + (fb->stride * (YSIZE - y - 1)) + XSIZE - 1;
  200.       for(x=1;x<=SMALL_XSIZE;x++) {
  201.      int heat, t;
  202.      heat = ((((*s_heat_board)[x  ][y-1])+
  203.           ((*s_heat_board)[x-1][y  ])+
  204.           ((*s_heat_board)[x  ][y  ])+
  205.           ((*s_heat_board)[x+1][y  ])+
  206.           ((*s_heat_board)[x  ][y+1])
  207.           + p->speed)/5)&p->mask;
  208.      t = (((*s_game_board)[x+1][y+1]&LIVE_BIT)+
  209.           ((*s_game_board)[x+1][y-1]&LIVE_BIT)+
  210.           ((*s_game_board)[x-1][y+1]&LIVE_BIT)+
  211.           ((*s_game_board)[x-1][y-1]&LIVE_BIT)+
  212.           ((*s_game_board)[x  ][y-1]&LIVE_BIT)+
  213.           ((*s_game_board)[x-1][y  ]&LIVE_BIT)+
  214.           ((*s_game_board)[x+1][y  ]&LIVE_BIT)+
  215.           ((*s_game_board)[x  ][y+1]&LIVE_BIT));
  216.      q1 = (*s_game_board)[x][y]&LIVE_BIT;
  217.      switch (br) {
  218.       case 0:
  219.         if (q1) {
  220.            t = (t == 2 || t == 3);
  221.         } else {
  222.            t = (t == 3);
  223.         }
  224.         if (t) heat = 100;
  225.         break;
  226.       case 1:
  227.         t += q1;
  228.         t = ((t > 6) || (t == 3) || (t == 5));
  229.         if (t) heat -= 2;
  230.         break;
  231.       case 2:
  232.         t += q1;
  233.         t = t&1;
  234.         if (t) heat = p->mask;
  235.         break;
  236.      }
  237.      
  238.      q0 = t;
  239.      t = ((*s_game_board)[x][y] << 1) | t;
  240.      (*d_game_board)[x][y]= t;
  241.      (*d_heat_board)[x][y]= heat;
  242.      if (0==heat) heat = 1;
  243.      else if (255==heat) heat = 254;
  244.      *lp0++ = heat;
  245.      *lp1++ = heat;
  246.      *lp2-- = heat;
  247.      *lp3-- = heat;
  248.       }
  249.    }
  250. }
  251.  
  252.