Mercurial > sypikslang
annotate gamelib/missions.py @ 35:2754c453b39b
Topple a government.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sun, 06 May 2012 21:56:21 +0200 |
parents | 20ed2843adec |
children | efc4f90cfd63 |
rev | line source |
---|---|
5 | 1 # -*- coding: utf-8 -*- |
2 # vim:fileencoding=utf-8 ai ts=4 sts=4 et sw=4 | |
3 | |
35 | 4 from products import HAND_WEAPON, VEHICLE, PATHOGEN, DOOMSDAY_DEVICE |
5 | 5 |
18
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
6 MAJOR_SETBACK, FAILURE, SUCCESS, MAJOR_SUCCESS, GAME_WIN = range(5) |
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
7 |
5 | 8 |
13
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
9 class Result(object): |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
10 """Results of a mission""" |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
11 |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
12 def __init__(self, outcome, money, reputation, msg): |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
13 self.outcome = outcome |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
14 self.money = money |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
15 self.reputation = reputation |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
16 self.message = msg |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
17 self.applied = False |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
18 |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
19 def apply(self, state): |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
20 if not self.applied: |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
21 state.money += self.money |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
22 state.reputation += self.reputation |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
23 self.applied = True |
25 | 24 # FIXME: Hook up to the UI |
25 print self.message | |
13
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
26 else: |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
27 raise RuntimeError('attempted to apply result twice') |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
28 |
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
29 |
5 | 30 class Mission(object): |
31 """Base class for the mission objects. | |
32 Missions have a name, short description (for list displays) and | |
33 long description (which may contain clues about approaches)""" | |
34 | |
35 NAME = "Generic Mission" | |
36 SHORT_DESCRIPTION = None | |
37 LONG_DESCRIPTION = None | |
33
12c33aac7684
Gate certain missions by reputation.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
38 MINIMUM_REPUTATION = None |
10
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
39 available = True |
5 | 40 |
22
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
41 def __init__(self, init_data=None): |
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
42 pass |
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
43 |
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
44 def save_data(self): |
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
45 """Serialize the mission state for saving, etc.""" |
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
46 return [] |
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
47 |
10
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
48 def attempt(self, equipment, state): |
5 | 49 """Attempt the mission with the given equipment list. |
50 | |
13
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
51 Returns a result object with the results of the mission.""" |
18
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
52 return Result(FAILURE, 0, 0, "You can't succceed at this mission") |
5 | 53 |
54 | |
19
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
55 class PlaygroundBully(Mission): |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
56 |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
57 NAME = "Rob kids in the playground" |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
58 SHORT_DESCRIPTION = "Steal from those significantly weaker than yourself" |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
59 LONG_DESCRIPTION = ("It's not menancing, or lucrative, but when the bills" |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
60 " are due, no one cares how you earn the money") |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
61 |
32 | 62 def attempt(self, equipment, state): |
19
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
63 return Result(SUCCESS, 100, -1, "You devote your resources to" |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
64 " robbing kids in a playpark. It's not the finest moment" |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
65 " in your reign of terror, but at least you walked away" |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
66 " with a surprising amount of small change.") |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
67 |
12085dfd9e69
Add rescue mission for the out of money case
Neil Muller <drnlmuller@gmail.com>
parents:
18
diff
changeset
|
68 |
5 | 69 class RansomChina(Mission): |
70 | |
71 NAME = "Hold China to ransom" | |
72 SHORT_DESCRIPTION = "Surely a path to riches and fame" | |
73 LONG_DESCRIPTION = "Holding China to ransom. The rewards for" \ | |
74 " successfully threatening the largest country in the world" \ | |
75 " are great, but the risks are significant. Without " \ | |
76 "some serious firepower, the chances of success are small." | |
33
12c33aac7684
Gate certain missions by reputation.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
77 MINIMUM_REPUTATION = 100 |
5 | 78 |
22
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
79 def __init__(self, init_data=None): |
5 | 80 # Track prior approaches to this mission |
34 | 81 self._prior_attempts = set() |
22
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
82 if init_data: |
34 | 83 self._prior_attempts = set(init_data) |
22
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
84 |
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
85 def save_data(self): |
296ce36fa7d9
Serialize and unserialize game state and missions
Neil Muller <drnlmuller@gmail.com>
parents:
19
diff
changeset
|
86 return self._prior_attempts |
5 | 87 |
10
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
88 def attempt(self, equipment, state): |
5 | 89 failures = [] |
13
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
90 reputation = 0 |
5 | 91 for item in equipment: |
34 | 92 if item.is_a(DOOMSDAY_DEVICE): |
93 if item.NAME not in self._prior_attempts: | |
94 self._prior_attempts.add(item.NAME) | |
95 return Result(SUCCESS, 1000000, 1, ( | |
96 "Trembling at the threat of your doomsday virus," | |
97 " the chinese government pays the ransom.")) | |
98 elif item.is_a(PATHOGEN): | |
99 reputation = -1 | |
100 failures.append( | |
101 "'Hah, we've developed an antidote to your" | |
102 " pathogen, doctor. You cannot threaten us with that" | |
103 " again.'") | |
104 else: | |
105 reputation = -1 | |
106 failures.append( | |
107 "'Hah, we know how to deal with that particular" | |
108 " threat, doctor.'") | |
5 | 109 else: |
110 failures.append("You fail to inspire fear with your %s" | |
34 | 111 % item.NAME) |
18
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
112 return Result(FAILURE, 0, reputation, "\n".join(failures)) |
5 | 113 |
114 | |
35 | 115 class ToppleThirdWorldGovernment(Mission): |
116 | |
117 NAME = "Topple a third-world government" | |
118 SHORT_DESCRIPTION = "We could use a more amenable despot there" | |
119 LONG_DESCRIPTION = ( | |
120 "It's a small and fairly useless country, but it's still an actual" | |
121 " government that can be toppled. A good test bed for some of the" | |
122 " larger toys in the armory.") | |
123 MINIMUM_REPUTATION = 50 | |
124 | |
125 def attempt(self, equipment, state): | |
126 failures = [] | |
127 if not equipment: | |
128 return Result(FAILURE, 0, 0, ( | |
129 "The border post may be poorly guarded, but you need to" | |
130 " bring *some* kind of weaponry along. Your troops sulk" | |
131 " on the way home.")) | |
132 for item in equipment: | |
133 if any(item.is_a(cat) for cat in (VEHICLE, HAND_WEAPON)): | |
134 return Result(SUCCESS, 10000, 5, ( | |
135 "The corruption and oppression continue, but at least" | |
136 " the proceeds are making their way into *your*" | |
137 " pockets. And you don't even have to dirty your own" | |
138 " jackboots.")) | |
139 else: | |
140 failures.append("You fail to inspire fear with your %s" | |
141 % item.NAME) | |
142 return Result(FAILURE, 0, 0, "\n".join(failures)) | |
143 | |
144 | |
5 | 145 class RobBank(Mission): |
146 | |
147 NAME = "Rob the local bank" | |
148 SHORT_DESCRIPTION = "A trivial challenge, but easy money" | |
149 LONG_DESCRIPTION = "The security guards and local police are of minor" \ | |
150 " concern. Walk in, clean out the vault, walk out. Couldn't be" \ | |
151 " simpler." | |
152 | |
10
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
153 def attempt(self, equipment, state): |
5 | 154 failures = [] |
25 | 155 if not equipment: |
156 return Result(FAILURE, 0, 0, "Your attempt to rob the bank" | |
157 " barehanded is unsuccessful. Fortunately, everyone is" | |
158 " too stunned to impede your escape.") | |
5 | 159 for item in equipment: |
34 | 160 if item.is_a(PATHOGEN): |
10
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
161 if state.reputation < 10: |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
162 failures.append("The clerk doesn't realise the threat of" |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
163 " the vial you hold, and, although watching him" |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
164 " die in agony would be statisfying, you decide" |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
165 " it's not worth wasting this on something so" |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
166 " trivial") |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
167 else: |
18
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
168 return Result(SUCCESS, 1000, 0, "Holding up a bank with" |
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
169 " only a small vial of clear liquid. Now that" |
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
170 " is power.") |
34 | 171 elif item.is_a(HAND_WEAPON): |
18
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
172 return Result(SUCCESS, 1000, 0, "The threat of your weapons is" |
13
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
173 " enough to inspire an impressive level of cooperation") |
5 | 174 else: |
175 failures.append("You fail to inspire fear with your %s" | |
35 | 176 % item.NAME) |
18
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
177 return Result(FAILURE, 0, 0, "\n".join(failures)) |
10
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
178 |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
179 |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
180 class DestroyMountRushmore(Mission): |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
181 |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
182 NAME = "Destroy Mount Rushmore" |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
183 SHORT_DESCRIPTION = "Monuments to other people? Intolerable" |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
184 LONG_DESCRIPTION = "While potentially expensive, destroying" \ |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
185 " major monument is a good way to secure your reputation." |
33
12c33aac7684
Gate certain missions by reputation.
Jeremy Thurgood <firxen@gmail.com>
parents:
32
diff
changeset
|
186 MINIMUM_REPUTATION = 20 |
10
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
187 |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
188 def attempt(self, equipment, state): |
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
189 if not self.available: |
13
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
190 raise RuntimeError('Cannot attempt an unavailable mission') |
10
9f8def7d70d0
Rework mission objects to include reputation
Neil Muller <drnlmuller@gmail.com>
parents:
5
diff
changeset
|
191 self.available = False |
18
0849ab5304cf
Add more mission result codes
Neil Muller <drnlmuller@gmail.com>
parents:
13
diff
changeset
|
192 return Result(SUCCESS, 0, 100, |
13
c0966997e0c5
Use a results object instead of tuple (will hopefully make changign stuff easier later)
Neil Muller <drnlmuller@gmail.com>
parents:
10
diff
changeset
|
193 "Mount Rushmore is remarkably easy to destroy.") |