mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
This explicitly uses UTF-8 encoding when reading or writing files with Python. This is necessary as the default locale varies between operating systems.
108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
import math
|
|
from os import path
|
|
|
|
import zero_ad
|
|
|
|
|
|
game = zero_ad.ZeroAD("http://localhost:6000")
|
|
scriptdir = path.dirname(path.realpath(__file__))
|
|
with open(path.join(scriptdir, "..", "samples", "arcadia.json"), encoding="utf-8") as f:
|
|
config = f.read()
|
|
|
|
|
|
def dist(p1, p2):
|
|
return math.sqrt(sum(math.pow(x2 - x1, 2) for (x1, x2) in zip(p1, p2)))
|
|
|
|
|
|
def center(units):
|
|
sum_position = map(sum, zip(*(u.position() for u in units)))
|
|
return [x / len(units) for x in sum_position]
|
|
|
|
|
|
def closest(units, position):
|
|
dists = (dist(unit.position(), position) for unit in units)
|
|
index = 0
|
|
min_dist = next(dists)
|
|
for i, d in enumerate(dists):
|
|
if d < min_dist:
|
|
index = i
|
|
min_dist = d
|
|
|
|
return units[index]
|
|
|
|
|
|
def test_construct():
|
|
state = game.reset(config)
|
|
female_citizens = state.units(owner=1, entity_type="female_citizen")
|
|
house_tpl = "structures/spart/house"
|
|
house_count = len(state.units(owner=1, entity_type=house_tpl))
|
|
x = 680
|
|
z = 640
|
|
build_house = zero_ad.actions.construct(female_citizens, house_tpl, x, z, autocontinue=True)
|
|
# Check that they start building the house
|
|
state = game.step([build_house])
|
|
while len(state.units(owner=1, entity_type=house_tpl)) == house_count:
|
|
state = game.step()
|
|
|
|
|
|
def test_gather():
|
|
state = game.reset(config)
|
|
female_citizen = state.units(owner=1, entity_type="female_citizen")[0]
|
|
state.units(owner=0, entity_type="tree")
|
|
nearby_tree = closest(state.units(owner=0, entity_type="tree"), female_citizen.position())
|
|
|
|
collect_wood = zero_ad.actions.gather([female_citizen], nearby_tree)
|
|
state = game.step([collect_wood])
|
|
while len(state.unit(female_citizen.id()).data["resourceCarrying"]) == 0:
|
|
state = game.step()
|
|
|
|
|
|
def test_train():
|
|
state = game.reset(config)
|
|
civic_centers = state.units(owner=1, entity_type="civil_centre")
|
|
spearman_type = "units/spart/infantry_spearman_b"
|
|
spearman_count = len(state.units(owner=1, entity_type=spearman_type))
|
|
train_spearmen = zero_ad.actions.train(civic_centers, spearman_type)
|
|
|
|
state = game.step([train_spearmen])
|
|
while len(state.units(owner=1, entity_type=spearman_type)) == spearman_count:
|
|
state = game.step()
|
|
|
|
|
|
def test_walk():
|
|
state = game.reset(config)
|
|
female_citizens = state.units(owner=1, entity_type="female_citizen")
|
|
x = 680
|
|
z = 640
|
|
initial_distance = dist(center(female_citizens), [x, z])
|
|
|
|
walk = zero_ad.actions.walk(female_citizens, x, z)
|
|
state = game.step([walk])
|
|
distance = initial_distance
|
|
while distance >= initial_distance:
|
|
state = game.step()
|
|
female_citizens = state.units(owner=1, entity_type="female_citizen")
|
|
distance = dist(center(female_citizens), [x, z])
|
|
|
|
|
|
def test_attack():
|
|
state = game.reset(config)
|
|
unit = state.units(owner=1, entity_type="cavalry")[0]
|
|
target = state.units(owner=2, entity_type="female_citizen")[0]
|
|
initial_health_target = target.health()
|
|
initial_health_unit = unit.health()
|
|
|
|
state = game.step([zero_ad.actions.reveal_map()])
|
|
|
|
attack = zero_ad.actions.attack([unit], target)
|
|
state = game.step([attack])
|
|
while (state.unit(target.id()).health() >= initial_health_target) and (
|
|
state.unit(unit.id()).health() >= initial_health_unit
|
|
):
|
|
state = game.step()
|
|
|
|
|
|
def test_chat():
|
|
game.reset(config)
|
|
chat = zero_ad.actions.chat("hello world!!")
|
|
game.step([chat])
|