-- 通用lua扩充函数,与任何游戏逻辑无关
|
|
|
|
-- from http://snippets.luacode.org/?p=snippets/String_to_Hex_String_68
|
|
string.tohex = function(str, spacer)
|
|
return string.gsub(str,"(.)", function (c) return string.format("%02X%s", string.byte(c), spacer or "") end)
|
|
end
|
|
|
|
string.trim = function(str)
|
|
return string.gsub(str, "^%s*(.-)%s*$", "%1")
|
|
end
|
|
string.trimbegin = function(str)
|
|
return string.gsub(str, "^%s*(.-)$", "%1")
|
|
end
|
|
string.trimend = function(str)
|
|
return string.gsub(str, "^(.-)%s*$", "%1")
|
|
end
|
|
|
|
string.padleft = function(str, totalWidth, paddingChar)
|
|
local len = #str
|
|
if len >= totalWidth then
|
|
return str
|
|
else
|
|
paddingChar = paddingChar or ' '
|
|
assert(#paddingChar == 1)
|
|
return string.rep(paddingChar, totalWidth - len) .. str
|
|
end
|
|
end
|
|
string.padright = function(str, totalWidth, paddingChar)
|
|
local len = #str
|
|
if len >= totalWidth then
|
|
return str
|
|
else
|
|
paddingChar = paddingChar or ' '
|
|
assert(#paddingChar == 1)
|
|
return str .. string.rep(paddingChar, totalWidth - len)
|
|
end
|
|
end
|
|
|
|
string.split = function(szFullString, szSeparator)
|
|
local FindStartIndex = 1
|
|
local SplitArray = {}
|
|
while true do
|
|
local FindLastIndex = string.find(szFullString, szSeparator, FindStartIndex, true)
|
|
if not FindLastIndex then
|
|
table.insert(SplitArray, string.sub(szFullString, FindStartIndex, string.len(szFullString)))
|
|
break
|
|
end
|
|
table.insert(SplitArray, string.sub(szFullString, FindStartIndex, FindLastIndex-1))
|
|
FindStartIndex = FindLastIndex + string.len(szSeparator)
|
|
end
|
|
return SplitArray
|
|
end
|
|
|
|
string.isNilOrEmpty = function(str)
|
|
if str == nil then
|
|
return true, nil
|
|
end
|
|
if type(str) ~= "string" then
|
|
return true, nil
|
|
end
|
|
local fstr = string.match(str,"%s*(.-)%s*$")
|
|
local ret = fstr == ""
|
|
if ret == true then
|
|
str = nil
|
|
end
|
|
return ret, fstr
|
|
end
|
|
|
|
table.find = function(this, value)
|
|
for k,v in pairs(this) do
|
|
if v == value then return k end
|
|
end
|
|
end
|
|
|
|
table.omit = function(tbl)
|
|
for k,v in pairs(tbl) do
|
|
local typ = type(v)
|
|
if typ == "table" then
|
|
v = table.omit(v)
|
|
if v == nil or next(v) == nil then
|
|
tbl[k] = nil
|
|
end
|
|
elseif (typ == "string" and v == "") or (typ == "number" and v == 0) then
|
|
tbl[k] = nil
|
|
end
|
|
end
|
|
return tbl
|
|
end
|
|
table.tostring = function(data, _indent)
|
|
local visited = {}
|
|
local function dump(data, prefix)
|
|
local str = tostring(data)
|
|
if table.find(visited, data) ~= nil then return str end
|
|
table.insert(visited, data)
|
|
|
|
local prefix_next = prefix .. " "
|
|
str = str .. "\n" .. prefix .. "{"
|
|
for k,v in pairs(data) do
|
|
if type(k) == "number" then
|
|
str = str .. "\n" .. prefix_next .. "[" .. tostring(k) .. "] = "
|
|
else
|
|
str = str .. "\n" .. prefix_next .. tostring(k) .. " = "
|
|
end
|
|
if type(v) == "table" then
|
|
str = str .. dump(v, prefix_next)
|
|
elseif type(v) == "string" then
|
|
str = str .. '"' .. v .. '"'
|
|
else
|
|
str = str .. tostring(v)
|
|
end
|
|
end
|
|
str = str .. "\n" .. prefix .. "}"
|
|
return str
|
|
end
|
|
return dump(data, _indent or "")
|
|
end
|
|
|
|
table.merge = function(base, delta)
|
|
if type(delta) ~= "table" then return end
|
|
for k,v in pairs(delta) do
|
|
base[k] = v
|
|
end
|
|
end
|
|
|
|
table.extend = function(base, delta)
|
|
if type(delta) ~= "table" then return end
|
|
for i,v in ipairs(delta) do
|
|
table.insert(base, v)
|
|
end
|
|
end
|
|
|
|
table.len = function(tbl)
|
|
if type(tbl) ~= "table" then return 0 end
|
|
local n = 0
|
|
for k,v in pairs(tbl) do n = n + 1 end
|
|
return n
|
|
end
|
|
|
|
table.empty = function(tbl)
|
|
if tbl == nil then return true end
|
|
assert(type(tbl) == "table")
|
|
return next(tbl) == nil
|
|
--if #tbl > 0 then return false end
|
|
--for k,v in pairs(tbl) do return false end
|
|
--return true
|
|
end
|
|
|
|
-- http://snippets.luacode.org/?p=snippets/Deep_copy_of_a_Lua_Table_2
|
|
table.clone = function(t,deepnum)
|
|
if type(t) ~= 'table' then return t end
|
|
local mt = getmetatable(t)
|
|
local res = {}
|
|
|
|
if deepnum and deepnum > 0 then
|
|
deepnum = deepnum - 1
|
|
end
|
|
for k,v in pairs(t) do
|
|
if type(v) == 'table' then
|
|
if not deepnum or deepnum > 0 then
|
|
v = table.clone(v, deepnum)
|
|
end
|
|
end
|
|
res[k] = v
|
|
end
|
|
setmetatable(res,mt)
|
|
return res
|
|
end
|
|
|
|
-- http://snippets.luacode.org/?p=snippets/Table_Slice_116
|
|
table.slice = function(values,i1,i2)
|
|
local res = {}
|
|
local n = #values
|
|
i1 = i1 or 1
|
|
i2 = i2 or n
|
|
if i2 < 0 then
|
|
i2 = n + i2 + 1
|
|
elseif i2 > n then
|
|
i2 = n
|
|
end
|
|
if i1 < 1 or i1 > n then
|
|
return {}
|
|
end
|
|
local k = 1
|
|
for i = i1,i2 do
|
|
res[k] = values[i]
|
|
k = k + 1
|
|
end
|
|
return res
|
|
end
|
|
|
|
table.reverse = function(tab)
|
|
local size = #tab
|
|
local newTable = {}
|
|
for i,v in ipairs(tab) do
|
|
newTable[size+1-i] = v
|
|
end
|
|
return newTable
|
|
end
|
|
|
|
table.reset = function(t)
|
|
for k,v in pairs(t) do
|
|
t[k] = nil
|
|
end
|
|
return t
|
|
end
|
|
|
|
-- math.random({0.7, 0.1, 0.2}, {'A', 'B', 'C'})
|
|
math.random = function(m, n)
|
|
if type(m) == "table" and #m == #n then
|
|
-- 标准化概率表
|
|
local sum = 0
|
|
for _,v in ipairs(m) do sum = sum + v end
|
|
local sm = {}
|
|
for k,v in ipairs(m) do sm[k] = v / sum end
|
|
-- 得到下标
|
|
local r = go.rand.Random()
|
|
for k,v in ipairs(sm) do
|
|
if r <= v then return n[k]
|
|
else r = r - v end
|
|
end
|
|
assert(false)
|
|
end
|
|
|
|
if m == nil then return go.rand.Random() end
|
|
local _random = function(m, n)
|
|
m, n = math.min(m, n), math.max(m, n)
|
|
local mi, mf = math.modf(m)
|
|
local ni, nf = math.modf(n)
|
|
if mf == 0 and nf == 0 then
|
|
return go.rand.RandBetween(m, n)
|
|
else
|
|
return m + go.rand.Random() * (n - m)
|
|
end
|
|
end
|
|
if n == nil then return _random(1, m) end
|
|
return _random(m, n)
|
|
end
|
|
|
|
-- http://www.cplusplus.com/reference/algorithm/random_shuffle/
|
|
-- http://stackoverflow.com/questions/17119804/lua-array-shuffle-not-working
|
|
math.shuffle = function(array)
|
|
local counter = #array
|
|
while counter > 1 do
|
|
local index = math.random(counter)
|
|
array[index], array[counter] = array[counter], array[index]
|
|
counter = counter - 1
|
|
end
|
|
return array
|
|
end
|
|
|
|
--按table的key排序遍历table e.g. for k, v in pairsByKeys(tab, function(v1,v2) return v1 > v2 end) do print(k, v) end
|
|
function pairsByKeys(t, sortfunc)
|
|
local kt = {}
|
|
local len = 0
|
|
for k in pairs(t) do
|
|
len = len + 1
|
|
kt[len] = k
|
|
end
|
|
|
|
table.sort(kt, sortfunc)
|
|
|
|
local i = 0
|
|
return function()
|
|
i = i + 1
|
|
return kt[i], t[kt[i]]
|
|
end
|
|
end
|
|
|
|
--计算utf8字符串的长度 from quickcocos
|
|
function string.utf8len(input)
|
|
local len = string.len(input)
|
|
local left = len
|
|
local cnt = 0
|
|
local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
|
|
while left ~= 0 do
|
|
local tmp = string.byte(input, -left)
|
|
local i = #arr
|
|
while arr[i] do
|
|
if tmp >= arr[i] then
|
|
left = left - i
|
|
break
|
|
end
|
|
i = i - 1
|
|
end
|
|
cnt = cnt + 1
|
|
end
|
|
return cnt
|
|
end
|
|
|
|
--检查一个文件是否存在
|
|
function file_exists(path)
|
|
local file = io.open(path, "rb")
|
|
if file then file:close() end
|
|
return file ~= nil
|
|
end
|