Commit Graph

307 Commits

Author SHA1 Message Date
clang-format 95ce592579 Enforce not breaking before assignments and function names
Co-authored-by: Hielke Morsink <hielke.morsink@gmail.com>
2018-07-23 16:00:19 +02:00
Hielke Morsink 73a7e935c3 Correct formatting for files in the project root 2018-07-23 16:00:17 +02:00
clang-format c57bbca827 clang-format root 2018-07-23 16:00:14 +02:00
Michael Steenbeek 1b08fb4e69 Replace our own integer types with standard ones 2018-06-20 17:30:40 +02:00
Michael Steenbeek ec3a1e575e
Replace Math::Min and Max with std variants 2018-06-20 17:11:35 +02:00
Hielke Morsink 0cf256ac9e Ready copyright notice for clang-format
Clang-format sees the text behind `#pragma region` as code and formats it. Instead of stating the copyright and date there, it's now in the comment block right below it. The text "Copyright" is left in the `#pragma region` line, as clang-format sees it as a single identifier.

I took the opportunity to normalize the dates, and add the copyright notice to the source files where it was missing them (except for third-party and the generated resources.h file).
2018-06-15 14:07:34 +02:00
Aaron van Geffen f1d4e5b596 Rename Http namespace, add default initialisers. 2018-06-11 11:19:04 +02:00
Tobias Kohlbau 62c25d88fb HTTP: refactor http into modern C++
Signed-off-by: Tobias Kohlbau <tobias@kohlbau.de>
2018-06-11 10:24:19 +02:00
Ted John e38f4df575 [wip] Move themes to libopenrct2ui 2018-06-10 23:34:12 +01:00
Ted John f880290b00 Create WinSSL implementation and refactor to class 2018-06-01 21:27:33 +01:00
Ted John 92f6ac7333 Rename header files to match renamed source files 2018-06-01 09:38:30 +02:00
Ted John 056b596124 Use reference types in TitleSequencePlayer 2018-05-31 12:49:09 +01:00
Aaron van Geffen dcff6895b5 Refactor game_init_all into GameState::InitAll. 2018-05-30 11:53:32 +02:00
Ted John f1ee5cad83 Call Park from GameState. 2018-05-30 11:53:32 +02:00
Ted John 4d4e7ba4b1 Create new GameState class for updating the game 2018-05-30 11:53:30 +02:00
Ted John 6af0cb2b88 Fix import of S4 and S6 2018-05-29 18:39:12 +01:00
Ted John 96a0a22cd1 Make start on loading objects only once 2018-05-29 18:39:12 +01:00
Michael Steenbeek d44d727fac
Merge pull request #7543 from AaronVanGeffen/refactor/park
Create new Park class
2018-05-21 10:17:38 +02:00
Ted John 46300f216f Fix #7544: Freeze when starting headless server with no arguments
Fixes #7313: Loading an invalid path with openrct2 produces results different than expected

Do not load title sequences in headless mode and prevent use of null audio mixer when ride music is stopped.
2018-05-20 02:21:44 +01:00
Ted John 721dc00778 Move park_update into Park class.
Co-authored-by: Aaron van Geffen <aaron@aaronweb.net>
2018-05-19 19:44:01 +02:00
Ted John 0d6cde2cdb Create a Park class 2018-05-19 19:43:39 +02:00
Ted John 20fdd46b96
Fix #7513: OpenRCT2 freezes on shutdown (#7514)
Store drawing engine and painter inside Context so that it is disposed before Context.
2018-05-13 15:52:59 +01:00
Ted John 7eb1703f36 Remove old bitmap code via UiContext 2018-05-13 01:11:56 +01:00
Ted John 529c744276 Use unique_ptr and shared_ptr for services in Context 2018-05-13 00:43:50 +01:00
Ted John 9e72e51bab Use std::unique_ptr for discord service 2018-05-11 20:39:00 +01:00
Ted John 8eacc3582c Remove PlainContext 2018-05-11 20:39:00 +01:00
Ted John 302fe00805 Always pass shared_ptr by reference 2018-05-11 20:39:00 +01:00
Ted John d1cbf998a0 Do not return shared_ptr for LocalisationService
GetLocalisationService is currently used a lot, so remove overhead of shared_ptr copy.
2018-05-11 20:39:00 +01:00
Ted John 35df72e61f Remove use of gCurrentLanguage 2018-05-11 20:39:00 +01:00
Ted John 8681b4fac9 [wip] Create new localisation service 2018-05-11 20:37:48 +01:00
Ted John 7b610fd3c0 Use shared_ptr more for UiContext in relation to DrawingEngine 2018-05-11 20:37:48 +01:00
Ted John 7dc170ef85 Use shared_ptr for long-life objects
Use unique_ptr and shared_ptr for IContext, IPlatformEnvironment, IUiContext, and IAudioContext.
2018-05-11 20:37:48 +01:00
woj1993 4b372120f1 Fix #6141: CSS50.dat is never loaded (#7357) 2018-04-13 11:29:31 +01:00
Hielke Morsink dc673a64d8 Give context the ownership of repositories and the object manager (#7340)
This makes them no longer a singleton, which fixes annoying behaviour when launching multiple contexts in one game session.
2018-04-10 13:19:23 +01:00
Duncan 0ab3d0955c
Merge pull request #7310 from OpenRCT2/json-objects
Add support for new JSON object format
2018-04-08 10:45:55 +01:00
Michał Janiszewski 3b7864957a Cleanly shutdown in case of invalid g1.dat (#7361) 2018-03-30 15:38:22 +01:00
Ted John f91449190a Allow game to run without RCT2 install path 2018-03-26 21:38:09 +02:00
Hielke Morsink c5aececcb1 Set scenario save path upon successfully loading a park
Instead of setting the path when clicking on a file in the loadsave dialog, it's now set when the park gets actually loaded.

This fixes the System Dialog not showing when saving a park loaded from command.
2018-03-24 13:24:39 +01:00
Ted John a6d03b3b0f Fix segfault when exiting a network game
Separate out closing of connection into a new method so only that is called when closing the game which then means gfx_invalidate_screen is not called.
2018-03-23 21:54:45 +00:00
Ted John f7dafa9bbb Only enable interactive console for headless 2018-03-22 20:16:58 +00:00
Ted John dd0573b235 Move in game console to UI library 2018-03-22 20:16:58 +00:00
Ted John d18f416370 Add basic interactive console using linenoise 2018-03-22 20:16:58 +00:00
Michał Janiszewski fc97c8c5db Reduce inclusion of <string> header 2018-03-21 22:39:19 +01:00
Michał Janiszewski cd065d4f41 Reduce includes in common header 2018-03-20 00:27:58 +01:00
Michał Janiszewski 4dd0995efb Move cmath out of common.h 2018-03-18 23:29:13 +01:00
Hielke Morsink 69867bcecd Fix typo 'instad' -> 'instead' [ci skip] 2018-03-13 23:44:34 +01:00
Michał Janiszewski 764520076f
Reduce header inclusion
* Update includes in PlatformEnvironment.cpp

* Update includes in ParkImporter.h

* Update includes of OpenRCT2.h

* Update includes in Intro.h

* Remove unused include from Input.cpp

* Update includes of Imaging.h

* Update includes in Game.h

* Update includes in Editor.h

* Update includes of Context.cpp

* Update includes in Cheats.cpp, CmdlineSprite.cpp

* Update includes of some source files

* Update includes in some cpp files

* Update includes in some cpp files

* Update includes in TextureCache.h

* Fix tests

* Update includes in Font.cpp

* Update includes in LightFX files

* Update some includes

* Fix GCC builds

* Update some includes

* Update some includes

* Update includes in FontsFamilies.*

* Update includes of Console.h

* Improve includes in Window.h

* Improve headers in Viewport.h/Window.h

* Fix MSVC build

* Fix network-less builds

* Reduce inclusion of Map.h
2018-03-13 13:14:02 +01:00
Michał Janiszewski 282553f0c5 Upgrade some char arrays to strings 2018-02-07 23:14:29 +01:00
Ted John b0755123fd Fix loading of bad g1.dat 2018-02-05 18:47:40 +00:00
Ted John 76344498bb Fix outPath not set in platform_get_user_directory 2018-02-05 17:19:39 +00:00
Gymnasiast 778ba466c5 Remove almost every extern C block 2018-02-05 16:20:15 +01:00
Ted John 0c71855769 Replace Memory::Copy with std::copy 2018-02-04 12:40:24 +00:00
Ted John 87cd9f88b3 Rewrite Platform::GetInstallPath 2018-02-02 12:41:26 +00:00
ZehMatt abd74dbb1e Add exception handling in LoadParkFromFile. 2018-01-21 21:46:11 +00:00
Ted John d9d2b2373d Rename crash.h to Crash.h 2018-01-18 21:12:41 +00:00
ZehMatt 84f2917f59 Use const and constexpr whenever possible. 2018-01-11 22:29:08 +01:00
Michael Steenbeek 6a88d6e04d Move and rename RCT{1,2,12}.h 2018-01-09 13:36:41 +01:00
Ted John c974daf467 Refactor console.c to C++ 2018-01-07 12:39:58 +01:00
Ted John b781291b58 Refactor chat.c to C++ 2018-01-07 12:39:58 +01:00
Michael Steenbeek 755add6c9a
Compile localisation folder as C++ 2018-01-06 18:32:25 +01:00
Ted John 0c3c998177 Refactor lightfx.c to C++ 2018-01-05 22:57:55 +01:00
Ted John 02c58a6c5a Remove custom base Exception class 2018-01-05 18:11:47 +00:00
Michael Steenbeek 347ff702d0 Refactor objects 2018-01-03 10:16:51 +01:00
Tomas Dittmann c22dac0a29 add missing exception handling.
LoadParkFromStream() now handles exceptions from parkImporter->LoadFromStream().
2017-12-27 14:32:19 +00:00
Marijn van der Werf e9ef843619 Move majority of input.c to UI 2017-12-16 15:47:38 +02:00
Ted John 6e34aaa321 Fix debug assert when closing game from object selection 2017-12-16 12:22:14 +00:00
Michael Steenbeek 1a9975d683 Compile util and cheats as C++ 2017-12-14 10:03:21 +01:00
Michael Steenbeek 6dc49d643a Compile files in base dir as C++ 2017-12-13 08:03:48 +01:00
Christian F. Coors 0aa515355a Add cursor scaling 2017-12-12 22:11:40 +01:00
Michael Steenbeek 60d8865efb Compile game.c and game.h as C++ 2017-12-05 09:10:27 +01:00
Ted John 99d7aaa2d6 Remove RCT2 interop 2017-12-04 19:04:06 +00:00
Ted John 66a6aa95f6 Redirect platform_get_user_directory to IPlatformEnvironment
- Remove old code for getting user directory, redirect to IPlatformEnvironment.
- Fix config loading so that it uses path straight from IPlatformEnvironment.
- Add more special folder implementation in Platform2.
2017-12-01 21:09:52 +00:00
Ted John 323b8dd352 Partially fix #6129: Guest List not updating after a ride rename
- Force refresh of ride list and guest list for both rename ride and demolish ride actions.
2017-11-23 09:40:39 +01:00
Ted John b5137b0e37
Merge pull request #6574 from IntelOrca/protect-g1-access
Refactor g1 access
2017-11-16 18:51:32 +00:00
Ted John 83e80d9658 Implement basic discord status report 2017-11-11 23:48:04 +00:00
Robert Jordan 9ae4f7d1bc Fix #6500: Fail to load resources when no config
A simple fix of setting the environment paths before the repositories
are loaded.

Added a changelog entry
2017-11-07 21:03:58 +00:00
Ted John 5a05bd51e5 Use get_g1_element and add null checks 2017-11-03 22:18:10 +00:00
Marijn van der Werf 45b75692d9 Fix code style 2017-11-03 01:54:37 +01:00
Marijn van der Werf 4a4f9648a7 Move network status window to UI module 2017-11-03 01:54:37 +01:00
Marijn van der Werf 1e335308cc Move map tooltip to ui module 2017-11-03 01:54:37 +01:00
Christian F. Coors 06afeeda9a Apply some refactoring 2017-11-02 12:22:28 +01:00
Robert Jordan a3c64bb146 Feature: Preview title sequences in-game
Title sequences can now be played back in-game, allowing for much easier
editing.

Improved title sequence playback in general. Clicking play while on a
different title sequence will play the new one. Clicking stop will make
the title screen go back to the config title sequence. And the closing
the title sequence window will also make the game go back to the config
title sequence, and reload the sequence if it was modified.

Changes made to title sequences in-game are now correctly loaded in the
title screen.

Starting a title sequence within the editor will now always reset it
even if it's the current playing sequence. (Not for playing in the
editor though).

Get Location in title sequence command editor now has 100% accuracy
compared to before
where it would usually get some offset value.

Added `get_map_coordinates_from_pos_window` which will allow getting the
viewport coordinates of a specific window even if the input coordinates
are under another window. This has use with getting 2D positions from
the main window without the other windows getting in the way.

Options window will now always specify the config title sequence in the
dropdown and not the current title sequence.

Made a global variable `gLoadKeepWindowsOpen`, in game.h to keep windows
open when loading a park. When loading a title sequence park in-game.
The sequence player will force-close all park-specific windows ahead of
time.

Skipping while testing title sequences no longer needs to reload the
park if the current playback position is already before the target
position and ahead of the load position.

Added changelog entry.
2017-10-30 12:07:01 +01:00
Michał Janiszewski 8fd2266bda Refactor includes (#6512)
* Refactor Intent.h inclusion

* Use forward declaration of ITcpSocket

* Remove unused include

* Forward declare rct_ride_entry

* Remove unused headers

* Forward-declare rct_drawpixelinfo

* Remove unused headers

* Lower header include from header to source file

* Reduce included headers

* Reduce includes
2017-10-19 10:01:05 +02:00
Arnav Borborah 8271da85a2 Fix arguments to main() 2017-10-17 00:04:40 +02:00
Krutonium fd459f0791 Add a visible notification for missing KDialog/Zenity 2017-10-14 22:16:51 +02:00
Marijn van der Werf 8569a7fe2f Move map window 2017-10-07 22:24:14 +02:00
Martin Müller e38a77da2a Set gScenarioFileName when loading an RCT1 park
This fixes bugs when completing an RCT1 scenario, where the highscore
would be saved for the wrong park because gScenarioFileName hasn't been updated on load.
2017-09-26 15:53:06 +02:00
Marijn van der Werf 9b1b2b5c62 WIP window moving 2017-09-24 22:41:49 +02:00
Marijn van der Werf ac910a5979 Move Error, Campaign and Ride Demolition windows 2017-09-24 22:41:49 +02:00
Marijn van der Werf a49a777047 Move Banner, Player and Sign windows 2017-09-24 22:41:49 +02:00
Marijn van der Werf 8503b8e204 Move Finances and Park windows 2017-09-24 22:41:49 +02:00
Michael Steenbeek 1fd1d8c26b Move editor to C++; add defines for object limits 2017-09-22 07:56:24 +02:00
Michał Janiszewski 00fd18809c Move extern "C" {} blocks to headers (#6282) 2017-09-18 17:05:28 +02:00
Michał Janiszewski 45de7ebd22 Remove superfluous argument 2017-09-08 11:57:24 +02:00
Michał Janiszewski a8ba58ab9a Update wrong method name 2017-09-08 11:57:24 +02:00
Ted John 1eb3d07b3d Reduce static access and call from anonymous function 2017-09-08 11:57:24 +02:00
Michał Janiszewski 100a63a743 Pass context object as argument, don't use singleton 2017-09-08 11:57:24 +02:00
Michał Janiszewski 2577e92860 Adapt Context to Emscripten 2017-09-08 11:57:24 +02:00
Gymnasiast dba7d6053e Clarify elevated permissions warning, insert line break in data files message, fixes #6215 2017-08-31 10:55:33 +02:00
Richard Jenkins 71e580a58f Refactor game load functions, resolves #6011 2017-08-23 08:04:36 +02:00
Marijn van der Werf 4d90940d21 Move windows to UI project 2017-08-10 13:42:27 +02:00
Ted John 8b2eb8a13e Move screen variables to OpenRCT2.h 2017-07-29 20:29:29 +01:00
Ted John e6e503a853 Move path related functions to Context.cpp
- rct2_init_directories
- get_file_path
2017-07-29 20:29:26 +01:00
Ted John 8bc4e52ae9 Move rct2_quit to Context 2017-07-29 20:28:18 +01:00
Richard Jenkins 06d1f49d61 Display a warning dialog if user runs program elevated (#6063) 2017-07-29 15:21:33 +01:00
rwjuk 11711fe4c4 Fix #6010: Assert triggered when loading SC6 via file assoc 2017-07-26 11:03:46 +02:00
Ted John 34096627ac Fix #5973: Headless Servers lost the ability to load Scenarios 2017-07-23 11:14:57 +01:00
Ted John bc88cb9c2b Make TitleScreen a class (#5971) 2017-07-22 23:42:14 +01:00
Ted John 2eb9657781 Fix premature deletion of dependencies (#5952)
In particular, the object repository can potentially be deleted before the object manager is deleted. This causes a crash when the object manager is deleted because it requires the object repository within the destructor.
2017-07-20 17:44:31 +01:00
ZehM4tt ad4eaff323 Fix game not allowing to catch up if rendering is slow.
Refactored game_update to use the given parameters from context.
2017-07-18 15:14:21 +02:00
Ted John ac6da51dbb Use IPlatformEnvironment for loading g1.dat 2017-07-16 23:25:11 +01:00
Ted John 5614e55f84 Remove more redundant platform functions 2017-07-16 23:25:11 +01:00
Ted John 1394512df6 Remove startup checks 2017-07-16 23:25:11 +01:00
Ted John edcbfdf097 Move rct2_open_file to Context 2017-07-16 23:25:11 +01:00
Ted John f7dff37708 Move copying of user files to Context.cpp 2017-07-16 23:25:11 +01:00
Ted John 73ef6d54a7 Move rct2_init and rct2_dispose into Context 2017-07-16 23:25:11 +01:00
Ted John 7fbcf1ab0b Move rct2_update into Context 2017-07-16 23:25:11 +01:00
William Wallace ae110a9159 Allow switching between OpenGL and other renderers without restarting 2017-07-13 19:04:37 +01:00
ZehM4tt 250a66c45f Fix game advancing too fast when game was paused/frozen.
Regression from #5848
Added braces.
2017-07-11 21:45:37 +02:00
ζeh Matt a8af3c7670 Refactor game loop to use a semi-fixed timestep. (#5848)
Fix headless game being jumpy/stuttering.
Bump up network version.
2017-07-10 21:43:20 +02:00
rwjuk fe140c5c20 Fix #5789: No missing obj notification when loading from cmd line 2017-07-05 07:28:46 +02:00
Ted John 46d8287bd9 Merge pull request #5624 from rwjuk/objectwindow
Implement window displaying object load failures
2017-07-02 00:07:17 +01:00
Ted John 14443b30f1 Fix #5751: Title sequence seconds are about 0.8 seconds 2017-07-02 00:04:32 +01:00
rwjuk 214bf3988b Implement 'missing objects' window
Implement 'missing objects' window

Basic implementation of 'bad objects' window

Add new object_load_error.c

Add object_load_error.c

Faffing about

String stuff

Stuff

Get window basically displaying

Proper col header for object

Display object types

Display file name and explanatory message

Probably about time I added myself to the dev list

Cleanup and comments

Make bad object window work with SC6

Fix whitespace, string IDs, flip core function sense

Fix spacing in string_ids.h

Fix string ID snafu

Fix HasNoInvalidObjects() sense

Attempt to refactor this to pass data properly

Move typedefs to separate header

Fix up signatures

Add park_load_result_types.h

Clean up includes and remnants of prev implementation

Split duplication into function, free invalid entries list on close

Use pointer for object_validity_result param

Fixup string IDs

Use LoadObject() directly

Use dependency injection, fix string termination

Xcode fix, make helper function static

Fix buffer overrun and memory leak

Use SDL for clipboard functionality

Fix function & variable declarations

Rework editor_read_s6() to use new park load result type

Update changelog for #5624

[ci skip]

Fix mem leak, function signature and whitespace
2017-07-01 01:28:51 +01:00
Ted John f275e5ba9b Remove all platform.h includes from header files
System headers, particularly windows.h polute the namespace too much with macros and unwanted definitions. Do not use them in header files.
2017-06-25 18:59:56 +01:00
Ted John b9e9ddfc1c Use more dependency injection 2017-06-24 09:56:51 +02:00
Ted John 3003393c87 Allow re-creation of object manager
Removing lazy initialisation of it.
2017-06-24 09:56:51 +02:00
Ted John 1dae7f9f32 Move SDL_LoadBMP call to libopenrct2ui (#5616) 2017-06-14 19:47:22 +01:00
Ted John f76ca6ea8b Fix #5603: Game fails on startup (#5604)
The game tries to use a ui context while setting up a platform environment. Let the platform environment be created before looking for the RCT2 directory. This is a bit hacky at the moment, but a necessary fix until it can be cleaned up.
2017-06-13 00:38:56 +01:00
Ted John 31c2b9c6b7 Move remaining SDL in input.c to openrct2ui 2017-06-11 21:18:56 +01:00
Ted John 7a86fc2cb5 Link back shortcut functions
Some of this will be temporary until input and windows move over to libopenrct2ui.
2017-06-11 17:23:52 +01:00
Ted John cbd53f920c Create IWindowManager to open window from libopenrct2 2017-06-11 17:23:51 +01:00
Ted John 0d8f9d6618 Refactor IPlatformEnvironment (#5590) 2017-06-11 12:53:37 +01:00
Ted John 41989da732 Fix #4959: Compiler warning: tmpnam
Load download parks directly from memory without writing to a temporary file.
2017-06-07 21:22:01 +01:00
Michał Janiszewski 61d38511bc Expand tabs to spaces
This commit expands tabs to spaces (ts=4) in all the files under src/
and test/.

Until now we had two wildly different code styles with C using tabs and
new C++ using spaces. It is painful to maintain as none of the commonly
used tools support this kind of setup and in reality is needless, as we
can simply convert all the sources to spaces and have opened PRs do the
same, where needed.

Additionally, trailing whitespace has been removed.
2017-06-06 23:46:14 +02:00
Ted John 8bb15a70de Refactor chat / server stream logging 2017-06-06 23:08:01 +02:00
Ted John 2f053800ba Add verbose logging of base paths 2017-06-06 17:02:45 +01:00
Leurak babfa1e281 Add command line option for listen address 2017-06-04 00:42:13 +01:00
Ted John 94e982289e Fix openrct2-cli build
By using a dummy audio context, we can now make openrct2-cli start a headless instance without any SDL2 calls. SDL2 is still a dependency until we remove out the input code to openrct2-ui.
2017-06-04 00:18:26 +01:00
Ted John af91b9f4b4 Fix #5521: Infinite loop on first run if neither Zenity nor kdialog are installed (#5526) 2017-06-03 22:13:20 +01:00
Michał Janiszewski 79d76759bb Fix #5516: Update copyrights for 2017
Not all files were necessarily _changed_, but all were touched, see
https://github.com/OpenRCT2/OpenRCT2/pull/4932
2017-06-01 21:55:10 +02:00
Ted John f1a8b32db4 Prevent SDL_INIT when the game does not need to launch 2017-05-29 22:38:45 +02:00
Michał Janiszewski 423028dac9 Fix some warnings with clang and GCC 2017-05-29 22:38:44 +02:00
Ted John fc19b57c09 Fix build after rebase 2017-05-29 22:38:44 +02:00
Ted John 08ae74293d Remove a few more SDL calls from core library 2017-05-29 22:38:44 +02:00
Ted John cf0dcb4753 Refactor file / directory dialogs to UiContext 2017-05-29 22:38:43 +02:00
Ted John 3fcd42fe2b Move more window code to UiContext 2017-05-29 22:38:43 +02:00
Ted John d206d181f2 Move audio code to UI project 2017-05-29 22:38:43 +02:00
Ted John bd9839ff50 Get the game working
Mostly just needed to resolve screen size which is now retrieved via ui context.
2017-05-29 22:38:43 +02:00
Ted John 7163973bd2 Start moving code from OpenRCT2 to Context 2017-05-29 22:38:42 +02:00
Ted John 9d24e47e6f Fix build 2017-05-29 22:38:42 +02:00
Ted John f736e8ff96 Move more platform code to UiContext 2017-05-29 22:38:42 +02:00
Ted John 5885cb646f Start moving window logic to UI project 2017-05-29 22:38:42 +02:00
Ted John 10182879da Invert Context and UiContext dependencies 2017-05-29 22:38:42 +02:00
Ted John fedb8917c7 Create new CMake project for libopenrct2 2017-05-29 22:38:42 +02:00
Ted John 006a76c099 Refactor registration of drawing engines 2017-05-29 22:38:42 +02:00
Ted John bf3749833d Allow drawing engine registration via context interfaces 2017-05-29 22:38:42 +02:00