X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsector.cpp;h=6b51f5b25949006de2041d6b80f2fe934907b9fe;hb=f406067af6cbeb0a638078fe1d386d092583909c;hp=28cb380ef5a104d8cf8b5f8a81e3ede1ad2c0fbd;hpb=65a0b6f7ec1123cff959e13e1a4919dc70fe4e85;p=supertux.git diff --git a/src/sector.cpp b/src/sector.cpp index 28cb380ef..6b51f5b25 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -48,6 +48,7 @@ #include "physfs/physfs_stream.hpp" #include "audio/sound_manager.hpp" #include "game_session.hpp" +#include "constants.hpp" #include "resources.hpp" #include "statistics.hpp" #include "object_factory.hpp" @@ -63,6 +64,7 @@ #include "object/bullet.hpp" #include "object/text_object.hpp" #include "object/portable.hpp" +#include "object/display_effect.hpp" #include "badguy/jumpy.hpp" #include "trigger/sequence_trigger.hpp" #include "player_status.hpp" @@ -79,7 +81,7 @@ bool Sector::draw_solids_only = false; Sector::Sector(Level* parent) : level(parent), currentmusic(LEVEL_MUSIC), - ambient_light( 1.0f, 1.0f, 1.0f, 1.0f ), gravity(10.0), player(0), camera(0) + ambient_light( 1.0f, 1.0f, 1.0f, 1.0f ), gravity(10.0), player(0), camera(0), effect(0) { add_object(new Player(player_status, "Tux")); add_object(new DisplayEffect("Effect")); @@ -518,7 +520,11 @@ Sector::run_script(std::istream& in, const std::string& sourcename) sq_pushobject(vm, sector_table); sq_setroottable(vm); - compile_and_run(vm, in, sourcename); + try { + compile_and_run(vm, in, "Sector " + name + " - " + sourcename); + } catch(std::exception& e) { + log_warning << "Error running script: " << e.what() << std::endl; + } return vm; } @@ -619,7 +625,7 @@ Sector::activate(const Vector& player_pos) if(PHYSFS_exists((basedir + "/info").c_str())) { try { IFileStream in(basedir + "/default.nut"); - run_script(in, std::string("Sector(") + name + ") - default.nut"); + run_script(in, "default.nut"); } catch(std::exception& ) { // doesn't exist or erroneous; do nothing } @@ -628,7 +634,7 @@ Sector::activate(const Vector& player_pos) // Run init script if(init_script != "") { std::istringstream in(init_script); - run_script(in, std::string("Sector(") + name + ") - init"); + run_script(in, "init-script"); } } @@ -770,6 +776,15 @@ Sector::before_object_add(GameObject* object) this->player = player; } + DisplayEffect* effect = dynamic_cast (object); + if(effect != NULL) { + if(this->effect != 0) { + log_warning << "Multiple DisplayEffects added. Ignoring" << std::endl; + return false; + } + this->effect = effect; + } + UsesPhysic *physic_object = dynamic_cast(object); if(physic_object) { @@ -898,8 +913,6 @@ Sector::draw(DrawingContext& context) * Collision Detection *-------------------------------------------------------------------------*/ -static const float SHIFT_DELTA = 7.0f; - /** r1 is supposed to be moving, r2 a solid object */ void check_collisions(collision::Constraints* constraints, const Vector& movement, const Rect& r1, const Rect& r2, @@ -948,7 +961,7 @@ void check_collisions(collision::Constraints* constraints, if(other->get_movement() != Vector(0, 0)) { // TODO what todo when we collide with 2 moving objects?!? - constraints->ground_movement += other->get_movement(); + constraints->ground_movement = other->get_movement(); } } @@ -1026,9 +1039,9 @@ Sector::collision_tilemap(collision::Constraints* constraints, uint32_t Sector::collision_tile_attributes(const Rect& dest) const { - float x1 = dest.p1.x - SHIFT_DELTA; - float y1 = dest.p1.y - SHIFT_DELTA; - float x2 = dest.p2.x + SHIFT_DELTA; + float x1 = dest.p1.x; + float y1 = dest.p1.y; + float x2 = dest.p2.x; float y2 = dest.p2.y + SHIFT_DELTA; uint32_t result = 0; @@ -1387,10 +1400,9 @@ Sector::is_free_of_tiles(const Rect& rect, const bool ignoreUnisolid) const Vector p2((x+1)*32 + solids->get_x_offset(), (y+1)*32 + solids->get_y_offset()); triangle = AATriangle(p1, p2, tile->getData()); Constraints constraints; - return collision::rectangle_aatriangle(&constraints, rect, triangle); + if(collision::rectangle_aatriangle(&constraints, rect, triangle) && (!ignoreUnisolid || !(tile->getAttributes() & Tile::UNISOLID))) return false; } - if((tile->getAttributes() & Tile::SOLID) && !ignoreUnisolid) return false; - if((tile->getAttributes() & Tile::SOLID) && !(tile->getAttributes() & Tile::UNISOLID)) return false; + if((tile->getAttributes() & Tile::SOLID) && (!ignoreUnisolid || !(tile->getAttributes() & Tile::UNISOLID))) return false; } } } @@ -1475,7 +1487,7 @@ Sector::play_music(MusicType type) sound_manager->play_music(music); break; case HERRING_MUSIC: - sound_manager->play_music("music/invincible.ogg"); + sound_manager->play_music("music/invincible.music"); break; case HERRING_WARNING_MUSIC: sound_manager->stop_music(TUX_INVINCIBLE_TIME_WARNING); @@ -1589,7 +1601,7 @@ Sector::get_ambient_blue() void Sector::set_gravity(float gravity) { - log_warning << "Changing a Sector's gravitational constant might have unforseen side-effects" << std::endl; + log_warning << "Changing a Sector's gravitational constant might have unforeseen side-effects" << std::endl; this->gravity = gravity;