X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworld.cpp;h=0c28cb0011097e6180969176b7cf025c6dfd8467;hb=157cef71aeb9ae25b7bb90f37dda11bc09329d11;hp=72cafc743ec9f96da9f9559fbbb7c322845a65b7;hpb=46053ca6fbb70a861c529fdfe82417c4641c0214;p=supertux.git diff --git a/src/world.cpp b/src/world.cpp index 72cafc743..0c28cb001 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -1,7 +1,9 @@ // $Id$ // // SuperTux -// Copyright (C) 2004 SuperTux Development Team, see AUTHORS for details +// Copyright (C) 2000 Bill Kendrick +// Copyright (C) 2004 Tobias Glaesser +// Copyright (C) 2004 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -15,8 +17,10 @@ // // 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. +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. +#include #include #include #include @@ -28,74 +32,142 @@ #include "level.h" #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(); + level->load_gfx(); + // add background activate_particle_systems(); - get_level()->load_song(); + 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); + + // add tilemap + add_object(new TileMap(displaymanager, level)); + level->load_song(); + + apply_bonuses(); } -World::World(const std::string& subset, int level_nr) +void +World::apply_bonuses() { - // 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(); - - get_level()->load_gfx(); - activate_bad_guys(); - activate_particle_systems(); - get_level()->load_song(); + // Apply bonuses from former levels + switch (player_status.bonus) + { + case PlayerStatus::NO_BONUS: + break; + + case PlayerStatus::FLOWER_BONUS: + tux->got_power = Player::FIRE_POWER; // FIXME: add ice power to here + // fall through + + case PlayerStatus::GROWUP_BONUS: + tux->grow(); + break; + } } World::~World() { + for (std::vector::iterator i = gameobjects.begin(); + i != gameobjects.end(); ++i) { + delete *i; + } + delete level; } void World::set_defaults() { - // Set defaults: - scroll_x = 0; - player_status.score_multiplier = 1; counting_distros = false; distro_counter = 0; /* set current song/music */ - set_current_music(LEVEL_MUSIC); + currentmusic = LEVEL_MUSIC; } 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); + // 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::parse_objects(lisp_object_t* cur) +{ + 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 @@ -103,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 != "") { @@ -118,204 +190,139 @@ World::activate_particle_systems() void World::draw() { - int y,x; - - /* Draw the real background */ - if(get_level()->bkgd_image[0] != '\0') - { - int s = ((int)scroll_x / 2)%640; - level->img_bkgd->draw_part(s, 0,0,0,level->img_bkgd->w - s, level->img_bkgd->h); - level->img_bkgd->draw_part(0, 0,screen->w - s ,0,s,level->img_bkgd->h); - } - else - { - drawgradient(level->bkgd_top, level->bkgd_bottom); - } - - /* 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 < 15; ++y) - { - for (x = 0; x < 21; ++x) - { - Tile::draw(32*x - fmodf(scroll_x, 32), y * 32, - level->bg_tiles[(int)y][(int)x + (int)(scroll_x / 32)]); - } - } - - /* Draw interactive tiles: */ - for (y = 0; y < 15; ++y) - { - for (x = 0; x < 21; ++x) - { - Tile::draw(32*x - fmodf(scroll_x, 32), y * 32, - level->ia_tiles[(int)y][(int)x + (int)(scroll_x / 32)]); - } - } - - /* (Bouncy bricks): */ - for (unsigned int i = 0; i < bouncy_bricks.size(); ++i) - bouncy_bricks[i].draw(); - - for (unsigned int i = 0; i < bad_guys.size(); ++i) - bad_guys[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 < 15; ++y) - { - for (x = 0; x < 21; ++x) - { - Tile::draw(32*x - fmodf(scroll_x, 32), y * 32, - level->fg_tiles[(int)y][(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); - - /* 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 distro counting: */ - if (counting_distros) - { - distro_counter--; - - if (distro_counter <= 0) - counting_distros = -1; - } - - // 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 (unsigned int i = 0; i < bad_guys.size(); i++) - bad_guys[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 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 = gameobjects.erase(i); + } else { + ++i; + } + } } - void World::collision_handler() { // CO_BULLET & CO_BADGUY check for(unsigned int i = 0; i < bullets.size(); ++i) { - for(unsigned int j = 0; j < bad_guys.size(); ++j) + for (BadGuys::iterator j = bad_guys.begin(); j != bad_guys.end(); ++j) { - if(bad_guys[j].dying != DYING_NOT) + if((*j)->dying != DYING_NOT) continue; - if(rectcollision(&bullets[i].base, &bad_guys[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 - bad_guys[j].collision(0, 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 } } } /* CO_BADGUY & CO_BADGUY check */ - for(unsigned int i = 0; i < bad_guys.size(); ++i) + for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i) { - if(bad_guys[i].dying != DYING_NOT) + if((*i)->dying != DYING_NOT) continue; - for(unsigned int j = i+1; j < bad_guys.size(); ++j) + BadGuys::iterator j = i; + ++j; + for (; j != bad_guys.end(); ++j) { - if(j == i || bad_guys[j].dying != DYING_NOT) + if(j == i || (*j)->dying != DYING_NOT) continue; - if(rectcollision(&bad_guys[i].base, &bad_guys[j].base)) + if(rectcollision((*i)->base, (*j)->base)) { // We have detected a collision and now call the // collision functions of the collided objects. - bad_guys[j].collision(&bad_guys[i], CO_BADGUY); - bad_guys[i].collision(&bad_guys[j], CO_BADGUY); + (*j)->collision(*i, CO_BADGUY); + (*i)->collision(*j, CO_BADGUY); } } } - if(tux.dying != DYING_NOT) return; + if(tux->dying != DYING_NOT) return; // CO_BADGUY & CO_PLAYER check - for(unsigned int i = 0; i < bad_guys.size(); ++i) + for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i) { - if(bad_guys[i].dying != DYING_NOT) + if((*i)->dying != DYING_NOT) continue; - if(rectcollision_offset(&bad_guys[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 - < bad_guys[i].base.y + bad_guys[i].base.height/2) + 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()) { - bad_guys[i].collision(&tux, CO_PLAYER, COLLISION_SQUISH); + (*i)->collision(tux, CO_PLAYER, COLLISION_SQUISH); } else { - tux.collision(&bad_guys[i], CO_BADGUY); - bad_guys[i].collision(&tux, CO_PLAYER, COLLISION_NORMAL); + tux->collision(*i, CO_BADGUY); + (*i)->collision(tux, CO_PLAYER, COLLISION_NORMAL); } } } @@ -323,88 +330,159 @@ 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); + 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 (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); + } + else if (tux->previous_base.y <= tux->base.y) + { + 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_floating_score.init(x,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_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_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_bouncy_brick.init(x,y); - bouncy_bricks.push_back(new_bouncy_brick); + add_object(new BouncyBrick(displaymanager, pos)); } -void +BadGuy* World::add_bad_guy(float x, float y, BadGuyKind kind) { - bad_guys.push_back(BadGuy()); - BadGuy& new_bad_guy = bad_guys.back(); - - new_bad_guy.init(x,y,kind); + BadGuy* badguy = new BadGuy(displaymanager, kind, x, y); + add_object(badguy); + return badguy; } void -World::add_upgrade(float x, float y, int 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, int dir) +bool +World::add_bullet(const Vector& pos, float xm, Direction dir) { - Bullet new_bullet; - new_bullet.init(x,y,xm,dir); - bullets.push_back(new_bullet); + if(tux->got_power == Player::FIRE_POWER) + { + if(bullets.size() > MAX_FIRE_BULLETS-1) + return false; + } + else if(tux->got_power == Player::ICE_POWER) + { + if(bullets.size() > MAX_ICE_BULLETS-1) + return false; + } + + 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; } -/* Break a brick: */ void +World::play_music(int musictype) +{ + currentmusic = musictype; + switch(currentmusic) { + case HURRYUP_MUSIC: + music_manager->play_music(get_level()->get_level_music_fast()); + break; + case LEVEL_MUSIC: + music_manager->play_music(get_level()->get_level_music()); + break; + case HERRING_MUSIC: + music_manager->play_music(herring_song); + break; + default: + music_manager->halt_music(); + break; + } +} + +int +World::get_music_type() +{ + return currentmusic; +} + +/* Break a brick: */ +bool World::trybreakbrick(float x, float y, bool small) { Level* plevel = get_level(); @@ -415,21 +493,30 @@ 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) { counting_distros = true; - distro_counter = 50; + distro_counter = 5; + } + else + { + distro_counter--; } if (distro_counter <= 0) - plevel->change(x, y, TM_IA, tile->next_tile); + { + counting_distros = false; + plevel->change(x, y, TM_IA, tile->next_tile); + } play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER); player_status.score = player_status.score + SCORE_DISTRO; player_status.distros++; + return true; } else if (!small) { @@ -437,20 +524,24 @@ 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: */ void -World::tryemptybox(float x, float y, int col_side) +World::tryemptybox(float x, float y, Direction col_side) { Tile* tile = gettile(x,y); if (!tile->fullbox) @@ -467,26 +558,34 @@ World::tryemptybox(float x, float y, int 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 an upgrade! - if (tux.size == SMALL) /* Tux is small, add mints! */ - add_upgrade(posx, posy, col_side, UPGRADE_GROWUP); + case 2: // Add a fire flower upgrade! + 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(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(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; @@ -508,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; @@ -521,27 +620,24 @@ World::trygrabdistro(float x, float y, int bounciness) void World::trybumpbadguy(float x, float y) { - /* Bad guys: */ - for (unsigned int i = 0; i < bad_guys.size(); i++) + // Bad guys: + for (BadGuys::iterator i = bad_guys.begin(); i != bad_guys.end(); ++i) { - if (bad_guys[i].base.x >= x - 32 && bad_guys[i].base.x <= x + 32 && - bad_guys[i].base.y >= y - 16 && bad_guys[i].base.y <= y + 16) + if ((*i)->base.x >= x - 32 && (*i)->base.x <= x + 32 && + (*i)->base.y >= y - 16 && (*i)->base.y <= y + 16) { - bad_guys[i].collision(&tux, CO_PLAYER, COLLISION_BUMP); + (*i)->collision(tux, CO_PLAYER, COLLISION_BUMP); } } - - /* Upgrades: */ + // 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].base.xm = -upgrades[i].base.xm; - upgrades[i].base.ym = -8; - play_sound(sounds[SND_BUMP_UPGRADE], SOUND_CENTER_SPEAKER); + upgrades[i]->collision(tux, CO_PLAYER, COLLISION_BUMP); } } }