#ifdef KITSCHY_DEBUG_MEMORY
#include "debug_memorymanager.h"
#endif

#include "debug.h"

#ifdef _WIN32
#include "windows.h"
#endif

#include <iostream>
#include "math.h"
#include "stdlib.h"
#include "string.h"

#include "GL/gl.h"
#include "GL/glu.h"
#include "SDL.h"
#include "SDL_image.h"
#include "SDL_mixer.h"

#include "List.h"

#include "auxiliar.h"
#include "2DCMC.h"
#include "Symbol.h"
#include "GLTile.h"
#include "keyboardstate.h"

#include "GLTManager.h"
#include "SoundManager.h"
#include "SFXManager.h"
#include "GObject.h"
#include "GO_bridge.h"
#include "GO_character.h"

#include "GMap.h"

#include "GObjectCreator.h"

int GO_bridge::m_shake_timmer2; 

GO_bridge::GO_bridge(int x, int y, int sfx_volume, int type) : GObject(x, y, sfx_volume)
{
    m_class = new Symbol(bridge_symbol);

    m_state_cycle = 0;
    m_type = type;
    m_shake_timmer2 = 0;
	m_last_tile_used = 0;
	m_bridge_distance = 0;
} /* GObject::GObject */


bool GO_bridge::cycle(VirtualController *k, GMap *map, int layer, TheGoonies *game, GLTManager *GLTM, SFXManager *SFXM)
{
    m_state_cycle++;

    if ((this->m_shake_timmer2 > 0) && (m_state_cycle % 3 == 0)) {
        this->m_shake_timmer2-= 1;
	}

	if (m_state_cycle % 26 == 0 && this->m_shake_timmer2 > 0 ) {
		SFXM->SFX_play("sfx/creak", m_sfx_volume, get_angle(map), get_distance(map));
	}
	
	GObject *c = map->get_object(character_symbol);
	m_bridge_distance = 0;
	
	// FIXME: yucky hack
	if (c != 0 && (abs(c->get_y()) - 13) == m_y) {
		if (m_x - 45 <= c->get_x() && m_x + 55 >= c->get_x()) {
			m_bridge_distance = 1;
		}
		if (m_x - 25 <= c->get_x() && m_x + 35 >= c->get_x()) {
			m_bridge_distance = 2;
		}
		if (m_x - 5 <= c->get_x() && m_x + 15 >= c->get_x()) {
			m_bridge_distance = 3;
		}
	}
	
    return true;
} /* GO_bridge::cycle */


void GO_bridge::draw(GLTManager *GLTM)
{
	if (m_last_tile_used == 0) {
		switch (m_type) {
			case 0:
				m_last_tile_used = GLTM->get("gr_tile-bridge-l");
				break;
			case 1:
				m_last_tile_used = GLTM->get("gr_tile-bridge-m");
				break;
			case 2:
				m_last_tile_used = GLTM->get("gr_tile-bridge-r");
				break;
			case 3:
				m_last_tile_used = GLTM->get("gr_tilegreen-bridge-l");
				break;
			case 4:
				 m_last_tile_used = GLTM->get("gr_tilegreen-bridge-m");
				break;
			case 5:
				 m_last_tile_used = GLTM->get("gr_tilegreen-bridge-r");
				break;
			case 6:
				 m_last_tile_used = GLTM->get("gr_tileblue-bridge-l");
				break;
			case 7:
				 m_last_tile_used = GLTM->get("gr_tileblue-bridge-m");
				break;
			case 8:
				 m_last_tile_used = GLTM->get("gr_tileblue-bridge-r");
				break;
			case 9:
				 m_last_tile_used = GLTM->get("gr_tileyellow-bridge-l");
				break;
			case 10:
				 m_last_tile_used = GLTM->get("gr_tileyellow-bridge-m");
				break;
			case 11:
				 m_last_tile_used = GLTM->get("gr_tileyellow-bridge-r");
				  break;          
		} // switch
	} // if

	m_last_tile_used->draw(m_x, m_y + m_bridge_distance, 0, 0, 1);

/*
    if (m_shake_timmer2 > 0) {
       m_last_tile_used->draw(m_x, m_y + float(sin(this->m_shake_timmer2)*(this->m_shake_timmer2 / 15.0f)),0,0,1);
    } else  {
       m_last_tile_used->draw(m_x, m_y, 0, 0, 1);
    } // if
*/
} /* GO_bridge::draw */

void GO_bridge::shaking()  {
  if (this->m_shake_timmer2 < 1)
     this->m_shake_timmer2 = 26;    
}


bool GO_bridge::is_a(Symbol *c)
{
    if (c->cmp(bridge_symbol))
        return true;

    return GObject::is_a(c);
} /* GO_bridge::is_a */


bool GO_bridge::is_a(char *c)
{
    bool retval;
    Symbol *s = new Symbol(c);

    retval = is_a(s);

    delete s;

    return retval;
} /* GO_bridge::is_a */
