diff --git a/aoe/costs.py b/aoe/costs.py index 87fe7dd..e3dedf8 100644 --- a/aoe/costs.py +++ b/aoe/costs.py @@ -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: diff --git a/aoe/dependencies.py b/aoe/dependencies.py index d8e7f96..8d9b843 100644 --- a/aoe/dependencies.py +++ b/aoe/dependencies.py @@ -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], } diff --git a/aoe/gameplay.py b/aoe/gameplay.py index b16857a..ed23a29 100644 --- a/aoe/gameplay.py +++ b/aoe/gameplay.py @@ -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, diff --git a/aoe/production.py b/aoe/production.py index 3a82b9d..38d7f36 100644 --- a/aoe/production.py +++ b/aoe/production.py @@ -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, } diff --git a/aoe/research.py b/aoe/research.py new file mode 100644 index 0000000..dfdc45a --- /dev/null +++ b/aoe/research.py @@ -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) diff --git a/aoe/times.py b/aoe/times.py index 732f9db..a1c799e 100644 --- a/aoe/times.py +++ b/aoe/times.py @@ -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, diff --git a/aoe/types.py b/aoe/types.py index 529bdb7..2d9b1d3 100644 --- a/aoe/types.py +++ b/aoe/types.py @@ -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): diff --git a/aoe/world.py b/aoe/world.py index 3a72d8f..2bb846d 100644 --- a/aoe/world.py +++ b/aoe/world.py @@ -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) diff --git a/runner.py b/runner.py index af739a0..818fe78 100644 --- a/runner.py +++ b/runner.py @@ -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)