weapon.py 3.5KB

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