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