mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-17 05:44:08 -07:00
81 lines
4.5 KiB
Python
Executable file
81 lines
4.5 KiB
Python
Executable file
import xml.etree.ElementTree as ET
|
|
import os
|
|
|
|
# This script creates the RM demo map "Balance Test" with units defined as such:
|
|
|
|
Civs = ["rome","pers"]
|
|
|
|
if len (Civs) != 2:
|
|
sys.exit("You should only input two civilizations to compare")
|
|
|
|
CivBuildings = ["civil_centre", "barracks","gymnasion", "stables", "elephant_stables", "fortress", "embassy_celtic", "embassy_italiote", "embassy_iberian"]
|
|
#CivBuildings = ["civil_centre", "barracks"]
|
|
|
|
# Remote Civ templates with those strings in their name.
|
|
FilterOut = ["hero", "mecha", "support"]
|
|
|
|
|
|
############################################################
|
|
# Load Civ specific templates
|
|
# Will be loaded by loading buildings, and templates will be set the Civ building, the Civ and in general.
|
|
# Allows to avoid special units.
|
|
CivData = {};
|
|
|
|
os.chdir(os.path.realpath(__file__).replace("CreateRMTest.py","") + "../../../binaries/data/mods/public/simulation/templates/")
|
|
|
|
for Civ in Civs:
|
|
CivData[Civ] = {}
|
|
for building in CivBuildings:
|
|
bdTemplate = "./structures/" + Civ + "_" + building + ".xml"
|
|
TrainableUnits = []
|
|
if (os.path.isfile(bdTemplate)):
|
|
Template = ET.parse(bdTemplate)
|
|
if (Template.find("./ProductionQueue/Entities") != None):
|
|
TrainableUnits = Template.find("./ProductionQueue/Entities").text.replace(" ","").replace("\t","").split("\n")
|
|
# We have the templates this building can train.
|
|
for UnitFile in TrainableUnits:
|
|
breakIt = False
|
|
for filter in FilterOut:
|
|
if UnitFile.find(filter) != -1: breakIt = True
|
|
if breakIt: continue
|
|
|
|
if (os.path.isfile(UnitFile + ".xml")):
|
|
if UnitFile not in CivData[Civ]:
|
|
CivData[Civ][UnitFile] = UnitFile
|
|
|
|
print (CivData[Civs[0]])
|
|
|
|
basePath = os.path.realpath(__file__).replace("CreateRMTest.py","") + "../../maps/random/"
|
|
|
|
f = open(basePath + 'demo_testBalance.js', 'w')
|
|
|
|
f.write("RMS.LoadLibrary(\"rmgen\");\n\nlog(\"Initializing map...\");\n\nInitMap();\n\nvar fx = fractionToTiles(0.5);\nvar fz = fractionToTiles(0.5);\n\nplaceObject(fractionToTiles(0.4), fz, \"special/trigger_point_A\", 0, 0);\n\nplaceObject(fractionToTiles(0.6), fz, \"special/trigger_point_B\", 0, 0);\n\nplaceObject(fx, fz, \"special/trigger_point_C\", 0, 0);\n\n// Export map data\nExportMap();\n")
|
|
|
|
f = open(basePath + 'demo_testBalance.json', 'w')
|
|
|
|
f.write("{\n \"settings\" : {\n \"Name\" : \"Balance Demo\",\n \"Script\" : \"demo_testBalance.js\",\n \"Description\" : \"Test the unit Balance in a trigger map. Change the triggers to change the units created.\",\n \"BaseTerrain\" : [\"medit_sea_depths\"],\n \"BaseHeight\" : 30,\n \"CircularMap\" : true,\n \"Keywords\": [\"demo\"],\n \"TriggerScripts\": [\n \"scripts/TriggerHelper.js\",\n \"random/demo_testBalance_triggers.js\"\n ],\n \"XXXXXX\" : \"Optionally define other things here, like we would for a scenario\"\n }\n}\n")
|
|
|
|
f = open(basePath + 'demo_testBalance_triggers.js', 'w')
|
|
|
|
f.write("Trigger.prototype.StartAWave = function()\n{\n var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);\n var attackerEntity = [")
|
|
|
|
start = True
|
|
for Unit in CivData[Civs[0]]:
|
|
if start == False:
|
|
f.write( ",")
|
|
if start == True:
|
|
start = False
|
|
f.write("\"" + Unit + "\"")
|
|
|
|
f.write("];\n var defenderEntity = [")
|
|
|
|
start = True
|
|
for Unit in CivData[Civs[1]]:
|
|
if start == False:
|
|
f.write( ",")
|
|
if start == True:
|
|
start = False
|
|
f.write("\"" + Unit + "\"")
|
|
|
|
f.write("];\n var count = 75;\n\n var pos = Engine.QueryInterface(this.GetTriggerPoints(\"C\")[0], IID_Position).GetPosition();\n\n var cmd = {\"x\" : pos.x, \"z\" : pos.z};\n cmd.type = \"attack-walk\";\n cmd.queued = true;\n cmd.entities = [];\n\n // spawn attackers\n for (var o = 0; o < count; ++o)\n {\n var rand = Math.floor(Math.random() * attackerEntity.length);\n if (rand == attackerEntity.length) rand = attackerEntity - 1;\n var attackers = TriggerHelper.SpawnUnitsFromTriggerPoints(\"A\", attackerEntity[rand], 1, 1);\n for each (var i in attackers)\n cmd.entities.push(i[0]);\n ProcessCommand(1, cmd);\n }\n\n cmd.entities = [];\n for (var o = 0; o < count; ++o)\n {\n var rand = Math.floor(Math.random() * defenderEntity.length);\n if (rand == defenderEntity.length) rand = attackerEntity - 1;\n var defenders = TriggerHelper.SpawnUnitsFromTriggerPoints(\"B\", defenderEntity[rand], 1, 2);\n for each (var i in defenders)\n cmd.entities.push(i[0]);\n ProcessCommand(2, cmd);\n }\n\n cmpTrigger.DoAfterDelay(180000, \"StartAnEnemyWave\", {}); // The next wave will come in 2 minutes\n}\n\nTrigger.prototype.InitGame = function()\n{\n}\n\nvar cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);\ncmpTrigger.DoAfterDelay(0, \"StartAWave\", {});\n")
|
|
|