Merge branch 'master' of github.com:wesnoth/wesnoth-old
This commit is contained in:
commit
e10ef1d98d
621 changed files with 553 additions and 159175 deletions
|
@ -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
|
||||
==========
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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 don’t 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]
|
||||
|
|
|
@ -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! I’m 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. I’ll take the army to Barag Gór. Catch up when you’re done."
|
||||
|
@ -389,6 +394,17 @@
|
|||
role=doggie
|
||||
message= _ "Sounds like fun. All right boys, let’s 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= _ "We’ve succeeded! We’ve 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= _ "We’ve succeeded! We’ve passed through the Mountains of Haag! Look at these green hills! We’ve 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= _ "We’ve succeeded! We’ve 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. I’m 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]
|
||||
|
|
|
@ -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= _ "That’s right! Now let’s 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 Kapou’e"
|
||||
[/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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -390,5 +390,5 @@
|
|||
[/move_unit_fake]
|
||||
[/event]
|
||||
|
||||
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
|
||||
{HERO_DEATHS}
|
||||
[/scenario]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -241,6 +241,6 @@
|
|||
[/endlevel]
|
||||
[/event]
|
||||
|
||||
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
|
||||
{HERO_DEATHS}
|
||||
{GENERALS_MUST_SURVIVE}
|
||||
[/scenario]
|
||||
|
|
|
@ -318,6 +318,6 @@
|
|||
[/endlevel]
|
||||
[/event]
|
||||
|
||||
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
|
||||
{HERO_DEATHS}
|
||||
{GENERALS_MUST_SURVIVE}
|
||||
[/scenario]
|
||||
|
|
|
@ -778,6 +778,6 @@
|
|||
[/endlevel]
|
||||
[/event]
|
||||
|
||||
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
|
||||
{HERO_DEATHS}
|
||||
{GENERALS_MUST_SURVIVE}
|
||||
[/scenario]
|
||||
|
|
|
@ -672,5 +672,5 @@
|
|||
# [/if]
|
||||
[/event]
|
||||
|
||||
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
|
||||
{HERO_DEATHS}
|
||||
[/scenario]
|
||||
|
|
|
@ -346,5 +346,5 @@
|
|||
[/endlevel]
|
||||
[/event]
|
||||
|
||||
{campaigns/Son_Of_The_Black_Eye/utils/deaths.cfg}
|
||||
{HERO_DEATHS}
|
||||
[/scenario]
|
||||
|
|
|
@ -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! I’m 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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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! I’m 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! I’m 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
|
||||
|
|
|
@ -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
|
||||
############################################################
|
||||
|
|
|
@ -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]
|
||||
)}
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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 */,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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);
|
||||
|
|
10
src/help.cpp
10
src/help.cpp
|
@ -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) ||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
1
website/eclipse.wesnoth.org/.gitignore
vendored
1
website/eclipse.wesnoth.org/.gitignore
vendored
|
@ -1 +0,0 @@
|
|||
.project
|
|
@ -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 & 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> © 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>
|
|
@ -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> © 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>
|
|
@ -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 & 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> © 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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue