diff --git a/40k/40k9e.manifest b/40k/40k9e.manifest new file mode 100644 index 0000000..a348c8e --- /dev/null +++ b/40k/40k9e.manifest @@ -0,0 +1,2344 @@ +{ + "name": "40k9e", + "game": "Warhammer 40,000", + "genre": "sci-fi", + "publisher": "Games Workshop", + "url": "https://warhammer40000.com/", + "notes": "This manifest is provided for the purposes of testing Rosterizer and is not intended for distribution.", + "manifest": { + "assetTaxonomy": { + "Detachment": { + "stats": { + "HQ": { + "statType": "numeric", + "value": null, + "icons": [ + "crowned-skull" + ], + "statOrder": 1, + "visibility": "active", + "tracked": true + }, + "Troops": { + "statType": "numeric", + "value": null, + "icons": [ + "triangle-target" + ], + "statOrder": 3, + "visibility": "active", + "tracked": true + }, + "Elites": { + "statType": "numeric", + "value": null, + "icons": [ + "pirate-flag" + ], + "statOrder": 5, + "visibility": "active", + "tracked": true + }, + "Dedicated Transport": { + "statType": "numeric", + "value": null, + "icons": [ + "arrow-dunk" + ], + "statOrder": 13, + "visibility": "active", + "tracked": true + }, + "Fast Attack": { + "statType": "numeric", + "value": null, + "icons": [ + "power-lightning" + ], + "statOrder": 7, + "visibility": "active", + "tracked": true + }, + "Heavy Support": { + "statType": "numeric", + "value": null, + "icons": [ + "mine-explosion" + ], + "statOrder": 9, + "visibility": "active", + "tracked": true + }, + "Flyer": { + "statType": "numeric", + "value": null, + "icons": [ + "bat-blade" + ], + "statOrder": 11, + "visibility": "active", + "tracked": true + }, + "Command Cost": { + "statType": "numeric", + "value": null, + "statOrder": -1, + "visibility": "always", + "tracked": true + } + }, + "rules": { + "1 Dedicated Transport allowed per INFANTRY": { + "evals": [], + "failState": "pass", + "evaluate": "OR", + "order": 5, + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Dedicated Transport", + "max" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "tally", + "INFANTRY" + ], + "iterations": 1 + } + ] + } + }, + "aspects": { + "Group Includes": true, + "Group Traits": true + }, + "allowed": { + "classifications": [ + "Unit" + ] + } + }, + "Unit": { + "stats": { + "Points": { + "value": 0, + "format": "{v}", + "group": "Cost", + "groupOrder": -1, + "tracked": true, + "statType": "numeric" + }, + "model": { + "value": null, + "statType": "term", + "visibility": "hidden" + }, + "Power Level": { + "statType": "numeric", + "format": "{v}", + "value": 0, + "group": "Cost", + "groupOrder": -1, + "visibility": "always", + "tracked": true + }, + "power1": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "power3": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "power2": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "power4": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "poweri": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "Crusade Pts": { + "statType": "numeric", + "value": 0, + "visibility": "normal", + "dynamic": true, + "tracked": false + }, + "Experience": { + "statType": "numeric", + "value": 0, + "visibility": "normal", + "dynamic": true, + "tracked": false + }, + "Marked for Greatness": { + "statType": "numeric", + "value": 0, + "visibility": "active", + "dynamic": true, + "tracked": false + } + }, + "keywords": { + "Tags": [ + "Unit" + ], + "Faction": [] + }, + "rules": { + "use points": { + "evals": [ + { + "paths": [ + [ + "{roster}", + "stats", + "Mode", + "value" + ] + ], + "value": "Points", + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "OR", + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Power Level", + "visibility" + ] + ], + "actionType": "set", + "value": "hidden", + "iterations": 1 + } + ] + }, + "use power level": { + "evals": [ + { + "paths": [ + [ + "{roster}", + "stats", + "Mode", + "value" + ] + ], + "value": "Power Level", + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "OR", + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Points", + "visibility" + ], + [ + "{self}", + "assets", + "classification", + "Model", + "stats", + "Points", + "visibility" + ] + ], + "actionType": "set", + "value": "hidden", + "iterations": 1 + } + ] + }, + "adjust power": { + "evals": [ + { + "paths": [ + [ + "{self}", + "tally", + "Model" + ] + ], + "min": [ + "{self}", + "stats", + "power1", + "value" + ], + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "tally", + "Model" + ] + ], + "min": [ + "{self}", + "stats", + "power2", + "value" + ], + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "tally", + "Model" + ] + ], + "min": [ + "{self}", + "stats", + "power3", + "value" + ], + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "tally", + "Model" + ] + ], + "min": [ + "{self}", + "stats", + "power4", + "value" + ], + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "rules", + "adjust power", + "evals", + "0", + "result", + "truthy" + ], + [ + "{self}", + "rules", + "adjust power", + "evals", + "1", + "result", + "truthy" + ], + [ + "{self}", + "rules", + "adjust power", + "evals", + "2", + "result", + "truthy" + ], + [ + "{self}", + "rules", + "adjust power", + "evals", + "3", + "result", + "truthy" + ] + ], + "operator": "SUM", + "not": false, + "actionable": false + } + ], + "failState": "pass", + "evaluate": "AND", + "order": 13, + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Power Level", + "value" + ] + ], + "actionType": "modify", + "value": [ + "{self}", + "stats", + "poweri", + "value" + ], + "iterations": [ + "{self}", + "rules", + "adjust power", + "evals", + "4", + "result", + "integer" + ] + } + ] + }, + "Incorrect number of models.": { + "evals": [ + { + "paths": [ + [ + "{self}", + "designation" + ] + ], + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "stats", + "model", + "value" + ] + ], + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "assets", + "item", + "{1string}", + "quantity" + ] + ], + "max": [ + "{self}", + "stats", + "{0string}", + "max" + ], + "min": [ + "{self}", + "stats", + "{0string}", + "min" + ], + "operator": "SUM", + "not": false + } + ], + "failState": "error", + "evaluate": "OR", + "order": 12 + }, + "automagical tracking bounds": { + "evals": [ + { + "paths": [ + [ + "{self}", + "designation" + ] + ], + "operator": "AND", + "not": false, + "note": "this is currently non-functional pending refactoring of findTargets" + }, + { + "paths": [ + [ + "{self}", + "stats", + "model", + "value" + ] + ], + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "assets", + "item", + "{1string}", + "designation" + ] + ], + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "OR", + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "{2string}", + "value" + ] + ], + "actionType": "set", + "value": 1000, + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "stats", + "{2string}", + "tracked" + ] + ], + "actionType": "set", + "value": true, + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "stats", + "{2string}", + "min" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "stats", + "{0string}", + "min" + ], + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "stats", + "{2string}", + "max" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "stats", + "{0string}", + "max" + ], + "iterations": 1 + } + ] + }, + "1 quantity per model": { + "evals": [ + { + "paths": [ + [ + "{self}", + "designation" + ] + ], + "operator": "AND", + "not": false, + "actionable": false, + "note": "Checking my name so i know the correct statName to look at for qty." + }, + { + "paths": [ + [ + "{self}", + "stats", + "model", + "value" + ] + ], + "operator": "AND", + "not": false, + "actionable": true, + "note": "Storing the itemKey of the model we want to track" + }, + { + "paths": [ + [ + "{self}", + "assets", + "item", + "{1string}", + "quantity" + ] + ], + "operator": "SUM", + "not": false, + "actionable": false, + "note": "Isolate quantity of modified models", + "equation": { + "operator": "T-O", + "value": [ + "{self}", + "traits", + "item", + "{1string}", + "quantity" + ] + } + }, + { + "paths": [ + [ + "{self}", + "stats", + "{0string}", + "value" + ] + ], + "operator": "AND", + "not": false, + "actionable": false, + "note": "Determine new qty of trait", + "equation": { + "operator": "T-O", + "value": [ + "{self}", + "rules", + "1 quantity per model", + "evals", + "2", + "result", + "integer" + ] + } + } + ], + "failState": "pass", + "evaluate": "OR", + "order": 11, + "actions": [ + { + "paths": [ + [ + "{self}", + "traits", + "item", + "{1string}", + "quantity" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "rules", + "1 quantity per model", + "evals", + "3", + "result", + "integer" + ], + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "allowed", + "items" + ] + ], + "actionType": "add", + "value": [ + "{self}", + "stats", + "model", + "value" + ], + "iterations": 1 + } + ] + }, + "warlordTrait": { + "evals": [ + { + "paths": [ + [ + "{self}", + "keywords", + "Keywords" + ] + ], + "value": "Character", + "contains": true, + "operator": "AND", + "not": false, + "actionable": true + } + ], + "failState": "pass", + "evaluate": "AND", + "actions": [ + { + "paths": [ + [ + "{self}", + "allowed", + "classifications" + ] + ], + "actionType": "add", + "value": "Warlord Trait", + "iterations": 1 + } + ] + }, + "Error in this Unit’s text": { + "evals": [ + { + "paths": [ + [ + "{self}", + "text" + ] + ], + "value": "ERROR", + "contains": true, + "operator": "AND", + "not": true, + "actionable": true + } + ], + "failState": "error", + "evaluate": "AND" + } + }, + "aspects": { + "Type": "game piece", + "Lock Qty": true, + "Rename": true + } + }, + "Statline": { + "stats": { + "A": { + "value": "0", + "statOrder": 7, + "group": "Stats", + "statType": "term", + "visibility": "always" + }, + "BS": { + "format": "{v}+", + "value": 0, + "statOrder": 3, + "group": "Stats", + "statType": "numeric", + "visibility": "always" + }, + "Ld": { + "value": 0, + "statOrder": 8, + "group": "Stats", + "statType": "numeric", + "visibility": "always" + }, + "S": { + "value": 0, + "statOrder": 4, + "group": "Stats", + "statType": "numeric", + "visibility": "always" + }, + "Sv": { + "format": "{v}+", + "value": 0, + "statOrder": 9, + "group": "Stats", + "statType": "numeric", + "visibility": "always" + }, + "T": { + "value": 0, + "statOrder": 5, + "group": "Stats", + "statType": "numeric", + "visibility": "always" + }, + "W": { + "value": 0, + "statOrder": 6, + "group": "Stats", + "statType": "numeric", + "visibility": "always" + }, + "WS": { + "format": "{v}+", + "value": 0, + "statOrder": 2, + "group": "Stats", + "statType": "numeric", + "visibility": "always" + }, + "Base": { + "statType": "term", + "value": null, + "visibility": "active" + }, + "M": { + "statType": "term", + "format": "{t}″", + "value": null, + "statOrder": 1, + "group": "Stats", + "visibility": "always" + } + }, + "rules": { + "remove tally": { + "evals": [ + { + "paths": [ + [ + "{self}", + "designation" + ] + ], + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "OR", + "order": 1, + "actions": [ + { + "paths": [ + [ + "{self}", + "tally", + "{0string}" + ] + ], + "actionType": "modify", + "value": -1, + "iterations": 1 + } + ] + } + } + }, + "Model": { + "stats": { + "Points": { + "value": null, + "format": "{v}", + "group": "Cost", + "groupOrder": -1, + "tracked": true, + "statType": "numeric" + }, + "A": { + "value": "0", + "statOrder": 7, + "group": "Stats", + "statType": "term", + "visibility": "normal" + }, + "BS": { + "format": "{v}+", + "value": 0, + "statOrder": 3, + "group": "Stats", + "statType": "numeric", + "visibility": "normal" + }, + "Ld": { + "value": 0, + "statOrder": 8, + "group": "Stats", + "statType": "numeric", + "visibility": "normal" + }, + "S": { + "value": 0, + "statOrder": 4, + "group": "Stats", + "statType": "numeric", + "visibility": "normal" + }, + "Sv": { + "format": "{v}+", + "value": 0, + "statOrder": 9, + "group": "Stats", + "statType": "numeric", + "visibility": "normal" + }, + "T": { + "value": 0, + "statOrder": 5, + "group": "Stats", + "statType": "numeric", + "visibility": "normal" + }, + "W": { + "value": 0, + "statOrder": 6, + "group": "Stats", + "statType": "numeric", + "visibility": "normal" + }, + "WS": { + "format": "{v}+", + "value": 0, + "statOrder": 2, + "group": "Stats", + "statType": "numeric", + "visibility": "normal" + }, + "Base": { + "statType": "term", + "value": null, + "visibility": "active" + }, + "M": { + "statType": "term", + "format": "{t}″", + "value": null, + "statOrder": 1, + "group": "Stats", + "visibility": "normal" + } + }, + "aspects": { + "Type": "game piece" + } + }, + "HQ": { + "templateClass": "Unit", + "text": "" + }, + "Troops": { + "templateClass": "Unit" + }, + "Elites": { + "templateClass": "Unit" + }, + "Fast Attack": { + "templateClass": "Unit" + }, + "Flyers": { + "templateClass": "Unit" + }, + "Heavy Support": { + "templateClass": "Unit" + }, + "Fortifications": { + "templateClass": "Unit" + }, + "Dedicated Transport": { + "templateClass": "Unit" + }, + "Lords of War": { + "templateClass": "Unit" + }, + "Weapon": { + "stats": { + "AP": { + "statOrder": 4, + "visibility": "always", + "statType": "term" + }, + "D": { + "statOrder": 5, + "visibility": "always", + "statType": "term" + }, + "Points": { + "value": null, + "format": "+{v}", + "group": "Cost", + "groupOrder": -1, + "tracked": true, + "statType": "numeric" + }, + "S": { + "value": null, + "statOrder": 3, + "visibility": "always", + "statType": "term" + }, + "Type": { + "value": null, + "statOrder": 2, + "visibility": "always", + "statType": "term" + }, + "Range": { + "statType": "numeric", + "statOrder": 1, + "visibility": "always" + } + }, + "aspects": { + "Visibility": "always" + } + }, + "Wargear": { + "stats": { + "keyword?": { + "statType": "rank", + "value": "0", + "ranks": { + "0": { + "order": 0 + }, + "1": { + "order": 1 + } + }, + "visibility": "hidden" + } + }, + "rules": { + "add keyword": { + "evals": [ + { + "paths": [ + [ + "{parent}", + "{parent}", + "keywords", + "General" + ] + ], + "value": [ + "{self}", + "designation" + ], + "contains": true, + "operator": "AND", + "not": true + }, + { + "paths": [ + [ + "{self}", + "stats", + "keyword?", + "value" + ] + ], + "value": "1", + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "AND", + "order": 12, + "actions": [ + { + "paths": [ + [ + "{parent}", + "{parent}", + "keywords", + "General" + ] + ], + "actionType": "add", + "value": [ + "{self}", + "designation" + ], + "iterations": 1 + } + ] + } + }, + "aspects": { + "Visibility": "always" + } + }, + "Ability": { + "aspects": { + "Visibility": "active" + }, + "rules": { + "Error in this Ability’s text": { + "evals": [ + { + "paths": [ + [ + "{self}", + "text" + ] + ], + "value": "ERROR", + "contains": true, + "operator": "AND", + "not": true, + "actionable": true + } + ], + "failState": "error", + "evaluate": "AND" + } + } + }, + "Order of Battle": { + "allowed": { + "classifications": [ + "Unit" + ] + }, + "aspects": { + "Group Includes": true + }, + "rules": { + "hide enclosed assets": { + "evals": [], + "failState": "pass", + "evaluate": "OR", + "actions": [ + { + "paths": [ + [ + "{self}", + "assets", + "templateClass", + "Unit", + "aspects", + "Visibility" + ] + ], + "actionType": "set", + "value": "active", + "iterations": 1 + } + ] + }, + "noPoints": { + "failState": "pass", + "evaluate": "AND", + "actions": [ + { + "paths": [ + [ + "{self}", + "tracked", + "Points" + ] + ], + "actionType": "set", + "value": 0, + "iterations": 1 + } + ] + }, + "supplyUsedLimit": { + "failState": "pass", + "evaluate": "AND", + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Power Level", + "max" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "stats", + "Supply Limit", + "value" + ], + "iterations": 1 + } + ] + } + }, + "stats": { + "Supply Limit": { + "statType": "numeric", + "increment": { + "value": 1 + }, + "value": 50, + "visibility": "normal", + "dynamic": true, + "tracked": false + }, + "Power Level": { + "statType": "numeric", + "label": "Supply Used", + "value": 0, + "visibility": "normal", + "dynamic": false, + "tracked": true + }, + "Battle Tally": { + "value": 0, + "statType": "numeric" + }, + "Battles Won": { + "value": 0, + "statType": "numeric" + }, + "Requisition Points": { + "value": 0, + "statType": "numeric" + } + } + }, + "Psychic Power": {}, + "Warlord Trait": { + "stats": { + "Discipline": { + "statType": "term", + "visibility": "active", + "dynamic": false, + "tracked": false + } + } + } + }, + "assetCatalog": { + "Detachment§Auxiliary Support Detachment": { + "stats": { + "Command Cost": { + "value": 2 + }, + "Unit": { + "value": 0, + "max": 1 + }, + "Hive Fleet": { + "value": "-" + } + } + }, + "Detachment§Battalion Detachment": { + "stats": { + "Command Cost": { + "value": 3 + }, + "Fast Attack": { + "value": 0, + "max": 2 + }, + "Heavy Support": { + "value": 0, + "max": 2 + }, + "Flyer": { + "value": 0, + "max": 2 + }, + "HQ": { + "value": 0, + "min": 2, + "max": 3 + }, + "Troops": { + "value": 0, + "min": 3, + "max": 6 + }, + "Elites": { + "value": 0, + "max": 6 + } + } + }, + "Detachment§Brigade Detachment": { + "stats": { + "Command Cost": { + "value": 4 + }, + "Flyer": { + "value": 0, + "max": 2 + }, + "HQ": { + "value": 0, + "min": 3, + "max": 5 + }, + "Troops": { + "value": 0, + "min": 6, + "max": 12 + }, + "Elites": { + "value": 0, + "min": 3, + "max": 8 + }, + "Fast Attack": { + "value": 0, + "min": 3, + "max": 5 + }, + "Heavy Support": { + "value": 0, + "min": 3, + "max": 5 + } + } + }, + "Detachment§Fortification Network": { + "stats": { + "Command Cost": { + "value": 1 + }, + "Fortification": { + "value": 0, + "min": 1, + "max": 3 + } + }, + "allowed": { + "classifications": [ + "Fortifications" + ] + }, + "rules": {} + }, + "Detachment§Outrider Detachment": { + "stats": { + "Command Cost": { + "value": 3 + }, + "HQ": { + "value": 0, + "min": 1, + "max": 2 + }, + "Flyer": { + "value": 0, + "max": 2 + }, + "Troops": { + "value": 0, + "max": 3 + }, + "Elites": { + "value": 0, + "max": 2 + }, + "Heavy Support": { + "value": 0, + "max": 2 + }, + "Fast Attack": { + "value": 0, + "min": 3, + "max": 6 + } + } + }, + "Detachment§Patrol Detachment": { + "stats": { + "Command Cost": { + "value": 2 + }, + "HQ": { + "value": 0, + "min": 1, + "max": 2 + }, + "Troops": { + "value": 0, + "min": 1, + "max": 3 + }, + "Elites": { + "value": 0, + "max": 2 + }, + "Fast Attack": { + "value": 0, + "max": 2 + }, + "Heavy Support": { + "value": 0, + "max": 2 + }, + "Flyer": { + "value": 0, + "max": 2 + } + } + }, + "Detachment§Spearhead Detachment": { + "stats": { + "Command Cost": { + "value": 3 + }, + "HQ": { + "value": 0, + "min": 1, + "max": 2 + }, + "Fast Attack": { + "value": 0, + "max": 2 + }, + "Flyer": { + "value": 0, + "max": 2 + }, + "Troops": { + "value": 0, + "max": 3 + }, + "Elites": { + "value": 0, + "max": 2 + }, + "Heavy Support": { + "value": 0, + "min": 3, + "max": 6 + } + } + }, + "Detachment§Super-Heavy Auxiliary Detachment": { + "stats": { + "Lord of War": { + "value": 0, + "min": 1, + "max": 1 + }, + "Command Cost": { + "value": 3 + } + }, + "allowed": { + "classifications": [ + "Lords of War" + ] + }, + "rules": {} + }, + "Detachment§Super-Heavy Detachment": { + "stats": { + "Command Cost": { + "statType": "rank", + "ranks": { + "3": { + "order": 0, + "number": 3 + }, + "6": { + "order": 1, + "number": 6 + } + }, + "dynamic": true, + "tracked": true, + "value": "3" + }, + "Lord of War": { + "value": 0, + "min": 3, + "max": 5 + } + }, + "allowed": { + "classifications": [ + "Lords of War" + ] + }, + "rules": { + "You can only take TITANIC units if the Command Cost is 6.": { + "evals": [ + { + "paths": [ + [ + "{self}", + "tally", + "TITANIC" + ] + ], + "min": 1, + "operator": "AND", + "not": false + }, + { + "paths": [ + [ + "{self}", + "stats", + "Command Cost", + "value" + ] + ], + "value": "3", + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "AND", + "order": 5 + } + } + }, + "Detachment§Supreme Command Detachment": { + "stats": { + "HQ": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "Troops": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "Elites": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "Fast Attack": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "Heavy Support": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "Flyer": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "Dedicated Transport": { + "statType": "numeric", + "value": null, + "visibility": "hidden" + }, + "Lord of War or HQ": { + "value": null, + "statType": "numeric", + "visibility": "active", + "tracked": true, + "min": 1, + "max": 1 + }, + "Command Cost": { + "statType": "numeric", + "value": null, + "tracked": true + } + }, + "allowed": { + "classifications": [ + "Lords of War", + "HQ" + ] + }, + "rules": { + "Lord of War or HQ counts": { + "evals": [], + "failState": "pass", + "evaluate": "OR", + "order": 5, + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Lord of War or HQ", + "value" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "tally", + "Unit" + ], + "iterations": 1 + } + ] + }, + "Command Cost refund": { + "evals": [ + { + "paths": [ + [ + "{self}", + "tally", + [ + "Patrol Detachment", + "Battalion Detachment", + "Brigade Detachment" + ] + ] + ], + "min": 1, + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "tally", + [ + "Patrol Detachment", + "Battalion Detachment", + "Brigade Detachment" + ] + ] + ], + "min": 1, + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "tally", + [ + "Battalion Detachment", + "Brigade Detachment" + ] + ] + ], + "min": 1, + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "tally", + "Brigade Detachment" + ] + ], + "min": 1, + "operator": "AND", + "not": false, + "actionable": false + }, + { + "paths": [ + [ + "{self}", + "rules", + "Command Cost refund", + "evals", + [ + "0", + "1", + "2", + "3" + ], + "result", + "truthy" + ] + ], + "max": -2, + "operator": "SUM", + "not": false, + "equation": { + "operator": "T*O", + "value": -1 + } + } + ], + "failState": "pass", + "evaluate": "OR", + "order": 5, + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Command Cost", + "value" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "rules", + "Command Cost refund", + "evals", + "4", + "result", + "integer" + ], + "iterations": 1 + } + ] + }, + "This detachment must contain your WARLORD": { + "evals": [ + { + "paths": [ + [ + "{self}", + "tally", + "WARLORD" + ] + ], + "min": 1, + "operator": "AND", + "not": false + } + ], + "failState": "error", + "evaluate": "OR", + "order": 5 + } + } + }, + "Detachment§Vanguard Detachment": { + "stats": { + "Command Cost": { + "value": 3, + "statType": "numeric", + "statOrder": -1, + "tracked": true + }, + "HQ": { + "statType": "numeric", + "value": null, + "statOrder": 1, + "visibility": "active", + "tracked": true, + "min": 1, + "max": 2 + }, + "Fast Attack": { + "statType": "numeric", + "value": null, + "statOrder": 7, + "visibility": "active", + "tracked": true, + "max": 2 + }, + "Heavy Support": { + "statType": "numeric", + "value": null, + "statOrder": 9, + "visibility": "active", + "tracked": true, + "max": 2 + }, + "Flyer": { + "statType": "numeric", + "value": null, + "statOrder": 11, + "visibility": "active", + "tracked": true, + "max": 2 + }, + "Troops": { + "value": null, + "statType": "numeric", + "statOrder": 3, + "visibility": "active", + "tracked": true, + "max": 3 + }, + "Elites": { + "value": null, + "statType": "numeric", + "statOrder": 5, + "visibility": "active", + "tracked": true, + "min": 3, + "max": 6 + } + } + }, + "Order of Battle§Order of Battle": {}, + "Roster§Army": { + "aspects": { + "Lock Qty": true, + "Unique": true, + "Describe": true, + "Rename": true, + "Type": "conceptual", + "Collapse": true + }, + "stats": { + "Detachment": { + "value": 0, + "label": "Detachments", + "statType": "numeric", + "tracked": true + }, + "Points": { + "value": 0, + "statType": "numeric", + "statOrder": -5, + "tracked": true + }, + "Power Level": { + "value": 0, + "statType": "numeric", + "statOrder": -6, + "tracked": true + }, + "Mode": { + "statType": "rank", + "value": "Points", + "ranks": { + "Points": { + "order": 0 + }, + "Power Level": { + "order": 1 + } + }, + "statOrder": 4, + "visibility": "active", + "dynamic": true + }, + "Battle Size": { + "statType": "rank", + "increment": {}, + "value": "Strike Force", + "ranks": { + "-": { + "order": 0, + "format": "-" + }, + "Combat Patrol": { + "order": 1, + "format": "Combat Patrol", + "tracking": { + "maxPowerLevel": 25, + "maxPoints": 500, + "maxDetachments": 2, + "startingCP": 999999, + "Auxiliary Support Detachment": 2 + } + }, + "Incursion": { + "order": 2, + "format": "Incursion", + "tracking": { + "maxPowerLevel": 50, + "maxPoints": 1000, + "maxDetachments": 2, + "startingCP": 6 + } + }, + "Strike Force": { + "order": 3, + "format": "Strike Force", + "tracking": { + "maxPowerLevel": 100, + "maxPoints": 2000, + "maxDetachments": 3, + "startingCP": 12 + } + }, + "Onslaught": { + "order": 4, + "format": "Onslaught", + "tracking": { + "maxPowerLevel": 150, + "maxPoints": 3000, + "maxDetachments": 4, + "startingCP": 18 + } + } + }, + "statOrder": 3, + "dynamic": true + }, + "Play": { + "statType": "rank", + "value": "Matched", + "ranks": { + "Open": { + "order": 0 + }, + "Matched": { + "order": 1 + }, + "Narrative": { + "order": 2 + } + }, + "statOrder": 4, + "visibility": "active", + "dynamic": true + }, + "Battle-forged": { + "statType": "rank", + "value": 0, + "ranks": { + "❌": { + "order": 0, + "icons": [ + "cancel" + ] + }, + "✅": { + "order": 1, + "icons": [ + "confirmed" + ] + } + } + }, + "Command Points": { + "statType": "numeric", + "value": 0, + "statOrder": -4, + "visibility": "hidden" + }, + "Warlord Trait": { + "statType": "numeric", + "value": 0, + "visibility": "hidden", + "dynamic": false, + "tracked": true, + "max": 1 + } + }, + "allowed": { + "classifications": [ + "Detachment" + ] + }, + "rules": { + "calculate command points": { + "evals": [ + { + "paths": [ + [ + "{self}", + "tracked", + "Command Cost" + ] + ], + "operator": "AND", + "not": false, + "actionable": false, + "equation": { + "operator": "T*O", + "value": -1 + } + }, + { + "paths": [ + [ + "{self}", + "stats", + "Battle Size", + "value" + ] + ], + "value": "-", + "operator": "AND", + "not": true + } + ], + "failState": "pass", + "evaluate": "OR", + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Command Points", + "value" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "tracked", + "startingCP" + ], + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "stats", + "Command Points", + "value" + ] + ], + "actionType": "modify", + "value": [ + "{self}", + "rules", + "calculate command points", + "evals", + "0", + "result", + "integer" + ], + "iterations": 1 + } + ] + }, + "set maxes": { + "evals": [], + "failState": "pass", + "evaluate": "OR", + "order": 1, + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Power Level", + "max" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "tracked", + "maxPowerLevel" + ], + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "stats", + "Points", + "max" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "tracked", + "maxPoints" + ], + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "stats", + "Detachment", + "max" + ] + ], + "actionType": "set", + "value": [ + "{self}", + "tracked", + "maxDetachments" + ], + "iterations": 1 + } + ] + }, + "use power level": { + "evals": [ + { + "paths": [ + [ + "{self}", + "stats", + "Mode", + "value" + ] + ], + "value": "Power Level", + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "OR", + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Points", + "visibility" + ] + ], + "actionType": "set", + "value": "hidden", + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "stats", + "Points", + "max" + ] + ], + "actionType": "set", + "value": null, + "iterations": 1 + } + ] + }, + "use points": { + "evals": [ + { + "paths": [ + [ + "{self}", + "stats", + "Mode", + "value" + ] + ], + "value": "Points", + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "OR", + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Power Level", + "visibility" + ] + ], + "actionType": "set", + "value": "hidden", + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "stats", + "Power Level", + "max" + ] + ], + "actionType": "set", + "value": null, + "iterations": 1 + } + ] + }, + "add order of battle": { + "evals": [ + { + "paths": [ + [ + "{self}", + "stats", + "Play", + "value" + ] + ], + "value": "Narrative", + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "OR", + "order": 1, + "actions": [ + { + "paths": [ + [ + "{self}", + "traits" + ] + ], + "actionType": "add", + "value": "Order of Battle§Order of Battle", + "iterations": 1 + } + ] + }, + "allow units for open": { + "evals": [ + { + "paths": [ + [ + "{self}", + "stats", + "Play", + "value" + ] + ], + "value": "Open", + "operator": "AND", + "not": false + } + ], + "failState": "pass", + "evaluate": "OR", + "order": 1, + "actions": [ + { + "paths": [ + [ + "{self}", + "allowed", + "classifications" + ] + ], + "actionType": "add", + "value": "Unit", + "iterations": 1 + } + ] + }, + "battle-forged": { + "evals": [ + { + "paths": [ + [ + "{self}", + "assets", + "templateClass", + "Unit", + "quantity" + ] + ], + "max": 0, + "operator": "SUM", + "not": false + } + ], + "failState": "pass", + "evaluate": "OR", + "actions": [ + { + "paths": [ + [ + "{self}", + "stats", + "Battle-forged", + "value" + ] + ], + "actionType": "set", + "value": "✅", + "iterations": 1 + }, + { + "paths": [ + [ + "{self}", + "stats", + "Command Points", + "visibility" + ] + ], + "actionType": "set", + "value": "normal", + "iterations": 1 + } + ] + } + } + }, + "Psychic Power§Smite": { + "text": "*Smite* has a warp charge value of 5. Add 1 to the warp charge value of this psychic power for each other attempt that has been made to *manifest* this power by a unit from your army in this phase, whether that attempt was successful or not. If manifested, the closest enemy unit within 18\" of and visible to the psyker suffers D3 *mortal wounds*. If the result of the *Psychic test* was 11 or more, that unit suffers D6 mortal wounds instead.\n\n**Warp Charge 5**: A Psychic test of 5+ is required to manifest *Smite*.\nWarp charge increases by 1 for each other attempt to manifest *Smite* made in this phase.\nIf manifested, closest visible enemy unit in 18\" suffers D3 mortal wounds.\nIf manifested with a Psychic test result of 11+, enemy instead suffers D6 mortal wounds." + } + }, + "gameModes": {}, + "theme": {} + }, + "revision": "0.1.1", + "dependencies": [], + "wip": true +} \ No newline at end of file diff --git a/40k/readme.md b/40k/readme.md new file mode 100644 index 0000000..db32599 --- /dev/null +++ b/40k/readme.md @@ -0,0 +1,3 @@ +# 40k! + +info about this manifest should go here \ No newline at end of file