X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworld.cpp;h=0c28cb0011097e6180969176b7cf025c6dfd8467;hb=157cef71aeb9ae25b7bb90f37dda11bc09329d11;hp=7db4ed5aa952e0da6ad9f3c01f20099e1850e961;hpb=9efe2aff9180fe14780ee7743a333570b233b586;p=supertux.git diff --git a/src/world.cpp b/src/world.cpp index 7db4ed5aa..0c28cb001 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -33,53 +33,53 @@ #include "tile.h" #include "resources.h" #include "gameobjs.h" +#include "camera.h" +#include "display_manager.h" +#include "background.h" +#include "tilemap.h" Surface* img_distro[4]; World* World::current_ = 0; -World::World(const std::string& filename) +World::World(const std::string& filename, int level_nr) { // FIXME: Move this to action and draw and everywhere else where the // world calls child functions current_ = this; - level = new Level(filename); - tux.init(); - + tux = new Player(displaymanager); + add_object(tux); + + level = new Level(); + camera = new Camera(tux, level); + add_object(camera); + + if(level_nr >= 0) { + level->load(filename, level_nr, this); + } else { + level->load(filename, this); + } + tux->move(level->start_pos); + set_defaults(); - get_level()->load_gfx(); - activate_bad_guys(); - activate_objects(); + level->load_gfx(); + // add background activate_particle_systems(); - get_level()->load_song(); - - apply_bonuses(); - - scrolling_timer.init(true); -} - -World::World(const std::string& subset, int level_nr) -{ - // FIXME: Move this to action and draw and everywhere else where the - // world calls child functions - current_ = this; - - level = new Level(subset, level_nr); - tux.init(); - - set_defaults(); + background = new Background(displaymanager); + if(level->img_bkgd) { + background->set_image(level->img_bkgd, level->bkgd_speed); + } else { + background->set_gradient(level->bkgd_top, level->bkgd_bottom); + } + add_object(background); - get_level()->load_gfx(); - activate_bad_guys(); - activate_objects(); - activate_particle_systems(); - get_level()->load_song(); + // add tilemap + add_object(new TileMap(displaymanager, level)); + level->load_song(); apply_bonuses(); - - scrolling_timer.init(true); } void @@ -90,57 +90,30 @@ World::apply_bonuses() { case PlayerStatus::NO_BONUS: break; - + case PlayerStatus::FLOWER_BONUS: - tux.got_power = tux.FIRE_POWER; // FIXME: add ice power to here + tux->got_power = Player::FIRE_POWER; // FIXME: add ice power to here // fall through - + case PlayerStatus::GROWUP_BONUS: - // FIXME: Move this to Player class - tux.size = BIG; - tux.base.height = 64; - tux.base.y -= 32; + tux->grow(); break; } } World::~World() { - for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i) - delete *i; - - for (Trampolines::iterator i = trampolines.begin(); i != trampolines.end(); ++i) - delete *i; - - for (ParticleSystems::iterator i = particle_systems.begin(); - i != particle_systems.end(); ++i) - delete *i; - - for (std::vector::iterator i = bouncy_distros.begin(); - i != bouncy_distros.end(); ++i) - delete *i; - - for (std::vector::iterator i = broken_bricks.begin(); - i != broken_bricks.end(); ++i) - delete *i; - - for (std::vector::iterator i = bouncy_bricks.begin(); - i != bouncy_bricks.end(); ++i) + for (std::vector::iterator i = gameobjects.begin(); + i != gameobjects.end(); ++i) { delete *i; + } - for (std::vector::iterator i = floating_scores.begin(); - i != floating_scores.end(); ++i) - delete *i; - delete level; } void World::set_defaults() { - // Set defaults: - scroll_x = 0; - player_status.score_multiplier = 1; counting_distros = false; @@ -151,25 +124,50 @@ World::set_defaults() } void -World::activate_bad_guys() +World::add_object(GameObject* object) { - for (std::vector::iterator i = level->badguy_data.begin(); - i != level->badguy_data.end(); - ++i) - { - add_bad_guy(i->x, i->y, i->kind, i->stay_on_platform); - } + // XXX hack for now until new collision code is ready + BadGuy* badguy = dynamic_cast (object); + if(badguy) + bad_guys.push_back(badguy); + Bullet* bullet = dynamic_cast (object); + if(bullet) + bullets.push_back(bullet); + Upgrade* upgrade = dynamic_cast (object); + if(upgrade) + upgrades.push_back(upgrade); + Trampoline* trampoline = dynamic_cast (object); + if(trampoline) + trampolines.push_back(trampoline); + FlyingPlatform* flying_platform = dynamic_cast (object); + if(flying_platform) + flying_platforms.push_back(flying_platform); + + gameobjects.push_back(object); } void -World::activate_objects() +World::parse_objects(lisp_object_t* cur) { - for (std::vector< ObjectData >::iterator i = level->trampoline_data.begin(); - i != level->trampoline_data.end(); - ++i) - { - add_object >(*i); - } + while(!lisp_nil_p(cur)) { + lisp_object_t* data = lisp_car(cur); + std::string object_type = lisp_symbol(lisp_car(data)); + + LispReader reader(lisp_cdr(data)); + + if(object_type == "trampoline") { + add_object(new Trampoline(displaymanager, reader)); + } + else if(object_type == "flying-platform") { + add_object(new FlyingPlatform(displaymanager, reader)); + } + else { + BadGuyKind kind = badguykind_from_string(object_type); + add_object(new BadGuy(displaymanager, kind, reader)); + } + + cur = lisp_cdr(cur); + } } void @@ -177,11 +175,11 @@ World::activate_particle_systems() { if (level->particle_system == "clouds") { - particle_systems.push_back(new CloudParticleSystem); + add_object(new CloudParticleSystem(displaymanager)); } else if (level->particle_system == "snow") { - particle_systems.push_back(new SnowParticleSystem); + add_object(new SnowParticleSystem(displaymanager)); } else if (level->particle_system != "") { @@ -192,229 +190,71 @@ World::activate_particle_systems() void World::draw() { - int y,x; - - /* Draw the real background */ - drawgradient(level->bkgd_top, level->bkgd_bottom); - if(level->img_bkgd) - level->draw_bg(); - - - /* Draw particle systems (background) */ - std::vector::iterator p; - for(p = particle_systems.begin(); p != particle_systems.end(); ++p) - { - (*p)->draw(scroll_x, 0, 0); - } - - /* Draw background: */ - for (y = 0; y < VISIBLE_TILES_Y && y < level->height; ++y) - { - for (x = 0; x < VISIBLE_TILES_X; ++x) - { - Tile::draw(32*x - fmodf(scroll_x, 32), y * 32 - fmodf(scroll_y, 32), - level->bg_tiles[(int)y + (int)(scroll_y / 32)][(int)x + (int)(scroll_x / 32)]); - } - } - - /* Draw interactive tiles: */ - for (y = 0; y < VISIBLE_TILES_Y && y < level->height; ++y) - { - for (x = 0; x < VISIBLE_TILES_X; ++x) - { - Tile::draw(32*x - fmodf(scroll_x, 32), y * 32 - fmodf(scroll_y, 32), - level->ia_tiles[(int)y + (int)(scroll_y / 32)][(int)x + (int)(scroll_x / 32)]); - } - } - - /* (Bouncy bricks): */ - for (unsigned int i = 0; i < bouncy_bricks.size(); ++i) - bouncy_bricks[i]->draw(); - - for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i) - (*i)->draw(); - - for (Trampolines::iterator i = trampolines.begin(); i != trampolines.end(); ++i) - (*i)->draw(); - - tux.draw(); - - for (unsigned int i = 0; i < bullets.size(); ++i) - bullets[i].draw(); - - for (unsigned int i = 0; i < floating_scores.size(); ++i) - floating_scores[i]->draw(); - - for (unsigned int i = 0; i < upgrades.size(); ++i) - upgrades[i].draw(); - - for (unsigned int i = 0; i < bouncy_distros.size(); ++i) - bouncy_distros[i]->draw(); - - for (unsigned int i = 0; i < broken_bricks.size(); ++i) - broken_bricks[i]->draw(); - - /* Draw foreground: */ - for (y = 0; y < VISIBLE_TILES_Y && y < level->height; ++y) - { - for (x = 0; x < VISIBLE_TILES_X; ++x) - { - Tile::draw(32*x - fmodf(scroll_x, 32), y * 32 - fmodf(scroll_y, 32), - level->fg_tiles[(int)y + (int)(scroll_y / 32)][(int)x + (int)(scroll_x / 32)]); - } - } - - /* Draw particle systems (foreground) */ - for(p = particle_systems.begin(); p != particle_systems.end(); ++p) - { - (*p)->draw(scroll_x, 0, 1); - } + /* Draw objects */ + displaymanager.draw(*camera); } void -World::action(double frame_ratio) +World::action(float elapsed_time) { - tux.action(frame_ratio); - tux.check_bounds(level->back_scrolling, (bool)level->hor_autoscroll_speed); - scrolling(frame_ratio); - - /* Handle bouncy distros: */ - for (unsigned int i = 0; i < bouncy_distros.size(); i++) - bouncy_distros[i]->action(frame_ratio); - - /* Handle broken bricks: */ - for (unsigned int i = 0; i < broken_bricks.size(); i++) - broken_bricks[i]->action(frame_ratio); - - // Handle all kinds of game objects - for (unsigned int i = 0; i < bouncy_bricks.size(); i++) - bouncy_bricks[i]->action(frame_ratio); - - for (unsigned int i = 0; i < floating_scores.size(); i++) - floating_scores[i]->action(frame_ratio); - - for (unsigned int i = 0; i < bullets.size(); ++i) - bullets[i].action(frame_ratio); - - for (unsigned int i = 0; i < upgrades.size(); i++) - upgrades[i].action(frame_ratio); - - for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i) - (*i)->action(frame_ratio); - - for (Trampolines::iterator i = trampolines.begin(); i != trampolines.end(); ++i) - (*i)->action(frame_ratio); - - /* update particle systems */ - std::vector::iterator p; - for(p = particle_systems.begin(); p != particle_systems.end(); ++p) - { - (*p)->simulate(frame_ratio); - } + tux->check_bounds(*camera, + level->back_scrolling, (bool)level->hor_autoscroll_speed); + + /* update objects (don't use iterators here, because the list might change + * during the iteration) + */ + for(size_t i = 0; i < gameobjects.size(); ++i) + if(gameobjects[i]->is_valid()) + gameobjects[i]->action(elapsed_time); /* Handle all possible collisions. */ collision_handler(); - - // Cleanup marked badguys - for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); - /* ++i handled at end of the loop */) { - if ((*i)->is_removable()) { + + /** cleanup marked objects */ + for(std::vector::iterator i = gameobjects.begin(); + i != gameobjects.end(); /* nothing */) { + if((*i)->is_valid() == false) { + Drawable* drawable = dynamic_cast (*i); + if(drawable) + displaymanager.remove_drawable(drawable); + BadGuy* badguy = dynamic_cast (*i); + if(badguy) { + bad_guys.erase(std::remove(bad_guys.begin(), bad_guys.end(), badguy), + bad_guys.end()); + } + Bullet* bullet = dynamic_cast (*i); + if(bullet) { + bullets.erase( + std::remove(bullets.begin(), bullets.end(), bullet), + bullets.end()); + } + Upgrade* upgrade = dynamic_cast (*i); + if(upgrade) { + upgrades.erase( + std::remove(upgrades.begin(), upgrades.end(), upgrade), + upgrades.end()); + } + Trampoline* trampoline = dynamic_cast (*i); + if(trampoline) { + trampolines.erase( + std::remove(trampolines.begin(), trampolines.end(), trampoline), + trampolines.end()); + } + FlyingPlatform* flying_platform= dynamic_cast (*i); + if(flying_platform) { + flying_platforms.erase( + std::remove(flying_platforms.begin(), flying_platforms.end(), flying_platform), + flying_platforms.end()); + } + delete *i; - i = bad_guys.erase(i); + i = gameobjects.erase(i); } else { ++i; } } } -/* the space that it takes for the screen to start scrolling, regarding */ -/* screen bounds (in pixels) */ -// should be higher than screen->w/2 (400) -#define X_SPACE (500-16) -// should be less than screen->h/2 (300) -#define Y_SPACE 250 - -// the time it takes to move the camera (in ms) -#define CHANGE_DIR_SCROLL_SPEED 2000 - -/* This functions takes cares of the scrolling */ -void World::scrolling(double frame_ratio) -{ - /* Y-axis scrolling */ - - float tux_pos_y = tux.base.y + (tux.base.height/2); - - if(level->height > VISIBLE_TILES_Y-1) - { - if (scroll_y < tux_pos_y - (screen->h - Y_SPACE)) - scroll_y = tux_pos_y - (screen->h - Y_SPACE); - else if (scroll_y > tux_pos_y - Y_SPACE) - scroll_y = tux_pos_y - Y_SPACE; - } - - // this code prevent the screen to scroll before the start or after the level's end - if(scroll_y > level->height * 32 - screen->h) - scroll_y = level->height * 32 - screen->h; - if(scroll_y < 0) - scroll_y = 0; - - /* X-axis scrolling */ - - /* Auto scrolling */ - if(level->hor_autoscroll_speed) - { - scroll_x += level->hor_autoscroll_speed * frame_ratio; - return; - } - - - /* Horizontal backscrolling */ - float tux_pos_x = tux.base.x + (tux.base.width/2); - - if(tux.old_dir != tux.dir && level->back_scrolling) - scrolling_timer.start(CHANGE_DIR_SCROLL_SPEED); - - bool right = false; - bool left = false; - if (tux.physic.get_velocity_x() > 0) - right = true; - else if (tux.physic.get_velocity_x() < 0) - left = true; - else - { - if (tux.dir == RIGHT) - right = true; - else - left = true; - } - - if(scrolling_timer.check()) - { - float final_scroll_x; - if (right) - final_scroll_x = tux_pos_x - (screen->w - X_SPACE); - else - final_scroll_x = tux_pos_x - X_SPACE; - - scroll_x += (final_scroll_x - scroll_x) - / (frame_ratio * (CHANGE_DIR_SCROLL_SPEED / 100)) - + (tux.physic.get_velocity_x() * frame_ratio + tux.physic.get_acceleration_x() * frame_ratio * frame_ratio); - } - else - { - if (right && scroll_x < tux_pos_x - (screen->w - X_SPACE)) - scroll_x = tux_pos_x - (screen->w - X_SPACE); - else if (left && scroll_x > tux_pos_x - X_SPACE && level->back_scrolling) - scroll_x = tux_pos_x - X_SPACE; - } - - // this code prevent the screen to scroll before the start or after the level's end - if(scroll_x > level->width * 32 - screen->w) - scroll_x = level->width * 32 - screen->w; - if(scroll_x < 0) - scroll_x = 0; -} - void World::collision_handler() { @@ -426,14 +266,12 @@ World::collision_handler() if((*j)->dying != DYING_NOT) continue; - if(rectcollision(bullets[i].base, (*j)->base)) + if(rectcollision(bullets[i]->base, (*j)->base)) { // We have detected a collision and now call the // collision functions of the collided objects. - // collide with bad_guy first, since bullet_collision will - // delete the bullet - (*j)->collision(&bullets[i], CO_BULLET); - bullets[i].collision(CO_BADGUY); + (*j)->collision(bullets[i], CO_BULLET, COLLISION_NORMAL); + bullets[i]->collision(CO_BADGUY); break; // bullet is invalid now, so break } } @@ -462,7 +300,7 @@ World::collision_handler() } } - if(tux.dying != DYING_NOT) return; + if(tux->dying != DYING_NOT) return; // CO_BADGUY & CO_PLAYER check for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i) @@ -470,21 +308,21 @@ World::collision_handler() if((*i)->dying != DYING_NOT) continue; - if(rectcollision_offset((*i)->base, tux.base, 0, 0)) + if(rectcollision_offset((*i)->base, tux->base, 0, 0)) { // We have detected a collision and now call the collision // functions of the collided objects. - if (tux.previous_base.y < tux.base.y && - tux.previous_base.y + tux.previous_base.height + if (tux->previous_base.y < tux->base.y && + tux->previous_base.y + tux->previous_base.height < (*i)->base.y + (*i)->base.height/2 - && !tux.invincible_timer.started()) + && !tux->invincible_timer.started()) { - (*i)->collision(&tux, CO_PLAYER, COLLISION_SQUISH); + (*i)->collision(tux, CO_PLAYER, COLLISION_SQUISH); } else { - tux.collision(*i, CO_BADGUY); - (*i)->collision(&tux, CO_PLAYER, COLLISION_NORMAL); + tux->collision(*i, CO_BADGUY); + (*i)->collision(tux, CO_PLAYER, COLLISION_NORMAL); } } } @@ -492,128 +330,129 @@ World::collision_handler() // CO_UPGRADE & CO_PLAYER check for(unsigned int i = 0; i < upgrades.size(); ++i) { - if(rectcollision(upgrades[i].base, tux.base)) + if(rectcollision(upgrades[i]->base, tux->base)) { // We have detected a collision and now call the collision // functions of the collided objects. - upgrades[i].collision(&tux, CO_PLAYER, COLLISION_NORMAL); + upgrades[i]->collision(tux, CO_PLAYER, COLLISION_NORMAL); } } // CO_TRAMPOLINE & (CO_PLAYER or CO_BADGUY) for (Trampolines::iterator i = trampolines.begin(); i != trampolines.end(); ++i) { - if (rectcollision((*i)->base, tux.base)) + if (rectcollision((*i)->base, tux->base)) { - if (tux.previous_base.y < tux.base.y && - tux.previous_base.y + tux.previous_base.height + if (tux->previous_base.y < tux->base.y && + tux->previous_base.y + tux->previous_base.height < (*i)->base.y + (*i)->base.height/2) { - (*i)->collision(&tux, CO_PLAYER, COLLISION_SQUISH); + (*i)->collision(tux, CO_PLAYER, COLLISION_SQUISH); } - else + else if (tux->previous_base.y <= tux->base.y) { - tux.collision(*i, CO_TRAMPOLINE); - (*i)->collision(&tux, CO_PLAYER, COLLISION_NORMAL); + tux->collision(*i, CO_TRAMPOLINE); + (*i)->collision(tux, CO_PLAYER, COLLISION_NORMAL); } } } + + // CO_FLYING_PLATFORM & (CO_PLAYER or CO_BADGUY) + for (FlyingPlatforms::iterator i = flying_platforms.begin(); i != flying_platforms.end(); ++i) + { + if (rectcollision((*i)->base, tux->base)) + { + if (tux->previous_base.y < tux->base.y && + tux->previous_base.y + tux->previous_base.height + < (*i)->base.y + (*i)->base.height/2) + { + (*i)->collision(tux, CO_PLAYER, COLLISION_SQUISH); + tux->collision(*i, CO_FLYING_PLATFORM); + } +/* else if (tux->previous_base.y <= tux->base.y) + { + }*/ + } + } } void -World::add_score(float x, float y, int s) +World::add_score(const Vector& pos, int s) { player_status.score += s; - FloatingScore* new_floating_score = new FloatingScore(); - new_floating_score->init(x-scroll_x, y-scroll_y, s); - floating_scores.push_back(new_floating_score); + add_object(new FloatingScore(displaymanager, pos, s)); } void -World::add_bouncy_distro(float x, float y) +World::add_bouncy_distro(const Vector& pos) { - BouncyDistro* new_bouncy_distro = new BouncyDistro(); - new_bouncy_distro->init(x, y); - bouncy_distros.push_back(new_bouncy_distro); + add_object(new BouncyDistro(displaymanager, pos)); } void -World::add_broken_brick(Tile* tile, float x, float y) +World::add_broken_brick(const Vector& pos, Tile* tile) { - add_broken_brick_piece(tile, x, y, -1, -4); - add_broken_brick_piece(tile, x, y + 16, -1.5, -3); + add_broken_brick_piece(pos, Vector(-1, -4), tile); + add_broken_brick_piece(pos + Vector(0, 16), Vector(-1.5, -3), tile); - add_broken_brick_piece(tile, x + 16, y, 1, -4); - add_broken_brick_piece(tile, x + 16, y + 16, 1.5, -3); + add_broken_brick_piece(pos + Vector(16, 0), Vector(1, -4), tile); + add_broken_brick_piece(pos + Vector(16, 16), Vector(1.5, -3), tile); } void -World::add_broken_brick_piece(Tile* tile, float x, float y, float xm, float ym) +World::add_broken_brick_piece(const Vector& pos, const Vector& movement, + Tile* tile) { - BrokenBrick* new_broken_brick = new BrokenBrick(); - new_broken_brick->init(tile, x, y, xm, ym); - broken_bricks.push_back(new_broken_brick); + add_object(new BrokenBrick(displaymanager, tile, pos, movement)); } void -World::add_bouncy_brick(float x, float y) +World::add_bouncy_brick(const Vector& pos) { - BouncyBrick* new_bouncy_brick = new BouncyBrick(); - new_bouncy_brick->init(x,y); - bouncy_bricks.push_back(new_bouncy_brick); + add_object(new BouncyBrick(displaymanager, pos)); } BadGuy* -World::add_bad_guy(float x, float y, BadGuyKind kind, bool stay_on_platform) +World::add_bad_guy(float x, float y, BadGuyKind kind) { - BadGuy* badguy = new BadGuy(x,y,kind, stay_on_platform); - bad_guys.push_back(badguy); + BadGuy* badguy = new BadGuy(displaymanager, kind, x, y); + add_object(badguy); return badguy; } -template -T* -World::add_object(U data) -{ - T* tobject = new T(data); - - if (data.type == OBJ_TRAMPOLINE) - trampolines.push_back(tobject); - - return tobject; -} - void -World::add_upgrade(float x, float y, Direction dir, UpgradeKind kind) +World::add_upgrade(const Vector& pos, Direction dir, UpgradeKind kind) { - Upgrade new_upgrade; - new_upgrade.init(x,y,dir,kind); - upgrades.push_back(new_upgrade); + add_object(new Upgrade(displaymanager, pos, dir, kind)); } -void -World::add_bullet(float x, float y, float xm, Direction dir) +bool +World::add_bullet(const Vector& pos, float xm, Direction dir) { - if(tux.got_power == tux.FIRE_POWER) + if(tux->got_power == Player::FIRE_POWER) { if(bullets.size() > MAX_FIRE_BULLETS-1) - return; + return false; } - else if(tux.got_power == tux.ICE_POWER) + else if(tux->got_power == Player::ICE_POWER) { if(bullets.size() > MAX_ICE_BULLETS-1) - return; + return false; } - Bullet new_bullet; - if(tux.got_power == tux.FIRE_POWER) - new_bullet.init(x,y,xm,dir, FIRE_BULLET); - else if(tux.got_power == tux.ICE_POWER) - new_bullet.init(x,y,xm,dir, ICE_BULLET); - bullets.push_back(new_bullet); + Bullet* new_bullet = 0; + if(tux->got_power == Player::FIRE_POWER) + new_bullet = new Bullet(displaymanager, pos, xm, dir, FIRE_BULLET); + else if(tux->got_power == Player::ICE_POWER) + new_bullet = new Bullet(displaymanager, pos, xm, dir, ICE_BULLET); + else + st_abort("wrong bullet type.", ""); + add_object(new_bullet); play_sound(sounds[SND_SHOOT], SOUND_CENTER_SPEAKER); + + return true; } void @@ -643,7 +482,7 @@ World::get_music_type() } /* Break a brick: */ -void +bool World::trybreakbrick(float x, float y, bool small) { Level* plevel = get_level(); @@ -654,8 +493,8 @@ World::trybreakbrick(float x, float y, bool small) if (tile->data > 0) { /* Get a distro from it: */ - add_bouncy_distro(((int)(x + 1) / 32) * 32, - (int)(y / 32) * 32); + add_bouncy_distro( + Vector(((int)(x + 1) / 32) * 32, (int)(y / 32) * 32)); // TODO: don't handle this in a global way but per-tile... if (!counting_distros) @@ -677,6 +516,7 @@ World::trybreakbrick(float x, float y, bool small) play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER); player_status.score = player_status.score + SCORE_DISTRO; player_status.distros++; + return true; } else if (!small) { @@ -684,15 +524,19 @@ World::trybreakbrick(float x, float y, bool small) plevel->change(x, y, TM_IA, tile->next_tile); /* Replace it with broken bits: */ - add_broken_brick(tile, + add_broken_brick(Vector( ((int)(x + 1) / 32) * 32, - (int)(y / 32) * 32); + (int)(y / 32) * 32), tile); /* Get some score: */ play_sound(sounds[SND_BRICK], SOUND_CENTER_SPEAKER); player_status.score = player_status.score + SCORE_BRICK; + + return true; } } + + return false; } /* Empty a box: */ @@ -714,34 +558,34 @@ World::tryemptybox(float x, float y, Direction col_side) switch(tile->data) { case 1: // Box with a distro! - add_bouncy_distro(posx, posy); + add_bouncy_distro(Vector(posx, posy)); play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER); player_status.score = player_status.score + SCORE_DISTRO; player_status.distros++; break; case 2: // Add a fire flower upgrade! - if (tux.size == SMALL) /* Tux is small, add mints! */ - add_upgrade(posx, posy, col_side, UPGRADE_GROWUP); + if (tux->size == SMALL) /* Tux is small, add mints! */ + add_upgrade(Vector(posx, posy), col_side, UPGRADE_GROWUP); else /* Tux is big, add a fireflower: */ - add_upgrade(posx, posy, col_side, UPGRADE_FIREFLOWER); + add_upgrade(Vector(posx, posy), col_side, UPGRADE_FIREFLOWER); play_sound(sounds[SND_UPGRADE], SOUND_CENTER_SPEAKER); break; case 5: // Add an ice flower upgrade! - if (tux.size == SMALL) /* Tux is small, add mints! */ - add_upgrade(posx, posy, col_side, UPGRADE_GROWUP); + if (tux->size == SMALL) /* Tux is small, add mints! */ + add_upgrade(Vector(posx, posy), col_side, UPGRADE_GROWUP); else /* Tux is big, add an iceflower: */ - add_upgrade(posx, posy, col_side, UPGRADE_ICEFLOWER); + add_upgrade(Vector(posx, posy), col_side, UPGRADE_ICEFLOWER); play_sound(sounds[SND_UPGRADE], SOUND_CENTER_SPEAKER); break; case 3: // Add a golden herring - add_upgrade(posx, posy, col_side, UPGRADE_HERRING); + add_upgrade(Vector(posx, posy), col_side, UPGRADE_HERRING); break; case 4: // Add a 1up extra - add_upgrade(posx, posy, col_side, UPGRADE_1UP); + add_upgrade(Vector(posx, posy), col_side, UPGRADE_1UP); break; default: break; @@ -763,8 +607,8 @@ World::trygrabdistro(float x, float y, int bounciness) if (bounciness == BOUNCE) { - add_bouncy_distro(((int)(x + 1) / 32) * 32, - (int)(y / 32) * 32); + add_bouncy_distro(Vector(((int)(x + 1) / 32) * 32, + (int)(y / 32) * 32)); } player_status.score = player_status.score + SCORE_DISTRO; @@ -782,18 +626,18 @@ World::trybumpbadguy(float x, float y) if ((*i)->base.x >= x - 32 && (*i)->base.x <= x + 32 && (*i)->base.y >= y - 16 && (*i)->base.y <= y + 16) { - (*i)->collision(&tux, CO_PLAYER, COLLISION_BUMP); + (*i)->collision(tux, CO_PLAYER, COLLISION_BUMP); } } // Upgrades: for (unsigned int i = 0; i < upgrades.size(); i++) { - if (upgrades[i].base.height == 32 && - upgrades[i].base.x >= x - 32 && upgrades[i].base.x <= x + 32 && - upgrades[i].base.y >= y - 16 && upgrades[i].base.y <= y + 16) + if (upgrades[i]->base.height == 32 && + upgrades[i]->base.x >= x - 32 && upgrades[i]->base.x <= x + 32 && + upgrades[i]->base.y >= y - 16 && upgrades[i]->base.y <= y + 16) { - upgrades[i].collision(&tux, CO_PLAYER, COLLISION_BUMP); + upgrades[i]->collision(tux, CO_PLAYER, COLLISION_BUMP); } } }