X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fghosttree.cpp;h=b7b4bd6ab40cf3dca00e3fdee9a887dc1172dac6;hb=114f3c023be94b4bdaedfa16fd6c2b019fda13d9;hp=cc8e492cf118a2c7cbae94d5dc500344db41b2c0;hpb=08813a74da6ac1fd045a105e4e8105f1d7f716f0;p=supertux.git diff --git a/src/badguy/ghosttree.cpp b/src/badguy/ghosttree.cpp index cc8e492cf..b7b4bd6ab 100644 --- a/src/badguy/ghosttree.cpp +++ b/src/badguy/ghosttree.cpp @@ -37,26 +37,25 @@ static const Vector SUCK_TARGET_OFFSET = Vector(-16,-16); static const float SUCK_TARGET_SPREAD = 8; GhostTree::GhostTree(const Reader& lisp) : - BadGuy(lisp, "images/creatures/ghosttree/ghosttree.sprite", LAYER_OBJECTS - 10), + BadGuy(lisp, "images/creatures/ghosttree/ghosttree.sprite", LAYER_OBJECTS - 10), mystate(STATE_IDLE), willowisp_timer(), willo_spawn_y(0), - willo_radius(200), - willo_speed(1.8f), + willo_radius(200), + willo_speed(1.8f), willo_color(0), - glow_sprite(), + glow_sprite(SpriteManager::current()->create("images/creatures/ghosttree/ghosttree-glow.sprite")), colorchange_timer(), suck_timer(), root_timer(), - treecolor(0), + treecolor(0), suck_lantern_color(), suck_lantern(0), willowisps() { - glow_sprite = sprite_manager->create("images/creatures/ghosttree/ghosttree-glow.sprite"); set_colgroup_active(COLGROUP_TOUCHABLE); - sound_manager->preload("sounds/tree_howling.ogg"); - sound_manager->preload("sounds/tree_suck.ogg"); + SoundManager::current()->preload("sounds/tree_howling.ogg"); + SoundManager::current()->preload("sounds/tree_suck.ogg"); } GhostTree::~GhostTree() @@ -67,14 +66,14 @@ void GhostTree::die() { mystate = STATE_DYING; - sprite->set_action("dying", 1); - glow_sprite->set_action("dying", 1); + sprite->set_action("dying", 1); + glow_sprite->set_action("dying", 1); - std::vector::iterator iter; - for(iter = willowisps.begin(); iter != willowisps.end(); ++iter) { - TreeWillOWisp *willo = *iter; - willo->vanish(); + for(auto iter = willowisps.begin(); iter != willowisps.end(); ++iter) { + TreeWillOWisp& willo = **iter; + willo.vanish(); } + run_dead_script(); } void @@ -92,7 +91,7 @@ GhostTree::active_update(float elapsed_time) if (mystate == STATE_IDLE) { if(colorchange_timer.check()) { - sound_manager->play("sounds/tree_howling.ogg", get_pos()); + SoundManager::current()->play("sounds/tree_howling.ogg", get_pos()); suck_timer.start(3); treecolor = (treecolor + 1) % 3; @@ -111,12 +110,11 @@ GhostTree::active_update(float elapsed_time) if(suck_timer.check()) { Color col = glow_sprite->get_color(); - sound_manager->play("sounds/tree_suck.ogg", get_pos()); - std::vector::iterator iter; - for(iter = willowisps.begin(); iter != willowisps.end(); ++iter) { - TreeWillOWisp *willo = *iter; - if(willo->get_color() == col) { - willo->start_sucking(get_bbox().get_middle() + SUCK_TARGET_OFFSET + Vector(systemRandom.randf(-SUCK_TARGET_SPREAD, SUCK_TARGET_SPREAD), systemRandom.randf(-SUCK_TARGET_SPREAD, SUCK_TARGET_SPREAD))); + SoundManager::current()->play("sounds/tree_suck.ogg", get_pos()); + for(auto iter = willowisps.begin(); iter != willowisps.end(); ++iter) { + TreeWillOWisp& willo = **iter; + if(willo.get_color() == col) { + willo.start_sucking(get_bbox().get_middle() + SUCK_TARGET_OFFSET + Vector(gameRandom.randf(-SUCK_TARGET_SPREAD, SUCK_TARGET_SPREAD), gameRandom.randf(-SUCK_TARGET_SPREAD, SUCK_TARGET_SPREAD))); } } mystate = STATE_SUCKING; @@ -125,8 +123,7 @@ GhostTree::active_update(float elapsed_time) if(willowisp_timer.check()) { if(willowisps.size() < WILLOWISP_COUNT) { Vector pos = Vector(bbox.get_width() / 2, bbox.get_height() / 2 + willo_spawn_y + WILLOWISP_TOP_OFFSET); - TreeWillOWisp *willowisp - = new TreeWillOWisp(this, pos, 200 + willo_radius, willo_speed); + auto willowisp = std::make_shared(this, pos, 200 + willo_radius, willo_speed); Sector::current()->add_object(willowisp); willowisps.push_back(willowisp); @@ -165,7 +162,7 @@ GhostTree::active_update(float elapsed_time) /* TODO indicate root with an animation */ Player* player = get_nearest_player(); if (player) { - Root* root = new Root(Vector(player->get_bbox().get_left(), get_bbox().get_bottom()+ROOT_TOP_OFFSET)); + auto root = std::make_shared(Vector(player->get_bbox().get_left(), get_bbox().get_bottom()+ROOT_TOP_OFFSET)); Sector::current()->add_object(root); } } @@ -175,15 +172,15 @@ GhostTree::active_update(float elapsed_time) assert (suck_lantern); Vector pos = suck_lantern->get_pos(); Vector delta = get_bbox().get_middle() + SUCK_TARGET_OFFSET - pos; - Vector dir = delta.unit(); + Vector dir_ = delta.unit(); if (delta.norm() < 1) { - dir = delta; + dir_ = delta; suck_lantern->ungrab(*this, RIGHT); suck_lantern->remove_me(); suck_lantern = 0; - sprite->set_action("swallow", 1); + sprite->set_action("swallow", 1); } else { - pos += dir; + pos += dir_; suck_lantern->grab(*this, pos, RIGHT); } } else { @@ -201,7 +198,7 @@ GhostTree::active_update(float elapsed_time) } } -bool +bool GhostTree::is_color_deadly(Color color) const { if (color == Color(0,0,0)) return false; Color my_color = glow_sprite->get_color(); @@ -214,7 +211,11 @@ GhostTree::willowisp_died(TreeWillOWisp *willowisp) if ((mystate == STATE_SUCKING) && (willowisp->was_sucked)) { mystate = STATE_IDLE; } - willowisps.erase(std::find(willowisps.begin(), willowisps.end(), willowisp)); + willowisps.erase(std::find_if(willowisps.begin(), willowisps.end(), + [willowisp](const std::shared_ptr& lhs) + { + return lhs.get() == willowisp; + })); } void @@ -265,10 +266,8 @@ GhostTree::collision(GameObject& other, const CollisionHit& ) { void GhostTree::spawn_lantern() { - Lantern* lantern = new Lantern(get_bbox().get_middle() + SUCK_TARGET_OFFSET); + auto lantern = std::make_shared(get_bbox().get_middle() + SUCK_TARGET_OFFSET); Sector::current()->add_object(lantern); } -IMPLEMENT_FACTORY(GhostTree, "ghosttree"); - /* EOF */