/*************************************************************************** 
  alienBlaster 
  Copyright (C) 2004 
  Paul Grathwohl, Arne Hormann, Daniel Kuehn, Soenke Schwardt

  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, 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 <iostream>
#include "item.h"
#include "boundingBox.h"
#include "surfaceDB.h"
#include "global.h"

Item::Item(const Vector2D &position, const Vector2D &velocity, ItemTypes itemType) {

  this->itemType = itemType;

  pos = position;
  vel = velocity;
  timeLived = 0;

  switch (itemType) {
  case ITEM_PRIMARY_UPGRADE:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_PRIMARY_UPGRADE );
      break;
    }
  case ITEM_DUMBFIRE_DOUBLE:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_DUMBFIRE_DOUBLE );
      break;
    }
  case ITEM_KICK_ASS_ROCKET:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_KICK_ASS_ROCKET );
      break;
    }
  case ITEM_HELLFIRE:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_HELLFIRE );
      break;
    }
  case ITEM_MACHINE_GUN:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_MACHINE_GUN );
      break;
    }
  case ITEM_HEALTH:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_HEALTH );
      break;
    }
  case ITEM_HEATSEEKER:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_HEATSEEKER );
      break;
    }
  case ITEM_NUKE:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_NUKE );
      break;
    }
  case ITEM_DEFLECTOR:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_DEFLECTOR );
      break;
    }
  case ITEM_LASER:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_LASER );
      break;
    }
  case ITEM_ENERGY_BEAM:
    {
      sprite = surfaceDB.loadSurface( FN_ITEM_ENERGY_BEAM );
      break;
    }
      
  default:
    {
      cout << "Item(): unexpected itemType: " << itemType << endl;
      sprite = surfaceDB.loadSurface( FN_ITEM_PRIMARY_UPGRADE );
      break;
    }
  }

  boundingBox = new BoundingBox( lroundf(pos.getX() - sprite->w / 2.0),
				 lroundf(pos.getY() - sprite->h / 2.0),
				 sprite->w, sprite->h );
}

Item::~Item() {
  delete boundingBox;
}


void Item::update( int dT ) {
  pos += vel * dT / 1000.0;
  updateBoundingBox();
  timeLived += dT;
}

void Item::deleteItem() {
  timeLived = ITEM_LIFETIME;
}

void Item::updateBoundingBox() {
  boundingBox->moveUpperBound( lroundf(pos.getY() - sprite->h * 0.5) );
  boundingBox->moveLeftBound( lroundf(pos.getX() - sprite->w * 0.5) );
}

void Item::draw(SDL_Surface *screen) {
  SDL_Rect r;
  r.x = lroundf(pos.getX()) - sprite->w / 2;
  r.y = lroundf(pos.getY()) - sprite->h / 2;
  r.w = sprite->w;
  r.h = sprite->h;
  SDL_BlitSurface( sprite, 0, screen, &r );
}

BoundingBox *Item::getBoundingBox() {
  return boundingBox;
}

