1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- # coding: utf-8
- import typing
-
- import pyglet
- from PIL import Image
- from pyglet.image import ImageData
- from synergine2.config import Config
- from synergine2_cocos2d.util import PathManager
-
- from opencombat.exception import UnknownWeapon
- from opencombat.game.const import MODE_MAN_STAND_UP
- from opencombat.game.const import MODE_MAN_CRAWLING
-
- if typing.TYPE_CHECKING:
- from opencombat.game.actor import BaseActor
-
- RIFFLE = 'RIFFLE'
-
-
- class WeaponImageApplier(object):
- def __init__(
- self,
- config: Config,
- actor: 'BaseActor',
- ) -> None:
- self.actor = actor
- self._images_scheme = self.get_rest_images_scheme()
- self._firing_images_scheme = self.get_firing_images_scheme()
- self.path_manager = PathManager(config.resolve('global.include_path.graphics'))
- self._cache = {} # type: typing.Dict[str, Image.Image]
- self._firing_cache = {} # type: typing.Dict[str, Image.Image]
-
- def get_rest_images_scheme(self) -> typing.Dict[str, typing.Dict[str, typing.List[str]]]:
- return self.actor.weapon_image_scheme
-
- def get_firing_images_scheme(self) -> typing.Dict[str, typing.Dict[str, typing.List[str]]]:
- return self.actor.weapons_firing_image_scheme
-
- def get_image_for_weapon(self, mode: str, weapon_type: str) -> Image.Image:
- try:
- image_file_path = self.path_manager.path(
- self._images_scheme[mode][weapon_type][0],
- )
- try:
- return self._cache[image_file_path]
- except KeyError:
- self._cache[image_file_path] = Image.open(image_file_path)
- return self._cache[image_file_path]
- except KeyError:
- raise UnknownWeapon(
- 'Unknown weapon "{}" for mode "{}"'.format(weapon_type, mode),
- )
-
- def get_firing_image(
- self, mode: str,
- weapon_type: str,
- ) -> typing.List[Image.Image]:
- images = []
- try:
- image_file_paths = self._firing_images_scheme[mode][weapon_type]
- for image_file_path in image_file_paths:
- final_path = self.path_manager.path(image_file_path)
- try:
- images.append(self._firing_cache[final_path])
- except KeyError:
- self._firing_cache[image_file_path] = Image.open(final_path)
- images.append(self._firing_cache[image_file_path])
- return images
- except KeyError:
- raise UnknownWeapon(
- 'Unknown weapon "{}" for mode "{}"'.format(weapon_type, mode),
- )
-
- def get_animation_image_for_weapon(
- self,
- mode: str,
- weapon_type: str,
- animation_position: int,
- ) -> Image.Image:
- try:
- image_file_path = self.path_manager.path(
- self._images_scheme[mode][weapon_type][animation_position],
- )
- try:
- return self._cache[image_file_path]
- except KeyError:
- self._cache[image_file_path] = Image.open(image_file_path)
- return self._cache[image_file_path]
- except KeyError:
- raise UnknownWeapon(
- 'Unknown weapon "{}" for mode "{}"'.format(weapon_type, mode),
- )
- except IndexError:
- raise UnknownWeapon(
- 'Unknown weapon "{}" for mode "{}"'.format(weapon_type, mode),
- )
-
|