Skip to content

Commit ae4f82c

Browse files
authored
Merge pull request #133 from mgerhold/open-recordings
Add recording interface
2 parents 20f4374 + 300364a commit ae4f82c

File tree

122 files changed

+4158
-2479
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+4158
-2479
lines changed

.github/workflows/cmake.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ jobs:
3333

3434
- name: Setup MSVC
3535
if: matrix.config.os == 'windows' && matrix.config.msvc == true
36-
uses: ilammy/msvc-dev-cmd@v1
36+
uses: TheMrMilchmann/setup-msvc-dev@v3
37+
with:
38+
arch: x64
39+
toolset: 14.39
3740

3841
- name: Install dependencies (Linux)
3942
if: matrix.config.os == 'ubuntu'

.github/workflows/meson.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,11 @@ jobs:
8585

8686
- name: Setup MSVC (Windows)
8787
if: matrix.config.os == 'windows' && matrix.config.msvc == true
88-
uses: ilammy/msvc-dev-cmd@v1
88+
uses: TheMrMilchmann/setup-msvc-dev@v3
89+
with:
90+
arch: x64
91+
toolset: 14.39
92+
8993

9094
- name: Setup MinGW (Windows)
9195
if: matrix.config.os == 'windows' && matrix.config.msvc == false
@@ -105,6 +109,7 @@ jobs:
105109
sudo apt-get install libc++-17* libc++abi*17* -y
106110
echo "CC=clang-17" >> "$GITHUB_ENV"
107111
echo "CXX=clang++-17" >> "$GITHUB_ENV"
112+
echo "OBJC=clang-17" >> "$GITHUB_ENV"
108113
109114
110115
- name: Setup GCC (Linux)
@@ -124,8 +129,10 @@ jobs:
124129
echo "CPPFLAGS=-I$(brew --prefix)/opt/llvm/include" >> "$GITHUB_ENV"
125130
echo "CC=clang" >> "$GITHUB_ENV"
126131
echo "CXX=clang++" >> "$GITHUB_ENV"
132+
echo "OBJC=clang" >> "$GITHUB_ENV"
127133
echo "CC_LD=lld" >> "$GITHUB_ENV"
128134
echo "CXX_LD=lld" >> "$GITHUB_ENV"
135+
echo "OBJC_LD=lld" >> "$GITHUB_ENV"
129136
130137
- name: Unbreak Python in GHA for 3.11 (MacOS 13 image)
131138
if: matrix.config.os == 'macos' && matrix.config.os-version == 13

CMakeLists.txt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ add_executable(oopetris
3636
src/game/rotation.hpp
3737
src/game/tetrion.cpp
3838
src/game/tetrion.hpp
39+
src/game/tetromino_type.cpp
3940
src/game/tetromino_type.hpp
4041
src/game/tetromino.cpp
4142
src/game/tetromino.hpp
@@ -47,6 +48,7 @@ add_executable(oopetris
4748
src/graphics/sdl_context.hpp
4849
src/graphics/text.cpp
4950
src/graphics/text.hpp
51+
src/graphics/texture.cpp
5052
src/graphics/texture.hpp
5153
src/graphics/window.cpp
5254
src/graphics/window.hpp
@@ -56,6 +58,7 @@ add_executable(oopetris
5658
src/helper/color.hpp
5759
src/helper/command_line_arguments.hpp
5860
src/helper/constants.hpp
61+
src/helper/date.cpp
5962
src/helper/expected.hpp
6063
src/helper/git_helper.hpp
6164
src/helper/magic_enum_wrapper.hpp
@@ -77,6 +80,8 @@ add_executable(oopetris
7780
src/manager/font.hpp
7881
src/manager/music_manager.cpp
7982
src/manager/music_manager.hpp
83+
src/manager/recording/additional_information.cpp
84+
src/manager/recording/checksum_helper.cpp
8085
src/manager/recording/recording_reader.cpp
8186
src/manager/recording/recording_reader.hpp
8287
src/manager/recording/recording_writer.cpp
@@ -85,7 +90,6 @@ add_executable(oopetris
8590
src/manager/recording/recording.hpp
8691
src/manager/recording/tetrion_snapshot.cpp
8792
src/manager/recording/tetrion_snapshot.hpp
88-
src/manager/recording/additional_information.cpp
8993
src/manager/resource_manager.hpp
9094
src/manager/service_provider.hpp
9195
src/manager/settings.hpp
@@ -109,6 +113,9 @@ add_executable(oopetris
109113
src/scenes/pause/pause.hpp
110114
src/scenes/play_select_menu/play_select_menu.cpp
111115
src/scenes/play_select_menu/play_select_menu.hpp
116+
src/scenes/recording_selector/recording_component.cpp
117+
src/scenes/recording_selector/recording_selector.cpp
118+
src/scenes/replay_game/replay_game.cpp
112119
src/scenes/scene_id.hpp
113120
src/scenes/scene.cpp
114121
src/scenes/scene.hpp
@@ -117,21 +124,32 @@ add_executable(oopetris
117124
src/scenes/single_player_game/single_player_game.cpp
118125
src/scenes/single_player_game/single_player_game.hpp
119126
src/thirdparty/hash-library/sha256.cpp
127+
src/ui/components/button.cpp
120128
src/ui/components/button.hpp
129+
src/ui/components/image_view.cpp
121130
src/ui/components/image_view.hpp
131+
src/ui/components/label.cpp
122132
src/ui/components/label.hpp
133+
src/ui/components/link_label.cpp
123134
src/ui/components/link_label.hpp
135+
src/ui/components/slider.cpp
124136
src/ui/components/slider.hpp
137+
src/ui/components/textinput.cpp
125138
src/ui/components/textinput.hpp
126139
src/ui/focusable.hpp
127140
src/ui/hoverable.hpp
128141
src/ui/layout.cpp
142+
src/ui/layout.cpp
143+
src/ui/layout.cpp
129144
src/ui/layout.hpp
145+
src/ui/layouts/focus_layout.cpp
146+
src/ui/layouts/grid_layout.cpp
130147
src/ui/layouts/grid_layout.hpp
148+
src/ui/layouts/scroll_layout.cpp
131149
src/ui/layouts/scroll_layout.hpp
150+
src/ui/layouts/tile_layout.cpp
132151
src/ui/layouts/tile_layout.hpp
133152
src/ui/widget.cpp
134-
src/ui/widget.cpp
135153
src/ui/widget.hpp
136154
)
137155

meson.build

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ elif cpp.get_id() == 'clang'
5353
deps += cpp.find_library('c++abi')
5454
endif
5555

56-
57-
5856
endif
5957

6058
if get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimized'
@@ -67,7 +65,7 @@ inc_dirs = []
6765
recording_inc_dirs = []
6866

6967
only_allow_native_libs = false
70-
if (meson.is_cross_build())
68+
if meson.is_cross_build()
7169
if host_machine.system() == 'switch'
7270
# we do not link to code that was compiled with gcc 10.1, the code we link with is all compiled with gcc 13.2
7371
compile_args += ['-Wno-psabi']
@@ -90,7 +88,6 @@ else
9088
deps += dependency(
9189
'sdl2',
9290
required: true,
93-
fallback: 'sdl2',
9491
default_options: {'test': 'false'},
9592
)
9693
deps += dependency(
@@ -224,11 +221,7 @@ int main() {
224221
if not have_std_expected
225222
message('Compiler doesn\'t support std::expected, using fallback')
226223
compile_args += ['-D_USE_TL_EXPECTED']
227-
tl_exp_dep = dependency(
228-
'tl-expected',
229-
required: true,
230-
fallback: ['tl-expected'],
231-
)
224+
tl_exp_dep = dependency('tl-expected', required: true)
232225
recording_dependencies += tl_exp_dep
233226
deps += tl_exp_dep
234227
else
@@ -250,11 +243,7 @@ int main() {
250243
if not have_std_optional
251244
message('Compiler doesn\'t support std::optional, using fallback')
252245
compile_args += ['-D_USE_TL_OPTIONAL']
253-
tl_opt_dep = dependency(
254-
'tl-optional',
255-
required: true,
256-
fallback: ['tl-optional'],
257-
)
246+
tl_opt_dep = dependency('tl-optional', required: true)
258247
recording_dependencies += tl_opt_dep
259248
deps += tl_opt_dep
260249
else
@@ -266,17 +255,12 @@ endif
266255
magic_enum_dep = dependency(
267256
'magic_enum',
268257
required: true,
269-
fallback: ['magic_enum'],
270258
default_options: {'test': 'false'},
271259
)
272260
recording_dependencies += magic_enum_dep
273261
deps += magic_enum_dep
274262

275-
argparse_dep = dependency(
276-
'argparse',
277-
required: true,
278-
fallback: ['argparse'],
279-
)
263+
argparse_dep = dependency('argparse', required: true)
280264
recording_dependencies += argparse_dep
281265
deps += argparse_dep
282266

@@ -289,7 +273,6 @@ else
289273
deps += dependency(
290274
'cpp-httplib',
291275
required: true,
292-
fallback: ['cpp-httplib'],
293276
default_options: {
294277
'cpp-httplib_openssl': 'enabled',
295278
'cpp-httplib_zlib': 'enabled',
@@ -300,7 +283,6 @@ endif
300283
deps += dependency(
301284
'utf8cpp',
302285
required: true,
303-
fallback: ['utfcpp'],
304286
version: '>=4.0.0',
305287
)
306288

@@ -341,14 +323,29 @@ if (meson.is_cross_build() and host_machine.system() == 'switch')
341323

342324
endif
343325

326+
is_flatpak_build = get_option('flatpak_build')
327+
328+
have_file_dialogs = false
329+
330+
nfde_dep = dependency(
331+
'nativefiledialog-extended',
332+
required: not meson.is_cross_build(),
333+
default_options: {'xdg-desktop-portal': is_flatpak_build ? 'enabled' : 'auto'},
334+
)
335+
if nfde_dep.found()
336+
have_file_dialogs = true
337+
deps += nfde_dep
338+
compile_args += '-D_HAVE_FILE_DIALOGS'
339+
endif
340+
344341

345342

346343
src_files = []
347344
recording_src_files = []
348345

349346
subdir('src')
350347

351-
## TODO: only istall needed ones, since sometimes we only need e.g. flacs or mp3 and no icons etc.
348+
## TODO: only install needed ones, since sometimes we only need e.g. flacs or mp3 and no icons etc.
352349
## install assets
353350
install_subdir(
354351
'assets',
@@ -358,7 +355,7 @@ install_subdir(
358355
)
359356

360357
app_name = 'oopetris'
361-
if get_option('flatpak_build')
358+
if is_flatpak_build
362359
app_name = 'com.github.mgerhold.OOPetris'
363360
compile_args += ['-DFLATPAK_BUILD', '-DBUILD_INSTALLER']
364361
endif
@@ -434,7 +431,6 @@ foreach logo : logos
434431
)
435432
endforeach
436433

437-
438434
if meson.is_cross_build() and host_machine.system() == 'android'
439435

440436
library(

platforms/build-android.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ EOF
343343

344344
meson compile -C "$BUILD_DIR"
345345

346-
echo -e "Sucesfully build for andropid platform ${ARCH}\n"
346+
echo -e "Sucesfully build for android platform ${ARCH}\n"
347347

348348
done
349349

src/application.cpp

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
#include "platform/capabilities.hpp"
44
#include "scenes/scene.hpp"
55

6-
#include <fstream>
76
#include <ranges>
8-
#include <stdexcept>
97

108
#if defined(__SWITCH__)
119
#include "switch.h"
@@ -51,15 +49,7 @@ void Application::run() {
5149
u64 frame_counter = 0;
5250
#endif
5351

54-
// MSVC Is stupid and the bug isn't fixes yet :( -> https://developercommunity.visualstudio.com/t/warning-c4455-issued-when-using-standardized-liter/270349
55-
#if defined(_MSC_VER)
56-
#pragma warning(disable : 4455)
57-
#endif
58-
using std::chrono_literals::operator""s;
59-
#if defined(_MSC_VER)
60-
#pragma warning(default : 4455)
61-
#endif
62-
52+
using namespace std::chrono_literals;
6353

6454
const auto sleep_time = m_target_framerate.has_value() ? std::chrono::duration_cast<std::chrono::nanoseconds>(1s)
6555
/ m_target_framerate.value()
@@ -174,7 +164,7 @@ void Application::update() {
174164

175165
for (usize i = 0; i < num_scenes; ++i) {
176166
const auto index = num_scenes - i - 1;
177-
const auto [scene_update, scene_change] = m_scene_stack.at(index)->update();
167+
auto [scene_update, scene_change] = m_scene_stack.at(index)->update();
178168
if (scene_change) {
179169
std::visit(
180170
helper::overloaded{
@@ -195,6 +185,11 @@ void Application::update() {
195185
scenes::create_scene(*this, switch_.target_scene, switch_.layout)
196186
);
197187
},
188+
[this](scenes::Scene::RawSwitch& raw_switch) {
189+
spdlog::info("switching to scene {}", raw_switch.name);
190+
m_scene_stack.clear();
191+
m_scene_stack.push_back(std::move(raw_switch.scene));
192+
},
198193
[this](const scenes::Scene::Exit&) { m_is_running = false; },
199194
},
200195
*scene_change
@@ -222,9 +217,10 @@ void Application::initialize() {
222217
push_scene(scenes::create_scene(*this, SceneId::MainMenu, ui::FullScreenLayout{ m_window }));
223218

224219
#ifdef DEBUG_BUILD
225-
m_fps_text = std::make_unique<Text>(
226-
this, "FPS: ?", fonts().get(FontId::Default), Color::white(),
227-
ui::RelativeLayout(window(), 0.01, 0.01, 0.1, 0.05).get_rect()
220+
m_fps_text = std::make_unique<ui::Label>(
221+
this, "FPS: ?", fonts().get(FontId::Default), Color::white(), std::pair<double, double>{ 0.95, 0.95 },
222+
ui::Alignment{ ui::AlignmentHorizontal::Middle, ui::AlignmentVertical::Center },
223+
ui::RelativeLayout{ window(), 0.0, 0.0, 0.1, 0.05 }, false
228224
);
229225
#endif
230226
}

src/application.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "manager/resource_manager.hpp"
1212
#include "manager/service_provider.hpp"
1313
#include "scenes/scene.hpp"
14+
#include "ui/components/label.hpp"
1415

1516
#ifdef DEBUG_BUILD
1617
#include "graphics/text.hpp"
@@ -35,7 +36,7 @@ struct Application final : public EventListener, public ServiceProvider {
3536
helper::optional<u32> m_target_framerate;
3637

3738
#ifdef DEBUG_BUILD
38-
std::unique_ptr<Text> m_fps_text{ nullptr };
39+
std::unique_ptr<ui::Label> m_fps_text{ nullptr };
3940
#endif
4041

4142
protected:

src/game/bag.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
Bag::Bag(Random& random) : m_tetromino_sequence{} {
44
// initialize array with invalid tetromino type
5-
for (TetrominoType& type : m_tetromino_sequence) {
6-
type = static_cast<TetrominoType>(static_cast<int>(TetrominoType::LastType) + 1);
5+
for (helper::TetrominoType& type : m_tetromino_sequence) {
6+
type = static_cast<helper::TetrominoType>(static_cast<int>(helper::TetrominoType::LastType) + 1);
77
}
88

99
// fill in the sequence with random order
@@ -24,11 +24,11 @@ Bag::Bag(Random& random) : m_tetromino_sequence{} {
2424
}
2525
}
2626

27-
const TetrominoType& Bag::operator[](int index) const {
27+
const helper::TetrominoType& Bag::operator[](int index) const {
2828
return m_tetromino_sequence.at(static_cast<usize>(index));
2929
}
3030

3131

32-
TetrominoType Bag::get_random_tetromino_type(Random& random) {
33-
return static_cast<TetrominoType>(random.random(static_cast<int>(TetrominoType::LastType) + 1));
32+
helper::TetrominoType Bag::get_random_tetromino_type(Random& random) {
33+
return static_cast<helper::TetrominoType>(random.random(static_cast<int>(helper::TetrominoType::LastType) + 1));
3434
}

0 commit comments

Comments
 (0)