Codebase list burgerspace / lintian-fixes/main src / IngredientGroup.cpp
lintian-fixes/main

Tree @lintian-fixes/main (Download .tar.gz)

IngredientGroup.cpp @lintian-fixes/mainraw · history · blame

/*  $Id: IngredientGroup.cpp,v 1.11 2010/05/26 03:13:01 sarrazip Exp $
    IngredientGroup.cpp - Group of sprites representing an "ingredient"

    burgerspace - A hamburger-smashing video game.
    Copyright (C) 2001-2010 Pierre Sarrazin <http://sarrazip.com/>

    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 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., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
*/

#include "IngredientGroup.h"

#include "IngredientSprite.h"
#include "EnemySprite.h"

using namespace flatzebra;


IngredientGroup::IngredientGroup(int yTarget, bool topBun)
  : members(),
    verticalTarget(yTarget),
    carriedEnemies(),
    bounceTime(0),
    stallTime(0),
    state(NORMAL),
    numFloorsToGo(0),
    topBunFlag(topBun)
{
    members[0] = members[1] = members[2] = members[3] = NULL;
}


IngredientGroup::~IngredientGroup()
{
}


void IngredientGroup::setMember(size_t index, IngredientSprite *s)
{
    assert(index < 4);
    assert(s != NULL);
    members[index] = s;
}


bool
IngredientGroup::areAllMembersLowered() const
{
    size_t j;
    for (j = 0; j < 4; j++)
        if (!members[j]->isLowered())
            return false;
    return true;
}


void
IngredientGroup::startFalling(int speedFactor, int numOfFloorsToGo)
{
    for (size_t j = 0; j < 4; j++)
    {
        members[j]->setSpeed(Couple(0, speedFactor));
        if (members[j]->isLowered())
            members[j]->getPos().y -= IngredientSprite::LOWERING_DISTANCE;
        else
            members[j]->setLowered();
    }

    state = FALL1;
    numFloorsToGo = numOfFloorsToGo;
}


void
IngredientGroup::fallToNextFloor(int speedFactor)
{
    for (size_t j = 0; j < 4; j++)
        members[j]->setSpeed(Couple(0, speedFactor));

    state = FALL1;
}


void
IngredientGroup::addCarriedEnemy(EnemySprite *s)
{
    assert(s != NULL);
    carriedEnemies.push_back(s);
    s->setCarryingGroup(this);
}


void
IngredientGroup::bounce(int speedFactor)
{
    for (size_t j = 0; j < 4; j++)
        members[j]->setSpeed(Couple(0, -speedFactor));

    for (SpriteList::iterator it = carriedEnemies.begin();
                                    it != carriedEnemies.end(); it++)
        (*it)->setSpeed(Couple(0, -speedFactor));

    state = BOUNCE;
    bounceTime = 4;
}


void
IngredientGroup::stall()
{
    for (size_t j = 0; j < 4; j++)
        members[j]->getSpeed().zero();

    for (SpriteList::iterator it = carriedEnemies.begin();
                                    it != carriedEnemies.end(); it++)
        (*it)->getSpeed().zero();

    state = STALL;
    stallTime = 2;
}


void
IngredientGroup::fallBack(int speedFactor)
{
    for (size_t j = 0; j < 4; j++)
        members[j]->setSpeed(Couple(0, +speedFactor));

    for (SpriteList::iterator it = carriedEnemies.begin();
                                    it != carriedEnemies.end(); it++)
        (*it)->setSpeed(Couple(0, +speedFactor));

    state = FALL2;
}


void
IngredientGroup::stop()
{
    IngredientSprite *firstMember = members[0];
    for (size_t j = 0; j < 4; j++)
    {
        IngredientSprite *m = members[j];

        // align other members with this one:
        m->getPos().y = firstMember->getPos().y;

        m->setNormal();  // not lowered anymore
        m->getSpeed().zero();
    }

    state = NORMAL;
    numFloorsToGo = 0;
}


Couple IngredientGroup::getCenterPos() const
{
    const Couple groupPos = getMember(0)->getPos();
    const Couple groupLRP = getMember(3)->getLowerRightPos();
    return (groupPos + groupLRP) / 2;
}