Categories and/or tags
-
@redrum said in Categories and/or tags:
*Notice that you can have an empty element (under Players in this case) which means that any attachment option will be skipped
I don't understand.
-
@Cernel So here is the variable definition with an empty second element:
<variable name="Players"> <element name="Germany"/> <element name=""/> </variable>This is then used in the template further down in this line:
<option name="canBeGivenByTerritoryTo" value="$Players$"/>And ends up generating the germanInfantry attachment with this:
<option name="canBeGivenByTerritoryTo" value="Germany"/>And the russianInfantry attachment skips that option.
-
Here is another
foreachexample to generate multiple similar triggers:Variables
<variableList> <variable name="Players"> <element name="Germany"/> <element name="Brazil"/> </variable> <variable name="Phases"> <element name="germanyBattle"/> <element name="brazilBattle"/> </variable> </variableList>Trigger Template
<attachment foreach="$Players$:$Phases$" name="triggerAttachmentLiberationUsaBy@Players@" attachTo="@Players@" javaClass="games.strategy.triplea.attachments.TriggerAttachment" type="player"> <option name="conditions" value="conditionAttachmentWashingtonlost:conditionAttachmentChicagolost"/> <option name="when" value="after:@Phases@"/> <option name="players" value="Usa"/> <option name="playerAttachmentName" value="RulesAttachment" count="conditionAttachmentLiberationUsa"/> <option name="playerProperty" value="switch" count="true"/> </attachment>Generated Triggers
<attachment name="triggerAttachmentLiberationUsaByGermany" attachTo="Germany" javaClass="games.strategy.triplea.attachments.TriggerAttachment" type="player"> <option name="conditions" value="conditionAttachmentWashingtonlost:conditionAttachmentChicagolost"/> <option name="when" value="after:germanyBattle"/> <option name="players" value="Usa"/> <option name="playerAttachmentName" value="RulesAttachment" count="conditionAttachmentLiberationUsa"/> <option name="playerProperty" value="switch" count="true"/> </attachment> <attachment name="triggerAttachmentLiberationUsaByBrazil" attachTo="Brazil" javaClass="games.strategy.triplea.attachments.TriggerAttachment" type="player"> <option name="conditions" value="conditionAttachmentWashingtonlost:conditionAttachmentChicagolost"/> <option name="when" value="after:brazilBattle"/> <option name="players" value="Usa"/> <option name="playerAttachmentName" value="RulesAttachment" count="conditionAttachmentLiberationUsa"/> <option name="playerProperty" value="switch" count="true"/> </attachment> -
I hope that the basic features of this feature request will be implemented in a way that will not require the mapmaker to understand or use these new and more advanced possibilities. I don't understand anything you presented in your last couple of posts @redrum.
-
@Frostion These are optional advanced XML features and don't at all need to be used (and have no impact on existing maps). They are really just providing a way to have a "find and replace" type XML feature and an "attachment template to generate multiple similar attachments". They are provided to map makers to minimize copy and paste if they want. These can be very useful to maps like TWW which have lots of repetitive XML around unit attachments, conditions, and triggers that are hard to make updates to.
-
@redrum I'm sure once a full example is provided it will be similar to learning anything else in an XML.
-
@Frostion Here is an example of how you could use this feature in the Iron War XML if you wanted. There are player attachments for retainCapital parameters for all regular players which are almost all the same.
Here is what you have now:
<attachment name="playerAttachment" attachTo="Germany" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="Balkan" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="USSR" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="Finland" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="France" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="French-Colonies" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="Britain" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="British-Colonies" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="Italy" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="South-Africa" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="British-India" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="Iraq" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="Iran" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="ANZAC" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="KNIL" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="Japan" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="Thailand" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="USA" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="China" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> <attachment name="playerAttachment" attachTo="Brazil" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment>If you ever wanted to say change the capital rules and instead make all players require 1 instead of 0 capitals then you'd have to update each of these attachments 1 by 1 (very unlikely that you'd want to change that but just using this as an example since these player attachments are almost all the same). The only difference between each of these attachments is that player its attachTo as each player needs one.
You could instead use this new feature to make this a bit shorter by defining a variable for the list of players that need this attachment (all of them in this case). And a kind of 'template' for the attachment that will insert the list of players into it to generate the original attachments above. This would allow you to only have to update the capital requirements for all players in one attachment rather than having 20 separate ones.
First, I define a variable named "AllPlayers" and assign a list of players to that (all of the regular ones in this case that I want to specify capital rules for). Then I create an attachment "template" where the "foreach" attribute uses this variable "AllPlayers" to indicate what players to generate a PlayerAttachment based on the template for. For each player in the variable list, it creates an attachment and inserts the "player" into the attachTo field as it specifies $AllPlayers$. This ends up generating the exact same attachments that you have in the above XML.
Here is what it would look like:
<variableList> <variable name="AllPlayers"> <element name="Germany"/> <element name="Balkan"/> <element name="Finland"/> <element name="USSR"/> <element name="Britain"/> <element name="France"/> <element name="British-Colonies"/> <element name="South-Africa"/> <element name="Italy"/> <element name="Iraq"/> <element name="Iran"/> <element name="British-India"/> <element name="French-Colonies"/> <element name="ANZAC"/> <element name="KNIL"/> <element name="Japan"/> <element name="Thailand"/> <element name="USA"/> <element name="China"/> <element name="Brazil"/> </variable> </variableList><attachment foreach="$AllPlayers$" name="playerAttachment" attachTo="@AllPlayers@" javaClass="games.strategy.triplea.attachments.PlayerAttachment" type="player"> <option name="retainCapitalProduceNumber" value="0"/> <option name="retainCapitalNumber" value="0"/> </attachment> -
@redrum
I can see a lot of uses for this. I do have one question. In you example for the unitAttachment, under the "Players" variable, the last element was left blank so that when creating the attachment that value would be left out. This I understand, but what would happen if the blank value was not there?In my map 'Invasion USA' there are 30 Victory Cities, with 'Denver' being the only city with both 'city' and 'mountain' effects. So if I created a list 'AllCities':
<variableList> <variable name="AllCities"> <element name="Denver"/> <element name="Washington D.C."/> <element name="New York"/> <element name="Boston"/> <element name="Philadelphia"/> <element name="Buffalo"/> <element name="Pittsburgh"/> <element name="San Diego"/> <element name="Memphis"/> <element name="Indianapolis"/> <element name="New Orleans"/> <element name="Los Angeles"/> <element name="Milwaukee"/> <element name="Detroit"/> <element name="Houston"/> <element name="Chicago"/> <element name="San Francisco"/> <element name="Portland"/> <element name="Tampa"/> <element name="Kansas City"/> <element name="St. Louis"/> <element name="Salt Lake City"/> <element name="Seattle"/> <element name="San Antonio"/> <element name="Dallas"/> <element name="Phoenix"/> <element name="Minneapolis"/> <element name="Atlanta"/> <element name="Miami"/> <element name="Cleveland"/> </variable>And the add another list for territoryEffect:
<variable name="MountainOnly"> <element name="mountain"/> </variable> </variableList>And the for my territoryAttachments I used:
<attachment foreach="AllCities:MountainOnly" name="territoryAttachment" attachTo="$AllCities$" javaClass="games.strategy.triplea.attachments.TerritoryAttachment" type="territory"> <option name="production" value="6"/> <option name="unitProduction" value="2"/> <option name="resources" value="1:VCs"/> <option name="territoryEffect" value="city"/> <option name="territoryEffect" value="$MountainOnly$"/> <option name="capital" value="Americans"/> </attachment>Would it create the following attachments?
<attachment name="territoryAttachment" attachTo="Denver" javaClass="games.strategy.triplea.attachments.TerritoryAttachment" type="territory"> <option name="production" value="6"/> <option name="unitProduction" value="2"/> <option name="resources" value="1:VCs"/> <option name="territoryEffect" value="city"/> <option name="territoryEffect" value="mountain"/> <option name="capital" value="Americans"/> </attachment> <attachment name="territoryAttachment" attachTo="Washington D.C." javaClass="games.strategy.triplea.attachments.TerritoryAttachment" type="territory"> <option name="production" value="6"/> <option name="unitProduction" value="2"/> <option name="resources" value="1:VCs"/> <option name="territoryEffect" value="city"/> <option name="capital" value="Americans"/> </attachment>Or would I have to add the 29 extra blank elements?
Cheers...
-
@wc_sumpton Right now I'm enforcing that all variables used in the same foreach must be the same length. For this particular example, I would just define Denver separately if its the only 1 like that otherwise you would need to add 29 empty elements. Here is what I would probably do:
<variable name="AllCities"> <element name="Washington D.C."/> <element name="New York"/> <element name="Boston"/> <element name="Philadelphia"/> <element name="Buffalo"/> <element name="Pittsburgh"/> <element name="San Diego"/> <element name="Memphis"/> <element name="Indianapolis"/> <element name="New Orleans"/> <element name="Los Angeles"/> <element name="Milwaukee"/> <element name="Detroit"/> <element name="Houston"/> <element name="Chicago"/> <element name="San Francisco"/> <element name="Portland"/> <element name="Tampa"/> <element name="Kansas City"/> <element name="St. Louis"/> <element name="Salt Lake City"/> <element name="Seattle"/> <element name="San Antonio"/> <element name="Dallas"/> <element name="Phoenix"/> <element name="Minneapolis"/> <element name="Atlanta"/> <element name="Miami"/> <element name="Cleveland"/> </variable><attachment foreach="$AllCities$" name="territoryAttachment" attachTo="@AllCities@" javaClass="games.strategy.triplea.attachments.TerritoryAttachment" type="territory"> <option name="production" value="6"/> <option name="unitProduction" value="2"/> <option name="resources" value="1:VCs"/> <option name="territoryEffect" value="city"/> <option name="capital" value="Americans"/> </attachment><attachment name="territoryAttachment" attachTo="Denver" javaClass="games.strategy.triplea.attachments.TerritoryAttachment" type="territory"> <option name="production" value="6"/> <option name="unitProduction" value="2"/> <option name="resources" value="1:VCs"/> <option name="territoryEffect" value="city"/> <option name="territoryEffect" value="mountain"/> <option name="capital" value="Americans"/> </attachment> -
@redrum That edit was an important one.

-
@Hepps Yeah, misunderstood what he was trying to do the first read through.
-
@redrum
Got-ya! Thanks for the quick reply! Wondering when you plan to implement this. Would love to play around with some ideas!Cheers...
-
PR: https://github.com/triplea-game/triplea/pull/4791
As soon as that's merged, you can test it in the pre-release.
-
This is now available in the pre-release. I've updated the first post to reflect examples of how to use it and will be adding similar ones to POS2 XML.
-
@redrum I am looking forward to testing

Question: Can the names of the variableLists be used instead of unit listing in attachments like targetsAA, repairsUnits, unitType etc.? Like:
<option name="targetsAA" value="PlayerLandUnits:AILandUnits"/>
Or
<option name="repairsUnits" value="1:PlayerHeroUnits:PlayerMultipleHPUnits:Dragon"/> -
@Frostion Yes. Though I updated the original proposal slightly. Any time you reference a variable you need to put $variableName$. So for you example it would be like this:
<option name="targetsAA" value="$PlayerLandUnits$:$AILandUnits$"/>Here is an example I'm doing for some mystery map in development

<variable name="MajorPlayers"> <element name="Bolsheviks"/> <element name="France"/> <element name="Britain"/> <element name="Russia"/> <element name="Germany"/> <element name="Austria-Hungary"/> <element name="Ottomans"/> <element name="Usa"/> <element name="Italy"/> </variable><attachment name="unitAttachment" attachTo="RecruitmentCenter" javaClass="UnitAttachment" type="unitType"> <option name="movement" value="0"/> <option name="attack" value="0"/> <option name="defense" value="0"/> <option name="isInfrastructure" value="true"/> <option name="canBeDamaged" value="true"/> <option name="maxDamage" value="10"/> <option name="maxOperationalDamage" value="8"/> <option name="destroyedWhenCapturedBy" value="$MajorPlayers$"/> <option name="canDieFromReachingMaxDamage" value="true"/> <option name="isConstruction" value="true"/> <option name="constructionType" value="rcProduction"/> <option name="constructionsPerTerrPerTypePerTurn" value="1"/> <option name="maxConstructionsPerTypePerTerr" value="1"/> </attachment> -
@redrum
Been playing around with this on the 'Invasion U.S.A.' map.Real nice Job!!
Have you thought anymore on being able to do a 'foreach' inside a 'foreach'?
Cheers...
-
@wc_sumpton A little bit. Most likely it'll only allow 2 levels of foreach (any more than that is just generating probably more attachments then you should be). It'll look something like this:
<attachment foreach="$Players$^$Territories$"/>Where if I had say 5 players and 100 territories then this would loop over each of those to create 500 attachments, 1 for each pair of player and territory.
-
@redrum
Yep, have the players territories loop. Sounds good thanks for the quick answer!Cheers...
-
@redrum I have tried to implement this new feature but I cant get it to work. There are no errors but the rules that I set do not seem to be taken into account during play. This is the top code I have in the XML:
<?xml version="1.0"?> <!DOCTYPE game SYSTEM "game.dtd"> <game> <info name="World of War Heroes" version="0.0.1"/> <loader javaClass="games.strategy.triplea.TripleA"/> <triplea minimumVersion="1.9"/> <diceSides value="10"/> <variableList> <variable name="PlayerLandUnits"> <element name="Irregulars"/> <element name="Footmen"/> <element name="Pikemen"/> <element name="Bowmen"/> <element name="Crossbowmen"/> <element name="Cavalry"/> <element name="Ballista"/> <element name="Catapult"/> <element name="Trebuchet"/> <element name="Battering-Ram"/> <element name="Siege-Tower"/> <element name="Alliance-Footmen"/> <element name="High-Elves"/> <element name="Dryads"/> <element name="Horde-Footmen"/> <element name="Blood-Elves"/> <element name="Ogres"/> <element name="Ent"/> <element name="Bombard"/> <element name="Water-Elemental"/> <element name="Fire-Elemental"/> <element name="Earth-Elemental"/> <element name="Air-Elemental"/> <element name="Fel-Elemental"/> </variable> <variable name="PlayerSeaUnits"> <element name="Workboat"/> <element name="Troopship"/> <element name="Warship"/> <element name="The-Moonspray"/> </variable> <variable name="PlayerAirUnits"> <element name="Gryphon-Transport"/> </variable> <variable name="PlayerHeroUnits"> <element name="Arthur"/> <element name="Khorman"/> <element name="Marryk"/> <element name="Ayanna"/> <element name="Thrall"/> <element name="Gart"/> <element name="Sevis"/> <element name="Sian-tsu"/> </variable> <variable name="AILandUnits"> <element name="Outlaws"/> <element name="Worgen-Stalkers"/> <element name="Centaur-Outrunners"/> <element name="Defias-Thugs"/> <element name="Draenei-Mutants"/> <element name="Ettin-Giant"/> <element name="Fel-Beasts"/> <element name="Wraith"/> <element name="Gnoll-Brutes"/> <element name="Worgen-Raiders"/> <element name="Harpy-Witches"/> <element name="Kobold-Miners"/> <element name="Mad-Furbolgs"/> <element name="Murloc-Tiderunners"/> <element name="Naga-Warriors"/> <element name="Pirate-Goons"/> <element name="Pirate-Ship"/> <element name="Satyr-Minions"/> <element name="Oozes"/> <element name="Trogg-Savages"/> <element name="Enraged-Wildkin"/> <element name="Wretched-Monks"/> <element name="Zombie-Walkers"/> <element name="Red-Dragon"/> <element name="Blue-Dragon"/> <element name="Bronze-Dragon"/> </variable> <variable name="AISeaUnits"> <element name="Pirate-Ship"/> </variable> </variableList> <map> <territory name="Aboraz Beach" water="true"/> <territory name="Abyssal Sands"/> <territory name="Aerie Peak"/> <territory name="Agamagor"/>For example these two settings do not work while playing:
<attachment name="territoryEffectAttachment" attachTo="Mountains" javaClass="games.strategy.triplea.attachments.TerritoryEffectAttachment" type="territoryEffect"> <option name="noBlitz" value="$PlayerLandUnits$:$PlayerHeroUnits$:$AILandUnits$"/> </attachment> <attachment name="supportAttachmentGhost" attachTo="Wraith" javaClass="games.strategy.triplea.attachments.UnitSupportAttachment" type="unitType"><option name="faction" value="enemy"/> <option name="faction" value="enemy"/> <option name="side" value="offence:defence"/> <option name="dice" value="strength"/> <option name="bonus" value="-2"/> <option name="number" value="1"/> <option name="unitType" value="$PlayerLandUnits$:$PlayerAirUnits$:$PlayerHeroUnits$:$AILandUnits$"/> <option name="bonusType" value="Fear"/> </attachment>I am pretty sure all other variableList code does not work either. What am I doing wrong?
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login