Compare commits
145 Commits
26bdb27209
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 60d6a9e740 | |||
| e1921858ed | |||
| 14cb96345c | |||
| d28feb3276 | |||
| a7a3ae9055 | |||
| 5ec4bf926b | |||
| 0e04617968 | |||
| b450e2af21 | |||
| a65756f298 | |||
| dac312ef2b | |||
| 953d6af701 | |||
| c14e305a4a | |||
| fb036dede5 | |||
| 3c9dc0ff65 | |||
| d3ca238a51 | |||
| a729dc089e | |||
| 18463774e9 | |||
| 694243ac89 | |||
| 60ddc9ddd3 | |||
| 70946fc720 | |||
| fb82ac06d0 | |||
| 494f906435 | |||
| 50c869536d | |||
| 0b99911f5d | |||
| 33d5eedec8 | |||
| 744268fedd | |||
| 06aa63f548 | |||
| a9943ce8bf | |||
| b46af7ab1d | |||
| ab22d4c34f | |||
| e2d6ea64a4 | |||
| 322744c296 | |||
| cf3e897752 | |||
| 4efb60bb5b | |||
| afd7fdf18d | |||
| 5b9eb5f0e3 | |||
| 09c8d3c0ef | |||
| a6c2c78cb5 | |||
| 18c29fed1e | |||
| f3064e9dad | |||
| a1f16a7d94 | |||
| eb9822dac7 | |||
| 6c48af0bec | |||
| b69b090e45 | |||
| ad014e1de0 | |||
| 9a3c1a0688 | |||
| 970259e3d6 | |||
| 34447f0245 | |||
| fd29ae271e | |||
| 737dc71d8c | |||
| 8a4dc2771d | |||
| 212dd4c404 | |||
| a520de6c1f | |||
| 38dbc17ace | |||
| 783c12790d | |||
| 64fce596ce | |||
| adf418dff9 | |||
| fe0cd289e2 | |||
| 989b98002c | |||
| 0ab7121c5b | |||
| 492abc09bc | |||
| fe6c5e3c8a | |||
| 122de2b36f | |||
| a671825502 | |||
| cecf5cf68e | |||
| 3264672be0 | |||
| 29c1d6b745 | |||
| 81586aa768 | |||
| ec086b2cd4 | |||
| 8be2d68b98 | |||
| b0cec977a5 | |||
| 41d39b9bf7 | |||
| 9e0e1b2873 | |||
| afcc1dd77d | |||
| d53a1cde34 | |||
| 8569b467e0 | |||
| 5a755e9995 | |||
| 1e97b3cfa3 | |||
| b9791589f2 | |||
| 108caf7ffd | |||
| 3c6466e2a0 | |||
| d2fa5b2782 | |||
| d1d0d891fa | |||
| ea74af146d | |||
| e8a7b19213 | |||
| 57eac01bcb | |||
| 815913b15b | |||
| 972588fa59 | |||
| 9d989ab395 | |||
| a74d7135e6 | |||
| e27d1b60b1 | |||
| 12bc4870b1 | |||
| 2b4b07ae6a | |||
| 24779755a5 | |||
| d2ba311c5f | |||
| f5424e8f72 | |||
| 5a95c9180c | |||
| 59dc3a1638 | |||
| 262ae49496 | |||
| ec9eb45cc3 | |||
| 1355ce49fe | |||
| 8a549d14dc | |||
| 12110bd8b4 | |||
| f086ed3021 | |||
| f24d484496 | |||
| 26b4454eea | |||
| b531bbc798 | |||
| cb8293175b | |||
| fff14fe3e1 | |||
| ffdb67ce9b | |||
| b44de25113 | |||
| 294e935344 | |||
| 383b2e48ec | |||
| cfbb4e4c86 | |||
| 9d89106275 | |||
| ace2e6acdc | |||
| e35aeee5ab | |||
| b46246b74f | |||
| 7f07036f07 | |||
| da32b5be1a | |||
| d206b7b1af | |||
| 69b3a60564 | |||
| dc8a317837 | |||
| dd0ac54ee5 | |||
| 33994ec9db | |||
| 344a27a336 | |||
| 0e4064a187 | |||
| 59a9915570 | |||
| 9ea0183339 | |||
| 55c40f0516 | |||
| 588f870b26 | |||
| fc828dbdbc | |||
| e11a33e3e6 | |||
| 5fd77fdaf0 | |||
| 69b2521695 | |||
| 98b7711100 | |||
| 8b350bfb9e | |||
| 8279ccbe6d | |||
| 332e2efb74 | |||
| a7d67b26a5 | |||
| 907c645ea3 | |||
| deca3731f1 | |||
| 813500878a | |||
| bc28a61fad | |||
| ff8cada8b4 |
168
.copilot-rules.md
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
# Copilot Rules — Spacetris (SDL3 / C++20)
|
||||||
|
|
||||||
|
These rules define **non-negotiable constraints** for all AI-assisted changes.
|
||||||
|
They exist to preserve determinism, performance, and architecture.
|
||||||
|
|
||||||
|
If these rules conflict with `.github/copilot-instructions.md`,
|
||||||
|
**follow `.github/copilot-instructions.md`.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Project Constraints (Non-Negotiable)
|
||||||
|
|
||||||
|
- Language: **C++20**
|
||||||
|
- Runtime: **SDL3** + **SDL3_ttf**
|
||||||
|
- Build system: **CMake**
|
||||||
|
- Dependencies via **vcpkg**
|
||||||
|
- Assets must use **relative paths only**
|
||||||
|
- Deterministic gameplay logic is mandatory
|
||||||
|
|
||||||
|
Do not rewrite or refactor working systems unless explicitly requested.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Repo Layout & Responsibilities
|
||||||
|
|
||||||
|
- Core gameplay loop/state: `src/Game.*`
|
||||||
|
- Entry point: `src/main.cpp`
|
||||||
|
- Text/TTF: `src/Font.*`
|
||||||
|
- Audio: `src/Audio.*`, `src/SoundEffect.*`
|
||||||
|
- Effects: `src/LineEffect.*`, `src/Starfield*.cpp`
|
||||||
|
- High scores: `src/Scores.*`
|
||||||
|
- Packaging: `build-production.ps1`
|
||||||
|
|
||||||
|
When adding a module:
|
||||||
|
- Place it under `src/` (or an established subfolder)
|
||||||
|
- Register it in `CMakeLists.txt`
|
||||||
|
- Avoid circular includes
|
||||||
|
- Keep headers minimal
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Build & Verification
|
||||||
|
|
||||||
|
Prefer existing scripts:
|
||||||
|
|
||||||
|
- Debug: `cmake --build build-msvc --config Debug`
|
||||||
|
- Release:
|
||||||
|
- Configure: `cmake -S . -B build-release -DCMAKE_BUILD_TYPE=Release`
|
||||||
|
- Build: `cmake --build build-release --config Release`
|
||||||
|
- Packaging (Windows): `./build-production.ps1`
|
||||||
|
|
||||||
|
Before finalizing changes:
|
||||||
|
- Debug build must succeed
|
||||||
|
- Packaging must succeed if assets or DLLs are touched
|
||||||
|
|
||||||
|
Do not introduce new build steps unless required.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Coding & Architecture Rules
|
||||||
|
|
||||||
|
- Match local file style (naming, braces, spacing)
|
||||||
|
- Avoid large refactors
|
||||||
|
- Prefer small, testable helpers
|
||||||
|
- Avoid floating-point math in core gameplay state
|
||||||
|
- Game logic must be deterministic
|
||||||
|
- Rendering code must not mutate game state
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Rendering & Performance Rules
|
||||||
|
|
||||||
|
- Do not allocate memory per frame
|
||||||
|
- Do not load assets during rendering
|
||||||
|
- No blocking calls in render loop
|
||||||
|
- Visual effects must be time-based (`deltaTime`)
|
||||||
|
- Rendering must not contain gameplay logic
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Threading Rules
|
||||||
|
|
||||||
|
- SDL main thread:
|
||||||
|
- Rendering
|
||||||
|
- Input
|
||||||
|
- Game simulation
|
||||||
|
- Networking must be **non-blocking** from the SDL main loop
|
||||||
|
- Either run networking on a separate thread, or poll ENet frequently with a 0 timeout
|
||||||
|
- Never wait/spin for remote inputs on the render thread
|
||||||
|
- Cross-thread communication via queues or buffers only
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Assets, Fonts, and Paths
|
||||||
|
|
||||||
|
- Runtime expects adjacent `assets/` directory
|
||||||
|
- `FreeSans.ttf` must remain at repo root
|
||||||
|
- New assets:
|
||||||
|
- Go under `assets/`
|
||||||
|
- Must be included in `build-production.ps1`
|
||||||
|
|
||||||
|
Never hardcode machine-specific paths.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## AI Partner (COOPERATE Mode)
|
||||||
|
|
||||||
|
- AI is **supportive**, not competitive
|
||||||
|
- AI must respect sync timing and shared grid logic
|
||||||
|
- AI must not “cheat” or see hidden future pieces
|
||||||
|
- AI behavior must be deterministic per seed/difficulty
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Networking (COOPERATE Network Mode)
|
||||||
|
|
||||||
|
Follow `docs/ai/cooperate_network.md`.
|
||||||
|
If `network_cooperate_multiplayer.md` exists, keep it consistent with the canonical doc.
|
||||||
|
|
||||||
|
Mandatory model:
|
||||||
|
- **Input lockstep**
|
||||||
|
- Transmit inputs only (no board state replication)
|
||||||
|
|
||||||
|
Determinism requirements:
|
||||||
|
- Fixed tick (e.g. 60 Hz)
|
||||||
|
- Shared RNG seed
|
||||||
|
- Deterministic gravity, rotation, locking, scoring
|
||||||
|
|
||||||
|
Technology:
|
||||||
|
- Use **ENet**
|
||||||
|
- Do NOT use SDL_net or TCP-only networking
|
||||||
|
|
||||||
|
Architecture:
|
||||||
|
- Networking must be isolated (e.g. `src/network/NetSession.*`)
|
||||||
|
- Game logic must not care if partner is local, AI, or network
|
||||||
|
|
||||||
|
Robustness:
|
||||||
|
- Input delay buffer (4–6 ticks)
|
||||||
|
- Periodic desync hashing
|
||||||
|
- Graceful disconnect handling
|
||||||
|
|
||||||
|
Do NOT implement:
|
||||||
|
- Rollback
|
||||||
|
- Full state sync
|
||||||
|
- Server-authoritative sim
|
||||||
|
- Matchmaking SDKs
|
||||||
|
- Versus mechanics
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Agent Behavior Rules (IMPORTANT)
|
||||||
|
|
||||||
|
- Always read relevant markdown specs **before coding**
|
||||||
|
- Treat markdown specs as authoritative
|
||||||
|
- Do not invent APIs
|
||||||
|
- Do not assume external libraries exist
|
||||||
|
- Generate code **file by file**, not everything at once
|
||||||
|
- Ask before changing architecture or ownership boundaries
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## When to Ask Before Proceeding
|
||||||
|
|
||||||
|
Ask the maintainer if unclear:
|
||||||
|
- UX or menu flow decisions
|
||||||
|
- Adding dependencies
|
||||||
|
- Refactors vs local patches
|
||||||
|
- Platform-specific behavior
|
||||||
6
.github/copilot-instructions.md
vendored
@ -1,4 +1,4 @@
|
|||||||
# Copilot Instructions — Tetris (C++ SDL3)
|
# Copilot Instructions — Spacetris (C++ SDL3)
|
||||||
|
|
||||||
Purpose: Speed up development on this native SDL3 Tetris. Follow these conventions to keep builds reproducible and packages shippable.
|
Purpose: Speed up development on this native SDL3 Tetris. Follow these conventions to keep builds reproducible and packages shippable.
|
||||||
|
|
||||||
@ -9,11 +9,9 @@ Purpose: Speed up development on this native SDL3 Tetris. Follow these conventio
|
|||||||
- Assets: `assets/` (images/music/fonts), plus `FreeSans.ttf` at repo root.
|
- Assets: `assets/` (images/music/fonts), plus `FreeSans.ttf` at repo root.
|
||||||
|
|
||||||
## Build and run
|
## Build and run
|
||||||
- Configure and build Release:
|
|
||||||
- CMake picks up vcpkg toolchain if found (`VCPKG_ROOT`, local `vcpkg/`, or user path). Required packages: `sdl3`, `sdl3-ttf` (see `vcpkg.json`).
|
- CMake picks up vcpkg toolchain if found (`VCPKG_ROOT`, local `vcpkg/`, or user path). Required packages: `sdl3`, `sdl3-ttf` (see `vcpkg.json`).
|
||||||
- Typical sequence (PowerShell): `cmake -S . -B build-release -DCMAKE_BUILD_TYPE=Release` then `cmake --build build-release --config Release`.
|
- Typical sequence (PowerShell): `cmake -S . -B build-release -DCMAKE_BUILD_TYPE=Release` then `cmake --build build-release --config Release`.
|
||||||
- Packaging: `.\build-production.ps1` creates `dist/TetrisGame/` with exe, DLLs, assets, README, and ZIP; it can clean via `-Clean` and package-only via `-PackageOnly`.
|
Packaging: `.\build-production.ps1` creates `dist/SpacetrisGame/` with exe, DLLs, assets, README, and ZIP; it can clean via `-Clean` and package-only via `-PackageOnly`.
|
||||||
- MSVC generator builds are under `build-msvc/` when using Visual Studio.
|
|
||||||
|
|
||||||
## Runtime dependencies
|
## Runtime dependencies
|
||||||
- Links: `SDL3::SDL3`, `SDL3_ttf::SDL3_ttf`; on Windows also `mfplat`, `mfreadwrite`, `mfuuid` for media.
|
- Links: `SDL3::SDL3`, `SDL3_ttf::SDL3_ttf`; on Windows also `mfplat`, `mfreadwrite`, `mfuuid` for media.
|
||||||
|
|||||||
36
.github/workflows/build.yml
vendored
@ -1,4 +1,4 @@
|
|||||||
name: Build and Package Tetris
|
name: Build and Package Spacetris
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
@ -43,20 +43,20 @@ jobs:
|
|||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: tetris-windows-x64
|
name: spacetris-windows-x64
|
||||||
path: dist/TetrisGame/
|
path: dist/SpacetrisGame/
|
||||||
|
|
||||||
- name: Create Release ZIP
|
- name: Create Release ZIP
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
run: |
|
run: |
|
||||||
cd dist
|
cd dist
|
||||||
7z a ../TetrisGame-Windows-x64.zip TetrisGame/
|
7z a ../SpacetrisGame-Windows-x64.zip SpacetrisGame/
|
||||||
|
|
||||||
- name: Release
|
- name: Release
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
files: TetrisGame-Windows-x64.zip
|
files: SpacetrisGame-Windows-x64.zip
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
@ -83,32 +83,32 @@ jobs:
|
|||||||
|
|
||||||
- name: Package
|
- name: Package
|
||||||
run: |
|
run: |
|
||||||
mkdir -p dist/TetrisGame-Linux
|
mkdir -p dist/SpacetrisGame-Linux
|
||||||
cp build/tetris dist/TetrisGame-Linux/
|
cp build/spacetris dist/SpacetrisGame-Linux/
|
||||||
cp -r assets dist/TetrisGame-Linux/
|
cp -r assets dist/SpacetrisGame-Linux/
|
||||||
cp FreeSans.ttf dist/TetrisGame-Linux/
|
cp FreeSans.ttf dist/SpacetrisGame-Linux/
|
||||||
echo '#!/bin/bash' > dist/TetrisGame-Linux/launch-tetris.sh
|
echo '#!/bin/bash' > dist/SpacetrisGame-Linux/launch-spacetris.sh
|
||||||
echo 'cd "$(dirname "$0")"' >> dist/TetrisGame-Linux/launch-tetris.sh
|
echo 'cd "$(dirname "$0")"' >> dist/SpacetrisGame-Linux/launch-spacetris.sh
|
||||||
echo './tetris' >> dist/TetrisGame-Linux/launch-tetris.sh
|
echo './spacetris' >> dist/SpacetrisGame-Linux/launch-spacetris.sh
|
||||||
chmod +x dist/TetrisGame-Linux/launch-tetris.sh
|
chmod +x dist/SpacetrisGame-Linux/launch-spacetris.sh
|
||||||
chmod +x dist/TetrisGame-Linux/tetris
|
chmod +x dist/SpacetrisGame-Linux/spacetris
|
||||||
|
|
||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: tetris-linux-x64
|
name: spacetris-linux-x64
|
||||||
path: dist/TetrisGame-Linux/
|
path: dist/SpacetrisGame-Linux/
|
||||||
|
|
||||||
- name: Create Release TAR
|
- name: Create Release TAR
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
run: |
|
run: |
|
||||||
cd dist
|
cd dist
|
||||||
tar -czf ../TetrisGame-Linux-x64.tar.gz TetrisGame-Linux/
|
tar -czf ../SpacetrisGame-Linux-x64.tar.gz SpacetrisGame-Linux/
|
||||||
|
|
||||||
- name: Release
|
- name: Release
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
files: TetrisGame-Linux-x64.tar.gz
|
files: SpacetrisGame-Linux-x64.tar.gz
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
5
.gitignore
vendored
@ -1,4 +1,4 @@
|
|||||||
# .gitignore for Tetris (native C++ project and web subproject)
|
# .gitignore for Spacetris (native C++ project and web subproject)
|
||||||
|
|
||||||
# Visual Studio / VS artifacts
|
# Visual Studio / VS artifacts
|
||||||
.vs/
|
.vs/
|
||||||
@ -70,4 +70,7 @@ dist_package/
|
|||||||
# Local environment files (if any)
|
# Local environment files (if any)
|
||||||
.env
|
.env
|
||||||
|
|
||||||
|
# Ignore local settings file
|
||||||
|
settings.ini
|
||||||
|
|
||||||
# End of .gitignore
|
# End of .gitignore
|
||||||
|
|||||||
117
CMakeLists.txt
@ -15,7 +15,7 @@ if(DEFINED CMAKE_TOOLCHAIN_FILE)
|
|||||||
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" CACHE STRING "" FORCE)
|
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" CACHE STRING "" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(tetris_sdl3 LANGUAGES CXX)
|
project(spacetris_sdl3 LANGUAGES CXX)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
@ -28,10 +28,14 @@ find_package(SDL3_ttf CONFIG REQUIRED)
|
|||||||
find_package(SDL3_image CONFIG REQUIRED)
|
find_package(SDL3_image CONFIG REQUIRED)
|
||||||
find_package(cpr CONFIG REQUIRED)
|
find_package(cpr CONFIG REQUIRED)
|
||||||
find_package(nlohmann_json CONFIG REQUIRED)
|
find_package(nlohmann_json CONFIG REQUIRED)
|
||||||
|
find_package(unofficial-enet CONFIG REQUIRED)
|
||||||
|
|
||||||
add_executable(tetris
|
set(TETRIS_SOURCES
|
||||||
src/main.cpp
|
src/main.cpp
|
||||||
|
src/app/TetrisApp.cpp
|
||||||
src/gameplay/core/Game.cpp
|
src/gameplay/core/Game.cpp
|
||||||
|
src/gameplay/coop/CoopGame.cpp
|
||||||
|
src/gameplay/coop/CoopAIController.cpp
|
||||||
src/core/GravityManager.cpp
|
src/core/GravityManager.cpp
|
||||||
src/core/state/StateManager.cpp
|
src/core/state/StateManager.cpp
|
||||||
# New core architecture classes
|
# New core architecture classes
|
||||||
@ -42,25 +46,73 @@ add_executable(tetris
|
|||||||
src/core/Settings.cpp
|
src/core/Settings.cpp
|
||||||
src/graphics/renderers/RenderManager.cpp
|
src/graphics/renderers/RenderManager.cpp
|
||||||
src/persistence/Scores.cpp
|
src/persistence/Scores.cpp
|
||||||
|
src/network/supabase_client.cpp
|
||||||
|
src/network/NetSession.cpp
|
||||||
src/graphics/effects/Starfield.cpp
|
src/graphics/effects/Starfield.cpp
|
||||||
src/graphics/effects/Starfield3D.cpp
|
src/graphics/effects/Starfield3D.cpp
|
||||||
|
src/graphics/effects/SpaceWarp.cpp
|
||||||
src/graphics/ui/Font.cpp
|
src/graphics/ui/Font.cpp
|
||||||
|
src/graphics/ui/HelpOverlay.cpp
|
||||||
src/graphics/renderers/GameRenderer.cpp
|
src/graphics/renderers/GameRenderer.cpp
|
||||||
|
src/graphics/renderers/SyncLineRenderer.cpp
|
||||||
|
src/graphics/renderers/UIRenderer.cpp
|
||||||
src/audio/Audio.cpp
|
src/audio/Audio.cpp
|
||||||
src/gameplay/effects/LineEffect.cpp
|
src/gameplay/effects/LineEffect.cpp
|
||||||
src/audio/SoundEffect.cpp
|
src/audio/SoundEffect.cpp
|
||||||
|
src/video/VideoPlayer.cpp
|
||||||
|
src/ui/MenuLayout.cpp
|
||||||
|
src/ui/BottomMenu.cpp
|
||||||
|
src/app/BackgroundManager.cpp
|
||||||
|
src/app/Fireworks.cpp
|
||||||
|
src/app/AssetLoader.cpp
|
||||||
|
src/app/TextureLoader.cpp
|
||||||
|
src/states/LoadingManager.cpp
|
||||||
# State implementations (new)
|
# State implementations (new)
|
||||||
src/states/LoadingState.cpp
|
src/states/LoadingState.cpp
|
||||||
|
src/states/VideoState.cpp
|
||||||
src/states/MenuState.cpp
|
src/states/MenuState.cpp
|
||||||
src/states/OptionsState.cpp
|
src/states/OptionsState.cpp
|
||||||
src/states/LevelSelectorState.cpp
|
src/states/LevelSelectorState.cpp
|
||||||
src/states/PlayingState.cpp
|
src/states/PlayingState.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
set(APP_ICON "${CMAKE_SOURCE_DIR}/assets/favicon/AppIcon.icns")
|
||||||
|
if(EXISTS "${APP_ICON}")
|
||||||
|
add_executable(spacetris MACOSX_BUNDLE ${TETRIS_SOURCES} "${APP_ICON}")
|
||||||
|
set_source_files_properties("${APP_ICON}" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
|
||||||
|
set_target_properties(spacetris PROPERTIES
|
||||||
|
MACOSX_BUNDLE_ICON_FILE "AppIcon"
|
||||||
|
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/cmake/MacBundleInfo.plist.in"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
message(WARNING "App icon not found at ${APP_ICON}; bundle will use default icon")
|
||||||
|
add_executable(spacetris MACOSX_BUNDLE ${TETRIS_SOURCES})
|
||||||
|
set_target_properties(spacetris PROPERTIES
|
||||||
|
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/cmake/MacBundleInfo.plist.in"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
add_executable(spacetris ${TETRIS_SOURCES})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Ensure the built executable is named `spacetris`.
|
||||||
|
set_target_properties(spacetris PROPERTIES OUTPUT_NAME "spacetris")
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
# No compatibility copy; built executable is `spacetris`.
|
||||||
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
# Embed the application icon into the executable
|
# Embed the application icon into the executable
|
||||||
set_source_files_properties(src/app_icon.rc PROPERTIES LANGUAGE RC)
|
set_source_files_properties(src/app_icon.rc PROPERTIES LANGUAGE RC)
|
||||||
target_sources(tetris PRIVATE src/app_icon.rc)
|
target_sources(spacetris PRIVATE src/app_icon.rc)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
# Prevent PDB write contention on MSVC by enabling /FS for this target
|
||||||
|
target_compile_options(spacetris PRIVATE /FS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
@ -75,22 +127,58 @@ if (WIN32)
|
|||||||
COMMENT "Copy favicon.ico to build dir for resource compilation"
|
COMMENT "Copy favicon.ico to build dir for resource compilation"
|
||||||
)
|
)
|
||||||
add_custom_target(copy_favicon ALL DEPENDS ${FAVICON_DEST})
|
add_custom_target(copy_favicon ALL DEPENDS ${FAVICON_DEST})
|
||||||
add_dependencies(tetris copy_favicon)
|
add_dependencies(spacetris copy_favicon)
|
||||||
else()
|
else()
|
||||||
message(WARNING "Favicon not found at ${FAVICON_SRC}; app icon may not compile")
|
message(WARNING "Favicon not found at ${FAVICON_SRC}; app icon may not compile")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Also copy favicon into the runtime output folder (same dir as exe)
|
# Also copy favicon into the runtime output folder (same dir as exe)
|
||||||
add_custom_command(TARGET tetris POST_BUILD
|
add_custom_command(TARGET spacetris POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FAVICON_SRC} $<TARGET_FILE_DIR:tetris>/favicon.ico
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FAVICON_SRC} $<TARGET_FILE_DIR:spacetris>/favicon.ico
|
||||||
COMMENT "Copy favicon.ico next to executable"
|
COMMENT "Copy favicon.ico next to executable"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(tetris PRIVATE SDL3::SDL3 SDL3_ttf::SDL3_ttf SDL3_image::SDL3_image cpr::cpr nlohmann_json::nlohmann_json)
|
if(APPLE)
|
||||||
|
set(_mac_copy_commands)
|
||||||
|
if(EXISTS "${CMAKE_SOURCE_DIR}/assets")
|
||||||
|
list(APPEND _mac_copy_commands
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/assets" "$<TARGET_FILE_DIR:spacetris>/assets"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
if(EXISTS "${CMAKE_SOURCE_DIR}/fonts")
|
||||||
|
list(APPEND _mac_copy_commands
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/fonts" "$<TARGET_FILE_DIR:spacetris>/fonts"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
if(EXISTS "${CMAKE_SOURCE_DIR}/FreeSans.ttf")
|
||||||
|
list(APPEND _mac_copy_commands
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/FreeSans.ttf" "$<TARGET_FILE_DIR:spacetris>/FreeSans.ttf"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
if(_mac_copy_commands)
|
||||||
|
add_custom_command(TARGET spacetris POST_BUILD
|
||||||
|
${_mac_copy_commands}
|
||||||
|
COMMENT "Copying game assets into macOS bundle"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(spacetris PRIVATE SDL3::SDL3 SDL3_ttf::SDL3_ttf SDL3_image::SDL3_image cpr::cpr nlohmann_json::nlohmann_json unofficial::enet::enet)
|
||||||
|
|
||||||
|
find_package(FFMPEG REQUIRED)
|
||||||
|
if(FFMPEG_FOUND)
|
||||||
|
target_include_directories(spacetris PRIVATE ${FFMPEG_INCLUDE_DIRS})
|
||||||
|
target_link_directories(spacetris PRIVATE ${FFMPEG_LIBRARY_DIRS})
|
||||||
|
target_link_libraries(spacetris PRIVATE ${FFMPEG_LIBRARIES})
|
||||||
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
target_link_libraries(tetris PRIVATE mfplat mfreadwrite mfuuid)
|
target_link_libraries(spacetris PRIVATE mfplat mfreadwrite mfuuid ws2_32 winmm)
|
||||||
|
endif()
|
||||||
|
if(APPLE)
|
||||||
|
# Needed for MP3 decoding via AudioToolbox on macOS
|
||||||
|
target_link_libraries(spacetris PRIVATE "-framework AudioToolbox" "-framework CoreFoundation")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Include production build configuration
|
# Include production build configuration
|
||||||
@ -101,22 +189,23 @@ enable_testing()
|
|||||||
|
|
||||||
# Unit tests (simple runner)
|
# Unit tests (simple runner)
|
||||||
find_package(Catch2 CONFIG REQUIRED)
|
find_package(Catch2 CONFIG REQUIRED)
|
||||||
add_executable(tetris_tests
|
add_executable(spacetris_tests
|
||||||
tests/GravityTests.cpp
|
tests/GravityTests.cpp
|
||||||
src/core/GravityManager.cpp
|
src/core/GravityManager.cpp
|
||||||
)
|
)
|
||||||
target_include_directories(tetris_tests PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(spacetris_tests PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
target_link_libraries(tetris_tests PRIVATE Catch2::Catch2WithMain)
|
target_link_libraries(spacetris_tests PRIVATE Catch2::Catch2WithMain)
|
||||||
add_test(NAME GravityTests COMMAND tetris_tests)
|
add_test(NAME GravityTests COMMAND spacetris_tests)
|
||||||
|
|
||||||
if(EXISTS "${CMAKE_SOURCE_DIR}/vcpkg_installed/x64-windows/include")
|
if(EXISTS "${CMAKE_SOURCE_DIR}/vcpkg_installed/x64-windows/include")
|
||||||
target_include_directories(tetris_tests PRIVATE "${CMAKE_SOURCE_DIR}/vcpkg_installed/x64-windows/include")
|
target_include_directories(spacetris_tests PRIVATE "${CMAKE_SOURCE_DIR}/vcpkg_installed/x64-windows/include")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Add new src subfolders to include path so old #includes continue to work
|
# Add new src subfolders to include path so old #includes continue to work
|
||||||
target_include_directories(tetris PRIVATE
|
target_include_directories(spacetris PRIVATE
|
||||||
${CMAKE_SOURCE_DIR}/src
|
${CMAKE_SOURCE_DIR}/src
|
||||||
${CMAKE_SOURCE_DIR}/src/audio
|
${CMAKE_SOURCE_DIR}/src/audio
|
||||||
|
${CMAKE_SOURCE_DIR}/src/video
|
||||||
${CMAKE_SOURCE_DIR}/src/gameplay
|
${CMAKE_SOURCE_DIR}/src/gameplay
|
||||||
${CMAKE_SOURCE_DIR}/src/graphics
|
${CMAKE_SOURCE_DIR}/src/graphics
|
||||||
${CMAKE_SOURCE_DIR}/src/persistence
|
${CMAKE_SOURCE_DIR}/src/persistence
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Tetris SDL3 - Production Deployment Guide
|
# Spacetris SDL3 - Production Deployment Guide
|
||||||
|
|
||||||
## 🚀 Build Scripts Available
|
## 🚀 Build Scripts Available
|
||||||
|
|
||||||
@ -9,7 +9,7 @@
|
|||||||
- Uses existing Debug/Release build from build-msvc
|
- Uses existing Debug/Release build from build-msvc
|
||||||
- Creates distribution package with all dependencies
|
- Creates distribution package with all dependencies
|
||||||
- **Size: ~939 MB** (includes all assets and music)
|
- **Size: ~939 MB** (includes all assets and music)
|
||||||
- **Output:** `dist/TetrisGame/` + ZIP file
|
- **Output:** `dist/SpacetrisGame/` + ZIP file
|
||||||
|
|
||||||
### 2. Full Production Build
|
### 2. Full Production Build
|
||||||
```powershell
|
```powershell
|
||||||
@ -31,8 +31,8 @@ build-production.bat
|
|||||||
The distribution package includes:
|
The distribution package includes:
|
||||||
|
|
||||||
### Essential Files
|
### Essential Files
|
||||||
- ✅ `tetris.exe` - Main game executable
|
- ✅ `spacetris.exe` - Main game executable
|
||||||
- ✅ `Launch-Tetris.bat` - Safe launcher with error handling
|
- ✅ `Launch-Spacetris.bat` - Safe launcher with error handling
|
||||||
- ✅ `README.txt` - User instructions
|
- ✅ `README.txt` - User instructions
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
@ -49,9 +49,9 @@ The distribution package includes:
|
|||||||
## 🎯 Distribution Options
|
## 🎯 Distribution Options
|
||||||
|
|
||||||
### Option 1: ZIP Archive (Recommended)
|
### Option 1: ZIP Archive (Recommended)
|
||||||
- **File:** `TetrisGame-YYYY.MM.DD.zip`
|
- **File:** `SpacetrisGame-YYYY.MM.DD.zip`
|
||||||
- **Size:** ~939 MB
|
- **Size:** ~939 MB
|
||||||
- **Usage:** Users extract and run `Launch-Tetris.bat`
|
- **Usage:** Users extract and run `Launch-Spacetris.bat`
|
||||||
|
|
||||||
### Option 2: Installer (Future)
|
### Option 2: Installer (Future)
|
||||||
- Use CMake CPack to create NSIS installer
|
- Use CMake CPack to create NSIS installer
|
||||||
@ -60,14 +60,14 @@ The distribution package includes:
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Option 3: Portable Folder
|
### Option 3: Portable Folder
|
||||||
- Direct distribution of `dist/TetrisGame/` folder
|
Direct distribution of `dist/SpacetrisGame/` folder
|
||||||
- Users copy folder and run executable
|
- Users copy folder and run executable
|
||||||
|
[ ] Launch-Spacetris.bat works
|
||||||
## 🔧 Build Requirements
|
## 🔧 Build Requirements
|
||||||
|
**Solution:** Use `Launch-Spacetris.bat` for better error reporting
|
||||||
### Development Environment
|
### Development Environment
|
||||||
- **CMake** 3.20+
|
- **CMake** 3.20+
|
||||||
- **Visual Studio 2022** (or compatible C++ compiler)
|
- **Visual Studio 2026 (VS 18)** with Desktop development with C++ workload
|
||||||
- **vcpkg** package manager
|
- **vcpkg** package manager
|
||||||
- **SDL3** libraries (installed via vcpkg)
|
- **SDL3** libraries (installed via vcpkg)
|
||||||
|
|
||||||
@ -87,18 +87,21 @@ vcpkg install sdl3 sdl3-ttf --triplet=x64-windows
|
|||||||
- [ ] Font rendering works (both FreeSans and PressStart2P)
|
- [ ] Font rendering works (both FreeSans and PressStart2P)
|
||||||
- [ ] Game saves high scores
|
- [ ] Game saves high scores
|
||||||
|
|
||||||
|
### Package Validation
|
||||||
### Package Validation
|
### Package Validation
|
||||||
- [ ] All DLL files present
|
- [ ] All DLL files present
|
||||||
- [ ] Assets folder complete
|
- [ ] Assets folder complete
|
||||||
- [ ] Launch-Tetris.bat works
|
- [ ] Launch-Spacetris.bat works
|
||||||
- [ ] README.txt is informative
|
- [ ] README.txt is informative
|
||||||
- [ ] Package size reasonable (~939 MB)
|
- [ ] Package size reasonable (~939 MB)
|
||||||
|
|
||||||
### Distribution
|
### Distribution
|
||||||
- [ ] ZIP file created successfully
|
### "spacetris.exe is not recognized"
|
||||||
|
- **Solution:** Ensure all DLL files are in same folder as executable
|
||||||
- [ ] Test extraction on clean system
|
- [ ] Test extraction on clean system
|
||||||
- [ ] Verify game runs on target machines
|
- [ ] Verify game runs on target machines
|
||||||
- [ ] No missing dependencies
|
### Game won't start
|
||||||
|
- **Solution:** Use `Launch-Spacetris.bat` for better error reporting
|
||||||
|
|
||||||
## 📋 User System Requirements
|
## 📋 User System Requirements
|
||||||
|
|
||||||
@ -118,7 +121,7 @@ vcpkg install sdl3 sdl3-ttf --triplet=x64-windows
|
|||||||
|
|
||||||
## 🐛 Common Issues & Solutions
|
## 🐛 Common Issues & Solutions
|
||||||
|
|
||||||
### "tetris.exe is not recognized"
|
### "spacetris.exe is not recognized"
|
||||||
- **Solution:** Ensure all DLL files are in same folder as executable
|
- **Solution:** Ensure all DLL files are in same folder as executable
|
||||||
|
|
||||||
### "Failed to initialize SDL"
|
### "Failed to initialize SDL"
|
||||||
|
|||||||
BIN
FreeSans.ttf
34
README.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
Spacetris SDL3
|
||||||
|
=============
|
||||||
|
|
||||||
|
A native C++20 SDL3-based Tetris-style game.
|
||||||
|
|
||||||
|
Quick Start (Windows)
|
||||||
|
- Install vcpkg and packages: `vcpkg install sdl3 sdl3-ttf --triplet=x64-windows`
|
||||||
|
- Configure: `cmake -S . -B build-msvc -DCMAKE_BUILD_TYPE=Debug`
|
||||||
|
- Build: `cmake --build build-msvc --config Debug`
|
||||||
|
- Run (helper): `.
|
||||||
|
build-debug-and-run.ps1` or run `build-msvc\Debug\spacetris.exe`
|
||||||
|
|
||||||
|
Production Packaging
|
||||||
|
- Quick package (uses existing build): `.
|
||||||
|
package-quick.ps1`
|
||||||
|
- Full production (clean Release build + package): `.
|
||||||
|
build-production.ps1 -Clean`
|
||||||
|
|
||||||
|
Tests
|
||||||
|
- Unit tests target: `spacetris_tests` → exe `spacetris_tests.exe`
|
||||||
|
- Run tests: configure+build then `ctest -C Debug` or run the test exe directly
|
||||||
|
|
||||||
|
Where to look
|
||||||
|
- Main app sources: `src/` (entry `src/main.cpp`, app `src/app`)
|
||||||
|
- Build control: `CMakeLists.txt` and `cmake/ProductionBuild.cmake`
|
||||||
|
- Packaging helpers: `build-production.ps1`, `package-quick.ps1`
|
||||||
|
|
||||||
|
Notes
|
||||||
|
- The canonical executable name is `spacetris` (`spacetris.exe` on Windows).
|
||||||
|
- Assets live in `assets/` and are copied into the distribution package.
|
||||||
|
|
||||||
|
If you want, I can:
|
||||||
|
- Run a Debug build and confirm the test executable name,
|
||||||
|
- Replace remaining legacy "tetris" tokens across generated files and docs.
|
||||||
@ -1,4 +1,4 @@
|
|||||||
# Tetris — Upgrade Roadmap
|
# Spacetris — Upgrade Roadmap
|
||||||
|
|
||||||
This document lists recommended code, architecture, tooling, and runtime upgrades for the native SDL3 Tetris project. Items are grouped, prioritized, and mapped to target files and effort estimates so you can plan incremental work.
|
This document lists recommended code, architecture, tooling, and runtime upgrades for the native SDL3 Tetris project. Items are grouped, prioritized, and mapped to target files and effort estimates so you can plan incremental work.
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ This document lists recommended code, architecture, tooling, and runtime upgrade
|
|||||||
- [x] Replace ad-hoc printf with SDL_Log or injected Logger service
|
- [x] Replace ad-hoc printf with SDL_Log or injected Logger service
|
||||||
- Note: majority of printf/fprintf debug prints were replaced with `SDL_Log*` calls; a quick grep audit is recommended to find any remaining ad-hoc prints.
|
- Note: majority of printf/fprintf debug prints were replaced with `SDL_Log*` calls; a quick grep audit is recommended to find any remaining ad-hoc prints.
|
||||||
- [x] Add unit tests (gravity conversion, level progression, line clear behavior)
|
- [x] Add unit tests (gravity conversion, level progression, line clear behavior)
|
||||||
- Note: a small test runner (`tests/GravityTests.cpp`) and the `tetris_tests` CMake target were added and run locally; gravity tests pass (see build-msvc test run). Converting to broader Catch2 suites is optional.
|
- Note: a small test runner (`tests/GravityTests.cpp`) and the `spacetris_tests` CMake target were added and run locally; gravity tests pass (see build-msvc test run). Converting to broader Catch2 suites is optional.
|
||||||
- [ ] Add CI (build + tests) and code style checks
|
- [ ] Add CI (build + tests) and code style checks
|
||||||
- [ ] Improve input hit-testing for level popup and scalable UI
|
- [ ] Improve input hit-testing for level popup and scalable UI
|
||||||
- [ ] Add defensive guards (clamps, null checks) and const-correctness
|
- [ ] Add defensive guards (clamps, null checks) and const-correctness
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 1.0 MiB |
BIN
assets/fonts/Exo2.ttf
Normal file
BIN
assets/fonts/Orbitron.ttf
Normal file
BIN
assets/images/asteroids_001.png
Normal file
|
After Width: | Height: | Size: 196 KiB |
BIN
assets/images/blocks90px_002.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
assets/images/blocks90px_003.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
assets/images/cooperate_info.png
Normal file
|
After Width: | Height: | Size: 416 KiB |
BIN
assets/images/earth_back.jpg
Normal file
|
After Width: | Height: | Size: 513 KiB |
BIN
assets/images/hold_panel.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
assets/images/levels/level0.jpg
Normal file
|
After Width: | Height: | Size: 257 KiB |
BIN
assets/images/levels/level1.jpg
Normal file
|
After Width: | Height: | Size: 226 KiB |
BIN
assets/images/levels/level10.jpg
Normal file
|
After Width: | Height: | Size: 188 KiB |
BIN
assets/images/levels/level11.jpg
Normal file
|
After Width: | Height: | Size: 204 KiB |
BIN
assets/images/levels/level12.jpg
Normal file
|
After Width: | Height: | Size: 157 KiB |
BIN
assets/images/levels/level13.jpg
Normal file
|
After Width: | Height: | Size: 333 KiB |
BIN
assets/images/levels/level14.jpg
Normal file
|
After Width: | Height: | Size: 265 KiB |
BIN
assets/images/levels/level15.jpg
Normal file
|
After Width: | Height: | Size: 298 KiB |
BIN
assets/images/levels/level16.jpg
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
assets/images/levels/level17.jpg
Normal file
|
After Width: | Height: | Size: 276 KiB |
BIN
assets/images/levels/level18.jpg
Normal file
|
After Width: | Height: | Size: 223 KiB |
BIN
assets/images/levels/level19.jpg
Normal file
|
After Width: | Height: | Size: 281 KiB |
BIN
assets/images/levels/level2.jpg
Normal file
|
After Width: | Height: | Size: 450 KiB |
BIN
assets/images/levels/level20.jpg
Normal file
|
After Width: | Height: | Size: 315 KiB |
BIN
assets/images/levels/level21.jpg
Normal file
|
After Width: | Height: | Size: 322 KiB |
BIN
assets/images/levels/level22.jpg
Normal file
|
After Width: | Height: | Size: 323 KiB |
BIN
assets/images/levels/level23.jpg
Normal file
|
After Width: | Height: | Size: 242 KiB |
BIN
assets/images/levels/level24.jpg
Normal file
|
After Width: | Height: | Size: 349 KiB |
BIN
assets/images/levels/level25.jpg
Normal file
|
After Width: | Height: | Size: 387 KiB |
BIN
assets/images/levels/level26.jpg
Normal file
|
After Width: | Height: | Size: 226 KiB |
BIN
assets/images/levels/level27.jpg
Normal file
|
After Width: | Height: | Size: 203 KiB |
BIN
assets/images/levels/level28.jpg
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
assets/images/levels/level29.jpg
Normal file
|
After Width: | Height: | Size: 297 KiB |
BIN
assets/images/levels/level3.jpg
Normal file
|
After Width: | Height: | Size: 328 KiB |
BIN
assets/images/levels/level30.jpg
Normal file
|
After Width: | Height: | Size: 245 KiB |
BIN
assets/images/levels/level31.jpg
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
assets/images/levels/level32.jpg
Normal file
|
After Width: | Height: | Size: 295 KiB |
BIN
assets/images/levels/level4.jpg
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
assets/images/levels/level5.jpg
Normal file
|
After Width: | Height: | Size: 199 KiB |
BIN
assets/images/levels/level6.jpg
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
assets/images/levels/level7.jpg
Normal file
|
After Width: | Height: | Size: 117 KiB |
BIN
assets/images/levels/level8.jpg
Normal file
|
After Width: | Height: | Size: 335 KiB |
BIN
assets/images/levels/level9.jpg
Normal file
|
After Width: | Height: | Size: 420 KiB |
|
Before Width: | Height: | Size: 930 KiB |
|
Before Width: | Height: | Size: 195 KiB |
|
Before Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 24 KiB |
BIN
assets/images/main_screen.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
assets/images/main_screen_old.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
BIN
assets/images/next_panel.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
BIN
assets/images/panel_score.png
Normal file
|
After Width: | Height: | Size: 275 KiB |
BIN
assets/images/spacetris.png
Normal file
|
After Width: | Height: | Size: 486 KiB |
BIN
assets/images/statistics_panel.png
Normal file
|
After Width: | Height: | Size: 440 KiB |
|
Before Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 756 KiB |
|
Before Width: | Height: | Size: 1007 KiB |
|
Before Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 957 KiB |
|
Before Width: | Height: | Size: 805 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 947 KiB |
|
Before Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 825 KiB |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 970 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 1007 KiB |
|
Before Width: | Height: | Size: 638 KiB |
|
Before Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 828 KiB |
|
Before Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 1010 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |