Beispiel #1
0
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"));
}
Beispiel #2
0
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));
      }
    }
  }
}
Beispiel #3
0
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 );
    }
}
Beispiel #4
0
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");

}
Beispiel #5
0
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");
}
Beispiel #6
0
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();
  }
}
Beispiel #8
0
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();
  }
}
Beispiel #9
0
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());
  }
}
Beispiel #10
0
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");
  }

}
Beispiel #11
0
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();
}
Beispiel #12
0
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();
}
Beispiel #14
0
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?
}
Beispiel #15
0
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));
}
Beispiel #16
0
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));
          }
        }
      }
    }
  }
}
Beispiel #17
0
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;
}
Beispiel #18
0
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();
}
Beispiel #19
0
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();
}
Beispiel #20
0
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);
}
Beispiel #21
0
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);
}
Beispiel #22
0
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);
}
Beispiel #23
0
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");
}
Beispiel #24
0
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);
}
Beispiel #25
0
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);
}
Beispiel #26
0
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));
}
Beispiel #27
0
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);
}
Beispiel #28
0
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;
}
Beispiel #29
0
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);
}
Beispiel #30
0
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;
  }
}