1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- from intelligine.synergy.event.move.MoveAction import MoveAction
- from synergine.synergy.event.Action import Action
- from intelligine.synergy.event.transport.PutableEvent import PutableEvent
- from intelligine.cst import CANT_CARRY_STILL
- from xyzworld.cst import POSITIONS
- from synergine.synergy.event.exception.ActionAborted import ActionAborted
-
-
- class PutableAction(Action):
-
- _listen = PutableEvent
- _depend = [MoveAction]
-
- def __init__(self, object_id, parameters):
- super().__init__(object_id, parameters)
-
- def prepare(self, context):
- pass
-
- def run(self, obj, context, synergy_manager):
- # TODO: DEV
- obj_id_transportable = self._parameters['objects_ids_transportable'][0]
- obj_transportable = synergy_manager.get_map().get_object(obj_id_transportable)
- # TODO: Cette logique de calcul cote process!
- position_to_put = self._get_position_to_put(context, obj, obj_transportable)
- # TODO: Doit etre du meme type que ce qui est transporte !
- obj_transported = obj.get_carried()
- obj_transported.set_carried_by(None)
- obj.put_carry(obj_transported, position_to_put)
- context.metas.value.set(CANT_CARRY_STILL, obj.get_id(), 5)
-
- def _get_position_to_put(self, context, obj, obj_transportable):
- obj_transportable_pos = obj_transportable.get_position()
- if self._is_available_position(context, obj_transportable_pos):
- return obj_transportable_pos
- poss_around_target = context.get_around_points_of_point(obj_transportable_pos)
- poss_around_obj = context.get_around_points_of_point(obj.get_position())
- # For each position between target and current transporter
- for pos_around_target in poss_around_target:
- if pos_around_target in poss_around_obj:
- if self._is_available_position(context, pos_around_target):
- return pos_around_target
- raise ActionAborted()
-
- def _is_available_position(self, context, position):
- # TODO: Pour le moment on ne regarde pas si ce sont tous des oeufs
- count_obj_here = len(context.metas.list.get(POSITIONS, position, allow_empty=True))
- if count_obj_here <= 5 and context.position_is_penetrable(position):
- return True
- return False
|