view gamelib/schematics.py @ 115:ef63532cac13

Rearrange SCIENCE a bit.
author Jeremy Thurgood <firxen@gmail.com>
date Wed, 09 May 2012 23:10:29 +0200
parents 245ef50de84d
children a8a46c14d467
line wrap: on
line source

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

from gamelib import research
from gamelib.game_base import Science


class SchematicCategorySet(object):
    def __init__(self, *categories):
        for cat in categories:
            setattr(self, cat, cat.lower().replace('_', ' '))

cat = SchematicCategorySet(
    'HAND_WEAPON',
    'VEHICLE',
    'DOOMSDAY_DEVICE',
    'PATHOGEN',
    'MIND_CONTROL',
    )


class Schematic(Science):
    # For all Schematics
    SCIENCE_TYPE = 'schematic'

    # Acquisition
    STARTING_PRODUCT = False
    ACQUISITION_CHANCE = 0.8
    CATEGORIES = ()

    # Costs
    UPGRADE_REQUIREMENT = 1
    COST = None

    # Power and reliability
    PROTOTYPE_RELIABILITY = 0.4
    PRODUCTION_RELIABILITY = 0.8
    BASE_POWER = None
    POWER_INCREMENT = None

    def can_spend(self, lab, spend):
        extra = self.UPGRADE_REQUIREMENT * self.points + spend
        return lab.meet_requirements(self, extra)

    def is_a(self, category):
        return category in self.CATEGORIES

    def reliability(self):
        if self.points:
            exp = 1 + 0.5 * (self.points - 1)
            return 1.0 - ((1.0 - self.PRODUCTION_RELIABILITY) ** exp)
        return self.PROTOTYPE_RELIABILITY

    def power(self):
        power = self.BASE_POWER
        if None not in (power, self.POWER_INCREMENT):
            power += self.POWER_INCREMENT * self.points
        return power

    @classmethod
    def sanity_check(cls):
        for science, points in cls.PREREQUISITES:
            assert issubclass(science, Science)
            assert isinstance(points, int)
        assert isinstance(cls.CATEGORIES, tuple)


class MachineGun(Schematic):
    NAME = "machine gun"
    COST = 100
    CATEGORIES = (cat.HAND_WEAPON,)
    STARTING_PRODUCT = True

    def __init__(self, points=0):
        self.points = 1

    def spend_point(self):
        raise NotImplementedError()

    def can_spend(self, lab, spend):
        return False


class LightningGun(Schematic):
    NAME = "lightning gun"
    COST = 300
    CATEGORIES = (cat.HAND_WEAPON,)
    PREREQUISITES = (
        (research.Electrickery, 1),
        )


class TeslaTank(Schematic):
    NAME = "tesla tank"
    COST = 1000
    CATEGORIES = (cat.VEHICLE,)
    PREREQUISITES = (
        (research.Electrickery, 3),
        )


class DoomsdayVirus(Schematic):
    NAME = "doomsday virus"
    COST = 100000
    CATEGORIES = (cat.DOOMSDAY_DEVICE, cat.PATHOGEN)
    PREREQUISITES = (
        (research.Biogenetics, 5),
        )


class PropagandaMachine(Schematic):
    NAME = "propaganda machine"
    COST = 1000
    CATEGORIES = (cat.MIND_CONTROL,)
    PREREQUISITES = (
        (research.Psychology, 2),
        )