Vega strike Python Modules doc  0.5.1
Documentation of the " Modules " folder of Vega strike
 All Data Structures Namespaces Files Functions Variables
verify.py
Go to the documentation of this file.
1 from campaign_lib import *
2 import campaigns
3 import verify_missions
5 global traverser
6 traverser=[]
7 def isType(a,typ):
8  return a.__init__.im_func==typ.__init__.im_func
9 exnonescript=None
10 
12  def __init__(self,var=[]):
13  self.system=("","")
14  self.vars=var
15  def pre(self,precond):
16 
17  #FIXME
18  return True
19  def script(self,scriptname,trav):
20  if (scriptname==None and not isType(trav.node,CampaignChoiceNode)):
21  trav.warn("None script")
22  return False
23  return isinstance(scriptname,TrueSubnode)
24  def post(self,postcond):
25  #FIXME
26  return True
27 def EndNode(node):
28  return CampaignEndNode(node.campaign).subnodes[0]
29 def IsEnd(node):
30  precond=CampaignEndNode(node.campaign).subnodes[0].preconditions[0]
31  try:
32  if (len(node.preconditions)!=1):
33  return False
34  except:
35  print node
36  print dir(node)
37  print node.preconditions
38 # Ignore this, don't try and replace it with isinstance because it won't work!
39  if (node.preconditions[0].__init__.im_func!=precond.__init__.im_func):
40  return False
41  return node.preconditions[0].system==precond.system and node.preconditions[0].dockedshipname==precond.dockedshipname
43  precons=node.preconditions
44  currnodesys=[]
45  currnodeship=[]
46  for pc in precons:
47  if isinstance(pc,InSystemCondition):
48  currnodesys.append(pc.system)
49  currnodeship.append(pc.dockedshipname)
50  if not len(currnodesys):
51  return False
52  if len(currnodesys)>1:
53  print "Two system checks for the same node. Impossible to evaluate as True."
54  return True
55  selector=node.script
56  if selector is None:
57  return False
58  elif isinstance(selector,TrueSubnode):
59  pass#print "TrueSubnode found ... evaluating."
60  else:
61  return False
62  subnodes=node.subnodes
63  snp=[]
64  for i in range(len(subnodes)):
65  snp=snp+subnodes[i].preconditions
66  subnodesys=[]
67  subnodeship=[]
68  for pc in snp:
69  if isinstance(pc,InSystemCondition):
70  subnodesys.append(pc.system)
71  subnodeship.append(pc.dockedshipname)
72  if len(subnodesys)<1:
73  return False
74  valid=True
75  for i in range(len(subnodesys)):
76  if subnodesys[i] != currnodesys[0]:
77  valid=False
78  break
79  elif not (currnodeship[0] is None or subnodeship[i] is None or currnodeship[0] == subnodeship[i]):
80  valid=False
81  break
82  if valid:
83  return False
84  else:
85  print currnodesys+currnodeship
86  print subnodesys+subnodeship
87  return True
88 def ValidMissions(node):
89  missions=[]
90  sc=node.script
91  while True:
92  if sc==None:
93  break
94  if isinstance(sc,LoadMission):
95  missions.append(sc)
96  sc=sc.nextscript
97  if missions == []:
98  return True
99  valid = True
100  for m in missions:
101 # print m.mname + " :: " + str(m.args) + " :: " + m.name
102  print " ++ Mission '%s'"%m.mname
103  if not verify_missions.verifyMission(m.mname,m.args):
104  valid = False
105  return valid
106 class Traverser:
107  def __init__(self,campaign):
108  self.node=campaign.root
109  self.system=[]
110  self.visitednodes=[self.node]
111  def dup(self):
112  tmp=Traverser(self.node.campaign)
113  tmp.system=self.system
114  tmp.node=self.node
115  tmp.visitednodes=self.visitednodes
116  return tmp
117  def warn(self,strin):
118  print strin
119  def cont(self,newnode):
120  if newnode in self.visitednodes:
121  self.node=EndNode(self.node)
122  else:
123  self.node=newnode
124  self.visitednodes.append(newnode)
125  def Update(self,var):
126  if (IsEnd(self.node)):
127  return None
128  if (IsSuperimposition(self.node)):
129  self.warn("Warning: Superimposition detected.")
130  if not ValidMissions(self.node):
131  self.warn("Warning: Invalid Mission Arguments.")
132  cond=MyCondition(var)
133  if not cond.pre(self.node.preconditions):
134  return None
135  if cond.script(self.node.script,self):
136  #true subnode
137  for sn in self.node.subnodes:
138  if (cond.post(sn.preconditions)):
139  tmp=self.dup()
140  tmp.cont(sn)
141  traverser.append(tmp)
142  if (self.node.contingency):
143  self.cont(self.node.contingency)
144  else:
145  self.cont(EndNode(self.node))
146  elif self.node.contingency:
147  for sn in self.node.subnodes:
148  tmp=self.dup()
149  tmp.cont(sn)
150  traverser.append(tmp)
151  if (not (isType(self.node,CampaignClickNode) or isType(self.node,CampaignChoiceNode))):
152  self.warn("Warning: Contingency in non trueSubnode")
153  global exnonescript
154  exnonescript=self.node
155  self.cont(self.node.contingency)
156  elif (len(self.node.subnodes)):
157  if (len(self.node.subnodes)>1):
158  for sn in self.node.subnodes[1:]:
159  tmp=self.dup()
160  tmp.cont(sn)
161  traverser.append(tmp)
162  self.cont(self.node.subnodes[0])
163  else:
164  return None#cannot make progres
165  return cond.vars;
167  global traverser
168  for i in range(len(traverser)-1,-1,-1):
169 
170  if IsEnd(traverser[i].node):
171  del traverser[i]
172 
173  return len(traverser)>0
174 for iter in campaigns.campaigns:
175  import verify_missions
176  verify_missions.campaign_name[iter.name]=1
177  traverser.append(Traverser(iter))
178 print len(traverser)
179 while len(traverser):
180  IsFinished()
181  progress=False
182  variables=[]
183  for i in range(len(traverser)):
184  var=traverser[i].Update(variables)
185  if (type(var)==type([])):
186  variables=var
187  progress=True
188  if not progress and len(traverser):
189  print "Deadlock "
190  break