Ispy::Ispy(const ReaderMapping& reader) : MovingSprite(reader, "images/objects/ispy/ispy.sprite", LAYER_TILES+5, COLGROUP_DISABLED), state(ISPYSTATE_IDLE), script(), dir(AUTO) { // read script to execute reader.get("script", script); // read direction to face in std::string dir_str; bool facing_down; if (reader.get("direction", dir_str)) { if( dir_str == "left" ) dir = LEFT; if( dir_str == "right" ) dir = RIGHT; } else { dir = LEFT; } if (!reader.get("facing-down", facing_down)) facing_down = false; if (facing_down) dir = DOWN; if (dir == AUTO) { log_warning << "Setting an Ispy's direction to AUTO is no good idea" << std::endl; } // set initial sprite action sprite->set_action((dir == DOWN) ? "idle-down" : ((dir == LEFT) ? "idle-left" : "idle-right")); }
PingusDemo::PingusDemo(const Pathname& pathname) : m_levelname(), m_checksum(), m_events() { std::vector<ReaderObject> lines = FileReader::parse_many(pathname); if (lines.empty()) { raise_exception(std::runtime_error, "'" << pathname.str() << "', demo file is empty"); } else { if (lines.front().get_name() == "level") { ReaderMapping reader = lines.front().get_mapping(); if (!reader.read_string("name", m_levelname)) { raise_exception(std::runtime_error, "(level (name ...)) entry missing in demo file '" << pathname.str() << "'"); } reader.read_string("checksum", m_checksum); } for(auto i = lines.begin() + 1; i != lines.end(); ++i) { if (i->get_name() != "checksum") // workaround for old incorrectly recorded demo files { m_events.push_back(ServerEvent(*i)); } } } }
ScriptedObject::ScriptedObject(const ReaderMapping& lisp) : MovingSprite(lisp, "images/objects/bonus_block/brick.sprite", LAYER_OBJECTS, COLGROUP_MOVING_STATIC), ExposedObject<ScriptedObject, scripting::ScriptedObject>(this), physic(), solid(), physic_enabled(), visible(), new_vel_set(false), new_vel(), new_size() { if (!lisp.get("name", name)) name = ""; if(name.empty()) { name = "unnamed" + std::to_string(graphicsRandom.rand()); log_warning << "Scripted object must have a name specified, setting to: " << name << std::endl; } if (!lisp.get("solid", solid)) solid = true; if (!lisp.get("physic-enabled", physic_enabled)) physic_enabled = true; if (!lisp.get("visible", visible)) visible = true; layer = reader_get_layer (lisp, /* default = */ LAYER_OBJECTS); if( solid ) { set_group( COLGROUP_MOVING_STATIC ); } else { set_group( COLGROUP_DISABLED ); } }
Spotlight::Spotlight(const ReaderMapping& lisp) : position(), angle(0.0f), center(), base(), lights(), light(), lightcone(), color(1.0f, 1.0f, 1.0f) { lisp.get("x", position.x); lisp.get("y", position.y); lisp.get("angle", angle); std::vector<float> vColor; if( lisp.get( "color", vColor ) ){ color = Color( vColor ); } center = SpriteManager::current()->create("images/objects/spotlight/spotlight_center.sprite"); base = SpriteManager::current()->create("images/objects/spotlight/spotlight_base.sprite"); lights = SpriteManager::current()->create("images/objects/spotlight/spotlight_lights.sprite"); lightcone = SpriteManager::current()->create("images/objects/spotlight/lightcone.sprite"); light = SpriteManager::current()->create("images/objects/spotlight/light.sprite"); }
Block::Block(const ReaderMapping& lisp, const std::string& sprite_file) : sprite(), sprite_name(), default_sprite_name(), bouncing(false), breaking(false), bounce_dir(0), bounce_offset(0), original_y(-1) { lisp.get("x", bbox.p1.x); lisp.get("y", bbox.p1.y); std::string sf; lisp.get("sprite", sf); if (sf.empty() || !PHYSFS_exists(sf.c_str())) { sf = sprite_file; } sprite = SpriteManager::current()->create(sf); sprite_name = sf; default_sprite_name = sprite_name; bbox.set_size(32, 32.1f); set_group(COLGROUP_STATIC); SoundManager::current()->preload("sounds/upgrade.wav"); SoundManager::current()->preload("sounds/brick.wav"); }
PowerUp::PowerUp(const ReaderMapping& lisp) : MovingSprite(lisp, LAYER_OBJECTS, COLGROUP_MOVING), physic(), script(), no_physics(), light(0.0f,0.0f,0.0f), lightsprite(SpriteManager::current()->create("images/objects/lightmap_light/lightmap_light-small.sprite")) { if (!lisp.get("script", script)) script = ""; if (!lisp.get("disable-physics", no_physics)) no_physics = false; physic.enable_gravity(true); SoundManager::current()->preload("sounds/grow.ogg"); SoundManager::current()->preload("sounds/fire-flower.wav"); SoundManager::current()->preload("sounds/gulp.wav"); //set default light for glow effect for standard sprites lightsprite->set_blend(Blend(GL_SRC_ALPHA, GL_ONE)); lightsprite->set_color(Color(0.0f, 0.0f, 0.0f)); if (sprite_name == "images/powerups/egg/egg.sprite") { lightsprite->set_color(Color(0.2f, 0.2f, 0.0f)); } else if (sprite_name == "images/powerups/fireflower/fireflower.sprite") { lightsprite->set_color(Color(0.3f, 0.0f, 0.0f)); } else if (sprite_name == "images/powerups/iceflower/iceflower.sprite") { lightsprite->set_color(Color(0.0f, 0.1f, 0.2f)); } else if (sprite_name == "images/powerups/airflower/airflower.sprite") { lightsprite->set_color(Color(0.15f, 0.0f, 0.15f)); } else if (sprite_name == "images/powerups/earthflower/earthflower.sprite") { lightsprite->set_color(Color(0.0f, 0.3f, 0.0f)); } else if (sprite_name == "images/powerups/star/star.sprite") { lightsprite->set_color(Color(0.4f, 0.4f, 0.4f)); } }
Thunderstorm::Thunderstorm(const ReaderMapping& reader) : ExposedObject<Thunderstorm, scripting::Thunderstorm>(this), running(true), interval(10.0f), layer(LAYER_BACKGROUNDTILES-1), time_to_thunder(), time_to_lightning(), flash_display_timer() { reader.get("name", name); reader.get("running", running); reader.get("interval", interval); if(interval <= 0) { log_warning << "Running a thunderstorm with non-positive time interval is a bad idea" << std::endl; } layer = reader_get_layer (reader, /* default = */ LAYER_BACKGROUNDTILES-1); SoundManager::current()->preload("sounds/thunder.wav"); SoundManager::current()->preload("sounds/lightning.wav"); if (running) { running = false; // else start() is ignored start(); } }
Yeti::Yeti(const ReaderMapping& reader) : BadGuy(reader, "images/creatures/yeti/yeti.sprite"), state(), state_timer(), safe_timer(), stomp_count(), hit_points(), hud_head(), left_stand_x(), right_stand_x(), left_jump_x(), right_jump_x(), fixed_pos(), hud_icon() { reader.get("lives", hit_points, INITIAL_HITPOINTS); countMe = true; SoundManager::current()->preload("sounds/yeti_gna.wav"); SoundManager::current()->preload("sounds/yeti_roar.wav"); reader.get("hud-icon", hud_icon, "images/creatures/yeti/hudlife.png"); hud_head = Surface::create(hud_icon); initialize(); reader.get("fixed-pos", fixed_pos, false); if (fixed_pos) { left_stand_x = 80; right_stand_x = 1140; left_jump_x = 528; right_jump_x = 692; } else { recalculate_pos(); } }
Platform::Platform(const ReaderMapping& reader, const std::string& default_sprite) : MovingSprite(reader, default_sprite, LAYER_OBJECTS, COLGROUP_STATIC), ExposedObject<Platform, scripting::Platform>(this), PathObject(), speed(Vector(0,0)), automatic(false), player_contact(false), last_player_contact(false) { bool running = true; reader.get("running", running); if ((name.empty()) && (!running)) { automatic = true; } ReaderMapping path_mapping; if (!reader.get("path", path_mapping)) { path.reset(new Path(bbox.p1)); walker.reset(new PathWalker(path.get(), running)); } else { path.reset(new Path()); path->read(path_mapping); walker.reset(new PathWalker(path.get(), running)); bbox.set_pos(path->get_base()); } }
Candle::Candle(const ReaderMapping& lisp) : MovingSprite(lisp, "images/objects/candle/candle.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_DISABLED), ExposedObject<Candle, scripting::Candle>(this), burning(true), flicker(true), lightcolor(1.0f, 1.0f, 1.0f), candle_light_1(SpriteManager::current()->create("images/objects/candle/candle-light-1.sprite")), candle_light_2(SpriteManager::current()->create("images/objects/candle/candle-light-2.sprite")) { lisp.get("burning", burning, true); lisp.get("flicker", flicker, true); std::vector<float> vColor; if(!lisp.get("color", vColor)) vColor = {1.0f, 1.0f, 1.0f}; //change the light color if defined if (vColor.size() >= 3) { lightcolor = Color(vColor); candle_light_1->set_blend(Blend(GL_SRC_ALPHA, GL_ONE)); candle_light_2->set_blend(Blend(GL_SRC_ALPHA, GL_ONE)); candle_light_1->set_color(lightcolor); candle_light_2->set_color(lightcolor); //the following allows the original candle appearance to be preserved candle_light_1->set_action("white"); candle_light_2->set_action("white"); } if (burning) { sprite->set_action("on"); } else { sprite->set_action("off"); } }
SpawnPointMarker::SpawnPointMarker (const ReaderMapping& lisp) : surface(Surface::create("images/engine/editor/spawnpoint.png")) { lisp.get("name", name, ""); lisp.get("x", bbox.p1.x, 0); lisp.get("y", bbox.p1.y, 0); setup(); }
Teleporter::Teleporter(const ReaderMapping& reader) : pos(), sprite("worldobjs/teleporter"), target_id(), target() { reader.read_vector("position", pos); reader.read_string("target-id", target_id); }
SpawnPointMarker::SpawnPointMarker (const ReaderMapping& lisp) : surface(Surface::create("images/engine/editor/spawnpoint.png")) { if ( !lisp.get("name", name)) name = ""; if ( !lisp.get("x", bbox.p1.x)) bbox.p1.x = 0; if ( !lisp.get("y", bbox.p1.y)) bbox.p1.y = 0; setup(); }
RustyTrampoline::RustyTrampoline(const ReaderMapping& lisp) : Rock(lisp, "images/objects/rusty-trampoline/rusty-trampoline.sprite"), portable(true), counter(3) { SoundManager::current()->preload(BOUNCE_SOUND); lisp.get("counter", counter); lisp.get("portable", portable); //do we really need this? }
void LevelParser::load_old_format(const ReaderMapping& reader) { reader.get("name", m_level.m_name); reader.get("author", m_level.m_author); auto sector = SectorParser::from_reader_old_format(m_level, reader); m_level.add_sector(std::move(sector)); }
void JoystickConfig::read(const ReaderMapping& joystick_lisp) { joystick_lisp.get("dead-zone", dead_zone); joystick_lisp.get("jump-with-up", jump_with_up_joy); joystick_lisp.get("use-game-controller", use_game_controller); auto iter = joystick_lisp.get_iter(); while(iter.next()) { if (iter.get_key() == "map") { int button = -1; int axis = 0; int hat = -1; std::string control; auto map = iter.as_mapping(); map.get("control", control); int i = 0; for(i = 0; Controller::controlNames[i] != 0; ++i) { if (control == Controller::controlNames[i]) break; } if (Controller::controlNames[i] == 0) { log_info << "Invalid control '" << control << "' in buttonmap" << std::endl; } else { if (map.get("button", button)) { bind_joybutton(0, button, Controller::Control(i)); } else if (map.get("axis", axis)) { bind_joyaxis(0, axis, Controller::Control(i)); } else if (map.get("hat", hat)) { if (hat != SDL_HAT_UP && hat != SDL_HAT_DOWN && hat != SDL_HAT_LEFT && hat != SDL_HAT_RIGHT) { log_info << "Invalid axis '" << axis << "' in axismap" << std::endl; } else { bind_joyhat(0, hat, Controller::Control(i)); } } } } } }
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; }
PowerUp::PowerUp(const ReaderMapping& lisp) : MovingSprite(lisp, "images/powerups/egg/egg.sprite", LAYER_OBJECTS, COLGROUP_MOVING), physic(), script(), no_physics(), lightsprite(SpriteManager::current()->create("images/objects/lightmap_light/lightmap_light-small.sprite")) { lisp.get("script", script, ""); lisp.get("disable-physics", no_physics, false); initialize(); }
ObjectIcon::ObjectIcon(const ReaderMapping& reader) : object_name(), surface(), offset() { std::string icon = "images/engine/icons/supertux.png"; reader.get("class", object_name); reader.get("icon", icon); surface = Surface::create(icon); calculate_offset(); }
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); }
StoryDot::StoryDot(const ReaderMapping& reader) : Dot(reader.read_mapping("dot")), m_story_dot_highlight("core/worldmap/story_dot_highlight"), m_story_dot("core/worldmap/story_dot"), m_name(), m_story(), m_credits(false) { reader.read_string("name", m_name); reader.read_string("story", m_story); reader.read_bool("credits", m_credits); }
Decal::Decal(const ReaderMapping& reader) : MovingSprite(reader, LAYER_OBJECTS, COLGROUP_DISABLED) { layer = reader_get_layer (reader, /* default = */ LAYER_OBJECTS); bool solid = false; reader.get("solid", solid); if(solid) set_group(COLGROUP_STATIC); std::string action; if(reader.get("action", action)) set_action(action, -1); }
LevelTime::LevelTime(const ReaderMapping& reader) : time_surface(), running(true), time_left() { if (!reader.get("name", name)) name = ""; if (!reader.get("time", time_left)) time_left = 0; if(time_left <= 0) { log_warning << "No or invalid leveltime specified." << std::endl; remove_me(); } time_surface = Surface::create("images/engine/hud/time-0.png"); }
Climbable::Climbable(const ReaderMapping& reader) : climbed_by(0), activate_try_timer(), message() { reader.get("x", bbox.p1.x); reader.get("y", bbox.p1.y); float w = 32, h = 32; reader.get("width", w); reader.get("height", h); bbox.set_size(w, h); reader.get("message", message); }
Decal::Decal(const ReaderMapping& reader) : MovingSprite(reader, "images/decal/explanations/billboard-fireflower.png", LAYER_OBJECTS, COLGROUP_DISABLED), default_action(), solid() { layer = reader_get_layer (reader, /* default = */ LAYER_OBJECTS); if (!reader.get("solid", solid)) solid = false; if(solid) set_group(COLGROUP_STATIC); if(reader.get("action", default_action)) set_action(default_action, -1); }
SequenceTrigger::SequenceTrigger(const ReaderMapping& reader) : triggerevent(EVENT_TOUCH), sequence(SEQ_ENDSEQUENCE), new_size(), new_spawnpoint(), fade_tilemap(), fade() { reader.get("x", m_col.m_bbox.get_left(), 0.0f); reader.get("y", m_col.m_bbox.get_top(), 0.0f); float w, h; reader.get("width", w, 32.0f); reader.get("height", h, 32.0f); m_col.m_bbox.set_size(w, h); new_size.x = w; new_size.y = h; std::string sequence_name; if (reader.get("sequence", sequence_name)) { sequence = string_to_sequence(sequence_name); } reader.get("new_spawnpoint", new_spawnpoint); reader.get("fade_tilemap", fade_tilemap); reader.get("fade", reinterpret_cast<int&>(fade)); }
void PlayerStatus::read(const ReaderMapping& lisp) { reset(); std::string bonusname; if(lisp.get("bonus", bonusname)) { if(bonusname == "none") { bonus = NO_BONUS; } else if(bonusname == "growup") { bonus = GROWUP_BONUS; } else if(bonusname == "fireflower") { bonus = FIRE_BONUS; } else if(bonusname == "iceflower") { bonus = ICE_BONUS; } else if(bonusname == "airflower") { bonus = AIR_BONUS; } else if(bonusname == "earthflower") { bonus = EARTH_BONUS; } else { log_warning << "Unknown bonus '" << bonusname << "' in savefile" << std::endl; bonus = NO_BONUS; } } lisp.get("fireflowers", max_fire_bullets); lisp.get("iceflowers", max_ice_bullets); lisp.get("airflowers", max_air_time); lisp.get("earthflowers", max_earth_time); lisp.get("coins", coins); lisp.get("worldmap-sprite", worldmap_sprite); lisp.get("last-worldmap", last_worldmap); }
InvisibleWall::InvisibleWall(const ReaderMapping& mapping): MovingObject(mapping), width(), height() { mapping.get("x", m_col.m_bbox.get_left(), 0.0f); mapping.get("y", m_col.m_bbox.get_top(), 0.0f); mapping.get("width", width, 32.0f); mapping.get("height", height, 32.0f); m_col.m_bbox.set_size(width, height); m_col.m_group = COLGROUP_STATIC; }
MovingSprite::MovingSprite(const ReaderMapping& reader, int layer_, CollisionGroup collision_group) : sprite_name(), sprite(), layer(layer_) { reader.get("x", bbox.p1.x); reader.get("y", bbox.p1.y); if (!reader.get("sprite", sprite_name)) throw std::runtime_error("no sprite name set"); sprite = SpriteManager::current()->create(sprite_name); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); set_group(collision_group); }
SpecialTile::SpecialTile(const ReaderMapping& lisp) : pos(), sprite(), map_message(), passive_message(false), script(), invisible(false), apply_action_north(true), apply_action_east(true), apply_action_south(true), apply_action_west(true) { if(!lisp.get("x", pos.x)) { log_warning << "X coordinate of special tile not set, defaulting to 0" << std::endl; } if(!lisp.get("y", pos.y)) { log_warning << "Y coordinate of special tile not set, defaulting to 0" << std::endl; } if(!lisp.get("invisible-tile", invisible)) { // Ignore attribute if it's not specified. Tile is visible. } if(!invisible) { std::string spritefile = ""; if(!lisp.get("sprite", spritefile)) { log_warning << "No sprite specified for visible special tile." << std::endl; } sprite = SpriteManager::current()->create(spritefile); } if(!lisp.get("map-message", map_message)) { // Ignore attribute if it's not specified. No map message set. } if(!lisp.get("passive-message", passive_message)) { // Ignore attribute if it's not specified. No passive message set. } if(!lisp.get("script", script)) { // Ignore attribute if it's not specified. No script set. } std::string apply_direction; if(!lisp.get("apply-to-direction", apply_direction)) { // Ignore attribute if it's not specified. Applies to all directions. } if(!apply_direction.empty()) { apply_action_north = false; apply_action_south = false; apply_action_east = false; apply_action_west = false; if(apply_direction.find("north") != std::string::npos) apply_action_north = true; if(apply_direction.find("south") != std::string::npos) apply_action_south = true; if(apply_direction.find("east") != std::string::npos) apply_action_east = true; if(apply_direction.find("west") != std::string::npos) apply_action_west = true; } }