Browse Source

Put: try multiple position to put

Bastien Sevajol 8 years ago
parent
commit
21606fa917

+ 19 - 13
intelligine/synergy/event/transport/PutableAction.py View File

@@ -1,3 +1,4 @@
1
+from synergine.synergy.event.exception.ActionAborted import ActionAborted
1 2
 from intelligine.synergy.event.move.MoveAction import MoveAction
2 3
 from intelligine.synergy.object.Food import Food
3 4
 from synergine.synergy.event.Action import Action
@@ -14,20 +15,25 @@ class PutableAction(Action):
14 15
         super().__init__(object_id, parameters)
15 16
 
16 17
     def run(self, obj, context, synergy_manager):
17
-        position_to_put = self._parameters[PutableEvent.PARAM_PUT_TO]
18 18
         obj_transported = obj.get_carried()
19 19
 
20
-        obj_transported.set_carried_by(None)
21
-        #  TODO: re controle de si posable ? La position a été calculé
22
-        #  dans le process. Ce qui fait que la situation peut avoir changer.
23
-        # Soit: Recalculer d'office BrainPut.cant_put_at.. Soit le recalculer que si le hash
24
-        # de ce qu'il y a la a changer ?
25
-        obj.put_carry(obj_transported, position_to_put)
26
-        context.metas.value.set(CANT_CARRY_STILL, obj.get_id(), 5)
20
+        if not self._parameters[PutableEvent.PARAM_PUT_TO]:
21
+            raise ActionAborted()
27 22
 
28
-        obj.get_brain().get_part(BRAIN_PART_PUT).done(obj_transported)
23
+        for position_to_put in self._parameters[PutableEvent.PARAM_PUT_TO]:
29 24
 
30
-        # TODO: DEBUG
31
-        if isinstance(obj_transported, Food):
32
-            #obj_transported.set_position((-1, 0, 0))
33
-            obj_transported.transform_to_stocked()
25
+            #  TODO: re controle de si posable ? La position a été calculé
26
+            #  dans le process. Ce qui fait que la situation peut avoir changer.
27
+            # Soit: Recalculer d'office BrainPut.cant_put_at.. Soit le recalculer que si le hash
28
+            # de ce qu'il y a la a changer ?
29
+
30
+            obj_transported.set_carried_by(None)
31
+            obj.put_carry(obj_transported, position_to_put)
32
+            context.metas.value.set(CANT_CARRY_STILL, obj.get_id(), 5)
33
+
34
+            obj.get_brain().get_part(BRAIN_PART_PUT).done(obj_transported)
35
+
36
+            # TODO: DEV
37
+            if isinstance(obj_transported, Food):
38
+                #obj_transported.set_position((-1, 0, 0))
39
+                obj_transported.transform_to_stocked()

+ 16 - 14
intelligine/synergy/event/transport/PutableEvent.py View File

@@ -23,24 +23,26 @@ class PutableEvent(NearEvent):
23 23
             raise NotConcernedEvent()
24 24
 
25 25
         try:
26
-            self.map(context, parameters, stop_at_first=True)
26
+            self.map(context, parameters, stop_at_first=False)
27 27
         except NearNothingFound:
28 28
             raise NotConcernedEvent()
29 29
 
30
-        object_near_id = parameters[self._near_name][0]
31 30
         brain_part = get_brain_part(context, object_id, BRAIN_PART_PUT)
32
-
33
-        if not brain_part.can_put(context, object_id, object_near_id):
34
-            raise NotConcernedEvent()
35
-
36
-        try:
37
-            put_position = brain_part.get_put_position(context, object_id, object_near_id)
38
-        except CantFindWhereToPut:
39
-            raise NotConcernedEvent()
40
-
41
-        parameters[self.PARAM_PUT] = parameters[self._near_name][0]
42
-        parameters[self.PARAM_PUT_TO] = put_position
43
-        return parameters
31
+        parameters[self.PARAM_PUT] = []
32
+        parameters[self.PARAM_PUT_TO] = []
33
+
34
+        for object_near_id in parameters[self._near_name]:
35
+            if brain_part.can_put(context, object_id, object_near_id):
36
+                try:
37
+                    put_position = brain_part.get_put_position(context, object_id, object_near_id)
38
+                    parameters[self.PARAM_PUT].append(object_near_id)
39
+                    parameters[self.PARAM_PUT_TO].append(put_position)
40
+                    return parameters  # Si a terme on veut tous les calculer a l'avance, ne pas retourner ici
41
+                except CantFindWhereToPut:
42
+                    pass  # On continu la booucle
43
+
44
+        # Si a terme on veut tous les calculer a l'avance, raise que si rien trouve
45
+        raise NotConcernedEvent()
44 46
 
45 47
     @staticmethod
46 48
     def _can_put(object_id, context):