#ifndef COMMON_DEFS_H
    #include "maps\common_defs.lgc"
#endif

#include "maps\common_table.lgc"

#ifndef COMMON_RADAR_H
    #include "maps\common_radar.lgc"
#endif

#ifndef UTIL_DAMAGEFRAME_H
    #include "maps\util_damageframe.lgc"
#endif

#define FADE_GAME_TIME        1000 //время для перехода между менюшками при помощи fade

#define ADRENALIN_BONUS_DELAY 10000
#define SPEEDUP_BONUS_DELAY   10000
#define SPEEDDOWN_BONUS_DELAY 10000
#define DRON_FLY_HEIGHT       20

#define GAME_NORMAL           0
#define GAME_WIN              1
#define GAME_PLAYER_DEAD      2
#define GAME_LOOSE            3
#define GAME_STATISTICS       5

//#ifndef MUSIC0
//#define MUSIC0 "music\\mus00.ogg"
//#endif
//#ifndef MUSIC1
//#define MUSIC1 "music\\mus01.ogg"
//#endif
//#ifndef MUSIC2
//#define MUSIC2 "music\\mus02.ogg"
//#endif

//время, когда игра перейдет на след. уровнеь после выигрыша (для того, чтобы space не нажимать)
static int WinTime = 0;

//можно ли автоматически включать фонарик и ночное видение при смене гаммы
static int FlashAutoChange = 1;

//static int StartGameTime;       //время начала игры
static int StartPlayerX=0,StartPlayerY=0,StartPlayerZ=0;
static int StartEarthQuake=0,DelayEarthQuake;//время начала и длительность землетряски
static int PlayerInGunTime=0;   //время когда игрок сел в пушку
static int CurrentGamma=0;      //установленная в игре в данный момент гамма
static int DoorsIsOpen=1;       //двери на уровне не работают если 0
static int AdrenalinBeginTime=0;//время подбора бонуса адреналин
static int SpeedUpBeginTime=0;  //время подбора бонуса ускорения времени
static int SpeedDownBeginTime=0;//время подбора бонуса замедления времени
static int StartNextMap=0;      //время для начала отсчета для загрузки следующей карты
static string NextMapName;      //имя загружаемого файла
static int PlayerShadow=0;      //спрайт тени игрока
int PlayerArmorHp = 0;          // hp бронежидлета для залезания в пушку
int PlayerExplosive=0;//количество взрывчатки у игрока
int PlayerScoresTact=0;//число очков набранных игроком за последний такт
int FindPeople = 0;// осталось спасти людей для дополнительной миссии
static int OptionsOn = 0;
static int HelpOptions = 0;
static int HelpText = 0;
static int GameState = GAME_NORMAL;// см. #define GAME_XXX
static int PrevGameState = 0;   //для отображения статистики и хранения, какой GameState должен быть реально

static int MusicFileNumber;//в данный момент проигрывается музыка номер MusicFileNumber
string     MusicFile;      // в данный момент проигрывается файл MusicFile (не считая музыки в меню)
static int ArrowHint=0;//стрелка подсказки куда идти


#ifndef UTIL_EXP_H
    #include "maps\util_exp.lgc"
#endif

#ifndef UTILHELP_H
    #include "maps\util_help.lgc"
#endif

#ifndef COMMON_LOADSAVE_H
    #include "maps\common_loadsave.lgc"
#endif

#ifndef UTIL_BOXES_H
    #include "maps\util_boxes.lgc"
#endif

#ifndef COMMON_LIGHT_H
    #include "maps\common_light.lgc"
#endif


//zmnew 2004Aug27
IsBossVid( int iVid )
{
    int ret;
    ret = 0;
    if( iVid >=800 && iVid <= 880 )
        ret = 1;
    return ret;
}


AddCoorX(int unit,int dx)
{
  Action( unit,ACT_CHANGE_COOR,GetX(unit)+dx,GetY(unit),GetZ(unit) );
}

EarthQuake(int delay)
{
  StartEarthQuake = GetTime();
  DelayEarthQuake = delay;
  SetEnvironment(ENV_EARTHQUAKE);
}

LoadNextMap(string name)
{
  //
  int t = FADE_GAME_TIME;
  if(giBossKillTime)
    t = 3000;
  //
  Log( "LoadNextMap " + name + " .t = " + itoa(t));
  //
  Effect(EFF_FADE,0,0,t);
  //
  NextMapName = name;
  StartNextMap = GetTime();
}


/*LoadNextMap(string name)
{
  Log( "LoadNextMap " + name);
  Effect(EFF_FADE,0,0,FADE_GAME_TIME);
  NextMapName = name;
  StartNextMap = GetTime();
}*/


//установка первоначальных параметров игрока при перерождении
SetInitialGameParameters(bool bOnMapLoad)
{
	int i,link;
	AdrenalinBeginTime = 0;
	SpeedUpBeginTime   = 0;
	SpeedDownBeginTime = 0;
	//
	for( i = 0; i < WPN_CNT; i++ )
		WpnUpgrade[i] = GetValI2(true, "WpnUpgrade"+itoa(i),0);
	ResetSkills();
	//
	// Установка патронов и оружия игрока
	for( i = 0; i < WPN_CNT; i++ )
	{
		if( GetValI2(true, "PlayerWeapon"+itoa(i),0) )
			Action(Flagman(0),ACT_ADD_ITEM,260+i);
		Action(Flagman(0),ACT_ADD_AMMO,
			GetValI2(true, "PlayerAmmo"+itoa(i),0) - Action(Flagman(0),ACT_GET_AMMO,i),i);
	}
	// Установка прочих вещей игрока
	for( i = 0; i< ITEM_CNT; i++ )
		PlayerItem[i] = GetValI2(true, "PlayerItem"+itoa(i),0);
	if( PlayerItem[730-720] )//аптечка спасательная
		Action(Flagman(0),ACT_ADD_ITEM,230);
	if( PlayerItem[731-720] )//дрон
		CreateSprite(290,GetX(Flagman(0)),GetY(Flagman(0)),GetZ(Flagman(0))+DRON_FLY_HEIGHT,GetDirection(Flagman(0)));
	for( i = 6; i >=4; i-- )//бронежилеты
	{
		if( PlayerItem[i] )
		{
			link = Action(Flagman(0),ACT_GET_LINK);
			if( gsPlayer_Sex=="male" )
				CreateSprite(i+196,GetX(link),GetY(link),GetZ(link),GetDirection(link),link);
    		else if ( i == 6 )
				CreateSprite(i+196,GetX(link),GetY(link),GetZ(link) - 1,GetDirection(link),link);
			else
				CreateSprite(i+196,GetX(link),GetY(link),GetZ(link) - 4,GetDirection(link),link);
			break;
		}
	}
	TurnOnFlashIfNeed();
	ResetInfection();
}
SetVidColor()
{
    int i;
    for ( i = 0; i < sizeof(ReColorUnit)/4; i++ )
    {
        SetVidData(ReColorUnit[i], VID_RECOLORUNIT, ReColorColor[i]);
    }
}
SetVidColorBlood(int red)// red != 0 - red blood
{
    int i;
    if ( red || !USE_GREEN_BLOOD )
    {
        for ( i = 0; i < sizeof(ReColorUnitBlood)/4; i++ )
            SetVidData(ReColorUnitBlood[i], VID_RECOLORUNIT, RECOLOR_BLOOD_RED);
    }
    else
    {
        SetVidData(110,VID_EXCHANGEVID,166);
        SetVidData(120,VID_EXCHANGEVID,167);
        SetVidData(151,VID_EXCHANGEVID,197);
//      SetVidData(152,VID_EXCHANGEVID,198);
        SetVidData(756,VID_EXCHANGEVID,755);
        SetVidData(758,VID_EXCHANGEVID,757);
        SetVidData(916,VID_EXCHANGEVID,918);
        for ( i = 0; i < sizeof(ReColorUnitBlood)/4; i++ )
            SetVidData(ReColorUnitBlood[i], VID_RECOLORUNIT, RECOLOR_BLOOD_GREEN);
    }
}

#include "maps\common_menu.lgc"
#include "maps\common_weather.lgc"
#include "maps\common_fame.lgc"
#include "maps\common_statebar.lgc"
#include "maps\items.lgc"

#ifndef COMMON_ACTION_H
	#include "maps\common_action.lgc"
#endif

#include "maps\common_event.lgc"

//LoadNextMap(string name)
//{
//  Effect(EFF_FADE,0,0,FADE_GAME_TIME);
//  NextMapName = name;
//  StartNextMap = GetTime();
//}
Win()
{
	Destroy(ArrowHint); ArrowHint = 0;//уничтожить стрелку подсказки
//  Genocide(908);//убить генераторы монстров 
//  CreateText(3,ScreenX()/2,ScreenY()/2+150,0,GetString("menu","MissionComplete"),BEH_CENTER);
//  CreateText(3,ScreenX()/2,ScreenY()/2+170,0,GetString("menu","SpaceBar"),BEH_CENTER);

//  SavePlayer("");
//  LoadNextMap( "maps\\shop.map" );
	if(NOT_SHOW_STATISTICS)
	{
		GameState = GAME_WIN;
		if(DEMO_VERSION)
		{
			//MenuRelease();
			//CreateSprite(951, ScreenX()/2, ScreenY()/2 + 5000, 5000);
			//Pause(1);
			LoadNextMap("maps\\slide.map");
		}
	}
	else
	{
		PrevGameState = GAME_WIN;
		GameState = GAME_STATISTICS;  //zmNEW
	}
}


ReloadVidAndSetVidParameters()
{
  int i;
  //устанавливаем игроку пистолеты для начала уровня
//  SetVidData(9,VID_LINK,11);

  //
  // переустановка всех VID параметров
  ReloadVid();
  SetVidColor();
  SetVidColorBlood(GetGlobValI("Blood","1"));
  if(gsPlayer_Sex=="female")
  {//если игрок играет теткой
    for( i = 9; i <= 20; i++ )
      SetVidData(i,VID_EXCHANGEVID,540+i);
    //SetVidData(352,VID_EXCHANGEVID,358);//на пушке
  }
  SetGraphLevel();
  RememberInitialVidValues();
  // установка параметров купленных имплантантов
  /*for( PlayerItem[0] = 0; PlayerItem[0] < GetValI("PlayerItem0",0); )
    F242_0(0);
  for( PlayerItem[1] = 0; PlayerItem[1] < GetValI("PlayerItem1",0); )
    F243_0(0);
  for( PlayerItem[2] = 0; PlayerItem[2] < GetValI("PlayerItem2",0); )
    F244_0(0);
  for( PlayerItem[3] = 0; PlayerItem[3] < GetValI("PlayerItem3",0); )
    F245_0(0);*/
  //
  int DifficultyLevel = GetValI2(false, "DifficultyLevel",1);
  if ( LevelNumber > 0 )  //типа не survive
  {
    for ( i = 0; i < sizeof(MonstersVid)/4; i++ )
    {
      int hp = GetVidData(MonstersVid[i], VID_MAXHP);
      if ( DifficultyLevel == 0 )
        SetVidData(MonstersVid[i], VID_MAXHP, hp - hp/2);
      else if ( DifficultyLevel == 2 )
        SetVidData(MonstersVid[i], VID_MAXHP, hp + hp/2);
    }
    //
    if ( DifficultyLevel == 0 )
      giHeroDmgKoef100 = HERO_DAMAGE_COEFF_EASY;
    else if ( DifficultyLevel == 2 )
      giHeroDmgKoef100 = HERO_DAMAGE_COEFF_HARD;
    //
    Log2("DifficultyLevel = " + itoa(DifficultyLevel));
  }
}
InitGame()
{
  int i,unit;
  SetCursor(CURSOR_ATTACK);
  HideObjectsForMenu(0);
  //
  LoadCurData();
  ReloadVidAndSetVidParameters();
  CurrentGamma     = GetGamma();
  StartGameTime    = GetTime();
  PlayerExplosive  = 0;
  PlayerItems      = "";
  // Поиск первоначального положения персонажа в игре
  for( unit=FirstUnit(U_UNIT); unit; unit=NextUnit() )
    if( GetUnitVid(unit)==9 || GetUnitVid(unit)==549 )
    {
      StartPlayerX=GetX(unit); StartPlayerY=GetY(unit); StartPlayerZ=GetZ(unit);
      Destroy(unit);
      unit = CreateSprite(9,StartPlayerX,StartPlayerY,StartPlayerZ);
      SetFlagman(0,unit);
      break;
    }
  SetInitialGameParameters(true);
  PlayerShadow = CreateSprite(108,StartPlayerX,StartPlayerY,StartPlayerZ);

//  SetVidData(59,VID_GAMMA+1,0xEEDA80);
  MusicFileNumber=2;
//  PlayMusicFile(MUSIC0,1);
  SetScrollType(SCROLL_TO_FLAGMAN_WITH_DIRECTION);
  FindPeople = GetVidData(560, VID_COUNT) + GetVidData(562, VID_COUNT) + GetVidData(564, VID_COUNT) + GetVidData(566, VID_COUNT);
  CreateStateBar();
  InitHpFrameSprite();
//  Effect(EFF_FADE_OUT,0);
  // устанавливаем черные гаммы для некотрых менюшек
  for( i = 0; i < 10; i++ )
    SetVidData(731+i,VID_GAMMA+1,0x7f7f7f);
  for( i = 0; i < 12; i++ )
    SetVidData(720+i,VID_GAMMA+1,0x7f7f7f);
  SetVidData(748,VID_GAMMA+1,0x7f7f7f);//гамма для динамита
  // для первого уровня сохраним параметры игрока
  //видимо чтобы после магазина сохранялось zm070327
  //if( LevelNumber==1 && giGame_Type != GAME_TYPE_SURVIVE )
  //  SaveCurData(false);
  HelpText = CreateText(3, ScreenX()/2, ScreenY()-HELP_TEXT_BTM_SCRENN, 0, GetString("menu", "Help"), BEH_CENTER);
  //
  RememberStat();//zmNEW_20050712
  WeatherInit();
  AssignOptions();
  GenExpLevelsIfNeed();
  //
  VariousInitialize();
}

GameTact()
{
  int        i,menu,link;
  static int last_kill = -10000;
  if( PlayerScoresTact )
    last_kill = GetTime();
  //
  UtilsTact();
  CheatsTact();
  //
	if(DEMO_VERSION && TIME_LIMIT_FOR_DEMO != 0)
	{
		static int sTimeText = 0;
		string str;
		//
		int beginTime = -1;
		if(LevelNumber < 0 )
			beginTime = StartGameTime;
		else if(giStartTimeLimitTime >= 0 )
			beginTime = giStartTimeLimitTime;
		//
		if(beginTime >= 0)
		{
			int dt = TIME_LIMIT_FOR_DEMO*1000 - (GetTime() - beginTime);
			if(dt <= 0)
			{
				str = GetString("menu","PlayTime");
				iff(dt <= -5000)
					LoadNextMap("maps\\slide.map");
			}
			else
			if(dt <= 10000)
			{
				//
				dt /= 1000;
				str = Printf( "%02d", dt / 60 ) + ":" + Printf( "%02d", dt % 60 );
			}
			if(!sTimeText)
				sTimeText = CreateText(3,ScreenX()/2,70,0,"",BEH_CENTER);
			else
				Action(sTimeText, ACT_SET_TEXT, &str);
		}
	}
  //
  PlayerScores += PlayerScoresTact;
  PlayerScoresTact = 0;
  iff ( HelpText && (GetTime() - StartGameTime) > 10000 )
  {
    Destroy(HelpText);
    HelpText = 0;
  }
  if( StartNextMap )
    if( GetEffectState(EFF_FADE) > 45 )
    {
      if( NextMapName=="options" )
      {
        SetCursor(CURSOR_NORMAL);
        if ( HelpOptions )
        {
          MenuRelease();
          CreateSprite(746, ScreenX()/2, ScreenY()/2 + 300, 300);
          CreateSprite(949, ScreenX()/2, ScreenY()/2 + 301, 301);
        }
        else
          CreateOptionsMenu("maps\\gamemenu.men");
        StartNextMap = 0;
        OptionsOn    = 1;
        SetVidData(203, VID_HIDE, 1);
        SetVidData(226, VID_HIDE, 1);
        SetScrollType(0);
        PlayMusicFile("music\\menu_mus.ogg", 1);
        HideObjectsForMenu(1);
      }
      else if( NextMapName=="game" )
      {
        SetCursor(CURSOR_ATTACK);
        SetGraphLevel();
        MenuRelease();
        CreateStateBar();
        StartNextMap = 0;
        OptionsOn    = 0;
        HelpOptions  = 0;
        Pause(0);
        SetVidData(203, VID_HIDE, 0);
        SetVidData(226, VID_HIDE, 0);
        SetScrollType(SCROLL_TO_FLAGMAN_WITH_DIRECTION);
        if( GameState == GAME_WIN )
        {
          CreateText(3,ScreenX()/2,ScreenY()/2+150,0,GetString("menu","MissionComplete"),BEH_CENTER);
          CreateText(3,ScreenX()/2,ScreenY()/2+170,0,GetString("menu","SpaceBar"),BEH_CENTER);
        }
        if ( MusicFile == Musics[2] || MusicFile == Musics[3] )
            PlayMusicFile(MusicFile, 0);
        else
            PlayMusicFile(MusicFile, 1);
        HideObjectsForMenu(0);
      }
      else
      {
        SetVidData(203, VID_HIDE, 0);
        SetVidData(226, VID_HIDE, 0);
        if ( giGame_Type == GAME_TYPE_ADDON )
            PlayerMoney += LevelMoneyAddon[LevelNumber];
        else if ( giGame_Type == GAME_TYPE_ADDON2 )
            PlayerMoney += LevelMoneyAddon2[LevelNumber];
        else
        {
            PlayerMoney += LevelMoney[LevelNumber];
            if ( FindPeople == 0 )
                PlayerMoney += LevelMoneyAdd[LevelNumber];
        }
        ++LevelNumber;
        // не сохраняем параметры игрока при survive игре
//        if( !giGame_Type )
        // сохраняем параметры ингрока только в случае его победы на уровне
        if( NextMapName=="maps\\shop.map" )
          SaveCurData2(SCD_WIN);
        if( NextMapName=="maps\\mainmenu.map" || NextMapName=="maps\\end.map" )
          SaveFame();
        Pause(0);
//        StopSFX(10);//остановить топот ног
        StopMusic(0);
        MusicFileNumber=3;
        PlayMusicFile("music\\menu_mus.ogg", 1);
        HideObjectsForMenu(0);
//        if( NextMapName=="maps\\mainmenu.map" )//for demo
//            Load("maps\\slide.map");
//        else
            Load(NextMapName);
      }
    }

  if( OneTimeInSecond() )
  {
    // смена музыкальной темы после первого убийства врага
    iff( LevelNumber < 0 && (GetTime() - last_kill) < 2000 && !OptionsOn )
    {
      MusicFile = Musics[2];  
      PlayMusicFile(Musics[2],1);
    }
/*    if( (GetTime() - last_kill) < 2000 && MusicFileNumber==2 && !OptionsOn )
    {
      MusicFileNumber = 0;
      PlayMusicFile(MUSIC1,0);
    }
    if( !IsPlayMusic() && MusicFileNumber != 3 )
    {
      if( (GetTime() - last_kill) > 30000 || OptionsOn )
      {
        MusicFileNumber = 2;
        PlayMusicFile(MUSIC0,1);
      }
      else if( MusicFileNumber )
      {
        MusicFileNumber = 0;
        PlayMusicFile(MUSIC1,1);
      }
      else
      {
        MusicFileNumber = 1;
        PlayMusicFile(MUSIC2,1);
      }
    }*/
    if ( !IsPlayMusic() && !OptionsOn )
    {
        if ( MusicFile == Musics[2] )
            MusicFile = Musics[3];
        else if ( MusicFile == Musics[3] )
            MusicFile = Musics[2];
        PlayMusicFile(MusicFile,0);
    }
  }

  if ( OptionsOn )
  {
    if ( HelpOptions )
    {
      if ( GetKey() || (GetInputState() & (INPUT_RCLICK | INPUT_LCLICK)) )
         LoadNextMap("game");//на самом деле это не загрузка а просто выход из меню
      return 1;
    }
    TactOptionsMenu();
    if ( MenuLClick() && MenuNVidUnderCursor()==705 )
      if ( Action(MenuLClick(), ACT_GET_NAME) == "back" )
        LoadNextMap("game");//на самом деле это не загрузка а просто выход из меню
      else if ( Action(MenuLClick(), ACT_GET_NAME) == "mainmenu" )
        LoadNextMap("maps\\mainmenu.map");
    if ( GetKey()==27 )
      LoadNextMap("game");//на самом деле это не загрузка а просто выход из меню
    return 1;
  }
  if ( GameState==GAME_STATISTICS )
  {
    int InstantLoad;
    InstantLoad = (PrevGameState == GAME_PLAYER_DEAD);
    iff( !InstantLoad )
    {
        if( PrevGameState == GAME_LOOSE )
            ShowStatScreen(STAT_TYPE_SURVIVE);
        else
            ShowStatScreen(STAT_TYPE_CAMPAIGN);
    }
    if(bStatShown || InstantLoad )
    {
        if( !InstantLoad )
        {
            StatScreenTact();
            if( bStatShown && (GetKey() || GetInputState()) )//((GetKey()==' ')||(GetKey()==27)||( WinTime && WinTime < GetTime() )) )
                ToggleStatScreen();
        }
        else
            PrevGameState = GAME_LOOSE;
        if( !bStatShown || InstantLoad )
        {
            GameState=PrevGameState;
            if( GameState == GAME_LOOSE )
                LoadNextMap("maps\\mainmenu.map");
        }
    }
    return;
  }
  if( GameState==GAME_WIN )
    {
      WinTime = 0;
      if(DEMO_VERSION)
      {
        if( GetKey() || (GetInputState()&(INPUT_LCLICK|INPUT_RCLICK)) )
          LoadNextMap( "maps\\mainmenu.map" );
      }
      else
      {
        iff(1)
        {
          if( LevelNumber == MAX_LEVEL )
            LoadNextMap( "maps\\end.map" );
          else if( giGame_Type == GAME_TYPE_ADDON && LevelNumber == 5 )
            LoadNextMap( "maps\\addon\\level_06.map" );
          else if( giGame_Type == GAME_TYPE_ADDON2 && LevelNumber == 5 )
            LoadNextMap( "maps\\addon2\\level_06.map" );
          else if( LevelNumber < MAX_LEVEL )
            LoadNextMap( "maps\\shop.map" );
          else
            LoadNextMap( "maps\\mainmenu.map" );
         }
       }
     }
  if( GameState==GAME_PLAYER_DEAD )
  {
    if( GetKey()==' ' && !Flagman(0) )
    {// Перерождение игрока
      GameState = GAME_NORMAL;
      Destroy( MenuFind(3,9) );
      while( i=CanPlace(9,StartPlayerX,StartPlayerY,StartPlayerZ) )
        if( GetUnitVid(i)!=-1 )
          Destroy(i);
        else
          break;
      SetFlagman(0,CreateSprite(9,StartPlayerX,StartPlayerY,StartPlayerZ));
      SetInitialGameParameters(false);
//      PlayerItem[727-720] -= 1;//PlayerLife
      int invulnerable;
      invulnerable = AddInvulnerable();
      Action(invulnerable,ACT_SET_DEATH_TIMER,5000);
//      SetCommands( Flagman(0),PlayerItems );
    }
  }

  if( StartEarthQuake )
    if( (GetTime()-StartEarthQuake) > DelayEarthQuake || StartEarthQuake > GetTime() )
    {//остановить землетрясение
      StartEarthQuake = 0;
      SetEnvironment(ENV_EARTHQUAKE+ENV_STOP);
    }
  if ( Flagman(0) )
  {
    // Вылезание и игрока из пушки
/*    if( GetUnitVid(Flagman(0))==350 )
    {
      if( (GetTime()-PlayerInGunTime) > 1000 && (GetInputState()&(INPUT_LEFT|INPUT_RIGHT|INPUT_UP|INPUT_DOWN|INPUT_SECOND)) )
      {
            CreateSprite(357,GetX(Flagman(0)),GetY(Flagman(0)),GetZ(Flagman(0)),GetDirection(Action(Flagman(0),ACT_GET_LINK)));
        Action(Flagman(0),ACT_CHANGE_VID,9);
//        Action( CreateSprite(357,GetX(Flagman(0)),GetY(Flagman(0)),GetZ(Flagman(0)),GetDirection(Flagman(0))),
//                ACT_SET_HP,
//                Action(Flagman(0),ACT_GET_HP),
//                0 );
        Action(Flagman(0),ACT_CHANGE_COOR,GetX(Flagman(0))+90,GetY(Flagman(0))-90,GetZ(Flagman(0)));
        Action(Flagman(0),ACT_SET_HP,Action(Flagman(0),ACT_GET_HP)/30);// уменьшение hp игрока при вылезании из пушки
        // Возвращаем бронежилет
//        for( link = Action(Flagman(0),ACT_GET_LINK); link; link = Action(link,ACT_GET_LINK) )
//          if( GetUnitVid(link) >= 200 && GetUnitVid(link) <= 202  )
//            Action(link,ACT_CHANGE_COOR,GetX(link),GetY(link),GetZ(link)+200);
        for( i = 6; i >=4; i-- )//бронежилеты
          if( PlayerItem[i] )
          {
            link = Action(Flagman(0),ACT_GET_LINK);
            if( gsPlayer_Sex=="male" )
              CreateSprite(i+196,GetX(link),GetY(link),GetZ(link),GetDirection(link),link);
            else
              CreateSprite(i+196,GetX(link),GetY(link),GetZ(link)+3,GetDirection(link),link);
            break;
          }
      }
    }
    else*/
      Action(PlayerShadow,ACT_CHANGE_COOR,GetX(Flagman(0)),GetY(Flagman(0)),GetZ(Flagman(0)));

    //zmTEMP
    DebugStatOutput();

    /*if( GetKey() == 'p' )
        PlayerItem[727-720] = 4;
    if( GetKey() == 'k' )
    {
        for( i=2; i < 10; i++ )
          Action(Flagman(0),ACT_ADD_AMMO,999,i);
        Action(Flagman(0),ACT_SET_HP,100000,0);
        for( i = 2; i < 10; i++ )
        {
          AddAmmo(i,GettingAmmo[i]/2);
          Action(Flagman(0),ACT_ADD_ITEM,260+i,0);
        }
    }*/
// fjr demo нужно закрфть читы
/*   if( GetKey() && LevelNumber > 0 )
    {
      static int old_key=0,new_key;
      if( GetKey()>='a' &&  GetKey()<='z' )
        new_key = GetKey() - ('a'-'A');
      else
        new_key = GetKey();
      if( old_key==0 && new_key=='C' )
        old_key = new_key;
      else if( old_key=='C' && new_key=='H' )
        old_key = new_key;
      else if( old_key=='H' && new_key=='E' )
        old_key = new_key;
      else if( old_key=='E' && new_key=='A' )
        old_key = new_key;
      else if( old_key=='A' && new_key=='T' )
        old_key = new_key;
      else if( old_key=='T' )
      {
        if( new_key=='A' )//add all ammo
          for( i=2; i < 7; i++ )
            Action(Flagman(0),ACT_ADD_AMMO,999,i);
        if( new_key=='H' )//add health
          Action(Flagman(0),ACT_SET_HP,1000,0);
        if( new_key=='W' )//add all weapon
          for( i = 2; i < 7; i++ )
          {
            AddAmmo(i,GettingAmmo[i]/2);
            Action(Flagman(0),ACT_ADD_ITEM,260+i,0);
          }
        iff( new_key=='E' )
          Win();
        if( new_key=='S' )//debug statistics
          ToggleDebugStat();
        if( new_key=='J' )//debug statistics
          ToggleStatScreen();
        //
        old_key = 0;
      }
      else old_key = 0;
//    if( GetKey()=='K' )//kill all monsters
//      for( i=FirstUnit(U_UNIT); i; i=NextUnit() )
//        if( Action(i,ACT_GET_ARMY)==1 )
//          Action(i,ANI_DEATH);
//    if( GetKey()=='G' )//set player invulnerable
//    {
//      SetVidData(GetUnitVid(Flagman(0)),VID_MAXHP0,999999);
//      Action(Flagman(0),ACT_DAMAGE,-999999,0);
//    }
    }*/
  }
  else if( GameState==GAME_WIN )
  { // для смерти игрока после его победы
    GameState = GAME_LOOSE;
    Effect(EFF_NUKE,0xff0000);
    if( LevelNumber == 10 )
      LoadNextMap( "maps\\level_11.map" );
    else if( giGame_Type == GAME_TYPE_ADDON && LevelNumber == 5 )
      LoadNextMap( "maps\\addon\\level_06.map" );
    else if( giGame_Type == GAME_TYPE_ADDON2 && LevelNumber == 5 )
      LoadNextMap( "maps\\addon2\\level_06.map" );
    else if( LevelNumber < MAX_LEVEL )
      LoadNextMap( "maps\\shop.map" );
    else
      LoadNextMap( "maps\\mainmenu.map" );
  }
  else if( GameState!=GAME_PLAYER_DEAD && GameState!=GAME_LOOSE )// Если игрок убит
  {
    if( PlayerItem[727-720] >= 0 && LevelNumber > 0)//PlayerLife
    {
      Action( CreateText(3,ScreenX()/2,ScreenY()/2,0,GetString("menu","AnyKeyForRebirth"),BEH_CENTER),
        ACT_CHANGE_DIRECTION,10);
      GameState = GAME_PLAYER_DEAD;
      Log2("GameState = GAME_PLAYER_DEAD");
    }
    else
    {
      //zmNEW 2005Jul27
      PrevGameState = GAME_LOOSE;
      //if( LevelNumber > 0 )//campaign
        PrevGameState = GAME_PLAYER_DEAD;
      GameState = GAME_STATISTICS;
      SaveFame();
      //LoadNextMap("maps\\mainmenu.map");
      //GameState = GAME_LOOSE;
    }
    Effect(EFF_NUKE,0xff0000);
  }

  /*if( (GetTime()-AdrenalinBeginTime) < ADRENALIN_BONUS_DELAY )
  {
    AdrenalinBeginTime=0;
    SetVidData(9,VID_SPEED,PlayerMaxSpeed);
  }*/
  if( (GetTime()-SpeedUpBeginTime) < SPEEDDOWN_BONUS_DELAY )
  {
    SpeedUpBeginTime=0;
  }
  if( (GetTime()-SpeedDownBeginTime) < SPEEDDOWN_BONUS_DELAY )
  {
    SpeedDownBeginTime=0;
  }
  LightTact();

  WeatherTact();
  ActionTact();
  VariousUtilsTact();

  if( GetKey()==27 )
  {
    Pause(1);
    LoadNextMap("options");//на самом деле это не загрузка а просто вход в меню
  }
  if( GetKey()==VK_F1 )
  {
    Pause(1);
    HelpOptions  = 1;
    LoadNextMap("options");//на самом деле это не загрузка а просто вход в меню
  }
	if( GetKey()==VK_TAB )
	{
		gbState_Bar^=1;
		CreateStateBar();
		SetValI2(false, "StateBar",gbState_Bar);
	}
  DrawStateBar();

  return 0;
}

