/* core/parser.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "auxiliary/functions.h" #include "core/entity.h" #include "core/entityglobe.h" #include "core/parser.h" #include "sys/sys.h" namespace core { bool Parser::got_entity_key(filesystem::IniFile &inifile, core::Entity *entity) { if (!entity) return false; math::Vector3f v; math::Color color; std::string shapename; std::string strval; float yaw, pitch, roll; float f; bool blnval; if (inifile.got_key_string("shape", shapename)) { if (shapename.compare("axis") == 0) { entity->set_shape(core::Entity::Axis); return true; } else if (shapename.compare("cube") == 0) { entity->set_shape(core::Entity::Cube); return true; } else if (shapename.compare("diamond") == 0) { entity->set_shape(core::Entity::Diamond); return true; } else if (shapename.compare("sphere") == 0) { entity->set_shape(core::Entity::Sphere); return true; } else { con_warn << inifile.name() << " unknown shape '" << shapename << "' at line " << inifile.line() << std::endl; return false; } } else if (inifile.got_key_string("info", strval)) { Info *info = Info::find(entity->info()); if (!info) { std::string labelstr; if (entity->zone()) { labelstr.append(entity->zone()->label()); labelstr += ':'; } labelstr.append(entity->label()); info = new Info(Entity::infotype(), labelstr.c_str()); entity->set_info(info); } info->add_text(strval); return true; } else if (inifile.got_key_label("label", strval)) { entity->set_label(strval); return true; } else if (inifile.got_key_string("name", strval)) { entity->set_name(strval); return true; } else if (inifile.got_key_string("model", strval)) { entity->set_modelname(strval); return true; } else if (inifile.got_key_bool("showonmap", blnval)) { if (blnval) entity->set_flag(Entity::ShowOnMap); else entity->unset_flag(Entity::ShowOnMap); return true; } else if (inifile.got_key_bool("nonsolid", blnval)) { if (blnval) entity->set_flag(Entity::NonSolid); else entity->unset_flag(Entity::NonSolid); return true; } else if (inifile.got_key_float("angle", yaw)) { if (yaw == model::ANGLEUP) { entity->get_axis().change_pitch(-90.0f); } else if (yaw == model::ANGLEDOWN) { entity->get_axis().change_pitch(90.0f); } else { entity->get_axis().change_direction(yaw); } return true; } else if (inifile.got_key("angles")) { std::istringstream str(inifile.value()); if (str >> pitch >> yaw >> roll) { entity->get_axis().assign(yaw, pitch, roll); } else { inifile.unknown_value(); } return true; } else if (inifile.got_key_angle("yaw", yaw)) { entity->get_axis().change_direction(yaw); return true; } else if (inifile.got_key_angle("pitch", pitch)) { entity->get_axis().change_pitch(-pitch); return true; } else if (inifile.got_key_angle("roll", roll)) { entity->get_axis().change_roll(-roll); return true; } else if (inifile.got_key_angle("radius", f)) { entity->set_radius(f); return true; } else if (inifile.got_key_vector3f("location", v)) { entity->get_location().assign(v); return true; } else if (inifile.got_key_color("colorsecond", color)) { entity->get_color_second().assign(color); return true; } else if (inifile.got_key_color("color", color)) { entity->get_color().assign(color); return true; } // special globe keys if (entity->type() == Entity::Globe) { EntityGlobe *globe = static_cast(entity); if (inifile.got_key_string("texture", strval)) { globe->set_texturename(strval); return true; } else if (inifile.got_key_string("corona", strval)) { globe->set_coronaname(strval); return true; } else if (inifile.got_key_float("rotationspeed", f)) { globe->set_rotationspeed(f); return true; } else if (inifile.got_key_bool("bright", blnval)) { if (blnval) { globe->set_flag(core::Entity::Bright); } else { globe->unset_flag(core::Entity::Bright); } return true; } } return false; } }