home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / utils / fcons1.zip / DIZZY.C < prev    next >
Text File  |  1986-06-30  |  8KB  |  351 lines

  1. #include <stdio.h>
  2.  
  3. #define BOXMAX 13
  4. #define WIDTH 5 
  5. #define HEIGHT 2
  6. #define LEFT (40-((BOXMAX * WIDTH) / 2))
  7.  
  8. #define ESC 0x1b
  9.  
  10. typedef (*fnptr) ();
  11.  
  12. unsigned int box [BOXMAX][4];
  13.  
  14. /***************************************************************************/
  15. param (limit)
  16.   unsigned int limit;
  17. {
  18.   if (limit >= 100)
  19.     fputc ('0' + (limit / 100), stdout);
  20.   if (limit >= 10)
  21.     fputc ('0' + ((limit / 10) % 10), stdout);
  22.   fputc ('0' + (limit % 10), stdout);
  23. }
  24. /***************************************************************************/
  25. crlf ()
  26. {
  27.   fputc ('\r', stdout);
  28.   fputc ('\n', stdout);
  29. }
  30. /***************************************************************************/
  31. eos ()
  32. {
  33.   fputc (ESC, stdout);
  34.   fputc ('[', stdout);
  35.   fputc ('2', stdout);
  36.   fputc ('J', stdout);
  37. }
  38. /***************************************************************************/
  39. home ()
  40. {
  41.   fputc (ESC, stdout);
  42.   fputc ('[', stdout);
  43.   fputc ('H', stdout);
  44. }
  45. /***************************************************************************/
  46. clear ()
  47. {
  48.   fputc (ESC, stdout);
  49.   fputc ('[', stdout);
  50.   fputc ('r', stdout);
  51.   fputc (ESC, stdout);
  52.   fputc ('[', stdout);
  53.   param (40);
  54.   fputc ('m', stdout);
  55.   eos ();
  56.   crlf ();
  57. }
  58. /***************************************************************************/
  59. sgr (index)
  60. {
  61.   fputc (ESC, stdout);
  62.   fputc ('[', stdout);
  63.   param (41 + index % 3);
  64.   fputc ('m', stdout);
  65. }
  66. /***************************************************************************/
  67. ssr (region)
  68.   unsigned int region [4];
  69. {
  70.   fputc (ESC, stdout);
  71.   fputc ('[', stdout);
  72.   param (region [0]);
  73.   fputc (';', stdout);
  74.   param (region [1]);
  75.   fputc (';', stdout);
  76.   param (region [2]);
  77.   fputc (';', stdout);
  78.   param (region [3]);
  79.   fputc ('r', stdout);
  80. }
  81. /***************************************************************************/
  82. su (level)
  83.   unsigned int level;
  84. {
  85.   unsigned int region [4];
  86.   int index;
  87.  
  88.   region [0] = box [level] [0] - HEIGHT;
  89.   region [1] = box [level] [1];
  90.   region [2] = box [level] [2];
  91.   region [3] = box [level] [3];
  92.   ssr (region);
  93.   home ();
  94.   sgr (level + 1);
  95.   fputc (ESC, stdout);
  96.   fputc ('[', stdout);
  97.   param (HEIGHT);
  98.   fputc ('S', stdout);
  99.   for (index = level;
  100.        index >= 0;
  101.        index--)
  102.   {
  103.     box [index] [0] -= HEIGHT;
  104.     box [index] [1] -= HEIGHT; 
  105.   }    
  106.   crlf ();
  107. }
  108. /***************************************************************************/
  109. sd (level)
  110.   unsigned int level;
  111. {
  112.   unsigned int region [4];
  113.   int index;
  114.  
  115.   region [0] = box [level] [0];
  116.   region [1] = box [level] [1] + HEIGHT;
  117.   region [2] = box [level] [2];
  118.   region [3] = box [level] [3];
  119.   ssr (region);
  120.   home ();
  121.   sgr (level + 1);
  122.   fputc (ESC, stdout);
  123.   fputc ('[', stdout);
  124.   param (HEIGHT);
  125.   fputc ('T', stdout);
  126.   for (index = level;
  127.        index >= 0;
  128.        index--)
  129.   {
  130.     box [index] [0] += HEIGHT;
  131.     box [index] [1] += HEIGHT; 
  132.   }    
  133.   crlf ();
  134. }
  135. /***************************************************************************/
  136. sr (level)
  137.   unsigned int level;
  138. {
  139.   unsigned int region [4];
  140.   int index;
  141.  
  142.   region [0] = box [level] [0];
  143.   region [1] = box [level] [1];
  144.   region [2] = box [level] [2];
  145.   region [3] = box [level] [3] + WIDTH;
  146.   ssr (region);
  147.   home ();
  148.   sgr (level + 1);
  149.   fputc (ESC, stdout);
  150.   fputc ('[', stdout);
  151.   param (WIDTH);
  152.   fputc (' ', stdout);
  153.   fputc ('A', stdout);
  154.   for (index = level;
  155.        index >= 0;
  156.        index--)
  157.   {
  158.     box [index] [2] += WIDTH;
  159.     box [index] [3] += WIDTH;
  160.   }    
  161.   if (region [1] - region [0])
  162.     crlf ();
  163. }
  164. /***************************************************************************/
  165. sl (level)
  166.   unsigned int level;
  167. {
  168.   unsigned int region [4];
  169.   int index;
  170.  
  171.   region [0] = box [level] [0];
  172.   region [1] = box [level] [1];
  173.   region [2] = box [level] [2] - WIDTH;
  174.   region [3] = box [level] [3];
  175.   ssr (region);
  176.   home ();
  177.   sgr (level + 1);
  178.   fputc (ESC, stdout);
  179.   fputc ('[', stdout);
  180.   param (WIDTH);
  181.   fputc (' ', stdout);
  182.   fputc ('@', stdout);
  183.   for (index = level;
  184.        index >= 0;
  185.        index--)
  186.   {
  187.     box [index] [2] -= WIDTH;
  188.     box [index] [3] -= WIDTH;
  189.   }    
  190.   if (region [1] - region [0])
  191.     crlf ();
  192. }
  193. /***************************************************************************/
  194. fnptr sx [] =
  195.   {&sr, &sd, &sl, &su}; 
  196. /***************************************************************************/
  197. scroll (level, way)
  198.   unsigned int level;
  199.   unsigned int way;
  200. {
  201.   if (way)
  202.     if (box [level] [0] == box [level + 1] [0])
  203.       if (box [level] [2] == box [level + 1] [2])
  204.     sr (level);
  205.       else
  206.     sd (level);
  207.     else
  208.       if (box [level] [2] == box [level + 1] [2])
  209.     su (level);
  210.       else
  211.     sl (level);
  212.   else
  213.     if (box [level] [0] == box [level + 1] [0])
  214.       if (box [level] [2] == box [level + 1] [2])
  215.     sd (level);
  216.       else
  217.     sl (level);
  218.     else
  219.       if (box [level] [2] == box [level + 1] [2])
  220.     sr (level);
  221.       else
  222.     su (level);
  223. }
  224. /***************************************************************************/
  225. paint ()
  226. {
  227.   unsigned int index;
  228.  
  229.   clear ();
  230.   for (index = 0;
  231.        index < BOXMAX;
  232.        index++)
  233.   {
  234.     box [index] [0] = 1;
  235.     box [index] [1] = 1 + (HEIGHT * index);
  236.     box [index] [2] = 1 + LEFT;
  237.     box [index] [3] = 1 + (LEFT + (WIDTH * index));
  238.   }
  239.   for (index = BOXMAX;
  240.        index-- > 0;
  241.        )
  242.   {
  243.     ssr (box [index]);
  244.     sgr (index);
  245.     eos ();
  246.     crlf ();
  247.   }
  248. }
  249. /***************************************************************************/
  250. cycleclock ()
  251. {
  252.   unsigned int level;
  253.   unsigned int direction;
  254.  
  255.   paint ();
  256.   for (level = 0;
  257.        level < (BOXMAX - 1);
  258.        ++level)
  259.     for (direction = 0;
  260.          direction < 4;
  261.          ++direction)
  262.       scroll (level, 1);  
  263. }
  264. /***************************************************************************/
  265. cyclecounter ()
  266. {
  267.   unsigned int level;
  268.   unsigned int direction;
  269.  
  270.   paint ();
  271.   for (level = 0;
  272.        level < (BOXMAX - 1);
  273.        ++level)
  274.     for (direction = 4;
  275.          direction-- > 0;
  276.          )
  277.       scroll (level, 0);  
  278. }
  279. /***************************************************************************/
  280. cyclealternate ()
  281. {
  282.   unsigned int level;
  283.   unsigned int direction;
  284.  
  285.   paint ();
  286.   for (level = 0;
  287.        level < (BOXMAX - 1);
  288.        ++level)
  289.     for (direction = 0;
  290.          direction < 4;
  291.          ++direction)
  292.       scroll (level, (level & 0x0001));
  293. }
  294. /***************************************************************************/
  295. stepclock ()
  296. {
  297.   unsigned int level;
  298.   unsigned int direction;
  299.  
  300.   paint ();
  301.   for (direction = 0;
  302.        direction < 4;
  303.        ++direction)
  304.     for (level = 0;
  305.          level < (BOXMAX - 1);
  306.          ++level)
  307.       scroll (level, 1);  
  308. }
  309. /***************************************************************************/
  310. stepcounter ()
  311. {
  312.   unsigned int level;
  313.   unsigned int direction;
  314.  
  315.   paint ();
  316.   for (direction = 0;
  317.        direction < 4;
  318.        ++direction)
  319.     for (level = 0;
  320.          level < (BOXMAX - 1);
  321.          ++level)
  322.       scroll (level, 0);  
  323. }
  324. /***************************************************************************/
  325. stepalternate ()
  326. {
  327.   unsigned int level;
  328.   unsigned int direction;
  329.  
  330.   paint ();
  331.   for (direction = 0;
  332.        direction < 4;
  333.        ++direction)
  334.     for (level = 0;
  335.          level < (BOXMAX - 1);
  336.          ++level)
  337.       scroll (level, ((level + direction) & 0x0001));  
  338. }
  339. /***************************************************************************/
  340. main ()
  341. {
  342.   cycleclock ();
  343.   cyclecounter ();
  344.   cyclealternate ();
  345.   stepclock ();
  346.   stepcounter ();
  347.   stepalternate ();
  348.   clear ();
  349. }
  350. /***************************************************************************/
  351.