155
|
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 import string
|
|
24 from random import *
|
|
25 __version__ = "$Id: savage.py,v 1.2 2007/05/06 16:42:55 digitalxero Exp $"
|
|
26
|
|
27 # Savage, as in Savage Worlds
|
|
28 class sw(std):
|
|
29 #def __init__(self,source=[], wnd=1, loc="rnd", chmod=0):
|
|
30
|
|
31 def __init__(self,source=[],fmod=0):
|
|
32 std.__init__(self,source)
|
|
33
|
|
34 # these methods return new die objects for specific options
|
|
35
|
|
36
|
|
37 def fright(self,fearmod=0):
|
|
38 return fright(self,fearmod=0)
|
|
39
|
|
40
|
|
41 def kob(self,wnd,loc):
|
|
42 return kob(self,wnd=1,loc="rnd")
|
|
43
|
|
44
|
|
45 def ooc(self):
|
|
46 return ooc(self)
|
|
47
|
|
48
|
|
49 def ract(self,chmod=0):
|
|
50 return ract(self,chmod=0)
|
|
51
|
|
52
|
|
53 def vcrit(self):
|
|
54 return vcrit(self)
|
|
55
|
|
56
|
|
57 def fortune(self):
|
|
58 return fortune(self)
|
|
59
|
|
60
|
|
61 def freak(self):
|
|
62 return freak(self)
|
|
63
|
|
64
|
|
65 def swdhelps(self):
|
|
66 return swdhelps(self)
|
|
67
|
|
68
|
|
69 class fright(std):
|
|
70 #-----------------The Fright Table
|
|
71 # Rolls on the Fright - which is a 1d20 roll modified by the fear level of a monster. This function automatically generates
|
|
72 # The appropriate random number and then adds the fear modifier to the rol and displays the result of the roll with the effect
|
|
73 # of that roll.
|
|
74 # Usage: [fright()]
|
|
75 # [fright(6)] - if the fear modifier of the monster was 6
|
|
76 #-----------------
|
|
77
|
|
78 def __init__(self,fmod=0):
|
|
79 global fear
|
|
80 std.__init__(self)
|
|
81 fear=fmod
|
|
82
|
|
83 #def sum(self):
|
|
84
|
|
85
|
|
86 def __str__(self):
|
|
87 global fear
|
|
88 iroll = randint(1,20)
|
|
89 froll = iroll + fear
|
|
90 if froll >= 1 and froll <=4:
|
|
91 fresult = "Adrenaline Rush"
|
|
92 fdescription = "The hero's \"fight\" response takes over. He adds +2 to all Trait and damage rolls on his next action."
|
|
93 elif froll >= 5 and froll <=8:
|
|
94 fresult = "Shaken"
|
|
95 fdescription = "The character is Shaken."
|
|
96 elif froll >=9 and froll <=12:
|
|
97 fresult = "Pankicked"
|
|
98 fdescription = "The character immediately moves his full Pace plus running die away from the danger and is Shaken."
|
|
99 elif froll >=13 and froll <=16:
|
|
100 fresult = "Minor Phobia"
|
|
101 fdescription = "The character gains a Minor Phobia Hindrance somehow associated with the trauma."
|
|
102 elif froll >=17 and froll <=18:
|
|
103 fresult = "Major Phobia"
|
|
104 fdescription = "The character gains a Major Phobia Hindrance."
|
|
105 elif froll >=19 and froll <= 20:
|
|
106 fresult = "The Mark of Fear"
|
|
107 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."
|
|
108 else:
|
|
109 fresult = "Heart Attack"
|
|
110 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."
|
|
111 myStr = "[" + str(iroll) + "+"+str(fear)+"="+str(froll)+"] ==> " + fresult +": "+ fdescription
|
|
112 return myStr
|
|
113
|
|
114 class kob(std):
|
|
115 #-------------------The Knockout Blow Table
|
|
116 # This table used when a character has sustained more than 3 wounds. The number wounds taken that sends a character to the
|
|
117 # Knockout Blow Table is what gets sent with the kob command - not the total number of wounds the character currently has.
|
|
118 # 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
|
|
119 # 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
|
|
120 # table.
|
|
121 #
|
|
122 # It is also important to note that if a called shot to particular area was made, that information should be sent with the "roll"
|
|
123 # as well, because the KOB Table may need to determine some dramatic effects for permanent injuries, etc. If a hit location was sent
|
|
124 # the function will use that information.
|
|
125 # Valid Hit Locations are: h (head), g (guts), la (left arm), ra (right arm), rl (right leg), ll (left leg), c (crotch)
|
|
126 # Usage = [kob(3)] - If 3 wounds were received that sent the player to the Knockout Blow Table - no called shot
|
|
127 # [kob(3,"h") - If 3 wounds were received that sent the player to the Knockout Blow Table with a called shot to the head
|
|
128 #---------------------
|
|
129 global wound, loca
|
|
130
|
|
131 def __init__(self, wnd, loc="rnd"):
|
|
132 global wound, loca
|
|
133 std.__init__(self, wnd)
|
|
134 #Need to check to make sure that wnd is a number
|
|
135 if (int(wnd)):
|
|
136 wound = wnd
|
|
137 loca = loc
|
|
138 else:
|
|
139 mystr = "You need to supply a number for the wound."
|
|
140 return mystr
|
|
141
|
|
142
|
|
143 def __str__(self):
|
|
144 global wound, loca
|
|
145 itbl = "no"
|
|
146 if wound == 1:
|
|
147 wtype = "Battered and Bruised"
|
|
148 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."
|
|
149 elif wound == 2: #Need to roll on the Injury table as well
|
|
150 wtype = "Incapacitated"
|
|
151 wdescription = "Your hero is beaten badly enough to take him out of this fight. He's Incapacitated and must roll on the Injury Table."
|
|
152 itbl = "yes"
|
|
153 elif wound == 3:
|
|
154 wtype = "Bleeding Out"
|
|
155 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."
|
|
156 itbl = "yes"
|
|
157 elif wound < 1:
|
|
158 wtype = "No Wounds?"
|
|
159 wdescription = "The Number of wounds specified was less than one...why are you consulting this chart?"
|
|
160 else:
|
|
161 wtype = "Mortal Wound"
|
|
162 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."
|
|
163 itbl = "yes"
|
|
164
|
|
165 if itbl == "yes":
|
|
166 #Determine if a Hit location was specified already
|
|
167 if loca.lower() == "h":
|
|
168 iroll = 11
|
|
169 elif loca.lower() == "g":
|
|
170 iroll = 5
|
|
171 elif loca.lower() == "ra":
|
|
172 iroll = 3
|
|
173 aroll = 2
|
|
174 elif loca.lower() == "la":
|
|
175 iroll = 3
|
|
176 aroll = 1
|
|
177 elif loca.lower() == "rl":
|
|
178 iroll = 10
|
|
179 lroll = 2
|
|
180 elif loca.lower() == "ll":
|
|
181 iroll = 10
|
|
182 lroll = 1
|
|
183 elif loca.lower() == "c":
|
|
184 iroll = 2
|
|
185 else: #none of the above were provided...wo will need to determine randomly
|
|
186 iroll = randint(2,12)
|
|
187 #resolve the injury table stuff...
|
|
188 if iroll == 2:
|
|
189 iloc = "Unmentionables"
|
|
190 idescription = "The hero suffers an embarrassing and painful wound to the groin."
|
|
191 elif iroll == 3 or iroll == 4:
|
|
192 if loca != "ra" and loca != "la": # If a hit location was not specified (or not recognized) already, determine randomly
|
|
193 aroll = randint(1,2)
|
|
194 if aroll == 1:
|
|
195 warm = "Left"
|
|
196 else:
|
|
197 warm = "Right"
|
|
198 iloc = warm + " Arm"
|
|
199 idescription = "The arm is rendered useless."
|
|
200 elif iroll >= 5 and iroll <= 9: #will need to make another random roll
|
|
201 iloc = "Guts"
|
|
202 idescription = "Your hero catches one somewhere between the crotch and the chin."
|
|
203 groll = randint(1,6)
|
|
204 if groll == 1 or groll == 2:
|
|
205 #idescription += " <b>Broken (" + str(groll) + ")</b> His Agility is reduced by a die type (min dr)."
|
|
206 idescription += " <b>Broken (" + str(groll) + ")</b> His Agility is reduced by a die type (min d4)."
|
|
207 elif groll == 3 or groll == 4:
|
|
208 idescription += " <b>Battered (" + str(groll) + ")</b> His Vigor is reduced by a die type (min d4)."
|
|
209 else:
|
|
210 idescription += " <b>Busted (" + str(groll) + ")</b> His Strength is reduced by a die type (min d4)."
|
|
211 elif iroll == 10:
|
|
212 if loca != "ll" and loca != "rl": # If a hit location was not specified (or not recognized) already, determine randomly
|
|
213 lroll = randint(1,2)
|
|
214 if lroll == 1:
|
|
215 wleg = "Left"
|
|
216 else:
|
|
217 wleg = "Right"
|
|
218 iloc = wleg + " Leg"
|
|
219 idescription = "The character's leg is crushed, broken, or mangled. His Pace is reduced by 1."
|
|
220 else: #Will need to make another random roll for this one.
|
|
221 iloc = "Head"
|
|
222 idescription = "Your hero has suffered a grievous injury to his head."
|
|
223 hroll = randint(1,6) #determine how the head is impacted by the wound
|
|
224 if hroll == 1 or hroll ==2:
|
|
225 idescription += "<b>Hideous Scar (" + str(hroll) + ")</b>Your hero now has the Ugly Hindrance."
|
|
226 elif hroll == 3 or hroll == 4:
|
|
227 idescription += "<b>Blinded (" + str(hroll) + ")</b> One or both of your hero's eyes was damaged. He gains the Bad Eyes Hindrance."
|
|
228 else:
|
|
229 idescription += "<b>Brain Damage (" + str(hroll) + ")</b> Your hero suffers massive trauma to the head. His Smarts is reduced one die type (min d4)."
|
|
230 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."
|
|
231 if iroll == 2:
|
|
232 idescription +=" If the injury is permanent, reproduction is out of the question without miracle surgery or magic."
|
|
233 if loca != "h" and loca != "g" and loca != "c" and loca != "rl" and loca != "ll" and loca != "ra" and loca != "la":
|
|
234 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>"
|
|
235 myStr = "[" + wtype + "] ==>" + wdescription + "<br><br><b>Injury Table Result ("+ str(iroll) +"): </b> [" + iloc + "] ==> " + idescription
|
|
236 else:
|
|
237 myStr = "[" + wtype + "] ==>" + wdescription
|
|
238 return myStr
|
|
239
|
|
240 class ract(std):
|
|
241 #----------------------The Reaction Table
|
|
242 # This is used to randomly determine the general mood of NPCs toward the player characters. This simulates a 2d6 roll
|
|
243 # and displays the reaction. This roll can be modified by the Charisma of the player(s).
|
|
244 # Usage: [ract()] - No Charisma modifier
|
|
245 # [ract(2)] - A +2 Charisma modifier
|
|
246 # [ract(-2)] - A -2 Charisma modifier
|
|
247 #----------------------
|
|
248 global charisma
|
|
249
|
|
250 def __init__(self,chmod=0):
|
|
251 global charisma
|
|
252 std.__init__(self)
|
|
253 charisma = chmod
|
|
254
|
|
255
|
|
256 def __str__(self):
|
|
257 global charisma
|
|
258 r1roll = randint(2,12)
|
|
259 rroll = r1roll + charisma
|
|
260 if rroll == 2:
|
|
261 reaction = "Hostile"
|
|
262 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."
|
|
263 elif rroll >=3 and rroll <=4:
|
|
264 reaction = "Unfriendly"
|
|
265 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."
|
|
266 elif rroll >=5 and rroll <=9:
|
|
267 reaction = "Neutral"
|
|
268 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."
|
|
269 elif rroll >=10 and rroll <=11:
|
|
270 reaction = "Friendly"
|
|
271 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."
|
|
272 else:
|
|
273 reaction = "Helpful"
|
|
274 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."
|
|
275 #myStr = "[" + reaction + "(" + str(r1roll) + "+Charisma Mods("+str(charisma)+")="+str(rroll)+")] ==> " + rdescription
|
|
276 myStr = "["+str(r1roll)+"+"+str(charisma)+"(charisma modifier)="+str(rroll)+"] ==> "+reaction+": "+rdescription
|
|
277 return myStr
|
|
278
|
|
279 class ooc(std):
|
|
280 #--------------------The Out of Control Vehicle Table
|
|
281 # This table is used when a vehicle is injured during combat and must determine what happens to the vehicle. This is a 2d6
|
|
282 # roll and displays the results of the roll. This will also display altitude information for flying vehicles.
|
|
283 # Usage: [ooc()]
|
|
284 #--------------------
|
|
285
|
|
286 def __init__(self):
|
|
287 std.__init__(self)
|
|
288
|
|
289
|
|
290 def __str__(self):
|
|
291 ooroll = randint(2,12)
|
|
292 oodescripton = "Something"
|
|
293 if ooroll == 2:
|
|
294 ooeffect = "Roll Over"
|
|
295 rroll = randint(1,6)
|
|
296 oodescription = "The vehicle performs a Slip and rolls over "+ str(rroll)+ " time"
|
|
297 if rroll < 2:
|
|
298 oodescription +="s"
|
|
299 oodescription += " in that direction. Roll collision damage for the vehicle and everyone inside. Any exterior-mounted weapons or accessories are ruined."
|
|
300 elif ooroll == 3 or ooroll == 4:
|
|
301 ooeffect = "Spin"
|
|
302 sroll = randint(1,6)
|
|
303 froll = randint(1,12)
|
|
304 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."
|
|
305 elif ooroll >= 5 and ooroll <= 9:
|
|
306 ooeffect = "Skid"
|
|
307 sroll = randint(1,4)
|
|
308 oodescription = "Move the vehicle "+str(sroll)+"\" left or right (in the direction of a failed maneuver, or away from a damaging attack)."
|
|
309 elif ooroll == 10 or ooroll == 11:
|
|
310 ooeffect = "Slip"
|
|
311 sroll = randint(1,6)
|
|
312 oodescription = "Move the vehicle "+str(sroll)+"\" left or right (in the direction of a failed maneuver, or away from a damaging attack)."
|
|
313 else:
|
|
314 ooeffect = "Flip"
|
|
315 froll = randint(1,4)
|
|
316 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. "
|
|
317 shroll = randint(1,2)
|
|
318 if shroll == 1:
|
|
319 oodescription += "<br><br><b>Note:</b> If the vehicle is slow and/or heavy (such as a tank) it Slips instead: "
|
|
320 sroll = randint(1,6)
|
|
321 oodescription += "Move the vehicle "+str(sroll)+"\" left or right (in the direction of a failed maneuver, or away from a damaging attack)."
|
|
322 else:
|
|
323 oodescription += "<br><br><b>Note (GM's discretion):</b> If the vehicle is slow and/or heavy (such as a tank) it Skids instead: "
|
|
324 sroll = randint(1,4)
|
|
325 oodescription += "Move the vehicle "+str(sroll)+"\" left or right (in the direction of a failed maneuver, or away from a damaging attack)."
|
|
326
|
|
327 oodescription += "<br><br>For flying vehicles conducting combat in the air, the vehicle"
|
|
328 altchange = randint(2,12)
|
|
329 if altchange == 2:
|
|
330 dwn = randint(2,20)
|
|
331 oodescription += " loses "+str(dwn)+"\" of altitude."
|
|
332 elif altchange == 3 or altchange == 4:
|
|
333 dwn = randint(1,10)
|
|
334 oodescription += " loses "+str(dwn)+"\" of altitude."
|
|
335 elif altchange >= 5 and altchange <= 9:
|
|
336 oodescription += " has no change in altitude."
|
|
337 else:
|
|
338 altup = randint(1,10)
|
|
339 oodescription += " gains "+str(altup)+"\" of altitude."
|
|
340 myStr = "[" + ooeffect + "(" + str(ooroll) + ")] ==> " + oodescription
|
|
341 return myStr
|
|
342
|
|
343 class vcrit(std):
|
|
344 #----------------The Critical Hit Vehicle Table
|
|
345 # This table generates a 2d6 roll to determine the Critical Hit results every time a vehicle takes a wound. There are no
|
|
346 # modifiers to this roll
|
|
347 # Usage [vcrit()]
|
|
348 #----------------
|
|
349
|
|
350 def __init__(self):
|
|
351 std.__init__(self)
|
|
352
|
|
353
|
|
354 def __str__(self):
|
|
355 chitroll = randint(2,12)
|
|
356 if chitroll == 2:
|
|
357 cheffect = "Scratch and Dent"
|
|
358 chdescription = "The attack merely scratches the paint. There's no permanent damage."
|
|
359 elif chitroll == 3:
|
|
360 cheffect = "Engine"
|
|
361 chdescription = "The engine is hit. Oil leaks, pistons misfire, etc. Acceleration is halved (round down). This does not affect deceleration, however."
|
|
362 elif chitroll == 4:
|
|
363 cheffect = "Locomotion"
|
|
364 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."
|
|
365 elif chitroll == 5: #Need to make an additional roll to see what direction the vehicle can turn...
|
|
366 cheffect = "Controls"
|
|
367 troll = randint(1,2)
|
|
368 if troll == 1:
|
|
369 aturn = "left"
|
|
370 else:
|
|
371 aturn = "right"
|
|
372 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."
|
|
373 elif chitroll >= 6 and chitroll <=8:
|
|
374 cheffect = "Chassis"
|
|
375 chdescription = "The vehicle suffers a hit in the body with no special effects."
|
|
376 elif chitroll == 9 or chitroll == 10:
|
|
377 cheffect = "Crew"
|
|
378 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."
|
|
379 elif chitroll == 11:
|
|
380 cheffect = "Weapon"
|
|
381 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)."
|
|
382 else:
|
|
383 cheffect = "Wrecked"
|
|
384 chdescription = "The vehicle is wrecked and automatically goes Out of Control.<br><br><b>[Out of Control]</b> ==>"+str(ooc())
|
|
385 myStr = "["+cheffect+" ("+str(chitroll)+")] ==> "+chdescription
|
|
386 return myStr
|
|
387
|
|
388 def ooc(self):
|
|
389 return vcritooc(self)
|
|
390
|
|
391 class swdhelps(std):
|
|
392 #Display help information for this die roller - it will list all the available commands, and how to use them
|
|
393
|
|
394 def __init__(self):
|
|
395 std.__init__(self)
|
|
396
|
|
397
|
|
398 def __str__(self):
|
|
399 myStr = "<table border='1' valign='top'>\
|
|
400 <tr>\
|
|
401 <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>\
|
|
402 </tr>\
|
|
403 <tr>\
|
|
404 <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>\
|
|
405 </tr>\
|
|
406 <tr>\
|
|
407 <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>\
|
|
408 </tr>\
|
|
409 <tr>\
|
|
410 <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>\
|
|
411 <ul>\
|
|
412 <li>h = head</li>\
|
|
413 <li>g = guts/other vital areas</li>\
|
|
414 <li>c = crotch/groin</li>\
|
|
415 <li>la = left arm</li>\
|
|
416 <li>ra = right arm</li>\
|
|
417 <li>ll = left leg</li>\
|
|
418 <li>rl = right leg</li>\
|
|
419 </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>\
|
|
420 </tr>\
|
|
421 <tr>\
|
|
422 <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>\
|
|
423 </tr>\
|
|
424 <tr>\
|
|
425 <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>\
|
|
426 </tr>\
|
|
427 <tr>\
|
|
428 <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>\
|
|
429 </tr>\
|
|
430 <tr>\
|
|
431 <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>\
|
|
432 </tr>\
|
|
433 <tr>\
|
|
434 <td><b>[freak()]</b></td><td>Rolls on the <b>Freak Event Table</b>.</td><td>[freak()]</td>\
|
|
435 </tr>\
|
|
436 <tr>\
|
|
437 <td><b>[swdhelps()]</b></td><td>Displays this help list.</td><td>[swdhelps()]</td>\
|
|
438 </tr>\
|
|
439 </table>"
|
|
440 return myStr
|
|
441
|
|
442 class fortune(std):
|
|
443
|
|
444 def __init___(self):
|
|
445 std.__init__(self)
|
|
446
|
|
447
|
|
448 def __str__(self):
|
|
449 forroll = randint(2,12)
|
|
450 if forroll == 2 or forroll == 12: #Need to roll on Freak Event Table
|
|
451 fortune = "Freak Event!"
|
|
452 fdescription = "Roll on the Freak Event Table.<br><br><b>[Freak Event Table]</b> ==> "+str(freak())
|
|
453 elif forroll == 3:
|
|
454 fortune = "Twist of Fate"
|
|
455 fdescription = "Take a benny from your opponent. If he does not have one, he must immediately remove any one Extra from play."
|
|
456 elif forroll == 4:
|
|
457 fortune = "The Quick and the Dead"
|
|
458 fdescription = "Swap one of your opponent's cards for any one of yours."
|
|
459 elif forroll == 5:
|
|
460 fortune = "Rally"
|
|
461 fdescription = "Pick any one unit on the board with Shaken figures. All those figures recover automatically."
|
|
462 elif forroll >= 6 and forroll <= 8:
|
|
463 fortune = "Hand of Fate"
|
|
464 fdescription = "Gain one extra benny."
|
|
465 elif forroll == 9:
|
|
466 fortune = "Close Call"
|
|
467 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."
|
|
468 elif forroll == 10:
|
|
469 fortune = "Teamwork"
|
|
470 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."
|
|
471 else:
|
|
472 fortune = "Out of Ammo"
|
|
473 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."
|
|
474 myStr = "["+fortune+" ("+str(forroll)+")] ==>"+fdescription
|
|
475 return myStr
|
|
476
|
|
477
|
|
478 def freak(self):
|
|
479 return fortunefreak(self)
|
|
480
|
|
481 class freak(std):
|
|
482
|
|
483 def __init__(self):
|
|
484 std.__init__(self)
|
|
485
|
|
486
|
|
487 def __str__(self):
|
|
488 feroll = randint(1,10)
|
|
489 if feroll == 1:
|
|
490 fevent = "Storm"
|
|
491 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."
|
|
492 elif feroll == 2:
|
|
493 fevent = "Fire!"
|
|
494 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."
|
|
495 elif feroll == 3:
|
|
496 fevent = "Blood Ties"
|
|
497 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."
|
|
498 elif feroll == 4:
|
|
499 fevent = "Death of a Hero"
|
|
500 inspireroll = randint(1,2)
|
|
501 if inspireroll == 1:
|
|
502 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."
|
|
503 else:
|
|
504 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."
|
|
505 elif feroll == 5:
|
|
506 fevent = "Fickle Fate"
|
|
507 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."
|
|
508 elif feroll == 6:
|
|
509 fevent = "Back from the Dead"
|
|
510 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."
|
|
511 elif feroll == 7:
|
|
512 fevent = "Bitter Cold/Heat"
|
|
513 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."
|
|
514 elif feroll == 8:
|
|
515 fevent = "Battle Tested"
|
|
516 fedescription = "Any one of your units improves any one skill or attribute a die type immediately."
|
|
517 elif feroll == 9:
|
|
518 fevent = "The Fog"
|
|
519 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)."
|
|
520 else:
|
|
521 fevent = "Reinforcements"
|
|
522 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."
|
|
523 myStr = "["+fevent+"("+str(feroll)+")] ==> "+fedescription
|
|
524 return myStr
|
|
525
|
|
526 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.
|
|
527
|
|
528 def __init__(self):
|
|
529 std.__init__(self)
|
|
530
|
|
531
|
|
532 def __str__(self):
|
|
533 return myStr
|