Created
January 2, 2020 15:54
-
-
Save xDeda/04567ee27018d7c6efa5f87864238049 to your computer and use it in GitHub Desktop.
transformice hangman
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
tfm.exec.disableAfkDeath(true) | |
tfm.exec.disableAutoShaman(true) | |
tfm.exec.disableAutoNewGame(true) | |
tfm.exec.disableAutoScore(true) | |
tfm.exec.disableAutoTimeLeft(true) | |
chars = {"&","é","~","\"","{","|","è","`","_","à ","@","]","+","=","}","¨","ë","ä","ü","ö","£","<",">","0","1","2","3","4","5","6","7","8","9"} | |
lang = {} | |
lang.fr = { | |
ask_word = "Définir le mot à trouver", | |
choose_word = "Choisissez un mot : (entre 2 et 12 caractères inclus, aucun accent)", | |
more_players = "Vous devez être au moins <font color='#FF0000'>2</font> joueurs pour jouer au pendu.", | |
next_turn_1 = "Le prochain tour débutera dans ", | |
next_turn_2 = " seconde(s).", | |
turn_of_1 = "C'est le tour de ", | |
turn_of_2 = " ! ", | |
patientez = "Patientez pendant qu'il choisir son mot...", | |
word_found = "Le mot a été trouvé !", | |
word_not_found = "Pas de chance ! Le mot était ", | |
time_out = "Temps écoulé !", | |
pass_turn = "Le maître du jeu a passé son tour !", | |
quit = "Le maître du jeu a quitté !" | |
} | |
lang.en = { | |
ask_word = "Define the word to find", | |
choose_word = "Choose a word : (between 2 and 12 characters)", | |
more_players = "You have to be at least <font color='#FF0000'>2</font> players to play Hangman.", | |
next_turn_1 = "Next turn in ", | |
next_turn_2 = " second(s).", | |
turn_of_1 = "It's ", | |
turn_of_2 = "'s turn ! ", | |
patientez = "Wait while he's choosing a word...", | |
word_found = "The word was found !", | |
word_not_found = "No luck! The word was ", | |
time_out = "Time out !", | |
pass_turn = "The game master has passed his turn !", | |
quit = "The game master has quit." | |
} | |
text = lang.en | |
players = {} | |
master = "" | |
letters = {} | |
invertLetters = {} | |
word = "" | |
hasDefinedWord = false | |
timer = 0 | |
bestPlayer = "" | |
pendu_level = 0 | |
beginReset = false | |
hasToReset = false | |
resetTimer = 0 | |
isTimeOut = false | |
hasWon = false | |
hasLost = false | |
hasSkipped = false | |
hasQuit = false | |
lettersEntered = {} | |
lettersNotWord = {} | |
id = {} | |
id["ask_word_main"] = 1 | |
id["ask_word_button"] = 2 | |
id["ask_word_popup"] = 3 | |
id["pendu"] = 4 | |
id["reset_timer"] = 5 | |
id["reset_timer_label"] = 6 | |
id["turn"] = 7 | |
id["turn_label"] = 8 | |
id["one_player"] = 9 | |
id["one_player_label"] = 10 | |
function eventNewGame() | |
updatePlayersList() | |
ui.removeTextArea(id["one_player"]) | |
ui.removeTextArea(id["one_player_label"]) | |
letters = {} | |
invertLetters = {} | |
word = "" | |
hasDefinedWord = false | |
timer = 0 | |
if getNbPlayers() > 1 then | |
master = randomPlayer() | |
tfm.exec.movePlayer(master, 400, 90, false, 0, 0, false) | |
askWord() | |
drawPendu() | |
else | |
removeAll() | |
ui.addTextArea(id["one_player"], "", nil, 5, 110, 790, 25, 0xC0C0C0, 0x595959, 1f) | |
ui.addTextArea(id["one_player_label"], "<p align='center'><BL><font color='#000000'>"..text.more_players.."</font></p>", nil, 25, 115, 750, 30, 0xC0C0C0, 0xC0C0C0, 0f) | |
drawWord() | |
drawPendu() | |
end | |
end | |
function eventPlayerDied(playerName) | |
tfm.exec.respawnPlayer(playerName) | |
end | |
function eventNewPlayer(playerName) | |
table.insert(players, playerName) | |
if getNbPlayers() == 2 then | |
tfm.exec.newGame("@4488917") | |
else | |
tfm.exec.respawnPlayer(playerName) | |
drawWord() | |
drawPendu() | |
end | |
end | |
function eventPlayerLeft(playerName) | |
local toRemove = 0 | |
for i,p in pairs(players) do | |
if p==playerName then | |
toRemove = i | |
end | |
end | |
table.remove(players, toRemove) | |
if getNbPlayers() == 1 then | |
tfm.exec.newGame("@4488917") | |
else | |
if playerName==master then | |
hasQuit = true | |
reset() | |
end | |
end | |
end | |
function eventLoop(currentTime, timeRemaining) | |
timer = timer + 0.5 | |
if beginReset then | |
ui.removeTextArea(id["ask_word_main"]) | |
ui.removeTextArea(id["ask_word_button"]) | |
resetTimer = resetTimer + 0.5 | |
ui.addTextArea(id["reset_timer"], "", nil, 5, 110, 790, 25, 0xC0C0C0, 0x595959, 1f) | |
if isTimeOut then ui.addTextArea(id["reset_timer_label"], "<p align='center'><BL>"..text.time_out.." <font color='#000000'>"..text.next_turn_1.."<font color='#FF0000'>"..math.floor(10 - resetTimer).."</font>"..text.next_turn_2.."</font></p>", nil, 25, 115, 750, 30, 0xC0C0C0, 0xC0C0C0, 0f) end | |
if hasWon then ui.addTextArea(id["reset_timer_label"], "<p align='center'><BL>"..text.word_found.." <font color='#000000'>"..text.next_turn_1.."<font color='#FF0000'>"..math.floor(10 - resetTimer).."</font>"..text.next_turn_2.."</font></p>", nil, 25, 115, 750, 30, 0xC0C0C0, 0xC0C0C0, 0f) end | |
if hasLost then ui.addTextArea(id["reset_timer_label"], "<p align='center'><font color='#000000'>"..text.word_not_found.."</font><BL>"..word:gsub("^%l", string.upper).."<font color='#000000'> ! "..text.next_turn_1.."<font color='#FF0000'>"..math.floor(10 - resetTimer).."</font>"..text.next_turn_2.."</font></p>", nil, 25, 115, 750, 30, 0xC0C0C0, 0xC0C0C0, 0f) end | |
if hasSkiped then ui.addTextArea(id["reset_timer_label"], "<p align='center'><BL>"..text.pass_turn.."<font color='#000000'> "..text.next_turn_1.."<font color='#FF0000'>"..math.floor(10 - resetTimer).."</font>"..text.next_turn_2.."</font></p>", nil, 25, 115, 750, 30, 0xC0C0C0, 0xC0C0C0, 0f) end | |
if hasQuit then ui.addTextArea(id["reset_timer_label"], "<p align='center'><BL>"..text.quit.."<font color='#000000'> "..text.next_turn_1.."<font color='#FF0000'>"..math.floor(10 - resetTimer).."</font>"..text.next_turn_2.."</font></p>", nil, 25, 115, 750, 30, 0xC0C0C0, 0xC0C0C0, 0f) end | |
end | |
checkBestPlayer() | |
if timer==25 and not hasDefinedWord and getNbPlayers() > 1 then | |
isTimeOut = true | |
reset() | |
end | |
if resetTimer==10 then | |
isTimeOut = false | |
hasWon = false | |
hasLost = false | |
hasSkiped = false | |
hasQuit = false | |
hasToReset = true | |
reset() | |
end | |
end | |
function eventChatCommand(playerName, message) | |
local args = {} | |
for arg in message:gmatch("[^%s]+") do | |
table.insert(args, arg:lower()) | |
end | |
if not hasLost and not hasSkiped and not hasQuit and args[1] ~= nil then | |
if args[1]==word and playerName ~= master and not hasWon then | |
local score = 0 | |
for _,letter in pairs(letters) do | |
if letter=="_" then score = score + 1 end | |
end | |
tfm.exec.setPlayerScore(playerName, score, true) | |
local i = 1 | |
while i <= word:len() do | |
if letters[i]~="_" then | |
invertLetters[i] = letters[i] | |
letters[i] = "_" | |
end | |
i = i + 1 | |
end | |
drawWord() | |
hasWon = true | |
reset() | |
end | |
if args[1]=="skip" and playerName==master and not hasWon and not hasLost and not isTimeOut then | |
hasSkiped = true | |
reset() | |
end | |
if args[1]:len()==1 and hasDefinedWord and args[1]~= "_" and args[1]~="-" and args[1]~="'" and playerName ~= master then | |
local isEntered = false | |
for _,letter in pairs(lettersEntered) do | |
if letter==args[1] then | |
isEntered = true | |
end | |
end | |
if not isEntered then | |
local score = 0 | |
local idsToRemove = {} | |
local isFalse = true | |
table.insert(lettersEntered, args[1]) | |
for id,letter in pairs(letters) do | |
if letter==args[1] then | |
table.insert(idsToRemove, id) | |
isFalse = false | |
end | |
end | |
for _,idToRemove in pairs(idsToRemove) do | |
invertLetters[idToRemove] = letters[idToRemove] | |
letters[idToRemove] = "_" | |
end | |
score = #idsToRemove | |
if isFalse then | |
if tfm.get.room.playerList[playerName].score > 0 then score = -1 end | |
pendu_level = pendu_level + 1 | |
table.insert(lettersNotWord, args[1]) | |
drawNotWord() | |
end | |
tfm.exec.setPlayerScore(playerName, score, true) | |
drawWord() | |
drawPendu() | |
end | |
end | |
end | |
end | |
function eventTextAreaCallback(textAreaId, playerName, callback) | |
if callback=="callbackAskWord" then | |
ui.addPopup(id["ask_word_popup"], 2, text.choose_word, master, 300, 175, 200) | |
end | |
end | |
function eventPopupAnswer(popupId, playerName, answer) | |
if popupId==id["ask_word_popup"] and not isTimeOut and master==playerName then | |
local choosedWord = tostring(answer) | |
if checkWord(choosedWord) then | |
defineWord(choosedWord) | |
hasDefinedWord = true | |
askWord() | |
ui.removeTextArea(id["turn"]) | |
ui.removeTextArea(id["turn_label"]) | |
end | |
end | |
end | |
function askWord() | |
ui.removeTextArea(id["reset_timer"]) | |
ui.removeTextArea(id["reset_timer_label"]) | |
ui.removeTextArea(id["ask_word_main"]) | |
ui.removeTextArea(id["ask_word_button"]) | |
if not hasDefinedWord then | |
ui.addTextArea(id["ask_word_main"], "", master, 5, 110, 790, 35, 0xC0C0C0, 0x595959, 1f) | |
ui.addTextArea(id["ask_word_button"], "<p align='center'><a href='event:callbackAskWord'>"..text.ask_word.."</a></p>", master, 300, 120, 190, 16, 0x595959, 0x595959, 1f) | |
for p,_ in pairs(tfm.get.room.playerList) do | |
if p~=master then | |
ui.addTextArea(id["turn"], "", p, 5, 110, 790, 25, 0xC0C0C0, 0x595959, 1f) | |
ui.addTextArea(id["turn_label"], "<p align='center'><font color='#000000'>"..text.turn_of_1.."</font><BL>"..master.."<font color='#000000'>"..text.turn_of_2..text.patientez.."</font></p>", p, 25, 115, 750, 30, 0xC0C0C0, 0xC0C0C0, 0f) | |
end | |
end | |
end | |
end | |
function defineWord(new_word) | |
word = string.lower(string.gsub(new_word, " ", "-")) | |
letters = {} | |
local i = 36 | |
while i < 50 do | |
ui.removeTextArea(i) | |
i = i + 1 | |
end | |
for letter in new_word:gmatch"." do | |
if letter==" " or letter=="-" then | |
table.insert(invertLetters, "-") | |
table.insert(letters, "_") | |
elseif letter=="'" then | |
table.insert(invertLetters, "'") | |
table.insert(letters, "_") | |
else | |
table.insert(letters, letter:lower()) | |
table.insert(invertLetters, "_") | |
end | |
end | |
drawWord() | |
drawPendu() | |
end | |
function drawWord() | |
local textId = 36 | |
local i = 1 | |
local ancreX = 40 | |
if #word==0 then | |
local i = 36 | |
while i < 51 do | |
ui.removeTextArea(i) | |
i = i + 1 | |
end | |
else | |
while i <= word:len() do | |
ui.addTextArea(textId, "<p align='center'><font size='40' color='#000000'>"..invertLetters[i]:upper().."</font></p>", nil, ancreX, 150, 40, 60, 0xC0C0C0, 0xC0C0C0, 1f) | |
ancreX = ancreX + 60 | |
textId = textId + 1 | |
i = i + 1 | |
end | |
local finished = true | |
local j = 1 | |
while j <= word:len() do | |
if invertLetters[j]=="_" then finished = false end | |
j = j + 1 | |
end | |
if finished then | |
hasWon = true | |
reset() | |
end | |
end | |
end | |
function drawNotWord() | |
local textId = 52 | |
local i = 1 | |
local t = 52 | |
local ancreX = 478 | |
print(lettersNotWord[i]) | |
while i <= #lettersNotWord do | |
ui.addTextArea(textId, "<p align='center'><font size='10' color='#000000'>"..lettersNotWord[i]:upper().."</font></p>", nil, ancreX, 246, 17, 18, 0xC0C0C0, 0xC0C0C0, 1f) | |
ancreX = ancreX + 29 | |
i = i + 1 | |
textId = textId + 1 | |
end | |
end | |
function drawPendu() | |
local pendu = "" | |
if pendu_level==1 then | |
pendu = pendu.."<br /><br /><br /><br /><br /><br /><br /><br /><br /> _________" | |
elseif pendu_level==2 then | |
pendu = pendu.."<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." ____|____" | |
elseif pendu_level==3 then | |
pendu = pendu.." __________.__<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." ____|____" | |
elseif pendu_level==4 then | |
pendu = pendu.." __________.__<br />" | |
pendu = pendu.." | /<br />" | |
pendu = pendu.." |/<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." ____|____" | |
elseif pendu_level==5 then | |
pendu = pendu.." __________.__<br />" | |
pendu = pendu.." | / |<br />" | |
pendu = pendu.." |/<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." ____|____" | |
elseif pendu_level==6 then | |
pendu = pendu.." __________.__<br />" | |
pendu = pendu.." | / |<br />" | |
pendu = pendu.." |/ O<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." ____|____" | |
elseif pendu_level==7 then | |
pendu = pendu.." __________.__<br />" | |
pendu = pendu.." | / |<br />" | |
pendu = pendu.." |/ O<br />" | |
pendu = pendu.." | /|<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." ____|____" | |
elseif pendu_level==8 then | |
pendu = pendu.." __________.__<br />" | |
pendu = pendu.." | / |<br />" | |
pendu = pendu.." |/ O<br />" | |
pendu = pendu.." | /|\<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." ____|____" | |
elseif pendu_level==9 then | |
pendu = pendu.." __________.__<br />" | |
pendu = pendu.." | / |<br />" | |
pendu = pendu.." |/ O<br />" | |
pendu = pendu.." | /|\\<br />" | |
pendu = pendu.." | |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." ____|____" | |
elseif pendu_level==10 then | |
pendu = pendu.." __________.__<br />" | |
pendu = pendu.." | / |<br />" | |
pendu = pendu.." |/ O<br />" | |
pendu = pendu.." | /|\\<br />" | |
pendu = pendu.." | |<br />" | |
pendu = pendu.." | /<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." |<br />" | |
pendu = pendu.." ____|____" | |
elseif pendu_level==11 then | |
pendu = pendu.." __________.__<br />" | |
pendu = pendu.." | / | <br />" | |
pendu = pendu.." |/ O <br />" | |
pendu = pendu.." | /|\\ <br />" | |
pendu = pendu.." | | <br />" | |
pendu = pendu.." | / \\ <br />" | |
pendu = pendu.." | <br />" | |
pendu = pendu.." | <br />" | |
pendu = pendu.." | <br />" | |
pendu = pendu.." ____|____" | |
hasLost = true | |
reset() | |
end | |
ui.addTextArea(id["pendu"], pendu, nil, 323, 235, 135, 138, 0x010101, 0xFFFFFF, 0.5f) | |
end | |
function reset() | |
beginReset = true | |
if hasToReset then | |
if getNbPlayers() < 2 then | |
tfm.exec.newGame("@4488917") | |
else | |
letters = {} | |
invertLetters = {} | |
word = "" | |
hasDefinedWord = false | |
pendu_level = 0 | |
beginReset = false | |
hasToReset = false | |
resetTimer = 0 | |
lettersEntered = {} | |
drawWord() | |
drawPendu() | |
local i = 52 | |
while i <= #lettersNotWord+52 do | |
ui.removeTextArea(i) | |
i = i + 1 | |
end | |
lettersNotWord = {} | |
local randX = math.random(799) | |
tfm.exec.movePlayer(master, randX, 385, false, 0, 0, false) | |
local oldMaster = master | |
if getNbPlayers()~=1 then | |
if bestPlayer==oldMaster then | |
while master==oldMaster do | |
master = randomPlayer() | |
end | |
else | |
master = bestPlayer | |
end | |
else | |
master = bestPlayer | |
end | |
randX = math.random(799) | |
tfm.exec.movePlayer(master, randX, 90, false, 0, 0, false) | |
tfm.exec.setPlayerScore(master, 0, false) | |
timer = 0 | |
askWord() | |
end | |
end | |
end | |
function removeAll() | |
ui.removeTextArea(id["ask_word_main"]) | |
ui.removeTextArea(id["ask_word_button"]) | |
ui.removeTextArea(id["ask_word_popup"]) | |
ui.removeTextArea(id["pendu"]) | |
ui.removeTextArea(id["reset_timer"]) | |
ui.removeTextArea(id["reset_timer_label"]) | |
ui.removeTextArea(id["turn"]) | |
ui.removeTextArea(id["turn_label"]) | |
ui.removeTextArea(id["one_player"]) | |
ui.removeTextArea(id["one_player_label"]) | |
end | |
function checkWord(word_arg) | |
if word_arg:len() >= 2 and word_arg:len() <= 12 then | |
for _,c in pairs(chars) do | |
if string.match(word_arg, c) then | |
return false | |
end | |
end | |
return true | |
else | |
return false | |
end | |
end | |
function checkBestPlayer() | |
topScore = 0 | |
bestPlayer = randomPlayer() | |
for name,player in pairs(tfm.get.room.playerList) do | |
if player.score >= topScore then | |
topScore = player.score | |
bestPlayer = name | |
end | |
end | |
end | |
function getNbPlayers() | |
return #players | |
end | |
function updatePlayersList() | |
players = {} | |
for p,_ in pairs(tfm.get.room.playerList) do | |
table.insert(players, p) | |
end | |
end | |
function randomPlayer() | |
return players[math.random(1,#players)] | |
end | |
for name,player in pairs(tfm.get.room.playerList) do | |
tfm.exec.setPlayerScore(name, 0, false) | |
end | |
updatePlayersList() | |
bestPlayer = randomPlayer() | |
tfm.exec.newGame("@4488917") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment