view gamelib/lab.py @ 15:8865ba0c9c38

Add cost to products
author Neil Muller <drnlmuller@gmail.com>
date Sun, 06 May 2012 17:04:10 +0200
parents 9d61abb3cfaf
children 10d3db1f1e08
line wrap: on
line source

# -*- test-case-name: gamelib.tests.test_lab -*-

from gamelib import research, products


class Lab(object):
    def __init__(self):
        self.science = []
        self.new_research = research.ResearchArea.__subclasses__()
        self.new_products = products.Product.__subclasses__()

    def spend_points(self, things, basic_research):
        new_stuff = []
        for thing in things:
            assert thing in self.science
            thing.spend_points(1)
            if isinstance(thing, research.ResearchArea):
                new_stuff.extend(self.find_new_product(thing)[:1])
        new_stuff.extend(self.try_basic_research(basic_research)[:1])
        return new_stuff

    def _get_science(self, science_class):
        for science in self.science:
            if isinstance(science, science_class):
                return science
        return None

    def _meet_requirements(self, science_class):
        for science, level in science_class.PREREQUISITES:
            my_science = self._get_science(science)
            if my_science is None:
                return False
            if my_science.points < level:
                return False
        return True

    def find_new_products(self, research_area):
        available_products = []
        for product_class in self.new_products:
            if self._meet_requirements(product_class):
                available_products.append(product_class)
        return available_products

    def find_new_research(self, basic_research):
        available_research = []
        for research_class in self.new_research:
            if self._meet_requirements(research_class):
                available_research.append(research_class)
        return available_research