|
@@ -1,6 +1,8 @@
|
1
|
1
|
from synergine.synergy.event.Action import Action
|
2
|
2
|
from intelligine.synergy.event.transport.PutableEvent import PutableEvent
|
3
|
3
|
from intelligine.cst import CANT_CARRY_STILL
|
|
4
|
+from xyzworld.cst import POSITIONS
|
|
5
|
+from synergine.synergy.event.exception.ActionAborted import ActionAborted
|
4
|
6
|
|
5
|
7
|
|
6
|
8
|
class PutableAction(Action):
|
|
@@ -14,16 +16,33 @@ class PutableAction(Action):
|
14
|
16
|
pass
|
15
|
17
|
|
16
|
18
|
def run(self, obj, collection, context, synergy_manager):
|
17
|
|
- # TODO: TEST
|
18
|
|
- # TODO: Enlever le state de transportable a ce qui est transporte
|
19
|
|
- # ?! Comment gerer lorsque deux obj vont vouloir transporter le meme objet ? process !
|
|
19
|
+ # TODO: DEV
|
20
|
20
|
obj_id_transportable = self._parameters['objects_ids_transportable'][0]
|
21
|
21
|
obj_transportable = synergy_manager.get_map().get_object(obj_id_transportable)
|
|
22
|
+ # TODO: Cette logique de calcul cote process!
|
|
23
|
+ position_to_put = self._get_position_to_put(context, obj, obj_transportable)
|
22
|
24
|
# TODO: Doit etre du meme type que ce qui est transporte !
|
23
|
25
|
obj_transported = obj.get_carried()
|
24
|
26
|
obj_transported.set_carried_by(None)
|
25
|
|
- obj.put_carry(obj_transported)
|
|
27
|
+ obj.put_carry(obj_transported, position_to_put)
|
26
|
28
|
context.metas.value.set(CANT_CARRY_STILL, obj.get_id(), 5)
|
27
|
|
- # TODO: Il faut interdire cette action pendant un temps pour eviter que le fourmis deplace
|
28
|
|
- # les memes objets direct apres
|
29
|
|
- # Utiliser les metas pour ca ?
|
|
29
|
+
|
|
30
|
+ def _get_position_to_put(self, context, obj, obj_transportable):
|
|
31
|
+ obj_transportable_pos = obj_transportable.get_position()
|
|
32
|
+ if self._is_available_position(context, obj_transportable_pos):
|
|
33
|
+ return obj_transportable_pos
|
|
34
|
+ poss_arround_target = context.get_arround_points_of_point(obj_transportable_pos)
|
|
35
|
+ poss_arround_obj = context.get_arround_points_of_point(obj.get_position())
|
|
36
|
+ # For each position between target and current transporter
|
|
37
|
+ for pos_arround_target in poss_arround_target:
|
|
38
|
+ if pos_arround_target in poss_arround_obj:
|
|
39
|
+ if self._is_available_position(context, pos_arround_target):
|
|
40
|
+ return pos_arround_target
|
|
41
|
+ raise ActionAborted()
|
|
42
|
+
|
|
43
|
+ def _is_available_position(self, context, position):
|
|
44
|
+ # TODO: Pour le moment on ne regarde pas si ce sont tous des oeufs
|
|
45
|
+ count_obj_here = len(context.metas.list.get(POSITIONS, position, allow_empty=True))
|
|
46
|
+ if count_obj_here <= 5:
|
|
47
|
+ return True
|
|
48
|
+ return False
|