--[[
| API debug ( http://atelier801.com/topic?f=6&t=793167 par Alexpp, version 2_1)
| !! Mettre après les fonctions eventNewPlayer, eventKeyboard si vous en avez !!
|
| Initialisation de l'api:
| 
| mdebug = apidebug()
| --! normalement présent dans tout les scripts:
| for name, player in pairs(tfm.get.room.playerList) do eventNewPlayer(name) end
|
| Fonctions disponible après init
| print(...)
| mdebug.log(...)
| - ...: any → Toutes données à surveiller/debugger
|
| printf(format, ...)
| mdebug.logs(format,...)
| - format: string → chaine de mise en forme, ex: "C'est quoi ça: %s ?" (%s = data)
| - ...: any → Toutes données à surveiller/debugger
|
| mdebug.log2(...)
| S'affiche dans le mini panneau
| - ...: any → Toutes données à surveiller/debugger
|
| mdebug.logs2(format, ...)
| S'affiche dans le mini panneau
| - format: string → chaine de mise en forme, ex: "C'est quoi ça: %s ?" (%s = data)
| - ...: any → Toutes données à surveiller/debugger
|
| mdebug.print(data)
| fonction print d'origine
|
| mdebug.panel(playerName, ShowPanel)
| Fonction pour afficher ou non (ShowPanel) le(s) panneau(x) à playerName
| - playerName: string → Nom du joueur
| - ShowPanel: boolean → true / false
|
-]]
local function apidebug()
	--[[ Début configuration ]]--
	local Active       = true --! false: totalement inactif, true: activation possible pour les admins
	local ShowPanel    = true --! Affiche ou non le(s) panneau(x) debug aux admins au démarrage
	local Admins       = { Alexpp=true, ["+Alexpp"]=true } --! Liste d'accès (Première lettre en majuscule)
	local SwitchKeycode= 110  --! Touche pour (dés)activer le(s) panneau(x) à un admin (110 = touche point du pavé numérique, false=désactivé)
	local Coord1       = {id=1000, x=-235, y=-100, w=230, h=800, a=0.7} --! Configuration du gros panneau (false=désactivé)
	local Coord2       = {id=1001, x=   5, y=-100, a=0.7}               --! Configuration du panneau monoligne (false=désactivé)
	--[[ Fin configuration ]]--
	local self     = {}
	local UseDebug = {}
	local DEBUG    = {}
	self._eventNewPlayer = _G.eventNewPlayer
	self._eventKeyboard  = _G.eventKeyboard
	self._print          = _G.print
	self.eventNewPlayer = function (playerName)
		if self._eventNewPlayer then self._eventNewPlayer(playerName) end
		if Admins[playerName] then
			if SwitchKeycode then tfm.exec.bindKeyboard(playerName, SwitchKeycode, true, true) end
			UseDebug[playerName] = ShowPanel
			self.Panel(playerName, ShowPanel)
		end
	end
	self.eventKeyboard = function(playerName, keyCode)
		if self._eventKeyboard then self._eventKeyboard(playerName, keyCode) end
		if Admins[playerName] and SwitchKeycode and keyCode == SwitchKeycode then
			if UseDebug[playerName] == nil then
				UseDebug[playerName] = ShowPanel
			else
				UseDebug[playerName] = not UseDebug[playerName]
			end
			self.Panel(playerName, UseDebug[playerName])
		end
	end
	self.print = function (...)
		local value = table.concat(self._arg2table(...), ', ')
		self._print(value)
		self.addDebug(value)
	end
	self.printf = function (format, ...)
		if not next({...}) then self.print(format) return end
		local p,value = pcall(function(f, ...) return f:format(self.unpack(self._arg2table(...)))end, format, ...)
		if not p then value = ("Error: printf('%s', #arg:%d, %s)"):format(format, #{...}, value) end
		self._print(value)
		self.addDebug(value)
	end
	self.Panel = function (playerName, ShowPanel)
		if ShowPanel then
			if Coord1 then
				ui.addTextArea(Coord1.id, "DEBUG", playerName,
				Coord1.x, Coord1.y, Coord1.w, Coord1.h, nil,nil, Coord1.a, true)
			end
			if Coord2 then
				ui.addTextArea(Coord2.id, "MINI DEBUG", playerName,
				Coord2.x, Coord2.y, 0, 0, nil,nil, Coord2.a, true)
			end
		else
			if Coord1 then ui.removeTextArea(Coord1.id, playerName) end
			if Coord2 then ui.removeTextArea(Coord2.id, playerName) end
		end
	end
	self.tostring = function (data,level)
		local out,pad,key,val,i="","","","",0
		if level ~= nil then
			pad = string.rep("\t", level) -- for i=0,level,1 do pad=pad.."\t" end
			level=level+1
		else
			level=1
		end
			if level == 3 then return pad.."maxlevel reached" end
			if type(data) == 'table' then
				for key, val in pairs(data) do
					if type(val) == 'table' then
						out=out..pad.."["..key.."]=<br>"..self.tostring(val,level).."<br>"
					else
						out=out..pad.."["..key.."]='"..tostring(val).."'<br>"
					end
				end
			else
				out=pad..tostring(data)
			end
		return out
	end
	self.unpack = function (t, i)
		i = i or 1
		if t[i] ~= nil then
			return t[i], self.unpack(t, i + 1)
		end
	end
	self._arg2table = function (...)
		local val,k,v = {}
		for k,v in ipairs({...}) do
			if type(v) == "number" or type(v) == "string" then
				table.insert(val,v)
			else
				table.insert(val,self.tostring(v))
			end
		end
		return val
	end
	self.addDebug = function (value)
		if Coord1 then
			table.insert(DEBUG, value)
			if #table.concat(DEBUG, '<br>') > 900 then table.remove(DEBUG,1) end
			ui.updateTextArea(Coord1.id, table.concat(DEBUG,'<br>')..'<br>....') --[[ , playerName) ]]
		end
	end
	self.print2 = function ( ...)
		local value = table.concat(self._arg2table(...), ', ')
		self._print(value)
		if Coord2 then ui.updateTextArea(Coord2.id, value) --[[ , playerName) ]] end
	end
	self.printf2 = function (format, ...)
		if not next({...}) then self.print2(format) return end
		local p,value = pcall(function(f, ...) return f:format(self.unpack(self._arg2table(...)))end, format, ...)
		if not p then value = ("Error: [debug].logs2('%s', #arg:%d, %s)"):format(format, #{...}, value) end
		self._print(value)
		if Coord2 then ui.updateTextArea(Coord2.id, value) --[[ , playerName) ]] end
	end
	if Active then
		_G.print          = self.print
		_G.printf         = self.printf
		_G.eventNewPlayer = self.eventNewPlayer
		_G.eventKeyboard  = self.eventKeyboard
		return {
			 print  = self._print
			,log    = self.print
			,logs   = self.printf
			,log2   = self.print2
			,logs2  = self.printf2
			,panel  = self.Panel
		}
	else
		return {
			 print=function()end
			,log=function()end
			,logs=function()end
			,log2=function()end
			,logs2=function()end
			,panel=function()end
		}
	end
end
 
--[[ Exemples:
function eventLoop(time, time2)
	mdebug.log2('log2', time, time2)
	mdebug.logs2('logs2 %d %d', time, time2)
	mdebug.log('log', time, time2)
	mdebug.logs('logs %d %d', time, time2)
	print('print', time, time2)
	printf('printf %d %d', time, time2)
end
--!]]
 
mdebug = apidebug()
for name, player in pairs(tfm.get.room.playerList) do eventNewPlayer(name) end
 
--[[ Exemples:
print('test1 ', 42)
print('test2', 'test2.2')
print('test2', 'test2.2', {'test2.3.1', 'test2.3.2'})
print({'test2.3.1', 'test2.3.2'})
local f = '%d'
printf('testX '..f..' %s %s', math.pi, f:format(math.pi), {x='test2.3.1', y='test2.3.2'})
--!]]
 
tfm.exec.disableAfkDeath(true)
tfm.exec.disableAutoTimeLeft(true)
tfm.exec.newGame(10)
tfm.exec.setGameTime(99999)
 
print(mdebug)
mdebug.log2('Hello', 'world !')