#define  UTIL_BUTTONS_H aaa
//----------------------------------------------------------------------------
//  @brief
//        обработка нажимаемых кнопок на уровнях
//        963 - кнопка вкл
//        964 - кнопка выкл

//  @ingroup
    
//  2006Dec07 created. Zmanovsky Peter.
//  (C) 2006    Sigma-Team
//-----------------------------------------------------------------------------

#define WIN_MUSIC "music\\mus04.ogg"

//------------------------------------------------------------------------------------------
static int giColSpeedZ = 0;
static int giCurColZ = 0;
//
static int giCylSpeedZ = 0;
static int giCurCylZ = 0;
static bool gbCurCylPos = false;
//
bool giWin95Time = false;

//------------------------------------------------------------------------------------------
CylinderTact();

//------------------------------------------------------------------------------------------
ButtonsTact()
{
    iff(1)
    {
        SetVidData(970, VID_SIZE_Z, 60);
    	SetVidData(434, VID_MOVE_MASK, 15);
    }

	CylinderTact();

	//если на карте вообще кнопок нет - сваливаем
	if(!GetVidData(963, VID_VALIDATE) || !GetVidData(964, VID_VALIDATE))
		return;
	if(GetVidData(963, VID_COUNT) == 0 && GetVidData(964, VID_COUNT) == 0)
		return;
	//
	int iSrchState = 0;
	int spr;
	for(spr = FirstInBox(0, -ToScreenY(0), 1024, 768-ToScreenY(0)); spr; spr = NextInBox() )
	{
		if(GetUnitVid(spr)==963)
			iSrchState = iSrchState | 1;
		else
		if(GetUnitVid(spr)==964)
			iSrchState = iSrchState | 2;
	}
	//
	if(iSrchState)
	{
		if(iSrchState == 1)	//если только вкл-кнопки
		{
			giColSpeedZ = -1;
			SetVidData(970, VID_SIZE_Z, 60);
		}
		else
		{
			giColSpeedZ = 1;
			SetVidData(970, VID_SIZE_Z, 260);
		}
	}
	//
	static int iPrevMove = 0;
	int iCurMove = 0;
	if(giColSpeedZ)
	{
		giCurColZ = giCurColZ + 50 * giColSpeedZ * giLastTactTime;
		if(giCurColZ > 0)
		{
			giCurColZ = 0;
			giColSpeedZ = 0;
		}
		else
		if(giCurColZ < -200 * 1000)
		{
			giCurColZ = -200 * 1000;
			giColSpeedZ = 0;
		}
		if(giColSpeedZ != 0)
			iCurMove = giColSpeedZ;
		//
		for(spr = FirstInBox(0, -ToScreenY(0), 1024, 768-ToScreenY(0)); spr; spr = NextInBox() )
		{
			if(GetUnitVid(spr)==970)
				Action(spr, ACT_CHANGE_COOR, GetX(spr), GetY(spr), giCurColZ / 1000);
		}
	}
	//
	if(iCurMove && !iPrevMove)
	{
		if(iCurMove > 0)
			PlaySFX(61);
		else
			PlaySFX(55);
	}
	if(!iCurMove && iPrevMove)
	{
		StopSFX(55);
		StopSFX(61);
	}
	if(iCurMove && iPrevMove && iCurMove != iPrevMove)
	{
		StopSFX(55);
		StopSFX(61);
		if(iCurMove > 0)
			PlaySFX(61);
		else
			PlaySFX(55);
	}
	//
	iPrevMove = iCurMove;
}


//------------------------------------------------------------------------------------------
Level_9_5_Tact()
{
	//если на карте вообще золота нет - сваливаем
	if(!GetVidData(1306, VID_VALIDATE) || GetVidData(1306, VID_COUNT) == 0)
		return;
	//
	int ball;
	//
	if(!giWin95Time)
	{
		for(ball = FirstUnit(U_UNIT); ball; ball = NextUnit())
		{
			if( GetVidData(GetUnitVid(ball), VID_CLASS) == B_BALL)
			{
				int x = GetX(ball);
				int y = GetY(ball)-GetZ(ball);
				int gold = FindNearestSprite(GETSPRITE_VID+1306, x, y, 1000);
				if(gold)
				{
					int gX = GetX(gold);
					int gY = GetY(gold) - GetZ(gold);
					if( x >= gX-70 && x <= gX+70 && y >= gY-45 && y <= gY+45)
					{
						giWin95Time = GetTime();
						if(GetValI("MusicVolume","70") == 0)
							SetMusicVolume(70);
						PlayMusicFile(WIN_MUSIC, 0, 300);
						Genocide(972);
						Genocide(973);
						StopSFX(50);
						break;
					}
				}
			}
		}
	}

	//
	static int siMusicPlayedTime = 0;
	if(giWin95Time)
	{
		iff(1)
		{
			DestroyBalls();
			DeathOfCrystals();
		}
		//
		iff(GetKey() || (GetInputState() & INPUT_RCLICK) || (GetInputState() & INPUT_LCLICK))
		{
			bWin95Total = true;
		}
		//
		if(!bWin95Total && !IsPlayMusic())	//если музыка закончилась
		{
			if(!siMusicPlayedTime)
			{
				PlayMusicFile(WIN_MUSIC, 0, 300);
				siMusicPlayedTime = GetTime();
			}
			else
			if(GetTime() - siMusicPlayedTime > 500)	//задержка в 500 ms
				bWin95Total = true;
		}
	}
}


//------------------------------------------------------------------------------------------
//блеск от золота - хайдим в начале, показываем при разрушении замка 2-ой степени
F1300_14(int unit)
{
	SetVidData(1307, VID_NOT_CREATE_AS_CHILD, 1);
}
F1302_14(int unit)
{
	SetVidData(1307, VID_NOT_CREATE_AS_CHILD, 0);
}


//------------------------------------------------------------------------------------------
BeginCylMove()
{
	gbCurCylPos = !gbCurCylPos;
}

//------------------------------------------------------------------------------------------
CylinderTact()
{
	int spr = FindNearestSprite(GETSPRITE_VID + 415, -ToScreenX(0)+ScreenX()/2, -ToScreenY(0)+ScreenY()/2, 1024);
	if(!spr)
		spr = FindNearestSprite(GETSPRITE_VID + 434, -ToScreenX(0)+ScreenX()/2, -ToScreenY(0)+ScreenY()/2, 1024);
	if(!spr)
		return;
	//
	static int vid434MoveMask = 0;
	if(vid434MoveMask == 0 && GetVidData(434, VID_VALIDATE))
		vid434MoveMask = GetVidData(434, VID_MOVE_MASK);
	//
	static int siPrevTime = 0;
	if(!siPrevTime)
		siPrevTime = GetTime();
	//
	if(GetTime() - siPrevTime >= CYL_TACT_TIME)
	{
		BeginCylMove();
		siPrevTime = GetTime();
	}
	//
	if(gbCurCylPos && giCurCylZ != CYL_NEAREST_Z * 1000)
		giCylSpeedZ = -1;
	else
	if(!gbCurCylPos && giCurCylZ != 0)
		giCylSpeedZ = +1;
	//
	if(giCylSpeedZ)
	{
		giCurCylZ = giCurCylZ + CYL_SPEED_Z * giCylSpeedZ * giLastTactTime;
		if(giCurCylZ > 0)
		{
			giCurCylZ = 0;
			giCylSpeedZ = 0;
		}
		else
		if(giCurCylZ < CYL_NEAREST_Z * 1000)
		{
			giCurCylZ = CYL_NEAREST_Z * 1000;
			giCylSpeedZ = 0;
		}
		Action(spr, ACT_CHANGE_COOR, GetX(spr), GetY(spr), giCurCylZ / 1000);
	}
	//
	if(giCurCylZ != 0 && GetUnitVid(spr) != 434)
		Action(spr, ACT_CHANGE_VID, 434);
	if(giCurCylZ == 0 && GetUnitVid(spr) != 415)
		Action(spr, ACT_CHANGE_VID, 415);
	//
	if(giCylSpeedZ == 0 && giCurCylZ == CYL_NEAREST_Z * 1000)
		SetVidData(434, VID_MOVE_MASK, 0);
	else
		SetVidData(434, VID_MOVE_MASK, vid434MoveMask);
}


//------------------------------------------------------------------------------------------
//кнопка должна повреждаться только шариком
F963_DAMAGE(int unit,int beating_unit,int damage)
{
	int noDamage = false;
	//
	int vid = 0;
	//
	Log("button damage = " + itoa(damage) + ". beating_unit = " + itoa(beating_unit));
	if(beating_unit)
	{
		vid = GetUnitVid(beating_unit);
		Log("beating_unit vid= " + itoa(vid));
	}
	//
	if(!beating_unit)	//это значит, что от шарика damage пришел
	{
	}
	else
		noDamage = true;
	//
	return noDamage;
}
F964_DAMAGE(int unit,int beating_unit,int damage)
{
	return F963_DAMAGE(unit, beating_unit, damage);
}

