Name | Type | is_array | initial_value |
scope SimpleExample initializer Init
globals
private string example_code = null
endglobals
private function SavePlayer takes nothing returns nothing
/* Clear system before use */
call SaveLoad_Clear()
call SaveLoad_Save(GetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD), SAVE_SIZE_STRICT_LESS_THAN_1048576)
call SaveLoad_Save(GetPlayerState(Player(0), PLAYER_STATE_RESOURCE_LUMBER), SAVE_SIZE_STRICT_LESS_THAN_1048576)
set example_code = SaveLoad_Generate(0)
call BJDebugMsg("|cffffcc00==Simple Save Example==|r")
call BJDebugMsg("Your code is : |cffffcc00" + example_code + "|r")
call BJDebugMsg("|cffffcc00=======================|r")
endfunction
private function LoadPlayer takes nothing returns nothing
local integer value = 0
/* Clear system before use */
call SaveLoad_Clear()
if(SaveLoad_Load(example_code, 0)) then
call BJDebugMsg("|cffffcc00==Simple Load Example==|r")
set value = SaveLoad_Read(SAVE_SIZE_STRICT_LESS_THAN_1048576)
call BJDebugMsg("|cffffcc00Loaded gold:|r " + I2S(value))
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD, value)
set value = SaveLoad_Read(SAVE_SIZE_STRICT_LESS_THAN_1048576)
call BJDebugMsg("|cffffcc00Loaded lumber:|r " + I2S(value))
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_LUMBER, value)
call BJDebugMsg("|cffffcc00=======================|r")
else
call BJDebugMsg("|cffff3333Your code is invalid|r")
endif
endfunction
private function DelayedInit takes nothing returns nothing
/* Some setup */
call SetPlayerName(Player(0), "SimplePlayerName#0001")
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD, 1234)
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_LUMBER, 5678)
call SavePlayer()
call BJDebugMsg(" ")
call LoadPlayer()
call DestroyTimer(GetExpiredTimer())
endfunction
private function Init takes nothing returns nothing
call TimerStart(CreateTimer(), 0.5, false, function DelayedInit)
endfunction
endscope
scope FailExample initializer Init
/* This example will fail because of the player name */
globals
private string example_code = null
endglobals
private function SavePlayer takes nothing returns nothing
/* Clear system before use */
call SaveLoad_Clear()
call SaveLoad_Save(GetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD), SAVE_SIZE_STRICT_LESS_THAN_1048576)
call SaveLoad_Save(GetPlayerState(Player(0), PLAYER_STATE_RESOURCE_LUMBER), SAVE_SIZE_STRICT_LESS_THAN_1048576)
set example_code = SaveLoad_Generate(0)
call BJDebugMsg("|cffffcc00==Fail Save Example==|r")
call BJDebugMsg("Your code is : |cffffcc00" + example_code + "|r")
call BJDebugMsg("|cffffcc00=======================|r")
endfunction
private function LoadPlayer takes nothing returns nothing
local integer value = 0
/* Clear system before use */
call SaveLoad_Clear()
call BJDebugMsg("|cffffcc00==Fail Load Example==|r")
if(SaveLoad_Load(example_code, 0)) then
set value = SaveLoad_Read(SAVE_SIZE_STRICT_LESS_THAN_1048576)
call BJDebugMsg("|cffffcc00Loaded gold:|r " + I2S(value))
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD, value)
set value = SaveLoad_Read(SAVE_SIZE_STRICT_LESS_THAN_1048576)
call BJDebugMsg("|cffffcc00Loaded lumber:|r " + I2S(value))
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_LUMBER, value)
else
call BJDebugMsg("|cffff3333Your code is invalid|r")
endif
call BJDebugMsg("|cffffcc00=======================|r")
endfunction
private function DelayedInit takes nothing returns nothing
/* Some setup */
call SetPlayerName(Player(0), "PlayerName#0001")
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD, 2468)
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_LUMBER, 3579)
call SavePlayer()
call BJDebugMsg(" ")
call SetPlayerName(Player(0), "PlayerNameErr#0001")
call LoadPlayer()
call DestroyTimer(GetExpiredTimer())
endfunction
private function Init takes nothing returns nothing
call TimerStart(CreateTimer(), 2.0, false, function DelayedInit)
endfunction
endscope
scope HeroStore initializer Init
globals
private integer array HeroType
private integer HeroTypeCount
endglobals
private function StoreHero takes integer hero returns nothing
set HeroType[HeroTypeCount] = hero
set HeroTypeCount = HeroTypeCount + 1
endfunction
private function Init takes nothing returns nothing
set HeroTypeCount = 0
call StoreHero('Hpal') /* Paladin */
call StoreHero('Hamg') /* Archmage */
endfunction
public function GetHeroTypeFromId takes integer id returns integer
return HeroType[id]
endfunction
public function GetHeroTypeId takes unit hero returns integer
local integer i = 0
loop
if(HeroType[i] == GetUnitTypeId(hero)) then
return i
endif
set i = i + 1
exitwhen i == HeroTypeCount
endloop
return 0
endfunction
endscope
scope HeroExample initializer Init
globals
private string example_code = null
private unit hero = null
endglobals
private function SavePlayer takes nothing returns nothing
/* Clear system before use */
call SaveLoad_Clear()
call SaveLoad_Save(HeroStore_GetHeroTypeId(hero), SAVE_SIZE_STRICT_LESS_THAN_32)
call SaveLoad_Save(GetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD), SAVE_SIZE_STRICT_LESS_THAN_1048576)
call SaveLoad_Save(GetPlayerState(Player(0), PLAYER_STATE_RESOURCE_LUMBER), SAVE_SIZE_STRICT_LESS_THAN_1048576)
call SaveLoad_Save(GetHeroXP(hero), SAVE_SIZE_STRICT_LESS_THAN_131072)
set example_code = SaveLoad_Generate(0)
call RemoveUnit(hero)
call BJDebugMsg("|cffffcc00==Hero Save Example==|r")
call BJDebugMsg("Your code is : |cffffcc00" + example_code + "|r")
call BJDebugMsg("|cffffcc00=======================|r")
endfunction
private function LoadPlayer takes nothing returns nothing
local integer value = 0
/* Clear system before use */
call SaveLoad_Clear()
if(SaveLoad_Load(example_code, 0)) then
call BJDebugMsg("|cffffcc00==Hero Load Example==|r")
set value = SaveLoad_Read(SAVE_SIZE_STRICT_LESS_THAN_32)
call BJDebugMsg("|cffffcc00Loaded hero type:|r " + I2S(value))
set hero = CreateUnit(Player(0), HeroStore_GetHeroTypeFromId(value), 0.0, 0.0, 0.0)
set value = SaveLoad_Read(SAVE_SIZE_STRICT_LESS_THAN_1048576)
call BJDebugMsg("|cffffcc00Loaded gold:|r " + I2S(value))
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD, value)
set value = SaveLoad_Read(SAVE_SIZE_STRICT_LESS_THAN_1048576)
call BJDebugMsg("|cffffcc00Loaded lumber:|r " + I2S(value))
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_LUMBER, value)
set value = SaveLoad_Read(SAVE_SIZE_STRICT_LESS_THAN_131072)
call BJDebugMsg("|cffffcc00Loaded experience:|r " + I2S(value))
call AddHeroXP(hero, value, false)
call BJDebugMsg("|cffffcc00=======================|r")
else
call BJDebugMsg("|cffff3333Your code is invalid|r")
endif
endfunction
private function DelayedInit takes nothing returns nothing
/* Some setup */
set hero = FirstOfGroup(GetUnitsOfPlayerAll(Player(0)))
call SetPlayerName(Player(0), "SimplePlayerName#0001")
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_GOLD, 5555)
call SetPlayerState(Player(0), PLAYER_STATE_RESOURCE_LUMBER, 8888)
call AddHeroXP(hero, 1535, false)
call SavePlayer()
call BJDebugMsg(" ")
call LoadPlayer()
call DestroyTimer(GetExpiredTimer())
endfunction
private function Init takes nothing returns nothing
call TimerStart(CreateTimer(), 5.5, false, function DelayedInit)
endfunction
endscope
library SaveLoad
globals
/* Use a prime number, changing key will involve a code wipe, makes scrambling the charset pointless */
private integer SaveKey = 89
/* Do not edit past this line unless you REALLY need what you're doing */
private integer array Bits
private integer Bits_Count = 0
private integer Generate_Value = 0
private integer Generate_Index = 0
private integer Read_Value = 0
private integer Read_Index = 0
private string Charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-"
private integer CharsetLength = 64
endglobals
public function Clear takes nothing returns nothing
set Bits_Count = 0
endfunction
/* Push method for array bit values */
private function StoreBit takes integer value returns nothing
set Bits[Bits_Count] = value
set Bits_Count = Bits_Count + 1
endfunction
private function Pad takes integer length returns nothing
local integer i = 0
loop
call StoreBit(0)
set i = i + 1
exitwhen i == length
endloop
endfunction
/* Avoids working with floating numbers using native Pow */
private function IntPow takes integer base, integer exp returns integer
local integer current = base
if(exp == 0) then
return 1
endif
if(exp == 1) then
return base
endif
loop
set current = current * base
set exp = exp - 1
exitwhen exp == 1
endloop
return current
endfunction
public function Save takes integer value, integer size returns nothing
local integer size_done = 0
local integer exponent = size - 1
local integer current = 0
if(value == 0) then
call Pad(size)
return
endif
loop
set current = IntPow(2, exponent)
if(value >= current) then
call StoreBit(1)
set size_done = size_done + 1
set value = value - current
else
call StoreBit(0)
set size_done = size_done + 1
endif
set exponent = exponent - 1
if(size_done > size) then
call BJDebugMsg("|cffff3333[Save Error]|r Invalid size")
endif
exitwhen value == 0
endloop
if(size_done < size) then
call Pad(size - size_done)
endif
endfunction
private function GenerateNextChar takes nothing returns boolean
local integer last_index = 0
local integer exponent = 0
local integer i = 0
if(Generate_Index == Bits_Count) then
return false
endif
set last_index = IMinBJ(Bits_Count, Generate_Index + 6)
set Generate_Value = 0
set exponent = (last_index - Generate_Index) - 1
set i = Generate_Index
loop
if(Bits[i] == 1) then
set Generate_Value = Generate_Value + IntPow(2, exponent)
endif
set exponent = exponent - 1
set i = i + 1
exitwhen i == last_index
endloop
set Generate_Index = last_index
return true
endfunction
private function CharAt takes integer index returns string
return SubString(Charset, index, index + 1)
endfunction
private function IndexOf takes string char returns integer
local integer i = 0
loop
if(CharAt(i) == char) then
return i
endif
set i = i + 1
exitwhen i == CharsetLength
endloop
return 0
endfunction
private function HashPlayer takes integer playerId returns integer
local string name = GetPlayerName(Player(playerId))
local integer name_length = StringLength(name)
local integer hash = 0
local integer i = 0
loop
set hash = hash + IndexOf(SubString(name, i, i + 1)) * SaveKey * SaveKey
set i = i + 1
exitwhen i == name_length
endloop
return hash
endfunction
public function Generate takes integer playerId returns string
local string output = ""
local integer generation_hash = 0
local boolean processing = false
local integer hash = 0
set Generate_Index = 0
if(ModuloInteger(Bits_Count, 6) != 0) then
call Pad(6 - (ModuloInteger(Bits_Count, 6)))
endif
loop
set processing = GenerateNextChar()
exitwhen processing == false
set output = output + CharAt(ModuloInteger(Generate_Value + generation_hash, CharsetLength))
set generation_hash = generation_hash + (1 + Generate_Value) * SaveKey
endloop
set output = output + CharAt(ModuloInteger(generation_hash, CharsetLength))
set output = output + CharAt(ModuloInteger(generation_hash / 2, CharsetLength))
set output = output + CharAt(ModuloInteger(generation_hash / 3, CharsetLength))
set hash = HashPlayer(playerId) + generation_hash
set output = output + CharAt(ModuloInteger(hash, CharsetLength))
set output = output + CharAt(ModuloInteger(hash / 4, CharsetLength))
set output = output + CharAt(ModuloInteger(hash / 8, CharsetLength))
return output
endfunction
public function Load takes string code_string, integer playerId returns boolean
local integer generation_hash = 0
local integer i = 0
local integer value = 0
local integer code_length = StringLength(code_string) - 6
local string char = ""
local integer array hash
local integer player_hash = 0
if(code_length <= 0) then
return false
endif
loop
set char = SubString(code_string, i, i + 1)
set value = IndexOf(char) - generation_hash
loop
exitwhen value >= 0
set value = value + CharsetLength
endloop
call Save(value, 6)
set generation_hash = generation_hash + (1 + value) * SaveKey
set i = i + 1
exitwhen i == code_length
endloop
set hash[0] = IndexOf(SubString(code_string, code_length, code_length + 1))
set hash[1] = IndexOf(SubString(code_string, code_length + 1, code_length + 2))
set hash[2] = IndexOf(SubString(code_string, code_length + 2, code_length + 3))
set hash[3] = IndexOf(SubString(code_string, code_length + 3, code_length + 4))
set hash[4] = IndexOf(SubString(code_string, code_length + 4, code_length + 5))
set hash[5] = IndexOf(SubString(code_string, code_length + 5, code_length + 6))
set player_hash = HashPlayer(playerId) + generation_hash
if(hash[3] != ModuloInteger(player_hash, CharsetLength)) then
return false
endif
if(hash[4] != ModuloInteger(player_hash / 4, CharsetLength)) then
return false
endif
if(hash[5] != ModuloInteger(player_hash / 8, CharsetLength)) then
return false
endif
if(hash[0] != ModuloInteger(generation_hash, CharsetLength)) then
return false
endif
if(hash[1] != ModuloInteger(generation_hash / 2, CharsetLength)) then
return false
endif
if(hash[2] != ModuloInteger(generation_hash / 3, CharsetLength)) then
return false
endif
set Read_Index = 0
return true
endfunction
public function Read takes integer size returns integer
local integer last_index = 0
local integer exponent = 0
local integer i = 0
if(Read_Index == Bits_Count) then
return 0
endif
set last_index = IMinBJ(Bits_Count, Read_Index + size)
set Read_Value = 0
set exponent = (last_index - Read_Index) - 1
set i = Read_Index
loop
if(Bits[i] == 1) then
set Read_Value = Read_Value + IntPow(2, exponent)
endif
set exponent = exponent - 1
set i = i + 1
exitwhen i == last_index
endloop
set Read_Index = last_index
return Read_Value
endfunction
endlibrary
library SaveLoadSize
globals
integer SAVE_SIZE_BOOLEAN = 1
integer SAVE_SIZE_STRICT_LESS_THAN_4 = 2
integer SAVE_SIZE_STRICT_LESS_THAN_8 = 3
integer SAVE_SIZE_STRICT_LESS_THAN_16 = 4
integer SAVE_SIZE_STRICT_LESS_THAN_32 = 5
integer SAVE_SIZE_STRICT_LESS_THAN_64 = 6
integer SAVE_SIZE_STRICT_LESS_THAN_128 = 7
integer SAVE_SIZE_STRICT_LESS_THAN_256 = 8
integer SAVE_SIZE_STRICT_LESS_THAN_512 = 9
integer SAVE_SIZE_STRICT_LESS_THAN_1024 = 10
integer SAVE_SIZE_STRICT_LESS_THAN_2048 = 11
integer SAVE_SIZE_STRICT_LESS_THAN_4096 = 12
integer SAVE_SIZE_STRICT_LESS_THAN_8192 = 13
integer SAVE_SIZE_STRICT_LESS_THAN_16384 = 14
integer SAVE_SIZE_STRICT_LESS_THAN_32768 = 15
integer SAVE_SIZE_STRICT_LESS_THAN_65536 = 16
integer SAVE_SIZE_STRICT_LESS_THAN_131072 = 17
integer SAVE_SIZE_STRICT_LESS_THAN_262144 = 18
integer SAVE_SIZE_STRICT_LESS_THAN_524288 = 19
integer SAVE_SIZE_STRICT_LESS_THAN_1048576 = 20
integer SAVE_SIZE_STRICT_LESS_THAN_2097152 = 21
integer SAVE_SIZE_STRICT_LESS_THAN_4194304 = 22
integer SAVE_SIZE_STRICT_LESS_THAN_8388608 = 23
integer SAVE_SIZE_STRICT_LESS_THAN_16777216 = 24
integer SAVE_SIZE_STRICT_LESS_THAN_33554432 = 25
integer SAVE_SIZE_STRICT_LESS_THAN_67108864 = 26
integer SAVE_SIZE_STRICT_LESS_THAN_134217728 = 27
integer SAVE_SIZE_STRICT_LESS_THAN_268435456 = 28
integer SAVE_SIZE_STRICT_LESS_THAN_536870912 = 29
integer SAVE_SIZE_STRICT_LESS_THAN_1073741824 = 30
integer SAVE_SIZE_STRICT_LESS_THAN_2147483648 = 31
endglobals
endlibrary