Browse Source

MoveAction: data are computed in Event

Bastien Sevajol 9 years ago
parent
commit
09b7205b27

+ 4 - 0
intelligine/core/exceptions.py View File

@@ -6,6 +6,10 @@ class SamePosition(MovementException):
6 6
     pass
7 7
 
8 8
 
9
+class UnableToFoundMovement(MovementException):
10
+    pass
11
+
12
+
9 13
 class PheromoneException(Exception):
10 14
     pass
11 15
 

+ 8 - 28
intelligine/synergy/event/move/MoveAction.py View File

@@ -1,10 +1,8 @@
1 1
 from synergine.synergy.event.Action import Action
2 2
 from intelligine.synergy.event.move.MoveEvent import MoveEvent
3 3
 from synergine.synergy.event.exception.ActionAborted import ActionAborted
4
-from xyzworld.cst import POSITION
5
-from intelligine.cst import BRAIN_PART_MOVE, BRAIN_SCHEMA
4
+from intelligine.cst import BRAIN_PART_MOVE
6 5
 from xyzworld.cst import BLOCKED_SINCE
7
-from intelligine.synergy.event.move.direction import get_position_with_direction_decal
8 6
 
9 7
 
10 8
 class MoveAction(Action):
@@ -17,40 +15,22 @@ class MoveAction(Action):
17 15
         self._move_to_direction = None
18 16
 
19 17
     def prepare(self, context):
20
-        object_point = context.metas.value.get(POSITION, self._object_id)
21
-        direction = self._get_prepared_direction(context)
22
-        self._set_prepared_direction(context, object_point, direction)
23
-
24
-    def _get_prepared_direction(self, context):
25
-        object_brain_schema = context.metas.value.get(BRAIN_SCHEMA, self._object_id)
26
-        object_move_brain_part = object_brain_schema[BRAIN_PART_MOVE]
27
-        return object_move_brain_part.get_direction(context, self._object_id)
28
-
29
-    def _set_prepared_direction(self, context, object_point, direction):
30
-        move_to_point = get_position_with_direction_decal(direction, object_point)
31
-        if self._direction_point_is_possible(context, move_to_point):
32
-            self._move_to_point = move_to_point
33
-            self._move_to_direction = direction
34
-        else:
35
-            # TODO: mettre self._dont_move = True ?
36
-            pass
37
-
38
-    @staticmethod
39
-    def _direction_point_is_possible(context, direction_point):
40
-        return context.position_is_penetrable(direction_point)
18
+        # TODO: C'est event qui doit tout preparer. Action::prepare pourra meme disparaitre ?
19
+        pass
41 20
 
42 21
     def run(self, obj, context, synergy_manager):
43 22
         try:
44 23
             self._apply_move(obj, context)
45 24
         except ActionAborted:
25
+            # TODO: Dans l'obj ces lignes
46 26
             blocked_since = context.metas.value.get(BLOCKED_SINCE, self._object_id, allow_empty=True, empty_value=0)
47
-            context.metas.value.set(BLOCKED_SINCE, self._object_id, blocked_since+1)
27
+            context.metas.value.set(BLOCKED_SINCE, obj.get_id(), blocked_since+1)
48 28
 
49 29
     def _apply_move(self, obj, context):
50 30
         # TODO: il ne faut pas choisir une direction 14.
51
-        if self._move_to_point is None or self._move_to_direction == 14:
31
+        if MoveEvent.PARAM_DIRECTION not in self._parameters or self._parameters[MoveEvent.PARAM_DIRECTION] == 14:
52 32
             raise ActionAborted()
53 33
 
54
-        obj.set_position(self._move_to_point)
55
-        obj.set_previous_direction(self._move_to_direction)
34
+        obj.set_position(self._parameters[MoveEvent.PARAM_POSITION])
35
+        obj.set_previous_direction(self._parameters[MoveEvent.PARAM_DIRECTION])
56 36
         obj.get_brain().get_part(BRAIN_PART_MOVE).done(obj, context)

+ 30 - 2
intelligine/synergy/event/move/MoveEvent.py View File

@@ -1,10 +1,17 @@
1
+from intelligine.core.exceptions import UnableToFoundMovement
2
+from intelligine.synergy.event.move.direction import get_position_with_direction_decal
3
+from synergine.core.exceptions import NotConcernedEvent
1 4
 from synergine.synergy.event.Event import Event
2 5
 from synergine.core.simulation.mechanism.Mechanism import Mechanism
3
-from intelligine.cst import COL_WALKER
6
+from intelligine.cst import COL_WALKER, BRAIN_SCHEMA, BRAIN_PART_MOVE
7
+from xyzworld.cst import POSITION
4 8
 
5 9
 
6 10
 class MoveEvent(Event):
7 11
 
12
+    PARAM_POSITION = 'pos'
13
+    PARAM_DIRECTION = 'dir'
14
+
8 15
     concern = COL_WALKER
9 16
 
10 17
     def __init__(self, actions):
@@ -12,4 +19,25 @@ class MoveEvent(Event):
12 19
         self._mechanism = Mechanism
13 20
 
14 21
     def _prepare(self, object_id, context, parameters={}):
15
-        return parameters
22
+        try:
23
+            direction = self._get_direction(object_id, context)
24
+        except UnableToFoundMovement:
25
+            raise NotConcernedEvent()
26
+
27
+        object_point = context.metas.value.get(POSITION, object_id)
28
+        move_to_point = get_position_with_direction_decal(direction, object_point)
29
+        # TODO: future: c le brain qui calcule ou aller, et donc si c possible
30
+        if self._direction_point_is_possible(context, move_to_point):
31
+            parameters[self.PARAM_POSITION] = move_to_point
32
+            parameters[self.PARAM_DIRECTION] = direction
33
+        # TODO: Sinon lever un NotConcernedEvent
34
+        return parameters
35
+
36
+    def _get_direction(self, object_id, context):
37
+        object_brain_schema = context.metas.value.get(BRAIN_SCHEMA, object_id)
38
+        object_move_brain_part = object_brain_schema[BRAIN_PART_MOVE]
39
+        return object_move_brain_part.get_direction(context, object_id)
40
+
41
+    @staticmethod
42
+    def _direction_point_is_possible(context, direction_point):
43
+        return context.position_is_penetrable(direction_point)

+ 3 - 3
intelligine/tests/simulation/mode/TestChangeMode.py View File

@@ -29,8 +29,8 @@ class TestChangeMode(Base):
29 29
         self._force_move = self._force_move
30 30
 
31 31
     @staticmethod
32
-    def _force_move(self_move_action, context, object_point):
33
-        object_movement_mode = context.metas.value.get(MOVE_MODE, self_move_action._object_id)
32
+    def _force_move(self_move_action, object_id, context):
33
+        object_movement_mode = context.metas.value.get(MOVE_MODE, object_id)
34 34
         if object_movement_mode == MOVE_MODE_GOHOME:
35 35
             return SOUTH
36 36
         return NORTH
@@ -44,7 +44,7 @@ class TestChangeMode(Base):
44 44
             def __init__(self, configuration):
45 45
                 super().__init__(configuration)
46 46
                 self._actions.remove(MoveAction)
47
-                TestMoveAction.force_direction = test_case._force_move
47
+                TestMoveAction.set_move_event(test_case._force_move)
48 48
                 self._actions.append(TestMoveAction)
49 49
         return TestColony(self._get_colony_configuration())
50 50
 

+ 5 - 5
intelligine/tests/src/event/MoveAction.py View File

@@ -1,10 +1,10 @@
1 1
 from intelligine.synergy.event.move.MoveAction import MoveAction as BaseMoveAction
2
-from intelligine.synergy.event.move.direction import NORTH
2
+from intelligine.tests.src.event.MoveEvent import MoveEvent
3 3
 
4 4
 
5 5
 class MoveAction(BaseMoveAction):
6 6
 
7
-    force_direction = lambda self, context, object_id: NORTH
8
-
9
-    def _get_prepared_direction(self, context):
10
-        return self.force_direction(context, self._object_id)
7
+    @classmethod
8
+    def set_move_event(cls, force_direction_function, event=MoveEvent):
9
+        event.force_direction = force_direction_function
10
+        cls._listen = event