#define FLD_SIZE_Y 22 #define FLD_SIZE_X 10 #define FLD_BOUND_Y FLD_SIZE_Y + 3 #define FLD_BOUND_X FLD_SIZE_X struct cell { char a; // active/empty state of cell sfColor fColor; // fill color }; /* * field + shape coord system * y * ^. . . . . . . * |. . . . . . . * |. . . . . . . * |. . y . . . . * |. . ^ . . . . * |. . | . . . . * |. . | . . . . * |. . 0------>x * |. . . . . . . * |. . . . . . . * 0------------->x * */ struct shape { int x; // x coord of shape's left side int y; // y coord of shape's bottom int t; // shape type sfColor fColor; // shape color char c[4][4]; // array of logic shape cells sfRectangleShape *p[4][4]; // array of physical shape cells int cOutThick; // shape rectangles outline thickness sfVector2f cSize; // shape rectangles size variable x/y }; struct field { sfVector2i pos; sfColor fColor; // shape color struct cell c[FLD_BOUND_Y][FLD_SIZE_X]; // array of logic shape cells sfRectangleShape *p[FLD_BOUND_Y][FLD_SIZE_X]; // array of physical shape cells int cOutThick; // Field rectangles outline thickness sfVector2f cSize; // shape rectangles size variable x/y sfVector2i size; sfVector2i bound; }; void init_field(struct field *fld); void colorize_field(struct field *fld); void colorize_field_random(struct field *fld); void colorize_active_shape(struct field *fld, struct shape *shape); void init_next_shape(struct shape *next); void putShape(struct field *fld, struct shape *active); int out_of_field(struct field *fld, struct shape *active); void load_shape(struct shape *shape); void rotate_shape(struct field *fld, struct shape *shape); int collide(struct field *fld, struct shape *active); void resetActiveShape(struct field *fld, struct shape *active); void gen_shape(struct shape *shape); int rm_lines(struct field *fld); void free_field(struct field *fld); void free_shape(struct shape *shape);