Advertisement
Soristl

Coup

Apr 30th, 2022 (edited)
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 83.30 KB | None | 0 0
  1. -- from https://www.lua.org/pil/11.4.html
  2. local List = {}
  3. function List.new ()
  4.     return {first = 0, last = -1}
  5. end
  6.  
  7. function List.pushleft (list, value)
  8.     local first = list.first - 1
  9.     list.first = first
  10.     list[first] = value
  11. end
  12.  
  13. function List.pushright (list, value)
  14.     local last = list.last + 1
  15.     list.last = last
  16.     list[last] = value
  17. end
  18.  
  19. function List.popleft (list)
  20.     local first = list.first
  21.     if first > list.last then
  22.         return nil
  23.     end
  24.     local value = list[first]
  25.     list[first] = nil        -- to allow garbage collection
  26.     list.first = first + 1
  27.     return value
  28. end
  29.  
  30. function List.popright (list)
  31.     local last = list.last
  32.     if list.first > last then
  33.         return nil
  34.     end
  35.     local value = list[last]
  36.     list[last] = nil         -- to allow garbage collection
  37.     list.last = last - 1
  38.     return value
  39. end
  40.  
  41. -- the lib
  42. local timerList = {}
  43. local timersPool = List.new()
  44.  
  45. function addTimer(callback, ms, loops, label, ...)
  46.     local id = List.popleft(timersPool)
  47.     if id then
  48.         local timer = timerList[id]
  49.         timer.callback = callback
  50.         timer.label = label
  51.         timer.arguments = {...}
  52.         timer.time = ms
  53.         timer.currentTime = 0
  54.         timer.currentLoop = 0
  55.         timer.loops = loops or 1
  56.         timer.isComplete = false
  57.         timer.isPaused = false
  58.         timer.isEnabled = true
  59.     else   
  60.         id = #timerList+1
  61.         timerList[id] = {
  62.         callback = callback,
  63.         label = label,
  64.         arguments = {...},
  65.         time = ms,
  66.         currentTime = 0,
  67.         currentLoop = 0,
  68.         loops = loops or 1,
  69.         isComplete = false,
  70.         isPaused = false,
  71.         isEnabled = true,
  72.     }
  73.     end
  74.     return id
  75. end
  76.  
  77. function getTimerId(label)
  78.     local found
  79.     for id = 1, #timerList do
  80.         local timer = timerList[id]
  81.         if timer.label == label then
  82.             found = id
  83.             break
  84.         end
  85.     end
  86.     return found
  87. end
  88.  
  89. function pauseTimer(id)
  90.     if type(id) == 'string' then
  91.         id = getTimerId(id)
  92.     end
  93.  
  94.     if timerList[id] and timerList[id].isEnabled then
  95.         timerList[id].isPaused = true
  96.         return true
  97.     end
  98.     return false
  99. end
  100.  
  101. function resumeTimer(id)
  102.     if type(id) == 'string' then
  103.         id = getTimerId(id)
  104.     end
  105.  
  106.     if timerList[id] and timerList[id].isPaused then
  107.         timerList[id].isPaused = false
  108.         return true
  109.     end
  110.     return false
  111. end
  112.  
  113. function removeTimer(id)
  114.     if type(id) == 'string' then
  115.         id = getTimerId(id)
  116.     end
  117.  
  118.     if timerList[id] and timerList[id].isEnabled then
  119.         timerList[id].isEnabled = false
  120.         List.pushright(timersPool, id)
  121.         return true
  122.     end
  123.     return false
  124. end
  125.  
  126. function clearTimers()
  127.     local timer
  128.     repeat
  129.         timer = List.popleft(timersPool)
  130.         if timer then
  131.             table.remove(timerList, timer)
  132.         end
  133.     until timer == nil
  134. end
  135.  
  136. function timersLoop()
  137.     for id = 1, #timerList do
  138.         local timer = timerList[id]
  139.         if timer.isEnabled and timer.isPaused == false then
  140.             if not timer.isComplete then
  141.                 timer.currentTime = timer.currentTime + 500
  142.                 if timer.currentTime >= timer.time then
  143.                     timer.currentTime = 0
  144.                     timer.currentLoop = timer.currentLoop + 1
  145.                     if timer.loops > 0 then
  146.                         if timer.currentLoop >= timer.loops then
  147.                             timer.isComplete = true
  148.                             if eventTimerComplete ~= nil then
  149.                                 eventTimerComplete(id, timer.label)
  150.                             end
  151.                             removeTimer(id)
  152.                         end
  153.                     end
  154.                     if timer.callback ~= nil then
  155.                         timer.callback(timer.currentLoop, table.unpack(timer.arguments))
  156.                     end
  157.                 end
  158.             end
  159.         end
  160.     end
  161. end
  162.  
  163. tfm.exec.disableAutoShaman(true)
  164. tfm.exec.disableAutoNewGame(true)
  165. tfm.exec.disableAutoScore (true)
  166. tfm.exec.disableAutoTimeLeft (true)
  167. tfm.exec.disablePhysicalConsumables (true)
  168. tfm.exec.disableAfkDeath (true)
  169. tfm.exec.setRoomMaxPlayers (16)
  170. system.disableChatCommandDisplay (nil, true)
  171. tfm.exec.disableMortCommand(true)
  172.  
  173. local admins = {
  174.     ["Refletz#6472"] = true,
  175.     ["Soristl1#0000"] = true
  176. }
  177.  
  178. local gameVersion = "V1.1.0"
  179.  
  180. local gameStats = {
  181.     gameImages = {
  182.         [1] = "180c9201a6c.png",
  183.         [2] = "180c91fc481.png",
  184.         [3] = "180c9206cad.png",
  185.         [4] = "180c920bee7.png",
  186.         [5] = "180c9211111.png",
  187.         [6] = "180c9216364.png"
  188.     },
  189.     gameStorageImages = {},
  190.     textAreaIdValue = 9358291239,
  191.     textAreaIdStorage = {},
  192.     skipTheVote = 0,
  193.     winGame = false,
  194. }
  195.  
  196. local lang = {}
  197. lang.br = {
  198.     gameTranslated = "Traduzido para o Idioma PT-BR - Refletz#6472",
  199.     textTimerInit = "<p align='center'><font size='15px'><b>O jogo vai começar em",
  200.     menuOpenText = "<br><br><a href='event:whatsANew'>Novidades</a><br><a href='event:howToPlay'>Como jogar</a><br><a href='event:powers'>Poderes</a><br><a href='event:credits'>Creditos</a><br>",
  201.     helpTitle = "<p align='center'><font size='15px'>Coup - Como jogar",
  202.     whatsANew = "<p align='center'><font size='15px'>Coup - O que há de novo?<br><font size='12px'>("..gameVersion..")<p align='left'><br><br>Adicionado poderes ao jogo, você pode ler mais sobre na página de como jogar",
  203.     helpText = {
  204.         [1] = {text = "<p align='left'><font size='12px'><br><br>É um jogo dividido por cargos como Vítima, <r>Assassino<n>, <vp>Médico<n>, <bv>Detetive<n>, <vi>Vidente<n> e <j>Coringa<n>, com cada um tendo um objetivo em comum ou objetivo específico para ganhar a partida<br><br>Esse jogo pode ser jogado até 16 pessoas", haveImage = false, image = {}},
  205.         [2] = {text = "<p align='left'><font size='12px'><br><br><n>       A vítima<n>:<br>é uma pessoa que não possui poderes especiais e tem o objetivo de eliminar os assassinos através do voto<br><br><r>       O assassino<n>:<br>O assassino tem o objetivo de eliminar todas os jogadores para vencer o jogo<br><br>Caso você veja o símbolo do assassino (círculo vermelho) em cima de uma pessoa morta, significa que ao anunciar a morte da pessoa o assassino estava perto dela<br><br>Apesar de um objetivo em comum, os assassinos são de facções rivais e podem se matar. Caso mate um outro assassino você terá uma vantagem de descobrir outro cargo de uma pessoa viva", haveImage = true, image = {gameStats.gameImages[1], gameStats.gameImages[2]}, y = {85, 142}},
  206.         [3] = {text = "<p align='left'><font size='12px'><br><br><vp>       O médico<n>:<br>O médico tem o poder de salvar uma pessoa de um assassinato em seu momento, seu objetivo também é eliminar os assassinos<br><br><bv>       O detetive<n>:<br>O detetive tem o poder do tiro certo, caso acerte quem é o assassino ou o coringa ele segue no jogo, caso ele erre, ele vai morrer junto com o inocente que ele matou, o objetivo também é eliminar todos os assassinos", haveImage = true, image = {gameStats.gameImages[3], gameStats.gameImages[4]}, y = {85, 142}},
  207.         [4] = {text = "<p align='left'><font size='12px'><br><br><vi>       O vidente<n>:<br>O vidente tem o poder de descobrir o cargo de uma pessoa na primeira rodada, seu objetivo também é eliminar os assassinos<br><br><j>       O coringa<n>:<br>O objetivo do coringa é enganar a todos pensando que ele é um assassino e ser eliminado por votação, se ele conseguir isso ele completa o objetivo e vence a partida", haveImage = true, image = {gameStats.gameImages[5], gameStats.gameImages[6]}, y = {85, 142}},
  208.     },
  209.     powerTitle = "<p align='center'><font size='15px'>Coup - Poderes",
  210.     powersText = {
  211.         [1] = {text = "<p align='left'><font size='12px'><br><br>Existe poderes espalhados pelo mapa, onde seu ratinho pode passar por ele e pegar<br><br> para poderes que precisam do evento do clique<br><br> você deve apertar <j>M<n> para ativar o evento, ai quando você clicar em algum lugar no mapa, vai ativar o poder", haveImage = false, image = {}},
  212.         [2] = {text = "<p align='left'><font size='12px'><br><br>       Congelamento em área: ao ativar o evento de clique e clicar no mapa, os ratos que estiverem perto da área que você clicou serão congelados por alguns segundos<br><br><br>       Neblina: ao ativar o evento de clique e clicar no mapa, irá se criar uma neblina onde nesse local os ratos não conseguirão ver essa área por alguns segundos", haveImage = true, image = {"18117129395.png", "18117124089.png"}, y = {85, 139}},
  213.         [3] = {text = "<p align='left'><font size='12px'><br><br>       Bola de cristal do vidente: Se uma Vítima, <vp>Médico<n>, <bv>Detetive<n> ou <vi>Vidente<n> coletar esta moeda 3 vezes e o vidente estiver vivo, o vidente poderá descobrir o cargo de mais uma pessoa<br><br>Mas se o <j>coringa<n> ou o <r>assassino<n> coletar esta moeda ela não contabilizará para o vidente e a moeda sumirá do mapa", haveImage = true, image = {"180c9211111.png"}, y = {85}},
  214.     },
  215.     creditsText = "<p align='center'><font size='15px'>Coup - Créditos<br><br><p align='left'><font size='12px'>O jogo foi desenvolvido por <ch>Refletz#6472<n> (Soristl)<br><br>criadores da ideia: <ch>Nucador#0000<n>, <ch>Th3_fl4shx#0000<n> e <ch>F4k_edu#8767<n><br><br>com agradecimentos especiais ao <ch>Laaagaado#0000<n>, <ch>Esh#0095<n>, <ch>Gokublacki#9397<n>, <ch>Ashuro#2377<n>.",
  216.     closeUIText = "<p align='center'><font size='12px'><a href='event:closeWindow'>Fechar",
  217.     peopleNeedToInit = "<p align='center'><font size='15px'><b>precisa de cinco pessoas para iniciar o jogo",
  218.     people = "pessoas",
  219.     joinInGame = "<p align='center'><font size='13px'><a href='event:join'>Entrar</a>",
  220.     leaveGame = "<p align='center'><font size='13px'><a href='event:leave'>Sair</a>",
  221.     gispyInfo1 = "Você como vidente, pegou informações do jogador",
  222.     gispyInfo2 = "e o cargo dele é",
  223.     ranks = {
  224.         [1] = "<n>Vítima<n>",
  225.         [2] = "<r>Assassino<n>",
  226.         [3] = "<vp>Médico<n>",
  227.         [4] = "<bv>Detetive<n>",
  228.         [5] = "<vi>Vidente<n>",
  229.         [6] = "<j>Coringa<n>"
  230.     },
  231.     messageAssassin = "O assassino terá 30 segundos para escolher quem ele vai matar",
  232.     messageMedic = "O médico terá 30 segundos para escolher salvar alguém",
  233.     messageDetective = "O detetive terá 30 segundos para tomar alguma atitude ou não",
  234.     messageTitleVote = "<p align='center'>Escolha alguém para votar ou pule a votação",
  235.     messageLogOfVotes = "<p align='center'>Log dos votos",
  236.     previousMessage = "<p align='center'>Voltar",
  237.     nextMessage = "<p align='center'>Próximo",
  238.     titleMessageAssassin = "<p align='center'><font size='12px'>Selecione uma pessoa para você matar",
  239.     titleMessageMedic = "<p align='center'><font size='12px'>Selecione uma pessoa para você salvar",
  240.     titleMessageDetective = "<p align='center'><font size='12px'>Selecione uma pessoa para matar caso você ache ela assassino (caso erre sofrerá as consequências) ou clique em pular para não sofrer nenhuma ação",
  241.     skipMessage = "<p align='center'>Pular",
  242.     timeToTalk = "Vocês terão 30 segundos para discutir",
  243.     voteActions = {[1] = "votou em", [2] = "pulou a votação", [3] = "não votou"},
  244.     voteResult = {[1] = {"O jogador mais votado foi", "recebeu", "votos", "e ele foi morto em praça pública"}, [2] = "A votação foi pulada", [3] = "A votação terminou empatada, ninguém será morto"},
  245.     trollWinnerGame = { [1] = {"O <font color='#BABD2F'>coringa", "venceu a partida"} },
  246.     assassinWinnerGame = "Os <font color='#CB546B'>assassinos</font> venceram a partida",
  247.     victimWinnerGame = "As vítimas venceram a partida",
  248.     gameMessages = {
  249.         titleAssassinPopup = "Mortes",
  250.         assassin = "O assassino",
  251.         detective = "O detetive",
  252.         assassinKillPlayer = "matou o",
  253.         medicSavedPlayer = "tentou matar o jogador, mas o jogador foi salvo pelo <font color='#2EBA7E'>médico</font>",
  254.         assassinAfk = "ficou afk e foi retirado do jogo",
  255.         detectiveKilledAnInnocent = "matou um inocente o",
  256.         detectiveKilledTheAssassin = "descobriu e matou o",
  257.         detectiveSkiped = "não fez nenhuma ação",
  258.         messageSameTarget = "Tentou ir no mesmo alvo, mas viu que estava morto",
  259.     },
  260.     messageAssassinAdvantage = "Você matou outro assassino graças a isso você descobriu uma informação a respeito de outro jogador vivo o"
  261. }
  262.  
  263. lang.en = {
  264.     gameTranslated = "Translated into English language - Darkwolf07#9890",
  265.     textTimerInit = "<p align='center'><font size='15px'><b>The game will begin in",
  266.     menuOpenText = "<br><br><a href='event:whatsANew'>News</a><br><a href='event:howToPlay'>How to play</a><br><a href='event:powers'>Powers</a><br><a href='event:credits'>Credits</a><br>",
  267.     helpTitle = "<p align='center'><font size='15px'>Coup - How to play",
  268.     whatsANew = "<p align='center'><font size='15px'>Coup - What's a new?<br><font size='12px'>("..gameVersion..")<p align='left'><br><br>added powers to the game, you can read more about them in help page",
  269.     helpText = {
  270.         [1] = {text = "<p align='left'><font size='12px'><br><br>Its a game divided by roles like Victm, <r>Murderer<n>, <vp>Doctor<n>, <bv>Detective<n>, <vi>Prophet<n> and <j>Joker<n>, with each one having a goal in common or an especific goal to win the game<br><br>This game has a limit of 16 players per match", haveImage = false, image = {}},
  271.         [2] = {text = "<p align='left'><font size='12px'><br><br><n>       The victim<n>:<br>is a person that doesnt have any special powers and gets the goal to eliminate the murderers by voting<br><br><r>       The murderer<n>:<br>The murderer has the goal to kill and eliminate all the players for win the match<br><br>In case of seeing the murderer's symbol (a red circle) on a dead person, this means that when announcing the kill the murderer was close to her<br><br>Despite of a purpose in common, the murderers are from different and competing factions and can kill theirselves. In case of killing other murderer, you will get an advantage to find out another role from an alive person", haveImage = true, image = {gameStats.gameImages[1], gameStats.gameImages[2]}, y = {85, 142}},
  272.         [3] = {text = "<p align='left'><font size='12px'><br><br><vp>       The doctor<n>:<br>The doctor has the power to save a person of being killed in the moment of the act, the doctor goal its also eliminate the murdereres<br><br><bv>       The detective<n>:<br>The detective has the power of decisive shot, if he is correct about the identity of the murderer or the joker he keeps playing, but if he is wrong, he is gonna die with the innocent killed by him, the goal is also to eliminate all the murderers", haveImage = true, image = {gameStats.gameImages[3], gameStats.gameImages[4]}, y = {85, 142}},
  273.         [4] = {text = "<p align='left'><font size='12px'><br><br><vi>       The prophet<n>:<br>The prophet has the power of find out a person's role in the first round, his objective is also to eliminate the murderers<br><br><j>       The joker<n>:<br>The joker's goal is to troll everyone thinking that he is a murderer and being eliminated by voting, if he succeed he completes his goal and wins the match", haveImage = true, image = {gameStats.gameImages[5], gameStats.gameImages[6]}, y = {85, 142}},
  274.     },
  275.     powerTitle = "<p align='center'><font size='15px'>Coup - Powers",
  276.     powersText = {
  277.         [1] = {text = "<p align='left'><font size='12px'><br><br>There is powers in the map, where your player can pass for it and take it<br><br> for powers that need the click event<br><br> you must press <j>M<n> to active the event, then, when you click somewhere in the map, the power is gonna be activated", haveImage = false, image = {}},
  278.         [2] = {text = "<p align='left'><font size='12px'><br><br>       Area freezing: activating the click event and clicking in the map, the players which are close to the area you clicked will all be frozen for some seconds<br><br><br>       Fog: activating the click event and clicking in the map, a fog will happen where, in this place, the players wont see the area in some seconds", haveImage = true, image = {"18117129395.png", "18117124089.png"}, y = {85, 139}},
  279.         [3] = {text = "<p align='left'><font size='12px'><br><br>       Prophet's magic crystal: If a victim, <vp>Doctor<n>, <bv>Detective<n> or <vi>Prophet<n> colects this coin 3 times and the prophet is alive, the prophet will can find out the role of one more player<br><br>But if the <j>joker<n> or the <r>murderer<n> colects this coin, she wont count to the prophet and the coin will disappear from the map", haveImage = true, image = {"180c9211111.png"}, y = {85}},
  280.     },
  281.     creditsText = "<p align='center'><font size='15px'>Coup - Créditos<br><br><p align='left'><font size='12px'>The game was developed by <ch>Refletz#6472<n> (Soristl)<br><br>idea founders: <ch>Nucador#0000<n>, <ch>Th3_fl4sh#0000<n> and <ch>F4k_edu#8767<n><br><br>with a special thanks to <ch>Laaagaado#0000<n>, <ch>Esh#0095<n>, <ch>Gokublacki#9397<n>, <ch>Ashuro#2377<n>.",
  282.     closeUIText = "<p align='center'><font size='12px'><a href='event:closeWindow'>Close",
  283.     peopleNeedToInit = "<p align='center'><font size='15px'><b>the game needs five people to get started",
  284.     people = "people",
  285.     joinInGame = "<p align='center'><font size='13px'><a href='event:join'>Join</a>",
  286.     leaveGame = "<p align='center'><font size='13px'><a href='event:leave'>Leave</a>",
  287.     gispyInfo1 = "You as prophet, got informations about the player",
  288.     gispyInfo2 = "and his role is",
  289.     ranks = {
  290.         [1] = "<n>Victim<n>",
  291.         [2] = "<r>Murderer<n>",
  292.         [3] = "<vp>Doctor<n>",
  293.         [4] = "<bv>Detective<n>",
  294.         [5] = "<vi>Prophet<n>",
  295.         [6] = "<j>Joker<n>"
  296.     },
  297.     messageAssassin = "The murderer will have 30 seconds to choose who he is killing",
  298.     messageMedic = "The doctor will have 30 seconds to save somebody",
  299.     messageDetective = "The detective will have 30 seconds to take an attitude or not",
  300.     messageTitleVote = "<p align='center'>Choose someone to vote or skip the voting",
  301.     messageLogOfVotes = "<p align='center'>Log of the votes",
  302.     previousMessage = "<p align='center'>Back",
  303.     nextMessage = "<p align='center'>Next",
  304.     titleMessageAssassin = "<p align='center'><font size='12px'>Select a person to be killed",
  305.     titleMessageMedic = "<p align='center'><font size='12px'>Select a person to be saved",
  306.     titleMessageDetective = "<p align='center'><font size='12px'>Select a person to be killed if you think she is the murderer (if you fails on your decision, you will suffer the consequences) or click in SKIP to dont suffer any action",
  307.     skipMessage = "<p align='center'>Skip",
  308.     timeToTalk = "You will have 30 seconds to discuss",
  309.     voteActions = {[1] = "voted in", [2] = "skipped the voting", [3] = "didnt vote"},
  310.     voteResult = {[1] = {"The most voted player was", "has received", "votes", "and was killed in public square"}, [2] = "The voting was skipped", [3] = "The voting ended in a tie, no one is going to die"},
  311.     trollWinnerGame = { [1] = {"The <font color='#BABD2F'>joker", "won the game"} },
  312.     assassinWinnerGame = "The <font color='#CB546B'>murderers</font> won the game",
  313.     victimWinnerGame = "The victims won the game",
  314.     gameMessages = {
  315.         titleAssassinPopup = "Deaths",
  316.         assassin = "The murderer",
  317.         detective = "The detective",
  318.         assassinKillPlayer = "killed",
  319.         medicSavedPlayer = "tried to kill the player, but the player was saved by <font color='#2EBA7E'>doctor</font>",
  320.         assassinAfk = "stayed afk and got expelled from the game",
  321.         detectiveKilledAnInnocent = "killed an innocent who was",
  322.         detectiveKilledTheAssassin = "discovered and killed",
  323.         detectiveSkiped = "didnt make any move",
  324.         messageSameTarget = "tried to go on the same target, but saw it was dead",
  325.     },
  326.     messageAssassinAdvantage = "You killed another murderer. Thanks to that, you discovered an information about another alive player the"
  327. }
  328.  
  329. if tfm.get.room.language == "br" then
  330.     trad = lang.br
  331. elseif tfm.get.room.language == "en" then
  332.     trad = lang.en
  333. else
  334.     trad = lang.en
  335. end
  336.  
  337. local textAreaFogsId = {}
  338. local textAreaFogId = 29999201202
  339.  
  340. local storageImagePlayer = {}
  341. local playerRank = {}
  342. local playerLanguage = {}
  343. local playersJoined = {}
  344. local quantityRanks = {}
  345. local ranks = {
  346.     victim = 1,
  347.     assassin = 2,
  348.     medic = 3,
  349.     detective = 4,
  350.     gipsy = 5,
  351.     troll = 6
  352. }
  353.  
  354. local mode = ""
  355. local mapIndex = 1
  356. local initTimer = os.time() + 20000
  357. local quantityPlayers = 0
  358. local playerActions = {}
  359. local timerAssassin = os.time() + 30000
  360. local timerMedic = os.time() + 30000
  361. local timerDetective = os.time() + 30000
  362. local timerToTalk = os.time() + 30000
  363. local timerToVote = os.time() + 30000
  364. local timerLogVote = os.time() + 20000
  365. local timerWinner = os.time() + 10000
  366. local listPlayersOnGame = {}
  367. local maps = {
  368.     [1] = '<C><P L="1600" H="800" F="3" P="" mc="" MEDATA="20,1;;;;-0;0::0,1,2,3,4,5,6,7,8,9:1-"/><Z><S><S T="12" X="1490" Y="420" L="140" H="720" P="0,0,0.3,0.2,0,0,0,0" o="27373f" c="4"/><S T="9" X="1500" Y="1410" L="11" H="270" P="0,0,0,0,0,0,0,0"/><S T="12" X="1490" Y="1535" L="120" H="10" P="1,150,0.3,0.2,1,0,0,0" o="0a7495"/><S T="12" X="1330" Y="720" L="20" H="20" P="1,1,0.3,0.2,1,0,0,0" o="1ffb0e"/><S T="12" X="1490" Y="1525" L="40" H="10" P="1,10000000000,0.3,0.2,1,0,0,0" o="fb870e"/><S T="10" X="1500" Y="790" L="120" H="20" P="1,0.001,0.3,0,180,1,0,0"/><S T="6" X="280" Y="780" L="560" H="40" P="0,0,0.3,0.2,0,0,0,0"/><S T="10" X="660" Y="320" L="80" H="20" P="0,0,0.3,0,0,0,0,0"/><S T="10" X="900" Y="120" L="40" H="120" P="1,-1,0.3,0,0,0,0,0"/><S T="0" X="1490" Y="1545" L="200" H="10" P="1,-1,0.3,0.2,0,0,0,0"/><S T="12" X="1425" Y="1800" L="10" H="700" P="1,0.95,0.3,0.2,0,1,0,0" o="00ff03" c="2"/><S T="12" X="1555" Y="1800" L="10" H="700" P="1,0.95,0.3,0.2,0,1,0,0" o="00ff03" c="2"/><S T="12" X="900" Y="240" L="30" H="30" P="1,0.5,0.3,0.2,0,1,0,0" o="ffffffff" c="2"/><S T="10" X="620" Y="230" L="40" H="400" P="0,0,0.3,0,0,0,0,0"/><S T="12" X="604" Y="600" L="10" H="160" P="0,0,0.3,0.14,0,0,0,0" o="ffffffff" c="2"/><S T="12" X="636" Y="600" L="10" H="160" P="0,0,0.3,-0.14,0,0,0,0" o="ffffffff" c="2"/><S T="10" X="1420" Y="80" L="40" H="160" P="0,0,0.3,0,0,0,0,0"/><S T="10" X="1420" Y="580" L="40" H="200" P="0,0,0.3,0,0,0,0,0"/><S T="10" X="1420" Y="320" L="40" H="200" P="0,0,0.3,0,0,0,0,0"/><S T="10" X="1060" Y="40" L="1040" H="40" P="0,0,0.3,0,0,0,0,0"/><S T="10" X="1580" Y="410" L="40" H="780" P="0,0,20,0.2,0,0,0,0"/><S T="0" X="1495" Y="3035" L="150" H="10" P="0,0,0.3,0.2,0,0,0,0"/><S T="10" X="1020" Y="230" L="760" H="20" P="0,0,0.3,0,0,0,0,0"/><S T="12" X="1195" Y="329" L="53" H="68" P="0,0,0.3,0.2,0,0,0,0" o="281c1b" c="4"/><S T="12" X="899" Y="452" L="100" H="10" P="0,0,0.1,0.35,0,0,0,0" o="ffffffff"/><S T="10" X="1330" Y="720" L="22" H="40" P="0,0,0.3,0,0,0,0,0"/><S T="10" X="1330" Y="460" L="22" H="40" P="0,0,0.3,0,0,0,0,0"/><S T="10" X="660" Y="600" L="80" H="20" P="0,0,0.3,0,0,0,0,0" c="3"/><S T="10" X="1330" Y="200" L="22" H="40" P="0,0,0.3,0,0,0,0,0"/><S T="10" X="620" Y="590" L="40" H="200" P="0,0,0.3,0,0,0,0,0" c="3"/><S T="10" X="820" Y="500" L="1160" H="40" P="0,0,0.3,0,0,0,0,0"/><S T="13" X="396" Y="239" L="132" P="0,0,100,0.2,0,0,0,0" o="ffffffff"/><S T="12" X="900" Y="225" L="40" H="11" P="0,0,0.3,0.2,0,0,0,0" o="ffffffff" c="3"/><S T="10" X="980" Y="770" L="920" H="60" P="0,0,0.3,0,0,0,0,0"/><S T="12" X="1450" Y="1535" L="10" H="10" P="1,348,0.3,0.2,1,0,0,0" o="9a7495" c="2"/><S T="10" X="-11" Y="398" L="22" H="792" P="0,0,0,0.2,0,0,0,0" m=""/><S T="10" X="1490" Y="720" L="132" H="10" P="0,0,0,0.2,-40,0,0,0"/><S T="10" X="1470" Y="520" L="100" H="10" P="0,0,0,0.2,55,0,0,0"/><S T="10" X="1470" Y="260" L="100" H="10" P="0,0,0,0.2,55,0,0,0"/></S><D><P X="1195" Y="377" T="16" P="0,0"/><P X="620" Y="340" T="34" C="5c99be" P="0,0"/><P X="620" Y="60" T="34" C="63a6cf" P="0,0"/><P X="820" Y="220" T="22" P="0,0"/><T X="280" Y="760"/><P X="1050" Y="740" T="15" C="1a4589" P="0,0"/><P X="1170" Y="740" T="19" C="1a4589" P="0,0"/><P X="1050" Y="755" T="17" P="0,0"/><P X="670" Y="590" T="18" C="def0ff,1f77f7" P="1,0"/><P X="800" Y="740" T="20" C="592f0a" P="0,0"/><P X="900" Y="400" T="14" C="3163b1,00113e,cfdcff" P="0,0"/><P X="730" Y="220" T="27" P="0,0"/><P X="1080" Y="590" T="90" C="5d6575" P="0,0"/><P X="750" Y="220" T="24" C="205f96" P="0,0"/><P X="1195" Y="320" T="112" P="0,0"/><P X="990" Y="174" T="114" P="0,0"/><P X="1190" Y="485" T="96" C="807a73" P="0,0"/><P X="900" Y="480" T="95" C="e9e9e9" P="0,0"/><P X="400" Y="480" T="68" P="0,0"/><P X="350" Y="480" T="67" P="0,0"/><P X="450" Y="480" T="67" P="0,1"/><P X="890" Y="740" T="94" C="623b2a,a3468e" P="0,0"/><P X="1389" Y="1545" T="19" C="1a4589" P="0,0"/><P X="85" Y="760" T="67" P="0,0"/><P X="155" Y="760" T="67" P="0,1"/><P X="120" Y="760" T="66" P="0,0"/><P X="1612" Y="1545" T="19" C="1a4589" P="0,0"/><P X="880" Y="740" T="19" C="1a4589" P="0,0"/><P X="1020" Y="480" T="105" C="ffffff,613f29" P="0,0"/><P X="1070" Y="480" T="105" C="ffffff,613f29" P="0,0"/><P X="780" Y="480" T="105" C="ffffff,613f29" P="0,0"/><P X="730" Y="480" T="105" C="ffffff,613f29" P="0,0"/><P X="1060" Y="720" T="52" P="1,0"/><P X="1180" Y="220" T="104" C="757575" P="0,0"/><P X="1220" Y="180" T="100" C="185cff" P="1,0"/><P X="1199" Y="180" T="91" C="0aa7f3" P="1,0"/><P X="1020" Y="720" T="113" P="1,0"/><P X="1140" Y="180" T="130" C="125eff" P="0,0"/><P X="1065" Y="215" T="125" C="0d69cb" P="0,1"/></D><O><O X="280" Y="750" C="36" P="0"/><O X="320" Y="750" C="36" P="0"/><O X="240" Y="750" C="36" P="0"/><O X="260" Y="770" C="36" P="0"/><O X="300" Y="770" C="36" P="0"/><O X="280" Y="790" C="36" P="0"/><O X="260" Y="730" C="36" P="0"/><O X="300" Y="730" C="36" P="0"/><O X="280" Y="710" C="36" P="0"/><O X="260" Y="750" C="36" P="0"/><O X="300" Y="750" C="36" P="0"/><O X="450" Y="550" C="60" nosync="" P="90,1"/><O X="450" Y="530" C="11" P="0"/><O X="360" Y="550" C="60" nosync="" P="90,1"/><O X="360" Y="530" C="11" P="0"/><O X="360" Y="595" C="60" nosync="" P="90,1"/><O X="450" Y="595" C="60" nosync="" P="90,1"/><O X="360" Y="640" C="60" nosync="" P="90,1"/><O X="450" Y="640" C="60" nosync="" P="90,1"/><O X="360" Y="685" C="60" nosync="" P="90,1"/><O X="450" Y="685" C="60" nosync="" P="90,1"/><O X="405" Y="710" C="46" nosync="" P="0"/><O X="360" Y="575" C="14" P="0"/><O X="450" Y="575" C="14" P="0"/><O X="360" Y="620" C="14" P="0"/><O X="450" Y="620" C="14" P="0"/><O X="360" Y="660" C="14" P="0"/><O X="450" Y="660" C="14" P="0"/><O X="360" Y="705" C="14" P="0"/><O X="450" Y="705" C="14" P="0"/></O><L><JP M1="4" M2="9" AXIS="0,1"/><JR/><JR M1="5" M2="9"/><JR M1="5"/><JR M1="10" M2="11"/><JP M1="10" M2="9"/><JP M1="11" M2="9"/><JP M1="24" M2="12"/><JP M1="27" M2="3" AXIS="1,0"/><JR M1="2" M2="34"/></L></Z></C>',
  369.     [2] = '@7384285',
  370.     [3] = '@7384286',
  371.     [4] = '@5753801',
  372.     [5] = '@6756144',
  373.     [6] = '@7904412',
  374.     [7] = '<C><P L="1200" MEDATA="14,1;;;;-0;0:::1-"/><Z><S><S T="0" X="5" Y="0" L="10" H="10" P="0,0,0.3,0.2,0,0,0,0" i="0,0,180b6336772.png"/><S T="4" X="354" Y="179" L="10" H="87" P="0,0,20,0.2,0,0,0,0" m=""/><S T="4" X="438" Y="186" L="10" H="180" P="0,0,20,0.2,60,0,0,0" m=""/><S T="0" X="435" Y="130" L="163" H="10" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="1007" Y="330" L="378" H="10" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="808" Y="315" L="90" H="10" P="0,0,0.3,0.2,35,0,0,0" m=""/><S T="0" X="742" Y="292" L="71" H="10" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="4" X="735" Y="351" L="10" H="83" P="0,0,20,0.2,0,0,0,0" m=""/><S T="1" X="1205" Y="194" L="10" H="403" P="0,0,0,0.2,0,0,0,0" m=""/><S T="1" X="-8" Y="195" L="10" H="403" P="0,0,0,0.2,0,0,0,0" m=""/><S T="1" X="597" Y="-11" L="1222" H="10" P="0,0,0,0.2,0,0,0,0" m=""/><S T="0" X="367" Y="390" L="732" H="10" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="9" X="375" Y="367" L="705" H="40" P="0,0,0,0,0,0,0,0" m=""/><S T="9" X="227" Y="263" L="102" H="19" P="0,0,0,0,0,0,0,0" m=""/><S T="4" X="311" Y="156" L="15" H="10" P="0,0,20,0.2,0,0,0,0" m=""/><S T="4" X="11" Y="236" L="16" H="284" P="0,0,20,0.2,0,0,0,0" m=""/><S T="0" X="36" Y="217" L="10" H="70" P="0,0,0.3,0.2,-40,0,0,0" m=""/><S T="0" X="87" Y="137" L="10" H="109" P="0,0,0.3,0.2,10,0,0,0" m=""/><S T="0" X="28" Y="131" L="30" H="11" P="0,0,0.3,0.2,30,0,0,0" m=""/><S T="0" X="173" Y="81" L="149" H="10" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="165" Y="106" L="133" H="11" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="4" X="245" Y="99" L="10" H="41" P="0,0,20,0.2,30,0,0,0" m=""/><S T="0" X="260" Y="340" L="17" H="20" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="453" Y="319" L="37" H="63" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="414" Y="327" L="35" H="38" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="359" Y="336" L="67" H="24" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="152" Y="339" L="70" H="21" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="108" Y="340" L="19" H="10" P="0,0,0.3,0.2,-30,0,0,0" m=""/><S T="0" X="138" Y="263" L="70" H="27" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="299" Y="266" L="40" H="30" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="225" Y="275" L="100" H="10" P="0,0,0.3,0.2,0,0,0,0" m=""/><S T="0" X="350" Y="270" L="55" H="10" P="0,0,0.3,0.2,30,0,0,0" m=""/><S T="4" X="110" Y="263" L="10" H="20" P="0,0,20,0.2,0,0,0,0" m=""/></S><D><DS X="454" Y="111"/></D><O/><L/></Z></C>',
  375.     [8] = '@7384227'
  376. }
  377.  
  378. local coordinatesLimitsToSpawnPowersOnMaps = {
  379.     [1] = {x = {399, 88, 1326, 1504, 1471, 1193, 895, 401, 397, 1429, 1330, 760}, y = {684, 709, 678, 662, 471, 334, 423, 415, 89, 209, 150, 149}},
  380.     [2] = {x = {72, 315, 487, 718, 1018, 339, 1508, 1338, 886, 1212, 711}, y = {325, 157, 461, 414, 383, 763, 452, 313, 236, 115, 33}},
  381.     [3] = {x = {72, 315, 487, 718, 1018, 339, 1508, 1338, 886, 1212, 711}, y = {325, 157, 461, 414, 383, 763, 452, 313, 236, 115, 33}},
  382.     [4] = {x = {1416, 1196, 797, 421, 191, 792, 490, 1105, 791, 643, 954}, y = {257, 91, 150, 80, 252, 337, 336, 390, 578, 708, 698}},
  383.     [5] = {x = {103, 86, 649, 501, 98, 372, 277, 476}, y = {49, 163, 201, 47, 337, 261, 303, 233}},
  384.     [6] = {x = {798, 351, 346, 91, 593, 886, 1040, 1223}, y = {59, 100, 303, 335, 272, 296, 198, 289}},
  385.     [7] = {x = {169, 427, 226, 151, 451, 584, 741, 1094}, y = {52, 102, 257, 310, 265, 367, 264, 301}},
  386.     [8] = {x = {384, 399, 395, 70, 719, 392, 100, 681, 665}, y = {263, 380, 113, 324, 330, 533, 654, 657, 708}},
  387. }
  388.  
  389. local powersImages = {
  390.     [1] = "18117129395.png",
  391.     [2] = "18117124089.png",
  392.     [3] = "180c9211111.png"
  393. }
  394.  
  395. local powerOnGame = {
  396.     imageId = "",
  397. }
  398.  
  399. local gipsyRole = {quantityFragments = 0}
  400.  
  401. local invetory = {}
  402.  
  403. local pagesList = {}
  404.  
  405. function ui.addWindow(id, text, player, x, y, width, height, alpha, corners, closeButton, buttonText)
  406.     id = tostring(id)
  407.     ui.addTextArea(id.."0", "", player, x+1, y+1, width-2, height-2, 0x8a583c, 0x8a583c, alpha, true)
  408.     ui.addTextArea(id.."00", "", player, x+3, y+3, width-6, height-6, 0x2b1f19, 0x2b1f19, alpha, true)
  409.     ui.addTextArea(id.."000", "", player, x+4, y+4, width-8, height-8, 0xc191c, 0xc191c, alpha, true)
  410.     ui.addTextArea(id.."0000", "", player, x+5, y+5, width-10, height-10, 0x2d5a61, 0x2d5a61, alpha, true)
  411.     ui.addTextArea(id.."00000", text, player, x+5, y+6, width-10, height-12, 0x142b2e, 0x142b2e, alpha, true)
  412.     local imageId = {}
  413.     if corners then
  414.         table.insert(imageId, tfm.exec.addImage("155cbe97a3f.png", "&1", x-7, (y+height)-22, player))
  415.         table.insert(imageId, tfm.exec.addImage("155cbe99c72.png", "&1", x-7, y-7, player))
  416.         table.insert(imageId, tfm.exec.addImage("155cbe9bc9b.png", "&1", (x+width)-20, (y+height)-22, player))
  417.         table.insert(imageId, tfm.exec.addImage("155cbea943a.png", "&1", (x+width)-20, y-7, player))
  418.     end
  419.     if closeButton then
  420.         ui.addTextArea(id.."000000", "", player, x+8, y+height-22, width-16, 13, 0x7a8d93, 0x7a8d93, alpha, true)
  421.         ui.addTextArea(id.."0000000", "", player, x+9, y+height-21, width-16, 13, 0xe1619, 0xe1619, alpha, true)
  422.         ui.addTextArea(id.."00000000", "", player, x+9, y+height-21, width-17, 12, 0x314e57, 0x314e57, alpha, true)
  423.         ui.addTextArea(id.."", buttonText, player, x+9, y+height-24, width-17, nil, 0x314e57, 0x314e57, 0, true)
  424.     end
  425.     return imageId
  426. end
  427.  
  428. function closeWindow(id, name)
  429.     local id = tostring(id)
  430.     local str = "0"
  431.     ui.removeTextArea(id, name)
  432.     for i = 1, 9 do
  433.         ui.removeTextArea(id..""..str.."", name)
  434.         str = ""..str.."0"
  435.     end
  436. end
  437.  
  438. function buttonNextOrPrev(id, name, x, y, width, height, alpha, text)
  439.     id = tostring(id)
  440.     ui.addTextArea(id.."0000000000", "", name, x+8, y+height-22, width-16, 13, 0x7a8d93, 0x7a8d93, alpha, true)
  441.     ui.addTextArea(id.."00000000000", "", name, x+9, y+height-21, width-16, 13, 0xe1619, 0xe1619, alpha, true)
  442.     ui.addTextArea(id.."000000000000", "", name, x+9, y+height-21, width-17, 12, 0x314e57, 0x314e57, alpha, true)
  443.     ui.addTextArea(id.."0000000000000", text, name, x+9, y+height-24, width-17, nil, 0x314e57, 0x314e57, 0, true)
  444. end
  445.  
  446. function closeButtonNextOrPrev(id, name)
  447.     local id = tostring(id)
  448.     local str = "0000000000"
  449.     ui.removeTextArea(id, name)
  450.     for i = 1, 4 do
  451.         ui.removeTextArea(id..""..str.."", name)
  452.         str = ""..str.."0"
  453.     end
  454. end
  455.  
  456. function showTheGameLogo(name)
  457.     local id = {}
  458.     id[name] = tfm.exec.addImage("1810cd85b98.png", "&1", 240, 70, name, 0.5, 0.5)
  459.     gameLogo = addTimer(function(i)
  460.         if i == 1 then
  461.             tfm.exec.removeImage(id[name])
  462.         end
  463.     end, 5000, 1, "gameLogo")
  464. end
  465.  
  466. for name, data in pairs(tfm.get.room.playerList) do
  467.     storageImagePlayer[name] = {}
  468.     invetory[name] = {imageId = "", indexPower = 0, isPowerEnabled = false, canUsePower = false}
  469.     tfm.exec.setPlayerScore(name, 0, false)
  470.     showTheGameLogo(name)
  471. end
  472.  
  473. function init()
  474.     tfm.exec.disableAutoShaman(true)
  475.     tfm.exec.newGame("@7415932")
  476.     initTimer = os.time() + 20000
  477.     gameStats = {
  478.         gameImages = {
  479.             [1] = "180c9201a6c.png",
  480.             [2] = "180c91fc481.png",
  481.             [3] = "180c9206cad.png",
  482.             [4] = "180c920bee7.png",
  483.             [5] = "180c9211111.png",
  484.             [6] = "180c9216364.png"
  485.         },
  486.         gameStorageImages = {},
  487.         textAreaIdValue = 9358291239,
  488.         textAreaIdStorage = {},
  489.         skipTheVote = 0,
  490.         winGame = false,
  491.     }
  492.     gipsyRole = {quantityFragments = 0}
  493.     listPlayersOnGame = {}
  494.     quantityPlayers = 0
  495.     textAreaFogId = 29999201202
  496.     textAreaFogsId = {}
  497.     for name, data in pairs(tfm.get.room.playerList) do
  498.         playerLanguage[name] = {tr = trad, name = name}
  499.         playersJoined[name] = false
  500.         playerRank[name] = {rankName = 0, name = name}
  501.         playerActions[name] = {assassin = {canAssassin = false, playerTarget = {playerName = "", x = "", y = ""}, playerAssassin = {x = "", y = "", listOfPlayers = {}}}, savePlayer = {canSave = false, playerSaved = false, playerTarget = ""}, detectiveAction = {canVote = false, playerTarget = ""}, voteAction = { canVote = false, voteCount = 0, playerName = name, playerTarget = "", voted = false, skiped = false}}
  502.         pagesList[name] = {assassinPage = 1, medicPage = 1, detectivePage = 1, votePage = 1, pageLog = 1, helpPage = 1, powersPage = 1}
  503.         system.bindKeyboard(name, 77, true, true)
  504.     end
  505.     ui.addWindow(23, "<p align='center'><font size='13px'><a href='event:menuOpen'>Menu", nil, 5, 15, 100, 30, 1, false, false, _)
  506.     ui.addTextArea(0, trad.textTimerInit, nil, 200, 100, 400, 100, 0x161616, 0x161616, 0, false)
  507.     ui.addWindow(1, trad.joinInGame, nil, 200, 360, 400, 35, 1, false, false)
  508.     mode = "start"
  509. end
  510.  
  511. function eventTextAreaCallback(id, name, c)
  512.     if c == "join" and not playersJoined[name] and quantityPlayers < 16 then
  513.         playersJoined[name] = true
  514.         quantityPlayers = quantityPlayers + 1
  515.         ui.addWindow(1, playerLanguage[name].tr.leaveGame, name, 200, 360, 400, 35, 1, false, false)
  516.     elseif c == "leave" and playersJoined[name] then
  517.         playersJoined[name] = false
  518.         quantityPlayers = quantityPlayers - 1
  519.         ui.addWindow(1, playerLanguage[name].tr.joinInGame, name, 200, 360, 400, 35, 1, false, false)
  520.     elseif c == "menuOpen" then
  521.         ui.addWindow(23, "<p align='center'><font size='13px'><a href='event:menuClose'>Menu</a>"..playerLanguage[name].tr.menuOpenText, name, 5, 15, 100, 120, 1, false, false, _)
  522.     elseif c == "menuClose" then
  523.         ui.addWindow(23, "<p align='center'><font size='13px'><a href='event:menuOpen'>Menu", name, 5, 15, 100, 30, 1, false, false, _)
  524.     elseif c == "whatsANew" then
  525.         removeImagesOfHelp(name)
  526.         closeWindow(24, name)
  527.         closeButtonNextOrPrev(26, name)
  528.         closeButtonNextOrPrev(25, name)
  529.         ui.addWindow(24, playerLanguage[name].tr.whatsANew, name, 125, 60, 650, 300, 1, false, true, playerLanguage[name].tr.closeUIText)
  530.     elseif c == "howToPlay" then
  531.         removeImagesOfHelp(name)
  532.         pagesList[name].helpPage = 1
  533.         windowForHelp(name, pagesList[name].helpPage, playerLanguage[name].tr.nextMessage, playerLanguage[name].tr.previousMessage)
  534.     elseif c == "powers" then
  535.         removeImagesOfHelp(name)
  536.         pagesList[name].powersPage = 1
  537.         windowForPowers(name, pagesList[name].powersPage, playerLanguage[name].tr.nextMessage, playerLanguage[name].tr.previousMessage)
  538.     elseif string.sub(c, 1, 8) == "nextHelp" then
  539.         removeImagesOfHelp(name)
  540.         pagesList[name].helpPage = tonumber(string.sub(c, 9))
  541.         windowForHelp(name, pagesList[name].helpPage, playerLanguage[name].tr.nextMessage, playerLanguage[name].tr.previousMessage)
  542.     elseif string.sub(c, 1, 8) == "prevHelp" then
  543.         removeImagesOfHelp(name)
  544.         pagesList[name].helpPage = tonumber(string.sub(c, 9))
  545.         windowForHelp(name, pagesList[name].helpPage, playerLanguage[name].tr.nextMessage, playerLanguage[name].tr.previousMessage)
  546.     elseif string.sub(c, 1, 10) == "nextPowers" then
  547.         removeImagesOfHelp(name)
  548.         pagesList[name].powersPage = tonumber(string.sub(c, 11))
  549.         windowForPowers(name, pagesList[name].powersPage, playerLanguage[name].tr.nextMessage, playerLanguage[name].tr.previousMessage)
  550.     elseif string.sub(c, 1, 10) == "prevPowers" then
  551.         removeImagesOfHelp(name)
  552.         pagesList[name].powersPage = tonumber(string.sub(c, 11))
  553.         windowForPowers(name, pagesList[name].powersPage, playerLanguage[name].tr.nextMessage, playerLanguage[name].tr.previousMessage)
  554.     elseif c == "credits" then
  555.         removeImagesOfHelp(name)
  556.         closeWindow(24, name)
  557.         closeButtonNextOrPrev(26, name)
  558.         closeButtonNextOrPrev(25, name)
  559.         ui.addWindow(24, playerLanguage[name].tr.creditsText, name, 125, 60, 650, 300, 1, false, true, playerLanguage[name].tr.closeUIText)
  560.     elseif c == "closeWindow" then
  561.         closeWindow(24, name)
  562.         closeButtonNextOrPrev(26, name)
  563.         closeButtonNextOrPrev(25, name)
  564.         removeImagesOfHelp(name)
  565.     elseif string.sub(c, 2, 9) == "nextPage" then
  566.         if playerRank[name].rankName == 2 then
  567.             pagesList[name].assassinPage = tonumber(string.sub(c, 10))
  568.             windowButtonPlayer(playerLanguage[name].tr.titleMessageAssassin, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", removeThePlayerInList, pagesList[name].assassinPage, "assassinPlayer")
  569.         elseif playerRank[name].rankName == 3 then
  570.             pagesList[name].medicPage = tonumber(string.sub(c, 10))
  571.             windowButtonPlayer(playerLanguage[name].tr.titleMessageMedic, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", getPlayerList, pagesList[name].medicPage, "savePlayer")
  572.         elseif playerRank[name].rankName == 4 then
  573.             pagesList[name].detectivePage = tonumber(string.sub(c, 10))
  574.             windowButtonPlayer(playerLanguage[name].tr.titleMessageDetective, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", removeThePlayerInList, pagesList[name].detectivePage, "detectiveAction")
  575.         end
  576.         if string.sub(c, 1, 1) == "5" then
  577.             pagesList[name].votePage = tonumber(string.sub(c, 10))
  578.             windowButtonPlayer(playerLanguage[name].tr.messageTitleVote, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", getPlayerList, pagesList[name].votePage, "voteOnPlayer")
  579.         elseif string.sub(c, 1, 1) == "6" then
  580.             pagesList[name].pageLog = tonumber(string.sub(c, 10))
  581.             windowButtonPlayer(playerLanguage[name].tr.messageLogOfVotes, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", verifyVotes, pagesList[name].pageLog, "logVote")
  582.         end
  583.     elseif string.sub(c, 2, 9) == "prevPage" then
  584.         if playerRank[name].rankName == 2 then
  585.             pagesList[name].assassinPage = tonumber(string.sub(c, 10))
  586.             windowButtonPlayer(playerLanguage[name].tr.titleMessageAssassin, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", removeThePlayerInList, pagesList[name].assassinPage, "assassinPlayer")
  587.         elseif playerRank[name].rankName == 3 then
  588.             pagesList[name].medicPage = tonumber(string.sub(c, 10))
  589.             windowButtonPlayer(playerLanguage[name].tr.titleMessageMedic, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", getPlayerList, pagesList[name].medicPage, "savePlayer")
  590.         elseif playerRank[name].rankName == 4 then
  591.             pagesList[name].detectivePage = tonumber(string.sub(c, 10))
  592.             windowButtonPlayer(playerLanguage[name].tr.titleMessageDetective, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", removeThePlayerInList, pagesList[name].detectivePage, "detectiveAction")
  593.         end
  594.         if string.sub(c, 1, 1) == "5" then
  595.             pagesList[name].votePage = tonumber(string.sub(c, 10))
  596.             windowButtonPlayer(playerLanguage[name].tr.messageTitleVote, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", getPlayerList, pagesList[name].votePage, "voteOnPlayer")
  597.         elseif string.sub(c, 1, 1) == "6" then
  598.             pagesList[name].pageLog = tonumber(string.sub(c, 10))
  599.             windowButtonPlayer(playerLanguage[name].tr.messageLogOfVotes, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", verifyVotes, pagesList[name].pageLog, "logVote")
  600.         end
  601.     elseif string.sub(c, 1, 14) == "assassinPlayer" and playerActions[name].assassin.canAssassin then
  602.         playerActions[name].assassin.canAssassin = false
  603.         playerActions[name].assassin.playerTarget.playerName = string.sub(c, 15)
  604.         giveKeysForVerifyCoordsOfPlayer(string.sub(c, 15), true)
  605.         removeWindowsAndButtons(name)
  606.     elseif string.sub(c, 1, 10) == "savePlayer" and playerActions[name].savePlayer.canSave then
  607.         playerActions[name].savePlayer.canSave = false
  608.         playerActions[name].savePlayer.playerTarget = string.sub(c, 11)
  609.         playerActions[string.sub(c, 11)].savePlayer.playerSaved = true
  610.         removeWindowsAndButtons(name)
  611.     elseif string.sub(c, 1, 15) == "detectiveAction" and playerActions[name].detectiveAction.canVote then
  612.         playerActions[name].detectiveAction.canVote = false
  613.         playerActions[name].detectiveAction.playerTarget = string.sub(c, 16)
  614.         removeWindowsAndButtons(name)
  615.     elseif string.sub(c, 1, 12) == "voteOnPlayer" and playerActions[name].voteAction.canVote then
  616.         playerActions[name].voteAction.canVote = false
  617.         playerActions[name].voteAction.voted = true
  618.         playerActions[string.sub(c, 13)].voteAction.voteCount = playerActions[string.sub(c, 13)].voteAction.voteCount + 1
  619.         playerActions[name].voteAction.playerTarget = string.sub(c, 13)
  620.         removeWindowsAndButtons(name)
  621.     elseif c == "skipDetective" and playerActions[name].detectiveAction.canVote then
  622.         playerActions[name].detectiveAction.canVote = false
  623.         removeWindowsAndButtons(name)
  624.     elseif c == "skipVote" and playerActions[name].voteAction.canVote then
  625.         playerActions[name].voteAction.canVote = false
  626.         playerActions[name].voteAction.voted = true
  627.         playerActions[name].voteAction.skiped = true
  628.         gameStats.skipTheVote = gameStats.skipTheVote + 1
  629.         removeWindowsAndButtons(name)
  630.     end
  631. end
  632.  
  633. function eventKeyboard(name, key, down, x, y, xv, yv)
  634.     tfm.get.room.playerList[name].x = x
  635.     tfm.get.room.playerList[name].y = y
  636.     if playersJoined[name] and key == 77 then
  637.         if not invetory[name].isPowerEnabled then
  638.             local canChange = true
  639.             modes = {"start", "logOfVotes", "vote", "gameWin", ""}
  640.             for i = 1, #modes do
  641.                 if mode == modes[i] then
  642.                     canChange = false
  643.                     ui.addTextArea(1234567890, "", name, 758, 80, 5, 1, 0x161616, 0x161616, 0.5, true)
  644.                     invetory[name].isPowerEnabled = false
  645.                     system.bindMouse(name, false)
  646.                 end
  647.             end
  648.             if canChange then
  649.                 invetory[name].isPowerEnabled = true
  650.                 invetory[name].canUsePower = true
  651.                 system.bindMouse(name, true)
  652.                 ui.addTextArea(1234567890, "", name, 758, 80, 5, 1, 0x2ECF73, 0x2ECF73, 0.5, true)
  653.             end
  654.         else
  655.             ui.addTextArea(1234567890, "", name, 758, 80, 5, 1, 0x161616, 0x161616, 0.5, true)
  656.             invetory[name].canUsePower = false
  657.             invetory[name].isPowerEnabled = false
  658.             system.bindMouse(name, false)
  659.         end
  660.     end
  661. end
  662.  
  663. function eventChatCommand(name, message)
  664.     if admins[name] then
  665.         if mode == "timerStoped" and string.lower(message) == "stoptimer" then
  666.             initTimer = os.time() + 15000
  667.             mode = "start"
  668.             return
  669.         end
  670.         if mode == "start" then
  671.             if string.lower(message) == "resettimer" then
  672.                 initTimer = os.time() + 15000
  673.             elseif string.lower(string.sub(message, 1, 6)) == "setmap" then
  674.                 local valueIndex = tonumber(string.sub(message, 8))
  675.                 if valueIndex >= 1 and valueIndex <= #maps then
  676.                     mapIndex = valueIndex
  677.                 end
  678.             elseif string.lower(message) == "stoptimer" then
  679.                 if mode == "start" then
  680.                     mode = "timerStoped"
  681.                     return
  682.                 end
  683.             end
  684.         end
  685.     end
  686. end
  687.  
  688. function windowForHelp(name, pageOfPlayer, textNext, textPrev)
  689.     local pageList = #trad.helpText
  690.     ui.addWindow(24, ""..playerLanguage[name].tr.helpTitle..""..playerLanguage[name].tr.helpText[pageOfPlayer].text.."", name, 125, 60, 650, 300, 1, false, true, playerLanguage[name].tr.closeUIText)
  691.     if pageOfPlayer >= 1 and pageOfPlayer < pageList then
  692.         local page = pageOfPlayer + 1
  693.         buttonNextOrPrev(25, name, 540, 300, 200, 30, 1, "<a href='event:nextHelp"..tostring(page).."'>"..textNext.."</a>")
  694.     else
  695.         buttonNextOrPrev(25, name, 540, 300, 200, 30, 1, "<n2>"..textNext.."")
  696.     end
  697.     if pageOfPlayer > 1 then
  698.         local page = pageOfPlayer - 1
  699.         buttonNextOrPrev(26, name, 160, 300, 200, 30, 1, "<a href='event:prevHelp"..tostring(page).."'>"..textPrev.."</a>")
  700.     else
  701.         buttonNextOrPrev(26, name, 160, 300, 200, 30, 1, "<n2>"..textPrev.."")
  702.     end
  703.     if playerLanguage[name].tr.helpText[pageOfPlayer].haveImage then
  704.         storageImagePlayer[name][#storageImagePlayer[name] + 1] = tfm.exec.addImage(playerLanguage[name].tr.helpText[pageOfPlayer].image[1], "&1", 130, playerLanguage[name].tr.helpText[pageOfPlayer].y[1], name)
  705.         storageImagePlayer[name][#storageImagePlayer[name] + 1] = tfm.exec.addImage(playerLanguage[name].tr.helpText[pageOfPlayer].image[2], "&1", 130, playerLanguage[name].tr.helpText[pageOfPlayer].y[2], name)
  706.     end
  707. end
  708.  
  709. function windowForPowers(name, pageOfPlayer, textNext, textPrev)
  710.     local pageList = #trad.powersText
  711.     ui.addWindow(24, ""..playerLanguage[name].tr.powerTitle..""..playerLanguage[name].tr.powersText[pageOfPlayer].text.."", name, 125, 60, 650, 300, 1, false, true, playerLanguage[name].tr.closeUIText)
  712.     if pageOfPlayer >= 1 and pageOfPlayer < pageList then
  713.         local page = pageOfPlayer + 1
  714.         buttonNextOrPrev(25, name, 540, 300, 200, 30, 1, "<a href='event:nextPowers"..tostring(page).."'>"..textNext.."</a>")
  715.     else
  716.         buttonNextOrPrev(25, name, 540, 300, 200, 30, 1, "<n2>"..textNext.."")
  717.     end
  718.     if pageOfPlayer > 1 then
  719.         local page = pageOfPlayer - 1
  720.         buttonNextOrPrev(26, name, 160, 300, 200, 30, 1, "<a href='event:prevPowers"..tostring(page).."'>"..textPrev.."</a>")
  721.     else
  722.         buttonNextOrPrev(26, name, 160, 300, 200, 30, 1, "<n2>"..textPrev.."")
  723.     end
  724.     if playerLanguage[name].tr.powersText[pageOfPlayer].haveImage then
  725.         for i = 1, #playerLanguage[name].tr.powersText[pageOfPlayer].image do
  726.             storageImagePlayer[name][#storageImagePlayer[name] + 1] = tfm.exec.addImage(playerLanguage[name].tr.powersText[pageOfPlayer].image[i], "&1", 130, playerLanguage[name].tr.powersText[pageOfPlayer].y[i], name)
  727.         end
  728.     end
  729. end
  730.  
  731. function removeImagesOfHelp(name)
  732.     for i = 1, #storageImagePlayer[name] do
  733.         tfm.exec.removeImage(storageImagePlayer[name][i])
  734.     end
  735. end
  736.  
  737. function configPlayerLeft(name)
  738.     if playerRank[name].rankName ~= 0 then
  739.         quantityRanks[playerRank[name].rankName] = quantityRanks[playerRank[name].rankName] - 1
  740.         playerRank[name] = {rankName = 0, name = name}
  741.         playersJoined[name] = false
  742.         verifyQuantityPlayersWithRanks()
  743.     end
  744.     giveKeysForVerifyCoordsOfPlayer(name, false)
  745.     tfm.exec.removeImage(invetory[name].imageId)
  746.     invetory[name] = {imageId = "", indexPower = 0, isPowerEnabled = false, canUsePower = false}
  747.     playersJoined[name] = false
  748.     playerRank[name] = {rankName = 0, name = name}
  749.     playerActions[name] = {assassin = {canAssassin = false, playerTarget = {playerName = "", x = "", y = ""}, playerAssassin = {x = "", y = "", listOfPlayers = {}}}, savePlayer = {canSave = false, playerSaved = false, playerTarget = ""}, detectiveAction = {canVote = false, playerTarget = ""}, voteAction = { canVote = false, voteCount = 0, playerName = name, playerTarget = "", voted = false, skiped = false}}
  750.     pagesList[name] = {assassinPage = 1, medicPage = 1, detectivePage = 1, votePage = 1, pageLog = 1, helpPage = 1, powersPage = 1}
  751.     if mode ~= "start" then
  752.         ui.setMapName(""..trad.ranks[1]..": "..quantityRanks[1].." | "..trad.ranks[2]..": "..quantityRanks[2].." | "..trad.ranks[3]..": "..quantityRanks[3].." | "..trad.ranks[4]..": "..quantityRanks[4].." | "..trad.ranks[5]..": "..quantityRanks[5].." | "..trad.ranks[6]..": "..quantityRanks[6].."<")
  753.     end
  754. end
  755.  
  756. function eventPlayerLeft(name)
  757.     if mode == "start" then
  758.         if playersJoined[name] then
  759.             quantityPlayers = quantityPlayers - 1
  760.         end
  761.     end
  762.     configPlayerLeft(name)
  763. end
  764.  
  765. function eventPlayerDied(name)
  766.     configPlayerLeft(name)
  767. end
  768.  
  769. function eventNewPlayer(name)
  770.     playerLanguage[name] = {tr = trad, name = name}
  771.     playersJoined[name] = false
  772.     playerRank[name] = {rankName = 0, name = name}
  773.     playerActions[name] = {assassin = {canAssassin = false, playerTarget = {playerName = "", x = "", y = ""}, playerAssassin = {x = "", y = "", listOfPlayers = {}}}, savePlayer = {canSave = false, playerSaved = false, playerTarget = ""}, detectiveAction = {canVote = false, playerTarget = ""}, voteAction = { canVote = false, voteCount = 0, playerName = name, playerTarget = "", voted = false, skiped = false}}
  774.     pagesList[name] = {assassinPage = 1, medicPage = 1, detectivePage = 1, votePage = 1, pageLog = 1, helpPage = 1, powersPage = 1}
  775.     storageImagePlayer[name] = {}
  776.     system.bindKeyboard(name, 77, true, true)
  777.     invetory[name] = {imageId = "", indexPower = 0, isPowerEnabled = false, canUsePower = false}
  778.     ui.addWindow(23, "<p align='center'><font size='13px'><a href='event:menuOpen'>Menu", name, 5, 15, 100, 30, 1, false, false, _)
  779.     showTheGameLogo(name)
  780.     if mode == "start" then
  781.         ui.addWindow(1, trad.joinInGame, name, 200, 360, 400, 35, 1, false, false)
  782.         tfm.exec.respawnPlayer(name)
  783.     else
  784.         ui.setMapName(""..trad.ranks[1]..": "..quantityRanks[1].." | "..trad.ranks[2]..": "..quantityRanks[2].." | "..trad.ranks[3]..": "..quantityRanks[3].." | "..trad.ranks[4]..": "..quantityRanks[4].." | "..trad.ranks[5]..": "..quantityRanks[5].." | "..trad.ranks[6]..": "..quantityRanks[6].."<")
  785.     end
  786. end
  787.  
  788. function removeWindowsAndButtons(name)
  789.     for i = 1, 4 do
  790.         ui.removeTextArea(98760 + i, name)
  791.     end
  792.     closeWindow(2, name)
  793.     closeButtonNextOrPrev(2, name)
  794.     closeButtonNextOrPrev(3, name)
  795.     closeButtonNextOrPrev(4, name)
  796. end
  797.  
  798. function eventLoop(elapsedTime, remainingTime)
  799.     timersLoop()
  800.     if mode == "start" then
  801.         local x = math.ceil((initTimer - os.time())/1000)
  802.         local c = string.format("%d", x)
  803.         ui.addTextArea(0, ""..trad.textTimerInit.." "..c.."s <br>"..trad.peopleNeedToInit.."<br><br>"..trad.people.." "..quantityPlayers.."/16<br><br><b>"..trad.gameTranslated.."", nil, 160, 50, 440, 150, 0x161616, 0x161616, 0, false)
  804.         if x == 0 then
  805.             if quantityPlayers >= 5 then
  806.                 ui.removeTextArea(0)
  807.                 startGame()
  808.             else
  809.                 initTimer = os.time() + 15000
  810.             end
  811.         end
  812.     elseif mode == "waitAssassin" then
  813.         local x = math.ceil((timerAssassin - os.time())/1000)
  814.         local c = string.format("%d", x)
  815.         if x == 0 then
  816.             setMode("")
  817.             resetPages()
  818.             for name, data in pairs(tfm.get.room.playerList) do
  819.                 if playerRank[name].rankName == 2 then
  820.                     playerActions[name].assassin.canAssassin = true
  821.                     windowButtonPlayer(playerLanguage[name].tr.titleMessageAssassin, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", removeThePlayerInList, pagesList[name].assassinPage, "assassinPlayer")
  822.                 end
  823.             end
  824.             resetTimerAssassin(30000)
  825.             setMode("assassinPlayer")
  826.         end
  827.     elseif mode == "assassinPlayer" then
  828.         local x = math.ceil((timerAssassin - os.time())/1000)
  829.         local c = string.format("%d", x)
  830.         if x == 0 then
  831.             setMode("")
  832.             removeWindowsAndButtons(nil)
  833.             resetPages()
  834.             local quantity = 0
  835.             for name, data in pairs(tfm.get.room.playerList) do
  836.                 if playerRank[name].rankName == 2 then
  837.                     playerActions[name].assassin.canAssassin = false
  838.                     giveKeysForVerifyCoordsOfPlayer(name, true)
  839.                 elseif playerRank[name].rankName == 3 then
  840.                     playerActions[name].savePlayer.canSave = true
  841.                     quantity = quantity + 1
  842.                     windowButtonPlayer(playerLanguage[name].tr.titleMessageMedic, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", getPlayerList, pagesList[name].medicPage, "savePlayer")
  843.                 end
  844.             end
  845.             if quantity >= 1 then
  846.                 timerMedic = os.time() + 30000
  847.             else
  848.                 timerMedic = os.time() + 15000
  849.             end
  850.             gameMessage("savePlayer", trad.messageMedic)
  851.         end
  852.     elseif mode == "savePlayer" then
  853.         local x = math.ceil((timerMedic - os.time())/1000)
  854.         local c = string.format("%d", x)
  855.         if x == 0 then
  856.             setMode("")
  857.             removeWindowsAndButtons(nil)
  858.             for name, data in pairs(tfm.get.room.playerList) do
  859.                 if playerRank[name].rankName == 3 then
  860.                     playerActions[name].savePlayer.canSave = false
  861.                 elseif playerRank[name].rankName == 4 then
  862.                     playerActions[name].detectiveAction.canVote = true
  863.                 end
  864.             end
  865.            
  866.             timerDetective = os.time() + 30000
  867.             killPlayerWithAssassin()
  868.         end
  869.     elseif mode == "detectiveAction" then
  870.         local x = math.ceil((timerDetective - os.time())/1000)
  871.         local c = string.format("%d", x)
  872.         if x == 0 then
  873.             setMode("")
  874.             timerToTalk = os.time() + 30000
  875.             killPlayerWithDetective()
  876.         end
  877.     elseif mode == "timeToTalk" then
  878.         local x = math.ceil((timerToTalk - os.time())/1000)
  879.         local c = string.format("%d", x)
  880.         if x == 0 then
  881.             setMode("")
  882.             timerToVote = os.time() + 30000
  883.             resetPages()
  884.             clearFog()
  885.             for name, data in pairs(tfm.get.room.playerList) do
  886.                 if playerRank[name].rankName == 4 then
  887.                     playerActions[name].detectiveAction.canVote = true
  888.                 end
  889.                 if playersJoined[name] then
  890.                     playerActions[name].voteAction.canVote = true
  891.                     windowButtonPlayer(playerLanguage[name].tr.messageTitleVote, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", getPlayerList, pagesList[name].votePage, "voteOnPlayer")
  892.                 end
  893.             end
  894.             setMode("vote")
  895.         end
  896.     elseif mode == "vote" then
  897.         local x = math.ceil((timerToVote - os.time())/1000)
  898.         local c = string.format("%d", x)
  899.         if x == 0 then
  900.             setMode("")
  901.             timerLogVote = os.time() + 30000
  902.             removeWindowsAndButtons(nil)               
  903.             logOfVotes()
  904.             setMode("logOfVotes")
  905.             clearFog()
  906.         end
  907.     elseif mode == "logOfVotes" then
  908.         local x = math.ceil((timerLogVote - os.time())/1000)
  909.         local c = string.format("%d", x)
  910.         if x == 0 then
  911.             setMode("")
  912.             removeWindowsAndButtons(nil)
  913.             voteCount()
  914.         end
  915.     elseif mode == "gameWin" then
  916.         local x = math.ceil((timerWinner - os.time())/1000)
  917.         local c = string.format("%d", x)
  918.         if x == 0 then
  919.             ui.removeTextArea(123456789)
  920.             ui.removeTextArea(1234567890)
  921.             setMode("")
  922.             removeTimer("addPowerOnMap")
  923.             resetPages()
  924.             removeTextsAndImages()
  925.             init()
  926.         end
  927.     end
  928. end
  929.  
  930. function logOfVotes()
  931.     resetPages()
  932.     for name, data in pairs(tfm.get.room.playerList) do
  933.         windowButtonPlayer(playerLanguage[name].tr.messageLogOfVotes, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", verifyVotes, pagesList[name].pageLog, "logVote")
  934.     end
  935. end
  936.  
  937. function verifyVotes(t)
  938.     local messageStr = ""
  939.     local logs = {}
  940.     for name, data in pairs(tfm.get.room.playerList) do
  941.         if playerActions[name].voteAction.playerTarget ~= "" and playerRank[name].rankName ~= 0 then
  942.             messageStr = ""..name.." "..trad.voteActions[1].." "..playerActions[name].voteAction.playerTarget..""
  943.             logs[#logs + 1] = messageStr
  944.             messageStr = ""
  945.         else
  946.             if playerActions[name].voteAction.skiped and playerRank[name].rankName ~= 0 then
  947.                 messageStr = ""..name.." "..trad.voteActions[2]..""
  948.                 logs[#logs + 1] = messageStr
  949.                 messageStr = ""
  950.             else
  951.                 if playerRank[name].rankName ~= 0 then
  952.                     messageStr = ""..name.." "..trad.voteActions[3]..""
  953.                     logs[#logs + 1] = messageStr
  954.                     messageStr = ""
  955.                 end
  956.             end
  957.         end
  958.     end
  959.     return logs
  960. end
  961.  
  962. function voteCount()
  963.     local draw = false
  964.     local first = true
  965.     local mostVotedPlayer = ""
  966.     local countVote = 0
  967.     local tags = {"<N>", "<r>", "<vp>", "<bv>", "<vi>", "<j>"}
  968.     local colors = {"<font color='#C2C2DA'>", "<font color='#CB546B'>", "<font color='#2EBA7E'>", "<font color='#2F7FCC'>", "<font color='#C53DFF'>", "<font color='#BABD2F'>"}
  969.     for name, data in pairs(tfm.get.room.playerList) do
  970.         if first then
  971.             first = false
  972.             mostVotedPlayer = name
  973.             countVote = playerActions[name].voteAction.voteCount
  974.         else
  975.             if playerActions[name].voteAction.voteCount > playerActions[mostVotedPlayer].voteAction.voteCount then
  976.                 mostVotedPlayer = name
  977.                 countVote = playerActions[name].voteAction.voteCount
  978.                 draw = false
  979.             elseif playerActions[name].voteAction.voteCount == playerActions[mostVotedPlayer].voteAction.voteCount then
  980.                 draw = true
  981.             end
  982.         end
  983.     end
  984.     if countVote > gameStats.skipTheVote then
  985.         if playerRank[mostVotedPlayer].rankName == 6 and not draw then
  986.             timerWinner = os.time() + 10000
  987.             gameStats.winGame = true
  988.             gameWin(false, false, true, mostVotedPlayer)
  989.         else
  990.             if not draw then
  991.                 local rankName = trad.ranks[playerRank[mostVotedPlayer].rankName]
  992.                 ui.addPopup(1, 0, ""..trad.voteResult[1][1].." "..string.gsub(rankName, tags[playerRank[mostVotedPlayer].rankName], colors[playerRank[mostVotedPlayer].rankName]).." "..mostVotedPlayer.."</font> "..trad.voteResult[1][2].." "..countVote.." "..trad.voteResult[1][3].." "..trad.voteResult[1][4].."", nil, 200, 100, 400, true)
  993.                 tfm.exec.killPlayer(mostVotedPlayer)
  994.                 createTextAreaOfKilledPlayer(mostVotedPlayer)
  995.                 disableGameFunctions(mostVotedPlayer)
  996.                 verifyQuantityPlayersWithRanks()
  997.             end
  998.         end
  999.     end
  1000.     if gameStats.skipTheVote > countVote then
  1001.         ui.addPopup(1, 0, trad.voteResult[2], nil, 200, 100, 400, true)
  1002.     end
  1003.     gameStats.skipTheVote = 0
  1004.     if draw then
  1005.         ui.addPopup(1, 0, trad.voteResult[3], nil, 200, 100, 400, true)
  1006.     end
  1007.     for name, data in pairs(tfm.get.room.playerList) do
  1008.         resetActions(name)
  1009.     end
  1010.     if not gameStats.winGame then
  1011.         resetTimerAssassin(30000)
  1012.         mode = "waitAssassin"
  1013.     end
  1014. end
  1015.  
  1016. function gameWin(isVictimWinner, isAssassinWinner, isTrollWinner, trollName)
  1017.     timerWinner = os.time() + 10000
  1018.     mode = "gameWin"
  1019.     if isVictimWinner then
  1020.         ui.addPopup(5, 0, ""..trad.victimWinnerGame.."", nil, 200, 100, 400, true)
  1021.         givePointsToPlayer(true)
  1022.         return
  1023.     end
  1024.     if isAssassinWinner then
  1025.         ui.addPopup(5, 0, ""..trad.assassinWinnerGame.."", nil, 200, 100, 400, true)
  1026.         givePointsToPlayer(false, true)
  1027.         return
  1028.     end
  1029.     if isTrollWinner then
  1030.         ui.addPopup(5, 0, ""..trad.trollWinnerGame[1][1].." "..trollName.."</font> "..trad.trollWinnerGame[1][2].."", nil, 200, 100, 400, true)
  1031.         givePointsToPlayer(false, false, true)
  1032.         return
  1033.     end
  1034. end
  1035.  
  1036. function givePointsToPlayer(isVictimWinner, isAssassinWinner, isTrollWinner)
  1037.     if isVictimWinner then
  1038.         for i = 1, #listPlayersOnGame do
  1039.             if listPlayersOnGame[i].rankName ~= 2 and listPlayersOnGame[i].rankName ~= 6 then
  1040.                 tfm.exec.setPlayerScore(listPlayersOnGame[i].name, 10, true)
  1041.             end
  1042.         end
  1043.         return
  1044.     end
  1045.     if isAssassinWinner then
  1046.         for i = 1, #listPlayersOnGame do
  1047.             if listPlayersOnGame[i].rankName == 2 then
  1048.                 tfm.exec.setPlayerScore(listPlayersOnGame[i].name, 10, true)
  1049.             end
  1050.         end
  1051.         return
  1052.     end
  1053.     if isTrollWinner then
  1054.         for i = 1, #listPlayersOnGame do
  1055.             if listPlayersOnGame[i].rankName == 6 then
  1056.                 tfm.exec.setPlayerScore(listPlayersOnGame[i].name, 25, true)
  1057.             end
  1058.         end
  1059.         return
  1060.     end
  1061. end
  1062.  
  1063. function verifyQuantityPlayersWithRanks()
  1064.     quantityAlivesVictim = 0
  1065.     quantityAlivesAssassin = 0
  1066.     for name, data in pairs(tfm.get.room.playerList) do
  1067.         if playerRank[name].rankName ~= 2 and playersJoined[name] then
  1068.             quantityAlivesVictim = quantityAlivesVictim + 1
  1069.         else
  1070.             if playersJoined[name] then
  1071.                 quantityAlivesAssassin = quantityAlivesAssassin + 1
  1072.             end
  1073.         end
  1074.     end
  1075.     if quantityAlivesVictim <= quantityAlivesAssassin then
  1076.         gameStats.winGame = true
  1077.         gameWin(false, true, false)
  1078.     end
  1079.     if quantityAlivesAssassin == 0 then
  1080.         gameStats.winGame = true
  1081.         gameWin(true, false, false)
  1082.     end
  1083. end
  1084.  
  1085. function killPlayerWithAssassin()
  1086.     local messageStr = ""..trad.gameMessages.titleAssassinPopup.."<br>"
  1087.     local index = 0
  1088.     local tags = {"<N>", "<r>", "<vp>", "<bv>", "<vi>", "<j>"}
  1089.     local colors = {"<font color='#C2C2DA'>", "<font color='#CB546B'>", "<font color='#2EBA7E'>", "<font color='#2F7FCC'>", "<font color='#C53DFF'>", "<font color='#BABD2F'>"}
  1090.     for name, data in pairs(tfm.get.room.playerList) do
  1091.         if playerRank[name].rankName == 2 then
  1092.             index = index + 1
  1093.             if playerActions[name].assassin.playerTarget.playerName ~= "" then
  1094.                 if playerRank[playerActions[name].assassin.playerTarget.playerName].rankName ~= 0 then
  1095.                     local playerTarget = playerActions[name].assassin.playerTarget.playerName
  1096.                     local rankName = trad.ranks[playerRank[playerTarget].rankName]
  1097.                     if playerActions[playerTarget].savePlayer.playerSaved then
  1098.                         messageStr = ""..messageStr.."<font color='#CB546B'>"..trad.gameMessages.assassin.." "..index.."</font> "..trad.gameMessages.medicSavedPlayer.."<br>"
  1099.                         playerActions[playerTarget].savePlayer.playerSaved = false
  1100.                         playerActions[name].assassin.playerTarget.playerName = ""
  1101.                     else
  1102.                         messageStr = ""..messageStr.."<font color='#CB546B'>"..trad.gameMessages.assassin.." "..index.."</font> "..trad.gameMessages.assassinKillPlayer.." "..string.gsub(rankName, tags[playerRank[playerTarget].rankName], colors[playerRank[playerTarget].rankName]).." "..playerTarget.."</font><br>"
  1103.                         tfm.exec.killPlayer(playerTarget)
  1104.                         verifyDistanceOfPlayers(playerTarget, name)
  1105.                         if playerRank[playerTarget].rankName == 2 then
  1106.                             assassinAdvantage(name)
  1107.                         end
  1108.                         playerActions[name].assassin.playerTarget.playerName = ""
  1109.                         disableGameFunctions(playerTarget)
  1110.                         verifyQuantityPlayersWithRanks()
  1111.                     end
  1112.                 else
  1113.                     messageStr = ""..messageStr.."<font color='#CB546B'>"..trad.gameMessages.assassin.." "..index.."</font> "..trad.gameMessages.messageSameTarget.."<br>"
  1114.                     playerActions[name].assassin.playerTarget.playerName = ""
  1115.                 end
  1116.             else
  1117.                 messageStr = ""..messageStr.."<font color='#CB546B'>"..trad.gameMessages.assassin.." "..index.."</font> "..trad.gameMessages.assassinAfk.."<br>"
  1118.                 tfm.exec.killPlayer(name)
  1119.                 disableGameFunctions(name)
  1120.                 verifyQuantityPlayersWithRanks()
  1121.                 giveKeysForVerifyCoordsOfPlayer(name, false)
  1122.             end
  1123.         end
  1124.     end
  1125.     verifyQuantityPlayersWithRanks()
  1126.     resetPages()
  1127.     ui.addPopup(1, 0, messageStr, nil, 200, 100, 400, true)
  1128.     messageAssassin = addTimer(function(i)
  1129.         if i == 1 then
  1130.             if not gameStats.winGame then
  1131.                 detectiveAction()
  1132.                 gameMessage("detectiveAction", trad.messageDetective)
  1133.             end
  1134.         end
  1135.     end, 7000, 1, "message")
  1136. end
  1137.  
  1138. function killPlayerWithDetective()
  1139.     local messageStr = ""..trad.gameMessages.titleAssassinPopup.."<br>"
  1140.     local index = 0
  1141.     local tags = {"<N>", "<r>", "<vp>", "<bv>", "<vi>", "<j>"}
  1142.     local colors = {"<font color='#C2C2DA'>", "<font color='#CB546B'>", "<font color='#2EBA7E'>", "<font color='#2F7FCC'>", "<font color='#C53DFF'>", "<font color='#BABD2F'>"}
  1143.     for name, data in pairs(tfm.get.room.playerList) do
  1144.         if playerRank[name].rankName == 4 then
  1145.             index = index + 1
  1146.             playerActions[name].detectiveAction.canVote = false
  1147.             if playerActions[name].detectiveAction.playerTarget ~= "" then
  1148.                 if playerRank[playerActions[name].detectiveAction.playerTarget].rankName ~= 0 then
  1149.                     local playerTarget = playerActions[name].detectiveAction.playerTarget
  1150.                     local rankName = trad.ranks[playerRank[playerTarget].rankName]
  1151.                     if playerRank[playerTarget].rankName == 2 or playerRank[playerTarget].rankName == 6 then
  1152.                         tfm.exec.killPlayer(playerTarget)
  1153.                         messageStr = ""..messageStr.."<font color='#2F7FCC'>"..trad.gameMessages.detective.." "..index.."</font> "..trad.gameMessages.detectiveKilledTheAssassin.." "..string.gsub(rankName, tags[playerRank[playerTarget].rankName], colors[playerRank[playerTarget].rankName]).." "..playerTarget.."</font><br>"
  1154.                         createTextAreaOfKilledPlayer(playerTarget)
  1155.                         playerActions[name].detectiveAction.playerTarget = ""
  1156.                         disableGameFunctions(playerTarget)
  1157.                         verifyQuantityPlayersWithRanks()
  1158.                     else
  1159.                         messageStr = ""..messageStr.."<font color='#2F7FCC'>"..trad.gameMessages.detective.." "..index.."</font> "..trad.gameMessages.detectiveKilledAnInnocent.." "..string.gsub(rankName, tags[playerRank[playerTarget].rankName], colors[playerRank[playerTarget].rankName]).." "..playerTarget.."</font><br>"
  1160.                         tfm.exec.killPlayer(playerTarget)
  1161.                         tfm.exec.killPlayer(name)
  1162.                         createTextAreaOfKilledPlayer(playerTarget)
  1163.                         createTextAreaOfKilledPlayer(name)
  1164.                         disableGameFunctions(name)
  1165.                         disableGameFunctions(playerTarget)
  1166.                         verifyQuantityPlayersWithRanks()
  1167.                     end
  1168.                 else
  1169.                     messageStr = ""..messageStr.."<font color='#2F7FCC'>"..trad.gameMessages.detective.." "..index.."</font> "..trad.gameMessages.messageSameTarget.."<br>"
  1170.                     playerActions[name].detectiveAction.playerTarget = ""
  1171.                 end
  1172.             else
  1173.                 messageStr = ""..messageStr.."<font color='#2F7FCC'>"..trad.gameMessages.detective.." "..index.."</font> "..trad.gameMessages.detectiveSkiped.."<br>"
  1174.             end
  1175.         end
  1176.     end
  1177.     verifyQuantityPlayersWithRanks()
  1178.     resetPages()
  1179.     ui.addPopup(1, 0, messageStr, nil, 200, 100, 400, true)
  1180.     messageDetective = addTimer(function(i)
  1181.         if i == 1 then
  1182.             if not gameStats.winGame then
  1183.                 ui.addPopup(1, 0, trad.timeToTalk, nil, 200, 100, 400, true)
  1184.                 mode = "timeToTalk"
  1185.             end
  1186.         end
  1187.     end, 7000, 1, "message")
  1188. end
  1189.  
  1190. function verifyDistanceOfPlayers(playerTarget, playerAssassin)
  1191.     local coordsPlayerTarget = {
  1192.         xLeft = tfm.get.room.playerList[playerTarget].x - 150,
  1193.         xRight = tfm.get.room.playerList[playerTarget].x + 150,
  1194.         yUp = tfm.get.room.playerList[playerTarget].y - 100,
  1195.         yDown = tfm.get.room.playerList[playerTarget].y + 100,
  1196.     }
  1197.     local coordsPlayerAssassin = {
  1198.         x = tfm.get.room.playerList[playerAssassin].x,
  1199.         y = tfm.get.room.playerList[playerAssassin].y
  1200.     }
  1201.     local tagsColor = {"<N>", "<r>", "<vp>", "<bv>", "<vi>", "<j>"}
  1202.     if coordsPlayerAssassin.x + 10 >= coordsPlayerTarget.xLeft and coordsPlayerAssassin.x - 10 <= coordsPlayerTarget.xRight and coordsPlayerAssassin.y + 10 >= coordsPlayerTarget.yUp and coordsPlayerAssassin.y - 10 <= coordsPlayerTarget.yDown then
  1203.         gameStats.gameStorageImages[#gameStats.gameStorageImages + 1] = tfm.exec.addImage(gameStats.gameImages[2], "!1", (coordsPlayerTarget.xLeft + 90), (coordsPlayerTarget.yUp - 30), nil)
  1204.     end
  1205.     ui.addTextArea(gameStats.textAreaIdValue, "<p align='center'>"..tagsColor[playerRank[playerTarget].rankName]..""..playerTarget.."", nil, (coordsPlayerTarget.xLeft + 40), coordsPlayerTarget.yUp, 120, 25, 0x161616, 0x161616, 0.3, false)
  1206.     gameStats.textAreaIdStorage[#gameStats.textAreaIdStorage + 1] = gameStats.textAreaIdValue
  1207.     gameStats.textAreaIdValue = gameStats.textAreaIdValue + 1
  1208.     giveKeysForVerifyCoordsOfPlayer(playerTarget, false)
  1209.     giveKeysForVerifyCoordsOfPlayer(playerAssassin, false)
  1210. end
  1211.  
  1212. function createTextAreaOfKilledPlayer(name)
  1213.     local tagsColor = {"<N>", "<r>", "<vp>", "<bv>", "<vi>", "<j>"}
  1214.     ui.addTextArea(gameStats.textAreaIdValue, "<p align='center'>"..tagsColor[playerRank[name].rankName]..""..name.."", nil, tfm.get.room.playerList[name].x, tfm.get.room.playerList[name].y - 10, 120, 25, 0x161616, 0x161616, 0.3, false)
  1215.     gameStats.textAreaIdStorage[#gameStats.textAreaIdStorage + 1] = gameStats.textAreaIdValue
  1216.     gameStats.textAreaIdValue = gameStats.textAreaIdValue + 1
  1217. end
  1218.  
  1219. function disableGameFunctions(name)
  1220.     quantityRanks[playerRank[name].rankName] = quantityRanks[playerRank[name].rankName] - 1
  1221.     playersJoined[name] = false
  1222.     tfm.exec.removeImage(invetory[name].imageId)
  1223.     invetory[name] = {imageId = "", indexPower = 0, isPowerEnabled = false, canUsePower = false}
  1224.     playerRank[name] = {rankName = 0, name = name}
  1225.     playerActions[name] = {assassin = {canAssassin = false, playerTarget = {playerName = "", x = "", y = ""}, playerAssassin = {x = "", y = "", listOfPlayers = {}}}, savePlayer = {canSave = false, playerSaved = false, playerTarget = ""}, detectiveAction = {canVote = false, playerTarget = ""}, voteAction = { canVote = false, voteCount = 0, playerName = name, playerTarget = "", voted = false, skiped = false}}
  1226.     pagesList[name] = {assassinPage = 1, medicPage = 1, detectivePage = 1, votePage = 1, pageLog = 1, helpPage = 1, powersPage = 1}
  1227.     ui.setMapName(""..trad.ranks[1]..": "..quantityRanks[1].." | "..trad.ranks[2]..": "..quantityRanks[2].." | "..trad.ranks[3]..": "..quantityRanks[3].." | "..trad.ranks[4]..": "..quantityRanks[4].." | "..trad.ranks[5]..": "..quantityRanks[5].." | "..trad.ranks[6]..": "..quantityRanks[6].."<")
  1228. end
  1229.  
  1230. function gameMessage(modeGame, message)
  1231.     ui.addPopup(1, 0, message, nil, 200, 100, 400, true)
  1232.     if not gameStats.winGame then
  1233.         messageTimer = addTimer(function(i)
  1234.             if i == 1 then
  1235.                 if not gameStats.winGame then
  1236.                     mode = modeGame
  1237.                 end
  1238.             end
  1239.         end, 7000, 1, "messageTimer")
  1240.     end
  1241. end
  1242.  
  1243. function setMode(modeGame)
  1244.     if not gameStats.winGame then
  1245.         mode = modeGame
  1246.     end
  1247. end
  1248.  
  1249. function resetTimerAssassin(value)
  1250.     timerAssassin = os.time() + value
  1251. end
  1252.  
  1253. function startGame()
  1254.     closeWindow(1, nil)
  1255.     mode = ""
  1256.     resetTimerAssassin(30000)
  1257.     selectMap()
  1258.     gameMessage("waitAssassin", trad.messageAssassin)
  1259.     ui.setMapName(""..trad.ranks[1]..": "..quantityRanks[1].." | "..trad.ranks[2]..": "..quantityRanks[2].." | "..trad.ranks[3]..": "..quantityRanks[3].." | "..trad.ranks[4]..": "..quantityRanks[4].." | "..trad.ranks[5]..": "..quantityRanks[5].." | "..trad.ranks[6]..": "..quantityRanks[6].."<")
  1260.     ui.addTextArea(123456789, "", nil, 740, 30, 40, 40, 0x161616, 0x161616, 0.5, true)
  1261.     ui.addTextArea(1234567890, "", nil, 758, 80, 5, 1, 0x161616, 0x161616, 0.5, true)
  1262.     funcAddPowerOnMap()
  1263.     timerAssassin = os.time() + 10000
  1264. end
  1265.  
  1266. function selectMap()
  1267.     if mapIndex == #maps then
  1268.         tfm.exec.newGame(maps[mapIndex])
  1269.         mapIndex = 1
  1270.     else
  1271.         mapIndex = mapIndex + 1
  1272.         tfm.exec.newGame(maps[mapIndex])
  1273.     end
  1274.     RanksToPlayers()
  1275. end
  1276.  
  1277. function RanksToPlayers()
  1278.     if quantityPlayers <= 8 then
  1279.         quantityRanks = {
  1280.             [1] = 0,
  1281.             [2] = 1,
  1282.             [3] = 1,
  1283.             [4] = 0,
  1284.             [5] = 0,
  1285.             [6] = 1
  1286.         }
  1287.     elseif quantityPlayers <= 13 then
  1288.         quantityRanks = {
  1289.             [1] = 0,
  1290.             [2] = 2,
  1291.             [3] = 1,
  1292.             [4] = 0,
  1293.             [5] = 1,
  1294.             [6] = 1
  1295.         }
  1296.     elseif quantityPlayers >= 14 then
  1297.         quantityRanks = {
  1298.             [1] = 0,
  1299.             [2] = 3,
  1300.             [3] = 2,
  1301.             [4] = 0,
  1302.             [5] = 1,
  1303.             [6] = 1
  1304.         }
  1305.     end
  1306.     if quantityPlayers <= 10 then
  1307.         quantityRanks[4] = 1
  1308.     elseif quantityPlayers > 10 then
  1309.         quantityRanks[4] = 2
  1310.     end
  1311.     giveRanks(quantityRanks)
  1312. end
  1313.  
  1314. function giveRanks(rankList)   
  1315.     local players = {}
  1316.     for name, data in pairs(tfm.get.room.playerList) do
  1317.         if playersJoined[name] then
  1318.             players[#players + 1] = name
  1319.         end
  1320.     end
  1321.     for i = 2, #rankList do
  1322.         for j = 1, rankList[i] do
  1323.             if #players >= 1 then
  1324.                 local index = math.random(1, #players)
  1325.                 local player = players[index]
  1326.                 playerRank[player].rankName = i
  1327.                 gameStats.gameStorageImages[#gameStats.gameStorageImages + 1] = tfm.exec.addImage(gameStats.gameImages[i], "$"..player.."", -15, -100, player)
  1328.                 listPlayersOnGame[#listPlayersOnGame + 1] = {name = player, rankName = i}
  1329.                 table.remove(players, index)
  1330.             end
  1331.         end
  1332.     end
  1333.     for i = 1, #players do
  1334.         if playerRank[players[i]].rankName == 0 and playersJoined[players[i]] then
  1335.             playerRank[players[i]].rankName = 1
  1336.             gameStats.gameStorageImages[#gameStats.gameStorageImages + 1] = tfm.exec.addImage(gameStats.gameImages[1], "$"..players[i].."", -15, -100, players[i])
  1337.             listPlayersOnGame[#listPlayersOnGame + 1] = {name = players[i], rankName = 1}
  1338.             quantityRanks[1] = quantityRanks[1] + 1
  1339.         end
  1340.     end
  1341.     for name, data in pairs(tfm.get.room.playerList) do
  1342.         if playerRank[name].rankName == 0 then
  1343.             tfm.exec.killPlayer(name)
  1344.         end
  1345.     end
  1346.     gipsy()
  1347. end
  1348.  
  1349. function getPlayerList(namePlayer)
  1350.     local playerList = {}
  1351.     local playerTable = {}
  1352.     for name, data in pairs(tfm.get.room.playerList) do
  1353.         if playersJoined[name] then
  1354.             playerList[#playerList + 1] = name
  1355.         end
  1356.     end
  1357.     playerTable[namePlayer] = playerList
  1358.     return playerTable[namePlayer]
  1359. end
  1360.  
  1361. function gipsy()
  1362.     local selectPlayer = {}
  1363.     local gispy = ""
  1364.     local haveGispy = false
  1365.     for name, data in pairs(tfm.get.room.playerList) do
  1366.         if playerRank[name].rankName == 5 then
  1367.             gispy = playerRank[name]
  1368.             haveGispy = true
  1369.         else
  1370.             if playerRank[name].rankName ~= 0 then
  1371.                 selectPlayer[#selectPlayer + 1] = name
  1372.             end
  1373.         end
  1374.     end
  1375.     if haveGispy then
  1376.         local getPlayer = selectPlayer[math.random(1, #selectPlayer)]
  1377.         ui.addPopup(2, 0, ""..playerLanguage[gispy.name].tr.gispyInfo1.." "..getPlayer.." "..playerLanguage[gispy.name].tr.gispyInfo2.." "..playerLanguage[gispy.name].tr.ranks[playerRank[getPlayer].rankName].."", gispy.name, 200, 150, 400, true)
  1378.     end
  1379. end
  1380.  
  1381. function assassinAdvantage(name)
  1382.     local playerList = getPlayerList(name)
  1383.     local selectPlayer = {}
  1384.     for i = 1, #playerList do
  1385.         if playerList[i] ~= name then
  1386.             selectPlayer[#selectPlayer + 1] = playerList[i]
  1387.         end
  1388.     end
  1389.     if #selectPlayer >= 1 then
  1390.         local getPlayer = selectPlayer[math.random(1, #selectPlayer)]
  1391.         ui.addPopup(2, 0, ""..playerLanguage[name].tr.messageAssassinAdvantage.." "..getPlayer.." "..playerLanguage[name].tr.gispyInfo2.." "..playerLanguage[name].tr.ranks[playerRank[getPlayer].rankName].."", name, 200, 150, 400, true)
  1392.     end
  1393. end
  1394.  
  1395. function detectiveAction()
  1396.     local quantity = 0
  1397.     for name, data in pairs(tfm.get.room.playerList) do
  1398.         if playerRank[name].rankName == 4 then
  1399.             playerActions[name].detectiveAction.canVote = true
  1400.             quantity = quantity + 1
  1401.             windowButtonPlayer(playerLanguage[name].tr.titleMessageDetective, name, 2, 3, playerLanguage[name].tr.previousMessage, playerLanguage[name].tr.nextMessage, "prevPage", "nextPage", removeThePlayerInList, pagesList[name].detectivePage, "detectiveAction")
  1402.         end
  1403.     end
  1404.     if quantity >= 1 then
  1405.         timerDetective = os.time() + 30000
  1406.     else
  1407.         timerDetective = os.time() + 15000
  1408.     end
  1409. end
  1410.  
  1411. function windowButtonPlayer(message, name, id, id1, textPrev, textNext, eventPrev, eventNext, func, pageListForPlayer, eventAction)
  1412.     ui.addWindow(id, message, name, 125, 60, 650, 300, 1, false, false)
  1413.     showThePages(message, name, id, id1, textPrev, textNext, eventPrev, eventNext, func, pageListForPlayer, eventAction)
  1414. end
  1415.  
  1416. function showThePages(message, name, id, id1, textPrev, textNext, eventPrev, eventNext, func, pageListForPlayer, eventAction)
  1417.     local pageList = pageListCount(name, func)
  1418.     local y = 120
  1419.     if #pageList >= pageListForPlayer then
  1420.         for i = 1, 4 do
  1421.             if #pageList[pageListForPlayer] >= i then
  1422.                 ui.addTextArea(98760 + i, "<p align='center'><a href='event:"..eventAction..""..pageList[pageListForPlayer][i].."'>"..pageList[pageListForPlayer][i].."", name, 150, y, 600, 30, 0x161616, 0x161616, 0.5, true)
  1423.                 y = y + 45
  1424.             end
  1425.         end
  1426.     end
  1427.     if playerRank[name].rankName == 2 then
  1428.         buttonsRedirect(pagesList[name].assassinPage, pageList, name, 2, 3, textPrev, textNext, 2, eventPrev, eventNext)
  1429.     elseif playerRank[name].rankName == 3 then
  1430.         buttonsRedirect(pagesList[name].medicPage, pageList, name, 2, 3, textPrev, textNext, 3, eventPrev, eventNext)
  1431.     elseif playerRank[name].rankName == 4 then
  1432.         buttonsRedirect(pagesList[name].detectivePage, pageList, name, 2, 3, textPrev, textNext, 4, eventPrev, eventNext)
  1433.         buttonSkip(name, "skipDetective")
  1434.     end
  1435.     if eventAction == "voteOnPlayer" then
  1436.         buttonsRedirect(pagesList[name].votePage, pageList, name, 2, 3, textPrev, textNext, 5, eventPrev, eventNext)
  1437.         buttonSkip(name, "skipVote")
  1438.     elseif eventAction == "logVote" then
  1439.         buttonsRedirect(pagesList[name].pageLog, pageList, name, 2, 3, textPrev, textNext, 6, eventPrev, eventNext)
  1440.     end
  1441. end
  1442.  
  1443. function buttonsRedirect(pageOfPlayer, pageList, name, id, id1, textPrev, textNext, indexRank, eventPrev, eventNext)
  1444.     if pageOfPlayer >= 1 and pageOfPlayer < #pageList then
  1445.         local page = pageOfPlayer + 1
  1446.         buttonNextOrPrev(id1, name, 540, 300, 200, 30, 1, "<a href='event:"..tostring(indexRank)..""..eventNext..""..tostring(page).."'>"..textNext.."</a>")
  1447.     else
  1448.         buttonNextOrPrev(id1, name, 540, 300, 200, 30, 1, "<n2>"..textNext.."")
  1449.     end
  1450.     if pageOfPlayer > 1 then
  1451.         local page = pageOfPlayer - 1
  1452.         buttonNextOrPrev(id, name, 160, 300, 200, 30, 1, "<a href='event:"..indexRank..""..eventPrev..""..tostring(page).."'>"..textPrev.."</a>")
  1453.     else
  1454.         buttonNextOrPrev(id, name, 160, 300, 200, 30, 1, "<n2>"..textPrev.."")
  1455.     end
  1456. end
  1457.  
  1458. function buttonSkip(name, event)
  1459.     buttonNextOrPrev(4, name, 375, 300, 150, 30, 1, "<a href='event:"..event.."'>"..playerLanguage[name].tr.skipMessage.."</a>")
  1460. end
  1461.  
  1462. function pageListCount(name, func)
  1463.     local listPlayersForAssassin = func(name)
  1464.     local pages = {}
  1465.     local pagesPlayer = {}
  1466.     local elements = {}
  1467.     for i = 1, #listPlayersForAssassin do
  1468.         elements[#elements + 1] = listPlayersForAssassin[i]
  1469.         if i % 2 == 0 then
  1470.             if #elements == 4 then
  1471.                 pages[#pages + 1] = {}
  1472.                 for j = 1, 4 do
  1473.                     pages[#pages][j] = elements[j]
  1474.                 end
  1475.                 elements = {}
  1476.             end
  1477.         end
  1478.     end
  1479.     if #elements >= 1 then
  1480.         pages[#pages + 1] = {}
  1481.         for i = 1, #elements do
  1482.             pages[#pages][i] = elements[i]
  1483.         end
  1484.     end
  1485.     pagesPlayer[name] = pages
  1486.     return pagesPlayer[name]
  1487. end
  1488.  
  1489. function removeThePlayerInList(name)
  1490.     local players = getPlayerList(name)
  1491.     local playerAssassin = ""
  1492.     local assassinTable = {}
  1493.     local assassinTableP = {}
  1494.     for i = 1, #players do
  1495.         if name ~= players[i] then
  1496.             assassinTable[#assassinTable + 1] = players[i]
  1497.         end
  1498.     end
  1499.     assassinTableP[name] = assassinTable
  1500.     return assassinTableP[name]
  1501. end
  1502.  
  1503. function resetActions(name)
  1504.     playerActions[name] = {assassin = {canAssassin = false, playerTarget = {playerName = "", x = "", y = ""}, playerAssassin = {x = "", y = "", listOfPlayers = {}}}, savePlayer = {canSave = false, playerSaved = false, playerTarget = ""}, detectiveAction = {canVote = false, playerTarget = ""}, voteAction = { canVote = false, voteCount = 0, playerName = name, playerTarget = "", voted = false, skiped = false}}
  1505. end
  1506.  
  1507. function resetPages()
  1508.     for name, data in pairs(tfm.get.room.playerList) do
  1509.         pagesList[name] = {assassinPage = 1, medicPage = 1, detectivePage = 1, votePage = 1, pageLog = 1, helpPage = 1, powersPage = 1}
  1510.     end
  1511. end
  1512.  
  1513. function removeTextsAndImages()
  1514.     for i = 1, #gameStats.textAreaIdStorage do
  1515.         ui.removeTextArea(gameStats.textAreaIdStorage[i], nil)
  1516.     end
  1517.     for i = 1, #gameStats.gameStorageImages do
  1518.         tfm.exec.removeImage(gameStats.gameStorageImages[i])
  1519.     end
  1520. end
  1521.  
  1522. function giveKeysForVerifyCoordsOfPlayer(name, isEnabled)
  1523.     for i = 0, 3 do
  1524.         system.bindKeyboard(name, i, true, isEnabled)
  1525.     end
  1526. end
  1527.  
  1528. function funcAddPowerOnMap()
  1529.     addPowerOnMap = addTimer(function(i)
  1530.         if i >= 1 then
  1531.             removePowerImageOnMap()
  1532.             tfm.exec.removeBonus(0, nil)
  1533.             local index = mapIndex
  1534.             local coords = math.random(1, #coordinatesLimitsToSpawnPowersOnMaps[index].x)
  1535.             local x = coordinatesLimitsToSpawnPowersOnMaps[index].x[coords]
  1536.             local y = coordinatesLimitsToSpawnPowersOnMaps[index].y[coords]
  1537.             local imageIndex = math.random(1, #powersImages)
  1538.             tfm.exec.addBonus(0, x, y, imageIndex, 0, false, nil, imageIndex)
  1539.             powerOnGame.imageId = tfm.exec.addImage(powersImages[imageIndex], "!1", x, y, nil)
  1540.         end
  1541.     end, 60000, 0, "addPowerOnMap")
  1542. end
  1543.  
  1544. function eventPlayerBonusGrabbed(name, bonusId)
  1545.     removePowerImageOnMap()
  1546.     tfm.exec.removeImage(invetory[name].imageId)
  1547.     tfm.exec.removeBonus(bonusId, nil)
  1548.     local powersShowImageOnInventory = {1, 2}
  1549.     for i = 1, #powersShowImageOnInventory do
  1550.         if powersShowImageOnInventory[i] == bonusId then
  1551.             addPowerOnTheInvetory(bonusId, name)
  1552.         end
  1553.     end
  1554.     if bonusId == 3 and playerRank[name].rankName ~= 2 and playerRank[name].rankName ~= 5 and playerRank[name].rankName ~= 0 then
  1555.         quantityFragmentsOfGipsy()
  1556.     end
  1557. end
  1558.  
  1559. function removePowerImageOnMap()
  1560.     if powerOnGame.imageId ~= "" then
  1561.         tfm.exec.removeImage(powerOnGame.imageId)
  1562.         powerOnGame.imageId = ""
  1563.     end
  1564. end
  1565.  
  1566. function addPowerOnTheInvetory(index, name)
  1567.     invetory[name].imageId = tfm.exec.addImage(powersImages[index], "&1", 745, 35, name)
  1568.     invetory[name].indexPower = index
  1569. end
  1570.  
  1571. function quantityFragmentsOfGipsy()
  1572.     gipsyRole.quantityFragments = gipsyRole.quantityFragments + 1
  1573.     if gipsyRole.quantityFragments == 3 then
  1574.         gipsyRole.quantityFragments = 0
  1575.         gipsy()
  1576.     end
  1577. end
  1578.  
  1579. function eventMouse(name, x, y)
  1580.     if invetory[name].indexPower == 1 and invetory[name].isPowerEnabled and invetory[name].canUsePower then
  1581.         invetory[name].isPowerEnabled = false
  1582.         freezePlayer(x, y)
  1583.     elseif invetory[name].indexPower == 2 and invetory[name].isPowerEnabled and invetory[name].canUsePower then
  1584.         invetory[name].isPowerEnabled = false
  1585.         makeFogOnMap(textAreaFogId, x - 150, y - 100)
  1586.         textAreaFogsId[#textAreaFogsId + 1] = textAreaFogId
  1587.         textAreaFogId = textAreaFogId + 1
  1588.     end
  1589.     tfm.exec.removeImage(invetory[name].imageId)
  1590.     invetory[name].canUsePower = false
  1591.     invetory[name].indexPower = 0
  1592.     invetory[name].imageId = ""
  1593.     system.bindMouse(name, false)
  1594.     ui.addTextArea(1234567890, "", name, 758, 80, 5, 1, 0x161616, 0x161616, 0.5, true)
  1595. end
  1596.  
  1597. function freezePlayer(xCoord, yCoord)
  1598.     local x1 = xCoord - 200
  1599.     local x2 = xCoord + 200
  1600.     local y1 = yCoord - 100
  1601.     local y2 = yCoord + 100
  1602.     local playerList = {}
  1603.     for name, data in pairs(tfm.get.room.playerList) do
  1604.         if playersJoined[name] then
  1605.             playerList[#playerList + 1] = name
  1606.             if tfm.get.room.playerList[name].x + 20 >= x1 and tfm.get.room.playerList[name].x - 20 <= x2 and tfm.get.room.playerList[name].y + 20 >= y1 and tfm.get.room.playerList[name].y - 20 <= y2 then
  1607.                 tfm.exec.freezePlayer(name, true, true)
  1608.             end
  1609.         end
  1610.     end
  1611.     timerToUnFreezePlayer(playerList)
  1612. end
  1613.  
  1614. function timerToUnFreezePlayer(list)
  1615.     UnFreezePlayer = addTimer(function(i)
  1616.         if i == 1 then
  1617.             for j = 1, #list do
  1618.                 tfm.exec.freezePlayer(list[j], false)
  1619.             end
  1620.         end
  1621.     end, 15000, 1, "UnFreezePlayer")
  1622. end
  1623.  
  1624. function makeFogOnMap(id, x, y)
  1625.     timerIncreaseFog(id, x, y)
  1626. end
  1627.  
  1628.  
  1629. function timerIncreaseFog(id, x, y)
  1630.     local opacity = 0
  1631.     IncreaseFog = addTimer(function(i)
  1632.         if i >= 1 then    
  1633.             opacity = opacity + 0.2
  1634.             ui.addTextArea(id, "", nil, x, y, 300, 200, 0xFFFFFF, 0xFFFFFF, opacity, false)
  1635.         end
  1636.         if i == 5 then
  1637.             timerRemainFog(id, x, y)
  1638.         end
  1639.     end, 1000, 5, "IncreaseFog")
  1640. end
  1641.  
  1642. function timerRemainFog(id, x, y)
  1643.     RemainFog = addTimer(function(i)
  1644.         if i == 1 then    
  1645.             timerDecreaseFog(id, x, y)
  1646.         end
  1647.     end, 5000, 1, "RemainFog")
  1648. end
  1649.  
  1650. function timerDecreaseFog(id, x, y)
  1651.     local opacity = 1
  1652.     DecreaseFog = addTimer(function(i)
  1653.         if i >= 1 then    
  1654.             opacity = opacity - 0.2
  1655.             ui.addTextArea(textAreaFogId, "", nil, x, y, 300, 200, 0xFFFFFF, 0xFFFFFF, opacity, false)
  1656.         end
  1657.     end, 1000, 5, "DecreaseFog")
  1658.     ui.removeTextArea(id)
  1659. end
  1660.  
  1661. function clearFog()
  1662.     for i = 1, #textAreaFogsId do
  1663.         removeTimer("IncreaseFog")
  1664.         removeTimer("RemainFog")
  1665.         removeTimer("DecreaseFog")
  1666.         ui.removeTextArea(textAreaFogsId[i])
  1667.     end
  1668. end
  1669.  
  1670. init()
  1671.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement