Use the flag `MOVEFILE_WRITE_THROUGH` with the `MoveFileExW` function on Windows to ensure that the file is renamed/moved on the disk before the function returns. Otherwise, if the function returns before the file is moved, subsequent loading of the file with this name may fail sporadically.
See https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-movefileexw
Add `log_error_color`, `log_warn_color`, `log_info_color`, `log_debug_color` and `log_trace_color` macros to wrap `log_log_color` function with specific log levels.
Add comment to mark the `IConsole::Print` function as deprecated in favor of the `log_*` functions, which should be preferred for the following reasons:
- They support `printf`-formatting without a separate buffer.
- They support all five log levels.
- They do not require a pointer to `IConsole` to be used.
- Consistency of logging code.
The `IConsole::Format` function was previously used to format the log and rcon output, but it has become obsolete when the logging was refactored.
The function was still being used to format the output of the `show_ips` command in the rcon, which was causing this particular rcon line to have the old log format (e.g. `[12:34:56][server]: Value: 0`). Now, `IConsole::Print` is used directly, as this causes the output to be sent with the correct format and only to the rcon command user.
The `IConsole::FPrintCallback` function pointer typedef is also obsolete and unused.
It's not necessary to create a new `CTextureHandle` object after unloading the handle and it's also not necessary to check if the texture handle is valid when unloading it.
Store and update the last race tick directly in `CGameClient` instead of in `CGhost`, as the value is also used in the gameclient.
Move current race time calculation from `CClient` to `CGameClient`, as this function is not used in the engine and this allows removing unnecessary virtual functions.
Closes#1720.
Show popup to select the envelope curve type from a list when right clicking the curve type button, as selecting the curve type by pressing the button multiple times is inconvenient.
Switch to previous curve type on shift+left clicking the curve type button.
The `CLayers::InitBackground` function implemented a subset of the `CLayers::Init` function, only loading the game layers and not the other entities layers, so a Boolean parameter can be used to reduce the duplicate code.
The additional code to evaluate envelopes during demo playback is obsolete, as client ticks are already properly synchronized with the demo playback.
From teeworlds/teeworlds#2750 and teeworlds/teeworlds#2768.
Use a condition variable instead of busy waiting until HTTP requests are done.
Also set the state `EHttpState::RUNNING` which was previously unused.
Closes#7811.
The argument `x64` is an alias for `x86_64` but the name of the build folder always contains `x86_64`, so the `data` folder and certificate were not being found when using the `x64` argument, unless another architecture was previously built.
When maps are loaded from folders on the server, the same folders were used for demos but recording would usually fail due to the folders not existing in the demos folder.
Furthermore, the map name being written in the demo header also included the folder names, which causes the client to not find the map unless it also exists at that location.
Closes#9033.