Subversion Repositories HelenOS

Rev

Rev 4537 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*  $OpenBSD: shapes.c,v 1.8 2004/07/10 07:26:24 deraadt Exp $  */
  2. /*  $NetBSD: shapes.c,v 1.2 1995/04/22 07:42:44 cgd Exp $   */
  3.  
  4. /*-
  5.  * Copyright (c) 1992, 1993
  6.  *  The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * This code is derived from software contributed to Berkeley by
  9.  * Chris Torek and Darren F. Provine.
  10.  *
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions
  13.  * are met:
  14.  * 1. Redistributions of source code must retain the above copyright
  15.  *    notice, this list of conditions and the following disclaimer.
  16.  * 2. Redistributions in binary form must reproduce the above copyright
  17.  *    notice, this list of conditions and the following disclaimer in the
  18.  *    documentation and/or other materials provided with the distribution.
  19.  * 3. Neither the name of the University nor the names of its contributors
  20.  *    may be used to endorse or promote products derived from this software
  21.  *    without specific prior written permission.
  22.  *
  23.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  24.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  27.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33.  * SUCH DAMAGE.
  34.  *
  35.  *  @(#)shapes.c    8.1 (Berkeley) 5/31/93
  36.  */
  37.  
  38. /** @addtogroup tetris
  39.  * @{
  40.  */
  41. /** @file
  42.  */
  43.  
  44. /*
  45.  * Tetris shapes and related routines.
  46.  *
  47.  * Note that the first 7 are `well known'.
  48.  */
  49.  
  50. #include <unistd.h>
  51. #include "tetris.h"
  52.  
  53. #define TL  (-B_COLS - 1)  /* top left */
  54. #define TC  (-B_COLS)      /* top center */
  55. #define TR  (-B_COLS + 1)  /* top right */
  56. #define ML  -1             /* middle left */
  57. #define MR  1              /* middle right */
  58. #define BL  (B_COLS - 1)   /* bottom left */
  59. #define BC  B_COLS         /* bottom center */
  60. #define BR  (B_COLS + 1)   /* bottom right */
  61.  
  62. const struct shape shapes[] = {
  63.     /*  0 */  {  7,  7, { TL, TC, MR }, 0xff042d},
  64.     /*  1 */  {  8,  8, { TC, TR, ML }, 0xff9304},
  65.     /*  2 */  {  9, 11, { ML, MR, BC }, 0xbeff04},
  66.     /*  3 */  {  3,  3, { TL, TC, ML }, 0x63ff04},
  67.     /*  4 */  { 12, 14, { ML, BL, MR }, 0xce04ff},
  68.     /*  5 */  { 15, 17, { ML, BR, MR }, 0xff04cf},
  69.     /*  6 */  { 18, 18, { ML, MR, 2  }, 0x7604ff},  /* sticks out */
  70.     /*  7 */  {  0,  0, { TC, ML, BL }, 0xff042d},
  71.     /*  8 */  {  1,  1, { TC, MR, BR }, 0xff9304},
  72.     /*  9 */  { 10,  2, { TC, MR, BC }, 0xbeff04},
  73.     /* 10 */  { 11,  9, { TC, ML, MR }, 0xbeff04},
  74.     /* 11 */  {  2, 10, { TC, ML, BC }, 0xbeff04},
  75.     /* 12 */  { 13,  4, { TC, BC, BR }, 0xce04ff},
  76.     /* 13 */  { 14, 12, { TR, ML, MR }, 0xce04ff},
  77.     /* 14 */  {  4, 13, { TL, TC, BC }, 0xce04ff},
  78.     /* 15 */  { 16,  5, { TR, TC, BC }, 0xff04cf},
  79.     /* 16 */  { 17, 15, { TL, MR, ML }, 0xff04cf},
  80.     /* 17 */  {  5, 16, { TC, BC, BL }, 0xff04cf},
  81.     /* 18 */  {  6,  6, { TC, BC, 2 * B_COLS }, 0x7604ff}  /* sticks out */
  82. };
  83.  
  84. /*
  85.  * Return true iff the given shape fits in the given position,
  86.  * taking the current board into account.
  87.  */
  88. int fits_in(const struct shape *shape, int pos)
  89. {
  90.     const int *o = shape->off;
  91.    
  92.     if ((board[pos]) || (board[pos + *o++]) || (board[pos + *o++]) ||
  93.         (board[pos + *o]))
  94.         return 0;
  95.    
  96.     return 1;
  97. }
  98.  
  99. /*
  100.  * Write the given shape into the current board, turning it on
  101.  * if `onoff' is 1, and off if `onoff' is 0.
  102.  */
  103. void place(const struct shape *shape, int pos, int onoff)
  104. {
  105.     const int *o = shape->off;
  106.    
  107.     board[pos] = onoff ? shape->color : 0x000000;
  108.     board[pos + *o++] = onoff ? shape->color : 0x000000;
  109.     board[pos + *o++] = onoff ? shape->color : 0x000000;
  110.     board[pos + *o] = onoff ? shape->color : 0x000000;
  111. }
  112.  
  113. /** @}
  114.  */
  115.