X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsector.cpp;h=79d80c6f5e31aff6ad62b2d2163161cec31697ed;hb=b72c5d178e4cc95130735d8bf8716513c7cc28e1;hp=4db083fbdb1ef2b59fe35817dc64cf1189133ec1;hpb=0540d5db4c57c585615a78ccf33603ff3628db95;p=supertux.git diff --git a/src/sector.cpp b/src/sector.cpp index 4db083fbd..79d80c6f5 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -56,7 +56,6 @@ #include "object/bullet.hpp" #include "object/text_object.hpp" #include "badguy/jumpy.hpp" -#include "badguy/spike.hpp" #include "trigger/sequence_trigger.hpp" #include "player_status.hpp" #include "scripting/script_interpreter.hpp" @@ -73,7 +72,7 @@ Sector::Sector() currentmusic(LEVEL_MUSIC) { song_title = "chipdisko.ogg"; - player = new Player(&player_status); + player = new Player(player_status); add_object(player); #ifdef USE_GRID @@ -325,18 +324,6 @@ Sector::fix_old_tiles() if(tile->getID() == 112) { add_object(new InvisibleBlock(pos)); solids->change(x, y, 0); - } else if(tile->getID() == 295) { - add_object(new Spike(pos, Spike::NORTH)); - solids->change(x, y, 0); - } else if(tile->getID() == 296) { - add_object(new Spike(pos, Spike::EAST)); - solids->change(x, y, 0); - } else if(tile->getID() == 297) { - add_object(new Spike(pos, Spike::SOUTH)); - solids->change(x, y, 0); - } else if(tile->getID() == 298) { - add_object(new Spike(pos, Spike::WEST)); - solids->change(x, y, 0); } else if(tile->getAttributes() & Tile::COIN) { add_object(new Coin(pos)); solids->change(x, y, 0); @@ -613,9 +600,10 @@ Sector::collision_tilemap(MovingObject* object, int depth) int max_x = int(x2+1); int max_y = int(y2+1); - CollisionHit temphit, hit; + TilemapCollisionHit temphit, hit; Rect dest = object->get_bbox(); dest.move(object->movement); + hit.tileflags = 0; hit.time = -1; // represents an invalid value for(int x = starttilex; x*32 < max_x; ++x) { for(int y = starttiley; y*32 < max_y; ++y) { @@ -623,7 +611,7 @@ Sector::collision_tilemap(MovingObject* object, int depth) if(!tile) continue; // skip non-solid tiles - if(!(tile->getAttributes() & Tile::SOLID)) + if(tile->getAttributes() == 0) continue; // only handle unisolid when the player is falling down and when he was // above the tile before @@ -640,22 +628,28 @@ Sector::collision_tilemap(MovingObject* object, int depth) if(Collision::rectangle_aatriangle(temphit, dest, object->movement, triangle)) { - if(temphit.time > hit.time) + hit.tileflags |= tile->getAttributes(); + if(temphit.time > hit.time && (tile->getAttributes() & Tile::SOLID)) { + temphit.tileflags = hit.tileflags; hit = temphit; + } } } else { // normal rectangular tile 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) + hit.tileflags |= tile->getAttributes(); + if(temphit.time > hit.time && (tile->getAttributes() & Tile::SOLID)) { + temphit.tileflags = hit.tileflags; hit = temphit; + } } } } } // did we collide at all? - if(hit.time < 0) + if(hit.tileflags == 0) return; // call collision function @@ -756,11 +750,11 @@ Sector::add_bullet(const Vector& pos, float xm, Direction dir) static const size_t MAX_ICE_BULLETS = 1; Bullet* new_bullet = 0; - if(player_status.bonus == FIRE_BONUS) { + if(player_status->bonus == FIRE_BONUS) { if(bullets.size() > MAX_FIRE_BULLETS-1) return false; new_bullet = new Bullet(pos, xm, dir, FIRE_BULLET); - } else if(player_status.bonus == ICE_BONUS) { + } else if(player_status->bonus == ICE_BONUS) { if(bullets.size() > MAX_ICE_BULLETS-1) return false; new_bullet = new Bullet(pos, xm, dir, ICE_BULLET); @@ -769,7 +763,7 @@ Sector::add_bullet(const Vector& pos, float xm, Direction dir) } add_object(new_bullet); - sound_manager->play("sounds/shoot.ogg"); + sound_manager->play("sounds/shoot.wav"); return true; }