X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fkugelblitz.cpp;h=cfc900fd2170ef1fe26bacaba59c54788121a1f9;hb=146cb5cf3c1ea9bd8f884e3c99a7789c42d598f1;hp=94be0586410866d2090203f6a9ac2e61edf7d2a9;hpb=9890da50f82d286c67e72feefcc423d1bc9076c3;p=supertux.git diff --git a/src/badguy/kugelblitz.cpp b/src/badguy/kugelblitz.cpp index 94be05864..cfc900fd2 100644 --- a/src/badguy/kugelblitz.cpp +++ b/src/badguy/kugelblitz.cpp @@ -1,68 +1,70 @@ -// $Id: Kugelblitz.cpp 2654 2005-06-29 14:16:22Z wansti $ -// // SuperTux -// Copyright (C) 2005 Marek Moeckel +// Copyright (C) 2006 Matthias Braun // -// 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 2 -// of the License, or (at your option) any later version. +// 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, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -// 02111-1307, USA. -#include +// along with this program. If not, see . + +#include "badguy/kugelblitz.hpp" -#include "kugelblitz.hpp" -#include "object/tilemap.hpp" -#include "tile.hpp" +#include + +#include "math/random_generator.hpp" +#include "object/camera.hpp" +#include "object/player.hpp" +#include "sprite/sprite.hpp" +#include "sprite/sprite_manager.hpp" +#include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" +#include "util/reader.hpp" #define LIFETIME 5 #define MOVETIME 0.75 #define BASE_SPEED 200 #define RAND_SPEED 150 -Kugelblitz::Kugelblitz(const lisp::Lisp& reader) - : groundhit_pos_set(false) +Kugelblitz::Kugelblitz(const Reader& reader) : + BadGuy(reader, "images/creatures/kugelblitz/kugelblitz.sprite"), + pos_groundhit(), + groundhit_pos_set(false), + dying(), + movement_timer(), + lifetime(), + direction(), + light(0.0f,0.0f,0.0f), + lightsprite(SpriteManager::current()->create("images/objects/lightmap_light/lightmap_light.sprite")) { reader.get("x", start_position.x); - start_position.y = 0; //place above visible area - bbox.set_size(63.8, 63.8); - sprite = sprite_manager->create("kugelblitz"); sprite->set_action("falling"); physic.enable_gravity(false); -} - -void -Kugelblitz::write(lisp::Writer& writer) -{ - writer.start_list("kugelblitz"); - - writer.write_float("x", start_position.x); - writer.write_float("y", start_position.y); + countMe = false; - writer.end_list("kugelblitz"); + lightsprite->set_blend(Blend(GL_SRC_ALPHA, GL_ONE)); + lightsprite->set_color(Color(0.2f, 0.1f, 0.0f)); } void -Kugelblitz::activate() +Kugelblitz::initialize() { - physic.set_velocity_y(-300); + physic.set_velocity_y(300); physic.set_velocity_x(-20); //fall a little to the left direction = 1; dying = false; } -HitResponse -Kugelblitz::collision_solid(GameObject& , const CollisionHit& chit) +void +Kugelblitz::collision_solid(const CollisionHit& chit) { - return hit(chit); + hit(chit); } HitResponse @@ -74,14 +76,14 @@ Kugelblitz::collision_player(Player& player, const CollisionHit& ) } // hit from above? if(player.get_movement().y - get_movement().y > 0 && player.get_bbox().p2.y < - (get_bbox().p1.y + get_bbox().p2.y) / 2) { + (get_bbox().p1.y + get_bbox().p2.y) / 2) { // if it's not is it possible to squish us, then this will hurt if(!collision_squished(player)) - player.kill(Player::SHRINK); - explode(); + player.kill(false); + explode(); return FORCE_MOVE; } - player.kill(Player::SHRINK); + player.kill(false); explode(); return FORCE_MOVE; } @@ -96,10 +98,10 @@ Kugelblitz::collision_badguy(BadGuy& other , const CollisionHit& chit) } HitResponse -Kugelblitz::hit(const CollisionHit& chit) +Kugelblitz::hit(const CollisionHit& hit_) { // hit floor? - if(chit.normal.y < -.5) { + if(hit_.bottom) { if (!groundhit_pos_set) { pos_groundhit = get_pos(); @@ -108,13 +110,13 @@ Kugelblitz::hit(const CollisionHit& chit) sprite->set_action("flying"); physic.set_velocity_y(0); //Set random initial speed and direction - if ((rand() % 2) == 1) direction = 1; else direction = -1; - int speed = (BASE_SPEED + (rand() % RAND_SPEED)) * direction; + direction = gameRandom.rand(2)? 1: -1; + int speed = (BASE_SPEED + (gameRandom.rand(RAND_SPEED))) * direction; physic.set_velocity_x(speed); movement_timer.start(MOVETIME); lifetime.start(LIFETIME); - } else if(chit.normal.y < .5) { // bumped on roof + } else if(hit_.top) { // bumped on roof physic.set_velocity_y(0); } @@ -131,19 +133,41 @@ Kugelblitz::active_update(float elapsed_time) if (groundhit_pos_set) { if (movement_timer.check()) { if (direction == 1) direction = -1; else direction = 1; - int speed = (BASE_SPEED + (rand() % RAND_SPEED)) * direction; + int speed = (BASE_SPEED + (gameRandom.rand(RAND_SPEED))) * direction; physic.set_velocity_x(speed); movement_timer.start(MOVETIME); } } - if (Sector::current()->solids->get_tile_at(get_pos())->getAttributes() == 16) { + /* + if (Sector::current()->solids->get_tile_at(get_pos())->getAttributes() == 16) { //HIT WATER Sector::current()->add_object(new Electrifier(75,1421,1.5)); Sector::current()->add_object(new Electrifier(76,1422,1.5)); explode(); - } + } + if (Sector::current()->solids->get_tile_at(get_pos())->getAttributes() == 48) { + //HIT ELECTRIFIED WATER + explode(); + } + */ + } + BadGuy::active_update(elapsed_time); +} + +void +Kugelblitz::draw(DrawingContext& context) +{ + sprite->draw(context, get_pos(), layer); + + //Only draw light in dark areas + context.get_light( get_bbox().get_middle(), &light ); + if (light.red + light.green < 2.0){ + context.push_target(); + context.set_target(DrawingContext::LIGHTMAP); + sprite->draw(context, get_pos(), layer); + lightsprite->draw(context, get_bbox().get_middle(), 0); + context.pop_target(); } - BadGuy::active_update(elapsed_time); } void @@ -156,10 +180,41 @@ Kugelblitz::explode() { if (!dying) { sprite->set_action("pop"); - lifetime.start(0.2); + lifetime.start(0.2f); dying = true; } else remove_me(); } -IMPLEMENT_FACTORY(Kugelblitz, "kugelblitz") +void +Kugelblitz::try_activate() +{ + // Much smaller offscreen distances to pop out of nowhere and surprise Tux + float X_OFFSCREEN_DISTANCE = 400; + float Y_OFFSCREEN_DISTANCE = 600; + + Player* player_ = get_nearest_player(); + if (!player_) return; + Vector dist = player_->get_bbox().get_middle() - get_bbox().get_middle(); + if ((fabsf(dist.x) <= X_OFFSCREEN_DISTANCE) && (fabsf(dist.y) <= Y_OFFSCREEN_DISTANCE)) { + set_state(STATE_ACTIVE); + if (!is_initialized) { + + // if starting direction was set to AUTO, this is our chance to re-orient the badguy + if (start_dir == AUTO) { + Player* player__ = get_nearest_player(); + if (player__ && (player__->get_bbox().p1.x > get_bbox().p2.x)) { + dir = RIGHT; + } else { + dir = LEFT; + } + } + + initialize(); + is_initialized = true; + } + activate(); + } +} + +/* EOF */