protected boolean pickAndExecuteAnAction() {
    if (getName().equals("bankManager")) print("bigState:" + bigState);

    /*Emergency scheduler rules go here (v2)*/
    if (emergencyState == EmergencyState.fire) {
      ReactToFire();
      return true;
    }
    // This should be the only part of the scheduler which runs if the person has an active role
    boolean anyActive = false;
    for (Role role : roles) {
      if (role.isActive()) {
        anyActive = true;
        if (role.pickAndExecuteAnAction()) return true;
      }
    }
    // Reaching here means there is an active role, but it is "waiting" for a state to be updated
    // Thus, the PersonAgent's scheduler should return FALSE
    if (anyActive) {
      return false;
    }
    switch (bigState) {
      case atHome:
        {
          if (homeState == HomeState.sleeping) {
            if (!isWeekend()) {
              if (cityData.hour >= 0
                  && (job.equals("Host")
                      || job.equals("MarketManager")
                      || job.equals("BankManager"))) {
                // delete the && false when the actual rule is implemented
                WakeUp();
                return true;
              } else if (cityData.hour >= 3 && isEmployee()) {

                // print(getJob());
                WakeUp();
                return true;
              } else if (cityData.hour >= 6) {
                WakeUp();
                return true;
              }
              return false; // put the agent thread back to sleep
            } else {
              if (cityData.hour >= 2
                  && (job.equals("Host")
                      || job.equals("MarketManager")
                      || job.equals("BankManager"))) {
                // delete the && false when the actual rule is implemented
                WakeUp();
                return true;
              } else if (cityData.hour >= 5 && isEmployee()) {

                // print(getJob());
                WakeUp();
                return true;
              } else if (cityData.hour >= 8) {
                WakeUp();
                return true;
              }
              return false; // put the agent thread back to sleep
            }
          }

          if (tiredLevel >= TIRED) {
            goToSleep();
            return false; // intentional because the thread is being out to sleep
          }

          if (home instanceof Apartment && rentDue && !home.manager.equals(this)) {
            payRent(0);
            return true;
          }

          if (hungerLevel >= HUNGRY) {
            int num = (int) (Math.random() * 2);
            if (num == 0) {
              makeFood();
              return true;
            }
            if (num == 1) {
              leaveHome();
              return true;
            }
          }

          if (goToWork
              && jobBuilding != null
              && (!home.manager.equals(this) && home instanceof Apartment)) {
            leaveHome();
            return true;
          }

          if (home instanceof Apartment && rentDue && !home.manager.equals(this)) {
            // TODO
            if (banks.get(0).isOpen) {
              payRent(0);
            } else if (banks.get(1).isOpen) {
              payRent(1);
            }
            return true;
          }

          if (homeState == HomeState.onCouch) {
            goToCouch();
            return true;
          }
          if (homeState == HomeState.none) {
            if (home instanceof Apartment && home.manager.equals(this) && lowInventory()) {
              leaveHome();
              return true;
            } else if (home instanceof Apartment && home.manager.equals(this)) {
              goToCouch();
              return true;
            } else if (cash <= LOWMONEY || cash >= HIGHMONEY) {
              System.err.println("money problems");
              leaveHome();
              return true;
            }
          }
        }
      case leaveHome:
        {
          // personGui.DoGoToEntrance();
          leaveHome();
          return true;
        }
      case goToRestaurant:
        {
          goToRestaurant();
          return true;
        }
      case goHome:
        {
          goHome();
          return true;
        }
      case goToBank:
        {
          goToBank();
          return true;
        }
      case goToMarket:
        {
          goToMarket();
          return true;
        }

      case doingNothing:
        {
          // Decide what the next BigState will be based on current parameters

          if (goToWork && jobBuilding != null) {
            destinationBuilding = jobBuilding;
            desiredRole = job;
            if (destinationBuilding.type == BuildingType.market) {
              bigState = BigState.goToMarket;
              return true;
            } else if (destinationBuilding.type == BuildingType.bank) {
              bigState = BigState.goToBank;
              return true;
            } else if (destinationBuilding.type == BuildingType.restaurant) {
              bigState = BigState.goToRestaurant;
              return true;
            }
          }

          if (hungerLevel >= STARVING) {
            bigState = BigState.goToRestaurant;
            desiredRole = "Customer";
            if (!goToWork) return true;
          }

          if (cash <= LOWMONEY) {
            if (!job.equals("bankManager")) {
              bigState = BigState.goToBank;
              desiredRole = "Customer";
              double withdrawAmount =
                  (bankInfo.moneyInAccount < 100) ? bankInfo.moneyInAccount : 100;
              bankInfo.depositAmount = -withdrawAmount;
            }

            return true;
          }

          if (cash >= HIGHMONEY) {
            if (!job.equals("bankManager")) {
              bigState = BigState.goToBank;
              desiredRole = "Customer";
              bankInfo.depositAmount = cash - HIGHMONEY;
            }

            return true;
          }
          // Inventory of food stuff
          if (lowInventory()) {
            bigState = BigState.goToMarket;
            desiredRole = "MarketCustomer";
            if (!goToWork) return true;
          }

          if (hungerLevel >= HUNGRY) {
            bigState = BigState.goToRestaurant;
            desiredRole = "Customer";
            if (!goToWork) return true;
          }

          bigState = BigState.goHome;
          homeState = HomeState.onCouch;
          if (!goToWork) return true;
        }
    }

    return false;
  }