Age | Commit message (Collapse) | Author | Files | Lines |
|
Only call `SDL_ShowWindow` once, since it seems old SDL versions (like
2.30.0, shipping with Ubuntu 24.04) do not allow a maximized window to
be minimized when `SDL_ShowWindow` is called each frame.
|
|
By using SDL logging, we can rely on SDL to filter the log messages by
their priority before they get sent to our custom output function. For
example, we now no longer get entries for created and destroyed Window
instances by default, since these have only "debug" priority whereas the
default priority for the "app" category is "info".
We can also get log messages raised by SDL itself in our log now. Log
levels can be controlled per category through the "SDL_LOGGING"
environment variable.
Many existing log messages have been assigned a category based on their
existing prefix.
|
|
On Windows, the SDL event loop would get blocked during move/resize,
which made the game stop updating. Since version 2.30, SDL will send its
SDL_WINDOWEVENT_EXPOSED event on an internal timer during window
move/resize so the application can keep redrawing.
Since no window size changed events can be received either, the size of
the window and the renderer is now updated at the start of each frame.
On macOS the SDL event loop was similarly blocked during resize.
The event watcher is only used on Windows and macOS because on X11 the
processing of all the queued up expose events can cause a delayed response to
resizing. Besides, the issues fixed by this watcher don't exist on X11 and
Wayland.
|
|
This avoids some duplicated code between `Client` and `Game` and reduces
code indentation. Now only the `Client` calls `SDL_PollEvent` and
handles `SDL_WINDOWEVENT_SIZE_CHANGED`.
This also fixes the Keyboard setup tab to allow assigning keys before
starting the game.
|
|
Closes #100
|
|
Sometimes I've used CamelCase and sometimes SNAKE_CASE for these values.
Since "enum class" values are always prefixed with the enum name, which
uses CamelCase, I find it more fitting to use it for the values as well.
Also fixes compilation on Windows where 'ERROR' was conflicting with a
define.
|
|
|
|
This is cleaner overall since now each widget type no longer needs to
keep track of its own instances and updating of the GUI alpha. It also
introduces a single point from where the GUI theme support can be
enhanced.
Theme is no longer a singleton, though for now there is a single
instance owned by the Gui singleton.
Widgets adjusted to delegate their painting to the Theme:
* Button
* Tab
* TextField
* CheckBox
* RadioButton
* Slider
* DropDown
* ProgressBar
* ScrollArea
* ResizeGrip
* PlayerBox (by subclassing ScrollArea)
The Window and Popup widgets already use the theme through the Skin
class. They can actually use a different skin per instance, though this
feature is only used by the SpeechBubble.
|
|
When switching between tmwAthena and Manaserv the GeneralHandler was not
getting deleted, resulting in crashes later on when the still around
instance (or one of its child handlers) would try to respond to events
it was listening to.
|
|
All ResourceManager functions that load resources now return respective
ResourceRef values, which helps to make sure resources are properly
cleaned up.
The Sound class was cleaned up and now also allows SoundEffect resources
to be unloaded.
The Animation class now keeps its ImageSet loaded only as long as
necessary. Previously, SimpleAnimation and ParticleEmitter would keep
the ImageSet loaded indefinitely by never decreasing its reference
count.
Reduced duplicated animation loading code between SimpleAnimation and
ParticleEmitter.
|
|
Addendum to !108.
Cherry-picked from M+ commit 78430c4bd86412a4b011632135c4eca71a435a1d.
|
|
* Wrapped remaining PhysFS API calls and set PHYSFS_DEPRECATED to
suppress deprecation warnings for PHYSFS_getUserDir, since no
alternative is available for now.
* Removed support for decompressing .gz files, since it has been unused
for years and doesn't seem useful when updates are anyway served in an
archive.
* Use SDL_LoadFile and SDL_LoadFile_RW convenience functions (raises
minimum SDL version to 2.0.10).
* Removed ResourceManager::copyFile, since it was unused and will likely
stay unused.
* Removed ResourceManager::loadTextFile. Instead, split up the string in
BrowserBox::addRows without making additional copies.
|
|
* Most direct PhysFS calls now contained within a single header file.
* File class that automatically closes.
* Files class allows iterating files with range-based for.
* Use std::optional to force error handling where applicable.
|
|
After failure to connect it would immediately try to connect to the
chosen server, only to fail again. Now it goes back to the server choice
dialog instead.
Closes https://git.themanaworld.org/mana/mana/-/issues/86
|
|
This appears to have been a regression in
f405849b49614254f42eb3ee6147434458978623, which for some reason erased
the port (and any trailing parts) from not just the update directory but
also from the update URL.
Unfortunately we can't access Mana-Mantis #381 at the moment, but
presumably the port was removed due to the colon being a problematic
character. Instead, now the colon (and other special characters) are
replaced by _ when determining the update directory.
Closes https://git.themanaworld.org/mana/mana/-/issues/80
|
|
This makes accessing the config values much faster, since it no longer
needs to do a lookup nor string conversion, which means we could remove
some needless copying of the values.
Overall it makes it easier to find out where settings are used and it
puts the defaults along with the declaration.
Options with default values are no longer saved to the config file. This
does not include unrecognized options, which are kept around to provide
some compatibility with older clients.
While most basic options have kept the same name, more complicated
settings like window geometry, shortcuts, outfits, etc. now have their
own XML elements. Older clients will ignore these and erase them when
saving the configuration.
|
|
There were some inconsistencies between the values set up in
`Client::initConfiguration` and those in `getConfigDefaults`. These
duplicates have now been removed.
For some of these settings the code getting the values had to be
adjusted to use getBoolValue, to actually rely on the provided default
instead of one provided as a parameter.
|
|
The logic update now uses Time::deltaTimeMs() where needed to make it
framerate-independent. This means there will no longer be multiple logic
calls per frame (as was usually the case with logic ticking at 100 fps
whereas the game would generally run at 60 fps).
At the same time, the game can be more precise at higher framerates and
should now run smoother at 144 Hz, for example. Previously the game would
sometimes skip logic ticks at that rate.
This change affects:
* Updating of animations
* Being movement speed
* More moving of manual time variables to Timer
Notoriously, the particle system still does 100 ticks/second.
|
|
The Timer is efficient because it does not depend on incrementing a
counter to keep track of time, nor does it call SDL_GetTicks every time
its state is checked (this happens once per frame instead).
Along with global functions Time::absoluteTimeMs() and
Time::deltaTimeMs(), this replaces previous globals tick_time, cur_time
and get_elapsed_time().
For now, there is still a fixed 100 times per second logic call rate,
but the new Time::deltaTimeMs() function should allow getting rid of
this.
|
|
This was already done in the log, when responding to the --version
parameter and for the label on the Desktop widget, but not in the Setup
window. Now it is consistently part of the FULL_VERSION define.
|
|
- Updated STATE_WORLD_SELECT case to automatically select the first
world and proceed to update state when mOptions.chooseDefault is true.
- This change ensures that the world selection window is bypassed for a
smoother user experience when the default selection option is enabled.
- Improved logic to handle cases with only one available world and
directly proceed without showing the dialog.
|
|
Also enable using `cpack -G DragNDrop` to create a DMG to easily drag
Mana into the Applications folder.
The DMG is also available as a CI artifact.
The minimum deployment target has been set to 10.15, as required due to
usage of std::filesystem::create_directories.
|
|
This should make CMake options a little more standardized. The Windows
part could potentially still be unified further.
Absolute paths are now only used for the defines and not for values
going to install() commands.
|
|
Set SDL_HINT_WINDOWS_DPI_AWARENESS to "permonitorv2", which tells
Windows the application will handle all scaling.
We don't currently adjust the window size when it changes monitors, but
mainly use this hint to disable scaling by the system, since that blurs
fonts and pixel art. Once we can properly handle fractional scaling
(which is common on Windows), we can set SDL_HINT_WINDOWS_DPI_SCALING to
"1" instead.
|
|
Ported from CSIDL to newer FOLDERID API and used wcstombs_s to
convert the returned path to a multi-byte string.
Fixes issues when the Windows username contains special characters.
|
|
Also added instructions for installing the dependencies on MSYS2.
The selection of the default language is commented out for now. It will
be fixed in another change.
|
|
* Removed some unused includes
* Removed unused ListBox::mFont
* Removed wrong cast to SDL_Scancode
* Removed superfluous .c_str()
* Removed superfluous explicit std::string construction
* Removed unused variable
* Use more emplace_back
* Turned FindBeingFunctor into a lambda
* Avoid needless pointer references for ambient layers and use a vector
|
|
* TrueTypeFont class now takes into account the graphics scale, in order
to render an appropriate higher-resolution texture.
* Removed TrueTypeFont::fontCounter, since TTF_Init/TTF_Quit already
keep a counter.
* Avoid copying the rendered string needlessly, when it already exists
in the cache. Avoid another copy, when inserting a new chunk into the
cache.
|
|
This is generally expected on Linux, where it feels annoying that the
initial click just focuses the window.
On macOS it's a little bit different, since applications can be specific
about which elements are directly clickable and which aren't, but in
general it feels better to me when the UI can be interacted with
directly.
|
|
* Added "Scale" user option, which can either by "Auto" or an explicit
scaling factor. Its maximum value depends on the current resolution.
The "Auto" factor is based on keeping the logical resolution on at
least 800x600, wheres the maximum scale is based on keeping the
logical resolution on at least 640x480.
* Enabled support for High DPI. This means the rendering target can now
have a different resolution than the window size, which can happen on
macOS, Windows and Wayland. The resulting scale is multiplied by the
above user-controlled scale.
Currently, this looks ugly for non-integer scales, which are not used
on macOS and can only be configured on some Wayland compositors.
Has not been tested on Windows.
* Simplified OpenGL initialization (moved out of _beginDraw).
* Made sure _beginDraw/_endDraw sets a clip area also for SDLGraphics.
|
|
* Use default member initializers
* Use range-based for loops
* Avoid needless pointer references for ShopItem::mDuplicates
* Removed type aliases that are only used once or twice
* Removed more unused includes
* Removed some unused functions
* Removed superfluous .c_str()
* Rely on default copy and assignment operators for Vector class
* Use std::unique_ptr in some places
* Removed duplicated mPlayerMoney updating in SellDialog
* Removed duplicated Game::handleInput call
* Removed unused SDLInput::mMouseInWindow
* Removed remnant of manual widget positioning in HelpWindow
* Removed superfluous initialization of static pointers
|
|
Since the upgrade to SDL2 it was only used for framerate limiting, which
I've replicated in a small helper class.
Also reduced the framerate limit while minimized from 100 to 10 FPS.
|
|
* Use final for all message handlers, Client, LocalPlayer,
Being::getType, Being::setPosition and Being::setMap.
(avoids some warnings about virtual dispatch in constructors)
* Use auto in more places
* Use emplace_back instead of push_back in some places
* Use default member initializers
* Less else after return
* Removed superfluous .c_str()
* Removed type aliases that are only used once
* Removed more unused includes
|
|
Also made it exit with error when there is an unknown option or missing
argument.
|
|
|
|
Usually this would be guessed correctly by the port, but now it is also
possible to just specify the server type and the port will be derived
from there, unless a default port is given in the branding file.
Closes #56
|
|
The configuration and setup UI were adjusted to the new options.
This also fixes issues in applying new video settings.
Default resolution was changed from 800x600 to 1280x720. VSync is
enabled by default while FPS limit was disabled.
Display aspect ratio for the resolution options.
I had to work around some macOS issues:
* Don't change window size when it appears to be "maximized", since it
just changes the rendering area while leaving the window maximized.
* Unset fullscreen display mode temporarily to allow changing resolutions,
otherwise the rendering area no longer matches the screen and mouse
input is also off.
* Removed SDL_WINDOW_ALLOW_HIGHDPI for now because it causes issues on
macOS, since we're not actually handling the scaling factor.
A Video class and an SDLGraphics subclass were split off from Graphics.
This setup has Less duplication and leaves the OpenGLGraphics and
SDLGraphics better separated.
Fixes #57
Fixes #58
|
|
* Use default member initializers
* Use range-based loops
* Don't use 'else' after 'return'
* Removed some unused includes
* Construct empty strings with std::string() instead of ""
* Clear strings with .clear() instead of assigning ""
* Check whether strings are empty with .empty() instead of comparing to ""
* Removed redundant initializations
|
|
Unfortunately, since we're making a difference between config and data,
and also want to know where to write screenshots, we can't get rid of
PHYSFS_getUserDir entirely. We'd need a replacement to get rid of the
deprecation warnings.
Also removed copying of old config file at "/.tmw/config.xml".
|
|
modernize-use-auto
modernize-use-nullptr
modernize-use-override
modernize-use-using
|
|
Since we now use SDL2, OpenGL is used through the SDL2 API. This appears
to work very well and handles resizing better (with less flicker). Our
manual OpenGL rendering code is probably obsolete.
The "hwaccel" option referred to hardware accelerations supported by
SDL1 and is no longer relevant.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This file was introduced by ManaPlus as a way of configuring the
character creation process. It defines the number of hair styles
and colors, how stat points should be divided and what the starting
equipment of the player is.
The minimum and maximum hair color/style IDs are not supported at
the moment.
This is mostly a backport of ManaPlus commits 10cf52b5 and dcc18eba,
with some style changes.
Mantis-issue: 501
Reviewed-by: Ablu
|
|
Reviewed-by: Erik Schilling
|
|
Before it was only enabled by default for Mac.
Reviewed-by: Erik Schilling
|