From 4ed4ca865c254883b9484de3125f7cb103243415 Mon Sep 17 00:00:00 2001 From: LMH Date: Thu, 11 Jul 2013 11:12:25 -1000 Subject: [PATCH] New BonusBlock content: 'coinrain'. Causes ten coins to rain down from the top of the sector. These coins are counted in level stats. --- data/images/engine/editor/heavy_coin.png | Bin 0 -> 2507 bytes data/images/engine/editor/path_coin.png | Bin 0 -> 2467 bytes data/images/objects/bonus_block/bonus-rain.png | Bin 0 -> 2687 bytes data/images/tiles.strf | 27 +++++++- data/levels/test/bonusblock.stl | 20 +++--- src/object/bonus_block.cpp | 11 ++++ src/object/bonus_block.hpp | 3 +- src/object/coin.cpp | 57 +++++++++++++++-- src/object/coin.hpp | 16 +++++ src/object/coin_rain.cpp | 82 +++++++++++++++++++++++++ src/object/coin_rain.hpp | 48 +++++++++++++++ src/supertux/level.cpp | 3 + src/supertux/object_factory.cpp | 2 + 13 files changed, 251 insertions(+), 18 deletions(-) create mode 100644 data/images/engine/editor/heavy_coin.png create mode 100644 data/images/engine/editor/path_coin.png create mode 100644 data/images/objects/bonus_block/bonus-rain.png create mode 100644 src/object/coin_rain.cpp create mode 100644 src/object/coin_rain.hpp diff --git a/data/images/engine/editor/heavy_coin.png b/data/images/engine/editor/heavy_coin.png new file mode 100644 index 0000000000000000000000000000000000000000..0d762e6475616a4685be25b491d1bb44778771cb GIT binary patch literal 2507 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 VLY>(6j!ggn002ovPDHLkV1ntd#4Z2; literal 0 HcmV?d00001 diff --git a/data/images/engine/editor/path_coin.png b/data/images/engine/editor/path_coin.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff2bc5f13a9f7425331238b264e2c92a02a005a GIT binary patch literal 2467 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 literal 0 HcmV?d00001 diff --git a/data/images/tiles.strf b/data/images/tiles.strf index c74c5e57d..6f3015144 100644 --- a/data/images/tiles.strf +++ b/data/images/tiles.strf @@ -15,6 +15,29 @@ ;; src/tile.cpp, unisolid is 3 not 2 (supertux-tiles (tile + (id 2947) + (images + "objects/bonus_block/full-0.png" + "objects/bonus_block/full-1.png" + "objects/bonus_block/full-2.png" + "objects/bonus_block/full-3.png" + "objects/bonus_block/full-4.png" + "objects/bonus_block/full-3.png" + "objects/bonus_block/full-2.png" + "objects/bonus_block/full-1.png" + "objects/bonus_block/full-0.png" + "objects/bonus_block/full-0.png" + "objects/bonus_block/full-0.png" + ) + (solid #t) + (fullbox #t) + (next-tile 84) + (editor-images "objects/bonus_block/bonus-rain.png") + (data 10) + (fps 15) + ) + + (tile (id 2946) (images "objects/bonus_block/full-0.png" @@ -615,7 +638,7 @@ ) (tilegroup (name "Block") - (tiles 27 28 29 47 48 50 49 211 77 51 52 212 78 62 61 213 44 83 84 102 140 103 104 105 112 128 2943 2944 2945 2946 1311 2153) + (tiles 27 28 29 47 48 50 49 211 77 51 52 212 78 62 61 213 44 83 2947 84 102 140 103 104 105 112 128 2943 2944 2945 2946 1311 2153) ) (tilegroup (name "Background") @@ -3915,5 +3938,5 @@ (image "tiles/snow/slope-upper.png" ) ) -;; next-id: 2947 +;; next-id: 2948 ) diff --git a/data/levels/test/bonusblock.stl b/data/levels/test/bonusblock.stl index a3b7b00fd..746425071 100755 --- a/data/levels/test/bonusblock.stl +++ b/data/levels/test/bonusblock.stl @@ -30,7 +30,7 @@ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 384 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 416 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 448 -0 0 0 0 2946 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 480 +0 0 0 0 2946 0 0 0 2947 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 480 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 512 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 544 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 576 @@ -45,15 +45,15 @@ 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 ; 864 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 ; 896 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 ; 928 - )) - - (bonusblock - (x 256 ) - (y 640 ) - (contents "coin" ) - (count 3 ) - ) - + )) + + (bonusblock + (x 256 ) + (y 640 ) + (contents "coin" ) + (count 3 ) + ) + (bonusblock (x 384 ) (y 640 ) diff --git a/src/object/bonus_block.cpp b/src/object/bonus_block.cpp index 6c136c355..fa94cb19c 100644 --- a/src/object/bonus_block.cpp +++ b/src/object/bonus_block.cpp @@ -22,6 +22,7 @@ #include "object/broken_brick.hpp" #include "object/flower.hpp" #include "object/bouncy_coin.hpp" +#include "object/coin_rain.hpp" #include "object/growup.hpp" #include "object/oneup.hpp" #include "object/player.hpp" @@ -59,6 +60,7 @@ BonusBlock::BonusBlock(const Vector& pos, int data) : case 7: contents = CONTENT_TRAMPOLINE; break; case 8: contents = CONTENT_PORTTRAMPOLINE; break; case 9: contents = CONTENT_ROCK; break; + case 10: contents = CONTENT_RAIN; break; default: log_warning << "Invalid box contents" << std::endl; contents = CONTENT_COIN; @@ -116,6 +118,8 @@ BonusBlock::BonusBlock(const Reader& lisp) : contents = CONTENT_PORTTRAMPOLINE; } else if(contentstring == "rock") { contents = CONTENT_ROCK; + } else if(contentstring == "rain") { + contents = CONTENT_RAIN; } else { log_warning << "Invalid box contents '" << contentstring << "'" << std::endl; } @@ -291,6 +295,13 @@ BonusBlock::try_open(Player *player) sound_manager->play("sounds/upgrade.wav"); break; } + + case CONTENT_RAIN: + { + hit_counter = 1; // multiple hits of coin rain is not allowed + Sector::current()->add_object(new CoinRain(get_pos(), true)); + sound_manager->play("sounds/upgrade.wav"); + } } if(script != "") { // scripts always run if defined diff --git a/src/object/bonus_block.hpp b/src/object/bonus_block.hpp index 303835866..127965e6c 100644 --- a/src/object/bonus_block.hpp +++ b/src/object/bonus_block.hpp @@ -41,7 +41,8 @@ public: CONTENT_LIGHT, CONTENT_TRAMPOLINE, CONTENT_PORTTRAMPOLINE, - CONTENT_ROCK + CONTENT_ROCK, + CONTENT_RAIN }; protected: diff --git a/src/object/coin.cpp b/src/object/coin.cpp index 19896f97f..b381473f3 100644 --- a/src/object/coin.cpp +++ b/src/object/coin.cpp @@ -26,11 +26,12 @@ #include "supertux/sector.hpp" Coin::Coin(const Vector& pos) - : MovingSprite(pos, "images/objects/coin/coin.sprite", LAYER_TILES, COLGROUP_TOUCHABLE), + : MovingSprite(pos, "images/objects/coin/coin.sprite", LAYER_TILES, COLGROUP_MOVING), path(), walker(), offset(), - from_tilemap(false) + from_tilemap(false), + physic() { sound_manager->preload("sounds/coin.wav"); } @@ -40,7 +41,8 @@ Coin::Coin(const Vector& pos, TileMap* tilemap) path(boost::shared_ptr(tilemap->get_path())), walker(boost::shared_ptr(tilemap->get_walker())), offset(), - from_tilemap(true) + from_tilemap(true), + physic() { if(walker.get()) { Vector v = path->get_base(); @@ -51,11 +53,12 @@ Coin::Coin(const Vector& pos, TileMap* tilemap) } Coin::Coin(const Reader& reader) - : MovingSprite(reader, "images/objects/coin/coin.sprite", LAYER_TILES, COLGROUP_TOUCHABLE), + : MovingSprite(reader, "images/objects/coin/coin.sprite", LAYER_TILES, COLGROUP_MOVING), path(), walker(), offset(), - from_tilemap(false) + from_tilemap(false), + physic() { const lisp::Lisp* pathLisp = reader.get_lisp("path"); if (pathLisp) { @@ -169,4 +172,48 @@ Coin::collision(GameObject& other, const CollisionHit& ) return ABORT_MOVE; } +/* The following defines a coin subject to gravity */ +HeavyCoin::HeavyCoin(const Vector& pos) + : Coin(pos), + physic() +{ + physic.enable_gravity(true); + sound_manager->preload("sounds/coin.wav"); +} + +HeavyCoin::HeavyCoin(const Vector& pos, const Vector& init_velocity) + : Coin(pos), + physic() +{ + physic.enable_gravity(true); + sound_manager->preload("sounds/coin.wav"); + physic.set_velocity(init_velocity); +} + +HeavyCoin::HeavyCoin(const Reader& reader) + : Coin(reader), + physic() +{ + physic.enable_gravity(true); + sound_manager->preload("sounds/coin.wav"); +} + +void +HeavyCoin::update(float elapsed_time) +{ + // enable physics + movement = physic.get_movement(elapsed_time); +} + +void +HeavyCoin::collision_solid(const CollisionHit& hit) +{ + if(hit.bottom) { + physic.set_velocity_y(0); + } + if(hit.right || hit.left) { + physic.set_velocity_x(-physic.get_velocity_x()); + } +} + /* EOF */ diff --git a/src/object/coin.hpp b/src/object/coin.hpp index f0cd6c8fb..91f3bcd50 100644 --- a/src/object/coin.hpp +++ b/src/object/coin.hpp @@ -18,6 +18,7 @@ #define HEADER_SUPERTUX_OBJECT_COIN_HPP #include "object/moving_sprite.hpp" +#include "supertux/physic.hpp" class Path; class PathWalker; @@ -40,6 +41,21 @@ private: boost::shared_ptr walker; Vector offset; bool from_tilemap; + Physic physic; +}; + +class HeavyCoin : public Coin +{ +public: + HeavyCoin(const Vector& pos); + HeavyCoin(const Vector& pos, const Vector& init_velocity); + HeavyCoin(const Reader& reader); + + virtual void update(float elapsed_time); + virtual void collision_solid(const CollisionHit& hit); + +private: + Physic physic; }; #endif diff --git a/src/object/coin_rain.cpp b/src/object/coin_rain.cpp new file mode 100644 index 000000000..42b1317e5 --- /dev/null +++ b/src/object/coin_rain.cpp @@ -0,0 +1,82 @@ +// SuperTux +// Copyright (C) 2013 LMH +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include "object/coin_rain.hpp" + +#include "math/random_generator.hpp" +#include "object/coin.hpp" +#include "sprite/sprite.hpp" +#include "sprite/sprite_manager.hpp" +#include "supertux/sector.hpp" + +static const float DROP_TIME = .1f; // time duration between "drops" of coin rain + +CoinRain::CoinRain(const Vector& pos, bool emerge) : + sprite(), + position(pos), + emerge_distance(0), + timer(), + counter(0), + drop(0) +{ + sprite = sprite_manager->create("images/objects/coin/coin.sprite"); + + if(emerge) { + emerge_distance = sprite->get_height(); + } +} + +void +CoinRain::update(float elapsed_time) +{ + // first a single (untouchable) coin flies up above the sector + if(position.y > -32){ + float dist = -500 * elapsed_time; + position.y += dist; + emerge_distance += dist; + } // then the first collectable coin drops from one of ten random positions + else if (counter==0){ + drop = gameRandom.rand(10); + Sector::current()->add_object(new HeavyCoin(Vector (position.x+32*((drop<5)?-drop-1:drop-4),-32))); + counter++; + timer.start(DROP_TIME); + } // finally the remainder of the coins drop in a determined but appears to be a random order + else if(timer.check()){ + if(counter<10){ + drop += 7; + if(drop >= 10) drop -=10; + Sector::current()->add_object(new HeavyCoin(Vector (position.x+32*((drop<5)?-drop-1:drop-4),-32))); + counter++; + timer.start(DROP_TIME); + }else{ + remove_me(); + } + } +} + +void +CoinRain::draw(DrawingContext& context) +{ + int layer; + if(emerge_distance > 0) { + layer = LAYER_OBJECTS - 5; + } else { + layer = LAYER_OBJECTS + 5; + } + sprite->draw(context, position, layer); +} + +/* EOF */ diff --git a/src/object/coin_rain.hpp b/src/object/coin_rain.hpp new file mode 100644 index 000000000..37360c93f --- /dev/null +++ b/src/object/coin_rain.hpp @@ -0,0 +1,48 @@ +// SuperTux +// Copyright (C) 2013 LMH +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#ifndef HEADER_SUPERTUX_OBJECT_COIN_RAIN_HPP +#define HEADER_SUPERTUX_OBJECT_COIN_RAIN_HPP + +#include + +#include "math/vector.hpp" +#include "sprite/sprite_ptr.hpp" +#include "supertux/game_object.hpp" +#include "supertux/timer.hpp" +#include "video/color.hpp" + +class Sprite; + +class CoinRain : public GameObject +{ +public: + CoinRain(const Vector& pos, bool emerge=false); + virtual void update(float elapsed_time); + virtual void draw(DrawingContext& context); + +private: + SpritePtr sprite; + Vector position; + float emerge_distance; + Timer timer; + int counter; + int drop; +}; + +#endif + +/* EOF */ diff --git a/src/supertux/level.cpp b/src/supertux/level.cpp index 3b70d653f..e63b4a664 100644 --- a/src/supertux/level.cpp +++ b/src/supertux/level.cpp @@ -203,6 +203,9 @@ Level::get_total_coins() { total_coins += block->hit_counter; continue; + } else if (block->contents == BonusBlock::CONTENT_RAIN) { + total_coins += 10; + continue; } #if 0 // FIXME: do we want this? q.v. src/object/oneup.cpp diff --git a/src/supertux/object_factory.cpp b/src/supertux/object_factory.cpp index 71c177c93..fc01e111d 100644 --- a/src/supertux/object_factory.cpp +++ b/src/supertux/object_factory.cpp @@ -86,6 +86,7 @@ #include "object/candle.hpp" #include "object/cloud_particle_system.hpp" #include "object/coin.hpp" +#include "object/coin_rain.hpp" #include "object/comet_particle_system.hpp" #include "object/decal.hpp" #include "object/display_effect.hpp" @@ -231,6 +232,7 @@ ObjectFactory::init_factories() add_factory("explosion"); add_factory("firefly"); add_factory("gradient"); + add_factory("heavycoin"); add_factory("hurting_platform"); add_factory("icecrusher"); add_factory("infoblock"); -- 2.11.0