Flathub linter complains about mismatched id in flatpak manifest and
appstream. Based on appstream docs it seems that reverse-DNS name is
expected without .desktop extension so appstream should be changed.
Extra <provides> and <replaces> tags added as per
https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/#renaming-id-tag
Owaec has a crown but little other indicator that he's a leader, and this scenario requires him to be used to recruit. Make it more obvious to the player.
Formerly, EI S13 uses various Deathblades' max-moves status instead of [filter_second] for some reason. This breaks when deathblades get rebuild, which in the bug report was caused by the sentinel shield. Use [filter_second] instead.
Resolves#8969
In EI S10, Dacyn picks up a cursed amulet and his HP drops to 1. In EI S11, Dacyn remains on very low HP, and is surrounded by orcs. There's a convenient ford hex he can hide on and be protected, but several players did not notice this hex and complained about difficulty.
In S10, this commit also drops his XP to 0. 1) showing that the amulet interferes with his MoL-ing, and 2) preventing the player from deliberately AMLA-ing Dacyn in the next scenario (partially a difficulty issue, but mostly it's bad to punish blind playthroughs / reward foreknowledge).
In S11, this commit adds a gold pile on Easy/Normal hinting towards the hex, while on Easy Dacyn's HP is fully restored. Hard is unaffected.
In S12, this commit restores Dacyn's HP on Easy (since it would be odd if he had full HP S11 but low HP S12).
The current preferences handling is a mess:
* it's essentially a global config object that anything can modify in any way the caller wants, which is managed across multiple source files which have their own oddities and interdependencies.
* the general preferences has its own bit of SDL event handling and while I get the idea behind `events::sdl_handler` there's no reason to have SDL events handled in the preferences instead of just calling the relevant preferences setter for each event when it happens.
* the general preferences is where most of the preferences are handled and has its `base_manager` struct, which is part of the `manager` struct in the game preferences, which is then implicitly initialized as part of game_launcher's constructor.
* the editor preferences are the only preferences in a sub-namespace `preferences::editor` while all other preferences are just in the `preferences` namespace.
* the display, editor, and lobby preferences are all dependent on including the game preferences, the credentials are dependent on including the general preferences (but not the game preferences), the game preferences are dependent on including the general preferences, and the advanced preferences are entirely their own thing which is dependent on none of the other preference functionality and manages its own singleton.
* nothing checks whether the preferences file has actually been loaded before allowing values to be read from or written to the preferences config - if you attempt to get a value too early in wesnoth's initialization it will silently just give you whatever the default value for that preference happens to be.
With this there is instead a single access point (with exceptions handled via friend functions/classes), all predefined preferences are accessed via their own setter/getter, and all mainline preferences are defined in a single file (preference_list.hpp) so it's easily findable what preferences exist and where they're used. Having the list of all mainline preferences listed out also allows the lua preferences API to provide that full list rather than just the list of the preferences that have been set so far. Also it now checks for whether the location of the preferences file is known before attempting to load the preferences file and asserts if someone attempts to use the preferences too early.
https://www.reddit.com/r/wesnoth/comments/1d6a3e7/eastern_invasion_is_much_better_but_still_bad/
EI's S10 is overly hard on Normal, and especially on Easy (which is intended to be a very accessible difficulty). This PR increases the available gold and adds several villages, which aid in both defense and upkeep. This PR also drastically reduces the number of orcs on lower difficulties.
We also move Owaec to his keep to help imply his ability to recruit, and remove the related just-added [note] string to avoid violating 1.18.1 string freeze.
A weapon with poison, which does extra damage to poisoned opponents.
This tests that the weapon-special's filter is checked on each strike,
instead of being tested once and then cached during the battle.
(cherry picked from commit 55aa8b44cf)
Instead of needing to contain the exact string from the ability, 'apply_to' in the filter is now taken as a comma-separated list, where all elements need to be present in the ability.
For example if we filter for apply_to=fire,arcane given an ability [resistance]apply_to=arcane, fire, cold, it will match.
For an ability [resistance]apply_to=arcane, impact, cold, this will not match because 'fire' is missing.
When any of the images is missing, a text description is shown as a fallback.
The bug being fixed is that the search for the secondary PNGs used the basename
with neither the directory nor the ".png".
The existence of the files controls a single conditional block, but was using
three bools with two dedicated to single files and one shared between all the
alternate files. This changes it to a single bool shared between all files for
clarity.
A rich text label widget that can show text marked up with help markup.
Also includes the GUI Test Window, accessible in the title screen after launching wesnoth using --clock option. It can be used as dialog template/example or as a place to test GUI2 code.
In add-on form, EI used images to display "Part II" and "Part III". For translation reasons this got replaced with ugly title_text when the add-on went mainline.
This PR once again makes the "Part II" "Part III" storytext more fancy, while maintaining translatability.
When a [damage_type] affected an attack, the old code assumed that it would have an alternative_type.
If that assumption failed, it would add ("type_" + an empty string), causing "UNTLB type_" to be shown
in the sidebar.
UNTLB is itself a shorthand for "untranslatable", see language.cpp for an explanation.
There's no particular reason why Delfador should say this during HttT, but perhaps it will make the connection to the campaign clearer.
Closes#8365.
[ci skip]