SpriteDescriptionPtr SpriteDescription::from_file(const Pathname& path) { ReaderObject reader_object = FileReader::parse(path); ReaderMapping reader = reader_object.get_mapping(); SpriteDescriptionPtr desc(new SpriteDescription); reader.read_int("speed", desc->speed); reader.read_bool("loop", desc->loop); reader.read_vector2i("offset", desc->offset); reader.read_enum("origin", desc->origin, string2origin); if (!reader.read_path("image", desc->filename)) { log_error("'image' missing for %1%", reader_object.get_name()); } desc->filename = Pathname(desc->filename.get_raw_path(), Pathname::DATA_PATH); // FIXME: Hack reader.read_size("array", desc->array); reader.read_vector2i("position", desc->frame_pos); reader.read_size("size", desc->frame_size); return desc; }
Savegame::Savegame(const ReaderMapping& reader) : filename(), status(), needed_time(), saved_pingus() { reader.read_string("filename", filename); reader.read_enum("status", status, string_to_status); reader.read_int("time", needed_time); reader.read_int("saved-pingus", saved_pingus); }
bool ReaderMapping::read_desc(const char* key, ResDescriptor& value) const { ReaderMapping reader; if (read_mapping(key, reader)) { reader.read_string("image", value.res_name); reader.read_enum("modifier", value.modifier, &ResourceModifier::from_string); return true; } else { return false; } }
ServerEvent::ServerEvent(const ReaderObject& reader_object) : type(PINGU_ACTION_EVENT), time_stamp(0), pingu_id(0), pos(), pingu_action(ActionName::WALKER) { ReaderMapping reader = reader_object.get_mapping(); if (reader_object.get_name() == "armageddon") { type = ARMAGEDDON_EVENT; reader.read_int("time", time_stamp); } else if (reader_object.get_name() == "end") { type = END_EVENT; reader.read_int("time", time_stamp); } else if (reader_object.get_name() == "finish") { type = FINISH_EVENT; reader.read_int("time", time_stamp); } else if (reader_object.get_name() == "pingu-action") { std::string raw_x; std::string raw_y; type = PINGU_ACTION_EVENT; reader.read_int ("time", time_stamp); int pingu_id_tmp; reader.read_int ("id", pingu_id_tmp); pingu_id = static_cast<unsigned int>(pingu_id_tmp); if (reader.read_string("raw-x", raw_x)) pos.x = Math::string2float(raw_x); if (reader.read_string("raw-y", raw_y)) pos.y = Math::string2float(raw_y); reader.read_enum("action", pingu_action, &ActionName::from_string); } else { raise_exception(std::runtime_error, "ServerEvent: Parse error: Unknown event: " << reader_object.get_name()); } }