#define COMMON_DEFS_H aaa

#include "maps\const.lgc"

#ifndef I_SENDCOMMANDCONST_H
    #include "maps\iSendCommandConst.h"
#endif


//---------------------------------------------------------------------------
#define false               0
#define true                1
//---------------------------------------------------------------------------
#define bool                int

//------------------------------------------------------------------------------------------
#define STAT_TYPE_NORM				1
#define STAT_TYPE_FLY				2
#define STAT_TYPE_END				3
#define STAT_TYPE_TIP_END			4


//------------------------------------------------------------------------------------------
#define GAME_TYPE_COMPAIGN			0
#define GAME_TYPE_SURVIVE			1
#define GAME_TYPE_ADDON				2
#define GAME_TYPE_ADDON2			3
#define GAME_TYPE_GUN_STAND			4

//
#define SKILLS_CNT				4

//------------------------------------------------------------------------------------------
int LevelNumber;          // номер проигрываемого в данный момент уровня
int giGame_Type = 0;
static int gbState_Bar=0;//состояние информационной игровой панели
static string gsPlayer_Sex;        //пол персонажа
int PlayerMoney=0;
int PlayerScores = 0;
static string PlayerItems;      //вещи игрока сохраненные перед его смертью
int PlayerItem[12];//количество вещей [nVid-720] у игрока 0-3 имплантанты, 4-6 , броня, 7 жизни, 8 фонарик, 9 ночное видение, 10 аптечка, 11 дрон
static string PlayerName;
static string ExpPoints;
//
static bool bCheatWin = false;
static bool bCheatFly = false;
bool bGameIsPaused = false;
int giFromPauseTime = 0;
bool bDeathByBoss = false;	//при смерти от босса не убиваем шарик
//int giEarthQuakeEndTime = 0;
int giOldScores        = 0; // нужна для обновления очков
int gScoreBonus       = 0; // очки заработанные игроком за бонусы
int giCrystalScore = 0;
int giGoldScore1 = 0;
int giGoldScore2 = 0;
int giGoldScore3 = 0;
int giTotalMedals = 0;
int giLastTactTime = 0;
string NoPlayerLife  = "3"; // количество шариков жизней у игрока в запасе
int giCrystOnLev = 0;
int giCrystSubLevScore = 0;
int giCrystLevScore = 0;
bool giCrystSubLevScore2 = 0;
int giBigCrystHit = 0;
bool bWin95Total = false;		//усё, можно перегружать
bool gbShowDbg = false;
int giBornTime = 0;
bool gbVehiFlying = false;
bool gbGoldCoins = false;
int giBonusSubLevScore = 0;
int giBonusSubLevTotal = 0;
static bool bPlayVehiMove = false;
int StartGameTime    = 0; // время начала игры
int StartBallLevelTime   = 0; // время первого запуска шарика на подуровне
int giBornLifeFxTime = 0;
//
int giWinTime = 0;
int giSubLevelNum    = 0;
string giScoresLev   = "0"; // очки заработанные игроком на данном уровне
bool gbCheatAllObjDeath = false;
//
int giExpa = 0;
int giExpLevels = 0;
int giSkills[SKILLS_CNT];
//
int giHeroSpeedDecr1000 = 0;
//
//int ciFreezeBulletDamage = 0;
int giPlayerMaxSpeed0 = 0;
static int giExplChargePrcnt = 0;
static int giSurviveBeforeBoss = 0;// 0 - 250 до рождения следующего босса

//------------------------------------------------------------------------------------------
static int giUnFreezeTime = 0;	//если не 0, то тележка щас заморожена
static int giFreezeEffect = 0;

int MenuNoPlayerLife = 0; // ссылка на спрайт отображающий количество оставшихся жизней
int MenuNoPlayerLifeBar = 0;
int MenuScores       = 0; // ссылка на спрайт отображающий количество заработанных очков на уровне
int MenuScoresTotal  = 0; // ссылка на спрайт отображающий количество заработанных очков
int MenuHelpText     = 0; // ссылка на строку текста призывающего нажать F1 для помощи на первом уровне
int MenuGameTime     = 0; // ссылка на спрайт отображающий игровое время
int MenuBallSpeed    = 0; // ссылка на спрайт отображающий скорость шарика
int MenuBallSpeedBar = 0;
int MenuCrystals     = 0; // ссылка на спрайт отображающий кристаллы
int MenuCrystalsBar  = 0; //
int MenuCrystalsAddLifeX = 0;
int MenuCrystalsAddLifeY = 0;
int MenuCrystalsAddLifeZ = 0;
static int gibCheatUpgrade[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
int giHeroDmgKoef100 = 100;
int giBossKillTime = 0;
int giStartTimeLimitTime = -1;

//используется и в игре тоже
static int WpnUpgrade[11];
//------------------------------------------------------------------------------------------
bool gbCheatVar1 = false;

//------------------------------------------------------------------------------------------
ShowGameBarLives();
ChangeGameBarTexts(bool hide);
GetBonusLevTime();
ShowStatistics(int iType);
HideHoFTexts(int hide, int iFromRecNum);
AddAmmo(int n_weapon,int no_ammo);
Win();
IsBox(int unit);
ResetSkills();
CreateStateBar();

CreateItemsForBirth0(int unit);
CreateItemsForBirth1(int unit);
CreateItemsForBirth2(int unit);
CreateItemsForBirth3(int unit);
CreateItemsForBirth4(int unit);
CreateItemsForBirth5(int unit);
CreateItems(int unit);
AddScores(int unit);
TurnOnFlashIfNeed();
WaterDown();
Create962IfNeeded();
SetLevelGamma(int iGamma);


#define AL_NONE				0
#define AL_BONUS			1
#define AL_CRYSTALS			2
#define AL_FLYSTAT			3

//AddLife(int iType);
Animate20Crystals(bool bBornFx);
AnimateAddLife();
GameBarTact();
HeroSpeedTact();
ResetHeroSpeed();

//------------------------------------------------------------------------------------------
sgn(int a)
{
  if( a < 0 )
    return -1;
  return 1;
}

//------------------------------------------------------------------------------------------
Log2(string str)
{
	str = itoa(GetTime()) + ". " + str;
	Log(str);
}


//------------------------------------------------------------------------------------------
//Возвращает 1 приблизительно один раз в секунду
//при вызове в одном такте данной функции повторно
//она все равно вернет то-же значение что и в первый вызов
OneTimeInSecond()
{
  static int old_time=0;
  if( (GetTime()-old_time) > 1023 || old_time > GetTime() )
    old_time = GetTime();
  if( GetTime()==old_time )
    return 1;
  return 0;
}


//------------------------------------------------------------------------------------------
OneTimeInQuarterSecond()
{
    static int old_time=0;
    if( (GetTime()-old_time) > 255 || old_time > GetTime() )
        old_time=GetTime();
    if( GetTime()==old_time )
        return 1;
    return 0;
}


//------------------------------------------------------------------------------------------
/*GetLevArrNum()
{
	if(LevelNumber-2 >= 0 && LevelNumber-2 < MAX_LEVEL)
		return LevelNumber-2;
	else
		return 0;
}*/


//------------------------------------------------------------------------------------------
Pause2(bool bPause)
{
	bGameIsPaused = bPause;
	Pause(bPause);
}


//------------------------------------------------------------------------------------------
IsDying(int unit)
{
	if(!unit || GetAnimation(unit)==ANI_DEATH || GetAnimation(unit)==ANI_DEATH2)
		return true;
	return false;
}


//------------------------------------------------------------------------------------------
/*EarthQuake(int iLen)
{
	SetEnvironment(ENV_EARTHQUAKE);
	giEarthQuakeEndTime = GetTime() + iLen;
}*/


//------------------------------------------------------------------------------------------
UtilsTact()
{
	static int iPrevTime = 0;
	if(iPrevTime != 0)
		giLastTactTime = GetTime() - iPrevTime;
	iPrevTime = GetTime();
	//
/*	if(giEarthQuakeEndTime && GetTime() >= giEarthQuakeEndTime)
	{
		SetEnvironment(ENV_STOP|ENV_EARTHQUAKE);
		giEarthQuakeEndTime = 0;
	}*/
}


//------------------------------------------------------------------------------------------
Call_iiss(int id, int var1, int var2, string str1, string str2)
{
	return SendCommand2(id, var1, var2, str1, str2);
}


//------------------------------------------------------------------------------------------
Call_i(int id, int var1)
{
	return SendCommand2(id, var1, 0, "", "");
}


//------------------------------------------------------------------------------------------
Call_ii(int id, int var1, int var2)
{
	return SendCommand2(id, var1, var2, "", "");
}


//------------------------------------------------------------------------------------------
Call_v(int id)
{
	return SendCommand2(id, 0, 0, "", "");
}


//------------------------------------------------------------------------------------------
Call_s(int id, string str1)
{
	return SendCommand2(id, 0, 0, str1, "");
}


//------------------------------------------------------------------------------------------
Call_si(int id, string str1, int var1)
{
	return SendCommand2(id, var1, 0, str1, "");
}


//------------------------------------------------------------------------------------------
Call_sii(int id, string str1, int var1, int var2)
{
	return SendCommand2(id, var1, var2, str1, "");
}


//------------------------------------------------------------------------------------------
Call_ss(int id, string str1, string str2)
{
	return SendCommand2(id, 0, 0, str1, str2);
}


//------------------------------------------------------------------------------------------
Call_is(int id, int var1, string str1)
{
	return SendCommand2(id, var1, 0, str1, "");
}


//------------------------------------------------------------------------------------------
Call_iss(int id, int var1, string str1, string str2)
{
	return SendCommand2(id, var1, 0, str1, str2);
}


//------------------------------------------------------------------------------------------
Call_isi(int id, int var1, string str1, int var2)
{
	return SendCommand2(id, var1, var2, str1, "");
}


//------------------------------------------------------------------------------------------
SetValI2(bool bLevel, string ParamName, int val)
{
	if(!bLevel)
		Call_isi(EXT_SetArgValI, 0, ParamName, val);
	else
		Call_isi(EXT_SetArgValI, 2, ParamName, val);
}


//------------------------------------------------------------------------------------------
GetValI2(bool bLevel, string ParamName, int DfltVal = 0)
{
	if(!bLevel)
		return Call_isi(EXT_GetArgValI, 0, ParamName, DfltVal);
	else
		return Call_isi(EXT_GetArgValI, 2, ParamName, DfltVal);
}


//------------------------------------------------------------------------------------------
SetValS2(bool bLevel, string ParamName, string val)
{
	if(!bLevel)
		Call_iss(EXT_SetArgValS, 0, ParamName, val);
	else
		Call_iss(EXT_SetArgValS, 2, ParamName, val);
}


//------------------------------------------------------------------------------------------
GetValS2(bool bLevel, string ParamName, string DfltVal = "")
{
	if(!bLevel)
		return Call_iss(EXT_GetArgValS, 0, ParamName, DfltVal);
	else
		return Call_iss(EXT_GetArgValS, 2, ParamName, DfltVal);
}


//------------------------------------------------------------------------------------------
SetGlobValI(string ParamName, int val)
{
	Call_isi(EXT_SetArgValI, 1, ParamName, val);
}


//------------------------------------------------------------------------------------------
GetGlobValI(string ParamName, int DfltVal = 0)
{
	return Call_isi(EXT_GetArgValI, 1, ParamName, DfltVal);
}


//------------------------------------------------------------------------------------------
SetGlobValS(string ParamName, string val)
{
	Call_iss(EXT_SetArgValS, 1, ParamName, val);
}


//------------------------------------------------------------------------------------------
GetGlobValS(string ParamName, string DfltVal = "")
{
	return Call_iss(EXT_GetArgValS, 1, ParamName, DfltVal);
}


//------------------------------------------------------------------------------------------
Log3(string str)
{
	Call_s(EXT_LogStr, str);
}


//------------------------------------------------------------------------------------------
CreateEffectLink( int iUnit, int iVid, int iZ )
{
	if(!iUnit)
		return 0;
	return CreateSprite( iVid, GetX(iUnit), GetY(iUnit), GetZ(iUnit) + iZ, GetDirection(iUnit), iUnit );
}


//------------------------------------------------------------------------------------------
CreateEffect( int iUnit, int iVid, int iZ )
{
	if(!iUnit)
		return 0;
	return CreateSprite( iVid, GetX(iUnit), GetY(iUnit), GetZ(iUnit) + iZ, GetDirection(iUnit), 0 );
}


//------------------------------------------------------------------------------------------
DeleteEffectLink( int iUnit, int iVid )
{
	if(!iUnit)
		return;
	//
	int link;
	for( link = Action( iUnit, ACT_GET_LINK ); link; link = Action( link, ACT_GET_LINK ) )
	{
		if( GetUnitVid( link ) == iVid )
		{
			Action(link, ANI_DEATH);
			break;
		}
	}
}


//------------------------------------------------------------------------------------------
/*DestroyBalls()
{
	int i;
	for ( i = FirstUnit(U_UNIT); i; i = NextUnit() )
	{
		if ( GetVidData(GetUnitVid(i), VID_CLASS) == B_BALL )
		{
//			Action( Action(i, ACT_GET_LINK), ACT_SET_LINK, CreateSprite(509, GetX(i), GetY(i), GetZ(i + 1)) );
			CreateSprite(509, GetX(i), GetY(i), GetZ(i + 1));
			Action(i, ACT_STOP, 1);// 1 чтобы остановился мнгновенно
			Action(i, ACT_SET_DEATH_TIMER, 1500);
		}
	}
}*/


//------------------------------------------------------------------------------------------
GetVidOnScreen(int iVid)
{
	int i;
	i = FirstInBox(0, -ToScreenY(0), 1024, 768-ToScreenY(0));
	while(i)
	{
		if(GetUnitVid(i) == iVid)
			return i;
		i = NextInBox();
	}
	return 0;
}


//------------------------------------------------------------------------------------------
AddLifeEx(int d)
{
	bool ret = true;
	//
/*	NoPlayerLife = NoPlayerLife + d;
	if(NoPlayerLife > MAX_LIVES_COUNT)
	{
		NoPlayerLife = MAX_LIVES_COUNT;
		ret = false;
	}
	if(NoPlayerLife < 0)
	{
		NoPlayerLife = 0;
		ret = false;
	}
	//
	ShowGameBarLives();*/
	//
	return ret;
}

//---
DecLife() { return AddLifeEx(-1); }	//for debug

//------------------------------------------------------------------------------------------
GetAbsDir(int iVid, int iDir)
{
	return Call_ii(EXT_GetAbsDir, iVid, iDir);
}


//------------------------------------------------------------------------------------------
/*ChangeGameBarTexts(bool hide)
{
	int newVid = 3;
	if(hide)
		newVid = 9;
	//
	Action(MenuNoPlayerLife, ACT_CHANGE_VID, newVid);
	Action(MenuScores, ACT_CHANGE_VID, newVid);
	Action(MenuScoresTotal, ACT_CHANGE_VID, newVid);
	Action(MenuHelpText, ACT_CHANGE_VID, newVid);
	Action(MenuGameTime, ACT_CHANGE_VID, newVid);
	Action(MenuBallSpeed, ACT_CHANGE_VID, newVid);
	Action(MenuCrystals, ACT_CHANGE_VID, newVid);
}
*/

//------------------------------------------------------------------------------------------
HideGameBarForMenu(int hide)
{
	/*SetVidData(473, VID_HIDE, hide);
	SetVidData(474, VID_HIDE, hide);
	SetVidData(480, VID_HIDE, hide);
	SetVidData(746, VID_HIDE, hide);
	SetVidData(760, VID_HIDE, hide);
	SetVidData(764, VID_HIDE, hide);
	ChangeGameBarTexts(hide);*/
}


//------------------------------------------------------------------------------------------
HideObjectsForMenu(int hide)
{
    int i;
    for( i = 9; i < 4096; i++)
    {
        if(GetVidData(i, VID_VALIDATE))
        {
            if(/*(GetVidData(i, VID_PROPERTY) & 0x8000) && */GetVidData(i, VID_SPRITETYPE) != U_MENU)
            {
            	if(i != 755 && i != 756 && i != 757)
	                SetVidData(i, VID_HIDE, hide);
//                Log(itoa(i) +" " +GetVidData(i, VID_NAME) + " "+itoa(GetVidData(i, VID_SPRITETYPE)));
            }
		}
	}
	//SetVidData(1008, VID_HIDE, hide);
	//SetVidData(1009, VID_HIDE, hide);
	//SetVidData(785, VID_HIDE, hide);
	//*zm070206
	//HideGameBarForMenu(hide);
}


//------------------------------------------------------------------------------------------
GetRankName(int iRank)
{
	string ret = "";
	if(Z_DEBUG)
		ret = itoa(iRank);
	//
	if(iRank < 0)
		iRank = 0;
	if(iRank > 12)
		iRank = 12;
	//
	string str = "RANK_"+Printf("%02d", iRank);
	ret = ret + GetString("menu", str);
	return ret;
}


//-----------------------------------------------------------------
CountAlpha( int Alpha1, int Alpha2, int time )
{
	return Alpha1 + time * ( Alpha2 - Alpha1 ) / 255;
}


