~widelands-dev/widelands-website/django_staticfiles

« back to all changes in this revision

Viewing changes to widelandslib/tribe.py

  • Committer: Holger Rapp
  • Date: 2009-02-20 12:25:18 UTC
  • Revision ID: holgerrapp@gmx.net-20090220122518-feaq34ta973snnct
Imported wikiapp into our repository, because we did some local changes (users must be logged in to edit wiki pages)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
2
 
# encoding: utf-8
3
 
 
4
 
import os.path as p
5
 
import json
6
 
try:
7
 
    from settings import WIDELANDS_SVN_DIR
8
 
    basedir = WIDELANDS_SVN_DIR
9
 
except:
10
 
    basedir = p.join(p.dirname(__file__), p.pardir, p.pardir)
11
 
 
12
 
 
13
 
class BaseDescr(object):
14
 
 
15
 
    def __init__(self, tribe, name, descname, json):
16
 
        self.tribe = tribe
17
 
        self._json = json
18
 
        self.name = name
19
 
        self.descname = descname
20
 
 
21
 
    @property
22
 
    def image(self):
23
 
        return p.abspath(p.join(WIDELANDS_SVN_DIR, 'data', self._json['icon']))
24
 
 
25
 
 
26
 
class Ware(BaseDescr):
27
 
 
28
 
    def __str__(self):
29
 
        return 'Ware(%s)' % self.name
30
 
 
31
 
 
32
 
class Worker(BaseDescr):
33
 
 
34
 
    @property
35
 
    def becomes(self):
36
 
        if 'becomes' in self._json:
37
 
            return self._json['becomes']['name']
38
 
        else:
39
 
            return None
40
 
 
41
 
    def __str__(self):
42
 
        return 'Worker(%s)' % self.name
43
 
 
44
 
 
45
 
class Building(BaseDescr):
46
 
 
47
 
    @property
48
 
    def enhanced_building(self):
49
 
        if 'enhanced' in self._json:
50
 
            return True
51
 
        else:
52
 
            return False
53
 
 
54
 
    @property
55
 
    def base_building(self):
56
 
        if not self.enhanced_building:
57
 
            return None
58
 
        bases = [b for b in self.tribe.buildings.values()
59
 
                 if b.enhancement == self.name]
60
 
        if len(bases) == 0 and self.enhanced_building:
61
 
            raise Exception('Building %s has no bases in tribe %s' %
62
 
                            (self.name, self.tribe.name))
63
 
        if len(bases) > 1:
64
 
            raise Exception('Building %s seems to have more than one base in tribe %s.' % (
65
 
                self.name, self.tribe.name))
66
 
        return bases[0]
67
 
 
68
 
    @property
69
 
    def enhancement(self):
70
 
        if 'enhancement' in self._json:
71
 
            return self._json['enhancement']
72
 
        else:
73
 
            return None
74
 
 
75
 
    @property
76
 
    def buildcost(self):
77
 
        result = dict()
78
 
        if 'buildcost' in self._json:
79
 
            for buildcost in self._json['buildcost']:
80
 
                result[buildcost['name']] = buildcost['amount']
81
 
        return result
82
 
 
83
 
    @property
84
 
    def size(self):
85
 
        return self._json['size']
86
 
 
87
 
 
88
 
class ProductionSite(Building):
89
 
    btype = 'productionsite'
90
 
 
91
 
    @property
92
 
    def outputs(self):
93
 
        result = set()
94
 
        if 'produced_wares' in self._json:
95
 
            for warename in self._json['produced_wares']:
96
 
                result.add(warename)
97
 
        return result
98
 
 
99
 
    @property
100
 
    def inputs(self):
101
 
        result = dict()
102
 
        if 'stored_wares' in self._json:
103
 
            for ware in self._json['stored_wares']:
104
 
                result[ware['name']] = ware['amount']
105
 
        return result
106
 
 
107
 
    @property
108
 
    def workers(self):
109
 
        result = dict()
110
 
        if 'workers' in self._json:
111
 
            for worker in self._json['workers']:
112
 
                result[worker['name']] = worker['amount']
113
 
        return result
114
 
 
115
 
    @property
116
 
    def recruits(self):
117
 
        result = set()
118
 
        if 'produced_workers' in self._json:
119
 
            for workername in self._json['produced_workers']:
120
 
                result.add(workername)
121
 
        return result
122
 
 
123
 
 
124
 
class Warehouse(Building):
125
 
    btype = 'warehouse'
126
 
    pass
127
 
 
128
 
 
129
 
class TrainingSite(ProductionSite):
130
 
    btype = 'trainingsite'
131
 
    pass
132
 
 
133
 
 
134
 
class MilitarySite(Building):
135
 
    btype = 'militarysite'
136
 
 
137
 
    @property
138
 
    def conquers(self):
139
 
        return self._json['conquers']
140
 
 
141
 
    @property
142
 
    def max_soldiers(self):
143
 
        return self._json['max_soldiers']
144
 
 
145
 
    @property
146
 
    def heal_per_second(self):
147
 
        return self._json['heal_per_second']
148
 
 
149
 
 
150
 
class Tribe(object):
151
 
 
152
 
    def __init__(self, tribeinfo, json_directory):
153
 
        self.name = tribeinfo['name']
154
 
 
155
 
        wares_file = open(p.normpath(json_directory + '/' +
156
 
                                     self.name + '_wares.json'), 'r')
157
 
        waresinfo = json.load(wares_file)
158
 
        self.wares = dict()
159
 
        for ware in waresinfo['wares']:
160
 
            descname = ware['descname'].encode('ascii', 'xmlcharrefreplace')
161
 
            self.wares[ware['name']] = Ware(self, ware['name'], descname, ware)
162
 
 
163
 
        workers_file = open(p.normpath(
164
 
            json_directory + '/' + self.name + '_workers.json'), 'r')
165
 
        workersinfo = json.load(workers_file)
166
 
        self.workers = dict()
167
 
        for worker in workersinfo['workers']:
168
 
            descname = worker['descname'].encode('ascii', 'xmlcharrefreplace')
169
 
            self.workers[worker['name']] = Worker(
170
 
                self, worker['name'], descname, worker)
171
 
 
172
 
        buildings_file = open(p.normpath(
173
 
            json_directory + '/' + self.name + '_buildings.json'), 'r')
174
 
        buildingsinfo = json.load(buildings_file)
175
 
        self.buildings = dict()
176
 
        for building in buildingsinfo['buildings']:
177
 
            descname = building['descname'].encode(
178
 
                'ascii', 'xmlcharrefreplace')
179
 
            if building['type'] == 'productionsite':
180
 
                self.buildings[building['name']] = ProductionSite(
181
 
                    self, building['name'], descname, building)
182
 
            elif building['type'] == 'warehouse':
183
 
                self.buildings[building['name']] = Warehouse(
184
 
                    self, building['name'], descname, building)
185
 
            elif building['type'] == 'trainingsite':
186
 
                self.buildings[building['name']] = TrainingSite(
187
 
                    self, building['name'], descname, building)
188
 
            elif building['type'] == 'militarysite':
189
 
                self.buildings[building['name']] = MilitarySite(
190
 
                    self, building['name'], descname, building)
191
 
            else:
192
 
                self.buildings[building['name']] = Building(
193
 
                    self, building['name'], descname, building)
194
 
 
195
 
    def __str__(self):
196
 
        return 'Tribe(%s)' % self.name