comparison orpg/dieroller/rollers/gurps.py @ 167:5c9a118476b2 alpha

Traipse Alpha 'OpenRPG' {091210-00} Traipse is a distribution of OpenRPG that is designed to be easy to setup and go. Traipse also makes it easy for developers to work on code without fear of sacrifice. 'Ornery-Orc' continues the trend of 'Grumpy' and adds fixes to the code. 'Ornery-Orc's main goal is to offer more advanced features and enhance the productivity of the user. Update Summary (Keeping up with Beta) New Features: Added Bookmarks Added 'boot' command to remote admin Added confirmation window for sent nodes Minor changes to allow for portability to an OpenSUSE linux OS Miniatures Layer pop up box allows users to turn off Mini labels, from FlexiRPG Zoom Mouse plugin added Images added to Plugin UI Switching to Element Tree Map efficiency, from FlexiRPG Added Status Bar to Update Manager New TrueDebug Class in orpg_log (See documentation for usage) Portable Mercurial Tip of the Day added, from Core and community New Reference Syntax added for custom PC sheets New Child Reference for gametree New Parent Reference for gametree New Gametree Recursion method, mapping, context sensitivity, and effeciency.. New Features node with bonus nodes and Node Referencing help added Dieroller structure from Core Added 7th Sea die roller method; ie [7k3] = [7d10.takeHighest(3).open(10)] New 'Mythos' System die roller added Added new vs. die roller method for WoD; ie [3v3] = [3d10.vs(3)]. Includes support for Mythos roller Fixes: Fix to Text based Server Fix to Remote Admin Commands Fix to Pretty Print, from Core Fix to Splitter Nodes not being created Fix to massive amounts of images loading, from Core Fix to Map from gametree not showing to all clients Fix to gametree about menus Fix to Password Manager check on startup Fix to PC Sheets from tool nodes. They now use the tabber_panel Fixed Whiteboard ID to prevent random line or text deleting. Modified ID's to prevent non updated clients from ruining the fix. default_manifest.xml renamed to default_upmana.xml Fix to Update Manager; cleaner clode for saved repositories Fixes made to Settings Panel and no reactive settings when Ok is pressed Fixes to Alternity roller's attack roll. Uses a simple Tuple instead of a Splice
author sirebral
date Thu, 10 Dec 2009 10:53:33 -0600
parents
children dcae32e219f1
comparison
equal deleted inserted replaced
166:eef2463cd441 167:5c9a118476b2
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
55 from std import std
56 from orpg.dieroller.base import *
57
58
59 __version__ = "$Id: gurps.py,v 1.5 2007/05/06 16:42:55 digitalxero Exp $"
60
61 # gurps
62
63 class gurps(std):
64 name = "gurps"
65
66 def __init__(self,source=[]):
67 std.__init__(self,source)
68
69 # these methods return new die objects for specific options
70
71 # Original msk roll renamed to be easier to understand/remember
72 def skill(self,skill,mod):
73 return gurpsskill(self,skill,mod)
74
75 def defaultskill(self,stat,defaultlevel,mod):
76 return gurpsdefaultskill(self,stat,defaultlevel,mod)
77
78 def supernatural(self,skill,resistance,mod):
79 return gurpssupernatural(self,skill,resistance,mod)
80
81 def crit_hit(self):
82 return gurpscrit_hit(self)
83
84 def crit_headblow(self):
85 return gurpscrit_headblow(self)
86
87 def crit_miss(self):
88 return gurpscrit_miss(self)
89
90 def crit_unarm(self):
91 return gurpscrit_unarm(self)
92
93 def spellfail(self):
94 return gurpsspellfail(self)
95
96 def frightcheck(self,level,mod):
97 return gurpsfrightcheck(self,level,mod)
98
99 def frightcheckfail(self,mod):
100 return gurpsfrightcheckfail(self,mod)
101
102 die_rollers.register(gurps)
103
104 class gurpsskill(std):
105 def __init__(self,source=[],skill=0,mod=0):
106 std.__init__(self,source)
107 self.skill = skill
108 self.mod = mod
109
110 def is_success(self):
111 return (((self.sum()) <= self.skill+self.mod) and (self.sum() < 17))
112
113 def __str__(self):
114 myStr = "[" + str(self.data[0])
115 for a in self.data[1:]:
116 myStr += ","
117 myStr += str(a)
118 myStr +="]"
119 myStr += " = <b>" + str(self.sum()) + "</b>"
120 myStr += " vs <b>(" + str(self.skill+self.mod) + ")</b>"
121
122 Diff = abs((self.skill+self.mod) - self.sum())
123
124 if self.is_success():
125 if self.sum() == 3 or self.sum() == 4:
126 myStr += " or less <font color='#ff0000'><b>Critical Success!</b></font> [B556]"
127 elif self.sum() == 5 and (self.skill+self.mod > 14):
128 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +" </font> [B556]"
129 elif self.sum() == 6 and (self.skill+self.mod > 15):
130 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +" </font> [B556]"
131 else:
132 myStr += " or less <font color='#ff0000'><b>Success!</b> by " + str(Diff) +" </font>"
133 else:
134 if self.sum() == 18:
135 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
136 # elif self.sum() == 17 and (self.skill+self.mod < 16):
137 # myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
138 elif self.sum() == 17:
139 if (self.skill+self.mod) < 16:
140 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
141 else:
142 myStr += " or less <font color='#ff0000'><b>Failure!</b></font> [B556]"
143 elif Diff > 9:
144 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b> by " + str(Diff) +" </font> [B556]"
145 else:
146 myStr += " or less <font color='#ff0000'><b>Failure!</b> by " + str(Diff) +" </font>"
147
148 return myStr
149
150 class gurpsdefaultskill(std):
151 def __init__(self,source=[],stat=0,defaultlevel=0,mod=0):
152 std.__init__(self,source)
153 self.stat = stat
154 self.defaultlevel = defaultlevel
155 self.mod = mod
156
157 def is_success(self):
158 if self.stat < 21:
159 intSkillVal = self.stat + self.defaultlevel + self.mod
160 else:
161 intSkillVal = 20 + self.defaultlevel + self.mod
162 return (((self.sum()) <= intSkillVal) and (self.sum() < 17))
163
164 def __str__(self):
165 myStr = "[" + str(self.data[0])
166 for a in self.data[1:]:
167 myStr += ","
168 myStr += str(a)
169 myStr +="]"
170 myStr += " = <b>" + str(self.sum()) + "</b>"
171 strRule = ""
172 if self.stat < 21:
173 intSkillVal = self.stat + self.defaultlevel + self.mod
174 else:
175 intSkillVal = 20 + self.defaultlevel + self.mod
176 strRule = "<br />Rule of 20 in effect [B173, B344]"
177
178 myStr += " vs <b>(" + str(intSkillVal) + ")</b>"
179
180 Diff = abs((intSkillVal) - self.sum())
181
182 if self.is_success():
183 if self.sum() == 3 or self.sum() == 4:
184 myStr += " or less <font color='#ff0000'><b>Critical Success!</b></font> [B556]"
185 elif self.sum() == 5 and (intSkillVal > 14):
186 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +"</font> [B556]"
187 elif self.sum() == 6 and (intSkillVal > 15):
188 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +"</font> [B556]"
189 else:
190 myStr += " or less <font color='#ff0000'><b>Success!</b> by " + str(Diff) +"</font>"
191 else:
192 if self.sum() == 18:
193 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
194 elif self.sum() == 17:
195 if intSkillVal < 16:
196 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
197 else:
198 myStr += " or less <font color='#ff0000'><b>Failure!</b></font> [B556]"
199 elif Diff > 9:
200 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b> by " + str(Diff) +"</font> [B556]"
201 else:
202 myStr += " or less <font color='#ff0000'><b>Failure!</b> by " + str(Diff) +"</font>"
203
204 myStr += strRule
205 return myStr
206
207 class gurpssupernatural(std):
208 def __init__(self,source=[],skill=0,resistance=0,mod=0):
209 std.__init__(self,source)
210 self.skill = skill
211 self.resistance = resistance
212 self.mod = mod
213
214 def is_success(self):
215 if self.skill+self.mod > 16:
216 if self.resistance > 16:
217 if self.resistance > self.skill+self.mod:
218 newSkill = self.skill+self.mod
219 else:
220 newSkill = self.resistance
221 else:
222 newSkill = 16
223 else:
224 newSkill = self.skill+self.mod
225 return (((self.sum()) <= newSkill) and (self.sum() < 17))
226
227 def __str__(self):
228 myStr = "[" + str(self.data[0])
229 for a in self.data[1:]:
230 myStr += ","
231 myStr += str(a)
232 myStr +="]"
233 myStr += " = <b>" + str(self.sum()) + "</b>"
234 strRule = ""
235 if self.skill+self.mod > 16:
236 if self.resistance > 16:
237 if self.resistance > self.skill+self.mod:
238 newSkill = self.skill+self.mod
239 strRule = "<br />Rule of 16: Subject's Resistance is higher than skill, no change in skill [B349]"
240 else:
241 newSkill = self.resistance
242 strRule = "<br />Rule of 16: Effective skill limited by subject's Resistance [B349]"
243 else:
244 newSkill = 16
245 strRule = "<br />Rule of 16: Effective skill limited to 16 [B349]"
246 else:
247 newSkill = self.skill+self.mod
248 myStr += " vs <b>(" + str(newSkill) + ")</b>"
249
250 Diff = abs((newSkill) - self.sum())
251
252 if self.is_success():
253 if self.sum() == 3 or self.sum() == 4:
254 myStr += " or less <font color='#ff0000'><b>Critical Success!</b></font> [B556]"
255 elif self.sum() == 5 and (newSkill > 14):
256 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +" </font> [B556]"
257 elif self.sum() == 6 and (newSkill > 15):
258 myStr += " or less <font color='#ff0000'><b>Critical Success!</b> by " + str(Diff) +" </font> [B556]"
259 else:
260 myStr += " or less <font color='#ff0000'><b>Success!</b> by " + str(Diff) +" </font>"
261 else:
262 if self.sum() == 18:
263 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
264 elif self.sum() == 17:
265 if newSkill < 16:
266 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b></font> [B556]"
267 else:
268 myStr += " or less <font color='#ff0000'><b>Failure!</b></font> [B556]"
269 elif Diff > 9:
270 myStr += " or less <font color='#ff0000'><b>Critical Failure!</b> by " + str(Diff) +" </font> [B556]"
271 else:
272 myStr += " or less <font color='#ff0000'><b>Failure!</b> by " + str(Diff) +" </font>"
273
274 myStr += strRule
275 return myStr
276
277 class gurpscrit_hit(std):
278 def __init__(self,source=[],mod=0):
279 std.__init__(self,source)
280
281 def __str__(self):
282 myStr = "[" + str(self.data[0]) #Variable myStr holds text and first we put a [ into it and then adds the first die rolled
283 for a in self.data[1:]: #This is a for loop. It will do the next two lines of code for every die (except the first die which we handled in the line above) in the roll.
284 myStr += "," #Adds a comma after each die
285 myStr += str(a) #Adds the value of each die.
286 myStr += "] = " #Adds ] = to the end of the string (note the += means append to whatever is already stored in the variable
287 myStr += str(self.sum()) #Finally we add the actual result of the roll and myStr contains something like [3,2,1] = 6
288
289 if self.sum() > 8 and self.sum() < 12:
290 myStr += " <font color='#ff0000'>The blow inflicts normal damage.</font> [B556]"
291 elif self.sum() == 12:
292 myStr += " <font color='#ff0000'>The blow inflicts normal damage, AND victim drops anything they hold--even if no damage penetrates DR.</font> [B556]"
293 elif self.sum() == 8:
294 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]"
295 elif self.sum() == 13 or self.sum() == 14 or self.sum() == 7:
296 myStr += " <font color='#ff0000'>If any damage penetrates DR, treat as major wound. See [B420] for major wounds.</font> [B556]"
297 elif self.sum() == 6 or self.sum() == 15:
298 myStr += " <font color='#ff0000'>The blow inflicts maximum normal damage.</font> [B556]"
299 elif self.sum() == 5 or self.sum() == 16:
300 myStr += " <font color='#ff0000'>The blow inflicts double damage.</font> [B556]"
301 elif self.sum() == 4 or self.sum() == 17:
302 myStr += " <font color='#ff0000'>The victim's DR protects at half value, rounded down, after applying any armor divisors.</font> [B556]"
303 elif self.sum() == 3 or self.sum() == 18 :
304 myStr += " <font color='#ff0000'>The blow inflicts triple damage.</font> [B556]"
305
306 return myStr
307
308 class gurpscrit_headblow(std):
309 def __init__(self,source=[],mod=0):
310 std.__init__(self,source)
311
312 def __str__(self):
313 myStr = "[" + str(self.data[0]) #Variable myStr holds text and first we put a [ into it and then adds the first die rolled
314 for a in self.data[1:]: #This is a for loop. It will do the next two lines of code for every die (except the first die which we handled in the line above) in the roll.
315 myStr += "," #Adds a comma after each die
316 myStr += str(a) #Adds the value of each die.
317 myStr += "] = " #Adds ] = to the end of the string (note the += means append to whatever is already stored in the variable
318 myStr += str(self.sum()) #Finally we add the actual result of the roll and myStr contains something like [3,2,1] = 6
319
320 if self.sum() > 8 and self.sum() < 12:
321 myStr += " <font color='#ff0000'>The blow inflicts normal damage.</font> [B556]"
322 elif self.sum() == 12 or self.sum() == 13:
323 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]"
324 elif self.sum() == 8:
325 myStr += " <font color='#ff0000'>Normal damage to head, but victim knocked off balance: must Do Nothing until next turn (but can defend).</font> [B556]"
326 elif self.sum() == 14:
327 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]"
328 elif self.sum() == 6 or self.sum() == 7:
329 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]"
330 elif self.sum() == 15:
331 myStr += " <font color='#ff0000'>The blow inflicts maximum normal damage.</font> [B556]"
332 elif self.sum() == 16:
333 myStr += " <font color='#ff0000'>The blow inflicts double damage.</font> [B556]"
334 elif self.sum() == 4 or self.sum() == 5:
335 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]"
336 elif self.sum() == 17:
337 myStr += " <font color='#ff0000'>The victim's DR protects at half value, rounded up, after applying any armor divisors.</font> [B556]"
338 elif self.sum() == 3:
339 myStr += " <font color='#ff0000'>The blow inflicts maximum normal damage AND ignores all DR.</font> [B556]"
340 elif self.sum() == 18:
341 myStr += " <font color='#ff0000'>The blow inflicts triple damage.</font> [B556]"
342
343 return myStr
344
345 class gurpscrit_miss(std):
346 def __init__(self,source=[],mod=0):
347 std.__init__(self,source)
348
349 def __str__(self):
350 myStr = "[" + str(self.data[0]) #Variable myStr holds text and first we put a [ into it and then adds the first die rolled
351 for a in self.data[1:]: #This is a for loop. It will do the next two lines of code for every die (except the first die which we handled in the line above) in the roll.
352 myStr += "," #Adds a comma after each die
353 myStr += str(a) #Adds the value of each die.
354 myStr += "] = " #Adds ] = to the end of the string (note the += means append to whatever is already stored in the variable
355 myStr += str(self.sum()) #Finally we add the actual result of the roll and myStr contains something like [3,2,1] = 6
356
357 if self.sum() > 8 and self.sum() < 12:
358 myStr += " <font color='#ff0000'>You drop your weapon (& a <i>cheap</i> weapon breaks).</font> [B556]"
359 elif self.sum() == 12 or self.sum() == 8:
360 myStr += " <font color='#ff0000'>Your weapon turns in your hand; must Ready it before it can be used again.</font> [B556]"
361 elif self.sum() == 13 or self.sum() == 7:
362 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]"
363 elif self.sum() == 14:
364 yrdStr = str(int(random.uniform(1,7)))
365 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]"
366 elif self.sum() == 6:
367 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]"
368 elif self.sum() == 15:
369 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]"
370 elif self.sum() == 16:
371 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]"
372 elif self.sum() == 5:
373 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]"
374 elif self.sum() == 4 or self.sum() == 3 or self.sum() == 17 or self.sum() == 18:
375 broke = int(random.uniform(3,19))
376 if broke >=5 and broke <=16:
377 brokestr = "it is dropped."
378 else:
379 brokestr = "the weapon also breaks!"
380 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."
381
382 return myStr
383
384 class gurpscrit_unarm(std):
385 def __init__(self,source=[],mod=0):
386 std.__init__(self,source)
387
388 def __str__(self):
389 myStr = "[" + str(self.data[0]) #Variable myStr holds text and first we put a [ into it and then adds the first die rolled
390 for a in self.data[1:]: #This is a for loop. It will do the next two lines of code for every die (except the first die which we handled in the line above) in the roll.
391 myStr += "," #Adds a comma after each die
392 myStr += str(a) #Adds the value of each die.
393 myStr += "] = " #Adds ] = to the end of the string (note the += means append to whatever is already stored in the variable
394 myStr += str(self.sum()) #Finally we add the actual result of the roll and myStr contains something like [3,2,1] = 6
395
396 if self.sum() > 8 and self.sum() < 12:
397 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]"
398 elif self.sum() == 12:
399 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]"
400 elif self.sum() == 8:
401 myStr += " <font color='#ff0000'>You fall down!</font> [B557]"
402 elif self.sum() == 13:
403 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]"
404 elif self.sum() == 7 or self.sum() == 14:
405 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]"
406 elif self.sum() == 15:
407 mslStr = str(int(random.uniform(1,4)))
408 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]"
409 elif self.sum() == 6:
410 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]"
411 elif self.sum() == 5 or self.sum() == 16:
412 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]"
413 elif self.sum() == 4:
414 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]"
415 elif self.sum() == 17:
416 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]"
417 elif self.sum() == 3 or self.sum() == 18 :
418 myStr += " <font color='#ff0000'>You knock yourself out! Roll vs. HT every 30 min. to recover.</font> [B557]"
419
420 return myStr
421
422 class gurpsspellfail(std):
423 def __init__(self,source=[],mod=0):
424 std.__init__(self,source)
425
426 def __str__(self):
427 myStr = "[" + str(self.data[0])
428 for a in self.data[1:]:
429 myStr += ","
430 myStr += str(a)
431 myStr +="]"
432 myStr += " = <b>" + str(self.sum()) + "</b>"
433
434 if self.sum() == 10 or self.sum() == 11:
435 myStr += " <font color='#ff0000'>Spell produces nothing but a loud noise, bright flash, awful odor, etc.</font> [B236]"
436 elif self.sum() == 9:
437 myStr += " <font color='#ff0000'>Spell fails entirely. Caster is stunned (IQ roll to recover).</font> [B236]"
438 elif self.sum() == 12:
439 myStr += " <font color='#ff0000'>Spell produces a weak and useless shadow of the intended effect.</font> [B236]"
440 elif self.sum() == 8:
441 myStr += " <font color='#ff0000'>Spell fails entirely. Caster takes 1 point of damage.</font> [B236]"
442 elif self.sum() == 13:
443 myStr += " <font color='#ff0000'>Spell produces the reverse of the intended effect.</font> [B236]"
444 elif self.sum() == 7:
445 myStr += " <font color='#ff0000'>Spell affects someone or something other than the intended subject.</font> [B236]"
446 elif self.sum() == 14:
447 myStr += " <font color='#ff0000'>Spell seems to work, but it is only a useless illusion.</font> [B236]"
448 elif self.sum() == 5 or self.sum() == 6:
449 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]"
450 elif self.sum() == 15 or self.sum() == 16:
451 myStr += " <font color='#ff0000'>Spell has the reverse of the intended, on the wrong target. Roll randomly.</font> [B236]"
452 elif self.sum() == 4:
453 myStr += " <font color='#ff0000'>Spell is cast on caster (if harmful) or on a random nearby foe (if beneficial).</font> [B236]"
454 elif self.sum() == 17:
455 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]"
456 elif self.sum() == 3:
457 myStr += " <font color='#ff0000'>Spell fails entirely. Caster takes 1d of injury.</font> [B236]"
458 elif self.sum() == 18:
459 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]"
460
461 return myStr
462
463 class gurpsfrightcheck(std):
464 def __init__(self,source=[],skill=0,mod=0):
465 std.__init__(self,source)
466 self.skill = skill
467 self.mod = mod
468
469 def is_success(self):
470 return (((self.sum()) <= self.skill+self.mod) and (self.sum() < 14))
471
472 def __str__(self):
473 myStr = "[" + str(self.data[0])
474 for a in self.data[1:]:
475 myStr += ","
476 myStr += str(a)
477 myStr +="]"
478 myStr += " = <b>" + str(self.sum()) + "</b>"
479
480 if self.skill+self.mod < 14:
481 myStr += " vs <b>(" + str(self.skill+self.mod) + ")</b>"
482 Diff = abs((self.skill+self.mod) - self.sum())
483 else:
484 myStr += " vs <b>(13)</b>"
485 Diff = abs(13 - self.sum())
486
487 if self.is_success():
488 if self.sum() == 3 or self.sum() == 4:
489 myStr += " or less <font color='#ff0000'><b>Critical Success!</b></font> [B556]"
490 else:
491 myStr += " or less <font color='#ff0000'><b>Success!</b> by " + str(Diff) +" </font>"
492 else:
493 myStr += " or less <font color='#ff0000'><b>Failure!</b> by " + str(Diff) +" </font>"
494
495 if self.skill + self.mod > 13:
496 myStr += " Rule of 14 in effect [B360]"
497
498 if not(self.is_success()):
499 intD1 = int(random.uniform(1,7))
500 intD2 = int(random.uniform(1,7))
501 intD3 = int(random.uniform(1,7))
502 intFright = intD1 + intD2 + intD3 + Diff
503 myStr += "<br />Rolling on Fright Check Table<br />[" + str(intD1) + "," + str(intD2) + "," + str(intD3) + "] ==> " + str(intFright - Diff) + " + " + str(Diff) + " = " + str(intFright) + "<br />"
504 if intFright < 6:
505 myStr += "<font color='#ff0000'>Stunned for one second, then recover automatically.</font> [B360]"
506 elif intFright < 8:
507 myStr += "<font color='#ff0000'>Stunned for one second. Every second after that, roll vs. unmodified Will to snap out of it.</font> [B360]"
508 elif intFright < 10:
509 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]"
510 elif intFright == 10:
511 strStun = str(int(random.uniform(1,7)))
512 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]"
513 elif intFright == 11:
514 strStun = str(int(random.uniform(2,13)))
515 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]"
516 elif intFright == 12:
517 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]"
518 elif intFright == 13:
519 myStr += "<font color='#ff0000'>Acquire a new mental quirk.</font> [B361]"
520 elif intFright < 16:
521 strFP = str(int(random.uniform(1,7)))
522 strSeconds = str(int(random.uniform(1,7)))
523 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]"
524 elif intFright == 16:
525 strSeconds = str(int(random.uniform(1,7)))
526 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]"
527 elif intFright == 17:
528 strMinutes = str(int(random.uniform(1,7)))
529 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes. Every minute after that roll vs. HT to recover.</font> [B361]"
530 elif intFright == 18:
531 strMinutes = str(int(random.uniform(1,7)))
532 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]"
533 elif intFright == 19:
534 strMinutes = str(int(random.uniform(2,13)))
535 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]"
536 elif intFright == 20:
537 strMinutes = str(int(random.uniform(4,25)))
538 strFP = str(int(random.uniform(1,7)))
539 myStr += "<font color='#ff0000'>Faint bordering on shock, lastering for " + strMinutes + " minutes. Also, lose " + strFP + " FP.</font> [B361]"
540 elif intFright == 21:
541 strMinutes = str(int(random.uniform(1,7)))
542 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]"
543 elif intFright == 22:
544 myStr += "<font color='#ff0000'>Acquire a new -10-point Delusion (B130).</font> [B361]"
545 elif intFright == 23:
546 myStr += "<font color='#ff0000'>Acquire a new -10-point Phobia (B148) or other -10-point mental disadvantage.</font> [B361]"
547 elif intFright == 24:
548 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]"
549 elif intFright == 25 :
550 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]"
551 elif intFright == 26:
552 strMinutes = str(int(random.uniform(1,7)))
553 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]"
554 elif intFright == 27:
555 strMinutes = str(int(random.uniform(1,7)))
556 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]"
557 elif intFright == 28:
558 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]"
559 elif intFright == 29:
560 strHours = str(int(random.uniform(1,7)))
561 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]"
562 elif intFright == 30:
563 strDays = str(int(random.uniform(1,7)))
564 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]"
565 elif intFright == 31:
566 strMinutes = str(int(random.uniform(1,7)))
567 strFP = str(int(random.uniform(1,7)))
568 strInjury = str(int(random.uniform(1,7)))
569 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]"
570 elif intFright == 32:
571 strInjury = str(int(random.uniform(2,13)))
572 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]"
573 elif intFright == 33:
574 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]"
575 elif intFright == 34:
576 myStr += "<font color='#ff0000'>Acquire a new -15-point Delusion (B130).</font> [B361]"
577 elif intFright == 35:
578 myStr += "<font color='#ff0000'>Acquire a new -15-point Phobia (B148) or other -15-point mental disadvantage.</font> [B361]"
579 elif intFright == 36:
580 myStr += "<font color='#ff0000'>Severe physical effect, set by the GM. (Acquire -20 points worth of physical disadvantages, aging = -3 per year).</font> [B361]"
581 elif intFright == 37:
582 myStr += "<font color='#ff0000'>Severe physical effect, set by the GM. (Acquire -30 points worth of physical disadvantages, aging = -3 per year).</font> [B361]"
583 elif intFright == 39:
584 strHours = str(int(random.uniform(1,7)))
585 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]"
586 elif intFright == 39:
587 strHours = str(int(random.uniform(1,7)))
588 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]"
589 else:
590 strHours = str(int(random.uniform(1,7)))
591 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]"
592 return myStr
593
594 class gurpsfrightcheckfail(std):
595 def __init__(self,source=[],mod=0):
596 std.__init__(self,source)
597 self.mod = mod
598
599 def __str__(self):
600 myStr = "[" + str(self.data[0])
601 for a in self.data[1:]:
602 myStr += ","
603 myStr += str(a)
604 myStr +="] + " + str(self.mod)
605 intFright = self.sum() + self.mod
606 myStr += " = <b>" + str(intFright) + "</b> "
607
608 if intFright < 6:
609 myStr += "<font color='#ff0000'>Stunned for one second, then recover automatically.</font> [B360]"
610 elif intFright < 8:
611 myStr += "<font color='#ff0000'>Stunned for one second. Every second after that, roll vs. unmodified Will to snap out of it.</font> [B360]"
612 elif intFright < 10:
613 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]"
614 elif intFright == 10:
615 strStun = str(int(random.uniform(1,7)))
616 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]"
617 elif intFright == 11:
618 strStun = str(int(random.uniform(2,13)))
619 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]"
620 elif intFright == 12:
621 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]"
622 elif intFright == 13:
623 myStr += "<font color='#ff0000'>Acquire a new mental quirk.</font> [B361]"
624 elif intFright < 16:
625 strFP = str(int(random.uniform(1,7)))
626 strSeconds = str(int(random.uniform(1,7)))
627 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]"
628 elif intFright == 16:
629 strSeconds = str(int(random.uniform(1,7)))
630 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]"
631 elif intFright == 17:
632 strMinutes = str(int(random.uniform(1,7)))
633 myStr += "<font color='#ff0000'>Faint for " + strMinutes + " minutes. Every minute after that roll vs. HT to recover.</font> [B361]"
634 elif intFright == 18:
635 strMinutes = str(int(random.uniform(1,7)))
636 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]"
637 elif intFright == 19:
638 strMinutes = str(int(random.uniform(2,13)))
639 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]"
640 elif intFright == 20:
641 strMinutes = str(int(random.uniform(4,25)))
642 strFP = str(int(random.uniform(1,7)))
643 myStr += "<font color='#ff0000'>Faint bordering on shock, lastering for " + strMinutes + " minutes. Also, lose " + strFP + " FP.</font> [B361]"
644 elif intFright == 21:
645 strMinutes = str(int(random.uniform(1,7)))
646 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]"
647 elif intFright == 22:
648 myStr += "<font color='#ff0000'>Acquire a new -10-point Delusion (B130).</font> [B361]"
649 elif intFright == 23:
650 myStr += "<font color='#ff0000'>Acquire a new -10-point Phobia (B148) or other -10-point mental disadvantage.</font> [B361]"
651 elif intFright == 24:
652 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]"
653 elif intFright == 25 :
654 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]"
655 elif intFright == 26:
656 strMinutes = str(int(random.uniform(1,7)))
657 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]"
658 elif intFright == 27:
659 strMinutes = str(int(random.uniform(1,7)))
660 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]"
661 elif intFright == 28:
662 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]"
663 elif intFright == 29:
664 strHours = str(int(random.uniform(1,7)))
665 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]"
666 elif intFright == 30:
667 strDays = str(int(random.uniform(1,7)))
668 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]"
669 elif intFright == 31:
670 strMinutes = str(int(random.uniform(1,7)))
671 strFP = str(int(random.uniform(1,7)))
672 strInjury = str(int(random.uniform(1,7)))
673 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]"
674 elif intFright == 32:
675 strInjury = str(int(random.uniform(2,13)))
676 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]"
677 elif intFright == 33:
678 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]"
679 elif intFright == 34:
680 myStr += "<font color='#ff0000'>Acquire a new -15-point Delusion (B130).</font> [B361]"
681 elif intFright == 35:
682 myStr += "<font color='#ff0000'>Acquire a new -15-point Phobia (B148) or other -15-point mental disadvantage.</font> [B361]"
683 elif intFright == 36:
684 myStr += "<font color='#ff0000'>Severe physical effect, set by the GM. (Acquire -20 points worth of physical disadvantages, aging = -3 per year).</font> [B361]"
685 elif intFright == 37:
686 myStr += "<font color='#ff0000'>Severe physical effect, set by the GM. (Acquire -30 points worth of physical disadvantages, aging = -3 per year).</font> [B361]"
687 elif intFright == 39:
688 strHours = str(int(random.uniform(1,7)))
689 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]"
690 elif intFright == 39:
691 strHours = str(int(random.uniform(1,7)))
692 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]"
693 else:
694 strHours = str(int(random.uniform(1,7)))
695 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]"
696
697 return myStr