troops.py 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. # coding: utf-8
  2. import typing
  3. from _elementtree import Element
  4. from lxml import etree
  5. from synergine2.config import Config
  6. from synergine2.log import get_logger
  7. from opencombat.simulation.base import TileStrategySimulation
  8. from opencombat.strategy.team.model import TeamModel
  9. from opencombat.strategy.team.stash import TeamStash
  10. from opencombat.strategy.unit.stash import UnitStash
  11. from opencombat.util import get_class_from_string_path, pretty_xml
  12. from opencombat.xml import XmlValidator
  13. class TroopDumper(object):
  14. def __init__(
  15. self,
  16. config: Config,
  17. ) -> None:
  18. self._config = config
  19. self._logger = get_logger('TroopDumper', config)
  20. def get_troop_dump(
  21. self,
  22. countries_troops: typing.Dict[str, typing.List[TeamModel]],
  23. ) -> str:
  24. troops_template = self._config.resolve(
  25. 'global.troops_template',
  26. 'opencombat/strategy/troops_template.xml',
  27. )
  28. with open(troops_template, 'r') as xml_file:
  29. template_str = xml_file.read()
  30. parser = etree.XMLParser(remove_blank_text=True)
  31. state_root = etree.fromstring(
  32. template_str.encode('utf-8'),
  33. parser,
  34. )
  35. for country, teams in countries_troops.items():
  36. for team in teams:
  37. troop_element = etree.SubElement(state_root, 'troop')
  38. troop_element.attrib['country'] = country
  39. troop_element.attrib['team_id'] = team.id
  40. return pretty_xml(
  41. etree.tostring(
  42. state_root,
  43. ).decode('utf-8'),
  44. )
  45. class TroopClassBuilder(object):
  46. def __init__(
  47. self,
  48. config: Config,
  49. ) -> None:
  50. self._logger = get_logger('TroopManagerBuilder', config)
  51. self._config = config
  52. def get_unit_stash(
  53. self,
  54. units_file_path: str,
  55. ) -> UnitStash:
  56. class_address = self._config.resolve(
  57. 'global.unit_stash',
  58. 'opencombat.strategy.unit.stash.UnitStash',
  59. )
  60. class_ = get_class_from_string_path(
  61. self._config,
  62. class_address,
  63. )
  64. return class_(
  65. self._config,
  66. units_file_path,
  67. )
  68. def get_team_stash(
  69. self,
  70. units_file_path: str,
  71. teams_file_path: str,
  72. ) -> TeamStash:
  73. class_address = self._config.resolve(
  74. 'global.team_stash',
  75. 'opencombat.strategy.team.stash.TeamStash',
  76. )
  77. class_ = get_class_from_string_path(
  78. self._config,
  79. class_address,
  80. )
  81. unit_stash = self.get_unit_stash(units_file_path)
  82. return class_(
  83. self._config,
  84. teams_file_path,
  85. unit_stash=unit_stash,
  86. )
  87. def get_troop_dumper(self) -> TroopDumper:
  88. class_address = self._config.resolve(
  89. 'global.troop_dumper',
  90. 'opencombat.strategy.troops.TroopDumper',
  91. )
  92. class_ = get_class_from_string_path(
  93. self._config,
  94. class_address,
  95. )
  96. return class_(
  97. self._config,
  98. )
  99. class TroopLoader(object):
  100. def __init__(
  101. self,
  102. config: Config,
  103. simulation: TileStrategySimulation,
  104. ) -> None:
  105. self._logger = get_logger('TroopLoader', config)
  106. self._config = config
  107. self._simulation = simulation
  108. schema_file_path = self._config.get(
  109. 'global.troop_schema',
  110. 'opencombat/strategy/troop.xsd',
  111. )
  112. self._xml_validator = XmlValidator(
  113. config,
  114. schema_file_path,
  115. )
  116. def get_troop(
  117. self,
  118. troop_file_path: str,
  119. ) -> Troop:
  120. return Troop(
  121. self._config,
  122. self._validate_and_return_state_element(troop_file_path),
  123. self._simulation,
  124. )
  125. def _validate_and_return_state_element(
  126. self,
  127. troop_file_path: str,
  128. ) -> Element:
  129. return self._xml_validator.validate_and_return(troop_file_path)
  130. class TroopConstructorBuilder(object):
  131. def __init__(
  132. self,
  133. config: Config,
  134. simulation: TileStrategySimulation,
  135. ) -> None:
  136. self._logger = get_logger('TroopConstructorBuilder', config)
  137. self._config = config
  138. self._simulation = simulation
  139. def get_troop_loader(
  140. self,
  141. ) -> TroopLoader:
  142. class_address = self._config.resolve(
  143. 'global.troop_loader',
  144. 'opencombat.strategy.troops.TroopLoader',
  145. )
  146. troop_loader_class = get_class_from_string_path(
  147. self._config,
  148. class_address,
  149. )
  150. return troop_loader_class(
  151. self._config,
  152. self._simulation,
  153. )