#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"
#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"
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"));
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;
}
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
}
// Run init script
if(init_script != "") {
std::istringstream in(init_script);
- run_script(in, std::string("Sector(") + name + ") - init");
+ run_script(in, "init-script");
}
}
this->player = player;
}
+ DisplayEffect* effect = dynamic_cast<DisplayEffect*> (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<UsesPhysic *>(object);
if(physic_object)
{
* 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,
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();
}
}
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;
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;
}
}
}
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);
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;