# Tetris (Go + Raylib)

A small, self‑contained Tetris clone written in Go using raylib‑go.
It features classic gameplay (movement, rotation, line clearing, scoring),
a simple menu and game‑over flow, pixel‑art tiles, and embedded audio — all shipped as a single binary via `go:embed`.

## Features

- Classic Tetris gameplay with 7 tetrominoes
- Next piece preview and line clearing with scoring
- Keyboard controls for movement, rotation, and soft drop
- Simple menu and game‑over screens via a tiny state machine
- Embedded sprites, icon, SFX, and background music (no external files at runtime)

## Controls

- Left / Right: Move piece
- Up: Rotate clockwise
- Down (hold): Soft drop (faster fall)
- Enter: Select in menu, restart from game over
- Q: Return to menu from game over

## Scoring

Points are awarded per simultaneous line clear using: `score = L^2 * 100`
where `L` is the number of lines cleared at once.

- 1 line → 100
- 2 lines → 400
- 3 lines → 900
- 4 lines → 1600

## Build and Run

Prerequisites:
- Go (as indicated in `go.mod`)
- A working C toolchain (required by raylib‑go). On Linux you may need basic X11/ALSA dev packages.

### Build

Using `make`

```sh
make
```

Using go directly:

```sh
go build tetris.go
```
### Run

```sh
./tetris
```

## Project Structure

- `tetris.go`: Program entrypoint; initializes window, renderer, audio, and the state machine.
- `assets/`: Embedded resources (sprites, icon, SFX, music) and a compact tile‑font mapping.
- `engine/`: Lightweight helpers for audio, graphics, font/tile rendering, timing, and render context.
- `game/`: Core gameplay (grid, shapes, collision, scoring) and state handlers for `menu`, `gameplay`, and `gameover`.

## Roadmap

- [x] Line clear animations
- [ ] Hard drop and ghost piece
- [ ] Level/speed progression and pause
- [ ] High score persistence
- [ ] Custom key bindings
