Add research and finish most buildings

This commit is contained in:
Nate Bowman
2026-07-27 22:20:29 -04:00
parent 013468d34e
commit 9ff2613579
9 changed files with 688 additions and 45 deletions

View File

@@ -13,23 +13,119 @@ class Costs():
Ages.IMPERIAL: (1000, 0, 800, 0),
Buildings.HOUSE: (0, 25, 0, 0),
Buildings.LUMBERCAMP: (0, 100, 0, 0),
#Buildings.MULECART = (20, 80, 0, 0),
#Buildings.SETTLEMENT = (0, 125, 0, 0),
Buildings.MILL: (0, 100, 0, 0),
Buildings.FARM: (0, 60, 0, 0),
#Buildings.PASTURE = (0, 110, 0, 0),
Buildings.MININGCAMP: (0, 100, 0, 0),
Buildings.DOCK: (0, 150, 0, 0),
Buildings.BARRACKS: (0, 175, 0, 0),
Buildings.STABLE: (0, 175, 0, 0),
Buildings.ARCHERYRANGE: (0, 175, 0, 0),
Buildings.PALISADEWALL: (0, 3, 0, 0),
Buildings.PALISADEGATE: (0, 30, 0, 0),
Buildings.OUTPOST: (0, 25, 0, 5),
Buildings.TOWNCENTER: (0, 275, 0, 100),
Buildings.BLACKSMITH: (0, 200, 0, 0),
Buildings.WATCHTOWER: (0, 35, 0, 125),
Buildings.STONEWALL: (0, 0, 0, 5),
Buildings.GATE: (0, 25, 0, 0),
Buildings.DONJON: (0, 50, 0, 175),
Buildings.FISHTRAP: (0, 100, 0, 0),
Buildings.MARKET: (0, 175, 0, 0),
Buildings.ARCHERYRANGE: (0, 175, 0, 0),
Buildings.STABLE: (0, 175, 0, 0),
Buildings.UNIVERSITY: (0, 200, 0, 0),
#Buildings.CARAVANSERAI: (0, 175, 0, 50),
Buildings.SIEGEWORKSHOP: (0, 200, 0, 0),
Buildings.MONASTERY: (0, 175, 0, 0),
#Buildings.FORTIFIEDCHURCH: (0, 200, 0, 0),
Buildings.CASTLE: (0, 0, 0, 650),
#Buildings.KREPOST: (0, 0, 0, 350),
#Buildings.DONJON: (0, 50, 0, 175),
#Buildings.HARBOR: (0, 150, 0, 0),
#Buildings.FEITORIA: (0, 0, 350, 300),
Buildings.BOMBARDTOWER: (0, 0, 100, 125),
Buildings.WONDER: (0, 1000, 1000, 1000),
Research.TOWNWATCH: (75, 0, 0, 0),
Research.TOWNPATROL: (300, 0, 100, 0),
Research.TREADMILLCRANE: (0, 200, 0, 50),
Research.MASONRY: (150, 175, 0, 0),
Research.ARCHITECTURE: (300, 200, 0, 0),
Research.HOARDINGS: (400, 400, 0, 0),
Research.CONSCRIPTION: (150, 0, 150, 0),
Research.WHEELBARROW: (175, 50, 0, 0),
Research.HANDCART: (300, 200, 0, 0),
Research.DOUBLEBITAXE: (100, 50, 0, 0),
Research.BOWSAW: (150, 100, 0, 0),
Research.TWOMANSAW: (300, 200, 0, 0),
Research.HORSECOLLAR: (75, 75, 0, 0),
Research.HEAVYPLOW: (125, 125, 0, 0),
Research.CROPROTATION: (250, 250, 0, 0),
Research.GOLDMINING: (100, 75, 0, 0),
Research.GOLDSHAFTMINING: (175, 75, 0, 0),
Research.STONEMINING: (100, 75, 0, 0),
Research.STONESHAFTMINING: (175, 75, 0, 0),
Research.CARAVAN: (200, 0, 200, 0),
Research.COINAGE: (200, 0, 100, 0),
Research.BANKING: (300, 0, 200, 0),
Research.GUILDS: (300, 0, 200, 0),
Research.FISHINGLINES: (50, 100, 0, 0),
Research.GILLNETS: (150, 200, 0, 0),
Research.DOMESTICATION: (50, 100, 0, 0),
Research.PASTORALISM: (100, 150, 0, 0),
Research.TRANSHUMANCE: (175, 325, 0, 0),
Research.REDEMPTION: (0, 0, 475, 0),
Research.ATONEMENT: (0, 0, 325, 0),
Research.HERBALMEDICINE: (0, 0, 200, 0),
Research.HERESY: (0, 0, 1000, 0),
Research.SANCTITY: (0, 0, 175, 0),
Research.FERVOR: (0, 0, 140, 0),
Research.DEVOTION: (100, 0, 200, 0),
Research.FAITH: (550, 0, 750, 0),
Research.ILLUMINATION: (0, 0, 120, 0),
Research.BLOCKPRINTING: (0, 0, 200, 0),
Research.THEOCRACY: (0, 0, 200, 0),
Research.ARSON: (75, 0, 25, 0),
Research.GAMBESONS: (100, 0, 100, 0),
Research.SQUIRES: (100, 0, 0, 0),
Research.FORGING: (150, 0, 0, 0),
Research.IRONCASTING: (220, 0, 120, 0),
Research.BLASTFURNACE: (275, 0, 225, 0),
Research.SCALEMAILARMOR: (100, 0, 0, 0),
Research.CHAINMAILARMOR: (200, 0, 100, 0),
Research.PLATEMAILARMOR: (300, 0, 150, 0),
Research.THUMBRING: (300, 250, 0, 0),
Research.PARTHIANTACTICS: (200, 0, 250, 0),
Research.FLETCHING: (100, 0, 50, 0),
Research.BODKINARROW: (200, 0, 100, 0),
Research.BRACER: (300, 0, 200, 0),
Research.PADDEDARCHERARMOR: (100, 0, 0, 0),
Research.LEATHERARCHERARMOR: (150, 0, 150, 0),
Research.RINGARCHERARMOR: (250, 0, 250, 0),
Research.BALLISTICS: (0, 300, 175, 0),
Research.HEATEDSHOT: (350, 0, 100, 0),
Research.MURDERHOLES: (200, 0, 0, 100),
Research.ARROWSLITS: (250, 250, 0, 0),
Research.CHEMISTRY: (300, 0, 200, 0),
Research.SIEGEENGINEERS: (500, 600, 0, 0),
Research.BLOODLINES: (150, 0, 100, 0),
Research.HUSBANDRY: (150, 0, 0, 0),
Research.FORGING: (150, 0, 0, 0),
Research.IRONCASTING: (220, 0, 120, 0),
Research.BLASTFURNACE: (275, 0, 225, 0),
Research.SCALEBARDINGARMOR: (150, 0, 0, 0),
Research.CHAINBARDINGARMOR: (250, 0, 150, 0),
Research.PLATEBARDINGARMOR: (350, 0, 200, 0),
Research.CAREENING: (100, 0, 200, 0),
Research.DRYDOCK: (200, 0, 400, 0),
Research.SHIPWRIGHT: (1000, 0, 300, 0),
Research.CLINKERCONSTRUCTION: (150, 100, 0, 0),
Research.CARVELHULL: (350, 0, 200, 0),
Research.SIPHONS: (100, 175, 0, 0),
Research.INCENDIARIES: (200, 0, 325, 0),
Research.LOOM: (0, 0, 50, 0),
Research.SAPPERS: (400, 200, 0, 0),
#Research.SPIES: (0, 0, 0, 0),
Research.BOMBARDTOWER: (800, 400, 0, 0),
Units.VILLAGER: (50, 0, 0, 0),
Units.TRADECART: (0, 100, 50, 0),
Units.SPEARMAN: (35, 25, 0, 0),
@@ -39,8 +135,3 @@ class Costs():
Units.SKIRMISHER: (25, 35, 0, 0),
Units.ARCHER: (0, 25, 45, 0),
}
#def update_research(self, research):
#case research:
#match Bowsaw:

View File

@@ -7,23 +7,38 @@ class BuildingDependencies():
self.dependencies = {
Buildings.HOUSE: [Ages.DARK],
Buildings.LUMBERCAMP: [Ages.DARK],
#Buildings.MULECART: [Ages.DARK],
#Buildings.SETTLEMENT: [Ages.DARK],
Buildings.MILL: [Ages.DARK],
Buildings.FARM: [Ages.DARK, Buildings.MILL],
#Buildings.PASTURE: [Ages.DARK],
Buildings.MININGCAMP: [Ages.DARK],
Buildings.DOCK: [Ages.DARK],
Buildings.BARRACKS: [Ages.DARK],
Buildings.ARCHERYRANGE: [Ages.FEUDAL, Buildings.BARRACKS],
Buildings.STABLE: [Ages.FEUDAL, Buildings.BARRACKS],
Buildings.PALISADEWALL: [Ages.DARK],
Buildings.PALISADEGATE: [Ages.DARK],
Buildings.OUTPOST: [Ages.DARK],
Buildings.TOWNCENTER: [Ages.DARK],
Buildings.BLACKSMITH: [Ages.FEUDAL],
Buildings.WATCHTOWER: [Ages.FEUDAL],
Buildings.STONEWALL: [Ages.FEUDAL],
Buildings.GATE: [Ages.FEUDAL],
Buildings.DONJON: [Ages.FEUDAL],
Buildings.FISHTRAP: [Ages.FEUDAL],
Buildings.MARKET: [Ages.FEUDAL, Buildings.MILL],
Buildings.ARCHERYRANGE: [Ages.FEUDAL, Buildings.BARRACKS],
Buildings.STABLE: [Ages.FEUDAL, Buildings.BARRACKS],
Buildings.UNIVERSITY: [Ages.CASTLE],
#Buildings.CARAVANSERAI: [Ages.IMPERIAL],
Buildings.SIEGEWORKSHOP: [Ages.CASTLE, Buildings.BLACKSMITH],
Buildings.MONASTERY: [Ages.CASTLE],
#Buildings.FORTIFIEDCHURCH: [Ages.CASTLE],
Buildings.CASTLE: [Ages.CASTLE],
#Buildings.KREPOST: [Ages.CASTLE],
#Buildings.DONJON: [Ages.DARK],
#Buildings.HARBOR: [Ages.CASTLE, Research.THALASSOCRACY],
#Buildings.FEITORIA: [Ages.IMPERIAL],
Buildings.BOMBARDTOWER: [Ages.IMPERIAL, Research.BOMBARDTOWER],
Buildings.WONDER: [Ages.IMPERIAL],
}
@@ -68,16 +83,160 @@ class AgeDependencies():
class ResearchDependencies():
def __init__(self):
self.dependencies = {
Research.DOUBLEBITAXE: [Ages.FEUDAL, Buildings.LUMBERCAMP],
Research.BOWSAW: [Ages.CASTLE, Buildings.LUMBERCAMP, Research.DOUBLEBITAXE],
Research.TWOMANSAW: [Ages.IMPERIAL, Buildings.LUMBERCAMP, Research.BOWSAW],
Research.HORSECOLLAR: [Ages.FEUDAL, Buildings.MILL],
Research.HEAVYPLOW: [Ages.CASTLE, Buildings.MILL, Research.HORSECOLLAR],
Research.CROPCYCLE: [Ages.IMPERIAL, Buildings.MILL, Research.HEAVYPLOW],
Research.GOLDMINING: [Ages.FEUDAL, Buildings.MININGCAMP],
Research.GOLDSHAFTMINING: [Ages.CASTLE, Buildings.MININGCAMP, Research.GOLDMINING],
Research.STONEMINING: [Ages.FEUDAL, Buildings.MININGCAMP],
Research.STONESHAFTMINING: [Ages.CASTLE, Buildings.MININGCAMP, Research.STONEMINING],
Research.TOWNWATCH: [Ages.FEUDAL,
Buildings.TOWNCENTER],
Research.TOWNPATROL: [Ages.CASTLE,
Buildings.TOWNCENTER],
Research.TREADMILLCRANE: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.MASONRY: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.ARCHITECTURE: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.HOARDINGS: [Ages.IMPERIAL,
Buildings.CASTLE],
Research.CONSCRIPTION: [Ages.IMPERIAL,
Buildings.CASTLE],
Research.WHEELBARROW: [Ages.FEUDAL,
Buildings.TOWNCENTER],
Research.HANDCART: [Ages.CASTLE,
Buildings.TOWNCENTER],
Research.DOUBLEBITAXE: [Ages.FEUDAL,
Buildings.LUMBERCAMP],
Research.BOWSAW: [Ages.CASTLE,
Buildings.LUMBERCAMP],
Research.TWOMANSAW: [Ages.IMPERIAL,
Buildings.LUMBERCAMP],
Research.HORSECOLLAR: [Ages.FEUDAL,
Buildings.MILL],
Research.HEAVYPLOW: [Ages.CASTLE,
Buildings.MILL],
Research.CROPROTATION: [Ages.IMPERIAL,
Buildings.MILL],
Research.GOLDMINING: [Ages.FEUDAL,
Buildings.MININGCAMP],
Research.GOLDSHAFTMINING: [Ages.CASTLE,
Buildings.MININGCAMP],
Research.STONEMINING: [Ages.FEUDAL,
Buildings.MININGCAMP],
Research.STONESHAFTMINING: [Ages.CASTLE,
Buildings.MININGCAMP],
Research.CARAVAN: [Ages.CASTLE,
Buildings.MARKET],
Research.COINAGE: [Ages.CASTLE,
Buildings.MARKET],
Research.BANKING: [Ages.IMPERIAL,
Buildings.MARKET],
Research.GUILDS: [Ages.IMPERIAL,
Buildings.MARKET],
Research.FISHINGLINES: [Ages.FEUDAL,
Buildings.DOCK],
Research.GILLNETS: [Ages.CASTLE,
Buildings.DOCK],
Research.DOMESTICATION: [Ages.FEUDAL,
Buildings.MILL],
Research.PASTORALISM: [Ages.CASTLE,
Buildings.MILL],
Research.TRANSHUMANCE: [Ages.IMPERIAL,
Buildings.MILL],
Research.REDEMPTION: [Ages.CASTLE,
Buildings.MONASTERY],
Research.ATONEMENT: [Ages.CASTLE,
Buildings.MONASTERY],
Research.HERBALMEDICINE: [Ages.CASTLE,
Buildings.MONASTERY],
Research.HERESY: [Ages.CASTLE,
Buildings.MONASTERY],
Research.SANCTITY: [Ages.CASTLE,
Buildings.MONASTERY],
Research.FERVOR: [Ages.CASTLE,
Buildings.MONASTERY],
Research.DEVOTION: [Ages.CASTLE,
Buildings.MONASTERY],
Research.FAITH: [Ages.IMPERIAL,
Buildings.MONASTERY],
Research.ILLUMINATION: [Ages.IMPERIAL,
Buildings.MONASTERY],
Research.BLOCKPRINTING: [Ages.IMPERIAL,
Buildings.MONASTERY],
Research.THEOCRACY: [Ages.IMPERIAL,
Buildings.MONASTERY],
Research.ARSON: [Ages.FEUDAL,
Buildings.BARRACKS],
Research.GAMBESONS: [Ages.CASTLE,
Buildings.BARRACKS],
Research.SQUIRES: [Ages.CASTLE,
Buildings.BARRACKS],
Research.FORGING: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.IRONCASTING: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.BLASTFURNACE: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.SCALEMAILARMOR: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.CHAINMAILARMOR: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.PLATEMAILARMOR: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.THUMBRING: [Ages.CASTLE,
Buildings.ARCHERYRANGE],
Research.PARTHIANTACTICS: [Ages.IMPERIAL,
Buildings.ARCHERYRANGE],
Research.FLETCHING: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.BODKINARROW: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.BRACER: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.PADDEDARCHERARMOR: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.LEATHERARCHERARMOR: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.RINGARCHERARMOR: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.BALLISTICS: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.HEATEDSHOT: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.MURDERHOLES: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.ARROWSLITS: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.CHEMISTRY: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.SIEGEENGINEERS: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.BLOODLINES: [Ages.FEUDAL,
Buildings.STABLE],
Research.HUSBANDRY: [Ages.CASTLE,
Buildings.STABLE],
Research.SCALEBARDINGARMOR: [Ages.FEUDAL,
Buildings.BLACKSMITH],
Research.CHAINBARDINGARMOR: [Ages.CASTLE,
Buildings.BLACKSMITH],
Research.PLATEBARDINGARMOR: [Ages.IMPERIAL,
Buildings.BLACKSMITH],
Research.CAREENING: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.DRYDOCK: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.SHIPWRIGHT: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.CLINKERCONSTRUCTION: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.CARVELHULL: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.SIPHONS: [Ages.CASTLE,
Buildings.UNIVERSITY],
Research.INCENDIARIES: [Ages.IMPERIAL,
Buildings.UNIVERSITY],
Research.LOOM: [Buildings.TOWNCENTER],
Research.SAPPERS: [Ages.IMPERIAL,
Buildings.CASTLE],
Research.BOMBARDTOWER: [Ages.IMPERIAL,
Buildings.UNIVERSITY,
Research.CHEMISTRY],
}

View File

@@ -37,6 +37,12 @@ class Gameplay():
villagers_to,)))
def queue_research(self, action_time, research):
self._check_time(action_time)
self.actions[action_time].append((self.world.queue_research,
(research,)))
def queue_villager(self, action_time, initial_task):
self._check_time(action_time)
self.actions[action_time].append((self.world.queue_villager,

View File

@@ -16,4 +16,81 @@ class Production():
Units.KNIGHT: Buildings.STABLE,
Units.SKIRMISHER: Buildings.ARCHERYRANGE,
Units.ARCHER: Buildings.ARCHERYRANGE,
Research.TOWNWATCH: Buildings.TOWNCENTER,
Research.TOWNPATROL: Buildings.TOWNCENTER,
Research.TREADMILLCRANE: Buildings.UNIVERSITY,
Research.MASONRY: Buildings.UNIVERSITY,
Research.ARCHITECTURE: Buildings.UNIVERSITY,
Research.HOARDINGS: Buildings.CASTLE,
Research.CONSCRIPTION: Buildings.CASTLE,
Research.WHEELBARROW: Buildings.TOWNCENTER,
Research.HANDCART: Buildings.TOWNCENTER,
Research.DOUBLEBITAXE: Buildings.LUMBERCAMP,
Research.BOWSAW: Buildings.LUMBERCAMP,
Research.TWOMANSAW: Buildings.LUMBERCAMP,
Research.HORSECOLLAR: Buildings.MILL,
Research.HEAVYPLOW: Buildings.MILL,
Research.CROPROTATION: Buildings.MILL,
Research.GOLDMINING: Buildings.MININGCAMP,
Research.GOLDSHAFTMINING: Buildings.MININGCAMP,
Research.STONEMINING: Buildings.MININGCAMP,
Research.STONESHAFTMINING: Buildings.MININGCAMP,
Research.CARAVAN: Buildings.MARKET,
Research.COINAGE: Buildings.MARKET,
Research.BANKING: Buildings.MARKET,
Research.GUILDS: Buildings.MARKET,
Research.FISHINGLINES: Buildings.DOCK,
Research.GILLNETS: Buildings.DOCK,
Research.DOMESTICATION: Buildings.MILL,
Research.PASTORALISM: Buildings.MILL,
Research.TRANSHUMANCE: Buildings.MILL,
Research.REDEMPTION: Buildings.MONASTERY,
Research.ATONEMENT: Buildings.MONASTERY,
Research.HERBALMEDICINE: Buildings.MONASTERY,
Research.HERESY: Buildings.MONASTERY,
Research.SANCTITY: Buildings.MONASTERY,
Research.FERVOR: Buildings.MONASTERY,
Research.DEVOTION: Buildings.MONASTERY,
Research.FAITH: Buildings.MONASTERY,
Research.ILLUMINATION: Buildings.MONASTERY,
Research.BLOCKPRINTING: Buildings.MONASTERY,
Research.THEOCRACY: Buildings.MONASTERY,
Research.ARSON: Buildings.BARRACKS,
Research.GAMBESONS: Buildings.BARRACKS,
Research.SQUIRES: Buildings.BARRACKS,
Research.FORGING: Buildings.BLACKSMITH,
Research.IRONCASTING: Buildings.BLACKSMITH,
Research.BLASTFURNACE: Buildings.BLACKSMITH,
Research.SCALEMAILARMOR: Buildings.BLACKSMITH,
Research.CHAINMAILARMOR: Buildings.BLACKSMITH,
Research.PLATEMAILARMOR: Buildings.BLACKSMITH,
Research.THUMBRING: Buildings.ARCHERYRANGE,
Research.PARTHIANTACTICS: Buildings.ARCHERYRANGE,
Research.FLETCHING: Buildings.BLACKSMITH,
Research.BODKINARROW: Buildings.BLACKSMITH,
Research.BRACER: Buildings.BLACKSMITH,
Research.PADDEDARCHERARMOR: Buildings.BLACKSMITH,
Research.LEATHERARCHERARMOR: Buildings.BLACKSMITH,
Research.RINGARCHERARMOR: Buildings.BLACKSMITH,
Research.BALLISTICS: Buildings.UNIVERSITY,
Research.HEATEDSHOT: Buildings.UNIVERSITY,
Research.MURDERHOLES: Buildings.UNIVERSITY,
Research.ARROWSLITS: Buildings.UNIVERSITY,
Research.CHEMISTRY: Buildings.UNIVERSITY,
Research.SIEGEENGINEERS: Buildings.UNIVERSITY,
Research.BLOODLINES: Buildings.STABLE,
Research.HUSBANDRY: Buildings.STABLE,
Research.SCALEBARDINGARMOR: Buildings.BLACKSMITH,
Research.CHAINBARDINGARMOR: Buildings.BLACKSMITH,
Research.PLATEBARDINGARMOR: Buildings.BLACKSMITH,
Research.CAREENING: Buildings.UNIVERSITY,
Research.DRYDOCK: Buildings.UNIVERSITY,
Research.SHIPWRIGHT: Buildings.UNIVERSITY,
Research.CLINKERCONSTRUCTION: Buildings.UNIVERSITY,
Research.CARVELHULL: Buildings.UNIVERSITY,
Research.SIPHONS: Buildings.UNIVERSITY,
Research.INCENDIARIES: Buildings.UNIVERSITY,
Research.LOOM: Buildings.TOWNCENTER,
Research.SAPPERS: Buildings.CASTLE,
Research.BOMBARDTOWER: Buildings.UNIVERSITY,
}

95
aoe/research.py Normal file
View File

@@ -0,0 +1,95 @@
from aoe.types import *
class ResearchEffects():
# This assumes that the research effects will be the same for every civ.
# If not, we could make a separate function for each research that has an
# effect (e.g., def doublebitaxe(self, world)) and call the correct
# function from complete_research. That, along with instantiating the
# class, would allow modification of the relevant functions as necessary.
@classmethod
def complete_research(cls, world, research):
match research:
case Research.TREADMILLCRANE:
# TODO adjust times for all in-progress buildings
# Wouldn't be particularly hard, but I don't actually know
# how the effect is applied to in-progress buildings.
for item, time in enumerate(world.times.build_times):
new_time = 0.8*world.times.build_times[item]
world.times.build_times[item] = new_time
case Research.CONSCRIPTION:
# TODO adjust times for all in-progress units
# Wouldn't be particularly hard, but I don't actually know
# how the effect is applied to in-progress units.
# Note that this research also affects speed of research in
# those buildings (not just speed of unit production)
affected = [Buildings.ARCHERYRANGE,
Buildings.BARRACKS,
Buildings.STABLE,
Buildings.CASTLE,
#Buildings.DONJON,
]
for item, building in enumerate(world.production.building):
if building in affected:
new_time = 0.67*world.times.build_times[item]
world.times.build_times[item] = new_time
case Research.WHEELBARROW:
cls._modify_rates_with_wheelbarrow_line(world, 1.1, 1.11)
case Research.HANDCART:
cls._modify_rates_with_wheelbarrow_line(world, 1.1, 1.11)
case Research.DOUBLEBITAXE:
world._permanently_modify_gather_rate(Tasks.WOOD, 1.2)
case Research.BOWSAW:
world._permanently_modify_gather_rate(Tasks.WOOD, 1.2)
case Research.TWOMANSAW:
world._permanently_modify_gather_rate(Tasks.WOOD, 1.1)
case Research.HORSECOLLAR:
world._permanently_modify_farm_capacity(75)
case Research.HEAVYPLOW:
world._permanently_modify_farm_capacity(125)
case Research.CROPROTATION:
world._permanently_modify_farm_capacity(175)
case Research.GOLDMINING:
world._permanently_modify_gather_rate(Tasks.GOLD, 1.15)
case Research.GOLDSHAFTMINING:
world._permanently_modify_gather_rate(Tasks.GOLD, 1.15)
case Research.STONEMINING:
world._permanently_modify_gather_rate(Tasks.STONE, 1.15)
case Research.STONESHAFTMINING:
world._permanently_modify_gather_rate(Tasks.STONE, 1.15)
case Research.CARAVAN:
world._permanently_modify_gather_rate(Tasks.TRADECART, 1.20)
world._permanently_modify_gather_rate(Tasks.TRADECOG, 1.20)
#case Research.FISHINGLINES:
# probably looks like wheelbarrow
#case Research.GILLNETS:
# probably looks like wheelbarrow
#case Research.DOMESTICATION:
#case Research.PASTORALISM:
#case Research.TRANSHUMANCE:
#case Research.SHIPWRIGHT:
# do this one when you add ships
# just modify costs and times data structures
case _:
pass
@staticmethod
def _modify_rates_with_wheelbarrow_line(world, nonfarm_rate, farm_rate):
affected = [Tasks.BERRIES,
Tasks.SHEEP,
Tasks.BOAR,
Tasks.HUNT,
Tasks.FISH_VILLAGER,
Tasks.WOOD,
Tasks.GOLD,
Tasks.STONE]
for task in affected:
world._permanently_modify_gather_rate(task, non_farm_rate)
world._permanently_modify_gather_rate(Tasks.FARM, farm_rate)

View File

@@ -12,23 +12,115 @@ class Times():
Ages.IMPERIAL: 190,
Buildings.HOUSE: 25,
Buildings.LUMBERCAMP: 35,
#Buildings.MULECART = auto()
#Buildings.SETTLEMENT = auto()
Buildings.MILL: 35,
Buildings.FARM: 15,
#Buildings.PASTURE = auto()
Buildings.MININGCAMP: 35,
Buildings.DOCK: 35,
Buildings.BARRACKS: 50,
Buildings.STABLE: 50,
Buildings.ARCHERYRANGE: 50,
Buildings.PALISADEWALL: 7,
Buildings.PALISADEGATE: 30,
Buildings.OUTPOST: 15,
Buildings.TOWNCENTER: 150,
Buildings.BLACKSMITH: 40,
Buildings.WATCHTOWER: 80,
Buildings.STONEWALL: 10,
Buildings.GATE: 70,
Buildings.DONJON: 83,
Buildings.FISHTRAP: 40,
Buildings.MARKET: 60,
Buildings.ARCHERYRANGE: 50,
Buildings.STABLE: 50,
Buildings.UNIVERSITY: 60,
#Buildings.CARAVANSERAI: 60,
Buildings.SIEGEWORKSHOP: 40,
Buildings.MONASTERY: 40,
#Buildings.FORTIFIEDCHURCH: 40,
Buildings.CASTLE: 200,
Buildings.KREPOST: 150,
#Buildings.DONJON: 83,
#Buildings.HARBOR: 35,
#Buildings.FEITORIA: 120,
Buildings.BOMBARDTOWER: 80,
Buildings.WONDER: 3500,
Research.TOWNWATCH: 25,
Research.TOWNPATROL: 40,
Research.TREADMILLCRANE: 20,
Research.MASONRY: 50,
Research.ARCHITECTURE: 70,
Research.HOARDINGS: 75,
Research.CONSCRIPTION: 60,
Research.WHEELBARROW: 75,
Research.HANDCART: 55,
Research.DOUBLEBITAXE: 25,
Research.BOWSAW: 50,
Research.TWOMANSAW: 100,
Research.HORSECOLLAR: 20,
Research.HEAVYPLOW: 40,
Research.CROPROTATION: 70,
Research.GOLDMINING: 30,
Research.GOLDSHAFTMINING: 75,
Research.STONEMINING: 30,
Research.STONESHAFTMINING: 75,
Research.CARAVAN: 40,
Research.COINAGE: 70,
Research.BANKING: 70,
Research.GUILDS: 50,
Research.FISHINGLINES: 20,
Research.GILLNETS: 45,
Research.DOMESTICATION: 20,
Research.PASTORALISM: 40,
Research.TRANSHUMANCE: 70,
Research.REDEMPTION: 50,
Research.ATONEMENT: 40,
Research.HERBALMEDICINE: 35,
Research.HERESY: 60,
Research.SANCTITY: 60,
Research.FERVOR: 50,
Research.DEVOTION: 40,
Research.FAITH: 60,
Research.ILLUMINATION: 65,
Research.BLOCKPRINTING: 55,
Research.THEOCRACY: 75,
Research.ARSON: 25,
Research.GAMBESONS: 25,
Research.SQUIRES: 40,
Research.FORGING: 50,
Research.IRONCASTING: 75,
Research.BLASTFURNACE: 100,
Research.SCALEMAILARMOR: 40,
Research.CHAINMAILARMOR: 55,
Research.PLATEMAILARMOR: 70,
Research.THUMBRING: 45,
Research.PARTHIANTACTICS: 65,
Research.FLETCHING: 30,
Research.BODKINARROW: 35,
Research.BRACER: 40,
Research.PADDEDARCHERARMOR: 40,
Research.LEATHERARCHERARMOR: 55,
Research.RINGARCHERARMOR: 70,
Research.BALLISTICS: 60,
Research.HEATEDSHOT: 30,
Research.MURDERHOLES: 35,
Research.ARROWSLITS: 25,
Research.CHEMISTRY: 100,
Research.SIEGEENGINEERS: 45,
Research.BLOODLINES: 50,
Research.HUSBANDRY: 40,
Research.SCALEBARDINGARMOR: 45,
Research.CHAINBARDINGARMOR: 60,
Research.PLATEBARDINGARMOR: 75,
Research.CAREENING: 50,
Research.DRYDOCK: 60,
Research.SHIPWRIGHT: 60,
Research.CLINKERCONSTRUCTION: 50,
Research.CARVELHULL: 60,
Research.SIPHONS: 45,
Research.INCENDIARIES: 50,
Research.LOOM: 50,
Research.SAPPERS: 10,
Research.BOMBARDTOWER: 60,
Units.VILLAGER: 25,
Units.TRADECART: 50,
Units.SPEARMAN: 22,

View File

@@ -13,8 +13,11 @@ class Ages(IntEnum):
class Buildings(Enum):
HOUSE = auto()
LUMBERCAMP = auto()
#MULECART = auto()
#SETTLEMENT = auto()
MILL = auto()
FARM = auto()
#PASTURE = auto()
MININGCAMP = auto()
DOCK = auto()
BARRACKS = auto()
@@ -22,14 +25,26 @@ class Buildings(Enum):
ARCHERYRANGE = auto()
PALISADEWALL = auto()
PALISADEGATE = auto()
OUTPOST = auto()
TOWNCENTER = auto()
BLACKSMITH = auto()
WATCHTOWER = auto()
STONEWALL = auto()
GATE = auto()
DONJON = auto()
FISHTRAP = auto()
MARKET = auto()
UNIVERSITY = auto()
#CARAVANSERAI = auto()
SIEGEWORKSHOP = auto()
MONASTERY = auto()
#FORTIFIEDCHURCH = auto()
CASTLE = auto()
KREPOST = auto()
#DONJON = auto()
#HARBOR = auto()
#FEITORIA = auto()
BOMBARDTOWER = auto()
WONDER = auto()
@@ -55,25 +70,84 @@ class Tasks(Enum):
class Research(Enum):
TOWNWATCH = auto()
TOWNPATROL = auto()
TREADMILLCRANE = auto()
MASONRY = auto()
ARCHITECTURE = auto()
HOARDINGS = auto()
CONSCRIPTION = auto()
WHEELBARROW = auto()
HANDCART = auto()
DOUBLEBITAXE = auto()
BOWSAW = auto()
TWOMANSAW = auto()
HORSECOLLAR = auto()
HEAVYPLOW = auto()
CROPCYCLE = auto()
CROPROTATION = auto()
GOLDMINING = auto()
GOLDSHAFTMINING = auto()
STONEMINING = auto()
STONESHAFTMINING = auto()
'''
BLACKSMITH = 11
WATCHTOWER = 12
STONEWALL = 13
GATE = 14
DONJON = 15
FISHTRAP = 16
'''
CARAVAN = auto()
COINAGE = auto()
BANKING = auto()
GUILDS = auto()
FISHINGLINES = auto()
GILLNETS = auto()
DOMESTICATION = auto()
PASTORALISM = auto()
TRANSHUMANCE = auto()
REDEMPTION = auto()
ATONEMENT = auto()
HERBALMEDICINE = auto()
HERESY = auto()
SANCTITY = auto()
FERVOR = auto()
DEVOTION = auto()
FAITH = auto()
ILLUMINATION = auto()
BLOCKPRINTING = auto()
THEOCRACY = auto()
ARSON = auto()
GAMBESONS = auto()
SQUIRES = auto()
FORGING = auto()
IRONCASTING = auto()
BLASTFURNACE = auto()
SCALEMAILARMOR = auto()
CHAINMAILARMOR = auto()
PLATEMAILARMOR = auto()
THUMBRING = auto()
PARTHIANTACTICS = auto()
FLETCHING = auto()
BODKINARROW = auto()
BRACER = auto()
PADDEDARCHERARMOR = auto()
LEATHERARCHERARMOR = auto()
RINGARCHERARMOR = auto()
BALLISTICS = auto()
HEATEDSHOT = auto()
MURDERHOLES = auto()
ARROWSLITS = auto()
CHEMISTRY = auto()
SIEGEENGINEERS = auto()
BLOODLINES = auto()
HUSBANDRY = auto()
SCALEBARDINGARMOR = auto()
CHAINBARDINGARMOR = auto()
PLATEBARDINGARMOR = auto()
CAREENING = auto()
DRYDOCK = auto()
SHIPWRIGHT = auto()
CLINKERCONSTRUCTION = auto()
CARVELHULL = auto()
SIPHONS = auto()
INCENDIARIES = auto()
LOOM = auto()
SAPPERS = auto()
#SPIES = auto()
BOMBARDTOWER = auto()
class Resources(IntEnum):

View File

@@ -8,6 +8,7 @@ from aoe.dependencies import *
from aoe.gather import *
from aoe.housing import *
from aoe.production import *
from aoe.research import *
from aoe.times import *
from aoe.types import *
@@ -44,14 +45,16 @@ class World():
# to farms with the highest capacity.
# We keep track of only the closest upcoming farm deletion.
# TODO research
# TODO fishing ships
# TODO relics
# TODO trade carts
# TODO allow automation:
# reseeding of farms
# queuing of villagers
# possibly other things
# TODO gathering boars and hunting
# spend villager time in exchange for adding gatherable resource
# TODO relics
# TODO use market for buy/sell
MAX_WORLD_TIME = 3*60*60 # 3 hours
@@ -100,14 +103,11 @@ class World():
raise MissingDependencyException
def buy_research(self, research):
def queue_research(self, research):
self._check_research_dependencies(research)
self._pay_cost(research)
self._update_costs(research)
def _update_costs(self, research):
pass
self._start_research(research)
def _schedule_next_gather_rate_decrease(self, task):
@@ -180,6 +180,24 @@ class World():
self._schedule_next_gather_rate_decrease(task)
def _permanently_modify_farm_capacity(self, increase):
current_initial_farm = self.gather.buildings_gather_increase[Buildings.FARM]
for i in range(len(farms)):
farms[i] += (farms[i]/current_initial_farm)*increase
for i in range(len(unused_farms)):
unused_farms[i] += (unused_farms[i]/current_initial_farm)*increase
self.gather.buildings_gather_increase[Buildings.FARM] += increase
self._schedule_next_gather_rate_decrease(Task.FARM)
def _permanently_modify_gather_rate(self, task, rate_multiplier):
self.gather.gather_rates[tasks] *= rate_multiplier
self.gather.original_gather_rates[tasks] *= rate_multiplier
self._schedule_next_gather_rate_decrease(task)
def assign_villager(self, previous_task, new_task, count=1):
# new_task of None means kill the villager
@@ -333,12 +351,15 @@ class World():
unit = self.production_queue[i]
if self._check_production(unit):
self._build_unit(unit)
if unit in Units:
self._build_unit(unit)
elif unit in Research:
self._start_research(unit)
new_builds.append(i)
i += 1
self.production_queue = [self.production_queue[i]
self.production_queue = [self.production_queue[i]
for i in range(original_queue_len)
if i not in new_builds]
@@ -363,7 +384,10 @@ class World():
if ready_index:
self.production_queue.remove(i)
self._build_unit(unit)
if unit in Units:
self._build_unit(unit)
elif unit in Research:
self._start_research(unit)
def _check_housing(self, unit):
@@ -396,6 +420,29 @@ class World():
raise ProductionBuildingNotAvailableException
def _use_production_for_research(self, research):
self._check_production(research)
building = self.production.building[research]
self.production_available[building] -= 1
def _add_research(self, research):
self.research.append(research)
ResearchEffects.complete_research(self, research)
self._free_production_building_of_unit(research)
def _start_research(self, research):
try:
self._use_production_for_research(research)
except ProductionBuildingNotAvailableException:
self.production_queue.append(research)
else:
update_time = self.current_time + self.build_times.build_times[research]
self.events[update_time].append((self._add_research, (research,)))
def _use_housing_and_production(self, unit):
self._check_housing(unit)
self._check_production(unit)

View File

@@ -38,6 +38,8 @@ game.assign_villager(2, Tasks.IDLE, Tasks.SHEEP, 2)
#game.build(45, Buildings.LUMBERCAMP, Tasks.WOOD, Tasks.IDLE)
game.build(45, Buildings.LUMBERCAMP, Tasks.WOOD, Tasks.WOOD)
game.queue_research(45, Research.LOOM)
game.queue_villager(45, Tasks.WOOD)
game.queue_villager(45, Tasks.WOOD)