I converted this script with NightLitch?s Converter.
The Error-Message from Hub-Soft was this:
49: attempt to concatenate global `bot' (a nil value)
Maybe somebody can help? I?ll understand what "a nil value" means...what action had happend?
Here we go: (Part 1)
-- Connect 4
sBotName = "Connect 4";
frmHub:RegBot(sBotName);
VGScoresFile = "VGScores.txt" --The Scores File
VGFolder = "Games" --The Games Folder
Max1 = 3 -- How many topscorers are shown
-- ************* MAIN SCRIPT *************
VGPlayers = {}
curGames = {}
tInvite = {}
gameTrigs = {}
VGChat = {}
Matrix = {
TL = {
[1] = 6,[2] = 6,[3] = 5,[4] = 4,[5] = 3,[6] = 2,[7] = 1,
[8] = 5,[15] = 4,[22] = 3,[29] = 2,[36] = 1,
},
DL = {
[1] = 1,[8] = 2,[15] = 3,[22] = 4,[29] = 5,
[36] = 6,[37] = 6,[38] = 5,[39] = 4,[40] = 3,[41] = 2,[42] = 1,
},
}
timersets = { 0,0,0 }
VGScores = {}
dofile(VGFolder.."/"..VGScoresFile)
playchar1 = "X"
playchar2 = "O"
VGHelp = "--- Connect 4-Hilfe ---\r\n\r\n"..
"\t Main Chat\r\n"..
"\t-----------------------------------\r\n"..
"\tinvite "..bot.." - Herausforderung eines Users\r\n"..
"\ttopscore "..bot.." - TOP-Scorer\r\n"..
"\tmyscore "..bot.." - Dein Score\r\n"..
"\thelp "..bot.." - Diese Hilfe\r\n\r\n"..
"\t PM to "..bot.."\r\n"..
"\t-----------------------------------\r\n"..
"\tinvite - Herausforderung eines Users\r\n"..
"\tquit - Quit\r\n"..
"\ttopscore - TOP-Scorer\r\n"..
"\tmyscore - Dein Score\r\n"..
"\thelp - Diese Hilfe\r\n"
function Main()
for _ = 1,7 do
table.insert(gameTrigs,1)
end
if RegC4Bot == 1 then
frmHub:RegBot(bot)
end
SetTimer(10*1000)
StartTimer()
end
function OnTimer()
table.foreachi(timersets,function(i,_) timersets = timersets + 1 end)
table.foreach(tInvite, function(i,_)
tInvite[1] = tInvite[1] + 1
if tInvite[1] >= 6 then
tInvite = nil
end
end)
if timersets[1] == 30 then
timersets[1] = 0
WriteTable(VGScores,"VGScores",VGFolder.."/"..VGScoresFile)
end
if timersets[2] == 60 then
timersets[2] = 0
table.foreach(curGames, function(i,_)
curGames.timeout = curGames.timeout + 1
if curGames.timeout == 6 then
VGPlayers[curGames.players[1]] = nil
VGPlayers[curGames.players[2]] = nil
curGames = nil
end
end)
end
if timersets[3] == 6 then
timersets[3] = 0
table.foreach(VGChat, function(i,_)
if not VGPlayers then
VGChat[2] = VGChat[2] + 1
if VGChat[2] == 5 then
DelChat(i)
end
end
end)
end
end
function UserDisconnected(curUser)
if VGPlayers[string.lower(curUser.sName)] then
local curUser1 = GetItemByName(VGPlayers[string.lower(curUser.sName)].PlaysWith)
if curUser1 then
curUser1:SendPM(bot,"Dein Gegner ging OFF!")
end
DelGame(curUser)
DelChat(string.lower(curUser.sName))
end
end
OpDisconnected = UserDisconnected
function DataArrival(curUser,data)
if string.sub(data,1,1) == "<" then
if string.sub(data,string.len(data)-string.len(bot),string.len(data)-1) == bot then
local _,_,word1 = string.find(data,"^%b<>%s+(%S+)")
if word1 and VGFUNCS[string.lower(word1)] then
VGFUNCS[string.lower(word1)](curUser,string.sub(data,4+string.len(curUser.sName),string.len(data)-1),1)
return 1
end
end
elseif string.sub(data,1,4) == "$To:" then
if string.sub(data,6,5+(string.len(bot))) == bot then
pmmsg = string.sub(data,(18+string.len(bot)+2*string.len(curUser.sName)),(string.len(data)-1))
local _,_,word1 = string.find(pmmsg,"^(%S+)")
if word1 and VGFUNCS[string.lower(word1)] then
VGFUNCS[string.lower(word1)](curUser,pmmsg)
elseif (VGPlayers[string.lower(curUser.sName)]) and tonumber(word1) and gameTrigs[tonumber(word1)] then
Play4G(curUser,tonumber(word1))
elseif word1 and VGChat[string.lower(curUser.sName)] and VGFUNCS[string.lower(word1)] then
VGFUNCS[string.lower(word1)](curUser)
elseif VGChat[string.lower(curUser.sName)] then
local curUser1 = GetItemByName(VGChat[string.lower(curUser.sName)][1])
if curUser1 then
curUser1:SendData("$To: "..curUser1.sName.." von: "..bot.." $<"..curUser.sName.."> "..pmmsg)
ResetChat(string.lower(curUser.sName))
else
curUser:SendPM(bot,"Dein Gegner ging OFF!")
DelChat(string.lower(curUser.sName))
end
end
end
end
end
function OnExit()
WriteTable(VGScores,"VGScores",VGFolder.."/"..VGScoresFile)
end
-- ************* GAME FUNCTIONS *************
-- RESET A CHAT SESSION
function ResetChat(curNick1)
VGChat[VGChat[curNick1][1]][2] = 0
VGChat[curNick1][2] = 0
end
-- DELETE A CHAT SESSION
function DelChat(curNick1)
VGChat[VGChat[curNick1][1]] = nil
VGChat[curNick1] = nil
end
-- SHOW CURRENT GAME
function GetCurGame(table)
local VierGewinntFeld = "\r\n\r\n"..
"\t\t 1 2 3 4 5 6 7\r\n\r\n"
local count = 0
for i = 1,6 do
count = count + 1
VierGewinntFeld = VierGewinntFeld.."\t\t "..table[count][1]
for i2 = 1,7 do
if i2 == 7 then
VierGewinntFeld = VierGewinntFeld.."\r\n\t\t______________________________________________________\r\n\r\n"
else
count = count + 1
VierGewinntFeld = VierGewinntFeld.." l "..table[count][1]
end
end
end
return(VierGewinntFeld)
end
-- CREATE A GAME
function CreateGame(curNick1,curNick2)
curGames[curNick1.."$"..curNick2] = {
players = { curNick1,curNick2 },
toPlay = { curNick2,playchar1 },
game = {},
plays = 0,
timeout = 0,
}
VGPlayers[curNick1] = {
PlaysWith = curNick2,
curGame = curNick1.."$"..curNick2,
}
VGPlayers[curNick2] = {
PlaysWith = curNick1,
curGame = curNick1.."$"..curNick2,
}
VGChat[curNick1] = { curNick2,0 }
VGChat[curNick2] = { curNick1,0 }
for _ = 1,42 do
table.insert(curGames[curNick1.."$"..curNick2].game,{ " ",0 })
end
end
and Part 2:
-- DELETE A GAME
function DelGame(curUser)
local nick2 = VGPlayers[string.lower(curUser.sName)].PlaysWith
local game = VGPlayers[string.lower(curUser.sName)].curGame
curGames[game] = nil
VGPlayers[string.lower(curUser.sName)] = nil
VGPlayers[nick2] = nil
end
-- CHECK IF SOMEONE HAS WON
function doCheckForWin(curGame,char,index,line,chink)
--Up --> Down
local count = 0
for i = 0,5 do
if curGame[(chink+7*i)][1] == char then
count = count + 1
if count == 4 then
return("WON")
end
else
count = 0
end
end
--Left --> Right
local count = 0
local begin = 7*line
for i = 1,7 do
if curGame[(begin+i)][1] == char then
count = count + 1
if count == 4 then
return("WON")
end
else
count = 0
end
end
--UpLeft --> DownRight
local diffline = line
local diffchink = chink - 1
local mult = 0
if diffchink <= diffline then
mult = diffchink
else
mult = diffline
end
local sindex = index - mult*8
local count = 0
for _ = 1,Matrix.TL[sindex] do
if (curGame[sindex][1] == char) then
count = count + 1
if count == 4 then
return("WON")
end
else
count = 0
end
sindex = sindex + 8
end
--DownLeft --> UpRight
local diffline = 5 - line
local diffchink = chink - 1
local mult = 0
if diffchink <= diffline then
mult = diffchink
else
mult = diffline
end
local sindex = index + mult*6
local count = 0
for _ = 1,Matrix.DL[sindex] do
if (curGame[sindex][1] == char) then
count = count + 1
if count == 4 then
return("WON")
end
else
count = 0
end
sindex = sindex - 6
end
end
-- INSERT X
function doInsertX(game,chink,char)
local mult = 5
for _ = 0,5 do
if game[(chink+7*mult)][2] == 0 then
game[(chink+7*mult)] = { char,1 }
if doCheckForWin(game,char,(chink+7*mult),mult,chink) == "WON" then
return game,"WON"
else
return game,"PLAY"
end
end
mult = mult - 1
end
return("FAILED")
end
-- PLAY ONE ROUND
function Play4G(curUser,num1)
local sGame = curGames[VGPlayers[string.lower(curUser.sName)].curGame].game
if (string.lower(curUser.sName) == curGames[VGPlayers[string.lower(curUser.sName)].curGame].toPlay[1]) then
if GetItemByName(VGPlayers[string.lower(curUser.sName)].PlaysWith) then
ResetChat(string.lower(curUser.sName))
local curUser1 = GetItemByName(VGPlayers[string.lower(curUser.sName)].PlaysWith)
local char = curGames[VGPlayers[string.lower(curUser.sName)].curGame].toPlay[2]
local sGame,wp = doInsertX(sGame,num1,char)
if (sGame ~= "FAILED") then
curGames[VGPlayers[string.lower(curUser.sName)].curGame].game = sGame
curGames[VGPlayers[string.lower(curUser.sName)].curGame].timeout = 0
if char == playchar1 then
curGames[VGPlayers[string.lower(curUser.sName)].curGame].toPlay = { string.lower(curUser1.sName),playchar2 }
else
curGames[VGPlayers[string.lower(curUser.sName)].curGame].toPlay = { string.lower(curUser1.sName),playchar1 }
end
curUser:SendPM(bot,GetCurGame(sGame))
curUser1:SendPM(bot,curUser.sName.." Fertig... "..num1..", DU bist d?ran!"..GetCurGame(sGame))
if wp == "WON" then
curUser:SendPM(bot,"****** SIEG! ********")
VGScores[curUser.sName] = VGScores[curUser.sName] or { wins = 0, losses = 0, lstreak = 0, cstreak = 0, }
VGScores[curUser.sName].wins = VGScores[curUser.sName].wins + 1
VGScores[curUser.sName].cstreak = VGScores[curUser.sName].cstreak + 1
if VGScores[curUser.sName].cstreak > VGScores[curUser.sName].lstreak then
VGScores[curUser.sName].lstreak = VGScores[curUser.sName].cstreak
end
curUser:SendPM(bot,"Dein aktueller Status: Siege = "..VGScores[curUser.sName].wins..", Niederlagen = "..VGScores[curUser.sName].losses..", L?ngster Kampf: "..VGScores[curUser.sName].lstreak)
curUser:SendPM(bot,"Du willst ein neues Spiel beginnen? Schreib? \"newgame\"")
curUser1:SendPM(bot,"****** NIEDERLAGE! ********")
VGScores[curUser1.sName] = VGScores[curUser1.sName] or { wins = 0, losses = 0, lstreak = 0, cstreak = 0, }
VGScores[curUser1.sName].losses = VGScores[curUser1.sName].losses + 1
VGScores[curUser1.sName].cstreak = 0
curUser1:SendPM(bot,"Dein aktueller Status: Siege = "..VGScores[curUser1.sName].wins..", Niederlagen = "..VGScores[curUser1.sName].losses..", L?ngster Kampf: "..VGScores[curUser1.sName].lstreak)
curUser1:SendPM(bot,"Du willst ein neues Spiel beginnen? Schreib? \"newgame\"")
DelGame(curUser)
return
elseif wp == "PLAY" then
curGames[VGPlayers[string.lower(curUser.sName)].curGame].plays = curGames[VGPlayers[string.lower(curUser.sName)].curGame].plays + 1
if curGames[VGPlayers[string.lower(curUser.sName)].curGame].plays == 42 then
curUser:SendPM(bot,"****** UNENTSCHIEDEN ********")
curUser:SendPM(bot,"Dein aktueller Status: Siege = "..VGScores[curUser.sName].wins..", Niederlagen = "..VGScores[curUser.sName].losses..", L?ngster Kampf: "..VGScores[curUser.sName].lstreak)
curUser:SendPM(bot,"Du willst ein neues Spiel beginnen? Schreib? \"newgame\"")
curUser1:SendPM(bot,"****** GAME ENDED EVEN ********")
curUser1:SendPM(bot,"Dein aktueller Status: Siege = "..VGScores[curUser.sName].wins..", Niederlagen = "..VGScores[curUser.sName].losses..", L?ngster Kampf: "..VGScores[curUser.sName].lstreak)
curUser:SendPM(bot,"Du willst ein neues Spiel beginnen? Schreib? \"newgame\"")
DelGame(curUser)
return
end
end
end
else
curUser:SendPM(bot,"Dein Gegner ging OFF!")
DelGame(curUser,curUser1)
DelChat(string.lower(curUser.sName))
end
end
end
-- Write Tables
function WriteTable(table,tablename,ffile)
local handle = io.open(ffile,"w")
Serialize(table,tablename,handle)
io.close(handle)
end
function Serialize(tTable,sTableName,hFile,sTab)
sTab = sTab or "";
write(hFile,sTab..sTableName.." = {\n");
for key,value in tTable do
local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then
Serialize(value,sKey,hFile,sTab.."\t");
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
write(hFile,sTab.."\t"..sKey.." = "..sValue);
end
write(hFile,",\n");
end
write(hFile,sTab.."}");
end
function doInvite(curUser,invited,ret)
if invited and (not VGPlayers[string.lower(curUser.sName)]) and GetItemByName(invited) and (not VGPlayers[string.lower(invited)]) then
tInvite[string.lower(invited)] = { 0,string.lower(curUser.sName) }
curUser:SendPM(bot,"Sende Herausforderung an "..invited.."!")
GetItemByName(invited):SendPM(bot,curUser.sName.." L?dt ein zu einer Session *Vier Gewinnt*, Schreib?: ja oder nein...")
else
if ret then
curUser:SendData(tbot,"Entweder spielst Du bereits oder dein gew. Partner ist OFF!")
else
curUser:SendPM(tbot,"Entweder spielst Du bereits oder dein gew. Partner ist OFF!")
end
end
end
-- VG TABLE FUNCS
VGFUNCS = {
["invite"] = function(curUser,sdata,ret)
local _,_,invited = string.find(sdata,"^%S+%s+(%S+)")
local invited = invited or "$"
doInvite(curUser,invited,ret)
end,
["quit"] = function(curUser)
if VGPlayers[string.lower(curUser.sName)] then
curUser:SendPM(bot,"! Game Over !")
local curUser2 = GetItemByName(VGPlayers[string.lower(curUser.sName)].PlaysWith)
curUser2:SendPM(bot,curUser.sName.." verl?sst das Spiel...")
DelGame(curUser)
end
end,
["ja"] = function(curUser)
if tInvite[string.lower(curUser.sName)] then
if GetItemByName(tInvite[string.lower(curUser.sName)][2]) and (not VGPlayers[tInvite[string.lower(curUser.sName)][2]]) then
local curUser2 = GetItemByName(tInvite[string.lower(curUser.sName)][2])
CreateGame(string.lower(curUser.sName),string.lower(curUser2.sName))
curUser2:SendPM(bot,curUser.sName.." nimmt an...")
curUser2:SendPM(bot,GetCurGame(curGames[VGPlayers[string.lower(curUser2.sName)].curGame].game))
curUser:SendPM(bot,"Warte auf "..curUser2.sName.." um zu starten...")
else
curUser:SendPM(bot,"Entweder der Andere ist OFF oder spielt bereits!")
end
tInvite[string.lower(curUser.sName)] = nil
end
end,
["nein"] = function(curUser)
if tInvite[string.lower(curUser.sName)] then
curUser:SendPM(bot,"Herausforderung abgelehnt!")
GetItemByName(tInvite[string.lower(curUser.sName)][2]):SendPM(bot,"Herausforderung abgelehnt! ^^")
tInvite[string.lower(curUser.sName)] = nil
end
end,
["topscore"] = function(curUser,_,ret)
--local ATable = {}
table.foreach(VGScores, function(i,v) table.insert(ATable, { i,v }) end)
local msg = "--- TOP "..Max1.." Connect 4 Status ---\r\n"
table.sort(ATable, function(a,b) return(a[2].wins > b[2].wins) end)
local msg = msg.."\r\n\t--- TOP-SIEGER ---\r\n\r\n"
for i = 1,Max1 do
if ATable then
msg = msg.."\t# "..i.." - "..ATable[1].." mit: "..ATable[2].wins.." Siegen, "..ATable[2].losses.." Niederlagen, "..ATable[2].lstreak.." K?mpfen\r\n"
end
end
table.sort(ATable, function(a,b) return(a[2].lstreak > b[2].lstreak) end)
local msg = msg.."\r\n\t--- TOP-K?mpfer ---\r\n\r\n"
for i = 1,Max1 do
if ATable then
msg = msg.."\t# "..i.." - "..ATable[1].." mit: "..ATable[2].lstreak.." K?mpfen, "..ATable[2].wins.." Siegen, "..ATable[2].losses.." Niederlagen\r\n"
end
end
table.sort(ATable, function(a,b) return(a[2].losses > b[2].losses) end)
local msg = msg.."\r\n\t--- TOP-Loser ---\r\n\r\n"
for i = 1,Max1 do
if ATable then
msg = msg.."\t# "..i.." - "..ATable[1].." mit: "..ATable[2].losses.." Niederlagen, "..ATable[2].wins.." Siegen, "..ATable[2].lstreak.." K?mpfen\r\n"
end
end
if ret then
curUser:SendData(bot,msg)
else
curUser:SendPM(bot,msg)
end
end,
["myscore"] = function(curUser,_,ret)
VGScores[curUser.sName] = VGScores[curUser.sName] or { wins = 0, losses = 0, lstreak = 0, cstreak = 0, }
if ret then
curUser:SendData(bot,"Dein Status: ".. VGScores[curUser.sName].wins.." Siege, ".. VGScores[curUser.sName].losses.." Niederlagen, ".. VGScores[curUser.sName].lstreak.." K?mpfe")
else
curUser:SendPM(bot,"Dein Status: ".. VGScores[curUser.sName].wins.." Siege, ".. VGScores[curUser.sName].losses.." Niederlagen, ".. VGScores[curUser.sName].lstreak.." K?mpfe")
end
end,
["newgame"] = function(curUser)
doInvite(curUser,VGChat[string.lower(curUser.sName)][1])
end,
["help"] = function(curUser,_,ret)
if ret then
curUser:SendData(bot,VGHelp)
else
curUser:SendPM(bot,VGHelp)
end
end,
}
next time use "[ code ] " before the script and "[ /code ] " after, or highlight the text and click "#" its easier to read when thats done :), anyhow here goes the script :
part 1
--Lua 5 by Dessamator
--script by chill , i guess, :)
-- Connect 4
bot = "Connect4";
RegC4Bot = 1
VGScoresFile = "VGScores.txt" --The Scores File
VGFolder = "Games" --The Games Folder
Max1 = 3 -- How many topscorers are shown
-- ************* MAIN SCRIPT *************
VGPlayers = {}
curGames = {}
tInvite = {}
gameTrigs = {}
VGChat = {}
Matrix = {
TL = {
[1] = 6,[2] = 6,[3] = 5,[4] = 4,[5] = 3,[6] = 2,[7] = 1,
[8] = 5,[15] = 4,[22] = 3,[29] = 2,[36] = 1,
},
DL = {
[1] = 1,[8] = 2,[15] = 3,[22] = 4,[29] = 5,
[36] = 6,[37] = 6,[38] = 5,[39] = 4,[40] = 3,[41] = 2,[42] = 1,
},
}
timersets = { 0,0,0 }
VGScores = {}
dofile(VGFolder.."/"..VGScoresFile)
playchar1 = "X"
playchar2 = "O"
VGHelp = "--- Connect 4-Hilfe ---\r\n\r\n"..
"\t Main Chat\r\n"..
"\t-----------------------------------\r\n"..
"\tinvite "..bot.." - Herausforderung eines Users\r\n"..
"\ttopscore "..bot.." - TOP-Scorer\r\n"..
"\tmyscore "..bot.." - Dein Score\r\n"..
"\thelp "..bot.." - Diese Hilfe\r\n\r\n"..
"\t PM to "..bot.."\r\n"..
"\t-----------------------------------\r\n"..
"\tinvite - Herausforderung eines Users\r\n"..
"\tquit - Quit\r\n"..
"\ttopscore - TOP-Scorer\r\n"..
"\tmyscore - Dein Score\r\n"..
"\thelp - Diese Hilfe\r\n"
function Main()
for _ = 1,7 do
table.insert(gameTrigs,1)
end
if RegC4Bot == 1 then
frmHub:RegBot(bot)
end
SetTimer(10*1000)
StartTimer()
end
function OnTimer()
table.foreachi(timersets,function(i,_) timersets[i] = timersets[i] + 1 end)
table.foreach(tInvite, function(i,_)
tInvite[i][1] = tInvite[i][1] + 1
if tInvite[i][1] >= 6 then
tInvite[i] = nil
end
end)
if timersets[1] == 30 then
timersets[1] = 0
WriteTable(VGFolder.."/"..VGScoresFile,VGScores,"VGScores")
end
if timersets[2] == 60 then
timersets[2] = 0
table.foreach(curGames, function(i,_)
curGames[i].timeout = curGames[i].timeout + 1
if curGames[i].timeout == 6 then
VGPlayers[curGames[i].players[1]] = nil
VGPlayers[curGames[i].players[2]] = nil
curGames[i] = nil
end
end)
end
if timersets[3] == 6 then
timersets[3] = 0
table.foreach(VGChat, function(i,_)
if not VGPlayers[i] then
VGChat[i][2] = VGChat[i][2] + 1
if VGChat[i][2] == 5 then
DelChat(i)
end
end
end)
end
end
function UserDisconnected(curUser)
if VGPlayers[string.lower(curUser.sName)] then
local curUser1 = GetItemByName(VGPlayers[string.lower(curUser.sName)].PlaysWith)
if curUser1 then
curUser1:SendPM(bot,"Dein Gegner ging OFF!")
end
DelGame(curUser)
DelChat(string.lower(curUser.sName))
end
end
OpDisconnected = UserDisconnected
function ChatArrival(curUser,data)
if string.sub(data,string.len(data)-string.len(bot),string.len(data)-1) == bot then
local _,_,word1 = string.find(data,"^%b<>%s+(%S+)")
if word1 and VGFUNCS[string.lower(word1)] then
VGFUNCS[string.lower(word1)](curUser,string.sub(data,4+string.len(curUser.sName),string.len(data)-1),1)
return 1
end
end
end
function ToArrival(curUser,data)
if string.sub(data,6,5+(string.len(bot))) == bot then
pmmsg = string.sub(data,(18+string.len(bot)+2*string.len(curUser.sName)),(string.len(data)-1))
local _,_,word1 = string.find(pmmsg,"^(%S+)")
if word1 and VGFUNCS[string.lower(word1)] then
VGFUNCS[string.lower(word1)](curUser,pmmsg)
elseif (VGPlayers[string.lower(curUser.sName)]) and tonumber(word1) and gameTrigs[tonumber(word1)] then
Play4G(curUser,tonumber(word1))
elseif word1 and VGChat[string.lower(curUser.sName)] and VGFUNCS[string.lower(word1)] then
VGFUNCS[string.lower(word1)](curUser)
elseif VGChat[string.lower(curUser.sName)] then
local curUser1 = GetItemByName(VGChat[string.lower(curUser.sName)][1])
if curUser1 then
curUser1:SendData("$To: "..curUser1.sName.." von: "..bot.." $<"..curUser.sName.."> "..pmmsg)
ResetChat(string.lower(curUser.sName))
else
curUser:SendPM(bot,"Dein Gegner ging OFF!")
DelChat(string.lower(curUser.sName))
end
end
end
end
function OnExit()
WriteTable(VGFolder.."/"..VGScoresFile,VGScores,"VGScores")
end
-- ************* GAME FUNCTIONS *************
-- RESET A CHAT SESSION
function ResetChat(curNick1)
VGChat[VGChat[curNick1][1]][2] = 0
VGChat[curNick1][2] = 0
end
-- DELETE A CHAT SESSION
function DelChat(curNick1)
VGChat[VGChat[curNick1][1]] = nil
VGChat[curNick1] = nil
end
-- SHOW CURRENT GAME
function GetCurGame(table)
local VierGewinntFeld = "\r\n\r\n".. "\t\t 1 2 3 4 5 6 7\r\n\r\n"
local count = 0
for i = 1,6 do
count = count + 1
VierGewinntFeld = VierGewinntFeld.."\t\t "..table[count][1]
for i2 = 1,7 do
if i2 == 7 then
VierGewinntFeld = VierGewinntFeld.."\r\n\t\t______________________________________________________\r\n\r\n "
else
count = count + 1
VierGewinntFeld = VierGewinntFeld.." l "..table[count][1]
end
end
end
return(VierGewinntFeld)
end
-- CREATE A GAME
function CreateGame(curNick1,curNick2)
curGames[curNick1.."$"..curNick2] = {
players = { curNick1,curNick2 },
toPlay = { curNick2,playchar1 },
game = {},
plays = 0,
timeout = 0,
}
VGPlayers[curNick1] = {
PlaysWith = curNick2,
curGame = curNick1.."$"..curNick2,
}
VGPlayers[curNick2] = {
PlaysWith = curNick1,
curGame = curNick1.."$"..curNick2,
}
VGChat[curNick1] = { curNick2,0 }
VGChat[curNick2] = { curNick1,0 }
for _ = 1,42 do
table.insert(curGames[curNick1.."$"..curNick2].game,{ " ",0 })
end
end
part 2 :
-- DELETE A GAME
function DelGame(curUser)
local nick2 = VGPlayers[string.lower(curUser.sName)].PlaysWith
local game = VGPlayers[string.lower(curUser.sName)].curGame
curGames[game] = nil
VGPlayers[string.lower(curUser.sName)] = nil
VGPlayers[nick2] = nil
end
-- CHECK IF SOMEONE HAS WON
function doCheckForWin(curGame,char,index,line,chink)
--Up --> Down
local count = 0
for i = 0,5 do
if curGame[(chink+7*i)][1] == char then
count = count + 1
if count == 4 then
return("WON")
end
else
count = 0
end
end
--Left --> Right
local count = 0
local begin = 7*line
for i = 1,7 do
if curGame[(begin+i)][1] == char then
count = count + 1
if count == 4 then
return("WON")
end
else
count = 0
end
end
--UpLeft --> DownRight
local diffline = line
local diffchink = chink - 1
local mult = 0
if diffchink <= diffline then
mult = diffchink
else
mult = diffline
end
local sindex = index - mult*8
local count = 0
for _ = 1,Matrix.TL[sindex] do
if (curGame[sindex][1] == char) then
count = count + 1
if count == 4 then
return("WON")
end
else
count = 0
end
sindex = sindex + 8
end
--DownLeft --> UpRight
local diffline = 5 - line
local diffchink = chink - 1
local mult = 0
if diffchink <= diffline then
mult = diffchink
else
mult = diffline
end
local sindex = index + mult*6
local count = 0
for _ = 1,Matrix.DL[sindex] do
if (curGame[sindex][1] == char) then
count = count + 1
if count == 4 then
return("WON")
end
else
count = 0
end
sindex = sindex - 6
end
end
-- INSERT X
function doInsertX(game,chink,char)
local mult = 5
for _ = 0,5 do
if game[(chink+7*mult)][2] == 0 then
game[(chink+7*mult)] = { char,1 }
if doCheckForWin(game,char,(chink+7*mult),mult,chink) == "WON" then
return game,"WON"
else
return game,"PLAY"
end
end
mult = mult - 1
end
return("FAILED")
end
-- PLAY ONE ROUND
function Play4G(curUser,num1)
local sGame = curGames[VGPlayers[string.lower(curUser.sName)].curGame].game
if (string.lower(curUser.sName) == curGames[VGPlayers[string.lower(curUser.sName)].curGame].toPlay[1]) then
if GetItemByName(VGPlayers[string.lower(curUser.sName)].PlaysWith) then
ResetChat(string.lower(curUser.sName))
local curUser1 = GetItemByName(VGPlayers[string.lower(curUser.sName)].PlaysWith)
local char = curGames[VGPlayers[string.lower(curUser.sName)].curGame].toPlay[2]
local sGame,wp = doInsertX(sGame,num1,char)
if (sGame ~= "FAILED") then
curGames[VGPlayers[string.lower(curUser.sName)].curGame].game = sGame
curGames[VGPlayers[string.lower(curUser.sName)].curGame].timeout = 0
if char == playchar1 then
curGames[VGPlayers[string.lower(curUser.sName)].curGame].toPlay = { string.lower(curUser1.sName),playchar2 }
else
curGames[VGPlayers[string.lower(curUser.sName)].curGame].toPlay = { string.lower(curUser1.sName),playchar1 }
end
curUser:SendPM(bot,GetCurGame(sGame))
curUser1:SendPM(bot,curUser.sName.." Fertig... "..num1..", DU bist d?ran!"..GetCurGame(sGame))
if wp == "WON" then
curUser:SendPM(bot,"****** SIEG! ********")
VGScores[curUser.sName] = VGScores[curUser.sName] or { wins = 0, losses = 0, lstreak = 0, cstreak = 0, }
VGScores[curUser.sName].wins = VGScores[curUser.sName].wins + 1
VGScores[curUser.sName].cstreak = VGScores[curUser.sName].cstreak + 1
if VGScores[curUser.sName].cstreak > VGScores[curUser.sName].lstreak then
VGScores[curUser.sName].lstreak = VGScores[curUser.sName].cstreak
end
curUser:SendPM(bot,"Dein aktueller Status: Siege = "..VGScores[curUser.sName].wins..", Niederlagen = "..VGScores[curUser.sName].losses..", L?ngster Kampf: "..VGScores[curUser.sName].lstreak)
curUser:SendPM(bot,"Du willst ein neues Spiel beginnen? Schreib? \"newgame\"")
curUser1:SendPM(bot,"****** NIEDERLAGE! ********")
VGScores[curUser1.sName] = VGScores[curUser1.sName] or { wins = 0, losses = 0, lstreak = 0, cstreak = 0, }
VGScores[curUser1.sName].losses = VGScores[curUser1.sName].losses + 1
VGScores[curUser1.sName].cstreak = 0
curUser1:SendPM(bot,"Dein aktueller Status: Siege = "..VGScores[curUser1.sName].wins..", Niederlagen = "..VGScores[curUser1.sName].losses..", L?ngster Kampf: "..VGScores[curUser1.sName].lstreak)
curUser1:SendPM(bot,"Du willst ein neues Spiel beginnen? Schreib? \"newgame\"")
DelGame(curUser)
return
elseif wp == "PLAY" then
curGames[VGPlayers[string.lower(curUser.sName)].curGame].plays = curGames[VGPlayers[string.lower(curUser.sName)].curGame].plays + 1
if curGames[VGPlayers[string.lower(curUser.sName)].curGame].plays == 42 then
curUser:SendPM(bot,"****** UNENTSCHIEDEN ********")
curUser:SendPM(bot,"Dein aktueller Status: Siege = "..VGScores[curUser.sName].wins..", Niederlagen = "..VGScores[curUser.sName].losses..", L?ngster Kampf: "..VGScores[curUser.sName].lstreak)
curUser:SendPM(bot,"Du willst ein neues Spiel beginnen? Schreib? \"newgame\"")
curUser1:SendPM(bot,"****** GAME ENDED EVEN ********")
curUser1:SendPM(bot,"Dein aktueller Status: Siege = "..VGScores[curUser.sName].wins..", Niederlagen = "..VGScores[curUser.sName].losses..", L?ngster Kampf: "..VGScores[curUser.sName].lstreak)
curUser:SendPM(bot,"Du willst ein neues Spiel beginnen? Schreib? \"newgame\"")
DelGame(curUser)
return
end
end
end
else
curUser:SendPM(bot,"Dein Gegner ging OFF!")
DelGame(curUser,curUser1)
DelChat(string.lower(curUser.sName))
end
end
end
-- Write Tables
function WriteTable(file , table , tablename)
local handle = io.open(file,"w+")
handle:write(Serialize(table, tablename))
handle:flush()
handle:close()
end
function Serialize(tTable, sTableName, sTab)
assert(tTable, "tTable equals nil");
assert(sTableName, "sTableName equals nil");
assert(type(tTable) == "table", "tTable must be a table!");
assert(type(sTableName) == "string", "sTableName must be a string!");
sTab = sTab or "";
sTmp = ""
sTmp = sTmp..sTab..sTableName.." = {\n"
for key, value in tTable do
local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
if(type(value) == "table") then
sTmp = sTmp..Serialize(value, sKey, sTab.."\t");
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value);
sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
end
sTmp = sTmp..",\n"
end
sTmp = sTmp..sTab.."}"
return sTmp
end
function doInvite(curUser,invited,ret)
if invited and (not VGPlayers[string.lower(curUser.sName)]) and GetItemByName(invited) and (not VGPlayers[string.lower(invited)]) then
tInvite[string.lower(invited)] = { 0,string.lower(curUser.sName) }
curUser:SendPM(bot,"Sende Herausforderung an "..invited.."!")
GetItemByName(invited):SendPM(bot,curUser.sName.." L?dt ein zu einer Session *Vier Gewinnt*, Schreib?: ja oder nein...")
else
if ret then
curUser:SendData(tbot,"Entweder spielst Du bereits oder dein gew. Partner ist OFF!")
else
curUser:SendPM(tbot,"Entweder spielst Du bereits oder dein gew. Partner ist OFF!")
end
end
end
-- VG TABLE FUNCS
VGFUNCS = {
["invite"] = function(curUser,sdata,ret)
local _,_,invited = string.find(sdata,"^%S+%s+(%S+)")
local invited = invited or "$"
doInvite(curUser,invited,ret)
end,
["quit"] = function(curUser)
if VGPlayers[string.lower(curUser.sName)] then
curUser:SendPM(bot,"! Game Over !")
local curUser2 = GetItemByName(VGPlayers[string.lower(curUser.sName)].PlaysWith)
curUser2:SendPM(bot,curUser.sName.." verl?sst das Spiel...")
DelGame(curUser)
end
end,
["ja"] = function(curUser)
if tInvite[string.lower(curUser.sName)] then
if GetItemByName(tInvite[string.lower(curUser.sName)][2]) and (not VGPlayers[tInvite[string.lower(curUser.sName)][2]]) then
local curUser2 = GetItemByName(tInvite[string.lower(curUser.sName)][2])
CreateGame(string.lower(curUser.sName),string.lower(curUser2.sName))
curUser2:SendPM(bot,curUser.sName.." nimmt an...")
curUser2:SendPM(bot,GetCurGame(curGames[VGPlayers[string.lower(curUser2.sName)].curGame].game))
curUser:SendPM(bot,"Warte auf "..curUser2.sName.." um zu starten...")
else
curUser:SendPM(bot,"Entweder der Andere ist OFF oder spielt bereits!")
end
tInvite[string.lower(curUser.sName)] = nil
end
end,
["nein"] = function(curUser)
if tInvite[string.lower(curUser.sName)] then
curUser:SendPM(bot,"Herausforderung abgelehnt!")
GetItemByName(tInvite[string.lower(curUser.sName)][2]):SendPM(bot,"Herausforderung abgelehnt! ^^")
tInvite[string.lower(curUser.sName)] = nil
end
end,
["topscore"] = function(curUser,_,ret)
local ATable = {}
table.foreach(VGScores, function(i,v) table.insert(ATable, { i,v }) end)
local msg = "--- TOP "..Max1.." Connect 4 Status ---\r\n"
table.sort(ATable, function(a,b) return(a[2].wins > b[2].wins) end)
local msg = msg.."\r\n\t--- TOP-SIEGER ---\r\n\r\n"
for i = 1,Max1 do
if ATable[i] then
msg = msg.."\t# "..i.." - "..ATable[i][1].." mit: "..ATable[i][2].wins.." Siegen, "..ATable[i][2].losses.." Niederlagen, "..ATable[i][2].lstreak.." K?mpfen\r\n"
end
end
table.sort(ATable, function(a,b) return(a[2].lstreak > b[2].lstreak) end)
local msg = msg.."\r\n\t--- TOP-K?mpfer ---\r\n\r\n"
for i = 1,Max1 do
if ATable[i] then
msg = msg.."\t# "..i.." - "..ATable[i][1].." mit: "..ATable[i][2].lstreak.." K?mpfen, "..ATable[i][2].wins.." Siegen, "..ATable[i][2].losses.." Niederlagen\r\n"
end
end
table.sort(ATable, function(a,b) return(a[2].losses > b[2].losses) end)
local msg = msg.."\r\n\t--- TOP-Loser ---\r\n\r\n"
for i = 1,Max1 do
if ATable[i] then
msg = msg.."\t# "..i.." - "..ATable[i][1].." mit: "..ATable[i][2].losses.." Niederlagen, "..ATable[i][2].wins.." Siegen, "..ATable[i][2].lstreak.." K?mpfen\r\n"
end
end
if ret then
curUser:SendData(bot,msg)
else
curUser:SendPM(bot,msg)
end
end,
["myscore"] = function(curUser,_,ret)
VGScores[curUser.sName] = VGScores[curUser.sName] or { wins = 0, losses = 0, lstreak = 0, cstreak = 0, }
if ret then
curUser:SendData(bot,"Dein Status: ".. VGScores[curUser.sName].wins.." Siege, ".. VGScores[curUser.sName].losses.." Niederlagen, ".. VGScores[curUser.sName].lstreak.." K?mpfe")
else
curUser:SendPM(bot,"Dein Status: ".. VGScores[curUser.sName].wins.." Siege, ".. VGScores[curUser.sName].losses.." Niederlagen, ".. VGScores[curUser.sName].lstreak.." K?mpfe")
end
end,
["newgame"] = function(curUser)
doInvite(curUser,VGChat[string.lower(curUser.sName)][1])
end,
["help"] = function(curUser,_,ret)
if ret then
curUser:SendData(bot,VGHelp)
else
curUser:SendPM(bot,VGHelp)
end
end,
}