Vega strike Python Modules doc  0.5.1
Documentation of the " Modules " folder of Vega strike
 All Data Structures Namespaces Files Functions Variables
tail.py
Go to the documentation of this file.
1 import VS
2 import Director
3 import Vector
4 import faction_ships
5 import launch
6 import quest
7 #FIXME: need a way to ensure target maintains radio silence!
8 class tail (Director.Mission):
9 
10  WAITTIME=float(240)#must be float, how long to wait after enemy jumps before failure
11  DELAYTIME=float(30)#how long to wait, after success, before friendlies come to finish job
12 
13  def __init__ (self,var_to_set,creds,direct,sdist,mdist,efaction,ffaction,efg,ffg,fnum=3,edyntype='',fdyntype='',edynfg='',fdynfg='',tooclose=["Thought you could hide from me?", "Try hiding from this!"],toofar=["We have lost the lock on the target vessel."],justright=["Thankyou. You help in tracking this criminal has been appreciated."]):
14  Director.Mission.__init__ (self)
15  print 'tail: Starting'
16 
17  self.fail1 = tooclose
18  self.fail2 = toofar
19  self.succeed1 = justright
20 
21  self.enemyfg = efg
22  self.enemyfaction = efaction
23  self.enemydynfg = edynfg
24  self.enemydyntype = edyntype
25  self.enemynum=1#don't have this as multiple, as I haven't compensated for it when I move fgs
26  self.enemy=None
27 
28  self.friendlyfg = ffg
29  self.friendlyfaction = ffaction
30  self.friendlydynfg = fdynfg
31  self.friendlydyntype = fdyntype
32  self.friendlynum=fnum
33 
34 
35  self.success=False
36  self.waiting=False
37  self.tracking=(None,None)#(missiontimeout, distanceonjump)
38 
39  self.objref=None
40 
41  self.cp = VS.getCurrentPlayer()
42  self.started = False
43  self.directions = direct
44  self.creds = creds
45  self.var_to_set = var_to_set
46  self.mindist = mdist
47  self.startdist = sdist
48  VS.getPlayerX(self.cp).upgrade("jump_drive",0,0,0,1)
49  print 'tail: Started'
50 
51  def setupEnemy (self):
52  if not self.started:
53  print 'Tail Error checking: '+self.directions[0]
54  print 'Tail Error checking: '+self.directions[0].lower()
55  if self.started:
56  return True
57  elif self.directions[0].lower().find(VS.getPlayerX(self.cp).getUnitSystemFile().lower())!=-1:
58  L = launch.Launch()
59  L.fg=self.enemyfg
60  L.dynfg=self.enemydynfg
61  if self.enemydyntype=='':
63  L.type = self.enemydyntype
64  L.faction = self.enemyfaction
65  L.ai = "default"
66  L.num=self.enemynum
67  L.minradius=self.mindist
68  L.maxradius=self.startdist
69  try:
70  L.minradius*=faction_ships.launch_distance_factor
71  L.maxradius*=faction_ships.launch_distance_factor
72  except:
73  pass
74  self.enemy=L.launch(VS.getPlayerX(self.cp))
75  self.enemy.upgrade("jump_drive",0,0,0,1)
76  self.relation = self.enemy.getRelation(VS.getPlayerX(self.cp))
77  self.enemy.setCombatRole("INERT")
79  VS.IOmessage (0,"[Mission Computer]","all","Target %s detected! Proceed as per mission instructions."%self.enemy.getFullname())
80  self.objref=VS.addObjective("Follow the %s until it broadcasts the signal"%self.enemy.getFullname())
81  self.started=True
82  return True
83  print "now NOT set up!"
84  return False
85 
86  def setupFriendly (self, around):
87  L = launch.Launch()
88  L.fg=self.friendlyfg
89  L.dynfg=self.friendlydynfg
90  if self.friendlydyntype=='':
92  L.type = self.friendlydyntype
93  L.faction = self.friendlyfaction
94  L.ai = "default"
95  L.num=self.friendlynum
96  L.minradius=0
97  L.maxradius=self.mindist
98  try:
99  L.minradius*=faction_ships.launch_distance_factor
100  L.maxradius*=faction_ships.launch_distance_factor
101  except:
102  pass
103  friendly=L.launch(around)
104  self.enemy.setCombatRole("FIGHTER")
105  flead = friendly.getFlightgroupLeader()
106  flead.SetTarget(self.enemy)
107  flead.Threaten(self.enemy,1)
108  self.enemy.Threaten(flead,1)
109  friendly.setFgDirective('A.')
110  friendly.DeactivateJumpDrive()
111 
113  j = self.nextSystem()
114  if j:
115  targ=self.getJumpTo(j)
116  if not targ:
117  raise RuntimeError("Jumppoint going to %s cannot be found."%j)
118  self.enemy.SetTarget(targ)
119  self.enemy.ActivateJumpDrive(0)
120  print "tail: Enemy running to "+targ.getName()
121 # self.enemy.setFlightgroupLeader(targ)
122 # self.enemy.setFgDirective('B')
123 # self.enemy.setFgDirective('F')
124 # self.enemy.AutoPilotTo(targ,True)
125  print 'enemy objective updated '+j
126  return targ
127  return None
128 
129  def nextSystem(self,uni=None):
130  if uni is None:
131  uni_=self.enemy
132  else:
133  uni_=uni
134  sys=uni_.getUnitSystemFile()
135  nextsys=False
136  for i in range(len(self.directions)-1):
137  where=sys.find(self.directions[i])
138  if (where>0):
139  if (sys[where-1]=='/'):
140  where=0
141  if (where==0):
142  nextsys=self.directions[i+1]
143  break
144  return nextsys
145 
146  def getJumpTo(self,jto):
147  jto=jto[1:]
148  jto=jto[jto.find('/')+1:]
149  itera = VS.getUnitList()
150  while itera.notDone():
151  if itera.current().isJumppoint():
152  if itera.current().getName().lower().find(jto.lower())!=-1:
153  return itera.current()
154  itera.advance()
155  return False
156 
157  def getPlacementVectors(self, target):
158  relpos=Vector.Sub(target.Position(),VS.getPlayerX(self.cp).Position())
159  unitrel=Vector.Scale(relpos, 1.0/Vector.Mag(relpos))
160  approx=list()
161  approx.append(Vector.Scale(unitrel, self.tracking[1]))
162  approx.append(Vector.Scale(relpos, (VS.GetGameTime() - self.tracking[0] + self.WAITTIME)/self.WAITTIME))
163  for i in range(len(approx)):
164  if approx[i] < self.mindist or approx[i] > Vector.Mag(relpos):
165  approx[i] = False
166  biggest=(0,0,0)
167  for i in range(len(approx)):
168  if approx[i]:
169  if Vector.Mag(approx[i]) > Vector.Mag(biggest):
170  biggest=approx[i]
171  if Vector.Mag(biggest) < 1:#arbitrary check to see if we've got a valid result
172 # raise RuntimeError("Could not find a suitable approximation for unit placement.")
173 # Runtime errors are ... less than optimal. Lets pick a vector and hope.
174  print 'tail: Pick a vector and hope'
175  unitrel = (1,0,0)
176  biggest = (self.startdist,0,0)
177  return unitrel, biggest
178 
179  def doPlacement(self, target):
180  unitvec, vec = self.getPlacementVectors(target)
181  self.enemy.SetPosition(Vector.Add(VS.getPlayerX(self.cp).Position(),vec))
182  self.enemy.SetOrientation((1,0,0),vec)
183  self.enemy.SetVelocity(Vector.Scale(unitvec,1440.0))
184 
185  def SetVar (self,val):
186  if (self.var_to_set!=''):
187  quest.removeQuest (self.cp,self.var_to_set,val)
188 
189  def initSuccess (self):
190  if self.success == 2:
191  if VS.GetGameTime() > self.tracking[0]:
192  t=self.getJumpTo(self.directions[len(self.directions)-2])
193  self.setupFriendly(t)#FIXME: open wormhole
194  VS.IOmessage (0,"[Mission Command]","all","Out of our way, let us finish the job!")
195  VS.getPlayerX(self.cp).addCredits(self.creds)
196  VS.terminateMission(1)
197  else:
198  t=self.getJumpTo(self.directions[len(self.directions)-2])
199  self.enemy.SetPosition(Vector.Add(Vector.Scale((1,0,0),11063),t.Position()))
200  VS.getPlayerX(self.cp).SetPosition(t.Position())#because self.enemy is at the jumpgate when I jump, so I get pushed off
201  VS.setCompleteness(self.objref, 1.00)
202  self.success=2
203  VS.IOmessage (0,"[Mission Computer]","all","Broadcast intercepted.")
204  for i in range(len(self.succeed1)):
205  VS.IOmessage (i+1,"[Mission Command]","all",self.succeed1[i])
206  self.SetVar(1)
207  self.tracking=(VS.GetGameTime()+self.DELAYTIME, VS.getPlayerX(self.cp).getDistance(self.enemy))
208  return
209 
210  def enemyThreatened (self):
211  """Does the enemy feel different about the player? If yes, the player
212  must have talked to, or shot at the enemy."""
213  if abs(self.enemy.getRelation(VS.getPlayerX(self.cp)) - self.relation) >= 0.003:
214  print "tail: the relation between the player and target has changed"
215  return True
216  return False
217 
218  def outOfRange (self):
219  print "tail: Out of range"
220  i=0
221  for j in range(len(self.fail2)):
222  VS.IOmessage (j,"[Mission Command]","all",self.fail2[j])
223  i+=1
224  VS.IOmessage(i,"[Mission Computer]","all","You are not able to detect the target.")
225  VS.IOmessage (i+1,"[Mission Computer]","all","Mission Failed.")
226  self.fail()
227 
228  def tooClose (self):
229  print "tail: Too close"
230  VS.IOmessage (0,"[Mission Computer]","all","You have been detected by the target %s "%self.enemy.getFullname())
231  VS.IOmessage (1,"[Mission Computer]","all","Mission Failed.")
232  for i in range(len(self.fail1)):
233  VS.IOmessage (i+2,"Target","all",self.fail1[i])
234  self.enemy.SetTarget(VS.getPlayerX(self.cp))
235  self.enemy.setFgDirective('A')
236  self.fail()
237 
238  def tooDead (self):
239  print "tail: Too dead"
240  VS.IOmessage (0,"[Mission Computer]","all","The target %s has been destroyed."%self.enemy.getFullname())
241  VS.IOmessage (1,"[Mission Computer]","all","Mission Failed.")
242  self.fail()
243 
244  def fail (self):
245  self.SetVar(-1)
246  VS.setCompleteness(self.objref, -1.00)
247  VS.terminateMission(0)
248  return
249 
250  def Execute (self):
251  you=VS.getPlayerX(self.cp)
252  if you.isNull():
253  print 'you is null'
254  self.fail()
255  elif self.success:
256  self.initSuccess()
257  elif self.setupEnemy():
258  if self.enemy.isNull():
259  self.tooDead()
260  if self.waiting:
261  if self.tracking[0] < VS.GetGameTime():
262  self.outOfRange()
263  elif VS.getPlayerX(self.cp).getUnitSystemFile() == self.enemy.getUnitSystemFile():
264  self.waiting = False
265  t = self.updateEnemyObjective()
266  VS.IOmessage (0,"[Mission Computer]","all","Target %s detected in this system."%self.enemy.getFullname())
267  VS.setObjective(self.objref,"Follow the %s until it broadcasts the signal"%self.enemy.getFullname())
268  if t is not None:
269  self.doPlacement(t)
270  else:
271  self.success=True
272  elif VS.getPlayerX(self.cp).getUnitSystemFile() != self.enemy.getUnitSystemFile():
273  self.enemy.DeactivateJumpDrive()
274  self.waiting = True
275  self.tracking=(VS.GetGameTime()+self.WAITTIME, VS.getPlayerX(self.cp).getDistance(self.enemy))
276  VS.IOmessage (0,"[Mission Computer]","all","Target %s detected entering %s"%(self.enemy.getFullname(),self.nextSystem(VS.getPlayerX(self.cp))))
277  VS.setObjective(self.objref,"Follow the %s into %s"%(self.enemy.getFullname(),self.nextSystem(VS.getPlayerX(self.cp))))
278  elif VS.getPlayerX(self.cp).getDistance(self.enemy)<self.mindist or self.enemyThreatened():
279  self.tooClose()