Package schlachtfeld ::
Module Char
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 '''
25 Characters and methods for use in schlachtfeld module.
26 Characters act on their own now and can be imported and saved via amov module.
27 '''
28
29
30
31
32
33 from random import randrange as rnd
34 from random import shuffle
35 import math
36
37 import sys
38
39 from ews import pmw6
40
41 import namen
42
43 from amov import Charakter, Versionsverwaltung
44
45
46
47
48
49
50
51
52
53 name_objekt = namen.Name()
54
55
56
57 default_style = (0,(3,3),(3,3),(3,3),(3,3),None)
58 defensive_style = (-3,(0,0),(0,3),(3,3),(3,3),None)
59 offensive_style = (6,(3,3),(0,0),(3,3),(3,3),'dead')
60 escape_style = (6,(3,3),(3,3),(0,0),(0,0),'escape')
61 styledict = {'defensive':defensive_style, 'offensive':offensive_style, 'default':default_style, 'escape':escape_style}
62
63 atscatter = [3,2,1]
64
65
66
67
68
69
70
72 """Do one roll with the plusminus d6 die (wrapper for a function in pmw6)."""
73 return pmw6.pmw6()
74
76 """Check if a given skill test reached a min-value (wrapper for a function in pmw6)."""
77 return pmw6.check(skill,MW)
78
80 """Return the degree of success / failure for a skill check (wrapper for a function in pmw6)."""
81 return pmw6.ocheck(skill,MW)
82
84 '''Return a name corresponding to the characters language.'''
85 return name_objekt.erzeuge(language)
86
87
88
89
90
91
92
93
95 """A single soldier. Will be imported from either a prefab character file from amov or via a template."""
96 - def __init__(self,source="tag:1w6.org,2007:Mensch",template=True):
143
144
146 ''' Hopefully nice printout for a soldier.'''
147 if self.name != None:
148 scribble = 'Name: ' + self.name
149 else:
150 scribble = "Unknown Char"
151 scribble += '\nTP: ' + `self.TP`
152 scribble += '\nWunden: ' + `self.wounds`
153 scribble += '\nAktiv: ' + `self.alive`
154 scribble += '\nAngriff: ' + `self.attack` + ', Exp: ' + `self.exp`
155 scribble += '\nAktuelle Moral: ' + `self.morale`
156 scribble += '\nArt: ' + self.chartype
157 scribble += '\nSprache: ' + self.sprache
158 if self.host:
159 scribble += '\nBatallion: ' + self.host.name
160 return scribble
161
162
164 '''Assign the soldier to a hosting Group-Entity.'''
165 self.host = host
166 return
167
168
170 '''Give the soldier a random name or import it from the file.'''
171 if template:
172 self.nametype = self.amov.grunddaten['Herkunft']['Sprache']
173 self.name = name_it(self.nametype)
174 else:
175 self.name = self.amov.name
176 return
177
178
179 - def damage(self, tp, ws, hws):
180 '''Damage a character and check for suvivial. Arguments: hitpoints, wounds heavy wounds.'''
181 self.TP -= tp + (ws * self.WS[0]) + (hws * self.WS[1])
182 self.wounds[0] += ws
183 self.wounds[1] += hws
184 self.morale[2] -= ws + 3*hws
185 self.checkalive()
186 return
187
188
190 '''Check if a character is still alive after being damaged.'''
191 morale = sum(self.morale)
192 self.alive = (self.TP > min(0,15-morale)) and (self.wounds[1] < max(2,morale/6)) and (self.wounds[0] < max(5,morale/3))
193 if not self.alive:
194 self.host.active.remove(self)
195 return
196
197
199 '''
200 A morale-check to figure out if the character will cross over or desert his Group.
201 This method also automatically determines the fighting style of the soldier.
202 '''
203 MW = sum(self.host.situation)
204 res = ocheck(sum(self.morale),MW)
205 host = self.host
206 if res < -10 and self.host.enemy:
207 self.host.active.remove(self)
208 self.sethost(host.enemy)
209 self.host.active.append(self)
210 self.morale[2] = 0
211 elif res < -3:
212 self.style = escape_style
213 elif res < 0:
214 self.style = defensive_style
215 elif res < 5:
216 self.style = default_style
217 else:
218 self.style = offensive_style
219 self.morale[4] = 0
220 return
221
222
224 '''Check if the character tried to escape and made it alive.'''
225 if self.style == escape_style and self.active and self.alive:
226 self.host.active.remove(self)
227 self.sethost(None)
228 self.fled = True
229 return
230
231
233 '''Adjust queue-value of character - either reduce by 1 (standard) or raise or lower deliberately. Check for activeness.'''
234 self.queue += amt
235 if amt > 0:
236 self.host.active.remove(self)
237 if self.queue > 0:
238 self.active = False
239 else:
240 self.active = True
241 self.host.active.append(self)
242 return
243
244
246 '''
247 Make an attack-roll to be compared to the enemy's roll. Base method to evaluate comabat.
248 Contributions: base skill, weapon, armor, +-d6, wounds (deep: each -3, crit: each -6 while in combat), , group situation (strategy & bias), morale bonus
249 '''
250 tmp = self.attack + self.dam + self.armor + ews() - 3*(self.wounds[0]+2*self.wounds[1]) + self.host.situation[2] - self.host.situation[1] + max(0, (12-sum(self.morale))/3)
251 return tmp
252
253
254 - def upgrade(self,expadd,object=('random',0)):
255 '''
256 Randomly enhance the characters skills and attributes. Dashes are spent and collected until a higher level is reached. Higher attributes and skills are preferred, thus specializing the character.
257 expadd: number of dashes (float - subdashes included)
258 object: object of enhancement; 'attribute', 'skill' or 'random' + name of object; standard is 'random'
259 '''
260 return
261
262
266
267
268
269
271 """A leader of an Army or group. Can emerge from Char()."""
272 - def __init__(self,source="default",template=True):
273
274 if 'Strategie' in self.amov.fertigkeiten:
275 self.strategy_skill = self.amov.fertigkeiten['Strategie']['Zahlenwert']
276 else:
277 self.strategy_skill = 9
278
279 if 'Taktik' in self.amov.fertigkeiten:
280 self.tactics_skill = self.amov.fertigkeiten['Taktik']['Zahlenwert']
281 else:
282 self.tactics_skill = 9
283
284 if 'Rede' in self.amov.fertigkeiten:
285 self.speech_skill = self.amov.fertigkeiten['Rede']['Zahlenwert']
286 else:
287 self.speech_skill = 9
288
289 self.chartype = 'Anführer'
290 return
291
292
294 '''Print-out modification for leaders.'''
295 scribble = Char.__repr__(self)
296 scribble += '\nStrategie-Fertigkeit: ' + self.strategy_skill
297 scribble += '\nTaktik-Fertigkeit: ' + self.tactics_skill
298 scribble += '\nRede-Fertigkeit: ' + self.speech_skill
299 return scribble
300
301
303 '''Speak to raise or lower morale of soldiers in his group.'''
304 bonus = max(ocheck(self.speech_skill, sum(self.host.situation)) / 3, -6)
305 for i in self.host.active:
306 if i.morale[1] < self.speech_skill/3:
307 i.morale[1] += bonus
308 return
309
310
312 '''Make strategical or tactical considerations to raise or lower attack score of soldiers.'''
313 tmp = self.host.grouptype
314 if tmp == "Armee":
315 skill = self.strategy_skill
316 elif tmp =="Gruppe":
317 skill = self.tactics_skill
318 bonus = ocheck(skill, sum(self.host.situation)) / 3
319 self.host.situation[2] = bonus
320 return
321
322
323
325 """A battle hero. Might be external or emerging from Char() during battle."""
326 - def __init__(self,host=None,exp=3,weap=4,arm=2,base_tp=24,base_attack=12,morale=18,source=u"tag:1w6.org,2007:Mensch"):
327 Char.__init__(self,host,exp,weap,arm,base_tp,base_attack,morale)
328 self.chartype = 'Held'
329 return
330
343
345 '''Heroes motivate the surrounding fighters.'''
346 for i in self.host.active:
347 i.morale[4] += self.morale[2]
348 self.host.situation[3] += 1
349 return
350
351
352
353