[go: up one dir, main page]

Menu

[r11]: / modules / verify.py  Maximize  Restore  History

Download this file

191 lines (186 with data), 5.1 kB

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