Merge branch 'master' of github.com:wesnoth/wesnoth-old

This commit is contained in:
Alexander van Gessel 2013-10-06 02:26:36 +02:00
commit e10ef1d98d
621 changed files with 553 additions and 159175 deletions

View file

@ -14,6 +14,10 @@ The release team should empty this file after each release.
CHANGES
=======
[section="AI configuration fixes"]
AI configuration with the [wiki=AiWML#The_.5Bai.5D_Tag:_Defining_Aspects]time_of_day aspect[/wiki] has been fixed in this release to compare with the current ToD's id instead of its user-visible name (e.g. "morning" vs. "Morning") from the [wiki=TimeWML][time] tag[/wiki]. Since the previous behavior was incorrect and mainline campaigns used ToD ids with it, this effectively fixes AI configuration for all of them. Authors of user-made campaigns and scenarios who were making use of this feature are strongly advised to playtest their scenarios with this version again to check for potential side-effects on gameplay balance.
[/section]
[section="Add-ons Manager improvements"]
In this release, new sorting options have been added to the Add-ons Manager dialog to improve its usefulness. The new options allow to change the neutral sorting criterion between [i]By name[/i] (which continues to be the default), [i]By last updated[/i], and [i]By first upload[/i] (former default in all versions prior to 1.11.0); additionally, it is possible to switch between ascending and descending order. Due to UI framework limitations, these options only take effect when no column has been marked for sorting in the add-ons list.
[/section]
@ -26,6 +30,10 @@ Syntax errors in .pbl files are now reported properly in the user interface inst
Finally, some color key disparities between the Add-ons Manager view and the Description box (which were unintentionally using different shades of orange and green) have been fixed.
[/section]
[section="Game Paths dialog"]
A new informational dialog has been added to the General section in Preferences to display the various resource and configuration paths used by the game. From there, the user can copy individual paths to clipboard or launch the file browser on them (currently only tested with Windows, Linux, and Mac OS X).
[/section]
[section="Better support for multiplayer campaigns"]
A support for CampaignWML has been added for multiplayer, thus allowing to use the same campaign in both multiplayer and singleplayer. As a result of this, difficulty levels and other features of singleplayer campaigns are supported in multiplayer as well. User interface has been improved to act better upon these changes and now it supports different types of level selection and difficulties dialog for campaigns.
@ -40,6 +48,14 @@ Finally, Legend of Wesmere campaign has been made available to play in multiplay
Due to changes to server protocol, multiplayer campaigns might not work correctly for older client versions when connecting to a server in this release.
[/section]
[section="New Recruitment Engine for the AI"]
The default recruitment candidate action (CA) was refactored completely. It is now much more configurable for scenario editors and hopefully does a better job than the old recruitment engine. Some aspects got deprecated ('recruitment', 'recruitment_ignore_bad_combat'), some aspects are new. Also, multiple leader recruitment by the AI is now supported. See [url]http://wiki.wesnoth.org/AI_Recruitment[/url] for more details.
In addition to the modified default recruitment, it is now also possible to choose the AI 'Strong AI (RCA)' in MP games (note that this only affects recruitment at this time). It uses the same recruitment CA as the default, but with different parameters. It might perform slightly better than the default in certain circumstances, but recruits more units of the same type (and might therefore be less fun to play against).
[b]As a result of the recruitment changes, some scenarios may have become somewhat unbalanced. Feedback about how the new recruitment engine affects the gameplay in scenarios is needed.[/b]
[/section]
==========
KNOWN BUGS
==========

View file

@ -27,6 +27,11 @@ Version 1.11.6+dev:
* New Recruitment CA located in src/ai/recruitment is now default CA
* Created new AI cfg "Strong AI (RCA)" with stronger recruitment
* Created new AI cfg "Old Recruitment CA" in ai/dev/ to use the old CA
* Fixed time_of_day aspect so it matches time-of-day ids, not names
(e.g. "Morning" vs "morning"), so most use cases of ToD-dependent AI
configuration work again (suspected version 1.7.4 regression).
* Move_Leader_To_Keep CA will now move all leaders back to a keep
(multiple leader support for recruitment).
* Campaigns:
* Legend of Wesmere:
* Removed now redundant MP code.

View file

@ -106,8 +106,8 @@
name=standard_aspect
[value]
active=2
begin=1.1
end=0.9
begin=1.5
end=1.1
spend_all_gold=-1
[/value]
[/default]

View file

@ -1,43 +1,43 @@
border_size=1
usage=map
Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Hh , Hh , Hh , Hh , Mm , Mm , Mm , Hh , Hh , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Re^Fp , Re^Fp , Re^Fp
Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Mm , Hh , Hh , Hh , Hh , Mm , Mm , Mm , Hh , Hh , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Re^Fp , Re^Fp , Re^Fp
Mm , Mm , Mm , Mm , Mm , Mm , Hh , Mm , Mm , Mm , Hh , Hh , Hh , Hh , Hh , Hh , Hh , Hh , Mm , Hh , Hh , Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gg , Re^Fp , Re^Fp , Re^Fp
Mm , Mm , Mm , Mm , Mm , Mm , Mm , Hh , Hh , Mm , Mm , Hh , Hh , Hh , Gg , Co , Co , Hh , Hh , Hh , Hh , Gg , Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gg^Vo , Gg , Re^Fp , Re^Fp
Mm , Mm , Mm , Hh , Mm , Mm , Mm , Hh , Hh , Hh , Hh , Hh , Hh , Gg , Co , 1 Ko , Co , Gg , Hh , Hh , Gg , Gg , Re^Fp , Re^Fp , Gg , Rb^Gvs , Gg , Gg , Gg , Gg , Re^Fp , Re^Fp
Mm , Mm , Mm , Mm , Hh , Mm , Mm , Hh , Hh , Hh , Hh , Mm , Mm , Hh , Hh , Co , Co , Gg , Gg , Hh , Hh , Gg , Re^Fp , Re^Fp , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg
Mm , Mm , Hh , Hh , Hh , Mm , Hh , Hh , Hh , Hh , Hh , Hh , Mm , Hh , Hh , Gg , Gg , Gg , Gs^Vo , Hh , Gg , Gg , Re^Fp , Re^Fp , Gg , Gg , Gg , Gg , Gg , Gg , Re^Fp , Re^Fp
Mm , Mm , Mm , Hh , Hh , Hh , Hh , Hh , Hh , Hh , Gg , Gg , Hh , Mm , Hh , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Re^Fp , Re^Fp , Gg , Gg , Gg , Gg , Gg , Gg , Gg
Mm , Mm , Hh , Hh , Hh , Hh , Hh , Hh , Gg , Hh , Gg , Hh , Hh , Hh , Hh , Hh , Gg , Gg , Rb^Gvs , Gg , Rb^Gvs , Gg , Gg , Re^Fp , Gg , Gg , Gg , Gg , Rb^Gvs , Gg , Re^Fp , Re^Fp
Mm , Mm , Mm , Hh , Hh , Hh , Gs^Vo , Hh , Gg , Hh^Fp , Re^Fp , Gg , Gg , Gg , Gs^Vo , Hh , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gg , Gg , Re^Fp , Gg , Gg , Rb^Gvs , Rb^Gvs , Gg , Gg , Gg
Mm , Mm , Mm , Hh , Hh , Hh , Hh , Gg , Gg , Re^Fp , Re^Fp , Re^Fp , Gg , Gg , Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gg , Gg , Gg , Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gg , Gg
Mm , Mm , Mm , Hh , Hh , Hh , Hh , Hh , Hh , Hh^Fp , Hh^Fp , Re^Fp , Re^Fp , Gg , Gg , Gg , Gg , Rb^Gvs , Gg , Rb^Gvs , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg
Mm , Mm , Mm , Mm , Mm , Hh , Hh , Hh , Hh , Gg , Gg , Re^Fp , Re^Fp , Gg , Gg , Gg , Gg , Gs^Vo , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Rb , Rb
Mm , Mm , Mm , Mm , Mm , Hh , Hh , Hh , Rb , Hh , Gg , Gg , Re^Fp , Re^Fp , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Rb^Gvs , Gg , Gg , Gg , Gg , Gg , Rb , Rb
Mm , Mm , Mm , Mm , Mm , Hh , Hh , Rb , Hh , Hh , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gg , Re^Fp , Gg , Rb , Rb^Gvs , Rb^Gvs
Mm , Mm , Mm , Mm , Hh , Hh , Hh , Rb , Hh , Hh , Hh , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gs^Vo , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Re^Fp , Re^Fp , Gg , Rb , Rb^Gvs , Rb^Gvs
Mm , Mm , Mm , Hh , Hh , Hh , Gg , Rb , Rb , Rb , Hh , Gg , Gg , Gg , Gs^Vo , Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Ko , Rb^Gvs , Re^Fp , Re^Fp , Re^Fp , Gg , Rb , Gg , Rb^Gvs , Rb^Gvs
Mm , Mm , Mm , Hh , Hh , Hh , Rb^Gvs , Gg , Rb^Gvs , Gg , Rb , Gg , Gg , Gg , Gg , Gg , Gg , Ww , Ww , Ww , Ww , Rb^Gvs , Co , Co , Rb^Gvs , Re^Fp , Re^Fp , Gg , Rb , Gg , Gs^Fp , Gs^Fp
Mm , Mm , Hh , Hh , Hh , Hh , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gg , Rb , Gs^Vo , Gg , Gg , Gg , Ww , Ww , Wo , Wo , Wo , Ww , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb , Rb , Gg , Gs^Fp , Gs^Fp , Gs^Fp
Mm , Mm , Mm , Hh , Hh , Hh , Hh , Rb^Gvs , Gg , Gg , Rb , Rb , Gg , Rb^Gvs , Rb^Gvs , Ww , Wo , Wo , Wo , Wo , Wo , Ww , Rb^Gvs , Rb^Gvs , Rb , Rb , Rb , Rb , Gg , Gs^Fp , Gs^Fp , Gs^Fp
Mm , Mm , Hh , Hh , Hh , Hh , Hh , Gg , Gg , Rb , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Ww , Wo , Wo , Wo , Ww , Ww , Gg , Rb^Gvs , Rb^Gvs , Rb , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp
Mm , Mm , Mm , Hh , Hh , Gg , Gg , Hh , Gg , Gg , Rb , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gg , Ww , Wo , Wo , Wo , Wo , Ww , Ww , Gg , Rb^Gvs , Rb^Gvs , Rb , Gg , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp
Mm , Mm , Hh , Hh , Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Gg , Rb , Gg , Gg , Gg , Ww , Wo , Wo , Wo , Wo , Wo , Ww , Gg , Gg , Gg , Rb , Rb , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp
Mm , Mm , Hh , Hh , Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb , Rb , Gg , Gs^Fp , Gs^Fp , Ww , Wo , Wo , Wo , Wo , Wo , Ww , Gg , Rb , Rb , Rb , Rb , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp
Mm , Mm , Hh , Hh , Gg , Gs^Vo , Gg , Rb^Gvs , Rb , Rb , Gg , Gg , Gg , Ww , Wo , Wo , Ww , Ww , Ww , Ww , Gg , Gg , Gg , Gg , Rb , Rb , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp
Hh , Hh , Hh , Hh , Gg , Gg , Gg , Gg , Gs^Fp , Gg , Gg , Gg , Gg , Ww , Wo , Wo , Ww , Gg , Gg^Vo , Gg , Gg , Gg , Gg , Gg , Gg , Rb , Rb , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp
Hh , Hh , Hh , Gg , Gg , Rb^Gvs , Gg , Gs^Fp , Gs^Fp , Gg , Gg , Gg , Gg , Ww , Wo , Ww , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Rb , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp
Hh , Hh , Gg , Gg , Rb^Gvs , Rb^Gvs , Gg , Gs^Fp , Gg , Gg , Ww , Ww , Ww^Bw| , Ww , Ww , Ww , Gg , Gg , Gg , Gg , Re^Gvs , Gg , Re^Gvs , Gg , Gg , Gs^Vo , Re , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp
Gg , Gg , Gg , Rb^Gvs , Rb^Gvs , Rb^Gvs , Rb^Gvs , Gg , Ww , Ww , Ww , Co , Gg , Co , Gg , Gg , Gg , Gg , Re^Gvs , Re^Gvs , Re^Gvs , Re^Gvs , Re^Gvs , Gg , Gg , Gg , Re , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp
Hh^Fp , Hh^Fp , Gg , Gg , Gg , Rb^Gvs , Gg , Gg , Ww , Gg , Gg , Gg , Re , Gg , Gg , Gs^Fp , Gg , Gg , Gg , Gg , Re^Gvs , Re^Gvs , Gg , Gg , Gg , Gg , Gg , Re , Re^Gvs , Re^Gvs , Gs^Fp , Gs^Fp
Hh , Hh^Fp , Hh^Fp , Gs^Fp , Gs^Fp , Gg , Gg , Ww , Gg , Gg , Gg , Re^Gvs , Gg , Re , Gg , Gs^Fp , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Re , Gg , Gg , Re^Gvs , Gs^Fp , Gs^Fp
Hh , Hh , Hh , Gs^Fp , Gs^Vo , Gg , Gg , Ww , Co , Gg , Rb , Rb^Gvs , Gg , Gg , Gg , Gs^Fp , Gs^Fp , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Re , Gg , Gg , Gg , Gg
Hh , Hh , Hh , Gg , Gg , Gg , Gg , Gg , Ww^Bw/ , Rb , Gg , Gg , Gg , Re , Gg , Gs^Fp , Gg , Gg , Gg , Gg , Gg , Gg , Re^Gvs , Gg , Gg , Gg , Gg , Re , Gg , Gg , Gg , Gg
Hh , Hh , Hh , Hh , Gg , Rb^Gvs , Rb^Gvs , Rb , Ww , Co , Gg , Gg , Gg , Re , Gg , Gg , Gs^Fp , Gg , Gg , Gg , Gg , Re^Gvs , Gg , Gs^Vo , Gg , Gg , Gg , Gs^Vo , Re , Gg , Gs , Gg
Hh , Hh , Hh , Gg , Rb , Rb , Rb^Gvs , Rb^Gvs , Ww , Gg , Gs^Vo , Gg , Re^Gvs , Re^Gvs , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Re^Gvs , Re^Gvs , Gs , Re , Re , Gs , Gg
Hh , Hh , Hh , Gg , Rb , Rb^Gvs , Rb^Gvs , Rb^Gvs , Ww , Gg , Gg , Re^Gvs , Re^Gvs , Re^Gvs , Re^Gvs , Gg , Gs^Vo , Gg , Gg , Gg , Gg , Gg , Gs^Fp , Gs^Fp , Gg , Re^Gvs , Re^Gvs , Re^Gvs , Gs , Re , Re , Re
Hh , Hh , Gg , Gg , Gg , Gg , Ww , Ww , Gg , Gg , Gg , Re^Gvs , Re^Gvs , Re^Gvs , Re^Gvs , Gg , Gg , Gg , Gg , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp , Gg , Re^Gvs , Gs , Gs , Gs , Gs , Re , Re
Hh , Hh , Hh , Gg , Gg , Ww , Ww , Ww , Gg , Gg , Re^Gvs , Re^Gvs , Re^Gvs , Re^Gvs , Re^Gvs , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs , Gs , Ce , Ce , Ce
Hh , Hh , Hh , Gg , Ww , Ww , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs , 2 Ke , Ce , Ce
Hh , Hh , Hh , Gg , Ww , Ww , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gg , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs^Fp , Gs , Ce , Ce , Ce
Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Hh, Hh, Hh, Hh, Mm, Mm, Mm, Hh, Hh, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Re^Fp, Re^Fp, Re^Fp
Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Mm, Hh, Hh, Hh, Hh, Mm, Mm, Mm, Hh, Hh, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Re^Fp, Re^Fp, Re^Fp
Mm, Mm, Mm, Mm, Mm, Mm, Hh, Mm, Mm, Mm, Hh, Hh, Hh, Hh, Hh, Hh, Hh, Hh, Mm, Hh, Hh, Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gg, Re^Fp, Re^Fp, Re^Fp
Mm, Mm, Mm, Mm, Mm, Mm, Mm, Hh, Hh, Mm, Mm, Hh, Hh, Hh, Gg, Co, Co, Hh, Hh, Hh, Hh, Gg, Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gg, Gg, Re^Fp, Re^Fp
Mm, Mm, Mm, Hh, Mm, Mm, Mm, Hh, Hh, Hh, Hh, Hh, Hh, Gg, Co, 1 Ko, Co, Gg, Hh, Hh, Gg, Gg, Re^Fp, Re^Fp, Gg, Rb^Gvs, Gg, Gg, Gg, Gg, Re^Fp, Re^Fp
Mm, Mm, Mm, Mm, Hh, Mm, Mm, Hh, Hh, Hh, Hh, Mm, Mm, Hh, Hh, Co, Co, Gg, Gg, Hh, Hh, Gg, Re^Fp, Re^Fp, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg
Mm, Mm, Hh, Hh, Hh, Mm, Hh, Hh, Hh, Hh, Hh, Hh, Mm, Hh, Hh, Gg, Gg, Gg, Gs^Vo, Hh, Gg, Gg, Re^Fp, Re^Fp, Gg, Gg, Gg, Gg, Gg, Gg, Re^Fp, Re^Fp
Mm, Mm, Mm, Hh, Hh, Hh, Hh, Hh, Hh, Hh, Gg, Gg, Hh, Mm, Hh, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Re^Fp, Re^Fp, Gg, Gg, Gg, Gg, Gg, Gg, Gg
Mm, Mm, Hh, Hh, Hh, Hh, Hh, Hh, Gg, Hh, Gg, Hh, Hh, Hh, Hh, Hh, Gg, Gg, Rb^Gvs, Gg, Rb^Gvs, Gg, Gg, Re^Fp, Gg, Gg, Gg, Gg, Rb^Gvs, Gg, Re^Fp, Re^Fp
Mm, Mm, Mm, Hh, Hh, Hh, Gg, Hh, Gg, Hh^Fp, Re^Fp, Gg, Gg, Gg, Gs^Vo, Hh, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gg, Gg, Re^Fp, Gg, Gg, Rb^Gvs, Rb^Gvs, Gg, Gg, Gg
Mm, Mm, Mm, Hh, Hh, Hh, Hh, Gg, Gg, Re^Fp, Re^Fp, Re^Fp, Gg, Gg, Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gg, Gg, Gg, Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gg, Gg
Mm, Mm, Mm, Hh, Hh, Hh, Hh, Hh, Hh, Hh^Fp, Hh^Fp, Re^Fp, Re^Fp, Gg, Gg, Gg, Gg, Rb^Gvs, Gg, Rb^Gvs, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg
Mm, Mm, Mm, Mm, Mm, Hh, Hh, Hh, Hh, Gg, Gg, Re^Fp, Re^Fp, Gg, Gg, Gg, Gg, Gs^Vo, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Rb, Rb
Mm, Mm, Mm, Mm, Mm, Hh, Hh, Hh, Rb, Hh, Gg, Gg, Re^Fp, Re^Fp, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Rb^Gvs, Gg, Gg, Gg, Gg, Gg, Rb, Rb
Mm, Mm, Mm, Mm, Mm, Hh, Hh, Rb, Hh, Hh, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gg, Re^Fp, Gg, Rb, Rb^Gvs, Rb^Gvs
Mm, Mm, Mm, Mm, Hh, Hh, Hh, Rb, Hh, Hh, Hh, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gs^Vo, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Re^Fp, Re^Fp, Gg, Rb, Rb^Gvs, Rb^Gvs
Mm, Mm, Mm, Hh, Hh, Hh, Gg, Rb, Rb, Rb, Hh, Gg, Gg, Gg, Gs^Vo, Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Ko, Rb^Gvs, Re^Fp, Re^Fp, Re^Fp, Gg, Rb, Gg, Rb^Gvs, Rb^Gvs
Mm, Mm, Mm, Hh, Hh, Hh, Rb^Gvs, Gg, Rb^Gvs, Gg, Rb, Gg, Gg, Gg, Gg, Gg, Gg, Ww, Ww, Ww, Ww, Rb^Gvs, Co, Co, Rb^Gvs, Re^Fp, Re^Fp, Gg, Rb, Gg, Gs^Fp, Gs^Fp
Mm, Mm, Hh, Hh, Hh, Hh, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gg, Rb, Gs^Vo, Gg, Gg, Gg, Ww, Ww, Wo, Wo, Wo, Ww, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb, Rb, Gg, Gs^Fp, Gs^Fp, Gs^Fp
Mm, Mm, Mm, Hh, Hh, Hh, Hh, Rb^Gvs, Gg, Gg, Rb, Rb, Gg, Rb^Gvs, Rb^Gvs, Ww, Wo, Wo, Wo, Wo, Wo, Ww, Rb^Gvs, Rb^Gvs, Rb, Rb, Rb, Rb, Gg, Gs^Fp, Gs^Fp, Gs^Fp
Mm, Mm, Hh, Hh, Hh, Hh, Hh, Gg, Gg, Rb, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Ww, Wo, Wo, Wo, Ww, Ww, Gg, Rb^Gvs, Rb^Gvs, Rb, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp
Mm, Mm, Mm, Hh, Hh, Gg, Gg, Hh, Gg, Gg, Rb, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gg, Ww, Wo, Wo, Wo, Wo, Ww, Ww, Gg, Rb^Gvs, Rb^Gvs, Rb, Gg, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp
Mm, Mm, Hh, Hh, Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Gg, Rb, Gg, Gg, Gg, Ww, Wo, Wo, Wo, Wo, Wo, Ww, Gg, Gg, Gg, Rb, Rb, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp
Mm, Mm, Hh, Hh, Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb, Rb, Gg, Gs^Fp, Gs^Fp, Ww, Wo, Wo, Wo, Wo, Wo, Ww, Gg, Rb, Rb, Rb, Rb, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp
Mm, Mm, Hh, Hh, Gg, Gs^Vo, Gg, Rb^Gvs, Rb, Rb, Gg, Gg, Gg, Ww, Wo, Wo, Ww, Ww, Ww, Ww, Gg, Gg, Gg, Gg, Rb, Rb, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp
Hh, Hh, Hh, Hh, Gg, Gg, Gg, Gg, Gs^Fp, Gg, Gg, Gg, Gg, Ww, Wo, Wo, Ww, Gg, Gg^Vo, Gg, Gg, Gg, Gg, Gg, Gg, Rb, Rb, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp
Hh, Hh, Hh, Gg, Gg, Rb^Gvs, Gg, Gs^Fp, Gs^Fp, Gg, Gg, Gg, Gg, Ww, Wo, Ww, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Rb, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp
Hh, Hh, Gg, Gg, Rb^Gvs, Rb^Gvs, Gg, Gs^Fp, Gg, Gg, Ww, Ww, Ww^Bw|, Ww, Ww, Ww, Gg, Gg, Gg, Gg, Re^Gvs, Gg, Re^Gvs, Gg, Gg, Gs^Vo, Re, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp
Gg, Gg, Gg, Rb^Gvs, Rb^Gvs, Rb^Gvs, Rb^Gvs, Gg, Ww, Ww, Ww, Co, Gg, Co, Gg, Gg, Gg, Gg, Re^Gvs, Re^Gvs, Re^Gvs, Re^Gvs, Re^Gvs, Gg, Gg, Gg, Re, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp
Hh^Fp, Hh^Fp, Gg, Gg, Gg, Rb^Gvs, Gg, Gg, Ww, Gg, Gg, Gg, Re, Gg, Gg, Gs^Fp, Gg, Gg, Gg, Gg, Re^Gvs, Re^Gvs, Gg, Gg, Gg, Gg, Gg, Re, Re^Gvs, Re^Gvs, Gs^Fp, Gs^Fp
Hh, Hh^Fp, Hh^Fp, Gs^Fp, Gs^Fp, Gg, Gg, Ww, Gg, Gg, Gg, Re^Gvs, Gg, Re, Gg, Gs^Fp, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Re, Gg, Gg, Re^Gvs, Gs^Fp, Gs^Fp
Hh, Hh, Hh, Gs^Fp, Gs^Vo, Gg, Gg, Ww, Co, Gg, Rb, Rb^Gvs, Gg, Gg, Gg, Gs^Fp, Gs^Fp, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Re, Gg, Gg, Gg, Gg
Hh, Hh, Hh, Gg, Gg, Gg, Gg, Gg, Ww^Bw/, Rb, Gg, Gg, Gg, Re, Gg, Gs^Fp, Gg, Gg, Gg, Gg, Gg, Gg, Re^Gvs, Gg, Gg, Gg, Gg, Re, Gg, Gg, Gg, Gg
Hh, Hh, Hh, Hh, Gg, Rb^Gvs, Rb^Gvs, Rb, Ww, Co, Gg, Gg, Gg, Re, Gg, Gg, Gs^Fp, Gg, Gg, Gg, Gg, Re^Gvs, Gg, Gs^Vo, Gg, Gg, Gg, Gs^Vo, Re, Gg, Gs, Gg
Hh, Hh, Hh, Gg, Rb, Rb, Rb^Gvs, Rb^Gvs, Ww, Gg, Gs^Vo, Gg, Re^Gvs, Re^Gvs, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Re^Gvs, Re^Gvs, Gs, Re, Re, Gs, Gg
Hh, Hh, Hh, Gg, Rb, Rb^Gvs, Rb^Gvs, Rb^Gvs, Ww, Gg, Gg, Re^Gvs, Re^Gvs, Re^Gvs, Re^Gvs, Gg, Gs^Vo, Gg, Gg, Gg, Gg, Gg, Gs^Fp, Gs^Fp, Gg, Re^Gvs, Re^Gvs, Re^Gvs, Gs, Re, Re, Re
Hh, Hh, Gg, Gg, Gg, Gg, Ww, Ww, Gg, Gg, Gg, Re^Gvs, Re^Gvs, Re^Gvs, Re^Gvs, Gg, Gg, Gg, Gg, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp, Gg, Re^Gvs, Gs, Gs, Gs, Gs, Ce, Re
Hh, Hh, Hh, Gg, Gg, Ww, Ww, Ww, Gg, Gg, Re^Gvs, Re^Gvs, Re^Gvs, Re^Gvs, Re^Gvs, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs, Gs, Ce, Ce, Ce
Hh, Hh, Hh, Gg, Ww, Ww, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs, 2 Ke, Ce, Ce
Hh, Hh, Hh, Gg, Ww, Ww, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gg, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs^Fp, Gs, Ce, Ce, Ce

View file

@ -4,7 +4,7 @@
name= _ "End of Peace"
map_data="{campaigns/Son_Of_The_Black_Eye/maps/01_End_of_Peace.map}"
{TURNS 34 30 26}
{TURNS 28 24 22}
{DEFAULT_SCHEDULE}
@ -38,8 +38,6 @@
# Give Kapou'e the northern tier of villages near his keep.
{STARTING_VILLAGES 1 7}
{STARTING_VILLAGES_AREA 1 28 3 3}
{STARTING_VILLAGES_AREA 1 6 9 3}
[item]
x=17
@ -73,24 +71,17 @@
name= _ "Alber"
side=2
canrecruit=yes
#ifdef HARD
recruit=Cavalryman, Fencer, Spearman, Heavy Infantryman
#else
recruit=Cavalryman, Fencer, Spearman
#endif
facing=sw
recruit=Cavalryman, Fencer, Spearman
team_name=Humans
user_team_name=_ "Humans"
[ai]
recruitment_pattern=scout,fighter
[/ai]
#ifdef EASY
gold=100
#endif
#ifdef NORMAL
gold=150
#endif
{GOLD 140 180 260}
#ifdef HARD
gold=210
#endif
{FLAG_VARIANT loyalist}
[/side]
@ -160,7 +151,7 @@
[/message]
[role]
role=second
type=Orcish Warlord, Orcish Warrior, Goblin Knight, Goblin Pillager, Orcish Grunt, Orcish Archer, Wolf Rider
type=Orcish Warlord, Orcish Slurbow, Direwolf Rider, Orcish Warrior, Orcish Crossbowman, Goblin Knight, Goblin Pillager, Orcish Grunt, Orcish Archer, Wolf Rider
[/role]
[message]
@ -289,5 +280,5 @@
[/message]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{KAPOUE_DEATH}
[/scenario]

View file

@ -50,8 +50,6 @@
# Give Kapou'e the northern tier of villages near his keep.
{STARTING_VILLAGES 1 7}
{STARTING_VILLAGES_AREA 1 28 3 3}
{STARTING_VILLAGES_AREA 1 6 9 3}
[side]
type=General
@ -135,8 +133,10 @@
message= _ "They are too many and too tough. The few here dont stand a chance."
[/message]
# List types so that lowest-level unit gets picked first
[role]
role=Helper
type=Wolf Rider, Orcish Archer, Orcish Grunt, Orcish Warrior, Orcish Crossbowman, Goblin Knight, Goblin Pillager, Orcish Warlord, Orcish Slurbow, Direwolf Rider
side=1
[not]
id="Kapou'e,Vrag"
@ -144,6 +144,17 @@
x=1-99
[/role]
[if]
[not]
[have_unit]
role=Helper
[/have_unit]
[/not]
[then]
{UNIT 1 (Orcish Grunt) 16 3 (role=Helper)}
[/then]
[/if]
[if]
[have_unit]
id=Vrag
@ -242,11 +253,6 @@
[event]
name=turn 13
[set_variable]
name=time_to_go
value=1
[/set_variable]
{VARIABLE stored_helper.x 27}
{VARIABLE stored_helper.y 1}
@ -321,12 +327,5 @@
[/event]
[/event]
[event]
name=victory
{CLEAR_VARIABLE time_to_go}
{CLEAR_VARIABLE name}
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{KAPOUE_DEATH}
[/scenario]

View file

@ -48,20 +48,15 @@
[/event]
[item]
x=26
x=33
y=23
image=items/orcish-flag.png
[/item]
[item]
x=36
y=19
image=items/orcish-flag.png
[/item]
[item]
x=30
y=16
image=items/orcish-flag.png
[/item]
[item]
x=24
y=22
image=items/orcish-flag.png
[/item]
[side]
type=Orcish Leader
@ -77,26 +72,28 @@
{BLACK_FLAG}
[/side]
{STARTING_VILLAGES 1 6}
{STARTING_VILLAGES 1 4}
{AI_CONTROLLER () 1 3 ()}
[side]
#ifdef HARD
type=Dwarvish Lord
#else
type=Dwarvish Steelclad
#endif
id=Kwili
name= _ "Kwili"
side=2
canrecruit=yes
facing=se
recruit=Dwarvish Fighter, Dwarvish Thunderer, Dwarvish Scout
[ai]
recruitment_pattern=fighter,fighter,mixed fighter
[/ai]
{GOLD 100 140 180}
team_name=Dwarves
user_team_name=_"Dwarves"
[/side]
{STARTING_VILLAGES 2 6}
{STARTING_VILLAGES 2 8}
[side]
side=3
@ -111,13 +108,23 @@
name=start
[role]
type=Orcish Warlord, Orcish Warrior, Goblin Knight, Goblin Pillager, Orcish Grunt, Orcish Crossbowman, Orcish Archer
type=Orcish Warlord, Orcish Slurbow, Direwolf Rider, Orcish Warrior, Orcish Crossbowman, Goblin Knight, Goblin Pillager, Orcish Grunt, Orcish Archer, Wolf Rider
role=Helper
[/role]
[recall]
role=Helper
[/recall]
[if]
[have_unit]
role=Helper
[/have_unit]
[then]
[recall]
role=Helper
[/recall]
[/then]
[else]
{UNIT 1 (Orcish Grunt) 35 23 (role=Helper)}
[/else]
[/if]
[message]
speaker="Kapou'e"
@ -198,6 +205,17 @@
[event]
name=turn 7
[fire_event]
name=trolls_appear
[/fire_event]
[/event]
# Needs to fire on Turn 7 or at victory, whichever happens first.
# It gets a custom name, rather 'name=turn 7,victory', so that
# we can guarantee that it fires before the victory event below
[event]
name=trolls_appear
[unit]
id=Blemaker
name= _ "Blemaker"
@ -248,6 +266,8 @@
facing=sw
[/unit]
{AI_CONTROLLER_ALLOW_UNIT_CONTROL 1 "Grüü"}
[message]
speaker=Blemaker
message= _ "Look! Dwarves are fighting orcs!"
@ -296,21 +316,11 @@
[/gold_carryover]
{AI_CONTROLLER_NOTE}
[/objectives]
[/event]
[event]
name=last breath
[filter]
id="Kapou'e"
[/filter]
[message]
speaker=unit
message= _ "Argh! Im done. My people are doomed!"
[/message]
[endlevel]
result=defeat
[/endlevel]
[note]
description= _ "You may also ask Grüü to move to any hex by right-clicking on that hex."
[/note]
[/objectives]
[/event]
[event]
@ -370,11 +380,6 @@
message= _ "Argh! I die!"
[/message]
[set_variable]
name=Kwili_dead
value=1
[/set_variable]
[message]
speaker="Kapou'e"
message= _ "You were warned, dwarf. Riders, spread out of the area and collect what you can from each of these houses. If anyone refuses to pay, tie them up and take it anyway. Let them know that they live only on my good graces. Ill take the army to Barag Gór. Catch up when youre done."
@ -389,6 +394,17 @@
role=doggie
message= _ "Sounds like fun. All right boys, lets go!"
[/message]
# Just in case the trolls have not appeared yet, bring them out
[fire_event]
name=trolls_appear
[/fire_event]
[endlevel]
result=victory
bonus=yes
{NEW_GOLD_CARRYOVER 40}
[/endlevel]
[/event]
[event]
@ -399,37 +415,16 @@
id="Kapou'e"
[/filter]
[if]
[variable]
name=Kwili_dead
numerical_equals=1
[/variable]
[message]
speaker="Kapou'e"
message= _ "Weve succeeded! Weve passed through the Mountains of Haag! Look at these green hills! The land of the free tribes is near now. I can see the walls of Barag Gór in the distance."
[/message]
[then]
[endlevel]
result=victory
bonus=yes
{NEW_GOLD_CARRYOVER 40}
[/endlevel]
[/then]
[/if]
[if]
[variable]
name=Kwili_dead
numerical_equals=0
[/variable]
[then]
[endlevel]
result=victory
bonus=no
{NEW_GOLD_CARRYOVER 40}
[/endlevel]
[/then]
[/if]
{CLEAR_VARIABLE Kwili_dead}
[endlevel]
result=victory
bonus=no
{NEW_GOLD_CARRYOVER 40}
[/endlevel]
[/event]
[event]
@ -440,10 +435,6 @@
id=Blemaker
[/have_unit]
[then]
[message]
speaker="Kapou'e"
message= _ "Weve succeeded! Weve passed through the Mountains of Haag! Look at these green hills! Weve reached the lands of the free tribes. I can see the walls of Barag Gór in the distance."
[/message]
[message]
speaker="Kapou'e"
message= _ "Blemaker, many thanks for your help in this fight. Would you like to join us in our journey with your son? You are a powerful warrior, and you would be of great help."
@ -463,10 +454,6 @@
[/message]
[/then]
[else]
[message]
speaker="Kapou'e"
message= _ "Weve succeeded! Weve passed through the Mountains of Haag! Look at these green hills! The land of the free tribes is near now. I can see the walls of Barag Gór in the distance."
[/message]
[message]
speaker="Kapou'e"
message= _ "Grüü, many thanks for your help in this fight. Im sorry for the loss of your father. Would you like to join us in our journey? Your help would be useful to me."
@ -477,17 +464,14 @@
[/message]
[/else]
[/if]
[store_unit]
[modify_unit]
[filter]
id=Grüü
[/filter]
kill=yes
variable=gruu_store
[/store_unit]
{VARIABLE gruu_store.side 1}
[unstore_unit]
variable=gruu_store
[/unstore_unit]
{CLEAR_VARIABLE gruu_store}
side=1
[/modify_unit]
[/event]
{KAPOUE_DEATH}
[/scenario]

View file

@ -71,6 +71,7 @@
user_team_name=_"Elves"
canrecruit=yes
recruit=Elvish Archer, Elvish Fighter
profile="portraits/elves/captain.png~FL()~RIGHT()"
{GOLD 60 80 100}
{FLAG_VARIANT wood-elvish}
[/side]
@ -468,7 +469,7 @@
name= _ "Jetto"
side=1
type=Orcish Assassin
profile=portraits/jetto.png
profile=portraits/jetto.png~FL()~RIGHT()
x=7
y=30
random_traits=no
@ -528,35 +529,6 @@
speaker=unit
message= _ "Thats right! Now lets drive those mincing tree-shaggers back into their forests!"
[/message]
[objectives]
side=1
[objective]
condition=win
description=_ "Defeat all enemy leaders"
[/objective]
[objective]
condition=lose
description=_ "Death of Kapoue"
[/objective]
[objective]
condition=lose
description=_ "Death of Grüü"
[/objective]
[objective]
condition=lose
description=_ "Death of a Shaman"
[/objective]
{TURNS_RUN_OUT}
[gold_carryover]
bonus=yes
carryover_percentage=40
[/gold_carryover]
{AI_CONTROLLER_NOTE}
[/objectives]
[/event]
[event]
@ -626,7 +598,7 @@
[message]
speaker=narrator
caption= _ "Jetto"
image=portraits/jetto.png
image=portraits/jetto.png~FL()~RIGHT()
message= _ "Son of the Black-Eye! Could I ask for my release from this blighted cage?"
[/message]
@ -642,7 +614,7 @@
[message]
speaker=narrator
caption= _ "Jetto"
image=portraits/jetto.png
image=portraits/jetto.png~FL()~RIGHT()
message= _ "The Barag Gór council sent me to assassinate the elvish leaders. Unfortunately, I was captured."
[/message]
@ -664,7 +636,7 @@
name= _ "Jetto"
side=1
type=Orcish Assassin
profile=portraits/jetto.png
profile=portraits/jetto.png~FL()~RIGHT()
x=7
y=30
random_traits=no
@ -695,5 +667,5 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -170,7 +170,6 @@
aggression=1.0
village_value=0.0
leader_value=50.0
recruitment_pattern=fighter,archer,fighter,archer,scout
[/ai]
#ifdef EASY
recruit=Vampire Bat, Skeleton Archer, Skeleton, Dark Adept
@ -197,7 +196,6 @@
canrecruit=yes
recruit=Vampire Bat, Skeleton Archer, Ghost, Skeleton
[ai]
recruitment_pattern=fighter,archer,fighter,archer,scout
aggression=-1.0
[/ai]
{GOLD 100 150 190}
@ -407,5 +405,5 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -61,7 +61,6 @@
canrecruit=yes
recruit=Swordsman,Fencer,Mage,Heavy Infantryman,Bowman
[ai]
recruitment_pattern=fighter,fighter,archer,mixed fighter
aggression=0
village_value=10.0
leader_value=50.0
@ -96,7 +95,6 @@
facing=sw
recruit=Swordsman,Fencer,Mage,Heavy Infantryman,Bowman
[ai]
recruitment_pattern=fighter,fighter,archer,mixed fighter
aggression=0
village_value=10.0
leader_value=50.0
@ -594,5 +592,5 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -73,7 +73,6 @@
aggression=-1.0
village_value=50.0
leader_value=10.0
recruitment_pattern=fighter,fighter
[/ai]
#ifdef EASY
recruit=Thief,Thug
@ -392,5 +391,5 @@
[/message]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -390,5 +390,5 @@
[/move_unit_fake]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -70,7 +70,6 @@
canrecruit=yes
facing=sw
[ai]
recruitment_pattern=scout, scout, fighter, fighter, mixed fighter, archer, fighter
aggression=1.0
[/ai]
recruit=Ogre, Orcish Grunt, Orcish Warrior, Orcish Crossbowman, Orcish Assassin, Wolf Rider
@ -270,5 +269,5 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -97,7 +97,6 @@
facing=sw
[ai]
aggression=1.0
recruitment_pattern=scout, scout, fighter, fighter, fighter, healer, archer
[goal]
name=target
[criteria]
@ -122,7 +121,6 @@
side=3
canrecruit=yes
[ai]
recruitment_pattern=scout, fighter, fighter, fighter, mixed fighter
aggression=1.0
villages_per_scout=10
[goal]
@ -745,5 +743,5 @@
{VARIABLE darstang_dead yes}
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -73,7 +73,6 @@
facing=sw
[ai]
aggression=1.0
recruitment_pattern=scout, scout, fighter, fighter, fighter, healer, archer
grouping=no
recruitment_ignore_bad_combat=yes
recruitment_ignore_bad_movement=yes
@ -96,7 +95,6 @@
side=3
canrecruit=yes
[ai]
recruitment_pattern=scout, scout, scout, fighter, fighter, mixed fighter, mixed fighter
aggression=1.0
caution=0.0
villages_per_scout=0
@ -126,7 +124,6 @@
facing=sw
[ai]
aggression=1.0
recruitment_pattern=fighter, archer, mixed fighter
grouping=no
recruitment_ignore_bad_combat=yes
recruitment_ignore_bad_movement=yes
@ -1215,5 +1212,5 @@
[/if]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -241,6 +241,6 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
{GENERALS_MUST_SURVIVE}
[/scenario]

View file

@ -318,6 +318,6 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
{GENERALS_MUST_SURVIVE}
[/scenario]

View file

@ -778,6 +778,6 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
{GENERALS_MUST_SURVIVE}
[/scenario]

View file

@ -672,5 +672,5 @@
# [/if]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -346,5 +346,5 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -101,7 +101,6 @@
user_team_name=_"Villains"
{GOLD 800 900 1000}
[ai]
recruitment_pattern=scout,scout,fighter,archer,fighter,archer,mixed fighter,mixed fighter,healer
leader_value=50.0
villages_per_scout=10
[goal]
@ -240,20 +239,6 @@
[/message]
[/event]
[event]
name=last breath
[filter]
id="Kapou'e"
[/filter]
[message]
speaker=unit
message= _ "Argh! Im done. My people are doomed!"
[/message]
[endlevel]
result=defeat
[/endlevel]
[/event]
[event]
name=turn 7
@ -809,6 +794,6 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
{GENERALS_MUST_SURVIVE}
[/scenario]

View file

@ -90,7 +90,6 @@
user_team_name=_"Villains"
{GOLD 800 900 1000}
[ai]
recruitment_pattern=scout,scout,fighter,archer,fighter,archer,mixed fighter,mixed fighter,healer
leader_value=50.0
villages_per_scout=10
[goal]
@ -713,5 +712,5 @@
[/endlevel]
[/event]
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
{HERO_DEATHS}
[/scenario]

View file

@ -6,81 +6,89 @@
[/endlevel]
#enddef
[event]
name=die
[filter]
type=Orcish Shaman,Novice Orcish Shaman,Old Orcish Shaman
[/filter]
[message]
speaker=unit
message= _ "Ouch! This hurts!"
[/message]
[message]
speaker="Kapou'e"
message= _ "The Council will never be complete again. This is hopeless."
[/message]
{DEFEAT}
[/event]
#define SHAMAN_DEATHS
[event]
name=die
[filter]
type=Orcish Shaman,Novice Orcish Shaman,Old Orcish Shaman
[/filter]
[message]
speaker=unit
message= _ "Ouch! This hurts!"
[/message]
[message]
speaker="Kapou'e"
message= _ "The Council will never be complete again. This is hopeless."
[/message]
{DEFEAT}
[/event]
#enddef
[event]
name=last breath
[filter]
id="Kapou'e"
[/filter]
[message]
speaker=unit
message= _ "Argh! Im done. My people are doomed!"
[/message]
{DEFEAT}
[/event]
#define KAPOUE_DEATH
[event]
name=last breath
[filter]
id="Kapou'e"
[/filter]
[message]
speaker=unit
message= _ "Argh! Im done. My people are doomed!"
[/message]
{DEFEAT}
[/event]
#enddef
[event]
name=last breath
[filter]
id=Grüü
[/filter]
[message]
speaker=unit
message= _ "Oh no, I am defeated."
[/message]
{DEFEAT}
[/event]
#define GRUU_DEATH
[event]
name=last breath
[filter]
id=Grüü
[/filter]
[message]
speaker=unit
message= _ "Oh no, I am defeated."
[/message]
{DEFEAT}
[/event]
#enddef
[event]
name=last breath
[filter]
id=Inarix
[/filter]
#define INARIX_DEATH
[event]
name=last breath
[filter]
id=Inarix
[/filter]
[if]
[variable]
name=inarix_abandoned
not_equals=yes
[/variable]
[if]
[variable]
name=inarix_abandoned
not_equals=yes
[/variable]
[then]
[message]
speaker=Inarix
message= _ "Ahhh!"
[/message]
[then]
[message]
speaker=Inarix
message= _ "Ahhh!"
[/message]
[message]
speaker="Kapou'e"
message= _ "Blast it, without Inarix to lead his saurians, we can no longer count on their help."
[/message]
[message]
speaker="Kapou'e"
message= _ "Blast it, without Inarix to lead his saurians, we can no longer count on their help."
[/message]
[set_variable]
name=got_saurians
value=no
[/set_variable]
[set_variable]
name=got_saurians
value=no
[/set_variable]
[disallow_recruit]
side=1
type=Saurian Skirmisher, Saurian Augur
[/disallow_recruit]
[/then]
[/if]
[/event]
[disallow_recruit]
side=1
type=Saurian Skirmisher, Saurian Augur
[/disallow_recruit]
[/then]
[/if]
[/event]
#enddef
#define GENERALS_MUST_SURVIVE
# It is only critical that the allied generals survive until the
@ -94,3 +102,10 @@
{DEFEAT}
[/event]
#enddef
#define HERO_DEATHS
{KAPOUE_DEATH}
{SHAMAN_DEATHS}
{GRUU_DEATH}
{INARIX_DEATH}
#enddef

View file

@ -508,61 +508,6 @@
{_AI_ASPECT_LEADER_GOAL_RISKY_MOVE_TO {X} {Y} "no"}
#enddef
############################################################
# AI CONTROLLER SUPPORT
############################################################
#define AI_CONTROLLER_ALLOW_LEADER_CONTROL CONTROLLER_SIDE CONTROLLED_SIDE
[store_unit]
[filter]
side={CONTROLLED_SIDE}
canrecruit=yes
[/filter]
kill=no
variable=ally_leader
[/store_unit]
[if]
[variable]
name=ally_leader.length
greater_than=0
[/variable]
[then]
[set_menu_item]
id=ai_controller_leader_control_{CONTROLLED_SIDE}
description= _ "Ask $ally_leader.name (leader of side $ally_leader.side) to move here"
[show_if]
side={CONTROLLER_SIDE}
[have_unit]
side={CONTROLLED_SIDE}
canrecruit=yes
[/have_unit]
[/show_if]
[command]
{CLEAR_AI_ALWAYS_ASPECT_LEADER_GOAL {CONTROLLED_SIDE} }
{MODIFY_AI_ADD_ASPECT {CONTROLLED_SIDE} leader_goal {AI_ASPECT_LEADER_GOAL_RISKY_MOVE_TO $x1 $y1} }
[/command]
[/set_menu_item]
[/then]
[/if]
[event]
name=victory #TODO: any scenario change
[set_menu_item]
id=ai_controller_leader_control_{CONTROLLED_SIDE}
[show_if]
[not]
[/not]
[/show_if]
[/set_menu_item]
[/event]
{CLEAR_VARIABLE ally_leader}
#enddef
############################################################
# EXPERIMENTAL AI
############################################################

View file

@ -1,5 +1,109 @@
#textdomain wesnoth
#define AI_CONTROLLER_ALLOW_UNIT_CONTROL CONTROLLER_SIDE UNIT_ID
[store_unit]
[filter]
id={UNIT_ID}
[/filter]
kill=no
variable=ai_controller_unit
[/store_unit]
[if]
[variable]
name=ai_controller_unit.length
greater_than=0
[/variable]
[then]
[set_menu_item]
id="ai_controller_unit_control_{UNIT_ID}"
description= _ "Ask $ai_controller_unit.name to move here"
[show_if]
side={CONTROLLER_SIDE}
[have_unit]
id={UNIT_ID}
[/have_unit]
[/show_if]
[command]
[modify_unit]
[filter]
id={UNIT_ID}
[/filter]
goto_x,goto_y=$x1,$y1
[/modify_unit]
[/command]
[/set_menu_item]
[/then]
[/if]
[event]
name=victory #TODO: any scenario change
[set_menu_item]
id="ai_controller_unit_control_{UNIT_ID}"
[show_if]
[not]
[/not]
[/show_if]
[/set_menu_item]
[/event]
{CLEAR_VARIABLE ai_controller_unit}
#enddef
#define AI_CONTROLLER_ALLOW_LEADER_CONTROL CONTROLLER_SIDE CONTROLLED_SIDE
[store_unit]
[filter]
side={CONTROLLED_SIDE}
canrecruit=yes
[/filter]
kill=no
variable=ally_leader
[/store_unit]
[if]
[variable]
name=ally_leader.length
greater_than=0
[/variable]
[then]
[set_menu_item]
id=ai_controller_leader_control_{CONTROLLED_SIDE}
description= _ "Ask $ally_leader.name (leader of side $ally_leader.side) to move here"
[show_if]
side={CONTROLLER_SIDE}
[have_unit]
side={CONTROLLED_SIDE}
canrecruit=yes
[/have_unit]
[/show_if]
[command]
{CLEAR_AI_ALWAYS_ASPECT_LEADER_GOAL {CONTROLLED_SIDE} }
{MODIFY_AI_ADD_ASPECT {CONTROLLED_SIDE} leader_goal {AI_ASPECT_LEADER_GOAL_RISKY_MOVE_TO $x1 $y1} }
[/command]
[/set_menu_item]
[/then]
[/if]
[event]
name=victory #TODO: any scenario change
[set_menu_item]
id=ai_controller_leader_control_{CONTROLLED_SIDE}
[show_if]
[not]
[/not]
[/show_if]
[/set_menu_item]
[/event]
{CLEAR_VARIABLE ally_leader}
#enddef
#define AI_CONTROLLER_NOTE
[note]
description= _ "In this scenario, you may issue instructions to an allied side by right-clicking on a unit that belongs to it."
@ -293,12 +397,10 @@
{MODIFY_AI_ADD_GOAL $ally_side (
[goal]
id=set_by_ai_controller
name=protect
name=protect_unit
value=20
[criteria]
[filter]
side=$temp_i
[/filter]
side=$temp_i
[/criteria]
[/goal]
)}

View file

@ -907,6 +907,8 @@
<Unit filename="..\..\src\storyscreen\part.hpp" />
<Unit filename="..\..\src\storyscreen\render.cpp" />
<Unit filename="..\..\src\storyscreen\render.hpp" />
<Unit filename="..\..\src\strftime.cpp" />
<Unit filename="..\..\src\strftime.hpp" />
<Unit filename="..\..\src\team.cpp" />
<Unit filename="..\..\src\team.hpp" />
<Unit filename="..\..\src\terrain.cpp" />

View file

@ -904,6 +904,7 @@
EC48D75A17F318DA00DE80BF /* multiplayer_configure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC48D75217F318DA00DE80BF /* multiplayer_configure.cpp */; };
EC48D75B17F318DA00DE80BF /* multiplayer_connect_engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC48D75417F318DA00DE80BF /* multiplayer_connect_engine.cpp */; };
EC48D75C17F318DA00DE80BF /* multiplayer_create_engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC48D75617F318DA00DE80BF /* multiplayer_create_engine.cpp */; };
EC4D40AF17FCCF14002E7C81 /* strftime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC4D40AD17FCCF14002E7C81 /* strftime.cpp */; };
ECA9E67B17F478B600F5DDC4 /* desktop_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA9E67917F478B600F5DDC4 /* desktop_util.cpp */; };
ECA9E67E17F478D600F5DDC4 /* game_paths.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA9E67C17F478D600F5DDC4 /* game_paths.cpp */; };
F419A1F414E21246002F9ADC /* game_end_exceptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F419A1F314E21246002F9ADC /* game_end_exceptions.cpp */; };
@ -2022,6 +2023,8 @@
EC48D75517F318DA00DE80BF /* multiplayer_connect_engine.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = multiplayer_connect_engine.hpp; sourceTree = "<group>"; };
EC48D75617F318DA00DE80BF /* multiplayer_create_engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = multiplayer_create_engine.cpp; sourceTree = "<group>"; };
EC48D75717F318DA00DE80BF /* multiplayer_create_engine.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = multiplayer_create_engine.hpp; sourceTree = "<group>"; };
EC4D40AD17FCCF14002E7C81 /* strftime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = strftime.cpp; sourceTree = "<group>"; };
EC4D40AE17FCCF14002E7C81 /* strftime.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = strftime.hpp; sourceTree = "<group>"; };
ECA9E67917F478B600F5DDC4 /* desktop_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = desktop_util.cpp; sourceTree = "<group>"; };
ECA9E67A17F478B600F5DDC4 /* desktop_util.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = desktop_util.hpp; sourceTree = "<group>"; };
ECA9E67C17F478D600F5DDC4 /* game_paths.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = game_paths.cpp; sourceTree = "<group>"; };
@ -2268,6 +2271,8 @@
29B97315FDCFA39411CA2CEA /* src */ = {
isa = PBXGroup;
children = (
EC4D40AD17FCCF14002E7C81 /* strftime.cpp */,
EC4D40AE17FCCF14002E7C81 /* strftime.hpp */,
ECA9E67917F478B600F5DDC4 /* desktop_util.cpp */,
ECA9E67A17F478B600F5DDC4 /* desktop_util.hpp */,
62CC8E7917B9064B00C16B75 /* generators */,
@ -4208,6 +4213,7 @@
B52EE88B1213589100CFBDAB /* data_manage.cpp in Sources */,
B52EE88C1213589100CFBDAB /* unit_attack.cpp in Sources */,
B52EE893121358E100CFBDAB /* progress_bar.cpp in Sources */,
EC4D40AF17FCCF14002E7C81 /* strftime.cpp in Sources */,
EC48D75917F318DA00DE80BF /* mp_game_utils.cpp in Sources */,
B52EE897121358EF00CFBDAB /* progress_bar.cpp in Sources */,
B52EE89D1213590500CFBDAB /* list.cpp in Sources */,

View file

@ -1302,7 +1302,7 @@ bool readonly_context_impl::is_active(const std::string &time_of_day, const std:
{
if(time_of_day.empty() == false) {
const std::vector<std::string>& times = utils::split(time_of_day);
if(std::count(times.begin(),times.end(),resources::tod_manager->get_time_of_day().name) == 0) {
if(std::count(times.begin(),times.end(),resources::tod_manager->get_time_of_day().id) == 0) {
return false;
}
}

View file

@ -184,7 +184,7 @@ bool ai_default_recruitment_stage::recruit_usage(const std::string& usage)
LOG_AI << "recruiting '" << usage << "'\n";
//make sure id, usage and cost are known for the coming evaluation of unit types
unit_types.build_all(unit_type::HELP_INDEX);
unit_types.build_all(unit_type::HELP_INDEXED);
std::vector<std::string> options;
bool found = false;

View file

@ -63,10 +63,6 @@ namespace {
* CONSTANTS
*/
// When a enemy is in this radius around a leader, this leader is tagged as 'in danger'.
// If gold is available, this leader will recruit as much units as possible.
const static int LEADER_IN_DANGER_RADIUS = 5;
// This is used for a income estimation. We'll calculate the estimated income of this much
// future turns and decide if we'd gain gold if we start to recruit no units anymore.
const static int SAVE_GOLD_FORECAST_TURNS = 5;
@ -262,8 +258,9 @@ void recruitment::execute() {
global_recruits.insert(recall.type_id());
}
// Check if leader is in danger.
data.in_danger = is_enemy_in_radius(leader->get_location(), LEADER_IN_DANGER_RADIUS);
// Check if leader is in danger. (If a enemies unit can attack the leader)
data.in_danger = power_projection(leader->get_location(), get_enemy_dstsrc()) > 0;
// If yes, set ratio_score very high, so this leader will get priority while recruiting.
if (data.in_danger) {
data.ratio_score = 50;
@ -289,7 +286,9 @@ void recruitment::execute() {
*/
update_important_hexes();
if (game_config::debug) {
// Show "x" on important hexes if debug mode is activated AND
// the log domain "ai/recruitment" is used.
if (game_config::debug && !lg::info.dont_log(log_ai_recruitment)) {
show_important_hexes();
}
@ -1491,9 +1490,7 @@ void recruitment::update_state() {
}
// Retrieve from aspect.
int spend_all_gold = get_recruitment_save_gold()["spend_all_gold"].to_int(-1);
int threshold = (spend_all_gold < 0) ? current_team().start_gold() + 1 : spend_all_gold;
if (current_team().gold() >= threshold) {
if (spend_all_gold > 0 && current_team().gold() >= spend_all_gold) {
state_ = SPEND_ALL_GOLD;
LOG_AI_RECRUITMENT << "Changed state_ to SPEND_ALL_GOLD. \n";
return;

View file

@ -318,7 +318,7 @@ bool recruitment_phase::recruit_usage(const std::string& usage)
LOG_AI_TESTING_AI_DEFAULT << "recruiting '" << usage << "'\n";
//make sure id, usage and cost are known for the coming evaluation of unit types
unit_types.build_all(unit_type::HELP_INDEX);
unit_types.build_all(unit_type::HELP_INDEXED);
std::vector<std::string> options;
bool found = false;
@ -758,66 +758,129 @@ move_leader_to_keep_phase::~move_leader_to_keep_phase()
double move_leader_to_keep_phase::evaluate()
{
unit_map &units_ = *resources::units;
const unit_map::iterator leader = units_.find_leader(get_side());
if(get_leader_ignores_keep()){
if (get_leader_ignores_keep()) {
return BAD_SCORE;
}
if(get_passive_leader() && !get_passive_leader_shares_keep()){
return BAD_SCORE;
}
if (leader == units_.end() || leader->incapacitated() || leader->movement_left() == 0) {
if (get_passive_leader() && !get_passive_leader_shares_keep()) {
return BAD_SCORE;
}
// Find where the leader can move
// 1. Collect all leaders in a list
// 2. Get the suitable_keep for each leader
// 3. Choose the leader with the nearest suitable_keep (and which still have moves)
// 4. If leader can reach this keep in 1 turn -> set move_ to there
// 5. If not -> Calculate the best move_ (use a-star search)
// 6. Save move_ for execution
// 1.
const unit_map &units_ = *resources::units;
const std::vector<unit_map::const_iterator> leaders = units_.find_leaders(get_side());
if (leaders.empty()) {
return BAD_SCORE;
}
// 2. + 3.
const unit* best_leader = NULL;
map_location best_keep;
int shortest_distance = 99999;
BOOST_FOREACH(const unit_map::const_iterator& leader, leaders) {
if (leader->incapacitated() || leader->movement_left() == 0) {
continue;
}
// Find where the leader can move
const ai::moves_map &possible_moves = get_possible_moves();
const ai::moves_map::const_iterator& p_it = possible_moves.find(leader->get_location());
if (p_it == possible_moves.end()) {
return BAD_SCORE;
}
const pathfind::paths leader_paths = p_it->second;
const map_location& keep = suitable_keep(leader->get_location(), leader_paths);
if (keep == map_location::null_location || keep == leader->get_location()) {
continue;
}
const pathfind::shortest_path_calculator calc(*leader, current_team(), *resources::teams, *resources::game_map);
const pathfind::teleport_map allowed_teleports = pathfind::get_teleport_locations(*leader, current_team());
pathfind::plain_route route;
route = pathfind::a_star_search(leader->get_location(), keep, 10000.0, &calc, resources::game_map->w(), resources::game_map->h(), &allowed_teleports);
if (!route.steps.empty() || route.move_cost < shortest_distance) {
best_leader = &(*leader);
best_keep = keep;
shortest_distance = route.move_cost;
}
}
if (best_leader == NULL) {
return BAD_SCORE;
}
// 4.
const unit* leader = best_leader;
const map_location keep = best_keep;
const pathfind::paths leader_paths(*leader, false, true, current_team());
const map_location& keep = suitable_keep(leader->get_location(), leader_paths);
if (keep == map_location::null_location) {
return BAD_SCORE;
const pathfind::shortest_path_calculator calc(*leader, current_team(), *resources::teams, *resources::game_map);
const pathfind::teleport_map allowed_teleports = pathfind::get_teleport_locations(*leader, current_team());
if (leader_paths.destinations.contains(keep) && units_.count(keep) == 0) {
move_ = check_move_action(leader->get_location(), keep, false);
if (move_->is_ok()) {
return get_score();
}
}
std::map<map_location,pathfind::paths> possible_moves;
possible_moves.insert(std::make_pair(leader->get_location(), leader_paths));
// 5.
// The leader can't move to his keep, try to move to the closest location
// to the keep where there are no enemies in range.
// Make a map of the possible locations the leader can move to,
// ordered by the distance from the keep.
typedef std::multimap<int, map_location> ordered_locations;
ordered_locations moves_toward_keep;
// If the leader is not on keep, move him there.
if (leader->get_location() != keep) {
if (leader_paths.destinations.contains(keep) && units_.count(keep) == 0) {
move_ = check_move_action(leader->get_location(), keep, false);
if (move_->is_ok()){
pathfind::plain_route route;
route = pathfind::a_star_search(leader->get_location(), keep, 10000.0, &calc, resources::game_map->w(), resources::game_map->h(), &allowed_teleports);
// find next hop
map_location next_hop = map_location::null_location;
int next_hop_cost = 0;
BOOST_FOREACH(const map_location& step, route.steps) {
if (leader_paths.destinations.contains(step)) {
next_hop = step;
next_hop_cost += leader->movement_cost(resources::game_map->get_terrain(step));
} else {
break;
}
}
if (next_hop == map_location::null_location) {
return BAD_SCORE;
}
//define the next hop to have the lowest cost (0)
moves_toward_keep.insert(std::make_pair(0, next_hop));
BOOST_FOREACH(const pathfind::paths::step &dest, leader_paths.destinations) {
if (!units_.find(dest.curr).valid()) {
route = pathfind::a_star_search(dest.curr, next_hop, 10000.0, &calc,
resources::game_map->w(), resources::game_map->h(), &allowed_teleports);
if (route.move_cost < next_hop_cost) {
moves_toward_keep.insert(std::make_pair(route.move_cost, dest.curr));
}
}
}
// Find the first location which we can move to,
// without the threat of enemies.
BOOST_FOREACH(const ordered_locations::value_type& pair, moves_toward_keep) {
const map_location& loc = pair.second;
if (get_enemy_dstsrc().count(loc) == 0) {
move_ = check_move_action(leader->get_location(), loc, true);
if (move_->is_ok()) {
return get_score();
}
}
// Make a map of the possible locations the leader can move to,
// ordered by the distance from the keep.
std::multimap<int,map_location> moves_toward_keep;
// The leader can't move to his keep, try to move to the closest location
// to the keep where there are no enemies in range.
int current_distance = distance_between(leader->get_location(), keep);
BOOST_FOREACH(const pathfind::paths::step &dest, leader_paths.destinations)
{
if (!units_.find(dest.curr).valid()){
const int new_distance = distance_between(dest.curr,keep);
if(new_distance < current_distance) {
moves_toward_keep.insert(std::make_pair(new_distance, dest.curr));
}
}
}
// Find the first location which we can move to,
// without the threat of enemies.
for(std::multimap<int,map_location>::const_iterator j = moves_toward_keep.begin();
j != moves_toward_keep.end(); ++j) {
if(get_enemy_dstsrc().count(j->second) == 0) {
move_ = check_move_action(leader->get_location(), j->second, true);
if (move_->is_ok()){
return get_score();
}
}
}
}
return BAD_SCORE;
@ -826,7 +889,7 @@ double move_leader_to_keep_phase::evaluate()
void move_leader_to_keep_phase::execute()
{
move_->execute();
if (!move_->is_ok()){
if (!move_->is_ok()) {
LOG_AI_TESTING_AI_DEFAULT << get_name() <<"::execute not ok" << std::endl;
}
}

View file

@ -29,6 +29,7 @@
#include <boost/foreach.hpp>
#include <boost/algorithm/string/replace.hpp>
#include <boost/iostreams/filter/gzip.hpp>
static lg::log_domain log_cache("cache");
#define ERR_CACHE LOG_STREAM(err, log_cache)
@ -217,6 +218,9 @@ namespace game_config {
ERR_CACHE << "cache " << fname << extension << " is corrupt. Loading from files: "<< e.message<<"\n";
} catch(io_exception&) {
ERR_CACHE << "error reading cache " << fname << extension << ". Loading from files\n";
} catch (boost::iostreams::gzip_error& e) {
//read_file -> ... -> read_gz can throw this exeption.
ERR_CACHE << "cache " << fname << extension << " is corrupt. Error code: " << e.error() << "\n";
}
}

View file

@ -360,7 +360,7 @@ void manager::init() const
get_files_in_dir(path, &files, NULL, ENTIRE_FILE_PATH);
BOOST_FOREACH(const std::string& file, files)
if(file.substr(file.length() - 4) == ".ttf" || file.substr(file.length() - 4) == ".ttc")
AddFontResource(file.c_str());
AddFontResourceA(file.c_str());
}
#endif
}
@ -377,7 +377,7 @@ void manager::deinit() const
get_files_in_dir(path, &files, NULL, ENTIRE_FILE_PATH);
BOOST_FOREACH(const std::string& file, files)
if(file.substr(file.length() - 4) == ".ttf" || file.substr(file.length() - 4) == ".ttc")
RemoveFontResource(file.c_str());
RemoveFontResourceA(file.c_str());
}
#endif
}

View file

@ -1033,7 +1033,7 @@ formula::formula(const std::string& str, function_symbol_table* symbols) :
tokens.push_back( get_token(i1,i2) );
TOKEN_TYPE current_type = tokens.back().type;
formula_tokenizer::TOKEN_TYPE current_type = tokens.back().type;
if(current_type == TOKEN_WHITESPACE) {
tokens.pop_back();

View file

@ -20,6 +20,7 @@ namespace formula_tokenizer
typedef std::string::const_iterator iterator;
/// TOKEN_TYPE is already defined in a Winnt.h (a windows header wich is included under some conditions.)
enum TOKEN_TYPE { TOKEN_OPERATOR, TOKEN_STRING_LITERAL,
TOKEN_IDENTIFIER, TOKEN_INTEGER, TOKEN_DECIMAL,
TOKEN_LPARENS, TOKEN_RPARENS,

View file

@ -301,7 +301,10 @@ wml_menu_item & wmi_container::get_item(const std::string& id)
{
// Try to insert a dummy value. This combines looking for an existing
// entry with insertion.
map_t::iterator add_it = wml_menu_items_.insert(map_t::value_type(id, NULL)).first;
// the static cast fixes http://connect.microsoft.com/VisualStudio/feedback/details/520043/
// c++11's nullptr would be a better solution as soon as we support it.
map_t::iterator add_it = wml_menu_items_.insert(map_t::value_type(id, static_cast<wml_menu_item *>(NULL))).first;
// If we ended up with a dummy value, create an entry for it.
if ( add_it->second == NULL )

View file

@ -110,7 +110,7 @@ void tunit_create::pre_show(CVideo& /*video*/, twindow& window)
FOREACH(const AUTO& i, unit_types.types())
{
// Make sure this unit type is built with the data we need.
unit_types.build_unit_type(i.second, unit_type::HELP_INDEX);
unit_types.build_unit_type(i.second, unit_type::HELP_INDEXED);
// And so we map an unit_type id to a list subscript. Ugh.
type_ids_.push_back(i.first);

View file

@ -1358,7 +1358,7 @@ public:
BOOST_FOREACH(const std::string &adv, adv_units)
{
const unit_type *type = unit_types.find(adv, unit_type::HELP_INDEX);
const unit_type *type = unit_types.find(adv, unit_type::HELP_INDEXED);
if (!type || type->hide_help()) continue;
if (first) {
@ -1387,7 +1387,7 @@ public:
}
const unit_type* parent = variation_.empty() ? &type_ :
unit_types.find(type_.id(), unit_type::HELP_INDEX);
unit_types.find(type_.id(), unit_type::HELP_INDEXED);
if (!variation_.empty()) {
ss << _("Base unit: ") << "<ref>dst='" << ".." << unit_prefix + type_.id()
<< "' text='" << escape(parent->type_name()) << "'</ref>\n";
@ -1398,7 +1398,7 @@ public:
ss << _("Base units: ");
first = false;
}
const unit_type* base_type = unit_types.find(base_id, unit_type::HELP_INDEX);
const unit_type* base_type = unit_types.find(base_id, unit_type::HELP_INDEXED);
const std::string section_prefix = base_type->variations().empty() ? "" : "..";
ss << "<ref>dst='" << section_prefix << unit_prefix + base_id
<< "' text='" << escape(base_type->type_name()) << "'</ref>\n";
@ -1744,7 +1744,7 @@ std::string make_unit_link(const std::string& type_id)
{
std::string link;
const unit_type *type = unit_types.find(type_id, unit_type::HELP_INDEX);
const unit_type *type = unit_types.find(type_id, unit_type::HELP_INDEXED);
if (!type) {
std::cerr << "Unknown unit type : " << type_id << "\n";
// don't return an hyperlink (no page)
@ -3297,7 +3297,7 @@ void show_help(display &disp, const section &toplevel_sec,
// Find all unit_types that have not been constructed yet and fill in the information
// needed to create the help topics
unit_types.build_all(unit_type::HELP_INDEX);
unit_types.build_all(unit_type::HELP_INDEXED);
if (preferences::encountered_units().size() != size_t(last_num_encountered_units) ||
preferences::encountered_terrains().size() != size_t(last_num_encountered_terrains) ||

View file

@ -148,7 +148,7 @@ static void wesnoth_setlocale(int category, std::string const &slocale,
std::string win_locale(locale, 0, 2);
#include "language_win32.ii"
if(category == LC_MESSAGES) {
SetEnvironmentVariable("LANG", win_locale.c_str());
SetEnvironmentVariableA("LANG", win_locale.c_str());
std::string env = "LANGUAGE=" + locale;
_putenv(env.c_str());
return;

View file

@ -926,14 +926,16 @@ namespace { // Helpers for create_unit()
create_dlg.show(gui.video());
if(create_dlg.no_choice()) {
return type_and_gender(NULL, unit_race::NUM_GENDERS);
// the static cast fixes http://connect.microsoft.com/VisualStudio/feedback/details/520043/
// c++11's nullptr would be a better solution as soon as we support it.
return type_and_gender(static_cast<const unit_type *>(NULL), unit_race::NUM_GENDERS);
}
const std::string& ut_id = create_dlg.choice();
const unit_type *utp = unit_types.find(ut_id);
if (!utp) {
ERR_NG << "Create unit dialog returned nonexistent or unusable unit_type id '" << ut_id << "'.\n";
return type_and_gender(NULL, unit_race::NUM_GENDERS);
return type_and_gender(static_cast<const unit_type *>(NULL), unit_race::NUM_GENDERS);
}
const unit_type &ut = *utp;
@ -971,7 +973,7 @@ namespace { // Helpers for create_unit()
std::stringstream row;
// Make sure the unit type was built for the data we need.
unit_types.build_unit_type(i.second, unit_type::HELP_INDEX);
unit_types.build_unit_type(i.second, unit_type::HELP_INDEXED);
row << i.second.race()->plural_name() << COLUMN_SEPARATOR;
row << i.second.type_name() << COLUMN_SEPARATOR;
@ -1025,7 +1027,7 @@ namespace { // Helpers for create_unit()
unit_choices[choice]->genders().front());
}
else
return type_and_gender(NULL, unit_race::NUM_GENDERS);
return type_and_gender(static_cast<const unit_type *>(NULL), unit_race::NUM_GENDERS);
}
/**

View file

@ -392,23 +392,45 @@ void read_compressed(config &cfg, std::istream &file, abstract_validator * valid
filter.push(decompressor());
filter.push(file);
#if (_MSC_VER >= 1500)
// this seems to fix an msvc issue that causes crashes on a regular basis
// this causes especialy gzip_error (or the coresponding bz2 error, maybe other erros too?) to be thrown here.
// gzip_error will be thown in case of a invalid zip file
// save_index_class::data expects that and config_cache::read_cache is also capable of catching.
//
// i(gfgtdf) still dont know how other compilers handle it.
// especialy weather the catch for gzip_error in save_index_class::data is ever reached and when the exeption is thown.
// and what happens when the code tries to read a corupt cache gz file.
// note that parser(cfg, filter,validator)(); -> tokenizer::tokenizer can throw exeptions too (meaning this functions did already throw these exeptions before this patch).
// also note that this doesn't fix the source of the currupted gz files wich is, that filtering_stream cannot create empty compressend gz files properly, see https://svn.boost.org/trac/boost/ticket/5237
// filter.peek() might throw an exeption now.
filter.exceptions(filter.exceptions() | std::ios_base::badbit);
#endif
/*
* It sometimes seems the file is not empty but still no real data.
* Filter that case here. It might be previous test is no longer required
* but simply keep it.
*/
// at least on msvc filter.peek() != EOF does not imply filter.good() (without the line above)
if(filter.peek() == EOF) {
return;
}
if(!filter.good()) {
LOG_CF << " filter.peek() != EOF but !filter.good(), this indicates a malformed gz stream.";
}
parser(cfg, filter,validator)();
}
/// might throw a std::ios_base::failure especially a gzip_error
void read_gz(config &cfg, std::istream &file, abstract_validator * validator)
{
read_compressed<boost::iostreams::gzip_decompressor>(cfg, file, validator);
}
/// might throw a std::ios_base::failure especially bzip2_error
void read_bz2(config &cfg, std::istream &file, abstract_validator * validator)
{
read_compressed<boost::iostreams::bzip2_decompressor>(cfg, file, validator);

View file

@ -538,13 +538,13 @@ void unit_type::build_full(const movement_type_map &mv_types,
}
/**
* Partially load data into an empty unit_type (build to HELP_INDEX).
* Partially load data into an empty unit_type (build to HELP_INDEXED).
*/
void unit_type::build_help_index(const movement_type_map &mv_types,
const race_map &races, const config::const_child_itors &traits)
{
// Don't build twice.
if ( HELP_INDEX <= build_status_ )
if ( HELP_INDEXED <= build_status_ )
return;
// Make sure we are built to the preceding build level.
build_created(mv_types, races, traits);
@ -650,7 +650,7 @@ void unit_type::build_help_index(const movement_type_map &mv_types,
hide_help_= cfg_["hide_help"].to_bool();
build_status_ = HELP_INDEX;
build_status_ = HELP_INDEXED;
}
/**
@ -713,8 +713,8 @@ void unit_type::build(BUILD_STATUS status, const movement_type_map &movement_typ
build_created(movement_types, races, traits);
return;
case VARIATIONS: // Implemented as part of HELP_INDEX
case HELP_INDEX:
case VARIATIONS: // Implemented as part of HELP_INDEXED
case HELP_INDEXED:
// Build the data needed to feed the help index.
build_help_index(movement_types, races, traits);
return;
@ -953,7 +953,7 @@ std::set<std::string> unit_type::advancement_tree() const
const std::vector<std::string> unit_type::advances_from() const
{
// currently not needed (only help call us and already did it)
unit_types.build_all(unit_type::HELP_INDEX);
unit_types.build_all(unit_type::HELP_INDEXED);
std::vector<std::string> adv_from;
BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &ut, unit_types.types())

View file

@ -123,12 +123,13 @@ public:
/// Records the status of the lazy building of unit types.
/// These are in order of increasing levels of being built.
enum BUILD_STATUS {NOT_BUILT, CREATED, VARIATIONS, HELP_INDEX, WITHOUT_ANIMATIONS, FULL};
/// HELP_INDEX is already defined in a windows header under some conditions.
enum BUILD_STATUS {NOT_BUILT, CREATED, VARIATIONS, HELP_INDEXED , WITHOUT_ANIMATIONS, FULL};
private: // These will be called by build().
/// Load data into an empty unit_type (build to FULL).
void build_full(const movement_type_map &movement_types,
const race_map &races, const config::const_child_itors &traits);
/// Partially load data into an empty unit_type (build to HELP_INDEX).
/// Partially load data into an empty unit_type (build to HELP_INDEXED).
void build_help_index(const movement_type_map &movement_types,
const race_map &races, const config::const_child_itors &traits);
/// Load the most needed data into an empty unit_type (build to CREATE).
@ -244,7 +245,7 @@ public:
bool has_random_traits() const;
/// The returned vector will not be empty, provided this has been built
/// to the HELP_INDEX status.
/// to the HELP_INDEXED status.
const std::vector<unit_race::GENDER>& genders() const { return genders_; }
std::vector<std::string> variations() const;
@ -257,7 +258,7 @@ public:
/// Returns the ID of this type's race without the need to build the type.
std::string race_id() const { return cfg_["race"]; } //race_->id(); }
/// Never returns NULL, but may point to the null race.
/// Requires building to the HELP_INDEX status to get the correct race.
/// Requires building to the HELP_INDEXED status to get the correct race.
const unit_race* race() const { return race_; }
bool hide_help() const;

View file

@ -1 +0,0 @@
.project

View file

@ -1,133 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/xhtml; charset=utf-8" />
<link rel="shortcut icon" type="image/png" href="http://wesnoth.org/mw/skins/glamdrol/ico.png" />
<style type="text/css">@import url('http://wesnoth.org/mw/skins/glamdrol/main.css');</style>
<style type="text/css">@import url('http://wesnoth.org/mw/skins/glamdrol/home.css');</style>
<style type="text/css">
#feature #overview { background-image: url()!important; }
#overview ul { width: 100% !important; }
</style>
<title>Documentation &amp; Download - User Made Content Development IDE</title>
</head>
<body>
<div id="global">
<div id="header">
<div id="logo">
<a href="/"><img alt="Wesnoth logo" src="http://wesnoth.org/mw/skins/glamdrol/wesnoth-logo.jpg" /></a>
</div>
</div>
<div id="nav">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="download.html">Download</a></li>
<li><a href="features.html">Features</a></li>
<li><a href="http://wesnoth.org">Battle for Wesnoth</a></li>
</ul>
</div>
<div id="main">
<div id="feature">
<div id="border_left"><div id="border_right"><div id="border_bottom">
<div id="corner_bottomleft"><div id="corner_bottomright">
<div id="border_top"><div id="corner_topleft"><div id="corner_topright">
<div id="overview">
<h2>Manuals</h2>
<p>
User's Manual can be found here:
<a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/2.0.1/user_manual.pdf/download">Download User's Manual</a>.
<br/>
Developer's Manual can be found here:
<a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/2.0.1/dev_manual.pdf/download">Download Developer's Manual</a>.
</p>
<h2>Download</h2>
<p>The current version of the UMC IDE is 2.0.1</p>
<p>The UMC IDE is available in two flavours: eclipse plugin and standalone application.</p>
<ul>
<li>
<a>*</a> <span style="text-decoration: underline;">Eclipse plugin:</span>
Use the following link as the update site: <a href="http://eclipse.wesnoth.org/updates">http://eclipse.wesnoth.org/updates</a>
</li>
<br/>
<li>
<a>*</a> <span style="text-decoration: underline;">Standalone application:</span> <br />
<!-- WINDOWS -->
<img src="http://a.fsdn.com/con/img/icons/windows.png" />
Download for Windows:
<a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/2.0.1/wesnoth_umc_dev-win32.win32.x86.zip/download">32 bit</a>
<a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/2.0.1/wesnoth_umc_dev-win32.win32.x86_64.zip/download">64 bit</a> <a>|</a>
(Download <a href="https://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/utils/fix_update.cmd/download">post-update fix</a>)
<br/>
<!-- LINUX -->
<img src="http://a.fsdn.com/con/img/icons/linux.png" />
Download for Linux:
<a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/2.0.1/wesnoth_umc_dev-linux.gtk.x86.zip/download">32 bit</a>
<a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/2.0.1/wesnoth_umc_dev-linux.gtk.x86_64.zip/download">64 bit</a> <a>|</a>
(Download <a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/utils/fix_update.sh/download">post-update fix</a>)
<br/>
<!-- MAC OS X -->
<img src="https://a.fsdn.com/con/img/icons/mac.png" />
Download for Mac OS X:
<a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/2.0.1/wesnoth_umc_dev-macosx.cocoa.x86_64.zip/download">64 bit</a> <a>|</a>
(Download <a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/utils/fix_update.zip/download">post-update fix</a>)
<br/><br/>
<a name="mac_32bit_note"><span style="font-style:italic;">* Note:</span></a> The IDE does not support 32 bit Mac OSX , because it requires Java SE6 which is available just on the 64 bit Mac OS X.
<br/>
<a name="postupdate_note"><span style="font-style:italic;">* Note:</span></a> If the IDE doesn't start anymore after the update, please download and run the Post-Update fix script provided for your operating system.
<br/><br/>
The application requires the Java runtime environment, so you need to install SUN's Java first (not openJDK or others)
- <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Download Java</a>.
<br/><br/>
For all versions go here: <a href="http://sourceforge.net/projects/wesnoth/files/wesnoth-umcplugin/">Download standalone versions</a>
</li>
</ul>
</div> <!-- overview -->
</div></div></div></div></div></div></div></div>
</div> <!-- feature -->
<div class="visualClear"></div>
<div id="footer">
<div id="note">
<p><a href="http://wiki.wesnoth.org/Site_Map">Site map</a></p>
<p><a href="http://wiki.wesnoth.org/Wesnoth:Copyrights">Copyright</a> &copy; 2003-2013 The Battle for Wesnoth</p>
<p>Supported by <a href="http://www.jexiste.fr/">Jexiste</a>.</p>
</div>
</div>
</div> <!-- main -->
</div> <!-- global -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1872754-3";
var tracker = _gat._getTracker(_uacct);
</script>
<script type="text/javascript">
urchinTracker();
</script>
</body>
</html>

View file

@ -1,86 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/xhtml; charset=utf-8" />
<link rel="shortcut icon" type="image/png" href="http://wesnoth.org/mw/skins/glamdrol/ico.png" />
<style type="text/css">@import url('http://wesnoth.org/mw/skins/glamdrol/main.css');</style>
<style type="text/css">@import url('http://wesnoth.org/mw/skins/glamdrol/home.css');</style>
<style type="text/css">
#feature #overview { background-image: url()!important; }
</style>
<title>Features - User Made Content Development IDE</title>
</head>
<body>
<div id="global">
<div id="header">
<div id="logo">
<a href="/"><img alt="Wesnoth logo" src="http://wesnoth.org/mw/skins/glamdrol/wesnoth-logo.jpg" /></a>
</div>
</div>
<div id="nav">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="download.html">Download</a></li>
<li><a href="features.html">Features</a></li>
<li><a href="http://wesnoth.org">Battle for Wesnoth</a></li>
</ul>
</div>
<div id="main">
<div id="feature">
<div id="border_left"><div id="border_right"><div id="border_bottom">
<div id="corner_bottomleft"><div id="corner_bottomright">
<div id="border_top"><div id="corner_topleft"><div id="corner_topright">
<div id="overview">
<h2>Features list</h2>
<ul>
<li><a>*</a> Coming soon... <br /></li>
</ul>
<h2>Demo videos</h2>
<ul>
<li><a>*</a> Coming soon... <br /></li>
</ul>
</div> <!-- overview -->
</div></div></div></div></div></div></div></div>
</div> <!-- feature -->
<div class="visualClear"></div>
<div id="footer">
<div id="note">
<p><a href="http://wiki.wesnoth.org/Site_Map">Site map</a></p>
<p><a href="http://wiki.wesnoth.org/Wesnoth:Copyrights">Copyright</a> &copy; 2003-2013 The Battle for Wesnoth</p>
<p>Supported by <a href="http://www.jexiste.fr/">Jexiste</a>.</p>
</div>
</div>
</div> <!-- main -->
</div> <!-- global -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1872754-3";
var tracker = _gat._getTracker(_uacct);
</script>
<script type="text/javascript">
urchinTracker();
</script>
</body>
</html>

View file

@ -1,101 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/xhtml; charset=utf-8" />
<link rel="shortcut icon" type="image/png" href="http://wesnoth.org/mw/skins/glamdrol/ico.png" />
<style type="text/css">@import url('http://wesnoth.org/mw/skins/glamdrol/main.css');</style>
<style type="text/css">@import url('http://wesnoth.org/mw/skins/glamdrol/home.css');</style>
<style type="text/css">
#feature #overview { background-image: url(http://wesnoth.org/mw/skins/glamdrol/home_portraits/sergeant.jpg)!important; }
</style>
<title> User Made Content Development IDE - Battle for Wesnoth</title>
</head>
<body>
<div id="global">
<div id="header">
<div id="logo">
<a href="/"><img alt="Wesnoth logo" src="http://wesnoth.org/mw/skins/glamdrol/wesnoth-logo.jpg" /></a>
</div>
</div>
<div id="nav">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="download.html">Download</a></li>
<li><a href="features.html">Features</a></li>
<li><a href="http://wesnoth.org">Battle for Wesnoth</a></li>
</ul>
</div>
<div id="main">
<div id="feature">
<div id="border_left"><div id="border_right"><div id="border_bottom">
<div id="corner_bottomleft"><div id="corner_bottomright">
<div id="border_top"><div id="corner_topleft"><div id="corner_topright">
<div id="overview">
<h2>The Battle for Wesnoth UMC Development IDE</h2>
<p>UMC IDE offers some features that greatly help anybody who makes User Made Content for Wesnoth.</p>
<ul>
<li><a>*</a> It has wizards for new campaigns, scenarios, factions, eras, and everything else you might think of. You just complete the needed values and it generates the wml (with nice indentation). <br /></li>
<li><a>*</a> It has front-ends for launching wmltools (like wmllint, wmlscope, wmlindent on files/directories), the wesnoth game, and the map editor. <br /></li>
<li><a>*</a> It has a specialized WML editor that has syntax highlighting, tag folding and outline, autocompletion, navigation to macro definitions and so on. <br /></li>
<li><a>*</a> It has integrated addon management features that allow to upload or download arbitrary addons. <br /></li>
<li>For a full features list please check the dedicated <a href="features.html">features page</a>.</li>
</ul>
<ul>
The plugin was made by Timotei Dolean and it is available under EPL License (<a href="http://www.eclipse.org/legal/epl-v10.html">EPL v 1.0</a>).
</ul>
</div> <!-- overview -->
</div></div></div></div></div></div></div></div>
<h3>News</h3>
<p><em>29 July 2012</em> - Released version 2.0.1 of the eclipse plugin version and the standalone version.</p>
<p><em>03 March 2012</em> - Released version 2.0.0 of the eclipse plugin version and the standalone version.</p>
<p><em>08 May 2011</em> - Released version 1.0.3 of the eclipse plugin version and the standalone version.</p>
<p><em>17 April 2011</em> - Released version 1.0.2 of the eclipse plugin version and the standalone version.</p>
<p><em>16 December 2010</em> - Released version 1.0.1 of the eclipse plugin version.</p>
<p><em>6 November 2010</em> - Added the 64 bit version for Windows &amp; Linux, and for Mac OS X.</p>
<p><em>5 November 2010</em> - The standalone plugin version is out! Check it out at the how to install section.</p>
</div> <!-- feature -->
<div class="visualClear"></div>
<div id="footer">
<div id="note">
<p><a href="http://wiki.wesnoth.org/Site_Map">Site map</a></p>
<p><a href="http://wiki.wesnoth.org/Wesnoth:Copyrights">Copyright</a> &copy; 2003-2013 The Battle for Wesnoth</p>
<p>Supported by <a href="http://www.jexiste.fr/">Jexiste</a>.</p>
</div>
</div>
</div> <!-- main -->
</div> <!-- global -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1872754-3";
var tracker = _gat._getTracker(_uacct);
</script>
<script type="text/javascript">
urchinTracker();
</script>
</body>
</html>

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show more