Mercurial > sypikslang
view gamelib/missions.py @ 70:442a1bf9b14e
fucking pep8
author | Rizmari Versfeld <rizziepit@gmail.com> |
---|---|
date | Tue, 08 May 2012 23:10:10 +0200 |
parents | 373c57ab4140 |
children | a40a76012bd7 |
line wrap: on
line source
# -*- coding: utf-8 -*- # vim:fileencoding=utf-8 ai ts=4 sts=4 et sw=4 from random import random from schematics import HAND_WEAPON, VEHICLE, PATHOGEN, DOOMSDAY_DEVICE MAJOR_SETBACK, FAILURE, SUCCESS, MAJOR_SUCCESS, GAME_WIN = range(5) class Result(object): """Results of a mission""" def __init__(self, outcome, money, reputation, msg): self.outcome = outcome self.money = money self.reputation = reputation self.message = msg self.applied = False def apply(self, state): if not self.applied: state.money += self.money state.reputation += self.reputation self.applied = True # FIXME: Hook up to the UI print self.message else: raise RuntimeError('attempted to apply result twice') class Mission(object): """Base class for the mission objects. Missions have a name, short description (for list displays) and long description (which may contain clues about approaches)""" NAME = "Generic Mission" SHORT_DESCRIPTION = None LONG_DESCRIPTION = None MINIMUM_REPUTATION = None # Flag for missions that can only be attempted once completed = False def __init__(self, init_data=None): pass def save_data(self): """Serialize the mission state for saving, etc.""" return [] def can_attempt(self, state): """Can we currently attempt the mission""" if self.completed: return False if (self.MINIMUM_REPUTATION is not None and self.MINIMUM_REPUTATION > state.reputation): # Don't have the reputation completed return False return True def attempt(self, equipment, state): """Attempt the mission with the given equipment list. Returns a result object with the results of the mission.""" # Handle error case if self.completed: raise RuntimeError('Cannot attempt a completed mission') # No equipment is usually a special case. if not equipment: return self.attempt_no_equipment(state) # Categorise equipment for easier decision-making. categorised = {} for item in equipment: for category in item.CATEGORIES: categorised.setdefault(category, []).append(item) result = self.attempt_with(categorised, state) if result is not None: # We have a mission result. return result # Generic fallback result. return Result(FAILURE, 0, 0, ( "You fail to inspire sufficient fear.")) def attempt_no_equipment(self, state): return Result(FAILURE, 0, 0, ( "Really? You're going in completely unequipped?" " How brave. And foolish. And ultimately unsuccessful.")) def attempt_with(self, categorised, state): return Result(FAILURE, 0, 0, "You can't succceed at this mission.") class PlaygroundBully(Mission): NAME = "Rob kids in the playground" SHORT_DESCRIPTION = "Steal from those significantly weaker than yourself." LONG_DESCRIPTION = ( "It's not menancing, or lucrative, but when the bills are due, no one" " cares how you earn the money.") def attempt(self, equipment, state): haul = 90 + int(random() * 20) return Result(SUCCESS, haul, -1, ( "You devote your resources to robbing kids in a playpark." " It's not the finest moment in your reign of terror, but at" " least you walked away with a surprising amount of small" " change.")) class RansomChina(Mission): NAME = "Hold China to ransom" SHORT_DESCRIPTION = "Surely a path to riches and fame." LONG_DESCRIPTION = ( "Holding China to ransom. The rewards for successfully threatening" " the largest country in the world are great, but the risks are" " significant. Without some serious firepower, the chances of success" " are small.") MINIMUM_REPUTATION = 100 def __init__(self, init_data=None): # Track prior approaches to this mission self._prior_attempts = set() if init_data: self._prior_attempts = set(init_data) def save_data(self): return self._prior_attempts def attempt_no_equipment(self, state): return Result(FAILURE, 0, -10, ( "It takes three different interpreters before the Chinese" " government finally understand that you're trying to hold" " them ransom with... well... nothing. Nothing at all. This" " one will probably make a good anecdote at diplomatic" " cocktail parties. But not for you. No, not for you at all.")) def attempt_with(self, categorised, state): dooms = categorised.get(DOOMSDAY_DEVICE, []) if not dooms: return Result(FAILURE, 0, -1, ( "You completely fail to inspire the requisite level of" " terror. Maybe a more impressive threat will fare" " better.")) if len(dooms) > 1: return Result(FAILURE, 0, 0, ( "Everyone seems confused as to how you actually plan" " to cause widepsread distruction and mayhem, and" " negotiations break down. Perhaps it's better to stick" " to one weapon of mass destruction at a time.")) [doom] = dooms if doom.NAME in self._prior_attempts: return Result(FAILURE, 0, 0, ( "'We have devised countermeasures since last time, doctor." " You cannot threaten us with that again.'")) self._prior_attempts.add(doom.NAME) return Result(SUCCESS, 1000000, 10, ( "Trembling at you threat of certain doom, the Chinese" " government pays the ransom.")) class ToppleThirdWorldGovernment(Mission): NAME = "Topple a third-world government" SHORT_DESCRIPTION = "We could use a more amenable dictator there." LONG_DESCRIPTION = ( "It's a small and fairly useless country, but it's still an actual" " government that can be toppled. A good test bed for some of the" " larger toys in the armory.") MINIMUM_REPUTATION = 50 def attempt_no_equipment(self, state): return Result(FAILURE, 0, 0, ( "The border post may be poorly guarded, but you need to" " bring *some* kind of weaponry along. Your troops sulk" " on the way home.")) def attempt_with(self, categorised, state): if any(c in categorised for c in (VEHICLE, HAND_WEAPON)): return Result(SUCCESS, 5000 + int(random() * 10000), 5, ( "The corruption and oppression continue, but at least" " the proceeds are making their way into *your*" " pockets. And you don't even have to dirty your own" " jackboots.")) if DOOMSDAY_DEVICE in categorised: return Result(FAILURE, 0, 0, ( "Nobody seems to quite understand what it is you're" " threatening them with. Eventually you have to give up" " and go home.")) class RobBank(Mission): NAME = "Rob the local bank" SHORT_DESCRIPTION = "A trivial challenge, but easy money." LONG_DESCRIPTION = ( "The security guards and local police are of minor concern. Walk in," " clean out the vault, walk out. Couldn't be simpler.") def attempt_no_equipment(self, state): return Result(FAILURE, 0, 0, ( "Your attempt to rob the bank barehanded is unsuccessful." " Fortunately, everyone is too stunned to impede your" " escape.")) def attempt_with(self, categorised, state): loot = 500 + int(random() * 1000) if VEHICLE in categorised: return Result(FAILURE, 0, 0, ( "Your vehicles are impressively doom-laden, but not really" " suitable for city traffic. You intimidate the traffic" " wardens into letting you off without a fine, but by the" " time you get to the bank it's already closed.")) if HAND_WEAPON in categorised: return Result(SUCCESS, loot, 0, ( "The threat of your weapons is enough to inspire an" " impressive level of cooperation. You make off with the" " loot.")) if PATHOGEN in categorised: if state.reputation < 10: return Result(FAILURE, 0, 0, ( "The clerk doesn't realise the threat of" " the vial you hold, and, although watching him" " die in agony would be statisfying, you decide" " it's not worth wasting this on something so" " trivial")) else: return Result(SUCCESS, loot, 1, ( "Holding up a bank with only a small vial of clear" " liquid. Now that is power.")) class DestroyMountRushmore(Mission): NAME = "Destroy Mount Rushmore" SHORT_DESCRIPTION = "Monuments to other people? Intolerable" LONG_DESCRIPTION = "While potentially expensive, destroying" \ " major monument is a good way to secure your reputation." MINIMUM_REPUTATION = 20 def attempt(self, equipment, state): self.completed = True return Result(SUCCESS, 0, 50, ( "Mount Rushmore is remarkably easy to destroy."))