The Battle for Wesnoth v1.15.0 Release Notes

  • ### AI

    • Micro AIs
      • Add [avoid] tag functionality to Multipack Wolves, Wolves, Swarm and Goto Micro AIs
      • Support named locations for [micro_ai] tag location keys
      • Goto and Assassin: fix MAIs not working with tunnels when using custom path finding cost functions
    • Experimental AI
      • Deprecate EXPERIMENTAL_AI macro: use ai_algorithm=experimental_ai in the [ai] tag instead
      • Convert to using external candidate actions
      • Significantly speed up recruiting evaluation
      • Recruiting: add optional 'enemy_types' parameter
      • Adjustments to candidate action scores
      • Variety of internal evaluation improvements
    • All Lua AIs
      • Fix bug crashing some AIs when units with chance-to-hit specials without id are on map (same as what had already been done for the Fast Micro AI)
      • Do not use hard-coded values for modifiable parameters in wesnoth.game_config
      • Fix experience for killing level 0 units
      • Distinguish between healing locations and villages
      • Significant amount of internal cleanup, including some efficiency improvements
    • ai_helper library
      • New functions get_healing_locations(), get_reachmap(), get_avoid_map() and get_locations_no_borders()
      • get_closest_enemy(): change return values (breaks backward compatibility)
      • find_best_move(): return nil instead of {} if no move found (may break backward compatibility in rare cases)
      • Deprecate filter(), choose() and xyoff()
      • move_unit_out_of_way(): prevent potential for divide-by-zero
    • Default AI
      • Remove attack_depth aspect (had been non-functional for a long time already)
      • [goal]name=protect_unit: do not protect units hidden from the AI
      • General code clean-up, in particular of TODOs left over from 1.7 and 1.9 ### Campaigns
    • A Tale of Two Brothers:
      • S2 'Chase': improved behavior of undead side leader with custom AI
    • Delfador's Memoirs:
      • S08: Show carryover report to make it clear the scenario has ended
      • S09 & 10: Increase difficulty
      • S12: Allow respective recruits when the loyalists & mages join Delfador
    • Secrets of the Ancients:
      • Added ability to recruit different kinds of walking corpses during the campaign.
      • Unit type naming convention cleanup.
    • Son of the Black Eye:
      • S03: remove unused objective note
    • The Hammer of Thursagan:
      • Removed scenarios 4 (Troll Bridge), 5 (Invaders), and 7 (Mages and Drakes)
      • Reworked scenario 8 (Fear) and rebalanced other scenarios
      • Added new character and updated some dialogue
    • Under the Burning Suns:
      • Refactor code in various scenarios to be more readable
      • Various bugfixes (objectives, allied vision, unit spawns, event firing)
      • S8: change water to rise based on timer, not player movement
    • Wings of Victory:
      • New campaign added to mainline (Intermediate level, 11 scenarios).
    • Deprecate AI Controller and remove it from mainline campaign scenarios ### Engine
    • Windows 7 is now the minimum supported Windows version.
    • Add command-line arguments for detecting invalid WML.
    • Revise mechanics of the liminal alignment to match up with the intended meaning.
    • Healing animation is shown when the patient is invisible. (PR #3643) ### Language and i18n
    • Updated translations: British English, Bulgarian, Chinese (Simplified), Chinese (Traditional), Czech, Dutch, French, Galician, German, Hungarian, Italian, Japanese, Lithuanian, Polish, Portuguese (Brazil), Russian, Scottish Gaelic, Slovak, Spanish, Turkish, Ukrainian. ### Lua API
    • Allow specifying custom flags (in particular teleport) when using a custom cost function in wesnoth.find_path
    • Add wml.load() and wml.parse() functions
    • wml.tostring() now outputs a string that can be parsed back to WML without loss of data.
    • Add wml.clone() function that performs a deep copy of a config or vconfig.
    • Organize API functions into several new (sub)modules: gui, wesnoth.units, wesnoth.interface
    • Allow WML tag names injected with wml.tag to start with underscores.
    • Add a map helper object usable in lua map generators, that supports fast filters. Similar to standard location filters.
    • The lua map generators can now access (read, not write) game variables, from the end of the previous scenario in campaigns
    • The [lua] tag now supports a name= attribute, that is used a a name for the lua code in in stack traces
    • Add wesnoth.generate_default_map to be usable in lua map generators which just invokes the default map generator.
    • Add game_config.combat_experience ### User Interface
    • Don't show in the sidebar the time of day schedule of a shrouded hex. (issue #3638)
    • Make unit_weapons report display weapon specials as active/inactive correctly. (issue #4071)
    • macOS: Dark GUI on macOS Mojave and later when dark appearance is enabled.
    • Observers are now required to enter a game's password as well, rather than just players needing to enter the password. ### Packaging
    • OpenMP support has been removed. It is no longer an optional build-time dependency. ### Units
    • Saurian warriors are now female. (issue #3392)
    • Giant Scorpion now has 20% resistance to arcane and 0% to all other resists
    • Added Sand Scuttler variation to the Giant Scorpion with same resists as original unit
    • Move Fire Dragon portrait from TRoW and SoF to core
    • Move Orcish Leader portraits to Orcish Ruler and use grunt variation portrait for Leader
    • Increased Mermaid Initiate advancement line hitpoints (Diviner 41->45, Enchantress 38->39, Priestess 31->35, Siren 49->51)
    • The Dunefolk faction was overhauled to improve balance against the six Default factions ### WML engine
    • Support formula= key in [variable] ConditionalWML
    • Support to_location in [move_unit], taking a special location ID
    • Support dir in [move_unit] to perform relative movements
    • Support location_id in [teleport], [recall], [unstore_unit] for the target location
    • Support a comma-separated list for location_id key in SLF
    • Support [filter_weapon] in leadership and resistance abilities, which activates the ability only when the affected unit is using a matching weapon.
    • Support [filter_second_weapon] in leadership and resistance abilities, which activates the ability only when the affected unit's opponent is using a matching weapon.
    • Support ['specials'] in abilities except plagues, heal_on_hit and swarm , which emulate the weapon specials with [affect_adjacent] in option and the possibility to affect all weapons filtered(used with 'Initiative' in httt or 'Formation' in utbs). (don't put filter_weapon in 'filter_self/opponent' like in true weapons specials).
    • Support WFL and percentages in [random_placement]num_items=
    • Support [or] in [filter_wml] and similar places
    • Support globbing in [filter_wml] via glob_on_* keys
    • Add trunc as a valid value for [set_variable]round=
    • Remove support for speaker=id in SUF (but retain in [message])
    • Support saner units for some formatting options in [message]
    • Support underline=yes|no in [message]
    • Support [set_variable]root=cube and root=integer
    • Support force_scroll in [move_units_fake] (default no)
    • Support facing= in [role][auto_recall]
    • Support lists for special and special_active in SWF
    • Support usage and alignment in SUF
    • Deprecate [replace_map]map= in favor of map_data=
    • Add u and v variables in ~ADJUST_ALPHA() and ~CHAN()
    • Add clear_shroud in [move_unit] to clear shroud as the unit moves
    • Support male_voice and female_voice in [message]
    • Support [break], [continue], and [return] in [random_placement]
    • [remove_sound_source] now accepts a comma-separated ID list
    • Support [filter_team] in [item] in addition to team_name=
    • Support an optional EXTRA_WML argument to {REMOVE_LABEL}.
    • Support [disallow_end_turn]reason=
    • The {SPECIAL_NOTES_*} macros now start with a newline and a bullet point.
    • Support [unit]jamming=
    • Support [movetype]flying= and deprecate [movetype]flies=, for consistency with [unit]flying=
    • Add [set_menu_item] persistent=yes/no.
    • [modify_unit] now has a faster lua implementaion for the most common cases.
    • [unit] moves=-1 no longer removes attacks.
    • [item] supports a z_order attribute that describes in which order the items are drawn.
    • New terrain_mask implementation, adds alignment= attibute to terrain_mask. ### Miscellaneous and bug fixes
    • Rest healing now happens on turn 2. (issue #3562)
    • Normal healing now happens on turn 1 for all sides except the first. (issue #3562)
    • [change_theme] no longer requires running a separate action to update the UI afterwards (e.g. [redraw]) and the status panels are updated immediately. as well.
    • Re-added the Font Scaling preference.
    • Enabled wesnothd and campaignd to accept IPv6 connections too
    • Added support for directly supplying IPv6 address of the server to multiplayer client and addon client. It must be done like this: [ipv6_address] or [ipv6_address]:port
    • Show ability of a selected unit as active/inactive with respect to mouseover hex. (issue #3912)
    • macOS: Wesnoth now uses the app sandboxing feature, which means there is a new location for saves. All saves will be migrated during first launch automatically. For info about backwards compatibility see: https://gist.github.com/hrubymar10/eb5afd896f933a46fac344ced940e020
    • The sidebar, recall dialog, etc now show attack's range (melee/ranged) and damage type (arcane/blade/cold/...) using icons. (PR #3732, #3740)
    • Add hit count statistics to the statistics dialog. (PR #4070)
    • Added FULL option for :droid command. (PR#4147)
    • Observers must now also enter the password before observing a game that is password protected. (PR#4140)
    • A message is now displayed when observers share IP addresses. (PR#4138)
    • Game bans are now also enforced by username. (PR#4139)
    • Usernames on the host's ignore list are automatically banned. (PR#4143)