weapon.py 3.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # coding: utf-8
  2. import typing
  3. import pyglet
  4. from PIL import Image
  5. from pyglet.image import ImageData
  6. from synergine2.config import Config
  7. from synergine2_cocos2d.util import PathManager
  8. from opencombat.exception import UnknownWeapon
  9. from opencombat.game.const import MODE_MAN_STAND_UP
  10. from opencombat.game.const import MODE_MAN_CRAWLING
  11. if typing.TYPE_CHECKING:
  12. from opencombat.game.actor import BaseActor
  13. RIFFLE = 'RIFFLE'
  14. class WeaponImageApplier(object):
  15. def __init__(
  16. self,
  17. config: Config,
  18. actor: 'BaseActor',
  19. ) -> None:
  20. self.actor = actor
  21. self._images_scheme = self.get_rest_images_scheme()
  22. self._firing_images_scheme = self.get_firing_images_scheme()
  23. self.path_manager = PathManager(config.resolve('global.include_path.graphics'))
  24. self._cache = {} # type: typing.Dict[str, Image.Image]
  25. self._firing_cache = {} # type: typing.Dict[str, Image.Image]
  26. def get_rest_images_scheme(self) -> typing.Dict[str, typing.Dict[str, typing.List[str]]]:
  27. return self.actor.weapon_image_scheme
  28. def get_firing_images_scheme(self) -> typing.Dict[str, typing.Dict[str, typing.List[str]]]:
  29. return self.actor.weapons_firing_image_scheme
  30. def get_image_for_weapon(self, mode: str, weapon_type: str) -> Image.Image:
  31. try:
  32. image_file_path = self.path_manager.path(
  33. self._images_scheme[mode][weapon_type][0],
  34. )
  35. try:
  36. return self._cache[image_file_path]
  37. except KeyError:
  38. self._cache[image_file_path] = Image.open(image_file_path)
  39. return self._cache[image_file_path]
  40. except KeyError:
  41. raise UnknownWeapon(
  42. 'Unknown weapon "{}" for mode "{}"'.format(weapon_type, mode),
  43. )
  44. def get_firing_image(
  45. self, mode: str,
  46. weapon_type: str,
  47. ) -> typing.List[Image.Image]:
  48. images = []
  49. try:
  50. image_file_paths = self._firing_images_scheme[mode][weapon_type]
  51. for image_file_path in image_file_paths:
  52. final_path = self.path_manager.path(image_file_path)
  53. try:
  54. images.append(self._firing_cache[final_path])
  55. except KeyError:
  56. self._firing_cache[image_file_path] = Image.open(final_path)
  57. images.append(self._firing_cache[image_file_path])
  58. return images
  59. except KeyError:
  60. raise UnknownWeapon(
  61. 'Unknown weapon "{}" for mode "{}"'.format(weapon_type, mode),
  62. )
  63. def get_animation_image_for_weapon(
  64. self,
  65. mode: str,
  66. weapon_type: str,
  67. animation_position: int,
  68. ) -> Image.Image:
  69. try:
  70. image_file_path = self.path_manager.path(
  71. self._images_scheme[mode][weapon_type][animation_position],
  72. )
  73. try:
  74. return self._cache[image_file_path]
  75. except KeyError:
  76. self._cache[image_file_path] = Image.open(image_file_path)
  77. return self._cache[image_file_path]
  78. except KeyError:
  79. raise UnknownWeapon(
  80. 'Unknown weapon "{}" for mode "{}"'.format(weapon_type, mode),
  81. )
  82. except IndexError:
  83. raise UnknownWeapon(
  84. 'Unknown weapon "{}" for mode "{}"'.format(weapon_type, mode),
  85. )