library basex
globals
	private constant string CHARS = "0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ"
	private constant integer BASE = StringLength(CHARS) //62
endglobals
function ToHex takes integer n returns string
	return SubString(CHARS, n, n + 1)
endfunction
function Dec2Hex takes integer dec returns string
	local integer r = ModuloInteger(dec, BASE)
	if dec - r == 0 then
		return ToHex(r)
	else
		return Dec2Hex((dec - r) / BASE) + ToHex(r)
	endif
	return ""
endfunction
function ToDec takes string s returns integer
	local integer n = 0
	local string hex
	loop
		exitwhen(n == BASE)
		if SubString(CHARS, n, n + 1) == s then
			return n
		endif
		set n = n + 1
	endloop
	return 0
endfunction
function Hex2Dec takes string hex returns integer
	local integer length = StringLength(hex)
	local string r
	if length == 1 then
		return ToDec(hex)
	elseif length > 1 then
		set r = SubString(hex, length - 1, length)
		set hex = SubString(hex, 0, length - 1)
		return Hex2Dec(hex) * BASE + ToDec(r)
	endif
	return 0
endfunction
//next made by ProximityCat
function D2B takes integer i returns string
local string s
if i >=0 then
set s = "0"+Dec2Hex(S2I(SubString(I2S(i),0,StringLength(I2S(i)))))
else
set s = "1"+Dec2Hex(S2I(SubString(I2S(i),1,StringLength(I2S(i)))))
endif
return s
endfunction
function B2D takes string s returns integer
if SubString(s,0,1)=="0" then
return Hex2Dec(SubString(s,1,StringLength(s)))
elseif SubString(s,0,1)=="1" then
return S2I("-"+I2S(Hex2Dec(SubString(s,1,StringLength(s)))))
else 
call DisplayTextToForce(GetPlayersAll(),"Something Wrong with Base 16 library.")
return 0
endif
endfunction
endlibrary


library pcsdatabase requires basex
globals
string SaveF = ".txt"

private constant integer ValueAmountLimit = 20
private constant integer CharLimitInValue = 7
private constant integer SyncStringCharLimit = ValueAmountLimit*CharLimitInValue
private gamecache SyncCache = InitGameCache("SyncCache")
private constant string lnchar = "~" //here should be used a char that isnt listed in CHARS in basex lib.


//sync stuff
private string savingstring // String that IS GOING to be saved
//private string array syncingstring
private string array readystring // strings that ARE synced
private integer pid
private integer cell
private player p
endglobals

//Saving Data Stuff/////////////////////////////////////////////

function InitData takes nothing returns nothing
call PreloadGenClear()
set savingstring = ""
endfunction

function AddInteger takes integer int returns nothing
local string s
local integer l
local integer ln //length needed to be CharLimitInValue
set s = D2B(int)
set l = StringLength(s)
set ln = CharLimitInValue - l
if l==CharLimitInValue then
set savingstring = savingstring + s
elseif l>CharLimitInValue then
call DisplayTimedTextToForce(GetPlayersAll(),10, "ERRORINADDINTEGER")
else //if l < CharLimitInValue
loop
exitwhen ln == 0
set s = s + lnchar
set ln = ln - 1
endloop
set savingstring = savingstring + s
endif
endfunction

function DisplaySavingString takes nothing returns nothing
call DisplayTimedTextToForce(GetPlayersAll(),10,"SavingStringIs:"+savingstring)
endfunction

/*function QueueString takes nothing returns nothing //needed by PreloadData //
set syncingstring[GetPlayerTechMaxAllowed(Player(13),1)]=GetPlayerName(Player(15))
endfunction*/

function PreloadData takes nothing returns nothing
call Preload("\")\ncall SetPlayerName(Player(15),\""+savingstring+"\")\ncall ExecuteFunc(\"SyncData\")\n//")
set savingstring = ""
endfunction

function EndData takes string folder1, string folder2, string file, player plr returns nothing
if GetLocalPlayer() == plr then
call PreloadGenEnd(folder1+"\\"+folder2+"\\"+file+SaveF)
endif
endfunction

//Loading Data Stuff/////////////////////////////////////////////

function InitLoadData takes string folder1, string folder2, string file, player plr returns nothing
set cell = 0
set p = plr
if GetLocalPlayer() == p then
call Preloader(folder1+"\\"+folder2+"\\"+file+SaveF)
endif
endfunction

function SyncData takes nothing returns nothing
set cell = cell + 1
set pid = GetPlayerId(p)
call TriggerSyncStart()
if GetLocalPlayer() == p then
call StoreString( SyncCache, I2S(cell), I2S(pid), GetPlayerName(Player(15)))
call SyncStoredString( SyncCache, I2S(cell), I2S(pid))
endif
call TriggerSleepAction( 3.)
call TriggerSyncReady()
set readystring[cell] = GetStoredString( SyncCache, I2S(cell), I2S(pid))
endfunction

function GetData takes integer scell returns string
return readystring[scell]
endfunction

endlibrary
 
 
 