mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
To improve quality und uniformity of the included Python code this lints and formats the included Python files with ruff.
106 lines
3.3 KiB
Python
106 lines
3.3 KiB
Python
import zero_ad
|
|
import math
|
|
from os import path
|
|
|
|
game = zero_ad.ZeroAD("http://localhost:6000")
|
|
scriptdir = path.dirname(path.realpath(__file__))
|
|
with open(path.join(scriptdir, "..", "samples", "arcadia.json"), "r") 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(*map(lambda u: u.position(), 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, type="female_citizen")
|
|
house_tpl = "structures/spart/house"
|
|
house_count = len(state.units(owner=1, 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, type=house_tpl)) == house_count:
|
|
state = game.step()
|
|
|
|
|
|
def test_gather():
|
|
state = game.reset(config)
|
|
female_citizen = state.units(owner=1, type="female_citizen")[0]
|
|
state.units(owner=0, type="tree")
|
|
nearby_tree = closest(state.units(owner=0, 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, type="civil_centre")
|
|
spearman_type = "units/spart/infantry_spearman_b"
|
|
spearman_count = len(state.units(owner=1, type=spearman_type))
|
|
train_spearmen = zero_ad.actions.train(civic_centers, spearman_type)
|
|
|
|
state = game.step([train_spearmen])
|
|
while len(state.units(owner=1, type=spearman_type)) == spearman_count:
|
|
state = game.step()
|
|
|
|
|
|
def test_walk():
|
|
state = game.reset(config)
|
|
female_citizens = state.units(owner=1, 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, type="female_citizen")
|
|
distance = dist(center(female_citizens), [x, z])
|
|
|
|
|
|
def test_attack():
|
|
state = game.reset(config)
|
|
unit = state.units(owner=1, type="cavalry")[0]
|
|
target = state.units(owner=2, 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])
|