浏览代码

add troop builder code

Bastien Sevajol 7 年前
父节点
当前提交
0bf95c18ab
共有 1 个文件被更改,包括 66 次插入0 次删除
  1. 66 0
      opencombat/strategy/troops.py

+ 66 - 0
opencombat/strategy/troops.py 查看文件

1
 # coding: utf-8
1
 # coding: utf-8
2
 import typing
2
 import typing
3
+from _elementtree import Element
3
 
4
 
4
 from lxml import etree
5
 from lxml import etree
5
 
6
 
6
 from synergine2.config import Config
7
 from synergine2.config import Config
7
 from synergine2.log import get_logger
8
 from synergine2.log import get_logger
8
 
9
 
10
+from opencombat.simulation.base import TileStrategySimulation
9
 from opencombat.strategy.team.model import TeamModel
11
 from opencombat.strategy.team.model import TeamModel
10
 from opencombat.strategy.team.stash import TeamStash
12
 from opencombat.strategy.team.stash import TeamStash
11
 from opencombat.strategy.unit.stash import UnitStash
13
 from opencombat.strategy.unit.stash import UnitStash
12
 from opencombat.util import get_class_from_string_path, pretty_xml
14
 from opencombat.util import get_class_from_string_path, pretty_xml
15
+from opencombat.xml import XmlValidator
13
 
16
 
14
 
17
 
15
 class TroopDumper(object):
18
 class TroopDumper(object):
109
         return class_(
112
         return class_(
110
             self._config,
113
             self._config,
111
         )
114
         )
115
+
116
+
117
+class TroopLoader(object):
118
+    def __init__(
119
+        self,
120
+        config: Config,
121
+        simulation: TileStrategySimulation,
122
+    ) -> None:
123
+        self._logger = get_logger('TroopLoader', config)
124
+        self._config = config
125
+        self._simulation = simulation
126
+
127
+        schema_file_path = self._config.get(
128
+            'global.troop_schema',
129
+            'opencombat/strategy/troop.xsd',
130
+        )
131
+        self._xml_validator = XmlValidator(
132
+            config,
133
+            schema_file_path,
134
+        )
135
+
136
+    def get_troop(
137
+        self,
138
+        troop_file_path: str,
139
+    ) -> Troop:
140
+        return Troop(
141
+            self._config,
142
+            self._validate_and_return_state_element(troop_file_path),
143
+            self._simulation,
144
+        )
145
+
146
+    def _validate_and_return_state_element(
147
+        self,
148
+        troop_file_path: str,
149
+    ) -> Element:
150
+        return self._xml_validator.validate_and_return(troop_file_path)
151
+
152
+
153
+class TroopConstructorBuilder(object):
154
+    def __init__(
155
+        self,
156
+        config: Config,
157
+        simulation: TileStrategySimulation,
158
+    ) -> None:
159
+        self._logger = get_logger('TroopConstructorBuilder', config)
160
+        self._config = config
161
+        self._simulation = simulation
162
+
163
+    def get_troop_loader(
164
+        self,
165
+    ) -> TroopLoader:
166
+        class_address = self._config.resolve(
167
+            'global.troop_loader',
168
+            'opencombat.strategy.troops.TroopLoader',
169
+        )
170
+        troop_loader_class = get_class_from_string_path(
171
+            self._config,
172
+            class_address,
173
+        )
174
+        return troop_loader_class(
175
+            self._config,
176
+            self._simulation,
177
+        )