const StateModifications Actor::act(const std::vector<Tile*> &tileCollisions, const std::vector<Body*> &bodyCollisions) { StateModifications stateModifications = StateModifications(); if (m_active) { stateModifications = run(tileCollisions, bodyCollisions); } return stateModifications; }
StateModifications Simulation::perform_next_event(State* state, std::vector<double> const& accumulated_rates, IRNG* rng) const { double r = rng->uniform(0, state->total_event_rate); auto i = std::lower_bound(accumulated_rates.cbegin(), accumulated_rates.cend(), r); if (i == accumulated_rates.cend()) { // XXX This should probably throw an exception... return StateModifications(); } else { state->event_count++; return event_generators_[std::distance( accumulated_rates.cbegin(), i)]->perform_event(state, *i - r); } }
const StateModifications GameObject::act(const std::vector<GameObject*> &collisions) { return StateModifications(); }
const StateModifications AIPlayer::driveRaceCar(RaceCar &raceCar, const std::vector<Tile*> &tileCollisions, const std::vector<Body*> &bodyCollisions) { StateModifications stateModifications = StateModifications(); raceCar.setForce(Zeni::Vector2f(0.0f, 0.0f)); raceCar.setWheelRotation(0); raceCar.setBraking(false); raceCar.accelerate(1.0); /*if (Input::isKeyDown(SDLK_DOWN)) { accelerate(-1.0); if (isMovingInDirection(getRotation())) { setBraking(true); } }*/ int waypoint = raceCar.getPassedWaypoints().size()%m_navigationMaps.size(); Level::waypoint = waypoint; // TODO: Remove or move/hide debug functionality double suggestedDirection = m_navigationMaps[waypoint].getSuggestedDirectionAtPosition(raceCar.getCenter()+raceCar.getVelocity()*m_lookAheadTime, m_directionSmoothing); double angleDifference = Utils::getAngleDifference(suggestedDirection, raceCar.getRotation()); if (angleDifference < -raceCar.m_maximumWheelRotation) { angleDifference = -raceCar.m_maximumWheelRotation; } if (angleDifference > raceCar.m_maximumWheelRotation) { angleDifference = raceCar.m_maximumWheelRotation; } raceCar.setWheelRotation(angleDifference); for (int i=0; i < bodyCollisions.size(); i++) { RaceCar * car = dynamic_cast<RaceCar*>(bodyCollisions[i]); if (car != nullptr) { m_fireRocket = false; m_layMine = false; } } if (m_offensive && m_fireRocket == true) { m_rocketTimer = Time::getGameTime(); Body * rocket = raceCar.fireRocket(); if (rocket != nullptr) { stateModifications.bodyAdditions.push_back(rocket); } m_fireRocket = false; } if (m_offensive && m_layMine == true) { m_mineTimer = Time::getGameTime(); Body * mine = raceCar.layMine(); if (mine != nullptr) { stateModifications.bodyAdditions.push_back(mine); } m_layMine = false; } /*if (Input::isKeyDown(SDLK_q)) { for (std::vector<Tile*>::const_iterator it = tileCollisions.begin(); it != tileCollisions.end(); it++) { Tile newTile = Tile((*it)->getPosition(), (*it)->getSize(), Zeni::String("grass")); stateModifications.tileChanges.push_back(newTile); } }*/ if (raceCar.getHealth().remaining == 0) { raceCar.respawn(); } return stateModifications; }
// Causes the actor to take an action. const StateModifications Actor::run(const std::vector<Tile*> &tileCollisions, const std::vector<Body*> &bodyCollisions) { StateModifications sm = StateModifications(); sm.bodyAdditions.push_back(new Body()); return sm; }