~widelands-dev/widelands-website/trunk

« back to all changes in this revision

Viewing changes to widelandslib/tribe.py

  • Committer: Holger Rapp
  • Date: 2009-03-15 20:19:52 UTC
  • mto: This revision was merged to the branch mainline in revision 64.
  • Revision ID: sirver@kallisto.local-20090315201952-eaug9ff2ec8qx1au
Fixed a bug with broken notification support

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
2
 
# encoding: utf-8
3
 
 
4
 
from conf import WidelandsConfigParser
5
 
from ConfigParser import NoSectionError, NoOptionError
6
 
import conf
7
 
from itertools import chain
8
 
import os.path as p
9
 
from glob import glob
10
 
import re
11
 
try:
12
 
    from settings import WIDELANDS_SVN_DIR
13
 
    basedir = WIDELANDS_SVN_DIR
14
 
except:
15
 
    basedir = p.join(p.dirname(__file__), p.pardir, p.pardir)
16
 
 
17
 
class BaseDescr(object):
18
 
    def __init__(self, tribe, name, descname, tdir):
19
 
        self.tribe = tribe
20
 
        self._tdir = tdir
21
 
        self._conf_file = p.join(tdir, name, "conf")
22
 
        self._conf = WidelandsConfigParser(p.join(tdir,name,"conf"))
23
 
 
24
 
        self.name = name
25
 
        self.descname = descname
26
 
 
27
 
    @property
28
 
    def image(self):
29
 
        return p.abspath(p.join(self._tdir,self.name,"menu.png"))
30
 
 
31
 
class Ware(BaseDescr):
32
 
    def __str__(self):
33
 
        return "Ware(%s)" % self.name
34
 
 
35
 
class Worker(BaseDescr):
36
 
    @property
37
 
    def outputs(self):
38
 
        rv = set(sorted(
39
 
            i.strip() for i in re.findall(r'\d+=\s*createitem\s*(\w+)',
40
 
                open(self._conf_file).read())
41
 
        ))
42
 
        return rv
43
 
 
44
 
    @property
45
 
    def becomes(self):
46
 
        try:
47
 
            return self._conf.get("global", "becomes")
48
 
        except NoOptionError:
49
 
            return None
50
 
 
51
 
    def __str__(self):
52
 
        return "Worker(%s)" % self.name
53
 
 
54
 
class Building(BaseDescr):
55
 
    @property
56
 
    def enhanced_building(self):
57
 
        return self._conf.getboolean("global", "enhanced_building", False)
58
 
 
59
 
    @property
60
 
    def base_building(self):
61
 
        if not self.enhanced_building:
62
 
            return None
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))
66
 
        if len(bases) > 1:
67
 
            raise Exception("Building %s seems to have more than one base in tribe %s." % (self.name, self.tribe.name))
68
 
        return bases[0]
69
 
 
70
 
    @property
71
 
    def enhancement(self):
72
 
        rv = self._conf.getstring("global", "enhancement", "none")
73
 
        return rv if rv != "none" else None
74
 
 
75
 
    @property
76
 
    def image(self):
77
 
        glob_pat = self._conf.getstring("idle", "pics")
78
 
        return p.abspath(glob(p.join(self._tdir,self.name,glob_pat))[0])
79
 
 
80
 
    @property
81
 
    def buildcost(self):
82
 
        try:
83
 
            return dict(self._conf.items("buildcost"))
84
 
        except NoSectionError:
85
 
            return {}
86
 
 
87
 
    @property
88
 
    def size(self):
89
 
        return self._conf.getstring("global", "size")
90
 
 
91
 
class ProductionSite(Building):
92
 
    btype = "productionsite"
93
 
    @property
94
 
    def outputs(self):
95
 
        self_produced = set(sorted(
96
 
            i.strip() for i in re.findall(r'produce\s*=(\w+)',
97
 
                open(self._conf_file).read())
98
 
        ))
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())
102
 
            return rv
103
 
        return self_produced
104
 
 
105
 
    @property
106
 
    def inputs(self):
107
 
        try:
108
 
            return dict( (k, v) for k,v in self._conf.items("inputs") )
109
 
        except conf.NoSectionError:
110
 
            return dict()
111
 
 
112
 
    @property
113
 
    def workers(self):
114
 
        return dict( (k, v) for k,v in self._conf.items("working positions") )
115
 
 
116
 
    @property
117
 
    def recruits(self):
118
 
        recs = set([])
119
 
        for prog,_ in self._conf.items("programs"):
120
 
            recs |= set([name for type, name in self._conf.items(prog) if type == "recruit"])
121
 
        return recs
122
 
 
123
 
class Warehouse(Building):
124
 
    btype = "warehouse"
125
 
    pass
126
 
 
127
 
class TrainingSite(ProductionSite):
128
 
    btype = "trainings site"
129
 
    pass
130
 
 
131
 
class MilitarySite(Building):
132
 
    btype = "military site"
133
 
    @property
134
 
    def conquers(self):
135
 
        return self._conf.get("global", "conquers")
136
 
 
137
 
    @property
138
 
    def max_soldiers(self):
139
 
        return self._conf.get("global", "max_soldiers")
140
 
 
141
 
    @property
142
 
    def heal_per_second(self):
143
 
        return self._conf.getint("global", "heal_per_second")
144
 
 
145
 
 
146
 
class Tribe(object):
147
 
    def __init__(self, name, bdir = basedir):
148
 
        self.name = name
149
 
 
150
 
        tdir = p.join(bdir, "tribes", name)
151
 
 
152
 
        self._conf = WidelandsConfigParser(p.join(tdir, "conf"))
153
 
 
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")),
161
 
        ))
162
 
 
163
 
 
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")),
173
 
        ))
174
 
 
175
 
    def __str__(self):
176
 
        return "Tribe(%s)" % self.name
177
 
 
178