|
@@ -5,6 +5,7 @@ from xyzworld.cst import POSITION
|
5
|
5
|
from intelligine.cst import PREVIOUS_DIRECTION, BLOCKED_SINCE, MOVE_MODE, MOVE_MODE_EXPLO
|
6
|
6
|
from intelligine.cst import COL_TRANSPORTER_NOT_CARRYING, COL_TRANSPORTER_CARRYING
|
7
|
7
|
from intelligine.synergy.event.move.direction import directions_same_level, directions_modifiers, directions_slighty
|
|
8
|
+from intelligine.synergy.event.move.direction import get_position_with_direction_decal
|
8
|
9
|
from intelligine.core.exceptions import NoPheromone, BestPheromoneHere
|
9
|
10
|
from intelligine.simulation.pheromone.DirectionPheromone import DirectionPheromone
|
10
|
11
|
|
|
@@ -26,7 +27,7 @@ class MoveAction(Action):
|
26
|
27
|
except NoPheromone:
|
27
|
28
|
direction = self._get_random_direction(context)
|
28
|
29
|
|
29
|
|
- move_to_point = self._get_point_for_direction(object_point, direction)
|
|
30
|
+ move_to_point = get_position_with_direction_decal(direction, object_point)
|
30
|
31
|
if self._direction_point_is_possible(context, move_to_point):
|
31
|
32
|
self._move_to_point = move_to_point
|
32
|
33
|
self._move_to_direction = direction
|
|
@@ -35,13 +36,15 @@ class MoveAction(Action):
|
35
|
36
|
pass
|
36
|
37
|
|
37
|
38
|
def _get_direction_with_pheromones(self, context, object_point):
|
38
|
|
- # TODO: Placer directnement pheromone type dans les metas
|
39
|
39
|
object_movement_mode = context.metas.value.get(MOVE_MODE, self._object_id)
|
40
|
40
|
pheromone_type = DirectionPheromone.get_pheromone_type_for_move_mode(object_movement_mode)
|
41
|
41
|
try:
|
42
|
42
|
direction = self._get_pheromone_direction_for_point(context, object_point, pheromone_type)
|
43
|
43
|
except NoPheromone:
|
44
|
|
- direction = self._get_direction_of_pheromone(context, object_point, pheromone_type)
|
|
44
|
+ try:
|
|
45
|
+ direction = self._get_direction_of_pheromone(context, object_point, pheromone_type)
|
|
46
|
+ except NoPheromone:
|
|
47
|
+ raise
|
45
|
48
|
return direction
|
46
|
49
|
|
47
|
50
|
@staticmethod
|
|
@@ -50,10 +53,8 @@ class MoveAction(Action):
|
50
|
53
|
|
51
|
54
|
@staticmethod
|
52
|
55
|
def _get_direction_of_pheromone(context, point, pheromone_type):
|
53
|
|
- search_pheromone_distance = 1 # TODO: config
|
54
|
|
- search_pheromone_in_points = context.get_arround_points_of(point, distance=search_pheromone_distance)
|
|
56
|
+ search_pheromone_in_points = context.get_arround_points_of(point, distance=1)
|
55
|
57
|
try:
|
56
|
|
- # TODO: ? Avoir plutot un DirectionPheromone.get_best_pheromone_direction_in ?
|
57
|
58
|
best_pheromone_direction = DirectionPheromone.get_best_pheromone_direction_in(context,
|
58
|
59
|
point,
|
59
|
60
|
search_pheromone_in_points,
|
|
@@ -62,13 +63,6 @@ class MoveAction(Action):
|
62
|
63
|
except NoPheromone as err:
|
63
|
64
|
raise err
|
64
|
65
|
|
65
|
|
- # def _get_random_direction_point(self, context, reference_point):
|
66
|
|
- # z, x, y = reference_point
|
67
|
|
- # direction_name = self._get_random_direction_name(context)
|
68
|
|
- # directions_modifier = directions_modifiers[direction_name]
|
69
|
|
- # new_position = (z + directions_modifier[0], x + directions_modifier[1], y + directions_modifier[2])
|
70
|
|
- # return (direction_name, new_position)
|
71
|
|
-
|
72
|
66
|
def _get_random_direction(self, context):
|
73
|
67
|
try:
|
74
|
68
|
blocked_since = context.metas.value.get(BLOCKED_SINCE, self._object_id)
|
|
@@ -96,21 +90,12 @@ class MoveAction(Action):
|
96
|
90
|
return direction_name
|
97
|
91
|
|
98
|
92
|
@staticmethod
|
99
|
|
- def _get_point_for_direction(reference_point, direction):
|
100
|
|
- # TODO: mettre une fonction cote direction.py pour appliquer le modifier.
|
101
|
|
- z, x, y = reference_point
|
102
|
|
- directions_modifier = directions_modifiers[direction]
|
103
|
|
- return z + directions_modifier[0], x + directions_modifier[1], y + directions_modifier[2]
|
104
|
|
-
|
105
|
|
- @staticmethod
|
106
|
93
|
def _direction_point_is_possible(context, direction_point):
|
107
|
94
|
return context.position_is_penetrable(direction_point)
|
108
|
95
|
|
109
|
96
|
def run(self, obj, context, synergy_manager):
|
110
|
97
|
if self._move_to_point is not None and self._move_to_direction != 14: # TODO: il ne faut pas choisir une direction 14.
|
111
|
98
|
obj.set_position(self._move_to_point)
|
112
|
|
- #direction_from = directions_opposites[self._move_to_direction]
|
113
|
|
- #obj.set_direction_from(direction_from)
|
114
|
99
|
context.metas.value.set(PREVIOUS_DIRECTION, self._object_id, self._move_to_direction)
|
115
|
100
|
context.metas.value.set(BLOCKED_SINCE, self._object_id, 0)
|
116
|
101
|
self._appose_pheromone(obj, context)
|
|
@@ -122,18 +107,8 @@ class MoveAction(Action):
|
122
|
107
|
obj.put_carry(obj_transported, (-1, 0, 0))
|
123
|
108
|
obj.get_brain().switch_to_mode(MOVE_MODE_EXPLO)
|
124
|
109
|
context.metas.collections.add_remove(obj.get_id(),
|
125
|
|
- COL_TRANSPORTER_NOT_CARRYING, COL_TRANSPORTER_CARRYING)
|
126
|
|
-
|
127
|
|
- # TMP: Devra etre un event et une action
|
128
|
|
- # if self._move_to_point == (0, 5, 5): # position de depart
|
129
|
|
- # if len(obj._carried):
|
130
|
|
- # obj_transported = obj.get_carried()
|
131
|
|
- # obj_transported.set_carried_by(None)
|
132
|
|
- # obj.put_carry(obj_transported, (-1, 5, 5))
|
133
|
|
- # context.metas.collections.add_remove(obj.get_id(), COL_TRANSPORTER_NOT_CARRYING, COL_TRANSPORTER_CARRYING)
|
134
|
|
- # obj.set_movement_mode(MOVE_MODE_EXPLO)
|
135
|
|
-
|
136
|
|
-
|
|
110
|
+ COL_TRANSPORTER_NOT_CARRYING,
|
|
111
|
+ COL_TRANSPORTER_CARRYING)
|
137
|
112
|
else:
|
138
|
113
|
try:
|
139
|
114
|
blocked_since = context.metas.value.get(BLOCKED_SINCE, self._object_id)
|
|
@@ -141,61 +116,8 @@ class MoveAction(Action):
|
141
|
116
|
blocked_since = 0
|
142
|
117
|
context.metas.value.set(BLOCKED_SINCE, self._object_id, blocked_since+1)
|
143
|
118
|
|
144
|
|
- # def _get_pheromone_direction_point(self, context, object_point):
|
145
|
|
- # try:
|
146
|
|
- # blocked_since = context.metas.value.get(BLOCKED_SINCE, self._object_id)
|
147
|
|
- # except KeyError:
|
148
|
|
- # blocked_since = 0
|
149
|
|
- # if blocked_since > 3:
|
150
|
|
- # raise NoPheromoneMove()
|
151
|
|
- # # Si on explore, on cherche pheromone d'explo
|
152
|
|
- # # si on rentre a home, on cherche pheromone d'home...
|
153
|
|
- # # TODO: code arrache
|
154
|
|
- # object_movement_mode = context.metas.value.get(MOVE_MODE, self._object_id)
|
155
|
|
- # if object_movement_mode == MOVE_MODE_EXPLO:
|
156
|
|
- # pheromone_direction_type = PHEROMON_DIR_EXPLO
|
157
|
|
- # elif object_movement_mode == MOVE_MODE_GOHOME:
|
158
|
|
- # pheromone_direction_type = PHEROMON_DIR_HOME
|
159
|
|
- #
|
160
|
|
- # sniff_points = context.get_arround_points_of(object_point, distance=0)
|
161
|
|
- # # Faire un compile des infos de pheromones
|
162
|
|
- #
|
163
|
|
- # directions = {}
|
164
|
|
- # for sniff_point in sniff_points:
|
165
|
|
- # info = context.pheromones().get_info(sniff_point,
|
166
|
|
- # [PHEROMON_DIRECTION, pheromone_direction_type],
|
167
|
|
- # allow_empty=True,
|
168
|
|
- # empty_value={})
|
169
|
|
- # for direction in info:
|
170
|
|
- # if direction not in directions:
|
171
|
|
- # directions[direction] = info[direction]
|
172
|
|
- # else:
|
173
|
|
- # directions[direction] += info[direction]
|
174
|
|
- # if len(directions):
|
175
|
|
- # sorted_directions = sorted(directions.items(), key=operator.itemgetter(1))
|
176
|
|
- # sorted_directions.reverse()
|
177
|
|
- # #best_direction_name = sorted_directions[0][0]
|
178
|
|
- # best_direction_level = sorted_directions[0][1]
|
179
|
|
- # best_direction_names = [direction for direction in directions \
|
180
|
|
- # if directions[direction] == best_direction_level]
|
181
|
|
- # # Si plusieurs best directions, choisir mm direction que la precedente
|
182
|
|
- # # si y a pas, au hasard.
|
183
|
|
- # last_dir_name = context.metas.value.get(PREVIOUS_DIRECTION, self._object_id)
|
184
|
|
- # if last_dir_name in best_direction_names:
|
185
|
|
- # direction_name = last_dir_name
|
186
|
|
- # else:
|
187
|
|
- # direction_name = choice(best_direction_names)
|
188
|
|
- #
|
189
|
|
- # # DRY
|
190
|
|
- # z, x, y = object_point
|
191
|
|
- # directions_modifier = directions_modifiers[direction_name]
|
192
|
|
- # new_position = (z + directions_modifier[0], x + directions_modifier[1], y + directions_modifier[2])
|
193
|
|
- # return (direction_name, new_position)
|
194
|
|
- #
|
195
|
|
- # pass
|
196
|
|
- # raise NoPheromoneMove()
|
197
|
|
-
|
198
|
|
- def _appose_pheromone(self, obj, context):
|
|
119
|
+ @staticmethod
|
|
120
|
+ def _appose_pheromone(obj, context):
|
199
|
121
|
# TODO: Cette action de pheromone doit etre une surcharge de Move afin d'avoir une Action Move generique.
|
200
|
122
|
obj.get_brain().host_moved()
|
201
|
123
|
try:
|