Mercurial > sypikslang
view gamelib/schematics.py @ 151:372d886f9e70
New suggest_research() method on Lab.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Fri, 11 May 2012 20:06:36 +0200 |
parents | 3abb05f7e720 |
children | f1efd252e8b0 |
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', 'BEAST', 'AQUATIC', 'INTELLIGENCE', 'AI', 'COUNTERMEASURE', ) K = 1000 M = 1000 * K class Schematic(Science): # For all Schematics SCIENCE_TYPE = 'schematic' # Acquisition STARTING_PRODUCT = False ACQUISITION_CHANCE = 0.8 CATEGORIES = () # Costs UPGRADE_REQUIREMENT = 1 COST = None MAX_UPGRADE = 5 # Power and reliability PROTOTYPE_RELIABILITY = 0.4 PRODUCTION_RELIABILITY = 0.8 BASE_POWER = None POWER_INCREMENT = None # FIXME: Icons for equipment. IMAGE_NAME = "physics" def can_spend(self, lab, spend): if self.points + spend > self.MAX_UPGRADE: return False 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 BASE_POWER = 10 PRODUCTION_RELIABILITY = 1.0 def __init__(self, points=0): self.points = 1 class LightningGun(Schematic): NAME = "lightning gun" COST = 300 CATEGORIES = (cat.HAND_WEAPON,) PREREQUISITES = ( (research.Electrickery, 1), ) BASE_POWER = 15 POWER_INCREMENT = 3 PRODUCTION_RELIABILITY = 0.7 class TeslaTank(Schematic): NAME = "tesla tank" COST = 40 * K CATEGORIES = (cat.VEHICLE,) PREREQUISITES = ( (research.Electrickery, 5), (research.Robotics, 1), ) BASE_POWER = 100 POWER_INCREMENT = 10 class PropagandaMachine(Schematic): NAME = "propaganda machine" COST = 1000 CATEGORIES = (cat.MIND_CONTROL,) PREREQUISITES = ( (research.Psychology, 2), ) BASE_POWER = 10 POWER_INCREMENT = 2 class GiantSquid(Schematic): NAME = "giant squid" COST = 50 * K CATEGORIES = (cat.BEAST, cat.AQUATIC) PREREQUISITES = ( (research.MarineBiology, 20), (research.Biogenetics, 15), ) BASE_POWER = 200 POWER_INCREMENT = 20 class SharksWithFrickinLasers(Schematic): NAME = "sharks with frickin' lasers" COST = 15 * K CATEGORIES = (cat.BEAST, cat.AQUATIC) PREREQUISITES = ( (research.MarineBiology, 10), (research.Lasers, 7), ) BASE_POWER = 75 POWER_INCREMENT = 10 class ObservationDrone(Schematic): NAME = "observation drone" COST = 6000 CATEGORIES = (cat.INTELLIGENCE,) PREREQUISITES = ( (research.Robotics, 3), ) BASE_POWER = 25 POWER_INCREMENT = 5 class SpySatellite(Schematic): NAME = "spy satellite" COST = 100 * K CATEGORIES = (cat.INTELLIGENCE,) PREREQUISITES = ( (research.Rocketry, 5), (research.Space, 1), ) BASE_POWER = 250 POWER_INCREMENT = 50 class TacticalAI(Schematic): NAME = "tactical AI" COST = 10 * K CATEGORIES = (cat.AI, cat.INTELLIGENCE) PREREQUISITES = ( (research.ArtificialIntelligence, 3), ) class LaserGun(Schematic): NAME = "laser gun" COST = 300 CATEGORIES = (cat.HAND_WEAPON,) PREREQUISITES = ( (research.Lasers, 2), ) class EmpMissile(Schematic): NAME = "EMP missile" COST = 1500 CATEGORIES = (cat.COUNTERMEASURE,) PREREQUISITES = ( (research.Electrickery, 5), (research.Rocketry, 2), ) class DoomsdayVirus(Schematic): NAME = "doomsday virus" COST = 100 * K CATEGORIES = (cat.DOOMSDAY_DEVICE, cat.PATHOGEN) PREREQUISITES = ( (research.Biogenetics, 5), ) BASE_POWER = 1000 POWER_INCREMENT = 500 PRODUCTION_RELIABILITY = 0.6 class GiantRobot(Schematic): NAME = "giant robot" COST = int(1.5 * M) CATEGORIES = (cat.DOOMSDAY_DEVICE, cat.AI) PREREQUISITES = ( (research.Robotics, 15), (research.ArtificialIntelligence, 10), ) BASE_POWER = 700 POWER_INCREMENT = 300 PRODUCTION_RELIABILITY = 0.7 class OrbitalLaserPlatform(Schematic): NAME = "orbital laser platform" COST = 10 * M CATEGORIES = (cat.DOOMSDAY_DEVICE,) PREREQUISITES = ( (SpySatellite, 3), (research.Lasers, 15), (research.Space, 5), ) BASE_POWER = 1500 POWER_INCREMENT = 200