/* 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 &model) : core::EntityControlable(0, 1) { set_name("Convoy member"); set_label(model); set_modelname(model); entity_thrust = 1.0f; } Member::~Member() { } void Member::frame(float seconds) { get_location() += axis().forward() * speed() * thrust() * seconds; } /* ---- class Convoy ----------------------------------------------- */ Convoy::Convoy(core::Zone *zone) : core::EntityDynamic() { set_zone(zone); set_label("convoy"); set_name("Convoy"); entity_speed = 1.0f; set_serverside(); } Convoy::~Convoy() { convoy_members.clear(); } void Convoy::add(const char *model) { add(std::string(model)); } void Convoy::add(const std::string &model) { float d = 0; Member *member = new Member(model); convoy_members.push_back(member); member->set_zone(zone()); member->get_color().assign(color()); member->get_color_second().assign(color_second()); member->entity_thrust = 1.0f; member->entity_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(float seconds) { 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; } } } }