PatchworkOS
Loading...
Searching...
No Matches
main.c File Reference
#include <errno.h>
#include <libpatchwork/patchwork.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/proc.h>

Go to the source code of this file.

Macros

#define BLOCK_SIZE   32
 
#define FIELD_PADDING   10
 
#define FIELD_WIDTH   10
 
#define FIELD_HEIGHT   20
 
#define FIELD_LEFT   (FIELD_PADDING)
 
#define FIELD_TOP   (FIELD_PADDING)
 
#define FIELD_RIGHT   (FIELD_PADDING + BLOCK_SIZE * FIELD_WIDTH)
 
#define FIELD_BOTTOM   (FIELD_PADDING + BLOCK_SIZE * FIELD_HEIGHT)
 
#define SIDE_PANEL_PADDING   20
 
#define SIDE_PANEL_WIDTH   220
 
#define SIDE_PANEL_LEFT   (FIELD_RIGHT + FIELD_PADDING)
 
#define SIDE_PANEL_TOP   (FIELD_TOP)
 
#define SIDE_PANEL_RIGHT   (SIDE_PANEL_LEFT + SIDE_PANEL_WIDTH - FIELD_PADDING)
 
#define SIDE_PANEL_BOTTOM   (FIELD_BOTTOM)
 
#define SIDE_PANEL_TEXT_HEIGHT   42
 
#define SIDE_PANEL_LABEL_HEIGHT   42
 
#define SIDE_PANEL_LABEL_PADDING   40
 
#define WINDOW_WIDTH   ((FIELD_WIDTH) * BLOCK_SIZE + FIELD_PADDING * 2 + SIDE_PANEL_WIDTH)
 
#define WINDOW_HEIGHT   ((FIELD_HEIGHT) * BLOCK_SIZE + FIELD_PADDING * 2)
 
#define CURRENT_SCORE_LABEL_ID   0
 
#define COMPLETE_LINES_LABEL_ID   1
 
#define PLAYED_BLOCKS_LABEL_ID   2
 
#define TICK_SPEED   (CLOCKS_PER_SEC)
 
#define DROPPING_TICK_SPEED   (CLOCKS_PER_SEC / 12)
 
#define CLEARING_LINES_TICK_SPEED   (CLOCKS_PER_SEC / 15)
 
#define START_SCREEN_TICK_SPEED   ((CLOCKS_PER_SEC / 4) * 3)
 
#define PIECE_AMOUNT   7
 
#define PIECE_WIDTH   4
 
#define PIECE_HEIGHT   4
 

Typedefs

typedef block_t piece_t[PIECE_HEIGHT][PIECE_WIDTH]
 

Enumerations

enum  block_t {
  BLOCK_INVAL ,
  BLOCK_NONE ,
  BLOCK_CYAN ,
  BLOCK_BLUE ,
  BLOCK_ORANGE ,
  BLOCK_YELLOW ,
  BLOCK_GREEN ,
  BLOCK_PURPLE ,
  BLOCK_RED ,
  BLOCK_CLEARING ,
  BLOCK_OUTLINE
}
 
enum  piece_type_t {
  PIECE_NONE ,
  PIECE_CYAN ,
  PIECE_BLUE ,
  PIECE_ORANGE ,
  PIECE_YELLOW ,
  PIECE_GREEN ,
  PIECE_PURPLE ,
  PIECE_RED
}
 

Functions

static void current_piece_choose_new (void)
 
static void current_piece_clear (element_t *elem, drawable_t *draw)
 
static void current_piece_draw (element_t *elem, drawable_t *draw)
 
static void block_draw (element_t *elem, drawable_t *draw, block_t block, int64_t x, int64_t y)
 
static void side_panel_draw (element_t *elem, drawable_t *draw)
 
static point_t piece_block_pos_in_field (int64_t pieceX, int64_t pieceY, int64_t blockX, int64_t blockY)
 
static bool piece_is_out_of_bounds (const piece_t *piece, int64_t pieceX, int64_t pieceY)
 
static void piece_clear (element_t *elem, drawable_t *draw, const piece_t *piece, uint64_t pieceX, uint64_t pieceY)
 
static void piece_outline_draw (element_t *elem, drawable_t *draw, const piece_t *piece, uint64_t pieceX, uint64_t pieceY)
 
static void piece_draw (element_t *elem, drawable_t *draw, const piece_t *piece, uint64_t pieceX, uint64_t pieceY)
 
static void piece_rotate (piece_t *piece)
 
static void field_edge_draw (element_t *elem, drawable_t *draw)
 
static void field_draw (element_t *elem, drawable_t *draw)
 
static bool field_collides (const piece_t *piece, int64_t pieceX, int64_t pieceY)
 
static void field_add_piece (const piece_t *piece, int64_t pieceX, int64_t pieceY)
 
static void field_move_down (uint64_t line)
 
static void field_clear_lines (element_t *elem, drawable_t *draw)
 
static void field_check_for_lines (element_t *elem, drawable_t *draw)
 
static void pause ()
 
static void start ()
 
static void current_piece_update (element_t *elem, drawable_t *draw)
 
static void current_piece_move (element_t *elem, drawable_t *draw, keycode_t code)
 
static void current_piece_drop (element_t *elem, drawable_t *draw)
 
static void current_piece_rotate (element_t *elem, drawable_t *draw)
 
static void start_tetris_draw (drawable_t *draw)
 
static void start_press_space_draw (element_t *elem, drawable_t *draw)
 
static uint64_t procedure (window_t *win, element_t *elem, const event_t *event)
 
int main (void)
 

Variables

static element_tcurrentScoreLabel
 
static element_tcompleteLinesLabel
 
static element_tplayedBlocksLabel
 
static piece_t pieces []
 
static block_t field [FIELD_HEIGHT][FIELD_WIDTH]
 
static block_t oldField [FIELD_HEIGHT][FIELD_WIDTH]
 
static uint64_t currentScore
 
static uint64_t completedLines
 
static uint64_t playedBlocks
 
static uint64_t oldCurrentScore
 
static uint64_t oldCompletedLines
 
static uint64_t oldPlayedBlocks
 
static bool isClearingLines
 
static bool isStarted
 
static bool isGameover
 
static font_tlargeFont
 
static font_tmassiveFont
 
struct { 
 
   piece_t   piece 
 
   int64_t   x 
 
   int64_t   y 
 
   bool   isDropping 
 
currentPiece 
 
static const pixel_t normalColors []
 
static const pixel_t highlightColors []
 
static const pixel_t shadowColors []
 

Macro Definition Documentation

◆ BLOCK_SIZE

#define BLOCK_SIZE   32

Definition at line 10 of file main.c.

◆ CLEARING_LINES_TICK_SPEED

#define CLEARING_LINES_TICK_SPEED   (CLOCKS_PER_SEC / 15)

Definition at line 39 of file main.c.

◆ COMPLETE_LINES_LABEL_ID

#define COMPLETE_LINES_LABEL_ID   1

Definition at line 34 of file main.c.

◆ CURRENT_SCORE_LABEL_ID

#define CURRENT_SCORE_LABEL_ID   0

Definition at line 33 of file main.c.

◆ DROPPING_TICK_SPEED

#define DROPPING_TICK_SPEED   (CLOCKS_PER_SEC / 12)

Definition at line 38 of file main.c.

◆ FIELD_BOTTOM

#define FIELD_BOTTOM   (FIELD_PADDING + BLOCK_SIZE * FIELD_HEIGHT)

Definition at line 18 of file main.c.

◆ FIELD_HEIGHT

#define FIELD_HEIGHT   20

Definition at line 14 of file main.c.

◆ FIELD_LEFT

#define FIELD_LEFT   (FIELD_PADDING)

Definition at line 15 of file main.c.

◆ FIELD_PADDING

#define FIELD_PADDING   10

Definition at line 12 of file main.c.

◆ FIELD_RIGHT

#define FIELD_RIGHT   (FIELD_PADDING + BLOCK_SIZE * FIELD_WIDTH)

Definition at line 17 of file main.c.

◆ FIELD_TOP

#define FIELD_TOP   (FIELD_PADDING)

Definition at line 16 of file main.c.

◆ FIELD_WIDTH

#define FIELD_WIDTH   10

Definition at line 13 of file main.c.

◆ PIECE_AMOUNT

#define PIECE_AMOUNT   7

Definition at line 42 of file main.c.

◆ PIECE_HEIGHT

#define PIECE_HEIGHT   4

Definition at line 44 of file main.c.

◆ PIECE_WIDTH

#define PIECE_WIDTH   4

Definition at line 43 of file main.c.

◆ PLAYED_BLOCKS_LABEL_ID

#define PLAYED_BLOCKS_LABEL_ID   2

Definition at line 35 of file main.c.

◆ SIDE_PANEL_BOTTOM

#define SIDE_PANEL_BOTTOM   (FIELD_BOTTOM)

Definition at line 25 of file main.c.

◆ SIDE_PANEL_LABEL_HEIGHT

#define SIDE_PANEL_LABEL_HEIGHT   42

Definition at line 27 of file main.c.

◆ SIDE_PANEL_LABEL_PADDING

#define SIDE_PANEL_LABEL_PADDING   40

Definition at line 28 of file main.c.

◆ SIDE_PANEL_LEFT

#define SIDE_PANEL_LEFT   (FIELD_RIGHT + FIELD_PADDING)

Definition at line 22 of file main.c.

◆ SIDE_PANEL_PADDING

#define SIDE_PANEL_PADDING   20

Definition at line 20 of file main.c.

◆ SIDE_PANEL_RIGHT

#define SIDE_PANEL_RIGHT   (SIDE_PANEL_LEFT + SIDE_PANEL_WIDTH - FIELD_PADDING)

Definition at line 24 of file main.c.

◆ SIDE_PANEL_TEXT_HEIGHT

#define SIDE_PANEL_TEXT_HEIGHT   42

Definition at line 26 of file main.c.

◆ SIDE_PANEL_TOP

#define SIDE_PANEL_TOP   (FIELD_TOP)

Definition at line 23 of file main.c.

◆ SIDE_PANEL_WIDTH

#define SIDE_PANEL_WIDTH   220

Definition at line 21 of file main.c.

◆ START_SCREEN_TICK_SPEED

#define START_SCREEN_TICK_SPEED   ((CLOCKS_PER_SEC / 4) * 3)

Definition at line 40 of file main.c.

◆ TICK_SPEED

#define TICK_SPEED   (CLOCKS_PER_SEC)

Definition at line 37 of file main.c.

◆ WINDOW_HEIGHT

#define WINDOW_HEIGHT   ((FIELD_HEIGHT) * BLOCK_SIZE + FIELD_PADDING * 2)

Definition at line 31 of file main.c.

◆ WINDOW_WIDTH

#define WINDOW_WIDTH   ((FIELD_WIDTH) * BLOCK_SIZE + FIELD_PADDING * 2 + SIDE_PANEL_WIDTH)

Definition at line 30 of file main.c.

Typedef Documentation

◆ piece_t

typedef block_t piece_t[PIECE_HEIGHT][PIECE_WIDTH]

Definition at line 65 of file main.c.

Enumeration Type Documentation

◆ block_t

enum block_t
Enumerator
BLOCK_INVAL 
BLOCK_NONE 
BLOCK_CYAN 
BLOCK_BLUE 
BLOCK_ORANGE 
BLOCK_YELLOW 
BLOCK_GREEN 
BLOCK_PURPLE 
BLOCK_RED 
BLOCK_CLEARING 
BLOCK_OUTLINE 

Definition at line 50 of file main.c.

◆ piece_type_t

Enumerator
PIECE_NONE 
PIECE_CYAN 
PIECE_BLUE 
PIECE_ORANGE 
PIECE_YELLOW 
PIECE_GREEN 
PIECE_PURPLE 
PIECE_RED 

Definition at line 67 of file main.c.

Function Documentation

◆ block_draw()

◆ current_piece_choose_new()

static void current_piece_choose_new ( void  )
static

Definition at line 566 of file main.c.

References currentPiece, field_collides(), isGameover, memcpy(), pause(), PIECE_AMOUNT, pieces, playedBlocks, and rand().

Referenced by current_piece_update(), and start().

◆ current_piece_clear()

static void current_piece_clear ( element_t elem,
drawable_t draw 
)
static

◆ current_piece_draw()

static void current_piece_draw ( element_t elem,
drawable_t draw 
)
static

◆ current_piece_drop()

static void current_piece_drop ( element_t elem,
drawable_t draw 
)
static

◆ current_piece_move()

static void current_piece_move ( element_t elem,
drawable_t draw,
keycode_t  code 
)
static

◆ current_piece_rotate()

static void current_piece_rotate ( element_t elem,
drawable_t draw 
)
static

◆ current_piece_update()

static void current_piece_update ( element_t elem,
drawable_t draw 
)
static

◆ field_add_piece()

static void field_add_piece ( const piece_t piece,
int64_t  pieceX,
int64_t  pieceY 
)
static

◆ field_check_for_lines()

static void field_check_for_lines ( element_t elem,
drawable_t draw 
)
static

◆ field_clear_lines()

static void field_clear_lines ( element_t elem,
drawable_t draw 
)
static

◆ field_collides()

◆ field_draw()

static void field_draw ( element_t elem,
drawable_t draw 
)
static

Definition at line 355 of file main.c.

References block_draw(), field, FIELD_HEIGHT, FIELD_WIDTH, oldField, x, and y.

Referenced by field_check_for_lines(), field_clear_lines(), and procedure().

◆ field_edge_draw()

◆ field_move_down()

static void field_move_down ( uint64_t  line)
static

Definition at line 415 of file main.c.

References BLOCK_NONE, field, FIELD_WIDTH, memcpy(), x, and y.

Referenced by field_clear_lines().

◆ main()

◆ pause()

static void pause ( )
static

◆ piece_block_pos_in_field()

static point_t piece_block_pos_in_field ( int64_t  pieceX,
int64_t  pieceY,
int64_t  blockX,
int64_t  blockY 
)
static

◆ piece_clear()

static void piece_clear ( element_t elem,
drawable_t draw,
const piece_t piece,
uint64_t  pieceX,
uint64_t  pieceY 
)
static

◆ piece_draw()

static void piece_draw ( element_t elem,
drawable_t draw,
const piece_t piece,
uint64_t  pieceX,
uint64_t  pieceY 
)
static

◆ piece_is_out_of_bounds()

◆ piece_outline_draw()

static void piece_outline_draw ( element_t elem,
drawable_t draw,
const piece_t piece,
uint64_t  pieceX,
uint64_t  pieceY 
)
static

◆ piece_rotate()

static void piece_rotate ( piece_t piece)
static

Definition at line 329 of file main.c.

Referenced by current_piece_rotate().

◆ procedure()

static uint64_t procedure ( window_t win,
element_t elem,
const event_t event 
)
static

◆ side_panel_draw()

◆ start()

◆ start_press_space_draw()

static void start_press_space_draw ( element_t elem,
drawable_t draw 
)
static

◆ start_tetris_draw()

Variable Documentation

◆ completedLines

uint64_t completedLines
static

Definition at line 135 of file main.c.

Referenced by field_check_for_lines(), procedure(), and start().

◆ completeLinesLabel

element_t* completeLinesLabel
static

Definition at line 47 of file main.c.

Referenced by procedure().

◆ [struct]

◆ currentScore

uint64_t currentScore
static

Definition at line 134 of file main.c.

Referenced by field_check_for_lines(), procedure(), and start().

◆ currentScoreLabel

element_t* currentScoreLabel
static

Definition at line 46 of file main.c.

Referenced by procedure().

◆ field

◆ highlightColors

const pixel_t highlightColors[]
static
Initial value:
= {
[BLOCK_NONE] = PIXEL_ARGB(0xFF, 0x00, 0x00, 0x00),
[BLOCK_CYAN] = PIXEL_ARGB(0xFF, 0x98, 0xF5, 0xFF),
[BLOCK_BLUE] = PIXEL_ARGB(0xFF, 0x98, 0xB9, 0xFF),
[BLOCK_ORANGE] = PIXEL_ARGB(0xFF, 0xFF, 0xBF, 0x98),
[BLOCK_YELLOW] = PIXEL_ARGB(0xFF, 0xFF, 0xF3, 0x98),
[BLOCK_GREEN] = PIXEL_ARGB(0xFF, 0x98, 0xFF, 0xB3),
[BLOCK_PURPLE] = PIXEL_ARGB(0xFF, 0xED, 0x98, 0xFF),
[BLOCK_RED] = PIXEL_ARGB(0xFF, 0xFF, 0x98, 0xB9),
[BLOCK_CLEARING] = PIXEL_ARGB(0xFF, 0xFF, 0xFF, 0xFF),
[BLOCK_OUTLINE] = PIXEL_ARGB(0xFF, 0xEE, 0xEE, 0xEE),
}
#define PIXEL_ARGB(a, r, g, b)
Definition pixel.h:18
@ BLOCK_OUTLINE
Definition main.c:62
@ BLOCK_YELLOW
Definition main.c:57
@ BLOCK_NONE
Definition main.c:53
@ BLOCK_CLEARING
Definition main.c:61
@ BLOCK_BLUE
Definition main.c:55
@ BLOCK_CYAN
Definition main.c:54
@ BLOCK_PURPLE
Definition main.c:59
@ BLOCK_GREEN
Definition main.c:58
@ BLOCK_RED
Definition main.c:60
@ BLOCK_ORANGE
Definition main.c:56

Definition at line 169 of file main.c.

Referenced by block_draw().

◆ isClearingLines

bool isClearingLines
static

Definition at line 142 of file main.c.

Referenced by field_check_for_lines(), field_clear_lines(), pause(), procedure(), and start().

◆ isDropping

bool isDropping

Definition at line 154 of file main.c.

◆ isGameover

bool isGameover
static

Definition at line 144 of file main.c.

Referenced by current_piece_choose_new(), pause(), procedure(), and start().

◆ isStarted

bool isStarted
static

Definition at line 143 of file main.c.

Referenced by pause(), procedure(), and start().

◆ largeFont

font_t* largeFont
static

Definition at line 146 of file main.c.

Referenced by main(), procedure(), side_panel_draw(), and start_press_space_draw().

◆ massiveFont

font_t* massiveFont
static

Definition at line 147 of file main.c.

Referenced by main(), and start_tetris_draw().

◆ normalColors

const pixel_t normalColors[]
static
Initial value:
= {
[BLOCK_NONE] = PIXEL_ARGB(0xFF, 0x00, 0x00, 0x00),
[BLOCK_CYAN] = PIXEL_ARGB(0xFF, 0x00, 0xE5, 0xFF),
[BLOCK_BLUE] = PIXEL_ARGB(0xFF, 0x00, 0x55, 0xFF),
[BLOCK_ORANGE] = PIXEL_ARGB(0xFF, 0xFF, 0x7A, 0x00),
[BLOCK_YELLOW] = PIXEL_ARGB(0xFF, 0xFF, 0xE1, 0x00),
[BLOCK_GREEN] = PIXEL_ARGB(0xFF, 0x00, 0xFF, 0x4D),
[BLOCK_PURPLE] = PIXEL_ARGB(0xFF, 0xD2, 0x00, 0xFF),
[BLOCK_RED] = PIXEL_ARGB(0xFF, 0xFF, 0x00, 0x55),
[BLOCK_CLEARING] = PIXEL_ARGB(0xFF, 0xFF, 0xFF, 0xFF),
[BLOCK_OUTLINE] = PIXEL_ARGB(0xFF, 0x00, 0x00, 0x00),
}

Definition at line 157 of file main.c.

Referenced by block_draw(), start_press_space_draw(), and start_tetris_draw().

◆ oldCompletedLines

uint64_t oldCompletedLines
static

Definition at line 139 of file main.c.

Referenced by procedure().

◆ oldCurrentScore

uint64_t oldCurrentScore
static

Definition at line 138 of file main.c.

Referenced by procedure().

◆ oldField

block_t oldField[FIELD_HEIGHT][FIELD_WIDTH]
static

Definition at line 132 of file main.c.

Referenced by field_draw(), pause(), and start().

◆ oldPlayedBlocks

uint64_t oldPlayedBlocks
static

Definition at line 140 of file main.c.

Referenced by procedure().

◆ piece

◆ pieces

piece_t pieces[]
static

Definition at line 79 of file main.c.

Referenced by current_piece_choose_new().

◆ playedBlocks

uint64_t playedBlocks
static

Definition at line 136 of file main.c.

Referenced by current_piece_choose_new(), procedure(), and start().

◆ playedBlocksLabel

element_t* playedBlocksLabel
static

Definition at line 48 of file main.c.

Referenced by procedure().

◆ shadowColors

const pixel_t shadowColors[]
static
Initial value:
= {
[BLOCK_NONE] = PIXEL_ARGB(0xFF, 0x00, 0x00, 0x00),
[BLOCK_CYAN] = PIXEL_ARGB(0xFF, 0x00, 0x7A, 0x8C),
[BLOCK_BLUE] = PIXEL_ARGB(0xFF, 0x00, 0x2A, 0x8C),
[BLOCK_ORANGE] = PIXEL_ARGB(0xFF, 0x8C, 0x46, 0x00),
[BLOCK_YELLOW] = PIXEL_ARGB(0xFF, 0x8C, 0x7D, 0x00),
[BLOCK_GREEN] = PIXEL_ARGB(0xFF, 0x00, 0x8C, 0x2A),
[BLOCK_PURPLE] = PIXEL_ARGB(0xFF, 0x75, 0x00, 0x8C),
[BLOCK_RED] = PIXEL_ARGB(0xFF, 0x8C, 0x00, 0x2A),
[BLOCK_CLEARING] = PIXEL_ARGB(0xFF, 0xFF, 0xFF, 0xFF),
[BLOCK_OUTLINE] = PIXEL_ARGB(0xFF, 0xEE, 0xEE, 0xEE),
}

Definition at line 181 of file main.c.

Referenced by block_draw().

◆ x

◆ y