Jump to content

0ad Build Optimizer


causative
 Share

Recommended Posts

https://github.com/bparkis/0adbuildoptimizer

It's a simplified 0ad simulator where you tell it a build order and it instantly tells you when you're going to run out of pop or resources, or have an excess of resources. See the README. It will be a lot more useful to you if you happen to know Python.

I think the best explanation of how it works would be an example of what a build order looks like with this.

# set up the map. addForest(10, 0, 5000) means there is a forest at coordinate (10, 0) - which is 10 seconds of walk time away from the CC - with 5000 wood available.
# 5000 is around the amount of wood you would chop before you would need a second storehouse.
addForest(10, 0, 5000)
addForest(11, 0, 5000)
addForest(12, 0, 5000)
addForest(13, 0, 5000)
addForest(14, 0, 5000)
addForest(15, 0, 5000)
addBerries(-5, 0, 1000)
addChicken(0, 0, 400)

setCiv("Mauryas")
setSummaryPeriod(1) # show a summary every 1 second
debugEnd() # always throw an exception when we finish, to allow pdb debugging of the detailed state. e.g. with python3 -m pdb boom.py builds/maurya1.txt

# This will report the first time when wood went over 300
# and stayed that way until the end. Useful for deciding when we are
# able to build stuff without interfering with any other production.
reportSurplus(0, 300, 0, 0)


# men chop with elephant dropsite, women make berries farmstead, horse on chickens, elephant makes a house at wood
chop(selectWorkers("male"))
build(selectWorkers("female"), "farmstead", pos=(-5, 0))
walk(selectWorkers("elephant"), (10,0)) # walk ele to forest
chicken(selectWorkers("horse"))
berries(selectWorkers("female"), queued=True)

# The elephant's house is queued meaning it will happen after the
# elephant walks to the wood. A non-queued order will just
# replace any existing orders.
build(selectWorkers("elephant"), "house", queued=True, pos=(10,0))

# train 4 initial women at the CC
train(cc, "female", 4)

# train batches at the CC that are "maximum batches," as much as food and pop allows, up to a batch of 5
# Do this "repeating," i.e. repeatedly make batches until the order is canceled
# also queue it behind the previous train command
train(cc, "female", 5, queued=True, repeating=True, maxBatching=True)

# Set a schedule for what the women will do after being produced.
# Women produced from the CC will go to berries between population 11 and 12.
# between population 13 and 27, they will chop wood.
# between population 28 and 41, they will build farms and start farming
# between population 42 and 46, they will be idle (we'll give them orders then)
# after population 47 they will chop wood.
setWaypointSchedule(cc, [(11, ((-5, 0), "berries")), (13, ((10, 0), "chop")), (28, (None, "farm")), (42, (None, "idle")), (47, (None, "chop"))])

# wait until 28 seconds into the game, because now the farmstead is done and we can research the berry upgrade
time 00:28
research(selectBuilding("farmstead"), "up_gather")

# At 0:44 the elephant has made his first house
# and at 0:46 we have just enough wood to start a second
time 00:46
build(selectWorkers("elephant"), "house")

# at 1:17 the elephant is done with the second house.  There's not
# enough room for the elephant to make more than two houses while
# still being a wood dropsite and leaving enough space for the
# elephant to get out, so we'll take a man off of woodcutting.  The
# man will make unlimited houses as a repeating order. (All of these
# houses will be at 10, 1)
time 01:17
build(selectWorkers("male", num=1), "house", pos=(10, 1), repeating=True)
# also queue up an order for berries women to go onto farms
farm(selectWorkers("female", "berries"), queued=True)

# at 3:23 we have 500 spare wood. We'll transfer 5 women off of wood
# and onto farms, in preparation for the first barracks.
time 03:23
farm(selectWorkers("female", "chop", num=5))

time 03:28
# These are two women just produced from the CC
build(selectWorkers("female", "idle"), "barracks", (3, 3))

time 03:49
# four more women just produced from the CC to help build houses and the barracks
build(selectWorkers("female", "idle", num=1), "house", (10, 1), repeating=True)
build(selectWorkers("female", "idle"), "barracks", (3, 3))

time 03:53
research(selectBuilding("farmstead"), "up_farm1")

time 04:35
# barracks is done
# we need another house builder. She can help the male housebuilder at (10, 1)
farm(selectWorkers("female", "idle", num=5))
chop(selectWorkers("female", "idle"))
train(selectBuilding("barracks"), "male", 1, repeating=True)
setWaypoint(selectBuilding("barracks"), (10, 0), "chop")

time 05:47
# enough wood for another barracks
build(selectWorkers("female", "chop", num=5), "barracks", (3, 4))
farm(previousWorkerSelection(), queued=True)

time 06:05
build(selectWorkers("female", "chop", num=5), "barracks", (4, 4))
farm(previousWorkerSelection(), queued=True)

time 06:38
# barracks done
# selectBuilding will get us the idle barracks preferentially
setWaypoint(selectBuilding("barracks"), (10, 0), "chop")
train(selectBuilding("barracks"), "male", 1, repeating=True)

time 06:56
setWaypoint(selectBuilding("barracks"), (10, 0), "chop")
train(selectBuilding("barracks"), "male", 1, repeating=True)

time 06:36
# We've made 67 women. That's probably enough. Switching to men from the cc.
train(cc, "male", 1, repeating=True)

time 07:09
# forest dead, move on.
build(selectWorkers("male female", "chop"), "storehouse", pos=(11, 0), queued=True)
chop(selectWorkers("male female", "chop"), pos=(11, 0), queued=True)
chop(selectWorkers("male", "walk"), pos=(11, 0), queued=True)
setWaypoint(selectBuilding("barracks", index=1), (11, 0), "chop")
setWaypoint(selectBuilding("barracks", index=2), (11, 0), "chop")
setWaypoint(selectBuilding("barracks", index=3), (11, 0), "chop")
setWaypoint(cc, (11, 0), "chop")

time 07:27
build(selectWorkers("female", "chop", num=1), "house", (10, 1), repeating=True)

time 08:00
build(selectWorkers("female", "chop", num=5), "barracks", (5, 5))
farm(previousWorkerSelection(), queued=True)
build(selectWorkers("male", "chop", num=5), "storehouse", (12, 0))
chop(previousWorkerSelection(), pos=(12,0), queued=True)

time 08:31
build(selectWorkers("female", "chop", num=5), "barracks", (5, 5))
farm(previousWorkerSelection(), queued=True)
build(selectWorkers("male", "chop", num=1), "house", (10, 1), repeating=True)
research(selectBuilding("storehouse"), "up_chop1")

time 08:51
setWaypoint(selectBuilding("barracks"), (12, 0), "chop")
train(selectBuilding("barracks"), "male", 1, repeating=True)

time 09:02
build(selectWorkers("female", "chop", num=5), "barracks", (5, 5))
farm(previousWorkerSelection(), queued=True)

time 09:17
build(selectWorkers("female", "chop", num=5), "barracks", (6, 6))
farm(previousWorkerSelection(), queued=True)
build(selectWorkers("female", "chop", num=1), "house", (10, 1), repeating=True)
farm(selectWorkers("female", "chop", num=5))

time 09:36
chop(selectWorkers("male female", "chop"), pos=(12, 0), queued=True)
chop(selectWorkers("male", "walk"), pos=(12, 0), queued=True)
setWaypoint(selectBuilding("barracks", index=1), (12, 0), "chop")
setWaypoint(selectBuilding("barracks", index=2), (12, 0), "chop")
setWaypoint(selectBuilding("barracks", index=3), (12, 0), "chop")
setWaypoint(cc, (12, 0), "chop")

time 09:40
build(selectWorkers("female", "chop", num=5), "barracks", (7, 7))
farm(previousWorkerSelection(), queued=True)
setWaypoint(selectBuilding("barracks"), (13, 0), "chop")
build(selectWorkers("male", "chop", num=1), "storehouse", pos=(13,0))
chop(previousWorkerSelection(), queued=True)
train(selectBuilding("barracks"), "male", 1, repeating=True)

time 09:46
setWaypoint(selectBuilding("barracks"), (13, 0), "chop")
train(selectBuilding("barracks"), "male", 1, repeating=True)

time 09:54
build(selectWorkers("female", "chop", num=5), "barracks", (8, 8))
farm(previousWorkerSelection(), queued=True)
setWaypoint(selectBuilding("barracks"), (13, 0), "chop")
train(selectBuilding("barracks"), "male", 1, repeating=True)

time 10:10
build(selectWorkers("female", "chop", num=5), "barracks", (9, 9))
farm(previousWorkerSelection(), queued=True)
setWaypoint(selectBuilding("barracks"), (13, 0), "chop")
train(selectBuilding("barracks"), "male", 1, repeating=True)
build(selectWorkers("male", "chop", num=3), "house", (10, 2), repeating=True)

time 10:15
build(selectWorkers("female", "chop", num=5), "barracks", (9, 9))
farm(previousWorkerSelection(), queued=True)

time 10:31
setWaypoint(selectBuilding("barracks"), (13, 0), "chop")
train(selectBuilding("barracks"), "male", 1, repeating=True)

build(selectWorkers("female", "chop", num=5), "barracks", (10, 10))
farm(previousWorkerSelection(), queued=True)

time 12:00

 

Edited by causative
  • Like 3
Link to comment
Share on other sites

Just now, causative said:

s a simplified 0ad simulator where you tell it a build order and it instantly tells you when you're going to run out of pop or resources, or have an excess of resources. See the README. It will be a lot more useful to you if you happen to know Python.

Do you think you can add a feature to analyse replays and point out improvements at each turn?

  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...