projects
/
supertux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix
[supertux.git]
/
src
/
sector.cpp
diff --git
a/src/sector.cpp
b/src/sector.cpp
index
1470654
..
cb7a2d9
100644
(file)
--- a/
src/sector.cpp
+++ b/
src/sector.cpp
@@
-16,7
+16,6
@@
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
#include <config.h>
#include <memory>
#include <config.h>
#include <memory>
@@
-24,6
+23,7
@@
#include <stdexcept>
#include <iostream>
#include <fstream>
#include <stdexcept>
#include <iostream>
#include <fstream>
+#include <sstream>
#include <stdexcept>
#include "sector.h"
#include <stdexcept>
#include "sector.h"
@@
-32,6
+32,7
@@
#include "object/camera.h"
#include "object/background.h"
#include "object/particlesystem.h"
#include "object/camera.h"
#include "object/background.h"
#include "object/particlesystem.h"
+#include "object/particlesystem_interactive.h"
#include "object/tilemap.h"
#include "lisp/parser.h"
#include "lisp/lisp.h"
#include "object/tilemap.h"
#include "lisp/parser.h"
#include "lisp/lisp.h"
@@
-46,16
+47,22
@@
#include "collision_grid_iterator.h"
#include "object_factory.h"
#include "collision.h"
#include "collision_grid_iterator.h"
#include "object_factory.h"
#include "collision.h"
-#include "math/rectangle.h"
+#include "spawn_point.h"
+#include "math/rect.h"
#include "math/aatriangle.h"
#include "object/coin.h"
#include "object/block.h"
#include "object/invisible_block.h"
#include "object/bullet.h"
#include "math/aatriangle.h"
#include "object/coin.h"
#include "object/block.h"
#include "object/invisible_block.h"
#include "object/bullet.h"
+#include "object/text_object.h"
#include "badguy/jumpy.h"
#include "badguy/spike.h"
#include "trigger/sequence_trigger.h"
#include "player_status.h"
#include "badguy/jumpy.h"
#include "badguy/spike.h"
#include "trigger/sequence_trigger.h"
#include "player_status.h"
+#include "scripting/script_interpreter.h"
+#include "scripting/sound.h"
+#include "scripting/scripted_object.h"
+#include "scripting/text.h"
//#define USE_GRID
//#define USE_GRID
@@
-107,6
+114,14
@@
Sector::parse_object(const std::string& name, const lisp::Lisp& reader)
RainParticleSystem* partsys = new RainParticleSystem();
partsys->parse(reader);
return partsys;
RainParticleSystem* partsys = new RainParticleSystem();
partsys->parse(reader);
return partsys;
+ } else if(name == "particles-comets") {
+ CometParticleSystem* partsys = new CometParticleSystem();
+ partsys->parse(reader);
+ return partsys;
+ } else if(name == "particles-ghosts") {
+ GhostParticleSystem* partsys = new GhostParticleSystem();
+ partsys->parse(reader);
+ return partsys;
} else if(name == "particles-clouds") {
CloudParticleSystem* partsys = new CloudParticleSystem();
partsys->parse(reader);
} else if(name == "particles-clouds") {
CloudParticleSystem* partsys = new CloudParticleSystem();
partsys->parse(reader);
@@
-140,13
+155,10
@@
Sector::parse(const lisp::Lisp& sector)
iter.value()->get(song_title);
load_music();
} else if(token == "spawnpoint") {
iter.value()->get(song_title);
load_music();
} else if(token == "spawnpoint") {
- const lisp::Lisp* spawnpoint_lisp = iter.lisp();
-
- SpawnPoint* sp = new SpawnPoint;
- spawnpoint_lisp->get("name", sp->name);
- spawnpoint_lisp->get("x", sp->pos.x);
- spawnpoint_lisp->get("y", sp->pos.y);
+ SpawnPoint* sp = new SpawnPoint(iter.lisp());
spawnpoints.push_back(sp);
spawnpoints.push_back(sp);
+ } else if(token == "init-script") {
+ iter.value()->get(init_script);
} else {
GameObject* object = parse_object(token, *(iter.lisp()));
if(object) {
} else {
GameObject* object = parse_object(token, *(iter.lisp()));
if(object) {
@@
-411,6
+423,12
@@
Sector::activate(const std::string& spawnpoint)
} else {
activate(sp->pos);
}
} else {
activate(sp->pos);
}
+
+ // Run init script
+ if(init_script != "") {
+ ScriptInterpreter::add_script_object(this,
+ std::string("Sector(") + name + ") - init", init_script);
+ }
}
void
}
void
@@
-422,16
+440,16
@@
Sector::activate(const Vector& player_pos)
camera->reset(player->get_pos());
}
camera->reset(player->get_pos());
}
-Rect
angle
+Rect
Sector::get_active_region()
{
Sector::get_active_region()
{
- return Rect
angle
(
+ return Rect(
camera->get_translation() - Vector(1600, 1200),
camera->get_translation() + Vector(1600, 1200));
}
void
camera->get_translation() - Vector(1600, 1200),
camera->get_translation() + Vector(1600, 1200));
}
void
-Sector::
action
(float elapsed_time)
+Sector::
update
(float elapsed_time)
{
player->check_bounds(camera);
{
player->check_bounds(camera);
@@
-441,7
+459,7
@@
Sector::action(float elapsed_time)
if(!object->is_valid())
continue;
if(!object->is_valid())
continue;
- object->
action
(elapsed_time);
+ object->
update
(elapsed_time);
}
#else
/* update objects */
}
#else
/* update objects */
@@
-451,7
+469,7
@@
Sector::action(float elapsed_time)
if(!object->is_valid())
continue;
if(!object->is_valid())
continue;
- object->
action
(elapsed_time);
+ object->
update
(elapsed_time);
}
#endif
}
#endif
@@
-590,7
+608,7
@@
Sector::collision_tilemap(MovingObject* object, int depth)
int max_y = int(y2+1);
CollisionHit temphit, hit;
int max_y = int(y2+1);
CollisionHit temphit, hit;
- Rect
angle
dest = object->get_bbox();
+ Rect dest = object->get_bbox();
dest.move(object->movement);
hit.time = -1; // represents an invalid value
for(int x = starttilex; x*32 < max_x; ++x) {
dest.move(object->movement);
hit.time = -1; // represents an invalid value
for(int x = starttilex; x*32 < max_x; ++x) {
@@
-598,10
+616,15
@@
Sector::collision_tilemap(MovingObject* object, int depth)
const Tile* tile = solids->get_tile(x, y);
if(!tile)
continue;
const Tile* tile = solids->get_tile(x, y);
if(!tile)
continue;
+ // skip non-solid tiles
if(!(tile->getAttributes() & Tile::SOLID))
continue;
if(!(tile->getAttributes() & Tile::SOLID))
continue;
- if((tile->getAttributes() & Tile::UNISOLID) && object->movement.y < 0)
- continue;
+ // only handle unisolid when the player is falling down and when he was
+ // above the tile before
+ if(tile->getAttributes() & Tile::UNISOLID) {
+ if(object->movement.y < 0 || object->get_bbox().p2.y > y*32)
+ continue;
+ }
if(tile->getAttributes() & Tile::SLOPE) { // slope tile
AATriangle triangle;
if(tile->getAttributes() & Tile::SLOPE) { // slope tile
AATriangle triangle;
@@
-615,7
+638,7
@@
Sector::collision_tilemap(MovingObject* object, int depth)
hit = temphit;
}
} else { // normal rectangular tile
hit = temphit;
}
} else { // normal rectangular tile
- Rect
angle
rect(x*32, y*32, (x+1)*32, (y+1)*32);
+ Rect rect(x*32, y*32, (x+1)*32, (y+1)*32);
if(Collision::rectangle_rectangle(temphit, dest,
object->movement, rect)) {
if(temphit.time > hit.time)
if(Collision::rectangle_rectangle(temphit, dest,
object->movement, rect)) {
if(temphit.time > hit.time)
@@
-647,9
+670,9
@@
void
Sector::collision_object(MovingObject* object1, MovingObject* object2)
{
CollisionHit hit;
Sector::collision_object(MovingObject* object1, MovingObject* object2)
{
CollisionHit hit;
- Rect
angle
dest1 = object1->get_bbox();
+ Rect dest1 = object1->get_bbox();
dest1.move(object1->get_movement());
dest1.move(object1->get_movement());
- Rect
angle
dest2 = object2->get_bbox();
+ Rect dest2 = object2->get_bbox();
dest2.move(object2->get_movement());
Vector movement = object1->get_movement() - object2->get_movement();
dest2.move(object2->get_movement());
Vector movement = object1->get_movement() - object2->get_movement();
@@
-761,8
+784,7
@@
Sector::add_floating_text(const Vector& pos, const std::string& text)
void
Sector::load_music()
{
void
Sector::load_music()
{
- level_song = sound_manager->load_music(
- get_resource_filename("/music/" + song_title));
+ level_song = sound_manager->load_music("/music/" + song_title);
}
void
}
void
@@
-795,7
+817,7
@@
Sector::get_total_badguys()
for(GameObjects::iterator i = gameobjects.begin();
i != gameobjects.end(); ++i) {
BadGuy* badguy = dynamic_cast<BadGuy*> (*i);
for(GameObjects::iterator i = gameobjects.begin();
i != gameobjects.end(); ++i) {
BadGuy* badguy = dynamic_cast<BadGuy*> (*i);
- if
(badguy
)
+ if
(badguy && badguy->countMe
)
total_badguys++;
}
total_badguys++;
}
@@
-803,7
+825,7
@@
Sector::get_total_badguys()
}
bool
}
bool
-Sector::inside(const Rect
angle
& rect) const
+Sector::inside(const Rect& rect) const
{
if(rect.p1.x > solids->get_width() * 32
|| rect.p1.y > solids->get_height() * 32
{
if(rect.p1.x > solids->get_width() * 32
|| rect.p1.y > solids->get_height() * 32