public final void GameStatus(PlayerAIBase.STATUS status, Player plyrStatus, java.util.ArrayList<Player> players, java.util.ArrayList<Passenger> passengers) {

    	  // bugbug - Framework.cs updates the object's in this object's Players, Passengers, and Companies lists. This works fine as long
        // as this app is single threaded. However, if you create worker thread(s) or respond to multiple status messages simultaneously
        // then you need to split these out and synchronize access to the saved list objects.

        try {
           

            switch (status) {
                case UPDATE:
                    return;
            }

            ArrayList<PassengerWithScore> passengerScores = new ArrayList<PassengerWithScore>();
            java.util.ArrayList<Passenger> pickup = new java.util.ArrayList<Passenger>();
            Point ptDest = null;
            if (getMe().getLimo().getPassenger() != null)
            {
                ArrayList<PassengerWithScore> selfPassengerScore = new ArrayList<PassengerWithScore>();
                for (int j = 0; j < getCompanies().size(); j++)
                {
                    double score = calculateHeursitics(getMe(), getCompanies().get(j), getMe().getLimo().getPassenger(), players);
                    
                    double score2 = 0;
                    for (Passenger passenger: getCompanies().get(j).getPassengers()){
                    	
                    	double temp = calculateHeursitics(getMe(), passenger.getDestination(), passenger, players);
                    	if (score2 < temp){
                    		score2 = temp;
                    	}
                    }
                    selfPassengerScore.add(new PassengerWithScore(getMe().getLimo().getPassenger(),SimpleAStar.CalculatePath(getGameMap(), getMe().getLimo().getMapPosition(), getCompanies().get(j).getBusStop()),
                            score, getCompanies().get(j)));
                }
                Collections.sort(selfPassengerScore, new PassengerScoreComparator());
                System.out.println(selfPassengerScore);
                ptDest = selfPassengerScore.get(0).company.getBusStop();
            }
            else
            {
                java.util.ArrayList<Passenger> availPassengers = AllPickups(getMe(), passengers);
                for (int i = 0; i < availPassengers.size(); i++)
                {
                    double score = calculateHeursitics(getMe(),  availPassengers.get(i).getDestination(), availPassengers.get(i), players);
                    passengerScores.add(new PassengerWithScore(availPassengers.get(i),SimpleAStar.CalculatePath(getGameMap(), availPassengers.get(i).getLobby().getBusStop(), availPassengers.get(i).getDestination().getBusStop()),
                    score, availPassengers.get(i).getDestination()));
                }
                Collections.sort(passengerScores, new PassengerScoreComparator());
                ptDest = passengerScores.get(0).company.getBusStop();
            }
            
            



            pickup.addAll(AllPickups(getMe(), passengers));


            // get the path from where we are to the dest.
            java.util.ArrayList<Point> path = CalculatePathPlus1(getMe(), ptDest);

            // update our saved Player to match new settings
            if (path.size() > 0) {
                getMe().getLimo().getPath().clear();
                getMe().getLimo().getPath().addAll(path);
            }
            if (pickup.size() > 0) {
                getMe().getPickUp().clear();
                getMe().getPickUp().addAll(pickup);
            }

            sendOrders.invoke("move", path, pickup);
        } catch (RuntimeException ex) {
            ex.printStackTrace();
        }
    }