171
|
1 #This program is free software; you can redistribute it and/or
|
|
2 #modify it under the terms of the GNU General Public License
|
|
3 #as published by the Free Software Foundation; either version 2
|
|
4 #of the License, or (at your option) any later version.
|
|
5 #
|
|
6 #This program is distributed in the hope that it will be useful,
|
|
7 #but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
8 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
9 #GNU General Public License for more details.
|
|
10 #
|
|
11 #You should have received a copy of the GNU General Public License
|
|
12 #along with this program; if not, write to the Free Software
|
|
13 #Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
14 # --
|
|
15 #
|
|
16 # File: gurps.py
|
|
17 # Version:
|
|
18 # $Id: gurps.py,v 1.3
|
|
19 #
|
|
20 # Description: Modified Hero System die roller based on DJM and Heroman's Hero
|
|
21 # dieroller
|
|
22 #
|
|
23 # GURPS is a trademark of Steve Jackson Games, and its rules and art are
|
|
24 # copyrighted by Steve Jackson Games. All rights are reserved by Steve Jackson
|
|
25 # Games. This game aid is the original creation of Naryt with help from Pyrandon
|
|
26 # and is released for free distribution, and not for resale, under the
|
|
27 # permissions granted in the Steve Jackson Games Online Policy.
|
|
28 # http://www.sjgames.com/general/online_policy.html
|
|
29 #
|
|
30 # Errors should be reported to rpg@ormonds.net
|
|
31 #
|
|
32 # Changelog:
|
|
33 # V 1.3 2007/03/23 Thomas M. Edwards <tmedwards@motoslave.net>
|
|
34 # Fixed gurpsskill, gurpsdefaultskill, and gurpssupernatural to correctly
|
|
35 # return a normal failure when the roll is 17 and the effective skill is 27+;
|
|
36 # previously, they would erroneously return a critical failure. This fix also
|
|
37 # corrects the less serious issue whereby rolls of 17 and an effective skill
|
|
38 # of 17-26 would report "failure by X" instead of merely "failure", which is
|
|
39 # wrong as the only reason the roll failed was because a 17 was rolled, not
|
|
40 # because the roll exceeded the effective skill.
|
|
41 # V 1.2 29 October 2006, added defaultskill (Rule of 20 [B344]), supernatural
|
|
42 # (Rule of 16 [B349]). The frightcheck roll is now the actual Fright Check
|
|
43 # (with Rule of 14 [B360]) and a lookup oon the Fright Check Table if needed.
|
|
44 # The fightcheckfail roll is the old Fright Check Table lookup.
|
|
45 # Removes the Help roller as it was nothing but trouble, see
|
|
46 # http://openrpg.wrathof.com/repository/GURPS/GURPS_Roller_1.7.xml for help
|
|
47 # in using this roller.
|
|
48 # V 1 Original gurps release 2006/05/28 00:00:00, modified crit_hit, crit_headblow, crit_miss, crit_unarm, spellfail, frightcheck and help_me
|
|
49 # Corrects numerous descriptions
|
|
50 # v.1 original gurps release by Naryt 2005/10/17 16:34:00
|
|
51
|
|
52 from time import time, clock
|
|
53 import random
|
|
54 from std import std
|
|
55 from orpg.dieroller.base import *
|
|
56
|
|
57 __version__ = "$Id: gurps.py,v 1.5 2007/05/06 16:42:55 digitalxero Exp $"
|
|
58
|
|
59 # gurps
|
|
60
|
|
61 class gurps(std):
|
|
62 name = "gurps"
|
|
63
|
|
64 def __init__(self,source=[]):
|
|
65 std.__init__(self,source)
|
|
66
|
|
67 def skill(self,skill,mod):
|
|
68 return gurpsskill(self,skill,mod)
|
|
69
|
|
70 def defaultskill(self,stat,defaultlevel,mod):
|
|
71 return gurpsdefaultskill(self,stat,defaultlevel,mod)
|
|
72
|
|
73 def supernatural(self,skill,resistance,mod):
|
|
74 return gurpssupernatural(self,skill,resistance,mod)
|
|
75
|
|
76 def crit_hit(self):
|
|
77 return gurpscrit_hit(self)
|
|
78
|
|
79 def crit_headblow(self):
|
|
80 return gurpscrit_headblow(self)
|
|
81
|
|
82 def crit_miss(self):
|
|
83 return gurpscrit_miss(self)
|
|
84
|
|
85 def crit_unarm(self):
|
|
86 return gurpscrit_unarm(self)
|
|
87
|
|
88 def spellfail(self):
|
|
89 return gurpsspellfail(self)
|
|
90
|
|
91 def frightcheck(self,level,mod):
|
|
92 return gurpsfrightcheck(self,level,mod)
|
|
93
|
|
94 def frightcheckfail(self,mod):
|
|
95 return gurpsfrightcheckfail(self,mod)
|
|
96
|
|
97 die_rollers.register(gurps)
|
|
98
|
|
99 class gurpsskill(std):
|
|
100 def __init__(self,source=[],skill=0,mod=0):
|
|
101 std.__init__(self,source)
|
|
102 self.skill = skill
|
|
103 self.mod = mod
|
|
104
|
|
105 def is_success(self):
|
|
106 return (((self.sum()) <= self.skill+self.mod) and (self.sum() < 17))
|
|
107
|
|
108 def __str__(self):
|
|
109 myStr = "[" + str(self.data[0])
|
|
110 for a in self.data[1:]:
|
|
111 myStr += ","
|
|
112 myStr += str(a)
|
|
113 myStr +="]"
|
|
114 myStr += " = <b>" + str(self.sum()) + "</b>"
|
|
115 myStr += " vs <b>(" + str(self.skill+self.mod) + ")</b>"
|
|
116
|
|
117 Diff = abs((self.skill+self.mod) - self.sum())
|
|
118
|
|
119 if self.is_success():
|
|
120 if self.sum() == 3 or self.sum() == 4:
|
|
121 myStr += " or less <font color='#ff0000'><b>Critical Success!</b></font> [B556]"
|
|
122 elif self.sum() == 5 and (self.skill+self.mod > 14):
|
|
123 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +" </font> [B556]"
|
|
124 elif self.sum() == 6 and (self.skill+self.mod > 15):
|
|
125 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +" </font> [B556]"
|
|
126 else:
|
|
127 myStr += " or less <font color='#ff0000'><b>Success!</b> by " + str(Diff) +" </font>"
|
|
128 else:
|
|
129 if self.sum() == 18:
|
|
130 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
|
|
131 elif self.sum() == 17:
|
|
132 if (self.skill+self.mod) < 16:
|
|
133 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
|
|
134 else:
|
|
135 myStr += " or less <font color='#ff0000'><b>Failure!</b></font> [B556]"
|
|
136 elif Diff > 9:
|
|
137 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b> by " + str(Diff) +" </font> [B556]"
|
|
138 else:
|
|
139 myStr += " or less <font color='#ff0000'><b>Failure!</b> by " + str(Diff) +" </font>"
|
|
140
|
|
141 return myStr
|
|
142
|
|
143 class gurpsdefaultskill(std):
|
|
144 def __init__(self,source=[],stat=0,defaultlevel=0,mod=0):
|
|
145 std.__init__(self,source)
|
|
146 self.stat = stat
|
|
147 self.defaultlevel = defaultlevel
|
|
148 self.mod = mod
|
|
149
|
|
150 def is_success(self):
|
|
151 if self.stat < 21:
|
|
152 intSkillVal = self.stat + self.defaultlevel + self.mod
|
|
153 else:
|
|
154 intSkillVal = 20 + self.defaultlevel + self.mod
|
|
155 return (((self.sum()) <= intSkillVal) and (self.sum() < 17))
|
|
156
|
|
157 def __str__(self):
|
|
158 myStr = "[" + str(self.data[0])
|
|
159 for a in self.data[1:]:
|
|
160 myStr += ","
|
|
161 myStr += str(a)
|
|
162 myStr +="]"
|
|
163 myStr += " = <b>" + str(self.sum()) + "</b>"
|
|
164 strRule = ""
|
|
165 if self.stat < 21:
|
|
166 intSkillVal = self.stat + self.defaultlevel + self.mod
|
|
167 else:
|
|
168 intSkillVal = 20 + self.defaultlevel + self.mod
|
|
169 strRule = "<br />Rule of 20 in effect [B173, B344]"
|
|
170
|
|
171 myStr += " vs <b>(" + str(intSkillVal) + ")</b>"
|
|
172
|
|
173 Diff = abs((intSkillVal) - self.sum())
|
|
174
|
|
175 if self.is_success():
|
|
176 if self.sum() == 3 or self.sum() == 4:
|
|
177 myStr += " or less <font color='#ff0000'><b>Critical Success!</b></font> [B556]"
|
|
178 elif self.sum() == 5 and (intSkillVal > 14):
|
|
179 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +"</font> [B556]"
|
|
180 elif self.sum() == 6 and (intSkillVal > 15):
|
|
181 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +"</font> [B556]"
|
|
182 else:
|
|
183 myStr += " or less <font color='#ff0000'><b>Success!</b> by " + str(Diff) +"</font>"
|
|
184 else:
|
|
185 if self.sum() == 18:
|
|
186 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
|
|
187 elif self.sum() == 17:
|
|
188 if intSkillVal < 16:
|
|
189 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
|
|
190 else:
|
|
191 myStr += " or less <font color='#ff0000'><b>Failure!</b></font> [B556]"
|
|
192 elif Diff > 9:
|
|
193 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b> by " + str(Diff) +"</font> [B556]"
|
|
194 else:
|
|
195 myStr += " or less <font color='#ff0000'><b>Failure!</b> by " + str(Diff) +"</font>"
|
|
196
|
|
197 myStr += strRule
|
|
198 return myStr
|
|
199
|
|
200 class gurpssupernatural(std):
|
|
201 def __init__(self,source=[],skill=0,resistance=0,mod=0):
|
|
202 std.__init__(self,source)
|
|
203 self.skill = skill
|
|
204 self.resistance = resistance
|
|
205 self.mod = mod
|
|
206
|
|
207 def is_success(self):
|
|
208 if self.skill+self.mod > 16:
|
|
209 if self.resistance > 16:
|
|
210 if self.resistance > self.skill+self.mod:
|
|
211 newSkill = self.skill+self.mod
|
|
212 else:
|
|
213 newSkill = self.resistance
|
|
214 else:
|
|
215 newSkill = 16
|
|
216 else:
|
|
217 newSkill = self.skill+self.mod
|
|
218 return (((self.sum()) <= newSkill) and (self.sum() < 17))
|
|
219
|
|
220 def __str__(self):
|
|
221 myStr = "[" + str(self.data[0])
|
|
222 for a in self.data[1:]:
|
|
223 myStr += ","
|
|
224 myStr += str(a)
|
|
225 myStr +="]"
|
|
226 myStr += " = <b>" + str(self.sum()) + "</b>"
|
|
227 strRule = ""
|
|
228 if self.skill+self.mod > 16:
|
|
229 if self.resistance > 16:
|
|
230 if self.resistance > self.skill+self.mod:
|
|
231 newSkill = self.skill+self.mod
|
|
232 strRule = "<br />Rule of 16: Subject's Resistance is higher than skill, no change in skill [B349]"
|
|
233 else:
|
|
234 newSkill = self.resistance
|
|
235 strRule = "<br />Rule of 16: Effective skill limited by subject's Resistance [B349]"
|
|
236 else:
|
|
237 newSkill = 16
|
|
238 strRule = "<br />Rule of 16: Effective skill limited to 16 [B349]"
|
|
239 else:
|
|
240 newSkill = self.skill+self.mod
|
|
241 myStr += " vs <b>(" + str(newSkill) + ")</b>"
|
|
242
|
|
243 Diff = abs((newSkill) - self.sum())
|
|
244
|
|
245 if self.is_success():
|
|
246 if self.sum() == 3 or self.sum() == 4:
|
|
247 myStr += " or less <font color='#ff0000'><b>Critical Success!</b></font> [B556]"
|
|
248 elif self.sum() == 5 and (newSkill > 14):
|
|
249 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +" </font> [B556]"
|
|
250 elif self.sum() == 6 and (newSkill > 15):
|
|
251 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +" </font> [B556]"
|
|
252 else:
|
|
253 myStr += " or less <font color='#ff0000'><b>Success!</b> by " + str(Diff) +" </font>"
|
|
254 else:
|
|
255 if self.sum() == 18:
|
|
256 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
|
|
257 elif self.sum() == 17:
|
|
258 if newSkill < 16:
|
|
259 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
|
|
260 else:
|
|
261 myStr += " or less <font color='#ff0000'><b>Failure!</b></font> [B556]"
|
|
262 elif Diff > 9:
|
|
263 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b> by " + str(Diff) +" </font> [B556]"
|
|
264 else:
|
|
265 myStr += " or less <font color='#ff0000'><b>Failure!</b> by " + str(Diff) +" </font>"
|
|
266
|
|
267 myStr += strRule
|
|
268 return myStr
|
|
269
|
|
270 class gurpscrit_hit(std):
|
|
271 def __init__(self,source=[],mod=0):
|
|
272 std.__init__(self,source)
|
|
273
|
|
274 def __str__(self):
|
184
|
275 myStr = "[" + str(self.data[0])
|
|
276 for a in self.data[1:]:
|
|
277 myStr += ","
|
|
278 myStr += str(a)
|
|
279 myStr += "] = "
|
|
280 myStr += str(self.sum())
|
171
|
281 if self.sum() > 8 and self.sum() < 12:
|
|
282 myStr += " <font color='#ff0000'>The blow inflicts normal damage.</font> [B556]"
|
|
283 elif self.sum() == 12:
|
|
284 myStr += " <font color='#ff0000'>The blow inflicts normal damage, AND victim drops anything they hold--even if no damage penetrates DR.</font> [B556]"
|
|
285 elif self.sum() == 8:
|
|
286 myStr += " <font color='#ff0000'>Damage penetrating DR does double shock (-8 max) AND if it hits the victim's limb, it's crippled for 16-HT seconds (unless wound is enough to cripple permanently!).</font> [B556]"
|
|
287 elif self.sum() == 13 or self.sum() == 14 or self.sum() == 7:
|
|
288 myStr += " <font color='#ff0000'>If any damage penetrates DR, treat as major wound. See [B420] for major wounds.</font> [B556]"
|
|
289 elif self.sum() == 6 or self.sum() == 15:
|
|
290 myStr += " <font color='#ff0000'>The blow inflicts maximum normal damage.</font> [B556]"
|
|
291 elif self.sum() == 5 or self.sum() == 16:
|
|
292 myStr += " <font color='#ff0000'>The blow inflicts double damage.</font> [B556]"
|
|
293 elif self.sum() == 4 or self.sum() == 17:
|
|
294 myStr += " <font color='#ff0000'>The victim's DR protects at half value, rounded down, after applying any armor divisors.</font> [B556]"
|
|
295 elif self.sum() == 3 or self.sum() == 18 :
|
|
296 myStr += " <font color='#ff0000'>The blow inflicts triple damage.</font> [B556]"
|
|
297
|
|
298 return myStr
|
|
299
|
|
300 class gurpscrit_headblow(std):
|
|
301 def __init__(self,source=[],mod=0):
|
|
302 std.__init__(self,source)
|
|
303
|
|
304 def __str__(self):
|
184
|
305 myStr = "[" + str(self.data[0])
|
|
306 for a in self.data[1:]:
|
|
307 myStr += ","
|
|
308 myStr += str(a)
|
|
309 myStr += "] = "
|
|
310 myStr += str(self.sum())
|
171
|
311 if self.sum() > 8 and self.sum() < 12:
|
|
312 myStr += " <font color='#ff0000'>The blow inflicts normal damage.</font> [B556]"
|
|
313 elif self.sum() == 12 or self.sum() == 13:
|
|
314 myStr += " <font color='#ff0000'>Normal damage to the head, BUT if any penetrates DR victim is scarred (-1 to appearance, -2 if burning or corrosive attacks) OR, if <i>crushing</i> then victim deafened [see B422 for duration].</font> [B556]"
|
|
315 elif self.sum() == 8:
|
|
316 myStr += " <font color='#ff0000'>Normal damage to head, but victim knocked off balance: must Do Nothing until next turn (but can defend).</font> [B556]"
|
|
317 elif self.sum() == 14:
|
|
318 myStr += " <font color='#ff0000'>Normal damage to head, but victim drops their weapon. If holding two weapons, roll randomly for which one is dropped.</font> [B556]"
|
|
319 elif self.sum() == 6 or self.sum() == 7:
|
|
320 myStr += " <font color='#ff0000'>If you aimed for face or skull, you hit an eye [B399]; otherwise, DR only half effective & if even 1 point damage penetrates it's a major wound [B420]. If you hit an eye and that should be impossible, treat as if a <b>4</b> were rolled, see [B556].</font> [B556]"
|
|
321 elif self.sum() == 15:
|
|
322 myStr += " <font color='#ff0000'>The blow inflicts maximum normal damage.</font> [B556]"
|
|
323 elif self.sum() == 16:
|
|
324 myStr += " <font color='#ff0000'>The blow inflicts double damage.</font> [B556]"
|
|
325 elif self.sum() == 4 or self.sum() == 5:
|
|
326 myStr += " <font color='#ff0000'>The victim's DR protects at half value, rounded up, after applying armor divisors AND if even 1 point penetrates it's a major wound [B420].</font> [B556]"
|
|
327 elif self.sum() == 17:
|
|
328 myStr += " <font color='#ff0000'>The victim's DR protects at half value, rounded up, after applying any armor divisors.</font> [B556]"
|
|
329 elif self.sum() == 3:
|
|
330 myStr += " <font color='#ff0000'>The blow inflicts maximum normal damage AND ignores all DR.</font> [B556]"
|
|
331 elif self.sum() == 18:
|
|
332 myStr += " <font color='#ff0000'>The blow inflicts triple damage.</font> [B556]"
|
|
333
|
|
334 return myStr
|
|
335
|
|
336 class gurpscrit_miss(std):
|
|
337 def __init__(self,source=[],mod=0):
|
|
338 std.__init__(self,source)
|
|
339
|
|
340 def __str__(self):
|
184
|
341 myStr = "[" + str(self.data[0])
|
|
342 for a in self.data[1:]:
|
|
343 myStr += ","
|
|
344 myStr += str(a)
|
|
345 myStr += "] = "
|
|
346 myStr += str(self.sum())
|
171
|
347 if self.sum() > 8 and self.sum() < 12:
|
|
348 myStr += " <font color='#ff0000'>You drop your weapon (& a <i>cheap</i> weapon breaks).</font> [B556]"
|
|
349 elif self.sum() == 12 or self.sum() == 8:
|
|
350 myStr += " <font color='#ff0000'>Your weapon turns in your hand; must Ready it before it can be used again.</font> [B556]"
|
|
351 elif self.sum() == 13 or self.sum() == 7:
|
|
352 myStr += " <font color='#ff0000'>You lose your balance & can do nothing else (not even free actions) until next turn; all defenses -2 until next turn.</font> [B556]"
|
|
353 elif self.sum() == 14:
|
|
354 yrdStr = str(int(random.uniform(1,7)))
|
|
355 myStr += " <font color='#ff0000'>A <i>swung</i> weapon flies from hand " + yrdStr + " yards (50% chance straight forward/backward) anyone on the target of the flying weapon makes a DX roll or takes half-damage; a <i>thrust</i> or <i>ranged</i> weapon is dropped (& a <i>cheap</i> weapon breaks).</font> [B556]"
|
|
356 elif self.sum() == 6:
|
|
357 myStr += " <font color='#ff0000'>You hit yourself in arm or leg (50/50 chance), doing half damage; if impaling, piercing, or ranged attack, then roll again (if you hit yourself again then use that result).</font> [B556]"
|
|
358 elif self.sum() == 15:
|
|
359 myStr += " <font color='#ff0000'>You strain your shoulder! Weapon arm crippled for 30 min; do not drop weapon, but that arm is useless.</font> [B557]"
|
|
360 elif self.sum() == 16:
|
|
361 myStr += " <font color='#ff0000'>If <i>melee attack,</i> you fall down! If <i>ranged attack,</i> you lose your balance & can do nothing until next turn & all defenses -2 until next turn.</font> [B557]"
|
|
362 elif self.sum() == 5:
|
|
363 myStr += " <font color='#ff0000'>You hit yourself in the arm or leg (50/50 chance), doing normal damage; if impaling, piercing, or ranged attack, then roll again (if you hit yourself again then use that result).</font> [B556]"
|
|
364 elif self.sum() == 4 or self.sum() == 3 or self.sum() == 17 or self.sum() == 18:
|
|
365 broke = int(random.uniform(3,19))
|
|
366 if broke >=5 and broke <=16:
|
|
367 brokestr = "it is dropped."
|
|
368 else:
|
|
369 brokestr = "the weapon also breaks!"
|
|
370 myStr += " <font color='#ff0000'>A normal weapon breaks [B485]; if solid crushing weapon OR fine, very fine, or magical weapon " + brokestr + "</font> [B556] Note, second for roll non-normal weapons already fingured into this result."
|
|
371
|
|
372 return myStr
|
|
373
|
|
374 class gurpscrit_unarm(std):
|
|
375 def __init__(self,source=[],mod=0):
|
|
376 std.__init__(self,source)
|
|
377
|
|
378 def __str__(self):
|
184
|
379 myStr = "[" + str(self.data[0])
|
|
380 for a in self.data[1:]:
|
|
381 myStr += ","
|
|
382 myStr += str(a)
|
|
383 myStr += "] = "
|
|
384 myStr += str(self.sum())
|
171
|
385 if self.sum() > 8 and self.sum() < 12:
|
|
386 myStr += " <font color='#ff0000'>You lose your balance; you can do nothing else (not even free actions) until next turn, and all defenses -2 until next turn.</font> [B557]"
|
|
387 elif self.sum() == 12:
|
|
388 myStr += " <font color='#ff0000'>You trip; make a DX roll to avoid falling at -4 if kicking or twice the normal penatly for a technique that normally requires a DX to avoid injury on even a normal failure (e.g., Jump Kick).</font> [B557]"
|
|
389 elif self.sum() == 8:
|
|
390 myStr += " <font color='#ff0000'>You fall down!</font> [B557]"
|
|
391 elif self.sum() == 13:
|
|
392 myStr += " <font color='#ff0000'>You drop your guard: all defenses -2 for the next turn & any Evaluate bonus or Feint penalties against you are doubled. This is obvious to those around you.</font> [B557]"
|
|
393 elif self.sum() == 7 or self.sum() == 14:
|
|
394 myStr += " <font color='#ff0000'>You stumble: <i>If attacking,</i> you advance one yard past opponent with them behind you (you are facing away); <i>if parrying</i> you fall down!</font> [B557]"
|
|
395 elif self.sum() == 15:
|
|
396 mslStr = str(int(random.uniform(1,4)))
|
|
397 myStr += " <font color='#ff0000'>You tear a muscle; " + mslStr + " HT damage to the limb used to attack (to one limb if two used to attack), & -3 to use it (-1 w/high pain thresh); also all atacks & defenses -1 until next turn. If neck was injured -3 (-1 w/high pain thresh) applies to ALL actions.</font> [B557]"
|
|
398 elif self.sum() == 6:
|
|
399 myStr += " <font color='#ff0000'>You hit a solid object (wall, floor, etc.) & take crushing damage equalt to 1/2 of (your thrusting damage - your DR) (<i>EXCEPTION:</i> If attacking with natural weapons, such as claws or teeth, they <i>break</i> -1 damage on future attacks until you heal (for recovery, B422).</font> [B557]"
|
|
400 elif self.sum() == 5 or self.sum() == 16:
|
|
401 myStr += " <font color='#ff0000'>You hit a solid object (wall, floor, etc.) & take crushing damage = your thrusting damage - your DR (<i>EXCEPTION:</i> if opponent using impaling weapon, you fall on it & take damage based on your ST). If attacking an opponent who is using an impaling weapon, you fall on <i>his weapon</i>. You suffer the weapon's normal damage based on <i>your</i> <b>ST</b>.</font> [B557]"
|
|
402 elif self.sum() == 4:
|
|
403 myStr += " <font color='#ff0000'>If attacking or parrying with a limb, you strain the limb: 1 HP damage & it's crippled for 30 min. If biting, butting, etc., have moderate neck pain (B428) for next 20-HT min minimum of 1 minute.</font> [B557]"
|
|
404 elif self.sum() == 17:
|
|
405 myStr += " <font color='#ff0000'>If attacking or parrying with a limb, you strain the limb: 1 HP damage & it's crippled for 30 min. If IQ 3-5 animal, it loses its nerve & flees on next turn or surrenders if cornered.</font> [B557]"
|
|
406 elif self.sum() == 3 or self.sum() == 18 :
|
|
407 myStr += " <font color='#ff0000'>You knock yourself out! Roll vs. HT every 30 min. to recover.</font> [B557]"
|
|
408
|
|
409 return myStr
|
|
410
|
|
411 class gurpsspellfail(std):
|
|
412 def __init__(self,source=[],mod=0):
|
|
413 std.__init__(self,source)
|
|
414
|
|
415 def __str__(self):
|
|
416 myStr = "[" + str(self.data[0])
|
|
417 for a in self.data[1:]:
|
|
418 myStr += ","
|
|
419 myStr += str(a)
|
|
420 myStr +="]"
|
|
421 myStr += " = <b>" + str(self.sum()) + "</b>"
|
|
422
|
|
423 if self.sum() == 10 or self.sum() == 11:
|
|
424 myStr += " <font color='#ff0000'>Spell produces nothing but a loud noise, bright flash, awful odor, etc.</font> [B236]"
|
|
425 elif self.sum() == 9:
|
|
426 myStr += " <font color='#ff0000'>Spell fails entirely. Caster is stunned (IQ roll to recover).</font> [B236]"
|
|
427 elif self.sum() == 12:
|
|
428 myStr += " <font color='#ff0000'>Spell produces a weak and useless shadow of the intended effect.</font> [B236]"
|
|
429 elif self.sum() == 8:
|
|
430 myStr += " <font color='#ff0000'>Spell fails entirely. Caster takes 1 point of damage.</font> [B236]"
|
|
431 elif self.sum() == 13:
|
|
432 myStr += " <font color='#ff0000'>Spell produces the reverse of the intended effect.</font> [B236]"
|
|
433 elif self.sum() == 7:
|
|
434 myStr += " <font color='#ff0000'>Spell affects someone or something other than the intended subject.</font> [B236]"
|
|
435 elif self.sum() == 14:
|
|
436 myStr += " <font color='#ff0000'>Spell seems to work, but it is only a useless illusion.</font> [B236]"
|
|
437 elif self.sum() == 5 or self.sum() == 6:
|
|
438 myStr += " <font color='#ff0000'>Spell is cast on one of the caster's companions (if harmful) or a random nearby foe (if beneficial).</font> [B236]"
|
|
439 elif self.sum() == 15 or self.sum() == 16:
|
|
440 myStr += " <font color='#ff0000'>Spell has the reverse of the intended, on the wrong target. Roll randomly.</font> [B236]"
|
|
441 elif self.sum() == 4:
|
|
442 myStr += " <font color='#ff0000'>Spell is cast on caster (if harmful) or on a random nearby foe (if beneficial).</font> [B236]"
|
|
443 elif self.sum() == 17:
|
|
444 myStr += " <font color='#ff0000'>Spell fails entirely. Caster temporarily forgets the spell. Make a weekly IQ roll (after a week passes) until the spell is remembered.</font> [B236]"
|
|
445 elif self.sum() == 3:
|
|
446 myStr += " <font color='#ff0000'>Spell fails entirely. Caster takes 1d of injury.</font> [B236]"
|
|
447 elif self.sum() == 18:
|
|
448 myStr += " <font color='#ff0000'>Spell fails entirely. A demon or other malign entity appears and attacks the caster. (GM may waive this if the caster and spell were both lily-white, pure good in intent.)</font> [B236]"
|
|
449
|
|
450 return myStr
|
|
451
|
|
452 class gurpsfrightcheck(std):
|
|
453 def __init__(self,source=[],skill=0,mod=0):
|
|
454 std.__init__(self,source)
|
|
455 self.skill = skill
|
|
456 self.mod = mod
|
|
457
|
|
458 def is_success(self):
|
|
459 return (((self.sum()) <= self.skill+self.mod) and (self.sum() < 14))
|
|
460
|
|
461 def __str__(self):
|
|
462 myStr = "[" + str(self.data[0])
|
|
463 for a in self.data[1:]:
|
|
464 myStr += ","
|
|
465 myStr += str(a)
|
|
466 myStr +="]"
|
|
467 myStr += " = <b>" + str(self.sum()) + "</b>"
|
|
468
|
|
469 if self.skill+self.mod < 14:
|
|
470 myStr += " vs <b>(" + str(self.skill+self.mod) + ")</b>"
|
|
471 Diff = abs((self.skill+self.mod) - self.sum())
|
|
472 else:
|
|
473 myStr += " vs <b>(13)</b>"
|
|
474 Diff = abs(13 - self.sum())
|
|
475
|
|
476 if self.is_success():
|
|
477 if self.sum() == 3 or self.sum() == 4:
|
|
478 myStr += " or less <font color='#ff0000'><b>Critical Success!</b></font> [B556]"
|
|
479 else:
|
|
480 myStr += " or less <font color='#ff0000'><b>Success!</b> by " + str(Diff) +" </font>"
|
|
481 else:
|
|
482 myStr += " or less <font color='#ff0000'><b>Failure!</b> by " + str(Diff) +" </font>"
|
|
483
|
|
484 if self.skill + self.mod > 13:
|
|
485 myStr += " Rule of 14 in effect [B360]"
|
|
486
|
|
487 if not(self.is_success()):
|
|
488 intD1 = int(random.uniform(1,7))
|
|
489 intD2 = int(random.uniform(1,7))
|
|
490 intD3 = int(random.uniform(1,7))
|
|
491 intFright = intD1 + intD2 + intD3 + Diff
|
|
492 myStr += "<br />Rolling on Fright Check Table<br />[" + str(intD1) + "," + str(intD2) + "," + str(intD3) + "] ==> " + str(intFright - Diff) + " + " + str(Diff) + " = " + str(intFright) + "<br />"
|
|
493 if intFright < 6:
|
|
494 myStr += "<font color='#ff0000'>Stunned for one second, then recover automatically.</font> [B360]"
|
|
495 elif intFright < 8:
|
|
496 myStr += "<font color='#ff0000'>Stunned for one second. Every second after that, roll vs. unmodified Will to snap out of it.</font> [B360]"
|
|
497 elif intFright < 10:
|
|
498 myStr += "<font color='#ff0000'>Stunned for one second. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it.</font> [B360]"
|
|
499 elif intFright == 10:
|
|
500 strStun = str(int(random.uniform(1,7)))
|
|
501 myStr += "<font color='#ff0000'>Stunned for " + strStun + " seconds. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it.</font> [B360]"
|
|
502 elif intFright == 11:
|
|
503 strStun = str(int(random.uniform(2,13)))
|
|
504 myStr += "<font color='#ff0000'>Stunned for " + strStun + " seconds. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it.</font> [B361]"
|
|
505 elif intFright == 12:
|
|
506 myStr += "<font color='#ff0000'>Lose your lunch. Treat this as retching for (25-HT) seconds, and then roll vs. HT each second to recover [B428].</font> [B361]"
|
|
507 elif intFright == 13:
|
|
508 myStr += "<font color='#ff0000'>Acquire a new mental quirk.</font> [B361]"
|
|
509 elif intFright < 16:
|
|
510 strFP = str(int(random.uniform(1,7)))
|
|
511 strSeconds = str(int(random.uniform(1,7)))
|
|
512 myStr += "<font color='#ff0000'>Lose " + strFP + " FP, and stunned for " + strSeconds + " seconds. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it.</font> [B361]"
|
|
513 elif intFright == 16:
|
|
514 strSeconds = str(int(random.uniform(1,7)))
|
|
515 myStr += "<font color='#ff0000'>Stunned for " + strSeconds + " seconds. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it. Acquire a new mental quirk.</font> [B361]"
|
|
516 elif intFright == 17:
|
|
517 strMinutes = str(int(random.uniform(1,7)))
|
|
518 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes. Every minute after that roll vs. HT to recover.</font> [B361]"
|
|
519 elif intFright == 18:
|
|
520 strMinutes = str(int(random.uniform(1,7)))
|
|
521 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes and roll vs. HT immediately. On a failed roll, take 1 HP of injury as you collapse. Every minute after that roll vs. HT to recover.</font> [B361]"
|
|
522 elif intFright == 19:
|
|
523 strMinutes = str(int(random.uniform(2,13)))
|
|
524 myStr += "<font color='#ff0000'>Severe faint, lasting for " + strMinutes + " minutes. Every minute after that roll vs. HT to recover. Take 1 HP of injury.</font> [B361]"
|
|
525 elif intFright == 20:
|
|
526 strMinutes = str(int(random.uniform(4,25)))
|
|
527 strFP = str(int(random.uniform(1,7)))
|
|
528 myStr += "<font color='#ff0000'>Faint bordering on shock, lastering for " + strMinutes + " minutes. Also, lose " + strFP + " FP.</font> [B361]"
|
|
529 elif intFright == 21:
|
|
530 strMinutes = str(int(random.uniform(1,7)))
|
|
531 myStr += "<font color='#ff0000'>Panic. You run around screaming, sit down and cry, or do something else equally pointless for " + strMinutes + " minutes. Every minute after that, roll vs. unmodified Will to snap out of it.</font> [B361]"
|
|
532 elif intFright == 22:
|
|
533 myStr += "<font color='#ff0000'>Acquire a new -10-point Delusion (B130).</font> [B361]"
|
|
534 elif intFright == 23:
|
|
535 myStr += "<font color='#ff0000'>Acquire a new -10-point Phobia (B148) or other -10-point mental disadvantage.</font> [B361]"
|
|
536 elif intFright == 24:
|
|
537 myStr += "<font color='#ff0000'>Major physical effect, set by the GM: hair turns white, age five years overnight, go partially deaf, etc. (Acquire -15 points worth of physical disadvantages. Each year of aging = -3 points.)</font> [B361]"
|
|
538 elif intFright == 25 :
|
|
539 myStr += "<font color='#ff0000'>If you already have a Phobia or other mental disadvantage that is logically related to the frightening incident, your self-control number becomes one step worse. If not, or if your self-control number is already 6, add a new -10-point Phobia or other -10-point mental disadvantage.</font> [B361]"
|
|
540 elif intFright == 26:
|
|
541 strMinutes = str(int(random.uniform(1,7)))
|
|
542 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes and roll vs. HT immediately. On a failed roll, take 1 HP of injury as you collapse. Every minute after that roll vs. HT to recover. Also acquire a new -10-point Delusion (B130).</font> [B361]"
|
|
543 elif intFright == 27:
|
|
544 strMinutes = str(int(random.uniform(1,7)))
|
|
545 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes and roll vs. HT immediately. On a failed roll, take 1 HP of injury as you collapse. Every minute after that roll vs. HT to recover. Also acquire a new -10-point Phobia (B148) or other -10-point mental disadvantage.</font> [B361]"
|
|
546 elif intFright == 28:
|
|
547 myStr += "<font color='#ff0000'>Light coma. You fall unconscious, rolling vs. HT every 30 minutes to recover. For 6 hours after you come to, all skill rolls and attribute checks are at -2.</font> [B361]"
|
|
548 elif intFright == 29:
|
|
549 strHours = str(int(random.uniform(1,7)))
|
|
550 myStr += "<font color='#ff0000'>Coma. You fall unconcious for " + strHours + " hours. At the end of the " + strHours + " hours, roll vs. HT to recover. Continue to roll every " + strHours + " hours until you recover.</font> [B361]"
|
|
551 elif intFright == 30:
|
|
552 strDays = str(int(random.uniform(1,7)))
|
|
553 myStr += "<font color='#ff0000'>Catatonia. Stare into space for " + strDays + " days. Then roll vs. HT. On a failed roll, remain catatonic for another " + strDays + " days, and so on. If you have no medical care, lose 1 HP the first day, 2 HP the second day and so on. If you survive and awaken, all skill rolls and attribute checks are at -2 for as many days as the catatonia lasted.</font> [B361]"
|
|
554 elif intFright == 31:
|
|
555 strMinutes = str(int(random.uniform(1,7)))
|
|
556 strFP = str(int(random.uniform(1,7)))
|
|
557 strInjury = str(int(random.uniform(1,7)))
|
|
558 myStr += "<font color='#ff0000'>Seizure. You lose control of your body and fall to the ground in a fit lasting " + strMinutes + " minutes and costing " + strFP + " FP. Also, roll vs. HT. On a failure, take " + strInjury + " HP of injury. On a critical failure, you also lose 1 HT <i>permanently</i>.</font> [B361]"
|
|
559 elif intFright == 32:
|
|
560 strInjury = str(int(random.uniform(2,13)))
|
|
561 myStr += "<font color='#ff0000'>Stricken. You fall to the ground, taking " + strInjury + " HP of injury in the form of a mild heart attack or stroke.</font> [B361]"
|
|
562 elif intFright == 33:
|
|
563 myStr += "<font color='#ff0000'>Total panic. You are out of control; you might do anything (GM rolls 3d: the higher the roll, the more useless your reaction). For instance, you might jump off a cliff to avoid the monster. If you survive your first reaction, roll vs. Will to come out of the panic. If you fail, the GM rolls again for another panic reaction, and so on!</font> [B361]"
|
|
564 elif intFright == 34:
|
|
565 myStr += "<font color='#ff0000'>Acquire a new -15-point Delusion (B130).</font> [B361]"
|
|
566 elif intFright == 35:
|
|
567 myStr += "<font color='#ff0000'>Acquire a new -15-point Phobia (B148) or other -15-point mental disadvantage.</font> [B361]"
|
|
568 elif intFright == 36:
|
|
569 myStr += "<font color='#ff0000'>Severe physical effect, set by the GM. (Acquire -20 points worth of physical disadvantages, aging = -3 per year).</font> [B361]"
|
|
570 elif intFright == 37:
|
|
571 myStr += "<font color='#ff0000'>Severe physical effect, set by the GM. (Acquire -30 points worth of physical disadvantages, aging = -3 per year).</font> [B361]"
|
|
572 elif intFright == 39:
|
|
573 strHours = str(int(random.uniform(1,7)))
|
|
574 myStr += "<font color='#ff0000'>Coma. You fall unconcious for " + strHours + " hours. At the end of the " + strHours + " hours, roll vs. HT to recover. Continue to roll every " + strHours + " hours until you recover. Also acquire a new -15-point Delusion (B130).</font> [B361]"
|
|
575 elif intFright == 39:
|
|
576 strHours = str(int(random.uniform(1,7)))
|
|
577 myStr += "<font color='#ff0000'>Coma. You fall unconcious for " + strHours + " hours. At the end of the " + strHours + " hours, roll vs. HT to recover. Continue to roll every " + strHours + " hours until you recover. Also acquire a new -15-point Phobia (B148) or other -15-point mental disadvantage.</font> [B361]"
|
|
578 else:
|
|
579 strHours = str(int(random.uniform(1,7)))
|
|
580 myStr += "<font color='#ff0000'>Coma. You fall unconcious for " + strHours + " hours. At the end of the " + strHours + " hours, roll vs. HT to recover. Continue to roll every " + strHours + " hours until you recover. Also acquire a new -15-point Phobia (B148) or other -15-point mental disadvantage. Also lose 1 point of IQ <i>permanently</i>. This automatically reduces all IQ-based skill, including magic spells, by 1.</font> [B361]"
|
|
581 return myStr
|
|
582
|
|
583 class gurpsfrightcheckfail(std):
|
|
584 def __init__(self,source=[],mod=0):
|
|
585 std.__init__(self,source)
|
|
586 self.mod = mod
|
|
587
|
|
588 def __str__(self):
|
|
589 myStr = "[" + str(self.data[0])
|
|
590 for a in self.data[1:]:
|
|
591 myStr += ","
|
|
592 myStr += str(a)
|
|
593 myStr +="] + " + str(self.mod)
|
|
594 intFright = self.sum() + self.mod
|
|
595 myStr += " = <b>" + str(intFright) + "</b> "
|
|
596
|
|
597 if intFright < 6:
|
|
598 myStr += "<font color='#ff0000'>Stunned for one second, then recover automatically.</font> [B360]"
|
|
599 elif intFright < 8:
|
|
600 myStr += "<font color='#ff0000'>Stunned for one second. Every second after that, roll vs. unmodified Will to snap out of it.</font> [B360]"
|
|
601 elif intFright < 10:
|
|
602 myStr += "<font color='#ff0000'>Stunned for one second. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it.</font> [B360]"
|
|
603 elif intFright == 10:
|
|
604 strStun = str(int(random.uniform(1,7)))
|
|
605 myStr += "<font color='#ff0000'>Stunned for " + strStun + " seconds. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it.</font> [B360]"
|
|
606 elif intFright == 11:
|
|
607 strStun = str(int(random.uniform(2,13)))
|
|
608 myStr += "<font color='#ff0000'>Stunned for " + strStun + " seconds. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it.</font> [B361]"
|
|
609 elif intFright == 12:
|
|
610 myStr += "<font color='#ff0000'>Lose your lunch. Treat this as retching for (25-HT) seconds, and then roll vs. HT each second to recover [B428].</font> [B361]"
|
|
611 elif intFright == 13:
|
|
612 myStr += "<font color='#ff0000'>Acquire a new mental quirk.</font> [B361]"
|
|
613 elif intFright < 16:
|
|
614 strFP = str(int(random.uniform(1,7)))
|
|
615 strSeconds = str(int(random.uniform(1,7)))
|
|
616 myStr += "<font color='#ff0000'>Lose " + strFP + " FP, and stunned for " + strSeconds + " seconds. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it.</font> [B361]"
|
|
617 elif intFright == 16:
|
|
618 strSeconds = str(int(random.uniform(1,7)))
|
|
619 myStr += "<font color='#ff0000'>Stunned for " + strSeconds + " seconds. Every second after that, roll vs. Will, plus whatever bonuses or penalties you had on your original roll, to snap out of it. Acquire a new mental quirk.</font> [B361]"
|
|
620 elif intFright == 17:
|
|
621 strMinutes = str(int(random.uniform(1,7)))
|
|
622 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes. Every minute after that roll vs. HT to recover.</font> [B361]"
|
|
623 elif intFright == 18:
|
|
624 strMinutes = str(int(random.uniform(1,7)))
|
|
625 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes and roll vs. HT immediately. On a failed roll, take 1 HP of injury as you collapse. Every minute after that roll vs. HT to recover.</font> [B361]"
|
|
626 elif intFright == 19:
|
|
627 strMinutes = str(int(random.uniform(2,13)))
|
|
628 myStr += "<font color='#ff0000'>Severe faint, lasting for " + strMinutes + " minutes. Every minute after that roll vs. HT to recover. Take 1 HP of injury.</font> [B361]"
|
|
629 elif intFright == 20:
|
|
630 strMinutes = str(int(random.uniform(4,25)))
|
|
631 strFP = str(int(random.uniform(1,7)))
|
|
632 myStr += "<font color='#ff0000'>Faint bordering on shock, lastering for " + strMinutes + " minutes. Also, lose " + strFP + " FP.</font> [B361]"
|
|
633 elif intFright == 21:
|
|
634 strMinutes = str(int(random.uniform(1,7)))
|
|
635 myStr += "<font color='#ff0000'>Panic. You run around screaming, sit down and cry, or do something else equally pointless for " + strMinutes + " minutes. Every minute after that, roll vs. unmodified Will to snap out of it.</font> [B361]"
|
|
636 elif intFright == 22:
|
|
637 myStr += "<font color='#ff0000'>Acquire a new -10-point Delusion (B130).</font> [B361]"
|
|
638 elif intFright == 23:
|
|
639 myStr += "<font color='#ff0000'>Acquire a new -10-point Phobia (B148) or other -10-point mental disadvantage.</font> [B361]"
|
|
640 elif intFright == 24:
|
|
641 myStr += "<font color='#ff0000'>Major physical effect, set by the GM: hair turns white, age five years overnight, go partially deaf, etc. (Acquire -15 points worth of physical disadvantages. Each year of aging = -3 points.)</font> [B361]"
|
|
642 elif intFright == 25 :
|
|
643 myStr += "<font color='#ff0000'>If you already have a Phobia or other mental disadvantage that is logically related to the frightening incident, your self-control number becomes one step worse. If not, or if your self-control number is already 6, add a new -10-point Phobia or other -10-point mental disadvantage.</font> [B361]"
|
|
644 elif intFright == 26:
|
|
645 strMinutes = str(int(random.uniform(1,7)))
|
|
646 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes and roll vs. HT immediately. On a failed roll, take 1 HP of injury as you collapse. Every minute after that roll vs. HT to recover. Also acquire a new -10-point Delusion (B130).</font> [B361]"
|
|
647 elif intFright == 27:
|
|
648 strMinutes = str(int(random.uniform(1,7)))
|
|
649 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes and roll vs. HT immediately. On a failed roll, take 1 HP of injury as you collapse. Every minute after that roll vs. HT to recover. Also acquire a new -10-point Phobia (B148) or other -10-point mental disadvantage.</font> [B361]"
|
|
650 elif intFright == 28:
|
|
651 myStr += "<font color='#ff0000'>Light coma. You fall unconscious, rolling vs. HT every 30 minutes to recover. For 6 hours after you come to, all skill rolls and attribute checks are at -2.</font> [B361]"
|
|
652 elif intFright == 29:
|
|
653 strHours = str(int(random.uniform(1,7)))
|
|
654 myStr += "<font color='#ff0000'>Coma. You fall unconcious for " + strHours + " hours. At the end of the " + strHours + " hours, roll vs. HT to recover. Continue to roll every " + strHours + " hours until you recover.</font> [B361]"
|
|
655 elif intFright == 30:
|
|
656 strDays = str(int(random.uniform(1,7)))
|
|
657 myStr += "<font color='#ff0000'>Catatonia. Stare into space for " + strDays + " days. Then roll vs. HT. On a failed roll, remain catatonic for another " + strDays + " days, and so on. If you have no medical care, lose 1 HP the first day, 2 HP the second day and so on. If you survive and awaken, all skill rolls and attribute checks are at -2 for as many days as the catatonia lasted.</font> [B361]"
|
|
658 elif intFright == 31:
|
|
659 strMinutes = str(int(random.uniform(1,7)))
|
|
660 strFP = str(int(random.uniform(1,7)))
|
|
661 strInjury = str(int(random.uniform(1,7)))
|
|
662 myStr += "<font color='#ff0000'>Seizure. You lose control of your body and fall to the ground in a fit lasting " + strMinutes + " minutes and costing " + strFP + " FP. Also, roll vs. HT. On a failure, take " + strInjury + " HP of injury. On a critical failure, you also lose 1 HT <i>permanently</i>.</font> [B361]"
|
|
663 elif intFright == 32:
|
|
664 strInjury = str(int(random.uniform(2,13)))
|
|
665 myStr += "<font color='#ff0000'>Stricken. You fall to the ground, taking " + strInjury + " HP of injury in the form of a mild heart attack or stroke.</font> [B361]"
|
|
666 elif intFright == 33:
|
|
667 myStr += "<font color='#ff0000'>Total panic. You are out of control; you might do anything (GM rolls 3d: the higher the roll, the more useless your reaction). For instance, you might jump off a cliff to avoid the monster. If you survive your first reaction, roll vs. Will to come out of the panic. If you fail, the GM rolls again for another panic reaction, and so on!</font> [B361]"
|
|
668 elif intFright == 34:
|
|
669 myStr += "<font color='#ff0000'>Acquire a new -15-point Delusion (B130).</font> [B361]"
|
|
670 elif intFright == 35:
|
|
671 myStr += "<font color='#ff0000'>Acquire a new -15-point Phobia (B148) or other -15-point mental disadvantage.</font> [B361]"
|
|
672 elif intFright == 36:
|
|
673 myStr += "<font color='#ff0000'>Severe physical effect, set by the GM. (Acquire -20 points worth of physical disadvantages, aging = -3 per year).</font> [B361]"
|
|
674 elif intFright == 37:
|
|
675 myStr += "<font color='#ff0000'>Severe physical effect, set by the GM. (Acquire -30 points worth of physical disadvantages, aging = -3 per year).</font> [B361]"
|
|
676 elif intFright == 39:
|
|
677 strHours = str(int(random.uniform(1,7)))
|
|
678 myStr += "<font color='#ff0000'>Coma. You fall unconcious for " + strHours + " hours. At the end of the " + strHours + " hours, roll vs. HT to recover. Continue to roll every " + strHours + " hours until you recover. Also acquire a new -15-point Delusion (B130).</font> [B361]"
|
|
679 elif intFright == 39:
|
|
680 strHours = str(int(random.uniform(1,7)))
|
|
681 myStr += "<font color='#ff0000'>Coma. You fall unconcious for " + strHours + " hours. At the end of the " + strHours + " hours, roll vs. HT to recover. Continue to roll every " + strHours + " hours until you recover. Also acquire a new -15-point Phobia (B148) or other -15-point mental disadvantage.</font> [B361]"
|
|
682 else:
|
|
683 strHours = str(int(random.uniform(1,7)))
|
|
684 myStr += "<font color='#ff0000'>Coma. You fall unconcious for " + strHours + " hours. At the end of the " + strHours + " hours, roll vs. HT to recover. Continue to roll every " + strHours + " hours until you recover. Also acquire a new -15-point Phobia (B148) or other -15-point mental disadvantage. Also lose 1 point of IQ <i>permanently</i>. This automatically reduces all IQ-based skill, including magic spells, by 1.</font> [B361]"
|
|
685
|
|
686 return myStr
|