Example #1
0
 def canMoveInThisCoordonates(self, new_coordonates, refused_coordonates_count):
   
   # sortie d'ecran: TODO dans un fct seule
   if new_coordonates[0] < 0 or new_coordonates[1] < 0 or new_coordonates[0] > Configuration.CONF_SCREEN_WIDTH or new_coordonates[1] > Configuration.CONF_SCREEN_HEIGHT:
     return False
   
   if ZoneConnector.objectMatchWithJailZone(self.brain.host.__class__.__name__, self.brain.work, 'Nursery'):
     nursery = self.simulation.getZoneIfExist('Nursery')
     if nursery != None :
       if not nursery.positionIsInArea(new_coordonates):
         return False
   # TODO: Modifier ce code hardcoded. Il faut changer le ZONE_RULE_JAIL pour preciser
   # la zone en question
   if self.brain.host.__class__.__name__ == 'Worker' and\
      self.brain.work == 'Fooding' and\
      self.brain.host.canCarryObject() == True:
     if self.brain.host.object_carried != None:
       if self.brain.host.object_carried.__class__.__name__ == 'PlantPiece':
         
         #### TMP
         # if in Fortress, plus de route a suivre!
         if self.simulation.positionIsInArea('Fortress', self.brain.host.getPosition()):
           self.brain.stopFollowingRoute()
         
         # sors de PlantRepository
         if not self.simulation.positionIsInArea('PlantRepository', new_coordonates) and self.simulation.positionIsInArea('PlantRepository', self.brain.host.getPosition()):
           return False
         else:
           # dans forteresse mais pas dans PlantRepository
           if self.simulation.positionIsInArea('Fortress', self.brain.host.getPosition()) and not self.simulation.positionIsInArea('PlantRepository', self.brain.host.getPosition()):
             # s'eloigne de PlantRepository
             if self.simulation.getDistanceFromArea('PlantRepository', new_coordonates) > self.simulation.getDistanceFromArea('PlantRepository', self.brain.host.getPosition()):
               return False
           else:
             # s'eloigne de PlantPiecesRoad
             # todo: s'eloigne de prochain point de la trace
             #if not self.simulation.positionIsInTrace('PlantPiecesRoad', new_coordonates) and self.simulation.positionIsInTrace('PlantPiecesRoad', self.brain.host.getPosition()):
             if self.isGoingAwayFromRoad(new_coordonates):
               return False
             # n'est pas dans PlantRepository
             elif not self.simulation.positionIsInArea('PlantRepository', self.brain.host.getPosition()):
               # s'eloigne de Fortress
               if self.simulation.getDistanceFromArea('Fortress', new_coordonates) > self.simulation.getDistanceFromArea('Fortress', self.brain.host.getPosition()) and refused_coordonates_count < 3:
                 return False
     
     else:
       
       # test si pas de soute suivis, on en demande une afin que toutes les termites aille dans ces traces!
       if self.brain.noTraceFollowingSinceTooLong():
         self.brain.connectToTrace('PlantPiecesRoad', self.simulation, -1)
       
       #if not self.simulation.positionIsInTrace('PlantPiecesRoad', new_coordonates) and self.simulation.positionIsInTrace('PlantPiecesRoad', self.brain.host.getPosition()):
       # s'eloigne du prochain point de la trace
       if self.isGoingAwayFromRoad(new_coordonates):
         return False
   return True
Example #2
0
    def getAction(self, simulation):

        if self.work == "Nursing":
            # TODO: il faudra passer un tableau de types d'objet
            # pour ne faire cette demande qu'une seule fois
            larva_near = simulation.findObjectNearPosition("Larva", self.host.getPosition(), 1, False)
            if larva_near != None:
                if self.host.object_carried == None:
                    return Take(simulation, self, self.host, larva_near)
                elif self.host.object_carried.__class__.__name__ == "Larva":
                    return PutLarva(simulation, self, self.host, self.host.object_carried)

        if self.work == "Fooding":
            if ZoneConnector.objectMatchWithActionZone("Worker", "Fooding", "PlantZone"):
                # TODO: ce code ne permet qu'une zone de ce type, il faudra
                # recup une liste et regarder si il est dans une d'entre elles
                plant_zone = simulation.getZoneIfExist("PlantZone")
                if plant_zone != None:
                    if plant_zone.positionIsInArea(self.host.getPosition()):
                        if self.host.object_carried == None:
                            #
                            # simulation.core.pygame.draw_pixels((130, 130, 130), TraceManipulator.getEnlargedTrace(self.host.long_trace, 10))
                            simulation.addTraceZone(
                                PlantPiecesTrace(self.host.long_trace, 10, "TODO: id ou pas ici ?"), "PlantPiecesRoad"
                            )
                            self.host.long_trace = deque()
                            #
                            return TakePlantPiece(simulation, self, self.host)
            if ZoneConnector.objectMatchWithActionZone("Worker", "Fooding", "PlantRepository"):
                # TODO: ce code ne permet qu'une zone de ce type, il faudra
                # recup une liste et regarder si il est dans une d'entre elles
                plant_repo = simulation.getZoneIfExist("PlantRepository")
                if plant_repo != None:
                    if plant_repo.positionIsInArea(self.host.getPosition()):
                        if self.host.object_carried != None:
                            if self.host.object_carried.__class__.__name__ == "PlantPiece":
                                plant_piece_near = simulation.findObjectNearPosition(
                                    "PlantPiece", self.host.getPosition(), 1, False
                                )
                                if plant_piece_near != None:
                                    return PutPlantPiece(simulation, self, self.host, self.host.object_carried)
        return None