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
15
basedir = p.join(p.dirname(__file__), p.pardir, p.pardir)
17
class BaseDescr(object):
18
def __init__(self, tribe, name, descname, tdir):
21
self._conf_file = p.join(tdir, name, "conf")
22
self._conf = WidelandsConfigParser(p.join(tdir,name,"conf"))
25
self.descname = descname
29
return p.abspath(p.join(self._tdir,self.name,"menu.png"))
31
class Ware(BaseDescr):
33
return "Ware(%s)" % self.name
35
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")
52
return "Worker(%s)" % self.name
54
class Building(BaseDescr):
56
def enhanced_building(self):
57
return self._conf.getboolean("global", "enhanced_building", False)
60
def base_building(self):
61
if not self.enhanced_building:
63
bases = [b for b in self.tribe.buildings.values() if b.enhancement == self.name]
64
if len(bases) == 0 and self.enhanced_building:
65
raise Exception("Building %s has no bases in tribe %s" % (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))
71
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])
83
return dict(self._conf.items("buildcost"))
84
except NoSectionError:
89
return self._conf.getstring("global", "size")
91
class ProductionSite(Building):
92
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())
108
return dict( (k, v) for k,v in self._conf.items("inputs") )
109
except conf.NoSectionError:
114
return dict( (k, v) for k,v in self._conf.items("working positions") )
119
for prog,_ in self._conf.items("programs"):
120
recs |= set([name for type, name in self._conf.items(prog) if type == "recruit"])
123
class Warehouse(Building):
127
class TrainingSite(ProductionSite):
128
btype = "trainings site"
131
class MilitarySite(Building):
132
btype = "military site"
135
return self._conf.get("global", "conquers")
138
def max_soldiers(self):
139
return self._conf.get("global", "max_soldiers")
142
def heal_per_second(self):
143
return self._conf.getint("global", "heal_per_second")
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")),
176
return "Tribe(%s)" % self.name