https://wiki.wesnoth.org/api.php?action=feedcontributions&user=Dugi&feedformat=atomThe Battle for Wesnoth Wiki - User contributions [en]2024-03-29T15:05:53ZUser contributionsMediaWiki 1.31.16https://wiki.wesnoth.org/index.php?title=DirectActionsWML&diff=59935DirectActionsWML2018-08-28T05:43:09Z<p>Dugi: /* [object] */ Added a sentence about another undocumented change that begun crashing event code</p>
<hr />
<div>{{WML Tags}}<br />
== Direct actions ==<br />
<br />
Direct actions are actions that have a direct effect on gameplay. They can be used inside of [[EventWML|events]].<br />
<br />
The following tags are actions:<br />
<br />
=== [endlevel] ===<br />
Ends the scenario.<br />
* '''result''': before the scenario is over, all events with ''name=result'' are triggered. If ''result=victory'', the player progresses to the next level (i.e., the next scenario in single player); if ''result=defeat'', the game returns to the main menu. <br />
<br />
When the result is "victory" the following keys can be used:<br />
* '''bonus''': whether the player should get bonus gold (maximum possible gold that could have been earned by waiting the level out). The default is bonus=yes. {{DevFeature1.13|2}} Alternatively, a number, defining the bonus multiple (1.0 meaning full).<br />
* '''carryover_report''': whether the player should receive a summary of the scenario outcome, the default is carryover_report=yes.<br />
* '''save''': whether a start-of-scenario save should be created for the next scenario, the default is save=yes. Do not confuse this with saving of replays for the current scenario.<br />
* '''replay_save''': whether a replay save for the current scenario is allowed, the default is replay_save=yes. If yes, the player's settings in preferences will be used to determine if a replay is saved. If no, will override and not save a replay.<br />
* '''linger_mode''': If ...=yes, the screen is greyed out and there's the possibility to save before advancing to the next scenario, the default is linger_mode=yes.<br />
* '''reveal_map''': (Multiplayer only) (Default is 'yes') If 'no', shroud doesn't disappear when game ended.<br />
* '''next_scenario''': (default specified in '''[scenario]''' tag) the ID of the next scenario that should be played. All units that side 1 controls at this point become available for recall in ''next_scenario''.<br />
* '''carryover_percentage''': by default 80% of the gold is carried over to the next scenario, with this key the amount can be changed.<br />
* '''carryover_add''': if yes the gold will be added to the starting gold the next scenario, if no the next scenario will start with the amount of the current scenario (after taxes) or the minimum in the next scenario. Default is no.<br />
* '''music''': (default specified in '''[scenario]''' or '''[game_config]''' tags) a comma-separated list of music tracks from which one will be chosen and played once after any events related to the end of level result are executed; by default, victory_music is used on victory, and defeat_music on defeat.<br />
* '''end_credits''': Whether to display the credits screen at the end of a single-player campaign. Defaults to ''yes''. Note that this has cumulative effects over the campaign - it persists even if the endlevel does not trigger the end of the campaign. See also [[CampaignWML]].<br />
* '''end_text''': (translatable) Text that is shown centered in a black screen at the end of a campaign. Defaults to "The End". Note that this has cumulative effects over the campaign - it persists even if the endlevel does not trigger the end of the campaign. See also [[CampaignWML]].<br />
* '''end_text_duration''': Delay, in milliseconds, before displaying the game credits at the end of a campaign. In other words, for how much time '''end_text''' is displayed on screen. Defaults to 3500. Note that this has cumulative effects over the campaign - it persists even if the endlevel does not trigger the end of the campaign. See also [[CampaignWML]].<br />
* <strike>'''[next_scenario_settings]''': Any tags or attribute children of this optional argument to [endlevel] are merged into the scenario/multiplayer tag of the *next* scenario. This allows you to e.g. reconfigure the [side] tags or settings, just before load. </strike> This feature was removed in 1.11.17, it might be redesigned and reintroduced.<br />
* <strike>'''[next_scenario_append]''': Any tags of this optional argument are appended at high level to the next scenario. This is most appropriate for [event] tags, although you may find other uses. Example test scenario for these features: https://gna.org/support/download.php?file_id=20119 </strike> This feature was removed in 1.11.17, it might be redesigned and reintroduced.<br />
* '''[result]''' {{DevFeature1.13|0}} Allows specification of a side specific result, this is for competitive multiplayer scenarios/campaigns where it might happen that one player wins but another player loses. The following attributes are accepted and have the same effect as in '''[endlevel]''':<br />
** '''result'''<br />
** '''bonus'''<br />
** '''carryover_percentage'''<br />
** '''carryover_add'''<br />
<br />
And there is also<br />
** '''side''' The number of the side for which these results should apply.<br />
<br />
=== [unit] ===<br />
Creates a unit (either on the map, on a recall list, or into a variable for later use.) For syntax see [[SingleUnitWML]].<br />
* {{Short Note:Predefined Macro|GENERIC_UNIT}}<br />
<br />
=== [recall] ===<br />
Recalls a unit taking into account any [http://wiki.wesnoth.org/SingleUnitWML filter_recall] of the leader. The unit is recalled free of charge, and is placed near its leader, e.g., if multiple leaders are present, near the first found which would be able to normally recall it.<br />
<br />
If neither a valid map location is provided nor a leader on the map would be able to recall it, the tag is ignored.<br />
<br />
* [[StandardUnitFilter]]: the first matching unit will be recalled. If no units match this tag is ignored. Do not use a [filter] tag. If a comma separated list is given, every unit currently considered for recall is checked against all the types (not each single one of the types against all units).<br />
* '''x,y''': the unit is placed here instead of next to the leader.<br />
* '''show''': yes/no, default yes: whether the unit is animated (faded in) or instantly displayed<br />
* '''fire_event''': boolean yes|no (default no); whether any according prerecall or recall events shall be fired.<br />
* '''check_passability''': (boolean yes|no, default yes): If yes, checks for terrain passability when placing the unit (a nearby passable hex is chosen).<br />
* '''[secondary_unit]''': {{DevFeature1.13|?}} If present and show=yes, a matching unit will be chosen and their recruiting animation played.<br />
<br />
=== [teleport] ===<br />
Teleports a unit on map. {{Short Note:Predefined Macro|TELEPORT_UNIT}}<br />
* '''[filter]''': [[StandardUnitFilter]] the first unit matching this filter will be teleported.<br />
* '''x,y''': the hex to teleport to. If that hex is occupied, the closest unoccupied hex will be used instead.<br />
* '''clear_shroud''': should shroud be cleared on arrival<br />
* '''animate''': should a teleport animation be played (if the unit doesn't have a teleport animation, it will fade out/fade in)<br />
* '''check_passability''': (boolean yes|no, default yes): normally, units will not be teleported into terrain that is impassable for them. Setting this attribute to "no" permits it.<br />
<br />
(Note: There is also a ability named teleport, see [[AbilitiesWML]].)<br />
<br />
=== [terrain_mask] ===<br />
Changes the terrain on the map. See [[TerrainMaskWML]].<br />
<br />
=== [terrain] ===<br />
Changes the terrain on the map.<br />
* '''terrain''': the character of the terrain to use. See [[TerrainCodesWML]] to see what letter a type of terrain uses.<br />
* [[StandardLocationFilter]]. This [[StandardLocationFilter]]'s terrain= key is used for the new terrain, filtering by terrain can be done with a nested [[StandardLocationFilter]]: [and]terrain=terrain_string_to_be_filtered_for.<br />
* '''layer''': (overlay|base|both, default=both) only change the specified layer.<br />
* '''replace_if_failed''': (default=no) When replacing just one layer failed, try to replace the whole terrain. If '''terrain''' is an overlay only terrain, use the default_base as base layer. If the terrain has no default base, do nothing.<br />
<br />
If you want to remove the overlays from a terrain and leave only the base, use:<br />
layer=overlay<br />
terrain="^"<br />
<br />
<b>Note:</b> When a hex changes from a village terrain to a non-village terrain, and a team owned that village it loses that village. When a hex changes from a non-village terrain to a village terrain and there is a unit on that hex it does not automatically capture the village. The reason for not capturing villages it that there are too many choices to make; should a unit lose its movement points, should capture events be fired. It is easier to do this as wanted by the author in WML.<br />
<br />
=== [gold] ===<br />
Gives sides gold.<br />
* '''amount''': the amount of gold to give.<br />
* '''side''': (default=1) the number of the side to give the gold to. Can be a comma-separated list of sides. note: Default side=1 for empty side= is deprecated.<br />
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
<br />
=== [unstore_unit] ===<br />
Creates a unit from a game variable, and activates it on the playing field. This must be a specific variable describing a unit, and may not be an array -- to unstore an entire array, iterate over it. The variable is not cleared. See also [[InternalActionsWML#.5Bstore_unit.5D|[store_unit]]], [[ConditionalActionsWML#.5Bwhile.5D|[while]]] and [[InternalActionsWML#.5Bclear_variable.5D|[clear_variable]]].<br />
* '''variable''': the name of the variable.<br />
* '''find_vacant''': whether the unit should be placed on the nearest vacant tile to its specified location. If this is set to 'no'(default), then any unit on the same tile as the unit being unstored will be destroyed. <br />
* '''check_passability''': (boolean yes|no, default yes): If yes, checks for terrain passability when placing the unit. This key has no effect if find_vacant=no (no check performed then). Before 1.9 this key is always "no".<br />
* '''text''': (translatable) floating text to display above the unit, such as a damage amount<br />
* '''male_text''', '''female_text''': {{DevFeature1.13|2}} (translatable) gender-specific versions of the above<br />
* '''red''', '''green''', '''blue''': (default=0,0,0) the color to display the text in. Values vary from 0-255. You may find it convenient to use the {COLOR_HARM} or {COLOR_HEAL} macro instead. (Use {COLOR_HARM} or {COLOR_HEAL} instead of the whole red,green,blue= line.)<br />
* '''advance''': (default=yes) if yes the unit is advanced if it has enough XP. When modifying XP make sure to do it from inside a [[EventWML#Multiplayer_safety|synchronized event]] or it may lead to OOS errors especially when several advancement paths exist. Note that advance and post advance events are called, so infinite loops can happen.<br />
* '''fire_event''': (boolean yes|no, default no) Whether any advance/post advance events shall be fired if an advancement takes place, no effect otherwise.<br />
* '''animate''': (boolean yes|no, default yes) Whether "levelout" and "levelin" (or fade to white and back) animations shall be played if an advancement takes place, no effect otherwise.<br />
* '''x''' ,'''y''': override unit location, "x,y=recall,recall" will put the unit on the unit's side's recall list.<br />
Units can be unstored with negative (or zero) hit points. This can be useful if modifying a unit in its last_breath event (as the unit's death is already the next step), but tends to look wrong in other cases. In particular, it is possible to have units with negative hit points in play. Such units are aberrations, subject to unusual behavior as the game compensates for them. (For example, such units are currently automatically hit&ndash;and killed&ndash;in combat.) The details of the unusual behavior are subject to change between stable releases without warning.<br />
<br />
=== [allow_recruit] ===<br />
Allows a side to recruit units it couldn't previously recruit.<br />
* '''type''': the types of units that the side can now recruit.<br />
* '''side''': (default=1) the number of the side that is being allowed to recruit the units. This can be a comma-separated list note: Default side=1 for empty side= is deprecated.<br />
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
<br />
=== [allow_extra_recruit] ===<br />
Allows a leader to recruit units it couldn't previously recruit.<br />
These types add to the types the leader can recruit because of [side]recruit=.<br />
* '''extra_recruit''': the types of units that the unit can now recruit.<br />
* '''[[StandardUnitFilter]]''': All units matching this filter are modified. Does not match on recall list units.<br />
<br />
=== [disallow_recruit] ===<br />
Prevents a side from recruiting units it could previously recruit.<br />
* '''type''': the types of units that the side can no longer recruit. {{DevFeature1.13|0}} If omitted, all recruits for matching sides will be disallowed.<br />
* '''side''': (default=1) the number of the side that may no longer recruit the units. This can be a comma-separated list note: Default side=1 for empty side= is deprecated.<br />
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
<br />
=== [disallow_extra_recruit] ===<br />
Prevents a leader from recruiting units it could previously recruit.<br />
* '''extra_recruit''': the types of units that the side can no longer recruit.<br />
* '''[[StandardUnitFilter]]''': All units matching this filter are modified. Does not match on recall list units.<br />
<br />
=== [set_recruit] ===<br />
Sets the units a side can recruit.<br />
* '''recruit''': the types of units that the side can now recruit.<br />
* '''side''': (default=1) the number of the side that is having its recruitment set. This can be a comma-separated list. note: Default side=1 for empty side= is deprecated.<br />
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
<br />
=== [set_extra_recruit] === <br />
Sets the units a leader can recruit.<br />
* '''extra_recruit''': the types of units that the leader can now recruit.<br />
* '''[[StandardUnitFilter]]''': All units matching this filter are modified. Does not match on recall list units.<br />
<br />
=== [modify_side] ===<br />
Modifies some details of a given side in the middle of a scenario. '''The following listed properties are the only properties that [modify_side] can affect!'''<br />
* '''side''': (default=1) the number of the side that is to be changed. note: Default side=1 for empty side= is deprecated.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] as argument<br />
* '''income''': the income given at the begining of each turn.<br />
* '''recruit''': a list of unit types, replacing the side's current recruitment list.<br />
* '''team_name''': the team in which the side plays the scenario.<br />
* '''user_team_name''': a translatable string representing the team's description. This has no effect on alliances. Defaults to ''team_name''.<br />
* '''side_name''': {{DevFeature1.13|?}} a translatable string representing the side leader's description.<br />
* '''gold''': the amount of gold the side owns.<br />
* '''village_gold''': the income setting per village for the side.<br />
* '''controller''': the identifier string of the side's controller. Uses the same syntax of the ''controller'' key in the [[SideWML|[side]]] tag. warning: in multiplayer, changing the controller of a side might result in OOS during some events like, for example 'side_turn_end'; see [https://github.com/wesnoth/wesnoth/issues/2563 issue #2563].<br />
* '''fog''': a boolean string (yes/no) describing the status of Fog for the side.<br />
* '''shroud''': a boolean string describing the status of Shroud for the side.<br />
* '''hidden''': a boolean string specifying whether side is shown in status table.<br />
* '''color''': a team color range specification, name (e.g. "red", "blue"), or number (e.g. "1", "2") for this side. The default color range names, numbers, and definitions can be found in data/core/team_colors.cfg.<br />
* '''[ai]''': sets/changes AI parameters for the side. Only parameters that are specified in the tag are changed, this does not reset others to their default values. Uses the same syntax as described in [[AiWML]]. Note that [modify_side][ai] works for all simple AI parameters and some, but not all, of the composite ones. If in doubt, use [http://wiki.wesnoth.org/AiWML#Adding_and_Deleting_Aspects_with_the_.5Bmodify_ai.5D_Tag [modify_ai]] instead, which always works. {{DevFeature1.13|?}} If this contains an '''ai_algorithm''', the AI parameters will be reset to those of the indicated AI before adding any additional parameters included in the tag. In other words, this allows replacing the AI config rather than appending to it.<br />
* '''switch_ai''': replaces a side ai with a new AI from specified file(ignoring those AI parameters above). Path to file follows the usual WML convention.<br />
* '''reset_maps''': If set to "yes", then the shroud is spread to all hexes, covering the parts of the map that had already been explored by the side, including hexes currently seen. (Seen hexes will be cleared at the end of most events; they can also be manually cleared with {{tag|InterfaceActionsWML|redraw}}.) This is only effective if shroud is on, but this is evaluated after shroud= (and before shroud_data=).<br />
* '''reset_view''': If set to "yes", then the fog of war is spread to all hexes, covering the parts of the map that had already been seen this turn by the side, including hexes currently seen, excluding hexes affected by multi-turn {{tag|DirectActionsWML|lift_fog}}. (Seen hexes will be cleared at the end of most events; they can also be manually cleared with {{tag|InterfaceActionsWML|redraw}}.) This is only effective if fog is on, but this is evaluated after fog=.<br />
* '''share_maps''': change the share_maps side attribute. Be sure to use shroud=yes for that side and have it as an ally<br />
* '''share_view''': change the share_view side attribute. Be sure to use fog=yes for that side and have it as an ally<br />
* '''share_vision''': change both the above at the same time<br />
* '''shroud_data''': changes to the side's shroud, using the same format as when defining the [side].<br />
* '''suppress_end_turn_confirmation''': Boolean value controlling whether or not a player is asked for confirmation when skipping a turn.<br />
* '''scroll_to_leader''': Boolean value controlling whether or not the game view scrolls to the side leader at the start of their turn when present.<br />
* '''flag''': Flag animation for villages owned by this side (see [[SideWML|[side]]]).<br />
* '''flag_icon''': Flag icon used for this side in the status bar (see [[SideWML|[side]]]).<br />
* '''village_support''': The number of unit levels this side is able to support (does not pay upkeep on) per village it controls.<br />
* '''defeat_condition''' {{DevFeature1.13|0}}: When the side is considered defeated (see [[SideWML|[side]]]).<br />
<br />
=== [modify_turns] ===<br />
Modifies the turn limit in the middle of a scenario.<br />
* '''value''': the new turn limit.<br />
* '''add''': if used instead of ''value'', specifies the number of turns to add to the current limit (can be negative).<br />
* '''current''': changes the current turn number after applying turn limit modifications, if any. It is not possible to change the turn number to exceed the turn limit (1 <= current turns <= max turns).<br />
<br />
=== [allow_end_turn] ===<br />
Allows human players to end their turn through the user interface if they were previously affected by the '''[disallow_end_turn]''' action. This action doesn't take any arguments.<br />
<br />
=== [disallow_end_turn] ===<br />
Disallows human players to end their turn through the user interface. This action doesn't take any arguments.<br />
<br />
=== [capture_village] ===<br />
Changes the ownership of a village.<br />
* [[StandardLocationFilter]]: all village locations matching the filter are affected.<br />
* '''side''': the side that takes control of the village. This side needs to have a leader (canrecruit=yes). If the side key is not given, the village will become neutral (unless [filter_side] is present, in which case that side fiter decides, see below).<br />
* '''[filter_side]''' with [[StandardSideFilter]] tags and keys as arguments; if both this tag and inline side= are present it's an error. Otherwise, the first matching side gets ownership (or the village becomes neutral if none match).<br />
* '''fire_event''' (boolean yes|no, default: no): Whether any capture events shall be fired.<br />
<br />
=== [kill] ===<br />
Removes all units (including units in a recall list) that match the filter from the game.<br />
* [[StandardUnitFilter]]: Selection criterion; do not use a [filter] tag.<br />
* '''animate''' (default 'no'): if 'yes', displays the unit dying (fading away). {{DevFeature1.13|8}} If '''[secondary_unit]''' is given, also plays the victory animation of that unit.<br />
* '''fire_event''' (default 'no'): if 'yes', triggers any appropriate 'die' events (See [[EventWML]]). Note that events are only fired for killed units that have been on the map (as opposed to recall list).<br />
* '''[secondary_unit]''' with a [[StandardUnitFilter]] as argument. Do not use a [filter] tag. Has an effect only if fire_event=yes ({{DevFeature1.13|8}} or if it has a victory animation and animate=yes). The first on-map unit matching the filter becomes second_unit in any fired die and last breath events. If an on-map unit matches and if there are several units killed with a single [kill] tag, second_unit is this same unit for all of them. If no on-map unit matches or [secondary_unit] isn't present, the variable second_unit in each of the die and last breath events is always the same as the variable unit (the dying unit).<br />
* '''[primary_attack]''', '''[secondary_attack]''' {{DevFeature1.13|8}} The attacks to use for matching the animation. Useful for example on the wose, whose death animation depends on the damage type it was killed by.<br />
<br />
=== [move_unit] ===<br />
works like the MOVE_UNIT macro.<br />
* [[StandardUnitFilter]] as argument; do not use a [filter] tag. All units matching the filter are moved. If the target location is occupied, the nearest free location is chosen.<br />
* '''to_x''' (unsigned integer): The units are moved to this x coordinate. Can be a comma-separated list, in which case the unit follows this given path during the move.<br />
* '''to_y''' (unsigned integer): The units are moved to this y coordinate. Can be a comma-separated list.<br />
* '''fire_event''' (optional, boolean yes|no, default no): Whether any according moveto events shall be fired. The target location ($x1, $y1 in the event) may not be the same location that the unit was tried to be moved to, if the original target location is occupied or impassable.<br />
* '''check_passability''' (boolean yes|no, default yes): Whether the terrain the unit is moved to should be checked for suiting the unit. (If it does not, a nearby suitable hex is chosen.)<br />
* '''force_scroll''': Whether to scroll the map or not even when [[InterfaceActionsWML#.5Block_view.5D|[lock_view]]] is in effect or ''Follow Unit Actions'' is disabled in ''Advanced Preferences''. Defaults to using [[InterfaceActionsWML#.5Bmove_unit_fake.5D|[move_unit_fake]]]'s default value.<br />
<br />
=== [modify_ai] ===<br />
Changes AI objects (aspects, goals, candidate actions or stages) for a specified side. See [[Modifying_AI_Components#The_.5Bmodify_ai.5D_Tag|Modifying AI Components]] for full description.<br />
<br />
* '''action''' (string): Takes values 'add', 'change', 'delete' or 'try_delete' to do just that for the AI object.<br />
* '''path''' (string): Describes which AI object is to be modified. <br />
* '''[facet]''', '''[goal]''', '''[candidate_action]''' or '''[stage]''': Details about the AI object to be modified.<br />
* [[StandardSideFilter]] tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
<br />
=== [modify_unit] ===<br />
works similar to the MODIFY_UNIT macro.<br />
* '''[filter]''' with a [[StandardUnitFilter]] as argument. All units matching this filter are modified. Matches on recall list units too.<br />
* '''[object]''', '''[trait]''', {{DevFeature1.13|5}} '''[advancement]''' - The given modifications will be immediately applied to all units matching the filter.<br />
** '''delayed_variable_substitution''' {{DevFeature1.13|5}} (boolean yes|no, default no): If set to "yes", the wml block contained in this [object], [trait], or [advancement] is not variable-substituted at execution time of the event containing this [modify_unit]. You need this for any effect that uses variable substitution or when using [effect][filter] with a $this_unit. {{DevFeature1.13|9}} This is no longer needed when adding ABILITY_TELEPORT, ABILITY_LEADERSHIP or SPECIAL_BACKSTAB.<br />
* '''[effect]''' {{DevFeature1.13|6}} Applies the effect directly to the unit.<br />
* Accepts generally the syntax inside of wml unit variables created by [store_unit] which can be viewed in a savefile or by using the [[CommandMode|inspect command]]. Cannot remove things or add/alter unit animations. Subtags with the same name must be written in the correct order to match them with the tag they are supposed to modify. Note that keys will be processed in arbitrary order, which may cause problems if you use formulas that depend on other formulas. To work around this you may need to use the tag twice with the same filter.<br />
example usage (see also the test scenario):<br />
<syntaxhighlight lang='wml'><br />
[modify_unit]<br />
[filter]<br />
x,y=38,6<br />
[/filter]<br />
hitpoints=10<br />
{TRAIT_HEALTHY}<br />
[/modify_unit]<br />
</syntaxhighlight><br />
<br />
The unit which is currently modified is accessible via $this_unit, e.g. hitpoints = "$($this_unit.hitpoints / 2)" to set the hitpoints of all units to half of their particular maxima. This this_unit variable is independent from the this_unit variable available in the SUF used to determine which units to modify (first all matching units are gathered, and then all those are modified).<br />
<br />
=== [transform_unit] ===<br />
Transforms every unit on the map matching the filter to the given unit type. Keeps intact hit points, experience and status. If the unit is transformed to a non-living type (undead or mechanical), it will be also unpoisoned. Hit points will be changed if necessary to respect the transformed unit's maximum hit points.<br />
* [[StandardUnitFilter]]: do not use a [filter] tag.<br />
* '''transform_to''': the unit type in which all the units matching the filter will be transformed. If missing, the units will follow their normal advancement.<br />
<br />
=== [petrify] ===<br />
<br />
* [[StandardUnitFilter]] as an argument. Do not use a [filter] tag. All units matching this filter are petrified. Recall list units are included.<br />
<br />
=== [unpetrify] ===<br />
* [[StandardUnitFilter]] as an argument. Do not use a [filter] tag. All units matching this filter are unpetrified. Recall list units are included.<br />
<br />
=== [object] ===<br />
Gives some unit an object which modifies their stats in some way.<br />
* '''id''': (Optional) allows the item to be removed later. By default, an object with a defined ID can only be picked up once per scenario, even if it is removed later or first_time_only=no is set for the event. You can remove this restriction by setting take_only_once=no. For filtering objects, it might be simpler to use a custom key such as item_id. The id string can contain only letters, numbers and underscores.<br />
* '''take_only_once''': (default yes) {{DevFeature1.13|6}} If set to "no", the object's ID does not prevent it from being taken more than once.<br />
* '''delayed_variable_substitution''' (boolean yes|no, default no): If set to "yes", the wml block contained in this [object] is not variable-substituted at execution time of the event where this [object] is within. You need this for any effect that uses variable substitution or when using [effect][filter] with a $this_unit. {{DevFeature1.13|9}} This is no longer needed when adding ABILITY_TELEPORT, ABILITY_LEADERSHIP or SPECIAL_BACKSTAB.<br />
* '''[effect]''': one or more effect elements may be listed. See [[EffectWML]] for a description of [effect].<br />
* '''duration''':<br />
**if 'scenario', effects only last until the end of the level (note : 'level' is the scenario, so this doesn't mean it last until the unit levels-up).<br />
**if 'forever' or not set, effects never wear off.<br />
** if 'turn', effects only last until the start of the unit's next turn (when the unit refreshes movement and attacks). (Like other start-of-turn behavior, objects with a duration of "turn" won't expire before turn 2.)<br />
** {{DevFeature1.13|1}} if 'turn end' or 'turn_end', effects only last until the end of the unit's next turn (exactly like the slowed status).<br />
* '''[filter]''' with a [[StandardUnitFilter]] as argument. The first unit found that matches the filter will be given the object. Only on-map units are considered. If no unit matches or no [filter] is supplied, it is tried to apply the object to the unit at the $x1,$y1 location of the event where this [object] is in. The case of no unit being at that spot is handled in the same way as no unit matching a given filter ([else] commands executed, cannot_use_message displayed)<br />
* '''[then]''': a subtag that lets you execute actions if the filter conditions are met. The most common action that should be inside here is a '''[remove_item]''' tag, but you could probably put any tags that otherwise work in a [then] tag.<br />
* '''[else]''': a subtag that lets you execute actions if the filter conditions are *not* met.<br />
* '''silent''': whether or not messages should be suppressed. Default is "no". {{DevFeature1.13|2}} If no description is provided, this defaults to yes, but can still be overridden.<br />
* '''image''': the displayed image of the object.<br />
* '''name''': (translatable) displayed as a caption of the image.<br />
<br />
* '''description''': (translatable) displayed as a message of the image.<br />
* '''cannot_use_message''': (translatable) displayed instead of '''description''' if no unit passes the filter test.<br />
<br />
=== [remove_object] ===<br />
<br />
{{DevFeature1.13|6}}<br />
<br />
Removes an object from matching units.<br />
<br />
* [[StandardUnitFilter]]: All units matching the filter have matching objects removed. Use no [filter] tag.<br />
* '''object_id''': The id of the object to be removed.<br />
<br />
=== [remove_shroud] ===<br />
Removes some shroud from the map for a certain side (only relevant for sides that have shroud=yes).<br />
* '''side''': (default=1) the side for which to remove shroud. This can be a comma-separated list of sides. note: Default side=1 for empty side= is deprecated.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] as argument<br />
* [[StandardLocationFilter]]: the range of tiles for which shroud should be removed<br />
<br />
=== [place_shroud] ===<br />
Places some shroud on the map for a certain side (only relevant for sides that have shroud=yes).<br />
* '''side''': (default=1) the side for which to place shroud. This can be a comma-separated list. note: Default side=1 for empty side= is deprecated.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] as argument<br />
* [[StandardLocationFilter]]: the range of tiles on which shroud should be placed<br />
<br />
=== [lift_fog] ===<br />
Lifts the fog of war from parts of the map for a certain side (only relevant for sides that have fog=yes), allowing a player to witness what occurs there even if that player has no units within vision range.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] indicating which sides should be affected.<br />
* [[StandardLocationFilter]]: the tiles from which fog should be lifted.<br />
* '''multiturn''': ''yes/no, default:no''. The default (not multiturn) causes fog to be removed in the same way that normal vision works; the cleared tiles will remain cleared until fog is recalculated (which normally happens when a side ends its turn). When multiturn is set to "yes", the cleared tiles remain clear until {{tag||reset_fog}} cancels the clearing. This allows tiles to remain clear for multiple turns, or to be refogged before the end of the current turn (without also refogging all tiles). Multiturn lifted fog is not shared with allies (even when share_view=yes).<br />
<br />
=== [reset_fog] ===<br />
The primary use of this tag is to remove multiturn lifted fog (created by {{tag||lift_fog}}), which causes the fog to reset to what it would have been had WML not interfered. (That is, hexes that a side's units could not see at any point this turn will be re-fogged, while seen hexes remain defogged.)<br />
* '''[filter_side]''' with a [[StandardSideFilter]] indicating which sides should be affected.<br />
* [[StandardLocationFilter]]: the fog reset will be restricted to these tiles.<br />
* '''reset_view''': ''yes/no, default: no'' If set to "yes", then in addition to removing multiturn fog, the side's current view is canceled (independent of the SLF). This means that all hexes will become fogged for the side unless multiturn fog exists outside the tiles selected by the SLF. Normally, one would want the currently seen hexes to become clear of fog; this is done automatically at the end of many events, and it can be done manually with {{tag|InterfaceActionsWML|redraw}}.<br />
Omitting both the SSF and the SLF would cancel all earlier uses of [lift_fog].<br />
Additionally setting reset_view="yes" would cause the side's entire map to be fogged (unless an ally keeps hexes clear by sharing its view).<br />
<br />
=== [allow_undo] ===<br />
Normally when an event with a handler fires, the player's undo stack is cleared, preventing all actions performed so far from being undone. Including this tag in the event handler prevents the stack from being cleared for this reason, allowing the player to undo actions. (However, the stack might still be cleared for other reasons, such as fog being cleared or combat occurring.) In the common cases, this means '''[allow_undo]''' allows the current action to be undone even though an event was handled. There is a less common case, though &mdash; specifically when handling a menu item, where there is no current action &mdash; and in this case, '''[allow_undo]''' means merely that earlier actions can still be undone.<br />
* Using this tag in a menu item has an additional side effect in 1.11. Starting with version 1.11.1, executing a WML menu item normally counts as doing something as far as the "you have not started your turn yet" dialog is concerned. However, a menu item whose handler includes '''[allow_undo]''' will not count.<br />
<br />
The types of actions that can be undone are movement, recalling, and dismissing a unit from the recall list. If an action is undone, only the position (or existence) of the involved unit will be restored; any altered variables or changes to the game will remain changed after the action is undone. It is up to the scenario designer to avoid abusing this command.<br />
* Technically, if '''[allow_undo]''' is inside an '''[event]''' with ''first_time_only=yes'' (the default setting), and the user undoes the event, then the state of the game has changed in this way: the event will not fire a second time, even though the user undid the action the first time.<br />
* Although recalling can be undone, recruitment can not be undone; this seems to apply even when the recruit's traits are not randomly-generated (tested on 1.12.6 and 1.14.4+dev).<br />
<br />
If an '''[event]''' uses both '''[allow_undo]''' and [[InternalActionsWML#.5Bfire_event.5D|'''[fire_event]''']] then the '''[allow_undo]''' must be after the '''[fire_event]'''.<br />
<br />
Due to a bug in 1.12 (https://gna.org/bugs/?23323) '''[allow_undo]''' should not be used in events that use one of the following things because it might cause OOS: <br />
* [message] with [option]s<br />
* [get_global_variable]<br />
* wesnoth.synchronize_choice<br />
<br />
While in 1.13 using '''[allow_undo]''' together with those things won't give you a guaranteed OOS, there are some non-obvious situations where it will, for example assume the following event:<br />
<br />
[event]<br />
name="moveto"<br />
[message]<br />
message = "message"<br />
[option]<br />
label = "option 1"<br />
[command]<br />
[/command]<br />
[/option]<br />
[option]<br />
label = "option 2"<br />
[command]<br />
[/command]<br />
[/option]<br />
[/message]<br />
[allow_undo]<br />
[/allow_undo]<br />
[/event]<br />
<br />
It will cause OOS when the message is undone: since the event is already executed (erased) on one client only , the clients will disagree about how many choices happen during the next moveto action.<br />
<br />
=== [on_undo] ===<br />
{{DevFeature1.13|2}}<br />
Contains commands to execute when the player undoes the action which triggered the parent event.<br />
*'''delayed_variable_substitution''' {{DevFeature1.13|5}}: ''yes/no, default no (always no before 1.13.5)'' As in [[EventWML]], specifies whether to perform variable substitution when the parent event is run, or when the contents are run. If delayed substitution is used, [[SyntaxWML#Automatically_Stored_Variables|automatically stored variables]] from the parent event context are available, but may occasionally have unexpected values. (In particular, $unit.x and $unit.y may not have the expected value when undoing a move event, though $x1 and $y1 should be correct.)<br />
<br />
Note:<br />
It is not clear where whether the actionwml in [on_undo] in exceuted before or after the action is undone. Also, specially for enter/leave_hex events the units position when executing the [on_undo] code is usually different than when executing the original event. The reccomended way to wokr around these issues is to refer to the unit by is instead of position and store all other needed information variables as 'upvalues'. You can also move the actual undo code to an external event. For example<br />
[event]<br />
name="undo_blah"<br />
first_time_only=no<br />
[store_unit]<br />
id="$moved_unit_id"<br />
[/store_unit]<br />
... do undo stuff stuff<br />
[/event]<br />
<br />
...<br />
... in some other event<br />
[on_undo]<br />
# store ''upvalues<br />
{VARIABLE moved_unit_id $unit.id}<br />
# call actual undo handler<br />
[fire_event]<br />
name = "undo_blah"<br />
[/fire_event]<br />
[on_undo]<br />
<br />
=== [on_redo] ===<br />
{{DevFeature1.13|2}}<br />
Same as [on_undo], except executes the commands on redo. Note that the parent event is not triggered again on a redo.<br />
<br />
{{DevFeature1.13|8}} [on_redo] is deprecated and has no effect anymore.<br />
<br />
Note that [on_redo] is not guaranteed to be called when redoing an action, the engine might also decide to just fire the original events again.<br />
<br />
=== [cancel_action] ===<br />
Although Wesnoth 1.12 does not have this tag, it is the default behavior of {{tag|EventWML|enter_hex}}/{{tag|EventWML|leave_hex}} events in that version.<br />
<br />
{{DevFeature1.13|9}} In this version, [cancel_action] is recognised, but has no effect (a bug).<br />
<br />
{{DevFeature1.13|11}}<br />
In an {{tag|EventWML|enter_hex}}/{{tag|EventWML|leave_hex}} event, interrupt the movement, leaving the unit where it is. This is intended to be used with an event that gives the player new information, to let the player choose whether to change their plans. For example, if the player has commanded a unit to move from (1,1) to (3,3) and attack a unit on (4,4); then a [cancel_action] inside an [enter_hex] event on (2,2) would make the unit stop on (2,2). A [cancel_action] inside an [enter_hex] on (3,3) would let the player choose whether to attack.<br />
<br />
=== [heal_unit] ===<br />
Heal a unit. The variable '''$heal_amount''' will be set to the exact number of points healed (i.e can be less than the parameter '''amount''' if the unit is fully healed). $heal_amount contains only the number of hitpoints the first unit that was found got healed.<br />
* '''[filter]''': [[StandardUnitFilter]] All matching on-map units are healed. If no filter is supplied, it is tried to take the unit at $x1, $y1.<br />
* '''[filter_second]''': [[StandardUnitFilter]] all the units matching the filter ''and'' having the ''heals'' ability will have their animation played (if ''animate'' is set to yes) for each of the units healed.<br />
* '''amount''': (integer, default full) the maximum points the unit(s) will be healed. Can't set below 1 or above max_hitpoints. If "full", sets hitpoints to max_hitpoints. Before 1.9 the default is 0.<br />
* '''animate''': a boolean which indicate if the healing animations must be played. (default no)<br />
* '''moves''': (integer, default 0) The maximum current movement points the units will be "healed". Can't set below 0 or above max_moves. If "full", sets moves to max_moves.<br />
* '''restore_attacks''': (boolean, default no) Whether the units' attacks_left should be reset to their max_attacks (usually 1).<br />
* '''restore_statuses''': (boolean, default yes) Whether standard statuses should be reset to "no". This affects poisoned, slowed, petrified and unhealable. Before 1.9 this is always "no".<br />
<br />
=== [harm_unit] ===<br />
Harms every unit matching the filter, for the specific damage amount.<br />
* '''[filter]''': [[StandardUnitFilter]] all matching units will be harmed (required).<br />
* '''[filter_second]''': [[StandardUnitFilter]] if present, the first matching unit will attack all the units matching the filter above.<br />
* '''amount''': the amount of damage that will be done (required).<br />
* '''alignment''': (default neutral) applies an alignment to the damage, this means that if alignment=chaotic, the damage will be increased at night and reduced at day.<br />
* '''damage_type''': if present, amount will be altered by unit resistance to the damage type specified.<br />
* '''kill''': (default yes) if yes, when a harmed unit goes to or below 0 HP, it is killed; if no its HP are set to 1.<br />
* '''fire_event''': (default no) if yes, when a unit is killed by harming, the corresponding events are fired. If yes, also the corresponding advance and post advance events are fired.<br />
* '''animate''': (default no) if yes, scrolls to each unit before harming it and plays its defense (or attack, if it's the harmer) and death animations. Special values supported, other than the usual yes and no, are "attacker", that means only the harmer will be animated, and "defender", that means only the harmed units will be animated. If the supplied value is yes, attacker or defender also advancement animations are played.<br />
* '''[primary_attack], [secondary_attack]''': these set the weapon against which the harmed units will defend, and that the harming unit will use to attack, respectively (notice this is the opposite of '''[filter]''' and '''[filter_second]''' above). This allows for playing specific defense and attack animations. Both tags are expected to contain a [[FilterWML#Filtering_Weapons|Standard Weapon Filter]].<br />
* '''delay''': if animate=yes, sets the delay (in milliseconds, default 500) between each unit harming.<br />
* '''variable''': if present, the damage caused to the unit, altered by resistances, will be stored in a WML array with the given name, under the "harm_amount" key.<br />
* '''poisoned, slowed, petrified, unhealable''': (default no) if yes, every harmed unit that doesn't already have such status will have it set.<br />
* '''experience''': if yes, and there is a harmer, experience will be attributed like in regular combat.<br />
* '''resistance_multiplier''': the harmed unit's resistance is multiplied by the supplied value; this means that a value lower than 1 increases it, and a value greater than 1 decreases it. Default value is 1, that means no modification.<br />
<br />
=== [time_area] ===<br />
How a day should progress in a given area. Everywhere not specified in a [time_area] tag is affected by the [time] tags in the [scenario] tag.<br />
* [[StandardLocationFilter]]: the locations to affect. ''note: only for [event][time_area]s - at scenario toplevel [time_area] does not support [[StandardLocationFilter]], only location ranges''<br />
* '''[time]''': one or more tags describing the new schedule, see [[TimeWML]].<br />
* '''id''': an unique identifier assigned to a time_area. Optional, unless you want to remove the time_area later. Can be a comma-separated list when removing time_areas, see below.<br />
* '''remove''': (boolean) yes/no value. Indicates whether the specified time_area should be removed. Requires an identifier. If no identifier is used, however, all time_areas are removed.<br />
* '''current_time''': The time slot number (starting with zero) active at the creation of the area.<br />
<br />
''Example:'' (caves in parts of a map)<br />
[time_area]<br />
x=1-2,4-5<br />
y=1-2,1-2<br />
{UNDERGROUND}<br />
[/time_area]<br />
<br />
=== [remove_time_area] ===<br />
<br />
{{DevFeature1.13|2}}<br />
<br />
This is a syntactic shortcut for [time_area] remove=.<br />
* '''id''': Comma-separated list of time area ids to remove.<br />
<br />
=== [end_turn] ===<br />
End the current side's turn. The current event is finished before the turn is ended. Also, if the current event (where the tag appears) has been fired by another event, that event (and the complete stack of other possible parent events) is ended before [end_turn] comes into affect. Also, events following the event stack that fired [end_turn] are not omitted (e.g. [end_turn] is used by a side turn event and a turn refresh event does something afterwards).<br />
<br />
=== [replace_map] ===<br />
<br />
Replaces the entire map.<br />
* '''map''': Content of a wesnoth map file. example:<br />
map="{campaigns/Heir_To_The_Throne/maps/01_The_Elves_Besieged.map}"<br />
* '''map_file''': {{DevFeature1.13|?}} Path to a Wesnoth map file; can be used instead of '''map'''. The file will be loaded when the tag is executed, rather than being embedded wholesale in the preprocessed WML.<br />
* '''expand''': if 'yes', allows the map size to increase. The expansion direction is currently always bottom-right.<br />
* '''shrink''': if 'yes', allows the map size to decrease. If the map size is reduced, any units that would no longer be on the map due to its coordinates no longer existing will be put into the recall list.<br />
Note: When a hex changes from a village terrain to a non-village terrain, and a team owned that village it loses that village. When a hex changes from a non-village terrain to a village terrain and there is a unit on that hex it does not automatically capture the village. The reason for not capturing villages it that there are too many choices to make; should a unit lose its movement points, should capture events be fired. It is easier to do this as wanted by the author in WML.<br />
<br />
=== [replace_schedule] ===<br />
Replace the time of day schedule of the entire scenario.<br />
* [[TimeWML]]: the new schedule.<br />
* '''current_time''': The time slot number (starting with zero) active at schedule replacement.<br />
<br />
=== [tunnel] ===<br />
<br />
Create a tunnel between some locations, later usable by units to move from source hex to target hex (using the movement cost of unit on the target terrain).<br />
<br />
'''Behavior Change as of Wesnoth 1.13.6:''' Vision is now possible (and enabled by default) through tunnels and allied units on the exit hex do not block a tunnel by default any more. This is done in order for moves through tunnels to be consistent with other moves. The previous behavior can still be accomplished by using the new optional keys listed below.<br />
<br />
* '''[filter]''': (required) [[StandardUnitFilter]] the units which can use the tunnel. Leave empty for "all units".<br />
* '''[source]''': (required) [[StandardLocationFilter]] the source hex(es).<br />
* '''[target]''': (required) [[StandardLocationFilter]] the target hex(es).<br />
* '''id''': (optional) identifier for the tunnel, to allow removing.<br />
* '''remove''': (boolean, default: no) If yes, removes all defined tunnels with the same ID (then only id= is necessary).<br />
* '''bidirectional''': (boolean, default: yes) If yes, creates also a tunnel in the other direction. <br />
* '''always_visible''': (boolean, default: no) If yes, the possible movement of enemies under fog can be seen.<br />
* '''allow_vision''': (boolean, default: yes) {{DevFeature1.13|6}} If no, vision through a tunnel is not possible. Note that in that case the tunnel cannot be used if the tunnel exit is under shroud (which previously was ''always'' the case).<br />
* '''pass_allied_units''': (boolean, default: yes) {{DevFeature1.13|6}} If no, allied (including own) units on the exit hex block a tunnel.<br />
<br />
(Note: The tunnel tag can also be used inside the [[AbilitiesWML|[teleport]]] ability, without remove= and id=).<br />
<br />
=== [do_command] ===<br />
<br />
{{DevFeature1.13|0}}<br />
<br />
Executes a command, specified using the same syntax as a [command] tag in [[ReplayWML]]. Not all [command]'s are valid: only these are accepted<br />
<br />
* [attack]<br />
* [move]<br />
* [recruit]<br />
* [recall]<br />
* [disband]<br />
* [fire_event]<br />
* [lua_ai] {{DevFeature1.13|12}} This has been removed and is replaced with [custom_command]<br />
<br />
The tags corresponding to player actions generally use the same codepath as if a player had ordered it. That means for example that only moves that player would be allowed to do are possible, and movement is interrupted when sighting enemy unit.<br />
<br />
One purpose of this tag is to allow scripting of noninteractive scenarios -- without a tag like this, this might require elaborate mechanisms to coerce ais in order to test these code paths.<br />
<br />
This command should always be replay safe.<br />
<br />
=== [put_to_recall_list] ===<br />
<br />
{{DevFeature1.13|0}}<br />
<br />
Puts a unit to the recall list of its side.<br />
* '''[[StandardUnitFilter]]''': the unit(s) to get put to the recall list.<br />
* '''heal''': (default=no) Whether the unit should be refreshed, similar to the unit moving to the recall list at the end of a scenario.<br />
<br />
<br />
== Useful Macros ==<br />
There are some predefined macros that you find useful for direct actions. You can find a complete list along with a detailed explanation of how they work [http://www.wesnoth.org/macro-reference.xhtml here].<br />
* '''{MOVE_UNIT}''': Moves a unit to another location in the map and the player sees the movement (unlike [teleport])<br />
* '''{FULL_HEAL}''': Brings a unit to full HP<br />
* '''{LOYAL_UNIT}''': Create a loyal unit<br />
* '''{MODIFY_TERRAIN_MASK}''': Modify an area of terrain<br />
<br />
== See Also ==<br />
<br />
* [[InternalActionsWML]]<br />
* [[InterfaceActionsWML]]<br />
* [[EventWML]]<br />
* [[ReferenceWML]]<br />
<br />
[[Category: WML Reference]]<br />
[[Category: ActionsWML]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=StandardUnitFilter&diff=58196StandardUnitFilter2017-03-09T08:01:22Z<p>Dugi: it's → its (dammit people, get the spelling together)</p>
<hr />
<div>{{WML Tags}}<br />
<br />
From [[FilterWML]], this is the standard way of filtering units.<br />
<br />
When a unit filter is applied to a map, first it applies to all units on the field,<br />
based on their coordinates.<br />
Next it applies to units in the recall list.<br />
This is important to remember as it means, for example,<br />
that the tag '''[kill]''' can be used to kill units in the recall list.<br />
<br />
You can access the filtered unit within the filter as the ''$this_unit'' variable, see [[SingleUnitWML]] for the possible content of these variables<br />
<br />
The term [[StandardUnitFilter]] means that the set of such keys and tags (see below) can appear at that point. Often a [[StandardUnitFilter]] needs to be included in a [filter] tag. But many tags take the [[StandardUnitFilter]] directly as an argument, like [kill] and [have_unit]. See [[Special:WhatLinksHere/StandardUnitFilter]] for tags which can contain a StandardUnitFilter.<br />
<br />
<br />
<br />
The following attributes and sub-tags are allowed:<br />
<br />
* '''id''': unit matches the given id. This is the same as ''id'' in the [unit] tag. Note that it is independent of a unit's user-visible name, which can be internationalized independent of this (see [[SingleUnitWML]]). id= can be a comma-separated list, every unit with one of these ids matches.<br />
* '''speaker''': alias for id (no comma-separated list supported)<br />
* '''type''': matches the unit's type name (can be a list of types)<br />
* '''type_adv_tree''': {{DevFeature1.13|7}} matches the type name of the unit and all its advancements (can be a list)<br />
* '''race''': the race of the unit type. This can be a comma-separated list; the unit's race must match one of the given races. <br>Mainline races are listed in data/core/units.cfg<br> <br />
* '''ability''': unit has an ability with the given id; see [[AbilitiesWML]]<br />
* '''status''': {{DevFeature1.13|0}} matches if the unit has the specified status active. This can be a comma-separated list, in which case the unit will match as long as it has one of the listed statuses active<br />
* '''side''': the unit is on the given side (can be a list)<br />
* '''has_weapon''': the unit has a weapon with the given name {{DevFeature1.13|5}} Now deprecated<br />
* '''[has_attack]''': {{DevFeature1.13|5}} the unit has a weapon matching the [[StandardWeaponFilter]]. If this is present, '''has_weapon''' is ignored.<br />
* '''canrecruit''': yes if the unit can recruit (i.e. is a leader)<br />
* '''gender''': female if the unit is female rather than the default of male<br />
* '''role''': the unit has been assigned the given role; see '''[role]''', [[InternalActionsWML]]<br />
* '''level''': the level of the unit<br />
* '''defense''': current defense of the unit on current tile (chance to hit %, like in movement type definitions)<br />
* '''movement_cost''': current movement cost of the unit on current tile<br />
* '''x,y''': the position of the unit. Note: there is a special case for units on the recall list such that x,y="recall,recall"<br />
* '''find_in''': name of an array or container variable; if present, the unit will not match unless it is also found stored in the variable<br />
* '''[filter_vision]''': this tests whether or not the unit is currently visible<br />
** '''visible''': yes or no, default yes. When "yes", this matches units that are not obscured by fog or shroud, and that are not hiding (via the {{tag|AbilitiesWML|hides}} ability). When "no", this matches units that are obscured by fog or shroud, or that are hiding.<br />
** [[StandardSideFilter]] tags and keys. Filter for who may be able to see (or not see) the unit. If there is *at least one* matching side which can see the unit then the filter matches, and otherwise it fails to match.<br />
* '''[filter_wml]''': this is WML level filter for the unit. In it, you can filter on anything that is in the WML description of a unit. This description can be found in any savegame also in [[SingleUnitWML]]. If the filter encounters a nested '''[not]''' tag, the attributes and containers inside the tag should not match for the upper filter to match. Note: [filter_wml] is especially slow, unless it contains only a child [variables], which is used for matching variables stored inside the unit.<br />
* '''[and]''': an extra unit filter. Unless the unit also matches the [and] filter, then it will not count as a match. ''Note: [and],[or], and [not] filters are considered after the containing filter; they are then processed in the order encountered.''<br />
* '''[or]''': an extra unit filter. If a unit matches the [or] filter, then it will count as a match regardless of conditions in previous filters or the containing filter.<br />
* '''[not]''': an extra unit filter. If a unit matches the [not] filter, then that unit will not be considered a match by the containing filter.<br />
* '''[filter_adjacent]''' with a StandardUnitFilter as argument; do not use a [filter] tag. If present the correct number of adjacent units must match this filter.<br />
**'''StandardUnitFilter''' tags and keys<br />
** '''count''': a number, range, or comma separated range; default "1-6"<br />
** '''adjacent''': a comma separated list of directions; default "n,ne,se,s,sw,nw" (see [[StandardLocationFilter#Directions|notes]])<br />
** '''is_enemy''': a boolean specifying whether the adjacent unit must be an enemy or an ally (optional)<br />
** '''$other_unit''': {{DevFeature1.13|2}} Within [filter_adjacent], the special variable $other_unit refers to the filtered unit from the enclosing filter, while $this_unit refers (as with all StandardUnitFilters) to the unit being filtered on.<br />
* '''[filter_location]''': [[StandardLocationFilter]] - the tile that the unit is standing on matches the location filter.<br />
*'''[filter_side]''': The currently filtered unit's side must match this [[StandardSideFilter]] for the unit to match.<br />
**[[StandardSideFilter]] tags and keys<br />
* '''formula''': A formula using [[Wesnoth Formula Language]]. The <tt>self</tt> variable is set to the current $this_unit, and the formula should return a boolean. If it returns 0, the filter does not match. Otherwise, the filter does match. {{DevFeature1.13|5}} If the filter has a secondary unit, the formula can access it using the <code>other</code> variable.<br />
* '''lua_function''': the name of a [[LuaWML|Lua]] function in the global environment that takes a unit as an argument and returns true if the given unit matches the filter. {{DevFeature1.13|5}} Non-global functions can now be used here by building a dot-separated "path". Note that this is not actually interpreted as Lua code even though it superficially resembles it, so using a Lua keyword in the path will work, for example "my_filter_functions.goto" will correctly use the function which in actual Lua code would need to be referenced as <code>my_filter_functions["goto"]</code>.<br />
<br />
== A Note about Re-Using the Same Attribute ==<br />
You are limited to having each attribute, such as '''id''', appear once or less in a [[StandardUnitFilter]]. However, this can be worked around. If you have several specific units you want excepted from matching, use a separate [or] subfilters for each one. Also you can use [not] subfilters. For example to kill ([kill] uses the standard unit filter) all units except Gwiti Ha'atel and Tanar you can do the following:<br />
[kill]<br />
[not]<br />
id=Gwiti Ha'atel<br />
[/not]<br />
[not]<br />
id=Tanar<br />
[/not]<br />
[/kill]<br />
:And similarly if you wanted to kill both Gwiti Ha'atel and Tanar, but no one else you could do the following:<br />
[kill]<br />
id=Gwiti Ha'atel<br />
[or]<br />
id=Tanar<br />
[/or]<br />
[/kill]<br />
<br />
== See Also ==<br />
<br />
* [http://wiki.wesnoth.org/FilterWML/Examples_-_How_to_use_Filter Examples - How to use filters]<br />
<br />
<br />
[[Category: WML Reference]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Context-free_grammar&diff=57666Context-free grammar2016-04-12T11:42:06Z<p>Dugi: Created page with "Context-free grammar can be used to generate random strings, from short words to entire paragraphs. If you are interested in its theory, read more on [https://en.wikipedia.org..."</p>
<hr />
<div>Context-free grammar can be used to generate random strings, from short words to entire paragraphs. If you are interested in its theory, read more on [https://en.wikipedia.org/wiki/Context-free_grammar].<br />
<br />
== Syntax ==<br />
In WML, it uses its own simple syntax. It is usually a translatable string and should be in <nowiki><<French quotation marks>></nowiki>. The code is composed from nonterminals. They are written on separate lines. Each nonterminal is substituted by one of its possibilities separated by the <nowiki>|</nowiki> symbol, the name is separated from possibilities with <nowiki>=</nowiki>. The nonterminal that makes the result is named <nowiki>main</nowiki>. The possibilities can contain other nonterminals, marked by <nowiki>{curly brackets}</nowiki>.<br />
<br />
<br />
== Examples ==<br />
<br />
<nowiki>main=Hello world|Hi world|Ahoi world</nowiki><br />
<br />
The result is either ''Hello world'' or ''Hi world'' or ''Ahoi world''.<br />
<br />
<br />
<br />
<nowiki>main=Hello {noun}|Hi {noun}</nowiki><br />
<br />
<nowiki>noun=world|planet|Universe|Earth</nowiki><br />
<br />
The result is either ''Hello'' or ''Hi'', followed by one of the four possible nouns, ''world'', ''planet'', ''Universe'' or ''Earth''.<br />
<br />
== Other rules ==<br />
A nonterminal can reference itself, which can, under the right circumstances, lead to a loop that expands indefinitely, causing a stack overflow. Avoid this unless you really know what you are doing.<br />
<br />
Each nonterminal has a reduced probability for possibilities that were chosen the last time.</div>Dugihttps://wiki.wesnoth.org/index.php?title=UnitsWML&diff=57665UnitsWML2016-04-12T10:45:36Z<p>Dugi: /* [race] */</p>
<hr />
<div>{{WML Tags}}<br />
<br />
The '''[units]''' tag is a [[ReferenceWML#WML_toplevel_tags|top-level WML tag]] which defines the unit types that will be available in the game.<br />
<br />
A [units] tag primarily contains [[UnitTypeWML|[unit_type]]] tags, each of which defines one unit type, and can also contain other tags, which mostly provide definitions of things like races and movement types that are used in unit type definitions.<br />
<br />
== Subtags of [units] ==<br />
<br />
The following tags can be used as subtags of a [units] tag.<br />
<br />
=== [unit_type] ===<br />
<br />
{{Main|UnitTypeWML}}<br />
<br />
In a [units] tag, a [unit_type] tag defines a unit type.<br />
<br />
=== [trait] ===<br />
<br />
The [trait] tag describes a trait. When it appears in the [units] toplevel, it describes a global trait, and all races with the attribute '''ignore_global_traits=no''' will have this trait.; it may also appear in other places.<br />
* '''id''': unique identifier<br />
* '''availability''': describes whether a trait is "musthave" for a race or is available to "any" unit in a race, including leaders, or "none" if it is not normally available, but should be kept when advancing to this unit type. (Traits not available to the advanced unit type at all, are permanently lost upon advancement.) The default is for a trait to only be available to nonleaders. Currently "any" should not be used for traits available in multiplayer. It can be used for campaign specific traits. (Note that currently "musthave" is somewhat misused to have what are really abilities (''undead'' and ''mechanical'') default from a unit type's race. Ideally someone will eventually extend ''race'' to allow for default abilities. It might also be possible to unify traits and abilities with keys to indicate how you get them and what happens to them when you advance, while allowing them to come from race, unit type and unit definitions. There are also display issues related to doing this.)<br />
* '''male_name''': text displayed in the status of unit with the trait if the unit is male.<br />
* '''female_name''': text displayed in the status of unit with the trait if the unit is female.<br />
* '''name''': text displayed in the status of unit with the trait if none of the two above is used.<br />
* '''description''': text displayed for the description of the trait.<br />
* '''[effect]''': described in [[EffectWML]]. More than one of these can be used.<br />
<br />
=== [movetype] ===<br />
<br />
The [movetype] tag is used to make shortcuts to describe units with similar terrain handicaps. Units from the same advancement tree should generally have the same movetype.<br />
* '''name''': an ID for this movetype. Units with the attribute '''movement_type=''name''''' will be assigned this movetype.<br />
* '''flies''': either 'true' or 'false'(default). A unit with ''flies=true'' does not have its image's height adjusted for different terrains.<br />
* '''[movement_costs]''': describes how fast the unit moves on different terrains. The attribute '''terrain=''speed''''' means that the unit will need to use ''speed'' move points to move onto terrain with '''id=''terrain''''' (see [[TerrainWML]]).<br />
* '''[vision_costs]''': describes how far the unit clears fog and shroud on different terrains. The attribute '''terrain=''cost''''' means that the unit will need to use ''cost'' vision points to view into terrain with '''id=''terrain''''' (see [[TerrainWML]]). (If not specified for a particular terrain, the vision cost defaults to the movement cost.)<br />
* '''[defense]''': describes how likely the unit is to be hit on different terrains. The attribute '''terrain=''defense''''' means that the unit will be hit ''defense'' percent of the time in the terrain with '''id=''terrain'''''. If the defense value is negative, then the unit will be hit as though the value were positive with one difference: the number is also the best defense that the unit may have if there is more than one terrain type for the terrain the unit is on.<br />
* '''[resistance]''': describes how much damage the unit takes from different types of attacks. The attribute '''type=''resistance''''' makes the unit receive '''resistance''' percent of damage, or resist '''100-resistance''' percent of damage from attacks with '''type=''type'''''. So for example, a resistance of fire=110 means, this unit will receive 110% of damage, or have a resistance of -10% as displayed in-game. A value of fire=0 would mean, the unit receives no damage and therefore has a resistance of 100%.<br />
<br />
Default keys for the [movement_costs], [vision_costs], and [defense] tags are deep_water, shallow_water, reef, swamp_water, flat, sand, forest, hills, mountains, village, castle, cave, frozen, unwalkable, fungus, and impassable. Default keys for [resistance] are blade, pierce, impact, fire, cold, and arcane.<br />
<br />
=== [race] ===<br />
<br />
The [race] tag is used to make shortcuts to describe units with similar names. Units from the same advancement tree should generally have the same race. Also, units with the same race should generally be recruitable by the same sides/factions.<br />
* '''id''': ID for this race. Units with the attribute '''race=''id''''' will be assigned this race. In older versions of WML, the value of the name key was used as id if the id field was missing, but this is no longer the case.<br />
* '''plural_name''': user-visible name for its people (e.g. "Merfolk" or "Elves"). Currently only used in the in-game help.<br />
* '''male_name''': user-visible name for the race of the male units (e.g. "Merman"). Currently only used in the in-game unit status.<br />
* '''female_name''': user-visible name for the race of the female units (e.g. "Mermaid"). Currently only used in the in-game unit status.<br />
* '''name''': the default value for the three keys above. The 'name' key is the default for 'male_name' and 'female_name'. 'id' and 'plural_name' '''must''' be supplied.<br />
* '''description''': description of this race, used in the race page of the in-game help. Note: currently not used by all mainline races because their descriptions are not ready. But this is already supported by the engine.<br />
* '''name_generator''' {{DevFeature1.13|5}}: [[Context-free grammar]] describing unit names, if absent or invalid, falls back to male_names or female_names<br />
* '''male_name_generator''' {{DevFeature1.13|5}}: Like name_generator, but specific for male names<br />
* '''female_name_generator''' {{DevFeature1.13|5}}: Like name_generator, but specific for female names<br />
* '''male_names''', '''female_names''': lists of names (i.e. non-translatable strings). They are inputted into the Markov name generator to generate random names. ''male_names'' describes units with '''gender=male'''; ''female_names'' describes units with '''gender=female'''.<br />
* '''markov_chain_size''': (default 2) number of letters per "syllable". "Syllables" are groupings of names that the Markov name generator uses to determine names. It does this by running a probability algorithm to guess from the name list which syllables fit well together, which can start or end a name, etc.<br />
* '''num_traits''': is the number of non-repeating traits each unit of this race can be assigned.<br />
* '''ignore_global_traits''': 'yes' or 'no' (default). Determines whether global traits (see [traits] above) are applied.<br />
* '''undead_variation''': sets the default undead variation for members of this race.<br />
* '''[topic]''': describes extra help topics for this race.<br />
* '''[trait]''': describes a trait for this race. See above for syntax.<br />
<br />
=== [resistance_defaults] ===<br />
<br />
{{DevFeature1.13|2}}<br />
<br />
The [resistance_defaults] tag allows you to add resistance for custom damage types to already-defined movetypes (such as core movetypes).<br />
* '''id''': The damage type you want to apply resistance defaults for.<br />
* '''default''': The default resistance for all movetypes. You can set it to a number, or to a [[Wesnoth Formula Language|formula]] (enclosed in parentheses) which can reference any of the default resistance types - arcane, fire, etc. A common usage for formulas might be to set it to be equal to another resistance, eg '''default="(impact)"'''.<br />
* Other keys reference the '''name=''' attribute of a defined movetype. For example, 'smallfoot=50' will set the resistance to 50 for the smallfoot movement type. ''Note:'' The '''default=''' key and other keys are handled slightly differently. A '''default=''' value will never override an explicitly specified value either in the same [resistance_defaults] tag or in a [movetype] definition, but other keys always take priority over values specified in a [movetype] definition.<br />
<br />
=== [terrain_defaults] ===<br />
<br />
{{DevFeature1.13|2}}<br />
<br />
The [terrain_defaults] tag allows you to add costs and defenses for custom terrain types to already-defined movetypes (such as core movetypes).<br />
* '''id''': The '''id=''' attribute of the terrain type you want to apply cost and defense defaults for.<br />
* '''[movement]''', '''[defense]''', '''[jamming]''', '''[vision]''' - Specify the default values using the same syntax as [resistance_defaults] - an optional default key, and subsequent keys which are movetype names. As with [resistance_defaults], you can use [[Wesnoth Formula Language|formulas]] if you enclose them in parentheses.<br />
<br />
=== [hide_help] ===<br />
<br />
The [hide_help] tag allows you to hide some units from the help. Mainly useful if you can't change these units (e.g. mainline units) and thus can't add a 'hide_help=yes' key to them. Only really useful for campaigns, not for eras. The following keys and their contents uses an 'OR' logic between them.<br />
* '''type''': list of unit types.<br />
* '''race''': list of races. Equivalent to all unit types of these races.<br />
* '''type_adv_tree''': list of unit types. Equivalent to all these types and their advancement trees.<br />
* '''all''': 'yes' or 'no' (default). 'yes' is equivalent to all unit types (useful before [not])<br />
* '''[not]''': all the previous keys (except 'all') can also be used in [not] sub-tags. And you can use [not] recursively. For example, if you want to only show the Yeti and the human race except the mage tree, use:<br />
[hide_help]<br />
all=yes<br />
[not]<br />
type=Yeti<br />
race=human<br />
[not]<br />
type_adv_tree=Mage<br />
[/not]<br />
[/not]<br />
[/hide_help]<br />
<br />
== See Also ==<br />
<br />
* [[UnitTypeWML]]<br />
* [[ReferenceWML]]<br />
<br />
[[Category: WML Reference]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Talk:CodingStandards&diff=57660Talk:CodingStandards2016-03-31T13:24:15Z<p>Dugi: /* Obsolete? */ new section</p>
<hr />
<div>* snprintf considered harmful<br />
<br />
Wesnoth's coding standards suggest using snprintf instead of sprintf. But snprintf does not guarantee null termination on all platforms -- notably, not on Windows / MSVC6 ( ref: http://www.derkeiler.com/Mailing-Lists/securityfocus/vuln-dev/2002-05/0505.html ). And some "n" string functions (notably strncpy) have guarantee the buffer is filled with nulls following the copied data, which is usually innocuous but can be nasty if you have a large buffer in an inner loop ---<br />
<br />
/* example code */<br />
char buf[512];<br />
<br />
strncpy( buf, sizeof(buf), ps ); /* <-- always writes all 512 bytes! */<br />
<br />
/* ensure termination */<br />
buf[ sizeof(buf) - 1 ] = '\0';<br />
<br />
The correct (but annoying and non-portable solution) is to use the new "l" versions of these functions -- strlcpy, slprintf, etc. But these are not standards. And Microsoft invented their own version of all of them with different names for the MSVC7/8 libraries.<br />
<br />
== Obsolete? ==<br />
<br />
The C++11 banning part is clearly obsolete, C++11 is currently supported pretty much everywhere and I have found C++11 specific code in wesnoth's source code (this might be new, because the cmake script is not yet updated to compile it and crashes that it can't compile 'nullptr').</div>Dugihttps://wiki.wesnoth.org/index.php?title=DeadlyUnitsFromLotI&diff=56738DeadlyUnitsFromLotI2015-09-02T20:00:35Z<p>Dugi: /* Evil Healer (Lich King) */</p>
<hr />
<div>= Legend of the Invincibles - Deadly units =<br />
I ([[User:Ashes]]) created this wiki page to share tips and tricks for Legend of the Invincibles, and mainly to share deadly units. This campaign has a gameply so different from the standard BfW game that the usual tricks are no more relevant. The start of the campaign is good to help the beginner, but some other things can only be learned later, when playing.<br />
<br />
== Boss killers ==<br />
Sometimes, there is a villain with hundreds of hitpoints. One possibility is to carefully organise a long fight that will kill the villain. But in practice it is more efficient to have a boss killer that will kill it in one turn.<br />
<br />
=== Berserker draining dwarf ===<br />
My ([[User:Ashes]]) favourite boss killer.<br />
A Dwarvish Battlerager with a Soul Eclipse axe. Unless the enemy resists drain, or the enemy is very difficult to hit, this dwarf is deadly.<br />
<br />
I also equipped my Dwarvish Battlerager with a Mithral Armour of Wrath (wrath is very useful for berserkers) and some additional but less important items (a Deadborn cloak to suck 2 health and to have 5% chance to strike a devastating blow; boots of Lightning agility and Lucky Farmer's Amulet to reduce chances of getting hit, gauntlets of Fiery Blood to be able to choose between fire damage and blade damage, ...)<br />
<br />
Why is he better:<br />
Full fledged berserk means a huge number of attacks - either he dies or the target dies.<br />
<br />
=== Destroyer (Part II equipment) ===<br />
My ([[User:dabber]]) primary solo boss killer.<br />
Destroyer with Jawbreaker as his weapon, because that provides Mayhem (target damage drops after each hit). Need AMLAs for Battle Frenzy and its upgrades to give him 30 attacks. Jawbreaker provides only suck 2, but a little bit more suck from other items combined with his natural physical resistances mean he does fine.<br />
<br />
Other major upgrades:<br />
* Mystic Armour of the Untouchable (suck and dodge)<br />
* Orb of Wrath (wrath)<br />
* Fencer's Study<br />
* AMLAs to increase physical resistance<br />
<br />
Why is he great:<br />
* Impact resistance is generally lower than other resistances.<br />
* Mayhem reduces damage coming back, and means even if the target lives, it isn't so dangerous anymore.<br />
<br />
I'm running a Demon Lord hunting group through The Last Crusade (end of chapter 9), with two Celestial Messengers (Legacy of Kings), a Duke, a Swordmaster (for Doom and Trickery via Stormrend) and this guy. With buffs, this guy can immediately kill many Demon Lords.<br />
<br />
=== Evil Healer (Lich King) ===<br />
by Delicius169<br />
<br />
Lich King is quite a weak unit, his only advantage is that if you use Tome of liches, he can become unit with the biggest amount of weapons (mage-white mage- paladin- lich- lich king= mace, spear, sword, essence of magic, axe, staff)<br />
<br />
* 35-6 meele, blade<br />
* 22-4 ice wave<br />
* 16-4 shadow wave<br />
* 30-4 doom, meele, blade<br />
<br />
resistance: 58/61/16/60/90/45<br />
<br />
Items:<br />
* Books: Book of courage, Magical swordplay, How to be an overlord (hasnt finished reading yet)<br />
* Blackened cloak, intoxicator (boots), Mask of insanity, Mystic armour of Carparitia, dark gloves of destruction, Demon core (amulet), sparkling ring<br />
* Weapons: 2x Dominion (Mace, Essence of magic), Deathwhirl (sword), Staff of Crelanu, Corpsegrinder (spear, gives Eviscreation), Morrigans Slasher (axe, gives murderlust)<br />
<br />
He is the one, who stands in front line, he is the most usefull healer I have. He can kill almost every unit in one round (thanks to mask of insanity), he cant be affected by temptation, he weakens strong leaders with doom attack. <br />
<br />
Of course, he could be stronger, I was too lazy to try more unit to get Legacy of kings/ sorrow/ dark dragon, so I got just legacy of Titans. Also I dint get the Mace with Hate speech skill.<br />
<br />
== Lone warriors ==<br />
Some units are quite good when sent alone behing the enemy lines.<br />
<br />
=== Juggernaut of doom ===<br />
An Elvish Juggernaut, doing 57-9 melee (blade, slow, disintegrate) and 36-9 ranged (pierce, marksman, slow) or 26-6 ranged (arcane, slow, drain, focused -- useful to drain hitpoints when regenerating is not enough).<br />
<br />
Equipped with Doombringer sword, and Stormforce bow, and protected by a Prayer armour, a Gloomy Cloak, a Gloomy Amulet, a Gloomy Ring, Mighty Gauntlets, Elusive Boots and the Dark Helm of Destruction.<br />
<br />
A full Dark Dragon Legacy, four AMLA for bow, two AMLA for sword, five AMLA to reduce chance to be hit by 10% and a few AMLA to increase physical resistances.<br />
<br />
=== Icy Dragon Rider of Wrath ===<br />
A Dragon Rider mainly doing 75-4 wrath (5) melee (ice, charge, slow, horrid, backstab) or 26-6 ranged (ice, slow, cone) and defensively 39-4 melee with drain and slow.<br />
<br />
Equipped with a Holy Sword and a Return to the Tribe spear, and protected by a Horrid Ice Armour, a Ring of Iced Veins, Slow Boots, Draingloves, a Mask of Famine, a Leechward amulet and a Cloak of the Assassin Leader.<br />
<br />
A full Ice Dragon Legacy, a full Raging/Wrathful Combat Techniques, five AMLA to command the dragon to bite better (and to eat in the process), five AMLA to have a tougher dragon.<br />
<br />
=== Assassin of Everything ===<br />
dabber's deadliest lone unit.<br />
Elvish Assassin. Legacy of Sorrow, Dark set<br /><br />
Melee 3?-8 blade, struggle, slows, poison, suck 5<br /><br />
Ranged 33-11, blade, focused, mind raid, struggle, slows, poison, suck 7<br /><br />
Resistances 37,37,18,30,25,40<br />
<br />
No unit in my army, including Efraim and Lethalia, has anywhere near the experience of this lady. I let her solo several levels of Inferno for fun.<br />
<br />
Critical Equipment:<br /><br />
Dark Sword, Dark Helm, Dark Gloves, Unprecious Ring, Intoxicator boots<br /><br />
<br />
Other Current Equipment:<br /><br />
Mystic Armour of the Untouchable, Bow of Plagiarism, Gloomy Cloak, Amulet of Reason, Fencer's Study<br />
<br />
Why is she great:<br /><br />
* Conviction means she does serious damage to any target.<br />
* Focussed on ranged attacks ensures they hit, and therefore suck.<br />
* High suck with many attacks, plus despair, slow, and struggle means she avoids or heals most any damage.<br />
* If she ever gets hurt, she can use Distant Attack to heal.<br />
<br />
=== Deadly Champion ===<br />
<br />
Favorite of arobinson, the Champion's power is in the opponent missing, not in the offensive power of the unit. The idea is to make the Champion very hard to hit and then use Anger to increase the number of attacks. The more attacks the opponent has the better in this case. Because of the Champion's chance to be hit ratio, a few equipment items means that it almost cannot be hit. The unit is not all that good for spell defense, so it is not quite a loner, but it is very powerful on offense against any opponent.<br />
<br />
There are many options for armor and weapons, but basically you want to try to (1) maximize the number of attacks and (2) decrease the chance to hit. <br />
<br />
Recommended Equipment:<br /><br />
* Crafted "Anger" sword or "Marrowrend" (*2 attacks offense and defense, this is key)<br />
* Helmet<br />
** Helmet of Paladins (for the illumination)<br />
** Mask of Insanity (not necessary, but good for really hard units)<br />
** Rherraent's Helm<br />
* Gloves<br />
** Quick Gauntlets (+1 attack)<br />
** Draingloves<br />
** Dark Gloves of Destruction<br />
* Book of Courage (if not using the Helmet of Paladins)<br />
* Dazzling Ring<br />
* Amulets<br />
** The gloomy Amulet<br />
** Lucky Farmer's Amulet<br />
** Amulet of the Last Guide<br />
* Armor<br />
** Mystic Armour of the Untouchable<br />
** Dark Sarcasm<br />
** Redshirt Armour<br />
* Crossbow<br />
** Crafted Gloombringer crossbow <br />
** Crafted Malice crossbow<br />
** Crafted Deathblade Inheritance crossbow<br />
* Boots<br />
** Elusive Boots<br />
** Slow Boots of Certainty<br />
* Cloak of the Assassin leader<br />
* Other crafted<br />
** Lightning Agility<br />
** Deflector of Light<br />
<br />
Advancements:<br /><br />
Focus on the sword (number of attacks), then "better at defending" (up to -15% chance to be hit) and then the "better resistances when defending" advancements to improve the unit's defense against magical attacks while defending.</div>Dugihttps://wiki.wesnoth.org/index.php?title=DeadlyUnitsFromLotI&diff=56737DeadlyUnitsFromLotI2015-09-02T19:57:20Z<p>Dugi: /* Boss killers */</p>
<hr />
<div>= Legend of the Invincibles - Deadly units =<br />
I ([[User:Ashes]]) created this wiki page to share tips and tricks for Legend of the Invincibles, and mainly to share deadly units. This campaign has a gameply so different from the standard BfW game that the usual tricks are no more relevant. The start of the campaign is good to help the beginner, but some other things can only be learned later, when playing.<br />
<br />
== Boss killers ==<br />
Sometimes, there is a villain with hundreds of hitpoints. One possibility is to carefully organise a long fight that will kill the villain. But in practice it is more efficient to have a boss killer that will kill it in one turn.<br />
<br />
=== Berserker draining dwarf ===<br />
My ([[User:Ashes]]) favourite boss killer.<br />
A Dwarvish Battlerager with a Soul Eclipse axe. Unless the enemy resists drain, or the enemy is very difficult to hit, this dwarf is deadly.<br />
<br />
I also equipped my Dwarvish Battlerager with a Mithral Armour of Wrath (wrath is very useful for berserkers) and some additional but less important items (a Deadborn cloak to suck 2 health and to have 5% chance to strike a devastating blow; boots of Lightning agility and Lucky Farmer's Amulet to reduce chances of getting hit, gauntlets of Fiery Blood to be able to choose between fire damage and blade damage, ...)<br />
<br />
Why is he better:<br />
Full fledged berserk means a huge number of attacks - either he dies or the target dies.<br />
<br />
=== Destroyer (Part II equipment) ===<br />
My ([[User:dabber]]) primary solo boss killer.<br />
Destroyer with Jawbreaker as his weapon, because that provides Mayhem (target damage drops after each hit). Need AMLAs for Battle Frenzy and its upgrades to give him 30 attacks. Jawbreaker provides only suck 2, but a little bit more suck from other items combined with his natural physical resistances mean he does fine.<br />
<br />
Other major upgrades:<br />
* Mystic Armour of the Untouchable (suck and dodge)<br />
* Orb of Wrath (wrath)<br />
* Fencer's Study<br />
* AMLAs to increase physical resistance<br />
<br />
Why is he great:<br />
* Impact resistance is generally lower than other resistances.<br />
* Mayhem reduces damage coming back, and means even if the target lives, it isn't so dangerous anymore.<br />
<br />
I'm running a Demon Lord hunting group through The Last Crusade (end of chapter 9), with two Celestial Messengers (Legacy of Kings), a Duke, a Swordmaster (for Doom and Trickery via Stormrend) and this guy. With buffs, this guy can immediately kill many Demon Lords.<br />
<br />
=== Evil Healer (Lich King) ===<br />
by Delicius169<br />
<br />
* 35-6 meele, blade<br />
* 22-4 ice wave<br />
* 16-4 shadow wave<br />
* 30-4 doom, meele, blade<br />
<br />
resistance: 58/61/16/60/90/45<br />
<br />
Items:<br />
* Books: Book of courage, Magical swordplay, How to be an overlord (hasnt finished reading yet)<br />
* Blackened cloak, intoxicator (boots), Mask of insanity, Mystic armour of Carparitia, dark gloves of destruction, Demon core (amulet), sparkling ring<br />
* Weapons: 2x Dominion (Mace, Essence of magic), Deathwhirl (sword), Staff of Crelanu, Corpsegrinder (spear, gives Eviscreation), Morrigans Slasher (axe, gives murderlust)<br />
<br />
He is the one, who stands in front line, he is the most usefull healer I have. He can kill almost every unit in one round (thanks to mask of insanity), he cant be affected by temptation, he weakens strong leaders with doom attack. <br />
<br />
Of course, he could be stronger, I was too lazy to try more unit to get Legacy of kings/ sorrow/ dark dragon, so I got just legacy of Titans. Also I dint get the Mace with Hate speech skill.<br />
<br />
== Lone warriors ==<br />
Some units are quite good when sent alone behing the enemy lines.<br />
<br />
=== Juggernaut of doom ===<br />
An Elvish Juggernaut, doing 57-9 melee (blade, slow, disintegrate) and 36-9 ranged (pierce, marksman, slow) or 26-6 ranged (arcane, slow, drain, focused -- useful to drain hitpoints when regenerating is not enough).<br />
<br />
Equipped with Doombringer sword, and Stormforce bow, and protected by a Prayer armour, a Gloomy Cloak, a Gloomy Amulet, a Gloomy Ring, Mighty Gauntlets, Elusive Boots and the Dark Helm of Destruction.<br />
<br />
A full Dark Dragon Legacy, four AMLA for bow, two AMLA for sword, five AMLA to reduce chance to be hit by 10% and a few AMLA to increase physical resistances.<br />
<br />
=== Icy Dragon Rider of Wrath ===<br />
A Dragon Rider mainly doing 75-4 wrath (5) melee (ice, charge, slow, horrid, backstab) or 26-6 ranged (ice, slow, cone) and defensively 39-4 melee with drain and slow.<br />
<br />
Equipped with a Holy Sword and a Return to the Tribe spear, and protected by a Horrid Ice Armour, a Ring of Iced Veins, Slow Boots, Draingloves, a Mask of Famine, a Leechward amulet and a Cloak of the Assassin Leader.<br />
<br />
A full Ice Dragon Legacy, a full Raging/Wrathful Combat Techniques, five AMLA to command the dragon to bite better (and to eat in the process), five AMLA to have a tougher dragon.<br />
<br />
=== Assassin of Everything ===<br />
dabber's deadliest lone unit.<br />
Elvish Assassin. Legacy of Sorrow, Dark set<br /><br />
Melee 3?-8 blade, struggle, slows, poison, suck 5<br /><br />
Ranged 33-11, blade, focused, mind raid, struggle, slows, poison, suck 7<br /><br />
Resistances 37,37,18,30,25,40<br />
<br />
No unit in my army, including Efraim and Lethalia, has anywhere near the experience of this lady. I let her solo several levels of Inferno for fun.<br />
<br />
Critical Equipment:<br /><br />
Dark Sword, Dark Helm, Dark Gloves, Unprecious Ring, Intoxicator boots<br /><br />
<br />
Other Current Equipment:<br /><br />
Mystic Armour of the Untouchable, Bow of Plagiarism, Gloomy Cloak, Amulet of Reason, Fencer's Study<br />
<br />
Why is she great:<br /><br />
* Conviction means she does serious damage to any target.<br />
* Focussed on ranged attacks ensures they hit, and therefore suck.<br />
* High suck with many attacks, plus despair, slow, and struggle means she avoids or heals most any damage.<br />
* If she ever gets hurt, she can use Distant Attack to heal.<br />
<br />
=== Deadly Champion ===<br />
<br />
Favorite of arobinson, the Champion's power is in the opponent missing, not in the offensive power of the unit. The idea is to make the Champion very hard to hit and then use Anger to increase the number of attacks. The more attacks the opponent has the better in this case. Because of the Champion's chance to be hit ratio, a few equipment items means that it almost cannot be hit. The unit is not all that good for spell defense, so it is not quite a loner, but it is very powerful on offense against any opponent.<br />
<br />
There are many options for armor and weapons, but basically you want to try to (1) maximize the number of attacks and (2) decrease the chance to hit. <br />
<br />
Recommended Equipment:<br /><br />
* Crafted "Anger" sword or "Marrowrend" (*2 attacks offense and defense, this is key)<br />
* Helmet<br />
** Helmet of Paladins (for the illumination)<br />
** Mask of Insanity (not necessary, but good for really hard units)<br />
** Rherraent's Helm<br />
* Gloves<br />
** Quick Gauntlets (+1 attack)<br />
** Draingloves<br />
** Dark Gloves of Destruction<br />
* Book of Courage (if not using the Helmet of Paladins)<br />
* Dazzling Ring<br />
* Amulets<br />
** The gloomy Amulet<br />
** Lucky Farmer's Amulet<br />
** Amulet of the Last Guide<br />
* Armor<br />
** Mystic Armour of the Untouchable<br />
** Dark Sarcasm<br />
** Redshirt Armour<br />
* Crossbow<br />
** Crafted Gloombringer crossbow <br />
** Crafted Malice crossbow<br />
** Crafted Deathblade Inheritance crossbow<br />
* Boots<br />
** Elusive Boots<br />
** Slow Boots of Certainty<br />
* Cloak of the Assassin leader<br />
* Other crafted<br />
** Lightning Agility<br />
** Deflector of Light<br />
<br />
Advancements:<br /><br />
Focus on the sword (number of attacks), then "better at defending" (up to -15% chance to be hit) and then the "better resistances when defending" advancements to improve the unit's defense against magical attacks while defending.</div>Dugihttps://wiki.wesnoth.org/index.php?title=WML_Abilities&diff=56101WML Abilities2015-02-10T12:39:17Z<p>Dugi: /* Immune to drain or plague or poison */ Fixed a small error, the weapon special's name is drains, not drain</p>
<hr />
<div>Remember that you must include the WML ability code in every scenario where you intend them to work. Or include them in the unit file inside the [unit_type] tag.<br />
<br />
Some abilities require macros from [[WML_Utilities|Utilities]]. <br />
<br />
<br />
<br />
=== Knockback ===<br />
<br />
When a unit is hit with a knockback attack, it is immediately pushed back one hex away from the attacker. Units cannot be knocked back into an occupied hex, out of villages or onto terrain they normally could not move to. Only works on offense.<br />
<br />
Use this to display the special correctly on the attacks you want:<br />
#define WEAPON_SPECIAL_KNOCKBACK<br />
[dummy]<br />
id=knockback<br />
name= _ "knockback"<br />
female_name= _ "female^knockback"<br />
description=_ "Knockback:<br />
When a unit is hit with a knockback attack, it is immediately pushed back one hex away from the attacker. Units cannot be knocked back into an occupied hex, out of villages or onto terrain they normally could not move to. Only works on offense."<br />
[/dummy]<br />
#enddef<br />
<br />
And insert this event to your [scenario], [multiplayer], [unit_type] or [era]:<br />
[event]<br />
name=attacker hits<br />
first_time_only=no<br />
<br />
[filter_attack]<br />
special=knockback<br />
[/filter_attack]<br />
<br />
[filter_second]<br />
[not]<br />
[filter_location]<br />
terrain=*^V*<br />
[/filter_location]<br />
[/not]<br />
[/filter_second]<br />
<br />
[if]<br />
[variable]<br />
name=second_unit.hitpoints<br />
greater_than=0<br />
[/variable]<br />
<br />
[store_locations]<br />
[not]<br />
[filter]<br />
[/filter]<br />
[/not]<br />
<br />
[filter_adjacent_location]<br />
x,y=$x2,$y2<br />
adjacent=-$unit.facing<br />
[/filter_adjacent_location]<br />
<br />
variable=knockback_target_hex<br />
[/store_locations]<br />
<br />
[if]<br />
[variable]<br />
name=knockback_target_hex.length<br />
greater_than=0<br />
[/variable]<br />
<br />
[then]<br />
[teleport]<br />
[filter]<br />
x,y=$x2,$y2<br />
[/filter]<br />
<br />
x,y=$knockback_target_hex.x,$knockback_target_hex.y<br />
ignore_passability=no<br />
[/teleport]<br />
<br />
[if]<br />
[have_unit]<br />
x,y=$knockback_target_hex.x,$knockback_target_hex.y<br />
[/have_unit]<br />
<br />
[then]<br />
[sound]<br />
name=fist.ogg<br />
[/sound]<br />
<br />
# the knockbacked unit doesn't seem to receive experience by default,<br />
# so we need to add it manually<br />
[store_unit]<br />
[filter]<br />
x,y=$knockback_target_hex.x,$knockback_target_hex.y<br />
[/filter]<br />
<br />
kill=yes<br />
variable=knockbacked<br />
[/store_unit]<br />
<br />
{VARIABLE_OP knockbacked.experience add $unit.level}<br />
<br />
[unstore_unit]<br />
variable=knockbacked<br />
text= _ "knockback"<br />
{COLOR_HARM}<br />
advance=true<br />
[/unstore_unit]<br />
<br />
{CLEAR_VARIABLE knockbacked}<br />
[/then]<br />
[/if]<br />
[/then]<br />
[/if]<br />
<br />
{CLEAR_VARIABLE knockback_direction,knockback_target_hex}<br />
[/then]<br />
[/if]<br />
[/event]<br />
<br />
=== Charm ===<br />
<br />
When a unit is hit with a ''charm'' attack, it instantly jumps to the attacker's side, and returns to it's original side at the beginning of that side's turn. A charmed unit has 1 movement point and can attack.<br />
<br />
Example that makes all Troll Whelps have charm on their attack:<br />
<br />
{CHARM (type=Troll Whelp) fist}<br />
<br />
#define CHARM FILTER WEAPON<br />
[event]<br />
name=attacker_hits<br />
first_time_only=no<br />
<br />
[filter]<br />
{FILTER}<br />
[/filter]<br />
<br />
[special_filter]<br />
weapon={WEAPON}<br />
[/special_filter]<br />
<br />
{STORE_UNIT_VAR x,y=$x1,$y1 side charmer_side}<br />
{STORE_UNIT_VAR x,y=$x2,$y2 side charmed_side}<br />
<br />
{IF_VAR charmer_side not_equals $charmed_side (<br />
[then]<br />
{MODIFY_UNIT x,y=$x2,$y2 variables.real_side $charmed_side}<br />
{MODIFY_UNIT x,y=$x2,$y2 side $charmer_side}<br />
{MODIFY_UNIT x,y=$x2,$y2 moves 1}<br />
{MODIFY_UNIT x,y=$x2,$y2 attacks_left 1}<br />
<br />
{VARIABLE_OP varname format "side_$charmed_side|_units_charmed"}<br />
{VARIABLE $varname yes}<br />
<br />
{CLEAR_VARIABLE varname}<br />
[/then]<br />
)}<br />
<br />
{CLEAR_VARIABLE charmer_side}<br />
{CLEAR_VARIABLE charmed_side}<br />
[/event]<br />
<br />
[event]<br />
name=side turn<br />
first_time_only=no<br />
<br />
{VARIABLE_OP this_side_charmed to_variable "side_$side_number|_units_charmed"}<br />
<br />
{IF_VAR this_side_charmed equals yes (<br />
[then]<br />
[store_unit]<br />
[filter]<br />
[not]<br />
side=$side_number<br />
[/not]<br />
[/filter]<br />
<br />
variable=possibly_charmed<br />
kill=no<br />
[/store_unit]<br />
<br />
{FOREACH possibly_charmed i}<br />
{VARIABLE_OP real_side format "0$possibly_charmed[$i].variables.real_side"}<br />
<br />
{IF_VAR real_side not_equals "0" (<br />
[then]<br />
{IF_VAR side_number equals $possibly_charmed[$i].variables.real_side (<br />
[then]<br />
{CLEAR_VARIABLE possibly_charmed[$i].variables.real_side}<br />
{VARIABLE possibly_charmed[$i].side $side_number}<br />
<br />
[unstore_unit]<br />
variable=possibly_charmed[$i]<br />
find_vacant=no<br />
[/unstore_unit]<br />
[/then]<br />
)}<br />
[/then]<br />
)}<br />
{NEXT i}<br />
<br />
{CLEAR_VARIABLE possibly_charmed}<br />
[/then]<br />
)}<br />
[/event]<br />
#enddef<br />
<br />
=== Bloodlust ===<br />
<br />
Bloodlust is a very simple ability. If a unit that has bloodlust kills an enemy unit when attacking, it may attack again, provided that there are more enemy units adjacent to it.<br />
<br />
This would give the bloodlust ability to all Dwarvish Ulfserkers (making them insanely powerful):<br />
<br />
{BLOODLUST (type=Dwarvish Ulfserker)}<br />
<br />
#define BLOODLUST FILTER<br />
[event]<br />
name=die<br />
first_time_only=no<br />
<br />
[filter_second]<br />
{FILTER}<br />
[/filter_second]<br />
<br />
{MODIFY_UNIT x,y=$x2,$y2 moves 0}<br />
{MODIFY_UNIT x,y=$x2,$y2 attacks_left 1}<br />
[/event]<br />
#enddef<br />
<br />
=== Pickpocket ===<br />
<br />
This special could also be called loot. When a unit with this attack special sucessfully hits an enemy unit, it gains a certain amount of gold.<br />
<br />
To do this, use this code:<br />
<br />
<code>#define WEAPON_SPECIAL_PICKPOCKET<br /><br />
# Canned definition of the pickpocket ability to be included in a<br /><br />
# [specials] clause.<br />
# dummy weapon special used to describe the effect to the user<br />
# and filter on special's id<br />
[dummy]<br />
id=weapon_pickpocket<br />
name= _ "pickpocket"<br />
name_inactive= _ "pickpocket"<br />
description= _ "pickpocket :<br />
Gain money for attacking your foe. Each strike scores you one gold."<br />
description_inactive= _ "pickpocket :<br />
Gain money for attacking your foe. Each strike scores you one gold."<br />
apply_to=opponent<br />
[/dummy]<br />
[/specials]<br />
[/attack]<br />
# event that creates a "pickpocket has worked" variable<br />
# and sets it to "yes" if the attacker hits at least once.<br />
[event]<br />
name=attacker_hits<br />
first_time_only=no <br />
[filter_attack]<br />
special=weapon_pickpocket<br />
[/filter_attack] <br />
[store_unit]<br />
[filter]<br />
x,y=$x1,$y1<br />
[/filter]<br />
variable=unit_att_with_pickpocket<br />
mode=append<br />
[/store_unit]<br />
[set_variable]<br />
name=unit_att_with_pickpocket.variables.pickpocket_has_worked<br />
value=yes<br />
[/set_variable]<br />
[unstore_unit]<br />
variable=unit_att_with_pickpocket<br />
[/unstore_unit] <br />
{CLEAR_VARIABLE unit_att_with_pickpocket}<br />
[/event]<br />
[event]<br />
name=attacker_hits<br />
first_time_only=no <br />
[filter_attack]<br />
special=weapon_pickpocket<br />
[/filter_attack] <br />
[store_unit]<br />
[filter]<br />
x,y=$x1,$y1<br />
[/filter]<br />
variable=pickpocketer<br />
mode=append<br />
[/store_unit] <br />
[store_unit]<br />
[filter]<br />
x,y=$x2,$y2<br />
[/filter]<br />
variable=pickpocketed<br />
mode=append<br />
[/store_unit] <br />
[if]<br />
[variable]<br />
name=pickpocketer.variables.pickpocket_has_worked<br />
equals=yes<br />
[/variable]<br />
[then]<br />
[gold]<br />
side=$side_number<br />
amount=2<br />
[/gold]<br />
[unstore_unit]<br />
variable=pickpocketed<br />
text="!"<br />
{COLOR_HEAL}<br />
[/unstore_unit]<br />
[/then]<br />
[/if] <br />
{CLEAR_VARIABLE pickpocketer}<br />
{CLEAR_VARIABLE pickpocketed}<br />
[/event]<br />
[+attack]<br />
[+specials]<br />
#enddef</code><br />
<br />
It can be placed after the [unit_type] tag, or in its own .cfg file.<br />
<br />
<br />
<br />
<br />
To change the amount of gold given per hit, change<br />
<code>[gold]<br />
side=$side_number<br />
amount='''X'''<br />
[/gold]</code><br />
Where '''X''' is the amount of gold you want.<br />
<br />
<br />
<br />
<br />
If you want the gold to be constant, given at the end of the turn if at least one of the attack hits, instead of '''X''' amount of gold per hit, change<br />
<code>[event]<br />
'''name=attacker_hits'''<br />
first_time_only=no</code><br />
<br />
to<br />
<br />
<code>[event]<br />
'''name=attack_end'''<br />
first_time_only=no</code><br />
<br />
===Soultaker===<br />
<br />
Any unit with this ability will gain an additional point of damage per strike every time it kills an enemy. Coder(s) unknown, made for Melon's Youkai faction (http://www.wesnoth.org/forum/viewtopic.php?f=19&t=20100).<br />
<br />
To give a unit the ability, place the following in any .cfg file loaded by the campaign or era:<br />
<br />
#define ABILITY_SOULTAKER<br />
[dummy]<br />
id=soultaker<br />
name= _ "soultaker"<br />
description=_ "Soultaker:<br />
This unit gains an additional point added to its maximum damage whenever it kills a living unit."<br />
[/dummy]<br />
<br />
[/abilities]<br />
[event]<br />
name=die<br />
first_time_only=no<br />
[filter]<br />
[not]<br />
[wml_filter]<br />
[status]<br />
not_living="yes"<br />
[/status]<br />
[/wml_filter]<br />
[/not]<br />
[/filter]<br />
<br />
[filter_second]<br />
ability=soultaker<br />
[/filter_second]<br />
<br />
[unstore_unit]<br />
variable=second_unit<br />
{COLOR_HEAL}<br />
text= _ "+1 damage"<br />
find_vacant=no<br />
[/unstore_unit]<br />
<br />
[object]<br />
silent=yes<br />
duration=forever<br />
[filter]<br />
x,y=$x2,$y2<br />
[/filter]<br />
<br />
[effect]<br />
apply_to=attack<br />
range=melee<br />
increase_damage=1<br />
increase=1<br />
[/effect]<br />
[/object]<br />
[/event]<br />
<br />
[+abilities]<br />
#enddef<br />
<br />
And the following in the unit's [abilities] tag:<br />
<br />
{ABILITY_SOULTAKER}<br />
<br />
===Soultaker (weapon special)===<br />
<br />
Unit with this weapon special will gain an additional point of damage per strike for that weapon every time it kills an enemy with this attack. Coder Ravana, made for ageless era (http://forums.wesnoth.org/viewtopic.php?f=19&t=25274) based on previous ability.<br />
<br />
To give a unit the weapon special, load the following code:<br />
<br />
#define WEAPON_SPECIAL_SOULTAKER<br />
[dummy]<br />
id=soultaker<br />
name= _ "soultaker"<br />
description=_"Soultaker:<br />
This unit gains an additional point added to its maximum damage whenever it kills a living unit."<br />
[/dummy]<br />
[/specials]<br />
[/attack]<br />
[event]<br />
name=die<br />
first_time_only=no<br />
id=soultaker_event<br />
[filter]<br />
[not]<br />
[filter_wml]<br />
[status]<br />
not_living="yes"<br />
[/status]<br />
[/filter_wml]<br />
[/not]<br />
[/filter]<br />
[filter_second_attack]<br />
special=soultaker<br />
[/filter_second_attack]<br />
[unstore_unit]<br />
variable=second_unit<br />
{COLOR_HEAL}<br />
text= _ "+1 damage"<br />
find_vacant=no<br />
[/unstore_unit]<br />
[object]<br />
silent=yes<br />
duration=forever<br />
[filter]<br />
x,y=$x2,$y2<br />
[/filter]<br />
[effect]<br />
apply_to=attack<br />
name=$second_weapon.name<br />
increase_damage=1<br />
[/effect]<br />
[/object]<br />
[/event]<br />
[+attack]<br />
[+specials]<br />
#enddef<br />
<br />
And the following in the attack's [specials] tag:<br />
<br />
{WEAPON_SPECIAL_SOULTAKER}<br />
<br />
===Charm (Type 2)===<br />
<br />
An attack special. If the attack hits, and the target is level 0 or 1, the target is converted to the attacker's side. However, if it misses, the attacker is converted to the defender's side. Maintainer is krotop, using 1.6.x syntax (and compatible with 1.7.x], made for Melon's Youkai faction (http://www.wesnoth.org/forum/viewtopic.php?f=21&t=22539)<br />
<br />
<br />
#define WEAPON_SPECIAL_CHARM<br />
# Canned definition of the Charm ability to be included in a<br />
# [specials] clause.<br />
<br />
<br />
# dummy weapon special used to describe the effect to the user<br />
# and filter on special's id<br />
[dummy]<br />
id=weapon_charm<br />
name= _ "charm"<br />
name_inactive= _ "charm"<br />
description= _ "Charm : <br />
Turns a living level 1 or level 0 unit to your side. Beware if all of your attacks miss, the charm user turns to the defender side, even if it is your leader. You can not charm an ennemy leader or a non-living creature." <br />
description_inactive= _ "Charm : <br />
Turns a living level 1 or level 0 unit to your side. Beware if all of your attacks miss, the charm user turns to the defender side, even if it is your leader. You can not charm an ennemy leader or a non-living creature." <br />
apply_to=opponent<br />
[/dummy]<br />
<br />
[/specials]<br />
[/attack]<br />
<br />
# event that creates a variable at the beginning of the fight to check if the attacker hit at least once by the end.<br />
[event]<br />
name=attack<br />
first_time_only=no<br />
<br />
[filter_attack]<br />
special=weapon_charm<br />
[/filter_attack]<br />
<br />
[store_unit]<br />
[filter]<br />
x,y=$x1,$y1<br />
[/filter]<br />
variable=unit_att_with_charm<br />
mode=append<br />
[/store_unit] <br />
[set_variable]<br />
name=unit_att_with_charm.variables.charm_has_worked<br />
value=no<br />
[/set_variable] <br />
[unstore_unit]<br />
variable=unit_att_with_charm<br />
[/unstore_unit]<br />
<br />
{CLEAR_VARIABLE unit_att_with_charm}<br />
[/event]<br />
<br />
<br />
# event that creates a "charm has worked" variable<br />
# and sets it to "yes" if the attacker hits at least once.<br />
[event]<br />
name=attacker_hits<br />
first_time_only=no<br />
<br />
[filter_attack]<br />
special=weapon_charm<br />
[/filter_attack]<br />
<br />
[store_unit]<br />
[filter]<br />
x,y=$x1,$y1<br />
[/filter]<br />
variable=unit_att_with_charm<br />
mode=append<br />
[/store_unit]<br />
[set_variable]<br />
name=unit_att_with_charm.variables.charm_has_worked<br />
value=yes<br />
[/set_variable]<br />
[unstore_unit]<br />
variable=unit_att_with_charm<br />
[/unstore_unit]<br />
<br />
{CLEAR_VARIABLE unit_att_with_charm}<br />
[/event]<br />
<br />
<br />
# event that shifts a unit to the other side<br />
# if the defending unit<br />
# - was not lvl1 or lvl0 <br />
# - and was not a recruiting unit <br />
# - and was a not a "non-living" creature<br />
# then :<br />
# -> if the attacker missed all attacks, it goes to the defender side.<br />
# -> if the attacker hit once at least, the defender goes to the attacker side.<br />
[event]<br />
name=attack_end<br />
first_time_only=no<br />
<br />
[filter_attack]<br />
special=weapon_charm<br />
[/filter_attack]<br />
[filter_second]<br />
canrecruit=no<br />
[and]<br />
level=0<br />
[or]<br />
level=1<br />
[/or]<br />
[/and]<br />
[and]<br />
[not]<br />
[filter_wml]<br />
[status]<br />
not_living=yes<br />
[/status]<br />
[/filter_wml]<br />
[/not]<br />
[/and]<br />
[/filter_second]<br />
<br />
[store_unit]<br />
[filter]<br />
x,y=$x1,$y1<br />
[/filter]<br />
variable=charmer<br />
mode=append<br />
[/store_unit]<br />
<br />
[store_unit]<br />
[filter]<br />
x,y=$x2,$y2<br />
[/filter]<br />
variable=charmed<br />
mode=append<br />
[/store_unit]<br />
<br />
[if]<br />
[variable]<br />
name=charmer.variables.charm_has_worked<br />
equals=no<br />
[/variable]<br />
[then]<br />
[set_variable]<br />
name=charmer.side<br />
value=$charmed.side<br />
[/set_variable]<br />
[unstore_unit]<br />
variable=charmer<br />
text="Charm failed!"<br />
{COLOR_HARM}<br />
[/unstore_unit]<br />
[/then]<br />
[else]<br />
[set_variable]<br />
name=charmed.side<br />
value=$charmer.side<br />
[/set_variable]<br />
[unstore_unit]<br />
variable=charmed<br />
text="Charmed!"<br />
{COLOR_HEAL}<br />
[/unstore_unit]<br />
[/else]<br />
[/if]<br />
<br />
{CLEAR_VARIABLE charmer}<br />
{CLEAR_VARIABLE charmed}<br />
[/event]<br />
<br />
[+attack]<br />
[+specials]<br />
<br />
#enddef<br />
<br />
== Works ==<br />
<br />
Unit with ability ''works'' will produce 1 gold per turn.<br />
<br />
Put this macro into you code before the last piece of code.<br />
<pre><br />
#define ABILITY_WORKS<br />
[leadership]<br />
value=0<br />
id=peasant_works<br />
cumulative=no<br />
name="works"<br />
description= _ "Works:<br />
This unit produces 1 gold per turn."<br />
[/leadership]<br />
#enddef<br />
</pre><br />
<br />
Put this event into your code.<br />
<pre><br />
[event]<br />
name=side turn<br />
first_time_only=no<br />
[store_unit]<br />
[filter]<br />
#your filter here... for example type=Peasant<br />
[/filter]<br />
variable=worker<br />
kill=no<br />
[/store_unit]<br />
<br />
{FOREACH worker i}<br />
<br />
[gold]<br />
side=$side_number <br />
amount=1<br />
[/gold] <br />
[unstore_unit]<br />
variable=worker[$i]<br />
text="1"<br />
red,green,blue=255,255,0 <br />
[/unstore_unit]<br />
<br />
{NEXT i}<br />
<br />
{CLEAR_VARIABLE worker}<br />
[/event]<br />
</pre><br />
<br />
And give the unit the ability like this<br />
<pre><br />
[object]<br />
silent=yes<br />
[effect]<br />
apply_to=new_ability<br />
[abilities]<br />
{ABILITY_WORKS}<br />
[/abilities]<br />
[/effect]<br />
[/object]<br />
</pre><br />
<br />
<br />
== Mind Flay ==<br />
<br />
The weapon special gives an attacker 1 point of exp taken from a defender for each hit. This will violate minimum experience (i.e. defender can go below 0). <br />
<br />
Give this special to the attack(s) you want it to have. <br />
#define WEAPON_SPECIAL_MIND_FLAY<br />
[mindflay]<br />
id=mind_flay<br />
name="Mind Flay"<br />
description="When used offensively, each hit of the mind flay attack takes 1 point of experience from the defender and gives it to the attacker."<br />
[/mindflay]<br />
#enddef<br />
<br />
Include these events into your scenario.<br />
[event]<br />
name=attack<br />
first_time_only=no<br />
[special_filter]<br />
weapon=mind flay<br />
[/special_filter]<br />
{VARIABLE hit_number 0}<br />
[/event]<br />
[event]<br />
name=attacker_hits<br />
first_time_only=no<br />
[special_filter]<br />
weapon=mind flay<br />
[/special_filter]<br />
{VARIABLE_OP hit_number add 1}<br />
[/event]<br />
[event]<br />
name=attack_end<br />
first_time_only=no<br />
[special_filter]<br />
weapon=mind flay<br />
[/special_filter]<br />
{VARIABLE_OP second_unit.experience add -$hit_number}<br />
{VARIABLE_OP unit.experience add $hit_number}<br />
[unstore_unit]<br />
variable=unit<br />
find_vacant=no<br />
text=$hit_number<br />
blue=255<br />
[/unstore_unit]<br />
[unstore_unit]<br />
variable=second_unit<br />
find_vacant=no<br />
[/unstore_unit]<br />
{CLEAR_VARIABLE hit_number}<br />
[/event]<br />
<br />
Note: In dev version substitute "name=" instead of "weapon=".<br />
<br />
== Initiative ==<br />
<br />
Initiative is an aura ability. Much like Leadership, it effects adjacent allies but not the unit itself.<br />
<br />
#define AURA_INITIATIVE TYPE<br />
[dummy]<br />
id=initiative<br />
name= _ "initiative"<br />
description= _ "Initiative:<br />
Adjacent allies are granted Firststrike with all weapons."<br />
[/dummy]<br />
[/abilities]<br />
[event]<br />
name=attack<br />
first_time_only=no<br />
<br />
[filter]<br />
[filter_adjacent]<br />
type={TYPE}<br />
is_enemy=no<br />
[/filter_adjacent]<br />
[/filter]<br />
<br />
{FOREACH unit.attack i}<br />
{VARIABLE unit.attack[$i].specials.firststrike.id "firststrike"}<br />
{NEXT i}<br />
<br />
[unstore_unit]<br />
variable=unit<br />
[/unstore_unit]<br />
[/event]<br />
[event]<br />
name=attack<br />
first_time_only=no<br />
<br />
[filter_second]<br />
[filter_adjacent]<br />
type={TYPE}<br />
is_enemy=no<br />
[/filter_adjacent]<br />
[/filter_second]<br />
<br />
{FOREACH second_unit.attack i}<br />
{VARIABLE second_unit.attack[$i].specials.firststrike.id "firststrike"}<br />
{NEXT i}<br />
<br />
[unstore_unit]<br />
variable=second_unit<br />
[/unstore_unit]<br />
[/event]<br />
[event]<br />
name=attack_end<br />
first_time_only=no<br />
<br />
[filter]<br />
[wml_filter]<br />
[attack]<br />
[specials]<br />
[firststrike]<br />
id=firststrike<br />
[/firststrike]<br />
[/specials]<br />
[/attack]<br />
[/wml_filter]<br />
[/filter]<br />
<br />
{FOREACH unit.attack i}<br />
{CLEAR_VARIABLE unit.attack[$i].specials.firststrike}<br />
{NEXT i}<br />
<br />
[unstore_unit]<br />
variable=unit<br />
[/unstore_unit]<br />
[/event]<br />
[event]<br />
name=attack_end<br />
first_time_only=no<br />
<br />
[filter_second]<br />
[wml_filter]<br />
[attack]<br />
[specials]<br />
[firststrike]<br />
id=firststrike<br />
[/firststrike]<br />
[/specials]<br />
[/attack]<br />
[/wml_filter]<br />
[/filter_second]<br />
<br />
{FOREACH second_unit.attack i}<br />
{CLEAR_VARIABLE second_unit.attack[$i].specials.firststrike}<br />
{NEXT i}<br />
<br />
[unstore_unit]<br />
variable=second_unit<br />
[/unstore_unit]<br />
[/event]<br />
[+abilities]<br />
#enddef<br />
<br />
A WML filter may be added instead of the type if you want some units of that type to not have the ability.<br />
<br />
== Blitz ==<br />
<br />
Blitz is an aura ability. Much like Leadership, it effects adjacent allies but not the unit itself.<br />
<br />
#define AURA_BLITZ TYPE<br />
[dummy]<br />
id=blitz <br />
name= _ "blitz"<br />
description= _ "Blitz:<br />
Allies that start their turn adjacent to this unit are granted Skirmisher for that turn."<br />
[/dummy]<br />
[/abilities]<br />
[event]<br />
name=side turn<br />
first_time_only=no<br />
<br />
[store_unit]<br />
[filter]<br />
<br />
[wml_filter]<br />
blitzed=1<br />
[/wml_filter]<br />
[/filter]<br />
variable=blitz_refresh<br />
[/store_unit]<br />
<br />
{FOREACH blitz_refresh i}<br />
{CLEAR_VARIABLE blitz_refresh[$i].abilities.skirmisher}<br />
{VARIABLE blitz_refresh[$i].blitzed 0}<br />
[unstore_unit]<br />
variable=blitz_refresh[$i]<br />
[/unstore_unit]<br />
{NEXT i}<br />
<br />
[store_unit]<br />
[filter]<br />
side=$side_number<br />
[filter_adjacent]<br />
type={TYPE}<br />
is_enemy=no<br />
[/filter_adjacent]<br />
[/filter]<br />
variable=blitzed<br />
[/store_unit]<br />
<br />
{FOREACH blitzed i}<br />
[if]<br />
[variable]<br />
name=blitzed[$i].abilities.skirmisher.id<br />
not_equals="skirmisher"<br />
[/variable]<br />
[then]<br />
{VARIABLE blitzed[$i].blitzed 1}<br />
{VARIABLE blitzed[$i].abilities.skirmisher.id skirmisher}<br />
{VARIABLE blitzed[$i].abilities.skirmisher.name "skirmisher"}<br />
{VARIABLE blitzed[$i].abilities.skirmisher.description "Skirmisher:<br />
This unit is skilled in moving past enemies quickly, and ignores all enemy Zones of Control."}<br />
[unstore_unit]<br />
variable=blitzed[$i]<br />
[/unstore_unit]<br />
[/then]<br />
[/if]<br />
{NEXT i}<br />
[/event]<br />
[+abilities]<br />
#enddef<br />
<br />
== Immune to drain or plague or poison ==<br />
This macro will grant immunity to drain for a unit. By changing a few specials' names and ability names, you can easily expand it for an immunity to plague or drain. This ''will not'' work properly if there is a unit with multiple weapon specials that might be affected (plague+drain, poison+plague, poison+drain, poison+drain+plague), in this case, it will grant immunity to all of them.<br />
<br />
#define ABILITY_UNDRAINABLE<br />
#This is the ability tagging the unit for the events. Use it as an ability.<br />
[dummy]<br />
id=undrainable<br />
name= _ "undrainable"<br />
description= _ "this unit is cannot be drained.<br />
It will still be damaged by draining attacks, but the enemy will not gain any HP."<br />
[/dummy]<br />
#enddef<br />
<br />
#define UNDRAINABLE<br />
#Place those in every scenario (or era) where these units will appear.<br />
#It makes the unit undead for the time of the attack (it cannot be seen),<br />
#if the particular weapon special was used.<br />
[event]<br />
name=attack<br />
first_time_only=no<br />
[filter_attack]<br />
special=drains<br />
[/filter_attack]<br />
[filter_second]<br />
ability=undrainable<br />
[/filter_second]<br />
[modify_unit]<br />
[filter]<br />
x,y=$x2,$y2<br />
[/filter]<br />
[status]<br />
not_living=yes<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
<br />
[event]<br />
name=attack_end<br />
first_time_only=no<br />
[filter_attack]<br />
special=drains<br />
[/filter_attack]<br />
[filter_second]<br />
ability=undrainable<br />
[/filter_second]<br />
[modify_unit]<br />
[filter]<br />
x,y=$x2,$y2<br />
[/filter]<br />
[status]<br />
not_living=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
<br />
[event]<br />
name=attack<br />
first_time_only=no<br />
[filter_second_attack]<br />
special=drain<br />
[/filter_second_attack]<br />
[filter]<br />
ability=undrainable<br />
[/filter]<br />
[modify_unit]<br />
[filter]<br />
x,y=$x1,$y1<br />
[/filter]<br />
[status]<br />
not_living=yes<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
<br />
[event]<br />
name=attack_end<br />
first_time_only=no<br />
[filter_second_attack]<br />
special=drain<br />
[/filter_second_attack]<br />
[filter]<br />
ability=undrainable<br />
[/filter]<br />
[modify_unit]<br />
[filter]<br />
x,y=$x1,$y1<br />
[/filter]<br />
[status]<br />
not_living=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
#enddef<br />
<br />
A WML filter may be added instead of the type if you want some units of that type to not have the ability.<br />
<br />
== Whirlwind Attack ==<br />
This attack is supposed to be an attack when you spin with your weapons in arms, hitting all nearby enemies, while they cannot counter. It should be used with the magical weapon special, because the spinning weapons are not easy to dodge and the player would pick to attack the unit with the lowest defence without it. It works with drain, slow and poison weapon specials. The attack is supposed to be attack-only, but it can be easily edited to work also on defence.<br />
<br />
This is a pair of two macros, one is a weapon special that makes the enemy unable to counter (lowers the number of attacks by 10; for the case if there was a boss or something). The other one is an event that damages the units, that should be placed into every scenario where the unit appears (or the era), preferably through a macro.<br />
<br />
This is the part that is the weapon special that marks it.<br />
[attacks] #This can be changed to a dummy tag if you don't want it to do anything.<br />
id=whirlwind<br />
name= _ "whirlwind"<br />
name_inactive= _ "whirlwind"<br />
description= _ "Whirlwind: When this attack is used, all units adjacent the attacker take the damage, and cannot be countered."<br />
description_inactive= _ "Whirlwind: When this attack is used, all units adjacent the attacker take the damage, and cannot be countered."<br />
value=0<br />
apply_to=opponent<br />
[/attacks]<br />
<br />
<br />
<br />
This is the event.<br />
[event]<br />
name=attacker_hits<br />
first_time_only=no<br />
[filter_attack]<br />
special=whirlwind<br />
[/filter_attack]<br />
{VARIABLE has_drain 0} # Notifies the weapon specials<br />
{VARIABLE has_slow no}<br />
{VARIABLE has_poison no}<br />
{FOREACH weapon.specials.damage i}<br />
[if]<br />
[variable]<br />
name=weapon.specials.drains.id<br />
equals=drains<br />
[/variable]<br />
[then]<br />
{VARIABLE has_drain 1}<br />
<br />
[/then]<br />
[/if]<br />
{NEXT i}<br />
[if]<br />
[variable]<br />
name=weapon.specials.poison.id<br />
equals=poison<br />
[/variable]<br />
[then]<br />
{VARIABLE has_poison yes}<br />
<br />
[/then]<br />
[/if]<br />
[if]<br />
[variable]<br />
name=weapon.specials.slow.id<br />
equals=slow<br />
[/variable]<br />
[then]<br />
{VARIABLE has_slow yes}<br />
<br />
[/then]<br />
[/if]<br />
[if]<br />
[variable]<br />
name=has_drain<br />
equals=0<br />
[/variable]<br />
[else]<br />
[store_unit] #We need to know how many units were drained, and what were their resistances<br />
[filter]<br />
[filter_adjacent]<br />
x,y=$x1,$y1<br />
[/filter_adjacent]<br />
[not]<br />
side=1 #If you want to use it in an era, use side=$unit.side instead<br />
[/not]<br />
[not] #The target unit is already hit by the attack<br />
x,y=$x2,$y2<br />
[/not]<br />
[not] #Undead are undrainable<br />
race=undead<br />
[/not]<br />
[/filter]<br />
variable=units<br />
[/store_unit] <br />
{VARIABLE healed_amount 0}<br />
{FOREACH units i}<br />
[switch] #Check the resistances<br />
variable=weapon.type<br />
[case]<br />
value=arcane<br />
{VARIABLE_OP healed_amount add "$($units[$i].resistance.arcane*$weapon.damage)"}<br />
[/case]<br />
[case]<br />
value=fire<br />
{VARIABLE_OP healed_amount add "$($units[$i].resistance.fire*$weapon.damage)"}<br />
[/case]<br />
[case]<br />
value=cold<br />
{VARIABLE_OP healed_amount add "$($units[$i].resistance.cold*$weapon.damage)"}<br />
[/case]<br />
[case]<br />
value=blade<br />
{VARIABLE_OP healed_amount add "$($units[$i].resistance.blade*$weapon.damage)"}<br />
[/case]<br />
[case]<br />
value=pierce<br />
{VARIABLE_OP healed_amount add "$($units[$i].resistance.pierce*$weapon.damage)"}<br />
[/case]<br />
[case]<br />
value=impact<br />
{VARIABLE_OP healed_amount add "$($units[$i].resistance.impact*$weapon.damage)"}<br />
[/case]<br />
[/switch]<br />
{NEXT i}<br />
[store_unit] #Float the healed amount over the unit, like if it had drained<br />
[filter] #Two numbers will float, the one from the regular hit and one from this<br />
x,y=$x1,$y1<br />
[/filter]<br />
kill=no<br />
variable=FLOATING_TEXT_temp<br />
[/store_unit]<br />
[unstore_unit]<br />
variable=FLOATING_TEXT_temp<br />
find_vacant=no<br />
red,green,blue=0,255,0<br />
text=$($healed_amount/200) #Operating with huge numbers because rounding is a problem<br />
[/unstore_unit]<br />
{CLEAR_VARIABLE FLOATING_TEXT_temp}<br />
[heal_unit]<br />
[filter]<br />
x,y=$x1,&y1<br />
[/filter] <br />
amount=$($healed_amount/200)<br />
animate=no<br />
[/heal_unit]<br />
{CLEAR_VARIABLE units}<br />
{CLEAR_VARIABLE healed_amount}<br />
[/else]<br />
[/if]<br />
[harm_unit]<br />
[filter]<br />
[filter_adjacent]<br />
x,y=$x1,$y1<br />
[/filter_adjacent]<br />
[not]<br />
side=1 #If you want to use it in an era, use side=$unit.side instead<br />
[/not]<br />
[not] #If you want to use it in an era, use side=$unit.side instead<br />
x,y=$x2,$y2<br />
[/not]<br />
[/filter]<br />
[filter_second]<br />
x,y=$x1,$y1<br />
[/filter_second]<br />
amount=$weapon.damage<br />
damage_type=$weapon.type<br />
fire_event=yes<br />
experience=yes #You will have to think about this<br />
poisoned=$has_poison #We have detected these two effects before<br />
slowed=$has_slow<br />
[/harm_unit] <br />
{CLEAR_VARIABLE has_slow}<br />
{CLEAR_VARIABLE has_poison}<br />
{CLEAR_VARIABLE has_drain}<br />
[/event]<br />
<br />
== See Also ==<br />
<br />
* [[UsefulWMLFragments]]<br />
* [[ReferenceWML]]<br />
<br />
[[Category: UsefulWMLFragments]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=InterfaceActionsWML&diff=55928InterfaceActionsWML2014-11-24T22:32:43Z<p>Dugi: /* [message] */ Added notes that messages with some sort of user input will not be shown in prestart events.</p>
<hr />
<div>{{WML Tags}}<br />
== Interface actions ==<br />
<br />
Part of [[ActionWML]], interface actions are actions that do not have a direct effect on gameplay;<br />
instead, they show something to the player. The main interface tags<br />
are '''[message]''' and '''[objectives]''', but several other tags affect<br />
the interface also.<br />
<br />
== [inspect] ==<br />
This user interface instantly displays the gamestate inspector dialog at the current scenario state (the same one that can be brought up with [[CommandMode|the ''':inspect''' command]]), which can be used to inspect the values of WML variables, AI configuration, recall lists, and more.<br />
<br />
* '''name''': optional attribute to specify the name of this gamestate inspector dialog. It is just a label to help differentiate between different invocations of gamestate inspector dialog.<br />
<br />
== [message] ==<br />
The most commonly used interface action is [message], which displays a message to the user in a dialog box. It can also be used to take input from the user.<br />
<br />
The following key/tags are accepted for [message]:<br />
* [[StandardUnitFilter]]: The unit whose profile and name are displayed. Do not use a [filter] tag. If no unit matching this filter is found, the message is not displayed (The unit has probably been killed).<br>'''[message]''' elements should be constructed so that it is either guaranteed that a certain unit is alive, or so that dialog flows smoothly even if the message isn't displayed.<br />
<br />
* '''speaker''': an alternative to standard unit filter. You may specify as the value of the speaker attribute a unit id or any of the following special values:<br />
** '''narrator''': the dialog box is displayed without a caption for the unit speaking or a unit image<br />
** '''unit''': the primary unit for the event is speaking<br />
** '''second_unit''': the secondary unit for the event is speaking<br />
<br />
* '''message''': (translatable) the text to display to the right of the image. ''message'' is sometimes multiple lines; if it is, be sure to use quotes(''' ' ''' or ''' " ''')<br />
* '''[show_if]''': if present then this message will only be displayed if the conditional statement in this tag is passed (see [[ConditionalActionsWML#Condition_Tags|ConditionalActionsWML]])<br />
* '''side_for''': (default: all sides) comma-separated list of sides for who message is shown. (Note: Don't use this if the message has options, as such message can only be shown to the current player.)<br />
* '''image''': (default: profile image of speaker) the image to display next to the message. Append ~RIGHT() if you want the image to appear on the right side.<br />
* '''caption''': (default: name of speaker) the caption to display beside the image. Name to be displayed. Note: use a translation mark to avoid wmllint errors.<br />
* '''scroll''': Boolean specifying whether the game view should scroll to the speaking unit. Defaults to ''yes''.<br />
* '''duration''': (default: 10) the minimum number of frames for this message to be displayed. (A frame lasts about 30 milliseconds.) During this time any dialog decisions will be disregarded.<br />
* '''sound''': a sound effect (wav file) to play as the message is displayed. This can be a comma-separated list, from which one will be randomly chosen.<br />
* '''[option]''': No '''[option]''' elements have to be used. If '''[option]''' elements are present, then each option will be displayed in a menu for the user to select one option. ''Note: Messages with options will not be shown at all in prestart events''<br />
** '''message''': (translatable) the text displayed for the option (see [[DescriptionWML]])<br />
** '''[show_if]''': if present then this option will only be displayed if the conditional statement in this tag is passed (see [[ConditionalActionsWML#Condition_Tags|ConditionalActionsWML]])<br />
** '''[command]''': an element containing actions which are executed if the option is selected.<br />
* '''[text_input]''': there can be only one [text_input] tag. this adds a text input field to the message. ''Note: Messages with text_input will not be shown at all in prestart events''<br />
** '''variable''': the variable that the user's input will be written to<br />
** '''label''': a text label to the left of the input field<br />
** '''max_length''': the maximum number of characters that may be typed into the field<br />
** '''text''': text that is written into the field in the beginning<br />
* Check [[EventWML#Multiplayer_safety]] to find out in which events you can safely use '''[option]''' and '''[text_input]''' without causing OOS.<br />
<br />
=== Formatting ===<br />
In 1.8, [http://developer.gnome.org/pango/unstable/PangoMarkupFormat.html Pango markup formatting codes] have been adopted for '''[message]'''. These can also be used in unit names (user_description), objectives, and such. Note that you'll probably want to use a single quote ' instead of a double quote " as double quotes cannot be escaped, otherwise the string will appear fragmented and you may also encounter errors. Running wmllint on your campaign will up-convert it, warning you about unusual cases you must fix by hand.<br />
<br />
For example, if you wanted to write "You are victorious!" in large, italic, gold letters, you might write it this way:<br />
<br />
<nowiki><span color='#BCB088' size='large' font-style='italic'>You are victorious!</span></nowiki><br />
<br />
<br />
These are the codes taken from the Pango markup formatting guide:<br />
<br />
*'''font''', '''font_desc''': A font description string, such as "Sans Italic 12".<br />
*'''font_family''', '''face''': A font family name.<br />
*'''font_size''', '''size''': Font size in 1024ths of a point, or one of the absolute sizes 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', or one of the relative sizes 'smaller' or 'larger'.<br />
*'''font_style''', '''style''': One of 'normal', 'oblique', 'italic'.<br />
*'''font_weight''', '''weight''': One of 'ultralight', 'light', 'normal', 'bold', 'ultrabold', 'heavy', or a numeric weight.<br />
*'''font_variant''', '''variant''': One of 'normal' or 'smallcaps'.<br />
*'''font_stretch''', '''stretch''': One of 'ultracondensed', 'extracondensed', 'condensed', 'semicondensed', 'normal', 'semiexpanded', 'expanded', 'extraexpanded', 'ultraexpanded'.<br />
*'''foreground''', '''fgcolor''', '''color''': An RGB color specification such as '#00FF00' or a color name such as 'red'.<br />
*'''background, bgcolor''': An RGB color specification such as '#00FF00' or a color name such as 'red'.<br />
*'''underline''': One of 'none', 'single', 'double', 'low', 'error'.<br />
*'''underline_color''': The color of underlines; an RGB color specification such as '#00FF00' or a color name such as 'red'.<br />
*'''rise''': Vertical displacement, in 10000ths of an em. Can be negative for subscript, positive for superscript.<br />
*'''strikethrough''': 'true' or 'false' whether to strike through the text.<br />
*'''strikethrough_color''': The color of strikethrough lines; an RGB color specification such as '#00FF00' or a color name such as 'red'<br />
*'''fallback''': 'true' or 'false' whether to enable fallback. If disabled, then characters will only be used from the closest matching font on the system. No fallback will be done to other fonts on the system that might contain the characters in the text. Fallback is enabled by default. Most applications should not disable fallback.<br />
*'''letter_spacing''': Inter-letter spacing in 1024ths of a point.<br />
*'''gravity''': One of 'south', 'east', 'north', 'west', 'auto'.<br />
*'''gravity_hint''': One of 'natural', 'strong', 'line'.<br />
<br />
<br />
In 1.6, Wesnoth uses older text formatting options<br />
* A tilde (~) as the first character causes the line to be boldfaced.<br />
* An at symbol (@) as the first character causes the line to be green, as done with victory conditions.<br />
* A pound symbol (#) as the first character causes the line to be red, as done with defeat conditions.<br />
* An asterisk (*) as the first character causes the line to be bigger.<br />
* A backquote (`) as the first character causes the line to be smaller.<br />
* If used, the caption key text is boldfaced.<br />
* An RGB colour code in the beginning causes the line to be the given colour. This can still be preceded by the above characters. Example: ''message=_"<255,0,0>Red!"''<br />
<br />
== [objectives] ==<br />
The other tag used for plot development is '''[objectives]'''.<br />
The '''[objectives]''' tag overwrites any previously set objectives,<br />
and displays text which should describe the objectives of the scenario.<br />
Scenario objectives are displayed on the player's first turn after the tag is used,<br />
or as part of the event if it triggers during that player's turn.<br />
Objectives can also be accessed at any time in a scenario using the<br />
"Scenario Objectives" game menu option, making this tag useful for<br />
scenario-specific information that the player may need to refer to during play.<br />
<br />
Attributes of '''[objectives]''':<br />
* '''side''': Default '0'. The side to set the objectives for. A value of 0 sets objectives for all sides. note: There are side-specific objectives and default objectives, which are used in case a side doesn't have specific ones. Specifying 0 sets the default ones.<br />
* '''[[StandardSideFilter]]''' {{DevFeature1.11}} tags and keys: Sets the objectives of all matching sides to these passed specifications (the rest of this [objectives] tag). If no sides (such as when passing side=0) or all sides match, sets the default objectives, and the side specific ones for the matching sides otherwise.<br />
* '''bullet''': Default '• '. Replaces the default bullet, with whatever is passed, for all objectives, gold carryover notes, and notes defined with [note].<br />
* '''summary''': Displayed first in the objectives text, this should describe the basic objective for the overall scenario. Can be omitted.<br />
* '''note''': Displayed last in the objectives text, this is sometimes used for hints or additional information. Can be omitted.<br />
* '''victory_string''': Default ' _ "Victory:"', this text precedes the victory objectives.<br />
* '''defeat_string''': Default ' _ "Defeat:"', this text precedes the defeat objectives.<br />
* '''gold_carryover_string''': Default ' _ "Gold carryover:"', this text precedes the gold carryover information.<br />
* '''notes_string''': Default ' _ "Notes:"', this text precedes the notes.<br />
* '''silent''': Default: not present. If set to "yes", the objectives are silently changed. Else, they will be shown to the user when appropriate.<br />
<br />
Tags of '''[objectives]''':<br />
* '''[objective]''': describes a win or loss condition. Most scenarios have multiple win or loss conditions, so use a separate [objective] subtag for each line; this helps with translations.<br />
** '''bullet''': Default '• ' or whatever is set in the parent [objectives] block. Replaces the default bullet, with whatever is provided, for the objective defined by the [objective] block.<br />
** '''red''': Default '0' for winning objectives, '255' for losing objectives. Overrides the default red coloring of the entire objective, including the bullet.<br />
** '''green''': Default '255' for winning objectives, '0' for losing objectives. Overrides the default green coloring of the entire objective, including the bullet.<br />
** '''blue''': Default '0'. Overrides the default blue coloring of the entire objective, including the bullet.<br />
** '''description''': text for the specific win or loss condition.<br />
** '''condition''': The color and placement of the text. Values are 'win'(colored green, placed after ''victory_string'') and 'lose'(colored red, placed after ''defeat_string'')<br />
** '''show_turn_counter''': If set to yes, displays the number of turns remaining in the scenario. Default is no.<br />
** '''[show_if]''': A condition that disables the objective if it doesn't hold. Conditional objectives are refreshed at '''[show_objectives]''' time only.<br />
* '''[gold_carryover]''': describes how the gold carryover works in this scenario. This is intended to be a more convenient way of displaying carryover information than using the note= key in [objectives].<br />
** '''bullet''': Default '• ' or whatever is set in the parent [objectives] block. Replaces the default bullet with whatever is provided.<br />
** '''red''': Default '255'. Overrides the default red coloring of the entire objective, including the bullet.<br />
** '''green''': Default '255'. Overrides the default green coloring of the entire objective, including the bullet.<br />
** '''blue''': Default '192'. Overrides the default blue coloring of the entire objective, including the bullet.<br />
** '''bonus''' (boolean): whether an early finish bonus is granted. If omitted, early finish bonus is not mentioned.<br />
** '''carryover_percentage''': the amount of carryover gold. If omitted, the amount is not mentioned.<br />
* '''[note]''': describes a note, usually used for hints or additional information. This is an easier way of adding several notes than concatenating them together into a single string to use with the ''note='' key.<br />
** '''bullet''': Default '• ' or whatever is set in the parent [objectives] block. Replaces the default bullet with whatever is provided for the note defined by the [note] block.<br />
** '''red''': Default '255'. Overrides the default red coloring of the entire note, including the bullet.<br />
** '''green''': Default '255'. Overrides the default green coloring of the entire note, including the bullet.<br />
** '''blue''': Default '255'. Overrides the default blue coloring of the entire note, including the bullet.<br />
** '''description''': the text of the note.<br />
** {{DevFeature1.11}} '''[show_if]''': The note will not be shown if the specified condition isn't met. Conditional notes are refreshed at '''[show_objectives]''' time only.<br />
<br />
== [set_menu_item] ==<br />
This tag is used to add a custom option in the right-click context menu which can then be used to trigger arbitrary WML commands. The menu items can be set and modified during any event, for example during "start" or "prestart" events. The user can also assign hotkeys to these WML commands unless specified otherwise. When the hotkey is pressed the event will be fired/filtered at the current mouse position.<br />
<br />
'''Note:''' Due to limitations in portable devices where there are no scroll bars for context menus, there is a hard-coded limit of 7 custom WML menu items. If you really need to have more than 7 menu items, try combining some of them in a submenu. Update: this limitation is being removed in a [http://forums.wesnoth.org/viewtopic.php?p=572554#p572554 future version] of Wesnoth.<br />
<br />
* '''id''': the unique id for this menu item. If a menu item with this id already exists, it allows you to set specific changes to that item.<br />
* '''description''': the in-game text that will appear for this item in the menu.<br />
* '''image''': the image to display next to this item.<br />
* '''needs_select''': if ''yes'' (default ''no''), then the latest select event (see [[EventWML]]) that triggered before this menu item was chosen will be transmitted over the network before this menu item action will be. This only has any effect in networked multiplayer, and is intended to allow more elaborate menu item behaviour there without causing out of sync errors. If you don't know what this means, just leave it false.<br />
* '''use_hotkey''' {{DevFeature1.11}}: if ''no'' (default ''yes''), then the user cannot assign hotkeys to this menu item. If ''only'', the menu item is only accessible via hotkeys, not via right-click context; you can use this in combination with [default_hotkey] if you want custom hotkeys in your campaign/mp. <br />
* '''[show_if]''': If present, the menu item will only be available if the conditional statement (see [[ConditionalActionsWML#Condition_Tags|ConditionalActionsWML]]) within evaluates to true. When this is evaluated, the WML variables ''$x1'' and ''$y1'' will point to the location on which the context menu was invoked, so it's possible to for example only enable the option on empty hexes or on a particular unit.<br />
* '''[filter_location]''': contains a location filter similar to the one found inside Single Unit Filters (see [[FilterWML]]). The menu item will only be available on matching locations.<br />
* '''[default_hotkey]''' {{DevFeature1.11}}: contains a hotkey WML to specify what hotkey to assign to this, '''if the user has no hotkey assigned to this yet'''. (Unlike the rest of a menu item definition, modifying this tag has no effect on the game; it is only effective when initially defining a menu item.) Hotkey WML matches the format in the preferences file and contains the following keys:<br />
** '''key''': a string that contains the key to assign to this.<br />
** '''alt''', '''shift''', '''cmd'''(apple only), '''ctrl''': boolean values.<br />
* '''[command]''': contains the WML actions to be executed when the menu item is selected. Again, the WML variables ''$x1'' and ''$y1'' will point to the location on which the context menu was invoked on.<br />
** '''delayed_variable_substitution ''' {{DevFeature1.11}} (boolean yes|no, default: yes): If no, forces a variable substitution run onto the wml included in this [command] block. Use this, if you want variables which are to substitute to get the values they have at execution time of the event where this set_menu_item appears. Other than that, they get the values they have at invocation time of the menu item.<br />
<br />
== [clear_menu_item] ==<br />
{{DevFeature1.11}}<br />
<br />
Removes a menu item from the scenario.<br />
Normally menu items are, including all their defining wml, automatically carried over between scenarios. This tag prevents this. (The behavior is comparable to set_variable/clear_variable).<br />
* '''id''': (string): id of the menu item to clear. Can be a comma-separated list.<br />
<br />
== Other interface tags ==<br />
<br />
The following tags are also action tags:<br />
=== [item] ===<br />
Makes a graphical item appear on a certain hex. Note this only places the graphics for an item. It does not make the item do anything. Use a moveto event to make moving onto the item do something. <tt>''('''Hint:''' There are a number of predefined items that are used in various campaigns that you can make use of. You can find [http://www.wesnoth.org/macro-reference.xhtml#file:items.cfg a list of them] if you look into the items.cfg file in the wesnoth install directory (under /data/core/macros).)''</tt><br />
* '''x''', '''y''': the location to place the item. (only for [event][item]: full [[StandardLocationFilter|SLF]] support)<br />
* '''image''': the image (in ''images/'' as .png) to place on the hex. This image is aligned with the top-left of the hex (which is 72 pixels wide and 72 pixels tall). It is drawn underneath units. ''('''Hint:''' If using an image smaller than 72x72, then it might be useful to [[ImagePathFunctionWML#Blit_Function|BLIT]] the image onto <tt>misc/blank-hex.png</tt> (a blank 72x72 image).)''<br />
* '''halo''': an image to place centered on the hex. It is drawn on top of units. Use this instead of ''image'' if the image is bigger than the hex or if you want to animate an image.<br />
''Example (where the integer after the colon is the duration of each frame or square bracket expansion as per AnimationWML is used): halo=scenery/fire1.png:100,scenery/fire2.png:100,scenery/fire3.png:100,scenery/fire4.png:100,scenery/fire5.png:100,scenery/fire6.png:100,scenery/fire7.png:100,scenery/fire8.png:100''<br />
or equivalently (requires Wesnoth 1.11.2+):<br />
''halo=scenery/fire[1~8].png:100''<br />
* '''team_name''': name of the team for which the item is to be displayed (hidden for others). For multiple teams just put all the names in one string, for example separated by commas.<br />
* '''visible_in_fog''': whether the item should be visible through fog or not. Default yes.<br />
* '''redraw''': {{DevFeature1.11}}(boolean yes|no, default: yes): If no, disables implicit calls to [[InterfaceActionsWML#.5Bredraw.5D|[redraw]]] when placing the items.<br />
<br />
=== [remove_item] ===<br />
Removes any graphical items on a given hex.<br />
* [[StandardLocationFilter]]: the hexes to remove items off<br />
* '''image''' if specified, only removes the given image item (This image name must include any [[ImagePathFunctionWML|image path functions]] appended to the original image name.)<br />
<br />
=== [print] ===<br />
Displays a message across the screen. The message will disappear after a certain time.<br />
* '''text''': (translatable) the text to display.<br />
* '''size''': (default=12) the pointsize of the font to use<br />
* '''duration''': (default=50) the length of time to display the text for. This is measured in the number of 'frames'. A frame in Wesnoth is usually displayed for around 30ms.<br />
* '''red''', '''green''', '''blue''': (default=0,0,0) the color to display the text in. Values vary from 0-255.<br />
=== [move_unit_fake] ===<br />
Moves an image of a unit along a certain path on the map. The path does not need to be a continuous list of adjacent hexes, so for example only the start and end points can be given, in which case the straightest line between those points will be calculated and used.<br />
* '''type''': the type of the unit whose image to use<br />
* '''x''': a comma-separated list of x locations to move along<br />
* '''y''': a comma-separated list of y locations to move along (x and y values are matched pairs)<br />
* '''side''': the side of the fake unit, used for team-coloring the fake unit<br />
* '''gender''': the gender of the fake unit. Example: gender=female<br />
* '''variation''': the variation of the fake unit. Example: variation=undead<br />
* '''image_mods''': [[ImagePathFunctionWML|image path functions]] sequence to be applied on the fake unit.<br />
* {{DevFeature1.11}} '''force_scroll''': Whether to scroll the map or not even when [[#.5Block_view.5D|[lock_view]]] is in effect or ''Follow Unit Actions'' is disabled in ''Advanced Preferences''. Defaults to ''yes'' starting with version '''1.11.6'''; the attribute did not exist in previous versions and this action behaved as if ''no'' was passed instead.<br />
<br />
=== [move_units_fake] ===<br />
moves multiple images of units along paths on the map. These units are moved in lockstep.<br />
* '''[fake_unit]''': A fake unit to move<br />
** '''type''': the type of unit whose image to use<br />
** '''x''': a comma-separated list of x locations to move along<br />
** '''y''': a comma-separated list of y locations to move along (x and y values are matched pairs)<br />
** '''side''': the side of the fake unit, used for team-coloring the fake unit<br />
** '''skip_steps''': the number of steps to skip before this unit starts moving<br />
=== [hide_unit] ===<br />
Temporarily prevents the engine from displaying the given unit. The unit does not become invisible, as it would be with the '''[hides]''' ability; it is still the same plain unit, but without an image. Useful in conjunction with '''[move_unit_fake]''': to move a leader unit into position on-screen. Until 1.8 each '''[hide_unit]''' tag only hides one unit.<br />
* [[StandardUnitFilter]]: All matching units will be hidden<br />
<br />
=== [unhide_unit] ===<br />
Stops the currently hidden units from being hidden.<br />
* [[StandardUnitFilter]]: Only the matching units will be unhidden<br />
<br />
=== [lock_view] ===<br />
{{DevFeature1.11}} Locks gamemap view scrolling for human players, so they cannot scroll the gamemap view until it is unlocked. WML or Lua actions such as '''[scroll_to]''' will continue to work normally, as they ignore this restriction; the locked/unlocked state is preserved when saving the current game.<br />
<br />
This feature is generally intended to be used in cutscenes to prevent the player scrolling away from scripted actions. <br />
<br />
=== [unlock_view] ===<br />
{{DevFeature1.11}} Unlocks gamemap view scrolling for human players.<br />
<br />
=== [scroll] ===<br />
Scroll a certain number of pixels in a given direction. Useful for earthquake/shaking effects.<br />
* '''x''', '''y''': the number of pixels to scroll along the x and y axis<br />
* {{DevFeature1.11}} '''side''': the side or sides for which this should happen. By default, the [scroll] happens for everyone.<br />
* {{DevFeature1.11}} '''[filter_side]''': a [[StandardSideFilter]] to select the sides for which this should happen. By default, the [scroll] happens for everyone.<br />
<br />
=== [scroll_to] ===<br />
Scroll to a given hex<br />
* '''x''', '''y''': the hex to scroll to<br />
* {{DevFeature1.11}} [[StandardLocationFilter]], do not use a [filter_location] sub-tag. If more than one location matches the filter, only the first matching location will be used.<br />
* '''check_fogged''': whether to scroll even to locations covered in fog or shroud. Possible values ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.<br />
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').<br />
* {{DevFeature1.11}} '''side''': the side or sides for which this should happen. By default, the [scroll_to] happens for everyone.<br />
* {{DevFeature1.11}} '''[filter_side]''': a [[StandardSideFilter]] to select the sides for which this should happen. By default, the [scroll_to] happens for everyone.<br />
<br />
=== [scroll_to_unit] ===<br />
Scroll to a given unit<br />
* [[StandardUnitFilter]]<br />
* '''check_fogged''': whether to scroll even to locations covered in fog or shroud. Possible values ''true'' (don't scroll to fog) and ''false'' (scroll even to fog), with ''false'' as the default.<br />
* {{DevFeature1.11}} '''immediate''': whether to instantly warp to the target hex regardless of the scroll speed setting in Preferences (defaults to ''false'').<br />
* {{DevFeature1.11}} '''for_side''': the side or sides for which this should happen. By default, the [scroll_to_unit] happens for everyone.<br />
* {{DevFeature1.11}} '''[for_side]''': a [[StandardSideFilter]] to select the sides for which this should happen. By default, the [scroll_to_unit] happens for everyone.<br />
<br />
=== [select_unit] ===<br />
Selects a given unit.<br />
* [[StandardUnitFilter]]: The first unit found will be selected.<br />
* '''fire_event''': whether a ''select'' event should be triggered or not (def. ''no''). (Note that select events aren't multiplayer save.)<br />
* '''highlight''': whether the unit's current hex should be highlighted (def. ''yes'').<br />
<br />
=== [sound]===<br />
Plays a sound<br />
* '''name''': the filename of the sound to play (in ''sounds/'' as .wav or .ogg)<br />
* '''repeat''': repeats the sound for a specified additional number of times (default=0)<br />
=== [sound_source] ===<br />
Creates a sound source. "Sound sources" is a general name for a mechanism which makes possible for map elements to emit sounds according to some rules, where "map elements" can be specific locations or terrain types. For now, only sound sources tied to locations are supported.<br />
* '''id''': a unique identification key of the sound source<br />
* '''sounds''': a list of comma separated, randomly played sounds associated with the sound source<br />
* '''delay''': a numerical value (in milliseconds) of the minimal delay between two playbacks of the source's sound if the source remains visible on the screen; if one scrolls out and back in, the source will be considered as ready to play<br />
* '''chance''': a percentage (a value from 0 to 100) describing the chance of the source being activated every second after the delay has passed or when the source's location appears on the screen (note that it cannot play more than one file at the same time)<br />
* '''check_fogged''': possible values "true" and "false" - if true the source will not play if its locations are fogged<br />
* '''check_shrouded''': possible values "true" and "false" - if true the source will not play if its locations are shrouded<br />
* '''x,y''': similar to x,y as found in a [[StandardLocationFilter]], these are the locations associated with the sound source<br />
* '''fade_range''' (default = 3): distance in hexes that determines a "circular" area around the one specified by '''full_range''' where sound volume fades out linearly<br />
* '''full_range''' (default = 14): distance in hexes that determines a "circular" area where source plays with full volume, relative to screen center<br />
* '''loop''': number of times a sound sample should be looped if it stays visible. -1 means infinite (~65000)<br />
<br />
=== [remove_sound_source] ===<br />
Removes a previously defined sound source.<br />
* '''id''': the identification key of the sound source to remove<br />
<br />
=== [music]===<br />
Switches to playing different music<br />
* '''name''': the filename of the music to play (in ''music/'' as .ogg)<br />
* see [[MusicListWML]] for the correct syntax<br />
===[volume]===<br />
Changes the game volume to a percent of the preferences volume for the game being played. Values can go from 0 to 100: <br />
* '''music''': Changes the music volume.<br />
* '''sound''': Changes the sound volume.<br />
=== [color_adjust]===<br />
Tints the color of the screen.<br />
* '''red''', '''green''', '''blue''': values from -255 to 255, the amount to tint by for each color<br />
=== [delay] ===<br />
Pauses the game.<br />
* '''time''': the time to pause in milliseconds<br />
=== [redraw] ===<br />
Redraws the screen (this normally isn't done during events, although some of the other interface actions cause the screen or parts of it to be redrawn).<br />
* '''clear_shroud''' (boolean yes|no, default no): If yes, clears fog and shroud around existing units. Useful if you, for example, spawn friendly units in the middle of an event and want the shroud to update accordingly (otherwise units that spawn inside fog would remain invisible for the duration of the event, since the fog would not automatically get cleared around them).<br />
* '''[[StandardSideFilter]]''': the sides for which to recalculate fog and shroud.<br />
* '''side''': If used (forces clear_shroud=yes), clears fog and shroud for that side.<br />
<br />
=== [unit_overlay] ===<br />
Sets an image that will be drawn over a particular unit, and follow it around<br />
* [[StandardUnitFilter]]: All matching units will get the overlay (do not use [filter])<br />
* '''image''': the image to place on the unit<br />
<br />
=== [remove_unit_overlay] ===<br />
removes a particular overlayed image from a unit<br />
* [[StandardUnitFilter]]: The overlay will get removed from all matching units (do not use [filter])<br />
* '''image''': the image to remove from the unit<br />
<br />
=== [animate_unit] ===<br />
Uses an animation of a unit to animate it on screen (if the unit has the corresponding animation).<br />
* '''flag''': The key to find the custom animation in the unit description (see the '''[extra_anim]''' description in [[AnimationWML]]). Standard animations can be triggered with the following keywords: ''leading recruited standing idling levelout levelin healing healed poisoned movement defend attack death victory pre_teleport post_teleport''<br />
* '''[filter]''' with a [[StandardUnitFilter]] as argument, see [[FilterWML]]. By default, the unit at the event location will be animated. You can use this tag to choose any other unit to animate.<br />
* '''[primary_attack]''': If this tag is not present, the filter for animation will be triggered with no attack. If it is here, all attacks from the unit will be filtered, and a matching one will be used to filter the animation. Takes a weapon filter as argument, see [[FilterWML]].<br />
* '''[secondary_attack]''': Similar to '''[primary_attack]'''. May be needed to trigger a defense animation correctly, if there are more than one animations available for the defending unit.<br />
* '''hits''': yes/no/hit/miss/kill: which according variation of a attack/defense animation shall be chosen (required)<br />
* '''text''': a text to hover during the animation <br />
* '''red''': red value for the text color (0-255)<br />
* '''green''': green value for the text color<br />
* '''blue''': blue value for the text color<br />
* '''with_bars''': yes/no: whether to display the status bars during the animation (e.g. the hitpoint bar)<br />
* '''[animate]''': a sub block with the same syntax as '''[animate_unit]''' except that the '''[filter]''' block is mandatory to find the unit. This block will find and animate another unit simultaneously.<br />
* '''[facing]''': a [[StandardLocationFilter]] specifying what direction the unit should be facing when animated<br />
<br />
=== [label] ===<br />
Places a label on the map.<br />
* '''x''', '''y''': the location of the label<br />
* '''text''': what the label should say<br />
* '''team_name''': if specified, the label will only be visible to the given team.<br />
* '''color''': color of the label. The format is r,g,b; r, g and b are numbers between 0 and 255.<br />
* '''visible_in_fog''': whether the label should be visible through fog or not. Default yes.<br />
* '''visible_in_shroud''': whether the label should be visible through shroud or not. Default no.<br />
* '''immutable''': whether this label is protected from being removed or changed by players. Default yes.<br />
=== [floating_text]===<br />
Floats text (similar to the damage and healing numbers) on the given locations.<br />
* [[StandardLocationFilter]]: the text will be floated on all matching locations simultaneously.<br />
* '''text''': the text to display.<br />
<br />
The default text color is <span style="color: #6b8cff;">'''#6b8cff'''</span>. To change the color, use [[#Formatting|Pango markup]]. For example:<br />
<br />
<pre><br />
# Float some golden yellow text at 20,20.<br />
[floating_text]<br />
x,y=20,20<br />
text="<span color='#cccc33'>" + _ "Your text here" + "</span>"<br />
[/floating_text]<br />
</pre><br />
<br />
=== [deprecated_message] ===<br />
Shows a deprecated message in the message area, this feature is only intended to be used to warn about deprecated macros in mainline. The message is not translatable.<br />
* '''message''': the message to show.<br />
=== [wml_message] ===<br />
Outputs a message to Wesnoth's console output. Intended for campaign designers to output silent text to the console, without annoying the player; then, that text might contain information useful for later bug-reporting. The log domain for it is '''wml''', and the '''debug/dbg''' log level is available for use with the '''logger''' attribute. Depending on the current log level ('''error''' by default), which may be changed with the in-game :log command, or the --log-<level>=wml command line switch, the messages are echoed to the in-game chat.<br />
* '''message''': the message to show.<br />
* '''logger''': the Wesnoth engine output logger that should catch the text; this might be 'err' (the errors log level), 'warn'/'wrn' (the warnings log level) or anything else (the information log level). Not all information will be displayed depending on the log level chosen when starting Wesnoth.<br />
<br />
Note: As of 1.9.4/1.9.5 (r48805) the following "loggers" should work: If in [wml_message]: err/error, warn/wrn/warning, debug/dbg; using the :log command: Only the long forms error, warning, info and debug (this part gathered by trying rather than source inspecting). The long forms are most likely also the only ones working when starting wesnoth with --log-<level>=wml.<br />
For log level warning or error (as during normal play), only wml_messages with logger error or warning display (for both). With logger info or debug, additionally wml_messages with logger info or debug display (for both).<br />
<br />
=== [open_help] ===<br />
Opens the in-game help.<br />
* '''topic''': the id of the topic to open<br />
=== [show_objectives] ===<br />
refreshes the objectives defined by [objectives] and its [show_if] tags, and displays them. (It is also called whenever the user explicitly asks for the objectives; this matters only if the tag was overridden by a [[LuaWML#register_wml_action|Lua]] script.)<br />
* '''side''': the side to show the objectives. If not set, all sides are used.<br />
* '''[[StandardSideFilter]]''' {{DevFeature1.11}} tags and keys: Tag affects the matching sides instead of just all or the one given by the integer value of the side= key.<br />
<br />
=== [chat] ===<br />
Displays a message in the chat area.<br />
* '''speaker''': (default="WML") A string for the name of the sender of the message.<br />
* '''message''': The message that should be displayed.<br />
* '''[[StandardSideFilter]]''' tags and keys as argument; if the same client controls multiple sides that match, then the message will only be displayed once.<br />
<br />
== Useful Macros ==<br />
There are some predefined macros that you find useful for interface actions. You can find a complete list along with a detailed explanation of how they work [http://www.wesnoth.org/macro-reference.xhtml here].<br />
* '''{HIGHLIGHT_UNIT}''' Highlight a unit on the map. Use this to show important units<br />
* '''{HIGHLIGHT_IMAGE}''' Places and highlights an image on the map. Use this to show important items or locations<br />
* '''{SET_IMAGE}''' Places an image on the map which has no other function.<br />
* '''{QUAKE <soundfile>}''' Creates a tremor-like screenshake and plays <soundfile>. For example, '''{QUAKE (rumble.ogg)}'''.<br />
* '''{FLASH_WHITE}''' Flash the screen white momentarily. You can also replace WHITE with RED, BLUE or GREEN for a different colour.<br />
<br />
== See Also ==<br />
* [[DirectActionsWML]]<br />
* [[InternalActionsWML]]<br />
* [[EventWML]]<br />
* [[ReferenceWML]]<br />
<br />
<br />
[[Category: WML Reference]]<br />
[[Category: ActionsWML]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=DirectActionsWML&diff=55524DirectActionsWML2014-09-29T10:40:30Z<p>Dugi: /* [replace_map] */ grammar loose -> lose</p>
<hr />
<div>{{WML Tags}}<br />
== Direct actions ==<br />
<br />
Direct actions are actions that have a direct effect on gameplay. They can be used inside of [[EventWML|events]].<br />
<br />
The following tags are actions:<br />
<br />
=== [endlevel] ===<br />
Ends the scenario.<br />
* '''result''': before the scenario is over, all events with ''name=result'' are triggered. If ''result=victory'', the player progresses to the next level (i.e., the next scenario in single player); if ''result=defeat'', the game returns to the main menu. <br />
<br />
When the result is "victory" the following keys can be used:<br />
* '''bonus''': whether the player should get bonus gold (maximum possible gold that could have been earned by waiting the level out). The default is bonus=yes.<br />
* '''carryover_report''': whether the player should receive a summary of the scenario outcome, the default is carryover_report=yes.<br />
* '''save''': whether a start-of-scenario save should be created for the next scenario, the default is save=yes. Do not confuse this with saving of replays for the current scenario.<br />
* '''replay_save''': whether a replay save for the current scenario is allowed, the default is replay_save=yes. If yes, the player's settings in preferences will be used to determine if a replay is saved. If no, will override and not save a replay.<br />
* '''linger_mode''': If ...=yes, the screen is greyed out and there's the possibility to save before advancing to the next scenario, the default is linger_mode=yes.<br />
* '''reveal_map''': (Multiplayer only) (Default is 'yes') If 'no', shroud doesn't disappear when game ended.<br />
* '''next_scenario''': (default specified in '''[scenario]''' tag) the ID of the next scenario that should be played. All units that side 1 controls at this point become available for recall in ''next_scenario''.<br />
* '''carryover_percentage''': by default 80% of the gold is carried over to the next scenario, with this key the amount can be changed.<br />
* '''carryover_add''': if true the gold will be added to the starting gold the next scenario, if false the next scenario will start with the amount of the current scenario (after taxes) or the minimum in the next scenario. Default is false.<br />
* '''music''': (default specified in '''[scenario]''' or '''[game_config]''' tags) a comma-separated list of music tracks from which one will be chosen and played once after any events related to the end of level result are executed; by default, victory_music is used on victory, and defeat_music on defeat.<br />
* '''end_credits''': {{DevFeature1.11}} Whether to display the credits screen at the end of a single-player campaign. Defaults to ''yes''. Note that this has cumulative effects over the campaign - it persists even if the endlevel does not trigger the end of the campaign. See also [[CampaignWML]].<br />
* '''end_text''': (translatable) Text that is shown centered in a black screen at the end of a campaign. Defaults to "The End". Note that this has cumulative effects over the campaign - it persists even if the endlevel does not trigger the end of the campaign. See also [[CampaignWML]].<br />
* '''end_text_duration''': Delay, in milliseconds, before displaying the game credits at the end of a campaign. In other words, for how much time '''end_text''' is displayed on screen. Defaults to 3500. Note that this has cumulative effects over the campaign - it persists even if the endlevel does not trigger the end of the campaign. See also [[CampaignWML]].<br />
* <strike>'''[next_scenario_settings]''': {{DevFeature1.11}} Any tags or attribute children of this optional argument to [endlevel] are merged into the scenario/multiplayer tag of the *next* scenario. This allows you to e.g. reconfigure the [side] tags or settings, just before load. </strike> This feature was removed in 1.11.17, it might be redesigned and reintroduced.<br />
* <strike>'''[next_scenario_append]''': {{DevFeature1.11}} Any tags of this optional argument are appended at high level to the next scenario. This is most appropriate for [event] tags, although you may find other uses. Example test scenario for these features: https://gna.org/support/download.php?file_id=20119 </strike> This feature was removed in 1.11.17, it might be redesigned and reintroduced.<br />
<br />
=== [unit] ===<br />
Places a unit on the map. For syntax see [[SingleUnitWML]].<br />
* {{Short Note:Predefined Macro|GENERIC_UNIT}}<br />
* '''to_variable''': spawn directly into a variable instead of on the map.<br />
<br />
=== [recall] ===<br />
Recalls a unit taking into account any [http://wiki.wesnoth.org/SingleUnitWML filter_recall] of the leader. The unit is recalled free of charge, and is placed near its leader, e.g., if multiple leaders are present, near the first found which would be able to normally recall it.<br />
<br />
If neither a valid map location is provided nor a leader on the map would be able to recall it, the tag is ignored.<br />
<br />
* [[StandardUnitFilter]]: the first matching unit will be recalled. If no units match this tag is ignored. Do not use a [filter] tag. If a comma separated list is given, every unit currently considered for recall is checked against all the types (not each single one of the types against all units).<br />
* '''x,y''': the unit is placed here instead of next to the leader.<br />
* '''show''': yes/no, default yes: whether the unit is animated (faded in) or instantly displayed<br />
* '''fire_event''': boolean yes|no (default no); whether any according prerecall or recall events shall be fired.<br />
* '''check_passability''': (boolean yes|no, default yes): If yes, checks for terrain passability when placing the unit (a nearby passable hex is chosen).<br />
<br />
=== [teleport] ===<br />
Teleports a unit on map. {{Short Note:Predefined Macro|TELEPORT_UNIT}}<br />
* '''[filter]''': [[StandardUnitFilter]] the first unit matching this filter will be teleported.<br />
* '''x,y''': the position to teleport to.<br />
* '''clear_shroud''': should shroud be cleared on arrival<br />
* '''animate''': should a teleport animation be played (if the unit doesn't have a teleport animation, it will fade out/fade in)<br />
* '''check_passability''': (boolean yes|no, default yes): normally, units will not be teleported into terrain that is impassable for them. Setting this attribute to "no" permits it.<br />
<br />
(Note: There is also a ability named teleport, see [[AbilitiesWML]].)<br />
<br />
=== [terrain_mask] ===<br />
Changes the terrain on the map. See [[TerrainMaskWML]].<br />
<br />
=== [terrain] ===<br />
Changes the terrain on the map.<br />
* '''terrain''': the character of the terrain to use. See [[TerrainCodesWML]] to see what letter a type of terrain uses.<br />
* [[StandardLocationFilter]]. This [[StandardLocationFilter]]'s terrain= key is used for the new terrain, filtering by terrain can be done with a nested [[StandardLocationFilter]]: [and]terrain=terrain_string_to_be_filtered_for.<br />
* '''layer''': (overlay|base|both, default=both) only change the specified layer.<br />
* '''replace_if_failed''': (default=no) When replacing just one layer failed, try to replace the whole terrain. If '''terrain''' is an overlay only terrain, use the default_base as base layer. If the terrain has no default base, do nothing.<br />
Note: When a hex changes from a village terrain to a non-village terrain, and a team owned that village it loses that village. When a hex changes from a non-village terrain to a village terrain and there is a unit on that hex it does not automatically capture the village. The reason for not capturing villages it that there are too many choices to make; should a unit loose its movement points, should capture events be fired. It is easier to do this as wanted by the author in WML.<br />
<br />
=== [gold] ===<br />
Gives sides gold.<br />
* '''amount''': the amount of gold to give.<br />
* '''side''': (default=1) the number of the side to give the gold to. Can be a comma-separated list of sides. note: Default side=1 for empty side= is deprecated.<br />
* [[StandardSideFilter]] {{DevFeature1.11}} tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] as argument {{DevFeature1.11}}: [gold][filter_side] is deprecated, use the new inline SSF.<br />
<br />
=== [unstore_unit] ===<br />
Creates a unit from a game variable, and activates it on the playing field. This must be a specific variable describing a unit, and may not be an array -- to unstore an entire array, iterate over it. The variable is not cleared. See also [[InternalActionsWML#.5Bstore_unit.5D|[store_unit]]], [[ConditionalActionsWML#.5Bwhile.5D|[while]]] and [[InternalActionsWML#.5Bclear_variable.5D|[clear_variable]]].<br />
* '''variable''': the name of the variable.<br />
* '''find_vacant''': whether the unit should be placed on the nearest vacant tile to its specified location. If this is set to 'no'(default), then any unit on the same tile as the unit being unstored will be destroyed. <br />
* '''check_passability''': (boolean yes|no, default yes): If yes, checks for terrain passability when placing the unit. This key has no effect if find_vacant=no (no check performed then). Before 1.9 this key is always "no".<br />
* '''text''': (translatable) floating text to display above the unit, such as a damage amount<br />
* '''red''', '''green''', '''blue''': (default=0,0,0) the color to display the text in. Values vary from 0-255. You may find it convenient to use the {COLOR_HARM} or {COLOR_HEAL} macro instead. (Use {COLOR_HARM} or {COLOR_HEAL} instead of the whole red,green,blue= line.)<br />
* '''advance''': (default=true) if true the unit is advanced if it has enough XP. When modifying XP make sure to do it from inside a [[EventWML#Multiplayer_safety|synchronized event]] or it may lead to OOS errors especially when several advancement paths exist. Note that advance and post advance events are called, so infinite loops can happen.<br />
* '''fire_event''': (boolean yes|no, default no) Whether any advance/post advance events shall be fired if an advancement takes place, no effect otherwise.<br />
* '''animate''': {{DevFeature1.11}} (boolean yes|no, default yes) Whether "levelout" and "levelin" (or fade to white and back) animations shall be played if an advancement takes place, no effect otherwise.<br />
* '''x''' ,'''y''': override unit location, "x,y=recall,recall" will put the unit on the unit's side's recall list.<br />
Units can be unstored with negative (or zero) hit points. This can be useful if modifying a unit in its last_breath event (as the unit's death is already the next step), but tends to look wrong in other cases. In particular, it is possible to have units with negative hit points in play. Such units are aberrations, subject to unusual behavior as the game compensates for them. (For example, such units are currently automatically hit&ndash;and killed&ndash;in combat.) The details of the unusual behavior are subject to change between stable releases without warning.<br />
<br />
=== [allow_recruit] ===<br />
Allows a side to recruit units it couldn't previously recruit.<br />
* '''type''': the types of units that the side can now recruit.<br />
* '''side''': (default=1) the number of the side that is being allowed to recruit the units. This can be a comma-separated list note: Default side=1 for empty side= is deprecated.<br />
* [[StandardSideFilter]] {{DevFeature1.11}} tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
<br />
=== [allow_extra_recruit] ===<br />
Allows a leader to recruit units it couldn't previously recruit.<br />
These types add to the types the leader can recruit because of [side]recruit=.<br />
* '''extra_recruit''': the types of units that the unit can now recruit.<br />
* '''[[StandardUnitFilter]]''': All units matching this filter are modified. Does not match on recall list units.<br />
<br />
=== [disallow_recruit] ===<br />
Prevents a side from recruiting units it could previously recruit.<br />
* '''type''': the types of units that the side can no longer recruit.<br />
* '''side''': (default=1) the number of the side that may no longer recruit the units. This can be a comma-separated list note: Default side=1 for empty side= is deprecated.<br />
* [[StandardSideFilter]] {{DevFeature1.11}} tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
<br />
=== [disallow_extra_recruit] ===<br />
Prevents a leader from recruiting units it could previously recruit.<br />
* '''extra_recruit''': the types of units that the side can no longer recruit.<br />
* '''[[StandardUnitFilter]]''': All units matching this filter are modified. Does not match on recall list units.<br />
<br />
=== [set_recruit] ===<br />
Sets the units a side can recruit.<br />
* '''recruit''': the types of units that the side can now recruit.<br />
* '''side''': (default=1) the number of the side that is having its recruitment set. This can be a comma-separated list. note: Default side=1 for empty side= is deprecated.<br />
* [[StandardSideFilter]] {{DevFeature1.11}} tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
<br />
=== [set_extra_recruit] === <br />
Sets the units a leader can recruit.<br />
* '''extra_recruit''': the types of units that the leader can now recruit.<br />
* '''[[StandardUnitFilter]]''': All units matching this filter are modified. Does not match on recall list units.<br />
<br />
=== [modify_side] ===<br />
Modifies some details of a given side in the middle of a scenario. '''The following listed properties are the only properties that [modify_side] can affect!'''<br />
* '''side''': (default=1) the number of the side that is to be changed. note: Default side=1 for empty side= is deprecated.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] as argument<br />
* '''income''': the income given at the begining of each turn.<br />
* '''recruit''': a list of unit types, replacing the side's current recruitment list.<br />
* '''team_name''': the team in which the side plays the scenario.<br />
* '''user_team_name''': a translatable string representing the team's description. This has no effect on alliances. Defaults to ''team_name''.<br />
* '''gold''': the amount of gold the side owns.<br />
* '''village_gold''': the income setting per village for the side.<br />
* '''controller''': the identifier string of the side's controller. Uses the same syntax of the ''controller'' key in the [[SideWML|[side]]] tag.<br />
* '''fog''': a boolean string (yes/no) describing the status of Fog for the side.<br />
* '''shroud''': a boolean string describing the status of Shroud for the side.<br />
* '''hidden''': a boolean string specifying whether side is shown in status table.<br />
* '''color''': {{DevFeature1.11}} a team color range specification, name (e.g. "red", "blue"), or number (e.g. "1", "2") for this side. The default color range names, numbers, and definitions can be found in data/core/team_colors.cfg.<br />
* '''[ai]''': sets/changes AI parameters for the side. Only parameters that are specified in the tag are changed, this does not reset others to their default values. Uses the same syntax as described in [[AiWML]]. Note that [modify_side][ai] works for all simple AI parameters and some, but not all, of the composite ones. If in doubt, use [http://wiki.wesnoth.org/AiWML#Adding_and_Deleting_Aspects_with_the_.5Bmodify_ai.5D_Tag [modify_ai]] instead, which always works.<br />
* '''switch_ai''': replaces a side ai with a new AI from specified file(ignoring those AI parameters above). Path to file follows the usual WML convention.<br />
* '''reset_maps''': {{DevFeature1.11}} If set to "yes", then the shroud is spread to all hexes, covering the parts of the map that had already been explored by the side, including hexes currently seen. (Seen hexes will be cleared at the end of most events; they can also be manually cleared with {{tag|InterfaceActionsWML|redraw}}.) This is only effective if shroud is on, but this is evaluated after shroud= (and before shroud_data=).<br />
* '''reset_view''': {{DevFeature1.11}} If set to "yes", then the fog of war is spread to all hexes, covering the parts of the map that had already been seen this turn by the side, including hexes currently seen, excluding hexes affected by multi-turn {{tag|DirectActionsWML|lift_fog}}. (Seen hexes will be cleared at the end of most events; they can also be manually cleared with {{tag|InterfaceActionsWML|redraw}}.) This is only effective if fog is on, but this is evaluated after fog=.<br />
* '''share_maps''': change the share_maps side attribute. Be sure to use shroud=yes for that side and have it as an ally<br />
* '''share_view''': change the share_view side attribute. Be sure to use fog=yes for that side and have it as an ally<br />
* '''shroud_data''': changes to the side's shroud, using the same format as when defining the [side].<br />
* '''suppress_end_turn_confirmation''': {{DevFeature1.11}} Boolean value controlling whether or not a player is asked for confirmation when skipping a turn.<br />
* '''scroll_to_leader''': {{DevFeature1.11}} Boolean value controlling whether or not the game view scrolls to the side leader at the start of their turn when present.<br />
* '''flag''': {{DevFeature1.11}} Flag animation for villages owned by this side (see [[SideWML|[side]]]).<br />
* '''flag_icon''': {{DevFeature1.11}} Flag icon used for this side in the status bar (see [[SideWML|[side]]]).<br />
* '''village_support''': {{DevFeature1.11}} The number of unit levels this side is able to support (does not pay upkeep on) per village it controls.<br />
<br />
=== [modify_turns] ===<br />
Modifies the turn limit in the middle of a scenario.<br />
* '''value''': the new turn limit.<br />
* '''add''': if used instead of ''value'', specifies the number of turns to add to the current limit (can be negative).<br />
* '''current''': changes the current turn number after applying turn limit modifications, if any. It is not possible to change the turn number to exceed the turn limit (1 <= current turns <= max turns).<br />
<br />
=== [allow_end_turn] ===<br />
Allows human players to end their turn through the user interface if they were previously affected by the '''[disallow_end_turn]''' action. This action doesn't take any arguments.<br />
<br />
=== [disallow_end_turn] ===<br />
Disallows human players to end their turn through the user interface. This action doesn't take any arguments.<br />
<br />
'''Note:''' on Wesnoth versions prior to 1.10.6, there are two bugs affecting this WML action. First, its effect was lost when reloading from a saved game ([https://gna.org/bugs/?20350 bug #20350]); second, its effect persisted when advancing scenarios in a campaign ([https://gna.org/bugs/?20351 bug #20351]).<br />
<br />
A known workaround for both issues would be to use [[PreprocessorRef#.23ifver_and_.23ifnver|#ifver]]-based preprocessor macros to include additional code for Wesnoth 1.10.5 and earlier taking advantage of unique ''preload'', ''victory'', and ''defeat'' [[EventWML|event handlers]], such as the following:<br />
<br />
#ifver WESNOTH_VERSION > 1.10.5<br />
<br />
#define DISALLOW_END_TURN<br />
[disallow_end_turn][/disallow_end_turn]<br />
#enddef<br />
<br />
#define ALLOW_END_TURN<br />
[allow_end_turn][/allow_end_turn]<br />
#enddef<br />
<br />
#else<br />
<br />
#define DISALLOW_END_TURN<br />
[disallow_end_turn][/disallow_end_turn]<br />
<br />
[event]<br />
id=bug_20350_workaround<br />
name=preload<br />
<br />
[disallow_end_turn][/disallow_end_turn]<br />
[/event]<br />
<br />
[event]<br />
id=bug_20351_workaround<br />
name=victory,defeat<br />
<br />
[allow_end_turn][/allow_end_turn]<br />
[/event]<br />
#enddef<br />
<br />
#define ALLOW_END_TURN<br />
[allow_end_turn][/allow_end_turn]<br />
<br />
[event]<br />
id=bug_20350_workaround<br />
remove=yes<br />
[/event]<br />
<br />
[event]<br />
id=bug_20351_workaround<br />
remove=yes<br />
[/event]<br />
#enddef<br />
<br />
#endif<br />
<br />
=== [capture_village] ===<br />
Changes the ownership of a village.<br />
* [[StandardLocationFilter]]: all village locations matching the filter are affected.<br />
* '''side''': the side that takes control of the village. This side needs to have a leader (canrecruit=yes). If the side key is not given, the village will become neutral (unless [filter_side] is present, in which case that side fiter decides, see below).<br />
* '''[filter_side]''' with [[StandardSideFilter]] tags and keys as arguments; if both this tag and inline side= are present it's an error. Otherwise, the first matching side gets ownership (or the village becomes neutral if none match).<br />
* '''fire_event''' (boolean yes|no, default: no): Whether any capture events shall be fired.<br />
<br />
=== [kill] ===<br />
Removes all units (including units in a recall list) that match the filter from the game.<br />
* [[StandardUnitFilter]]: Selection criterion; do not use a [filter] tag.<br />
* '''animate''': if 'yes', displays the unit dying (fading away).<br />
* '''fire_event''': if 'yes', triggers any appropriate 'die' events (See [[EventWML]]). Note that events are only fired for killed units that have been on the map (as opposed to recall list).<br />
* '''[secondary_unit]''' with a [[StandardUnitFilter]] as argument. Do not use a [filter] tag. Has an effect only if fire_event=yes. The first on-map unit matching the filter becomes second_unit in any fired die and last breath events. If an on-map unit matches and if there are several units killed with a single [kill] tag, second_unit is this same unit for all of them. If no on-map unit matches or [secondary_unit] isn't present, the variable second_unit in each of the die and last breath events is always the same as the variable unit (the dying unit).<br />
<br />
=== [move_unit] ===<br />
works like the MOVE_UNIT macro.<br />
* [[StandardUnitFilter]] as argument; do not use a [filter] tag. All units matching the filter are moved. If the target location is occupied, the nearest free location is chosen.<br />
* '''to_x''' (unsigned integer): The units are moved to this x coordinate. Can be a comma-separated list, in which case the unit follows this given path during the move.<br />
* '''to_y''' (unsigned integer): The units are moved to this y coordinate. Can be a comma-separated list.<br />
* '''fire_event''' (optional, boolean yes|no, default no): Whether any according moveto events shall be fired. The target location ($x1, $y1 in the event) may not be the same location that the unit was tried to be moved to, if the original target location is occupied or impassable.<br />
* '''check_passability''' (boolean yes|no, default yes): Whether the terrain the unit is moved to should be checked for suiting the unit. (If it does not, a nearby suitable hex is chosen.)<br />
* {{DevFeature1.11}} '''force_scrolling''': Whether to scroll the map or not even when [[InterfaceActionsWML#.5Block_view.5D|[lock_view]]] is in effect or ''Follow Unit Actions'' is disabled in ''Advanced Preferences''. Defaults to using [[InterfaceActionsWML#.5Bmove_unit_fake.5D|[move_unit_fake]]]'s default value.<br />
<br />
=== [modify_ai] ===<br />
Changes AI objects (aspects, goals, candidate actions or stages) for a specified side. See [[AiWML#Adding_and_Deleting_Aspects_with_the_.5Bmodify_ai.5D_Tag|AiWML]] for full description.<br />
<br />
* '''action''' (string): Takes values 'add', 'change', 'delete' or 'try_delete' to do just that for the AI object.<br />
* '''path''' (string): Describes which AI object is to be modified. <br />
* '''[facet]''', '''[goal]''', '''[candidate_action]''' or '''[stage]''': Details about the AI object to be modified.<br />
* [[StandardSideFilter]] {{DevFeature1.11}} tags and keys; default for empty side= is all sides, as usual in a SSF.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] as argument {{DevFeature1.11}}: [modify_ai][filter_side] is deprecated, use the new inline SSF.<br />
<br />
=== [modify_unit] ===<br />
works similar to the MODIFY_UNIT macro.<br />
* '''[filter]''' with a [[StandardUnitFilter]] as argument. All units matching this filter are modified. Matches on recall list units too.<br />
* Accepts generally the syntax inside of wml unit variables created by [store_unit] which can be viewed in a savefile or by using the :inspect command. Can add traits with immediate effect. Cannot remove things. Subtags with the same name must be written in the correct order to match them with the tag they are supposed to modify.<br />
example usage (see also the test scenario):<br />
[modify_unit]<br />
[filter]<br />
x,y=38,6<br />
[/filter]<br />
hitpoints=10<br />
{TRAIT_HEALTHY}<br />
[/modify_unit]<br />
<br />
The unit which is currently modified is accessible via $this_unit, e.g. hitpoints = "$($this_unit.hitpoints / 2)" to set the hitpoints of all units to half of their particular maxima. This this_unit variable is independent from the this_unit variable available in the SUF used to determine which units to modify (first all matching units are gathered, and then all those are modified).<br />
<br />
note: The syntax allowed is somehow vague. Just try things and possibly correct/add/modify this documentation. (a [http://forums.wesnoth.org/viewtopic.php?f=21&t=31676& forum thread] discusses some related issues).<br />
<br />
=== [transform_unit] ===<br />
Transforms every unit matching the filter to the given unit type. Keeps intact hit points, experience and status. If the unit is transformed to a non-living type (undead or mechanical), it will be also unpoisoned.<br />
{{DevFeature1.11}} Hit points will be changed if necessary to respect the transformed unit's maximum hit points.<br />
* [[StandardUnitFilter]]: do not use a [filter] tag.<br />
* '''transform_to''': the unit type in which all the units matching the filter will be transformed. If missing, the units will follow their normal advancement.<br />
<br />
=== [petrify] ===<br />
<br />
* [[StandardUnitFilter]] as an argument. Do not use a [filter] tag. All units matching this filter are petrified. Recall list units are included.<br />
<br />
=== [unpetrify] ===<br />
* [[StandardUnitFilter]] as an argument. Do not use a [filter] tag. All units matching this filter are unpetrified. Recall list units are included.<br />
<br />
=== [object] ===<br />
Gives some unit an object which modifies their stats in some way.<br />
* '''id''': (Optional) when the object is picked up, a flag is set for ''id''. The object cannot be picked up if a flag for ''id'' has been set. This means that any object with an id can only be used once, even if first_time_only=no is set for the event. This restriction is per level. In a campaign objects with the same id can be assigned once per level.<br />
* '''delayed_variable_substitution''' (boolean yes|no, default no): If set to "yes", the wml block contained in this [object] is not variable-substituted at execution time of the event where this [object] is within. You need this to work around a bug when adding ABILITY_TELEPORT via an [object] or when using [object][effect][filter]with a $this_unit (see http://gna.org/bugs/index.php?18893).<br />
* '''[effect]''': one or more effect elements may be listed. See [[EffectWML]] for a description of [effect].<br />
* '''duration''':<br />
**if 'level', effects only last until the end of the level (note : 'level' is the scenario, so this doesn't mean it last until the unit levels-up). {{DevFeature1.11}} 'level' has been renamed to 'scenario'.<br />
**if 'forever' or not set, effects never wear off.<br />
** {{DevFeature1.11}} if 'turn', effects only last until the start of the unit's next turn (when the unit refreshes movement and attacks). (Like other start-of-turn behavior, objects with a duration of "turn" won't expire before turn 2.)<br />
* '''[filter]''' with a [[StandardUnitFilter]] as argument. The first unit found that matches the filter will be given the object. Only on-map units are considered. If no unit matches or no [filter] is supplied, it is tried to apply the object to the unit at the $x1,$y1 location of the event where this [object] is in. The case of no unit being at that spot is handled in the same way as no unit matching a given filter ([else] commands executed, cannot_use_message displayed)<br />
* '''[then]''': a subtag that lets you execute actions if the filter conditions are met. The most common action that should be inside here is a '''[remove_item]''' tag, but you could probably put any tags that otherwise work in a [then] tag.<br />
* '''[else]''': a subtag that lets you execute actions if the filter conditions are *not* met.<br />
* '''silent''': whether or not messages should be suppressed. Default is "no".<br />
* '''image''': the displayed image of the object.<br />
* '''name''': (translatable) displayed as a caption of the image.<br />
<br />
* '''description''': (translatable) displayed as a message of the image.<br />
* '''cannot_use_message''': (translatable) displayed instead of '''description''' if no unit passes the filter test.<br />
<br />
=== [remove_shroud] ===<br />
Removes some shroud from the map for a certain side (only relevant for sides that have shroud=yes).<br />
* '''side''': (default=1) the side for which to remove shroud. This can be a comma-separated list of sides. note: Default side=1 for empty side= is deprecated.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] as argument<br />
* [[StandardLocationFilter]]: the range of tiles for which shroud should be removed<br />
<br />
=== [place_shroud] ===<br />
Places some shroud on the map for a certain side (only relevant for sides that have shroud=yes).<br />
* '''side''': (default=1) the side for which to place shroud. This can be a comma-separated list. note: Default side=1 for empty side= is deprecated.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] as argument<br />
* [[StandardLocationFilter]]: the range of tiles on which shroud should be placed<br />
<br />
=== [lift_fog] ===<br />
{{DevFeature1.11}}Lifts the fog of war from parts of the map for a certain side (only relevant for sides that have fog=yes), allowing a player to witness what occurs there even if that player has no units within vision range.<br />
* '''[filter_side]''' with a [[StandardSideFilter]] indicating which sides should be affected.<br />
* [[StandardLocationFilter]]: the tiles from which fog should be lifted.<br />
* '''multiturn''': ''yes/no, default:no''. The default (not multiturn) causes fog to be removed in the same way that normal vision works; the cleared tiles will remain cleared until fog is recalculated (which normally happens when a side ends its turn). When multiturn is set to "yes", the cleared tiles remain clear until {{tag||reset_fog}} cancels the clearing. This allows tiles to remain clear for multiple turns, or to be refogged before the end of the current turn (without also refogging all tiles). Multiturn lifted fog is not shared with allies (even when share_view=yes).<br />
<br />
=== [reset_fog] ===<br />
{{DevFeature1.11}}The primary use of this tag is to remove multiturn lifted fog (created by {{tag||lift_fog}}), which causes the fog to reset to what it would have been had WML not interfered. (That is, hexes that a side's units could not see at any point this turn will be re-fogged, while seen hexes remain defogged.)<br />
* '''[filter_side]''' with a [[StandardSideFilter]] indicating which sides should be affected.<br />
* [[StandardLocationFilter]]: the fog reset will be restricted to these tiles.<br />
* '''reset_view''': ''yes/no, default: no'' If set to "yes", then in addition to removing multiturn fog, the side's current view is canceled (independent of the SLF). This means that all hexes will become fogged for the side unless multiturn fog exists outside the tiles selected by the SLF. Normally, one would want the currently seen hexes to become clear of fog; this is done automatically at the end of many events, and it can be done manually with {{tag|InterfaceActionsWML|redraw}}.<br />
Omitting both the SSF and the SLF would cancel all earlier uses of [lift_fog].<br />
Additionally setting reset_view="yes" would cause the side's entire map to be fogged (unless an ally keeps hexes clear by sharing its view).<br />
<br />
=== [allow_undo] ===<br />
<br />
Normally when an event with a handler fires, the player's undo stack is cleared, preventing all actions performed so far from being undone. Including this tag in the event handler prevents the stack from being cleared for this reason, allowing the player to undo actions. (However, the stack might still be cleared for other reasons, such as fog being cleared or combat occurring.) In the common cases, this means '''[allow_undo]''' allows the current action to be undone even though an event was handled. There is a less common case, though &mdash; specifically when handling a menu item, where there is no current action &mdash; and in this case, '''[allow_undo]''' means merely that earlier actions can still be undone.<br />
* {{DevFeature1.11}} Using this tag in a menu item has an additional side effect in 1.11. Starting with version 1.11.1, executing a WML menu item normally counts as doing something as far as the "you have not started your turn yet" dialog is concerned. However, a menu item whose handler includes '''[allow_undo]''' will not count.<br />
<br />
This tag does nothing during recruit and recall actions, as the game incorrectly ignores whether or not an event fired during those times. {{DevFeature1.11}} This has been fixed in the latest development release.<br />
<br />
The types of actions that can be undone are movement, recruitment, recalling, and dismissing a unit from the recall list. If an action is undone, only the position (or existence) of the involved unit will be restored; any altered variables or changes to the game will remain changed after the action is undone. It is up to the scenario designer to avoid abusing this command.<br />
* Technically, if '''[allow_undo]''' is inside an '''[event]''' with ''first_time_only=yes'' (the default setting), and the user undoes the event, then the state of the game has changed in this way: the event will not fire a second time, even though the user undid the action the first time.<br />
<br />
=== [heal_unit] ===<br />
Heal a unit. The variable '''$heal_amount''' will be set to the exact number of points healed (i.e can be lesser than the parameter '''amount''' if the unit is fully healed). $heal_amount contains only the number of hitpoints the first unit that was found got healed.<br />
* '''[filter]''': [[StandardUnitFilter]] All matching on-map units are healed. If no filter is supplied, it is tried to take the unit at $x1, $y1.<br />
* '''[filter_second]''': [[StandardUnitFilter]] all the units matching the filter ''and'' having the ''heals'' ability will have their animation played (if ''animate'' is set to true) for each of the units healed.<br />
* '''amount''': (integer, default full) the maximum points the unit(s) will be healed. Can't set below 1 or above max_hitpoints. If "full", sets hitpoints to max_hitpoints. Before 1.9 the default is 0.<br />
* '''animate''': a boolean which indicate if the healing animations must be played. (default no)<br />
* '''moves''': (integer, default 0) The maximum current movement points the units will be "healed". Can't set below 0 or above max_moves. If "full", sets moves to max_moves.<br />
* '''restore_attacks''': (boolean, default no) Whether the units' attacks_left should be reset to their max_attacks (usually 1).<br />
* '''restore_statuses''': (boolean, default yes) Whether standard statuses should be reset to "no". This affects poisoned, slowed, petrified and unhealable. Before 1.9 this is always "no".<br />
<br />
=== [harm_unit] ===<br />
Harms every unit matching the filter, for the specific damage amount.<br />
* '''[filter]''': [[StandardUnitFilter]] all matching units will be harmed (required).<br />
* '''[filter_second]''': [[StandardUnitFilter]] if present, the first matching unit will attack all the units matching the filter above.<br />
* '''amount''': the amount of damage that will be done (required).<br />
* '''alignment''': (default neutral) applies an alignment to the damage, this means that if alignment=chaotic, the damage will be increased at night and reduced at day.<br />
* '''damage_type''': if present, amount will be altered by unit resistance to the damage type specified.<br />
* '''kill''': (default yes) if yes, when a harmed unit goes to or below 0 HP, it is killed; if no its HP are set to 1.<br />
* '''fire_event''': (default no) if yes, when a unit is killed by harming, the corresponding events are fired. {{DevFeature1.11}} If yes, also the corresponding advance and post advance events are fired.<br />
* '''animate''': (default no) if yes, scrolls to each unit before harming it and plays its defense (or attack, if it's the harmer) and death animations. Special values supported, other than the usual yes and no, are "attacker", that means only the harmer will be animated, and "defender", that means only the harmed units will be animated. {{DevFeature1.11}} If the supplied value is yes, attacker or defender also advancement animations are played.<br />
* '''[primary_attack], [secondary_attack]''': these set the weapon against which the harmed units will defend, and that the harming unit will use to attack, respectively (notice this is the opposite of '''[filter]''' and '''[filter_second]''' above). This allows for playing specific defense and attack animations. Both tags are expected to contain a [[FilterWML#Filtering_Weapons|Standard Weapon Filter]].<br />
* '''delay''': if animate=yes, sets the delay (in milliseconds, default 500) between each unit harming.<br />
* '''variable''': if present, the damage caused to the unit, altered by resistances, will be stored in a WML array with the given name, under the "harm_amount" key.<br />
* '''poisoned, slowed, petrified, unhealable''': (default no) if yes, every harmed unit that doesn't already have such status will have it set.<br />
* '''experience''': if yes, and there is a harmer, experience will be attributed like in regular combat.<br />
* '''resistance_multiplier''': {{DevFeature1.11}} the harmed unit's resistance is multiplied by the supplied value; this means that a value lower than 1 increases it, and a value greater than 1 decreases it. Default value is 1, that means no modification.<br />
<br />
=== [time_area] ===<br />
How a day should progress in a given area. Everywhere not specified in a [time_area] tag is affected by the [time] tags in the [scenario] tag.<br />
* [[StandardLocationFilter]]: the locations to affect. ''note: only for [event][time_area]s - at scenario toplevel [time_area] does not support [[StandardLocationFilter]], only location ranges''<br />
* [[TimeWML]]: the new schedule.<br />
* '''id''': an unique identifier assigned to a time_area. Optional, unless you want to remove the time_area later. Can be a comma-separated list when removing time_areas, see below.<br />
* '''remove''': (boolean) yes/no value. Indicates whether the specified time_area should be removed. Requires an identifier. If no identifier is used, however, all time_areas are removed.<br />
* '''current_time''': The time slot number (starting with zero) active at the creation of the area.{{DevFeature1.11}}<br />
<br />
''Example:'' (caves in parts of a map)<br />
[time_area]<br />
x=1-2,4-5<br />
y=1-2,1-2<br />
{UNDERGROUND}<br />
[/time_area]<br />
<br />
=== [end_turn] ===<br />
End the current side's turn. The current event is finished before the turn is ended. Also, if the current event (where the tag appears) has been fired by another event, that event (and the complete stack of other possible parent events) is ended before [end_turn] comes into affect. Also, events following the event stack that fired [end_turn] are not omitted (e.g. [end_turn] is used by a side turn event and a turn refresh event does something afterwards).<br />
<br />
=== [replace_map] ===<br />
<br />
Replaces the entire map.<br />
* '''map''': Content of a wesnoth map file. example:<br />
map="{campaigns/Heir_To_The_Throne/maps/01_The_Elves_Besieged.map}"<br />
* '''expand''': if 'yes', allows the map size to increase. The expansion direction is currently always bottom-right.<br />
* '''shrink''': if 'yes', allows the map size to decrease. If the map size is reduced, any units that would no longer be on the map due to its coordinates no longer existing will be put into the recall list.<br />
Note: When a hex changes from a village terrain to a non-village terrain, and a team owned that village it loses that village. When a hex changes from a non-village terrain to a village terrain and there is a unit on that hex it does not automatically capture the village. The reason for not capturing villages it that there are too many choices to make; should a unit lose its movement points, should capture events be fired. It is easier to do this as wanted by the author in WML.<br />
<br />
=== [replace_schedule] ===<br />
Replace the time of day schedule of the entire scenario.<br />
* [[TimeWML]]: the new schedule.<br />
* '''current_time''': The time slot number (starting with zero) active at schedule replacement.{{DevFeature1.11}}<br />
<br />
=== [tunnel] ===<br />
<br />
Create a tunnel between some locations, later usable by units to move from source hex to target hex (using the movement cost of unit on the target terrain). ([http://forums.wesnoth.org/viewtopic.php?f=21&t=14749&p=405667&hilit=tunnel#p405667 source])<br />
<br />
* '''id''' identifier for the tunnel, to allow removing (optional).<br />
* '''remove''': (boolean) yes/no value. If yes, removes all defined tunnels with the same ID (then only id= is necessary). (default: no)<br />
* '''bidirectional''': (boolean) if yes, creates also a tunnel in the other direction. (default: yes)<br />
* '''always_visible''': (boolean) if yes, the possible movement of enemies under fog can be seen. (default: no)<br />
* '''[source]''': [[StandardLocationFilter]] the source hex(es) (required).<br />
* '''[target]''': [[StandardLocationFilter]] the target hex(es) (required).<br />
* '''[filter]''': [[StandardUnitFilter]] the units which can use the tunnel (required). Leave empty for "all units".<br />
<br />
(Note: The tunnel tag can also be used inside the [[AbilitiesWML|[teleport]]] ability, without remove= and id=).<br />
<br />
=== [do_command] ===<br />
<br />
{{DevFeature1.13|0}}<br />
<br />
Executes a command, specified using the same syntax as a [command] tag in [[ReplayWML]]. Not all [command]'s are valid: only these are accepted<br />
<br />
* [attack]<br />
* [move]<br />
* [recruit]<br />
* [recall]<br />
* [disband]<br />
* [fire_event]<br />
* [lua_ai]<br />
<br />
The tags corresponding to player actions generally use the same codepath as if a player had ordered it.<br />
<br />
One purpose of this tag is to allow scripting of noninteractive scenarios -- without a tag like this, this might require elaborate mechanisms to coerce ais in order to test these code paths.<br />
<br />
This command should always be replay safe.<br />
<br />
=== [store_relative_dir] ===<br />
<br />
{{DevFeature1.13|0}}<br />
<br />
Gets the relative direction from one hex to another. This is an interface to the function wesnoth uses to decide how a unit will face while it is moving / attacking / defending.<br />
<br />
* '''[source]''' x and y must describe a map location<br />
* '''[destination]''' similar<br />
* '''variable''' name of the variable to store string result in (one of 'n', 'nw', 'ne', 's', 'sw', 'se')<br />
* '''mode''' optional. 0 is the default setting corresponding to default wesnoth implementation used in animations. 1 is an alternate "radially symmetric" mode. The default mode breaks ties in the direction of south, since this makes more units face the player directly on screen. The radially symmetric mode breaks ties in the direction of counter-clockwise, and might be more appropriate in some cases.<br />
<br />
== Useful Macros ==<br />
There are some predefined macros that you find useful for direct actions. You can find a complete list along with a detailed explanation of how they work [http://www.wesnoth.org/macro-reference.xhtml here].<br />
* '''{MOVE_UNIT}''': Moves a unit to another location in the map and the player sees the movement (unlike [teleport])<br />
* '''{FULL_HEAL}''': Brings a unit to full HP<br />
* '''{LOYAL_UNIT}''': Create a loyal unit<br />
* '''{MODIFY_TERRAIN_MASK}''': Modify an area of terrain<br />
<br />
== See Also ==<br />
<br />
* [[InternalActionsWML]]<br />
* [[InterfaceActionsWML]]<br />
* [[EventWML]]<br />
* [[ReferenceWML]]<br />
<br />
[[Category: WML Reference]]<br />
[[Category: ActionsWML]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Dugi%27s_Campaign_Wizard&diff=54747Dugi's Campaign Wizard2014-04-14T19:32:29Z<p>Dugi: /* Questionnaire */</p>
<hr />
<div>{{SoC2014Student}}<br />
[[Category:SoC_Ideas_Your_Own_Ideas2014]]<br />
'<br />
<br />
==Description==<br />
<h4>Dugi - Campaign Wizard</h4><br />
I've seen on the forums that people frequently ask for campaign wizards and such and when they're told that there is no such thing, they struggle usually with the basics like writing a proper _main.cfg file. There is a project named Eclipse Java plugin, but it's not a part of wesnoth, only a few people know about it and it is basically just a text editor adapted to work with WML. This project is to make a campaign wizard, incorporated into the game, that would allow creating simpler campaigns in an intuitive way, without having to read or write source codes.<br />
<br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications (especially a special tag for macros and a property to make it depend on difficulty).<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, killing units, moving units).<br />
<br />
This is what the main window of the campaign editor might look like (sorry for not caring much about the layout's appearance, but that's not the point):<br />
http://i.imgur.com/1Y6Og6S.png<br />
<br />
Further expansions (if time remains or to be done in another summer) may include support for ifs, variables and objects in ActionWML, AMLA, custom abilities and weapon specials in UnitWML, maybe possible alternative scenario paths.<br />
<br />
==IRC==<br />
Dugi<br />
<br />
==Questionnaire==<br />
1) Basics <br />
<br />
1.1) Write a small introduction to yourself. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.2) State your preferred email address. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.3) If you have chosen a nick for IRC and Wesnoth forums, what is it? <br />
A shortcut of my last name, used commonly by my real-life friends.<br />
<br />
1.4) Why do you want to participate in summer of code? <br />
To get better in C++ and help developing a game.<br />
<br />
1.5) What are you studying, subject, level and school? <br />
I am studying plasma physics (4th year, master's) and mathematical informatics (1st year, undergraduate), these are two parallel major-only studies.<br />
<br />
1.6) What country are you from, at what time are you most likely to be able to join IRC? <br />
I am the most likely to join IRC during the day in Europe, maybe in the evening. Rather in the evening during lessons.<br />
<br />
1.7) Do you have other commitments for the summer period ? Do you plan to take any vacations ? If yes, when. <br />
I have no other commitments.<br />
<br />
<br />
2) Experience <br />
<br />
2.1) What programs/software have you worked on before? <br />
I have made an add-on campaign for Battle for Wesnoth. I was also making a 3D game using Ogre3D (but I accidentally lost all the files, and haven't written much in its remake because I didn't have enough time).<br />
<br />
2.2) Have you developed software in a team environment before? (As opposed to hacking on something on your own) <br />
Not in team.<br />
<br />
2.3) Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why? <br />
I haven't participated there yet.<br />
<br />
2.4) Are you already involved with any open source development projects? If yes, please describe the project and the scope of your involvement. <br />
Actually coding some other stuff for Battle for Wesnoth. I have done some user-made content before.<br />
<br />
2.5) Gaming experience - Are you a gamer? <br />
Yes.<br />
<br />
2.5.1) What type of gamer are you? <br />
Playing like twice a week, usually like 6 hours in a row.<br />
<br />
2.5.2) What type of games? <br />
Mostly RPGs.<br />
<br />
2.5.3) What type of opponents do you prefer? <br />
AI opponents, competitive player versus player doesn't attract me much.<br />
<br />
2.5.4) Are you more interested in story or gameplay? <br />
Rather gameplay, but I enjoy a good story, it can keep me playing even if the gameplay isn't as good.<br />
<br />
2.5.5) Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer. <br />
Yes, initially a lot (like 4 years ago), then I played less and I worked mostly on making my own campaign. I prefer single player.<br />
<br />
2.6) If you have contributed any patches to Wesnoth, please list them below. You can also list patches that have been submitted but not committed yet and patches that have not been specifically written for GSoC. If you have gained commit access to our repository (during the evaluation period or earlier) please state so. <br />
<br />
None, but currently working on one.<br />
<br />
<br />
3) Communication skills <br />
<br />
3.1) Though most of our developers are not native English speakers, English is the project's working language. Describe your fluency level in written English. <br />
I write in English language almost as fluently as in my native language.<br />
<br />
3.2) What spoken languages are you fluent in? <br />
Depends how fluent. I should be fluent enough in Slovak, Czech and English. Maybe French after some revision.<br />
<br />
<br />
3.3) Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough. <br />
I play multiplayer really rarely, not only because of ill-mannered players.<br />
<br />
3.4) Do you give constructive advice? <br />
I think yes.<br />
<br />
3.5) Do you receive advice well? <br />
Yes.<br />
<br />
3.6) Are you good at sorting useful criticisms from useless ones? <br />
I think yes.<br />
<br />
3.7) How autonomous are you when developing ? Would you rather discuss intensively changes and not start coding until you know what you want to do or would you rather code a proof of concept to "see how it turn out", taking the risk of having it thrown away if it doesn't match what the project want <br />
I prefer discussing things briefly and then doing them, deciding about all the details myself, petty problems can be corrected afterwards.<br />
<br />
<br />
4) Project <br />
<br />
4.1) Did you select a project from our list? If that is the case, what project did you select? What do you want to especially concentrate on? <br />
Yes, I liked the Campaign-making wizard project (submitted by GoblinThing, not chosen for GSoC), so I picked it.<br />
<br />
4.2) If you have invented your own project, please describe the project and the scope. <br />
N/A<br />
<br />
4.3) Why did you choose this project? <br />
Because I consider myself a veteran at making campaigns.<br />
<br />
4.4) Include an estimated timeline for your work on the project. Don't forget to mention special things like "I booked holidays between A and B" and "I got an exam at ABC and won't be doing much then". <br />
I should have no exams during the summer (unless I fail some miserably, but three years of physics have taught me how to pass), and I don't know if I'll be on some holidays so early. But I can code also during holiday, last time I did, unless my family chooses to fly somewhere like to Vietnam where I would fear to bring my laptop.<br />
<br />
Steps:<br />
<br />
1. (week 1) Creating a data structure similar to config, but allowing also some macro usage that is necessary for campaigns. It would add two extra member variables. One, a string, would be the define the tag would be wrapped in, because campaigns can't be written without this (and it's necessary to make something depend on difficulty). The other one, a vector of strings, would transform the tag into a macro, first member being the macro name (it is a macro of this one is present) and others being macro arguments.<br />
<br />
2. (week 2) Adding a campaign wizard window somewhere (details like where would it be are to be discussed), making it create a folder for the campaign, its _main.cfg and server.pbl files and write some paths into the _main file (asking just for a few text fields like campaign name, description, etc.). There will be buttons to add scenarios and units, implemented in the next steps. It would be also able to load existing campaigns, but only if they are simple enough.<br />
<br />
3. (weeks 3-4) Changing the map editor to enable it to create also SP scenarios (would be a new object created via inheritance or just the same with some extra ifs), placing units, saving coordinates and other things the new editor can do. It would also handle SideWML, offer more possibilities with units in the scenarios and contain an event editor to add some dialogues, create/recall units, and end the scenario (shown as lines, with an edit/add button that would edit the properties of each tag). Check boxes for scenario variables like disallow_recall or victory_when_enemies_defeated would be present as well.<br />
<br />
4. (week 5) Expanding the possibilities of the ActionWML and basic filters. Adding moving units, giving gold, a few basic stuff. Filters would ask for some properties of the units, describing them as killer/victim instead of primary/secondary unit. This would need windows created through the C++ code without GUIWML, like the GUI in manager_ui.cpp.<br />
<br />
5. (week 6) Adding a menu that allows creating new unit types. It would have text fields for basic stuff, facilities to assign images for baseframe and animations, generic abilities and generic weapon specials.<br />
<br />
6. (weeks 7-8) Finishing the project, using it to create a campaign in order to find features that are annoying to use and bugs that might not have been spotted.<br />
<br />
7. (if time remains, maybe next summer) Adding more functionality to ActionWML and UnitWML. Variable usage like setting variables, options to messages, incrementing variables and checking variable content might expand ActionWML, specific abilities, variations, weapon specials and AMLA might expand UnitWML. AMLA and objects would require coding EffectWML (means enabling the more common changes like common abilities and weapon specials, changing damage, resistances and movement).<br />
<br />
4.5) Include as much technical detail about your implementation as you can <br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA). The scenario editor will have to partially collaborate with the map editor.<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, recalling, changing gold, killing units, moving units).<br />
<br />
See also the introduction.<br />
<br />
4.6) What do you expect to gain from this project? <br />
Experience and pleasure from helping others. I know this sounds pathetic...<br />
<br />
4.7) What would make you stay in the Wesnoth community after the conclusion of SOC? <br />
I am maintaining the add-on campaign I've made, and I'll have to maintain it for ages because of its high popularity and high complexity.<br />
<br />
<br />
5) Practical considerations <br />
<br />
5.1) Are you familiar with any of the following tools or languages? <br />
Git (used for all commits) <br />
Familiar to some extent<br />
C++ (language used for all the normal source code) <br />
Familiar<br />
STL, Boost, Sdl (C++ libraries used by Wesnoth) <br />
No. I have used a few boost functions, though.<br />
Python (optional, mainly used for tools) <br />
No, but I know how to execute python scripts, for I have used these python tools.<br />
build environments (eg cmake/scons) <br />
Familiar with CMake, but I have used scons to build wesnoth once.<br />
WML (the wesnoth specific scenario language) <br />
Familiar<br />
Lua (used in combination with WML to create scenarios) <br />
Quite familiar<br />
<br />
5.2) Which tools do you normally use for development? Why do you use them? <br />
QtCreator as IDE for C++<br />
GNU g++ for compiling<br />
Gedit for other stuff<br />
<br />
5.3) What programming languages are you fluent in? <br />
C, C++<br />
<br />
5.4) Would you mind talking with your mentor on telephone / internet phone? We would like to have a backup way for communications for the case that somehow emails and IRC do fail. If you are willing to do so, please do list a phone number (including international code) so that we are able to contact you. You should probably *only* add this number in the application for you submit to google since the info in the wiki is available in public. We will *not* make any use of your number unless some case of "there is no way to contact you" does arise!<br />
<br />
Written on google-melange, the last thing I need is more spam phone calls.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Dugi%27s_Campaign_Wizard&diff=54746Dugi's Campaign Wizard2014-04-14T19:28:37Z<p>Dugi: /* Questionnaire */ added a few more detail</p>
<hr />
<div>{{SoC2014Student}}<br />
[[Category:SoC_Ideas_Your_Own_Ideas2014]]<br />
'<br />
<br />
==Description==<br />
<h4>Dugi - Campaign Wizard</h4><br />
I've seen on the forums that people frequently ask for campaign wizards and such and when they're told that there is no such thing, they struggle usually with the basics like writing a proper _main.cfg file. There is a project named Eclipse Java plugin, but it's not a part of wesnoth, only a few people know about it and it is basically just a text editor adapted to work with WML. This project is to make a campaign wizard, incorporated into the game, that would allow creating simpler campaigns in an intuitive way, without having to read or write source codes.<br />
<br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications (especially a special tag for macros and a property to make it depend on difficulty).<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, killing units, moving units).<br />
<br />
This is what the main window of the campaign editor might look like (sorry for not caring much about the layout's appearance, but that's not the point):<br />
http://i.imgur.com/1Y6Og6S.png<br />
<br />
Further expansions (if time remains or to be done in another summer) may include support for ifs, variables and objects in ActionWML, AMLA, custom abilities and weapon specials in UnitWML, maybe possible alternative scenario paths.<br />
<br />
==IRC==<br />
Dugi<br />
<br />
==Questionnaire==<br />
1) Basics <br />
<br />
1.1) Write a small introduction to yourself. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.2) State your preferred email address. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.3) If you have chosen a nick for IRC and Wesnoth forums, what is it? <br />
A shortcut of my last name, used commonly by my real-life friends.<br />
<br />
1.4) Why do you want to participate in summer of code? <br />
To get better in C++ and help developing a game.<br />
<br />
1.5) What are you studying, subject, level and school? <br />
I am studying plasma physics (4th year, master's) and mathematical informatics (1st year, undergraduate), these are two parallel major-only studies.<br />
<br />
1.6) What country are you from, at what time are you most likely to be able to join IRC? <br />
I am the most likely to join IRC during the day in Europe, maybe in the evening. Rather in the evening during lessons.<br />
<br />
1.7) Do you have other commitments for the summer period ? Do you plan to take any vacations ? If yes, when. <br />
I have no other commitments.<br />
<br />
<br />
2) Experience <br />
<br />
2.1) What programs/software have you worked on before? <br />
I have made an add-on campaign for Battle for Wesnoth. I was also making a 3D game using Ogre3D (but I accidentally lost all the files, and haven't written much in its remake because I didn't have enough time).<br />
<br />
2.2) Have you developed software in a team environment before? (As opposed to hacking on something on your own) <br />
Not in team.<br />
<br />
2.3) Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why? <br />
I haven't participated there yet.<br />
<br />
2.4) Are you already involved with any open source development projects? If yes, please describe the project and the scope of your involvement. <br />
Actually coding some other stuff for Battle for Wesnoth. I have done some user-made content before.<br />
<br />
2.5) Gaming experience - Are you a gamer? <br />
Yes.<br />
<br />
2.5.1) What type of gamer are you? <br />
Playing like twice a week, usually like 6 hours in a row.<br />
<br />
2.5.2) What type of games? <br />
Mostly RPGs.<br />
<br />
2.5.3) What type of opponents do you prefer? <br />
AI opponents, competitive player versus player doesn't attract me much.<br />
<br />
2.5.4) Are you more interested in story or gameplay? <br />
Rather gameplay, but I enjoy a good story, it can keep me playing even if the gameplay isn't as good.<br />
<br />
2.5.5) Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer. <br />
Yes, initially a lot (like 4 years ago), then I played less and I worked mostly on making my own campaign. I prefer single player.<br />
<br />
2.6) If you have contributed any patches to Wesnoth, please list them below. You can also list patches that have been submitted but not committed yet and patches that have not been specifically written for GSoC. If you have gained commit access to our repository (during the evaluation period or earlier) please state so. <br />
<br />
None, but currently working on one.<br />
<br />
<br />
3) Communication skills <br />
<br />
3.1) Though most of our developers are not native English speakers, English is the project's working language. Describe your fluency level in written English. <br />
I write in English language almost as fluently as in my native language.<br />
<br />
3.2) What spoken languages are you fluent in? <br />
Depends how fluent. I should be fluent enough in Slovak, Czech and English. Maybe French after some revision.<br />
<br />
<br />
3.3) Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough. <br />
I play multiplayer really rarely, not only because of ill-mannered players.<br />
<br />
3.4) Do you give constructive advice? <br />
I think yes.<br />
<br />
3.5) Do you receive advice well? <br />
Yes.<br />
<br />
3.6) Are you good at sorting useful criticisms from useless ones? <br />
I think yes.<br />
<br />
3.7) How autonomous are you when developing ? Would you rather discuss intensively changes and not start coding until you know what you want to do or would you rather code a proof of concept to "see how it turn out", taking the risk of having it thrown away if it doesn't match what the project want <br />
I prefer discussing things briefly and then doing them, deciding about all the details myself, petty problems can be corrected afterwards.<br />
<br />
<br />
4) Project <br />
<br />
4.1) Did you select a project from our list? If that is the case, what project did you select? What do you want to especially concentrate on? <br />
Yes, I liked the Campaign-making wizard project (submitted by GoblinThing, not chosen for GSoC), so I picked it.<br />
<br />
4.2) If you have invented your own project, please describe the project and the scope. <br />
N/A<br />
<br />
4.3) Why did you choose this project? <br />
Because I consider myself a veteran at making campaigns.<br />
<br />
4.4) Include an estimated timeline for your work on the project. Don't forget to mention special things like "I booked holidays between A and B" and "I got an exam at ABC and won't be doing much then". <br />
I should have no exams during the summer (unless I fail some miserably, but three years of physics have taught me how to pass), and I don't know if I'll be on some holidays so early. But I can code also during holiday, last time I did, unless my family chooses to fly somewhere like to Vietnam where I would fear to bring my laptop.<br />
<br />
Steps:<br />
<br />
1. Creating a data structure similar to config, but allowing also some macro usage that is necessary for campaigns. It would add two extra member variables. One, a string, would be the define the tag would be wrapped in, because campaigns can't be written without this (and it's necessary to make something depend on difficulty). The other one, a vector of strings, would transform the tag into a macro, first member being the macro name (it is a macro of this one is present) and others being macro arguments.<br />
<br />
2. Adding a campaign wizard window somewhere (details like where would it be are to be discussed), making it create a folder for the campaign, its _main.cfg and server.pbl files and write some paths into the _main file (asking just for a few text fields like campaign name, description, etc.). There will be buttons to add scenarios and units, implemented in the next steps. It would be also able to load existing campaigns, but only if they are simple enough.<br />
<br />
3. Changing the map editor to enable it to create also SP scenarios (would be a new object created via inheritance or just the same with some extra ifs), placing units, saving coordinates and other things the new editor can do. It would also handle SideWML, offer more possibilities with units in the scenarios and contain an event editor to add some dialogues, create/recall units, and end the scenario (shown as lines, with an edit/add button that would edit the properties of each tag). Check boxes for scenario variables like disallow_recall or victory_when_enemies_defeated would be present as well.<br />
<br />
4. Expanding the possibilities of the ActionWML and basic filters. Adding moving units, giving gold, a few basic stuff. Filters would ask for some properties of the units, describing them as killer/victim instead of primary/secondary unit. This would need windows created through the C++ code without GUIWML, like the GUI in manager_ui.cpp.<br />
<br />
5. Adding a menu that allows creating new unit types. It would have text fields for basic stuff, facilities to assign images for baseframe and animations, generic abilities and generic weapon specials.<br />
<br />
6. Finishing the project, using it to create a campaign in order to find features that are annoying to use and bugs that might not have been spotted.<br />
<br />
7. (if time remains, maybe next summer) Adding more functionality to ActionWML and UnitWML. Variable usage like setting variables, options to messages, incrementing variables and checking variable content might expand ActionWML, specific abilities, variations, weapon specials and AMLA might expand UnitWML. AMLA and objects would require coding EffectWML (means enabling the more common changes like common abilities and weapon specials, changing damage, resistances and movement).<br />
<br />
4.5) Include as much technical detail about your implementation as you can <br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, recalling, changing gold, killing units, moving units).<br />
<br />
4.6) What do you expect to gain from this project? <br />
Experience and pleasure from helping others. I know this sounds pathetic...<br />
<br />
4.7) What would make you stay in the Wesnoth community after the conclusion of SOC? <br />
I am maintaining the add-on campaign I've made, and I'll have to maintain it for ages because of its high popularity and high complexity.<br />
<br />
<br />
5) Practical considerations <br />
<br />
5.1) Are you familiar with any of the following tools or languages? <br />
Git (used for all commits) <br />
Familiar to some extent<br />
C++ (language used for all the normal source code) <br />
Familiar<br />
STL, Boost, Sdl (C++ libraries used by Wesnoth) <br />
No. I have used a few boost functions, though.<br />
Python (optional, mainly used for tools) <br />
No, but I know how to execute python scripts, for I have used these python tools.<br />
build environments (eg cmake/scons) <br />
Familiar with CMake, but I have used scons to build wesnoth once.<br />
WML (the wesnoth specific scenario language) <br />
Familiar<br />
Lua (used in combination with WML to create scenarios) <br />
Quite familiar<br />
<br />
5.2) Which tools do you normally use for development? Why do you use them? <br />
QtCreator as IDE for C++<br />
GNU g++ for compiling<br />
Gedit for other stuff<br />
<br />
5.3) What programming languages are you fluent in? <br />
C, C++<br />
<br />
5.4) Would you mind talking with your mentor on telephone / internet phone? We would like to have a backup way for communications for the case that somehow emails and IRC do fail. If you are willing to do so, please do list a phone number (including international code) so that we are able to contact you. You should probably *only* add this number in the application for you submit to google since the info in the wiki is available in public. We will *not* make any use of your number unless some case of "there is no way to contact you" does arise!<br />
<br />
Written on google-melange, the last thing I need is more spam phone calls.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Dugi%27s_Campaign_Wizard&diff=54745Dugi's Campaign Wizard2014-04-14T19:15:14Z<p>Dugi: /* Description */ added some detail</p>
<hr />
<div>{{SoC2014Student}}<br />
[[Category:SoC_Ideas_Your_Own_Ideas2014]]<br />
'<br />
<br />
==Description==<br />
<h4>Dugi - Campaign Wizard</h4><br />
I've seen on the forums that people frequently ask for campaign wizards and such and when they're told that there is no such thing, they struggle usually with the basics like writing a proper _main.cfg file. There is a project named Eclipse Java plugin, but it's not a part of wesnoth, only a few people know about it and it is basically just a text editor adapted to work with WML. This project is to make a campaign wizard, incorporated into the game, that would allow creating simpler campaigns in an intuitive way, without having to read or write source codes.<br />
<br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications (especially a special tag for macros and a property to make it depend on difficulty).<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, killing units, moving units).<br />
<br />
This is what the main window of the campaign editor might look like (sorry for not caring much about the layout's appearance, but that's not the point):<br />
http://i.imgur.com/1Y6Og6S.png<br />
<br />
Further expansions (if time remains or to be done in another summer) may include support for ifs, variables and objects in ActionWML, AMLA, custom abilities and weapon specials in UnitWML, maybe possible alternative scenario paths.<br />
<br />
==IRC==<br />
Dugi<br />
<br />
==Questionnaire==<br />
1) Basics <br />
<br />
1.1) Write a small introduction to yourself. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.2) State your preferred email address. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.3) If you have chosen a nick for IRC and Wesnoth forums, what is it? <br />
A shortcut of my last name, used commonly by my real-life friends.<br />
<br />
1.4) Why do you want to participate in summer of code? <br />
To get beter in C++ and help developping a game.<br />
<br />
1.5) What are you studying, subject, level and school? <br />
I am studying plasma physics (4th year, master's) and mathematical informatics (1st year, undergraduate), these are two parallel major-only studies.<br />
<br />
1.6) What country are you from, at what time are you most likely to be able to join IRC? <br />
I am the most likely to join IRC during the day in Europe, maybe in the evening. Rather in the evening during lessons.<br />
<br />
1.7) Do you have other commitments for the summer period ? Do you plan to take any vacations ? If yes, when. <br />
I have no other comittments.<br />
<br />
<br />
2) Experience <br />
<br />
2.1) What programs/software have you worked on before? <br />
I have made an add-on campaign for Battle for Wesnoth. I was also making a 3D game using Ogre3D (but I accidentally lost all the files, and haven't written much in its remake because I didn't have enough time).<br />
<br />
2.2) Have you developed software in a team environment before? (As opposed to hacking on something on your own) <br />
Not in team.<br />
<br />
2.3) Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why? <br />
I haven't participated there yet.<br />
<br />
2.4) Are you already involved with any open source development projects? If yes, please describe the project and the scope of your involvement. <br />
Actually coding some other stuff for Battle for Wesnoth. I have done some user-made content before.<br />
<br />
2.5) Gaming experience - Are you a gamer? <br />
Yes.<br />
<br />
2.5.1) What type of gamer are you? <br />
Playing like twice a week, usually like 6 hours in a row.<br />
<br />
2.5.2) What type of games? <br />
Mostly RPGs.<br />
<br />
2.5.3) What type of opponents do you prefer? <br />
AI opponents, competitive player versus player doesn't attract me much.<br />
<br />
2.5.4) Are you more interested in story or gameplay? <br />
Rather gameplay, but I enjoy a good story, it can keep me playing even if the gameplay isn't as good.<br />
<br />
2.5.5) Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer. <br />
Yes, initially a lot (like 4 years ago), then I played less and I worked mostly on making my own campaign. I prefer single player.<br />
<br />
2.6) If you have contributed any patches to Wesnoth, please list them below. You can also list patches that have been submitted but not committed yet and patches that have not been specifically written for GSoC. If you have gained commit access to our repository (during the evaluation period or earlier) please state so. <br />
<br />
None, but currently working on one.<br />
<br />
<br />
3) Communication skills <br />
<br />
3.1) Though most of our developers are not native English speakers, English is the project's working language. Describe your fluency level in written English. <br />
I write in English language almost as fluently as in my native language.<br />
<br />
3.2) What spoken languages are you fluent in? <br />
Depends how fluent. I should be fluent enough in Slovak, Czech and English. Maybe French after some revision.<br />
<br />
<br />
3.3) Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough. <br />
I play multiplayer really rarely, not only because of ill-mannered players.<br />
<br />
3.4) Do you give constructive advice? <br />
I think yes.<br />
<br />
3.5) Do you receive advice well? <br />
Yes.<br />
<br />
3.6) Are you good at sorting useful criticisms from useless ones? <br />
I think yes.<br />
<br />
3.7) How autonomous are you when developing ? Would you rather discuss intensively changes and not start coding until you know what you want to do or would you rather code a proof of concept to "see how it turn out", taking the risk of having it thrown away if it doesn't match what the project want <br />
I prefer discussing things briefly and then doing them, deciding about all the details myself, petty problems can be corrected afterwards.<br />
<br />
<br />
4) Project <br />
<br />
4.1) Did you select a project from our list? If that is the case, what project did you select? What do you want to especially concentrate on? <br />
Yes, I liked the Campaign-making wizard project, so I picked it.<br />
<br />
4.2) If you have invented your own project, please describe the project and the scope. <br />
N/A<br />
<br />
4.3) Why did you choose this project? <br />
Because I consider myself a veteran at making campaigns.<br />
<br />
4.4) Include an estimated timeline for your work on the project. Don't forget to mention special things like "I booked holidays between A and B" and "I got an exam at ABC and won't be doing much then". <br />
I should have no exams during the summer (unless I fail some miserably, but three years of physics have taught me how to pass), and I don't know if I'll be on some holidays so early. But I can code also during holiday, last time I did.<br />
<br />
Steps:<br />
<br />
1. Creating a data structure similar to config, but allowing also some macro usage that is necessary for campaigns. It would add two extra member variables. One, a string, would be the define the tag would be wrapped in, because campaigns can't be written without this (and it's necessary to make something depend on difficulty). The other one, a vector of strings, would transform the tag into a macro, first member being the macro name (it is a macro of this one is present) and others being macro arguments.<br />
<br />
2. Adding a campaign wizard window somewhere (details like where would it be are to be discussed), making it create a folder for the campaign, its _main.cfg and server.pbl files and write some paths into the _main file (asking just for a few text fields like campaign name, description, etc.). There will be buttons to add scenarios and units, implemented in the next steps. It would be also able to load existing campaigns, but only if they are simple enough.<br />
<br />
3. Changing the map editor to enable it to create also SP scenarios (would be a new object created via inheritance or just the same with some extra ifs), placing units, saving coordinates and other things the new editor can do. It would also handle SideWML, offer more possibilities with units in the scenarios and contain an event editor to add some dialogues, create/recall units, and end the scenario (shown as lines, with an edit/add button that would edit the properties of each tag). Check boxes for scenario variables like disallow_recall or victory_when_enemies_defeated would be present as well.<br />
<br />
4. Expanding the possibilities of the ActionWML, filters. Adding moving units, giving gold, very basic variable usage. Filters would ask for some properties of the units, describing them as killer/victim instead of primary/secondary unit. This would need windows created through the C++ code without GUIWML, like the GUI in manager_ui.cpp.<br />
<br />
5. Adding a menu that allows creating new unit types. It would have text fields for basic stuff, facilities to assign images for baseframe and animations, abilities and maybe some advancements. Adding also facilities for unit modifications, enabling the more common changes like common abilities and weapon specials, changing damage, resistances and movement (for AMLA, but also as [object] tags in scenarios).<br />
<br />
6. Finishing the project, using it to create a campaign in order to find features that are annoying to use and bugs that might not have been spotted.<br />
<br />
4.5) Include as much technical detail about your implementation as you can <br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, recalling, changing gold, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
4.6) What do you expect to gain from this project? <br />
Experience and pleasure from helping others. I know this sounds pathetic...<br />
<br />
4.7) What would make you stay in the Wesnoth community after the conclusion of SOC? <br />
I am maintaining the add-on campaign I've made, and I'll have to maintain it for ages because of its high popularity.<br />
<br />
<br />
5) Practical considerations <br />
<br />
5.1) Are you familiar with any of the following tools or languages? <br />
Git (used for all commits) <br />
Familiar<br />
C++ (language used for all the normal source code) <br />
Familiar<br />
STL, Boost, Sdl (C++ libraries used by Wesnoth) <br />
No. I have used a few boost functions, though.<br />
Python (optional, mainly used for tools) <br />
No, but I know how to execute python scripts, for I have used these python tools.<br />
build environments (eg cmake/scons) <br />
Familiar with CMake, but I have used scons to build wesnoth once.<br />
WML (the wesnoth specific scenario language) <br />
Familiar<br />
Lua (used in combination with WML to create scenarios) <br />
Quite familiar<br />
<br />
5.2) Which tools do you normally use for development? Why do you use them? <br />
QtCreator as IDE for C++<br />
Gedit for other stuff<br />
<br />
5.3) What programming languages are you fluent in? <br />
C, C++<br />
<br />
5.4) Would you mind talking with your mentor on telephone / internet phone? We would like to have a backup way for communications for the case that somehow emails and IRC do fail. If you are willing to do so, please do list a phone number (including international code) so that we are able to contact you. You should probably *only* add this number in the application for you submit to google since the info in the wiki is available in public. We will *not* make any use of your number unless some case of "there is no way to contact you" does arise!<br />
<br />
Written on google-melange, the last thing I need is more spam phone calls.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Dugi%27s_Campaign_Wizard&diff=54674Dugi's Campaign Wizard2014-04-10T17:03:52Z<p>Dugi: Added an image how it might look like</p>
<hr />
<div>{{SoC2014Student}}<br />
[[Category:SoC_Ideas_Your_Own_Ideas2014]]<br />
'<br />
<br />
==Description==<br />
<h4>Dugi - Campaign Wizard</h4><br />
I've seen on the forums that people frequently ask for campaign wizards and such and when they're told that there is no such thing, they struggle usually with the basics like writing a proper _main.cfg file. There is a project named Eclipse Java plugin, but it's not a part of wesnoth, only a few people know about it and it is basically just a text editor adapted to work with WML. This project is to make a campaign wizard, incorporated into the game, that would allow creating simpler campaigns in an intuitive way, without having to read or write source codes.<br />
<br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
This is what the main window of the campaign editor might look like (sorry for not caring much about the layout's appearance, but that's not the point):<br />
http://i.imgur.com/1Y6Og6S.png<br />
<br />
==IRC==<br />
Dugi<br />
<br />
==Questionnaire==<br />
1) Basics <br />
<br />
1.1) Write a small introduction to yourself. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.2) State your preferred email address. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.3) If you have chosen a nick for IRC and Wesnoth forums, what is it? <br />
A shortcut of my last name, used commonly by my real-life friends.<br />
<br />
1.4) Why do you want to participate in summer of code? <br />
To get beter in C++ and help developping a game.<br />
<br />
1.5) What are you studying, subject, level and school? <br />
I am studying plasma physics (4th year, master's) and mathematical informatics (1st year, undergraduate), these are two parallel major-only studies.<br />
<br />
1.6) What country are you from, at what time are you most likely to be able to join IRC? <br />
I am the most likely to join IRC during the day in Europe, maybe in the evening. Rather in the evening during lessons.<br />
<br />
1.7) Do you have other commitments for the summer period ? Do you plan to take any vacations ? If yes, when. <br />
I have no other comittments.<br />
<br />
<br />
2) Experience <br />
<br />
2.1) What programs/software have you worked on before? <br />
I have made an add-on campaign for Battle for Wesnoth. I was also making a 3D game using Ogre3D (but I accidentally lost all the files, and haven't written much in its remake because I didn't have enough time).<br />
<br />
2.2) Have you developed software in a team environment before? (As opposed to hacking on something on your own) <br />
Not in team.<br />
<br />
2.3) Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why? <br />
I haven't participated there yet.<br />
<br />
2.4) Are you already involved with any open source development projects? If yes, please describe the project and the scope of your involvement. <br />
Actually coding some other stuff for Battle for Wesnoth. I have done some user-made content before.<br />
<br />
2.5) Gaming experience - Are you a gamer? <br />
Yes.<br />
<br />
2.5.1) What type of gamer are you? <br />
Playing like twice a week, usually like 6 hours in a row.<br />
<br />
2.5.2) What type of games? <br />
Mostly RPGs.<br />
<br />
2.5.3) What type of opponents do you prefer? <br />
AI opponents, competitive player versus player doesn't attract me much.<br />
<br />
2.5.4) Are you more interested in story or gameplay? <br />
Rather gameplay, but I enjoy a good story, it can keep me playing even if the gameplay isn't as good.<br />
<br />
2.5.5) Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer. <br />
Yes, initially a lot (like 4 years ago), then I played less and I worked mostly on making my own campaign. I prefer single player.<br />
<br />
2.6) If you have contributed any patches to Wesnoth, please list them below. You can also list patches that have been submitted but not committed yet and patches that have not been specifically written for GSoC. If you have gained commit access to our repository (during the evaluation period or earlier) please state so. <br />
<br />
None, but currently working on one.<br />
<br />
<br />
3) Communication skills <br />
<br />
3.1) Though most of our developers are not native English speakers, English is the project's working language. Describe your fluency level in written English. <br />
I write in English language almost as fluently as in my native language.<br />
<br />
3.2) What spoken languages are you fluent in? <br />
Depends how fluent. I should be fluent enough in Slovak, Czech and English. Maybe French after some revision.<br />
<br />
<br />
3.3) Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough. <br />
I play multiplayer really rarely, not only because of ill-mannered players.<br />
<br />
3.4) Do you give constructive advice? <br />
I think yes.<br />
<br />
3.5) Do you receive advice well? <br />
Yes.<br />
<br />
3.6) Are you good at sorting useful criticisms from useless ones? <br />
I think yes.<br />
<br />
3.7) How autonomous are you when developing ? Would you rather discuss intensively changes and not start coding until you know what you want to do or would you rather code a proof of concept to "see how it turn out", taking the risk of having it thrown away if it doesn't match what the project want <br />
I prefer discussing things briefly and then doing them, deciding about all the details myself, petty problems can be corrected afterwards.<br />
<br />
<br />
4) Project <br />
<br />
4.1) Did you select a project from our list? If that is the case, what project did you select? What do you want to especially concentrate on? <br />
Yes, I liked the Campaign-making wizard project, so I picked it.<br />
<br />
4.2) If you have invented your own project, please describe the project and the scope. <br />
N/A<br />
<br />
4.3) Why did you choose this project? <br />
Because I consider myself a veteran at making campaigns.<br />
<br />
4.4) Include an estimated timeline for your work on the project. Don't forget to mention special things like "I booked holidays between A and B" and "I got an exam at ABC and won't be doing much then". <br />
I should have no exams during the summer (unless I fail some miserably, but three years of physics have taught me how to pass), and I don't know if I'll be on some holidays so early. But I can code also during holiday, last time I did.<br />
<br />
Steps:<br />
<br />
1. Creating a data structure similar to config, but allowing also some macro usage that is necessary for campaigns. It would add two extra member variables. One, a string, would be the define the tag would be wrapped in, because campaigns can't be written without this (and it's necessary to make something depend on difficulty). The other one, a vector of strings, would transform the tag into a macro, first member being the macro name (it is a macro of this one is present) and others being macro arguments.<br />
<br />
2. Adding a campaign wizard window somewhere (details like where would it be are to be discussed), making it create a folder for the campaign, its _main.cfg and server.pbl files and write some paths into the _main file (asking just for a few text fields like campaign name, description, etc.). There will be buttons to add scenarios and units, implemented in the next steps. It would be also able to load existing campaigns, but only if they are simple enough.<br />
<br />
3. Changing the map editor to enable it to create also SP scenarios (would be a new object created via inheritance or just the same with some extra ifs), placing units, saving coordinates and other things the new editor can do. It would also handle SideWML, offer more possibilities with units in the scenarios and contain an event editor to add some dialogues, create/recall units, and end the scenario (shown as lines, with an edit/add button that would edit the properties of each tag). Check boxes for scenario variables like disallow_recall or victory_when_enemies_defeated would be present as well.<br />
<br />
4. Expanding the possibilities of the ActionWML, filters. Adding moving units, giving gold, very basic variable usage. Filters would ask for some properties of the units, describing them as killer/victim instead of primary/secondary unit. This would need windows created through the C++ code without GUIWML, like the GUI in manager_ui.cpp.<br />
<br />
5. Adding a menu that allows creating new unit types. It would have text fields for basic stuff, facilities to assign images for baseframe and animations, abilities and maybe some advancements. Adding also facilities for unit modifications, enabling the more common changes like common abilities and weapon specials, changing damage, resistances and movement (for AMLA, but also as [object] tags in scenarios).<br />
<br />
6. Finishing the project, using it to create a campaign in order to find features that are annoying to use and bugs that might not have been spotted.<br />
<br />
4.5) Include as much technical detail about your implementation as you can <br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, recalling, changing gold, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
4.6) What do you expect to gain from this project? <br />
Experience and pleasure from helping others. I know this sounds pathetic...<br />
<br />
4.7) What would make you stay in the Wesnoth community after the conclusion of SOC? <br />
I am maintaining the add-on campaign I've made, and I'll have to maintain it for ages because of its high popularity.<br />
<br />
<br />
5) Practical considerations <br />
<br />
5.1) Are you familiar with any of the following tools or languages? <br />
Git (used for all commits) <br />
Familiar<br />
C++ (language used for all the normal source code) <br />
Familiar<br />
STL, Boost, Sdl (C++ libraries used by Wesnoth) <br />
No. I have used a few boost functions, though.<br />
Python (optional, mainly used for tools) <br />
No, but I know how to execute python scripts, for I have used these python tools.<br />
build environments (eg cmake/scons) <br />
Familiar with CMake, but I have used scons to build wesnoth once.<br />
WML (the wesnoth specific scenario language) <br />
Familiar<br />
Lua (used in combination with WML to create scenarios) <br />
Quite familiar<br />
<br />
5.2) Which tools do you normally use for development? Why do you use them? <br />
QtCreator as IDE for C++<br />
Gedit for other stuff<br />
<br />
5.3) What programming languages are you fluent in? <br />
C, C++<br />
<br />
5.4) Would you mind talking with your mentor on telephone / internet phone? We would like to have a backup way for communications for the case that somehow emails and IRC do fail. If you are willing to do so, please do list a phone number (including international code) so that we are able to contact you. You should probably *only* add this number in the application for you submit to google since the info in the wiki is available in public. We will *not* make any use of your number unless some case of "there is no way to contact you" does arise!<br />
<br />
Written on google-melange, the last thing I need is more spam phone calls.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Dugi%27s_Campaign_Wizard&diff=54345Dugi's Campaign Wizard2014-04-02T19:10:27Z<p>Dugi: /* Questionnaire */</p>
<hr />
<div>{{SoC2014Student}}<br />
[[Category:SoC_Ideas_Your_Own_Ideas2014]]<br />
'<br />
<br />
==Description==<br />
<h4>Dugi - Campaign Wizard</h4><br />
I've seen on the forums that people frequently ask for campaign wizards and such and when they're told that there is no such thing, they struggle usually with the basics like writing a proper _main.cfg file. There is a project named Eclipse Java plugin, but it's not a part of wesnoth, only a few people know about it and it is basically just a text editor adapted to work with WML. This project is to make a campaign wizard, incorporated into the game, that would allow creating simpler campaigns in an intuitive way, without having to read or write source codes.<br />
<br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
==IRC==<br />
Dugi<br />
<br />
==Questionnaire==<br />
1) Basics <br />
<br />
1.1) Write a small introduction to yourself. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.2) State your preferred email address. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.3) If you have chosen a nick for IRC and Wesnoth forums, what is it? <br />
A shortcut of my last name, used commonly by my real-life friends.<br />
<br />
1.4) Why do you want to participate in summer of code? <br />
To get beter in C++ and help developping a game.<br />
<br />
1.5) What are you studying, subject, level and school? <br />
I am studying plasma physics (4th year, master's) and mathematical informatics (1st year, undergraduate), these are two parallel major-only studies.<br />
<br />
1.6) What country are you from, at what time are you most likely to be able to join IRC? <br />
I am the most likely to join IRC during the day in Europe, maybe in the evening. Rather in the evening during lessons.<br />
<br />
1.7) Do you have other commitments for the summer period ? Do you plan to take any vacations ? If yes, when. <br />
I have no other comittments.<br />
<br />
<br />
2) Experience <br />
<br />
2.1) What programs/software have you worked on before? <br />
I have made an add-on campaign for Battle for Wesnoth. I was also making a 3D game using Ogre3D (but I accidentally lost all the files, and haven't written much in its remake because I didn't have enough time).<br />
<br />
2.2) Have you developed software in a team environment before? (As opposed to hacking on something on your own) <br />
Not in team.<br />
<br />
2.3) Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why? <br />
I haven't participated there yet.<br />
<br />
2.4) Are you already involved with any open source development projects? If yes, please describe the project and the scope of your involvement. <br />
Actually coding some other stuff for Battle for Wesnoth. I have done some user-made content before.<br />
<br />
2.5) Gaming experience - Are you a gamer? <br />
Yes.<br />
<br />
2.5.1) What type of gamer are you? <br />
Playing like twice a week, usually like 6 hours in a row.<br />
<br />
2.5.2) What type of games? <br />
Mostly RPGs.<br />
<br />
2.5.3) What type of opponents do you prefer? <br />
AI opponents, competitive player versus player doesn't attract me much.<br />
<br />
2.5.4) Are you more interested in story or gameplay? <br />
Rather gameplay, but I enjoy a good story, it can keep me playing even if the gameplay isn't as good.<br />
<br />
2.5.5) Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer. <br />
Yes, initially a lot (like 4 years ago), then I played less and I worked mostly on making my own campaign. I prefer single player.<br />
<br />
2.6) If you have contributed any patches to Wesnoth, please list them below. You can also list patches that have been submitted but not committed yet and patches that have not been specifically written for GSoC. If you have gained commit access to our repository (during the evaluation period or earlier) please state so. <br />
<br />
None, but currently working on one.<br />
<br />
<br />
3) Communication skills <br />
<br />
3.1) Though most of our developers are not native English speakers, English is the project's working language. Describe your fluency level in written English. <br />
I write in English language almost as fluently as in my native language.<br />
<br />
3.2) What spoken languages are you fluent in? <br />
Depends how fluent. I should be fluent enough in Slovak, Czech and English. Maybe French after some revision.<br />
<br />
<br />
3.3) Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough. <br />
I play multiplayer really rarely, not only because of ill-mannered players.<br />
<br />
3.4) Do you give constructive advice? <br />
I think yes.<br />
<br />
3.5) Do you receive advice well? <br />
Yes.<br />
<br />
3.6) Are you good at sorting useful criticisms from useless ones? <br />
I think yes.<br />
<br />
3.7) How autonomous are you when developing ? Would you rather discuss intensively changes and not start coding until you know what you want to do or would you rather code a proof of concept to "see how it turn out", taking the risk of having it thrown away if it doesn't match what the project want <br />
I prefer discussing things briefly and then doing them, deciding about all the details myself, petty problems can be corrected afterwards.<br />
<br />
<br />
4) Project <br />
<br />
4.1) Did you select a project from our list? If that is the case, what project did you select? What do you want to especially concentrate on? <br />
Yes, I liked the Campaign-making wizard project, so I picked it.<br />
<br />
4.2) If you have invented your own project, please describe the project and the scope. <br />
N/A<br />
<br />
4.3) Why did you choose this project? <br />
Because I consider myself a veteran at making campaigns.<br />
<br />
4.4) Include an estimated timeline for your work on the project. Don't forget to mention special things like "I booked holidays between A and B" and "I got an exam at ABC and won't be doing much then". <br />
I should have no exams during the summer (unless I fail some miserably, but three years of physics have taught me how to pass), and I don't know if I'll be on some holidays so early. But I can code also during holiday, last time I did.<br />
<br />
Steps:<br />
<br />
1. Creating a data structure similar to config, but allowing also some macro usage that is necessary for campaigns. It would add two extra member variables. One, a string, would be the define the tag would be wrapped in, because campaigns can't be written without this (and it's necessary to make something depend on difficulty). The other one, a vector of strings, would transform the tag into a macro, first member being the macro name (it is a macro of this one is present) and others being macro arguments.<br />
<br />
2. Adding a campaign wizard window somewhere (details like where would it be are to be discussed), making it create a folder for the campaign, its _main.cfg and server.pbl files and write some paths into the _main file (asking just for a few text fields like campaign name, description, etc.). There will be buttons to add scenarios and units, implemented in the next steps. It would be also able to load existing campaigns, but only if they are simple enough.<br />
<br />
3. Changing the map editor to enable it to create also SP scenarios (would be a new object created via inheritance or just the same with some extra ifs), placing units, saving coordinates and other things the new editor can do. It would also handle SideWML, offer more possibilities with units in the scenarios and contain an event editor to add some dialogues, create/recall units, and end the scenario (shown as lines, with an edit/add button that would edit the properties of each tag). Check boxes for scenario variables like disallow_recall or victory_when_enemies_defeated would be present as well.<br />
<br />
4. Expanding the possibilities of the ActionWML, filters. Adding moving units, giving gold, very basic variable usage. Filters would ask for some properties of the units, describing them as killer/victim instead of primary/secondary unit. This would need windows created through the C++ code without GUIWML, like the GUI in manager_ui.cpp.<br />
<br />
5. Adding a menu that allows creating new unit types. It would have text fields for basic stuff, facilities to assign images for baseframe and animations, abilities and maybe some advancements. Adding also facilities for unit modifications, enabling the more common changes like common abilities and weapon specials, changing damage, resistances and movement (for AMLA, but also as [object] tags in scenarios).<br />
<br />
6. Finishing the project, using it to create a campaign in order to find features that are annoying to use and bugs that might not have been spotted.<br />
<br />
4.5) Include as much technical detail about your implementation as you can <br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, recalling, changing gold, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
4.6) What do you expect to gain from this project? <br />
Experience and pleasure from helping others. I know this sounds pathetic...<br />
<br />
4.7) What would make you stay in the Wesnoth community after the conclusion of SOC? <br />
I am maintaining the add-on campaign I've made, and I'll have to maintain it for ages because of its high popularity.<br />
<br />
<br />
5) Practical considerations <br />
<br />
5.1) Are you familiar with any of the following tools or languages? <br />
Git (used for all commits) <br />
Familiar<br />
C++ (language used for all the normal source code) <br />
Familiar<br />
STL, Boost, Sdl (C++ libraries used by Wesnoth) <br />
No. I have used a few boost functions, though.<br />
Python (optional, mainly used for tools) <br />
No, but I know how to execute python scripts, for I have used these python tools.<br />
build environments (eg cmake/scons) <br />
Familiar with CMake, but I have used scons to build wesnoth once.<br />
WML (the wesnoth specific scenario language) <br />
Familiar<br />
Lua (used in combination with WML to create scenarios) <br />
Quite familiar<br />
<br />
5.2) Which tools do you normally use for development? Why do you use them? <br />
QtCreator as IDE for C++<br />
Gedit for other stuff<br />
<br />
5.3) What programming languages are you fluent in? <br />
C, C++<br />
<br />
5.4) Would you mind talking with your mentor on telephone / internet phone? We would like to have a backup way for communications for the case that somehow emails and IRC do fail. If you are willing to do so, please do list a phone number (including international code) so that we are able to contact you. You should probably *only* add this number in the application for you submit to google since the info in the wiki is available in public. We will *not* make any use of your number unless some case of "there is no way to contact you" does arise!<br />
<br />
Written on google-melange, the last thing I need is more spam phone calls.</div>Dugihttps://wiki.wesnoth.org/index.php?title=FancyAddonIcons&diff=54314FancyAddonIcons2014-03-31T16:44:36Z<p>Dugi: Removed a warning about an issue related to an outdated version of the add-on related to this</p>
<hr />
<div>An add-on's icon is the first thing a player is going to look at when picking add-ons. A good add-on icon can attract many players, so it should not be neglected. However, custom images cannot be used, they will be seen only by people who have it installed, that usually means that the author will think it's correct, although it is not. Despite this limitation, there is a way to create quite cool add-on icons. It is called [[ImagePathFunctionWML]].<br />
<br />
<br />
== Introduction ==<br />
Of course, you can create a code like (careful, it is long!):<br />
items/bonestack.png~BLIT(items/bonestack.png~CROP(20,0,52,52),0,20)~BLIT(items/bonestack.png~CROP(0,0,52,52),20,20)~BLIT(items/burial.png~CROP(20,0,52,72),0,0)~BLIT(items/burial.png~CROP(0,0,52,62),20,10)~BLIT(units/undead-skeletal/archer-die2-6.png~CROP(10,0,62,62)~RC(magenta>black),0,10)~BLIT(units/orcs/sovereign-lead-2.png~RC(magenta>black))~BLIT(items/burial.png~CROP(0,0,62,52),10,20)<br />
<br />
But testing this will be very tedious and annoying, reloading the entire add-on to view it somewhere, or even uploading it to test it every time. To make this easier, download an add-on named ''Image loading tester'', it will help you a lot with this. The add-on is absolutely minimalistic, and has no obvious effect anywhere. To use it, either execute this WML chunk:<br />
[lua]<br />
code=<<wesnoth.image_test()>><br />
[/lua]<br />
<br />
Or activate the debug mode (:debug in [[CommandMode]]), and use this command:<br />
lua wesnoth.image_test()<br />
The second option is probably more convenient.<br />
<br />
A window will show up, there will be a text box and two buttons. Type your image code into the text box and click on the Show button (or hit Enter instead). This way, you will be able to verify it very quickly. It is recommended to do this while running wesnoth from command prompt (on Windows) or Terminal (on Linux), it will notice you about some errors in your code (on Windows, you can also read stderr.txt afterwards).<br />
<br />
Because the code on a single line possibly with many nested brackets is almost unreadable for humans, it is recommended to write it in a text file with indentation and new lines, then to use Find&Replace to remove all tabs, spaces and new lines and paste it into the text box. I will use indented codes later, for better readability, and it will be necessary to remove all spaces and new lines from it or copying the version when it is already removed bellow it if you want to try it out.<br />
<br />
To understand better the numeric values that look like just made up to fit, you might want to learn the coordinates needed in an image editor like GIMP.<br />
<br />
It is also recommended to use wesnoth 1.12 or later wesnoth 1.11, 1.10 tends to randomly crash when copying stuff from the textbox and that annoys a lot, even if it happens only sometimes. I have written the examples to work with these versions.<br />
<br />
Now, you can verify your codes easily, and you can progress to the next step.<br />
<br />
== Step by step tutorial ==<br />
Let us think about creating an add-on image for a campaign where elves attack undead. It would consist of an Elvish Hero chopping undead to pieces, supported by spells of an Elvish Sorceress behind him. We will create an image for it in several steps. Try out each one of them to see what is changed.<br />
<br />
'''1.''' Image showing an Elvish Hero in an attacking position is units/elves-wood/hero-melee-3.png. So we start with it:<br />
units/elves-wood/hero-melee-3.png<br />
<br />
'''2.''' Nothing interesting so far. Let us add a skeleton he is slashing. The image units/undead-skeletal/skeleton/skeleton-se-melee3.png is in a good fighting position, also exposing his belly to our hero. We will use the ~BLIT function of [[ImagePathFunctionWML]] to add him to the picture. Now we have:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png<br />
)<br />
Note that the new lines and indentation are added only for readability, it will not work in game, you'll have to remove all new lines and breaks. Here it is without indents:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png)<br />
<br />
'''3.''' However, they are quite in an awkward position. We will need to add some offset to the skeleton. ~BLIT accepts two additional arguments that mean the offset of the image. However, it would not fit on the image then (this prints an error message into the command line, Termina or stderr.txt), so we need to crop it. The ~CROP function accepts four arguments, the first two are the coordinates where the selected part of the image should start (pixels to the right first, pixels down second), the second two is the desired size of the result (width and height respectively). In this case, we start cropping on the top left corner, therefore the first two coordinates will be 0 and 0. The offset will be 20,20 (pixels to left first, pixels down second), so we need the resolution of the image to be 52x52 (original is 72x72, we subtract 20 from both numbers). The four arguments of crop will be therefore 0,0,52,52, and the two additional arguments of ~BLIT will be 20,20. Together, it should look like this:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52)<br />
,20,20)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52),20,20)<br />
<br />
'''4.''' Now, the skeleton needs to be headed differently, because he isn't attacking the hero. The ~FLIP function is designed for this. Use ~FLIP(horizontal) for this. We will also need to adjust the offset in CROP and BLIT, because it would look bad:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal)<br />
,40,20)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal),40,20)<br />
<br />
'''5.''' However, we want the skeleton to be chopped in half by the Hero's sword. We can do this by placing two conveniently cropped images of skeleton one above another.<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)<br />
,40,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)<br />
,40,47)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal),40,47)<br />
<br />
'''6.''' We want our heroes to be also teamcoloured, so we can change the default colour (magenta) to some other colour. The colours you can change it to can be found in the data/core/team_colors.cfg file. The colours are changed using the ~RC function. Because our heroes are good and the undead are bad, let's team-colour the undead black and the heroes white.<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta>black)<br />
,40,47)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta>black),40,47)<br />
<br />
'''7.''' Now, we want to add the Sorceress casting a spell to the background. She should be behind the Elvish Hero, and she should have an offset, but that can be done by cropping. To make sure that she won't be hid behind the Hero too badly, the hero and the skeleton will have to be offset too. Because we need an image of dimensions 72x72 as background, and a cropped Sorceress does not have such dimensions, we will have to use misc/blank-hex.png as background (it is a blank image) and place the sorceress on it. The offsets were adjusted to make it look better.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(15,10,57,62),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''8.''' Now, we need to add some halo to her, she is casting a spell, no? A suitable halo can be halo/elven/faerie-fire-halo4.png, let's use it. Its resolution is 96x96, that is quite awkward because it is larger than our image, but we can crop it easily.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''9.''' Now, to add the homing missile of the spell. halo/elven/ice-halo3.png looks convenient. Placing it on the image together with a skeleton that would be the victim of this spell is analogical to things done previously.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)<br />
,30,0)<br />
~BLIT(<br />
halo/elven/ice-halo3.png~CROP(0,20,62,52)<br />
,10,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black),30,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''10.''' We might colourise the skeleton blue, to make him appear frozen. There are two functions for this, ~CS and ~GS. ~GS removes all colour, transforming all colours into shades of gray. ~CS is used to change the colour, it accepts three arguments, the change to the red colour, the change to the green colour and the change to the blue colour. Negative numbers (from -1 to -255) mean removing the colour from all pixels (respecting transparency), so ~CS(0,-255,-255) will remove all colours except red, so that only the red part of the light will remain. Positive numbers (from 1 to 255) will add the colour to all pixels (unless invisible), so ~CS(255,0,0) will set the red fraction of the colour to maximum. ~CS(255,-255,-255) will remove all colours but red, and add a maximum of red everywhere, creating a single-colour image. To create the effect of frozen, we first use ~GS and then we use ~CS to make it bluer.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)~GS()~CS(50,50,150)<br />
,30,0)<br />
~BLIT(<br />
halo/elven/ice-halo3.png~CROP(0,20,62,52)<br />
,10,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)~GS()~CS(50,50,150),30,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
Now, we are done with this image.<br />
<br />
== More examples ==<br />
Here are more examples of stuff you can do using these methods. They don't contain precise information how it is done, but it should be clear if you have read the tutorial.<br />
<br />
=== The Spellsword ===<br />
The purpose of this example is to show the usage of the opacity ~O function. When called on magical halo, it can be used to make the halo partially before and partially behind the unit (place the image there twice with 50% opacity, once under him, once above him). It can be also used to create motion blur.<br />
<br />
halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)<br />
~BLIT(<br />
units/elves-wood/high-lord-attack-sword-2.png~CROP(6,6,66,66)~O(25%)~RC(magenta>blue)<br />
)<br />
~BLIT(<br />
units/elves-wood/high-lord-attack-sword-2.png~CROP(3,3,69,69)~O(50%)~RC(magenta>blue)<br />
)<br />
~BLIT(<br />
units/elves-wood/high-lord-attack-sword-2.png~RC(magenta>blue)<br />
)<br />
~BLIT(<br />
halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)<br />
)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo3.png~CROP(0,5,57,72)<br />
,15,0)<br />
Without indentation:<br />
halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)~BLIT(units/elves-wood/high-lord-attack-sword-2.png~CROP(6,6,66,66)~O(25%)~RC(magenta>blue))~BLIT(units/elves-wood/high-lord-attack-sword-2.png~CROP(3,3,69,69)~O(50%)~RC(magenta>blue))~BLIT(units/elves-wood/high-lord-attack-sword-2.png~RC(magenta>blue))~BLIT(halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%))~BLIT(halo/elven/faerie-fire-halo3.png~CROP(0,5,57,72),15,0)<br />
<br />
=== Zorro ===<br />
The purpose of this example is to show that some body parts can be taken from the original body (provided that they can be selected easily), modified and placed back. Or placed on to different place. Or to a completely different sprite.<br />
<br />
units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)<br />
~BLIT(<br />
units/human-loyalists/master-at-arms-crossbow-2.png~CROP(2,27,18,14)~FL(horiz)<br />
,48,27)<br />
~BLIT(<br />
units/human-outlaws/assassin-throwknife1.png~CROP(29,17,11,13)~RC(magenta>black)<br />
,26,21)<br />
~BLIT(<br />
halo/misc/leadership-flare-7.png~CROP(0,5,46,67)<br />
,26,0)<br />
~BLIT(<br />
halo/misc/leadership-flare-6.png~CROP(33,7,39,65)<br />
,0,0)<br />
~BLIT(<br />
units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)~CROP(20,11,20,17)~CS(-100,-100,-100)<br />
,20,11)<br />
Without indentation:<br />
units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)~BLIT(units/human-loyalists/master-at-arms-crossbow-2.png~CROP(2,27,18,14)~FL(horiz),48,27)~BLIT(units/human-outlaws/assassin-throwknife1.png~CROP(29,17,11,13)~RC(magenta>black),26,21)~BLIT(halo/misc/leadership-flare-7.png~CROP(0,5,46,67),26,0)~BLIT(halo/misc/leadership-flare-6.png~CROP(33,7,39,65),0,0)~BLIT(units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)~CROP(20,11,20,17)~CS(-100,-100,-100),20,11)<br />
<br />
=== Lich Wars ===<br />
The purpose of this is to show how can text be used in the graphics. It mostly revolves around the misc/font8x8.png file (it is not in core, but in another images folder belonging to the game, next to the data folder that contains the core folder; using it causes no trouble).<br />
<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/undead-skeletal/deathblade-dying-2.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62)~O(50%)<br />
,10,10)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-dying-1.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62)<br />
,10,10)<br />
~BLIT(<br />
units/undead-necromancers/ancient-lich-melee.png~RC(magenta>red)~CROP(20,10,52,62)<br />
)<br />
~BLIT(<br />
halo/undead/black-magic-3.png~FL(vert)~CROP(15,40,72,60)~O(70%)<br />
)<br />
~BLIT(<br />
misc/blank-hex.png<br />
~BLIT(<br />
misc/font8x8.png~CROP(39,33,8,8)<br />
,16,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(16,32,8,8)<br />
,24,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(47,24,8,8)<br />
,32,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(8,33,8,8)<br />
,40,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(48,41,8,8)<br />
,16,64)<br />
~BLIT(<br />
misc/font8x8.png~CROP(32,25,8,8)<br />
,24,64)<br />
~BLIT(<br />
misc/font8x8.png~CROP(8,40,8,8)<br />
,32,64)<br />
~BLIT(<br />
misc/font8x8.png~CROP(16,41,8,8)<br />
,40,64)<br />
~CS(-255,0,-255)<br />
)<br />
Without indentation:<br />
misc/blank-hex.png~BLIT(units/undead-skeletal/deathblade-dying-2.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62)~O(50%),10,10)~BLIT(units/undead-skeletal/deathblade-dying-1.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62),10,10)~BLIT(units/undead-necromancers/ancient-lich-melee.png~RC(magenta>red)~CROP(20,10,52,62))~BLIT(halo/undead/black-magic-3.png~FL(vert)~CROP(15,40,72,60)~O(70%))~BLIT(misc/blank-hex.png~BLIT(misc/font8x8.png~CROP(39,33,8,8),16,56)~BLIT(misc/font8x8.png~CROP(16,32,8,8),24,56)~BLIT(misc/font8x8.png~CROP(47,24,8,8),32,56)~BLIT(misc/font8x8.png~CROP(8,33,8,8),40,56)~BLIT(misc/font8x8.png~CROP(48,41,8,8),16,64)~BLIT(misc/font8x8.png~CROP(32,25,8,8),24,64)~BLIT(misc/font8x8.png~CROP(8,40,8,8),32,64)~BLIT(misc/font8x8.png~CROP(16,41,8,8),40,64)~CS(-255,0,-255))</div>Dugihttps://wiki.wesnoth.org/index.php?title=Dugi%27s_Campaign_Wizard&diff=54299Dugi's Campaign Wizard2014-03-30T19:47:08Z<p>Dugi: Formatting problem</p>
<hr />
<div>{{SoC2014Student}}<br />
[[Category:SoC_Ideas_Your_Own_Ideas2014]]<br />
'<br />
<br />
==Description==<br />
<h4>Dugi - Campaign Wizard</h4><br />
I've seen on the forums that people frequently ask for campaign wizards and such and when they're told that there is no such thing, they struggle usually with the basics like writing a proper _main.cfg file. There is a project named Eclipse Java plugin, but it's not a part of wesnoth, only a few people know about it and it is basically just a text editor adapted to work with WML. This project is to make a campaign wizard, incorporated into the game, that would allow creating simpler campaigns in an intuitive way, without having to read or write source codes.<br />
<br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
==IRC==<br />
Dugi<br />
<br />
==Questionnaire==<br />
1) Basics <br />
<br />
1.1) Write a small introduction to yourself. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.2) State your preferred email address. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.3) If you have chosen a nick for IRC and Wesnoth forums, what is it? <br />
A shortcut of my last name, used commonly by my real-life friends.<br />
<br />
1.4) Why do you want to participate in summer of code? <br />
To get beter in C++ and help developping a game.<br />
<br />
1.5) What are you studying, subject, level and school? <br />
I am studying plasma physics (4th year, master's) and mathematical informatics (1st year, undergraduate), these are two parallel major-only studies.<br />
<br />
1.6) What country are you from, at what time are you most likely to be able to join IRC? <br />
I am the most likely to join IRC during the day in Europe, maybe in the evening. Rather in the evening during lessons.<br />
<br />
1.7) Do you have other commitments for the summer period ? Do you plan to take any vacations ? If yes, when. <br />
I have no other comittments.<br />
<br />
<br />
2) Experience <br />
<br />
2.1) What programs/software have you worked on before? <br />
I have made an add-on campaign for Battle for Wesnoth. I was also making a 3D game using Ogre3D (but I accidentally lost all the files, and haven't written much in its remake because I didn't have enough time).<br />
<br />
2.2) Have you developed software in a team environment before? (As opposed to hacking on something on your own) <br />
Not in team.<br />
<br />
2.3) Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why? <br />
I haven't participated there yet.<br />
<br />
2.4) Are you already involved with any open source development projects? If yes, please describe the project and the scope of your involvement. <br />
Actually coding some other stuff for Battle for Wesnoth. I have done some user-made content before.<br />
<br />
2.5) Gaming experience - Are you a gamer? <br />
Yes.<br />
<br />
2.5.1) What type of gamer are you? <br />
Playing like twice a week, usually like 6 hours in a row.<br />
<br />
2.5.2) What type of games? <br />
Mostly RPGs.<br />
<br />
2.5.3) What type of opponents do you prefer? <br />
AI opponents, competitive player versus player doesn't attract me much.<br />
<br />
2.5.4) Are you more interested in story or gameplay? <br />
Rather gameplay, but I enjoy a good story, it can keep me playing even if the gameplay isn't as good.<br />
<br />
2.5.5) Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer. <br />
Yes, initially a lot (like 4 years ago), then I played less and I worked mostly on making my own campaign. I prefer single player.<br />
<br />
2.6) If you have contributed any patches to Wesnoth, please list them below. You can also list patches that have been submitted but not committed yet and patches that have not been specifically written for GSoC. If you have gained commit access to our repository (during the evaluation period or earlier) please state so. <br />
<br />
None, but currently working on one.<br />
<br />
<br />
3) Communication skills <br />
<br />
3.1) Though most of our developers are not native English speakers, English is the project's working language. Describe your fluency level in written English. <br />
I write in English language almost as fluently as in my native language.<br />
<br />
3.2) What spoken languages are you fluent in? <br />
Depends how fluent. I should be fluent enough in Slovak, Czech and English. Maybe French after some revision.<br />
<br />
<br />
3.3) Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough. <br />
I play multiplayer really rarely, not only because of ill-mannered players.<br />
<br />
3.4) Do you give constructive advice? <br />
I think yes.<br />
<br />
3.5) Do you receive advice well? <br />
Yes.<br />
<br />
3.6) Are you good at sorting useful criticisms from useless ones? <br />
I think yes.<br />
<br />
3.7) How autonomous are you when developing ? Would you rather discuss intensively changes and not start coding until you know what you want to do or would you rather code a proof of concept to "see how it turn out", taking the risk of having it thrown away if it doesn't match what the project want <br />
I prefer discussing things briefly and then doing them, deciding about all the details myself, petty problems can be corrected afterwards.<br />
<br />
<br />
4) Project <br />
<br />
4.1) Did you select a project from our list? If that is the case, what project did you select? What do you want to especially concentrate on? <br />
Yes, I liked the Campaign-making wizard project, so I picked it.<br />
<br />
4.2) If you have invented your own project, please describe the project and the scope. <br />
N/A<br />
<br />
4.3) Why did you choose this project? <br />
Because I consider myself a veteran at making campaigns.<br />
<br />
4.4) Include an estimated timeline for your work on the project. Don't forget to mention special things like "I booked holidays between A and B" and "I got an exam at ABC and won't be doing much then". <br />
I should have no exams during the summer (unless I fail some miserably, but three years of physics have taught me how to pass), and I don't know if I'll be on some holidays so early. But I can code also during holiday, last time I did.<br />
<br />
Steps:<br />
<br />
1. Creating a data structure similar to config, but allowing also some macro usage that is necessary for campaigns.<br />
<br />
2. Adding a campaign wizard window somewhere (details like where would it be are to be discussed), making it create a folder for the campaign, its _main.cfg and server.pbl files and write some paths into the _main file.<br />
<br />
3. Changing the map editor to enable it to create also SP scenarios (would be a new object created via inheritance or just the same with some extra ifs), singleplayer mode would allow also adding events with some ActionWML<br />
<br />
4. Expanding the possibilities of the ActionWML<br />
<br />
5. Adding a menu that allows creating new unit types<br />
<br />
6. Finishing the project<br />
<br />
4.5) Include as much technical detail about your implementation as you can <br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, recalling, changing gold, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
4.6) What do you expect to gain from this project? <br />
Experience and pleasure from helping others. I know this sounds pathetic...<br />
<br />
4.7) What would make you stay in the Wesnoth community after the conclusion of SOC? <br />
I am maintaining the add-on campaign I've made, and I'll have to maintain it for ages because of its high popularity.<br />
<br />
<br />
5) Practical considerations <br />
<br />
5.1) Are you familiar with any of the following tools or languages? <br />
Git (used for all commits) <br />
Familiar<br />
C++ (language used for all the normal source code) <br />
Familiar<br />
STL, Boost, Sdl (C++ libraries used by Wesnoth) <br />
No. I have used a few boost functions, though.<br />
Python (optional, mainly used for tools) <br />
No, but I know how to execute python scripts, for I have used these python tools.<br />
build environments (eg cmake/scons) <br />
Familiar with CMake, but I have used scons to build wesnoth once.<br />
WML (the wesnoth specific scenario language) <br />
Familiar<br />
Lua (used in combination with WML to create scenarios) <br />
Quite familiar<br />
<br />
5.2) Which tools do you normally use for development? Why do you use them? <br />
QtCreator as IDE for C++<br />
Gedit for other stuff<br />
<br />
5.3) What programming languages are you fluent in? <br />
C, C++<br />
<br />
5.4) Would you mind talking with your mentor on telephone / internet phone? We would like to have a backup way for communications for the case that somehow emails and IRC do fail. If you are willing to do so, please do list a phone number (including international code) so that we are able to contact you. You should probably *only* add this number in the application for you submit to google since the info in the wiki is available in public. We will *not* make any use of your number unless some case of "there is no way to contact you" does arise!<br />
<br />
Written on google-melange, the last thing I need is more spam phone calls.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Dugi%27s_Campaign_Wizard&diff=54298Dugi's Campaign Wizard2014-03-30T19:46:27Z<p>Dugi: Added a timeline</p>
<hr />
<div>{{SoC2014Student}}<br />
[[Category:SoC_Ideas_Your_Own_Ideas2014]]<br />
'<br />
<br />
==Description==<br />
<h4>Dugi - Campaign Wizard</h4><br />
I've seen on the forums that people frequently ask for campaign wizards and such and when they're told that there is no such thing, they struggle usually with the basics like writing a proper _main.cfg file. There is a project named Eclipse Java plugin, but it's not a part of wesnoth, only a few people know about it and it is basically just a text editor adapted to work with WML. This project is to make a campaign wizard, incorporated into the game, that would allow creating simpler campaigns in an intuitive way, without having to read or write source codes.<br />
<br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
==IRC==<br />
Dugi<br />
<br />
==Questionnaire==<br />
1) Basics <br />
<br />
1.1) Write a small introduction to yourself. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.2) State your preferred email address. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.3) If you have chosen a nick for IRC and Wesnoth forums, what is it? <br />
A shortcut of my last name, used commonly by my real-life friends.<br />
<br />
1.4) Why do you want to participate in summer of code? <br />
To get beter in C++ and help developping a game.<br />
<br />
1.5) What are you studying, subject, level and school? <br />
I am studying plasma physics (4th year, master's) and mathematical informatics (1st year, undergraduate), these are two parallel major-only studies.<br />
<br />
1.6) What country are you from, at what time are you most likely to be able to join IRC? <br />
I am the most likely to join IRC during the day in Europe, maybe in the evening. Rather in the evening during lessons.<br />
<br />
1.7) Do you have other commitments for the summer period ? Do you plan to take any vacations ? If yes, when. <br />
I have no other comittments.<br />
<br />
<br />
2) Experience <br />
<br />
2.1) What programs/software have you worked on before? <br />
I have made an add-on campaign for Battle for Wesnoth. I was also making a 3D game using Ogre3D (but I accidentally lost all the files, and haven't written much in its remake because I didn't have enough time).<br />
<br />
2.2) Have you developed software in a team environment before? (As opposed to hacking on something on your own) <br />
Not in team.<br />
<br />
2.3) Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why? <br />
I haven't participated there yet.<br />
<br />
2.4) Are you already involved with any open source development projects? If yes, please describe the project and the scope of your involvement. <br />
Actually coding some other stuff for Battle for Wesnoth. I have done some user-made content before.<br />
<br />
2.5) Gaming experience - Are you a gamer? <br />
Yes.<br />
<br />
2.5.1) What type of gamer are you? <br />
Playing like twice a week, usually like 6 hours in a row.<br />
<br />
2.5.2) What type of games? <br />
Mostly RPGs.<br />
<br />
2.5.3) What type of opponents do you prefer? <br />
AI opponents, competitive player versus player doesn't attract me much.<br />
<br />
2.5.4) Are you more interested in story or gameplay? <br />
Rather gameplay, but I enjoy a good story, it can keep me playing even if the gameplay isn't as good.<br />
<br />
2.5.5) Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer. <br />
Yes, initially a lot (like 4 years ago), then I played less and I worked mostly on making my own campaign. I prefer single player.<br />
<br />
2.6) If you have contributed any patches to Wesnoth, please list them below. You can also list patches that have been submitted but not committed yet and patches that have not been specifically written for GSoC. If you have gained commit access to our repository (during the evaluation period or earlier) please state so. <br />
<br />
None, but currently working on one.<br />
<br />
<br />
3) Communication skills <br />
<br />
3.1) Though most of our developers are not native English speakers, English is the project's working language. Describe your fluency level in written English. <br />
I write in English language almost as fluently as in my native language.<br />
<br />
3.2) What spoken languages are you fluent in? <br />
Depends how fluent. I should be fluent enough in Slovak, Czech and English. Maybe French after some revision.<br />
<br />
<br />
3.3) Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough. <br />
I play multiplayer really rarely, not only because of ill-mannered players.<br />
<br />
3.4) Do you give constructive advice? <br />
I think yes.<br />
<br />
3.5) Do you receive advice well? <br />
Yes.<br />
<br />
3.6) Are you good at sorting useful criticisms from useless ones? <br />
I think yes.<br />
<br />
3.7) How autonomous are you when developing ? Would you rather discuss intensively changes and not start coding until you know what you want to do or would you rather code a proof of concept to "see how it turn out", taking the risk of having it thrown away if it doesn't match what the project want <br />
I prefer discussing things briefly and then doing them, deciding about all the details myself, petty problems can be corrected afterwards.<br />
<br />
<br />
4) Project <br />
<br />
4.1) Did you select a project from our list? If that is the case, what project did you select? What do you want to especially concentrate on? <br />
Yes, I liked the Campaign-making wizard project, so I picked it.<br />
<br />
4.2) If you have invented your own project, please describe the project and the scope. <br />
N/A<br />
<br />
4.3) Why did you choose this project? <br />
Because I consider myself a veteran at making campaigns.<br />
<br />
4.4) Include an estimated timeline for your work on the project. Don't forget to mention special things like "I booked holidays between A and B" and "I got an exam at ABC and won't be doing much then". <br />
I should have no exams during the summer (unless I fail some miserably, but three years of physics have taught me how to pass), and I don't know if I'll be on some holidays so early. But I can code also during holiday, last time I did.<br />
<br />
Steps:<br />
1. Creating a data structure similar to config, but allowing also some macro usage that is necessary for campaigns.<br />
2. Adding a campaign wizard window somewhere (details like where would it be are to be discussed), making it create a folder for the campaign, its _main.cfg and server.pbl files and write some paths into the _main file.<br />
3. Changing the map editor to enable it to create also SP scenarios (would be a new object created via inheritance or just the same with some extra ifs), singleplayer mode would allow also adding events with some ActionWML<br />
4. Expanding the possibilities of the ActionWML<br />
5. Adding a menu that allows creating new unit types<br />
6. Finishing the project<br />
<br />
4.5) Include as much technical detail about your implementation as you can <br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, recalling, changing gold, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
4.6) What do you expect to gain from this project? <br />
Experience and pleasure from helping others. I know this sounds pathetic...<br />
<br />
4.7) What would make you stay in the Wesnoth community after the conclusion of SOC? <br />
I am maintaining the add-on campaign I've made, and I'll have to maintain it for ages because of its high popularity.<br />
<br />
<br />
5) Practical considerations <br />
<br />
5.1) Are you familiar with any of the following tools or languages? <br />
Git (used for all commits) <br />
Familiar<br />
C++ (language used for all the normal source code) <br />
Familiar<br />
STL, Boost, Sdl (C++ libraries used by Wesnoth) <br />
No. I have used a few boost functions, though.<br />
Python (optional, mainly used for tools) <br />
No, but I know how to execute python scripts, for I have used these python tools.<br />
build environments (eg cmake/scons) <br />
Familiar with CMake, but I have used scons to build wesnoth once.<br />
WML (the wesnoth specific scenario language) <br />
Familiar<br />
Lua (used in combination with WML to create scenarios) <br />
Quite familiar<br />
<br />
5.2) Which tools do you normally use for development? Why do you use them? <br />
QtCreator as IDE for C++<br />
Gedit for other stuff<br />
<br />
5.3) What programming languages are you fluent in? <br />
C, C++<br />
<br />
5.4) Would you mind talking with your mentor on telephone / internet phone? We would like to have a backup way for communications for the case that somehow emails and IRC do fail. If you are willing to do so, please do list a phone number (including international code) so that we are able to contact you. You should probably *only* add this number in the application for you submit to google since the info in the wiki is available in public. We will *not* make any use of your number unless some case of "there is no way to contact you" does arise!<br />
<br />
Written on google-melange, the last thing I need is more spam phone calls.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Dugi%27s_Campaign_Wizard&diff=54297Dugi's Campaign Wizard2014-03-30T19:36:54Z<p>Dugi: Wrote a page about my GSoC proposal</p>
<hr />
<div>{{SoC2014Student}}<br />
[[Category:SoC_Ideas_Your_Own_Ideas2014]]<br />
'<br />
<br />
==Description==<br />
<h4>Dugi - Campaign Wizard</h4><br />
I've seen on the forums that people frequently ask for campaign wizards and such and when they're told that there is no such thing, they struggle usually with the basics like writing a proper _main.cfg file. There is a project named Eclipse Java plugin, but it's not a part of wesnoth, only a few people know about it and it is basically just a text editor adapted to work with WML. This project is to make a campaign wizard, incorporated into the game, that would allow creating simpler campaigns in an intuitive way, without having to read or write source codes.<br />
<br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
==IRC==<br />
Dugi<br />
<br />
==Questionnaire==<br />
1) Basics <br />
<br />
1.1) Write a small introduction to yourself. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.2) State your preferred email address. <br />
Written on google-melange, I don't want to write information about myself somewhere where it can be accessed by anyone.<br />
<br />
1.3) If you have chosen a nick for IRC and Wesnoth forums, what is it? <br />
A shortcut of my last name, used commonly by my real-life friends.<br />
<br />
1.4) Why do you want to participate in summer of code? <br />
To get beter in C++ and help developping a game.<br />
<br />
1.5) What are you studying, subject, level and school? <br />
I am studying plasma physics (4th year, master's) and mathematical informatics (1st year, undergraduate), these are two parallel major-only studies.<br />
<br />
1.6) What country are you from, at what time are you most likely to be able to join IRC? <br />
I am the most likely to join IRC during the day in Europe, maybe in the evening. Rather in the evening during lessons.<br />
<br />
1.7) Do you have other commitments for the summer period ? Do you plan to take any vacations ? If yes, when. <br />
I have no other comittments.<br />
<br />
<br />
2) Experience <br />
<br />
2.1) What programs/software have you worked on before? <br />
I have made an add-on campaign for Battle for Wesnoth. I was also making a 3D game using Ogre3D (but I accidentally lost all the files, and haven't written much in its remake because I didn't have enough time).<br />
<br />
2.2) Have you developed software in a team environment before? (As opposed to hacking on something on your own) <br />
Not in team.<br />
<br />
2.3) Have you participated to the Google Summer of Code before? As a mentor or a student? In what project? Were you successful? If not, why? <br />
I haven't participated there yet.<br />
<br />
2.4) Are you already involved with any open source development projects? If yes, please describe the project and the scope of your involvement. <br />
Actually coding some other stuff for Battle for Wesnoth. I have done some user-made content before.<br />
<br />
2.5) Gaming experience - Are you a gamer? <br />
Yes.<br />
<br />
2.5.1) What type of gamer are you? <br />
Playing like twice a week, usually like 6 hours in a row.<br />
<br />
2.5.2) What type of games? <br />
Mostly RPGs.<br />
<br />
2.5.3) What type of opponents do you prefer? <br />
AI opponents, competitive player versus player doesn't attract me much.<br />
<br />
2.5.4) Are you more interested in story or gameplay? <br />
Rather gameplay, but I enjoy a good story, it can keep me playing even if the gameplay isn't as good.<br />
<br />
2.5.5) Have you played Wesnoth? If so, tell us roughly for how long and whether you lean towards single player or multiplayer. <br />
Yes, initially a lot (like 4 years ago), then I played less and I worked mostly on making my own campaign. I prefer single player.<br />
<br />
2.6) If you have contributed any patches to Wesnoth, please list them below. You can also list patches that have been submitted but not committed yet and patches that have not been specifically written for GSoC. If you have gained commit access to our repository (during the evaluation period or earlier) please state so. <br />
<br />
None, but currently working on one.<br />
<br />
<br />
3) Communication skills <br />
<br />
3.1) Though most of our developers are not native English speakers, English is the project's working language. Describe your fluency level in written English. <br />
I write in English language almost as fluently as in my native language.<br />
<br />
3.2) What spoken languages are you fluent in? <br />
Depends how fluent. I should be fluent enough in Slovak, Czech and English. Maybe French after some revision.<br />
<br />
<br />
3.3) Are you good at interacting with other players? Our developer community is friendly, but the player community can be a bit rough. <br />
I play multiplayer really rarely, not only because of ill-mannered players.<br />
<br />
3.4) Do you give constructive advice? <br />
I think yes.<br />
<br />
3.5) Do you receive advice well? <br />
Yes.<br />
<br />
3.6) Are you good at sorting useful criticisms from useless ones? <br />
I think yes.<br />
<br />
3.7) How autonomous are you when developing ? Would you rather discuss intensively changes and not start coding until you know what you want to do or would you rather code a proof of concept to "see how it turn out", taking the risk of having it thrown away if it doesn't match what the project want <br />
I prefer discussing things briefly and then doing them, deciding about all the details myself, petty problems can be corrected afterwards.<br />
<br />
<br />
4) Project <br />
<br />
4.1) Did you select a project from our list? If that is the case, what project did you select? What do you want to especially concentrate on? <br />
Yes, I liked the Campaign-making wizard project, so I picked it.<br />
<br />
4.2) If you have invented your own project, please describe the project and the scope. <br />
N/A<br />
<br />
4.3) Why did you choose this project? <br />
Because I consider myself a veteran at making campaigns.<br />
<br />
4.4) Include an estimated timeline for your work on the project. Don't forget to mention special things like "I booked holidays between A and B" and "I got an exam at ABC and won't be doing much then". <br />
I should have no exams during the summer (unless I fail some miserably, but three years of physics have taught me how to pass), and I don't know if I'll be on some holidays so early. But I can code also during holiday, last time I did.<br />
The timeline would be just to do it all as early as possible.<br />
<br />
4.5) Include as much technical detail about your implementation as you can <br />
The idea is to create a campaign making GUI that would be accessible from the map editor or some other menu, and would allow making campaigns without writing any codes, just clicking and writing some dialogues, unit names and such. It wouldn't allow doing all the things that can be done with WML, just the more common things.<br />
<br />
It would contain several windows or tabs, one for the entire campaign's properties (setting up the basic properties), one for the scenarios (setting up the basic properties, like assigning maps, sides' properties, then adding commonly used events) and something for adding custom units (basic properties, assigning images to attacks and animations, some abilities and AMLA).<br />
<br />
It would need to use slightly different data structures than usual wesnoth because campaigns need including files and macros, preprocessor defines and similar things that are usually parsed out when reading the files. I think that they could be created through inheritance and a few modifications.<br />
<br />
The map editor can do a plenty of things around scenarioWML, so it might be used to create scenarios after some editing, but at least some sort of ActionWML editor would need to be added (supporting basic tags like message, creating units, killing units, moving units, giving some objects to them, options and variables).<br />
<br />
4.6) What do you expect to gain from this project? <br />
Experience and pleasure from helping others. I know this sounds pathetic...<br />
<br />
4.7) What would make you stay in the Wesnoth community after the conclusion of SOC? <br />
I am maintaining the add-on campaign I've made, and I'll have to maintain it for ages because of its high popularity.<br />
<br />
<br />
5) Practical considerations <br />
<br />
5.1) Are you familiar with any of the following tools or languages? <br />
Git (used for all commits) <br />
Familiar<br />
C++ (language used for all the normal source code) <br />
Familiar<br />
STL, Boost, Sdl (C++ libraries used by Wesnoth) <br />
No. I have used a few boost functions, though.<br />
Python (optional, mainly used for tools) <br />
No, but I know how to execute python scripts, for I have used these python tools.<br />
build environments (eg cmake/scons) <br />
Familiar with CMake, but I have used scons to build wesnoth once.<br />
WML (the wesnoth specific scenario language) <br />
Familiar<br />
Lua (used in combination with WML to create scenarios) <br />
Quite familiar<br />
<br />
5.2) Which tools do you normally use for development? Why do you use them? <br />
QtCreator as IDE for C++<br />
Gedit for other stuff<br />
<br />
5.3) What programming languages are you fluent in? <br />
C, C++<br />
<br />
5.4) Would you mind talking with your mentor on telephone / internet phone? We would like to have a backup way for communications for the case that somehow emails and IRC do fail. If you are willing to do so, please do list a phone number (including international code) so that we are able to contact you. You should probably *only* add this number in the application for you submit to google since the info in the wiki is available in public. We will *not* make any use of your number unless some case of "there is no way to contact you" does arise!<br />
<br />
Written on google-melange, the last thing I need is more spam phone calls.</div>Dugihttps://wiki.wesnoth.org/index.php?title=FancyAddonIcons&diff=53688FancyAddonIcons2014-03-12T18:07:58Z<p>Dugi: /* Introduction */ Added a few details</p>
<hr />
<div>An add-on's icon is the first thing a player is going to look at when picking add-ons. A good add-on icon can attract many players, so it should not be neglected. However, custom images cannot be used, they will be seen only by people who have it installed, that usually means that the author will think it's correct, although it is not. Despite this limitation, there is a way to create quite cool add-on icons. It is called [[ImagePathFunctionWML]].<br />
<br />
<br />
== Introduction ==<br />
Of course, you can create a code like (careful, it is long!):<br />
items/bonestack.png~BLIT(items/bonestack.png~CROP(20,0,52,52),0,20)~BLIT(items/bonestack.png~CROP(0,0,52,52),20,20)~BLIT(items/burial.png~CROP(20,0,52,72),0,0)~BLIT(items/burial.png~CROP(0,0,52,62),20,10)~BLIT(units/undead-skeletal/archer-die2-6.png~CROP(10,0,62,62)~RC(magenta>black),0,10)~BLIT(units/orcs/sovereign-lead-2.png~RC(magenta>black))~BLIT(items/burial.png~CROP(0,0,62,52),10,20)<br />
<br />
But testing this will be very tedious and annoying, reloading the entire add-on to view it somewhere, or even uploading it to test it every time. To make this easier, download an add-on named ''Image loading tester'', it will help you a lot with this. The add-on is absolutely minimalistic, and has no obvious effect anywhere. To use it, either execute this WML chunk:<br />
[lua]<br />
code=<<wesnoth.image_test()>><br />
[/lua]<br />
<br />
Or activate the debug mode (:debug in [[CommandMode]]), and use this command:<br />
lua wesnoth.image_test()<br />
The second option is probably more convenient.<br />
<br />
A window will show up, there will be a text box and two buttons. Type your image code into the text box and click on the Show button (caution, don't hit enter, it will make it exit). This way, you will be able to verify it very quickly. It is recommended to do this while running wesnoth from command prompt (on Windows) or Terminal (on Linux), it will notice you about some errors in your code (on Windows, you can also read stderr.txt afterwards).<br />
<br />
Because the code on a single line possibly with many nested brackets is almost unreadable for humans, it is recommended to write it in a text file with indentation and new lines, then to use Find&Replace to remove all tabs, spaces and new lines and paste it into the text box. I will use indented codes later, for better readability, and it will be necessary to remove all spaces and new lines from it or copying the version when it is already removed bellow it if you want to try it out.<br />
<br />
To understand better the numeric values that look like just made up to fit, you might want to learn the coordinates needed in an image editor like GIMP.<br />
<br />
It is also recommended to use wesnoth 1.12 or later wesnoth 1.11, 1.10 tends to randomly crash when copying stuff from the textbox and that annoys a lot, even if it happens only sometimes. I have written the examples to work with these versions.<br />
<br />
Now, you can verify your codes easily, and you can progress to the next step.<br />
<br />
== Step by step tutorial ==<br />
Let us think about creating an add-on image for a campaign where elves attack undead. It would consist of an Elvish Hero chopping undead to pieces, supported by spells of an Elvish Sorceress behind him. We will create an image for it in several steps. Try out each one of them to see what is changed.<br />
<br />
'''1.''' Image showing an Elvish Hero in an attacking position is units/elves-wood/hero-melee-3.png. So we start with it:<br />
units/elves-wood/hero-melee-3.png<br />
<br />
'''2.''' Nothing interesting so far. Let us add a skeleton he is slashing. The image units/undead-skeletal/skeleton/skeleton-se-melee3.png is in a good fighting position, also exposing his belly to our hero. We will use the ~BLIT function of [[ImagePathFunctionWML]] to add him to the picture. Now we have:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png<br />
)<br />
Note that the new lines and indentation are added only for readability, it will not work in game, you'll have to remove all new lines and breaks. Here it is without indents:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png)<br />
<br />
'''3.''' However, they are quite in an awkward position. We will need to add some offset to the skeleton. ~BLIT accepts two additional arguments that mean the offset of the image. However, it would not fit on the image then (this prints an error message into the command line, Termina or stderr.txt), so we need to crop it. The ~CROP function accepts four arguments, the first two are the coordinates where the selected part of the image should start (pixels to the right first, pixels down second), the second two is the desired size of the result (width and height respectively). In this case, we start cropping on the top left corner, therefore the first two coordinates will be 0 and 0. The offset will be 20,20 (pixels to left first, pixels down second), so we need the resolution of the image to be 52x52 (original is 72x72, we subtract 20 from both numbers). The four arguments of crop will be therefore 0,0,52,52, and the two additional arguments of ~BLIT will be 20,20. Together, it should look like this:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52)<br />
,20,20)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52),20,20)<br />
<br />
'''4.''' Now, the skeleton needs to be headed differently, because he isn't attacking the hero. The ~FLIP function is designed for this. Use ~FLIP(horizontal) for this. We will also need to adjust the offset in CROP and BLIT, because it would look bad:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal)<br />
,40,20)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal),40,20)<br />
<br />
'''5.''' However, we want the skeleton to be chopped in half by the Hero's sword. We can do this by placing two conveniently cropped images of skeleton one above another.<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)<br />
,40,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)<br />
,40,47)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal),40,47)<br />
<br />
'''6.''' We want our heroes to be also teamcoloured, so we can change the default colour (magenta) to some other colour. The colours you can change it to can be found in the data/core/team_colors.cfg file. The colours are changed using the ~RC function. Because our heroes are good and the undead are bad, let's team-colour the undead black and the heroes white.<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta>black)<br />
,40,47)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta>black),40,47)<br />
<br />
'''7.''' Now, we want to add the Sorceress casting a spell to the background. She should be behind the Elvish Hero, and she should have an offset, but that can be done by cropping. To make sure that she won't be hid behind the Hero too badly, the hero and the skeleton will have to be offset too. Because we need an image of dimensions 72x72 as background, and a cropped Sorceress does not have such dimensions, we will have to use misc/blank-hex.png as background (it is a blank image) and place the sorceress on it. The offsets were adjusted to make it look better.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(15,10,57,62),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''8.''' Now, we need to add some halo to her, she is casting a spell, no? A suitable halo can be halo/elven/faerie-fire-halo4.png, let's use it. Its resolution is 96x96, that is quite awkward because it is larger than our image, but we can crop it easily.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''9.''' Now, to add the homing missile of the spell. halo/elven/ice-halo3.png looks convenient. Placing it on the image together with a skeleton that would be the victim of this spell is analogical to things done previously.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)<br />
,30,0)<br />
~BLIT(<br />
halo/elven/ice-halo3.png~CROP(0,20,62,52)<br />
,10,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black),30,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''10.''' We might colourise the skeleton blue, to make him appear frozen. There are two functions for this, ~CS and ~GS. ~GS removes all colour, transforming all colours into shades of gray. ~CS is used to change the colour, it accepts three arguments, the change to the red colour, the change to the green colour and the change to the blue colour. Negative numbers (from -1 to -255) mean removing the colour from all pixels (respecting transparency), so ~CS(0,-255,-255) will remove all colours except red, so that only the red part of the light will remain. Positive numbers (from 1 to 255) will add the colour to all pixels (unless invisible), so ~CS(255,0,0) will set the red fraction of the colour to maximum. ~CS(255,-255,-255) will remove all colours but red, and add a maximum of red everywhere, creating a single-colour image. To create the effect of frozen, we first use ~GS and then we use ~CS to make it bluer.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)~GS()~CS(50,50,150)<br />
,30,0)<br />
~BLIT(<br />
halo/elven/ice-halo3.png~CROP(0,20,62,52)<br />
,10,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)~GS()~CS(50,50,150),30,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
Now, we are done with this image.<br />
<br />
== More examples ==<br />
Here are more examples of stuff you can do using these methods. They don't contain precise information how it is done, but it should be clear if you have read the tutorial.<br />
<br />
=== The Spellsword ===<br />
The purpose of this example is to show the usage of the opacity ~O function. When called on magical halo, it can be used to make the halo partially before and partially behind the unit (place the image there twice with 50% opacity, once under him, once above him). It can be also used to create motion blur.<br />
<br />
halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)<br />
~BLIT(<br />
units/elves-wood/high-lord-attack-sword-2.png~CROP(6,6,66,66)~O(25%)~RC(magenta>blue)<br />
)<br />
~BLIT(<br />
units/elves-wood/high-lord-attack-sword-2.png~CROP(3,3,69,69)~O(50%)~RC(magenta>blue)<br />
)<br />
~BLIT(<br />
units/elves-wood/high-lord-attack-sword-2.png~RC(magenta>blue)<br />
)<br />
~BLIT(<br />
halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)<br />
)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo3.png~CROP(0,5,57,72)<br />
,15,0)<br />
Without indentation:<br />
halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)~BLIT(units/elves-wood/high-lord-attack-sword-2.png~CROP(6,6,66,66)~O(25%)~RC(magenta>blue))~BLIT(units/elves-wood/high-lord-attack-sword-2.png~CROP(3,3,69,69)~O(50%)~RC(magenta>blue))~BLIT(units/elves-wood/high-lord-attack-sword-2.png~RC(magenta>blue))~BLIT(halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%))~BLIT(halo/elven/faerie-fire-halo3.png~CROP(0,5,57,72),15,0)<br />
<br />
=== Zorro ===<br />
The purpose of this example is to show that some body parts can be taken from the original body (provided that they can be selected easily), modified and placed back. Or placed on to different place. Or to a completely different sprite.<br />
<br />
units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)<br />
~BLIT(<br />
units/human-loyalists/master-at-arms-crossbow-2.png~CROP(2,27,18,14)~FL(horiz)<br />
,48,27)<br />
~BLIT(<br />
units/human-outlaws/assassin-throwknife1.png~CROP(29,17,11,13)~RC(magenta>black)<br />
,26,21)<br />
~BLIT(<br />
halo/misc/leadership-flare-7.png~CROP(0,5,46,67)<br />
,26,0)<br />
~BLIT(<br />
halo/misc/leadership-flare-6.png~CROP(33,7,39,65)<br />
,0,0)<br />
~BLIT(<br />
units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)~CROP(20,11,20,17)~CS(-100,-100,-100)<br />
,20,11)<br />
Without indentation:<br />
units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)~BLIT(units/human-loyalists/master-at-arms-crossbow-2.png~CROP(2,27,18,14)~FL(horiz),48,27)~BLIT(units/human-outlaws/assassin-throwknife1.png~CROP(29,17,11,13)~RC(magenta>black),26,21)~BLIT(halo/misc/leadership-flare-7.png~CROP(0,5,46,67),26,0)~BLIT(halo/misc/leadership-flare-6.png~CROP(33,7,39,65),0,0)~BLIT(units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)~CROP(20,11,20,17)~CS(-100,-100,-100),20,11)<br />
<br />
=== Lich Wars ===<br />
The purpose of this is to show how can text be used in the graphics. It mostly revolves around the misc/font8x8.png file (it is not in core, but in another images folder belonging to the game, next to the data folder that contains the core folder; using it causes no trouble).<br />
<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/undead-skeletal/deathblade-dying-2.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62)~O(50%)<br />
,10,10)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-dying-1.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62)<br />
,10,10)<br />
~BLIT(<br />
units/undead-necromancers/ancient-lich-melee.png~RC(magenta>red)~CROP(20,10,52,62)<br />
)<br />
~BLIT(<br />
halo/undead/black-magic-3.png~FL(vert)~CROP(15,40,72,60)~O(70%)<br />
)<br />
~BLIT(<br />
misc/blank-hex.png<br />
~BLIT(<br />
misc/font8x8.png~CROP(39,33,8,8)<br />
,16,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(16,32,8,8)<br />
,24,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(47,24,8,8)<br />
,32,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(8,33,8,8)<br />
,40,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(48,41,8,8)<br />
,16,64)<br />
~BLIT(<br />
misc/font8x8.png~CROP(32,25,8,8)<br />
,24,64)<br />
~BLIT(<br />
misc/font8x8.png~CROP(8,40,8,8)<br />
,32,64)<br />
~BLIT(<br />
misc/font8x8.png~CROP(16,41,8,8)<br />
,40,64)<br />
~CS(-255,0,-255)<br />
)<br />
Without indentation:<br />
misc/blank-hex.png~BLIT(units/undead-skeletal/deathblade-dying-2.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62)~O(50%),10,10)~BLIT(units/undead-skeletal/deathblade-dying-1.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62),10,10)~BLIT(units/undead-necromancers/ancient-lich-melee.png~RC(magenta>red)~CROP(20,10,52,62))~BLIT(halo/undead/black-magic-3.png~FL(vert)~CROP(15,40,72,60)~O(70%))~BLIT(misc/blank-hex.png~BLIT(misc/font8x8.png~CROP(39,33,8,8),16,56)~BLIT(misc/font8x8.png~CROP(16,32,8,8),24,56)~BLIT(misc/font8x8.png~CROP(47,24,8,8),32,56)~BLIT(misc/font8x8.png~CROP(8,33,8,8),40,56)~BLIT(misc/font8x8.png~CROP(48,41,8,8),16,64)~BLIT(misc/font8x8.png~CROP(32,25,8,8),24,64)~BLIT(misc/font8x8.png~CROP(8,40,8,8),32,64)~BLIT(misc/font8x8.png~CROP(16,41,8,8),40,64)~CS(-255,0,-255))</div>Dugihttps://wiki.wesnoth.org/index.php?title=FancyAddonIcons&diff=53687FancyAddonIcons2014-03-12T18:02:56Z<p>Dugi: Added some more examples of ImagePathFunctionWML</p>
<hr />
<div>An add-on's icon is the first thing a player is going to look at when picking add-ons. A good add-on icon can attract many players, so it should not be neglected. However, custom images cannot be used, they will be seen only by people who have it installed, that usually means that the author will think it's correct, although it is not. Despite this limitation, there is a way to create quite cool add-on icons. It is called [[ImagePathFunctionWML]].<br />
<br />
<br />
== Introduction ==<br />
Of course, you can create a code like:<br />
items/bonestack.png~BLIT(items/bonestack.png~CROP(20,0,52,52),0,20)~BLIT(items/bonestack.png~CROP(0,0,52,52),20,20)~BLIT(items/burial.png~CROP(20,0,52,72),0,0)~BLIT(items/burial.png~CROP(0,0,52,62),20,10)~BLIT(units/undead-skeletal/archer-die2-6.png~CROP(10,0,62,62)~RC(magenta>black),0,10)~BLIT(units/orcs/sovereign-lead-2.png~RC(magenta>black))~BLIT(items/burial.png~CROP(0,0,62,52),10,20)<br />
<br />
But testing this will be very tedious and annoying, reloading the entire add-on to view it somewhere, or even uploading it to test it every time. To make this easier, download an add-on named Image loading test, it will help you a lot with this. The add-on is absolutely minimalistic, and has no obvious effect anywhere. To use it, either execute this WML chunk:<br />
[lua]<br />
code=<<wesnoth.image_test()>><br />
[/lua]<br />
<br />
Or activate the debug mode (:debug in [[CommandMode]]), and use this command:<br />
lua wesnoth.image_test()<br />
The second option is probably more convenient.<br />
<br />
A window will show up, there will be a text box and two buttons. Type your image code into the text box and click on the Show button (caution, don't hit enter, it will make it exit). This way, you will be able to verify it very quickly. It is recommended to do this while running wesnoth from command prompt (on Windows) or Terminal (on Linux), it will notice you about some errors in your code (on Windows, you can also read stderr.txt afterwards).<br />
<br />
Because the code on a single line possibly with many nested brackets is almost unreadable for humans, it is recommended to write it in a text file with indentation and new lines, then to use Find&Replace to remove all tabs, spaces and new lines and paste it into the text box. I will use indented codes later, for better readability, and it will be necessary to remove all spaces and new lines from it or copying the version when it is already removed bellow it if you want to try it out.<br />
<br />
To understand better the numeric values that look like just made up to fit, you might want to learn the coordinates needed in an image editor like GIMP.<br />
<br />
Now, you can verify your codes easily, and you can progress to the next step.<br />
<br />
<br />
== Step by step tutorial ==<br />
Let us think about creating an add-on image for a campaign where elves attack undead. It would consist of an Elvish Hero chopping undead to pieces, supported by spells of an Elvish Sorceress behind him. We will create an image for it in several steps. Try out each one of them to see what is changed.<br />
<br />
'''1.''' Image showing an Elvish Hero in an attacking position is units/elves-wood/hero-melee-3.png. So we start with it:<br />
units/elves-wood/hero-melee-3.png<br />
<br />
'''2.''' Nothing interesting so far. Let us add a skeleton he is slashing. The image units/undead-skeletal/skeleton/skeleton-se-melee3.png is in a good fighting position, also exposing his belly to our hero. We will use the ~BLIT function of [[ImagePathFunctionWML]] to add him to the picture. Now we have:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png<br />
)<br />
Note that the new lines and indentation are added only for readability, it will not work in game, you'll have to remove all new lines and breaks. Here it is without indents:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png)<br />
<br />
'''3.''' However, they are quite in an awkward position. We will need to add some offset to the skeleton. ~BLIT accepts two additional arguments that mean the offset of the image. However, it would not fit on the image then (this prints an error message into the command line, Termina or stderr.txt), so we need to crop it. The ~CROP function accepts four arguments, the first two are the coordinates where the selected part of the image should start (pixels to the right first, pixels down second), the second two is the desired size of the result (width and height respectively). In this case, we start cropping on the top left corner, therefore the first two coordinates will be 0 and 0. The offset will be 20,20 (pixels to left first, pixels down second), so we need the resolution of the image to be 52x52 (original is 72x72, we subtract 20 from both numbers). The four arguments of crop will be therefore 0,0,52,52, and the two additional arguments of ~BLIT will be 20,20. Together, it should look like this:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52)<br />
,20,20)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52),20,20)<br />
<br />
'''4.''' Now, the skeleton needs to be headed differently, because he isn't attacking the hero. The ~FLIP function is designed for this. Use ~FLIP(horizontal) for this. We will also need to adjust the offset in CROP and BLIT, because it would look bad:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal)<br />
,40,20)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal),40,20)<br />
<br />
'''5.''' However, we want the skeleton to be chopped in half by the Hero's sword. We can do this by placing two conveniently cropped images of skeleton one above another.<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)<br />
,40,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)<br />
,40,47)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal),40,47)<br />
<br />
'''6.''' We want our heroes to be also teamcoloured, so we can change the default colour (magenta) to some other colour. The colours you can change it to can be found in the data/core/team_colors.cfg file. The colours are changed using the ~RC function. Because our heroes are good and the undead are bad, let's team-colour the undead black and the heroes white.<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta>black)<br />
,40,47)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta>black),40,47)<br />
<br />
'''7.''' Now, we want to add the Sorceress casting a spell to the background. She should be behind the Elvish Hero, and she should have an offset, but that can be done by cropping. To make sure that she won't be hid behind the Hero too badly, the hero and the skeleton will have to be offset too. Because we need an image of dimensions 72x72 as background, and a cropped Sorceress does not have such dimensions, we will have to use misc/blank-hex.png as background (it is a blank image) and place the sorceress on it. The offsets were adjusted to make it look better.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(15,10,57,62),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''8.''' Now, we need to add some halo to her, she is casting a spell, no? A suitable halo can be halo/elven/faerie-fire-halo4.png, let's use it. Its resolution is 96x96, that is quite awkward because it is larger than our image, but we can crop it easily.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''9.''' Now, to add the homing missile of the spell. halo/elven/ice-halo3.png looks convenient. Placing it on the image together with a skeleton that would be the victim of this spell is analogical to things done previously.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)<br />
,30,0)<br />
~BLIT(<br />
halo/elven/ice-halo3.png~CROP(0,20,62,52)<br />
,10,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black),30,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''10.''' We might colourise the skeleton blue, to make him appear frozen. There are two functions for this, ~CS and ~GS. ~GS removes all colour, transforming all colours into shades of gray. ~CS is used to change the colour, it accepts three arguments, the change to the red colour, the change to the green colour and the change to the blue colour. Negative numbers (from -1 to -255) mean removing the colour from all pixels (respecting transparency), so ~CS(0,-255,-255) will remove all colours except red, so that only the red part of the light will remain. Positive numbers (from 1 to 255) will add the colour to all pixels (unless invisible), so ~CS(255,0,0) will set the red fraction of the colour to maximum. ~CS(255,-255,-255) will remove all colours but red, and add a maximum of red everywhere, creating a single-colour image. To create the effect of frozen, we first use ~GS and then we use ~CS to make it bluer.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)~GS()~CS(50,50,150)<br />
,30,0)<br />
~BLIT(<br />
halo/elven/ice-halo3.png~CROP(0,20,62,52)<br />
,10,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)~GS()~CS(50,50,150),30,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
Now, we are done with this image.<br />
<br />
== More examples ==<br />
Here are more examples of stuff you can do using these methods. They don't contain precise information how it is done, but it should be clear if you have read the tutorial.<br />
<br />
=== The Spellsword ===<br />
The purpose of this example is to show the usage of the opacity ~O function. When called on magical halo, it can be used to make the halo partially before and partially behind the unit (place the image there twice with 50% opacity, once under him, once above him). It can be also used to create motion blur.<br />
<br />
halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)<br />
~BLIT(<br />
units/elves-wood/high-lord-attack-sword-2.png~CROP(6,6,66,66)~O(25%)~RC(magenta>blue)<br />
)<br />
~BLIT(<br />
units/elves-wood/high-lord-attack-sword-2.png~CROP(3,3,69,69)~O(50%)~RC(magenta>blue)<br />
)<br />
~BLIT(<br />
units/elves-wood/high-lord-attack-sword-2.png~RC(magenta>blue)<br />
)<br />
~BLIT(<br />
halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)<br />
)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo3.png~CROP(0,5,57,72)<br />
,15,0)<br />
Without indentation:<br />
halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%)~BLIT(units/elves-wood/high-lord-attack-sword-2.png~CROP(6,6,66,66)~O(25%)~RC(magenta>blue))~BLIT(units/elves-wood/high-lord-attack-sword-2.png~CROP(3,3,69,69)~O(50%)~RC(magenta>blue))~BLIT(units/elves-wood/high-lord-attack-sword-2.png~RC(magenta>blue))~BLIT(halo/elven/elven-shield-halo-100pct.png~CROP(44,44,72,72)~O(50%))~BLIT(halo/elven/faerie-fire-halo3.png~CROP(0,5,57,72),15,0)<br />
<br />
=== Zorro ===<br />
The purpose of this example is to show that some body parts can be taken from the original body (provided that they can be selected easily), modified and placed back. Or placed on to different place. Or to a completely different sprite.<br />
<br />
units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)<br />
~BLIT(<br />
units/human-loyalists/master-at-arms-crossbow-2.png~CROP(2,27,18,14)~FL(horiz)<br />
,48,27)<br />
~BLIT(<br />
units/human-outlaws/assassin-throwknife1.png~CROP(29,17,11,13)~RC(magenta>black)<br />
,26,21)<br />
~BLIT(<br />
halo/misc/leadership-flare-7.png~CROP(0,5,46,67)<br />
,26,0)<br />
~BLIT(<br />
halo/misc/leadership-flare-6.png~CROP(33,7,39,65)<br />
,0,0)<br />
~BLIT(<br />
units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)~CROP(20,11,20,17)~CS(-100,-100,-100)<br />
,20,11)<br />
Without indentation:<br />
units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)~BLIT(units/human-loyalists/master-at-arms-crossbow-2.png~CROP(2,27,18,14)~FL(horiz),48,27)~BLIT(units/human-outlaws/assassin-throwknife1.png~CROP(29,17,11,13)~RC(magenta>black),26,21)~BLIT(halo/misc/leadership-flare-7.png~CROP(0,5,46,67),26,0)~BLIT(halo/misc/leadership-flare-6.png~CROP(33,7,39,65),0,0)~BLIT(units/human-loyalists/master-at-arms-crossbow-2.png~RC(magenta>black)~CROP(20,11,20,17)~CS(-100,-100,-100),20,11)<br />
<br />
=== Lich Wars ===<br />
The purpose of this is to show how can text be used in the graphics. It mostly revolves around the misc/font8x8.png file (it is not in core, but in another images folder belonging to the game, next to the data folder that contains the core folder; using it causes no trouble).<br />
<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/undead-skeletal/deathblade-dying-2.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62)~O(50%)<br />
,10,10)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-dying-1.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62)<br />
,10,10)<br />
~BLIT(<br />
units/undead-necromancers/ancient-lich-melee.png~RC(magenta>red)~CROP(20,10,52,62)<br />
)<br />
~BLIT(<br />
halo/undead/black-magic-3.png~FL(vert)~CROP(15,40,72,60)~O(70%)<br />
)<br />
~BLIT(<br />
misc/blank-hex.png<br />
~BLIT(<br />
misc/font8x8.png~CROP(39,33,8,8)<br />
,16,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(16,32,8,8)<br />
,24,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(47,24,8,8)<br />
,32,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(8,33,8,8)<br />
,40,56)<br />
~BLIT(<br />
misc/font8x8.png~CROP(48,41,8,8)<br />
,16,64)<br />
~BLIT(<br />
misc/font8x8.png~CROP(32,25,8,8)<br />
,24,64)<br />
~BLIT(<br />
misc/font8x8.png~CROP(8,40,8,8)<br />
,32,64)<br />
~BLIT(<br />
misc/font8x8.png~CROP(16,41,8,8)<br />
,40,64)<br />
~CS(-255,0,-255)<br />
)<br />
Without indentation:<br />
misc/blank-hex.png~BLIT(units/undead-skeletal/deathblade-dying-2.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62)~O(50%),10,10)~BLIT(units/undead-skeletal/deathblade-dying-1.png~FL(horiz)~RC(magenta>red)~CROP(0,0,62,62),10,10)~BLIT(units/undead-necromancers/ancient-lich-melee.png~RC(magenta>red)~CROP(20,10,52,62))~BLIT(halo/undead/black-magic-3.png~FL(vert)~CROP(15,40,72,60)~O(70%))~BLIT(misc/blank-hex.png~BLIT(misc/font8x8.png~CROP(39,33,8,8),16,56)~BLIT(misc/font8x8.png~CROP(16,32,8,8),24,56)~BLIT(misc/font8x8.png~CROP(47,24,8,8),32,56)~BLIT(misc/font8x8.png~CROP(8,33,8,8),40,56)~BLIT(misc/font8x8.png~CROP(48,41,8,8),16,64)~BLIT(misc/font8x8.png~CROP(32,25,8,8),24,64)~BLIT(misc/font8x8.png~CROP(8,40,8,8),32,64)~BLIT(misc/font8x8.png~CROP(16,41,8,8),40,64)~CS(-255,0,-255))</div>Dugihttps://wiki.wesnoth.org/index.php?title=FancyAddonIcons&diff=53685FancyAddonIcons2014-03-12T14:42:02Z<p>Dugi: Created a page with a guide how to create fancy add-on icons that actually work.</p>
<hr />
<div>An add-on's icon is the first thing a player is going to look at when picking add-ons. A good add-on icon can attract many players, so it should not be neglected. However, custom images cannot be used, they will be seen only by people who have it installed, that usually means that the author will think it's correct, although it is not. Despite this limitation, there is a way to create quite cool add-on icons. It is called [[ImagePathFunctionWML]].<br />
<br />
<br />
== Introduction ==<br />
Of course, you can create a code like:<br />
items/bonestack.png~BLIT(items/bonestack.png~CROP(20,0,52,52),0,20)~BLIT(items/bonestack.png~CROP(0,0,52,52),20,20)~BLIT(items/burial.png~CROP(20,0,52,72),0,0)~BLIT(items/burial.png~CROP(0,0,52,62),20,10)~BLIT(units/undead-skeletal/archer-die2-6.png~CROP(10,0,62,62)~RC(magenta>black),0,10)~BLIT(units/orcs/sovereign-lead-2.png~RC(magenta>black))~BLIT(items/burial.png~CROP(0,0,62,52),10,20)<br />
<br />
But testing this will be very tedious and annoying, reloading the entire add-on to view it somewhere, or even uploading it to test it every time. To make this easier, download an add-on named Image loading test, it will help you a lot with this. The add-on is absolutely minimalistic, and has no obvious effect anywhere. To use it, either execute this WML chunk:<br />
[lua]<br />
code=<<wesnoth.image_test()>><br />
[/lua]<br />
<br />
Or activate the debug mode (:debug in [[CommandMode]]), and use this command:<br />
lua wesnoth.image_test()<br />
The second option is probably more convenient.<br />
<br />
A window will show up, there will be a text box and two buttons. Type your image code into the text box and click on the Show button (caution, don't hit enter, it will make it exit). This way, you will be able to verify it very quickly. It is recommended to do this while running wesnoth from command prompt (on Windows) or Terminal (on Linux), it will notice you about some errors in your code (on Windows, you can also read stderr.txt afterwards).<br />
<br />
Because the code on a single line possibly with many nested brackets is almost unreadable for humans, it is recommended to write it in a text file with indentation and new lines, then to use Find&Replace to remove all tabs, spaces and new lines and paste it into the text box. I will use indented codes later, for better readability, and it will be necessary to remove all spaces and new lines from it or copying the version when it is already removed bellow it if you want to try it out.<br />
<br />
To understand better the numeric values that look like just made up to fit, you might want to learn the coordinates needed in an image editor like GIMP.<br />
<br />
Now, you can verify your codes easily, and you can progress to the next step.<br />
<br />
<br />
== Step by step tutorial ==<br />
Let us think about creating an add-on image for a campaign where elves attack undead. It would consist of an Elvish Hero chopping undead to pieces, supported by spells of an Elvish Sorceress behind him. We will create an image for it in several steps. Try out each one of them to see what is changed.<br />
<br />
'''1.''' Image showing an Elvish Hero in an attacking position is units/elves-wood/hero-melee-3.png. So we start with it:<br />
units/elves-wood/hero-melee-3.png<br />
<br />
'''2.''' Nothing interesting so far. Let us add a skeleton he is slashing. The image units/undead-skeletal/skeleton/skeleton-se-melee3.png is in a good fighting position, also exposing his belly to our hero. We will use the ~BLIT function of [[ImagePathFunctionWML]] to add him to the picture. Now we have:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png<br />
)<br />
Note that the new lines and indentation are added only for readability, it will not work in game, you'll have to remove all new lines and breaks. Here it is without indents:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png)<br />
<br />
'''3.''' However, they are quite in an awkward position. We will need to add some offset to the skeleton. ~BLIT accepts two additional arguments that mean the offset of the image. However, it would not fit on the image then (this prints an error message into the command line, Termina or stderr.txt), so we need to crop it. The ~CROP function accepts four arguments, the first two are the coordinates where the selected part of the image should start (pixels to the right first, pixels down second), the second two is the desired size of the result (width and height respectively). In this case, we start cropping on the top left corner, therefore the first two coordinates will be 0 and 0. The offset will be 20,20 (pixels to left first, pixels down second), so we need the resolution of the image to be 52x52 (original is 72x72, we subtract 20 from both numbers). The four arguments of crop will be therefore 0,0,52,52, and the two additional arguments of ~BLIT will be 20,20. Together, it should look like this:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52)<br />
,20,20)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(0,0,52,52),20,20)<br />
<br />
'''4.''' Now, the skeleton needs to be headed differently, because he isn't attacking the hero. The ~FLIP function is designed for this. Use ~FLIP(horizontal) for this. We will also need to adjust the offset in CROP and BLIT, because it would look bad:<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal)<br />
,40,20)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,47)~FL(horizontal),40,20)<br />
<br />
'''5.''' However, we want the skeleton to be chopped in half by the Hero's sword. We can do this by placing two conveniently cropped images of skeleton one above another.<br />
units/elves-wood/hero-melee-3.png<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)<br />
,40,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)<br />
,40,47)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal),40,47)<br />
<br />
'''6.''' We want our heroes to be also teamcoloured, so we can change the default colour (magenta) to some other colour. The colours you can change it to can be found in the data/core/team_colors.cfg file. The colours are changed using the ~RC function. Because our heroes are good and the undead are bad, let's team-colour the undead black and the heroes white.<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta>black)<br />
,40,47)<br />
Or without indentation:<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,22)~FL(horizontal)~RC(magenta>black),40,47)<br />
<br />
'''7.''' Now, we want to add the Sorceress casting a spell to the background. She should be behind the Elvish Hero, and she should have an offset, but that can be done by cropping. To make sure that she won't be hid behind the Hero too badly, the hero and the skeleton will have to be offset too. Because we need an image of dimensions 72x72 as background, and a cropped Sorceress does not have such dimensions, we will have to use misc/blank-hex.png as background (it is a blank image) and place the sorceress on it. The offsets were adjusted to make it look better.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(15,10,57,62),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''8.''' Now, we need to add some halo to her, she is casting a spell, no? A suitable halo can be halo/elven/faerie-fire-halo4.png, let's use it. Its resolution is 96x96, that is quite awkward because it is larger than our image, but we can crop it easily.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''9.''' Now, to add the homing missile of the spell. halo/elven/ice-halo3.png looks convenient. Placing it on the image together with a skeleton that would be the victim of this spell is analogical to things done previously.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)<br />
,30,0)<br />
~BLIT(<br />
halo/elven/ice-halo3.png~CROP(0,20,62,52)<br />
,10,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black),30,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
'''10.''' We might colourise the skeleton blue, to make him appear frozen. There are two functions for this, ~CS and ~GS. ~GS removes all colour, transforming all colours into shades of gray. ~CS is used to change the colour, it accepts three arguments, the change to the red colour, the change to the green colour and the change to the blue colour. Negative numbers (from -1 to -255) mean removing the colour from all pixels (respecting transparency), so ~CS(0,-255,-255) will remove all colours except red, so that only the red part of the light will remain. Positive numbers (from 1 to 255) will add the colour to all pixels (unless invisible), so ~CS(255,0,0) will set the red fraction of the colour to maximum. ~CS(255,-255,-255) will remove all colours but red, and add a maximum of red everywhere, creating a single-colour image. To create the effect of frozen, we first use ~GS and then we use ~CS to make it bluer.<br />
misc/blank-hex.png<br />
~BLIT(<br />
units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62)<br />
,0,0)<br />
~BLIT(<br />
halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52)<br />
,0,0)<br />
~BLIT(<br />
units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)~GS()~CS(50,50,150)<br />
,30,0)<br />
~BLIT(<br />
halo/elven/ice-halo3.png~CROP(0,20,62,52)<br />
,10,0)<br />
~BLIT(<br />
units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62)<br />
,0,10)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black)<br />
,40,20)<br />
~BLIT(<br />
units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black)<br />
,40,57)<br />
Or without indentation:<br />
misc/blank-hex.png~BLIT(units/elves-wood/sorceress-magic-3.png~RC(magenta>white)~CROP(10,15,57,62),0,0)~BLIT(halo/elven/faerie-fire-halo4.png~CROP(14,44,72,52),0,0)~BLIT(units/undead-skeletal/deathblade-idle-2.png~FL(horizontal)~CROP(0,15,42,67)~RC(magenta>black)~GS()~CS(50,50,150),30,0)~BLIT(halo/elven/ice-halo3.png~CROP(0,20,62,52),10,0)~BLIT(units/elves-wood/hero-melee-3.png~RC(magenta>white)~CROP(0,0,72,62),0,10)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,5,32,29)~FL(horizontal)~RC(magenta>black),40,20)~BLIT(units/undead-skeletal/skeleton/skeleton-se-melee3.png~CROP(20,35,32,12)~FL(horizontal)~RC(magenta>black),40,57)<br />
<br />
Now, we are done with this image.</div>Dugihttps://wiki.wesnoth.org/index.php?title=PblWML&diff=53679PblWML2014-03-12T12:26:29Z<p>Dugi: /* icon */ Added link to a page about using ImagePathFunctionWML to create add-on icons I am going to write.</p>
<hr />
<div>{{WML Tags}}<br />
<br />
To upload an add-on you have made, you need a .pbl file.<br />
<br />
This is a file with name '''data/add-ons/''Addon_name''.pbl''' or, for Wesnoth 1.6 and later, '''data/add-ons/''Addon_Name''/_server.pbl''' in a subdirectory. [http://exong.net/wesnoth-attach/files/pblexample_111.png Click here for an example of what we're talking about.]<br />
<br />
When you upload a add-on, the file '''data/add-ons/''Addon_Name''.cfg'''<br />
and the directory '''data/add-ons/''Addon_Name''/''' will be published. Alternatively, '''data/add-ons/''Addon_Name''.cfg''' can be replaced with '''data/add-ons/''Addon_Name''/_main.cfg'''. Your add-on must be based entirely on these paths.<br />
<br />
Be aware that translations in the .pbl-files are '''not''' used, so don't mark these strings as translatable.<br />
<br />
== What goes into a .pbl file? ==<br />
<br />
'''Note:''' ''You should '''not''' use special formatting or coloring in any of these keys when uploading to the official server.'''''<br />
<br />
The following keys are recognized for .pbl files:<br />
<br />
=== icon ===<br />
: An image, displayed leftmost in the add-ons download dialog. It must be a standard Wesnoth file and '''not a custom one'''. A custom file will only work for users who already have the relevant add-on installed. If you want to have a something more fancy to represent your add-on, read about [[FancyAddonIcons]] This is not related to the icon used for entries in the campaigns menu -- see [[CampaignWML]] for more information.<br />
<br />
: If the icon is a unit with magenta team-color bits, please use [[ImagePathFunctionWML]] to recolor it.<br />
<br />
=== title ===<br />
: Displayed to the right of the icon, it is just text. It should usually be the same as the name of your add-on when it is played.<br />
<br />
=== version ===<br />
: Displayed to the right of the title, it is just text. However, starting with Wesnoth 1.6, the ''required'' format is x.y.z where x, y and z are numbers and a value for x greater than 0 implies the add-on is complete feature-wise. Trailing non-numeric elements are allowed, but nothing should appear ''before'' the numbers. This is necessary for the ''Update add-ons'' button to work correctly. ([[#Version Key Examples|See Examples]])<br />
<br />
=== author ===<br />
: Displayed to the right of the version, it is just text. Put your name or nickname here. If several people have contributed significantly to the add-on you may want to list all of their names.<br />
<br />
=== passphrase ===<br />
: Not displayed, it prevents others from modifying the version of your add-on on the server. You do not need to input a passphrase when initially publishing a add-on; if you do not, one will be randomly generated for you and replaced in your local copy of the .pbl file.<br />
: '''SECURITY NOTE:''' If you do specify a passphrase of your own, note that it is stored in '''clear text''' form in the server; '''do NOT use a password you would normally use for any other services or web sites!'''<br />
<br />
=== description ===<br />
: This can be used to provide a brief description of your add-on, and for pre-1.0 versions, let people know how playable it is. The description can be viewed by users by clicking on the Description button in the built-in client, or by moving their mouse over the add-on's icon in the web interface.<br />
<br />
=== dependencies ===<br />
: An optional list of dependencies (a comma separated list of ''addon-name'' – the directory names of the needed add-ons), which should be provided if your add-on relies on other user-made content to work properly. ([[#Dependency Key Example|See Example]])<br />
<br />
=== translate ===<br />
: If set to '''true''', the add-on will be sent to and updated with [[WesCamp|WesCamp-i18n]]. (NOTE: this is a new and experimental function, which will automatically update the translations in your add-on. Make sure you make backups of your add-on in case of problems.)<br />
<br />
: You should make sure your add-on complies with some very specific [[WesCamp#Preparing_your_add-on_for_WesCamp|conventions]] required to ease the process for translators as well as technical requirements.<br />
<br />
=== type ===<br />
: Indicates the type of the add-on, used for the downloads manager dialog. Possible values are:<br />
<br />
:* ''campaign'': single player campaign.<br />
:* ''scenario'': single player scenario.<br />
:* ''campaign_sp_mp'': hybrid campaign.<br />
:* ''era'': multiplayer era.<br />
:* ''faction'': multiplayer stand-alone faction, or add-on for other available era.<br />
:* ''map_pack'': multiplayer map-pack.<br />
:* ''campaign_mp'': multiplayer campaign.<br />
:* ''scenario_mp'': multiplayer scenario. (See the note below.)<br />
:* ''mod_mp'': multiplayer modification.<br />
:* ''media'': miscellaneous resources for UMC authors/users, for example, music packs, packages of general-purpose WML, etc.<br />
:* ''other'': The type to use when no other type fits.<br />
<br />
'''Note:''' If your add-on contains two or more separate multiplayer scenarios, use ''map_pack''.<br />
<br />
=== email ===<br />
: Hidden e-mail address used by the server administrators to contact content authors in case of major issues. Again, this will only be seen by the server administrators and it is required that you provide one in case you need to be contacted about your add-on.<br />
<br />
=== [feedback] ===<br />
: {{DevFeature1.11|8}} The [feedback] tag includes information used by the server to provide the client with a website URL for players to post feedback on an add-on and communicate with the maintainers. At this time, the official add-ons server is configured to take a single parameter described below.<br />
<br />
==== topic_id ====<br />
: {{DevFeature1.11|8}} Topic id from the [http://forums.wesnoth.org/ Wesnoth.org forums] for the add-on's feedback or development topic maintained by the add-on uploader or author. For existing topics, the '''topic_id''' corresponds to the series of digits in the '''t=YYYYY''' portion of an URL like <code><nowiki>http://forums.wesnoth.org/viewtopic.php?f=XX&t=YYYYY</nowiki></code>. You must take special care to ensure this information is valid before uploading if you want players to be able to reach you!<br />
<br />
<br />
The add-on server keeps track of some other information about uploaded content, including when they were uploaded, what languages they have been at least partly translated into, how large they are on the server and the number of times they have been downloaded. For more information about this you can read [[CampaignServerWML]].<br />
<br />
== Examples ==<br />
<br />
=== Dependency Key Example ===<br />
<br />
The following dependency key could be used when the add-on needs the ''Imperial_Era'' and ''Era_of_Myths'' to be installed before it will work properly:<br />
<br />
dependencies=Imperial_Era,Era_of_Myths<br />
<br />
=== Version Key Examples ===<br />
<br />
The following are examples of '''good''' version values:<br />
<br />
version="1.5"<br />
<br />
version="0.11.4"<br />
<br />
version="0.1.4beta"<br />
<br />
version="1.5c"<br />
<br />
<br />
The following are examples of '''bad''' version values:<br />
<br />
version="Beta1.5"<br />
<br />
version="Incomplete (0.3.4)"<br />
<br />
In both of the above examples the version number as read by the server will be '''0.0.0Beta1.5''' and '''0.0.0Incomplete (0.3.4)'''. You can clearly see why this will not be a good thing with the ''Update add-ons'' feature.<br />
<br />
<br />
Finally, here are some example version numbers and how they will be interpreted by the ''Update add-ons'' button. The number on the left will be considered an earlier number than the number on the right in each example.<br />
<br />
0.5 < 1.0<br />
<br />
1.5 < 1.5c<br />
<br />
1.0 < 1.0.1<br />
<br />
1.0c < 1.0.1a<br />
<br />
1.0.1a < 1.0.1c<br />
<br />
1.0 Final < 1.0.1 Beta<br />
<br />
=== Example .pbl File ===<br />
<br />
title="My Campaign"<br />
type="campaign"<br />
icon="misc/ball.png"<br />
version="0.1.2"<br />
author="Me, artwork by myself"<br />
passphrase="This is like a password; see the security note in the documentation above before choosing a value of your own"<br />
description="You get to kill a lot of bad guys. But only the first map is done."<br />
email="name@example.com"<br />
# The following tag is only used by Wesnoth 1.11.8 and later!<br />
[feedback]<br />
topic_id=12345<br />
[/feedback]<br />
<br />
== See Also ==<br />
<br />
* [[ReferenceWML]]<br />
* [[BuildingCampaignsThePBLFile]]<br />
* [[CampaignServerWML]]<br />
<br />
[[Category: WML Reference]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Advanced_Optimisations_and_Hacks&diff=52672Advanced Optimisations and Hacks2013-12-20T09:36:27Z<p>Dugi: /* Many common events in scenarios */ Fixed a small error</p>
<hr />
<div>From time to time, especially if working with some advanced WML, you will come to need things that WML does not support. And you might be in a bad need to do that. This isn't a tricky of using WML, it is actually doing what the developers didn't plan to support. I have mostly used it to write much more effective codes at the cost of low understandability.<br />
<br />
Note: This article was written supposing that you are skilled with WML. It is expected that you know most WML tags, comprehend the contents of save files and have good understanding of variables and variable arrays in WML (not all of them are required by each of these). It is also assuming that you've read Dunno's article about [[Wml_optimisation]], and did these things before trying ''these'' optimisations.<br />
<br />
<br />
== Many common events in scenarios ==<br />
This trick is useful if your (multiple) scenarios contain a lot of common WML. This happens if your campaign adds some additional functionality, like inventories. It might be also useful if you are using repetitive macros that fire the same events. Or when you need to add event-based weapon specials with [object]s and therefore need to insert these events into all scenarios and not into the unit via macros using unbalanced WML (as it is usually done). It might be even useful if you have a lot of death message events.<br />
<br />
The problem that comes from using the same WML events in many scenario is that they are preprocessed and loaded into RAM once for each scenario, and it can be dozens of times, resulting in huge RAM consumption and annoying loading times. This tricks inserts in through a unit so that it is loaded only once. Its downside is that prestart events can't be loaded this way, but start events can set up pretty much anything, they are fired before you see the scenario.<br />
<br />
First, create a dummy unit like this:<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST}<br />
[/unit_type]<br />
The {GLOBAL_EVENTS_LIST} macro contains all the events you want to insert into all scenarios. This thick is only useful if the list is very long. Example (too short to be worth using this hack, but it is a working example):<br />
#define GLOBAL_EVENTS_LIST<br />
[event]<br />
# This events gives traits to all ally/enemy leaders (single player is expected)<br />
name=start<br />
[store_unit]<br />
canrecruit=yes<br />
[not]<br />
side=1<br />
[/not]<br />
variable=leaders<br />
kill=yes<br />
[/store_unit]<br />
{FOREACH leaders i}<br />
[unit]<br />
id=$leaders[$i].id<br />
name=$leaders[$i].name<br />
gender=$leaders[$i].gender<br />
x=$leaders[$i].x<br />
y=$leaders[$i].y<br />
side=$leaders[$i].side<br />
random_traits=yes<br />
canrecruit=yes<br />
[/unit]<br />
{NEXT i}<br />
{CLEAR_VARIABLE leaders}<br />
[/event]<br />
[event]<br />
# This makes petrification last only for a single turn<br />
name=turn refresh<br />
first_time_only=no<br />
[modify_unit]<br />
[filter]<br />
side=$side_number<br />
[filter_wml]<br />
[status]<br />
petrified=yes<br />
[/status]<br />
[/filter_wml]<br />
[/filter]<br />
[status]<br />
petrified=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
#enddef<br />
<br />
Now, we need to add the events in the unit into the scenario. It is trivial. Keep on mind that it means that only start events can be loaded this way, prestart events will be loaded, but will never be fired. It is useful to wrap it in a macro so that only one line makes it load. Because it disappears in prestart, it does not clear shroud for the player.<br />
#define GLOBAL_EVENTS<br />
[event]<br />
name=prestart<br />
[unit]<br />
type=Event Loader<br />
side=1<br />
x,y=1,1<br />
[/unit]<br />
[kill]<br />
type=Event Loader<br />
animate=no<br />
[/kill]<br />
[/event]<br />
#enddef<br />
This should be placed in all events. If you need to control your events with some variables it will check, it might be useful to use them as arguments for this macro and set them in the event.<br />
<br />
There is also a way to do it without touching the scenarios at all, but its use in multiplayer is severely limited. It is based on lua, which is always executed when the scenario is loaded (even if it is in the middle from a save file, because lua environment isn't saved), and can be later accessed only by defining new WML tags or event hooks. Placing this into your _main (inside the campaign's #ifdef wraps, to avoid hacking other campaigns!).<br />
#ifdef CAMPAIGN_YOUR_AWESOME_CAMPAIGN<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ type = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
#endif<br />
<br />
== Getting rid of AMLA clutter ==<br />
This is almost required when a unit has too many AMLA options. Because of AMLA, the unit's can become extremely long, and the game will keep reading through it again and again and again and again, resulting in visible FPS drops when the unit is on the screen. If there are more units like this, it will get even more painful, because the save files will become excessively large, needing seconds to be created.<br />
<br />
The trick is based on the fact that units' AMLA is irrelevant all the time, and is used only when it advances. Because of it, you can somehow remove all the [advancement] tags from the unit for most of the time. This is easier said than done, though. The number 1 problem is that if you classically store the unit, remove the [advancement] tags simply with {CLEAR_VARIABLE stored_unit.advancement} and unstore it, it will do ''nothing at all''. When a unit is unstored, [advancement]s are read from the unit_type, and not from the actual variable! There are alternatives to [unstore_unit], simplest of them is [insert_tag] with name=unit (which does almost the same, but for example doesn't check if the unit has enough experience to advance). But here comes another bummer - many WML tags' lua implementations use unstore_unit (harm_unit, transform_unit and modify_unit), and even if we simply avoided using them, unstore_unit is too useful to avoid using it (and refactoring the whole code).<br />
<br />
There is a solution, of course. You can create an additional unit_type. One unit_type that is played all the time and has only one dummy AMLA (because we want it to show the experience bar and advance to nothing, I will call it dummy_amla), usable really a lot of times, and then another unit_type, let's call it advancing_unit_type, that uses the first unit_type as base unit, but contains all the AMLA options we want. Then we create events to transform between the unit types when advancing. This has some odd consequences, but they can be exploited.<br />
<br />
Unfortunately, when I discovered the secrets behind this and wrote about them, the developers decided that it wasn't the intended behaviour and changed it in wesnoth 1.11.1 (and it is changed in all later versions of the 1.11 branch). There are four more problems to face - first is that when a unit advances, it shows the advancement window before the advance event is fired, second is that all changes done to the unit in an advance event are discarded, third is that there is no way to make the player choose an advancement if it isn't his turn ([unstore_unit] chooses a random one even in singleplayer and I think this wasn't fixed yet) and the fourth one is that if the advancing is activated by [unstore_unit], it may call the advance and post advance events again (it somehow doesn't loop, fortunately).<br />
<br />
I am not writing the exact code because it would be too long and chaotic, but writing a pseudocode describes the steps.<br />
<br />
Note: recreate unit means using the [unit] tag with all relevant properties of the unit that is sort of unstored by this, like name, id, location, canrecruit, gender, experience, unrenamable etc, as well as modifications, variables and status via insert_tag - it is similar to unstore, but will recalculate its other properties like attacks, damage, maximum hitpoints, resistances, abilities and so on.<br />
<br />
The advance event:<br />
if unit.advancement.id=dummy_amla then<br />
# now we know if the unit has to be transformed or not<br />
if unit.side=$side_number<br />
# if it isn't the units' turn, we will deal with it later<br />
kill unit fire_event=no animate=no<br />
full_heal, clear_statuses<br />
set_variable amla_processing yes<br />
set_variables advancing_store unit<br />
else<br />
clear_statuses<br />
# edit the unit so that it is created with the new unit_type and advancements and thrown right into a variable<br />
set_variable unit.type advancing_$unit_type<br />
set_variable unit.to_variable advancing_store<br />
# recreate it with a new unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
# clean up some stuff<br />
set_variables advancing_store.modifications unit.modifications<br />
set_variable advancing_store.experience unit.experience<br />
set_variable advancing_store.achieved_amla yes<br />
end<br />
#ifver WESNOTH_VERSION >= 1.11.1<br />
fire_event post advance on the unit<br />
#endif<br />
end<br />
<br />
The post advance event basically just unstores the unit from the advancing_store variable. Expanding it with more things you might need should be done here (it may cause problems that might have different solutions before and after 1.11.1).<br />
<br />
If implemented correctly, it does what is it supposed to do, but more problems come - we haven't solved advancing if it is not the unit's turn. It will have to be delayed until the start of the unit's turn. These units were marked by setting their variable named amla_processing to yes. At turn refresh, fire the following event on all that side's units that have that variable set to yes. Pseudocode again:<br />
[event]<br />
name=respecialisation<br />
first_time_only=no<br />
# count how many times it has taken the dummy_amla<br />
set_variable times_advanced 0<br />
foreach unit.modifications.advance<br />
if unit.modifications.advance.id=dummy_amla<br />
variable_op times_advanced add 1<br />
end<br />
repeat this as many times as the number in times_advanced is<br />
variable_op unit.experience $unit.max_experience<br />
clear_variable unit.variables.amla_processing<br />
set_variable unit.type <br />
set_variable unit.type advancing_$unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
end<br />
# you might want to fire the post advance event here<br />
[/event]<br />
<br />
<br />
== Handling many non-disjunctive possibilities ==<br />
Sometimes, especially when working with inventories, you will come to need this. You have 100 possible items (or they might be something else if not used to create an inventory). You want the game to choose one when they are dropping and you want to show exactly those the unit currently has in a message's options (to let the player manipulate them). Some manipulation would require a huge [switch] and another one would require countless [show_if] tags. This can be done very comfortably if you use a variable as a database.<br />
<br />
The database variable is just created with something like this:<br />
[set_variables]<br />
name=items<br />
[value]<br />
[object]<br />
name= _ "Leather Armour"<br />
required_strength=20<br />
image=items/armour-leather.png<br />
description= _ "This armour makes the user 20% more resistant to damage."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-20<br />
blade=-20<br />
pierce=-20<br />
[/resistances]<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Chain Armour"<br />
required_strength=20<br />
image=items/armour-chain.png<br />
description= _ "This armour makes the user 30% more resistant to damage, but slows down slightly."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-30<br />
blade=-30<br />
pierce=-30<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-1<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Steel Plate Armour"<br />
required_strength=20<br />
image=items/armour-plate.png<br />
description= _ "This armour makes the user 40% more resistant to damage, but slows down."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-40<br />
blade=-40<br />
pierce=-40<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-2<br />
[/effect]<br />
[/object]<br />
#... This would be useless if there were only 3 of them<br />
[/value]<br />
[/set_variables]<br />
<br />
To randomly drop one of them, just choose a random number between 0 and 2 like {SET_VARIABLE rand rand 0..2}, then draw the picture $items.object[$rand].image and then create a moveto event (nested event with delayed_variable_substitution=no) on that hex that if a player steps on it, a it sets a variable informing about the item type being picked and fires a pickup event on that unit. The pickup event is fireable more than once, and basically does this:<br />
[insert_tag]<br />
name=object<br />
variable=items.object[$item_type_being_picked]<br />
[/insert_tag]<br />
<br />
When the inventory is viewed, we can avoid having to use [show_if] for all possible items, we just read what is inside the unit (or look it up in the items variable array). The message can be composed in a variable and then asked via insert_tag.<br />
{VARIABLE message.message "Which item do you want to manipulate?"}<br />
{FOREACH unit.modifications.object i}<br />
[set_variables]<br />
name=message.option[$message.option.length]<br />
[value]<br />
message="&$unit.modifications.object[$i].image $unit.modifications.object[$i].name|:<br />
$unit.modifications.object[$i].description"<br />
[command]<br />
[set_variables]<br />
name=item_chosen<br />
to_variable=unit.modifications.object[$i]<br />
[/set_variables]<br />
[/command]<br />
[/value]<br />
[/set_variables]<br />
{NEXT i}<br />
[insert_tag]<br />
name=message<br />
variable=message<br />
[/insert_tag]<br />
Then the properties of the object chosen will be in a variable named item_chosen.<br />
<br />
<br />
== Hacking events into other campaigns ==<br />
This is the most dangerous trick, but it lets you make an add-on that mods the game - you can easily give inventories to mainline campaigns (without editing them at all), remove all randomness from campaigns, create a dungeonmaster kit for multiplayer survivals (without editing these survivals), change the general balance... possibilities are unlimited.<br />
<br />
It is wholly based on the repetitive scenario events optimisation mentioned above in this article. It allows you to add events into scenarios, without actually editing the scenarios. If you don't protect it by any #ifdef, it will affect all scenarios! This is usually the best way to get kicked in the butt by other add-on writers, but in this case, you'll have to make it carefully and with the knowledge that it will affect all scenarios in all campaigns (or just some, you can wrap it in #ifndef MULTIPLAYER if you want it to be singleplayer-only).<br />
<br />
Like before, we place these events into a unit_type, and create and kill at at the beginning of the scenario. If done by lua in _main, it will be inserted in any case.<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
#It's however suggested to name it differently to avoid conflicts with other add-ons of a similar type<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST} # This is your magical collection of events. Should be mostly start, prerecruit and turn refresh events.<br />
[/unit_type]<br />
<br />
Then insert it using lua.<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ type = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
<br />
An add-on named No Randomness mod uses this, although it is entirely written in lua, you might want to see it to know more possible combinations around customising the mod, but it will require you to know lua.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Advanced_Optimisations_and_Hacks&diff=52657Advanced Optimisations and Hacks2013-12-19T21:34:34Z<p>Dugi: /* Hacking events into other campaigns */ Added a small note, fixed a minor and quite obvious error.</p>
<hr />
<div>From time to time, especially if working with some advanced WML, you will come to need things that WML does not support. And you might be in a bad need to do that. This isn't a tricky of using WML, it is actually doing what the developers didn't plan to support. I have mostly used it to write much more effective codes at the cost of low understandability.<br />
<br />
Note: This article was written supposing that you are skilled with WML. It is expected that you know most WML tags, comprehend the contents of save files and have good understanding of variables and variable arrays in WML (not all of them are required by each of these). It is also assuming that you've read Dunno's article about [[Wml_optimisation]], and did these things before trying ''these'' optimisations.<br />
<br />
<br />
== Many common events in scenarios ==<br />
This trick is useful if your (multiple) scenarios contain a lot of common WML. This happens if your campaign adds some additional functionality, like inventories. It might be also useful if you are using repetitive macros that fire the same events. Or when you need to add event-based weapon specials with [object]s and therefore need to insert these events into all scenarios and not into the unit via macros using unbalanced WML (as it is usually done). It might be even useful if you have a lot of death message events.<br />
<br />
The problem that comes from using the same WML events in many scenario is that they are preprocessed and loaded into RAM once for each scenario, and it can be dozens of times, resulting in huge RAM consumption and annoying loading times. This tricks inserts in through a unit so that it is loaded only once. Its downside is that prestart events can't be loaded this way, but start events can set up pretty much anything, they are fired before you see the scenario.<br />
<br />
First, create a dummy unit like this:<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST}<br />
[/unit_type]<br />
The {GLOBAL_EVENTS_LIST} macro contains all the events you want to insert into all scenarios. This thick is only useful if the list is very long. Example (too short to be worth using this hack, but it is a working example):<br />
#define GLOBAL_EVENTS_LIST<br />
[event]<br />
# This events gives traits to all ally/enemy leaders (single player is expected)<br />
name=start<br />
[store_unit]<br />
canrecruit=yes<br />
[not]<br />
side=1<br />
[/not]<br />
variable=leaders<br />
kill=yes<br />
[/store_unit]<br />
{FOREACH leaders i}<br />
[unit]<br />
id=$leaders[$i].id<br />
name=$leaders[$i].name<br />
gender=$leaders[$i].gender<br />
x=$leaders[$i].x<br />
y=$leaders[$i].y<br />
side=$leaders[$i].side<br />
random_traits=yes<br />
canrecruit=yes<br />
[/unit]<br />
{NEXT i}<br />
{CLEAR_VARIABLE leaders}<br />
[/event]<br />
[event]<br />
# This makes petrification last only for a single turn<br />
name=turn refresh<br />
first_time_only=no<br />
[modify_unit]<br />
[filter]<br />
side=$side_number<br />
[filter_wml]<br />
[status]<br />
petrified=yes<br />
[/status]<br />
[/filter_wml]<br />
[/filter]<br />
[status]<br />
petrified=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
#enddef<br />
<br />
Now, we need to add the events in the unit into the scenario. It is trivial. Keep on mind that it means that only start events can be loaded this way, prestart events will be loaded, but will never be fired. It is useful to wrap it in a macro so that only one line makes it load. Because it disappears in prestart, it does not clear shroud for the player.<br />
#define GLOBAL_EVENTS<br />
[event]<br />
name=prestart<br />
[unit]<br />
type=Event Loader<br />
side=1<br />
x,y=1,1<br />
[/unit]<br />
[kill]<br />
type=Event Loader<br />
animate=no<br />
[/kill]<br />
[/event]<br />
#enddef<br />
This should be placed in all events. If you need to control your events with some variables it will check, it might be useful to use them as arguments for this macro and set them in the event.<br />
<br />
There is also a way to do it without touching the scenarios at all, but its use in multiplayer is severely limited. It is based on lua, which is always executed when the scenario is loaded (even if it is in the middle from a save file, because lua environment isn't saved), and can be later accessed only by defining new WML tags or event hooks. Placing this into your _main (inside the campaign's #ifdef wraps, to avoid hacking other campaigns!).<br />
#ifdef CAMPAIGN_YOUR_AWESOME_CAMPAIGN<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ id = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
#endif<br />
<br />
== Getting rid of AMLA clutter ==<br />
This is almost required when a unit has too many AMLA options. Because of AMLA, the unit's can become extremely long, and the game will keep reading through it again and again and again and again, resulting in visible FPS drops when the unit is on the screen. If there are more units like this, it will get even more painful, because the save files will become excessively large, needing seconds to be created.<br />
<br />
The trick is based on the fact that units' AMLA is irrelevant all the time, and is used only when it advances. Because of it, you can somehow remove all the [advancement] tags from the unit for most of the time. This is easier said than done, though. The number 1 problem is that if you classically store the unit, remove the [advancement] tags simply with {CLEAR_VARIABLE stored_unit.advancement} and unstore it, it will do ''nothing at all''. When a unit is unstored, [advancement]s are read from the unit_type, and not from the actual variable! There are alternatives to [unstore_unit], simplest of them is [insert_tag] with name=unit (which does almost the same, but for example doesn't check if the unit has enough experience to advance). But here comes another bummer - many WML tags' lua implementations use unstore_unit (harm_unit, transform_unit and modify_unit), and even if we simply avoided using them, unstore_unit is too useful to avoid using it (and refactoring the whole code).<br />
<br />
There is a solution, of course. You can create an additional unit_type. One unit_type that is played all the time and has only one dummy AMLA (because we want it to show the experience bar and advance to nothing, I will call it dummy_amla), usable really a lot of times, and then another unit_type, let's call it advancing_unit_type, that uses the first unit_type as base unit, but contains all the AMLA options we want. Then we create events to transform between the unit types when advancing. This has some odd consequences, but they can be exploited.<br />
<br />
Unfortunately, when I discovered the secrets behind this and wrote about them, the developers decided that it wasn't the intended behaviour and changed it in wesnoth 1.11.1 (and it is changed in all later versions of the 1.11 branch). There are four more problems to face - first is that when a unit advances, it shows the advancement window before the advance event is fired, second is that all changes done to the unit in an advance event are discarded, third is that there is no way to make the player choose an advancement if it isn't his turn ([unstore_unit] chooses a random one even in singleplayer and I think this wasn't fixed yet) and the fourth one is that if the advancing is activated by [unstore_unit], it may call the advance and post advance events again (it somehow doesn't loop, fortunately).<br />
<br />
I am not writing the exact code because it would be too long and chaotic, but writing a pseudocode describes the steps.<br />
<br />
Note: recreate unit means using the [unit] tag with all relevant properties of the unit that is sort of unstored by this, like name, id, location, canrecruit, gender, experience, unrenamable etc, as well as modifications, variables and status via insert_tag - it is similar to unstore, but will recalculate its other properties like attacks, damage, maximum hitpoints, resistances, abilities and so on.<br />
<br />
The advance event:<br />
if unit.advancement.id=dummy_amla then<br />
# now we know if the unit has to be transformed or not<br />
if unit.side=$side_number<br />
# if it isn't the units' turn, we will deal with it later<br />
kill unit fire_event=no animate=no<br />
full_heal, clear_statuses<br />
set_variable amla_processing yes<br />
set_variables advancing_store unit<br />
else<br />
clear_statuses<br />
# edit the unit so that it is created with the new unit_type and advancements and thrown right into a variable<br />
set_variable unit.type advancing_$unit_type<br />
set_variable unit.to_variable advancing_store<br />
# recreate it with a new unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
# clean up some stuff<br />
set_variables advancing_store.modifications unit.modifications<br />
set_variable advancing_store.experience unit.experience<br />
set_variable advancing_store.achieved_amla yes<br />
end<br />
#ifver WESNOTH_VERSION >= 1.11.1<br />
fire_event post advance on the unit<br />
#endif<br />
end<br />
<br />
The post advance event basically just unstores the unit from the advancing_store variable. Expanding it with more things you might need should be done here (it may cause problems that might have different solutions before and after 1.11.1).<br />
<br />
If implemented correctly, it does what is it supposed to do, but more problems come - we haven't solved advancing if it is not the unit's turn. It will have to be delayed until the start of the unit's turn. These units were marked by setting their variable named amla_processing to yes. At turn refresh, fire the following event on all that side's units that have that variable set to yes. Pseudocode again:<br />
[event]<br />
name=respecialisation<br />
first_time_only=no<br />
# count how many times it has taken the dummy_amla<br />
set_variable times_advanced 0<br />
foreach unit.modifications.advance<br />
if unit.modifications.advance.id=dummy_amla<br />
variable_op times_advanced add 1<br />
end<br />
repeat this as many times as the number in times_advanced is<br />
variable_op unit.experience $unit.max_experience<br />
clear_variable unit.variables.amla_processing<br />
set_variable unit.type <br />
set_variable unit.type advancing_$unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
end<br />
# you might want to fire the post advance event here<br />
[/event]<br />
<br />
<br />
== Handling many non-disjunctive possibilities ==<br />
Sometimes, especially when working with inventories, you will come to need this. You have 100 possible items (or they might be something else if not used to create an inventory). You want the game to choose one when they are dropping and you want to show exactly those the unit currently has in a message's options (to let the player manipulate them). Some manipulation would require a huge [switch] and another one would require countless [show_if] tags. This can be done very comfortably if you use a variable as a database.<br />
<br />
The database variable is just created with something like this:<br />
[set_variables]<br />
name=items<br />
[value]<br />
[object]<br />
name= _ "Leather Armour"<br />
required_strength=20<br />
image=items/armour-leather.png<br />
description= _ "This armour makes the user 20% more resistant to damage."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-20<br />
blade=-20<br />
pierce=-20<br />
[/resistances]<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Chain Armour"<br />
required_strength=20<br />
image=items/armour-chain.png<br />
description= _ "This armour makes the user 30% more resistant to damage, but slows down slightly."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-30<br />
blade=-30<br />
pierce=-30<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-1<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Steel Plate Armour"<br />
required_strength=20<br />
image=items/armour-plate.png<br />
description= _ "This armour makes the user 40% more resistant to damage, but slows down."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-40<br />
blade=-40<br />
pierce=-40<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-2<br />
[/effect]<br />
[/object]<br />
#... This would be useless if there were only 3 of them<br />
[/value]<br />
[/set_variables]<br />
<br />
To randomly drop one of them, just choose a random number between 0 and 2 like {SET_VARIABLE rand rand 0..2}, then draw the picture $items.object[$rand].image and then create a moveto event (nested event with delayed_variable_substitution=no) on that hex that if a player steps on it, a it sets a variable informing about the item type being picked and fires a pickup event on that unit. The pickup event is fireable more than once, and basically does this:<br />
[insert_tag]<br />
name=object<br />
variable=items.object[$item_type_being_picked]<br />
[/insert_tag]<br />
<br />
When the inventory is viewed, we can avoid having to use [show_if] for all possible items, we just read what is inside the unit (or look it up in the items variable array). The message can be composed in a variable and then asked via insert_tag.<br />
{VARIABLE message.message "Which item do you want to manipulate?"}<br />
{FOREACH unit.modifications.object i}<br />
[set_variables]<br />
name=message.option[$message.option.length]<br />
[value]<br />
message="&$unit.modifications.object[$i].image $unit.modifications.object[$i].name|:<br />
$unit.modifications.object[$i].description"<br />
[command]<br />
[set_variables]<br />
name=item_chosen<br />
to_variable=unit.modifications.object[$i]<br />
[/set_variables]<br />
[/command]<br />
[/value]<br />
[/set_variables]<br />
{NEXT i}<br />
[insert_tag]<br />
name=message<br />
variable=message<br />
[/insert_tag]<br />
Then the properties of the object chosen will be in a variable named item_chosen.<br />
<br />
<br />
== Hacking events into other campaigns ==<br />
This is the most dangerous trick, but it lets you make an add-on that mods the game - you can easily give inventories to mainline campaigns (without editing them at all), remove all randomness from campaigns, create a dungeonmaster kit for multiplayer survivals (without editing these survivals), change the general balance... possibilities are unlimited.<br />
<br />
It is wholly based on the repetitive scenario events optimisation mentioned above in this article. It allows you to add events into scenarios, without actually editing the scenarios. If you don't protect it by any #ifdef, it will affect all scenarios! This is usually the best way to get kicked in the butt by other add-on writers, but in this case, you'll have to make it carefully and with the knowledge that it will affect all scenarios in all campaigns (or just some, you can wrap it in #ifndef MULTIPLAYER if you want it to be singleplayer-only).<br />
<br />
Like before, we place these events into a unit_type, and create and kill at at the beginning of the scenario. If done by lua in _main, it will be inserted in any case.<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
#It's however suggested to name it differently to avoid conflicts with other add-ons of a similar type<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST} # This is your magical collection of events. Should be mostly start, prerecruit and turn refresh events.<br />
[/unit_type]<br />
<br />
Then insert it using lua.<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ type = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
<br />
An add-on named No Randomness mod uses this, although it is entirely written in lua, you might want to see it to know more possible combinations around customising the mod, but it will require you to know lua.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Advanced_Optimisations_and_Hacks&diff=52656Advanced Optimisations and Hacks2013-12-19T21:07:48Z<p>Dugi: /* Hacking events into other campaigns */</p>
<hr />
<div>From time to time, especially if working with some advanced WML, you will come to need things that WML does not support. And you might be in a bad need to do that. This isn't a tricky of using WML, it is actually doing what the developers didn't plan to support. I have mostly used it to write much more effective codes at the cost of low understandability.<br />
<br />
Note: This article was written supposing that you are skilled with WML. It is expected that you know most WML tags, comprehend the contents of save files and have good understanding of variables and variable arrays in WML (not all of them are required by each of these). It is also assuming that you've read Dunno's article about [[Wml_optimisation]], and did these things before trying ''these'' optimisations.<br />
<br />
<br />
== Many common events in scenarios ==<br />
This trick is useful if your (multiple) scenarios contain a lot of common WML. This happens if your campaign adds some additional functionality, like inventories. It might be also useful if you are using repetitive macros that fire the same events. Or when you need to add event-based weapon specials with [object]s and therefore need to insert these events into all scenarios and not into the unit via macros using unbalanced WML (as it is usually done). It might be even useful if you have a lot of death message events.<br />
<br />
The problem that comes from using the same WML events in many scenario is that they are preprocessed and loaded into RAM once for each scenario, and it can be dozens of times, resulting in huge RAM consumption and annoying loading times. This tricks inserts in through a unit so that it is loaded only once. Its downside is that prestart events can't be loaded this way, but start events can set up pretty much anything, they are fired before you see the scenario.<br />
<br />
First, create a dummy unit like this:<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST}<br />
[/unit_type]<br />
The {GLOBAL_EVENTS_LIST} macro contains all the events you want to insert into all scenarios. This thick is only useful if the list is very long. Example (too short to be worth using this hack, but it is a working example):<br />
#define GLOBAL_EVENTS_LIST<br />
[event]<br />
# This events gives traits to all ally/enemy leaders (single player is expected)<br />
name=start<br />
[store_unit]<br />
canrecruit=yes<br />
[not]<br />
side=1<br />
[/not]<br />
variable=leaders<br />
kill=yes<br />
[/store_unit]<br />
{FOREACH leaders i}<br />
[unit]<br />
id=$leaders[$i].id<br />
name=$leaders[$i].name<br />
gender=$leaders[$i].gender<br />
x=$leaders[$i].x<br />
y=$leaders[$i].y<br />
side=$leaders[$i].side<br />
random_traits=yes<br />
canrecruit=yes<br />
[/unit]<br />
{NEXT i}<br />
{CLEAR_VARIABLE leaders}<br />
[/event]<br />
[event]<br />
# This makes petrification last only for a single turn<br />
name=turn refresh<br />
first_time_only=no<br />
[modify_unit]<br />
[filter]<br />
side=$side_number<br />
[filter_wml]<br />
[status]<br />
petrified=yes<br />
[/status]<br />
[/filter_wml]<br />
[/filter]<br />
[status]<br />
petrified=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
#enddef<br />
<br />
Now, we need to add the events in the unit into the scenario. It is trivial. Keep on mind that it means that only start events can be loaded this way, prestart events will be loaded, but will never be fired. It is useful to wrap it in a macro so that only one line makes it load. Because it disappears in prestart, it does not clear shroud for the player.<br />
#define GLOBAL_EVENTS<br />
[event]<br />
name=prestart<br />
[unit]<br />
type=Event Loader<br />
side=1<br />
x,y=1,1<br />
[/unit]<br />
[kill]<br />
type=Event Loader<br />
animate=no<br />
[/kill]<br />
[/event]<br />
#enddef<br />
This should be placed in all events. If you need to control your events with some variables it will check, it might be useful to use them as arguments for this macro and set them in the event.<br />
<br />
There is also a way to do it without touching the scenarios at all, but its use in multiplayer is severely limited. It is based on lua, which is always executed when the scenario is loaded (even if it is in the middle from a save file, because lua environment isn't saved), and can be later accessed only by defining new WML tags or event hooks. Placing this into your _main (inside the campaign's #ifdef wraps, to avoid hacking other campaigns!).<br />
#ifdef CAMPAIGN_YOUR_AWESOME_CAMPAIGN<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ id = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
#endif<br />
<br />
== Getting rid of AMLA clutter ==<br />
This is almost required when a unit has too many AMLA options. Because of AMLA, the unit's can become extremely long, and the game will keep reading through it again and again and again and again, resulting in visible FPS drops when the unit is on the screen. If there are more units like this, it will get even more painful, because the save files will become excessively large, needing seconds to be created.<br />
<br />
The trick is based on the fact that units' AMLA is irrelevant all the time, and is used only when it advances. Because of it, you can somehow remove all the [advancement] tags from the unit for most of the time. This is easier said than done, though. The number 1 problem is that if you classically store the unit, remove the [advancement] tags simply with {CLEAR_VARIABLE stored_unit.advancement} and unstore it, it will do ''nothing at all''. When a unit is unstored, [advancement]s are read from the unit_type, and not from the actual variable! There are alternatives to [unstore_unit], simplest of them is [insert_tag] with name=unit (which does almost the same, but for example doesn't check if the unit has enough experience to advance). But here comes another bummer - many WML tags' lua implementations use unstore_unit (harm_unit, transform_unit and modify_unit), and even if we simply avoided using them, unstore_unit is too useful to avoid using it (and refactoring the whole code).<br />
<br />
There is a solution, of course. You can create an additional unit_type. One unit_type that is played all the time and has only one dummy AMLA (because we want it to show the experience bar and advance to nothing, I will call it dummy_amla), usable really a lot of times, and then another unit_type, let's call it advancing_unit_type, that uses the first unit_type as base unit, but contains all the AMLA options we want. Then we create events to transform between the unit types when advancing. This has some odd consequences, but they can be exploited.<br />
<br />
Unfortunately, when I discovered the secrets behind this and wrote about them, the developers decided that it wasn't the intended behaviour and changed it in wesnoth 1.11.1 (and it is changed in all later versions of the 1.11 branch). There are four more problems to face - first is that when a unit advances, it shows the advancement window before the advance event is fired, second is that all changes done to the unit in an advance event are discarded, third is that there is no way to make the player choose an advancement if it isn't his turn ([unstore_unit] chooses a random one even in singleplayer and I think this wasn't fixed yet) and the fourth one is that if the advancing is activated by [unstore_unit], it may call the advance and post advance events again (it somehow doesn't loop, fortunately).<br />
<br />
I am not writing the exact code because it would be too long and chaotic, but writing a pseudocode describes the steps.<br />
<br />
Note: recreate unit means using the [unit] tag with all relevant properties of the unit that is sort of unstored by this, like name, id, location, canrecruit, gender, experience, unrenamable etc, as well as modifications, variables and status via insert_tag - it is similar to unstore, but will recalculate its other properties like attacks, damage, maximum hitpoints, resistances, abilities and so on.<br />
<br />
The advance event:<br />
if unit.advancement.id=dummy_amla then<br />
# now we know if the unit has to be transformed or not<br />
if unit.side=$side_number<br />
# if it isn't the units' turn, we will deal with it later<br />
kill unit fire_event=no animate=no<br />
full_heal, clear_statuses<br />
set_variable amla_processing yes<br />
set_variables advancing_store unit<br />
else<br />
clear_statuses<br />
# edit the unit so that it is created with the new unit_type and advancements and thrown right into a variable<br />
set_variable unit.type advancing_$unit_type<br />
set_variable unit.to_variable advancing_store<br />
# recreate it with a new unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
# clean up some stuff<br />
set_variables advancing_store.modifications unit.modifications<br />
set_variable advancing_store.experience unit.experience<br />
set_variable advancing_store.achieved_amla yes<br />
end<br />
#ifver WESNOTH_VERSION >= 1.11.1<br />
fire_event post advance on the unit<br />
#endif<br />
end<br />
<br />
The post advance event basically just unstores the unit from the advancing_store variable. Expanding it with more things you might need should be done here (it may cause problems that might have different solutions before and after 1.11.1).<br />
<br />
If implemented correctly, it does what is it supposed to do, but more problems come - we haven't solved advancing if it is not the unit's turn. It will have to be delayed until the start of the unit's turn. These units were marked by setting their variable named amla_processing to yes. At turn refresh, fire the following event on all that side's units that have that variable set to yes. Pseudocode again:<br />
[event]<br />
name=respecialisation<br />
first_time_only=no<br />
# count how many times it has taken the dummy_amla<br />
set_variable times_advanced 0<br />
foreach unit.modifications.advance<br />
if unit.modifications.advance.id=dummy_amla<br />
variable_op times_advanced add 1<br />
end<br />
repeat this as many times as the number in times_advanced is<br />
variable_op unit.experience $unit.max_experience<br />
clear_variable unit.variables.amla_processing<br />
set_variable unit.type <br />
set_variable unit.type advancing_$unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
end<br />
# you might want to fire the post advance event here<br />
[/event]<br />
<br />
<br />
== Handling many non-disjunctive possibilities ==<br />
Sometimes, especially when working with inventories, you will come to need this. You have 100 possible items (or they might be something else if not used to create an inventory). You want the game to choose one when they are dropping and you want to show exactly those the unit currently has in a message's options (to let the player manipulate them). Some manipulation would require a huge [switch] and another one would require countless [show_if] tags. This can be done very comfortably if you use a variable as a database.<br />
<br />
The database variable is just created with something like this:<br />
[set_variables]<br />
name=items<br />
[value]<br />
[object]<br />
name= _ "Leather Armour"<br />
required_strength=20<br />
image=items/armour-leather.png<br />
description= _ "This armour makes the user 20% more resistant to damage."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-20<br />
blade=-20<br />
pierce=-20<br />
[/resistances]<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Chain Armour"<br />
required_strength=20<br />
image=items/armour-chain.png<br />
description= _ "This armour makes the user 30% more resistant to damage, but slows down slightly."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-30<br />
blade=-30<br />
pierce=-30<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-1<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Steel Plate Armour"<br />
required_strength=20<br />
image=items/armour-plate.png<br />
description= _ "This armour makes the user 40% more resistant to damage, but slows down."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-40<br />
blade=-40<br />
pierce=-40<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-2<br />
[/effect]<br />
[/object]<br />
#... This would be useless if there were only 3 of them<br />
[/value]<br />
[/set_variables]<br />
<br />
To randomly drop one of them, just choose a random number between 0 and 2 like {SET_VARIABLE rand rand 0..2}, then draw the picture $items.object[$rand].image and then create a moveto event (nested event with delayed_variable_substitution=no) on that hex that if a player steps on it, a it sets a variable informing about the item type being picked and fires a pickup event on that unit. The pickup event is fireable more than once, and basically does this:<br />
[insert_tag]<br />
name=object<br />
variable=items.object[$item_type_being_picked]<br />
[/insert_tag]<br />
<br />
When the inventory is viewed, we can avoid having to use [show_if] for all possible items, we just read what is inside the unit (or look it up in the items variable array). The message can be composed in a variable and then asked via insert_tag.<br />
{VARIABLE message.message "Which item do you want to manipulate?"}<br />
{FOREACH unit.modifications.object i}<br />
[set_variables]<br />
name=message.option[$message.option.length]<br />
[value]<br />
message="&$unit.modifications.object[$i].image $unit.modifications.object[$i].name|:<br />
$unit.modifications.object[$i].description"<br />
[command]<br />
[set_variables]<br />
name=item_chosen<br />
to_variable=unit.modifications.object[$i]<br />
[/set_variables]<br />
[/command]<br />
[/value]<br />
[/set_variables]<br />
{NEXT i}<br />
[insert_tag]<br />
name=message<br />
variable=message<br />
[/insert_tag]<br />
Then the properties of the object chosen will be in a variable named item_chosen.<br />
<br />
<br />
== Hacking events into other campaigns ==<br />
This is the most dangerous trick, but it lets you make an add-on that mods the game - you can easily give inventories to mainline campaigns (without editing them at all), remove all randomness from campaigns, create a dungeonmaster kit for multiplayer survivals (without editing these survivals), change the general balance... possibilities are unlimited.<br />
<br />
It is wholly based on the repetitive scenario events optimisation mentioned above in this article. It allows you to add events into scenarios, without actually editing the scenarios. If you don't protect it by any #ifdef, it will affect all scenarios! This is usually the best way to get kicked in the butt by other add-on writers, but in this case, you'll have to make it carefully and with the knowledge that it will affect all scenarios in all campaigns (or just some, you can wrap it in #ifndef MULTIPLAYER if you want it to be singleplayer-only).<br />
<br />
Like before, we place these events into a unit_type, and create and kill at at the beginning of the scenario. If done by lua in _main, it will be inserted in any case.<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST} # This is your magical collection of events. Should be mostly start, prerecruit and turn refresh events.<br />
[/unit_type]<br />
<br />
Then insert it using lua.<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ type = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
<br />
An add-on named No Randomness mod uses this, although it is entirely written in lua, you might want to see it to know more possible combinations around customising the mod, but it will require you to know lua.</div>Dugihttps://wiki.wesnoth.org/index.php?title=UsefulWMLFragments&diff=52290UsefulWMLFragments2013-10-29T19:50:23Z<p>Dugi: /* Advanced WML */</p>
<hr />
<div>== Useful WML Fragments ==<br />
<br />
Most of the things found here are macros (see [[PreprocessorRef]]) that must be copied into a scenario file or another file included first by the campaign, and then used in the scenario (or multiplayer map). Remember that a macro cannot be used at a point before it is defined.<br />
<br />
'''Note: some of the code here is outdated or otherwise poor. It's not advisable to blindly copy-paste code from here and expect it to work on recent Wesnoth versions or assume that the recent versions don't support a simpler and less hacky way of doing the same thing.'''<br />
<br />
Some things '''not''' to do here:<br />
* Don't add macros that duplicate things in [http://www.wesnoth.org/macro-reference.xhtml the core macro library].<br />
* Don't add macros that are trivial syntax shortcuts.<br />
* Don't add macros that generate unbalanced syntax fragments.<br />
<br />
Try to avoid adding pages here. It is better to find a category in which your code fits and add it to that page.<br />
<br />
=== Logic Structure Macros ===<br />
*[[WML Utilities]]: Macros to assist other macros. Overlay with Filter. Determine Opposite Coordinates. Find nearest hex(es)<br />
<br />
=== Campaign Tools ===<br />
*[[AlternateToDWML]]: Macros for alternate time-of-day schemes, including per-hour time-of-day.<br />
<br />
==== RPG Tools ====<br />
*[[A Shop Like Thing]]: How to add even more RPG elements to your scenarios.<br />
*[[CutsceneWML]]: Fixed MOVE_TO event (uses FIND_NEARBY from [[WML Utilities]]), move + exit to recall list, define character dialogue and a "main character", grant unlimited moves.*<br />
*[[An effect that changes icons]]: Wanted to change some attack's icon when the unit took an object, but there was no set_icon variable accepted? This enables it!<br />
<br />
==== Music Tools ====<br />
*[[WML Musical Moods]]: Groups the Wesnoth music (as of 1.7.x) into "moods" and defines macros for playing randomly songs from these pools and for quickly switching music.<br />
<br />
==== Unit Tools ====<br />
*[[WML Abilities]]: Knockback. Charm. Bloodlust.<br />
<br />
==== Item Tools ====<br />
*[[DroppableItem]]: Macros to drop items. Currently only macros for dropping items on unit death including a permenant item that can be picked up, and dropped, multiple times by different units. Also a macro removing objects from units.<br />
*[[Removing Items]]: A macro that removes objects from a unit.<br />
<br />
==== Map Tools ====<br />
*[[FloodWML]]: Macros to create a flood of a certain terrain type spreading across the map.<br />
<br />
=== Advanced WML ===<br />
*[[Advanced WML]]: Store Reachable Locations.<br />
*[[Advanced Optimisations and Hacks]]: If you're coding something really complex, this might come handy<br />
<br />
=== Templates ===<br />
*[[WML Templates]]: Generic campaign, scenario and unit templates. <b>Obsolete; most of these won't work right.</b><br />
<br />
== See Also ==<br />
<br />
* [[ReferenceWML]]<br />
<br />
<br />
[[Category: UsefulWMLFragments|*]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Talk:UsefulWMLFragments&diff=52289Talk:UsefulWMLFragments2013-10-29T19:49:14Z<p>Dugi: /* Unbalanced syntax fragments */ new section</p>
<hr />
<div>I'm thinking that it would be good to have all pages linked also link back. It would also be good to add this page to the Category: WML, opinions? /tsr<br />
<br />
Henkutsu: That is my thoughts too. Also several of the pages are badly outdated. After getting so many errors in my scenarios from old code, I'm now going through the whole thing cleaning it up. I'm adding the links and may move bits to different pages.<br />
An example of the old code is the Random Traits stuff.<br />
<br />
== Unbalanced syntax fragments ==<br />
<br />
''Don't add macros that generate unbalanced syntax fragments.'' Is this rule really necessary? I find it rather limiting.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Wml_optimisation&diff=52288Wml optimisation2013-10-29T19:47:41Z<p>Dugi: /* Further reading */</p>
<hr />
<div>''Work in progress...''<br />
<br />
==The basics==<br />
<br />
===What you should know first===<br />
*[[PreprocessorRef#Preprocessor_directives|Macros]]<br />
*[[EventWML]]<br />
*[[EventWML#Custom_events|Custom events]]<br />
*[[ConditionalActionsWML#.5Bwhile.5D|While loops]]<br />
<br />
===How do I optimise my code?===<br />
<br />
So, you've written your campaign, scenario or era and it works. Congratulations, but your work is far from over! If your campaign or scenario is big enough, you'll often notice that it runs very slowly, and you need to do something about it. Or maybe you have a powerful computer and you'd like to make sure that other, weaker machines won't have troubles with running your content. Or perhaps, you just want to learn how to write code that not only works, but is also efficient.<br />
<br />
The first thing to know, since apparently it's not stressed enough, macros '''do not''' improve performance! Macros only make your code more readable and easier to maintain. Try to refrain from using big macros, and more importantly, avoid using macros inside macros (inside macros, inside macros... yes, I've seen it happen, and yes I've tried doing it myself when I was new to wml). Under the covers, WML macros are replaced by the code they represent, and if there are macros inside macros (especially big ones), lines of code multiply horribly fast.<br />
<br />
What's a better way to write code that appears often? ''Custom events''' and ''while loops''! By defining a '''custom event''', and firing it when needed, you'll save a lot of code lines, make your code nicer to read and much more efficient. Same goes for the '''while loop''': instead of copy/pasting your code, try to use a loop, whenever you can. Let's take a look at this example problem: whenever side 1 unit enters a village, you want to place 5 walking corpses around this village. Let's say there are 6 villages in question with coordinates (1,1), (2,2), (3,3), (4,4), (5,5), (6,6).<br />
<br />
====Inefficient example====<br />
<br />
#WARNING: this code was written on the run, and may not be 100% accurate<br />
#NOTE: remember, this should work alright, but it is not efficient! Imagine if you have much more villages in mind, or you want to spawn more zombies<br />
<br />
#define SPAWN_ZOMBIES X Y SIDE<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
#enddef<br />
<br />
[event]<br />
name=moveto<br />
[filter]<br />
side=1<br />
x,y=1,1<br />
[or]<br />
x,y=2,2<br />
[/or]<br />
[or]<br />
x,y=3,3<br />
[/or]<br />
[or]<br />
x,y=4,4<br />
[/or]<br />
[or]<br />
x,y=5,5<br />
[/or]<br />
[or]<br />
x,y=6,6<br />
[/or]<br />
[/filter]<br />
<br />
{SPAWN_ZOMBIES $unit.x $unit.y 2}<br />
[/event]<br />
<br />
Looks pretty innocent, right? But imagine that there are more villages. Or better yet, imagine you want to increase the amount of zombies, you'll have to copy/paste even more, and it's easy to make a mistake while doing it. <br />
<br />
====More efficient example====<br />
<br />
#first, let's define our custom event:<br />
[event]<br />
name=spawn_zombies<br />
first_time_only=no<br />
#it's easy to forget, but you have to set first_time_only in custom events too<br />
{VARIABLE i 0}<br />
[while]<br />
[variable]<br />
name=i<br />
less_than_equal_to=5<br />
#repeating the loop 5 times for 5 zombies, note how easy it is now to change the amount of zombies you want to spawn!<br />
[/variable]<br />
[do]<br />
[unit]<br />
side=2<br />
type=Walking Corpse<br />
x,y=$unit.x,$unit.y<br />
#unit variable is passed to this event from the parent event. <br />
placement=map_passable<br />
[unit]<br />
{VARIABLE_OP i add 1}<br />
[/do]<br />
[/while]<br />
{CLEAR_VARIABLE i}<br />
[/event]<br />
<br />
[event]<br />
name=moveto<br />
[filter]<br />
side=1<br />
x,y=1,1<br />
[or]<br />
x,y=2,2<br />
[/or]<br />
[or]<br />
x,y=3,3<br />
[/or]<br />
[or]<br />
x,y=4,4<br />
[/or]<br />
[or]<br />
x,y=5,5<br />
[/or]<br />
[or]<br />
x,y=6,6<br />
[/or]<br />
[/filter]<br />
<br />
[fire_event]<br />
name=spawn_zombies<br />
[/fire_event]<br />
[/event]<br />
<br />
===Fired events vs macros===<br />
<br />
But if ''fire events'' are so cool and efficient, what is the advantage of using ''macros''? Good question. As you can see, custom events have one issue: ''it's harder to set dynamic variables in fired events''. When defining macros, you specify arguments and those arguments are declared ''whenever we're using that macro'' and can be changed in any way you, and more importantly, someone else wants. Remember, that you might want to start a bigger project and invite someone to help you with the code. '''Macros are obvious and transparent in usage''' - when reading a macro definition you always know what is the changing variable and what is a constant. In custom events, it is not so obvious.<br />
<br />
Let's take a look at one of the default macros included with wesnoth:<br />
<br />
#define ABILITY_REGENERATES<br />
# Canned definition of the Regenerate ability to be included in an [abilities]<br />
# clause.<br />
[regenerate]<br />
value=8<br />
id=regenerates<br />
name= _ "regenerates"<br />
female_name= _ "female^regenerates"<br />
description= _ "Regenerates:<br />
The unit will heal itself 8 HP per turn. If it is poisoned, it will remove the poison instead of healing."<br />
affect_self=yes<br />
poison=cured<br />
[/regenerate]<br />
#enddef<br />
<br />
This is a good macro, because replacing it by a custom event would be complicated and messy and it wouldn't save a lot of code, anyway. Another example is<br />
<br />
#define GENERIC_UNIT SIDE TYPE X Y<br />
# Creates a generic unit of TYPE belonging to SIDE at X,Y, which has a<br />
# random name, gender and traits (just like a recruited unit).<br />
[unit]<br />
side={SIDE}<br />
type={TYPE}<br />
x={X}<br />
y={Y}<br />
generate_name=yes<br />
random_traits=yes<br />
random_gender=yes<br />
upkeep=full<br />
[/unit]<br />
#enddef<br />
<br />
This time, making a custom event would be fairly easy, but it would be much less transparent in usage. The code {GENERIC_UNIT 1 Spearman 12 3} is self-explanatory, simple and versatile.<br />
<br />
<br />
==Analogies to "real" programming==<br />
<br />
Now that you know how to use macros and custom events to optimise your code, let's take a moment to think how you could use your knowledge outside Wesnoth. You've probably heard about c++, python, lua or any other programming language. Just like them, WML has some common features but under slightly different names. For example, instead of making custom ''events'', you're making custom ''functions'' and ''procedures'' that can be used further in your code in a very similar way. That's why understanding optimisation is so important - it'll help you understand real programming problems, and develop good habits!<br />
<br />
==Further reading==<br />
<br />
*[http://wiki.wesnoth.org/Advanced_Optimisations_and_Hacks More complex optimisations] - read this only if you believe you know everything!<br />
*[http://www.wesnoth.org/macro-reference.xhtml Macro reference]<br />
*[[LuaWML]]<br />
*[[ConventionsWML]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Wml_optimisation&diff=52287Wml optimisation2013-10-29T19:47:06Z<p>Dugi: /* Further reading */ - added a link to advanced optimalisations and hacks</p>
<hr />
<div>''Work in progress...''<br />
<br />
==The basics==<br />
<br />
===What you should know first===<br />
*[[PreprocessorRef#Preprocessor_directives|Macros]]<br />
*[[EventWML]]<br />
*[[EventWML#Custom_events|Custom events]]<br />
*[[ConditionalActionsWML#.5Bwhile.5D|While loops]]<br />
<br />
===How do I optimise my code?===<br />
<br />
So, you've written your campaign, scenario or era and it works. Congratulations, but your work is far from over! If your campaign or scenario is big enough, you'll often notice that it runs very slowly, and you need to do something about it. Or maybe you have a powerful computer and you'd like to make sure that other, weaker machines won't have troubles with running your content. Or perhaps, you just want to learn how to write code that not only works, but is also efficient.<br />
<br />
The first thing to know, since apparently it's not stressed enough, macros '''do not''' improve performance! Macros only make your code more readable and easier to maintain. Try to refrain from using big macros, and more importantly, avoid using macros inside macros (inside macros, inside macros... yes, I've seen it happen, and yes I've tried doing it myself when I was new to wml). Under the covers, WML macros are replaced by the code they represent, and if there are macros inside macros (especially big ones), lines of code multiply horribly fast.<br />
<br />
What's a better way to write code that appears often? ''Custom events''' and ''while loops''! By defining a '''custom event''', and firing it when needed, you'll save a lot of code lines, make your code nicer to read and much more efficient. Same goes for the '''while loop''': instead of copy/pasting your code, try to use a loop, whenever you can. Let's take a look at this example problem: whenever side 1 unit enters a village, you want to place 5 walking corpses around this village. Let's say there are 6 villages in question with coordinates (1,1), (2,2), (3,3), (4,4), (5,5), (6,6).<br />
<br />
====Inefficient example====<br />
<br />
#WARNING: this code was written on the run, and may not be 100% accurate<br />
#NOTE: remember, this should work alright, but it is not efficient! Imagine if you have much more villages in mind, or you want to spawn more zombies<br />
<br />
#define SPAWN_ZOMBIES X Y SIDE<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
[unit]<br />
side={SIDE}<br />
type=Walking Corpse<br />
x,y={X},{Y}<br />
placement=map_passable<br />
[unit]<br />
#enddef<br />
<br />
[event]<br />
name=moveto<br />
[filter]<br />
side=1<br />
x,y=1,1<br />
[or]<br />
x,y=2,2<br />
[/or]<br />
[or]<br />
x,y=3,3<br />
[/or]<br />
[or]<br />
x,y=4,4<br />
[/or]<br />
[or]<br />
x,y=5,5<br />
[/or]<br />
[or]<br />
x,y=6,6<br />
[/or]<br />
[/filter]<br />
<br />
{SPAWN_ZOMBIES $unit.x $unit.y 2}<br />
[/event]<br />
<br />
Looks pretty innocent, right? But imagine that there are more villages. Or better yet, imagine you want to increase the amount of zombies, you'll have to copy/paste even more, and it's easy to make a mistake while doing it. <br />
<br />
====More efficient example====<br />
<br />
#first, let's define our custom event:<br />
[event]<br />
name=spawn_zombies<br />
first_time_only=no<br />
#it's easy to forget, but you have to set first_time_only in custom events too<br />
{VARIABLE i 0}<br />
[while]<br />
[variable]<br />
name=i<br />
less_than_equal_to=5<br />
#repeating the loop 5 times for 5 zombies, note how easy it is now to change the amount of zombies you want to spawn!<br />
[/variable]<br />
[do]<br />
[unit]<br />
side=2<br />
type=Walking Corpse<br />
x,y=$unit.x,$unit.y<br />
#unit variable is passed to this event from the parent event. <br />
placement=map_passable<br />
[unit]<br />
{VARIABLE_OP i add 1}<br />
[/do]<br />
[/while]<br />
{CLEAR_VARIABLE i}<br />
[/event]<br />
<br />
[event]<br />
name=moveto<br />
[filter]<br />
side=1<br />
x,y=1,1<br />
[or]<br />
x,y=2,2<br />
[/or]<br />
[or]<br />
x,y=3,3<br />
[/or]<br />
[or]<br />
x,y=4,4<br />
[/or]<br />
[or]<br />
x,y=5,5<br />
[/or]<br />
[or]<br />
x,y=6,6<br />
[/or]<br />
[/filter]<br />
<br />
[fire_event]<br />
name=spawn_zombies<br />
[/fire_event]<br />
[/event]<br />
<br />
===Fired events vs macros===<br />
<br />
But if ''fire events'' are so cool and efficient, what is the advantage of using ''macros''? Good question. As you can see, custom events have one issue: ''it's harder to set dynamic variables in fired events''. When defining macros, you specify arguments and those arguments are declared ''whenever we're using that macro'' and can be changed in any way you, and more importantly, someone else wants. Remember, that you might want to start a bigger project and invite someone to help you with the code. '''Macros are obvious and transparent in usage''' - when reading a macro definition you always know what is the changing variable and what is a constant. In custom events, it is not so obvious.<br />
<br />
Let's take a look at one of the default macros included with wesnoth:<br />
<br />
#define ABILITY_REGENERATES<br />
# Canned definition of the Regenerate ability to be included in an [abilities]<br />
# clause.<br />
[regenerate]<br />
value=8<br />
id=regenerates<br />
name= _ "regenerates"<br />
female_name= _ "female^regenerates"<br />
description= _ "Regenerates:<br />
The unit will heal itself 8 HP per turn. If it is poisoned, it will remove the poison instead of healing."<br />
affect_self=yes<br />
poison=cured<br />
[/regenerate]<br />
#enddef<br />
<br />
This is a good macro, because replacing it by a custom event would be complicated and messy and it wouldn't save a lot of code, anyway. Another example is<br />
<br />
#define GENERIC_UNIT SIDE TYPE X Y<br />
# Creates a generic unit of TYPE belonging to SIDE at X,Y, which has a<br />
# random name, gender and traits (just like a recruited unit).<br />
[unit]<br />
side={SIDE}<br />
type={TYPE}<br />
x={X}<br />
y={Y}<br />
generate_name=yes<br />
random_traits=yes<br />
random_gender=yes<br />
upkeep=full<br />
[/unit]<br />
#enddef<br />
<br />
This time, making a custom event would be fairly easy, but it would be much less transparent in usage. The code {GENERIC_UNIT 1 Spearman 12 3} is self-explanatory, simple and versatile.<br />
<br />
<br />
==Analogies to "real" programming==<br />
<br />
Now that you know how to use macros and custom events to optimise your code, let's take a moment to think how you could use your knowledge outside Wesnoth. You've probably heard about c++, python, lua or any other programming language. Just like them, WML has some common features but under slightly different names. For example, instead of making custom ''events'', you're making custom ''functions'' and ''procedures'' that can be used further in your code in a very similar way. That's why understanding optimisation is so important - it'll help you understand real programming problems, and develop good habits!<br />
<br />
==Further reading==<br />
<br />
[http://wiki.wesnoth.org/Advanced_Optimisations_and_Hacks More complex optimisations] - read this only if you believe you know everything!<br />
*[http://www.wesnoth.org/macro-reference.xhtml Macro reference]<br />
*[[LuaWML]]<br />
*[[ConventionsWML]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Advanced_Optimisations_and_Hacks&diff=52286Advanced Optimisations and Hacks2013-10-29T19:42:42Z<p>Dugi: </p>
<hr />
<div>From time to time, especially if working with some advanced WML, you will come to need things that WML does not support. And you might be in a bad need to do that. This isn't a tricky of using WML, it is actually doing what the developers didn't plan to support. I have mostly used it to write much more effective codes at the cost of low understandability.<br />
<br />
Note: This article was written supposing that you are skilled with WML. It is expected that you know most WML tags, comprehend the contents of save files and have good understanding of variables and variable arrays in WML (not all of them are required by each of these). It is also assuming that you've read Dunno's article about [[Wml_optimisation]], and did these things before trying ''these'' optimisations.<br />
<br />
<br />
== Many common events in scenarios ==<br />
This trick is useful if your (multiple) scenarios contain a lot of common WML. This happens if your campaign adds some additional functionality, like inventories. It might be also useful if you are using repetitive macros that fire the same events. Or when you need to add event-based weapon specials with [object]s and therefore need to insert these events into all scenarios and not into the unit via macros using unbalanced WML (as it is usually done). It might be even useful if you have a lot of death message events.<br />
<br />
The problem that comes from using the same WML events in many scenario is that they are preprocessed and loaded into RAM once for each scenario, and it can be dozens of times, resulting in huge RAM consumption and annoying loading times. This tricks inserts in through a unit so that it is loaded only once. Its downside is that prestart events can't be loaded this way, but start events can set up pretty much anything, they are fired before you see the scenario.<br />
<br />
First, create a dummy unit like this:<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST}<br />
[/unit_type]<br />
The {GLOBAL_EVENTS_LIST} macro contains all the events you want to insert into all scenarios. This thick is only useful if the list is very long. Example (too short to be worth using this hack, but it is a working example):<br />
#define GLOBAL_EVENTS_LIST<br />
[event]<br />
# This events gives traits to all ally/enemy leaders (single player is expected)<br />
name=start<br />
[store_unit]<br />
canrecruit=yes<br />
[not]<br />
side=1<br />
[/not]<br />
variable=leaders<br />
kill=yes<br />
[/store_unit]<br />
{FOREACH leaders i}<br />
[unit]<br />
id=$leaders[$i].id<br />
name=$leaders[$i].name<br />
gender=$leaders[$i].gender<br />
x=$leaders[$i].x<br />
y=$leaders[$i].y<br />
side=$leaders[$i].side<br />
random_traits=yes<br />
canrecruit=yes<br />
[/unit]<br />
{NEXT i}<br />
{CLEAR_VARIABLE leaders}<br />
[/event]<br />
[event]<br />
# This makes petrification last only for a single turn<br />
name=turn refresh<br />
first_time_only=no<br />
[modify_unit]<br />
[filter]<br />
side=$side_number<br />
[filter_wml]<br />
[status]<br />
petrified=yes<br />
[/status]<br />
[/filter_wml]<br />
[/filter]<br />
[status]<br />
petrified=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
#enddef<br />
<br />
Now, we need to add the events in the unit into the scenario. It is trivial. Keep on mind that it means that only start events can be loaded this way, prestart events will be loaded, but will never be fired. It is useful to wrap it in a macro so that only one line makes it load. Because it disappears in prestart, it does not clear shroud for the player.<br />
#define GLOBAL_EVENTS<br />
[event]<br />
name=prestart<br />
[unit]<br />
type=Event Loader<br />
side=1<br />
x,y=1,1<br />
[/unit]<br />
[kill]<br />
type=Event Loader<br />
animate=no<br />
[/kill]<br />
[/event]<br />
#enddef<br />
This should be placed in all events. If you need to control your events with some variables it will check, it might be useful to use them as arguments for this macro and set them in the event.<br />
<br />
There is also a way to do it without touching the scenarios at all, but its use in multiplayer is severely limited. It is based on lua, which is always executed when the scenario is loaded (even if it is in the middle from a save file, because lua environment isn't saved), and can be later accessed only by defining new WML tags or event hooks. Placing this into your _main (inside the campaign's #ifdef wraps, to avoid hacking other campaigns!).<br />
#ifdef CAMPAIGN_YOUR_AWESOME_CAMPAIGN<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ id = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
#endif<br />
<br />
== Getting rid of AMLA clutter ==<br />
This is almost required when a unit has too many AMLA options. Because of AMLA, the unit's can become extremely long, and the game will keep reading through it again and again and again and again, resulting in visible FPS drops when the unit is on the screen. If there are more units like this, it will get even more painful, because the save files will become excessively large, needing seconds to be created.<br />
<br />
The trick is based on the fact that units' AMLA is irrelevant all the time, and is used only when it advances. Because of it, you can somehow remove all the [advancement] tags from the unit for most of the time. This is easier said than done, though. The number 1 problem is that if you classically store the unit, remove the [advancement] tags simply with {CLEAR_VARIABLE stored_unit.advancement} and unstore it, it will do ''nothing at all''. When a unit is unstored, [advancement]s are read from the unit_type, and not from the actual variable! There are alternatives to [unstore_unit], simplest of them is [insert_tag] with name=unit (which does almost the same, but for example doesn't check if the unit has enough experience to advance). But here comes another bummer - many WML tags' lua implementations use unstore_unit (harm_unit, transform_unit and modify_unit), and even if we simply avoided using them, unstore_unit is too useful to avoid using it (and refactoring the whole code).<br />
<br />
There is a solution, of course. You can create an additional unit_type. One unit_type that is played all the time and has only one dummy AMLA (because we want it to show the experience bar and advance to nothing, I will call it dummy_amla), usable really a lot of times, and then another unit_type, let's call it advancing_unit_type, that uses the first unit_type as base unit, but contains all the AMLA options we want. Then we create events to transform between the unit types when advancing. This has some odd consequences, but they can be exploited.<br />
<br />
Unfortunately, when I discovered the secrets behind this and wrote about them, the developers decided that it wasn't the intended behaviour and changed it in wesnoth 1.11.1 (and it is changed in all later versions of the 1.11 branch). There are four more problems to face - first is that when a unit advances, it shows the advancement window before the advance event is fired, second is that all changes done to the unit in an advance event are discarded, third is that there is no way to make the player choose an advancement if it isn't his turn ([unstore_unit] chooses a random one even in singleplayer and I think this wasn't fixed yet) and the fourth one is that if the advancing is activated by [unstore_unit], it may call the advance and post advance events again (it somehow doesn't loop, fortunately).<br />
<br />
I am not writing the exact code because it would be too long and chaotic, but writing a pseudocode describes the steps.<br />
<br />
Note: recreate unit means using the [unit] tag with all relevant properties of the unit that is sort of unstored by this, like name, id, location, canrecruit, gender, experience, unrenamable etc, as well as modifications, variables and status via insert_tag - it is similar to unstore, but will recalculate its other properties like attacks, damage, maximum hitpoints, resistances, abilities and so on.<br />
<br />
The advance event:<br />
if unit.advancement.id=dummy_amla then<br />
# now we know if the unit has to be transformed or not<br />
if unit.side=$side_number<br />
# if it isn't the units' turn, we will deal with it later<br />
kill unit fire_event=no animate=no<br />
full_heal, clear_statuses<br />
set_variable amla_processing yes<br />
set_variables advancing_store unit<br />
else<br />
clear_statuses<br />
# edit the unit so that it is created with the new unit_type and advancements and thrown right into a variable<br />
set_variable unit.type advancing_$unit_type<br />
set_variable unit.to_variable advancing_store<br />
# recreate it with a new unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
# clean up some stuff<br />
set_variables advancing_store.modifications unit.modifications<br />
set_variable advancing_store.experience unit.experience<br />
set_variable advancing_store.achieved_amla yes<br />
end<br />
#ifver WESNOTH_VERSION >= 1.11.1<br />
fire_event post advance on the unit<br />
#endif<br />
end<br />
<br />
The post advance event basically just unstores the unit from the advancing_store variable. Expanding it with more things you might need should be done here (it may cause problems that might have different solutions before and after 1.11.1).<br />
<br />
If implemented correctly, it does what is it supposed to do, but more problems come - we haven't solved advancing if it is not the unit's turn. It will have to be delayed until the start of the unit's turn. These units were marked by setting their variable named amla_processing to yes. At turn refresh, fire the following event on all that side's units that have that variable set to yes. Pseudocode again:<br />
[event]<br />
name=respecialisation<br />
first_time_only=no<br />
# count how many times it has taken the dummy_amla<br />
set_variable times_advanced 0<br />
foreach unit.modifications.advance<br />
if unit.modifications.advance.id=dummy_amla<br />
variable_op times_advanced add 1<br />
end<br />
repeat this as many times as the number in times_advanced is<br />
variable_op unit.experience $unit.max_experience<br />
clear_variable unit.variables.amla_processing<br />
set_variable unit.type <br />
set_variable unit.type advancing_$unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
end<br />
# you might want to fire the post advance event here<br />
[/event]<br />
<br />
<br />
== Handling many non-disjunctive possibilities ==<br />
Sometimes, especially when working with inventories, you will come to need this. You have 100 possible items (or they might be something else if not used to create an inventory). You want the game to choose one when they are dropping and you want to show exactly those the unit currently has in a message's options (to let the player manipulate them). Some manipulation would require a huge [switch] and another one would require countless [show_if] tags. This can be done very comfortably if you use a variable as a database.<br />
<br />
The database variable is just created with something like this:<br />
[set_variables]<br />
name=items<br />
[value]<br />
[object]<br />
name= _ "Leather Armour"<br />
required_strength=20<br />
image=items/armour-leather.png<br />
description= _ "This armour makes the user 20% more resistant to damage."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-20<br />
blade=-20<br />
pierce=-20<br />
[/resistances]<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Chain Armour"<br />
required_strength=20<br />
image=items/armour-chain.png<br />
description= _ "This armour makes the user 30% more resistant to damage, but slows down slightly."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-30<br />
blade=-30<br />
pierce=-30<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-1<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Steel Plate Armour"<br />
required_strength=20<br />
image=items/armour-plate.png<br />
description= _ "This armour makes the user 40% more resistant to damage, but slows down."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-40<br />
blade=-40<br />
pierce=-40<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-2<br />
[/effect]<br />
[/object]<br />
#... This would be useless if there were only 3 of them<br />
[/value]<br />
[/set_variables]<br />
<br />
To randomly drop one of them, just choose a random number between 0 and 2 like {SET_VARIABLE rand rand 0..2}, then draw the picture $items.object[$rand].image and then create a moveto event (nested event with delayed_variable_substitution=no) on that hex that if a player steps on it, a it sets a variable informing about the item type being picked and fires a pickup event on that unit. The pickup event is fireable more than once, and basically does this:<br />
[insert_tag]<br />
name=object<br />
variable=items.object[$item_type_being_picked]<br />
[/insert_tag]<br />
<br />
When the inventory is viewed, we can avoid having to use [show_if] for all possible items, we just read what is inside the unit (or look it up in the items variable array). The message can be composed in a variable and then asked via insert_tag.<br />
{VARIABLE message.message "Which item do you want to manipulate?"}<br />
{FOREACH unit.modifications.object i}<br />
[set_variables]<br />
name=message.option[$message.option.length]<br />
[value]<br />
message="&$unit.modifications.object[$i].image $unit.modifications.object[$i].name|:<br />
$unit.modifications.object[$i].description"<br />
[command]<br />
[set_variables]<br />
name=item_chosen<br />
to_variable=unit.modifications.object[$i]<br />
[/set_variables]<br />
[/command]<br />
[/value]<br />
[/set_variables]<br />
{NEXT i}<br />
[insert_tag]<br />
name=message<br />
variable=message<br />
[/insert_tag]<br />
Then the properties of the object chosen will be in a variable named item_chosen.<br />
<br />
<br />
== Hacking events into other campaigns ==<br />
This is the most dangerous trick, but it lets you make an add-on that mods the game - you can easily give inventories to mainline campaigns (without editing them at all), remove all randomness from campaigns, create a dungeonmaster kit for multiplayer survivals (without editing these survivals), change the general balance... possibilities are unlimited.<br />
<br />
It is wholly based on the repetitive scenario events optimisation mentioned above in this article. It allows you to add events into scenarios, without actually editing the scenarios. If you don't protect it by any #ifdef, it will affect all scenarios! This is usually the best way to get kicked in the butt by other add-on writers, but in this case, you'll have to make it carefully and with the knowledge that it will affect all scenarios in all campaigns (or just some, you can wrap it in #ifndef MULTIPLAYER if you want it to be singleplayer-only).<br />
<br />
Like before, we place these events into a unit_type, and create and kill at at the beginning of the scenario. If done by lua in _main, it will be inserted in any case.<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST} # This is your magical collection of events. Should be mostly start, prerecruit and turn refresh events.<br />
[/unit_type]<br />
<br />
Then insert it using lua.<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ id = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
<br />
An add-on named No Randomness mod uses this, although it is entirely written in lua, you might want to see it to know more possible combinations around customising the mod, but it will require you to know lua.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Advanced_Optimisations_and_Hacks&diff=52285Advanced Optimisations and Hacks2013-10-29T19:26:50Z<p>Dugi: </p>
<hr />
<div>From time to time, especially if working with some advanced WML, you will come to need things that WML does not support. And you might be in a bad need to do that. This isn't a tricky of using WML, it is actually doing what the developers didn't plan to support. I have mostly used it to write much more effective codes at the cost of low understandability.<br />
<br />
Note: It is supposed that you are skilled with WML. It is expected that you know most WML tags, comprehend the contents of save files and have good understanding of variables and variable arrays in WML. It is also assuming that you've read Dunno's article about [[Wml_optimisation]], and do these things before.<br />
<br />
<br />
== Many common events in scenarios ==<br />
This trick is useful if your (multiple) scenarios contain a lot of common WML. This happens if your campaign adds some additional functionality, like inventories. It might be also useful if you are using repetitive macros that fire the same events. Or when you need to add event-based weapon specials with [object]s and therefore need to insert these events into all scenarios and not into the unit via macros using unbalanced WML (as it is usually done). It might be even useful if you have a lot of death message events.<br />
<br />
The problem that comes from using the same WML events in many scenario is that they are preprocessed and loaded into RAM once for each scenario, and it can be dozens of times, resulting in huge RAM consumption and annoying loading times. This tricks inserts in through a unit so that it is loaded only once. Its downside is that prestart events can't be loaded this way, but start events can set up pretty much anything, they are fired before you see the scenario.<br />
<br />
First, create a dummy unit like this:<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST}<br />
[/unit_type]<br />
The {GLOBAL_EVENTS_LIST} macro contains all the events you want to insert into all scenarios. This thick is only useful if the list is very long. Example (too short to be worth using this hack, but it is a working example):<br />
#define GLOBAL_EVENTS_LIST<br />
[event]<br />
# This events gives traits to all ally/enemy leaders (single player is expected)<br />
name=start<br />
[store_unit]<br />
canrecruit=yes<br />
[not]<br />
side=1<br />
[/not]<br />
variable=leaders<br />
kill=yes<br />
[/store_unit]<br />
{FOREACH leaders i}<br />
[unit]<br />
id=$leaders[$i].id<br />
name=$leaders[$i].name<br />
gender=$leaders[$i].gender<br />
x=$leaders[$i].x<br />
y=$leaders[$i].y<br />
side=$leaders[$i].side<br />
random_traits=yes<br />
canrecruit=yes<br />
[/unit]<br />
{NEXT i}<br />
{CLEAR_VARIABLE leaders}<br />
[/event]<br />
[event]<br />
# This makes petrification last only for a single turn<br />
name=turn refresh<br />
first_time_only=no<br />
[modify_unit]<br />
[filter]<br />
side=$side_number<br />
[filter_wml]<br />
[status]<br />
petrified=yes<br />
[/status]<br />
[/filter_wml]<br />
[/filter]<br />
[status]<br />
petrified=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
#enddef<br />
<br />
Now, we need to add the events in the unit into the scenario. It is trivial. Keep on mind that it means that only start events can be loaded this way, prestart events will be loaded, but will never be fired. It is useful to wrap it in a macro so that only one line makes it load.<br />
#define GLOBAL_EVENTS<br />
[event]<br />
name=prestart<br />
[unit]<br />
type=Event Loader<br />
side=1<br />
x,y=1,1<br />
[/unit]<br />
[kill]<br />
type=Event Loader<br />
animate=no<br />
[/kill]<br />
[/event]<br />
#GLOBAL_EVENTS<br />
This should be placed in all events. If you need to control your events with some variables it will check, it might be useful to use them as arguments for this macro and set them in the event.<br />
<br />
There is also a way to do it without touching the scenarios at all, but its use in multiplayer is severely limited. It is based on lua, which is always executed when the scenario is loaded (even if it is in the middle from a save file, because lua environment isn't saved), and can be later accessed only by defining new WML tags or event hooks. Placing this into your _main (inside the campaign's #ifdef wraps, to avoid hacking other campaigns!).<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ id = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
<br />
<br />
== Getting rid of AMLA clutter ==<br />
This is almost required when a unit has too many AMLA options. Because of AMLA, the unit's can become extremely long, and the game will keep reading through it again and again and again and again, resulting in visible FPS drops when the unit is on the screen. If there are more units like this, it will get even more painful, because the save files will become excessively large, needing seconds to be created.<br />
<br />
The trick is based on the fact that units' AMLA is irrelevant all the time, and is used only when it advances. Because of it, you can somehow remove all the [advancement] tags from the unit for most of the time. This is easier said than done, though. The number 1 problem is that if you classically store the unit, remove the [advancement] tags simply with {CLEAR_VARIABLE stored_unit.advancement} and unstore it, it will do ''nothing at all''. When a unit is unstored, [advancement]s are read from the unit_type, and not from the actual variable! There are alternatives to [unstore_unit], simplest of them is [insert_tag] with name=unit (which does almost the same, but for example doesn't check if the unit has enough experience to advance). But here comes another bummer - many WML tags' lua implementations use unstore_unit (harm_unit, transform_unit and modify_unit), and even if we simply avoided using them, unstore_unit is too useful to avoid using it (and refactoring the whole code).<br />
<br />
There is a solution, of course. You can create an additional unit_type. One unit_type that is played all the time and has only one dummy AMLA (because we want it to show the experience bar and advance to nothing, I will call it dummy_amla), usable really a lot of times, and then another unit_type, let's call it advancing_unit_type, that uses the first unit_type as base unit, but contains all the AMLA options we want. Then we create events to transform between the unit types when advancing. This has some odd consequences, but they can be exploited.<br />
<br />
Unfortunately, when I discovered the secrets behind this and wrote about them, the developers decided that it wasn't the intended behaviour and changed it in wesnoth 1.11.1 (and it is changed in all later versions of the 1.11 branch). There are four more problems to face - first is that when a unit advances, it shows the advancement window before the advance event is fired, second is that all changes done to the unit in an advance event are discarded, third is that there is no way to make the player choose an advancement if it isn't his turn ([unstore_unit] chooses a random one even in singleplayer and I think this wasn't fixed yet) and the fourth one is that if the advancing is activated by [unstore_unit], it may call the advance and post advance events again (it somehow doesn't loop, fortunately).<br />
<br />
I am not writing the exact code because it would be too long and chaotic, but writing a pseudocode describes the steps.<br />
<br />
Note: recreate unit means using the [unit] tag with all relevant properties of the unit that is sort of unstored by this, like name, id, location, canrecruit, gender, experience, unrenamable etc, as well as modifications, variables and status via insert_tag - it is similar to unstore, but will recalculate its other properties like attacks, damage, maximum hitpoints, resistances, abilities and so on.<br />
<br />
The advance event:<br />
if unit.advancement.id=dummy_amla then<br />
# now we know if the unit has to be transformed or not<br />
if unit.side=$side_number<br />
# if it isn't the units' turn, we will deal with it later<br />
kill unit fire_event=no animate=no<br />
full_heal, clear_statuses<br />
set_variable amla_processing yes<br />
set_variables advancing_store unit<br />
else<br />
clear_statuses<br />
# edit the unit so that it is created with the new unit_type and advancements and thrown right into a variable<br />
set_variable unit.type advancing_$unit_type<br />
set_variable unit.to_variable advancing_store<br />
# recreate it with a new unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
# clean up some stuff<br />
set_variables advancing_store.modifications unit.modifications<br />
set_variable advancing_store.experience unit.experience<br />
set_variable advancing_store.achieved_amla yes<br />
end<br />
#ifver WESNOTH_VERSION >= 1.11.1<br />
fire_event post advance on the unit<br />
#endif<br />
end<br />
<br />
The post advance event basically just unstores the unit from the advancing_store variable. Expanding it with more things you might need should be done here (it may cause problems that might have different solutions before and after 1.11.1).<br />
<br />
If implemented correctly, it does what is it supposed to do, but more problems come - we haven't solved advancing if it is not the unit's turn. It will have to be delayed until the start of the unit's turn. These units were marked by setting their variable named amla_processing to yes. At turn refresh, fire the following event on all that side's units that have that variable set to yes. Pseudocode again:<br />
[event]<br />
name=respecialisation<br />
first_time_only=no<br />
# count how many times it has taken the dummy_amla<br />
set_variable times_advanced 0<br />
foreach unit.modifications.advance<br />
if unit.modifications.advance.id=dummy_amla<br />
variable_op times_advanced add 1<br />
end<br />
repeat this as many times as the number in times_advanced is<br />
variable_op unit.experience $unit.max_experience<br />
clear_variable unit.variables.amla_processing<br />
set_variable unit.type <br />
set_variable unit.type advancing_$unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
end<br />
# you might want to fire the post advance event here<br />
[/event]<br />
<br />
<br />
== Handling many non-disjunctive possibilities ==<br />
Sometimes, especially when working with inventories, you will come to need this. You have 100 possible items (or they might be something else if not used to create an inventory). You want the game to choose one when they are dropping and you want to show exactly those the unit currently has in a message's options (to let the player manipulate them). Some manipulation would require a huge [switch] and another one would require countless [show_if] tags. This can be done very comfortably if you use a variable as a database.<br />
<br />
The database variable is just created with something like this:<br />
[set_variables]<br />
name=items<br />
[value]<br />
[object]<br />
name= _ "Leather Armour"<br />
required_strength=20<br />
image=items/armour-leather.png<br />
description= _ "This armour makes the user 20% more resistant to damage."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-20<br />
blade=-20<br />
pierce=-20<br />
[/resistances]<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Chain Armour"<br />
required_strength=20<br />
image=items/armour-chain.png<br />
description= _ "This armour makes the user 30% more resistant to damage, but slows down slightly."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-30<br />
blade=-30<br />
pierce=-30<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-1<br />
[/effect]<br />
[/object]<br />
[object]<br />
name= _ "Steel Plate Armour"<br />
required_strength=20<br />
image=items/armour-plate.png<br />
description= _ "This armour makes the user 40% more resistant to damage, but slows down."<br />
[effect]<br />
apply_to=resistance<br />
[resistances]<br />
replace=false<br />
impact=-40<br />
blade=-40<br />
pierce=-40<br />
[/resistances]<br />
[/effect]<br />
[effect]<br />
apply_to=movement<br />
add=-2<br />
[/effect]<br />
[/object]<br />
#... This would be useless if there were only 3 of them<br />
[/value]<br />
[/set_variables]<br />
<br />
To randomly drop one of them, just choose a random number between 0 and 2 like {SET_VARIABLE rand rand 0..2}, then draw the picture $items.object[$rand].image and then create a moveto event (nested event with delayed_variable_substitution=no) on that hex that if a player steps on it, a it sets a variable informing about the item type being picked and fires a pickup event on that unit. The pickup event is fireable more than once, and basically does this:<br />
[insert_tag]<br />
name=object<br />
variable=items.object[$item_type_being_picked]<br />
[/insert_tag]<br />
<br />
When the inventory is viewed, we can avoid having to use [show_if] for all possible items, we just read what is inside the unit (or look it up in the items variable array). The message can be composed in a variable and then asked via insert_tag.<br />
{VARIABLE message.message "Which item do you want to manipulate?"}<br />
{FOREACH unit.modifications.object i}<br />
[set_variables]<br />
name=message.option[$message.option.length]<br />
[value]<br />
message="&$unit.modifications.object[$i].image $unit.modifications.object[$i].name|:<br />
$unit.modifications.object[$i].description"<br />
[command]<br />
[set_variables]<br />
name=item_chosen<br />
to_variable=unit.modifications.object[$i]<br />
[/set_variables]<br />
[/command]<br />
[/value]<br />
[/set_variables]<br />
{NEXT i}<br />
[insert_tag]<br />
name=message<br />
variable=message<br />
[/insert_tag]<br />
Then the properties of the object chosen will be in a variable named item_chosen.</div>Dugihttps://wiki.wesnoth.org/index.php?title=Advanced_Optimisations_and_Hacks&diff=52284Advanced Optimisations and Hacks2013-10-29T18:49:10Z<p>Dugi: /* Getting rid of AMLA clutter */</p>
<hr />
<div>From time to time, especially if working with some advanced WML, you will come to need things that WML does not support. And you might be in a bad need to do that. This isn't a tricky of using WML, it is actually doing what the developers didn't plan to support. I have mostly used it to write much more effective codes at the cost of low understandability.<br />
<br />
Note: It is supposed that you are skilled with WML. It is expected that you know most WML tags, comprehend the contents of save files and have good understanding of variables and variable arrays in WML. It is also assuming that you've read Dunno's article about [[Wml_optimisation]], and do these things before.<br />
<br />
<br />
== Many common events in scenarios ==<br />
This trick is useful if your (multiple) scenarios contain a lot of common WML. This happens if your campaign adds some additional functionality, like inventories. It might be also useful if you are using repetitive macros that fire the same events. Or when you need to add event-based weapon specials with [object]s and therefore need to insert these events into all scenarios and not into the unit via macros using unbalanced WML (as it is usually done). It might be even useful if you have a lot of death message events.<br />
<br />
The problem that comes from using the same WML events in many scenario is that they are preprocessed and loaded into RAM once for each scenario, and it can be dozens of times, resulting in huge RAM consumption and annoying loading times. This tricks inserts in through a unit so that it is loaded only once. Its downside is that prestart events can't be loaded this way, but start events can set up pretty much anything, they are fired before you see the scenario.<br />
<br />
First, create a dummy unit like this:<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST}<br />
[/unit_type]<br />
The {GLOBAL_EVENTS_LIST} macro contains all the events you want to insert into all scenarios. This thick is only useful if the list is very long. Example (too short to be worth using this hack, but it is a working example):<br />
#define GLOBAL_EVENTS_LIST<br />
[event]<br />
# This events gives traits to all ally/enemy leaders (single player is expected)<br />
name=start<br />
[store_unit]<br />
canrecruit=yes<br />
[not]<br />
side=1<br />
[/not]<br />
variable=leaders<br />
kill=yes<br />
[/store_unit]<br />
{FOREACH leaders i}<br />
[unit]<br />
id=$leaders[$i].id<br />
name=$leaders[$i].name<br />
gender=$leaders[$i].gender<br />
x=$leaders[$i].x<br />
y=$leaders[$i].y<br />
side=$leaders[$i].side<br />
random_traits=yes<br />
canrecruit=yes<br />
[/unit]<br />
{NEXT i}<br />
{CLEAR_VARIABLE leaders}<br />
[/event]<br />
[event]<br />
# This makes petrification last only for a single turn<br />
name=turn refresh<br />
first_time_only=no<br />
[modify_unit]<br />
[filter]<br />
side=$side_number<br />
[filter_wml]<br />
[status]<br />
petrified=yes<br />
[/status]<br />
[/filter_wml]<br />
[/filter]<br />
[status]<br />
petrified=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
#enddef<br />
<br />
Now, we need to add the events in the unit into the scenario. It is trivial. Keep on mind that it means that only start events can be loaded this way, prestart events will be loaded, but will never be fired. It is useful to wrap it in a macro so that only one line makes it load.<br />
#define GLOBAL_EVENTS<br />
[event]<br />
name=prestart<br />
[unit]<br />
type=Event Loader<br />
side=1<br />
x,y=1,1<br />
[/unit]<br />
[kill]<br />
type=Event Loader<br />
animate=no<br />
[/kill]<br />
[/event]<br />
#GLOBAL_EVENTS<br />
This should be placed in all events. If you need to control your events with some variables it will check, it might be useful to use them as arguments for this macro and set them in the event.<br />
<br />
There is also a way to do it without touching the scenarios at all, but its use in multiplayer is severely limited. It is based on lua, which is always executed when the scenario is loaded (even if it is in the middle from a save file, because lua environment isn't saved), and can be later accessed only by defining new WML tags or event hooks. Placing this into your _main (inside the campaign's #ifdef wraps, to avoid hacking other campaigns!).<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ id = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
<br />
<br />
== Getting rid of AMLA clutter ==<br />
This is almost required when a unit has too many AMLA options. Because of AMLA, the unit's can become extremely long, and the game will keep reading through it again and again and again and again, resulting in visible FPS drops when the unit is on the screen. If there are more units like this, it will get even more painful, because the save files will become excessively large, needing seconds to be created.<br />
<br />
The trick is based on the fact that units' AMLA is irrelevant all the time, and is used only when it advances. Because of it, you can somehow remove all the [advancement] tags from the unit for most of the time. This is easier said than done, though. The number 1 problem is that if you classically store the unit, remove the [advancement] tags simply with {CLEAR_VARIABLE stored_unit.advancement} and unstore it, it will do ''nothing at all''. When a unit is unstored, [advancement]s are read from the unit_type, and not from the actual variable! There are alternatives to [unstore_unit], simplest of them is [insert_tag] with name=unit (which does almost the same, but for example doesn't check if the unit has enough experience to advance). But here comes another bummer - many WML tags' lua implementations use unstore_unit (harm_unit, transform_unit and modify_unit), and even if we simply avoided using them, unstore_unit is too useful to avoid using it (and refactoring the whole code).<br />
<br />
There is a solution, of course. You can create an additional unit_type. One unit_type that is played all the time and has only one dummy AMLA (because we want it to show the experience bar and advance to nothing, I will call it dummy_amla), usable really a lot of times, and then another unit_type, let's call it advancing_unit_type, that uses the first unit_type as base unit, but contains all the AMLA options we want. Then we create events to transform between the unit types when advancing. This has some odd consequences, but they can be exploited.<br />
<br />
Unfortunately, when I discovered the secrets behind this and wrote about them, the developers decided that it wasn't the intended behaviour and changed it in wesnoth 1.11.1 (and it is changed in all later versions of the 1.11 branch). There are four more problems to face - first is that when a unit advances, it shows the advancement window before the advance event is fired, second is that all changes done to the unit in an advance event are discarded, third is that there is no way to make the player choose an advancement if it isn't his turn ([unstore_unit] chooses a random one even in singleplayer and I think this wasn't fixed yet) and the fourth one is that if the advancing is activated by [unstore_unit], it may call the advance and post advance events again (it somehow doesn't loop, fortunately).<br />
<br />
I am not writing the exact code because it would be too long and chaotic, but writing a pseudocode describes the steps.<br />
<br />
Note: recreate unit means using the [unit] tag with all relevant properties of the unit that is sort of unstored by this, like name, id, location, canrecruit, gender, experience, unrenamable etc, as well as modifications, variables and status via insert_tag - it is similar to unstore, but will recalculate its other properties like attacks, damage, maximum hitpoints, resistances, abilities and so on.<br />
<br />
The advance event:<br />
if unit.advancement.id=dummy_amla then<br />
# now we know if the unit has to be transformed or not<br />
if unit.side=$side_number<br />
# if it isn't the units' turn, we will deal with it later<br />
kill unit fire_event=no animate=no<br />
full_heal, clear_statuses<br />
set_variable amla_processing yes<br />
set_variables advancing_store unit<br />
else<br />
clear_statuses<br />
# edit the unit so that it is created with the new unit_type and advancements and thrown right into a variable<br />
set_variable unit.type advancing_$unit_type<br />
set_variable unit.to_variable advancing_store<br />
# recreate it with a new unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
# clean up some stuff<br />
set_variables advancing_store.modifications unit.modifications<br />
set_variable advancing_store.experience unit.experience<br />
set_variable advancing_store.achieved_amla yes<br />
end<br />
#ifver WESNOTH_VERSION >= 1.11.1<br />
fire_event post advance on the unit<br />
#endif<br />
end<br />
<br />
The post advance event basically just unstores the unit from the advancing_store variable. Expanding it with more things you might need should be done here (it may cause problems that might have different solutions before and after 1.11.1).<br />
<br />
If implemented correctly, it does what is it supposed to do, but more problems come - we haven't solved advancing if it is not the unit's turn. It will have to be delayed until the start of the unit's turn. These units were marked by setting their variable named amla_processing to yes. At turn refresh, fire the following event on all that side's units that have that variable set to yes. Pseudocode again:<br />
[event]<br />
name=respecialisation<br />
first_time_only=no<br />
# count how many times it has taken the dummy_amla<br />
set_variable times_advanced 0<br />
foreach unit.modifications.advance<br />
if unit.modifications.advance.id=dummy_amla<br />
variable_op times_advanced add 1<br />
end<br />
repeat this as many times as the number in times_advanced is<br />
variable_op unit.experience $unit.max_experience<br />
clear_variable unit.variables.amla_processing<br />
set_variable unit.type <br />
set_variable unit.type advancing_$unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
end<br />
# you might want to fire the post advance event here<br />
[/event]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Advanced_Optimisations_and_Hacks&diff=52283Advanced Optimisations and Hacks2013-10-29T18:48:12Z<p>Dugi: </p>
<hr />
<div>From time to time, especially if working with some advanced WML, you will come to need things that WML does not support. And you might be in a bad need to do that. This isn't a tricky of using WML, it is actually doing what the developers didn't plan to support. I have mostly used it to write much more effective codes at the cost of low understandability.<br />
<br />
Note: It is supposed that you are skilled with WML. It is expected that you know most WML tags, comprehend the contents of save files and have good understanding of variables and variable arrays in WML. It is also assuming that you've read Dunno's article about [[Wml_optimisation]], and do these things before.<br />
<br />
<br />
== Many common events in scenarios ==<br />
This trick is useful if your (multiple) scenarios contain a lot of common WML. This happens if your campaign adds some additional functionality, like inventories. It might be also useful if you are using repetitive macros that fire the same events. Or when you need to add event-based weapon specials with [object]s and therefore need to insert these events into all scenarios and not into the unit via macros using unbalanced WML (as it is usually done). It might be even useful if you have a lot of death message events.<br />
<br />
The problem that comes from using the same WML events in many scenario is that they are preprocessed and loaded into RAM once for each scenario, and it can be dozens of times, resulting in huge RAM consumption and annoying loading times. This tricks inserts in through a unit so that it is loaded only once. Its downside is that prestart events can't be loaded this way, but start events can set up pretty much anything, they are fired before you see the scenario.<br />
<br />
First, create a dummy unit like this:<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST}<br />
[/unit_type]<br />
The {GLOBAL_EVENTS_LIST} macro contains all the events you want to insert into all scenarios. This thick is only useful if the list is very long. Example (too short to be worth using this hack, but it is a working example):<br />
#define GLOBAL_EVENTS_LIST<br />
[event]<br />
# This events gives traits to all ally/enemy leaders (single player is expected)<br />
name=start<br />
[store_unit]<br />
canrecruit=yes<br />
[not]<br />
side=1<br />
[/not]<br />
variable=leaders<br />
kill=yes<br />
[/store_unit]<br />
{FOREACH leaders i}<br />
[unit]<br />
id=$leaders[$i].id<br />
name=$leaders[$i].name<br />
gender=$leaders[$i].gender<br />
x=$leaders[$i].x<br />
y=$leaders[$i].y<br />
side=$leaders[$i].side<br />
random_traits=yes<br />
canrecruit=yes<br />
[/unit]<br />
{NEXT i}<br />
{CLEAR_VARIABLE leaders}<br />
[/event]<br />
[event]<br />
# This makes petrification last only for a single turn<br />
name=turn refresh<br />
first_time_only=no<br />
[modify_unit]<br />
[filter]<br />
side=$side_number<br />
[filter_wml]<br />
[status]<br />
petrified=yes<br />
[/status]<br />
[/filter_wml]<br />
[/filter]<br />
[status]<br />
petrified=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
#enddef<br />
<br />
Now, we need to add the events in the unit into the scenario. It is trivial. Keep on mind that it means that only start events can be loaded this way, prestart events will be loaded, but will never be fired. It is useful to wrap it in a macro so that only one line makes it load.<br />
#define GLOBAL_EVENTS<br />
[event]<br />
name=prestart<br />
[unit]<br />
type=Event Loader<br />
side=1<br />
x,y=1,1<br />
[/unit]<br />
[kill]<br />
type=Event Loader<br />
animate=no<br />
[/kill]<br />
[/event]<br />
#GLOBAL_EVENTS<br />
This should be placed in all events. If you need to control your events with some variables it will check, it might be useful to use them as arguments for this macro and set them in the event.<br />
<br />
There is also a way to do it without touching the scenarios at all, but its use in multiplayer is severely limited. It is based on lua, which is always executed when the scenario is loaded (even if it is in the middle from a save file, because lua environment isn't saved), and can be later accessed only by defining new WML tags or event hooks. Placing this into your _main (inside the campaign's #ifdef wraps, to avoid hacking other campaigns!).<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ id = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]<br />
<br />
<br />
== Getting rid of AMLA clutter ==<br />
This is almost required when a unit has too many AMLA options. Because of AMLA, the unit's can become extremely long, and the game will keep reading through it again and again and again and again, resulting in visible FPS drops when the unit is on the screen. If there are more units like this, it will get even more painful, because the save files will become excessively large, needing seconds to be created.<br />
<br />
The trick is based on the fact that units' AMLA is irrelevant all the time, and is used only when it advances. Because of it, you can somehow remove all the [advancement] tags from the unit for most of the time. This is easier said than done, though. The number 1 problem is that if you classically store the unit, remove the [advancement] tags simply with {CLEAR_VARIABLE stored_unit.advancement} and unstore it, it will do ''nothing at all''. When a unit is unstored, [advancement]s are read from the unit_type, and not from the actual variable! There are alternatives to [unstore_unit], simplest of them is [insert_tag] with name=unit (which does almost the same, but for example doesn't check if the unit has enough experience to advance). But here comes another bummer - many WML tags' lua implementations use unstore_unit (harm_unit, transform_unit and modify_unit), and even if we simply avoided using them, unstore_unit is too useful to avoid using it (and refactoring the whole code).<br />
<br />
There is a solution, of course. You can create an additional unit_type. One unit_type that is played all the time and has only one dummy AMLA (because we want it to show the experience bar and advance to nothing, I will call it dummy_amla), usable really a lot of times, and then another unit_type, let's call it advancing_unit_type, that uses the first unit_type as base unit, but contains all the AMLA options we want. Then we create events to transform between the unit types when advancing. This has some odd consequences, but they can be exploited.<br />
<br />
Unfortunately, when I discovered the secrets behind this and wrote about them, the developers decided that it wasn't the intended behaviour and changed it in wesnoth 1.11.1 (and it is changed in all later versions of the 1.11 branch). There are four more problems to face - first is that when a unit advances, it shows the advancement window before the advance event is fired, second is that all changes done to the unit in an advance event are discarded, third is that there is no way to make the player choose an advancement if it isn't his turn ([unstore_unit] chooses a random one even in singleplayer and I think this wasn't fixed yet) and the fourth one is that if the advancing is activated by [unstore_unit], it may call the advance and post advance events again (it somehow doesn't loop, fortunately).<br />
<br />
I am not writing the exact code because it would be too long and chaotic, but writing a pseudocode describes the steps.<br />
<br />
Note: recreate unit means using the [unit] tag with all relevant properties of the unit that is sort of unstored by this, like name, id, location, canrecruit, gender, experience, unrenamable etc, as well as modifications, variables and status via insert_tag.<br />
<br />
The advance event:<br />
if unit.advancement.id=dummy_amla then<br />
# now we know if the unit has to be transformed or not<br />
if unit.side=$side_number<br />
# if it isn't the units' turn, we will deal with it later<br />
kill unit fire_event=no animate=no<br />
full_heal, clear_statuses<br />
set_variable amla_processing yes<br />
set_variables advancing_store unit<br />
else<br />
clear_statuses<br />
# edit the unit so that it is created with the new unit_type and advancements and thrown right into a variable<br />
set_variable unit.type advancing_$unit_type<br />
set_variable unit.to_variable advancing_store<br />
# recreate it with a new unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
# clean up some stuff<br />
set_variables advancing_store.modifications unit.modifications<br />
set_variable advancing_store.experience unit.experience<br />
set_variable advancing_store.achieved_amla yes<br />
end<br />
#ifver WESNOTH_VERSION >= 1.11.1<br />
fire_event post advance on the unit<br />
#endif<br />
end<br />
<br />
The post advance event basically just unstores the unit from the advancing_store variable. Expanding it with more things you might need should be done here (it may cause problems that might have different solutions before and after 1.11.1).<br />
<br />
If implemented correctly, it does what is it supposed to do, but more problems come - we haven't solved advancing if it is not the unit's turn. It will have to be delayed until the start of the unit's turn. These units were marked by setting their variable named amla_processing to yes. At turn refresh, fire the following event on all that side's units that have that variable set to yes. Pseudocode again:<br />
[event]<br />
name=respecialisation<br />
first_time_only=no<br />
# count how many times it has taken the dummy_amla<br />
set_variable times_advanced 0<br />
foreach unit.modifications.advance<br />
if unit.modifications.advance.id=dummy_amla<br />
variable_op times_advanced add 1<br />
end<br />
repeat this as many times as the number in times_advanced is<br />
variable_op unit.experience $unit.max_experience<br />
clear_variable unit.variables.amla_processing<br />
set_variable unit.type <br />
set_variable unit.type advancing_$unit_type<br />
recreate_unit variable=unit to_variable=advancing_store<br />
unstore_unit advancing_store find_vacant=no<br />
store_unit x,y=$x1,$y1 variable=advancing_store<br />
recreate_unit variable=advancing_store to_variable=advancing_store<br />
end<br />
# you might want to fire the post advance event here<br />
[/event]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Advanced_Optimisations_and_Hacks&diff=52282Advanced Optimisations and Hacks2013-10-29T17:43:29Z<p>Dugi: Initial entry</p>
<hr />
<div>From time to time, especially if working with some advanced WML, you will come to need things that WML does not support. And you might be in a bad need to do that. This isn't a tricky of using WML, it is actually doing what the developers didn't plan to support. I have mostly used it to write much more effective codes at the cost of low understandability.<br />
<br />
Note: It is supposed that you are skilled with WML. It is expected that you know most WML tags, comprehend the contents of save files and have good understanding of variables and variable arrays in WML.<br />
<br />
<br />
== Many common events in scenarios ==<br />
This trick is useful if your (multiple) scenarios contain a lot of common WML. This happens if your campaign adds some additional functionality, like inventories. It might be also useful if you are using repetitive macros that fire the same events. Or when you need to add event-based weapon specials with [object]s and therefore need to insert these events into all scenarios and not into the unit via macros using unbalanced WML (as it is usually done). It might be even useful if you have a lot of death message events.<br />
<br />
The problem that comes from using the same WML events in many scenario is that they are preprocessed and loaded into RAM once for each scenario, and it can be dozens of times, resulting in huge RAM consumption and annoying loading times. This tricks inserts in through a unit so that it is loaded only once. Its downside is that prestart events can't be loaded this way, but start events can set up pretty much anything, they are fired before you see the scenario.<br />
<br />
First, create a dummy unit like this:<br />
[unit_type]<br />
id=Event Loader #It can be different, but it is assumed in the following code that it will be 'Event Loader',<br />
#if you name it differently, you will have to rename it in the rest of the code!<br />
alignment=neutral<br />
advances_to=null<br />
cost=1<br />
hide_help=true<br />
do_not_list=yes<br />
{GLOBAL_EVENTS_LIST}<br />
[/unit_type]<br />
The {GLOBAL_EVENTS_LIST} macro contains all the events you want to insert into all scenarios. This thick is only useful if the list is very long. Example (too short to be worth using this hack, but it is a working example):<br />
#define GLOBAL_EVENTS_LIST<br />
[event]<br />
# This events gives traits to all ally/enemy leaders (single player is expected)<br />
name=start<br />
[store_unit]<br />
canrecruit=yes<br />
[not]<br />
side=1<br />
[/not]<br />
variable=leaders<br />
kill=yes<br />
[/store_unit]<br />
{FOREACH leaders i}<br />
[unit]<br />
id=$leaders[$i].id<br />
name=$leaders[$i].name<br />
gender=$leaders[$i].gender<br />
x=$leaders[$i].x<br />
y=$leaders[$i].y<br />
side=$leaders[$i].side<br />
random_traits=yes<br />
canrecruit=yes<br />
[/unit]<br />
{NEXT i}<br />
{CLEAR_VARIABLE leaders}<br />
[/event]<br />
[event]<br />
# This makes petrification last only for a single turn<br />
name=turn refresh<br />
first_time_only=no<br />
[modify_unit]<br />
[filter]<br />
side=$side_number<br />
[filter_wml]<br />
[status]<br />
petrified=yes<br />
[/status]<br />
[/filter_wml]<br />
[/filter]<br />
[status]<br />
petrified=no<br />
[/status]<br />
[/modify_unit]<br />
[/event]<br />
#enddef<br />
<br />
Now, we need to add the events in the unit into the scenario. It is trivial. Keep on mind that it means that only start events can be loaded this way, prestart events will be loaded, but will never be fired. It is useful to wrap it in a macro so that only one line makes it load.<br />
#define GLOBAL_EVENTS<br />
[event]<br />
name=prestart<br />
[unit]<br />
type=Event Loader<br />
side=1<br />
x,y=1,1<br />
[/unit]<br />
[kill]<br />
type=Event Loader<br />
animate=no<br />
[/kill]<br />
[/event]<br />
#GLOBAL_EVENTS<br />
This should be placed in all events. If you need to control your events with some variables it will check, it might be useful to use them as arguments for this macro and set them in the event.<br />
<br />
There is also a way to do it without touching the scenarios at all, but its use in multiplayer is severely limited. It is based on lua, which is always executed when the scenario is loaded (even if it is in the middle from a save file, because lua environment isn't saved), and can be later accessed only by defining new WML tags or event hooks. Placing this into your _main (inside the campaign's #ifdef wraps, to avoid hacking other campaigns!).<br />
[lua]<br />
code = <<<br />
local helper = wesnoth.require "lua/helper.lua"<br />
-- We need to check whether the events were loaded in this scenario<br />
local events_loaded = wesnoth.get_variable( "events_loaded" )<br />
if events_loaded ~= true then<br />
wesnoth.set_variable("events_loaded", true)<br />
-- We don't want this code to believe that the events were loaded because<br />
-- the variable recording that they are saved remains from previous scenario<br />
wesnoth.wml_actions.event{ <br />
name="victory" ,<br />
{ "clear_variable", {<br />
name="events_loaded"<br />
} }<br />
}<br />
-- And now we do WML action itself<br />
wesnoth.wml_actions.unit{ id = "Event Loader" , side = 1, x = 1, y = 1}<br />
wesnoth.wml_actions.kill{ type = "Event Loader", animate = false}<br />
end<br />
>><br />
[/lua]</div>Dugihttps://wiki.wesnoth.org/index.php?title=ImagePathFunctions&diff=51788ImagePathFunctions2013-08-22T14:34:53Z<p>Dugi: </p>
<hr />
<div>Image Path Functions provide a simple method for WML coders to alter the way their specified images will be displayed in the game. All of the function parameters are included at the end of an image path and should not contain any spaces or special characters (other than those specified here).<br />
<br />
If you need to practice it without having to reload all WML, you can use an add-on named ''Image loading tester'' from the 1.10 add-on server.<br />
<br />
== Team-Color Function ==<br />
In Wesnoth version 1.2, the only Image Path Function was '''~TC()''', which took two comma-separated parameters: the team number and the source color palette. The valid values for both of these parameters are defined in the file ''data/team-colors.cfg''<br />
<br />
=== Syntax ===<br />
'''~TC(''' ''team number'' ''',''' ''source color palette'' ''')'''<br />
*''team number'' - this is the first parameter, a number 1-9 signifying the team number of a unit. Number 1 typically means the red team, 2 typically means the blue team, and so on (unless the scenario color settings for any side have been altered).<br />
*''source color palette'' - the second parameter is a source color palette, usually magenta. Do not surround this parameter with quotes.<br />
<br />
== Re-Color Function ==<br />
May be used to change some colors in an image.<br />
=== Syntax ===<br />
'''~RC(''' ''source color palette'' '''>''' ''color range ID'' ''')'''<br />
*''source color palette'' - the first parameter is a source color palette, usually magenta. Do not surround this parameter with quotes.<br />
*''color range ID'' - this is the second parameter, signifying the ID of a color range defined in the file ''data/core/team-colors.cfg'' (or it may be a custom ID for a color range defined locally). <br />
<br />
=== Example ===<br />
In the following example, the magenta regions in an elvish captain's image are turned a healthy shade of green:<br />
<br />
[message]<br />
speaker=narrator<br />
image=units/elves-wood/captain.png~RC(magenta>green)<br />
message=_ "Now I am on the green team."<br />
[/message]<br />
<br />
The IDs of the color ranges may be the lowercased English name of the palette's base color (e.g. 'red', 'brown', etc.). They may also be numeric color indices from the palette WML included with the game, but this is not recommended.<br />
<br />
== Palette-switch Function ==<br />
May be used to change colors in an image following the specifications of a source and target (new) palette.<br />
=== Syntax ===<br />
'''~PAL(''' ''source color palette'' '''>''' ''target color palette'' ''')'''<br />
*''source color palette'' - the first parameter is a source color palette, such as magenta. Do not surround this parameter with quotes.<br />
*''target color palette'' - the new palette to take the place of the source colors in the image.<br />
<br />
== Flip Function ==<br />
May be used to flip an image horizontally and/or vertically.<br />
=== Syntax ===<br />
'''~FL(''' ''optional argument list'' ''')'''<br />
*''vertical'' - if the string "vert" is found anywhere in the argument list, the image will be flipped vertically.<br />
*''horizontal'' - if the string "horiz" is found anywhere in the argument list, the image will be flipped horizantally.<br />
*if the argument list is empty, the image will only be flipped horizontally.<br />
<br />
== Rotate Function ==<br />
{{devfeature1.11}}<br />
May be used to rotate an image by a multiple of 90 degrees.<br />
=== Syntax ===<br />
'''~ROTATE(''' ''degrees'' ''')'''<br />
* ''degrees'' - The number of degrees by which the image will be rotated. This must be a multiple of 90. Positive numbers indicate clockwise rotation, while negative numbers indicate counter-clockwise. (Zero indicates no rotation.)<br />
If the number of degrees is omitted, a quarter turn (90 degrees) clockwise is assumed.<br />
<br />
== Greyscale Function ==<br />
May be used to greyscale the image (turn to black and white)<br />
=== Syntax ===<br />
'''~GS( )'''<br />
<br />
== Crop Function ==<br />
Extracts a rectangular section of an image file.<br />
=== Syntax ===<br />
'''~CROP(x,y,width,height)'''<br />
* ''x'',''y'': top-left corner coordinates for the rectangular section extracted. Must be greater or equal than zero, and inside the image's bounds.<br />
* ''width'': width of the selected region. Must be less than or equal to the original image's width, and must not be negative.<br />
* ''height'': height of the selected region. Must be less than or equal to the original image's height, and must not be negative.<br />
<br />
== Blit Function ==<br />
Blit the parameter image on the main image. Example: peasant.png~BLIT(hat.png,30,10)<br />
=== Syntax ===<br />
'''~BLIT(src,x,y)'''<br />
* ''src'': an image file used as source for the blit, other image path functions can be used there.<br />
* ''x'',''y'': top-left corner coordinates where to blit. Must be greater or equal than zero. If missing assume (0,0).<br />
<br />
== Mask Function ==<br />
Remove parts of the main image using the parameter image as a mask. Example: grass.png~MASK(circle.png) will give a circle of grass.<br />
=== Syntax ===<br />
'''~MASK(mask,x,y)'''<br />
* ''mask'': an image file used as mask, other image path functions can be used there.<br />
* ''x'',''y'': top-left corner coordinates where to put the mask. Parts ouside of the mask are considered transparent. If missing assume (0,0).<br />
<br />
Only the alpha channel of the mask is used and each alpha value will be the maximum alpha of the resulting image. This means that the fully-transparent parts of the mask will erase the corresponding parts of the image, but also that a semi-transparent mask will create a semi-transparent image. <br />
<br />
== Color-shift function ==<br />
Performs simple per-channel color shifts by adding the arguments to the respective color channels.<br />
=== Syntax ===<br />
''Multi-channel:'' '''~CS(r,g,b)'''<br />
''Single-channel:'' '''~R(v)''', '''~G(v)''', '''~B(v)'''<br />
<br />
The multichannel syntax assumes all arguments are set to zero initially, so one can use, e.g. ~CS(2,4) to add +2 and +4 units to the red and green channels respectively, leaving the blue channel intact. Arguments may be negative to diminish a channel's value; this can be used to change an image's brightness. Checks for out-of-range arguments or results (less than 0 or greater than 255) are made, so the resultant values are truncated if necessary.<br />
<br />
The single channel syntax behaves exactly the same, except that only single-channel modifications are made per function. However, one can stack them to produce the same behavior as ~CS(), e.g. ~R(r)~G(g)~B(b), but that tends to be just a performance loss.<br />
<br />
== Color-blend function ==<br />
{{DevFeature1.11}}<br />
Blends the image with the given color to produce a more controlled tinting effect than color-shifting, independently of the image's contents.<br />
=== Syntax ===<br />
'''~BLEND(r,g,b,o)'''<br />
<br />
The color is defined by the ''r'', ''g'', and ''b'' parameters (integers ranging from 0 to 255). The ''o'' (opacity) parameter controls the amount by which the given color will be blended into the image, and may be specified either as a factor from 0.0 to 1.0, or percentage up to 100%. Thus, ~BLEND(r,g,b,0.5) and ~BLEND(r,g,b,50%) are equivalent.<br />
<br />
== Lightmap color-shift function ==<br />
Performs per-pixel and per-channel color shifts using another image (a "lightmap") as source, allowing to create textured light effects.<br />
<br />
=== Syntax ===<br />
'''~L(lightmap)'''<br />
<br />
For each pixel of the original image, it checks the RGB values from the corresponding pixel of the lightmap, slightly transform them, then add these values to the original pixel.<br />
<br />
The transformation involved is done to convert the (0,255) spectrum to (-255,255), allowing to add or subtract color. The formula is (x-128)*2, which means that 0 gives -256, 128 gives 0 and 255 gives 254. So, the no-effect lightmap is a fully gray image (RGB = 128,128,128) and any non-gray pixel will shift the colors of the original.<br />
<br />
Note that the lightmap will be scaled to the same dimensions as the original image.<br />
<br />
== Image-scaling function ==<br />
Scales a graphic up or down.<br />
=== Syntax ===<br />
<br />
'''~SCALE( ''new_width'', ''new_height'' )<br />
<br />
The ''new_width'' and ''new_height'' parameters are taken as the image's original width or height, respectively, if one of them happens to be zero. Negative values are treated in the same way, but an error is printed in stderr.<br />
<br />
== Opacity modifying function ==<br />
Changes an image's opacity at render time.<br />
=== Syntax ===<br />
<br />
'''~O( ''factor or percentage%'' )'''<br />
<br />
If the argument includes the percentage symbol (''%''), it will be treated as a percentage of full (real) opacity; an image will be displayed at its native opacity with ~O(100%).<br />
<br />
Without the percentage symbol, the argument is assumed to be a factor by which the image's native opacity should be multiplied. Thus, ~O(0.5) and ~O(50%) are equivalent forms of specifying to reduce an image's opacity by half.<br />
<br />
== Blurring function ==<br />
Blurs a graphic at render time using the same algorithm used for in-game dialogs.<br />
=== Syntax ===<br />
<br />
'''~BL( ''radius'' )'''<br />
<br />
== Overlay function ==<br />
Puts a time-of-day overlay on the image.<br />
=== Syntax ===<br />
<br />
'''~LIGHTEN()'''<br />
<br />
'''~DARKEN()'''<br />
<br />
== Background coloring function ==<br />
Sets the color of all the (semi-)transparent pixels of the image.<br />
=== Syntax ===<br />
<br />
'''~BG(r,g,b)'''<br />
<br />
== Null function ==<br />
Does nothing.<br />
=== Syntax ===<br />
<br />
'''~NOP()'''<br />
<br />
== Precedence of Functions ==<br />
<br />
All functions are applied in left-to-right order, with the exception of RC(), TC() and PAL() which are applied always before any other functions. Standard team coloring for a unit is applied after all custom RC(), TC() and PAL() functions but before any other functions.<br />
That is, stuff like "units/elves-wood/fighter.png~CROP(0,0,20,20)~CROP(10,10,10,10)" would result in taking a crop of the rectangle x=20;y=20;w=40;h=40 and then taking a crop from ''that'' rectangle as x=10;y=10;w=10;h=10 resulting in the area x=30;y=30;w=10;h=10 from the original graphic.<br />
<br />
[[Category:WML Reference]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=LuaWML/Misc&diff=51684LuaWML/Misc2013-07-25T07:06:50Z<p>Dugi: /* wesnoth.synchronize_choice */ Adding a note about the return values, investigating it took me hours.</p>
<hr />
<div>This page describes miscellaneous [[LuaWML]] objects and helpers.<br />
<br />
==== wesnoth.game_config ====<br />
<br />
Contrarily to the other values of the ''wesnoth'' table, ''game_config'' is simply a proxy table. Its fields offer an interface to the global settings of Wesnoth:<br />
<br />
* '''version''': string (read only)<br />
* '''base_income''': integer (read/write)<br />
* '''village_income''': integer (read/write)<br />
* '''poison_amount''': integer (read/write)<br />
* '''rest_heal_amount''': integer (read/write)<br />
* '''recall_cost''': integer (read/write)<br />
* '''kill_experience''': integer (read/write)<br />
* '''last_turn''': integer (read/write) turn limit, maximum number of turns<br />
* '''debug''': boolean (read only)<br />
* '''mp_debug''': boolean (read only) {{DevFeature1.11}}<br />
<br />
-- Poison a bit weak? Let's boost it!<br />
wesnoth.game_config.poison_amount = 15<br />
<br />
==== wesnoth.current ====<br />
<br />
As with ''game_config'', ''current'' is a proxy table. Its fields are getter for game-related properties:<br />
<br />
* '''side''': integer (read only)<br />
* '''turn''': integer (read only)<br />
* '''event_context''': WML table with attributes ''name'', ''x1'', ''y1'', ''x2'', ''y2'', and children ''weapon'', ''second_weapon'', describing the trigger for the current event.<br />
<br />
wesnoth.message(string.format("Turn %d, side %d is playing.", wesnoth.current.turn, wesnoth.current.side))<br />
<br />
==== wesnoth.synchronize_choice ====<br />
<br />
Recovers a WML table that was computed on one client only or was stored in a replay. The actual computation is performed by the function passed as the first argument, assuming that the client is the side currently playing. For all the other clients, the function will not be called. An optional second function can be passed; if present, it will be used instead of the first one when the client happens to be an AI (hence not enable to interact with a user interface).<br />
<br />
local result = wesnoth.synchronize_choice(<br />
function()<br />
-- Called only on the client handling the current side, if it is a human.<br />
local choice = 0<br />
wesnoth.show_dialog(<br />
some_dialog_cfg, nil,<br />
function()<br />
choice = wesnoth.get_dialog_value "some_list"<br />
end)<br />
return { value = choice }<br />
end,<br />
function()<br />
-- Called only on the client handling the current side, if it is an AI.<br />
return { value = math.random(some_list_size) }<br />
end)<br />
wesnoth.message(string.format("Selected item: %d", result.value))<br />
<br />
Note: The return value must be a table of strings using strings as keys as seen in the example, it does not recover any other kinds of tables (therefore, in { value = choice}, the choice variable cannot be a table or function, in that case it will be considered nil). If you are trying to recover a unit, you can only recover some of its key properties and reconstruct it afterwards.<br />
<br />
==== wesnoth.get_image_size ====<br />
<br />
Returns the width and height of an image.<br />
<br />
local w, h = wesnoth.get_image_size "units/transport/galleon.png"<br />
<br />
==== wesnoth.compare_versions ====<br />
<br />
Takes two versions strings and an operator, returns whether the comparison yields true.<br />
Follows the same rules like the #ifver preprocessor statement.<br />
<br />
local function version_is_sufficient(required)<br />
if not wesnoth.compare_versions then return false end<br />
return wesnoth.compare_versions(wesnoth.game_config.version, ">=", required)<br />
end<br />
local required = "1.9.6"<br />
if not version_is_sufficient(required) then wesnoth.message(string.format(<br />
"Your BfW version is insufficient, please get BfW %s or greater!", required)) end<br />
<br />
==== wesnoth.have_file ====<br />
<br />
{{DevFeature1.11}}Checks if the file (not necessarily a Lua file) or the directory passed as argument exists. Returns true if the file exists, false otherwise. Follows the same rules like the #ifhave preprocessor statement.<br />
<br />
-- Does the user have installed the UMC Music Book 1?<br />
local umc_music = wesnoth.have_file( "~add-ons/UMC_Music_Book_1/_main.cfg" )<br />
-- and if we want to check for the folder?<br />
local music_folder = wesnoth.have_file( "~add-ons/UMC_Music_Book_1/" )<br />
<br />
==== wesnoth.debug ====<br />
<br />
Takes a userdata with metatable wml object or a wml table and dumps its content into a pretty string.<br />
wesnoth.set_variable("number", 100)<br />
local vconfig = wesnoth.tovconfig({ key = "$number", another_key = true,<br />
{"a_subtag", { a_key_in_the_subtag = "foo" }}<br />
})<br />
wesnoth.message(wesnoth.debug(vconfig))<br />
wesnoth.message(wesnoth.debug(vconfig.__literal))<br />
<br />
==== wesnoth.get_time_stamp ====<br />
<br />
{{DevFeature1.11}}This function retrieves the current time stamp, that is the amount of milliseconds passed from when the SDL library was initialized. It takes no arguments and returns an integer.<br />
'''WARNING:''' this function uses the same code as [set_variable] time=stamp, and so it is MP-unsafe. It is provided only for benchmark purposes and AI development, although it should work inside wesnoth.synchronize_choice() as well.<br />
local stamp = wesnoth.get_time_stamp()<br />
<br />
==== helper.set_wml_tag_metatable ====<br />
<br />
Sets the metable of a table so that it can be used to create subtags with less brackets. Returns the table. The fields of the table are simple wrappers around table constructors.<br />
<br />
T = helper.set_wml_tag_metatable {}<br />
W.event { name = "new turn", T.message { speaker = "narrator", message = "?" } }<br />
<br />
==== helper.modify_unit ====<br />
<br />
Modifies all the units satisfying the given filter (argument 1) with some WML attributes/objects (argument 2). This is a Lua implementation of the [http://www.wesnoth.org/macro-reference.xhtml MODIFY_UNIT] macro.<br />
<br />
helper.modify_unit({ id="Delfador" }, { moves=0 })<br />
<br />
==== helper.move_unit_fake ====<br />
<br />
Fakes the move of a unit satisfying the given filter (argument 1) to the given position (argument 2). This is a Lua implementation of the [http://www.wesnoth.org/macro-reference.xhtml MOVE_UNIT] macro.<br />
<br />
helper.move_unit_fake({ id="Delfador" }, 14, 8)<br />
<br />
==== helper.rand ====<br />
<br />
(A shortcut to set_variable's rand= since math.rand is an OOS magnet and therefore disabled.) Pass a string like you would to set_variable's rand=.<br />
<br />
create a random unit at (1, 1) on side=1 :<br />
wesnoth.put_unit(1, 1, { type = helper.rand("Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Scout") })<br />
<br />
==== helper.round ====<br />
<br />
{{DevFeature1.11}}Unlike other languages (Python, Perl, Javascript, ...), Lua does not include a round function. This helper function allows rounding numbers, following the "round half away from zero method", see Wikipedia [[http://en.wikipedia.org/wiki/Rounding_numbers#Round_half_away_from_zero]]. Returns the number rounded to the nearest integer.<br />
<br />
-- this number will be rounded up<br />
helper.round(345.67) -- returns 346<br />
-- this one will be rounded down<br />
helper.round(543.21) -- returns 543<br />
-- an integer stays integer<br />
helper.round(123) -- returns 123<br />
-- works also for negative numbers<br />
helper.round(-369.84) -- returns -370<br />
helper.round(-246.42) -- returns -246<br />
<br />
==== helper.shuffle ====<br />
<br />
{{DevFeature1.11}}This function randomly sorts in place the elements of the table passed as argument, following the Fisher-Yates algorithm. It returns no value.<br />
'''WARNING:''' this function uses Lua's math.random(), and so it is MP-unsafe. It is provided mainly for AI development, although it should work inside wesnoth.synchronize_choice() as well.<br />
local locs = wesnoth.get_locations( { terrain="G*" } )<br />
helper.shuffle( locs )<br />
<br />
[[Category: Lua Reference]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Content&diff=51617Guide to UMC Content2013-07-08T09:32:34Z<p>Dugi: /* Legend of the Invincibles */</p>
<hr />
<div>''This is a guide to the current (1.10.x/1.11.x) UMC campaigns for players. It aims to provide all the information not only about the story, but also about completion, difficulty and playing style of the campaign. See also [[Guide_to_UMC_Campaigns/Players_Reviews|Players Reviews]], as well as http://forums.wesnoth.org/viewtopic.php?f=8&t=37476 for further information and http://forums.wesnoth.org/viewtopic.php?f=8&t=36733 (for currently non-available UMC-content). Please edit, it is a wiki.''<br />
<br />
=== Blueprint ===<br />
<br />
'''Status:'''<br />
* Broken = Does not work at all<br />
* Incomplete = Partially written, no progress<br />
* WIP = Partially written, progress<br />
* Complete = Completely written, but buggy as well as potential balance issues.<br />
* Finished = Completely written, minimal to no bugs, slight balance issues possible. <br />
<br />
'''Length:'''<br />
<br />
'''Author:'''<br />
<br />
'''Maintainer:''' if not maintained by the author anymore.<br />
<br />
'''Description:'''<br />
<br />
'''Version: '''<br />
<br />
'''Requirements:'''<br />
<br />
'''Difficulty:'''<br />
<br />
Please note: Often campaigns introducing new mechanics are listed as expert level on the add-on server, here difficulty means the raw difficulty after the mechanics are understood.<br />
<br />
* Unbalanced = If you can't beat the hard mode, it isn't necessarily unbalanced, but if the difficulty changes erraticly from one scenario to the next and only people using the debug mode have seen the final, then it is.<br />
* Easy<br />
* Normal<br />
* Hard<br />
<br />
'''Style:''' <br />
<br />
Please note: Many campaigns will feature more than one style. Please list the most significant ones.<br />
<br />
* Skirmish = small to medium sized armies, your standard Wesnoth gameplay<br />
* Dungeon = long and narrow tunnels (not every underground scenario is a dungeon, a dungeon isn't necessarily underground)<br />
* RPG = role playing game elements such as talking with non-player-characters, item collection, dependency on a party of very few adventurers without or limited recruits<br />
* Survival = being exposed to changing, spawning enemies while remaining on the same map<br />
* Large Battle = large number of units on the battlefield, sizely maps<br />
* Simulation = campaigns feat. terrain modification, alternative resources<br />
* Boss battle = the challenge is to defeat a single powerful enemy unit<br />
* Minigames = there are puzzles and minigames in the campaign that significantly differ from standard Wesnoth gameplay<br />
<br />
'''Faction/Era:'''<br />
<br />
* Era for the whole campaign and more specifically the faction or unit composition you field.<br />
<br />
'''Custom units:'''<br />
<br />
* Link to the unit tree for cases that don't feel sufficiently described by Faction / Era entry.<br />
<br />
'''Forum:'''<br />
<br />
* Links to the feedback and development threads at forums.wesnoth.org<br />
<br />
<br />
<br />
<br />
<br />
== Battle for Wesnoth 1.10.x - stable ==<br />
<br />
''Campaigns available in the 1.10.x stable version.''<br />
<br />
<br />
<br />
=== A Gryphon's Tale ===<br />
<br />
'''Status:''' One branch complete, most incomplete<br />
<br />
'''Length:''' 11-12 scenarios (branch dependent)<br />
<br />
'''Author:''' Ringcaat/Dwarven_Void<br />
<br />
'''Description:''' A Gryphon's Tale tells the story of a community of civilized Gryphons, and of Neliflua, an ambitious young female among them who falls into unusual circumstances.<br />
<br />
'''Version:''' 0.6.12<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Style:''' RPG/minigames<br />
<br />
'''Faction/Era:''' Gryphon/Orc<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=2906&start=195&<br />
<br />
<br />
=== After the Storm ===<br />
<br />
''Follow the journey of Galas and his band following the events of <i>Invasion from the Unknown</i>''<br />
<br />
'''Author:''' shadowmaster/ShikadiLord<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 3 episodes of 13 scenarios each, some of which are multi-part<br />
<br />
'''Difficulty:''' Medium-hard<br />
<br />
'''Style:''' Skirmish, Boss Battle, Dungeon<br />
<br />
'''Faction/Era:''' Many custom units<br />
<br />
'''Version:''' 0.9.5<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32091<br />
<br />
'''Note:''' (vultraz) Long, very enjoyable campaign with great story. (Knyghtmare) The best UMC campaign ever!<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#After_the_Storm Players´ Review]'''<br />
<br />
=== Aldur The Great ===<br />
<br />
''This is a story about Aldur the Great.''<br />
<br />
'''Author:''' pintercsabi<br />
<br />
'''Status:''' Complete, but unbalanced<br />
<br />
'''Length:''' 5 playable scenarios<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''Version:''' 1.2.2<br />
<br />
'''Forum:''' -<br />
<br />
'''Note:''' (Adamant14) Short unbalanced campaign, maybe abandoned. You fight with Peasants, Ruffians and Woodsman against Orcs<br />
<br />
<br />
=== Alfhelm the Wise ===<br />
<br />
''This is the tale of Alfhelm, called by some the Wise, son of Alfric Conqueror. This is the tale of his victories over his enemies, and his rise to power in the clans of Marauderdom. This is the tale of his journey south and his destruction of the Lavinian Empire. And this is the tale of his demise in the dark forests far to the east of his homeland.''<br />
<br />
'''Author:''' turin<br />
<br />
'''Maintainer:''' UnwiseOwl<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 15 gameplay scenarios <br />
<br />
'''Difficulty:''' Moderate<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Imperial Era, Marauders.<br />
<br />
'''Version:''' 0.6.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=17144<br />
<br />
'''Note:''' (Maintainer) Though this campaign is complete and playable the whole way through, the code is four years old and pretty buggy. If you notice any errors while playing, please let me know and I'll incorporate the fixes into my next revision as soon as possible.]<br />
<br />
<br />
=== A New Order ===<br />
<br />
'''Author:''' szopen<br />
<br />
'''Status:''' Finished. <br />
<br />
'''Length:''' 45 scenarios.<br />
<br />
'''Description:''' The old kingdom of Wesnoth has fallen before barbarian hordes. The occupying barbarians are on the brink of civil war, the seeds of Wesnothian rebellion are kept alive by old legends, while bandits and Khalifate mercenaries roam the land. Can Gawen Hagarthen unite these disparate factions against a common foe?<br />
Note: This campaign contains mature themes, some of which may be unsuitable for children.<br />
<br />
'''Version: ''' 1.2.15<br />
<br />
'''Requirements:''' Requires BfW 1.10. In addition, you have to install Era Khalifate add-on; the Akladian Music package is optional<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Akladians, Khalifate<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=6486<br />
<br />
'''Note:''' (Pyrophorus) Certainly one of the most mature and well designed campaign in add-ons. A must.<br />
<br />
''' [http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#A_New_Order Players´ Review]'''<br />
<br />
<br />
=== Antar, Son of Rheor ===<br />
<br />
''This is the story about a young Lord and his first mission; sent by his father the young Lord Antar has to relieve his neighbours; he has to convince the Elves and Dwarves to ally him; he has to fight against hordes of Orcs and Endless Undead; and finally he has to defeat Mal Kazur, the mastermind who is behind all the evil.''<br />
<br />
'''Author:''' Adamant14<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' 9 playable scenarios / 1 cutscene<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Loyalists and Elves (feat. fencer as main hero + various allies)<br />
<br />
'''Version:''' 0.9.9<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36075<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Antar.2C_Son_of_Rheor Players´ Review]'''<br />
<br />
<br />
=== A Story of the Northlands ===<br />
<br />
''A story of life and death in a remote village of the Northlands. Your village has been overrun by an orcish raid. You fight for its freedom while you wait for help to arrive.''<br />
<br />
'''Author:''' zepko<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 10 playable scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default + additions: you play with a custom faction of outlaws and with a custom party of loyalist knights.<br />
<br />
'''[http://units.wesnoth.org/1.10/A_Story_of_the_Northlands/en_US/A_Story_of_the_Northlands.html Custom Units]'''<br />
<br />
'''Version:''' 1.0.0<br />
<br />
<br />
=== A Vision Blinded ===<br />
<br />
''Defend the northern forest against what appeared like a routine orcish raid, and unravel the greater conspiracies that lie below its waves.''<br />
<br />
'''Author:''' LemonTea<br />
<br />
'''Maintainer:''' AxalaraFlame<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 13 playable scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves (+ Trolls, Outlaws)<br />
<br />
'''[http://units.wesnoth.org/1.10/A_Vision_Blinded/en_US/A_Vision_Blinded.html Custom units]'''<br />
<br />
'''Version:''' 0.6.9<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=23463&hilit=a+vision+blinded<br />
<br />
<br />
=== Bad Moon Rising ===<br />
<br />
''An expedition to gather treasure from the cold north sets off compounding disaster.''<br />
<br />
'''Author:''' Doofus-01<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 20 scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Archaic Era<br />
<br />
'''Version:''' 1.4.4.a<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31348<br />
<br />
<br />
=== Battle Against Time ===<br />
<br />
''Rescue fellow orcish warchief before he is executed. (This is not a normal campaign. It is experiment with carryover system. You will start with defined number of turns and gold. You will only have that many turns to play through the whole campaign. There is no finish bonus and gold carryover is always 100%.)''<br />
<br />
'''Author:''' Wonderboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 4 playable scenarios + 1 prologue scenario<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default: Orcs<br />
<br />
'''Version:''' 1.0.0<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?f=8&t=27319<br />
<br />
<br />
=== Besieged Druids ===<br />
<br />
''A elvish school for druids comes under attack by goblins. It seems more than just a routine raid; is there something more sinister behind this attack? - In Beseiged Druids, you control Eärendil, the surviving teacher at the school, and the many and varied initiates. Not all of these are ordinary students; many have been experimenting with other forms of magic, while others are simply overachievers in some area of study. Unfortunately, they are not especially good at combat, at least initially. Together with a very small contingent of surviving guards, it is up to these students to save the island of Aleron from disaster.''<br />
<br />
'''Author:''' Celtic Minstrel<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 9 scenarios<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves<br />
<br />
'''[http://units.wesnoth.org/1.10/DruidSiege/en_US/celmin-druid-siege.html Custom units]'''<br />
<br />
'''Version:''' 1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37342<br />
<br />
<br />
=== Birth of a Lich ===<br />
<br />
''This is the life story of the dreaded lich Malifor, his struggle as a mage outcast, the orcish conquest of the northlands and his transformation to quench the thirst for revenge''<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 12 playable scenarios / 2 dialogue only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle, Dungeon<br />
<br />
'''Faction/Era:''' Human outlaws, dwarves, undead<br />
<br />
'''[http://units.wesnoth.org/1.10/Birth_of_a_Lich/en_US/Birth_of_a_Lich.html Custom Units]<br />
<br />
'''Version:''' 1.0.3<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37057<br />
<br />
<br />
=== Bitter Revenge===<br />
<br />
''Amidst the strife and turmoil of the first Dark Age of Wesnoth, a time of transient monarchies and conspiracies against the Crown, the boy Darith witnesses the murder of his father by a general of Wesnoth. Follow Darith's quest for retribution in this treacherous tale of betrayal, deceit, love, remorse, and vengeance.''<br />
<br />
'''Author:''' Wonderboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 11 playable scenarios + 4 dialogue only<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default (mostly outlaws and undead, custom units)<br />
<br />
'''Version:''' 1.1.0<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?f=8&t=26699<br />
<br />
<br />
=== Cavanagh The Conqueror ===<br />
<br />
''This is the tale of Cavanagh Orc-Foundling, who was blessed by the gods to conquer and unite all of the Great Continent. Orcs and elves, gods and men, queens and sorcerers populate this epic tale of revenge and redemption.''<br />
<br />
'''Author:''' TheEmptyLord (Programming, Map-making, Editing), Scott_Free(Story)<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' 10 Playable Scenarios so far<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, limited RPG, limited Large Battle<br />
<br />
'''Faction/Era:''' Default (Units from Northerners, Outlaws, Loyalists as well as other factions interspersed. Several custom units.)<br />
<br />
'''Version:''' 0.1.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=35927<br />
<br />
<br />
=== Cities of the Frontier ===<br />
<br />
''Settle a new town in the wilds north of the Great River.''<br />
<br />
''This campaign makes several changes to the standard Wesnoth game mechanics, and focuses on city-building and gold management.''<br />
<br />
'''Author:''' esci<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' Not fixed, approximately 6-10 seasons of 36 turns each<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Simulation, Survival<br />
<br />
'''Faction/Era:''' Default, Loyalist<br />
<br />
'''[http://units.wesnoth.org/1.10/Cities_of_the_Frontier/en_US/Cities_of_the_Frontier.html Custom units]'''<br />
<br />
'''Version:''' 0.5.1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36004<br />
<br />
<br />
=== Considerate Dead ===<br />
<br />
''As the wind goes on and on, people discover necromancer aren't always bad. Made by tribes45 - No scenarios are done, 4 playable out of ??.''<br />
<br />
'''Author:''' tribes45 aka tribes55<br />
<br />
'''Status:''' Incomplete, unbalanced, abandoned<br />
<br />
'''Length:''' 5 scenarios<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''Version:''' .009<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36522<br />
<br />
<br />
=== Count Kromire ===<br />
<br />
''You are the blood son of a vampire lord, however when the might of the celestial crusades comes knocking, and your father is slain, you flee your lands. However you intend to return, to restore the lands of Kromire to the Kromires, to avenge your father, and most importantly, to make sure that no celestial ever dares come into your mountains again.''<br />
<br />
'''Author:''' Velensk<br />
<br />
'''Maintainer:''' currently none<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 9 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Era of Myths, Vampires<br />
<br />
'''Version:''' 1.3.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=21560<br />
<br />
<br />
=== Elvish Dynasty RPG ===<br />
<br />
''You are the new ruler of an elvish kingdom! Can you lead your people to glory? This campaign is highly randomized so it will be different every time you play!''<br />
<br />
''Sequel to Ooze Mini-Campaign''<br />
<br />
'''Author:''' spencelack<br />
<br />
'''Maintainer:''' Wesbane<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 10 years, in each year choice between dialogue and fighting scenario (selected out of a large pool of possible scenarios)<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' RPG, Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves<br />
<br />
'''Version:''' 0.9.9b<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=28627<br />
<br />
<br />
=== Fall of Silvium ===<br />
<br />
''You are Caius Regilius, Tribune of the province of Silvia, located in the northmost reaches of the Lavinian Empire at the height of its power. But the Empire has overextended itself, The city of Silvium lies seperated from the rest of the Empire by the mountains of Arendia, and is sandwiched between the Marauders and the Sidhe... war is inevitable, and the province of Silvia will almost certainly fall.''<br />
<br />
'''Author:''' turin<br />
<br />
'''Maintainer:''' UnwiseOwl<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 8 scenarios<br />
<br />
'''Difficulty:''' Medium<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Imperial Era, Lavinian Legion.<br />
<br />
'''Version:''' 0.6<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=31&t=24356<br />
<br />
'''Note:''' The final level of this campaign is not supposed to be winnable. It's a final blaze of glory and chance to use all your high-powered units, but to 'win' the campaign, you must lose...the ending is similar to a certain mainline campaign, but predates it.<br />
<br />
<br />
=== Fate of a Princess ===<br />
<br />
''Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the king's justice. The baron's deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.''<br />
<br />
''Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldres' daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...''<br />
<br />
'''Author:''' SkyOne, mich, simonsmith<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 26-29 scenarios (some dialogue-only), 2 parts<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Dungeon<br />
<br />
'''Faction/Era:''' Default with additions. You play two different, unique cross-faction combinations in each part.<br />
<br />
'''[http://units.wesnoth.org/1.10/Fate_of_a_Princess/en_US/Fate_of_a_Princess.html Custom units]'''<br />
<br />
'''Version:''' 0.9.17<br />
<br />
'''Required Wesnoth version:''' 1.9.12 or later<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=26327<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Fate_of_a_princess Players´ Review]'''<br />
<br />
<br />
=== Forgotten Kingdom ===<br />
<br />
''Help Orlog, a troll chieftan, lead his people to safety in the underground and discover an ancient power long forgotten.''<br />
<br />
'''Author:''' Limabean<br />
<br />
'''Maintainer:''' Chrysophylax<br />
<br />
'''Status:''' Incomplete ( but all scenarios playable and balanced )<br />
<br />
'''Length:''' 9 playable scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Goblins, Trolls<br />
<br />
'''[http://units.wesnoth.org/1.10/Forgotten_Kingdom/en_US/Forgotten_Kingdom.html Custom units]'''<br />
<br />
'''Version:''' 0.1.7<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=23483<br />
<br />
'''Note:''' (Adamant14) This campaign includes a custom Troll line. A good campaign, I hope Limabean and/or Chrysophylax will finish it.<br />
<br />
<br />
=== Forward they Cried ===<br />
<br />
''You are the leader of an advanced detachment that has been tasked with capturing a bridgehead while the main army prepares to attack. It should be a simple enough assignment.''<br />
<br />
'''Author:''' Glowing Fish<br />
<br />
'''Maintainer:''' Lord-Knightmare <br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 1 scenario ( rather a single scenario than a campaign )<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default Loyalists<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=23656&p=350126&hilit=forward+they+cried#p350126<br />
<br />
'''Version:''' 1.0.0<br />
<br />
'''Note:''' (Adamant14) Only a single scenario, but a great scenario.<br />
(UnwiseOwl) You wouldn't want to stop thinking for a turn, and it's good for the first few turns, but this one leaves me wanting more.<br />
<br />
<br />
=== Galuldur's First Journey ===<br />
<br />
''While the belligerence of orcs is nothing new, their intensifying attacks on a fledgling colony of elves in Pindir Forest begin to show signs of a deeper malice, forcing Galuldur, the young son of the colony's adventurous founder Galur, to venture out of his forest's friendly trees in search of help. His simple errand quickly turns into a frantic quest to unearth the roots of the mysterious evil threatening his people. As you lead him through unknown lands, Galuldur, forced to match wits with unexpected adversaries at nearly every turn in a desperate attempt to save his world, quickly learns that the world is neither a friendly nor a simple place.''<br />
<br />
'''Author:''' mattsc<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 8-9 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves<br />
<br />
'''[http://units.wesnoth.org/1.10/Galuldur/en_US/Galuldur.html Custom units]'''<br />
<br />
'''Version:''' 1.1.1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31895<br />
<br />
<br />
<br />
=== Girl unDead ===<br />
<br />
A little undead girl fights against the Kingdom. <br />
<br />
'''Author:''' tapaboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 11 playable scenarios<br />
<br />
'''Version: ''' 0.9.20<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default undead,elves<br />
<br />
'''[http://units.wesnoth.org/1.10/Girl_unDead/en_US/Girl_unDead.html Custom Units]'''<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37458<br />
<br />
<br />
=== Grnk the Mighty ===<br />
<br />
''All his life, puny little goblin Grnk the Frail had been dreaming about leaving the orcs and starting a better life. When he finally arrives in the human town of Shmaltupp, he realizes that the world is not as black and white as he had imagined. He also discovers that he is no ordinary goblin. Follow Grnk the Frail on his path to becoming Grnk the Mighty.''<br />
<br />
'''Author:''' mattsc<br />
<br />
'''Status:''' Part I complete<br />
<br />
'''Length:''' 13 scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish, RPG<br />
<br />
'''Faction/Era:''' Default, changing (no standard army building gameplay)<br />
<br />
'''[http://units.wesnoth.org/1.10/Grnk/en_US/Grnk.html Custom units]'''<br />
<br />
'''Version:''' 1.0.5<br />
<br />
'''Required Wesnoth version:''' 1.9.5 or later<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34970<br />
<br />
<br />
=== Invasion from the Unknown ===<br />
<br />
''Episode I - Seeking the Light: Long after the Fall, the last forest elves are forced to abandon their safe valley, and find themselves resorting to the dark means of necromancy in order to survive the perils and challenges of this new harsh world. May they finally free the Great Continent from its chaos, or perish in the foolish attempt of restoring peace and life to the lands.''<br />
<br />
''Episode II - Armageddon: As the shadow of Chaos covers the entire continent, an assorted group of foolish heroes prepares a counter-attack to the Empire, with one unique goal in their minds: defeat the evil Emperor, whoever it is. Lead these courageous living and non-living warriors to victory, and rediscover lost secrets of the history.''<br />
<br />
'''Author:''' shadowmaster <br />
<br />
'''Maintainer:''' Espreon<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 26 scenarios in two episodes<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Dungeon, Boss battle<br />
<br />
'''Faction/Era:''' Unique. You play Elves and Undead throughout the campaign + in the 2nd part Northerners and Aragwaithi.<br />
<br />
'''Version:''' 1.90.6<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Invasion_from_the_Unknown Players´ Review]'''<br />
<br />
'''Note:''' (taptap) Despite its acknowledged flaws (generic hero, plot holes, deus ex machina moments, gameplay issues in the 2nd part) this is undoubtedly the most iconic campaign in UMC. It single-handedly redefines the elvish history and sketches a cosmology for the ages after the fall. With the Chaos empire and its various allies it introduces an era worth of factions to single-player play. At the same time it features some of the most beautiful maps in Wesnoth and stunning art on par with mainline campaigns.<br />
<br />
<br />
=== Invasion of Eliador ===<br />
<br />
''A peaceful island is about to be invaded by unknadd-ons foes travelling towards the eastern shore. It is up to a family of outlaws to warn the island's inhabitants before it's too late.''<br />
<br />
'''Author:''' Sam M. (Genosuke)<br />
<br />
'''Maintainer:''' trewe<br />
<br />
'''Version:''' 1.0.4<br />
<br />
'''Style:''' RPG, Skirmish, Puzzle<br />
<br />
'''Length:''' 10 scenarios + epilogue<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Faction:''' Default (outlaws)<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=6556<br />
<br />
'''Wiki:''' [[Invasion_of_Eliador]]<br />
<br />
<br />
=== Langrisser Sample Campaign ===<br />
<br />
''The Imperial Knights of the Rayguard Empire have disrupted the peace of the village that was Hein's hometown, seeking only a girl named Liana. Fight to rescue Liana.''<br />
<br />
'''Author:''' Morath<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 1 playable scenario<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves<br />
<br />
'''Version:''' 0.1.0.5<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36417&hilit=Langrisser<br />
<br />
'''Wikipedia:''' [http://en.wikipedia.org/wiki/Langrisser What is Langrisser]<br />
<br />
'''Note:''' (Adamant14) Single scenario, different from usual Wesnoth behaviour.<br />
<br />
<br />
=== Legend of Far North ===<br />
<br />
''The tale of the legendary Black Eye Karun,depicting his rise to power, his successes and his brutal assassination.'<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 16 playable scenarios / 1 dialogue only,1 cutscene<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Orcs, Trolls, Saurians, Nagas<br />
<br />
'''[http://units.wesnoth.org/1.10/Legend_of_Far_North/en_US/Legend_of_Far_North.html Custom Units]'''<br />
<br />
'''Version:''' 1.0.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34769<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''''Part I: Shrouded in Darkness''' (5 chapters, 90 scenarios) - A pair of heroes, after stopping an orcish thread, are outcast into caves, where they have no other choice than to become liches in order to survive. They preserved their original appearance and moral principles, and fight in various skirmishes against evil (although using evil methods sometimes), until the Fall, when they are buried alive under the ashes of the third sun.''<br />
<br />
'''''Part II: Into the Light''' (5 chapters, 110 scenarios) - Long after the Fall, the lich heroes awaken. Searching for more power, they manage to resurrect themselves as living beings, but this time more powerful and ridden of the evil within. But the evil from inside them did not cease to exist, and started a campaign to conquer the world. Stopping the campaign caused an even worse disaster...''<br />
<br />
'''Author:''' Dugi <br />
<br />
'''Status:''' complete<br />
<br />
'''Length:''' 200 (+8 talk-only) scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' mostly Skirmish and Dungeon (all other styles are present as well, but less frequently)<br />
<br />
'''Faction/Era:''' Elves, Loyalists, Undead, Dwarves; but they advance past their usual maximum level<br />
<br />
'''Version:''' 3.0.1<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Legends_of_the_Invincibles Players´ Review]'''<br />
<br />
'''Note:''' The most unique feature of this campaign is its RPG-like unit development system, enemies drop items units can use, leaders are stronger than most usual units and all units get AMLA (after maximum level advancement) after reaching their maximum level (that is also increased by a load of additional level 4 units).<br />
<br />
=== Merry Christmas ===<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 3 playable scenarios<br />
<br />
'''Author:''' Desert_Shyde<br />
<br />
'''Description:''' Santa's elfs have to travel south into Lintanir Forest to collect Christmas trees.<br />
<br />
'''Version:''' 1.1.2<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Custom<br />
<br />
'''[http://units.wesnoth.org/1.10/Merry_Christmas/en_US/merry_christmas.html Custom Units]'''<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32519<br />
<br />
<br />
=== Panther Lord ===<br />
<br />
''The Imperialists ambitions of pushing into the Sea States have been repeatedly thwarted and now they turn their attentions elsewhere. You are an outcast Darklander now living as a mercenary in the Sea States and the rumors you hear indicate that they will be coming to your people. Though an outcast you do not wish to see them subjugated. The spirit whose friendship caused you to be an outcast has a plan that might allow you to save them.''<br />
<br />
'''Author:''' Velensk <br />
<br />
'''Maintainer:''' Lavender<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 14 scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Era of Four Moons, Darklanders (+ a wide variety of mercenaries)<br />
<br />
'''Version:''' 1.0.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34318<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Panther_Lord Players´ Review]'''<br />
<br />
<br />
=== Random Campaign ===<br />
<br />
''Gain experience playing the Default Era faction of your choice in a campaign setting''<br />
<br />
'''Author:''' SigurdFireDragon<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 7 playable scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Age of Heroes, & Era of Legends<br />
<br />
'''Version:''' 1.0.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32922<br />
<br />
'''Note:''' (Author) A 4 scenario version is under the multiplayer button, which lets you choose any era.<br />
Intended for players to gain practice with a faction and learn sound strategies using faction specific adjustments against random factions from the chosen era.<br />
<br />
<br />
=== Rebellion in the North ===<br />
<br />
''A great orcish uprising tends to destabilise the Northlands. As the future Lord Protector of the Northern Alliance you have to crush the rebellion and establish peace again."<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 24 playable scenarios / 3 dialogue only,2 cutscenes<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Loyalists, Dwarves, Gryphons, Merfolk<br />
<br />
'''Version:''' 1.1.12<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=33059<br />
<br />
<br />
=== Return of the Monster ===<br />
<br />
''It was time for Amailoss, born from the naga queen's last egg, to leave home. Time for him to grow into a leader in his own right, and eventually become the guardian and leader of another naga city. But along the way, he became friends with an unusual mud-crawler, they met a strange young monster, discovered that a spirit had escaped from an orc prison, and the mystery of that spirit became a grave challenge for Amailoss and the many races in the region....''<br />
<br />
''A naga campaign, involving elves, orcs, saurians, turtle-like races, and some monsters.''<br />
<br />
'''Author:''' SkyOne<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 16 playable, 2 dialog scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Dungeon<br />
<br />
'''Faction/Era:''' Default with additions. You play a custom naga faction and carapaces (a turtle-like race).<br />
<br />
'''[http://units.wesnoth.org/1.10/Return_of_the_Monster/en_US/Return_of_the_Monster.html Custom units]'''<br />
<br />
'''Version:''' 0.7.1<br />
<br />
'''Required Wesnoth version:''' 1.10.x<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36438<br />
<br />
<br />
=== Return to Noelren ===<br />
<br />
'''Status:''' Complete.<br />
<br />
'''Length:''' 26 scenarios + 7 cut scenes<br />
<br />
'''Author:''' Pyrophorus<br />
<br />
'''Description:''' ''A story in the first Dark Age of Wesnoth. See how various heroes stick together to shun the threat of black magics, restore the secret kingdom of Noelren and install Garard I on the throne of Wesnoth. This campaign features complex scenarios, unusual objectives and units, emphasizing more on story and adventures than hardcore fighting.''<br />
<br />
'''Version: ''' 0.7.6<br />
<br />
'''Requirements:''' BfW 1.10 (not tested on 1.11)<br />
<br />
'''Difficulty:''' Easy, unbalanced<br />
<br />
'''Style:''' Skirmish, RPG, Large Battle, Simulation<br />
<br />
'''Faction/Era:''' Default + custom units<br />
<br />
'''[http://units.wesnoth.org/1.10/ReturnToNoelren/en_US/ReturnToNoelren.html Custom Units]'''<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34685#p501026<br />
<br />
'''Note:''' (Adamant14) I never saw so much fantastic and new ideas in one single UMC, wow!<br />
<br />
<br />
=== Return to Ruins ===<br />
<br />
''The humble farmers of Vertegris are summoned by Erik the General of Weldyn to put an end to an orcish raiding party. If they knew what would befall their former home... They never would have left. This is a relatively short campaign with 8 scenarios, It is still undergoing changes.''<br />
<br />
'''Author:''' Jeff Stevens (Ulfsark)<br />
<br />
'''Composer:''' Paul Fredericks (paulfredericksmusic.com)<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 7 scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Easy,Normal,Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default,(Loyalists, Outlaws)<br />
<br />
'''Version:''' 0.5.1<br />
<br />
'''Required Wesnoth version:''' 1.10.x <br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37790&sid=9059f18497cda1219f42a626544d0ffd&p=540646#p540646<br />
<br />
'''Note:''' (Adamant14) You play a short campaign with just a few units. Playable in a few hours, nevertheless it is fun to play.<br />
<br />
<br />
=== Salt Wars ===<br />
<br />
''Introductory campaign for the Era of Four Moons.''<br />
<br />
''As an officer of one of the Sea States you must defend your organization from aggressive rivals.''<br />
<br />
'''Author:''' Velensk <br />
<br />
'''Maintainer:''' Lavender<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 5 scenarios<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Era of Four Moons, Sea States<br />
<br />
'''Version:''' 0.2.1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31498<br />
<br />
<br />
=== Saving Elensefar ===<br />
<br />
''Meneldur, elvish mariner of Elensefar, is driven to sea by the same orcs who attacked the city. He must gather an army willing to fight for him to regain Elensefar, his adopted homeland.''<br />
<br />
'''Author:''' Turin<br />
<br />
'''Maintainer:''' trewe<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 1 year (around 12 scenarios)<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, RPG, Simulation<br />
<br />
'''Version:''' 1.5.2<br />
<br />
'''Faction:''' Default Era<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?t=3072&start=0<br />
<br />
'''Wiki:''' [[SeafaringCampaign]]<br />
<br />
'''Note:''' Labeled as Expert, recruit list changes in all scenarios.<br />
<br />
<br />
=== Shameless Crossover Excuse ===<br />
<br />
''Fugitive dark sorcerer Gwiti Ha'atel discovers he has the power to mess with Wesnoth's continuity. His quest for revenge on the NPCs who have used his portraits will lead him through perils untold and in-jokes unnumbered, but shall pale before the horror he finds at his quest's end.''<br />
<br />
'''Author:''' Orcish Shyde, Mountain_King<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 9 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Version:''' 1.1.0<br />
<br />
'''Faction:''' Undead<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32016&start=15<br />
<br />
<br />
=== Swamplings ===<br />
<br />
''Banished by Yushnak the Ponderer, a tribe of lowly swamp goblins endure in the deadly mire of Pogo Bog. Four centuries before the founding of Wesnoth, this is the story of the goblins' struggle against the intrigues and betrayals of the greater races, and the rise of the first wolf rider.''<br />
<br />
'''Author:''' John Rawlins (boru)<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 14 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Version:''' 1.1.7n<br />
<br />
'''Faction:''' Goblins<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=29784<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Swamplings Players´ Review]'''<br />
<br />
<br />
=== Talentless Mage===<br />
<br />
''Humorous and silly campaign about mage apprentice who has managed to learn only one simple spell in thirty years.''<br />
<br />
'''Author:''' Wonderboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 11 playable scenarios + 3 dialogue scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Noob Faction<br />
<br />
'''[http://units.wesnoth.org/1.10/Talentless_Mage/en_US/Talentless%20Mage.html Custom Units]'''<br />
<br />
'''Version:''' 1.1.0<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?f=8&t=27608]<br />
<br />
'''[http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns/Players_Reviews&action=submit#Talentless_Mage Players´ Review]'''<br />
<br />
<br />
=== The Dark Alliance===<br />
<br />
''Prince Terhar lived two years with elves. Little did he expect what would happen when he returned back to Weldyn.''<br />
<br />
'''Author:''' Wonderboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 11 or 10 playable scenarios depending on the branch you take (+ 5 dialogue scenarios)<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default: Recruit list changes in almost every scenario<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Dark_Alliance/en_US/The%20Dark%20Alliance.html Custom Units]'''<br />
<br />
'''Version:''' 1.0.3"<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?f=8&t=26924<br />
<br />
<br />
=== The Dark Hordes ===<br />
<br />
'''Status:''' Incomplete/WIP<br />
<br />
'''Length:''' 11/?<br />
<br />
'''Author:''' Circon<br />
<br />
'''Maintainer:''' Various<br />
<br />
'''Description:''' Lead fugitive dark sorcerer Gwiti Ha’atel to mastery of the undead hordes.<br />
<br />
'''Version: '''<br />
<br />
'''Requirements:'''<br />
<br />
'''Difficulty:'''<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default undead<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Dark_Hordes/en_US/The_Dark_Hordes_1.html Custom Units]'''<br />
<br />
'''Walkthrough:''' [[TheDarkHordes]]<br />
<br />
'''Forum:''' [[http://forums.wesnoth.org/viewtopic.php?f=8&t=16576&]]<br />
<br />
<br />
=== The Devil's Flute ===<br />
<br />
'''Status:''' Complete, unmaintained<br />
<br />
'''Length:''' 10 scenarios<br />
<br />
'''Author:''' lipk<br />
<br />
'''Description:''' Creona, the well-known assassin, gets a strange job from a strange person. So, in fact, it's no surprise that things take a strange turn...<br />
<br />
'''Version:''' 0.1.4c<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish, Minigames<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Devils_Flute/en_US/The_Devils_Flute.html Custom Units]'''<br />
<br />
'''Faction/Era:''' Outlaws<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36044<br />
<br />
<br />
=== The Earth's Gut ===<br />
<br />
''The year is 515YW. You are the young dwarven leader Hamel. Your tribe in the caves of Knalga is under pressure from its enemies, and resources are growing scarce. In order to forge the weapons required to resist your enemies, you must set forth and collect what ores and minerals remain.''<br />
<br />
'''Author:''' Anonymissimus<br />
<br />
'''Maintainer:''' Anonymissimus<br />
<br />
'''Status:''' WIP, story is unfinished (I didn't add any scenario since long, but that doesn't mean nothing is added to the campaign. My addons tend to be in good shape and bug-free which means also WIP as I'm updating it since 1.4 days.)<br />
<br />
'''Length:''' 23 scenarios, 5 of which are cutscene only, some others have changing objectives<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Dungeon, Skirmish<br />
<br />
'''Faction/Era:''' Default, dwarves, woses, mages, a few custom units<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Earths_Gut/en_US/the_earths_gut.html Custom units]'''<br />
<br />
'''Version:''' 0.2.14<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=26800<br />
<br />
'''Note:''' This campaign is a "Dwarvish dungeon crawler" (It currently contains about as many surface scenarios as underground though.) and is intended to be challenging for experienced players on hard whilst suitably easy on easy. I develop the campaign with the wesnoth development version and I advise to play with that, but it is intended to work almost equally well with the stable wesnoth version (except for features only available in the wesnoth development version).<br />
<br />
<br />
=== The Epic of Vaniyera ===<br />
<br />
''The expansionist Lavinian Legion, led by the Imperator himself, has invaded the northern forests of the Sidhe, or Wild Elves. It is up to Leithan the Thunderblade and his advisor Vaniyera to push its armies back where they came from...''<br />
<br />
'''Author:''' oreb, turin<br />
<br />
'''Maintainer:''' UnwiseOwl<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 6 scenarios<br />
<br />
'''Difficulty:''' Hard (Don't be fooled by "novice level" in the campaign description, this one is very hard.) <br />
<br />
'''Note:''' (Maintainer) Working on this issue, the next release (due at the end of November, hah!) should bring easy difficulty back to the level of a reasonable introduction to the IE, while the hard difficulty will also become slightly easier. With any luck, this will be the last release before version 1.0 of the campaign].<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Imperial Era, Sidhe.<br />
<br />
'''Version:''' 0.9.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=19490<br />
<br />
<br />
=== The Fall of Wesnoth ===<br />
<br />
''As the beloved human empire of Wesnoth becomes lazy and arrogant in its peaceful state of happiness, Emperor Dantair demands the creation of another sun in a bid to destroy all evil. Or is it all for a different purpose? A man named Alitar sees it that way, and now he must survive the most evil inhabited lands if he is to stop chaos from rising, and Wesnoth from falling... This is the story of The Fall of Wesnoth.''<br />
<br />
'''Author:''' Pewskeepski<br />
<br />
'''Status:''' 1st part complete, 2nd WIP.<br />
<br />
'''Length:''' 10 playable scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Outlaws<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Fall_of_Wesnoth/en_US/The_Fall_of_Wesnoth-1.html Custom units]'''<br />
<br />
'''Version:''' 1.0.8<br />
<br />
<br />
=== The Founding of Borstep ===<br />
<br />
''The chieftain of your tribe has become decadent and weak. Take over, and lead your people to a better home--whether it is already occupied or not. The Northlands in year 9W are a barbaric place, but anyone who stands in your way will learn the power of orcs!'' <br />
<br />
'''Author:''' Beetlenaut<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 10 and 1 dialogue only<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Northerners<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Founding_of_Borstep/en_US/The_Founding_of_Borstep.html Custom units]'''<br />
<br />
'''Version:''' 1.1.1b<br />
<br />
'''Note:''' (Kanzil) I find the protagonist hard to sympathise with. Also, most scenarios contain interesting twists. For example, in one, each time you killed a boar it gives you extra health.<br />
<br />
'''Note:''' (beetlenaut--author) In most Orcish campaigns the leader is heroic or just wants peace. Krag-Ubor wants plunder and battle like all enemy Orcs in other campaigns. I '''hope''' you don't sympathize too strongly, but I don't think you need to in order to enjoy the game play.<br />
<br />
=== The Legend Begins ===<br />
<br />
'''Status:''' First two episodes completed out of a planned three. You can play the first two episodes. Updated monthly.<br />
<br />
'''Length:''' Approximately 72 scenarios when completed.<br />
----<br />
Episode 1 - 28 scenarios<br />
----<br />
Episode 2 - 26 scenarios<br />
----<br />
Episode 3 - (still in development)<br />
----<br />
<br />
'''Author:''' Tahsin Jahin Khalid (Lord-Knightmare)<br />
<br />
'''Description:''' "''The tale of Jahin, the greatest hero the land of Arkenova, or perhaps the world of Irdya, had ever known. Watch his legend unfold before your very eyes."''<br />
<br />
'''Version:''' 0.2.7<br />
<br />
'''Requirements:''' ''War of Legends'' is required to be installed. Latest version recommended.<br />
<br />
'''Difficulty:''' Intermediate<br />
<br />
'''Style:''' skirmishes, survivals, large battles, dungeons, boss battles, simulations,<br />
<br />
'''Faction/Era:''' Default, War of Legends, Custom Units<br />
<br />
'''Custom units:''' Sorry, apparently the [units.wesnoth.org Units Database] didn't generate one for this campaign...<br />
<br />
'''Forum:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37424 Click Here]<br />
<br />
'''Notes:'''<br />
<br />
----<br />
<br />
=== The Library of Kratemaqht ===<br />
<br />
''An ancient story from the old continent.''<br />
<br />
'''Author:''' Rich Marinaccio (cephalo)<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 17 scenarios<br />
<br />
'''Difficulty:''' Unbalanced (some scenarios are Easy - some rather Hard) <br />
<br />
'''Style:''' Skirmish, RPG<br />
<br />
'''Faction/Era:''' Loyalists and custom units.<br />
<br />
'''[http://units.wesnoth.org/1.10/Library_Of_Kratemaqht/en_US/The_Library_Of_Kratemaqht.html Custom units]'''<br />
<br />
'''Version:''' 1.0.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37798<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#The_Library_of_Kratemaqht Players´ Review]'''<br />
<br />
'''Notes:''' (Adamant14) This campaign has a thought-out story, shows a great love for detail;<br />
It includes a great custom Dragon, some brilliant custom images (fire, burning houses, burning forest) that makes the scenery / maps look very nice.<br />
<br />
<br />
=== The Militia ===<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 15 scenarios<br />
<br />
'''Author:''' Desert_Shyde<br />
<br />
'''Description:''' The Travels of a group of Peasants and their Friends; a level 0 campaign that does not focus on a singular hero.<br />
<br />
'''Version:''' 1.5.1<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Militia/en_US/the_militia.html Custom Units]'''<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?t=30294<br />
<br />
<br />
=== The Roar of the Woses ===<br />
<br />
''When the construction of a dam threatens the existence of her home, Kylix is forced on a journey to stop it.''<br />
<br />
'''Author:''' Alarantalara<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 10-11 scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default with Additions (primarily Saurians, Nagas, Woses)<br />
<br />
'''[http://units.wesnoth.org/1.10/Roar_of_the_Woses/en_US/Swamp_Rage.html Custom Units]'''<br />
<br />
'''Version:''' 1.2.7<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=29830<br />
<br />
'''Note:''' (author) Potentially unbalanced on Hard difficulty due to experiments with non-standard ways to increase difficulty. This issue does not exist on the lower difficulty levels.<br />
<br />
<br />
=== The Three Elves ===<br />
<br />
''Three elves have just begun their adventure in the northern swampland. Will they become heroes or will they be responsible for another undead expansion?''<br />
<br />
'''Author:''' Stanislav Hoferek<br />
<br />
'''Maintainer:''' trewe<br />
<br />
'''Version:''' 0.9<br />
<br />
'''Status:''' Complete<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Length:''' 8 scenarios + 2 dialogue<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction:''' Default (Elves)<br />
<br />
'''Forum:''' (does it have one?)<br />
<br />
<br />
=== The Sojournings of Grog ===<br />
<br />
''Grog (as starred in Under the Burning Suns) goes home.''<br />
<br />
'''Author:''' Peter Christopher, Thomas Hockings <br />
<br />
'''Maintainer:''' Elvish_Hunter<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 18 playable scenarios in 2 parts<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Dungeon, Large Battle<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Sojournings_of_Grog/en_US/The_Sojournings_of_Grog.html Custom units]'''<br />
<br />
'''Faction/Era:''' Default. Most of the time you play trolls and some desert elves accompanying Grog.<br />
<br />
'''Version:''' 3.0.1<br />
<br />
<br />
=== The Unstoppable Legion ===<br />
<br />
''Horseback campaign. The kingdom of Suveran, far away from Wesnoth, is under attack. Only Deuterus, a Great Druid, knows their weakness and only Viktor, a young noble, dares go on the quest to stop them.''<br />
<br />
'''Author:''' Chris Neville-Smith (Chris NS)<br />
<br />
'''Maintainer:''' Chris Neville-Smith (Chris NS)<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' Currently 15 playable sceanrios, including a fork of three paths near the beginning, and another fork of two paths later on.<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Mainly Skirmish<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Unstoppable_Legion/en_US/The_Unstoppable_Legion.html Custom units]'''<br />
<br />
'''Faction/Era:''' Play mounted units, including expanded Cavalryman line, and completely new Bowrider line. Joined later by Dwarves. Main enemies are the dark fighters and dark cultists.<br />
<br />
'''Version:''' 0.8.7<br />
<br />
<br />
=== The White Troll ===<br />
<br />
''The story of a white troll whelp with strange magic powers, who is raised in an elvish village.''<br />
<br />
'''Author:''' Wesnoth Italian Forum<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 8 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default: you play with elves and trolls. Also features custom units with special advancements and abilities.<br />
<br />
'''[http://units.wesnoth.org/1.10/White_Troll/en_US/white_troll.html Custom Units]'''<br />
<br />
'''Version:''' 0.7.5<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=38828<br />
<br />
<br />
=== To Lands Unknown ===<br />
<br />
''This is the story of Mehir, the Summoner, and his journey to lands unknown.''<br />
<br />
'''Author:''' inferno8<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 20 scenarios, 4 dialogue only<br />
<br />
'''Difficulty:''' Intermediate (Era of Magic)<br />
<br />
'''Style''': Skirmish, Dungeon<br />
<br />
'''Era:''' Era of Magic<br />
<br />
'''Version:''' 1.6.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31799<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#To_Lands_Unknown Players´ Review]'''<br />
<br />
<br />
=== Up from Slavery ===<br />
<br />
''The Orcei are captives in the imperial city of Lavinium, gladiators performing for the emperor Optus Maximus. All it will take, however, is one orc to lead his people to freedom. The Samnis called Sparxus may be that orc.''<br />
<br />
'''Author:''' turin<br />
<br />
'''Maintainer:''' UnwiseOwl<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 7 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Arena (= No recruit, small group gladiator fights)<br />
<br />
'''Faction/Era:''' Imperial Era, Orcei Gladiatores<br />
<br />
'''Version:''' 0.6.0<br />
<br />
'''Note:''' (Maintainer) At some point, I am intending to completely re-work this campaign to be a multi-player campaign, with one side led by Sparxus and one by Gravirivus. If anyone would like to take this on or has ideas for how to accomplish this, let us know. Nevertheless, its playable as a single player campaign now with some nice ideas that could be developed further.]<br />
<br />
<br />
=== Warmaster ===<br />
<br />
''One day the scout of your king brings a mysterious little stone, called Zrai-Stone, back from one of his trips. Soon that stone causes a lot of trouble...''<br />
<br />
'''Author:''' Conkinator<br />
<br />
'''Maintainer:''' trewe<br />
<br />
'''Version:''' 1.3.5<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 16 battle + 2 bonus + 1 epilogue scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Faction:''' Default (loyalists)<br />
<br />
'''Style:''' Skirmish, Survival<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=15527<br />
<br />
<br />
=== Way of Dragon ===<br />
<br />
''The story of what might happen if a person against his will transform into a dragon...''<br />
<br />
'''Author:''' DrakeDragon<br />
<br />
'''Status:''' Complete <br />
<br />
'''Length:''' 7 playable scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish/RPG<br />
<br />
'''Faction/Era:''' Default Loyalists<br />
<br />
'''Version:''' 1.2.0<br />
<br />
'''Forum:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37876 Wesnoth Forum] [http://uporoom.ru/index.php/topic,179.0.html Russian Forum]<br />
<br />
'''Note:''' (Adamant14) Promising short campaign, you play with just a few units.<br />
<br />
<br />
<br />
<br />
<br />
<br />
== Battle for Wesnoth 1.11.x - development ==<br />
<br />
''Campaigns available in the 1.11.x development version.''<br />
<br />
''Please note: Battle for Wesnoth 1.11.0 features a bug that messes up the selection of difficulty levels.''<br />
<br />
<br />
=== A Gryphon's Tale ===<br />
<br />
'''Status:''' One branch complete, most incomplete<br />
<br />
'''Length:''' 11-12 scenarios (branch dependent)<br />
<br />
'''Author:''' Ringcaat/Dwarven_Void<br />
<br />
'''Description:''' A Gryphon's Tale tells the story of a community of civilized Gryphons, and of Neliflua, an ambitious young female among them who falls into unusual circumstances.<br />
<br />
'''Version:''' 0.6.12<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Style:''' RPG/minigames<br />
<br />
'''Faction/Era:''' Gryphon/Orc<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=2906&start=195&<br />
<br />
<br />
=== Antar, Son of Rheor ===<br />
<br />
''This is the story about a young Lord and his first mission; sent by his father the young Lord Antar has to relieve his neighbours; he has to convince the Elves and Dwarves to ally him; he has to fight against hordes of Orcs and Endless Undead; and finally he has to defeat Mal Kazur, the mastermind who is behind all the evil.''<br />
<br />
'''Author:''' Adamant14<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' 9 playable scenarios / 1 cutscene <br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Loyalists and Elves (feat. fencer as main hero + various allies)<br />
<br />
'''Version:''' 0.9.9<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36075<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Antar.2C_Son_of_Rheor Players´ Review]'''<br />
<br />
'''Note:''' (Adamant14) The campaign did not work with BfW version 1.11.0, or BfW version 1.11.1, so please use BfW version 1.11.2 or later!<br />
<br />
<br />
=== A Song of Fire ===<br />
<br />
''''''Part I: The Last War''' - In a long-forgotten era, at the heart of the Great Continent, an ancestral evil is awakened, threatening to destroy the whole world. Follow young Myra in the war that will alter the future of Irdya and its peoples forever.''<br />
<br />
''''''Part II: Towards the Rising Sun''' - After the vicious Last War, Myra has become the new leader of Aragwaithi and Windsong alike. Albeit young and shaken by many losses, she must steel herself to lead her people through the vast and hostile Hannuk Steppes. However, her journey will take them all farther than in their wildest dreams. Furthermore, Myra must deal with the evil influence of the mysterious red gem she found after the last battle.''<br />
<br />
''''''Part III: Raging Skies''' - The refugees have finally found a new home: families are built, allies are made and, for the first time in years, Myra and her friends know peace. However, when everything seems normal, ambition and thirst for power cause the break out of a continental war. And, amidst this new storm, an old foe rises agan, more powerful than ever. Witness the end of the song of Irdya's first great heroine.''<br />
<br />
'''Author:''' revansurik<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 36 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Default+War of Legends<br />
<br />
'''Version:''' 0.3.4<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=38210<br />
<br />
<br />
=== Bad Moon Rising ===<br />
<br />
''An expedition to gather treasure from the cold north sets off compounding disaster.''<br />
<br />
'''Author:''' Doofus-01<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 20 scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Archaic Era<br />
<br />
'''Version:''' 1.5.8<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31348<br />
<br />
<br />
=== Birth of a Lich ===<br />
<br />
''This is the life story of the dreaded lich Malifor, his struggle as a mage outcast, the orcish conquest of the northlands and his transformation to quench the thirst for revenge''<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 12 playable scenarios / 2 dialogue only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle, Dungeon<br />
<br />
'''Faction/Era:''' Human outlaws, dwarves, undead<br />
<br />
'''[http://units.wesnoth.org/1.10/Birth_of_a_Lich/en_US/Birth_of_a_Lich.html Custom Units]<br />
<br />
'''Version:''' 1.0.3<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37057<br />
<br />
<br />
=== Coming of the Storm ===<br />
<br />
''A new recruit joins the imperial army, eager to change the world and see combat. Little does he realise just how much action he will get and where his journey will take him. ''<br />
<br />
'''Author:''' TrashMan<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' 26 playable scenarios / 4 dialogue only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle, Dungeon<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''Version:''' 1.2.1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=23361<br />
<br />
<br />
=== Legend of Far North ===<br />
<br />
''The tale of the legendary Black Eye Karun,depicting his rise to power, his successes and his brutal assassination.'<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 16 playable scenarios / 1 dialogue only,1 cutscene<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Orcs, Trolls, Saurians, Nagas<br />
<br />
'''[http://units.wesnoth.org/1.10/Legend_of_Far_North/en_US/Legend_of_Far_North.html Custom Units]'''<br />
<br />
'''Version:''' 1.0.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34769<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''''Part I: Shrouded in Darkness''' (5 chapters, 90 scenarios) - A pair of heroes, after stopping an orcish thread, are outcast into caves, where they have no other choice than to become liches in order to survive. They preserved their original appearance and moral principles, and fight in various skirmishes against evil (although using evil methods sometimes), until the Fall, when they are buried alive under the ashes of the third sun.''<br />
<br />
'''''Part II: Into the Light''' (5 chapters, 110 scenarios) - Long after the Fall, the lich heroes awaken. Searching for more power, they manage to resurrect themselves as living beings, but this time more powerful and ridden of the evil within. But the evil from inside them did not cease to exist, and started a campaign to conquer the world. Stopping the campaign caused an even worse disaster...''<br />
<br />
'''Author:''' Dugi <br />
<br />
'''Status:''' complete<br />
<br />
'''Length:''' 200 (+8 talk-only) scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' mostly Skirmish and Dungeon (all other styles are present as well, but less frequently)<br />
<br />
'''Faction/Era:''' Elves, Loyalists, Undead, Dwarves; but they advance past their usual maximum level<br />
<br />
'''Version:''' 3.0.1<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Legends_of_the_Invincibles Players´ Review]'''<br />
<br />
'''Note:''' The most unique feature of this campaign is its RPG-like unit development system, enemies drop items units can use, leaders are stronger than most usual units and all units get AMLA (after maximum level advancement) after reaching their maximum level (that is also increased by a load of additional level 4 units).<br />
<br />
=== Merry Christmas ===<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 3 playable scenarios<br />
<br />
'''Author:''' Desert_Shyde<br />
<br />
'''Description:''' Santa's elfs have to travel south into Lintanir Forest to collect Christmas trees.<br />
<br />
'''[http://units.wesnoth.org/1.10/Merry_Christmas/en_US/merry_christmas.html Custom Units]'''<br />
<br />
'''Version:''' 1.1.2<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Custom<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32519<br />
<br />
<br />
=== Rebellion in the North ===<br />
<br />
''A great orcish uprising tends to destabilise the Northlands. As the future Lord Protector of the Northern Alliance you have to crush the rebellion and establish peace again."<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 24 playable scenarios / 3 dialogue only,2 cutscenes<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Loyalists, Dwarves, Gryphons, Merfolk<br />
<br />
'''Version:''' 1.1.12<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=33059<br />
<br />
<br />
=== Ruthless ===<br />
<br />
''A bard (an aging criminal) is walking in wasteland. Nothing but two hands in his pockets, and nothing but stones around. Suddenly he sees a knight on errand--a dangerous opponent, especially in broad daylight. The two strangers are soon sitting by the campfire, and the bard is telling a story.<br />
(Beginner level, 10+ fights).''<br />
<br />
'''Author:''' homunculus<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 12 playable scenarios + 5 cutscene scenarios<br />
<br />
'''Difficulty:''' Normal <br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default (Orcs)<br />
<br />
'''Version:''' 1.0.4<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37874<br />
<br />
'''Note:''' (Adamant14) Recommendable campaign, with smart unusual ideas and a good detailed story.<br />
You fight with few units on small but perfect maps. About the difficulty: The author describes his campaign as 'beginner level', but for me the difficulty is rather NORMAL than EASY.<br />
<br />
<br />
=== The Devil's Flute ===<br />
<br />
'''Status:''' Complete, unmaintained<br />
<br />
'''Length:''' 10 scenarios<br />
<br />
'''Author:''' lipk<br />
<br />
'''Description:''' Creona, the well-known assassin, gets a strange job from a strange person. So, in fact, it's no surprise that things take a strange turn...<br />
<br />
'''Version:''' 0.1.4c<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish, Minigames<br />
<br />
'''Faction/Era:''' Outlaws<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36044<br />
<br />
<br />
=== The Militia ===<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 15 scenarios<br />
<br />
'''Author:''' Desert_Shyde<br />
<br />
'''Description:''' The Travels of a group of Peasants and their Friends; a level 0 campaign that does not focus on a singular hero.<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Militia/en_US/the_militia.html Custom Units]'''<br />
<br />
'''Version:''' 1.5.2<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?t=30294<br />
<br />
<br />
<br />
== [[Guide_to_UMC_Campaigns/Players_Reviews|Player Reviews]] ==<br />
<br />
[[Category:Campaigns|*]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Content&diff=51616Guide to UMC Content2013-07-08T09:30:31Z<p>Dugi: /* Legend of the Invincibles */</p>
<hr />
<div>''This is a guide to the current (1.10.x/1.11.x) UMC campaigns for players. It aims to provide all the information not only about the story, but also about completion, difficulty and playing style of the campaign. See also [[Guide_to_UMC_Campaigns/Players_Reviews|Players Reviews]], as well as http://forums.wesnoth.org/viewtopic.php?f=8&t=37476 for further information and http://forums.wesnoth.org/viewtopic.php?f=8&t=36733 (for currently non-available UMC-content). Please edit, it is a wiki.''<br />
<br />
=== Blueprint ===<br />
<br />
'''Status:'''<br />
* Broken = Does not work at all<br />
* Incomplete = Partially written, no progress<br />
* WIP = Partially written, progress<br />
* Complete = Completely written, but buggy as well as potential balance issues.<br />
* Finished = Completely written, minimal to no bugs, slight balance issues possible. <br />
<br />
'''Length:'''<br />
<br />
'''Author:'''<br />
<br />
'''Maintainer:''' if not maintained by the author anymore.<br />
<br />
'''Description:'''<br />
<br />
'''Version: '''<br />
<br />
'''Requirements:'''<br />
<br />
'''Difficulty:'''<br />
<br />
Please note: Often campaigns introducing new mechanics are listed as expert level on the add-on server, here difficulty means the raw difficulty after the mechanics are understood.<br />
<br />
* Unbalanced = If you can't beat the hard mode, it isn't necessarily unbalanced, but if the difficulty changes erraticly from one scenario to the next and only people using the debug mode have seen the final, then it is.<br />
* Easy<br />
* Normal<br />
* Hard<br />
<br />
'''Style:''' <br />
<br />
Please note: Many campaigns will feature more than one style. Please list the most significant ones.<br />
<br />
* Skirmish = small to medium sized armies, your standard Wesnoth gameplay<br />
* Dungeon = long and narrow tunnels (not every underground scenario is a dungeon, a dungeon isn't necessarily underground)<br />
* RPG = role playing game elements such as talking with non-player-characters, item collection, dependency on a party of very few adventurers without or limited recruits<br />
* Survival = being exposed to changing, spawning enemies while remaining on the same map<br />
* Large Battle = large number of units on the battlefield, sizely maps<br />
* Simulation = campaigns feat. terrain modification, alternative resources<br />
* Boss battle = the challenge is to defeat a single powerful enemy unit<br />
* Minigames = there are puzzles and minigames in the campaign that significantly differ from standard Wesnoth gameplay<br />
<br />
'''Faction/Era:'''<br />
<br />
* Era for the whole campaign and more specifically the faction or unit composition you field.<br />
<br />
'''Custom units:'''<br />
<br />
* Link to the unit tree for cases that don't feel sufficiently described by Faction / Era entry.<br />
<br />
'''Forum:'''<br />
<br />
* Links to the feedback and development threads at forums.wesnoth.org<br />
<br />
<br />
<br />
<br />
<br />
== Battle for Wesnoth 1.10.x - stable ==<br />
<br />
''Campaigns available in the 1.10.x stable version.''<br />
<br />
<br />
<br />
=== A Gryphon's Tale ===<br />
<br />
'''Status:''' One branch complete, most incomplete<br />
<br />
'''Length:''' 11-12 scenarios (branch dependent)<br />
<br />
'''Author:''' Ringcaat/Dwarven_Void<br />
<br />
'''Description:''' A Gryphon's Tale tells the story of a community of civilized Gryphons, and of Neliflua, an ambitious young female among them who falls into unusual circumstances.<br />
<br />
'''Version:''' 0.6.12<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Style:''' RPG/minigames<br />
<br />
'''Faction/Era:''' Gryphon/Orc<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=2906&start=195&<br />
<br />
<br />
=== After the Storm ===<br />
<br />
''Follow the journey of Galas and his band following the events of <i>Invasion from the Unknown</i>''<br />
<br />
'''Author:''' shadowmaster/ShikadiLord<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 3 episodes of 13 scenarios each, some of which are multi-part<br />
<br />
'''Difficulty:''' Medium-hard<br />
<br />
'''Style:''' Skirmish, Boss Battle, Dungeon<br />
<br />
'''Faction/Era:''' Many custom units<br />
<br />
'''Version:''' 0.9.5<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32091<br />
<br />
'''Note:''' (vultraz) Long, very enjoyable campaign with great story. (Knyghtmare) The best UMC campaign ever!<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#After_the_Storm Players´ Review]'''<br />
<br />
=== Aldur The Great ===<br />
<br />
''This is a story about Aldur the Great.''<br />
<br />
'''Author:''' pintercsabi<br />
<br />
'''Status:''' Complete, but unbalanced<br />
<br />
'''Length:''' 5 playable scenarios<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''Version:''' 1.2.2<br />
<br />
'''Forum:''' -<br />
<br />
'''Note:''' (Adamant14) Short unbalanced campaign, maybe abandoned. You fight with Peasants, Ruffians and Woodsman against Orcs<br />
<br />
<br />
=== Alfhelm the Wise ===<br />
<br />
''This is the tale of Alfhelm, called by some the Wise, son of Alfric Conqueror. This is the tale of his victories over his enemies, and his rise to power in the clans of Marauderdom. This is the tale of his journey south and his destruction of the Lavinian Empire. And this is the tale of his demise in the dark forests far to the east of his homeland.''<br />
<br />
'''Author:''' turin<br />
<br />
'''Maintainer:''' UnwiseOwl<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 15 gameplay scenarios <br />
<br />
'''Difficulty:''' Moderate<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Imperial Era, Marauders.<br />
<br />
'''Version:''' 0.6.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=17144<br />
<br />
'''Note:''' (Maintainer) Though this campaign is complete and playable the whole way through, the code is four years old and pretty buggy. If you notice any errors while playing, please let me know and I'll incorporate the fixes into my next revision as soon as possible.]<br />
<br />
<br />
=== A New Order ===<br />
<br />
'''Author:''' szopen<br />
<br />
'''Status:''' Finished. <br />
<br />
'''Length:''' 45 scenarios.<br />
<br />
'''Description:''' The old kingdom of Wesnoth has fallen before barbarian hordes. The occupying barbarians are on the brink of civil war, the seeds of Wesnothian rebellion are kept alive by old legends, while bandits and Khalifate mercenaries roam the land. Can Gawen Hagarthen unite these disparate factions against a common foe?<br />
Note: This campaign contains mature themes, some of which may be unsuitable for children.<br />
<br />
'''Version: ''' 1.2.15<br />
<br />
'''Requirements:''' Requires BfW 1.10. In addition, you have to install Era Khalifate add-on; the Akladian Music package is optional<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Akladians, Khalifate<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=6486<br />
<br />
'''Note:''' (Pyrophorus) Certainly one of the most mature and well designed campaign in add-ons. A must.<br />
<br />
''' [http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#A_New_Order Players´ Review]'''<br />
<br />
<br />
=== Antar, Son of Rheor ===<br />
<br />
''This is the story about a young Lord and his first mission; sent by his father the young Lord Antar has to relieve his neighbours; he has to convince the Elves and Dwarves to ally him; he has to fight against hordes of Orcs and Endless Undead; and finally he has to defeat Mal Kazur, the mastermind who is behind all the evil.''<br />
<br />
'''Author:''' Adamant14<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' 9 playable scenarios / 1 cutscene<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Loyalists and Elves (feat. fencer as main hero + various allies)<br />
<br />
'''Version:''' 0.9.9<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36075<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Antar.2C_Son_of_Rheor Players´ Review]'''<br />
<br />
<br />
=== A Story of the Northlands ===<br />
<br />
''A story of life and death in a remote village of the Northlands. Your village has been overrun by an orcish raid. You fight for its freedom while you wait for help to arrive.''<br />
<br />
'''Author:''' zepko<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 10 playable scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default + additions: you play with a custom faction of outlaws and with a custom party of loyalist knights.<br />
<br />
'''[http://units.wesnoth.org/1.10/A_Story_of_the_Northlands/en_US/A_Story_of_the_Northlands.html Custom Units]'''<br />
<br />
'''Version:''' 1.0.0<br />
<br />
<br />
=== A Vision Blinded ===<br />
<br />
''Defend the northern forest against what appeared like a routine orcish raid, and unravel the greater conspiracies that lie below its waves.''<br />
<br />
'''Author:''' LemonTea<br />
<br />
'''Maintainer:''' AxalaraFlame<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 13 playable scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves (+ Trolls, Outlaws)<br />
<br />
'''[http://units.wesnoth.org/1.10/A_Vision_Blinded/en_US/A_Vision_Blinded.html Custom units]'''<br />
<br />
'''Version:''' 0.6.9<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=23463&hilit=a+vision+blinded<br />
<br />
<br />
=== Bad Moon Rising ===<br />
<br />
''An expedition to gather treasure from the cold north sets off compounding disaster.''<br />
<br />
'''Author:''' Doofus-01<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 20 scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Archaic Era<br />
<br />
'''Version:''' 1.4.4.a<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31348<br />
<br />
<br />
=== Battle Against Time ===<br />
<br />
''Rescue fellow orcish warchief before he is executed. (This is not a normal campaign. It is experiment with carryover system. You will start with defined number of turns and gold. You will only have that many turns to play through the whole campaign. There is no finish bonus and gold carryover is always 100%.)''<br />
<br />
'''Author:''' Wonderboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 4 playable scenarios + 1 prologue scenario<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default: Orcs<br />
<br />
'''Version:''' 1.0.0<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?f=8&t=27319<br />
<br />
<br />
=== Besieged Druids ===<br />
<br />
''A elvish school for druids comes under attack by goblins. It seems more than just a routine raid; is there something more sinister behind this attack? - In Beseiged Druids, you control Eärendil, the surviving teacher at the school, and the many and varied initiates. Not all of these are ordinary students; many have been experimenting with other forms of magic, while others are simply overachievers in some area of study. Unfortunately, they are not especially good at combat, at least initially. Together with a very small contingent of surviving guards, it is up to these students to save the island of Aleron from disaster.''<br />
<br />
'''Author:''' Celtic Minstrel<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 9 scenarios<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves<br />
<br />
'''[http://units.wesnoth.org/1.10/DruidSiege/en_US/celmin-druid-siege.html Custom units]'''<br />
<br />
'''Version:''' 1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37342<br />
<br />
<br />
=== Birth of a Lich ===<br />
<br />
''This is the life story of the dreaded lich Malifor, his struggle as a mage outcast, the orcish conquest of the northlands and his transformation to quench the thirst for revenge''<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 12 playable scenarios / 2 dialogue only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle, Dungeon<br />
<br />
'''Faction/Era:''' Human outlaws, dwarves, undead<br />
<br />
'''[http://units.wesnoth.org/1.10/Birth_of_a_Lich/en_US/Birth_of_a_Lich.html Custom Units]<br />
<br />
'''Version:''' 1.0.3<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37057<br />
<br />
<br />
=== Bitter Revenge===<br />
<br />
''Amidst the strife and turmoil of the first Dark Age of Wesnoth, a time of transient monarchies and conspiracies against the Crown, the boy Darith witnesses the murder of his father by a general of Wesnoth. Follow Darith's quest for retribution in this treacherous tale of betrayal, deceit, love, remorse, and vengeance.''<br />
<br />
'''Author:''' Wonderboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 11 playable scenarios + 4 dialogue only<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default (mostly outlaws and undead, custom units)<br />
<br />
'''Version:''' 1.1.0<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?f=8&t=26699<br />
<br />
<br />
=== Cavanagh The Conqueror ===<br />
<br />
''This is the tale of Cavanagh Orc-Foundling, who was blessed by the gods to conquer and unite all of the Great Continent. Orcs and elves, gods and men, queens and sorcerers populate this epic tale of revenge and redemption.''<br />
<br />
'''Author:''' TheEmptyLord (Programming, Map-making, Editing), Scott_Free(Story)<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' 10 Playable Scenarios so far<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, limited RPG, limited Large Battle<br />
<br />
'''Faction/Era:''' Default (Units from Northerners, Outlaws, Loyalists as well as other factions interspersed. Several custom units.)<br />
<br />
'''Version:''' 0.1.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=35927<br />
<br />
<br />
=== Cities of the Frontier ===<br />
<br />
''Settle a new town in the wilds north of the Great River.''<br />
<br />
''This campaign makes several changes to the standard Wesnoth game mechanics, and focuses on city-building and gold management.''<br />
<br />
'''Author:''' esci<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' Not fixed, approximately 6-10 seasons of 36 turns each<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Simulation, Survival<br />
<br />
'''Faction/Era:''' Default, Loyalist<br />
<br />
'''[http://units.wesnoth.org/1.10/Cities_of_the_Frontier/en_US/Cities_of_the_Frontier.html Custom units]'''<br />
<br />
'''Version:''' 0.5.1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36004<br />
<br />
<br />
=== Considerate Dead ===<br />
<br />
''As the wind goes on and on, people discover necromancer aren't always bad. Made by tribes45 - No scenarios are done, 4 playable out of ??.''<br />
<br />
'''Author:''' tribes45 aka tribes55<br />
<br />
'''Status:''' Incomplete, unbalanced, abandoned<br />
<br />
'''Length:''' 5 scenarios<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''Version:''' .009<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36522<br />
<br />
<br />
=== Count Kromire ===<br />
<br />
''You are the blood son of a vampire lord, however when the might of the celestial crusades comes knocking, and your father is slain, you flee your lands. However you intend to return, to restore the lands of Kromire to the Kromires, to avenge your father, and most importantly, to make sure that no celestial ever dares come into your mountains again.''<br />
<br />
'''Author:''' Velensk<br />
<br />
'''Maintainer:''' currently none<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 9 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Era of Myths, Vampires<br />
<br />
'''Version:''' 1.3.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=21560<br />
<br />
<br />
=== Elvish Dynasty RPG ===<br />
<br />
''You are the new ruler of an elvish kingdom! Can you lead your people to glory? This campaign is highly randomized so it will be different every time you play!''<br />
<br />
''Sequel to Ooze Mini-Campaign''<br />
<br />
'''Author:''' spencelack<br />
<br />
'''Maintainer:''' Wesbane<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 10 years, in each year choice between dialogue and fighting scenario (selected out of a large pool of possible scenarios)<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' RPG, Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves<br />
<br />
'''Version:''' 0.9.9b<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=28627<br />
<br />
<br />
=== Fall of Silvium ===<br />
<br />
''You are Caius Regilius, Tribune of the province of Silvia, located in the northmost reaches of the Lavinian Empire at the height of its power. But the Empire has overextended itself, The city of Silvium lies seperated from the rest of the Empire by the mountains of Arendia, and is sandwiched between the Marauders and the Sidhe... war is inevitable, and the province of Silvia will almost certainly fall.''<br />
<br />
'''Author:''' turin<br />
<br />
'''Maintainer:''' UnwiseOwl<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 8 scenarios<br />
<br />
'''Difficulty:''' Medium<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Imperial Era, Lavinian Legion.<br />
<br />
'''Version:''' 0.6<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=31&t=24356<br />
<br />
'''Note:''' The final level of this campaign is not supposed to be winnable. It's a final blaze of glory and chance to use all your high-powered units, but to 'win' the campaign, you must lose...the ending is similar to a certain mainline campaign, but predates it.<br />
<br />
<br />
=== Fate of a Princess ===<br />
<br />
''Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the king's justice. The baron's deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.''<br />
<br />
''Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldres' daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...''<br />
<br />
'''Author:''' SkyOne, mich, simonsmith<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 26-29 scenarios (some dialogue-only), 2 parts<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Dungeon<br />
<br />
'''Faction/Era:''' Default with additions. You play two different, unique cross-faction combinations in each part.<br />
<br />
'''[http://units.wesnoth.org/1.10/Fate_of_a_Princess/en_US/Fate_of_a_Princess.html Custom units]'''<br />
<br />
'''Version:''' 0.9.17<br />
<br />
'''Required Wesnoth version:''' 1.9.12 or later<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=26327<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Fate_of_a_princess Players´ Review]'''<br />
<br />
<br />
=== Forgotten Kingdom ===<br />
<br />
''Help Orlog, a troll chieftan, lead his people to safety in the underground and discover an ancient power long forgotten.''<br />
<br />
'''Author:''' Limabean<br />
<br />
'''Maintainer:''' Chrysophylax<br />
<br />
'''Status:''' Incomplete ( but all scenarios playable and balanced )<br />
<br />
'''Length:''' 9 playable scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Goblins, Trolls<br />
<br />
'''[http://units.wesnoth.org/1.10/Forgotten_Kingdom/en_US/Forgotten_Kingdom.html Custom units]'''<br />
<br />
'''Version:''' 0.1.7<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=23483<br />
<br />
'''Note:''' (Adamant14) This campaign includes a custom Troll line. A good campaign, I hope Limabean and/or Chrysophylax will finish it.<br />
<br />
<br />
=== Forward they Cried ===<br />
<br />
''You are the leader of an advanced detachment that has been tasked with capturing a bridgehead while the main army prepares to attack. It should be a simple enough assignment.''<br />
<br />
'''Author:''' Glowing Fish<br />
<br />
'''Maintainer:''' Lord-Knightmare <br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 1 scenario ( rather a single scenario than a campaign )<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default Loyalists<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=23656&p=350126&hilit=forward+they+cried#p350126<br />
<br />
'''Version:''' 1.0.0<br />
<br />
'''Note:''' (Adamant14) Only a single scenario, but a great scenario.<br />
(UnwiseOwl) You wouldn't want to stop thinking for a turn, and it's good for the first few turns, but this one leaves me wanting more.<br />
<br />
<br />
=== Galuldur's First Journey ===<br />
<br />
''While the belligerence of orcs is nothing new, their intensifying attacks on a fledgling colony of elves in Pindir Forest begin to show signs of a deeper malice, forcing Galuldur, the young son of the colony's adventurous founder Galur, to venture out of his forest's friendly trees in search of help. His simple errand quickly turns into a frantic quest to unearth the roots of the mysterious evil threatening his people. As you lead him through unknown lands, Galuldur, forced to match wits with unexpected adversaries at nearly every turn in a desperate attempt to save his world, quickly learns that the world is neither a friendly nor a simple place.''<br />
<br />
'''Author:''' mattsc<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 8-9 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves<br />
<br />
'''[http://units.wesnoth.org/1.10/Galuldur/en_US/Galuldur.html Custom units]'''<br />
<br />
'''Version:''' 1.1.1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31895<br />
<br />
<br />
<br />
=== Girl unDead ===<br />
<br />
A little undead girl fights against the Kingdom. <br />
<br />
'''Author:''' tapaboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 11 playable scenarios<br />
<br />
'''Version: ''' 0.9.20<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default undead,elves<br />
<br />
'''[http://units.wesnoth.org/1.10/Girl_unDead/en_US/Girl_unDead.html Custom Units]'''<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37458<br />
<br />
<br />
=== Grnk the Mighty ===<br />
<br />
''All his life, puny little goblin Grnk the Frail had been dreaming about leaving the orcs and starting a better life. When he finally arrives in the human town of Shmaltupp, he realizes that the world is not as black and white as he had imagined. He also discovers that he is no ordinary goblin. Follow Grnk the Frail on his path to becoming Grnk the Mighty.''<br />
<br />
'''Author:''' mattsc<br />
<br />
'''Status:''' Part I complete<br />
<br />
'''Length:''' 13 scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish, RPG<br />
<br />
'''Faction/Era:''' Default, changing (no standard army building gameplay)<br />
<br />
'''[http://units.wesnoth.org/1.10/Grnk/en_US/Grnk.html Custom units]'''<br />
<br />
'''Version:''' 1.0.5<br />
<br />
'''Required Wesnoth version:''' 1.9.5 or later<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34970<br />
<br />
<br />
=== Invasion from the Unknown ===<br />
<br />
''Episode I - Seeking the Light: Long after the Fall, the last forest elves are forced to abandon their safe valley, and find themselves resorting to the dark means of necromancy in order to survive the perils and challenges of this new harsh world. May they finally free the Great Continent from its chaos, or perish in the foolish attempt of restoring peace and life to the lands.''<br />
<br />
''Episode II - Armageddon: As the shadow of Chaos covers the entire continent, an assorted group of foolish heroes prepares a counter-attack to the Empire, with one unique goal in their minds: defeat the evil Emperor, whoever it is. Lead these courageous living and non-living warriors to victory, and rediscover lost secrets of the history.''<br />
<br />
'''Author:''' shadowmaster <br />
<br />
'''Maintainer:''' Espreon<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 26 scenarios in two episodes<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Dungeon, Boss battle<br />
<br />
'''Faction/Era:''' Unique. You play Elves and Undead throughout the campaign + in the 2nd part Northerners and Aragwaithi.<br />
<br />
'''Version:''' 1.90.6<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Invasion_from_the_Unknown Players´ Review]'''<br />
<br />
'''Note:''' (taptap) Despite its acknowledged flaws (generic hero, plot holes, deus ex machina moments, gameplay issues in the 2nd part) this is undoubtedly the most iconic campaign in UMC. It single-handedly redefines the elvish history and sketches a cosmology for the ages after the fall. With the Chaos empire and its various allies it introduces an era worth of factions to single-player play. At the same time it features some of the most beautiful maps in Wesnoth and stunning art on par with mainline campaigns.<br />
<br />
<br />
=== Invasion of Eliador ===<br />
<br />
''A peaceful island is about to be invaded by unknadd-ons foes travelling towards the eastern shore. It is up to a family of outlaws to warn the island's inhabitants before it's too late.''<br />
<br />
'''Author:''' Sam M. (Genosuke)<br />
<br />
'''Maintainer:''' trewe<br />
<br />
'''Version:''' 1.0.4<br />
<br />
'''Style:''' RPG, Skirmish, Puzzle<br />
<br />
'''Length:''' 10 scenarios + epilogue<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Faction:''' Default (outlaws)<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=6556<br />
<br />
'''Wiki:''' [[Invasion_of_Eliador]]<br />
<br />
<br />
=== Langrisser Sample Campaign ===<br />
<br />
''The Imperial Knights of the Rayguard Empire have disrupted the peace of the village that was Hein's hometown, seeking only a girl named Liana. Fight to rescue Liana.''<br />
<br />
'''Author:''' Morath<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 1 playable scenario<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Elves<br />
<br />
'''Version:''' 0.1.0.5<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36417&hilit=Langrisser<br />
<br />
'''Wikipedia:''' [http://en.wikipedia.org/wiki/Langrisser What is Langrisser]<br />
<br />
'''Note:''' (Adamant14) Single scenario, different from usual Wesnoth behaviour.<br />
<br />
<br />
=== Legend of Far North ===<br />
<br />
''The tale of the legendary Black Eye Karun,depicting his rise to power, his successes and his brutal assassination.'<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 16 playable scenarios / 1 dialogue only,1 cutscene<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Orcs, Trolls, Saurians, Nagas<br />
<br />
'''[http://units.wesnoth.org/1.10/Legend_of_Far_North/en_US/Legend_of_Far_North.html Custom Units]'''<br />
<br />
'''Version:''' 1.0.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34769<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''''Part I: Shrouded in Darkness''' (5 chapters, 90 scenarios) - A pair of heroes, after stopping an orcish thread, are outcast into caves, where they have no other choice than to become liches in order to survive. They preserved their original appearance and moral principles, and fight in various skirmishes against evil (although using evil methods sometimes), until the Fall, when they are buried alive under the ashes of the third sun.''<br />
<br />
'''''Part II: Into the Light''' (5 chapters, 110 scenarios) - Long after the Fall, the lich heroes awaken. Searching for more power, they manage to resurrect themselves as living beings, but this time more powerful and ridden of the evil within. But the evil from inside them did not cease to exist, and started a campaign to conquer the world. Stopping the campaign caused an even worse disaster...''<br />
<br />
'''Author:''' Dugi <br />
<br />
'''Status:''' complete<br />
<br />
'''Length:''' 200 (+8 talk-only) scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' mostly Skirmish and Dungeon (all other styles are present as well, but less frequently)<br />
<br />
'''Faction/Era:''' Elves, Loyalists, Undead, Dwarves; but they advance past their usual maximum level<br />
<br />
'''Version:''' 3.0.1<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Legends_of_the_Invincibles Players´ Review]'''<br />
<br />
'''Note:''' The most unique feature of this campaign is its RPG-like unit development system, enemies drop items units can use, leaders are stronger than most usual units and all units get AMLA (after maximum level advancement) after reaching their maximum level (that is also increased by a load of additional level 4 units).<br />
<br />
=== Merry Christmas ===<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 3 playable scenarios<br />
<br />
'''Author:''' Desert_Shyde<br />
<br />
'''Description:''' Santa's elfs have to travel south into Lintanir Forest to collect Christmas trees.<br />
<br />
'''Version:''' 1.1.2<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Custom<br />
<br />
'''[http://units.wesnoth.org/1.10/Merry_Christmas/en_US/merry_christmas.html Custom Units]'''<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32519<br />
<br />
<br />
=== Panther Lord ===<br />
<br />
''The Imperialists ambitions of pushing into the Sea States have been repeatedly thwarted and now they turn their attentions elsewhere. You are an outcast Darklander now living as a mercenary in the Sea States and the rumors you hear indicate that they will be coming to your people. Though an outcast you do not wish to see them subjugated. The spirit whose friendship caused you to be an outcast has a plan that might allow you to save them.''<br />
<br />
'''Author:''' Velensk <br />
<br />
'''Maintainer:''' Lavender<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 14 scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Era of Four Moons, Darklanders (+ a wide variety of mercenaries)<br />
<br />
'''Version:''' 1.0.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34318<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Panther_Lord Players´ Review]'''<br />
<br />
<br />
=== Random Campaign ===<br />
<br />
''Gain experience playing the Default Era faction of your choice in a campaign setting''<br />
<br />
'''Author:''' SigurdFireDragon<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 7 playable scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Age of Heroes, & Era of Legends<br />
<br />
'''Version:''' 1.0.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32922<br />
<br />
'''Note:''' (Author) A 4 scenario version is under the multiplayer button, which lets you choose any era.<br />
Intended for players to gain practice with a faction and learn sound strategies using faction specific adjustments against random factions from the chosen era.<br />
<br />
<br />
=== Rebellion in the North ===<br />
<br />
''A great orcish uprising tends to destabilise the Northlands. As the future Lord Protector of the Northern Alliance you have to crush the rebellion and establish peace again."<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 24 playable scenarios / 3 dialogue only,2 cutscenes<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Loyalists, Dwarves, Gryphons, Merfolk<br />
<br />
'''Version:''' 1.1.12<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=33059<br />
<br />
<br />
=== Return of the Monster ===<br />
<br />
''It was time for Amailoss, born from the naga queen's last egg, to leave home. Time for him to grow into a leader in his own right, and eventually become the guardian and leader of another naga city. But along the way, he became friends with an unusual mud-crawler, they met a strange young monster, discovered that a spirit had escaped from an orc prison, and the mystery of that spirit became a grave challenge for Amailoss and the many races in the region....''<br />
<br />
''A naga campaign, involving elves, orcs, saurians, turtle-like races, and some monsters.''<br />
<br />
'''Author:''' SkyOne<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 16 playable, 2 dialog scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Dungeon<br />
<br />
'''Faction/Era:''' Default with additions. You play a custom naga faction and carapaces (a turtle-like race).<br />
<br />
'''[http://units.wesnoth.org/1.10/Return_of_the_Monster/en_US/Return_of_the_Monster.html Custom units]'''<br />
<br />
'''Version:''' 0.7.1<br />
<br />
'''Required Wesnoth version:''' 1.10.x<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36438<br />
<br />
<br />
=== Return to Noelren ===<br />
<br />
'''Status:''' Complete.<br />
<br />
'''Length:''' 26 scenarios + 7 cut scenes<br />
<br />
'''Author:''' Pyrophorus<br />
<br />
'''Description:''' ''A story in the first Dark Age of Wesnoth. See how various heroes stick together to shun the threat of black magics, restore the secret kingdom of Noelren and install Garard I on the throne of Wesnoth. This campaign features complex scenarios, unusual objectives and units, emphasizing more on story and adventures than hardcore fighting.''<br />
<br />
'''Version: ''' 0.7.6<br />
<br />
'''Requirements:''' BfW 1.10 (not tested on 1.11)<br />
<br />
'''Difficulty:''' Easy, unbalanced<br />
<br />
'''Style:''' Skirmish, RPG, Large Battle, Simulation<br />
<br />
'''Faction/Era:''' Default + custom units<br />
<br />
'''[http://units.wesnoth.org/1.10/ReturnToNoelren/en_US/ReturnToNoelren.html Custom Units]'''<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34685#p501026<br />
<br />
'''Note:''' (Adamant14) I never saw so much fantastic and new ideas in one single UMC, wow!<br />
<br />
<br />
=== Return to Ruins ===<br />
<br />
''The humble farmers of Vertegris are summoned by Erik the General of Weldyn to put an end to an orcish raiding party. If they knew what would befall their former home... They never would have left. This is a relatively short campaign with 8 scenarios, It is still undergoing changes.''<br />
<br />
'''Author:''' Jeff Stevens (Ulfsark)<br />
<br />
'''Composer:''' Paul Fredericks (paulfredericksmusic.com)<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 7 scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Easy,Normal,Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default,(Loyalists, Outlaws)<br />
<br />
'''Version:''' 0.5.1<br />
<br />
'''Required Wesnoth version:''' 1.10.x <br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37790&sid=9059f18497cda1219f42a626544d0ffd&p=540646#p540646<br />
<br />
'''Note:''' (Adamant14) You play a short campaign with just a few units. Playable in a few hours, nevertheless it is fun to play.<br />
<br />
<br />
=== Salt Wars ===<br />
<br />
''Introductory campaign for the Era of Four Moons.''<br />
<br />
''As an officer of one of the Sea States you must defend your organization from aggressive rivals.''<br />
<br />
'''Author:''' Velensk <br />
<br />
'''Maintainer:''' Lavender<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 5 scenarios<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Era of Four Moons, Sea States<br />
<br />
'''Version:''' 0.2.1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31498<br />
<br />
<br />
=== Saving Elensefar ===<br />
<br />
''Meneldur, elvish mariner of Elensefar, is driven to sea by the same orcs who attacked the city. He must gather an army willing to fight for him to regain Elensefar, his adopted homeland.''<br />
<br />
'''Author:''' Turin<br />
<br />
'''Maintainer:''' trewe<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 1 year (around 12 scenarios)<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, RPG, Simulation<br />
<br />
'''Version:''' 1.5.2<br />
<br />
'''Faction:''' Default Era<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?t=3072&start=0<br />
<br />
'''Wiki:''' [[SeafaringCampaign]]<br />
<br />
'''Note:''' Labeled as Expert, recruit list changes in all scenarios.<br />
<br />
<br />
=== Shameless Crossover Excuse ===<br />
<br />
''Fugitive dark sorcerer Gwiti Ha'atel discovers he has the power to mess with Wesnoth's continuity. His quest for revenge on the NPCs who have used his portraits will lead him through perils untold and in-jokes unnumbered, but shall pale before the horror he finds at his quest's end.''<br />
<br />
'''Author:''' Orcish Shyde, Mountain_King<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 9 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Version:''' 1.1.0<br />
<br />
'''Faction:''' Undead<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32016&start=15<br />
<br />
<br />
=== Swamplings ===<br />
<br />
''Banished by Yushnak the Ponderer, a tribe of lowly swamp goblins endure in the deadly mire of Pogo Bog. Four centuries before the founding of Wesnoth, this is the story of the goblins' struggle against the intrigues and betrayals of the greater races, and the rise of the first wolf rider.''<br />
<br />
'''Author:''' John Rawlins (boru)<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 14 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Version:''' 1.1.7n<br />
<br />
'''Faction:''' Goblins<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=29784<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Swamplings Players´ Review]'''<br />
<br />
<br />
=== Talentless Mage===<br />
<br />
''Humorous and silly campaign about mage apprentice who has managed to learn only one simple spell in thirty years.''<br />
<br />
'''Author:''' Wonderboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 11 playable scenarios + 3 dialogue scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Noob Faction<br />
<br />
'''[http://units.wesnoth.org/1.10/Talentless_Mage/en_US/Talentless%20Mage.html Custom Units]'''<br />
<br />
'''Version:''' 1.1.0<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?f=8&t=27608]<br />
<br />
'''[http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns/Players_Reviews&action=submit#Talentless_Mage Players´ Review]'''<br />
<br />
<br />
=== The Dark Alliance===<br />
<br />
''Prince Terhar lived two years with elves. Little did he expect what would happen when he returned back to Weldyn.''<br />
<br />
'''Author:''' Wonderboy<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 11 or 10 playable scenarios depending on the branch you take (+ 5 dialogue scenarios)<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default: Recruit list changes in almost every scenario<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Dark_Alliance/en_US/The%20Dark%20Alliance.html Custom Units]'''<br />
<br />
'''Version:''' 1.0.3"<br />
<br />
'''Forum:''' http://wesnoth.org/forum/viewtopic.php?f=8&t=26924<br />
<br />
<br />
=== The Dark Hordes ===<br />
<br />
'''Status:''' Incomplete/WIP<br />
<br />
'''Length:''' 11/?<br />
<br />
'''Author:''' Circon<br />
<br />
'''Maintainer:''' Various<br />
<br />
'''Description:''' Lead fugitive dark sorcerer Gwiti Ha’atel to mastery of the undead hordes.<br />
<br />
'''Version: '''<br />
<br />
'''Requirements:'''<br />
<br />
'''Difficulty:'''<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default undead<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Dark_Hordes/en_US/The_Dark_Hordes_1.html Custom Units]'''<br />
<br />
'''Walkthrough:''' [[TheDarkHordes]]<br />
<br />
'''Forum:''' [[http://forums.wesnoth.org/viewtopic.php?f=8&t=16576&]]<br />
<br />
<br />
=== The Devil's Flute ===<br />
<br />
'''Status:''' Complete, unmaintained<br />
<br />
'''Length:''' 10 scenarios<br />
<br />
'''Author:''' lipk<br />
<br />
'''Description:''' Creona, the well-known assassin, gets a strange job from a strange person. So, in fact, it's no surprise that things take a strange turn...<br />
<br />
'''Version:''' 0.1.4c<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish, Minigames<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Devils_Flute/en_US/The_Devils_Flute.html Custom Units]'''<br />
<br />
'''Faction/Era:''' Outlaws<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36044<br />
<br />
<br />
=== The Earth's Gut ===<br />
<br />
''The year is 515YW. You are the young dwarven leader Hamel. Your tribe in the caves of Knalga is under pressure from its enemies, and resources are growing scarce. In order to forge the weapons required to resist your enemies, you must set forth and collect what ores and minerals remain.''<br />
<br />
'''Author:''' Anonymissimus<br />
<br />
'''Maintainer:''' Anonymissimus<br />
<br />
'''Status:''' WIP, story is unfinished (I didn't add any scenario since long, but that doesn't mean nothing is added to the campaign. My addons tend to be in good shape and bug-free which means also WIP as I'm updating it since 1.4 days.)<br />
<br />
'''Length:''' 23 scenarios, 5 of which are cutscene only, some others have changing objectives<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Dungeon, Skirmish<br />
<br />
'''Faction/Era:''' Default, dwarves, woses, mages, a few custom units<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Earths_Gut/en_US/the_earths_gut.html Custom units]'''<br />
<br />
'''Version:''' 0.2.14<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=26800<br />
<br />
'''Note:''' This campaign is a "Dwarvish dungeon crawler" (It currently contains about as many surface scenarios as underground though.) and is intended to be challenging for experienced players on hard whilst suitably easy on easy. I develop the campaign with the wesnoth development version and I advise to play with that, but it is intended to work almost equally well with the stable wesnoth version (except for features only available in the wesnoth development version).<br />
<br />
<br />
=== The Epic of Vaniyera ===<br />
<br />
''The expansionist Lavinian Legion, led by the Imperator himself, has invaded the northern forests of the Sidhe, or Wild Elves. It is up to Leithan the Thunderblade and his advisor Vaniyera to push its armies back where they came from...''<br />
<br />
'''Author:''' oreb, turin<br />
<br />
'''Maintainer:''' UnwiseOwl<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 6 scenarios<br />
<br />
'''Difficulty:''' Hard (Don't be fooled by "novice level" in the campaign description, this one is very hard.) <br />
<br />
'''Note:''' (Maintainer) Working on this issue, the next release (due at the end of November, hah!) should bring easy difficulty back to the level of a reasonable introduction to the IE, while the hard difficulty will also become slightly easier. With any luck, this will be the last release before version 1.0 of the campaign].<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Imperial Era, Sidhe.<br />
<br />
'''Version:''' 0.9.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=19490<br />
<br />
<br />
=== The Fall of Wesnoth ===<br />
<br />
''As the beloved human empire of Wesnoth becomes lazy and arrogant in its peaceful state of happiness, Emperor Dantair demands the creation of another sun in a bid to destroy all evil. Or is it all for a different purpose? A man named Alitar sees it that way, and now he must survive the most evil inhabited lands if he is to stop chaos from rising, and Wesnoth from falling... This is the story of The Fall of Wesnoth.''<br />
<br />
'''Author:''' Pewskeepski<br />
<br />
'''Status:''' 1st part complete, 2nd WIP.<br />
<br />
'''Length:''' 10 playable scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Outlaws<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Fall_of_Wesnoth/en_US/The_Fall_of_Wesnoth-1.html Custom units]'''<br />
<br />
'''Version:''' 1.0.8<br />
<br />
<br />
=== The Founding of Borstep ===<br />
<br />
''The chieftain of your tribe has become decadent and weak. Take over, and lead your people to a better home--whether it is already occupied or not. The Northlands in year 9W are a barbaric place, but anyone who stands in your way will learn the power of orcs!'' <br />
<br />
'''Author:''' Beetlenaut<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 10 and 1 dialogue only<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Northerners<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Founding_of_Borstep/en_US/The_Founding_of_Borstep.html Custom units]'''<br />
<br />
'''Version:''' 1.1.1b<br />
<br />
'''Note:''' (Kanzil) I find the protagonist hard to sympathise with. Also, most scenarios contain interesting twists. For example, in one, each time you killed a boar it gives you extra health.<br />
<br />
'''Note:''' (beetlenaut--author) In most Orcish campaigns the leader is heroic or just wants peace. Krag-Ubor wants plunder and battle like all enemy Orcs in other campaigns. I '''hope''' you don't sympathize too strongly, but I don't think you need to in order to enjoy the game play.<br />
<br />
=== The Legend Begins ===<br />
<br />
'''Status:''' First two episodes completed out of a planned three. You can play the first two episodes. Updated monthly.<br />
<br />
'''Length:''' Approximately 72 scenarios when completed.<br />
----<br />
Episode 1 - 28 scenarios<br />
----<br />
Episode 2 - 26 scenarios<br />
----<br />
Episode 3 - (still in development)<br />
----<br />
<br />
'''Author:''' Tahsin Jahin Khalid (Lord-Knightmare)<br />
<br />
'''Description:''' "''The tale of Jahin, the greatest hero the land of Arkenova, or perhaps the world of Irdya, had ever known. Watch his legend unfold before your very eyes."''<br />
<br />
'''Version:''' 0.2.7<br />
<br />
'''Requirements:''' ''War of Legends'' is required to be installed. Latest version recommended.<br />
<br />
'''Difficulty:''' Intermediate<br />
<br />
'''Style:''' skirmishes, survivals, large battles, dungeons, boss battles, simulations,<br />
<br />
'''Faction/Era:''' Default, War of Legends, Custom Units<br />
<br />
'''Custom units:''' Sorry, apparently the [units.wesnoth.org Units Database] didn't generate one for this campaign...<br />
<br />
'''Forum:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37424 Click Here]<br />
<br />
'''Notes:'''<br />
<br />
----<br />
<br />
=== The Library of Kratemaqht ===<br />
<br />
''An ancient story from the old continent.''<br />
<br />
'''Author:''' Rich Marinaccio (cephalo)<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 17 scenarios<br />
<br />
'''Difficulty:''' Unbalanced (some scenarios are Easy - some rather Hard) <br />
<br />
'''Style:''' Skirmish, RPG<br />
<br />
'''Faction/Era:''' Loyalists and custom units.<br />
<br />
'''[http://units.wesnoth.org/1.10/Library_Of_Kratemaqht/en_US/The_Library_Of_Kratemaqht.html Custom units]'''<br />
<br />
'''Version:''' 1.0.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37798<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#The_Library_of_Kratemaqht Players´ Review]'''<br />
<br />
'''Notes:''' (Adamant14) This campaign has a thought-out story, shows a great love for detail;<br />
It includes a great custom Dragon, some brilliant custom images (fire, burning houses, burning forest) that makes the scenery / maps look very nice.<br />
<br />
<br />
=== The Militia ===<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 15 scenarios<br />
<br />
'''Author:''' Desert_Shyde<br />
<br />
'''Description:''' The Travels of a group of Peasants and their Friends; a level 0 campaign that does not focus on a singular hero.<br />
<br />
'''Version:''' 1.5.1<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Militia/en_US/the_militia.html Custom Units]'''<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?t=30294<br />
<br />
<br />
=== The Roar of the Woses ===<br />
<br />
''When the construction of a dam threatens the existence of her home, Kylix is forced on a journey to stop it.''<br />
<br />
'''Author:''' Alarantalara<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 10-11 scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default with Additions (primarily Saurians, Nagas, Woses)<br />
<br />
'''[http://units.wesnoth.org/1.10/Roar_of_the_Woses/en_US/Swamp_Rage.html Custom Units]'''<br />
<br />
'''Version:''' 1.2.7<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=29830<br />
<br />
'''Note:''' (author) Potentially unbalanced on Hard difficulty due to experiments with non-standard ways to increase difficulty. This issue does not exist on the lower difficulty levels.<br />
<br />
<br />
=== The Three Elves ===<br />
<br />
''Three elves have just begun their adventure in the northern swampland. Will they become heroes or will they be responsible for another undead expansion?''<br />
<br />
'''Author:''' Stanislav Hoferek<br />
<br />
'''Maintainer:''' trewe<br />
<br />
'''Version:''' 0.9<br />
<br />
'''Status:''' Complete<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Length:''' 8 scenarios + 2 dialogue<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction:''' Default (Elves)<br />
<br />
'''Forum:''' (does it have one?)<br />
<br />
<br />
=== The Sojournings of Grog ===<br />
<br />
''Grog (as starred in Under the Burning Suns) goes home.''<br />
<br />
'''Author:''' Peter Christopher, Thomas Hockings <br />
<br />
'''Maintainer:''' Elvish_Hunter<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 18 playable scenarios in 2 parts<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Dungeon, Large Battle<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Sojournings_of_Grog/en_US/The_Sojournings_of_Grog.html Custom units]'''<br />
<br />
'''Faction/Era:''' Default. Most of the time you play trolls and some desert elves accompanying Grog.<br />
<br />
'''Version:''' 3.0.1<br />
<br />
<br />
=== The Unstoppable Legion ===<br />
<br />
''Horseback campaign. The kingdom of Suveran, far away from Wesnoth, is under attack. Only Deuterus, a Great Druid, knows their weakness and only Viktor, a young noble, dares go on the quest to stop them.''<br />
<br />
'''Author:''' Chris Neville-Smith (Chris NS)<br />
<br />
'''Maintainer:''' Chris Neville-Smith (Chris NS)<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' Currently 15 playable sceanrios, including a fork of three paths near the beginning, and another fork of two paths later on.<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Mainly Skirmish<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Unstoppable_Legion/en_US/The_Unstoppable_Legion.html Custom units]'''<br />
<br />
'''Faction/Era:''' Play mounted units, including expanded Cavalryman line, and completely new Bowrider line. Joined later by Dwarves. Main enemies are the dark fighters and dark cultists.<br />
<br />
'''Version:''' 0.8.7<br />
<br />
<br />
=== The White Troll ===<br />
<br />
''The story of a white troll whelp with strange magic powers, who is raised in an elvish village.''<br />
<br />
'''Author:''' Wesnoth Italian Forum<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 8 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default: you play with elves and trolls. Also features custom units with special advancements and abilities.<br />
<br />
'''[http://units.wesnoth.org/1.10/White_Troll/en_US/white_troll.html Custom Units]'''<br />
<br />
'''Version:''' 0.7.5<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=38828<br />
<br />
<br />
=== To Lands Unknown ===<br />
<br />
''This is the story of Mehir, the Summoner, and his journey to lands unknown.''<br />
<br />
'''Author:''' inferno8<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 20 scenarios, 4 dialogue only<br />
<br />
'''Difficulty:''' Intermediate (Era of Magic)<br />
<br />
'''Style''': Skirmish, Dungeon<br />
<br />
'''Era:''' Era of Magic<br />
<br />
'''Version:''' 1.6.0<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31799<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#To_Lands_Unknown Players´ Review]'''<br />
<br />
<br />
=== Up from Slavery ===<br />
<br />
''The Orcei are captives in the imperial city of Lavinium, gladiators performing for the emperor Optus Maximus. All it will take, however, is one orc to lead his people to freedom. The Samnis called Sparxus may be that orc.''<br />
<br />
'''Author:''' turin<br />
<br />
'''Maintainer:''' UnwiseOwl<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 7 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Arena (= No recruit, small group gladiator fights)<br />
<br />
'''Faction/Era:''' Imperial Era, Orcei Gladiatores<br />
<br />
'''Version:''' 0.6.0<br />
<br />
'''Note:''' (Maintainer) At some point, I am intending to completely re-work this campaign to be a multi-player campaign, with one side led by Sparxus and one by Gravirivus. If anyone would like to take this on or has ideas for how to accomplish this, let us know. Nevertheless, its playable as a single player campaign now with some nice ideas that could be developed further.]<br />
<br />
<br />
=== Warmaster ===<br />
<br />
''One day the scout of your king brings a mysterious little stone, called Zrai-Stone, back from one of his trips. Soon that stone causes a lot of trouble...''<br />
<br />
'''Author:''' Conkinator<br />
<br />
'''Maintainer:''' trewe<br />
<br />
'''Version:''' 1.3.5<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 16 battle + 2 bonus + 1 epilogue scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Faction:''' Default (loyalists)<br />
<br />
'''Style:''' Skirmish, Survival<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=15527<br />
<br />
<br />
=== Way of Dragon ===<br />
<br />
''The story of what might happen if a person against his will transform into a dragon...''<br />
<br />
'''Author:''' DrakeDragon<br />
<br />
'''Status:''' Complete <br />
<br />
'''Length:''' 7 playable scenarios + 1 dialogue-only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish/RPG<br />
<br />
'''Faction/Era:''' Default Loyalists<br />
<br />
'''Version:''' 1.2.0<br />
<br />
'''Forum:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37876 Wesnoth Forum] [http://uporoom.ru/index.php/topic,179.0.html Russian Forum]<br />
<br />
'''Note:''' (Adamant14) Promising short campaign, you play with just a few units.<br />
<br />
<br />
<br />
<br />
<br />
<br />
== Battle for Wesnoth 1.11.x - development ==<br />
<br />
''Campaigns available in the 1.11.x development version.''<br />
<br />
''Please note: Battle for Wesnoth 1.11.0 features a bug that messes up the selection of difficulty levels.''<br />
<br />
<br />
=== A Gryphon's Tale ===<br />
<br />
'''Status:''' One branch complete, most incomplete<br />
<br />
'''Length:''' 11-12 scenarios (branch dependent)<br />
<br />
'''Author:''' Ringcaat/Dwarven_Void<br />
<br />
'''Description:''' A Gryphon's Tale tells the story of a community of civilized Gryphons, and of Neliflua, an ambitious young female among them who falls into unusual circumstances.<br />
<br />
'''Version:''' 0.6.12<br />
<br />
'''Difficulty:''' Easy<br />
<br />
'''Style:''' RPG/minigames<br />
<br />
'''Faction/Era:''' Gryphon/Orc<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=2906&start=195&<br />
<br />
<br />
=== Antar, Son of Rheor ===<br />
<br />
''This is the story about a young Lord and his first mission; sent by his father the young Lord Antar has to relieve his neighbours; he has to convince the Elves and Dwarves to ally him; he has to fight against hordes of Orcs and Endless Undead; and finally he has to defeat Mal Kazur, the mastermind who is behind all the evil.''<br />
<br />
'''Author:''' Adamant14<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' 9 playable scenarios / 1 cutscene <br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default, Loyalists and Elves (feat. fencer as main hero + various allies)<br />
<br />
'''Version:''' 0.9.9<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36075<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Antar.2C_Son_of_Rheor Players´ Review]'''<br />
<br />
'''Note:''' (Adamant14) The campaign did not work with BfW version 1.11.0, or BfW version 1.11.1, so please use BfW version 1.11.2 or later!<br />
<br />
<br />
=== A Song of Fire ===<br />
<br />
''''''Part I: The Last War''' - In a long-forgotten era, at the heart of the Great Continent, an ancestral evil is awakened, threatening to destroy the whole world. Follow young Myra in the war that will alter the future of Irdya and its peoples forever.''<br />
<br />
''''''Part II: Towards the Rising Sun''' - After the vicious Last War, Myra has become the new leader of Aragwaithi and Windsong alike. Albeit young and shaken by many losses, she must steel herself to lead her people through the vast and hostile Hannuk Steppes. However, her journey will take them all farther than in their wildest dreams. Furthermore, Myra must deal with the evil influence of the mysterious red gem she found after the last battle.''<br />
<br />
''''''Part III: Raging Skies''' - The refugees have finally found a new home: families are built, allies are made and, for the first time in years, Myra and her friends know peace. However, when everything seems normal, ambition and thirst for power cause the break out of a continental war. And, amidst this new storm, an old foe rises agan, more powerful than ever. Witness the end of the song of Irdya's first great heroine.''<br />
<br />
'''Author:''' revansurik<br />
<br />
'''Status:''' Complete<br />
<br />
'''Length:''' 36 scenarios<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Default+War of Legends<br />
<br />
'''Version:''' 0.3.4<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=38210<br />
<br />
<br />
=== Bad Moon Rising ===<br />
<br />
''An expedition to gather treasure from the cold north sets off compounding disaster.''<br />
<br />
'''Author:''' Doofus-01<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 20 scenarios<br />
<br />
'''Difficulty:''' Hard<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Archaic Era<br />
<br />
'''Version:''' 1.5.8<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=31348<br />
<br />
<br />
=== Birth of a Lich ===<br />
<br />
''This is the life story of the dreaded lich Malifor, his struggle as a mage outcast, the orcish conquest of the northlands and his transformation to quench the thirst for revenge''<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 12 playable scenarios / 2 dialogue only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle, Dungeon<br />
<br />
'''Faction/Era:''' Human outlaws, dwarves, undead<br />
<br />
'''[http://units.wesnoth.org/1.10/Birth_of_a_Lich/en_US/Birth_of_a_Lich.html Custom Units]<br />
<br />
'''Version:''' 1.0.3<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37057<br />
<br />
<br />
=== Coming of the Storm ===<br />
<br />
''A new recruit joins the imperial army, eager to change the world and see combat. Little does he realise just how much action he will get and where his journey will take him. ''<br />
<br />
'''Author:''' TrashMan<br />
<br />
'''Status:''' WIP<br />
<br />
'''Length:''' 26 playable scenarios / 4 dialogue only<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle, Dungeon<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''Version:''' 1.2.1<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=23361<br />
<br />
<br />
=== Legend of Far North ===<br />
<br />
''The tale of the legendary Black Eye Karun,depicting his rise to power, his successes and his brutal assassination.'<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 16 playable scenarios / 1 dialogue only,1 cutscene<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Orcs, Trolls, Saurians, Nagas<br />
<br />
'''[http://units.wesnoth.org/1.10/Legend_of_Far_North/en_US/Legend_of_Far_North.html Custom Units]'''<br />
<br />
'''Version:''' 1.0.2<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=34769<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''''Part I: Shrouded in Darkness''' (5 chapters, 90 scenarios) - A pair of heroes, after stopping an orcish thread, are outcast into caves, where they have no other choice than to become liches in order to survive. They preserved their original appearance and moral principles, and fight in various skirmishes against evil (although using evil methods sometimes), until the Fall, when they are buried alive under the ashes of the third sun.''<br />
<br />
'''''Part II: Into the Light''' (4 chapters, 96 scenarios at the moment) - Long after the Fall, the lich heroes awaken. Searching for more power, they manage to resurrect themselves as living beings, but this time more powerful and ridden of the evil within. But the evil from inside them did not cease to exist, and started a campaign to conquer the world. Stopping the campaign caused an even worse disaster...''<br />
<br />
'''Author:''' Dugi <br />
<br />
'''Status:''' WiP (but Part I might be considered complete)<br />
<br />
'''Length:''' 185 (+7 talk-only) scenarios at the moment<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' mostly Skirmish and Dungeon (all other styles are present as well, but less frequently)<br />
<br />
'''Faction/Era:''' Elves, Loyalists, Undead, Dwarves; but they advance past their usual maximum level<br />
<br />
'''Version:''' 2.5.0<br />
<br />
'''[http://wiki.wesnoth.org/Guide_to_UMC_Campaigns/Players_Reviews#Legends_of_the_Invincibles Players´ Review]'''<br />
<br />
'''Note:''' The most unique feature of this campaign is its RPG-like unit development system, enemies drop items units can use, leaders are stronger than most usual units and all units get AMLA (after maximum level advancement) after reaching their maximum level (that is also increased by a load of additional level 4 units).<br />
<br />
<br />
=== Merry Christmas ===<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 3 playable scenarios<br />
<br />
'''Author:''' Desert_Shyde<br />
<br />
'''Description:''' Santa's elfs have to travel south into Lintanir Forest to collect Christmas trees.<br />
<br />
'''[http://units.wesnoth.org/1.10/Merry_Christmas/en_US/merry_christmas.html Custom Units]'''<br />
<br />
'''Version:''' 1.1.2<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Custom<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=32519<br />
<br />
<br />
=== Rebellion in the North ===<br />
<br />
''A great orcish uprising tends to destabilise the Northlands. As the future Lord Protector of the Northern Alliance you have to crush the rebellion and establish peace again."<br />
<br />
'''Author:''' chak_abhi<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 24 playable scenarios / 3 dialogue only,2 cutscenes<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish, Large Battle<br />
<br />
'''Faction/Era:''' Loyalists, Dwarves, Gryphons, Merfolk<br />
<br />
'''Version:''' 1.1.12<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=33059<br />
<br />
<br />
=== Ruthless ===<br />
<br />
''A bard (an aging criminal) is walking in wasteland. Nothing but two hands in his pockets, and nothing but stones around. Suddenly he sees a knight on errand--a dangerous opponent, especially in broad daylight. The two strangers are soon sitting by the campfire, and the bard is telling a story.<br />
(Beginner level, 10+ fights).''<br />
<br />
'''Author:''' homunculus<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 12 playable scenarios + 5 cutscene scenarios<br />
<br />
'''Difficulty:''' Normal <br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default (Orcs)<br />
<br />
'''Version:''' 1.0.4<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=37874<br />
<br />
'''Note:''' (Adamant14) Recommendable campaign, with smart unusual ideas and a good detailed story.<br />
You fight with few units on small but perfect maps. About the difficulty: The author describes his campaign as 'beginner level', but for me the difficulty is rather NORMAL than EASY.<br />
<br />
<br />
=== The Devil's Flute ===<br />
<br />
'''Status:''' Complete, unmaintained<br />
<br />
'''Length:''' 10 scenarios<br />
<br />
'''Author:''' lipk<br />
<br />
'''Description:''' Creona, the well-known assassin, gets a strange job from a strange person. So, in fact, it's no surprise that things take a strange turn...<br />
<br />
'''Version:''' 0.1.4c<br />
<br />
'''Difficulty:''' Unbalanced<br />
<br />
'''Style:''' Skirmish, Minigames<br />
<br />
'''Faction/Era:''' Outlaws<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?f=8&t=36044<br />
<br />
<br />
=== The Militia ===<br />
<br />
'''Status:''' Finished<br />
<br />
'''Length:''' 15 scenarios<br />
<br />
'''Author:''' Desert_Shyde<br />
<br />
'''Description:''' The Travels of a group of Peasants and their Friends; a level 0 campaign that does not focus on a singular hero.<br />
<br />
'''[http://units.wesnoth.org/1.10/The_Militia/en_US/the_militia.html Custom Units]'''<br />
<br />
'''Version:''' 1.5.2<br />
<br />
'''Difficulty:''' Normal<br />
<br />
'''Style:''' Skirmish<br />
<br />
'''Faction/Era:''' Default<br />
<br />
'''Forum:''' http://forums.wesnoth.org/viewtopic.php?t=30294<br />
<br />
<br />
<br />
== [[Guide_to_UMC_Campaigns/Players_Reviews|Player Reviews]] ==<br />
<br />
[[Category:Campaigns|*]]</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51522Player UMC Reviews2013-06-27T10:03:52Z<p>Dugi: /* Review by Dugi */</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns. Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint [add the name of the reviewed campaign here] ===<br />
==== Review by [add your name here] (version number of reviewed campaign) ====<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Review:''' * personal evaluation of the campaign taking into account different aspects such as gameplay, plot, map design, art, etc.<br />
<br />
'''Surroundings''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
<br />
=== After the Storm ===<br />
==== Review by vultraz ====<br />
'''Tags:''' fall, dungeon, elves<br />
<br />
'''Description:''' After the Emperor of Chaos was defeated, the free civilizations of the Great Continent hoped that his followers would abandon the ongoing war. Meanwhile, Galas and his unlikely band of heroes head back to the northern lands to request aid for their next journey.<br />
<br />
'''Summary:''' This campaign is, in my opinion, one of the very best UMC campaigns. It follows the story of Elynia and her band and their adventures following the events of <i>Invasion from the Unknown</i>. Since the campaign is divided into three episodes, I'll talk about each one separately.<br />
<br />
<b>Episode 1:</b> This one starts out slow, but speeds up pretty soon. The first few scenarios capture your attention and want to make you keep playing. It features an appearance of Zocthanol Isle from <i>Under the Burning Suns</i>, which I find quite nice. The late scenarios feature, as in all the episodes, AtS's signature dungeon crawling scenarios, of which I am very fond. My only complaint about this episode would be the third scenario, which is quite tedious after you build up a strong force. Other than that, a good episode.<br />
<br />
<b>Episode 2:</b> This episode jumps in right after the cliffhanger end of episode 1, and finds Elynia 1 year into the future as a result of the explosion in Wesmere. We quickly jump right into the action, and discover a very important character in scenario 2. There are a bunch of nice plot points here, including the deal made with the demon lord, and Elynia's journey to the valley from the beginning of IftU. As before, the last few scenarios feature AtS's dungeon crawling, including a very large scenario 10 map. The episode ends on what I consider a beautiful cutscene, one which finishes with a perfect flair.<br />
<br />
<b>Episode 3:</b> Shadowmaster truly saved the best for last, here. Several amazing plot points come into play in this scenario, as well as an introducing of many new characters and custom units. This episode brings together almost all the plot threads that had been laid throughout the previous two episodes and IftU and wraps them up in an elegant bow, while at the same time exploring in new directions. Gameplay wise, he managed to keep the scenarios interesting and fun after all this time. More dungeon crawling, and a gigantic final scenario followed by several cutscenes wrap up this amazing campaign. One little complaint might be about scenario 4, which I found quite hard to beat.<br />
<br />
All in all, I thoroughly enjoyed this campaign and its story. The maps, characters, and gameplay had me hooked, and I recommend this campaign to anyone.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 9<br />
<br />
'''Player Note:''' 10<br />
<br />
==== Review by bumbadadabum (0.9.2+svn) ====<br />
<br />
'''Review:''' Although it starts out quite slow, and has some lesser parts in there, I have to say that this is one of the best wesnoth campaigns I've played, and in my opinion even beats its prequel, <i>Invasion from the Unknown</i>. It's very well coded with great attention to detail, has a very good story, and very good maps, especially in Episode 3. The gameplay consists of a variety of battle scenarios, which feel very epic without the scale being too big, and a lot of dungeon-crawling scenarios, broken up with the occasional cutscene. It's not very easy, and it forces you to have a plan for the scenario, which is something I like. Because of the design of the campaign (the episodes all feel like separate campaigns) I'm going to talk about them separately.<br />
<br />
<b>Episode 1:</b><br />
This one starts off slow, with the first few scenarios having little interesting things happening, both gameplay- and storywise, although they weren't bad either. Once things start happening though, the story gets much better and the gameplay more interesting (I especially liked scenario 4 and 5), up until the last few scenarios, when some very abrupt (and almost unnecessary in my opinion) events take place, which actually left me speechless the first time I witnessed them. Another thing that left me speechless was the final cutscene, which was masterfully done and was one of the best in this campaign. In short, it starts off slow, but keeps accelerating once you progress further into the story. It's very well done overall, but it has some things I don't like.<br />
<br />
<b>Episode 2:</b><br />
Episode 2 starts off a bit slow once again, but quickly introduces the player to some important characters and gets us back into the main storyline. It features quite a lot of plot twist, and was especially fun to play through the first time. The gameplay is little different from E1's in that it features a lot of "Defeat enemy leaders" scenarios, but the variety in maps and enemies made it so it wasn't boring. It does however, feature my least favorite scenario in this campaign, scenario 6, but the last 5 scenarios more than make up for this by being some of the best scenarios in this campaign. The final boss and ending cutscene were again very fun, and served as a nice ending of the episode.<br />
<br />
<b>Episode 3</b>:<br />
I can't express how much I liked this episode. I was hooked from beginning to end, and played it all in one session. It immediately starts with, in my opinion, the best opening to a campaign I've ever seen, and got me into the story immediately. The scenarios in this episode are much more story-driven than the others, and the gameplay didn't disappoint either. The next few scenarios, although the were hard at times and frustrated me a bit) were still a lot of fun, but after scenario 6 is when things really start. The story divides into 2 branches. One of them is filled with epic battles, and is considerably less story-driven than the other one. The other one almost plays like a cutscene, and features the best atmosphere I've ever encountered in a campaign. The story keeps accelerating and expanding, and climaxes in very well made final boss. It has an open ending, and leaves much room for speculation. I'm not going to spoil much more, since I'd recommend everyone to play it.<br />
<br />
I'd rate this campaign as nearly flawless, if it'd only be based on the last episode; the other 2 are sometimes lacking a bit of pacing, and some scenarios were a bit frustrating. Overall, I think this is a great campaign, and was worth playing every minute.<br />
<br />
'''Surroundings:''' 9<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player note:''' 9<br />
<br />
=== A New Order ===<br />
==== Review by Pyrophorus ====<br />
'''Tags:''' Akladians,skirmish,story<br />
<br />
'''Description:''' A new Order is a rather long campaign, telling the story of the Akladians reign over Wesnoth. In short, Akladians are a barbarian people, coming from east, flying from slavery, who took control over the decadent Wesnoth kingdom. The story begins later, when Gawen, son of the Akladian king and a Wesnoth noblewoman, have to fight his way to the throne, reconciliate Wesnothians and Akladians to face the threat of a powerful necromancer.<br />
<br />
The campaign is a classical skirmish with some large battles, and some riddles to solve. You'll play here Akladian and Khalifate factions. <br />
<br />
'''Summary:''' It is one of the more old and mature projects in UMC (eight years old !), polished and enhanced for years, and still actively updated.<br />
<br />
At first glance, the story can look classical and boring, but it is one of the best campaign story one can find: interesting and various characters, many plot twists, a real world description make the story really interesting and original. Not for children, as the note says, should be understood as being not the kind of childish fancy most campaigns are built on. Maps and battles have been thoroughly designed and balanced, and everything could be said perfect here, with a slight reservation about graphics (but they're progressing for now).<br />
<br />
A classic which many different people can enjoy.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 8<br />
<br />
'''Replay value:''' 6<br />
<br />
'''Player note:''' 10<br />
<br />
<br />
=== Antar, Son of Rheor ===<br />
==== Review by Dugi ====<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an unusual and very practical use on the battlefield. It is balanced quite well despite its incompleteness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream story-wise as well. Unexpected end in the middle of campaign is a really unpleasant surprise too. There is a little need to replay it, because you will know what will happen, and many of these encounters are easy with proper recruits, but maybe a few years will provide a decent amnesia for that. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek heavy challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are like the existing ones)<br />
<br />
<br />
==== Review by tribes55, dean ====<br />
'''"Tags:"''' Adventurous,Intriguing<br />
<br />
'''"Description:"''' You play as a limited Loyalist faction, and are mainly fighting Undead, Orcish units and goblins. You have alliances with Dwarves and Elves.<br />
<br />
'''"Summary:"''' I liked how the campaign required thinking outside of the box, but I didn't like how on the first scenario there was VERY limited strategies you could use to win. Most scenarios are not like this in this campaign, though.<br />
<br />
'''"Surroundings:"''' Your surroundings are constantly changing, but the maps are always interesting and in some scenarios rewarding for exploring them. 8/10<br />
<br />
'''"Design:"''' The scenarios aren't repetitive and leave you wanting to play the next campaign. 8/10<br />
Story: Seeing as the story is what makes me want to play the campaign, and this one kept me to the very end of the currently limited scenarios I'd give it story a 8/10.<br />
<br />
'''"Fun:"''' * Very rarely was I bored. 7/10<br />
Replay value: * Some scenarios challenge you to do the Scenario in a more efficient way which would make me want to replay the campaign and see what I could do better this time. 7/10<br />
<br />
Player note: * <br />
Overall rating would be 8/10.<br />
<br />
<br />
=== Count Kromire ===<br />
==== Review by Dugi ====<br />
'''Tags:''' custom era, vampires, skirmish<br />
<br />
'''Description:''' A vampire campaign. In our culture, there are two kinds of vampires, first the evil bloodthirsty creatures that are usually counts and dukes and rule over small realms in dark mountains, and second, the eternal high school kids who fall in love with teens. Of course, this is about the first, cool kind of vampires. A bloodsucker has lost his land to celestials, and fights to get it back. He forges an alliance with other vampires and a strange order of humans (Windsong), and together they defeat the celestials and get his land back.<br />
<br />
'''Summary:''' It starts in a really cool way, you have two vampires and have to bite peasants to get more vampires from them. However, you will quickly get the ability to recruit them (because getting all units from plague making level 0 units would be a pain). Most of the campaign is rather classical, with well-designed and well-balanced scenarios. You play with vampires, a really interesting faction (with mages, archers, melee fighters, poison, drain on most units). The maps looks somewhat glum, but that is what you'd expect from a land controlled by vamps. They aren't very realistic either, but that actually makes the gameplay better. The way the end happens depends on some previous actions. Dialogues are not bad, quite funny because of a vampire who can't speak properly because of his huge teeth.<br />
<br />
Using a custom era has its downsides, though. Almost all units lack animations, so all combat is like headbutting with blade damage. The lore behind the factions is not as deep as in mainline, so you just don't know the motivations of most enemies to attack you. As a result, the story isn't anything special. It also has quite a strange element, if you let a guy live, he will attack you later for the arrogance of fighting him (he also quite unpleasantly surprises you by turning against you when you defeat the enemies together, for your arrogance, and it might get you defeated very easily if you aren't ready for it). I was really displeased by seeing in a description that vampires are immune to drain and plague, but shouldn't be immune to poison, but the engine does not allow it, that was total bullshit, but that is rather a part of the era.<br />
<br />
If you are bored with default era and can ignore the lack of animations, you will like it. If you seek gameplay-wise interesting factions, you'll like it too. Also if you are a fan of Twilight and need to learn what are the vampire stories about. But if you are okay with default era and classical factions and seek unusual scenarios and stories, you might not like it.<br />
<br />
'''Surroundings:''' 5<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 7<br />
<br />
=== Fate of a Princess ===<br />
==== Review by Paulomat4 ====<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
=== Invasion from the Unknown ===<br />
==== Review by Dugi ====<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
==== Review by Raijer ====<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
<br />
==== Review by bumbadadabum ====<br />
'''Description:''' (quoting Raijer) A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities. <br />
<br />
'''Summary:''' I didn't like this campaign a single bit. The scenarios feel like they've been designed 'in a hurry' without paying any attention to detail. The lack of variety or events in scenarios make them very boring to play, and often made me want to just :n and be done with them. The scale of the scenarios is completely blown out of scale, and this makes it extremely tedious to play, as everytime you press the end turn button you have to wait for the literally hundreds of enemies to move. The maps are not horrible, but far from mainline level. The story (which is one of the most important things in a campaign for me) is perhaps one of the worst things about this campaign. The dialog is badly written (in places where it is present. There isn't much dialog outside of starting dialog) and feels completely emotionless. The characters are paper-thin and not very well developed, and that only contributes to my thinking that the entire story is only there to tie the 185 scenarios together. It feels ridiculous and sometimes made me wonder what I was doing with my life, after I read another dialog. The art of the campaign consists mostly of bad frankensteins or horribly drawn units, with the exceptions of the portraits for Efraim and Lethalia, which actually look pretty decent. Overall, I feel like the pretty good idea behind the RPG engine, which in my opinion is also poorly executed, has gone to waste by it being in this campaign. I think this campaign is bad and doesn't deserve any of the praise it often receives on the forums. I would not recommend this campaign to anyone.<br />
<br />
'''Surroundings:''' 4<br />
<br />
'''Design:''' 2<br />
<br />
'''Story:''' 3<br />
<br />
'''Fun:''' 3<br />
<br />
'''Replay value:''' 4<br />
<br />
'''Player note:''' 2<br />
<br />
<br />
==== Review by t3st3r ====<br />
'''Description''': Really large and custom campaign about two heroes who are about to become legendary half-gods. During campaings there are also several "lesser" heroes with remarkable powers and abilities as well, which makes game more interesting for sure. Right now there are 9 chapters, about 200 scenarios (10 planned as far as I know). Largest and most diverse campaign I've seen so far for BfW. And the only campaign I've replayed THREE times. Because I like overall gameplay so much that I has been willing to play it even when there was 3 or 4 chapters ready, so it has been quite incomplete. To my taste it's the most epic campaign for BfW to the date. <br />
<br />
In this campaign player could find nearly all you could expect from decent game scripting engine and seriously customized scenarios. And nearly all you've missed in original BfW campaigns and maps. Great AMLAs, much better than original BfW AMLAs are. Isn't it boring to kill 20 enemies just to get some dumb +3 hp bonus? This campaign corrects this problem: most advancements are actually useful and you can control units development path (to some degree). There are some extra LVLs for many units, this is really adding up. Sure, there could be factions balance issues if you use such settings for PvP, but it's not a problem of campaign itself and it really adds up to gameplay. There will be a number of really strong enemies of truly epic scale. Real dragons, real monsters, real freaks, real arch-enemies. All kings of dangerous things you can imagine and even more than that. Some of them require very custom approach so reading in-game messages/hints is a must. There is decent items system as well. Sure, geared warriors could handle much more than those with bare hands or simple weapons. Some items could even allow "simple" (non-hero) units to challenge some tough monsters on their own. Though many arch-enemies would be hard to kill even for main heroes without proper handling and using their weak points. To my taste, I really like this campaign. In fact it's my favorite campaign, thanks to custome AMLAs, 10 chapters, items system, strong enemies and various twists to add more fun to gameplay. Sometimes you can also use units from previous chapters, which allows you to have strong army of relatively few powerful units, which is just convenient to play. This is taken into account and those who continues from old chapters are facing much stronger resistance than those who starts chapter from scratch with "dummy" heroes and lack of geared and leveled army. There are some secrets and treasures hidden, custom events and so on. There is even some basic form of item crafting, some multi-part artefacts and so on. So players who are careful to details could have some extra/optional fun in game. This is what always distinguishes well thought maps from serious map makers and scripters. So if someone tired of standard boring BfW game mechanics, it's really worth to try this campaign out to see something new, beyond standard BFW mechanics and take some completely new look on familiar storylines.<br />
<br />
'''Summary''': This is a very long campaign, telling the story of two heroes who would follow a long path from mere mortals up to strong half-gods, capable of challenging almost any kinds of <br />
things. This is somewhat mixed into classic BfW storyline and shows it from different point of view, which isn't as simple as it looks like. First chapters show us how heroes would become some immortal and powerful beings, then they will gain more power and finally manage to become half-gods. While it's really long story, there are so many types of enemies, their abilities, new storyline twists, unexpected things and so on, that it's still remains fun to play. Even after you played many chapters already. Sure, some scenarios are lengthy and/or take too much efforts to control units or wait for AI moves. However, if campaign haves ~200 scenarios, it's hard to iron out all issues in just one shot. Yet it still impressive already, especially granted that it's still work in progress and is not yet complete. <br />
<br />
Difficulty of this campaign varies. Depending on paths you've taken, units equipent and how all this affects certain enemies, some enemies could be easier/harder than others. On normal difficulty level it should be manageable for seasoned BfW player. I would not recommend this campaign to newbies as it would teach you many funny things which will be (unfortunately!) missing in most of other BfW campaigns. Players have to understand it uses enhanced game mechanics. Maps vary wildly, ranging from standard "kill them all" scenarios to RPG and quest style maps. You can develop some really new and uncommon tactics. For example, you can use meteor spell to blow up a host of powerful enemies and then teleport away if situation permits. New abilities for new strategies are nearly countless, thanks to improved AMLAs, items system and new spells and their AMLA improvements.<br />
<br />
In this campaign you can often have "convenient" army composed of relatively few relatively powerful units with some special abilities, complementing each other. As for me, it's annoying to deal with 100 lvl 1 weaklings. I'm as human is inefficient and slow in doing so. This campaign will be far more convenient most of time. It's usually enough to have 10-20 strong units + some heroes to win scenario. <br />
<br />
Though it's noteworthy to mention that advanced items system and AMLAs are making it hard keep it perfectly balanced in all corner cases in all possible combinations, so sometimes you can face some too simple or quite hard maps, unexpectedly. However, unless there is some bug, seasoned BfW players should not have real troubles in most places. And it will feel unique each time you play it, as you will take different paths here and there. That what makes it funny to replay, trying different paths in advancements.<br />
<br />
The most daunting issue to my taste is that BfW core neither really supports items system on it's own, nor it provides any decent UI to deal with items. I think BfW authors should consider adding support for items and items management to the BfW core to make mapmakers life easier. It's not only campaign where this problem exists, there are dozen and half of campaigns sharing same issue. But as this campaign makes extensive use of items, it's where problem is getting really obvious. AI is really dumb and clueless at handling items/extended features, etc. And sometimes in-game computations could take a while, so powerful CPU could be a good idea. I can also admit that authors of various campaigns have minor mismatches in explaining the very same events from BfW world. Ideally, they mismatches have to be corrected but it requires cooperation of large number of independent people and I can understand it's somewhat troublesome to achieve. And of course there are some things to iron out as it's still work in progress. This probably applies to complaints that AI takes a long time to complete turns, etc - on some maps it's really good idea to go to preferences and set "skip AI moves" option on.<br />
<br />
'''Surroundings''': 8<br />
<br />
'''Design''': 8<br />
<br />
'''Story''': 9<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
<br />
=== Panther Lord ===<br />
==== Review by taptap ====<br />
Panther Lord is one of my favourite campaigns and on higher difficulties one of the most challenging. Unlike many campaigns with an anticlimactic end (Northern Rebirth, Heir to the Throne etc.) it is unrelenting from start until the end (I suffered more than 140 casualties during its 14 scenarios). Velensk is a good player and it shows. <br />
<br />
This is the showcase campaign for the Era of Four Moons, while Salt Wars is a short and much easier introduction. The Era itself is well balanced, with many novel ideas and no elves. Admittedly, at first I shuddered at the idea of playing "half-naked wild with dark-coloured sprites" - I was quite troubled that it might be a collection of racist stereotypes, but playing with it, it certainly didn't feel so. (Much better indeed than the typical association of orcs in Tolkien-esque fantasy with mongols / turks.) There aren't only tribal Darklanders and Highlanders, but Sea States and Imperialists as well. Each of them plays very differently, none of them is depicted as timeless or "always chaotic evil", even the Imperialists, the enemies in the campaign, get the opportunity to declare themselves. It certainly benefits from the background world (IALFA developed by the maintainer of the campaign) even if you only see a glimpse of it. <br />
<br />
The hero of the campaign is a mercenary outcast of his own Darklander civilization. When learning about plans to raze and colonize the jungles of his people by the imperialists he starts the quest to rescue his people. His friend the Panther spirit, to whom the campaign owes its name, always at his side, he is rallying troops and mercenaries around him, but soon he has to realize that change is inevitable. Changing their ways they may have hope to withstand or else they will be changed by force and subjugation. But how to convince his own people when he is an upstart at best, a traitor and spirit-friend at worst?<br />
<br />
While the campaign is centered around Darklanders, the player has the choice of hiring (and recalling) a limited amount of highly useful mercenaries of the other factions of the Era. The campaign features small scale to a few large scale battles and puts different territory to good use encouraging the use of mercenaries and different unit types. I omit the numbers, but this campaign is certainly recommended.<br />
<br />
<br />
=== Swamplings ===<br />
==== Review by Dunno ====<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
<br />
==== Review by Pyrophorus ====<br />
'''Tags:''' goblins,skirmish,story<br />
<br />
'''Description:''' see previous review.<br />
<br />
'''Summary:''' This campaign is very original and imaginative. First of all, it features not chivalrous heroes like most Wesnoth campaigns, but humble and rather stubborn people instead. More of it, the story is much more picaresque than epic, written in a delicious humorous tone, very unusual in Wesnoth world. IMO, it's one of the few really good writing one can find here. It's impossible to abstract this complex story, where everything goes in an unexpected way, to list every strange encounter, funny event and so on. If you like good writing, humor, as well as hardcore fighting, you'll really love this campaign. If not, just as Dunno says, it's honest, no more.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
<br />
=== Talentless Mage ===<br />
==== Review by Dunno ====<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
<br />
=== The Library of Kratemaqht ===<br />
==== Review by Wesbane ====<br />
The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
==== Review by Dunno ====<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
<br />
== Back to Guide to UMC Campaigns ==<br />
* '''[http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Guide to UMC Campaigns]'''<br />
<br />
<br />
== Feedback Thread ==<br />
If you have criticism, ideas and suggestions then please post it in the feedback thread.<br />
<br />
Or maybe you don't want, or don't know how to edit the wiki page, then you can post your review also here. I will add it then to this page.<br />
* '''[http://forums.wesnoth.org/viewtopic.php?f=17&t=38946 Feedback Thread]'''</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51521Player UMC Reviews2013-06-27T10:02:41Z<p>Dugi: /* Review by Dugi */</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns. Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint [add the name of the reviewed campaign here] ===<br />
==== Review by [add your name here] (version number of reviewed campaign) ====<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Review:''' * personal evaluation of the campaign taking into account different aspects such as gameplay, plot, map design, art, etc.<br />
<br />
'''Surroundings''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
<br />
=== After the Storm ===<br />
==== Review by vultraz ====<br />
'''Tags:''' fall, dungeon, elves<br />
<br />
'''Description:''' After the Emperor of Chaos was defeated, the free civilizations of the Great Continent hoped that his followers would abandon the ongoing war. Meanwhile, Galas and his unlikely band of heroes head back to the northern lands to request aid for their next journey.<br />
<br />
'''Summary:''' This campaign is, in my opinion, one of the very best UMC campaigns. It follows the story of Elynia and her band and their adventures following the events of <i>Invasion from the Unknown</i>. Since the campaign is divided into three episodes, I'll talk about each one separately.<br />
<br />
<b>Episode 1:</b> This one starts out slow, but speeds up pretty soon. The first few scenarios capture your attention and want to make you keep playing. It features an appearance of Zocthanol Isle from <i>Under the Burning Suns</i>, which I find quite nice. The late scenarios feature, as in all the episodes, AtS's signature dungeon crawling scenarios, of which I am very fond. My only complaint about this episode would be the third scenario, which is quite tedious after you build up a strong force. Other than that, a good episode.<br />
<br />
<b>Episode 2:</b> This episode jumps in right after the cliffhanger end of episode 1, and finds Elynia 1 year into the future as a result of the explosion in Wesmere. We quickly jump right into the action, and discover a very important character in scenario 2. There are a bunch of nice plot points here, including the deal made with the demon lord, and Elynia's journey to the valley from the beginning of IftU. As before, the last few scenarios feature AtS's dungeon crawling, including a very large scenario 10 map. The episode ends on what I consider a beautiful cutscene, one which finishes with a perfect flair.<br />
<br />
<b>Episode 3:</b> Shadowmaster truly saved the best for last, here. Several amazing plot points come into play in this scenario, as well as an introducing of many new characters and custom units. This episode brings together almost all the plot threads that had been laid throughout the previous two episodes and IftU and wraps them up in an elegant bow, while at the same time exploring in new directions. Gameplay wise, he managed to keep the scenarios interesting and fun after all this time. More dungeon crawling, and a gigantic final scenario followed by several cutscenes wrap up this amazing campaign. One little complaint might be about scenario 4, which I found quite hard to beat.<br />
<br />
All in all, I thoroughly enjoyed this campaign and its story. The maps, characters, and gameplay had me hooked, and I recommend this campaign to anyone.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 9<br />
<br />
'''Player Note:''' 10<br />
<br />
==== Review by bumbadadabum (0.9.2+svn) ====<br />
<br />
'''Review:''' Although it starts out quite slow, and has some lesser parts in there, I have to say that this is one of the best wesnoth campaigns I've played, and in my opinion even beats its prequel, <i>Invasion from the Unknown</i>. It's very well coded with great attention to detail, has a very good story, and very good maps, especially in Episode 3. The gameplay consists of a variety of battle scenarios, which feel very epic without the scale being too big, and a lot of dungeon-crawling scenarios, broken up with the occasional cutscene. It's not very easy, and it forces you to have a plan for the scenario, which is something I like. Because of the design of the campaign (the episodes all feel like separate campaigns) I'm going to talk about them separately.<br />
<br />
<b>Episode 1:</b><br />
This one starts off slow, with the first few scenarios having little interesting things happening, both gameplay- and storywise, although they weren't bad either. Once things start happening though, the story gets much better and the gameplay more interesting (I especially liked scenario 4 and 5), up until the last few scenarios, when some very abrupt (and almost unnecessary in my opinion) events take place, which actually left me speechless the first time I witnessed them. Another thing that left me speechless was the final cutscene, which was masterfully done and was one of the best in this campaign. In short, it starts off slow, but keeps accelerating once you progress further into the story. It's very well done overall, but it has some things I don't like.<br />
<br />
<b>Episode 2:</b><br />
Episode 2 starts off a bit slow once again, but quickly introduces the player to some important characters and gets us back into the main storyline. It features quite a lot of plot twist, and was especially fun to play through the first time. The gameplay is little different from E1's in that it features a lot of "Defeat enemy leaders" scenarios, but the variety in maps and enemies made it so it wasn't boring. It does however, feature my least favorite scenario in this campaign, scenario 6, but the last 5 scenarios more than make up for this by being some of the best scenarios in this campaign. The final boss and ending cutscene were again very fun, and served as a nice ending of the episode.<br />
<br />
<b>Episode 3</b>:<br />
I can't express how much I liked this episode. I was hooked from beginning to end, and played it all in one session. It immediately starts with, in my opinion, the best opening to a campaign I've ever seen, and got me into the story immediately. The scenarios in this episode are much more story-driven than the others, and the gameplay didn't disappoint either. The next few scenarios, although the were hard at times and frustrated me a bit) were still a lot of fun, but after scenario 6 is when things really start. The story divides into 2 branches. One of them is filled with epic battles, and is considerably less story-driven than the other one. The other one almost plays like a cutscene, and features the best atmosphere I've ever encountered in a campaign. The story keeps accelerating and expanding, and climaxes in very well made final boss. It has an open ending, and leaves much room for speculation. I'm not going to spoil much more, since I'd recommend everyone to play it.<br />
<br />
I'd rate this campaign as nearly flawless, if it'd only be based on the last episode; the other 2 are sometimes lacking a bit of pacing, and some scenarios were a bit frustrating. Overall, I think this is a great campaign, and was worth playing every minute.<br />
<br />
'''Surroundings:''' 9<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player note:''' 9<br />
<br />
=== A New Order ===<br />
==== Review by Pyrophorus ====<br />
'''Tags:''' Akladians,skirmish,story<br />
<br />
'''Description:''' A new Order is a rather long campaign, telling the story of the Akladians reign over Wesnoth. In short, Akladians are a barbarian people, coming from east, flying from slavery, who took control over the decadent Wesnoth kingdom. The story begins later, when Gawen, son of the Akladian king and a Wesnoth noblewoman, have to fight his way to the throne, reconciliate Wesnothians and Akladians to face the threat of a powerful necromancer.<br />
<br />
The campaign is a classical skirmish with some large battles, and some riddles to solve. You'll play here Akladian and Khalifate factions. <br />
<br />
'''Summary:''' It is one of the more old and mature projects in UMC (eight years old !), polished and enhanced for years, and still actively updated.<br />
<br />
At first glance, the story can look classical and boring, but it is one of the best campaign story one can find: interesting and various characters, many plot twists, a real world description make the story really interesting and original. Not for children, as the note says, should be understood as being not the kind of childish fancy most campaigns are built on. Maps and battles have been thoroughly designed and balanced, and everything could be said perfect here, with a slight reservation about graphics (but they're progressing for now).<br />
<br />
A classic which many different people can enjoy.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 8<br />
<br />
'''Replay value:''' 6<br />
<br />
'''Player note:''' 10<br />
<br />
<br />
=== Antar, Son of Rheor ===<br />
==== Review by Dugi ====<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an unusual and very practical use on the battlefield. It is balanced quite well despite its incompleteness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream story-wise as well. Unexpected end in the middle of campaign is a really unpleasant surprise too. There is a little need to replay it, because you will know what will happen, and many of these encounters are easy with proper recruits, but maybe a few years will provide a decent amnesia for that. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek heavy challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are like the existing ones)<br />
<br />
<br />
==== Review by tribes55, dean ====<br />
'''"Tags:"''' Adventurous,Intriguing<br />
<br />
'''"Description:"''' You play as a limited Loyalist faction, and are mainly fighting Undead, Orcish units and goblins. You have alliances with Dwarves and Elves.<br />
<br />
'''"Summary:"''' I liked how the campaign required thinking outside of the box, but I didn't like how on the first scenario there was VERY limited strategies you could use to win. Most scenarios are not like this in this campaign, though.<br />
<br />
'''"Surroundings:"''' Your surroundings are constantly changing, but the maps are always interesting and in some scenarios rewarding for exploring them. 8/10<br />
<br />
'''"Design:"''' The scenarios aren't repetitive and leave you wanting to play the next campaign. 8/10<br />
Story: Seeing as the story is what makes me want to play the campaign, and this one kept me to the very end of the currently limited scenarios I'd give it story a 8/10.<br />
<br />
'''"Fun:"''' * Very rarely was I bored. 7/10<br />
Replay value: * Some scenarios challenge you to do the Scenario in a more efficient way which would make me want to replay the campaign and see what I could do better this time. 7/10<br />
<br />
Player note: * <br />
Overall rating would be 8/10.<br />
<br />
<br />
=== Count Kromire ===<br />
==== Review by Dugi ====<br />
'''Tags:''' custom era, vampires, skirmish<br />
<br />
'''Description:''' A vampire campaign. In our culture, there are two kinds of vampires, first the evil bloodthirsty creatures that are usually counts and dukes and rule over small realms in dark mountains, and second, the eternal high school kids who fall in love with teens. Of course, this is about the first, cool kind of vampires. A bloodsucker has lost his land to celestials, and fights to get it back. He forges an alliance with other vampires and a strange order of humans (Windsong), and together they defeat the celestials and get his land back.<br />
<br />
'''Summary:''' It starts in a really cool way, you have two vampires and have to bite peasants to get more vampires from them. However, you will quickly get the ability to recruit them (because getting all units from plague making level 0 units would be a pain). Most of the campaign is rather classical, with well-designed and well-balanced scenarios. You play with vampires, a really interesting faction (with mages, archers, melee fighters, poison, drain on most units). The maps looks somewhat glum, but that is what you'd expect from a land controlled by vamps. They aren't very realistic either, but that actually makes the gameplay better. The The way the end happens depends on some previous actions. Dialogues are not bad, quite funny because of a vampire who can't speak properly because of his huge teeth.<br />
<br />
Using a custom era has its downsides, though. Almost all units lack animations, so all combat is like headbutting with blade damage. The lore behind the factions is not as deep as in mainline, so you just don't know the motivations of most enemies to attack you. As a result, the story isn't anything special. It also has quite a strange element, if you let a guy live, he will attack you later for the arrogance of fighting him (he also quite unpleasantly surprises you by turning against you when you defeat the enemies together, for your arrogance, and it might get you defeated very easily if you aren't ready for it). I was really displeased by seeing in a description that vampires are immune to drain and plague, but shouldn't be immune to poison, but the engine does not allow it, that was total bullshit, but that is rather a part of the era.<br />
<br />
If you are bored with default era and can ignore the lack of animations, you will like it. If you seek gameplay-wise interesting factions, you'll like it too. Also if you are a fan of Twilight and need to learn what are the vampire stories about. But if you are okay with default era and classical factions and seek unusual scenarios and stories, you might not like it.<br />
<br />
'''Surroundings:''' 5<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 7<br />
<br />
=== Fate of a Princess ===<br />
==== Review by Paulomat4 ====<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
=== Invasion from the Unknown ===<br />
==== Review by Dugi ====<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
==== Review by Raijer ====<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
<br />
==== Review by bumbadadabum ====<br />
'''Description:''' (quoting Raijer) A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities. <br />
<br />
'''Summary:''' I didn't like this campaign a single bit. The scenarios feel like they've been designed 'in a hurry' without paying any attention to detail. The lack of variety or events in scenarios make them very boring to play, and often made me want to just :n and be done with them. The scale of the scenarios is completely blown out of scale, and this makes it extremely tedious to play, as everytime you press the end turn button you have to wait for the literally hundreds of enemies to move. The maps are not horrible, but far from mainline level. The story (which is one of the most important things in a campaign for me) is perhaps one of the worst things about this campaign. The dialog is badly written (in places where it is present. There isn't much dialog outside of starting dialog) and feels completely emotionless. The characters are paper-thin and not very well developed, and that only contributes to my thinking that the entire story is only there to tie the 185 scenarios together. It feels ridiculous and sometimes made me wonder what I was doing with my life, after I read another dialog. The art of the campaign consists mostly of bad frankensteins or horribly drawn units, with the exceptions of the portraits for Efraim and Lethalia, which actually look pretty decent. Overall, I feel like the pretty good idea behind the RPG engine, which in my opinion is also poorly executed, has gone to waste by it being in this campaign. I think this campaign is bad and doesn't deserve any of the praise it often receives on the forums. I would not recommend this campaign to anyone.<br />
<br />
'''Surroundings:''' 4<br />
<br />
'''Design:''' 2<br />
<br />
'''Story:''' 3<br />
<br />
'''Fun:''' 3<br />
<br />
'''Replay value:''' 4<br />
<br />
'''Player note:''' 2<br />
<br />
<br />
==== Review by t3st3r ====<br />
'''Description''': Really large and custom campaign about two heroes who are about to become legendary half-gods. During campaings there are also several "lesser" heroes with remarkable powers and abilities as well, which makes game more interesting for sure. Right now there are 9 chapters, about 200 scenarios (10 planned as far as I know). Largest and most diverse campaign I've seen so far for BfW. And the only campaign I've replayed THREE times. Because I like overall gameplay so much that I has been willing to play it even when there was 3 or 4 chapters ready, so it has been quite incomplete. To my taste it's the most epic campaign for BfW to the date. <br />
<br />
In this campaign player could find nearly all you could expect from decent game scripting engine and seriously customized scenarios. And nearly all you've missed in original BfW campaigns and maps. Great AMLAs, much better than original BfW AMLAs are. Isn't it boring to kill 20 enemies just to get some dumb +3 hp bonus? This campaign corrects this problem: most advancements are actually useful and you can control units development path (to some degree). There are some extra LVLs for many units, this is really adding up. Sure, there could be factions balance issues if you use such settings for PvP, but it's not a problem of campaign itself and it really adds up to gameplay. There will be a number of really strong enemies of truly epic scale. Real dragons, real monsters, real freaks, real arch-enemies. All kings of dangerous things you can imagine and even more than that. Some of them require very custom approach so reading in-game messages/hints is a must. There is decent items system as well. Sure, geared warriors could handle much more than those with bare hands or simple weapons. Some items could even allow "simple" (non-hero) units to challenge some tough monsters on their own. Though many arch-enemies would be hard to kill even for main heroes without proper handling and using their weak points. To my taste, I really like this campaign. In fact it's my favorite campaign, thanks to custome AMLAs, 10 chapters, items system, strong enemies and various twists to add more fun to gameplay. Sometimes you can also use units from previous chapters, which allows you to have strong army of relatively few powerful units, which is just convenient to play. This is taken into account and those who continues from old chapters are facing much stronger resistance than those who starts chapter from scratch with "dummy" heroes and lack of geared and leveled army. There are some secrets and treasures hidden, custom events and so on. There is even some basic form of item crafting, some multi-part artefacts and so on. So players who are careful to details could have some extra/optional fun in game. This is what always distinguishes well thought maps from serious map makers and scripters. So if someone tired of standard boring BfW game mechanics, it's really worth to try this campaign out to see something new, beyond standard BFW mechanics and take some completely new look on familiar storylines.<br />
<br />
'''Summary''': This is a very long campaign, telling the story of two heroes who would follow a long path from mere mortals up to strong half-gods, capable of challenging almost any kinds of <br />
things. This is somewhat mixed into classic BfW storyline and shows it from different point of view, which isn't as simple as it looks like. First chapters show us how heroes would become some immortal and powerful beings, then they will gain more power and finally manage to become half-gods. While it's really long story, there are so many types of enemies, their abilities, new storyline twists, unexpected things and so on, that it's still remains fun to play. Even after you played many chapters already. Sure, some scenarios are lengthy and/or take too much efforts to control units or wait for AI moves. However, if campaign haves ~200 scenarios, it's hard to iron out all issues in just one shot. Yet it still impressive already, especially granted that it's still work in progress and is not yet complete. <br />
<br />
Difficulty of this campaign varies. Depending on paths you've taken, units equipent and how all this affects certain enemies, some enemies could be easier/harder than others. On normal difficulty level it should be manageable for seasoned BfW player. I would not recommend this campaign to newbies as it would teach you many funny things which will be (unfortunately!) missing in most of other BfW campaigns. Players have to understand it uses enhanced game mechanics. Maps vary wildly, ranging from standard "kill them all" scenarios to RPG and quest style maps. You can develop some really new and uncommon tactics. For example, you can use meteor spell to blow up a host of powerful enemies and then teleport away if situation permits. New abilities for new strategies are nearly countless, thanks to improved AMLAs, items system and new spells and their AMLA improvements.<br />
<br />
In this campaign you can often have "convenient" army composed of relatively few relatively powerful units with some special abilities, complementing each other. As for me, it's annoying to deal with 100 lvl 1 weaklings. I'm as human is inefficient and slow in doing so. This campaign will be far more convenient most of time. It's usually enough to have 10-20 strong units + some heroes to win scenario. <br />
<br />
Though it's noteworthy to mention that advanced items system and AMLAs are making it hard keep it perfectly balanced in all corner cases in all possible combinations, so sometimes you can face some too simple or quite hard maps, unexpectedly. However, unless there is some bug, seasoned BfW players should not have real troubles in most places. And it will feel unique each time you play it, as you will take different paths here and there. That what makes it funny to replay, trying different paths in advancements.<br />
<br />
The most daunting issue to my taste is that BfW core neither really supports items system on it's own, nor it provides any decent UI to deal with items. I think BfW authors should consider adding support for items and items management to the BfW core to make mapmakers life easier. It's not only campaign where this problem exists, there are dozen and half of campaigns sharing same issue. But as this campaign makes extensive use of items, it's where problem is getting really obvious. AI is really dumb and clueless at handling items/extended features, etc. And sometimes in-game computations could take a while, so powerful CPU could be a good idea. I can also admit that authors of various campaigns have minor mismatches in explaining the very same events from BfW world. Ideally, they mismatches have to be corrected but it requires cooperation of large number of independent people and I can understand it's somewhat troublesome to achieve. And of course there are some things to iron out as it's still work in progress. This probably applies to complaints that AI takes a long time to complete turns, etc - on some maps it's really good idea to go to preferences and set "skip AI moves" option on.<br />
<br />
'''Surroundings''': 8<br />
<br />
'''Design''': 8<br />
<br />
'''Story''': 9<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
<br />
=== Panther Lord ===<br />
==== Review by taptap ====<br />
Panther Lord is one of my favourite campaigns and on higher difficulties one of the most challenging. Unlike many campaigns with an anticlimactic end (Northern Rebirth, Heir to the Throne etc.) it is unrelenting from start until the end (I suffered more than 140 casualties during its 14 scenarios). Velensk is a good player and it shows. <br />
<br />
This is the showcase campaign for the Era of Four Moons, while Salt Wars is a short and much easier introduction. The Era itself is well balanced, with many novel ideas and no elves. Admittedly, at first I shuddered at the idea of playing "half-naked wild with dark-coloured sprites" - I was quite troubled that it might be a collection of racist stereotypes, but playing with it, it certainly didn't feel so. (Much better indeed than the typical association of orcs in Tolkien-esque fantasy with mongols / turks.) There aren't only tribal Darklanders and Highlanders, but Sea States and Imperialists as well. Each of them plays very differently, none of them is depicted as timeless or "always chaotic evil", even the Imperialists, the enemies in the campaign, get the opportunity to declare themselves. It certainly benefits from the background world (IALFA developed by the maintainer of the campaign) even if you only see a glimpse of it. <br />
<br />
The hero of the campaign is a mercenary outcast of his own Darklander civilization. When learning about plans to raze and colonize the jungles of his people by the imperialists he starts the quest to rescue his people. His friend the Panther spirit, to whom the campaign owes its name, always at his side, he is rallying troops and mercenaries around him, but soon he has to realize that change is inevitable. Changing their ways they may have hope to withstand or else they will be changed by force and subjugation. But how to convince his own people when he is an upstart at best, a traitor and spirit-friend at worst?<br />
<br />
While the campaign is centered around Darklanders, the player has the choice of hiring (and recalling) a limited amount of highly useful mercenaries of the other factions of the Era. The campaign features small scale to a few large scale battles and puts different territory to good use encouraging the use of mercenaries and different unit types. I omit the numbers, but this campaign is certainly recommended.<br />
<br />
<br />
=== Swamplings ===<br />
==== Review by Dunno ====<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
<br />
==== Review by Pyrophorus ====<br />
'''Tags:''' goblins,skirmish,story<br />
<br />
'''Description:''' see previous review.<br />
<br />
'''Summary:''' This campaign is very original and imaginative. First of all, it features not chivalrous heroes like most Wesnoth campaigns, but humble and rather stubborn people instead. More of it, the story is much more picaresque than epic, written in a delicious humorous tone, very unusual in Wesnoth world. IMO, it's one of the few really good writing one can find here. It's impossible to abstract this complex story, where everything goes in an unexpected way, to list every strange encounter, funny event and so on. If you like good writing, humor, as well as hardcore fighting, you'll really love this campaign. If not, just as Dunno says, it's honest, no more.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
<br />
=== Talentless Mage ===<br />
==== Review by Dunno ====<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
<br />
=== The Library of Kratemaqht ===<br />
==== Review by Wesbane ====<br />
The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
==== Review by Dunno ====<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
<br />
== Back to Guide to UMC Campaigns ==<br />
* '''[http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Guide to UMC Campaigns]'''<br />
<br />
<br />
== Feedback Thread ==<br />
If you have criticism, ideas and suggestions then please post it in the feedback thread.<br />
<br />
Or maybe you don't want, or don't know how to edit the wiki page, then you can post your review also here. I will add it then to this page.<br />
* '''[http://forums.wesnoth.org/viewtopic.php?f=17&t=38946 Feedback Thread]'''</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51520Player UMC Reviews2013-06-27T09:31:45Z<p>Dugi: /* Fate of a Princess */</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns. Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint [add the name of the reviewed campaign here] ===<br />
==== Review by [add your name here] (version number of reviewed campaign) ====<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Review:''' * personal evaluation of the campaign taking into account different aspects such as gameplay, plot, map design, art, etc.<br />
<br />
'''Surroundings''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
<br />
=== After the Storm ===<br />
==== Review by vultraz ====<br />
'''Tags:''' fall, dungeon, elves<br />
<br />
'''Description:''' After the Emperor of Chaos was defeated, the free civilizations of the Great Continent hoped that his followers would abandon the ongoing war. Meanwhile, Galas and his unlikely band of heroes head back to the northern lands to request aid for their next journey.<br />
<br />
'''Summary:''' This campaign is, in my opinion, one of the very best UMC campaigns. It follows the story of Elynia and her band and their adventures following the events of <i>Invasion from the Unknown</i>. Since the campaign is divided into three episodes, I'll talk about each one separately.<br />
<br />
<b>Episode 1:</b> This one starts out slow, but speeds up pretty soon. The first few scenarios capture your attention and want to make you keep playing. It features an appearance of Zocthanol Isle from <i>Under the Burning Suns</i>, which I find quite nice. The late scenarios feature, as in all the episodes, AtS's signature dungeon crawling scenarios, of which I am very fond. My only complaint about this episode would be the third scenario, which is quite tedious after you build up a strong force. Other than that, a good episode.<br />
<br />
<b>Episode 2:</b> This episode jumps in right after the cliffhanger end of episode 1, and finds Elynia 1 year into the future as a result of the explosion in Wesmere. We quickly jump right into the action, and discover a very important character in scenario 2. There are a bunch of nice plot points here, including the deal made with the demon lord, and Elynia's journey to the valley from the beginning of IftU. As before, the last few scenarios feature AtS's dungeon crawling, including a very large scenario 10 map. The episode ends on what I consider a beautiful cutscene, one which finishes with a perfect flair.<br />
<br />
<b>Episode 3:</b> Shadowmaster truly saved the best for last, here. Several amazing plot points come into play in this scenario, as well as an introducing of many new characters and custom units. This episode brings together almost all the plot threads that had been laid throughout the previous two episodes and IftU and wraps them up in an elegant bow, while at the same time exploring in new directions. Gameplay wise, he managed to keep the scenarios interesting and fun after all this time. More dungeon crawling, and a gigantic final scenario followed by several cutscenes wrap up this amazing campaign. One little complaint might be about scenario 4, which I found quite hard to beat.<br />
<br />
All in all, I thoroughly enjoyed this campaign and its story. The maps, characters, and gameplay had me hooked, and I recommend this campaign to anyone.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 9<br />
<br />
'''Player Note:''' 10<br />
<br />
==== Review by bumbadadabum (0.9.2+svn) ====<br />
<br />
'''Review:''' Although it starts out quite slow, and has some lesser parts in there, I have to say that this is one of the best wesnoth campaigns I've played, and in my opinion even beats its prequel, <i>Invasion from the Unknown</i>. It's very well coded with great attention to detail, has a very good story, and very good maps, especially in Episode 3. The gameplay consists of a variety of battle scenarios, which feel very epic without the scale being too big, and a lot of dungeon-crawling scenarios, broken up with the occasional cutscene. It's not very easy, and it forces you to have a plan for the scenario, which is something I like. Because of the design of the campaign (the episodes all feel like separate campaigns) I'm going to talk about them separately.<br />
<br />
<b>Episode 1:</b><br />
This one starts off slow, with the first few scenarios having little interesting things happening, both gameplay- and storywise, although they weren't bad either. Once things start happening though, the story gets much better and the gameplay more interesting (I especially liked scenario 4 and 5), up until the last few scenarios, when some very abrupt (and almost unnecessary in my opinion) events take place, which actually left me speechless the first time I witnessed them. Another thing that left me speechless was the final cutscene, which was masterfully done and was one of the best in this campaign. In short, it starts off slow, but keeps accelerating once you progress further into the story. It's very well done overall, but it has some things I don't like.<br />
<br />
<b>Episode 2:</b><br />
Episode 2 starts off a bit slow once again, but quickly introduces the player to some important characters and gets us back into the main storyline. It features quite a lot of plot twist, and was especially fun to play through the first time. The gameplay is little different from E1's in that it features a lot of "Defeat enemy leaders" scenarios, but the variety in maps and enemies made it so it wasn't boring. It does however, feature my least favorite scenario in this campaign, scenario 6, but the last 5 scenarios more than make up for this by being some of the best scenarios in this campaign. The final boss and ending cutscene were again very fun, and served as a nice ending of the episode.<br />
<br />
<b>Episode 3</b>:<br />
I can't express how much I liked this episode. I was hooked from beginning to end, and played it all in one session. It immediately starts with, in my opinion, the best opening to a campaign I've ever seen, and got me into the story immediately. The scenarios in this episode are much more story-driven than the others, and the gameplay didn't disappoint either. The next few scenarios, although the were hard at times and frustrated me a bit) were still a lot of fun, but after scenario 6 is when things really start. The story divides into 2 branches. One of them is filled with epic battles, and is considerably less story-driven than the other one. The other one almost plays like a cutscene, and features the best atmosphere I've ever encountered in a campaign. The story keeps accelerating and expanding, and climaxes in very well made final boss. It has an open ending, and leaves much room for speculation. I'm not going to spoil much more, since I'd recommend everyone to play it.<br />
<br />
I'd rate this campaign as nearly flawless, if it'd only be based on the last episode; the other 2 are sometimes lacking a bit of pacing, and some scenarios were a bit frustrating. Overall, I think this is a great campaign, and was worth playing every minute.<br />
<br />
'''Surroundings:''' 9<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player note:''' 9<br />
<br />
=== A New Order ===<br />
==== Review by Pyrophorus ====<br />
'''Tags:''' Akladians,skirmish,story<br />
<br />
'''Description:''' A new Order is a rather long campaign, telling the story of the Akladians reign over Wesnoth. In short, Akladians are a barbarian people, coming from east, flying from slavery, who took control over the decadent Wesnoth kingdom. The story begins later, when Gawen, son of the Akladian king and a Wesnoth noblewoman, have to fight his way to the throne, reconciliate Wesnothians and Akladians to face the threat of a powerful necromancer.<br />
<br />
The campaign is a classical skirmish with some large battles, and some riddles to solve. You'll play here Akladian and Khalifate factions. <br />
<br />
'''Summary:''' It is one of the more old and mature projects in UMC (eight years old !), polished and enhanced for years, and still actively updated.<br />
<br />
At first glance, the story can look classical and boring, but it is one of the best campaign story one can find: interesting and various characters, many plot twists, a real world description make the story really interesting and original. Not for children, as the note says, should be understood as being not the kind of childish fancy most campaigns are built on. Maps and battles have been thoroughly designed and balanced, and everything could be said perfect here, with a slight reservation about graphics (but they're progressing for now).<br />
<br />
A classic which many different people can enjoy.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 8<br />
<br />
'''Replay value:''' 6<br />
<br />
'''Player note:''' 10<br />
<br />
<br />
=== Antar, Son of Rheor ===<br />
==== Review by Dugi ====<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an unusual and very practical use on the battlefield. It is balanced quite well despite its incompleteness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream story-wise as well. Unexpected end in the middle of campaign is a really unpleasant surprise too. There is a little need to replay it, because you will know what will happen, and many of these encounters are easy with proper recruits, but maybe a few years will provide a decent amnesia for that. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek heavy challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are like the existing ones)<br />
<br />
<br />
==== Review by tribes55, dean ====<br />
'''"Tags:"''' Adventurous,Intriguing<br />
<br />
'''"Description:"''' You play as a limited Loyalist faction, and are mainly fighting Undead, Orcish units and goblins. You have alliances with Dwarves and Elves.<br />
<br />
'''"Summary:"''' I liked how the campaign required thinking outside of the box, but I didn't like how on the first scenario there was VERY limited strategies you could use to win. Most scenarios are not like this in this campaign, though.<br />
<br />
'''"Surroundings:"''' Your surroundings are constantly changing, but the maps are always interesting and in some scenarios rewarding for exploring them. 8/10<br />
<br />
'''"Design:"''' The scenarios aren't repetitive and leave you wanting to play the next campaign. 8/10<br />
Story: Seeing as the story is what makes me want to play the campaign, and this one kept me to the very end of the currently limited scenarios I'd give it story a 8/10.<br />
<br />
'''"Fun:"''' * Very rarely was I bored. 7/10<br />
Replay value: * Some scenarios challenge you to do the Scenario in a more efficient way which would make me want to replay the campaign and see what I could do better this time. 7/10<br />
<br />
Player note: * <br />
Overall rating would be 8/10.<br />
<br />
<br />
=== Count Kromire ===<br />
==== Review by Dugi ====<br />
'''Tags:''' custom era, vampires, skirmish<br />
<br />
<br />
=== Fate of a Princess ===<br />
==== Review by Paulomat4 ====<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
=== Invasion from the Unknown ===<br />
==== Review by Dugi ====<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
==== Review by Raijer ====<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
<br />
==== Review by bumbadadabum ====<br />
'''Description:''' (quoting Raijer) A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities. <br />
<br />
'''Summary:''' I didn't like this campaign a single bit. The scenarios feel like they've been designed 'in a hurry' without paying any attention to detail. The lack of variety or events in scenarios make them very boring to play, and often made me want to just :n and be done with them. The scale of the scenarios is completely blown out of scale, and this makes it extremely tedious to play, as everytime you press the end turn button you have to wait for the literally hundreds of enemies to move. The maps are not horrible, but far from mainline level. The story (which is one of the most important things in a campaign for me) is perhaps one of the worst things about this campaign. The dialog is badly written (in places where it is present. There isn't much dialog outside of starting dialog) and feels completely emotionless. The characters are paper-thin and not very well developed, and that only contributes to my thinking that the entire story is only there to tie the 185 scenarios together. It feels ridiculous and sometimes made me wonder what I was doing with my life, after I read another dialog. The art of the campaign consists mostly of bad frankensteins or horribly drawn units, with the exceptions of the portraits for Efraim and Lethalia, which actually look pretty decent. Overall, I feel like the pretty good idea behind the RPG engine, which in my opinion is also poorly executed, has gone to waste by it being in this campaign. I think this campaign is bad and doesn't deserve any of the praise it often receives on the forums. I would not recommend this campaign to anyone.<br />
<br />
'''Surroundings:''' 4<br />
<br />
'''Design:''' 2<br />
<br />
'''Story:''' 3<br />
<br />
'''Fun:''' 3<br />
<br />
'''Replay value:''' 4<br />
<br />
'''Player note:''' 2<br />
<br />
<br />
==== Review by t3st3r ====<br />
'''Description''': Really large and custom campaign about two heroes who are about to become legendary half-gods. During campaings there are also several "lesser" heroes with remarkable powers and abilities as well, which makes game more interesting for sure. Right now there are 9 chapters, about 200 scenarios (10 planned as far as I know). Largest and most diverse campaign I've seen so far for BfW. And the only campaign I've replayed THREE times. Because I like overall gameplay so much that I has been willing to play it even when there was 3 or 4 chapters ready, so it has been quite incomplete. To my taste it's the most epic campaign for BfW to the date. <br />
<br />
In this campaign player could find nearly all you could expect from decent game scripting engine and seriously customized scenarios. And nearly all you've missed in original BfW campaigns and maps. Great AMLAs, much better than original BfW AMLAs are. Isn't it boring to kill 20 enemies just to get some dumb +3 hp bonus? This campaign corrects this problem: most advancements are actually useful and you can control units development path (to some degree). There are some extra LVLs for many units, this is really adding up. Sure, there could be factions balance issues if you use such settings for PvP, but it's not a problem of campaign itself and it really adds up to gameplay. There will be a number of really strong enemies of truly epic scale. Real dragons, real monsters, real freaks, real arch-enemies. All kings of dangerous things you can imagine and even more than that. Some of them require very custom approach so reading in-game messages/hints is a must. There is decent items system as well. Sure, geared warriors could handle much more than those with bare hands or simple weapons. Some items could even allow "simple" (non-hero) units to challenge some tough monsters on their own. Though many arch-enemies would be hard to kill even for main heroes without proper handling and using their weak points. To my taste, I really like this campaign. In fact it's my favorite campaign, thanks to custome AMLAs, 10 chapters, items system, strong enemies and various twists to add more fun to gameplay. Sometimes you can also use units from previous chapters, which allows you to have strong army of relatively few powerful units, which is just convenient to play. This is taken into account and those who continues from old chapters are facing much stronger resistance than those who starts chapter from scratch with "dummy" heroes and lack of geared and leveled army. There are some secrets and treasures hidden, custom events and so on. There is even some basic form of item crafting, some multi-part artefacts and so on. So players who are careful to details could have some extra/optional fun in game. This is what always distinguishes well thought maps from serious map makers and scripters. So if someone tired of standard boring BfW game mechanics, it's really worth to try this campaign out to see something new, beyond standard BFW mechanics and take some completely new look on familiar storylines.<br />
<br />
'''Summary''': This is a very long campaign, telling the story of two heroes who would follow a long path from mere mortals up to strong half-gods, capable of challenging almost any kinds of <br />
things. This is somewhat mixed into classic BfW storyline and shows it from different point of view, which isn't as simple as it looks like. First chapters show us how heroes would become some immortal and powerful beings, then they will gain more power and finally manage to become half-gods. While it's really long story, there are so many types of enemies, their abilities, new storyline twists, unexpected things and so on, that it's still remains fun to play. Even after you played many chapters already. Sure, some scenarios are lengthy and/or take too much efforts to control units or wait for AI moves. However, if campaign haves ~200 scenarios, it's hard to iron out all issues in just one shot. Yet it still impressive already, especially granted that it's still work in progress and is not yet complete. <br />
<br />
Difficulty of this campaign varies. Depending on paths you've taken, units equipent and how all this affects certain enemies, some enemies could be easier/harder than others. On normal difficulty level it should be manageable for seasoned BfW player. I would not recommend this campaign to newbies as it would teach you many funny things which will be (unfortunately!) missing in most of other BfW campaigns. Players have to understand it uses enhanced game mechanics. Maps vary wildly, ranging from standard "kill them all" scenarios to RPG and quest style maps. You can develop some really new and uncommon tactics. For example, you can use meteor spell to blow up a host of powerful enemies and then teleport away if situation permits. New abilities for new strategies are nearly countless, thanks to improved AMLAs, items system and new spells and their AMLA improvements.<br />
<br />
In this campaign you can often have "convenient" army composed of relatively few relatively powerful units with some special abilities, complementing each other. As for me, it's annoying to deal with 100 lvl 1 weaklings. I'm as human is inefficient and slow in doing so. This campaign will be far more convenient most of time. It's usually enough to have 10-20 strong units + some heroes to win scenario. <br />
<br />
Though it's noteworthy to mention that advanced items system and AMLAs are making it hard keep it perfectly balanced in all corner cases in all possible combinations, so sometimes you can face some too simple or quite hard maps, unexpectedly. However, unless there is some bug, seasoned BfW players should not have real troubles in most places. And it will feel unique each time you play it, as you will take different paths here and there. That what makes it funny to replay, trying different paths in advancements.<br />
<br />
The most daunting issue to my taste is that BfW core neither really supports items system on it's own, nor it provides any decent UI to deal with items. I think BfW authors should consider adding support for items and items management to the BfW core to make mapmakers life easier. It's not only campaign where this problem exists, there are dozen and half of campaigns sharing same issue. But as this campaign makes extensive use of items, it's where problem is getting really obvious. AI is really dumb and clueless at handling items/extended features, etc. And sometimes in-game computations could take a while, so powerful CPU could be a good idea. I can also admit that authors of various campaigns have minor mismatches in explaining the very same events from BfW world. Ideally, they mismatches have to be corrected but it requires cooperation of large number of independent people and I can understand it's somewhat troublesome to achieve. And of course there are some things to iron out as it's still work in progress. This probably applies to complaints that AI takes a long time to complete turns, etc - on some maps it's really good idea to go to preferences and set "skip AI moves" option on.<br />
<br />
'''Surroundings''': 8<br />
<br />
'''Design''': 8<br />
<br />
'''Story''': 9<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
<br />
=== Panther Lord ===<br />
==== Review by taptap ====<br />
Panther Lord is one of my favourite campaigns and on higher difficulties one of the most challenging. Unlike many campaigns with an anticlimactic end (Northern Rebirth, Heir to the Throne etc.) it is unrelenting from start until the end (I suffered more than 140 casualties during its 14 scenarios). Velensk is a good player and it shows. <br />
<br />
This is the showcase campaign for the Era of Four Moons, while Salt Wars is a short and much easier introduction. The Era itself is well balanced, with many novel ideas and no elves. Admittedly, at first I shuddered at the idea of playing "half-naked wild with dark-coloured sprites" - I was quite troubled that it might be a collection of racist stereotypes, but playing with it, it certainly didn't feel so. (Much better indeed than the typical association of orcs in Tolkien-esque fantasy with mongols / turks.) There aren't only tribal Darklanders and Highlanders, but Sea States and Imperialists as well. Each of them plays very differently, none of them is depicted as timeless or "always chaotic evil", even the Imperialists, the enemies in the campaign, get the opportunity to declare themselves. It certainly benefits from the background world (IALFA developed by the maintainer of the campaign) even if you only see a glimpse of it. <br />
<br />
The hero of the campaign is a mercenary outcast of his own Darklander civilization. When learning about plans to raze and colonize the jungles of his people by the imperialists he starts the quest to rescue his people. His friend the Panther spirit, to whom the campaign owes its name, always at his side, he is rallying troops and mercenaries around him, but soon he has to realize that change is inevitable. Changing their ways they may have hope to withstand or else they will be changed by force and subjugation. But how to convince his own people when he is an upstart at best, a traitor and spirit-friend at worst?<br />
<br />
While the campaign is centered around Darklanders, the player has the choice of hiring (and recalling) a limited amount of highly useful mercenaries of the other factions of the Era. The campaign features small scale to a few large scale battles and puts different territory to good use encouraging the use of mercenaries and different unit types. I omit the numbers, but this campaign is certainly recommended.<br />
<br />
<br />
=== Swamplings ===<br />
==== Review by Dunno ====<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
<br />
==== Review by Pyrophorus ====<br />
'''Tags:''' goblins,skirmish,story<br />
<br />
'''Description:''' see previous review.<br />
<br />
'''Summary:''' This campaign is very original and imaginative. First of all, it features not chivalrous heroes like most Wesnoth campaigns, but humble and rather stubborn people instead. More of it, the story is much more picaresque than epic, written in a delicious humorous tone, very unusual in Wesnoth world. IMO, it's one of the few really good writing one can find here. It's impossible to abstract this complex story, where everything goes in an unexpected way, to list every strange encounter, funny event and so on. If you like good writing, humor, as well as hardcore fighting, you'll really love this campaign. If not, just as Dunno says, it's honest, no more.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 10<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
<br />
=== Talentless Mage ===<br />
==== Review by Dunno ====<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
<br />
=== The Library of Kratemaqht ===<br />
==== Review by Wesbane ====<br />
The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
==== Review by Dunno ====<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
<br />
== Back to Guide to UMC Campaigns ==<br />
* '''[http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Guide to UMC Campaigns]'''<br />
<br />
<br />
== Feedback Thread ==<br />
If you have criticism, ideas and suggestions then please post it in the feedback thread.<br />
<br />
Or maybe you don't want, or don't know how to edit the wiki page, then you can post your review also here. I will add it then to this page.<br />
* '''[http://forums.wesnoth.org/viewtopic.php?f=17&t=38946 Feedback Thread]'''</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51350Player UMC Reviews2013-06-07T08:50:54Z<p>Dugi: /* Review by Dugi */</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns. Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint [add the name of the reviewed campaign here] ===<br />
==== Review by [add your name here] ====<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Description:''' * a description of the important things in the add-on, like played faction, kind of enemies, gameplay style, difficulty, etc; should not be copying the author's description or contain too many spoilers<br />
<br />
'''Summary:''' * a ''subjective'' description of the things you liked and disliked about the add-on (and why you liked or disliked them), should also contain some kind of overall impression<br />
<br />
'''Surroundings:''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
If you want to review a campaign that was already reviewed, edit the old one, trying to make some kind of synthesis from yours and the original one. Add things that weren't mentioned. Leave both opinions to things originally described from one side, many elements have their good sides and odd sides (for example, usage of a custom era usually means unusual units, but awful graphics). Remove only outdated elements. Ratings should be averaged. Add your name to the original reviewer's name.<br />
<br />
<br />
<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
<br />
=== Antar, Son of Rheor ===<br />
==== Review by Dugi ====<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an unusual and very practical use on the battlefield. It is balanced quite well despite its incompleteness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream story-wise as well. Unexpected end in the middle of campaign is a really unpleasant surprise too. There is a little need to replay it, because you will know what will happen, and many of these encounters are easy with proper recruits, but maybe a few years will provide a decent amnesia for that. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek heavy challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are like the existing ones)<br />
<br />
=== Fate of a princess ===<br />
==== Review by Paulomat4 ====<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
<br />
=== Invasion from the Unknown ===<br />
==== Review by Dugi ====<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
==== Review by Raijer ====<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
<br />
=== Panther Lord ===<br />
==== Review by taptap ====<br />
<br />
Panther Lord is one of my favourite campaigns and on higher difficulties one of the most challenging. Unlike many campaigns with an anticlimactic end (Northern Rebirth, Heir to the Throne etc.) it is unrelenting from start until the end (I suffered more than 140 casualties during its 14 scenarios). Velensk is a good player and it shows. <br />
<br />
This is the showcase campaign for the Era of Four Moons, while Salt Wars is a short and much easier introduction. The Era itself is well balanced, with many novel ideas and no elves. Admittedly, at first I shuddered at the idea of playing "half-naked wild with dark-coloured sprites" - I was quite troubled that it might be a collection of racist stereotypes, but playing with it, it certainly didn't feel so. (Much better indeed than the typical association of orcs in Tolkien-esque fantasy with mongols / turks.) There aren't only tribal Darklanders and Highlanders, but Sea States and Imperialists as well. Each of them plays very differently, none of them is depicted as timeless or "always chaotic evil", even the Imperialists, the enemies in the campaign, get the opportunity to declare themselves. It certainly benefits from the background world (IALFA developed by the maintainer of the campaign) even if you only see a glimpse of it. <br />
<br />
The hero of the campaign is a mercenary outcast of his own Darklander civilization. When learning about plans to raze and colonize the jungles of his people by the imperialists together with his friend, the Panther spirit to whom the campaign owes its name, he starts on a quest to rescue his people. Rallying troops and mercenaries around him, he has soon to realize that change is inevitable. Changing their ways they may have hope to withstand or else they will be changed by force and subjugation. But how to convince his own people when he is an upstart at best, a traitor and spirit-friend at worst?<br />
<br />
The campaign features small scale to a few large scale battles and puts different territory to good use encouraging the use of mercenaries and different unit types. While the campaign is centered around Darklanders, the player has the choice of hiring (and recalling) a limited amount of highly useful mercenaries of the other factions of the Era. I omit the numbers, but this campaign is certainly recommended.<br />
<br />
<br />
=== Swamplings ===<br />
==== Review by Dunno ====<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
<br />
=== Talentless Mage ===<br />
==== Review by Dunno ====<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
<br />
<br />
=== The Library of Kratemaqht ===<br />
==== Review by Wesbane ====<br />
The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
==== Review by Dunno ====<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
== Back to Guide to UMC Campaigns ==<br />
* '''[http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Guide to UMC Campaigns]'''<br />
<br />
== Feedback Thread ==<br />
If you have criticism, ideas and suggestions then please post it in the feedback thread.<br />
<br />
Or maybe you don't want, or don't know how to edit the wiki page, then you can post your review also here. I will add it then to this page.<br />
* '''[http://forums.wesnoth.org/viewtopic.php?f=17&t=38946 Feedback Thread]'''</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51333Player UMC Reviews2013-06-06T06:12:12Z<p>Dugi: /* Antar, son of Rheor */</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns.<br />
It aims to provide all the information not only about the story, but also about completion, difficulty and playing style of the campaign.<br />
Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint ===<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Description:''' * a description of the important things in the add-on, like played faction, kind of enemies, gameplay style, difficulty, etc; should not be copying the author's description or contain too many spoilers<br />
<br />
'''Summary:''' * a ''subjective'' description of the things you liked and disliked about the add-on (and why you liked or disliked them), should also contain some kind of overall impression<br />
<br />
'''Surroundings:''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Review by:''' * add your name here<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
If you want to review a campaign that was already reviewed, edit the old one, trying to make some kind of synthesis from yours and the original one. Add things that weren't mentioned. Leave both opinions to things originally described from one side, many elements have their good sides and odd sides (for example, usage of a custom era usually means unusual units, but awful graphics). Remove only outdated elements. Ratings should be averaged. Add your name to the original reviewer's name.<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
=== Antar, son of Rheor ===<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an unusual and very practical use on the battlefield. It is balanced quite well despite its incompletedness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream as well. Unexpected end in the middle of campaign is a really unpleasant surprise too. There is a little need to replay it, because you will know what will happen, and many of these encounters are easy with proper recruits, but maybe a few years will provide a decent amnesia for that. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are like the existing ones)<br />
<br />
''Review by Dugi''<br />
<br />
=== Fate of a princess ===<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
''Review by Paulomat4''<br />
<br />
=== Invasion from the Unknown ===<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
''Review by Raijer''<br />
<br />
=== Swamplings ===<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
''Review by Dunno''<br />
<br />
=== Talentless Mage ===<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
''Review by Dunno''<br />
<br />
=== The Library of Kratemaqht ===<br />
<br />
'''Review:''' General: The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Review by:''' Wesbane<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
''Review by Dunno''<br />
<br />
== [http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Back to Guide to UMC Campaigns] ==</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51332Player UMC Reviews2013-06-06T06:11:16Z<p>Dugi: /* Antar, son of Rheor */</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns.<br />
It aims to provide all the information not only about the story, but also about completion, difficulty and playing style of the campaign.<br />
Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint ===<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Description:''' * a description of the important things in the add-on, like played faction, kind of enemies, gameplay style, difficulty, etc; should not be copying the author's description or contain too many spoilers<br />
<br />
'''Summary:''' * a ''subjective'' description of the things you liked and disliked about the add-on (and why you liked or disliked them), should also contain some kind of overall impression<br />
<br />
'''Surroundings:''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Review by:''' * add your name here<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
If you want to review a campaign that was already reviewed, edit the old one, trying to make some kind of synthesis from yours and the original one. Add things that weren't mentioned. Leave both opinions to things originally described from one side, many elements have their good sides and odd sides (for example, usage of a custom era usually means unusual units, but awful graphics). Remove only outdated elements. Ratings should be averaged. Add your name to the original reviewer's name.<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
=== Antar, son of Rheor ===<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an unusual and very practical use on the battlefield. It is balanced quite well despite its incompletedness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream as well. Unexpected end in the middle of campaign is a really unpleasant surprise too. There is a little need to replay it, because you will know what will happen, and many of these encounters are easy with proper recruits. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are like the existing ones)<br />
<br />
''Review by Dugi''<br />
<br />
=== Fate of a princess ===<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
''Review by Paulomat4''<br />
<br />
=== Invasion from the Unknown ===<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
''Review by Raijer''<br />
<br />
=== Swamplings ===<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
''Review by Dunno''<br />
<br />
=== Talentless Mage ===<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
''Review by Dunno''<br />
<br />
=== The Library of Kratemaqht ===<br />
<br />
'''Review:''' General: The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Review by:''' Wesbane<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
''Review by Dunno''<br />
<br />
== [http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Back to Guide to UMC Campaigns] ==</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51331Player UMC Reviews2013-06-06T06:08:17Z<p>Dugi: /* Antar, son of Rheor */</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns.<br />
It aims to provide all the information not only about the story, but also about completion, difficulty and playing style of the campaign.<br />
Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint ===<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Description:''' * a description of the important things in the add-on, like played faction, kind of enemies, gameplay style, difficulty, etc; should not be copying the author's description or contain too many spoilers<br />
<br />
'''Summary:''' * a ''subjective'' description of the things you liked and disliked about the add-on (and why you liked or disliked them), should also contain some kind of overall impression<br />
<br />
'''Surroundings:''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Review by:''' * add your name here<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
If you want to review a campaign that was already reviewed, edit the old one, trying to make some kind of synthesis from yours and the original one. Add things that weren't mentioned. Leave both opinions to things originally described from one side, many elements have their good sides and odd sides (for example, usage of a custom era usually means unusual units, but awful graphics). Remove only outdated elements. Ratings should be averaged. Add your name to the original reviewer's name.<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
=== Antar, son of Rheor ===<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an unusual and very practical use on the battlefield. It is balanced quite well despite its incompletedness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream as well. Unexpected end in the middle of campaign is a really unpleasant surprise too. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are like the existing ones)<br />
<br />
''Review by Dugi''<br />
<br />
=== Fate of a princess ===<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
''Review by Paulomat4''<br />
<br />
=== Invasion from the Unknown ===<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
''Review by Raijer''<br />
<br />
=== Swamplings ===<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
''Review by Dunno''<br />
<br />
=== Talentless Mage ===<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
''Review by Dunno''<br />
<br />
=== The Library of Kratemaqht ===<br />
<br />
'''Review:''' General: The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Review by:''' Wesbane<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
''Review by Dunno''<br />
<br />
== [http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Back to Guide to UMC Campaigns] ==</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51330Player UMC Reviews2013-06-06T06:05:40Z<p>Dugi: /* Antar, son of Rheor */</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns.<br />
It aims to provide all the information not only about the story, but also about completion, difficulty and playing style of the campaign.<br />
Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint ===<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Description:''' * a description of the important things in the add-on, like played faction, kind of enemies, gameplay style, difficulty, etc; should not be copying the author's description or contain too many spoilers<br />
<br />
'''Summary:''' * a ''subjective'' description of the things you liked and disliked about the add-on (and why you liked or disliked them), should also contain some kind of overall impression<br />
<br />
'''Surroundings:''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Review by:''' * add your name here<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
If you want to review a campaign that was already reviewed, edit the old one, trying to make some kind of synthesis from yours and the original one. Add things that weren't mentioned. Leave both opinions to things originally described from one side, many elements have their good sides and odd sides (for example, usage of a custom era usually means unusual units, but awful graphics). Remove only outdated elements. Ratings should be averaged. Add your name to the original reviewer's name.<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
=== Antar, son of Rheor ===<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an unusual and very practical use on the battlefield. It is balanced quite well despite its incompletedness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream too. Unexpected end in the middle of campaign is a really unpleasant surprise too. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are like the existing ones)<br />
<br />
''Review by Dugi''<br />
<br />
=== Fate of a princess ===<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
''Review by Paulomat4''<br />
<br />
=== Invasion from the Unknown ===<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
''Review by Raijer''<br />
<br />
=== Swamplings ===<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
''Review by Dunno''<br />
<br />
=== Talentless Mage ===<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
''Review by Dunno''<br />
<br />
=== The Library of Kratemaqht ===<br />
<br />
'''Review:''' General: The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Review by:''' Wesbane<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
''Review by Dunno''<br />
<br />
== [http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Back to Guide to UMC Campaigns] ==</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51329Player UMC Reviews2013-06-06T06:04:17Z<p>Dugi: /* Antar, son of Rheor */</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns.<br />
It aims to provide all the information not only about the story, but also about completion, difficulty and playing style of the campaign.<br />
Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint ===<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Description:''' * a description of the important things in the add-on, like played faction, kind of enemies, gameplay style, difficulty, etc; should not be copying the author's description or contain too many spoilers<br />
<br />
'''Summary:''' * a ''subjective'' description of the things you liked and disliked about the add-on (and why you liked or disliked them), should also contain some kind of overall impression<br />
<br />
'''Surroundings:''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Review by:''' * add your name here<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
If you want to review a campaign that was already reviewed, edit the old one, trying to make some kind of synthesis from yours and the original one. Add things that weren't mentioned. Leave both opinions to things originally described from one side, many elements have their good sides and odd sides (for example, usage of a custom era usually means unusual units, but awful graphics). Remove only outdated elements. Ratings should be averaged. Add your name to the original reviewer's name.<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
=== Antar, son of Rheor ===<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an interesting use on the battlefield. It is balanced quite well despite its incompletedness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream too. Unexpected end in the middle of campaign is a really unpleasant surprise too. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are like the existing ones)<br />
<br />
''Review by Dugi''<br />
<br />
=== Fate of a princess ===<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
''Review by Paulomat4''<br />
<br />
=== Invasion from the Unknown ===<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
''Review by Raijer''<br />
<br />
=== Swamplings ===<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
''Review by Dunno''<br />
<br />
=== Talentless Mage ===<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
''Review by Dunno''<br />
<br />
=== The Library of Kratemaqht ===<br />
<br />
'''Review:''' General: The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Review by:''' Wesbane<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
''Review by Dunno''<br />
<br />
== [http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Back to Guide to UMC Campaigns] ==</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51328Player UMC Reviews2013-06-06T06:03:28Z<p>Dugi: Added a review of ASoR</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns.<br />
It aims to provide all the information not only about the story, but also about completion, difficulty and playing style of the campaign.<br />
Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint ===<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Description:''' * a description of the important things in the add-on, like played faction, kind of enemies, gameplay style, difficulty, etc; should not be copying the author's description or contain too many spoilers<br />
<br />
'''Summary:''' * a ''subjective'' description of the things you liked and disliked about the add-on (and why you liked or disliked them), should also contain some kind of overall impression<br />
<br />
'''Surroundings:''' * add your rating of the visual part of the add-on here (1-10)<br />
<br />
'''Design:''' * add your rating of the general quality of scenarios here (1-10)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Review by:''' * add your name here<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
If you want to review a campaign that was already reviewed, edit the old one, trying to make some kind of synthesis from yours and the original one. Add things that weren't mentioned. Leave both opinions to things originally described from one side, many elements have their good sides and odd sides (for example, usage of a custom era usually means unusual units, but awful graphics). Remove only outdated elements. Ratings should be averaged. Add your name to the original reviewer's name.<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
=== Antar, son of Rheor ===<br />
'''Tags:''' loyalists, skirmish, dungeon<br />
<br />
'''Description:''' A noble's property is attacked by undead, and he has to retaliate in order to stop the undead peril. In his journey, he passes through many other settlements, some of them are attacked by the undead too, some are just naturally hostile, some are corrupted by the promise of immortality the undeath brings and send undead legions to fight him. All of them seem to be just minions of a stronger force, but before he is reached, the end of completed part is here. 9 out of intended 17 scenarios complete.<br />
<br />
'''Summary:''' The scenarios are designed very well, assuring that you will not get bored. Many events take place in the middles of scenarios, making scenarios less usual and different from others. Although this is a nice feature, you are frequently surprised by many elements you cannot expect and it breaks planning. There are a few special units, who have special AMLA or some special abilities, that have an interesting use on the battlefield. It is balanced quite well despite its incompletedness. The story didn't impress me, though. It is very usual, a group of loyalists going to stop a rise of a lich lord whose dreams of conquest are a endangering anyone is classic. Do not expect anything from minor events neither, the encounters in scenarios are pretty mainstream too. Unexpected end in the middle of campaign is a really unpleasant surprise too. For short, it is a campaign strongly focusing on interesting gameplay, but if you seek challenges or a deeper plot, this is not what you want.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 6<br />
<br />
'''Fun:''' 7<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 8 (if I forget the missing end, and assume that these scenarios are similar to the previous ones)<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Fate of a princess ===<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Summary:''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consists of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
''Review by Paulomat4''<br />
<br />
=== Invasion from the Unknown ===<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
''Review by Raijer''<br />
<br />
=== Swamplings ===<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
''Review by Dunno''<br />
<br />
=== Talentless Mage ===<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
''Review by Dunno''<br />
<br />
=== The Library of Kratemaqht ===<br />
<br />
'''Review:''' General: The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Review by:''' Wesbane<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
'''Description:''' This campaign tells about Mehir, a Summoner, who's working on a great quest of making the biggest magical circle ever made. If he and other summoners succeed, activating the circle will bring them to the Abyss, the lands unknown.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
''Review by Dunno''<br />
<br />
== [http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Back to Guide to UMC Campaigns] ==</div>Dugihttps://wiki.wesnoth.org/index.php?title=Player_UMC_Reviews&diff=51303Player UMC Reviews2013-06-04T06:00:28Z<p>Dugi: Typo in add-on's name</p>
<hr />
<div>''This is a place where you can add your reviews for the current (1.10.x/1.11.x) UMC campaigns.<br />
It aims to provide all the information not only about the story, but also about completion, difficulty and playing style of the campaign.<br />
Please edit, it is a wiki.''<br />
<br />
<br />
<br />
<br />
<br />
<br />
=== Blueprint ===<br />
<br />
'''Tags:''' * describe the add-on using a few keywords<br />
<br />
'''Description:''' * a description of the important things in the add-on, like played faction, kind of enemies, gameplay style, difficulty, etc; should not be copying the author's description or contain too many spoilers<br />
<br />
'''Summary:''' * a ''subjective'' description of the things you liked and disliked about the add-on (and why you liked or disliked them), should also contain some kind of overall impression<br />
<br />
'''Surroundings:''' * add your rating here (1-10) (FIXME: rating of the visual part of the add-on?)<br />
<br />
'''Design:''' * add your rating here (1-10) (FIXME: rating of the general quality of scenarios?)<br />
<br />
'''Story:''' * add your rating of the story's quality here (1-10)<br />
<br />
'''Fun:''' * add your rating how much enjoyment did this add-on bring to you here (1-10)<br />
<br />
'''Replay value:''' * add your rating about your tendency to play this add-on again here (1-10)<br />
<br />
'''Player note:''' * add your overall rating here (1-10)<br />
<br />
'''Review by:''' * add your name here<br />
<br />
'''Link to review:''' * if you copied the review from the forums then add the related link here<br />
<br />
If you want to review a campaign that was already reviewed, edit the old one, trying to make some kind of synthesis from yours and the original one. Add things that weren't mentioned. Leave both opinions to things originally described from one side, many elements have their good sides and odd sides (for example, usage of a custom era usually means unusual units, but awful graphics). Remove only outdated elements. Ratings should be averaged. Add your name to the original reviewer's name.<br />
<br />
== Battle for Wesnoth UMC campaign / reviews ==<br />
<br />
''Reviews for Campaigns available in the 1.10.x stable and 1.11.x development versions.''<br />
<br />
=== Fate of a princess ===<br />
'''Tags:''' elves, rogues, riders, skirmish, dungeon, RPG<br />
<br />
Part I: Baldres, a notorious robber baron, flees Wesnoth with his followers and sets off into the northlands to evade the kings justice. The barons deeds and misdeeds are to change the balance of power between orcs and non-orcs throughout the northlands, and will carry consequences long after his eventual death.<br />
Part II: The Greenwood elves face a crisis which demands the return of the queen's estranged half-elven half-sister, Baldreds daughter. Two brave young elves must make a perilous journey to find her and bring her back to her former home. If they fail, the whole northlands will be engulfed in war with the resurgent orcs...<br />
<br />
'''Sumary''' Nice story, which is composed of two parts. In the first part you mainly fight with bandit knights, and often have to rush from one point to another. in the second part, gameplay consistts of elves, and various other races like drakes or saurians or dwarves. You will fight various races in the first part, and mostly orcs in the second. The campaign feature many custom units, and some your heroes will even have AMLA advancements. Also you will be able to collect many items through the campaign, which may cause some units to be overpowered but this is also bound to storyline reasons. The story reveals a lot about the northlands and their different factions.<br />
<br />
'''Surroundings:''' 8<br />
<br />
'''Design:''' 9<br />
<br />
'''Story:''' 7<br />
<br />
'''Fun:''' 9<br />
<br />
'''Replay value:''' 8<br />
<br />
'''Player Note:''' 8<br />
<br />
''Review by Paulomat4''<br />
<br />
=== Invasion from the Unknown ===<br />
'''Tags:''' elves, undead, skirmish, dungeon, puzzle<br />
<br />
'''Description:''' Starting with usual elves in forests and deserts, quickly adding the undead faction in a battle against several custom factions, evil human army, mysterious Verlissh, sinister demons, robotic automatons and dreadful, biomechanic Shaxtrals, that progresses through caves and steppes into the mysterious Dark Hive, where the Shadow Master dwells. 30 scenarios. Complete.<br />
<br />
'''Summary:''' This campaign has a good and interesting story, enough long to develop an army of recalls an use it well. You will encounter many new kinds of enemies, assuring that you will never get bored, even if you aren't a fan of the default era. Its gameplay is unique in many ways, frequently, the enemies are just coming, and you have to pass through the area instead of defeating some leader. Another speciality are boss fights, when you can defeat a boss only using some special technique. The campaign is also balanced pretty well, easy difficulty is to enjoy the story, hard difficulty is really challenging.<br />
However, almost all new units lack animations of any kind, that harms the visual part of this add-on. Also, some elements of the storyline are too exaggerated. But these little problems will not spoil anything.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 10<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
'''Replay value:''' 7<br />
<br />
'''Player Note:''' 10<br />
<br />
''Review by Dugi''<br />
<br />
<br />
=== Legend of the Invincibles ===<br />
<br />
'''Description''': A huge campaign that will be 10 chapters long (9 chapters currently), and will have more than 200 scenarios. This campaign follows 2 heroes that find a way to eternal life, going through times, before and after the Fall, and witnessing some of the most important events in Wesnoth's history, like the raise of the second sun.<br />
<br />
The player will be able to use humans, elves, but also undead and some special units, and will fight against basically anything you can imagine, going from orcs to demons and passing by some robots. It includes an item system, with enemy drops, crafting and gears, giving additions to units' normal attacks. The history permits to get a huge recall list, with level 4 units in the main races used and new AMLAs possibilities.<br />
<br />
'''Summary''': This campaign has a really long story, which explains some of Wesnoth's history that wasn't talked much about in other campaigns. Despite its length, it actually never gets boring because the story is well-done, stays really coherent, but also because of the scenarios' diversity, having huge battles but also some dungeons, and special objectives. I really like how this campaign makes a mix of Wesnoth's turn-based system and the basic RPG's system, like spells, items, crafting and more… But also because it creates new strategies that can't be found in normal campaigns, thanks to the item system and AMLAs that weren't really used in other campaigns, while keeping Wesnoth's basic way of playing. The difficulty is pretty much standard, as easy being easy for everyone, and hard being really hard and most likely a huge tactical challenge. Though some scenarios in normal can be seen as really easy or really hard.<br />
<br />
I'm really happy about this campaign because it permits to personalize your units depending on what you want them to be able to do with the AMLAs, but also with the huge item bank. I also liked the story, because i don't like how some part in Wesnoth's history are left unexplained, and this campaign goes through Irdya's history, filling some blanks. Finally, i would like to say that this campaign can be played again and again, as there are some secret scenarios, but also infinite possibilities with the items and AMLAs, which make each time completely different.<br />
<br />
The bad sides: the item inventory is slow (seems like it will be fixed), can be really annoying in the later parts. The leaders can seem overpowered to unacquainted players though it changes as you advance. The balance isn't complete yet, but it most likely will be done as soon as the story itself is finished. There still are some bugs around, but none that stops from playing as far as i know.<br />
And last, big problem: THERE'S ONLY 1 CHAPTER LEFT BEFORE THE STORY ENDS!<br />
<br />
'''Surroundings''': 7<br />
<br />
'''Design''': 7<br />
<br />
'''Story''': 10<br />
<br />
'''Fun''': 10<br />
<br />
'''Replay value''': 9<br />
<br />
'''Player note''': 10<br />
<br />
''Review by Raijer''<br />
<br />
=== Swamplings ===<br />
'''Description:''' Swamplings is the name of goblin tribe living in swamps, banished by orcs. In an unfortunate turn of events, those goblins get tangled up in human affairs and must fight for their very survival. The player also learns how goblins started riding wolves.<br />
<br />
'''Summary:''' It's a decent, finished and stable campaign with interesting plot. There are many humorous scenes and some serious ones, there are standard battle scenarios and various original missions. There are also some high quality custom sprites, and maps are very good as well. It won't make your jaw drop, however, it's just a modest, enjoyable campaign.<br />
<br />
'''Surroundings:''' 7<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 8<br />
<br />
'''Fun:''' 9<br />
<br />
''Review by Dunno''<br />
<br />
=== Talentless Mage ===<br />
'''Description:''' A humorous story about a mage who managed to learn only one spell in his life and who takes command of N.O.O.B.S. (Noticeably - Optimal - Outstanding - Brilliant - Soldiers) squad. N.O.O.B.S. advance through amla with basic options like melee attack, melee damage etc. <br />
<br />
'''Summary:''' this here is Wesnoth parody at its best. The campaign mocks the common cliches in Wesnoth campaigns and overused events, like loyal units coming out of villages, random magical items scattered around the map and low quality frankensprites. Very absurd and pythonesque at times, you will keep smiling and laughing through the whole story.<br />
<br />
'''Surroundings:''' 6<br />
<br />
'''Design:''' 8<br />
<br />
'''Story:''' 9<br />
<br />
'''Fun:''' 10<br />
<br />
''Review by Dunno''<br />
<br />
=== The Library of Kratemaqht ===<br />
<br />
'''Review:''' General: The campaign is about genesis, course and outcome of civil war in empire of Anaktoron.<br />
Surroundings:<br />
The way campaign looks. How it feels and uses game engine is simply amazing and unseen before.<br />
Maps are nicely done although many parts of a map serve for story (decorative) purpose only what is not always good. You will travel through wealthy and populous kingdom which is torn apart by war. To create this impression in most of maps there is a lot of villages and they are placed in large groups, but map look doesn't suffer from it. More over you can feel destruction in game world as never before. Campaign features custom burning houses which are not only mere visual effect but have impact on battle course.<br />
It is one of most cinematic campaigns if not the most. Cutscenes are packed with action and take place in several locations. Also game transition fluently into cutscene and cutscene into game. What makes it even more interesting since you will never know is it just a cutscene?<br />
In terms of visual effects it also features the best epilogue ever.<br />
As it was not enough you can experience a true wesnoth dragon. It is so unusual that it need separate mention.<br />
Dragon is fully animated and have some nice custom sounds. Some of it animations are purely character play. Like roar and feasting. And last, but not least it preserves original wesnoth dragon concepts. It attacks with fangs and tail. Although it primary weapon is ranged magical fire breath which works as AoE attack when used offensively. There is one little bug with its animation, but it can't be noticed during playing it anyway.<br />
In short this campaign surely establish new standards for wesnoth in department of visuals.<br />
Design:<br />
Scenarios design is good. All levels are playable. Objectives are clearly formed, so it is known most of the time what to do. There are several minor bugs and one bigger that affects game to some degree. However they do not make impossible to play and enjoy campaign.<br />
Campaign is using default units although sometimes with unusual traits and abilities. Custom units are also present, but only as much as they are needed. Which is a great thing since it proves designer skill at using available resources. Beside that I really can't stand campaigns introducing many user made units.<br />
I liked much idea of premagic era and weakened magic users. Unfortunately any extra mages aren't useful since you have already better characters of this class. In fact after my recall list was cleaned up after Jevyans Return I never bothered to recruit them again.<br />
Gold carryover system is custom which is not a good choice for classic style adventure. Twenty percent instead of forty. Most probably this is caused by slightly overpopulated maps. Campaign is very easy, except two scenarios: Refugees and Loyalty's Cruel Reward. There is no moderately difficult scenarios. The huge difference between average level difficulty and hardest level is just to big. Most difficult scenarios are Refugees and Loyaltys Cruel Reward.<br />
Story:<br />
Amount of delivered information is enough. Writing style is good. Beginning is terrific. Switching between protagonists is cool, and quite innovative idea. Overall concept is nicely executed and creator skillfully merged a lot of facts from mainline into own story. To fully appreciate this playing The Rise of Wesnoth is recommended. However ending I found disappointing. It seemed rushed and unconvincing. Also few details don't match to reality of Irdya.<br />
Fun:<br />
Campaign is definitely entertaining. Well done battles. Good dialog. And full of fresh ideas. You can play as good and bad in a single campaign! Although I have nothing against being awesome most of the time enemies fell way to easily to my taste.<br />
Replay value:<br />
Campaign is nicely done and straight forward. Although there is nothing that would reject you from playing it again, there is nothing that would encourage you to do that either. No hidden secrets, no tactical challenges, no extra levels. No satisfying ending.<br />
<br />
Summary:<br />
Overall it is well made, really great, easy campaign suitable for beginners with story explaining some events from The Rise of Wesnoth. Bringing new standards in design, especially visual ones. It story is shown from several angles what is unique feature, but unfortunately potential of this solution wasn't used at all. If you are looking for deep plot, and tactical challenge you won't find it here.<br />
<br />
'''Surroundings: 10<br />
<br />
'''Design: 6<br />
<br />
'''Story: 7<br />
<br />
'''Fun: 7<br />
<br />
'''Replay value: 5<br />
<br />
'''Campaign score: 7<br />
<br />
'''Player note: 8<br />
<br />
'''Review by:''' Wesbane<br />
<br />
'''Link to review:''' [http://forums.wesnoth.org/viewtopic.php?f=8&t=37798&start=45#p551674]<br />
<br />
<br />
=== To Lands Unknown ===<br />
'''Description:''' ''taken from the campaign file'' <br />
<br />
Hearken ye,<br />
<br />
You strangers in a desolate land<br />
<br />
To this tale of lands most old,<br />
<br />
of the Summoners of Al-Kamija,<br />
<br />
Those mighty magi<br />
<br />
Of powers untold,<br />
<br />
Their Abysmal servants<br />
<br />
Both good and bad,<br />
<br />
And of Mehir, who had,<br />
<br />
As once foretold,<br />
<br />
saved all life in this world.''<br />
<br />
This is the story of Mehir, the Summoner, and his journey to lands unknown. Intermediate level, 20 scenarios.<br />
<br />
'''Summary:''' The main idea behind this campaign and the Era of Magic (used by To Lands Unknown) is to take Wesnoth graphics to an entirely new level. Maps are no longer simple, repetitive hexes, instead many maps are absolutely mindblowing landscapes. In addition, all units are well made and animated. The story and gameplay, however, could have been done better. The campaign is quite long, and at times battles get boring.<br />
<br />
'''Surroundings:''' 10<br />
<br />
'''Design:''' 7<br />
<br />
'''Story:''' 5<br />
<br />
'''Fun:''' 6<br />
<br />
''Review by Dunno''<br />
<br />
<br />
<br />
<br />
<br />
<br />
== [http://wiki.wesnoth.org/index.php?title=Guide_to_UMC_Campaigns Back to Guide to UMC Campaigns] ==</div>Dugi