X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsector.cpp;h=f5609fdae72eba8d5813706051ce9d1a7b79777a;hb=875ef8eb7e93726bc67dfa7f05da946250e588d4;hp=c5b81a8f32e52a1c6179d4593fc65c89f1b2c0d4;hpb=3f1a54cc4a2b8deb8ebb31061a00ffcec5fb3169;p=supertux.git diff --git a/src/sector.cpp b/src/sector.cpp index c5b81a8f3..f5609fdae 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -46,7 +46,6 @@ #include "object/block.h" #include "object/invisible_block.h" #include "object/platform.h" -#include "trigger/door.h" #include "object/bullet.h" #include "badguy/jumpy.h" #include "badguy/snowball.h" @@ -55,6 +54,9 @@ #include "badguy/mriceblock.h" #include "badguy/mrbomb.h" #include "badguy/dispenser.h" +#include "badguy/spike.h" +#include "badguy/nolok_01.h" +#include "trigger/door.h" #include "trigger/sequence_trigger.h" #include "trigger/secretarea_trigger.h" @@ -102,7 +104,7 @@ Sector *Sector::create(const std::string& name, size_t width, size_t height) } GameObject* -Sector::parseObject(const std::string& name, LispReader& reader) +Sector::parse_object(const std::string& name, LispReader& reader) { if(name == "background") { background = new Background(reader); @@ -155,6 +157,10 @@ Sector::parseObject(const std::string& name, LispReader& reader) return new MrBomb(reader); } else if(name == "dispenser") { return new Dispenser(reader); + } else if(name == "spike") { + return new Spike(reader); + } else if(name == "nolok_01") { + return new Nolok_01(reader); } #if 0 else if(badguykind_from_string(name) != BAD_INVALID) { @@ -195,7 +201,7 @@ Sector::parse(LispReader& lispreader) reader.read_float("y", sp->pos.y); spawnpoints.push_back(sp); } else { - GameObject* object = parseObject(token, reader); + GameObject* object = parse_object(token, reader); if(object) { add_object(object); } @@ -330,7 +336,7 @@ Sector::parse_old_format(LispReader& reader) LispReader reader(lisp_cdr(data)); - GameObject* object = parseObject(object_type, reader); + GameObject* object = parse_object(object_type, reader); if(object) { add_object(object); } else { @@ -359,6 +365,18 @@ Sector::fix_old_tiles() if(tile->id == 112) { add_object(new InvisibleBlock(pos)); solids->change(x, y, 0); + } else if(tile->id == 295) { + add_object(new Spike(pos, Spike::NORTH)); + solids->change(x, y, 0); + } else if(tile->id == 296) { + add_object(new Spike(pos, Spike::EAST)); + solids->change(x, y, 0); + } else if(tile->id == 297) { + add_object(new Spike(pos, Spike::SOUTH)); + solids->change(x, y, 0); + } else if(tile->id == 298) { + add_object(new Spike(pos, Spike::WEST)); + solids->change(x, y, 0); } else if(tile->attributes & Tile::COIN) { add_object(new Coin(pos)); solids->change(x, y, 0); @@ -600,6 +618,8 @@ Sector::draw(DrawingContext& context) context.pop_transform(); } +static const float DELTA = .001; + void Sector::collision_tilemap(MovingObject* object, int depth) { @@ -701,7 +721,7 @@ Sector::collision_tilemap(MovingObject* object, int depth) return; } // move out of collision and try again - object->movement += hit.normal * (hit.depth + .05); + object->movement += hit.normal * (hit.depth + DELTA); collision_tilemap(object, depth+1); } @@ -724,15 +744,15 @@ Sector::collision_object(MovingObject* object1, MovingObject* object2) if(response1 == ABORT_MOVE) object1->movement = Vector(0, 0); if(response2 == CONTINUE) - object2->movement += hit.normal * (hit.depth + .05); + object2->movement += hit.normal * (hit.depth + DELTA); } else if(response2 != CONTINUE) { if(response2 == ABORT_MOVE) object2->movement = Vector(0, 0); if(response1 == CONTINUE) - object1->movement += -hit.normal * (hit.depth + .05); + object1->movement += -hit.normal * (hit.depth + DELTA); } else { - object1->movement += -hit.normal * (hit.depth/2 + .05); - object2->movement += hit.normal * (hit.depth/2 + .05); + object1->movement += -hit.normal * (hit.depth/2 + DELTA); + object2->movement += hit.normal * (hit.depth/2 + DELTA); } } } @@ -743,12 +763,16 @@ Sector::collision_handler() for(std::vector::iterator i = gameobjects.begin(); i != gameobjects.end(); ++i) { GameObject* gameobject = *i; - if(!gameobject->is_valid() - || gameobject->get_flags() & GameObject::FLAG_NO_COLLDET) + if(!gameobject->is_valid()) continue; MovingObject* movingobject = dynamic_cast (gameobject); if(!movingobject) continue; + if(movingobject->get_flags() & GameObject::FLAG_NO_COLLDET) { + movingobject->bbox.move(movingobject->movement); + movingobject->movement = Vector(0, 0); + continue; + } // collision with tilemap if(! (movingobject->movement == Vector(0, 0)))