| 
				
			 | 
			
			
				@@ -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 
			 |