#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"));
iter.value()->get(init_script);
} else if(token == "ambient-light") {
std::vector<float> vColor;
- sector.get_vector( "ambient-light", vColor );
+ sector.get( "ambient-light", vColor );
if(vColor.size() < 3) {
log_warning << "(ambient-light) requires a color as argument" << std::endl;
} else {
reader.get("height", height);
std::vector<unsigned int> tiles;
- if(reader.get_vector("interactive-tm", tiles)
- || reader.get_vector("tilemap", tiles)) {
+ if(reader.get("interactive-tm", tiles)
+ || reader.get("tilemap", tiles)) {
TileMap* tilemap = new TileMap(level->get_tileset());
tilemap->set(width, height, tiles, LAYER_TILES, true);
add_object(tilemap);
}
- if(reader.get_vector("background-tm", tiles)) {
+ if(reader.get("background-tm", tiles)) {
TileMap* tilemap = new TileMap(level->get_tileset());
tilemap->set(width, height, tiles, LAYER_BACKGROUNDTILES, false);
if (height < 19) tilemap->resize(width, 19);
add_object(tilemap);
}
- if(reader.get_vector("foreground-tm", tiles)) {
+ if(reader.get("foreground-tm", tiles)) {
TileMap* tilemap = new TileMap(level->get_tileset());
tilemap->set(width, height, tiles, LAYER_FOREGROUNDTILES, false);
void
Sector::write(lisp::Writer& writer)
{
- writer.write_string("name", name);
- writer.write_float("gravity", gravity);
- writer.write_string("music", music);
+ writer.write("name", name);
+ writer.write("gravity", gravity);
+ writer.write("music", music);
// write spawnpoints
for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end();
++i) {
SpawnPoint* spawn = *i;
writer.start_list("spawn-points");
- writer.write_string("name", spawn->name);
- writer.write_float("x", spawn->pos.x);
- writer.write_float("y", spawn->pos.y);
+ writer.write("name", spawn->name);
+ writer.write("x", spawn->pos.x);
+ writer.write("y", spawn->pos.y);
writer.end_list("spawn-points");
}
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();
}
}
float x1 = dest.p1.x;
float y1 = dest.p1.y;
float x2 = dest.p2.x;
- float y2 = dest.p2.y;
+ float y2 = dest.p2.y + SHIFT_DELTA;
uint32_t result = 0;
for(std::list<TileMap*>::const_iterator i = solid_tilemaps.begin(); i != solid_tilemaps.end(); i++) {
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;