comparison orpg/dieroller/savage.py @ 0:4385a7d0efd1 grumpy-goblin

Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author sirebral
date Tue, 14 Jul 2009 16:41:58 -0500
parents
children 449a8900f9ac
comparison
equal deleted inserted replaced
-1:000000000000 0:4385a7d0efd1
1 # (at your option) any later version.
2 # # This program is distributed in the hope that it will be useful,
3 # but WITHOUT ANY WARRANTY; without even the implied warranty of
4 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 # GNU General Public License for more details.
6 #
7 # You should have received a copy of the GNU General Public License
8 # along with this program; if not, write to the Free Software
9 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
10 # --
11 #
12 # File: savage.py
13 # Authors: Rich Finder
14 # : Alexandre Major
15 # Maintainer:
16 # Version: 0.2
17 #
18 # Description: Savage Worlds die roller
19 # Permission was granted by Pinnacle to reprint the result descriptions from their tables on Apr 20, 2006 by Simon Lucas
20 #
21
22 from die import *
23 #from whrandom import randint
24 #import random
25 import string
26 from random import *
27 __version__ = "$Id: savage.py,v 1.2 2007/05/06 16:42:55 digitalxero Exp $"
28
29 # Savage, as in Savage Worlds
30 class sw(std):
31 #def __init__(self,source=[], wnd=1, loc="rnd", chmod=0):
32 def __init__(self,source=[],fmod=0):
33 std.__init__(self,source)
34
35 # these methods return new die objects for specific options
36
37 def fright(self,fearmod=0):
38 return fright(self,fearmod=0)
39
40 def kob(self,wnd,loc):
41 return kob(self,wnd=1,loc="rnd")
42
43 def ooc(self):
44 return ooc(self)
45
46 def ract(self,chmod=0):
47 return ract(self,chmod=0)
48
49 def vcrit(self):
50 return vcrit(self)
51
52 def fortune(self):
53 return fortune(self)
54
55 def freak(self):
56 return freak(self)
57
58 def swdhelps(self):
59 return swdhelps(self)
60
61
62 class fright(std):
63 #-----------------The Fright Table
64 # Rolls on the Fright - which is a 1d20 roll modified by the fear level of a monster. This function automatically generates
65 # The appropriate random number and then adds the fear modifier to the rol and displays the result of the roll with the effect
66 # of that roll.
67 # Usage: [fright()]
68 # [fright(6)] - if the fear modifier of the monster was 6
69 #-----------------
70 def __init__(self,fmod=0):
71 global fear
72 std.__init__(self)
73 fear=fmod
74
75 #def sum(self):
76
77 def __str__(self):
78 global fear
79 iroll = randint(1,20)
80 froll = iroll + fear
81 if froll >= 1 and froll <=4:
82 fresult = "Adrenaline Rush"
83 fdescription = "The hero's \"fight\" response takes over. He adds +2 to all Trait and damage rolls on his next action."
84 elif froll >= 5 and froll <=8:
85 fresult = "Shaken"
86 fdescription = "The character is Shaken."
87 elif froll >=9 and froll <=12:
88 fresult = "Pankicked"
89 fdescription = "The character immediately moves his full Pace plus running die away from the danger and is Shaken."
90 elif froll >=13 and froll <=16:
91 fresult = "Minor Phobia"
92 fdescription = "The character gains a Minor Phobia Hindrance somehow associated with the trauma."
93 elif froll >=17 and froll <=18:
94 fresult = "Major Phobia"
95 fdescription = "The character gains a Major Phobia Hindrance."
96 elif froll >=19 and froll <= 20:
97 fresult = "The Mark of Fear"
98 fdescription = "The hero is Shaken and also suffers some cosmetic, physical alteration -- a white streak forms in the hero's hair, his eyes twitch constantly, or some other minor physical alteration. This reduces his Charisma by 1."
99 else:
100 fresult = "Heart Attack"
101 fdescription = "The hero is so overwhelmed with fear that his heart stutters. He becomes Incapacitated and must make a Vigor roll at -2. If Successful, he's Shaken and can't attempt to recover for 1d4 rounds. If he fails, he dies in 2d6 rounds. A Healing roll at -4 saves the victim's life, but he remains Incapacitated."
102 myStr = "[" + str(iroll) + "+"+str(fear)+"="+str(froll)+"] ==> " + fresult +": "+ fdescription
103 return myStr
104
105 class kob(std):
106 #-------------------The Knockout Blow Table
107 # This table used when a character has sustained more than 3 wounds. The number wounds taken that sends a character to the
108 # Knockout Blow Table is what gets sent with the kob command - not the total number of wounds the character currently has.
109 # For example - a character has 2 wounds and is hit takes 2 more wounds, this will result in a total of 4 wounds, but the
110 # number that gets sent to the kob roll is 2, because that is the number of wounds sustained that sent the character to the kob
111 # table.
112 #
113 # It is also important to note that if a called shot to particular area was made, that information should be sent with the "roll"
114 # as well, because the KOB Table may need to determine some dramatic effects for permanent injuries, etc. If a hit location was sent
115 # the function will use that information.
116 # Valid Hit Locations are: h (head), g (guts), la (left arm), ra (right arm), rl (right leg), ll (left leg), c (crotch)
117 # Usage = [kob(3)] - If 3 wounds were received that sent the player to the Knockout Blow Table - no called shot
118 # [kob(3,"h") - If 3 wounds were received that sent the player to the Knockout Blow Table with a called shot to the head
119 #---------------------
120 global wound, loca
121 def __init__(self, wnd, loc="rnd"):
122 global wound, loca
123 std.__init__(self, wnd)
124 #Need to check to make sure that wnd is a number
125 if (int(wnd)):
126 wound = wnd
127 loca = loc
128 else:
129 mystr = "You need to supply a number for the wound."
130 return mystr
131
132 def __str__(self):
133 global wound, loca
134 itbl = "no"
135 if wound == 1:
136 wtype = "Battered and Bruised"
137 wdescription = "If your hero was previously Incapacitated, this result has no further effect. Otherwise, your hero's had the wind knocked out of him. Make a Spirit roll at the beginning of each round. If the roll is successful, he becomes Shaken and can return to the fight."
138 elif wound == 2: #Need to roll on the Injury table as well
139 wtype = "Incapacitated"
140 wdescription = "Your hero is beaten badly enough to take him out of this fight. He's Incapacitated and must roll on the Injury Table."
141 itbl = "yes"
142 elif wound == 3:
143 wtype = "Bleeding Out"
144 wdescription = "Your hero is bleeding out and Incapacitated. Roll on the Injury Table and make a Vigor roll at the start of each combat round. A failure means the hero has lost too much blood and becomes mortally Wounded (see below; begin rolling for the Mortal Wound in the next round). With a success, he keeps bleeding and must roll again next round. With a raise, or a successful Healing roll, he stops bleeding and is Incapacitated."
145 itbl = "yes"
146 elif wound < 1:
147 wtype = "No Wounds?"
148 wdescription = "The Number of wounds specified was less than one...why are you consulting this chart?"
149 else:
150 wtype = "Mortal Wound"
151 wdescription = "Your hero has suffered a life-threatening wound and will not recover without aid. He is Incapacitated and must roll on the Injury Table. He must also make a Vigor roll at the start of each round. If the roll is failed, he passes on. A Healing roll stabilizes the victim but leaves him Incapacitated."
152 itbl = "yes"
153
154 if itbl == "yes":
155 #Determine if a Hit location was specified already
156 if loca.lower() == "h":
157 iroll = 11
158 elif loca.lower() == "g":
159 iroll = 5
160 elif loca.lower() == "ra":
161 iroll = 3
162 aroll = 2
163 elif loca.lower() == "la":
164 iroll = 3
165 aroll = 1
166 elif loca.lower() == "rl":
167 iroll = 10
168 lroll = 2
169 elif loca.lower() == "ll":
170 iroll = 10
171 lroll = 1
172 elif loca.lower() == "c":
173 iroll = 2
174 else: #none of the above were provided...wo will need to determine randomly
175 iroll = randint(2,12)
176 #resolve the injury table stuff...
177 if iroll == 2:
178 iloc = "Unmentionables"
179 idescription = "The hero suffers an embarrassing and painful wound to the groin."
180 elif iroll == 3 or iroll == 4:
181 if loca != "ra" and loca != "la": # If a hit location was not specified (or not recognized) already, determine randomly
182 aroll = randint(1,2)
183 if aroll == 1:
184 warm = "Left"
185 else:
186 warm = "Right"
187 iloc = warm + " Arm"
188 idescription = "The arm is rendered useless."
189 elif iroll >= 5 and iroll <= 9: #will need to make another random roll
190 iloc = "Guts"
191 idescription = "Your hero catches one somewhere between the crotch and the chin."
192 groll = randint(1,6)
193 if groll == 1 or groll == 2:
194 #idescription += " <b>Broken (" + str(groll) + ")</b> His Agility is reduced by a die type (min dr)."
195 idescription += " <b>Broken (" + str(groll) + ")</b> His Agility is reduced by a die type (min d4)."
196 elif groll == 3 or groll == 4:
197 idescription += " <b>Battered (" + str(groll) + ")</b> His Vigor is reduced by a die type (min d4)."
198 else:
199 idescription += " <b>Busted (" + str(groll) + ")</b> His Strength is reduced by a die type (min d4)."
200 elif iroll == 10:
201 if loca != "ll" and loca != "rl": # If a hit location was not specified (or not recognized) already, determine randomly
202 lroll = randint(1,2)
203 if lroll == 1:
204 wleg = "Left"
205 else:
206 wleg = "Right"
207 iloc = wleg + " Leg"
208 idescription = "The character's leg is crushed, broken, or mangled. His Pace is reduced by 1."
209 else: #Will need to make another random roll for this one.
210 iloc = "Head"
211 idescription = "Your hero has suffered a grievous injury to his head."
212 hroll = randint(1,6) #determine how the head is impacted by the wound
213 if hroll == 1 or hroll ==2:
214 idescription += "<b>Hideous Scar (" + str(hroll) + ")</b>Your hero now has the Ugly Hindrance."
215 elif hroll == 3 or hroll == 4:
216 idescription += "<b>Blinded (" + str(hroll) + ")</b> One or both of your hero's eyes was damaged. He gains the Bad Eyes Hindrance."
217 else:
218 idescription += "<b>Brain Damage (" + str(hroll) + ")</b> Your hero suffers massive trauma to the head. His Smarts is reduced one die type (min d4)."
219 idescription += " Make a Vigor roll applying any wound modifiers. If the Vigor roll is failed, the injury is permanent regardless of healing. If the roll is successful, the effect goes away when all wounds are healed."
220 if iroll == 2:
221 idescription +=" If the injury is permanent, reproduction is out of the question without miracle surgery or magic."
222 if loca != "h" and loca != "g" and loca != "c" and loca != "rl" and loca != "ll" and loca != "ra" and loca != "la":
223 idescription +="<br><br><b>***If the attack that caused the Injury was directed at a specific body part, use that location instead of rolling randomly.***</b>"
224 myStr = "[" + wtype + "] ==>" + wdescription + "<br><br><b>Injury Table Result ("+ str(iroll) +"): </b> [" + iloc + "] ==> " + idescription
225 else:
226 myStr = "[" + wtype + "] ==>" + wdescription
227 return myStr
228
229 class ract(std):
230 #----------------------The Reaction Table
231 # This is used to randomly determine the general mood of NPCs toward the player characters. This simulates a 2d6 roll
232 # and displays the reaction. This roll can be modified by the Charisma of the player(s).
233 # Usage: [ract()] - No Charisma modifier
234 # [ract(2)] - A +2 Charisma modifier
235 # [ract(-2)] - A -2 Charisma modifier
236 #----------------------
237 global charisma
238 def __init__(self,chmod=0):
239 global charisma
240 std.__init__(self)
241 charisma = chmod
242
243 def __str__(self):
244 global charisma
245 r1roll = randint(2,12)
246 rroll = r1roll + charisma
247 if rroll == 2:
248 reaction = "Hostile"
249 rdescription = "The NPC is openly hostile and does his best to stand in the hero's way. He won't help without an overwhelming reward or payment of some kind."
250 elif rroll >=3 and rroll <=4:
251 reaction = "Unfriendly"
252 rdescription = "The NPC is openly hostile and does his best to stand in the hero's way. He won't help without an overwhelming reward or payment of some kind."
253 elif rroll >=5 and rroll <=9:
254 reaction = "Neutral"
255 rdescription = "The NPC has no particular attitude, and will help for little reward if the task at hand is very easy. If the task is difficult, he'll require substantial payment of some kind."
256 elif rroll >=10 and rroll <=11:
257 reaction = "Friendly"
258 rdescription = "The NPC will go out of his way for the hero. He'll likely do easy tasks for free (or very little), and is willing to do more dangerous tasks for fair pay or other favors."
259 else:
260 reaction = "Helpful"
261 rdescription = "The NPC is anxious to help the hero, and will probably do so for little or no pay depending on the nature of the task."
262 #myStr = "[" + reaction + "(" + str(r1roll) + "+Charisma Mods("+str(charisma)+")="+str(rroll)+")] ==> " + rdescription
263 myStr = "["+str(r1roll)+"+"+str(charisma)+"(charisma modifier)="+str(rroll)+"] ==> "+reaction+": "+rdescription
264 return myStr
265
266 class ooc(std):
267 #--------------------The Out of Control Vehicle Table
268 # This table is used when a vehicle is injured during combat and must determine what happens to the vehicle. This is a 2d6
269 # roll and displays the results of the roll. This will also display altitude information for flying vehicles.
270 # Usage: [ooc()]
271 #--------------------
272 def __init__(self):
273 std.__init__(self)
274
275 def __str__(self):
276 ooroll = randint(2,12)
277 oodescripton = "Something"
278 if ooroll == 2:
279 ooeffect = "Roll Over"
280 rroll = randint(1,6)
281 oodescription = "The vehicle performs a Slip and rolls over "+ str(rroll)+ " time"
282 if rroll < 2:
283 oodescription +="s"
284 oodescription += " in that direction. Roll collision damage for the vehicle and everyone inside. Any exterior-mounted weapons or accessories are ruined."
285 elif ooroll == 3 or ooroll == 4:
286 ooeffect = "Spin"
287 sroll = randint(1,6)
288 froll = randint(1,12)
289 oodescription = "Move the vehicle "+str(sroll)+"\" in the direction of the maneuver, or "+str(sroll)+"\" away from a damaging blow. At the end of the Spin,the vehicle is facing is "+str(froll)+" o'clock."
290 elif ooroll >= 5 and ooroll <= 9:
291 ooeffect = "Skid"
292 sroll = randint(1,4)
293 oodescription = "Move the vehicle "+str(sroll)+"\" left or right (in the direction of a failed maneuver, or away from a damaging attack)."
294 elif ooroll == 10 or ooroll == 11:
295 ooeffect = "Slip"
296 sroll = randint(1,6)
297 oodescription = "Move the vehicle "+str(sroll)+"\" left or right (in the direction of a failed maneuver, or away from a damaging attack)."
298 else:
299 ooeffect = "Flip"
300 froll = randint(1,4)
301 oodescription = "The vehicle flips end over end "+str(froll)+" times. Move it forward that many increments of its own length. Roll collision damage for the vehicle, its passengers, and anything it hits. "
302 shroll = randint(1,2)
303 if shroll == 1:
304 oodescription += "<br><br><b>Note:</b> If the vehicle is slow and/or heavy (such as a tank) it Slips instead: "
305 sroll = randint(1,6)
306 oodescription += "Move the vehicle "+str(sroll)+"\" left or right (in the direction of a failed maneuver, or away from a damaging attack)."
307 else:
308 oodescription += "<br><br><b>Note (GM's discretion):</b> If the vehicle is slow and/or heavy (such as a tank) it Skids instead: "
309 sroll = randint(1,4)
310 oodescription += "Move the vehicle "+str(sroll)+"\" left or right (in the direction of a failed maneuver, or away from a damaging attack)."
311
312 oodescription += "<br><br>For flying vehicles conducting combat in the air, the vehicle"
313 altchange = randint(2,12)
314 if altchange == 2:
315 dwn = randint(2,20)
316 oodescription += " loses "+str(dwn)+"\" of altitude."
317 elif altchange == 3 or altchange == 4:
318 dwn = randint(1,10)
319 oodescription += " loses "+str(dwn)+"\" of altitude."
320 elif altchange >= 5 and altchange <= 9:
321 oodescription += " has no change in altitude."
322 else:
323 altup = randint(1,10)
324 oodescription += " gains "+str(altup)+"\" of altitude."
325 myStr = "[" + ooeffect + "(" + str(ooroll) + ")] ==> " + oodescription
326 return myStr
327
328 class vcrit(std):
329 #----------------The Critical Hit Vehicle Table
330 # This table generates a 2d6 roll to determine the Critical Hit results every time a vehicle takes a wound. There are no
331 # modifiers to this roll
332 # Usage [vcrit()]
333 #----------------
334 def __init__(self):
335 std.__init__(self)
336
337 def __str__(self):
338 chitroll = randint(2,12)
339 if chitroll == 2:
340 cheffect = "Scratch and Dent"
341 chdescription = "The attack merely scratches the paint. There's no permanent damage."
342 elif chitroll == 3:
343 cheffect = "Engine"
344 chdescription = "The engine is hit. Oil leaks, pistons misfire, etc. Acceleration is halved (round down). This does not affect deceleration, however."
345 elif chitroll == 4:
346 cheffect = "Locomotion"
347 chdescription = "The wheels, tracks, or whatever have been hit. Halve the vehicle's Top Speed immediately. If the vehicle is pulled by animals, the shot hits one of them instead."
348 elif chitroll == 5: #Need to make an additional roll to see what direction the vehicle can turn...
349 cheffect = "Controls"
350 troll = randint(1,2)
351 if troll == 1:
352 aturn = "left"
353 else:
354 aturn = "right"
355 chdescription = "The control system is hit. Until a Repair roll is made, the vehicle can only perform turns to the "+str(aturn)+". This may prohibit certain maneuvers as well."
356 elif chitroll >= 6 and chitroll <=8:
357 cheffect = "Chassis"
358 chdescription = "The vehicle suffers a hit in the body with no special effects."
359 elif chitroll == 9 or chitroll == 10:
360 cheffect = "Crew"
361 chdescription = "A random crew member is hit. The damage from the attack is rerolled. If the character is inside the vehicle, subtract the vehicle's Armor from the damage. Damage caused by an explosion affects all passengers in the vehicle."
362 elif chitroll == 11:
363 cheffect = "Weapon"
364 chdescription = "A random weapon on the side of the vehicle that was hit is destroyed and may no longer be used. If there is no weapon, this is a Chassis hit instead (The vehicle suffers a hit in the body with no special effects)."
365 else:
366 cheffect = "Wrecked"
367 chdescription = "The vehicle is wrecked and automatically goes Out of Control.<br><br><b>[Out of Control]</b> ==>"+str(ooc())
368 myStr = "["+cheffect+" ("+str(chitroll)+")] ==> "+chdescription
369 return myStr
370
371 def ooc(self):
372 return vcritooc(self)
373
374 class swdhelps(std):
375 #Display help information for this die roller - it will list all the available commands, and how to use them
376 def __init__(self):
377 std.__init__(self)
378
379 def __str__(self):
380 myStr = "<table border='1' valign='top'>\
381 <tr>\
382 <td colspan='3'>This chart will show you the various commands you can use and what is required, etc. The <i><b>italicized text</b></i> are optional variables. Any text that is not italicized and is within parentheses is required. About the only roll that has a required element is the Knockout Blow roll (kob).</td>\
383 </tr>\
384 <tr>\
385 <td align='center'><b>Die Command</b></td><td align='center' width='55%'><b>Description</b></td><td align='center'width='30%'><b>Example</b></td>\
386 </tr>\
387 <tr>\
388 <td><b>[fright(<i>monster's fear modifier</i>)]</b></td><td>Rolls on the <b>Fright Table</b>. This command generates a number between 1 and 20 and displays the corresponding entry from the Fright Table.</td><td>[fright()]<br>[fright(6)]</td>\
389 </tr>\
390 <tr>\
391 <td><b>[kob(#ofWounds,<i>hitLocation</i>)]</b></td><td>Rolls on the <b>Knockout Blow Table</b> as well as the <b>Injury Table</b> if necessary. The number of wounds must be specified, however, the location only needs to be specified if a particular body part was targeted. If a hit location was targeted, then the following codes should be used:<br>\
392 <ul>\
393 <li>h = head</li>\
394 <li>g = guts/other vital areas</li>\
395 <li>c = crotch/groin</li>\
396 <li>la = left arm</li>\
397 <li>ra = right arm</li>\
398 <li>ll = left leg</li>\
399 <li>rl = right leg</li>\
400 </ul><br>If no hit location is specified, the hit location will be determined when the roll on the Injury Table is necessary. When specifiying a hit locations, the code must be entered within double quotes.</td><td><b>3 wounds, no called shot</b><br>[kob(3)]<br><b>2 wounds to the head</b><br>[kob(2,\"h\")]</td>\
401 </tr>\
402 <tr>\
403 <td><b>[ract(<i>Charisma Mods</i>)]</b></td><td>Rolls on the <b>Reaction Table</b>. Will generate the initial reaction to the PCs. If the Charisma modifiers are supplied, they will be taken into account as well. Remember that this table is generally only consulted when the reaction of the NPC is comlpetely unknown to the GM.</td><td><b>Reaction no Charisma Mods</b><br>[ract()]<br><b>Reaction with +2 Charisma Mods</b><br>[ract(2)]</td>\
404 </tr>\
405 <tr>\
406 <td><b>[vcrit()]</b></td><td>Rolls on the <b>Critical Hit Table</b> for vehicles. If a roll on the Out of Control Chart is necessary, it will automatically roll on that table as well.</td><td>[vcrit()]</td>\
407 </tr>\
408 <tr>\
409 <td><b>[ooc()]</b></td><td>Rolls on the <b>Out of Controll Table</b> for vehicles. This roll will automatically determine any directions/movement rolls as well.</td><td>[ooc()]</td>\
410 </tr>\
411 <tr>\
412 <td><b>[fortune()]</b></td><td>Rolls on the <b>Fortune Table</b> for the Showdown Skirmish rules. This roll will automatically roll on the <b>Freak Event Table</b> if necessary</td><td>[fortune()]</td>\
413 </tr>\
414 <tr>\
415 <td><b>[freak()]</b></td><td>Rolls on the <b>Freak Event Table</b>.</td><td>[freak()]</td>\
416 </tr>\
417 <tr>\
418 <td><b>[swdhelps()]</b></td><td>Displays this help list.</td><td>[swdhelps()]</td>\
419 </tr>\
420 </table>"
421 return myStr
422
423 class fortune(std):
424 def __init___(self):
425 std.__init__(self)
426
427 def __str__(self):
428 forroll = randint(2,12)
429 if forroll == 2 or forroll == 12: #Need to roll on Freak Event Table
430 fortune = "Freak Event!"
431 fdescription = "Roll on the Freak Event Table.<br><br><b>[Freak Event Table]</b> ==> "+str(freak())
432 elif forroll == 3:
433 fortune = "Twist of Fate"
434 fdescription = "Take a benny from your opponent. If he does not have one, he must immediately remove any one Extra from play."
435 elif forroll == 4:
436 fortune = "The Quick and the Dead"
437 fdescription = "Swap one of your opponent's cards for any one of yours."
438 elif forroll == 5:
439 fortune = "Rally"
440 fdescription = "Pick any one unit on the board with Shaken figures. All those figures recover automatically."
441 elif forroll >= 6 and forroll <= 8:
442 fortune = "Hand of Fate"
443 fdescription = "Gain one extra benny."
444 elif forroll == 9:
445 fortune = "Close Call"
446 fdescription = "Any one of your opponent's units stumbles, becomes confused, or is otherwise disrupted. All its members suffer -2 to their trait rolls this round."
447 elif forroll == 10:
448 fortune = "Teamwork"
449 fdescription = "Pick any one other unit within 12\" of this one. Discard its Action Card. It acts on the Joker along with this unit, and gains the usual bonuses as well."
450 else:
451 fortune = "Out of Ammo"
452 fdescription = "Pick any one enemy unit. It's out of ammo or Power Points (your choice). If this result cannot be applied, you gain a benny instead."
453 myStr = "["+fortune+" ("+str(forroll)+")] ==>"+fdescription
454 return myStr
455
456 def freak(self):
457 return fortunefreak(self)
458
459 class freak(std):
460 def __init__(self):
461 std.__init__(self)
462
463 def __str__(self):
464 feroll = randint(1,10)
465 if feroll == 1:
466 fevent = "Storm"
467 fedescription = "A sudden storm rolls in. Rain begins to pour and visibility is limited to 12\". All attack rolls are at -1, and black powder weapons don't work at all. The round after this event, all streams become impassable, even at fords. Only bridges remain."
468 elif feroll == 2:
469 fevent = "Fire!"
470 fedescription = "Fire breaks out on the board! Roll randomly among each occupied building, patch of trees, or other flammable terrain type. If none of these are occupied, roll randomly among all flammable terrain pieces. The entire building or forest catches fire this round and causes 2d6 damage to everything within. The fire continues for the rest of the game--unless a storm comes, which quenches it immediately.<br><br>At the beginning of each turn thereafter, roll 1d6 for each flammable structure within 4\" (adjacent buildings, another patch of forest, etc.). On a 4-6, that structure catches fire as well. Check to see if these new fires spread in the following rounds."
471 elif feroll == 3:
472 fevent = "Blood Ties"
473 fedescription = "One of the Wild Cards on the other side is related or has some other special bond with one of your heroes (a Wild Card of your choice). For the rest of the battle, these two won't attack each other directly unless there are no other targets on the board."
474 elif feroll == 4:
475 fevent = "Death of a Hero"
476 inspireroll = randint(1,2)
477 if inspireroll == 1:
478 fedescription ="The next time one of your Wild Cards dies, his noble sacrifice triggers new resolve in his companions. When your next Wild Card is Incapacitated the rest of your force is inspired by his legacy and adds +1 to all their rolls until another of your Wild Cards is killed."
479 else:
480 fedescription = "The next time one of your Wild Cards dies, his noble sacrifice triggers bone-chilling dread in his companions. When your next Wild Card is Incapacitated the rest of your force is filled with dread. They subtract -1 from all their rolls for the rest of the game until an <i>enemy</i> Wild Card is slain."
481 elif feroll == 5:
482 fevent = "Fickle Fate"
483 fedescription = "Fate favors the underdog. The side with the fewest bennies draws until it has the same number as their foe. Place these in the common pool."
484 elif feroll == 6:
485 fevent = "Back from the Dead"
486 fedescription = "One of your dead was just knocked unconscious. He returns in the spot where he fell. If this is a Wild Card, he returns with but a single wound."
487 elif feroll == 7:
488 fevent = "Bitter Cold/Heat"
489 fedescription = "The weather heats up or cools down, depending on your environment. All troops become tired or bogged down and reduce their running rolls by half for the rest of the game."
490 elif feroll == 8:
491 fevent = "Battle Tested"
492 fedescription = "Any one of your units improves any one skill or attribute a die type immediately."
493 elif feroll == 9:
494 fevent = "The Fog"
495 fedescription = "Dense fog, mist, or smoke rolls drifts over the battlefield. Place two connected Large Burst Templates at the center of one randomly determined board edge. The fog drifts 2d6\" each round in a random direction (roll a d12 and read it like a clock facing). The fog \"bounces\" if it hits an edge in a random direction (so that it never leaves the field)."
496 else:
497 fevent = "Reinforcements"
498 fedescription = "A group of your most common currently-fielded troop type arrives on the field of battle! Place these troops in your deployment area. They act on the Joker this round and are dealt in normally hereafter."
499 myStr = "["+fevent+"("+str(feroll)+")] ==> "+fedescription
500 return myStr
501
502 class rdm(std): #If I get the time and the inspiration - I may try to incorporate a Random Table roller... I need to think about this one.
503 def __init__(self):
504 std.__init__(self)
505
506 def __str__(self):
507 return myStr