private boolean processShotInCell(Line2D shotLine, EnvironmentCell cell) {
        final int agentWidth, agentHeight, bulletsNeededToKill;
        double minSquaredDistance, squaredDistance, agentMinX, agentMinY, agentMaxX, agentMaxY;
        BaseAgent agent, injuredAgent;
        BaseInformation information;
        Point2D agentPosition, injuredAgentShotPoint, shotInitPoint, agentShotPoint;
        Line2D agentShotLine;
        
        agentWidth            = this.configuration.getEnvironment().getAgentWidth();
        agentHeight           = this.configuration.getEnvironment().getAgentHeight();
        bulletsNeededToKill   = this.configuration.getResources().getWeapon().getBulletsNeededToKill();
        injuredAgent          = null;
        injuredAgentShotPoint = null; 
        minSquaredDistance    = Double.POSITIVE_INFINITY; 
        shotInitPoint         = shotLine.getP1();
        
        //Look for the nearest agent that the shot crosses its area
        for(Iterator<BaseAgent> it = cell.getAgentsIterator(); it.hasNext();) {
            agent           = it.next();
            information     = this.population.get(agent);
            agentPosition   = information.getPosition();
            
            if(!agentPosition.equals(shotInitPoint)) {
                agentMinX     = agentPosition.getX() - agentWidth / 2;
                agentMinY     = agentPosition.getY() - agentHeight / 2;
                agentMaxX     = Math.nextAfter(agentMinX + agentWidth, Double.NEGATIVE_INFINITY);
                agentMaxY     = Math.nextAfter(agentMinY + agentHeight, Double.NEGATIVE_INFINITY);
                agentShotLine = GeometryUtils.clipLine(agentMinX, agentMinY, agentMaxX, agentMaxY, 
                                                       shotLine.getX1(), shotLine.getY1(), shotLine.getX2(), shotLine.getY2());
                
                if(agentShotLine != null) {
                    //The shot crosses the agent area
                    
                    agentShotPoint  = agentShotLine.getP1();
                    squaredDistance = shotInitPoint.distanceSq(agentShotPoint);
                    
                    if(squaredDistance < minSquaredDistance) {
                        //It's the nearest agent -> store the agent and the point of impact of the shot
                        minSquaredDistance    = squaredDistance;
                        injuredAgent          = agent;
                        injuredAgentShotPoint = agentShotPoint;
                    }
                }
            }
        }
        
        if(injuredAgent != null) {
            //Update the number of shots received
            information = this.population.get(injuredAgent);
            
            shotLine.setLine(shotInitPoint, injuredAgentShotPoint);
            information.incrementGunshotWounds();
            
            if(information.getGunshotWounds() >= bulletsNeededToKill) {
                //The agent has reached the maximum shots that can receive -> kill it
                
                information.setLifeStatus(AgentLifeStatus.Dead);
                this.deadPopulation.add(information);
                cell.remove(injuredAgent);
                this.population.remove(injuredAgent);
                
                if(AgentsUtils.isHuman(injuredAgent)) {
                    switch(((HumanInformation)information).getHealthStatus()) {
                        case Healthy:
                            this.healthyCount--;
                            break;
                        case Infected:
                            this.infectedCount--;
                            this.infectedHumans.remove((HumanAgent)injuredAgent);
                    }
                }
                else {
                    this.zombifiedCount--;
                }
            }
        }
        
        return injuredAgent != null;
    }