interior.py 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. # coding: utf-8
  2. import typing
  3. from synergine2_xyz.map import TMXMap
  4. from synergine2_xyz.utils import get_direct_around_positions_of_position
  5. class InteriorMapConfiguration(object):
  6. def __init__(
  7. self,
  8. layer_name: str='interiors',
  9. exterior_id: str='ext',
  10. interior_id: str='int',
  11. separator_id: str='sep',
  12. ) -> None:
  13. self.layer_name = layer_name
  14. self.exterior_id = exterior_id
  15. self.interior_id = interior_id
  16. self.separator_id = separator_id
  17. class InteriorManager(object):
  18. def __init__(
  19. self,
  20. map_: TMXMap,
  21. configuration: InteriorMapConfiguration=None,
  22. ) -> None:
  23. self.interiors = []
  24. self.map = map_
  25. self.configuration = configuration or InteriorMapConfiguration()
  26. self.interiors = self._compute_interiors()
  27. def _compute_interiors(self) -> typing.List[typing.List[typing.Tuple[int, int]]]:
  28. interiors = []
  29. layer_tiles = self.map.layer_tiles(self.configuration.layer_name)
  30. for tile_xy, tile in layer_tiles.items():
  31. if tile.property('id') == self.configuration.interior_id:
  32. x, y = map(int, tile_xy.split('.'))
  33. if not any([(x, y) in i for i in interiors]):
  34. new_interior = [(x, y)]
  35. positions_to_parse = []
  36. possible_positions_xyz = get_direct_around_positions_of_position((x, y, 0))
  37. possible_positions_xy = [(p[0], p[1]) for p in possible_positions_xyz]
  38. positions_to_parse.extend(possible_positions_xy)
  39. for possible_position_xyz in positions_to_parse:
  40. test_tile = None
  41. new_tile_x = possible_position_xyz[0]
  42. new_tile_y = possible_position_xyz[1]
  43. possible_position_key = '{}.{}'.format(new_tile_x, new_tile_y)
  44. if (new_tile_x, new_tile_y) in new_interior:
  45. continue
  46. try:
  47. test_tile = layer_tiles[possible_position_key]
  48. except KeyError:
  49. continue
  50. if test_tile.property('id') not in [
  51. self.configuration.interior_id,
  52. self.configuration.separator_id,
  53. ]:
  54. continue
  55. new_interior.append((new_tile_x, new_tile_y))
  56. if not test_tile.property('id') == self.configuration.separator_id:
  57. new_position_neighbour = get_direct_around_positions_of_position((new_tile_x, new_tile_y, 0))
  58. positions_to_parse.extend(new_position_neighbour)
  59. interiors.append(new_interior)
  60. return interiors
  61. def get_interiors(
  62. self,
  63. where_positions: typing.List[typing.Tuple[int, int]]=None,
  64. ) -> typing.List[typing.List[typing.Tuple[int, int]]]:
  65. if not where_positions:
  66. return self.interiors
  67. interiors = []
  68. for interior in self.interiors:
  69. for where_position in where_positions:
  70. if where_position in interior and interior not in interiors:
  71. interiors.append(interior)
  72. return interiors