--положить сверху слой, который в случае нажатия любой клавиши пошлет сообщение "message" получателю "receiver"
function SetClickMessage(screen, receiver, message)
	SendMessage(screen, "template TopMessageTemplate")
    SendMessage(screen, "defineText [receiver] "..receiver)
    SendMessage(screen, "defineText [message] "..message)
	SendMessage(screen, "create top instance")
end
--удалить слой отправки сообщений
function UnsetClickMessage(screen)
	if SendMessageReply(screen, "name of top") == "TopMessageTemplate" then
		SendMessage(screen, "erase top child")
	end
end

function ShowCredits(screen)
	SendMessage(screen, "template CreditsTemplate")
	SendMessage(screen, "create top instance")
end

function TrimBlanks(stroka)
	while string.len(stroka) > 0 and string.find(stroka, "%s") == 1 do 
		stroka = string.sub(stroka, 2);
	end
	while string.len(stroka) > 0 and string.sub(stroka, - 1) == " " do 
		stroka = string.sub(stroka, 1, string.len(stroka) - 1);
	end
	return stroka
end
 
function GameFunc(message)
	if message == "XML loaded" then
		if PermanentStorage.GetGlobalBool("temp:ScreensaverMode") then
			local ver = PermanentStorage.GetGlobalStringOrDef("temp:Ver", "Full")
			SendMessage("GameScreen", "template TankOnlyTemplate")
			SendMessage("GameScreen", "defineText [screensaverLogo] screensaver_logo")
			SendMessage("GameScreen", "defineText [exitMessageReceiver] post:lua:GameFunc")
			SendMessage("GameScreen", "defineText [exitMessage] Screen saver done")
			SendMessage("GameScreen", "create top instance")
			SendMessage("post:Aquarium bottom", "Load Screensaver Content")

		else
		    if PermanentStorage.GetGlobalBoolOrDef("Ask player name", true) then --нужно показать три карточки с аквариумами (или просто интро)
		        SendMessage("GameScreen", "template MutableControlTemplate")     --кладем промежуточный слой
			    SendMessage("GameScreen", "defineText [receiverName] LoadScreen")
			    SendMessage("GameScreen", "create bottom instance")
				Instantiate("GameScreen", "GUI", true) --кладем GUI
				Instantiate("GameScreen", "LoadScreenBackgroundTemplate", true)
				local type = PermanentStorage.GetGlobalStringOrDef("temp:Ver", "Full")
		        local intro_file = "intro.xml"
				if     type == "1" then intro_file = "intro_halloween.xml"
				elseif type == "2" then intro_file = "intro_thanksgiving.xml"
				elseif type == "3" then intro_file = "intro_christmas.xml"
				end
				SendMessage("LoadScreen", "template FirstTimeIntro")
				SendMessage("LoadScreen", "defineText [file] "..intro_file)
				SendMessage("LoadScreen", "create top instance")
		        
				if type == "Full" then
		        	Instantiate("LoadScreen", "FirstTankChoose")
				else
				    PermanentStorage.SetLocalString("Current Tank", type)          --установим аквариум
				    MainMenuFunc("Create main menu")                               --создаем меню
					Instantiate("Current tank content", "IntroEnterEffectTemplate")--создаем эффект перехода из интро в "банку"
				end
			else
			    Instantiate("GameScreen", "GUI", true) --кладем GUI
	    		MainMenuFunc("Create main menu")
	    		MainMenuFunc("Create Tank")
			end
			Unlock("GameScreen") --разблокируем ввод пользователей
			SendMessage("Startup progress mover", "report arrival to lua:GameFunc")
			SendMessage("Startup progress mover", "set arrival message Startup progress bar out")
			SendMessage("Startup progress mover", "move to out")
			SendMessage("Logo", "idle")  --запускаем колбаситься Logo
			SendMessage("Bubbles", "run")--зупускаем колбаситься пузыри
			SetClickMessage("GameScreen", "post:lua:GameFunc", "End load screen")
		end
	elseif message == "Screen saver done" then
		Application.Close()
 	elseif message == "Startup progress bar out" then
		if IsReceiver("Startup click to start mover") then
            SendMessage("Startup click to start mover", "move to in")
		end
 	elseif message == "End load screen" then
        UnsetClickMessage("GameScreen")
	    if PermanentStorage.GetGlobalBoolOrDef("Ask player name", true) then --нужно показать три карточки с аквариумами
            SendMessage("LoadScreenTemplate alpha changer", "report arrival to post:lua:GameFunc")
			SendMessage("LoadScreenTemplate alpha changer", "set arrival message LoadScreenTemplate to alpha 0")
			SendMessage("LoadScreenTemplate alpha changer", "move to out") --запустили исчезаться лого и рыбку
		else
			SendMessage("GameScreen", "template DarkeningTemplate")
			SendMessage("GameScreen", "defineText [receiver] post:lua:GameFunc")
			SendMessage("GameScreen", "defineText [message] Click to start main menu")
			SendMessage("GameScreen", "create top instance")
		end
		Application.StartGame()
		Lock("GameScreen")
		
 	elseif message == "LoadScreenTemplate to alpha 0" then
 	    Unlock("GameScreen")
        assert(SendMessageReply("GameScreen", "name of top") == "LoadScreenTemplate")
	    SendMessage("GameScreen", "erase top child")                --удалили LoadScreenTemplate
	    if PermanentStorage.GetGlobalStringOrDef("temp:Ver", "Full") == "Full" then
		    SendMessage("FirstAquascapeChooseControl", "run animation") --запустили анимацию "трех карт"
			--экран с тремя картами после выбора аквариума посылает сообщение "Tank selected"
		else
			Lock("GameScreen")
			GameFunc("Show intro")
		end
	
	elseif message == "Tank selected" then
		local tankType = PermanentStorage.GetLocalString(PermanentStorage.GetLocalString("Current Tank").." Tank Type")
		if (tankType == "1") then
			SendMessage("CSVSTATISTICS", "halloween tank choose first time")
		elseif (tankType == "2") then
			SendMessage("CSVSTATISTICS", "thanksgiving tank choose first time")
		elseif (tankType == "3") then
			SendMessage("CSVSTATISTICS", "christmas tank choose first time")
		end
		--Current Tank только что установился
		MainMenuFunc("Create main menu")                                      --создаем меню
		Instantiate("Current tank content", "IntroEnterEffectTemplate")       --создаем эффект перехода из интро в "банку"
		SendMessage("FirstTankChoose alpha changer", "report arrival to post:lua:GameFunc");
		SendMessage("FirstTankChoose alpha changer", "set arrival message Show intro");
		SendMessage("FirstTankChoose alpha changer", "move to out")           --скрываем "три карты"
        Lock("GameScreen")
	
	elseif message == "Show intro" then
		SendMessage("Intro alpha changer", "report arrival to post:lua:GameFunc");
		SendMessage("Intro alpha changer", "set arrival message Start intro");
	    SendMessage("Intro alpha changer", "move to in")                      --показываем интро
	
	elseif message == "Start intro" then
		Unlock("GameScreen")
		SendMessage("Intro click to skip mover", "move to in")                --приплывает надпись, кликнете чтобы пропустить
		SendMessage("Intro", "play")                                          --запускаем мультик
		SendMessage("IntroTextControlReceiver", "start")                      --запускаем тексты
        local type = PermanentStorage.GetGlobalStringOrDef("temp:Ver", "Full")
        local duration_intro = "30"
		if     type == "1" then 
			duration_intro = "25"
			SwitchTrack("Intro")			
		elseif type == "2" then
			duration_intro = "25"
		elseif type == "3" then
			duration_intro = "25"
		end
		SendMessage("TimedSMS", "lua:GameFunc, Begin exit intro, "..duration_intro)--через N времени начнем убирать интро
		--SetClickMessage("GameScreen", "post:lua:GameFunc", "Begin exit intro")     --обработка клика пропуска Intro		
		
	elseif message == "Begin exit intro" then
	
        SendMessage("TimedSMS", "clear")                                    --если пришли по скипу, таймер надо очистить
	    --UnsetClickMessage("GameScreen")                                     --удалили клик мессаджер
	    if PermanentStorage.GetGlobalStringOrDef("temp:Ver", "Full")=="Full" then
			SendMessage("LoadScreen", "erase top child")                    --удалили "три карты", они уже не понадобятся
		end
		SendMessage("Intro alpha changer", "move to out")                   --скрываем Intro
		SendMessage("Finished intro text alpha", "move to in")              --но показываем последнюю надпись
		SendMessage("End Intro alpha changer", "change alpha to 1.0")       --показываем эффект перехода
		SendMessage("Intro click to skip mover", "move to out")             --уплывает надпись, кликните чтобы пропустить
		SendMessage("TimedSMS", "lua:GameFunc, MoveToInClickToContinue, 0.5")--через ...секунд, должна приплыть надпись, кликните чтобы продолжить
		SendMessage("End Intro", "run")                                     -- под мультом уже лежит аквариум
		SetClickMessage("GameScreen", "post:lua:GameFunc", "End exit intro")--обработка клика на вход в аквариум
		Lock("GameScreen")                                                  --заблокируем кран, чтобы переход осуществился
		SendMessage("TimedSMS", "lua:Unlock, GameScreen, 1")                --разблокируем экран через 1 с
        SwitchTrack()
		
    elseif message == "MoveToInClickToContinue" then
        if IsReceiver("Intro click to continue") then           --может уже кликнули...
        	SendMessage("Intro click to continue", "move to in")--приплывает надпись, кликните чтобы продолжить
		end
	elseif message == "End exit intro" then
		UnsetClickMessage("GameScreen")
	    Lock("GameScreen")
	    SendMessage("End Intro", "play effect")                      -- эффект перехода в меню
		SendMessage("Intro click to continue", "move to out")        -- уплывает надпись, кликните чтобы продолжить
		SendMessage("Finished intro text alpha", "move to out")      -- исчезает последняя надпись интро
		SendMessage("Finished intro text zoom", "change zoom to end")

	    --эффект перехода после перехода посылает сообщение "Enter MainMenu"
	elseif message == "Enter MainMenu" then
	    Unlock("GameScreen")
	    SendMessage("GameScreen", "erase top child")                        --удалили слой Intro
	    SendMessage("GameScreen", "erase bottom child")                     --удалили слой Background	    
	    if PermanentStorage.GetGlobalBoolOrDef("Ask player name", true) then
	        --спрашиваем имя игрока, если это первый вход в игру
	    	SendMessage("Main menu modal dialog", "instantiate FirstPlayerNameEditTemplate")
			SendMessage("EditBoxDialogMover", "move to in")
			SendMessage("Current tank content", "template MainMenuTankTemplate")
	    	SendMessage("Current tank content", "create instance replacing 0")  --заменили "эффект перехода" на "аквариум"
		else
			--иначе просто выплывает меню
			SendMessage("GameScreen", "erase top child")                        --удалили слой засветления, который пришел "издалека"
			MainMenuFunc("First enter main menu")
			SendMessage("Current tank content", "template MainMenuTankTemplate")
	    	SendMessage("Current tank content", "create instance replacing 0")  --заменили "эффект перехода" на "аквариум"
		end
		
	elseif message == "Click to start main menu" then
		Unlock("GameScreen")                         --снимаем блокировку экрана
		SendMessage("GameScreen", "erase top child") --удаляем черный экран
		SendMessage("GameScreen", "erase top child") --удаляем экран загрузки
		SendMessage("Screen", "template BrighteningTemplate") --кладем постепенно выцветающий черный экран
		SendMessage("Screen", "create top instance")
        MainMenuFunc("First enter main menu")
	elseif message == "Enter your name ok pressed" then
		local newName = SendMessageReply("Player name edit", "get value")
		newName = TrimBlanks(newName)
		if newName ~= "" then
			SendMessage("EditBoxDialogMover", "move to out")
			SendMessage("Main menu modal dialog", "hide")
			PermanentStorage.SetGlobalBool("Ask player name", false)
			PermanentStorage.CreatePlayer(newName)
			PermanentStorage.DeleteInactivePlayers()
			PermanentStorage.SetLocalString("Screensaver Tank", PermanentStorage.GetGlobalString("temp:Current Tank"))
            MainMenuFunc("First enter main menu")
		end
	elseif message == "Start choose tank" then --создается новый игрок, нужно показать 3 карты и интро (либо только интро)
	    newPlayerName = SendMessageReply("Player name edit", "get value") --глобальная переменная!!!
		newPlayerName = TrimBlanks(newPlayerName)
		SendMessage("EditBoxDialogMover", "move to out")
		SendMessage("Main menu modal dialog", "hide")                             --убираем диалог
		SendMessage("GameScreen", "template DarkeningTemplate")                   --кладем темный слой
		SendMessage("GameScreen", "defineText [receiver] post:lua:GameFunc")
		SendMessage("GameScreen", "defineText [message] Create first choose tank")
		SendMessage("GameScreen", "create top instance")
	elseif message == "Create first choose tank" then
	    SendMessage("GameScreen", "erase top child")                     --удалили темный слой
	    Instantiate("GameScreen", "LoadScreenBackgroundTemplate", true)  --кладем BackGround
	    SendMessage("GameScreen", "template MutableControlTemplate")     --кладем промежуточный слой
		SendMessage("GameScreen", "defineText [receiverName] LoadScreen")
	    SendMessage("GameScreen", "create top instance")
        local type = PermanentStorage.GetGlobalStringOrDef("temp:Ver", "Full")
        local intro_file = "intro.xml"
		if     type == "1" then intro_file = "intro_halloween.xml"
		elseif type == "2" then intro_file = "intro_thanksgiving.xml"
		elseif type == "3" then intro_file = "intro_christmas.xml"
		end
        SendMessage("LoadScreen", "template FirstTimeIntro")             --кладем интро
		SendMessage("LoadScreen", "defineText [file] "..intro_file)
		SendMessage("LoadScreen", "create top instance")
		SendMessage("Screen", "clear children list")                     --удалили банку и все остальное, т.к. будет эффект перехода
		local tankId   = PermanentStorage.GetLocalString("Current Tank")
		local tankType = PermanentStorage.GetLocalString(tankId.." Tank Type")
		PermanentStorage.CreatePlayer(newPlayerName)                     --создали нового игрока
		PermanentStorage.SetLocalString("temp:current music", tankType)  --нужно для выключения текущего звука
		newPlayerName = nil                                              --уничтожили глобальную переменную
		SendMessage("GameScreen", "template BrighteningTemplate")        --кладем постепенно выцветающий черный экран
		SendMessage("GameScreen", "create top instance")
		if type == "Full" then
	        Instantiate("LoadScreen", "FirstTankChoose")                     --кладем "три карты"
	        SendMessage("FirstAquascapeChooseControl", "run animation")      --и сразу же запускаем играться "три карты"
	        --экран с тремя картами после выбора аквариума посылает сообщение "Tank selected"
		else
			PermanentStorage.SetLocalString("Current Tank", type)          --установим аквариум
			MainMenuFunc("Create main menu")                               --создаем меню
			Instantiate("Current tank content", "IntroEnterEffectTemplate")--создаем эффект перехода из интро в "банку"
		    Lock("GameScreen")
			GameFunc("Show intro")
		end
	else
		assert(false, "Unknown message "..message)
	end
end

function BetaFunc(message)
	if message == "Game field to main screen" 
		or message == "Game field to shop" 
		or message == "Main menu to main screen"
		or message == "Main screen to shop"
		or message == "Main screen to game field"
		or message == "Shop to main screen" then
			SendMessage("post:lua:BetaFunc", "Duplicate player if hour")
	elseif message == "Duplicate player if hour" then
		if PermanentStorage.GetGlobalBoolOrDef("betaLog", false) then
			local totalTime = PermanentStorage.GetLocalFloatOrDef("Total time", 0)
			local backuped = PermanentStorage.GetLocalBoolOrDef("Was one hour backup", false)
			if totalTime > 3600 and not backuped then
				PermanentStorage.SetLocalBool("Was one hour backup", true)
				PermanentStorage.BackupActivePlayer("  (1h)")
				WriteToLogColor("One hour checkpoint!", "Red")
			end
		end
	elseif message == "Duplicate player won cup" then
		if PermanentStorage.GetGlobalBoolOrDef("betaLog", false) then
			local tankId = PermanentStorage.GetLocalString("Current Tank")
			local cup = PermanentStorage.GetLocalString(tankId.." Cup")
			if cup == "Bronze" then
				PermanentStorage.BackupActivePlayer(tankId.." B")
			elseif cup == "Silver" then
				PermanentStorage.BackupActivePlayer(tankId..".S")
			elseif cup == "Gold" then
				PermanentStorage.BackupActivePlayer(tankId..":G")
			else
				assert(false)
			end
		end
	elseif message == "Clear cup time" then
		if PermanentStorage.GetGlobalBoolOrDef("betaLog", false) then
			PermanentStorage.SetLocalFloat("Cup time", 0)
			WriteToLog("Cup time reset")
		end
	elseif message == "Commit" then
		if PermanentStorage.GetGlobalBoolOrDef("betaLog", false) then
			WriteToLog("autosave...")
		end
		PermanentStorage.Commit()
	else
		assert(false, "Unknown message "..message)
	end
end