/* intro/convoy.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "intro/convoy.h" namespace intro { /* ---- class Member ----------------------------------------------- */ Member::Member(std::string const &modelname) : core::EntityControlable() { entity_moduletypeid = 1; set_name("Convoy ship"); set_label("ship"); set_modelname(modelname); if (model()) { set_radius(model()->radius()); } set_thrust(1.0f); } Member::~Member() { } void Member::frame(const unsigned long elapsed) { get_location() += axis().forward() * speed() * thrust() * ((float) elapsed / 1000.0f); } /* ---- class Convoy ----------------------------------------------- */ Convoy::Convoy(core::Zone *zone) : core::EntityDynamic() { entity_moduletypeid = 2; set_zone(zone); set_label("convoy"); set_name("Convoy"); set_speed(1.0f); set_serverside(); } Convoy::~Convoy() { convoy_members.clear(); } void Convoy::add(const char *modelname) { add(std::string(modelname)); } void Convoy::add(const std::string &modelname) { float d = 0; Member *member = new Member(modelname); convoy_members.push_back(member); member->set_zone(zone()); member->get_color().assign(color()); member->get_color_second().assign(color_second()); member->set_thrust(1.0f); member->set_speed(speed()); member->get_location().assign(location()); d = ((float) convoy_members.size()) * 0.5f; member->get_location().get_x() += math::randomf((float) convoy_members.size()) - d; member->get_location().get_y() += math::randomf((float) convoy_members.size()) - d; member->get_location().get_z() += (math::randomf((float) convoy_members.size()) - d) * 0.5f; member->get_axis().assign(axis()); } void Convoy::frame(const unsigned long elapsed) { for (Members::iterator it = convoy_members.begin(); it != convoy_members.end();) { Member *member = (*it); if (member->location().length() > 64.0f) { std::string model(member->model()->name()); member->die(); convoy_members.erase(it++); add(model); } else { ++it; } } } }