|
|
- -- 通用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
|