borgware-2d/games/tetris/piece.h

212 lines
4.7 KiB
C
Raw Normal View History

#ifndef TETRIS_PIECE_H_
#define TETRIS_PIECE_H_
2010-08-24 23:00:40 +00:00
#include <stdint.h>
2010-12-15 02:29:51 +00:00
#include <assert.h>
/**
* \defgroup TetrisPieceTypes Piece: Data types
*/
/*@{*/
/*********
* types *
*********/
/** shape attributes for a piece */
2011-02-25 04:31:34 +00:00
enum tetris_piece_shape
{
TETRIS_PC_LINE, /**< the I shaped brick */
TETRIS_PC_T, /**< the T shaped brick */
2010-08-24 23:00:40 +00:00
TETRIS_PC_SQUARE, /**< the square shaped brick */
TETRIS_PC_L, /**< the L shaped brick */
TETRIS_PC_LBACK, /**< the reverse L shaped brick */
TETRIS_PC_S, /**< the S shaped brick */
TETRIS_PC_Z /**< the Z shaped brick */
2011-02-25 04:31:34 +00:00
};
#ifdef NDEBUG
typedef uint8_t tetris_piece_shape_t;
#else
typedef enum tetris_piece_shape tetris_piece_shape_t;
#endif
/** possible angles for a brick */
2011-02-25 04:31:34 +00:00
enum tetris_piece_angle
{
TETRIS_PC_ANGLE_0, /**< standard angle */
TETRIS_PC_ANGLE_90, /**< rotated by 90 degrees */
TETRIS_PC_ANGLE_180, /**< rotated by 180 degrees */
TETRIS_PC_ANGLE_270 /**< rotated by 270 degrees */
2011-02-25 04:31:34 +00:00
};
#ifdef NDEBUG
typedef uint8_t tetris_piece_angle_t;
#else
typedef enum tetris_piece_angle tetris_piece_angle_t;
#endif
/** rotation attributes */
2011-02-25 04:31:34 +00:00
enum tetris_piece_rotation
{
TETRIS_PC_ROT_CW, /**< clockwise rotation */
TETRIS_PC_ROT_CCW /**< counter clockwise rotation */
2011-02-25 04:31:34 +00:00
};
#ifdef NDEBUG
typedef uint8_t tetris_piece_rotation_t;
#else
typedef enum tetris_piece_rotation tetris_piece_rotation_t;
#endif
/**
* describes the attributes of a piece
* @see tetris_piece_shape_t
* @see tetris_piece_angle_t
*/
2011-02-25 04:31:34 +00:00
typedef struct tetris_piece
{
tetris_piece_shape_t shape; /**< specifies the shape of the piece */
tetris_piece_angle_t angle; /**< specifies one of 4 angels */
}
tetris_piece_t;
/*@}*/
/**
* \defgroup TetrisPieceRelated Piece: Interface functions
*/
/*@{*/
/*****************************
* construction/destruction *
*****************************/
/**
* constructs a piece with the given attributes
* @param s shape of the piece (see tetris_piece_shape_t)
* @param a its angle (see tetris_piece_angel_t)
* @return pointer to a newly created piece
*/
tetris_piece_t *tetris_piece_construct(tetris_piece_shape_t s,
tetris_piece_angle_t a);
/**
* destructs a piece
* @param pPc pointer to the piece to be destructed
*/
2011-02-06 22:56:26 +00:00
inline static void tetris_piece_destruct(tetris_piece_t *pPc)
{
assert(pPc != NULL);
free(pPc);
}
/***************************
* piece related functions *
***************************/
/**
* returns bitfield representation of the piece
* @param pPc piece from which the bitfield shuld be retrieved
* @return bitfield representation of the piece
*/
uint16_t tetris_piece_getBitmap(tetris_piece_t *pPc);
/**
* rotates a piece
* @param pPc piece to rotate
2010-08-24 23:00:40 +00:00
* @param nRotation type of rotation (see tetris_piece_rotation_t)
*/
void tetris_piece_rotate(tetris_piece_t *pPc,
2010-08-24 23:00:40 +00:00
tetris_piece_rotation_t nRotation);
/**
* changes the shape of a piece
* @param pPc piece to change
* @param shape the shape of interest
*/
2010-12-14 22:58:16 +00:00
inline static void tetris_piece_setShape(tetris_piece_t *pPc,
tetris_piece_shape_t shape)
{
assert(pPc != NULL);
2010-12-15 02:29:51 +00:00
assert(shape <= TETRIS_PC_Z);
2010-12-14 22:58:16 +00:00
pPc->shape = shape;
}
/**
* changes the angle of a piece
* @param pPc piece to change
* @param angle the angle of interest
*/
2010-12-14 22:58:16 +00:00
inline static void tetris_piece_setAngle(tetris_piece_t *pPc,
tetris_piece_angle_t angle)
{
assert(pPc != NULL);
2010-12-15 02:29:51 +00:00
assert(angle <= TETRIS_PC_ANGLE_270);
2010-12-14 22:58:16 +00:00
pPc->angle = angle;
}
/**
* returns the number of different angles
* @param pPc piece whose angle count we want to know
* @return number of different angles
*/
2011-01-30 22:47:44 +00:00
uint8_t tetris_piece_getAngleCount(tetris_piece_t *pPc);
2010-12-15 02:29:51 +00:00
/**
* returns the index of the first filled row of a piece
* @param nBitmap the bitmap of the piece of interest
* @return index of the first filled row
*/
inline static int8_t tetris_piece_getTopRow(uint16_t const nBitmap)
{
if (!(nBitmap & 0x0FFF))
{
return 3; // first three rows can be skipped
}
else if (!(nBitmap & 0x00FF))
{
return 2; // first two rows can be skipped
}
else if (!(nBitmap & 0x000F))
{
return 1; // first row can be skipped
}
return 0; // no row can be skipped
}
/**
* returns the offset to the last filled row of a piece
* @param nBitmap the bitmap of the piece of interest
* @return offset to the last filled row
*/
inline static int8_t tetris_piece_getBottomOffset(uint16_t const nBitmap)
{
if (nBitmap > 0x0FFF)
{
return 3; // piece spans over 4 rows
}
else if (nBitmap > 0x00FF)
{
return 2; // last row of the piece is empty
}
else if (nBitmap > 0x000F)
{
return 1; // last two rows of the piece are empty
}
return 0; // last three rows of the piece are empty
}
/*@}*/
#endif /*TETRIS_PIECE_H_*/