void Brick::try_break(bool playerhit) { if(sprite->get_action() == "empty") return; sound_manager->play("sounds/brick.wav"); Sector* sector = Sector::current(); Player& player = *(sector->player); if(coin_counter > 0) { sector->add_object(new BouncyCoin(get_pos())); coin_counter--; player.get_status()->add_coins(1); if(coin_counter == 0) sprite->set_action("empty"); start_bounce(); } else if(breakable) { if(playerhit){ if(player.is_big()){ start_break(); return; } else { start_bounce(); return; } } break_me(); } }
void Brick::try_break(Player* player) { if(sprite->get_action() == "empty") return; SoundManager::current()->play("sounds/brick.wav"); Sector* sector = Sector::current(); Player& player_one = *(sector->player); if(coin_counter > 0 ){ sector->add_object(std::make_shared<BouncyCoin>(get_pos(), true)); coin_counter--; player_one.get_status()->add_coins(1); if(coin_counter == 0) sprite->set_action("empty"); start_bounce(player); } else if(breakable) { if(player){ if(player->is_big()){ start_break(player); return; } else { start_bounce(player); return; } } break_me(); } }
void Block::break_me() { Sector* sector = Sector::current(); sector->add_object( new BrokenBrick(new Sprite(*sprite), get_pos(), Vector(-100, -400))); sector->add_object( new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(0, 16), Vector(-150, -300))); sector->add_object( new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 0), Vector(100, -400))); sector->add_object( new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 16), Vector(150, -300))); remove_me(); }
void Block::break_me() { Sector* sector = Sector::current(); sector->add_object( std::make_shared<BrokenBrick>(sprite->clone(), get_pos(), Vector(-100, -400))); sector->add_object( std::make_shared<BrokenBrick>(sprite->clone(), get_pos() + Vector(0, 16), Vector(-150, -300))); sector->add_object( std::make_shared<BrokenBrick>(sprite->clone(), get_pos() + Vector(16, 0), Vector(100, -400))); sector->add_object( std::make_shared<BrokenBrick>(sprite->clone(), get_pos() + Vector(16, 16), Vector(150, -300))); remove_me(); }
void Brick::try_break(bool playerhit) { if(sprite->get_action() == "empty") return; sound_manager->play("sounds/brick.wav"); Sector* sector = Sector::current(); Player& player = *(sector->player); if(coin_counter > 0) { sector->add_object(new BouncyCoin(get_pos())); coin_counter--; player.get_status()->add_coins(1); if(coin_counter == 0) sprite->set_action("empty"); start_bounce(); } else if(breakable) { if(playerhit && !player.is_big()) { start_bounce(); return; } sector->add_object( new BrokenBrick(new Sprite(*sprite), get_pos(), Vector(-100, -400))); sector->add_object( new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(0, 16), Vector(-150, -300))); sector->add_object( new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 0), Vector(100, -400))); sector->add_object( new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 16), Vector(150, -300))); remove_me(); } }
void Fireworks::update(float ) { if(timer.check()) { Sector* sector = Sector::current(); Vector pos = sector->camera->get_translation(); pos += Vector(systemRandom.randf(SCREEN_WIDTH), systemRandom.randf(SCREEN_HEIGHT/2)); float red = systemRandom.randf(1.0); float green = systemRandom.randf(1.0); //float red = 0.7; //float green = 0.9; (void) red; (void) green; sector->add_object(new Particles(pos, 0, 360, Vector(140, 140), Vector(0, 0), 45, Color(red, green, 0), 3, 1.3, LAYER_FOREGROUND1+1)); sound_manager->play("sounds/fireworks.wav"); timer.start(systemRandom.randf(1.0, 1.5)); } }
void BonusBlock::try_open() { if(sprite->get_action() == "empty") { sound_manager->play("sounds/brick.wav"); return; } Sector* sector = Sector::current(); assert(sector); assert(sector->player); Player& player = *(sector->player); Direction direction = (player.get_bbox().get_middle().x > get_bbox().get_middle().x) ? LEFT : RIGHT; switch(contents) { case CONTENT_COIN: Sector::current()->add_object(new BouncyCoin(get_pos())); player.get_status()->add_coins(1); break; case CONTENT_FIREGROW: if(player.get_status()->bonus == NO_BONUS) { SpecialRiser* riser = new SpecialRiser(get_pos(), new GrowUp(direction)); sector->add_object(riser); } else { SpecialRiser* riser = new SpecialRiser( get_pos(), new Flower(FIRE_BONUS)); sector->add_object(riser); } sound_manager->play("sounds/upgrade.wav"); break; case CONTENT_ICEGROW: if(player.get_status()->bonus == NO_BONUS) { SpecialRiser* riser = new SpecialRiser(get_pos(), new GrowUp(direction)); sector->add_object(riser); } else { SpecialRiser* riser = new SpecialRiser( get_pos(), new Flower(ICE_BONUS)); sector->add_object(riser); } sound_manager->play("sounds/upgrade.wav"); break; case CONTENT_STAR: sector->add_object(new Star(get_pos() + Vector(0, -32), direction)); break; case CONTENT_1UP: sector->add_object(new OneUp(get_pos(), direction)); break; case CONTENT_CUSTOM: SpecialRiser* riser = new SpecialRiser(get_pos(), object); object = 0; sector->add_object(riser); sound_manager->play("sounds/upgrade.wav"); break; } start_bounce(); sprite->set_action("empty"); }
void BonusBlock::try_drop(Player *player) { if(sprite->get_action() == "empty") { SoundManager::current()->play("sounds/brick.wav"); return; } Sector* sector = Sector::current(); assert(sector); // First what's below the bonus block, if solid send it up anyway (excepting doll) Rectf dest_; dest_.p1.x = bbox.get_left() + 1; dest_.p1.y = bbox.get_bottom() + 1; dest_.p2.x = bbox.get_right() - 1; dest_.p2.y = dest_.p1.y + 30; if (!Sector::current()->is_free_of_statics(dest_, this, true) && !(contents == CONTENT_1UP)) { try_open(player); return; } if (player == NULL) player = sector->player; if (player == NULL) return; Direction direction = (player->get_bbox().get_middle().x > bbox.get_middle().x) ? LEFT : RIGHT; bool countdown = false; switch(contents) { case CONTENT_COIN: { try_open(player); break; } case CONTENT_FIREGROW: { drop_growup_bonus("images/powerups/fireflower/fireflower.sprite", countdown); break; } case CONTENT_ICEGROW: { drop_growup_bonus("images/powerups/iceflower/iceflower.sprite", countdown); break; } case CONTENT_AIRGROW: { drop_growup_bonus("images/powerups/airflower/airflower.sprite", countdown); break; } case CONTENT_EARTHGROW: { drop_growup_bonus("images/powerups/earthflower/earthflower.sprite", countdown); break; } case CONTENT_STAR: { sector->add_object(std::make_shared<Star>(get_pos() + Vector(0, 32), direction)); SoundManager::current()->play("sounds/upgrade.wav"); countdown = true; break; } case CONTENT_1UP: { sector->add_object(std::make_shared<OneUp>(get_pos(), DOWN)); SoundManager::current()->play("sounds/upgrade.wav"); countdown = true; break; } case CONTENT_CUSTOM: { //NOTE: non-portable trampolines could be moved to CONTENT_CUSTOM, but they should not drop object->set_pos(get_pos() + Vector(0, 32)); sector->add_object(object); object = 0; SoundManager::current()->play("sounds/upgrade.wav"); countdown = true; break; } case CONTENT_SCRIPT: { countdown = true; break; } // because scripts always run, this prevents default contents from being assumed case CONTENT_LIGHT: { try_open(player); break; } case CONTENT_TRAMPOLINE: { try_open(player); break; } case CONTENT_RAIN: { try_open(player); break; } case CONTENT_EXPLODE: { hit_counter = 1; // multiple hits of coin explode is not allowed Sector::current()->add_object(std::make_shared<CoinExplode>(get_pos() + Vector (0, 40))); SoundManager::current()->play("sounds/upgrade.wav"); countdown = true; break; } } if(!script.empty()) { // scripts always run if defined std::istringstream stream(script); Sector::current()->run_script(stream, "powerup-script"); } if(countdown){ // only decrease hit counter if try_open was not called if(hit_counter == 1){ sprite->set_action("empty"); }else{ hit_counter--; } } }
void BonusBlock::try_open(Player *player) { if(sprite->get_action() == "empty") { SoundManager::current()->play("sounds/brick.wav"); return; } Sector* sector = Sector::current(); assert(sector); if (player == NULL) player = sector->player; if (player == NULL) return; Direction direction = (player->get_bbox().get_middle().x > bbox.get_middle().x) ? LEFT : RIGHT; switch(contents) { case CONTENT_COIN: { Sector::current()->add_object(std::make_shared<BouncyCoin>(get_pos(), true)); player->get_status()->add_coins(1); if (hit_counter != 0) Sector::current()->get_level()->stats.coins++; break; } case CONTENT_FIREGROW: { raise_growup_bonus(player, FIRE_BONUS, direction); break; } case CONTENT_ICEGROW: { raise_growup_bonus(player, ICE_BONUS, direction); break; } case CONTENT_AIRGROW: { raise_growup_bonus(player, AIR_BONUS, direction); break; } case CONTENT_EARTHGROW: { raise_growup_bonus(player, EARTH_BONUS, direction); break; } case CONTENT_STAR: { sector->add_object(std::make_shared<Star>(get_pos() + Vector(0, -32), direction)); SoundManager::current()->play("sounds/upgrade.wav"); break; } case CONTENT_1UP: { sector->add_object(std::make_shared<OneUp>(get_pos(), direction)); SoundManager::current()->play("sounds/upgrade.wav"); break; } case CONTENT_CUSTOM: { auto riser = std::make_shared<SpecialRiser>(get_pos(), object); object = 0; sector->add_object(riser); SoundManager::current()->play("sounds/upgrade.wav"); break; } case CONTENT_SCRIPT: { break; } // because scripts always run, this prevents default contents from being assumed case CONTENT_LIGHT: { if(sprite->get_action() == "on") sprite->set_action("off"); else sprite->set_action("on"); SoundManager::current()->play("sounds/switch.ogg"); break; } case CONTENT_TRAMPOLINE: { auto riser = std::make_shared<SpecialRiser>(get_pos(), std::make_shared<Trampoline>(get_pos(), false)); sector->add_object(riser); SoundManager::current()->play("sounds/upgrade.wav"); break; } case CONTENT_RAIN: { hit_counter = 1; // multiple hits of coin rain is not allowed Sector::current()->add_object(std::make_shared<CoinRain>(get_pos(), true)); SoundManager::current()->play("sounds/upgrade.wav"); break; } case CONTENT_EXPLODE: { hit_counter = 1; // multiple hits of coin explode is not allowed Sector::current()->add_object(std::make_shared<CoinExplode>(get_pos() + Vector (0, -40))); SoundManager::current()->play("sounds/upgrade.wav"); break; } } if(!script.empty()) { // scripts always run if defined std::istringstream stream(script); Sector::current()->run_script(stream, "BonusBlockScript"); } start_bounce(player); if(hit_counter <= 0 || contents == CONTENT_LIGHT){ //use 0 to allow infinite hits }else if(hit_counter == 1){ sprite->set_action("empty"); }else{ hit_counter--; } }