/***************************************************************************
                          pipe.h  -  description
                             -------------------
    begin                : Thu Aug 17 2000
    copyright            : (C) 2000 by Waldemar Baraldi
    email                : baraldi@lacasilla.com.ar
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef PIPE_H
#define PIPE_H

#include "animatedcanvas.h"
#include "pointer.h"
#include "videomanager.h"
#include "sprite.h"

#define NORMAL_BONUS_VALUE	5
#define SUPER_BONUS_VALUE	10
#define ULTRA_BONUS_VALUE	25
#define HYPER_BONUS_VALUE	50

enum CardinalPoint {Void, South, West, North, East};
enum Bonus {NormalBonus, SuperBonus, UltraBonus,
            HyperBonus, LifeBonus, TimeBonus};

static const int PipeWidth=60;
static const int PipeHeight=60;

class Player;//Can understan this fucking need

class Pipe: public AnimatedCanvas{

  public:

    /** Constructor default. */
    Pipe();

    /** Destructor. */
    virtual ~Pipe();

    int width(){return PipeWidth;}
    int height(){return PipeHeight;}
    virtual int full(){return DefaultCapacity;}

    /** Retorna true si existe una conexión en ese punto cardinal. */
    virtual bool hasConnection(CardinalPoint con)=0;

    /** Retorna true si el pipe puede ser reemplazado por otro.*/
    virtual bool isRemovable();

    /** Setea la capacidad de ser removido de un pipe*/
    virtual void setFixed(bool flag=true);

    /** Setea el tipo de bonus*/
    virtual void setBonus(Bonus bonus=NormalBonus);

    /** Retorna el tipo de bonus*/
    virtual Bonus getBonus();

    /** Setea el owner del pipe*/
    virtual void setOwner(Player * owner);

    /** Retorna el owner del pipe*/
    virtual Player * getOwner();

    /** Restringe la conexión como salida.
        No hace nada si la conexión no existe.*/
    virtual void restrictAsOutput(CardinalPoint con)=0;

    /** Retorna true si la conexión esta restruingida como salida.*/
    virtual bool isRestrictedAsOutput(CardinalPoint con)=0;

    /** Retorna la salida de ese punto cardinal. El resultado es Void
       si no existe el input.*/
    virtual CardinalPoint getOutput(CardinalPoint input)=0;

    virtual bool hasLiquid();


    virtual void setLast(bool flag);

    virtual bool isLast();

    /** Incrementa el nivel de llenado en 1 para la conexión con ese input.
        El resultado es 0 si no existe input.*/
    virtual void incFullLevel(CardinalPoint input, unsigned int amount)=0;

      /** Retorna el nivel de llenado para ese input. Si el input no existe
    retorna -1.*/
    virtual int getFullLevel(CardinalPoint input)=0;

    /** Retorna una referencia al puntero asociado.*/
    virtual Pointer * getPointer()=0;

    /** Para uso futuro. Cambiarla a abstracta e
    implementarla en cada pipe*/
    void tick();

    protected:

      static const int Gran=50;
      static const int DefaultCapacity=1000;

      virtual void paintRestriction(VideoManager * vm, CardinalPoint con);
      virtual void paintBonus(VideoManager * vm, Bonus bonus);
      virtual void paintExclamation(VideoManager * vm);

      int full_level;
      CardinalPoint used_input;
      Pointer * p;
      CardinalPoint ro;
      bool fixed;
      Bonus bonus;
      Player * owner;
      Sprite * excl;
      int exclFrame;
      bool last;

      int bonusFrame;
      Sprite * bonusSprite;
};
#endif


