X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsector.cpp;h=9c83a7683352bad9dc9e39d9e4094ee9f77c2b90;hb=5c14f6f384eff76491d494b4c157abf2ff776d49;hp=ceb80a3d687a3cf8add9457b836c00064f8e7115;hpb=6ae2d154b976957d8e209bb991672b0c12c503c7;p=supertux.git diff --git a/src/sector.cpp b/src/sector.cpp index ceb80a3d6..9c83a7683 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -70,7 +70,6 @@ Sector::Sector() : gravity(10), player(0), solids(0), camera(0), currentmusic(LEVEL_MUSIC) { - song_title = "chipdisko.ogg"; player = new Player(player_status); add_object(player); @@ -154,7 +153,7 @@ Sector::parse(const lisp::Lisp& sector) } else if(token == "gravity") { iter.value()->get(gravity); } else if(token == "music") { - iter.value()->get(song_title); + iter.value()->get(music); } else if(token == "spawnpoint") { SpawnPoint* sp = new SpawnPoint(iter.lisp()); spawnpoints.push_back(sp); @@ -215,7 +214,8 @@ Sector::parse_old_format(const lisp::Lisp& reader) if(backgroundimage != "") { Background* background = new Background; - background->set_image(backgroundimage, bgspeed); + background->set_image( + std::string("images/background/") + backgroundimage, bgspeed); add_object(background); } else { Background* background = new Background; @@ -241,8 +241,9 @@ Sector::parse_old_format(const lisp::Lisp& reader) spawn->name = "main"; spawnpoints.push_back(spawn); - song_title = "chipdisko.ogg"; - reader.get("music", song_title); + music = "chipdisko.ogg"; + reader.get("music", music); + music = "music/" + music; int width = 30, height = 15; reader.get("width", width); @@ -350,7 +351,7 @@ Sector::write(lisp::Writer& writer) { writer.write_string("name", name); writer.write_float("gravity", gravity); - writer.write_string("music", song_title); + writer.write_string("music", music); // write spawnpoints for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end(); @@ -857,6 +858,39 @@ Sector::handle_collisions() } bool +Sector::is_free_space(const Rect& rect) const +{ + // test with all tiles in this rectangle + int starttilex = int(rect.p1.x) / 32; + int starttiley = int(rect.p1.y) / 32; + int max_x = int(rect.p2.x); + int max_y = int(rect.p2.y); + + for(int x = starttilex; x*32 < max_x; ++x) { + for(int y = starttiley; y*32 < max_y; ++y) { + const Tile* tile = solids->get_tile(x, y); + if(!tile) + continue; + if(tile->getAttributes() & Tile::SOLID) + return false; + } + } + + for(MovingObjects::const_iterator i = moving_objects.begin(); + i != moving_objects.end(); ++i) { + const MovingObject* moving_object = *i; + if(moving_object->get_group() != COLGROUP_STATIC + || !moving_object->is_valid()) + continue; + + if(Collision::intersects(rect, moving_object->get_bbox())) + return false; + } + + return true; +} + +bool Sector::add_bullet(const Vector& pos, float xm, Direction dir) { // TODO remove this function and move these checks elsewhere... @@ -901,7 +935,7 @@ Sector::play_music(MusicType type) currentmusic = type; switch(currentmusic) { case LEVEL_MUSIC: - sound_manager->play_music(std::string("music/") + song_title); + sound_manager->play_music(music); break; case HERRING_MUSIC: sound_manager->play_music("music/salcon.ogg");