/**
* one room arena
* Copyright (C) 2016 POSITIVE MENTAL ATTITUDE
*
* 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, version 3 of the License.
*
* 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
#include "Powerup.hpp"
#include "Map.hpp"
#include "Player.hpp"
Powerup::Powerup(std::vector* textures)
{
_type = rand() % count;
this->setTexture(textures->at(_type));
this->setOrigin((Vector2f)textures->at(_type).getSize() / 2.f);
}
const int Powerup::getType() const
{
return _type;
}
PowerupManager::PowerupManager(Map* map)
{
_map = map;
_decentlyAllocatedTextures.resize(Powerup::count);
_decentlyAllocatedTextures[Powerup::Haste].loadFromFile("data/haste.png");
_decentlyAllocatedTextures[Powerup::Fatman].loadFromFile("data/fatman.png");
_decentlyAllocatedTextures[Powerup::Steroids].loadFromFile("data/powerup.png");
_decentlyAllocatedTextures[Powerup::RateOfFire].loadFromFile("data/rof.png");
}
void PowerupManager::registerPlayer(Player* player)
{
_ptr.push_back(player);
}
void PowerupManager::deregisterPlayer(Player* player)
{
for(unsigned i = 0; i < _ptr.size(); ++i)
{
if(_ptr[i] == player)
{
_ptr.erase(_ptr.begin() + i);
break;
}
}
}
void PowerupManager::logic()
{
static Clock clock;
if(clock.getElapsedTime().asSeconds() > 2.f && _powerups.size() < 10)
{
clock.restart();
_powerups.emplace_back(&_decentlyAllocatedTextures);
int x, y;
do {
x = rand() % (_map->getSize().x - 200) + 100;
y = rand() % (_map->getSize().x - 200) + 100;
_powerups.back().setPosition(x, y);
} while(_map->collision(Vector2f(x, y)));
}
collision();
}
const unsigned PowerupManager::getSize() const
{
return _powerups.size();
}
const Powerup& PowerupManager::getPowerup(unsigned i) const
{
return _powerups[i];
}
void PowerupManager::collision()
{
for(unsigned i = 0; i < _ptr.size(); ++i)
{
for(unsigned j = 0; j < _ptr[i]->getPointCount(); ++j)
{
Vector2f coords = _ptr[i]->getTransform().transformPoint(_ptr[i]->getPoint(j));
for(unsigned k = 0; k < _powerups.size(); ++k)
{
if(coords.x > _powerups[k].getPosition().x - _powerups[k].getOrigin().x
&& coords.x < _powerups[k].getPosition().x + _powerups[k].getOrigin().x
&& coords.y > _powerups[k].getPosition().y - _powerups[k].getOrigin().y
&& coords.y < _powerups[k].getPosition().y + _powerups[k].getOrigin().y)
{
switch(_powerups[k].getType())
{
case Powerup::Haste: _ptr[i]->hasten(); break;
case Powerup::Fatman: _ptr[i]->addNuke(); break;
case Powerup::Steroids: _ptr[i]->growStronger(); break;
case Powerup::RateOfFire: _ptr[i]->rateOfFire(); break;
default: break;
}
_powerups.erase(_powerups.begin() + k);
}
}
}
}
}
void PowerupManager::draw(RenderTarget& target, RenderStates states) const
{
for(unsigned i = 0; i < _powerups.size(); ++i)
target.draw(_powerups[i], states);
}