1
1
#!/usr/bin/env python
4
from conf import WidelandsConfigParser
5
from ConfigParser import NoSectionError, NoOptionError
7
from itertools import chain
12
from settings import WIDELANDS_SVN_DIR
13
basedir = WIDELANDS_SVN_DIR
7
from django.conf import settings
8
basedir = settings.WIDELANDS_SVN_DIR
15
10
basedir = p.join(p.dirname(__file__), p.pardir, p.pardir)
17
13
class BaseDescr(object):
18
def __init__(self, tribe, name, descname, tdir):
15
def __init__(self, tribe, name, descname, json):
21
self._conf_file = p.join(tdir, name, "conf")
22
self._conf = WidelandsConfigParser(p.join(tdir,name,"conf"))
25
19
self.descname = descname
29
return p.abspath(p.join(self._tdir,self.name,"menu.png"))
23
return p.abspath(p.join(settings.WIDELANDS_SVN_DIR, 'data', self._json['icon']))
31
26
class Ware(BaseDescr):
33
return "Ware(%s)" % self.name
29
return 'Ware(%s)' % self.name
35
32
class Worker(BaseDescr):
39
i.strip() for i in re.findall(r'\d+=\s*createitem\s*(\w+)',
40
open(self._conf_file).read())
47
return self._conf.get("global", "becomes")
36
if 'becomes' in self._json:
37
return self._json['becomes']['name']
52
return "Worker(%s)" % self.name
42
return 'Worker(%s)' % self.name
54
45
class Building(BaseDescr):
56
48
def enhanced_building(self):
57
return self._conf.getboolean("global", "enhanced_building", False)
49
if 'enhanced' in self._json:
60
55
def base_building(self):
61
56
if not self.enhanced_building:
63
bases = [b for b in self.tribe.buildings.values() if b.enhancement == self.name]
58
bases = [b for b in list(self.tribe.buildings.values())
59
if b.enhancement == self.name]
64
60
if len(bases) == 0 and self.enhanced_building:
65
raise Exception("Building %s has no bases in tribe %s" % (self.name, self.tribe.name))
61
raise Exception('Building %s has no bases in tribe %s' %
62
(self.name, self.tribe.name))
67
raise Exception("Building %s seems to have more than one base in tribe %s." % (self.name, self.tribe.name))
64
raise Exception('Building %s seems to have more than one base in tribe %s.' % (
65
self.name, self.tribe.name))
71
69
def enhancement(self):
72
rv = self._conf.getstring("global", "enhancement", "none")
73
return rv if rv != "none" else None
77
glob_pat = self._conf.getstring("idle", "pics")
78
return p.abspath(glob(p.join(self._tdir,self.name,glob_pat))[0])
70
if 'enhancement' in self._json:
71
return self._json['enhancement']
81
76
def buildcost(self):
83
return dict(self._conf.items("buildcost"))
84
except NoSectionError:
78
if 'buildcost' in self._json:
79
for buildcost in self._json['buildcost']:
80
result[buildcost['name']] = buildcost['amount']
89
return self._conf.getstring("global", "size")
85
return self._json['size']
91
88
class ProductionSite(Building):
92
btype = "productionsite"
89
btype = 'productionsite'
95
self_produced = set(sorted(
96
i.strip() for i in re.findall(r'produce\s*=(\w+)',
97
open(self._conf_file).read())
99
if not len(self_produced):
100
rv = reduce(lambda a,b: a | b, [ self.tribe.workers[w].outputs
101
for w in self.workers ], set())
94
if 'produced_wares' in self._json:
95
for warename in self._json['produced_wares']:
106
100
def inputs(self):
108
return dict( (k, v) for k,v in self._conf.items("inputs") )
109
except conf.NoSectionError:
102
if 'stored_wares' in self._json:
103
for ware in self._json['stored_wares']:
104
result[ware['name']] = ware['amount']
113
108
def workers(self):
114
return dict( (k, v) for k,v in self._conf.items("working positions") )
110
if 'workers' in self._json:
111
for worker in self._json['workers']:
112
result[worker['name']] = worker['amount']
117
116
def recruits(self):
119
for prog,_ in self._conf.items("programs"):
120
recs |= set([name for type, name in self._conf.items(prog) if type == "recruit"])
118
if 'produced_workers' in self._json:
119
for workername in self._json['produced_workers']:
120
result.add(workername)
123
124
class Warehouse(Building):
127
129
class TrainingSite(ProductionSite):
128
btype = "trainings site"
130
btype = 'trainingsite'
131
134
class MilitarySite(Building):
132
btype = "military site"
135
btype = 'militarysite'
134
138
def conquers(self):
135
return self._conf.get("global", "conquers")
139
return self._json['conquers']
138
142
def max_soldiers(self):
139
return self._conf.get("global", "max_soldiers")
143
return self._json['max_soldiers']
142
146
def heal_per_second(self):
143
return self._conf.getint("global", "heal_per_second")
147
return self._json['heal_per_second']
146
150
class Tribe(object):
147
def __init__(self, name, bdir = basedir):
150
tdir = p.join(bdir, "tribes", name)
152
self._conf = WidelandsConfigParser(p.join(tdir, "conf"))
154
self.wares = dict( (k,Ware(self, k, v, tdir)) for k,v in
155
self._conf.items("ware types"))
156
self.workers = dict(chain(
157
((k,Worker(self, k, v, tdir)) for k,v in
158
self._conf.items("worker types")),
159
((k,Worker(self, k, v, tdir)) for k,v in
160
self._conf.items("carrier types")),
164
self.buildings = dict(chain(
165
((k,ProductionSite(self, k, v, tdir)) for k,v in \
166
self._conf.items("productionsite types")),
167
((k,MilitarySite(self, k, v, tdir)) for k,v in \
168
self._conf.items("militarysite types")),
169
((k,Warehouse(self, k, v, tdir)) for k,v in \
170
self._conf.items("warehouse types")),
171
((k,TrainingSite(self, k, v, tdir)) for k,v in \
172
self._conf.items("trainingsite types")),
152
def __init__(self, tribeinfo, json_directory):
153
self.name = tribeinfo['name']
155
with open(p.normpath(json_directory + '/' +
156
self.name + '_wares.json'), 'r') as wares_file:
157
waresinfo = json.load(wares_file)
159
for ware in waresinfo['wares']:
160
descname = ware['descname']
161
self.wares[ware['name']] = Ware(self, ware['name'], descname, ware)
163
with open(p.normpath(
164
json_directory + '/' + self.name + '_workers.json'), 'r') as workers_file:
165
workersinfo = json.load(workers_file)
166
self.workers = dict()
167
for worker in workersinfo['workers']:
168
descname = worker['descname']
169
self.workers[worker['name']] = Worker(
170
self, worker['name'], descname, worker)
172
with open(p.normpath(
173
json_directory + '/' + self.name + '_buildings.json'), 'r') as buildings_file:
174
buildingsinfo = json.load(buildings_file)
175
self.buildings = dict()
176
for building in buildingsinfo['buildings']:
177
descname = building['descname']
178
if building['type'] == 'productionsite':
179
self.buildings[building['name']] = ProductionSite(
180
self, building['name'], descname, building)
181
elif building['type'] == 'warehouse':
182
self.buildings[building['name']] = Warehouse(
183
self, building['name'], descname, building)
184
elif building['type'] == 'trainingsite':
185
self.buildings[building['name']] = TrainingSite(
186
self, building['name'], descname, building)
187
elif building['type'] == 'militarysite':
188
self.buildings[building['name']] = MilitarySite(
189
self, building['name'], descname, building)
191
self.buildings[building['name']] = Building(
192
self, building['name'], descname, building)
175
194
def __str__(self):
176
return "Tribe(%s)" % self.name
195
return 'Tribe(%s)' % self.name