Vega strike Python Modules doc  0.5.1
Documentation of the " Modules " folder of Vega strike
 All Data Structures Namespaces Files Functions Variables
dynamic_battle.py
Go to the documentation of this file.
1 # -*- coding: utf-8 -*-
2 import VS
3 import Director
4 import fg_util
5 import vsrandom
6 import faction_ships
7 import dynamic_news
8 import debug
9 import generate_dyn_universe
10 
11 global dnewsman_
13 #hashed by system, then contains lists of pairs of (flightgroup,faction) pairs
14 cpsal= {} #Current PerSystem AttackList
15 persystemattacklist= cpsal #assign this to a pointer to cpsal THE FIRST TIME ONLY
16 rescuelist={}#hashtable mapping system->(rescuefaction,attackfg,attackfaction)
17 attacklist ={}#hashtable mapping (attackfg,attackfaction):(defendfg,defendfaction,iscapbattle)
18 defendlist={}#hashtable mapping (defendfg,defendfaction):(attackfg,attackfaction,iscapbattle)
19 lastfac=0
20 lookorsiege=1
21 stardatelen = Director.getSaveDataLength(0,"stardate")
22 if (stardatelen==0):
23  Director.pushSaveData(0,"stardate",151.2)
26  if not generate_dyn_universe.hasUniverse:
27  return
28  stardateinc=0.05/24.0
29  Director.putSaveData(0,"stardate",0,Director.getSaveData(0,"stardate",0)+stardateinc)
30  global lastfac
31  global lookorsiege
32  nfac=VS.GetNumFactions()
33  if lastfac>=nfac:
34  if (not SimulateBattles()):
35  lastfac=0
36  else:
37  for i in xrange(10):
38  if (lastfac<nfac):
39  fac = VS.GetFactionName(lastfac)
40  if (lookorsiege):
41  lookorsiege=LookForTrouble (fac)
42  else:
43  if (not Siege(fac)):
44  #fg_util.CheckAllShips(fac)
45  lastfac+=1
46  lookorsiege=1
47  #first look for trouble, then go ahead and simulate all the battles
48 
49 siegenumber=0
50 siegenumtimes=0
51 siegeprob=0
52 #fixme
54  if (VS.GetGalaxyProperty(sys,"faction")==VS.GetGalaxyFaction(sys)):
55  return .5
56  else:
57  return .1
59  import faction_ships
60  if (faction_ships.isCapital(typ)):
61  return 1
62  return .5
63 
65  suc=0
66  for i in xrange(VS.GetNumAdjacentSystems(sys)):
67  asys=VS.GetAdjacentSystem(sys,i)
68  for fg in fg_util.AllFGsInSystem(fac,asys):
69  if fg_util.CapshipInFG(fg,fac):
70  suc=1
71  fg_util.TransferFG(fg,fac,sys)
72  if (not suc):
73  for fg in fg_util.AllFGsInSystem(fac,sys):
74  if (fg_util.CapshipInFG(fg,fac)):
75  suc=1
76  return suc
77 
78 def neighborFaction(sys,fac):
79  for i in xrange(VS.GetNumAdjacentSystems(sys)):
80  asys=VS.GetAdjacentSystem(sys,i)
81  if (VS.GetGalaxyFaction(asys)==fac):
82  return True
83  return False
84 
85 #returns false if Siege is done going through all its vehicles
86 def Siege(fac):
87  global siegenumber
88  global siegenumtimes
89  global siegeprob
90  # turns_till_siege_effective=100
91  if (not fac in faction_ships.siegingfactions):
92  return
93  numfg= fg_util.NumAllFlightgroups(fac)
94  if (numfg):
95  if (siegenumber==0):
96  siegeprob = float(numfg)/float(faction_ships.siegingfactions[fac]);
97  siegenumtimes = int (siegeprob)
98  if (siegenumtimes==0):
99  siegenumtimes=1
100  else:
101  siegeprob =1
102  if siegenumber>=siegenumtimes:
103  siegenumber=0
104  return 0
105  else:
106  if (vsrandom.uniform(0,1)<siegeprob):
108  sys = fg_util.FGSystem(fg,fac)
109  enfac=VS.GetGalaxyFaction(sys)
110  if (not sys in faction_ships.invincible_systems):
111  #fg_util.CheckAllShips(fac)
112  #fg_util.CheckAllShips(enfac)
113  if enfac == "unknown":
114  debug.debug("exploration: "+sys)
115  fgleader = fg_util.getFgLeaderType(fg,fac)
116  exploration = 1
117 
118  else:
119  exploration = 0
120  if (VS.GetRelation(fac,enfac)<0 and neighborFaction(sys,fac)):#FIXME maybe even less than that
121  numenemyfg = fg_util.NumFactionFGsInSystem(enfac,sys)
122  numfriendfg = fg_util.NumFactionFGsInSystem(fac,sys)
123  #debug.debug('siegarol enemioes '+str(numenemyfg)+ ' friends '+str(numfriendfg))
124  global dnewsman_
125  if exploration:
126  if sys != 'nil':
128  #HACK, regenerate bases instnatly
129  dnewsman_.writeDynamicString([str(Director.getSaveData(0,"stardate",0)),dnewsman_.TYPE_EXPLORATION,dnewsman_.STAGE_END,fac,enfac,dnewsman_.SUCCESS_WIN,str(getImportanceOfSystem(sys)),sys,dnewsman_.KEYWORD_DEFAULT,fg,fgleader,"unknown","unknown"])
130  #FIXME use keyword (ignore
131  #keyword for now Daniel)
132 
133  elif (numenemyfg==0 and numfriendfg==0): #If both annihalate each other completely (unlikely but possible)
134  facnum = VS.GetFactionIndex (fac)
135  debug.debug('cehcking started')
136  debug.error("DRAW error "+fg+" sys has "+sys+" has " +str(fg_util.NumFactionFGsInSystem(fac,sys))+" String is "+Director.getSaveString(0,fg_util.MakeStarSystemFGKey(sys),facnum))
137  if sys != 'nil':
138  dnewsman_.writeDynamicString([str(Director.getSaveData(0,"stardate",0)),dnewsman_.TYPE_SIEGE,dnewsman_.STAGE_END,fac,enfac,dnewsman_.SUCCESS_WIN,str(getImportanceOfSystem(sys)),sys,dnewsman_.KEYWORD_DEFAULT,fg,"unknown","unknown","unknown"])
139  #FIXME use keyword (ignore
140  #keyword for now Daniel)
141 
142  elif (numenemyfg==0 and (fg_util.CapshipInFG(fg,fac) or moveSurroundingCapshipsToSiege(fac,sys))): #If aggressor succeeded
143  debug.debug(fac + ' took over '+ sys + ' originally owned by '+enfac)
144  #ok now we have him... while the siege is going on the allies had better initiate the battle--because we're now defending the place... so that means if the owners are gone this place is ours at this point in time
145  fgs = fg_util.FGsInSystem(fac,sys)
146  if (len(fgs)>0):
147  fgs=fgs[0]
148  else:
149  fgs = "unknown"
150  if sys != 'nil':
151  dnewsman_.writeDynamicString([str(Director.getSaveData(0,"stardate",0)),dnewsman_.TYPE_SIEGE,dnewsman_.STAGE_END,fac,enfac,dnewsman_.SUCCESS_WIN,str(getImportanceOfSystem(sys)),sys,dnewsman_.KEYWORD_DEFAULT,fgs,"unknown","unknown","unknown"])
152  #FIXME use keyword (ignore
153  #keyword for now Daniel)
154 
156  #HACK, regenerate bases instnatly
157 
158  elif (numfriendfg==0): #If aggressor lost
159  debug.error('wtf!!')
160  fgs = fg_util.FGsInSystem(enfac,sys)
161  if (len(fgs)>0):
162  fgs=fgs[0]
163  else:
164  fgs = "unknown"
165  if sys != 'nil':
166  dnewsman_.writeDynamicString([str(Director.getSaveData(0,"stardate",0)),dnewsman_.TYPE_SIEGE,dnewsman_.STAGE_END,fac,enfac,dnewsman_.SUCCESS_LOSS,str(getImportanceOfSystem(sys)),sys,dnewsman_.KEYWORD_DEFAULT,"unknown","unknown",fgs,"unknown"])
167  #FIXME use keyword (ignore
168  #keyword for now Daniel)
169 
170 
171  #FIXME add if statements if there is instead a (non appocalyptic) draw (if waring factions have relations "almost neutral" you could have a cease fire, or if the two factions are evenly matched and go nowhere a withdraw of the attackers might occur)!!!
172  siegenumber+=1
173  return 1
174  else:
175  return 0
176 
177 
178 
179 #returns false if SimulateBattles gets through all its vehicles
180 simulateiter=None
181 deadbattles=[]
182 deadbattlesiter=-2
184  global deadbattles
185  global cpsal
186  global attacklist
187  global simulateiter
188  global deadbattlesiter
189  if simulateiter==None:
190  if (deadbattlesiter!=-2):
191  if (deadbattlesiter<0):
192  deadbattlesiter=-2
193  return 0
194  else:
195  stopAttack(deadbattles[deadbattlesiter][0],deadbattles[deadbattlesiter][1])
196  deadbattlesiter-=1
197  return 1
198  else:
199  persystemattacklist=cpsal
200  cpsal = {}
201  simulateiter= attacklist.iteritems()
202 
203  try:
204  ally = simulateiter.next()
205  godoit=1
206  except StopIteration:
207  simulateiter = None
208  deadbattlesiter = len(deadbattles)-1
209  godoit=0
210  import sys
211  debug.debug(str(sys.exc_info()[0])+str(sys.exc_info()[1]))
212  if (godoit):
213  enemy = ally[1]
214  ally = ally[0]
215  if (not attackFlightgroup (ally[0],ally[1],enemy[0],enemy[1],enemy[2])):
216  deadbattles+=[(ally[0],ally[1])]
217  else:
218  sys = fg_util.FGSystem(ally[0],ally[1])
219  if not (sys in cpsal):
220  cpsal[sys]=[]
221  cpsal[sys]+=[((ally[0],ally[1]),(enemy[0],enemy[1]))]#continue the battle
222  return 1
224  if sys in cpsal:
225  return cpsal[sys]
226  #return {} #used to be a hash table
227  return []
228 def LookForSystemWideTrouble(faction,sys):
229  fg = fg_util.FGsInSystem(faction,sys)
230  for i in fg:
231  enemyfac = faction_ships.get_enemy_of (faction)
232  efg = fg_util.AllFGsInSystem(enemy,sys)
233  if (len(efg)):
234  index=vsrandom.randrange(0,len(efg))#FIXME include some sort of measure "can I win"
235  initiateAttack(fg,faction,sys,efg[index],enemyfac)
236 
237 def randomMovement(fg,fac):
238  import universe
239  import fg_util
240  citizen=VS.isCitizen(fac)
241  sys=fg_util.FGSystem(fg,fac)
242  convoywhere=fg.find("->")
243  if (convoywhere!=-1):
244  endpoints=[fg[0:convoywhere],fg[convoywhere+2:]]
245 
246  if fg.find("Insys")!=-1:
247  return#can't go about moving insys fgs away
248  if (sys!='nil' and fg!=fg_util.BaseFGInSystemName(sys)):
250  nthis = fg_util.NumFactionFGsInSystem(fac,sys)
251  if (len(l)):
252  suggestednewsys = l[vsrandom.randrange(0,len(l))]
253  sugfac=VS.GetGalaxyFaction(suggestednewsys)
254  sugrel=VS.GetRelation(fac,sugfac)
255 
256  if convoywhere==-1 and (((fac.find(sugfac)!=-1 or sugrel>.5) and citizen) or not citizen):
257  fg_util.TransferFG( fg,fac,suggestednewsys);
258  #debug.debug('moving '+fg+' from '+sys+' to '+ suggestednewsys)
259  else:
260  for i in l:
261  ifac = VS.GetGalaxyFaction(i)
262  #if (ifac==fac and nthis > fg_util.NumFactionFGsInSystem(fac,i)):
263  # suggestednewsys = i
264  likes=False
265  if convoywhere!=-1:
266  if endpoints[0]==i or endpoints[1]==i:
267  likes=True
268  elif VS.GetRelation(fac,ifac)>.5:
269  likes=True
270  if (likes):
271  fg_util.TransferFG(fg,fac,i)
272  return
273  #debug.debug('moving '+fg+' from '+sys+' to '+ suggestednewsys)
274  fg_util.TransferFG( fg,fac,suggestednewsys);
275  else:
276  pass #debug.debug("flightgroup "+fg+" in system "+sys + " is stuck")
277 
278 def AddFighterTo(fgname,fac,isNew=False):
279  sys = VS.getSystemFile()
280  #debug.debug('add fighter')
281  numsystems = generate_dyn_universe.systemcount[fac]
282  if (VS.GetGalaxyFaction(sys)!=fac):
283  try:
284  homeworlds=faction_ships.production_centers
285  except:
286  homeworlds=faction_ships.homeworlds
287  if fac in homeworlds:
288  if type(homeworlds[fac])==type(""):
289  sys=homeworlds[fac]
290  else:
291  sys=homeworlds[fac][vsrandom.randrange(0,len(homeworlds[fac]))]
292  numfighters = int(generate_dyn_universe.XProductionRate(fac,faction_ships.fighterProductionRate)*numsystems)
293  try:
294  if fac in faction_ships.staticFighterProduction:
295  numfighters+=faction_ships.staticFighterProduction[fac]
296  except:
297  pass
298  if (numfighters<1):
299  if (vsrandom.uniform(0,1)<numfighters):
300  numfighters=1
301  #debug.debug("Generating "+str(numfighters)+ " fighters for "+fac+" at "+sys)
302  if isNew:
303  fgk=fg_util.FGsInSystem(fac,sys)
304  if len(fgk):
305  fgname=fgk[vsrandom.randrange(0,len(fgk))]
306  stat=6
307  if fac in faction_ships.fightersPerFG:
308  stat=faction_ships.fightersPerFG[fac]
309  elif "default" in faction_ships.fightersPerFG:
310  stat=faction_ships.fightersPerFG["default"]
311  if fg_util.NumShipsInFG(fgname,fac)+numfighters<=numfighters+stat:
312  isNew=False
313  if isNew:
315  if numfighters>=1:
316  fg_util.AddShipsToFG (fgname,fac,((faction_ships.getRandomFighter(fac),int(numfighters)),),sys)
317  numcapships = generate_dyn_universe.XProductionRate(fac,faction_ships.capitalProductionRate)*numsystems
318  if (numcapships<1):
319  if (vsrandom.uniform(0,1)>numcapships):
320  return
321  numcapships=1
322  sys = fg_util.FGSystem(fgname,fac)
323  if (1 or VS.GetGalaxyFaction(sys)!=fac):
324  try:
325  homeworlds=faction_ships.production_centers
326  except:
327  homeworlds=faction_ships.homeworlds
328  if fac in homeworlds:
329  if type(homeworlds[fac])==type(""):
330  sys=homeworlds[fac]
331  else:
332  sys=homeworlds[fac][vsrandom.randrange(0,len(homeworlds[fac]))]
334  #debug.debug("Generating "+str(numcapships)+ " capship "+cap+" for "+fac+" at "+sys)
335  fg_util.AddShipsToFG(fgname,fac,((cap,int(numcapships)),),sys)
336 
337 #returns false if done with vehicles
338 lftiter=0
339 import Director
340 def LookForTrouble (faction):
341  global lftiter
342  key = fg_util.MakeFactionKey(faction)
343  numfg=Director.getSaveStringLength(fg_util.ccp,key)
344  if (lftiter>=numfg):
345  lftiter=0
346  if (0 and numfg):
347  AddFighterTo(Director.getSaveString(fg_util.ccp,key,vsrandom.randrange(0,numfg)),faction,False)
348  if faction in faction_ships.fighterProductionRate:
349  AddFighterTo("Alpha",faction,True)
350  return 0
351  i = Director.getSaveString(fg_util.ccp,key,lftiter)
352  lftiter+=1
353  sys = fg_util.FGSystem (i,faction)
354  citizen=VS.isCitizen(faction)
355  if (sys!='nil'):
356  if not citizen:
357  enfac = faction_ships.get_enemy_of(faction)
358  foundanyone=0
359  l=fg_util.AllFGsInSystem(enfac,sys)
360  j=vsrandom.randrange(0,len(l)+3)
361  if (j<len(l)):
362  foundanyone=1 #FIXME include some sort of measure "can I win"
363  if (vsrandom.randrange(0,5)==0):
364  initiateAttack(i,faction,sys,l[j],enfac)
365  elif (vsrandom.randrange(0,3)==0):
366  randomMovement (i,faction)
367  elif (vsrandom.randrange(0,3)==0):
368  randomMovement (i,faction)
369  return 1
370 
371 def StopTargettingEachOther (fgname,faction,enfgname,enfaction):
372  i=VS.getUnitList()
373  un=i.current()
374  while (un):
375  if ((un.getFactionName()==enfaction and un.getFlightgroupName()==enfgname) or
376  (un.getFactionName()==faction and un.getFlightgroupName()==fgname)):
377  un.setFgDirective ('b')
378  #check to see that its' in this flightgroup or something :-)
379  un=i.next()
380 
381 def TargetEachOther (fgname,faction,enfgname,enfaction):
382  i=VS.getUnitList()
383  un=i.current()
384  en=None
385  al=None
386  while (un and ((not en) or (not al))):
387  if (un.getFactionName()==enfaction and un.getFlightgroupName()==enfgname):
388  if ((not en) or (vsrandom.randrange(0,3)==0)):
389  en=un
390  if (un.getFactionName()==faction and un.getFlightgroupName()==fgname):
391  al=un
392  un=i.next()
393  if (en and al):
394  al.setFlightgroupLeader(al)
395  al.SetTarget(en)
396  al.setFgDirective ('A.')#attack target, darent change target!
397  en.setFlightgroupLeader(en)
398  en.SetTarget(al)
399  en.setFgDirective ('h')#help me out here!
400 ejectbuildup=0
401 def KillOne (fg,fac,tn,num,enfg,enfac):
402  sys = fg_util.FGSystem(fg,fac)
403  numkilled= fg_util.RemoveShipFromFG(fg,fac,tn[0],num,1)
404  chancetoeject=.25
405  global ejectbuildup
406  if (ejectbuildup>=(1-chancetoeject)**numkilled):
407  global rescuelist
408  rescuelist[sys]=(fac,enfg,enfac)
409  #debug.debug(rescuelist[sys])
410  ejectbuildup=0
411  else:
412  ejectbuildup+=chancetoeject
413  return numkilled
414 
415 def HowMuchDamage (shiptypes,defenseroll):
416  dam=0
417  for i in shiptypes:
418  stats=faction_ships.GetStats(i[0])
419  #debug.debug(str(stats[0])+ ' needs above '+str(defenseroll))
420  if (vsrandom.uniform(0,stats[0])>defenseroll):
421  dam+=stats[2]*i[1] #guns
422  if (len(stats)>3):
423  if (vsrandom.uniform(0,.05)>defenseroll):
424  dam+=stats[3]*i[1] #missiles
425  return dam
426 
427 def ApplyDamage (fg,fac,shiptypes,rnum,stats,damage,enfg,enfac):
428  dampool=fg_util.GetDamageInFGPool(fg,fac)
429  tmpdam=damage+int(dampool/len(shiptypes))
430  numshipstokill=int(tmpdam/stats[3])
431  if (numshipstokill):
432  #debug.debug(enfg+'f:'+enfac+' killing '+str(numshipstokill)+ ' from the '+fac+' '+fg)
433  damage -= KillOne(fg,fac,shiptypes[rnum],numshipstokill,enfg,enfac)*stats[3]#returns how many ships killed
434  if (damage!=0):
435  fg_util.SetDamageInFGPool(fg,fac,dampool+damage)
436 
437 def SimulatedDukeItOut (fgname,faction,enfgname,enfaction):
438  ally=fg_util.LandedShipsInFG(fgname,faction)
439  enemy=fg_util.LandedShipsInFG(enfgname,enfaction)
440  if (len(enemy) and len(ally)):
441  allyvictim = vsrandom.randrange(0,len(ally))
442  allystats = faction_ships.GetStats(ally[allyvictim][0])
443  envictim = vsrandom.randrange(0,len(enemy))
444  enstats = faction_ships.GetStats(enemy[envictim][0])
445  endam = HowMuchDamage(enemy,vsrandom.uniform(0,allystats[1]))
446  if (enfgname==fgname and enfaction==faction):
447  debug.error("FAULT FAULT FAULT")
448  ApplyDamage(enfgname,enfaction,enemy,envictim,enstats,HowMuchDamage(ally,vsrandom.uniform(0,enstats[1])),fgname,faction)
449  ApplyDamage(fgname,faction,ally,allyvictim,allystats,endam,enfgname,enfaction)
450 def numShips(i):
451  if (faction_ships.isCapital(i[0])):
452  return i[1]*10
453  return i[1]
454 def countTn (l):
455  count=0
456  for i in l:
457  count+=numShips(i)
458  return count
459 def findLaunchedShipInFGInSystem (fgname,faction):
460  uni = VS.getUnitList()
461  un=uni.current()
462  while (uni.notDone()):
463  if un:
464  if (un.getFlightgroupName()==fgname and un.getFactionName()==faction):
465  return un
466  un= uni.next()
467 def LaunchMoreShips(fgname,faction,landedtn,nums):
468  shiplaunchlist=[]
469  while nums>0 and len(landedtn)>0:
470  index=vsrandom.randrange(0,len(landedtn))
471  nums-=numShips(landedtn[index])/landedtn[index][1]
472  shiplaunchlist += [(landedtn[index][0],1)]
473  if (landedtn[index][1]>1):
474  landedtn[index]=(landedtn[index][0],landedtn[index][1]-1)
475  else:
476  del landedtn[index]
477  pos=None
478  if len(shiplaunchlist):
479  k = findLaunchedShipInFGInSystem (fgname,faction)
480  if (k):
481  pos=k.GetPosition()
482  if (pos):
483  for i in shiplaunchlist:
484  while j in xrange(i[1]):
485  pos=launch_recycle.LaunchNext(fgname,faction,"default",pos)
486 
487 
488 def LaunchEqualShips (fgname, faction, enfgname, enfaction):
489  debug.debug("DYNAMO*3")
490  land=fg_util.LandedShipsInFG(fgname,faction)
491  launch=fg_util.ShipsInFG(fgname,faction)
492  enland=fg_util.LandedShipsInFG(enfgname,enfaction)
493  enlaunch=fg_util.ShipsInFG(enfgname,enfaction)
494  numenland=countTn(enland)
495  numenlaunch=countTn(enlaunch)
496  numland=countTn(land)
497  numlaunch=countTn(launch)
498  if (numenland==0 or numland==0 or (numlaunch==0 and numenlaunch==0) ):
499  return
500  if (numlaunch/numland > numenlaunch/numenland):
501  LaunchMoreShips (fgname,faction,land,int((numland*numenlaunch/numenland)-numlaunch))
502  else:
503  LaunchMoreShips (enfgname,enfaction,enland,int((numenland*numlaunch/numland)-numenlaunch))
504 
505 def stopAttack (fgname,faction):
506  ally=(fgname,faction)
507  if ally in attacklist:
508  enemy = attacklist[ally]
509  sys = fg_util.FGSystem (fgname,faction)
510  if (VS.systemInMemory(sys)):
511  VS.pushSystem(sys)
512  VS.StopTargettingEachOther(fgname,faction,enemy[0],enemy[1])
513  VS.popSystem()
514  del defendlist[(enemy[0],enemy[1])]
515  del attacklist[ally]
516 
517 reportbegin=0
518 def initiateAttack (fgname,faction,sys,enfgname,enfaction):
519  capitala = fg_util.CapshipInFG(fgname,faction)
520  capitalb = fg_util.CapshipInFG(enfgname,enfaction)
521  iscap = None
522  if capitala and capitalb:
523  iscap = capitala+','+capitalb
524  if (fg_util.BaseFGInSystemName(sys)==fgname):
525  fg=(enfgname,enfaction)#this is for a base... self defence
526  efg=(fgname,faction)
527  else:
528  fg = (fgname,faction)
529  efg = (enfgname,enfaction)
530  #FIXME can overwrite the attacking groups!!
531  if (not efg in defendlist):
532  if (iscap):
533  global reportbegin
534  if (reportbegin==0):
535  global dnewsman_
536  dnewsman_.writeDynamicString([str(Director.getSaveData(0,"stardate",0)),dnewsman_.TYPE_FLEETBATTLE,dnewsman_.STAGE_BEGIN,faction,enfaction,dnewsman_.SUCCESS_DRAW,str(getImportanceOfSystem(sys)),sys,dnewsman_.KEYWORD_DEFAULT,fgname,capitala,enfgname,capitalb])
537  reportbegin+=1
538  reportbegin=reportbegin%10
539  if (fg in attacklist):
540  defender = attacklist[fg]
541  del defendlist[(defender[0],defender[1])]
542  attacklist[fg]=(efg[0],efg[1],iscap)
543  defendlist[efg]=(fg[0],fg[1],iscap)
544 
545 #only works for FG's that are not the base FG...the base FG cannot initiate attacks as far as I know.
546 #though initiateAttack switches them around appropriately
547 def attackFlightgroup (fgname, faction, enfgname, enfaction,iscap):
548  global dnewsman_
549  if (iscap):
550  battlename=dnewsman_.TYPE_FLEETBATTLE
551  (leader,enleader)=iscap.split(",")
552  else:
553  battlename = dnewsman_.TYPE_BATTLE
554  leader = fg_util.getFgLeaderType(fgname,faction)
555  enleader = fg_util.getFgLeaderType(enfgname,enfaction)
556  sys = fg_util.FGSystem (fgname,faction)
557  ensys = fg_util.FGSystem (enfgname,enfaction)
558  if (sys==ensys):
559  if (0 and VS.systemInMemory(sys)):
560  VS.pushSystem(sys)
561  LaunchEqualShips (fgname,faction,enfgname,enfaction)
562  VS.TargetEachOther (fgname,faction,enfgname,enfaction)
563  VS.popSystem()
564  #debug.debug('duke '+fgname + ' '+enfgname)
565  SimulatedDukeItOut (fgname,faction,enfgname,enfaction)
566  elif (sys!='nil' and ensys!='nil'):
567  #pursue other flightgroup
568  import universe
569  adjSystemList=universe.getAdjacentSystemList(sys)
570  if ensys in adjSystemList:
571  fg_util.TransferFG (fgname,faction,ensys)
572  else:
573  return 0
574  else:
575  return 0 #debug.debug('nil DRAW error')
576  if (fg_util.NumShipsInFG(fgname,faction)==0):
577  if (fg_util.NumShipsInFG(enfgname,enfaction)==0):
578  dnewsman_.writeDynamicString([str(Director.getSaveData(0,"stardate",0)),battlename,dnewsman_.STAGE_END,faction,enfaction,dnewsman_.SUCCESS_DRAW,str(getImportanceOfSystem(sys)),sys,dnewsman_.KEYWORD_DEFAULT,fgname,leader,enfgname,enleader])
579  else:
580  dnewsman_.writeDynamicString([str(Director.getSaveData(0,"stardate",0)),battlename,dnewsman_.STAGE_END,faction,enfaction,dnewsman_.SUCCESS_LOSS,str(getImportanceOfSystem(sys)),sys,dnewsman_.KEYWORD_DEFAULT,fgname,leader,enfgname,enleader])
581  return 0
582  elif (fg_util.NumShipsInFG(enfgname,enfaction)==0):
583  dnewsman_.writeDynamicString([str(Director.getSaveData(0,"stardate",0)),battlename,dnewsman_.STAGE_END,faction,enfaction,dnewsman_.SUCCESS_WIN,str(getImportanceOfSystem(sys)),sys,dnewsman_.KEYWORD_DEFAULT,fgname,leader,enfgname,enleader])
584  return 0
585  if (vsrandom.randrange(0,4)==0):
586  #FIXME if it is advantageous to stop attacking only!!
587  #FIXME add a stop attacking news report? -- this should now be fixed, as a draw is reported (not heavilly tested)
588  #CAUSES TOO MUCH NEWS#Director.pushSaveString(0,"dynamic_news",dynamic_news.makeVarList([str(Director.getSaveData(0,"stardate",0)),battlename,"end",faction,enfaction,"0",str(getImportanceOfSystem(sys)),sys,"all",fgname,leader,enfgname,enleader]))
589  return 0
590  if (vsrandom.randrange(0,4)==0 and enfgname!=fg_util.BaseFGInSystemName(ensys)):
591  #FIXME if it is advantageous to run away only
592  #FIXME add a retreat news report? -- this should now be fixed, as a draw is reported (not heavilly tested)
593  #CAUSES TOO MUCH NEWS#Director.pushSaveString(0,"dynamic_news",dynamic_news.makeVarList([str(Director.getSaveData(0,"stardate",0)),battlename,"end",faction,enfaction,"-1",str(getImportanceOfSystem(sys)),sys,"all",fgname,leader,enfgname,enleader]))
594  num=VS.GetNumAdjacentSystems(ensys)
595  if (num>0):
596  ensys=VS.GetAdjacentSystem(ensys,vsrandom.randrange(0,num))
597  fg_util.TransferFG (fgname,faction,ensys)
598  return 1
599 
600 ##for i in range(10000):
601 ## UpdateCombatTurn()