Initial Commit
This commit is contained in:
parent
9bc50f10ec
commit
ed63e7f11a
@ -1 +1,3 @@
|
|||||||
# Custom-Music-Discs-Minecraft-Datapack
|
# Custom-Music-Discs-Minecraft-Datapack
|
||||||
|
|
||||||
|
To use create a folder called: `music`
|
||||||
|
|||||||
73
bin/bin/compressors/lzw.lua
Normal file
73
bin/bin/compressors/lzw.lua
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
--[[
|
||||||
|
LZW String Compression demo for Gideros
|
||||||
|
This code is MIT licensed, see http://www.opensource.org/licenses/mit-license.php
|
||||||
|
(C) 2013 - Guava7
|
||||||
|
]]
|
||||||
|
CLZWCompression = {}
|
||||||
|
function CLZWCompression:InitDictionary(isEncode)
|
||||||
|
self.mDictionary = {}
|
||||||
|
-- local s = " !#$%&'\"()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
|
||||||
|
local s={}
|
||||||
|
for i=1,255 do
|
||||||
|
s[#s+1]=string.char(i)
|
||||||
|
end
|
||||||
|
s=table.concat(s)
|
||||||
|
local len = #s
|
||||||
|
for i = 1, len do
|
||||||
|
if isEncode then
|
||||||
|
self.mDictionary[s:sub(i, i)] = i
|
||||||
|
else
|
||||||
|
self.mDictionary[i] = s:sub(i, i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.mDictionaryLen = len
|
||||||
|
end
|
||||||
|
function CLZWCompression:Encode(sInput)
|
||||||
|
self:InitDictionary(true)
|
||||||
|
local s = ""
|
||||||
|
local ch
|
||||||
|
local len = #sInput
|
||||||
|
local result = {}
|
||||||
|
local dic = self.mDictionary
|
||||||
|
local temp
|
||||||
|
for i = 1, len do
|
||||||
|
ch = sInput:sub(i, i)
|
||||||
|
temp = s..ch
|
||||||
|
if dic[temp] then
|
||||||
|
s = temp
|
||||||
|
else
|
||||||
|
result[#result + 1] = dic[s]
|
||||||
|
self.mDictionaryLen = self.mDictionaryLen + 1
|
||||||
|
dic[temp] = self.mDictionaryLen
|
||||||
|
s = ch
|
||||||
|
end
|
||||||
|
end
|
||||||
|
result[#result + 1] = dic[s]
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
function CLZWCompression:Decode(data)
|
||||||
|
self:InitDictionary(false)
|
||||||
|
local dic = self.mDictionary
|
||||||
|
local entry
|
||||||
|
local ch
|
||||||
|
local prevCode, currCode
|
||||||
|
local result = {}
|
||||||
|
prevCode = data[1]
|
||||||
|
result[#result + 1] = dic[prevCode]
|
||||||
|
for i = 2, #data do
|
||||||
|
currCode = data[i]
|
||||||
|
entry = dic[currCode]
|
||||||
|
if entry then
|
||||||
|
ch = entry:sub(1, 1)
|
||||||
|
result[#result + 1] = entry
|
||||||
|
else
|
||||||
|
ch = dic[prevCode]:sub(1, 1)
|
||||||
|
result[#result + 1] = dic[prevCode]..ch
|
||||||
|
end
|
||||||
|
dic[#dic + 1] = dic[prevCode]..ch
|
||||||
|
prevCode = currCode
|
||||||
|
end
|
||||||
|
return table.concat(result)
|
||||||
|
end
|
||||||
|
|
||||||
|
return CLZWCompression
|
||||||
40
bin/bin/converters/base64.lua
Normal file
40
bin/bin/converters/base64.lua
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
local bin = require("bin")
|
||||||
|
local base64={}
|
||||||
|
local bs = { [0] =
|
||||||
|
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
|
||||||
|
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
|
||||||
|
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
|
||||||
|
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
|
||||||
|
}
|
||||||
|
local bsd=table.flip(bs)
|
||||||
|
local char=string.char
|
||||||
|
function base64.encode(s)
|
||||||
|
local byte, rep, pad = string.byte, string.rep, 2 - ((#s-1) % 3)
|
||||||
|
s = (s..rep('\0', pad)):gsub("...", function(cs)
|
||||||
|
local a, b, c = byte(cs, 1, 3)
|
||||||
|
return bs[bit.rshift(a,2)] .. bs[bit.bor(bit.lshift(bit.band(a,3),4),bit.rshift(b,4))] .. bs[bit.bor(bit.lshift(bit.band(b,15),2),bit.rshift(c,6))] .. bs[bit.band(c,63)]
|
||||||
|
end)
|
||||||
|
return s:sub(1, #s-pad) .. rep('=', pad)
|
||||||
|
end
|
||||||
|
function base64.decode(s)
|
||||||
|
local s=s:match("["..s.."=]+")
|
||||||
|
local p,cc=s:gsub("=","A")
|
||||||
|
local r=""
|
||||||
|
local n=0
|
||||||
|
s=s:sub(1,#s-#p)..p
|
||||||
|
for c = 1,#s,4 do
|
||||||
|
n = bit.lshift(bsd[s:sub(c, c)], 18) + bit.lshift(bsd[s:sub(c+1, c+1)], 12) + bit.lshift(bsd[s:sub(c + 2, c + 2)], 6) + bsd[s:sub(c + 3, c + 3)]
|
||||||
|
r = r .. char(bit.band(bit.arshift(n, 16), 0xFF)) .. char(bit.band(bit.arshift(n, 8), 0xFF)) .. char(bit.band(n, 0xFF))
|
||||||
|
end
|
||||||
|
return r:sub(1,-(cc+1))
|
||||||
|
end
|
||||||
|
function bin.newFromBase91(data)
|
||||||
|
return bin.new(bin.fromBase91(data))
|
||||||
|
end
|
||||||
|
function bin.toBase91(s)
|
||||||
|
return base91.encode(s)
|
||||||
|
end
|
||||||
|
function bin.fromBase91(s)
|
||||||
|
return base91.decode(s)
|
||||||
|
end
|
||||||
|
return base64
|
||||||
82
bin/bin/converters/base91.lua
Normal file
82
bin/bin/converters/base91.lua
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
local bin = require("bin")
|
||||||
|
local base91={}
|
||||||
|
local b91enc={[0]=
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||||
|
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||||
|
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
|
||||||
|
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||||
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '#', '$',
|
||||||
|
'%', '&', '(', ')', '*', '+', ',', '.', '/', ':', ';', '<', '=',
|
||||||
|
'>', '?', '@', '[', ']', '^', '_', '`', '{', '|', '}', '~', '"'
|
||||||
|
}
|
||||||
|
local b91dec=table.flip(b91enc)
|
||||||
|
function base91.decode(d)
|
||||||
|
local l,v,o,b,n = #d,-1,"",0,0
|
||||||
|
for i in d:gmatch(".") do
|
||||||
|
local c=b91dec[i]
|
||||||
|
if not(c) then
|
||||||
|
-- Continue
|
||||||
|
else
|
||||||
|
if v < 0 then
|
||||||
|
v = c
|
||||||
|
else
|
||||||
|
v = v+c*91
|
||||||
|
b = bit.bor(b, bit.lshift(v,n))
|
||||||
|
if bit.band(v,8191) then
|
||||||
|
n = n + 13
|
||||||
|
else
|
||||||
|
n = n + 14
|
||||||
|
end
|
||||||
|
while true do
|
||||||
|
o=o..string.char(bit.band(b,255))
|
||||||
|
b=bit.rshift(b,8)
|
||||||
|
n=n-8
|
||||||
|
if not (n>7) then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
v=-1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if v + 1>0 then
|
||||||
|
o=o..string.char(bit.band(bit.bor(b,bit.lshift(v,n)),255))
|
||||||
|
end
|
||||||
|
return o
|
||||||
|
end
|
||||||
|
function base91.encode(d)
|
||||||
|
local b,n,o,l=0,0,"",#d
|
||||||
|
for i in d:gmatch(".") do
|
||||||
|
b=bit.bor(b,bit.lshift(string.byte(i),n))
|
||||||
|
n=n+8
|
||||||
|
if n>13 then
|
||||||
|
v=bit.band(b,8191)
|
||||||
|
if v>88 then
|
||||||
|
b=bit.rshift(b,13)
|
||||||
|
n=n-13
|
||||||
|
else
|
||||||
|
v=bit.band(b,16383)
|
||||||
|
b=bit.rshift(b,14)
|
||||||
|
n=n-14
|
||||||
|
end
|
||||||
|
o=o..b91enc[v % 91] .. b91enc[math.floor(v / 91)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if n>0 then
|
||||||
|
o=o..b91enc[b % 91]
|
||||||
|
if n>7 or b>90 then
|
||||||
|
o=o .. b91enc[math.floor(b / 91)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return o
|
||||||
|
end
|
||||||
|
function bin.newFromBase64(data)
|
||||||
|
return bin.new(bin.fromBase64(data))
|
||||||
|
end
|
||||||
|
function bin.toBase64(s)
|
||||||
|
return base64.encode(s)
|
||||||
|
end
|
||||||
|
function bin.fromBase64(s)
|
||||||
|
return base64.decode(s)
|
||||||
|
end
|
||||||
|
return base91
|
||||||
394
bin/bin/hashes/md5.lua
Normal file
394
bin/bin/hashes/md5.lua
Normal file
@ -0,0 +1,394 @@
|
|||||||
|
local bin = require("bin")
|
||||||
|
local md5 = {
|
||||||
|
_VERSION = "md5.lua 1.1.0",
|
||||||
|
_DESCRIPTION = "MD5 computation in Lua (5.1-3, LuaJIT)",
|
||||||
|
_URL = "https://github.com/kikito/md5.lua",
|
||||||
|
_LICENSE = [[
|
||||||
|
MIT LICENSE
|
||||||
|
|
||||||
|
Copyright (c) 2013 Enrique García Cota + Adam Baldwin + hanzao + Equi 4 Software
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
|
||||||
|
-- bit lib implementions
|
||||||
|
|
||||||
|
local char, byte, format, rep, sub =
|
||||||
|
string.char, string.byte, string.format, string.rep, string.sub
|
||||||
|
local bit_or, bit_and, bit_not, bit_xor, bit_rshift, bit_lshift
|
||||||
|
|
||||||
|
local ok, bit = pcall(require, 'bit')
|
||||||
|
if ok then
|
||||||
|
bit_or, bit_and, bit_not, bit_xor, bit_rshift, bit_lshift = bit.bor, bit.band, bit.bnot, bit.bxor, bit.rshift, bit.lshift
|
||||||
|
else
|
||||||
|
ok, bit = pcall(require, 'bit32')
|
||||||
|
|
||||||
|
if ok then
|
||||||
|
|
||||||
|
bit_not = bit.bnot
|
||||||
|
|
||||||
|
local tobit = function(n)
|
||||||
|
return n <= 0x7fffffff and n or -(bit_not(n) + 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
local normalize = function(f)
|
||||||
|
return function(a,b) return tobit(f(tobit(a), tobit(b))) end
|
||||||
|
end
|
||||||
|
|
||||||
|
bit_or, bit_and, bit_xor = normalize(bit.bor), normalize(bit.band), normalize(bit.bxor)
|
||||||
|
bit_rshift, bit_lshift = normalize(bit.rshift), normalize(bit.lshift)
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
local function tbl2number(tbl)
|
||||||
|
local result = 0
|
||||||
|
local power = 1
|
||||||
|
for i = 1, #tbl do
|
||||||
|
result = result + tbl[i] * power
|
||||||
|
power = power * 2
|
||||||
|
end
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
local function expand(t1, t2)
|
||||||
|
local big, small = t1, t2
|
||||||
|
if(#big < #small) then
|
||||||
|
big, small = small, big
|
||||||
|
end
|
||||||
|
-- expand small
|
||||||
|
for i = #small + 1, #big do
|
||||||
|
small[i] = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local to_bits -- needs to be declared before bit_not
|
||||||
|
|
||||||
|
bit_not = function(n)
|
||||||
|
local tbl = to_bits(n)
|
||||||
|
local size = math.max(#tbl, 32)
|
||||||
|
for i = 1, size do
|
||||||
|
if(tbl[i] == 1) then
|
||||||
|
tbl[i] = 0
|
||||||
|
else
|
||||||
|
tbl[i] = 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return tbl2number(tbl)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- defined as local above
|
||||||
|
to_bits = function (n)
|
||||||
|
if(n < 0) then
|
||||||
|
-- negative
|
||||||
|
return to_bits(bit_not(math.abs(n)) + 1)
|
||||||
|
end
|
||||||
|
-- to bits table
|
||||||
|
local tbl = {}
|
||||||
|
local cnt = 1
|
||||||
|
local last
|
||||||
|
while n > 0 do
|
||||||
|
last = n % 2
|
||||||
|
tbl[cnt] = last
|
||||||
|
n = (n-last)/2
|
||||||
|
cnt = cnt + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
return tbl
|
||||||
|
end
|
||||||
|
|
||||||
|
bit_or = function(m, n)
|
||||||
|
local tbl_m = to_bits(m)
|
||||||
|
local tbl_n = to_bits(n)
|
||||||
|
expand(tbl_m, tbl_n)
|
||||||
|
|
||||||
|
local tbl = {}
|
||||||
|
for i = 1, #tbl_m do
|
||||||
|
if(tbl_m[i]== 0 and tbl_n[i] == 0) then
|
||||||
|
tbl[i] = 0
|
||||||
|
else
|
||||||
|
tbl[i] = 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return tbl2number(tbl)
|
||||||
|
end
|
||||||
|
|
||||||
|
bit_and = function(m, n)
|
||||||
|
local tbl_m = to_bits(m)
|
||||||
|
local tbl_n = to_bits(n)
|
||||||
|
expand(tbl_m, tbl_n)
|
||||||
|
|
||||||
|
local tbl = {}
|
||||||
|
for i = 1, #tbl_m do
|
||||||
|
if(tbl_m[i]== 0 or tbl_n[i] == 0) then
|
||||||
|
tbl[i] = 0
|
||||||
|
else
|
||||||
|
tbl[i] = 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return tbl2number(tbl)
|
||||||
|
end
|
||||||
|
|
||||||
|
bit_xor = function(m, n)
|
||||||
|
local tbl_m = to_bits(m)
|
||||||
|
local tbl_n = to_bits(n)
|
||||||
|
expand(tbl_m, tbl_n)
|
||||||
|
|
||||||
|
local tbl = {}
|
||||||
|
for i = 1, #tbl_m do
|
||||||
|
if(tbl_m[i] ~= tbl_n[i]) then
|
||||||
|
tbl[i] = 1
|
||||||
|
else
|
||||||
|
tbl[i] = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return tbl2number(tbl)
|
||||||
|
end
|
||||||
|
|
||||||
|
bit_rshift = function(n, bits)
|
||||||
|
local high_bit = 0
|
||||||
|
if(n < 0) then
|
||||||
|
-- negative
|
||||||
|
n = bit_not(math.abs(n)) + 1
|
||||||
|
high_bit = 0x80000000
|
||||||
|
end
|
||||||
|
|
||||||
|
local floor = math.floor
|
||||||
|
|
||||||
|
for i=1, bits do
|
||||||
|
n = n/2
|
||||||
|
n = bit_or(floor(n), high_bit)
|
||||||
|
end
|
||||||
|
return floor(n)
|
||||||
|
end
|
||||||
|
|
||||||
|
bit_lshift = function(n, bits)
|
||||||
|
if(n < 0) then
|
||||||
|
-- negative
|
||||||
|
n = bit_not(math.abs(n)) + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
for i=1, bits do
|
||||||
|
n = n*2
|
||||||
|
end
|
||||||
|
return bit_and(n, 0xFFFFFFFF)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- convert little-endian 32-bit int to a 4-char string
|
||||||
|
local function lei2str(i)
|
||||||
|
local f=function (s) return char( bit_and( bit_rshift(i, s), 255)) end
|
||||||
|
return f(0)..f(8)..f(16)..f(24)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- convert raw string to big-endian int
|
||||||
|
local function str2bei(s)
|
||||||
|
local v=0
|
||||||
|
for i=1, #s do
|
||||||
|
v = v * 256 + byte(s, i)
|
||||||
|
end
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
|
||||||
|
-- convert raw string to little-endian int
|
||||||
|
local function str2lei(s)
|
||||||
|
local v=0
|
||||||
|
for i = #s,1,-1 do
|
||||||
|
v = v*256 + byte(s, i)
|
||||||
|
end
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
|
||||||
|
-- cut up a string in little-endian ints of given size
|
||||||
|
local function cut_le_str(s,...)
|
||||||
|
local o, r = 1, {}
|
||||||
|
local args = {...}
|
||||||
|
for i=1, #args do
|
||||||
|
table.insert(r, str2lei(sub(s, o, o + args[i] - 1)))
|
||||||
|
o = o + args[i]
|
||||||
|
end
|
||||||
|
return r
|
||||||
|
end
|
||||||
|
|
||||||
|
local swap = function (w) return str2bei(lei2str(w)) end
|
||||||
|
|
||||||
|
-- An MD5 mplementation in Lua, requires bitlib (hacked to use LuaBit from above, ugh)
|
||||||
|
-- 10/02/2001 jcw@equi4.com
|
||||||
|
|
||||||
|
local CONSTS = {
|
||||||
|
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
|
||||||
|
0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
|
||||||
|
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
|
||||||
|
0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
|
||||||
|
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
|
||||||
|
0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
|
||||||
|
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
|
||||||
|
0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
|
||||||
|
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
|
||||||
|
0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
|
||||||
|
0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
|
||||||
|
0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
|
||||||
|
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
|
||||||
|
0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
|
||||||
|
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
|
||||||
|
0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,
|
||||||
|
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476
|
||||||
|
}
|
||||||
|
|
||||||
|
local f=function (x,y,z) return bit_or(bit_and(x,y),bit_and(-x-1,z)) end
|
||||||
|
local g=function (x,y,z) return bit_or(bit_and(x,z),bit_and(y,-z-1)) end
|
||||||
|
local h=function (x,y,z) return bit_xor(x,bit_xor(y,z)) end
|
||||||
|
local i=function (x,y,z) return bit_xor(y,bit_or(x,-z-1)) end
|
||||||
|
local z=function (ff,a,b,c,d,x,s,ac)
|
||||||
|
a=bit_and(a+ff(b,c,d)+x+ac,0xFFFFFFFF)
|
||||||
|
-- be *very* careful that left shift does not cause rounding!
|
||||||
|
return bit_or(bit_lshift(bit_and(a,bit_rshift(0xFFFFFFFF,s)),s),bit_rshift(a,32-s))+b
|
||||||
|
end
|
||||||
|
|
||||||
|
local function transform(A,B,C,D,X)
|
||||||
|
local a,b,c,d=A,B,C,D
|
||||||
|
local t=CONSTS
|
||||||
|
|
||||||
|
a=z(f,a,b,c,d,X[ 0], 7,t[ 1])
|
||||||
|
d=z(f,d,a,b,c,X[ 1],12,t[ 2])
|
||||||
|
c=z(f,c,d,a,b,X[ 2],17,t[ 3])
|
||||||
|
b=z(f,b,c,d,a,X[ 3],22,t[ 4])
|
||||||
|
a=z(f,a,b,c,d,X[ 4], 7,t[ 5])
|
||||||
|
d=z(f,d,a,b,c,X[ 5],12,t[ 6])
|
||||||
|
c=z(f,c,d,a,b,X[ 6],17,t[ 7])
|
||||||
|
b=z(f,b,c,d,a,X[ 7],22,t[ 8])
|
||||||
|
a=z(f,a,b,c,d,X[ 8], 7,t[ 9])
|
||||||
|
d=z(f,d,a,b,c,X[ 9],12,t[10])
|
||||||
|
c=z(f,c,d,a,b,X[10],17,t[11])
|
||||||
|
b=z(f,b,c,d,a,X[11],22,t[12])
|
||||||
|
a=z(f,a,b,c,d,X[12], 7,t[13])
|
||||||
|
d=z(f,d,a,b,c,X[13],12,t[14])
|
||||||
|
c=z(f,c,d,a,b,X[14],17,t[15])
|
||||||
|
b=z(f,b,c,d,a,X[15],22,t[16])
|
||||||
|
|
||||||
|
a=z(g,a,b,c,d,X[ 1], 5,t[17])
|
||||||
|
d=z(g,d,a,b,c,X[ 6], 9,t[18])
|
||||||
|
c=z(g,c,d,a,b,X[11],14,t[19])
|
||||||
|
b=z(g,b,c,d,a,X[ 0],20,t[20])
|
||||||
|
a=z(g,a,b,c,d,X[ 5], 5,t[21])
|
||||||
|
d=z(g,d,a,b,c,X[10], 9,t[22])
|
||||||
|
c=z(g,c,d,a,b,X[15],14,t[23])
|
||||||
|
b=z(g,b,c,d,a,X[ 4],20,t[24])
|
||||||
|
a=z(g,a,b,c,d,X[ 9], 5,t[25])
|
||||||
|
d=z(g,d,a,b,c,X[14], 9,t[26])
|
||||||
|
c=z(g,c,d,a,b,X[ 3],14,t[27])
|
||||||
|
b=z(g,b,c,d,a,X[ 8],20,t[28])
|
||||||
|
a=z(g,a,b,c,d,X[13], 5,t[29])
|
||||||
|
d=z(g,d,a,b,c,X[ 2], 9,t[30])
|
||||||
|
c=z(g,c,d,a,b,X[ 7],14,t[31])
|
||||||
|
b=z(g,b,c,d,a,X[12],20,t[32])
|
||||||
|
|
||||||
|
a=z(h,a,b,c,d,X[ 5], 4,t[33])
|
||||||
|
d=z(h,d,a,b,c,X[ 8],11,t[34])
|
||||||
|
c=z(h,c,d,a,b,X[11],16,t[35])
|
||||||
|
b=z(h,b,c,d,a,X[14],23,t[36])
|
||||||
|
a=z(h,a,b,c,d,X[ 1], 4,t[37])
|
||||||
|
d=z(h,d,a,b,c,X[ 4],11,t[38])
|
||||||
|
c=z(h,c,d,a,b,X[ 7],16,t[39])
|
||||||
|
b=z(h,b,c,d,a,X[10],23,t[40])
|
||||||
|
a=z(h,a,b,c,d,X[13], 4,t[41])
|
||||||
|
d=z(h,d,a,b,c,X[ 0],11,t[42])
|
||||||
|
c=z(h,c,d,a,b,X[ 3],16,t[43])
|
||||||
|
b=z(h,b,c,d,a,X[ 6],23,t[44])
|
||||||
|
a=z(h,a,b,c,d,X[ 9], 4,t[45])
|
||||||
|
d=z(h,d,a,b,c,X[12],11,t[46])
|
||||||
|
c=z(h,c,d,a,b,X[15],16,t[47])
|
||||||
|
b=z(h,b,c,d,a,X[ 2],23,t[48])
|
||||||
|
|
||||||
|
a=z(i,a,b,c,d,X[ 0], 6,t[49])
|
||||||
|
d=z(i,d,a,b,c,X[ 7],10,t[50])
|
||||||
|
c=z(i,c,d,a,b,X[14],15,t[51])
|
||||||
|
b=z(i,b,c,d,a,X[ 5],21,t[52])
|
||||||
|
a=z(i,a,b,c,d,X[12], 6,t[53])
|
||||||
|
d=z(i,d,a,b,c,X[ 3],10,t[54])
|
||||||
|
c=z(i,c,d,a,b,X[10],15,t[55])
|
||||||
|
b=z(i,b,c,d,a,X[ 1],21,t[56])
|
||||||
|
a=z(i,a,b,c,d,X[ 8], 6,t[57])
|
||||||
|
d=z(i,d,a,b,c,X[15],10,t[58])
|
||||||
|
c=z(i,c,d,a,b,X[ 6],15,t[59])
|
||||||
|
b=z(i,b,c,d,a,X[13],21,t[60])
|
||||||
|
a=z(i,a,b,c,d,X[ 4], 6,t[61])
|
||||||
|
d=z(i,d,a,b,c,X[11],10,t[62])
|
||||||
|
c=z(i,c,d,a,b,X[ 2],15,t[63])
|
||||||
|
b=z(i,b,c,d,a,X[ 9],21,t[64])
|
||||||
|
|
||||||
|
return bit_and(A+a,0xFFFFFFFF),bit_and(B+b,0xFFFFFFFF),
|
||||||
|
bit_and(C+c,0xFFFFFFFF),bit_and(D+d,0xFFFFFFFF)
|
||||||
|
end
|
||||||
|
|
||||||
|
----------------------------------------------------------------
|
||||||
|
|
||||||
|
local function md5_update(self, s)
|
||||||
|
self.pos = self.pos + #s
|
||||||
|
s = self.buf .. s
|
||||||
|
for ii = 1, #s - 63, 64 do
|
||||||
|
local X = cut_le_str(sub(s,ii,ii+63),4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4)
|
||||||
|
assert(#X == 16)
|
||||||
|
X[0] = table.remove(X,1) -- zero based!
|
||||||
|
self.a,self.b,self.c,self.d = transform(self.a,self.b,self.c,self.d,X)
|
||||||
|
end
|
||||||
|
self.buf = sub(s, math.floor(#s/64)*64 + 1, #s)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
local function md5_finish(self)
|
||||||
|
local msgLen = self.pos
|
||||||
|
local padLen = 56 - msgLen % 64
|
||||||
|
|
||||||
|
if msgLen % 64 > 56 then padLen = padLen + 64 end
|
||||||
|
|
||||||
|
if padLen == 0 then padLen = 64 end
|
||||||
|
|
||||||
|
local s = char(128) .. rep(char(0),padLen-1) .. lei2str(bit_and(8*msgLen, 0xFFFFFFFF)) .. lei2str(math.floor(msgLen/0x20000000))
|
||||||
|
md5_update(self, s)
|
||||||
|
|
||||||
|
assert(self.pos % 64 == 0)
|
||||||
|
return lei2str(self.a) .. lei2str(self.b) .. lei2str(self.c) .. lei2str(self.d)
|
||||||
|
end
|
||||||
|
|
||||||
|
----------------------------------------------------------------
|
||||||
|
|
||||||
|
function md5.new()
|
||||||
|
return { a = CONSTS[65], b = CONSTS[66], c = CONSTS[67], d = CONSTS[68],
|
||||||
|
pos = 0,
|
||||||
|
buf = '',
|
||||||
|
update = md5_update,
|
||||||
|
finish = md5_finish }
|
||||||
|
end
|
||||||
|
|
||||||
|
function md5.tohex(s)
|
||||||
|
return format("%08x%08x%08x%08x", str2bei(sub(s, 1, 4)), str2bei(sub(s, 5, 8)), str2bei(sub(s, 9, 12)), str2bei(sub(s, 13, 16)))
|
||||||
|
end
|
||||||
|
|
||||||
|
function md5.sum(s)
|
||||||
|
return md5.new():update(s):finish()
|
||||||
|
end
|
||||||
|
|
||||||
|
function md5.sumhexa(s)
|
||||||
|
return md5.tohex(md5.sum(s))
|
||||||
|
end
|
||||||
|
bin.md5 = md5
|
||||||
|
function bin:getMD5Hash()
|
||||||
|
self:setSeek(1)
|
||||||
|
local len=self:getSize()
|
||||||
|
local md5=bin.md5.new()
|
||||||
|
local SIZE=2048
|
||||||
|
if len>SIZE then
|
||||||
|
local dat=self:read(SIZE)
|
||||||
|
while dat~=nil do
|
||||||
|
md5:update(dat)
|
||||||
|
dat=self:read(SIZE)
|
||||||
|
end
|
||||||
|
return bin.md5.tohex(md5:finish()):upper()
|
||||||
|
else
|
||||||
|
return bin.md5.sumhexa(self:getData()):upper()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return md5
|
||||||
1434
bin/bin/init.lua
Normal file
1434
bin/bin/init.lua
Normal file
File diff suppressed because it is too large
Load Diff
683
bin/bin/numbers/BigNum.lua
Normal file
683
bin/bin/numbers/BigNum.lua
Normal file
@ -0,0 +1,683 @@
|
|||||||
|
RADIX = 10^7 ;
|
||||||
|
RADIX_LEN = math.floor( math.log10 ( RADIX ) ) ;
|
||||||
|
|
||||||
|
BigNum = {} ;
|
||||||
|
BigNum.mt = {} ;
|
||||||
|
|
||||||
|
function BigNum.new( num ) --{{{2
|
||||||
|
local bignum = {} ;
|
||||||
|
setmetatable( bignum , BigNum.mt ) ;
|
||||||
|
BigNum.change( bignum , num ) ;
|
||||||
|
return bignum ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mt.sub( num1 , num2 )
|
||||||
|
local temp = BigNum.new() ;
|
||||||
|
local bnum1 = BigNum.new( num1 ) ;
|
||||||
|
local bnum2 = BigNum.new( num2 ) ;
|
||||||
|
BigNum.sub( bnum1 , bnum2 , temp ) ;
|
||||||
|
return temp ;
|
||||||
|
end
|
||||||
|
function BigNum.mt.mod( num1 , num2 )
|
||||||
|
return BigNum.new(num1 - (num1/num2)*num2)
|
||||||
|
end
|
||||||
|
function BigNum.mt.add( num1 , num2 )
|
||||||
|
local temp = BigNum.new() ;
|
||||||
|
local bnum1 = BigNum.new( num1 ) ;
|
||||||
|
local bnum2 = BigNum.new( num2 ) ;
|
||||||
|
BigNum.add( bnum1 , bnum2 , temp ) ;
|
||||||
|
return temp ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mt.mul( num1 , num2 )
|
||||||
|
local temp = BigNum.new() ;
|
||||||
|
local bnum1 = BigNum.new( num1 ) ;
|
||||||
|
local bnum2 = BigNum.new( num2 ) ;
|
||||||
|
BigNum.mul( bnum1 , bnum2 , temp ) ;
|
||||||
|
return temp ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mt.div( num1 , num2 )
|
||||||
|
local bnum1 = {} ;
|
||||||
|
local bnum2 = {} ;
|
||||||
|
local bnum3 = BigNum.new() ;
|
||||||
|
local bnum4 = BigNum.new() ;
|
||||||
|
bnum1 = BigNum.new( num1 ) ;
|
||||||
|
bnum2 = BigNum.new( num2 ) ;
|
||||||
|
BigNum.div( bnum1 , bnum2 , bnum3 , bnum4 ) ;
|
||||||
|
return bnum3 , bnum4 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mt.tostring( bnum )
|
||||||
|
local i = 0 ;
|
||||||
|
local j = 0 ;
|
||||||
|
local str = "" ;
|
||||||
|
local temp = "" ;
|
||||||
|
if bnum == nil then
|
||||||
|
return "nil" ;
|
||||||
|
elseif bnum.len > 0 then
|
||||||
|
for i = bnum.len - 2 , 0 , -1 do
|
||||||
|
for j = 0 , RADIX_LEN - string.len( bnum[i] ) - 1 do
|
||||||
|
temp = temp .. '0' ;
|
||||||
|
end
|
||||||
|
temp = temp .. bnum[i] ;
|
||||||
|
end
|
||||||
|
if bnum[bnum.len - 1]==nil then
|
||||||
|
return "nil"
|
||||||
|
end
|
||||||
|
temp = bnum[bnum.len - 1] .. temp ;
|
||||||
|
if bnum.signal == '-' then
|
||||||
|
temp = bnum.signal .. temp ;
|
||||||
|
end
|
||||||
|
return temp ;
|
||||||
|
else
|
||||||
|
return "" ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mt.pow( num1 , num2 )
|
||||||
|
local bnum1 = BigNum.new( num1 ) ;
|
||||||
|
local bnum2 = BigNum.new( num2 ) ;
|
||||||
|
return BigNum.pow( bnum1 , bnum2 ) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mt.eq( num1 , num2 )
|
||||||
|
local bnum1 = BigNum.new( num1 ) ;
|
||||||
|
local bnum2 = BigNum.new( num2 ) ;
|
||||||
|
return BigNum.eq( bnum1 , bnum2 ) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mt.lt( num1 , num2 )
|
||||||
|
local bnum1 = BigNum.new( num1 ) ;
|
||||||
|
local bnum2 = BigNum.new( num2 ) ;
|
||||||
|
return BigNum.lt( bnum1 , bnum2 ) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mt.le( num1 , num2 )
|
||||||
|
local bnum1 = BigNum.new( num1 ) ;
|
||||||
|
local bnum2 = BigNum.new( num2 ) ;
|
||||||
|
return BigNum.le( bnum1 , bnum2 ) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mt.unm( num )
|
||||||
|
local ret = BigNum.new( num )
|
||||||
|
if ret.signal == '+' then
|
||||||
|
ret.signal = '-'
|
||||||
|
else
|
||||||
|
ret.signal = '+'
|
||||||
|
end
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
BigNum.mt.__metatable = "hidden"
|
||||||
|
BigNum.mt.__tostring = BigNum.mt.tostring ;
|
||||||
|
BigNum.mt.__add = BigNum.mt.add ;
|
||||||
|
BigNum.mt.__sub = BigNum.mt.sub ;
|
||||||
|
BigNum.mt.__mul = BigNum.mt.mul ;
|
||||||
|
BigNum.mt.__div = BigNum.mt.div ;
|
||||||
|
BigNum.mt.__pow = BigNum.mt.pow ;
|
||||||
|
BigNum.mt.__unm = BigNum.mt.unm ;
|
||||||
|
BigNum.mt.__mod = BigNum.mt.mod ;
|
||||||
|
BigNum.mt.__eq = BigNum.mt.eq ;
|
||||||
|
BigNum.mt.__le = BigNum.mt.le ;
|
||||||
|
BigNum.mt.__lt = BigNum.mt.lt ;
|
||||||
|
setmetatable( BigNum.mt, { __index = "inexistent field", __newindex = "not available", __metatable="hidden" } ) ;
|
||||||
|
function BigNum.add( bnum1 , bnum2 , bnum3 )
|
||||||
|
local maxlen = 0 ;
|
||||||
|
local i = 0 ;
|
||||||
|
local carry = 0 ;
|
||||||
|
local signal = '+' ;
|
||||||
|
local old_len = 0 ;
|
||||||
|
--Handle the signals
|
||||||
|
if bnum1 == nil or bnum2 == nil or bnum3 == nil then
|
||||||
|
error("Function BigNum.add: parameter nil") ;
|
||||||
|
elseif bnum1.signal == '-' and bnum2.signal == '+' then
|
||||||
|
bnum1.signal = '+' ;
|
||||||
|
BigNum.sub( bnum2 , bnum1 , bnum3 ) ;
|
||||||
|
|
||||||
|
if not rawequal(bnum1, bnum3) then
|
||||||
|
bnum1.signal = '-' ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
elseif bnum1.signal == '+' and bnum2.signal == '-' then
|
||||||
|
bnum2.signal = '+' ;
|
||||||
|
BigNum.sub( bnum1 , bnum2 , bnum3 ) ;
|
||||||
|
if not rawequal(bnum2, bnum3) then
|
||||||
|
bnum2.signal = '-' ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
elseif bnum1.signal == '-' and bnum2.signal == '-' then
|
||||||
|
signal = '-' ;
|
||||||
|
end
|
||||||
|
--
|
||||||
|
old_len = bnum3.len ;
|
||||||
|
if bnum1.len > bnum2.len then
|
||||||
|
maxlen = bnum1.len ;
|
||||||
|
else
|
||||||
|
maxlen = bnum2.len ;
|
||||||
|
bnum1 , bnum2 = bnum2 , bnum1 ;
|
||||||
|
end
|
||||||
|
--School grade sum
|
||||||
|
for i = 0 , maxlen - 1 do
|
||||||
|
if bnum2[i] ~= nil then
|
||||||
|
bnum3[i] = bnum1[i] + bnum2[i] + carry ;
|
||||||
|
else
|
||||||
|
bnum3[i] = bnum1[i] + carry ;
|
||||||
|
end
|
||||||
|
if bnum3[i] >= RADIX then
|
||||||
|
bnum3[i] = bnum3[i] - RADIX ;
|
||||||
|
carry = 1 ;
|
||||||
|
else
|
||||||
|
carry = 0 ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
--Update the answer's size
|
||||||
|
if carry == 1 then
|
||||||
|
bnum3[maxlen] = 1 ;
|
||||||
|
end
|
||||||
|
bnum3.len = maxlen + carry ;
|
||||||
|
bnum3.signal = signal ;
|
||||||
|
for i = bnum3.len, old_len do
|
||||||
|
bnum3[i] = nil ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.sub( bnum1 , bnum2 , bnum3 )
|
||||||
|
local maxlen = 0 ;
|
||||||
|
local i = 0 ;
|
||||||
|
local carry = 0 ;
|
||||||
|
local old_len = 0 ;
|
||||||
|
if bnum1 == nil or bnum2 == nil or bnum3 == nil then
|
||||||
|
error("Function BigNum.sub: parameter nil") ;
|
||||||
|
elseif bnum1.signal == '-' and bnum2.signal == '+' then
|
||||||
|
bnum1.signal = '+' ;
|
||||||
|
BigNum.add( bnum1 , bnum2 , bnum3 ) ;
|
||||||
|
bnum3.signal = '-' ;
|
||||||
|
if not rawequal(bnum1, bnum3) then
|
||||||
|
bnum1.signal = '-' ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
elseif bnum1.signal == '-' and bnum2.signal == '-' then
|
||||||
|
bnum1.signal = '+' ;
|
||||||
|
bnum2.signal = '+' ;
|
||||||
|
BigNum.sub( bnum2, bnum1 , bnum3 ) ;
|
||||||
|
if not rawequal(bnum1, bnum3) then
|
||||||
|
bnum1.signal = '-' ;
|
||||||
|
end
|
||||||
|
if not rawequal(bnum2, bnum3) then
|
||||||
|
bnum2.signal = '-' ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
elseif bnum1.signal == '+' and bnum2.signal == '-' then
|
||||||
|
bnum2.signal = '+' ;
|
||||||
|
BigNum.add( bnum1 , bnum2 , bnum3 ) ;
|
||||||
|
if not rawequal(bnum2, bnum3) then
|
||||||
|
bnum2.signal = '-' ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
--Tests if bnum2 > bnum1
|
||||||
|
if BigNum.compareAbs( bnum1 , bnum2 ) == 2 then
|
||||||
|
BigNum.sub( bnum2 , bnum1 , bnum3 ) ;
|
||||||
|
bnum3.signal = '-' ;
|
||||||
|
return 0 ;
|
||||||
|
else
|
||||||
|
maxlen = bnum1.len ;
|
||||||
|
end
|
||||||
|
old_len = bnum3.len ;
|
||||||
|
bnum3.len = 0 ;
|
||||||
|
--School grade subtraction
|
||||||
|
for i = 0 , maxlen - 1 do
|
||||||
|
if bnum2[i] ~= nil then
|
||||||
|
bnum3[i] = bnum1[i] - bnum2[i] - carry ;
|
||||||
|
else
|
||||||
|
bnum3[i] = bnum1[i] - carry ;
|
||||||
|
end
|
||||||
|
if bnum3[i] < 0 then
|
||||||
|
bnum3[i] = RADIX + bnum3[i] ;
|
||||||
|
carry = 1 ;
|
||||||
|
else
|
||||||
|
carry = 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
if bnum3[i] ~= 0 then
|
||||||
|
bnum3.len = i + 1 ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
bnum3.signal = '+' ;
|
||||||
|
--Check if answer's size if zero
|
||||||
|
if bnum3.len == 0 then
|
||||||
|
bnum3.len = 1 ;
|
||||||
|
bnum3[0] = 0 ;
|
||||||
|
end
|
||||||
|
if carry == 1 then
|
||||||
|
error( "Error in function sub" ) ;
|
||||||
|
end
|
||||||
|
for i = bnum3.len , max( old_len , maxlen - 1 ) do
|
||||||
|
bnum3[i] = nil ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.mul( bnum1 , bnum2 , bnum3 )
|
||||||
|
local i = 0 ; j = 0 ;
|
||||||
|
local temp = BigNum.new( ) ;
|
||||||
|
local temp2 = 0 ;
|
||||||
|
local carry = 0 ;
|
||||||
|
local oldLen = bnum3.len ;
|
||||||
|
if bnum1 == nil or bnum2 == nil or bnum3 == nil then
|
||||||
|
error("Function BigNum.mul: parameter nil") ;
|
||||||
|
--Handle the signals
|
||||||
|
elseif bnum1.signal ~= bnum2.signal then
|
||||||
|
BigNum.mul( bnum1 , -bnum2 , bnum3 ) ;
|
||||||
|
bnum3.signal = '-' ;
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
bnum3.len = ( bnum1.len ) + ( bnum2.len ) ;
|
||||||
|
--Fill with zeros
|
||||||
|
for i = 1 , bnum3.len do
|
||||||
|
bnum3[i - 1] = 0 ;
|
||||||
|
end
|
||||||
|
--Places nil where passes through this
|
||||||
|
for i = bnum3.len , oldLen do
|
||||||
|
bnum3[i] = nil ;
|
||||||
|
end
|
||||||
|
--School grade multiplication
|
||||||
|
for i = 0 , bnum1.len - 1 do
|
||||||
|
for j = 0 , bnum2.len - 1 do
|
||||||
|
carry = ( bnum1[i] * bnum2[j] + carry ) ;
|
||||||
|
carry = carry + bnum3[i + j] ;
|
||||||
|
bnum3[i + j] = ( carry % RADIX ) ;
|
||||||
|
temp2 = bnum3[i + j] ;
|
||||||
|
carry = math.floor ( carry / RADIX ) ;
|
||||||
|
end
|
||||||
|
if carry ~= 0 then
|
||||||
|
bnum3[i + bnum2.len] = carry ;
|
||||||
|
end
|
||||||
|
carry = 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
--Update the answer's size
|
||||||
|
for i = bnum3.len - 1 , 1 , -1 do
|
||||||
|
if bnum3[i] ~= nil and bnum3[i] ~= 0 then
|
||||||
|
break ;
|
||||||
|
else
|
||||||
|
bnum3[i] = nil ;
|
||||||
|
end
|
||||||
|
bnum3.len = bnum3.len - 1 ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.div( bnum1 , bnum2 , bnum3 , bnum4 )
|
||||||
|
local temp = BigNum.new() ;
|
||||||
|
local temp2 = BigNum.new() ;
|
||||||
|
local one = BigNum.new( "1" ) ;
|
||||||
|
local zero = BigNum.new( "0" ) ;
|
||||||
|
--Check division by zero
|
||||||
|
if BigNum.compareAbs( bnum2 , zero ) == 0 then
|
||||||
|
error( "Function BigNum.div: Division by zero" ) ;
|
||||||
|
end
|
||||||
|
--Handle the signals
|
||||||
|
if bnum1 == nil or bnum2 == nil or bnum3 == nil or bnum4 == nil then
|
||||||
|
error( "Function BigNum.div: parameter nil" ) ;
|
||||||
|
elseif bnum1.signal == "+" and bnum2.signal == "-" then
|
||||||
|
bnum2.signal = "+" ;
|
||||||
|
BigNum.div( bnum1 , bnum2 , bnum3 , bnum4 ) ;
|
||||||
|
bnum2.signal = "-" ;
|
||||||
|
bnum3.signal = "-" ;
|
||||||
|
return 0 ;
|
||||||
|
elseif bnum1.signal == "-" and bnum2.signal == "+" then
|
||||||
|
bnum1.signal = "+" ;
|
||||||
|
BigNum.div( bnum1 , bnum2 , bnum3 , bnum4 ) ;
|
||||||
|
bnum1.signal = "-" ;
|
||||||
|
if bnum4 < zero then --Check if remainder is negative
|
||||||
|
BigNum.add( bnum3 , one , bnum3 ) ;
|
||||||
|
BigNum.sub( bnum2 , bnum4 , bnum4 ) ;
|
||||||
|
end
|
||||||
|
bnum3.signal = "-" ;
|
||||||
|
return 0 ;
|
||||||
|
elseif bnum1.signal == "-" and bnum2.signal == "-" then
|
||||||
|
bnum1.signal = "+" ;
|
||||||
|
bnum2.signal = "+" ;
|
||||||
|
BigNum.div( bnum1 , bnum2 , bnum3 , bnum4 ) ;
|
||||||
|
bnum1.signal = "-" ;
|
||||||
|
if bnum4 < zero then --Check if remainder is negative
|
||||||
|
BigNum.add( bnum3 , one , bnum3 ) ;
|
||||||
|
BigNum.sub( bnum2 , bnum4 , bnum4 ) ;
|
||||||
|
end
|
||||||
|
bnum2.signal = "-" ;
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
temp.len = bnum1.len - bnum2.len - 1 ;
|
||||||
|
|
||||||
|
--Reset variables
|
||||||
|
BigNum.change( bnum3 , "0" ) ;
|
||||||
|
BigNum.change( bnum4 , "0" ) ;
|
||||||
|
|
||||||
|
BigNum.copy( bnum1 , bnum4 ) ;
|
||||||
|
|
||||||
|
--Check if can continue dividing
|
||||||
|
while( BigNum.compareAbs( bnum4 , bnum2 ) ~= 2 ) do
|
||||||
|
if bnum4[bnum4.len - 1] >= bnum2[bnum2.len - 1] then
|
||||||
|
BigNum.put( temp , math.floor( bnum4[bnum4.len - 1] / bnum2[bnum2.len - 1] ) , bnum4.len - bnum2.len ) ;
|
||||||
|
temp.len = bnum4.len - bnum2.len + 1 ;
|
||||||
|
else
|
||||||
|
BigNum.put( temp , math.floor( ( bnum4[bnum4.len - 1] * RADIX + bnum4[bnum4.len - 2] ) / bnum2[bnum2.len -1] ) , bnum4.len - bnum2.len - 1 ) ;
|
||||||
|
temp.len = bnum4.len - bnum2.len ;
|
||||||
|
end
|
||||||
|
|
||||||
|
if bnum4.signal ~= bnum2.signal then
|
||||||
|
temp.signal = "-";
|
||||||
|
else
|
||||||
|
temp.signal = "+";
|
||||||
|
end
|
||||||
|
BigNum.add( temp , bnum3 , bnum3 ) ;
|
||||||
|
temp = temp * bnum2 ;
|
||||||
|
BigNum.sub( bnum4 , temp , bnum4 ) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
--Update if the remainder is negative
|
||||||
|
if bnum4.signal == '-' then
|
||||||
|
decr( bnum3 ) ;
|
||||||
|
BigNum.add( bnum2 , bnum4 , bnum4 ) ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.pow( bnum1 , bnum2 )
|
||||||
|
local n = BigNum.new( bnum2 ) ;
|
||||||
|
local y = BigNum.new( 1 ) ;
|
||||||
|
local z = BigNum.new( bnum1 ) ;
|
||||||
|
local zero = BigNum.new( "0" ) ;
|
||||||
|
if bnum2 < zero then
|
||||||
|
error( "Function BigNum.exp: domain error" ) ;
|
||||||
|
elseif bnum2 == zero then
|
||||||
|
return y ;
|
||||||
|
end
|
||||||
|
while 1 do
|
||||||
|
if ( n[0] % 2 ) == 0 then
|
||||||
|
n = n / 2 ;
|
||||||
|
else
|
||||||
|
n = n / 2 ;
|
||||||
|
y = z * y ;
|
||||||
|
if n == zero then
|
||||||
|
return y ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
z = z * z ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Português :
|
||||||
|
BigNum.exp = BigNum.pow
|
||||||
|
|
||||||
|
function BigNum.gcd( bnum1 , bnum2 )
|
||||||
|
local a = {} ;
|
||||||
|
local b = {} ;
|
||||||
|
local c = {} ;
|
||||||
|
local d = {} ;
|
||||||
|
local zero = {} ;
|
||||||
|
zero = BigNum.new( "0" ) ;
|
||||||
|
if bnum1 == zero or bnum2 == zero then
|
||||||
|
return BigNum.new( "1" ) ;
|
||||||
|
end
|
||||||
|
a = BigNum.new( bnum1 ) ;
|
||||||
|
b = BigNum.new( bnum2 ) ;
|
||||||
|
a.signal = '+' ;
|
||||||
|
b.signal = '+' ;
|
||||||
|
c = BigNum.new() ;
|
||||||
|
d = BigNum.new() ;
|
||||||
|
while b > zero do
|
||||||
|
BigNum.div( a , b , c , d ) ;
|
||||||
|
a , b , d = b , d , a ;
|
||||||
|
end
|
||||||
|
return a ;
|
||||||
|
end
|
||||||
|
-- Português:
|
||||||
|
BigNum.mmc = BigNum.gcd
|
||||||
|
|
||||||
|
function BigNum.eq( bnum1 , bnum2 )
|
||||||
|
if BigNum.compare( bnum1 , bnum2 ) == 0 then
|
||||||
|
return true ;
|
||||||
|
else
|
||||||
|
return false ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.lt( bnum1 , bnum2 )
|
||||||
|
if BigNum.compare( bnum1 , bnum2 ) == 2 then
|
||||||
|
return true ;
|
||||||
|
else
|
||||||
|
return false ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.le( bnum1 , bnum2 )
|
||||||
|
local temp = -1 ;
|
||||||
|
temp = BigNum.compare( bnum1 , bnum2 )
|
||||||
|
if temp == 0 or temp == 2 then
|
||||||
|
return true ;
|
||||||
|
else
|
||||||
|
return false ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.compareAbs( bnum1 , bnum2 )
|
||||||
|
if bnum1 == nil or bnum2 == nil then
|
||||||
|
error("Function compare: parameter nil") ;
|
||||||
|
elseif bnum1.len > bnum2.len then
|
||||||
|
return 1 ;
|
||||||
|
elseif bnum1.len < bnum2.len then
|
||||||
|
return 2 ;
|
||||||
|
else
|
||||||
|
local i ;
|
||||||
|
for i = bnum1.len - 1 , 0 , -1 do
|
||||||
|
if bnum1[i] > bnum2[i] then
|
||||||
|
return 1 ;
|
||||||
|
elseif bnum1[i] < bnum2[i] then
|
||||||
|
return 2 ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.compare( bnum1 , bnum2 )
|
||||||
|
local signal = 0 ;
|
||||||
|
|
||||||
|
if bnum1 == nil or bnum2 == nil then
|
||||||
|
error("Funtion BigNum.compare: parameter nil") ;
|
||||||
|
elseif bnum1.signal == '+' and bnum2.signal == '-' then
|
||||||
|
return 1 ;
|
||||||
|
elseif bnum1.signal == '-' and bnum2.signal == '+' then
|
||||||
|
return 2 ;
|
||||||
|
elseif bnum1.signal == '-' and bnum2.signal == '-' then
|
||||||
|
signal = 1 ;
|
||||||
|
end
|
||||||
|
if bnum1.len > bnum2.len then
|
||||||
|
return 1 + signal ;
|
||||||
|
elseif bnum1.len < bnum2.len then
|
||||||
|
return 2 - signal ;
|
||||||
|
else
|
||||||
|
local i ;
|
||||||
|
for i = bnum1.len - 1 , 0 , -1 do
|
||||||
|
if bnum1[i] > bnum2[i] then
|
||||||
|
return 1 + signal ;
|
||||||
|
elseif bnum1[i] < bnum2[i] then
|
||||||
|
return 2 - signal ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.copy( bnum1 , bnum2 )
|
||||||
|
if bnum1 ~= nil and bnum2 ~= nil then
|
||||||
|
local i ;
|
||||||
|
for i = 0 , bnum1.len - 1 do
|
||||||
|
bnum2[i] = bnum1[i] ;
|
||||||
|
end
|
||||||
|
bnum2.len = bnum1.len ;
|
||||||
|
else
|
||||||
|
error("Function BigNum.copy: parameter nil") ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.change( bnum1 , num )
|
||||||
|
local j = 0 ;
|
||||||
|
local len = 0 ;
|
||||||
|
local num = num ;
|
||||||
|
local l ;
|
||||||
|
local oldLen = 0 ;
|
||||||
|
if bnum1 == nil then
|
||||||
|
error( "BigNum.change: parameter nil" ) ;
|
||||||
|
elseif type( bnum1 ) ~= "table" then
|
||||||
|
error( "BigNum.change: parameter error, type unexpected" ) ;
|
||||||
|
elseif num == nil then
|
||||||
|
bnum1.len = 1 ;
|
||||||
|
bnum1[0] = 0 ;
|
||||||
|
bnum1.signal = "+";
|
||||||
|
elseif type( num ) == "table" and num.len ~= nil then --check if num is a big number
|
||||||
|
--copy given table to the new one
|
||||||
|
for i = 0 , num.len do
|
||||||
|
bnum1[i] = num[i] ;
|
||||||
|
end
|
||||||
|
if num.signal ~= '-' and num.signal ~= '+' then
|
||||||
|
bnum1.signal = '+' ;
|
||||||
|
else
|
||||||
|
bnum1.signal = num.signal ;
|
||||||
|
end
|
||||||
|
oldLen = bnum1.len ;
|
||||||
|
bnum1.len = num.len ;
|
||||||
|
elseif type( num ) == "string" or type( num ) == "number" then
|
||||||
|
if string.sub( num , 1 , 1 ) == '+' or string.sub( num , 1 , 1 ) == '-' then
|
||||||
|
bnum1.signal = string.sub( num , 1 , 1 ) ;
|
||||||
|
num = string.sub(num, 2) ;
|
||||||
|
else
|
||||||
|
bnum1.signal = '+' ;
|
||||||
|
end
|
||||||
|
num = string.gsub( num , " " , "" ) ;
|
||||||
|
local sf = string.find( num , "e" ) ;
|
||||||
|
--Handles if the number is in exp notation
|
||||||
|
if sf ~= nil then
|
||||||
|
num = string.gsub( num , "%." , "" ) ;
|
||||||
|
local e = string.sub( num , sf + 1 ) ;
|
||||||
|
e = tonumber(e) ;
|
||||||
|
if e ~= nil and e > 0 then
|
||||||
|
e = tonumber(e) ;
|
||||||
|
else
|
||||||
|
error( "Function BigNum.change: string is not a valid number" ) ;
|
||||||
|
end
|
||||||
|
num = string.sub( num , 1 , sf - 2 ) ;
|
||||||
|
for i = string.len( num ) , e do
|
||||||
|
num = num .. "0" ;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
sf = string.find( num , "%." ) ;
|
||||||
|
if sf ~= nil then
|
||||||
|
num = string.sub( num , 1 , sf - 1 ) ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
l = string.len( num ) ;
|
||||||
|
oldLen = bnum1.len ;
|
||||||
|
if (l > RADIX_LEN) then
|
||||||
|
local mod = l-( math.floor( l / RADIX_LEN ) * RADIX_LEN ) ;
|
||||||
|
for i = 1 , l-mod, RADIX_LEN do
|
||||||
|
bnum1[j] = tonumber( string.sub( num, -( i + RADIX_LEN - 1 ) , -i ) );
|
||||||
|
--Check if string dosn't represents a number
|
||||||
|
if bnum1[j] == nil then
|
||||||
|
error( "Function BigNum.change: string is not a valid number" ) ;
|
||||||
|
bnum1.len = 0 ;
|
||||||
|
return 1 ;
|
||||||
|
end
|
||||||
|
j = j + 1 ;
|
||||||
|
len = len + 1 ;
|
||||||
|
end
|
||||||
|
if (mod ~= 0) then
|
||||||
|
bnum1[j] = tonumber( string.sub( num , 1 , mod ) ) ;
|
||||||
|
bnum1.len = len + 1 ;
|
||||||
|
else
|
||||||
|
bnum1.len = len ;
|
||||||
|
end
|
||||||
|
--Eliminate trailing zeros
|
||||||
|
for i = bnum1.len - 1 , 1 , -1 do
|
||||||
|
if bnum1[i] == 0 then
|
||||||
|
bnum1[i] = nil ;
|
||||||
|
bnum1.len = bnum1.len - 1 ;
|
||||||
|
else
|
||||||
|
break ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
-- string.len(num) <= RADIX_LEN
|
||||||
|
bnum1[j] = tonumber( num ) ;
|
||||||
|
bnum1.len = 1 ;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
error( "Function BigNum.change: parameter error, type unexpected" ) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
--eliminates the deprecated higher order 'algarisms'
|
||||||
|
if oldLen ~= nil then
|
||||||
|
for i = bnum1.len , oldLen do
|
||||||
|
bnum1[i] = nil ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigNum.put( bnum , int , pos )
|
||||||
|
if bnum == nil then
|
||||||
|
error("Function BigNum.put: parameter nil") ;
|
||||||
|
end
|
||||||
|
local i = 0 ;
|
||||||
|
for i = 0 , pos - 1 do
|
||||||
|
bnum[i] = 0 ;
|
||||||
|
end
|
||||||
|
bnum[pos] = int ;
|
||||||
|
for i = pos + 1 , bnum.len do
|
||||||
|
bnum[i] = nil ;
|
||||||
|
end
|
||||||
|
bnum.len = pos ;
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
--printraw{{{2
|
||||||
|
function printraw( bnum )
|
||||||
|
local i = 0 ;
|
||||||
|
if bnum == nil then
|
||||||
|
error( "Function printraw: parameter nil" ) ;
|
||||||
|
end
|
||||||
|
while 1 == 1 do
|
||||||
|
if bnum[i] == nil then
|
||||||
|
io.write( ' len '..bnum.len ) ;
|
||||||
|
if i ~= bnum.len then
|
||||||
|
io.write( ' ERRO!!!!!!!!' ) ;
|
||||||
|
end
|
||||||
|
io.write( "\n" ) ;
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
io.write( 'r'..bnum[i] ) ;
|
||||||
|
i = i + 1 ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
--max{{{2
|
||||||
|
function max( int1 , int2 )
|
||||||
|
if int1 > int2 then
|
||||||
|
return int1 ;
|
||||||
|
else
|
||||||
|
return int2 ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--decr{{{2
|
||||||
|
function decr( bnum1 )
|
||||||
|
local temp = {} ;
|
||||||
|
temp = BigNum.new( "1" ) ;
|
||||||
|
BigNum.sub( bnum1 , temp , bnum1 ) ;
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
227
bin/bin/numbers/BigRat.lua
Normal file
227
bin/bin/numbers/BigRat.lua
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
require( "bin.numbers.BigNum" ) ;
|
||||||
|
|
||||||
|
BigRat = {} ;
|
||||||
|
BigRat.mt = {} ;
|
||||||
|
function BigRat.new( num1 , num2 ) --{{{2
|
||||||
|
local bigrat = {} ;
|
||||||
|
local f ;
|
||||||
|
setmetatable(bigrat, BigRat.mt) ;
|
||||||
|
if type( num1 ) == "table" then
|
||||||
|
if num1.num ~= nil and num1.den ~= nil then
|
||||||
|
bigrat.num = BigNum.new( num1.num ) ;
|
||||||
|
bigrat.den = BigNum.new( num1.den ) ;
|
||||||
|
else
|
||||||
|
bigrat.num = BigNum.new( num1 ) ;
|
||||||
|
bigrat.den = BigNum.new( "1" ) ;
|
||||||
|
end
|
||||||
|
elseif num1 ~= nil then
|
||||||
|
if num2 == nil then
|
||||||
|
bigrat.den = BigNum.new( "1" ) ;
|
||||||
|
else
|
||||||
|
bigrat.den = BigNum.new( num2 ) ;
|
||||||
|
end
|
||||||
|
bigrat.num = BigNum.new( num1 ) ;
|
||||||
|
else
|
||||||
|
bigrat.den = BigNum.new( ) ;
|
||||||
|
bigrat.num = BigNum.new( ) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
--Update the signals
|
||||||
|
if bigrat.den.signal == "-" then
|
||||||
|
if bigrat.num.signal == "-" then
|
||||||
|
bigrat.num.signal = "+" ;
|
||||||
|
else
|
||||||
|
bigrat.num.signal = "-" ;
|
||||||
|
end
|
||||||
|
bigrat.den.signal = "+" ;
|
||||||
|
end
|
||||||
|
|
||||||
|
return bigrat ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.sub( num1 , num2 )
|
||||||
|
local temp = BigRat.new() ;
|
||||||
|
local brat1 = BigRat.new( num1 ) ;
|
||||||
|
local brat2 = BigRat.new( num2 ) ;
|
||||||
|
BigRat.sub( brat1 , brat2 , temp ) ;
|
||||||
|
return temp ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.add( num1 , num2 )
|
||||||
|
local temp = BigRat.new() ;
|
||||||
|
local brat1 = BigRat.new( num1 ) ;
|
||||||
|
local brat2 = BigRat.new( num2 ) ;
|
||||||
|
BigRat.add( brat1 , brat2 , temp ) ;
|
||||||
|
return temp ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.mul( num1 , num2 )
|
||||||
|
local temp = BigRat.new() ;
|
||||||
|
local brat1 = BigRat.new( num1 ) ;
|
||||||
|
local brat2 = BigRat.new( num2 ) ;
|
||||||
|
BigRat.mul( brat1 , brat2 , temp ) ;
|
||||||
|
return temp ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.div( num1 , num2 )
|
||||||
|
local brat1 = BigRat.new( num1 ) ;
|
||||||
|
local brat2 = BigRat.new( num2 ) ;
|
||||||
|
local brat3 = BigRat.new() ;
|
||||||
|
local brat4 = BigRat.new() ;
|
||||||
|
BigRat.div( brat1 , brat2 , brat3 , brat4 ) ;
|
||||||
|
return brat3 , brat4 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.tostring( brat )
|
||||||
|
BigRat.simplify( brat ) ;
|
||||||
|
return BigNum.mt.tostring( brat.num ) .. " / " .. BigNum.mt.tostring( brat.den ) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.pow ( num1 , num2 )
|
||||||
|
local brat1 = BigRat.new( num1 ) ;
|
||||||
|
local brat2 = BigRat.new( num2 ) ;
|
||||||
|
return BigRat.pow( brat1 , brat2 )
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.eq ( num1 , num2 )
|
||||||
|
return BigRat.eq( num1 , num2 )
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.lt ( num1 , num2 )
|
||||||
|
return BigRat.lt( num1 , num2 )
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.le ( num1 , num2 )
|
||||||
|
return BigRat.le( num1 , num2 )
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mt.unm ( num )
|
||||||
|
local ret = BigRat.new( num )
|
||||||
|
if ret.num.signal == '-' then
|
||||||
|
ret.num.signal = '+'
|
||||||
|
else
|
||||||
|
ret.num.signal = '-'
|
||||||
|
end
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
BigRat.mt.__metatable = "hidden"
|
||||||
|
BigRat.mt.__tostring = BigRat.mt.tostring
|
||||||
|
BigRat.mt.__add = BigRat.mt.add
|
||||||
|
BigRat.mt.__sub = BigRat.mt.sub
|
||||||
|
BigRat.mt.__mul = BigRat.mt.mul
|
||||||
|
BigRat.mt.__div = BigRat.mt.div
|
||||||
|
BigRat.mt.__pow = BigRat.mt.pow
|
||||||
|
BigRat.mt.__unm = BigRat.mt.unm
|
||||||
|
BigRat.mt.__eq = BigRat.mt.eq
|
||||||
|
BigRat.mt.__le = BigRat.mt.le
|
||||||
|
BigRat.mt.__lt = BigRat.mt.lt
|
||||||
|
setmetatable( BigRat.mt, { __index = "inexistent field", __newindex = "not available", __metatable="hidden" } ) ;
|
||||||
|
function BigRat.add( brat1 , brat2 , brat3 )
|
||||||
|
brat3.den = brat1.den * brat2.den ;
|
||||||
|
brat3.num = ( brat1.num * brat2.den ) + ( brat2.num * brat1.den ) ;
|
||||||
|
return brat3 ;
|
||||||
|
end
|
||||||
|
function BigRat.sub( brat1 , brat2 , brat3 )
|
||||||
|
brat3.den = brat1.den * brat2.den ;
|
||||||
|
brat3.num = ( brat1.num * brat2.den ) - ( brat2.num * brat1.den ) ;
|
||||||
|
return brat3 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.mul( brat1 , brat2 , brat3 )
|
||||||
|
brat3.num = brat1.num * brat2.num ;
|
||||||
|
brat3.den = brat1.den * brat2.den ;
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.div( brat1 , brat2 , brat3 )
|
||||||
|
brat3.num = brat1.num * brat2.den ;
|
||||||
|
brat3.den = brat1.den * brat2.num ;
|
||||||
|
return brat3 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.pow( bnum1 , bnum2 )
|
||||||
|
if bnum1 == nil or bnum2 == nil then
|
||||||
|
error( "Function BigRat.pow: parameter nil" ) ;
|
||||||
|
end
|
||||||
|
local x = BigRat.new( "8" ) ;
|
||||||
|
local n = BigRat.new( bnum2.den ) ;
|
||||||
|
local n2 ;
|
||||||
|
local y = BigRat.new( ) ;
|
||||||
|
local i ;
|
||||||
|
local temp = BigRat.new( ) ;
|
||||||
|
|
||||||
|
BigRat.simplify( bnum2 ) ;
|
||||||
|
temp.num = BigNum.exp( bnum1.num , bnum2.num ) ;
|
||||||
|
temp.den = BigNum.exp( bnum1.den , bnum2.num ) ;
|
||||||
|
n2 = n - 1 ;
|
||||||
|
|
||||||
|
for i = 0 , 4 do
|
||||||
|
y.num = x.num ^ n2.num ;
|
||||||
|
y.den = x.den ^ n2.num ;
|
||||||
|
x = (( temp / y ) + ( n2 * x )) / n ;
|
||||||
|
end
|
||||||
|
return x ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.simplify( brat )
|
||||||
|
if brat == nil then
|
||||||
|
error( "Function BigRat.simplify: parameter nil" ) ;
|
||||||
|
end
|
||||||
|
local gcd = BigNum.new( ) ;
|
||||||
|
local temp = BigRat.new( brat ) ;
|
||||||
|
local devnull = BigNum.new( ) ;
|
||||||
|
local zero = BigNum.new( "0" ) ;
|
||||||
|
--Check if numerator is zero
|
||||||
|
if BigNum.compareAbs( brat.num , zero ) == 0 then
|
||||||
|
brat.den = BigNum.new( "1" ) ;
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
gcd = BigNum.gcd( brat.num , brat.den ) ;
|
||||||
|
BigNum.div( temp.num , gcd , brat.num , devnull ) ;
|
||||||
|
BigNum.div( temp.den , gcd , brat.den , devnull ) ;
|
||||||
|
--Update the signal
|
||||||
|
if brat.num.signal == '-' and brat.den.signal == '-' then
|
||||||
|
brat.num.signal = '+' ;
|
||||||
|
brat.den.signal = '+' ;
|
||||||
|
end
|
||||||
|
return 0 ;
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.eq( brat1 , brat2 )
|
||||||
|
if BigRat.compare( brat1 , brat2 ) == 0 then
|
||||||
|
return true ;
|
||||||
|
else
|
||||||
|
return false ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.lt( brat1 , brat2 )
|
||||||
|
if BigRat.compare( brat1 , brat2 ) == 2 then
|
||||||
|
return true ;
|
||||||
|
else
|
||||||
|
return false ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.le( brat1 , brat2 )
|
||||||
|
local temp = -1 ;
|
||||||
|
temp = BigRat.compare( brat1 , brat2 )
|
||||||
|
if temp == 0 or temp == 2 then
|
||||||
|
return true ;
|
||||||
|
else
|
||||||
|
return false ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function BigRat.compare( bnum1 , bnum2 )
|
||||||
|
local temp ;
|
||||||
|
temp = bnum1 - bnum2 ;
|
||||||
|
if temp.num[0] == 0 and temp.num.len == 1 then --Check if is zero
|
||||||
|
return 0 ;
|
||||||
|
elseif temp.num.signal == "-" then
|
||||||
|
return 2 ;
|
||||||
|
else
|
||||||
|
return 1 ;
|
||||||
|
end
|
||||||
|
end
|
||||||
333
bin/bin/numbers/no_jit_bit.lua
Normal file
333
bin/bin/numbers/no_jit_bit.lua
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
--[[
|
||||||
|
LICENSE
|
||||||
|
|
||||||
|
(c) 2008-2011 David Manura. Licensed under the same terms as Lua (MIT).
|
||||||
|
--]]
|
||||||
|
|
||||||
|
local M = {_TYPE='module', _NAME='bit.numberlua', _VERSION='0.3.1.20120131'}
|
||||||
|
|
||||||
|
local floor = math.floor
|
||||||
|
|
||||||
|
local MOD = 2^32
|
||||||
|
local MODM = MOD-1
|
||||||
|
|
||||||
|
local function memoize(f)
|
||||||
|
local mt = {}
|
||||||
|
local t = setmetatable({}, mt)
|
||||||
|
function mt:__index(k)
|
||||||
|
local v = f(k); t[k] = v
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
local function make_bitop_uncached(t, m)
|
||||||
|
local function bitop(a, b)
|
||||||
|
local res,p = 0,1
|
||||||
|
while a ~= 0 and b ~= 0 do
|
||||||
|
local am, bm = a%m, b%m
|
||||||
|
res = res + t[am][bm]*p
|
||||||
|
a = (a - am) / m
|
||||||
|
b = (b - bm) / m
|
||||||
|
p = p*m
|
||||||
|
end
|
||||||
|
res = res + (a+b)*p
|
||||||
|
return res
|
||||||
|
end
|
||||||
|
return bitop
|
||||||
|
end
|
||||||
|
|
||||||
|
local function make_bitop(t)
|
||||||
|
local op1 = make_bitop_uncached(t,2^1)
|
||||||
|
local op2 = memoize(function(a)
|
||||||
|
return memoize(function(b)
|
||||||
|
return op1(a, b)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
return make_bitop_uncached(op2, 2^(t.n or 1))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ok? probably not if running on a 32-bit int Lua number type platform
|
||||||
|
function M.tobit(x)
|
||||||
|
return x % 2^32
|
||||||
|
end
|
||||||
|
|
||||||
|
M.bxor = make_bitop {[0]={[0]=0,[1]=1},[1]={[0]=1,[1]=0}, n=4}
|
||||||
|
local bxor = M.bxor
|
||||||
|
|
||||||
|
function M.bnot(a) return MODM - a end
|
||||||
|
local bnot = M.bnot
|
||||||
|
|
||||||
|
function M.band(a,b) return ((a+b) - bxor(a,b))/2 end
|
||||||
|
local band = M.band
|
||||||
|
|
||||||
|
function M.bor(a,b) return MODM - band(MODM - a, MODM - b) end
|
||||||
|
local bor = M.bor
|
||||||
|
|
||||||
|
local lshift, rshift -- forward declare
|
||||||
|
|
||||||
|
function M.rshift(a,disp) -- Lua5.2 insipred
|
||||||
|
if disp < 0 then return lshift(a,-disp) end
|
||||||
|
return floor(a % 2^32 / 2^disp)
|
||||||
|
end
|
||||||
|
rshift = M.rshift
|
||||||
|
|
||||||
|
function M.lshift(a,disp) -- Lua5.2 inspired
|
||||||
|
if disp < 0 then return rshift(a,-disp) end
|
||||||
|
return (a * 2^disp) % 2^32
|
||||||
|
end
|
||||||
|
lshift = M.lshift
|
||||||
|
|
||||||
|
function M.tohex(x, n) -- BitOp style
|
||||||
|
n = n or 8
|
||||||
|
local up
|
||||||
|
if n <= 0 then
|
||||||
|
if n == 0 then return '' end
|
||||||
|
up = true
|
||||||
|
n = - n
|
||||||
|
end
|
||||||
|
x = band(x, 16^n-1)
|
||||||
|
return ('%0'..n..(up and 'X' or 'x')):format(x)
|
||||||
|
end
|
||||||
|
local tohex = M.tohex
|
||||||
|
|
||||||
|
function M.extract(n, field, width) -- Lua5.2 inspired
|
||||||
|
width = width or 1
|
||||||
|
return band(rshift(n, field), 2^width-1)
|
||||||
|
end
|
||||||
|
local extract = M.extract
|
||||||
|
|
||||||
|
function M.replace(n, v, field, width) -- Lua5.2 inspired
|
||||||
|
width = width or 1
|
||||||
|
local mask1 = 2^width-1
|
||||||
|
v = band(v, mask1) -- required by spec?
|
||||||
|
local mask = bnot(lshift(mask1, field))
|
||||||
|
return band(n, mask) + lshift(v, field)
|
||||||
|
end
|
||||||
|
local replace = M.replace
|
||||||
|
|
||||||
|
function M.bswap(x) -- BitOp style
|
||||||
|
local a = band(x, 0xff); x = rshift(x, 8)
|
||||||
|
local b = band(x, 0xff); x = rshift(x, 8)
|
||||||
|
local c = band(x, 0xff); x = rshift(x, 8)
|
||||||
|
local d = band(x, 0xff)
|
||||||
|
return lshift(lshift(lshift(a, 8) + b, 8) + c, 8) + d
|
||||||
|
end
|
||||||
|
local bswap = M.bswap
|
||||||
|
|
||||||
|
function M.rrotate(x, disp) -- Lua5.2 inspired
|
||||||
|
disp = disp % 32
|
||||||
|
local low = band(x, 2^disp-1)
|
||||||
|
return rshift(x, disp) + lshift(low, 32-disp)
|
||||||
|
end
|
||||||
|
local rrotate = M.rrotate
|
||||||
|
|
||||||
|
function M.lrotate(x, disp) -- Lua5.2 inspired
|
||||||
|
return rrotate(x, -disp)
|
||||||
|
end
|
||||||
|
local lrotate = M.lrotate
|
||||||
|
|
||||||
|
M.rol = M.lrotate -- LuaOp inspired
|
||||||
|
M.ror = M.rrotate -- LuaOp insipred
|
||||||
|
|
||||||
|
|
||||||
|
function M.arshift(x, disp) -- Lua5.2 inspired
|
||||||
|
local z = rshift(x, disp)
|
||||||
|
if x >= 0x80000000 then z = z + lshift(2^disp-1, 32-disp) end
|
||||||
|
return z
|
||||||
|
end
|
||||||
|
local arshift = M.arshift
|
||||||
|
|
||||||
|
function M.btest(x, y) -- Lua5.2 inspired
|
||||||
|
return band(x, y) ~= 0
|
||||||
|
end
|
||||||
|
|
||||||
|
M.bit32 = {} -- Lua 5.2 'bit32' compatibility
|
||||||
|
|
||||||
|
|
||||||
|
local function bit32_bnot(x)
|
||||||
|
return (-1 - x) % MOD
|
||||||
|
end
|
||||||
|
M.bit32.bnot = bit32_bnot
|
||||||
|
|
||||||
|
local function bit32_bxor(a, b, c, ...)
|
||||||
|
local z
|
||||||
|
if b then
|
||||||
|
a = a % MOD
|
||||||
|
b = b % MOD
|
||||||
|
z = bxor(a, b)
|
||||||
|
if c then
|
||||||
|
z = bit32_bxor(z, c, ...)
|
||||||
|
end
|
||||||
|
return z
|
||||||
|
elseif a then
|
||||||
|
return a % MOD
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
M.bit32.bxor = bit32_bxor
|
||||||
|
|
||||||
|
local function bit32_band(a, b, c, ...)
|
||||||
|
local z
|
||||||
|
if b then
|
||||||
|
a = a % MOD
|
||||||
|
b = b % MOD
|
||||||
|
z = ((a+b) - bxor(a,b)) / 2
|
||||||
|
if c then
|
||||||
|
z = bit32_band(z, c, ...)
|
||||||
|
end
|
||||||
|
return z
|
||||||
|
elseif a then
|
||||||
|
return a % MOD
|
||||||
|
else
|
||||||
|
return MODM
|
||||||
|
end
|
||||||
|
end
|
||||||
|
M.bit32.band = bit32_band
|
||||||
|
|
||||||
|
local function bit32_bor(a, b, c, ...)
|
||||||
|
local z
|
||||||
|
if b then
|
||||||
|
a = a % MOD
|
||||||
|
b = b % MOD
|
||||||
|
z = MODM - band(MODM - a, MODM - b)
|
||||||
|
if c then
|
||||||
|
z = bit32_bor(z, c, ...)
|
||||||
|
end
|
||||||
|
return z
|
||||||
|
elseif a then
|
||||||
|
return a % MOD
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
M.bit32.bor = bit32_bor
|
||||||
|
|
||||||
|
function M.bit32.btest(...)
|
||||||
|
return bit32_band(...) ~= 0
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit32.lrotate(x, disp)
|
||||||
|
return lrotate(x % MOD, disp)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit32.rrotate(x, disp)
|
||||||
|
return rrotate(x % MOD, disp)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit32.lshift(x,disp)
|
||||||
|
if disp > 31 or disp < -31 then return 0 end
|
||||||
|
return lshift(x % MOD, disp)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit32.rshift(x,disp)
|
||||||
|
if disp > 31 or disp < -31 then return 0 end
|
||||||
|
return rshift(x % MOD, disp)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit32.arshift(x,disp)
|
||||||
|
x = x % MOD
|
||||||
|
if disp >= 0 then
|
||||||
|
if disp > 31 then
|
||||||
|
return (x >= 0x80000000) and MODM or 0
|
||||||
|
else
|
||||||
|
local z = rshift(x, disp)
|
||||||
|
if x >= 0x80000000 then z = z + lshift(2^disp-1, 32-disp) end
|
||||||
|
return z
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return lshift(x, -disp)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit32.extract(x, field, ...)
|
||||||
|
local width = ... or 1
|
||||||
|
if field < 0 or field > 31 or width < 0 or field+width > 32 then error 'out of range' end
|
||||||
|
x = x % MOD
|
||||||
|
return extract(x, field, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit32.replace(x, v, field, ...)
|
||||||
|
local width = ... or 1
|
||||||
|
if field < 0 or field > 31 or width < 0 or field+width > 32 then error 'out of range' end
|
||||||
|
x = x % MOD
|
||||||
|
v = v % MOD
|
||||||
|
return replace(x, v, field, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
M.bit = {} -- LuaBitOp "bit" compatibility
|
||||||
|
|
||||||
|
function M.bit.tobit(x)
|
||||||
|
x = x % MOD
|
||||||
|
if x >= 0x80000000 then x = x - MOD end
|
||||||
|
return x
|
||||||
|
end
|
||||||
|
local bit_tobit = M.bit.tobit
|
||||||
|
|
||||||
|
function M.bit.tohex(x, ...)
|
||||||
|
return tohex(x % MOD, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit.bnot(x)
|
||||||
|
return bit_tobit(bnot(x % MOD))
|
||||||
|
end
|
||||||
|
|
||||||
|
local function bit_bor(a, b, c, ...)
|
||||||
|
if c then
|
||||||
|
return bit_bor(bit_bor(a, b), c, ...)
|
||||||
|
elseif b then
|
||||||
|
return bit_tobit(bor(a % MOD, b % MOD))
|
||||||
|
else
|
||||||
|
return bit_tobit(a)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
M.bit.bor = bit_bor
|
||||||
|
|
||||||
|
local function bit_band(a, b, c, ...)
|
||||||
|
if c then
|
||||||
|
return bit_band(bit_band(a, b), c, ...)
|
||||||
|
elseif b then
|
||||||
|
return bit_tobit(band(a % MOD, b % MOD))
|
||||||
|
else
|
||||||
|
return bit_tobit(a)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
M.bit.band = bit_band
|
||||||
|
|
||||||
|
local function bit_bxor(a, b, c, ...)
|
||||||
|
if c then
|
||||||
|
return bit_bxor(bit_bxor(a, b), c, ...)
|
||||||
|
elseif b then
|
||||||
|
return bit_tobit(bxor(a % MOD, b % MOD))
|
||||||
|
else
|
||||||
|
return bit_tobit(a)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
M.bit.bxor = bit_bxor
|
||||||
|
|
||||||
|
function M.bit.lshift(x, n)
|
||||||
|
return bit_tobit(lshift(x % MOD, n % 32))
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit.rshift(x, n)
|
||||||
|
return bit_tobit(rshift(x % MOD, n % 32))
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit.arshift(x, n)
|
||||||
|
return bit_tobit(arshift(x % MOD, n % 32))
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit.rol(x, n)
|
||||||
|
return bit_tobit(lrotate(x % MOD, n % 32))
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit.ror(x, n)
|
||||||
|
return bit_tobit(rrotate(x % MOD, n % 32))
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bit.bswap(x)
|
||||||
|
return bit_tobit(bswap(x % MOD))
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
232
bin/bin/numbers/random.lua
Normal file
232
bin/bin/numbers/random.lua
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
--[[----------------------------------------
|
||||||
|
Random
|
||||||
|
Not all of this is mine
|
||||||
|
------------------------------------------]]
|
||||||
|
--[[------------------------------------
|
||||||
|
RandomLua v0.3.1
|
||||||
|
Pure Lua Pseudo-Random Numbers Generator
|
||||||
|
Under the MIT license.
|
||||||
|
copyright(c) 2011 linux-man
|
||||||
|
--]]------------------------------------
|
||||||
|
|
||||||
|
local math_floor = math.floor
|
||||||
|
|
||||||
|
local function normalize(n)
|
||||||
|
return n % 0x80000000
|
||||||
|
end
|
||||||
|
|
||||||
|
local function bit_and(a, b)
|
||||||
|
local r = 0
|
||||||
|
local m = 0
|
||||||
|
for m = 0, 31 do
|
||||||
|
if (a % 2 == 1) and (b % 2 == 1) then r = r + 2^m end
|
||||||
|
if a % 2 ~= 0 then a = a - 1 end
|
||||||
|
if b % 2 ~= 0 then b = b - 1 end
|
||||||
|
a = a / 2 b = b / 2
|
||||||
|
end
|
||||||
|
return normalize(r)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function bit_or(a, b)
|
||||||
|
local r = 0
|
||||||
|
local m = 0
|
||||||
|
for m = 0, 31 do
|
||||||
|
if (a % 2 == 1) or (b % 2 == 1) then r = r + 2^m end
|
||||||
|
if a % 2 ~= 0 then a = a - 1 end
|
||||||
|
if b % 2 ~= 0 then b = b - 1 end
|
||||||
|
a = a / 2 b = b / 2
|
||||||
|
end
|
||||||
|
return normalize(r)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function bit_xor(a, b)
|
||||||
|
local r = 0
|
||||||
|
local m = 0
|
||||||
|
for m = 0, 31 do
|
||||||
|
if a % 2 ~= b % 2 then r = r + 2^m end
|
||||||
|
if a % 2 ~= 0 then a = a - 1 end
|
||||||
|
if b % 2 ~= 0 then b = b - 1 end
|
||||||
|
a = a / 2 b = b / 2
|
||||||
|
end
|
||||||
|
return normalize(r)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function seed()
|
||||||
|
return normalize(os.time())
|
||||||
|
end
|
||||||
|
|
||||||
|
--Mersenne twister
|
||||||
|
local mersenne_twister = {}
|
||||||
|
mersenne_twister.__index = mersenne_twister
|
||||||
|
|
||||||
|
function mersenne_twister:randomseed(s)
|
||||||
|
if not s then s = seed() end
|
||||||
|
self.mt[0] = normalize(s)
|
||||||
|
for i = 1, 623 do
|
||||||
|
self.mt[i] = normalize(0x6c078965 * bit_xor(self.mt[i-1], math_floor(self.mt[i-1] / 0x40000000)) + i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mersenne_twister:random(a, b)
|
||||||
|
local y
|
||||||
|
if self.index == 0 then
|
||||||
|
for i = 0, 623 do
|
||||||
|
y = self.mt[(i + 1) % 624] % 0x80000000
|
||||||
|
self.mt[i] = bit_xor(self.mt[(i + 397) % 624], math_floor(y / 2))
|
||||||
|
if y % 2 ~= 0 then self.mt[i] = bit_xor(self.mt[i], 0x9908b0df) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
y = self.mt[self.index]
|
||||||
|
y = bit_xor(y, math_floor(y / 0x800))
|
||||||
|
y = bit_xor(y, bit_and(normalize(y * 0x80), 0x9d2c5680))
|
||||||
|
y = bit_xor(y, bit_and(normalize(y * 0x8000), 0xefc60000))
|
||||||
|
y = bit_xor(y, math_floor(y / 0x40000))
|
||||||
|
self.index = (self.index + 1) % 624
|
||||||
|
if not a then return y / 0x80000000
|
||||||
|
elseif not b then
|
||||||
|
if a == 0 then return y
|
||||||
|
else return 1 + (y % a)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return a + (y % (b - a + 1))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function twister(s)
|
||||||
|
local temp = {}
|
||||||
|
setmetatable(temp, mersenne_twister)
|
||||||
|
temp.mt = {}
|
||||||
|
temp.index = 0
|
||||||
|
temp:randomseed(s)
|
||||||
|
return temp
|
||||||
|
end
|
||||||
|
|
||||||
|
--Linear Congruential Generator
|
||||||
|
local linear_congruential_generator = {}
|
||||||
|
linear_congruential_generator.__index = linear_congruential_generator
|
||||||
|
|
||||||
|
function linear_congruential_generator:random(a, b)
|
||||||
|
local y = (self.a * self.x + self.c) % self.m
|
||||||
|
self.x = y
|
||||||
|
if not a then return y / 0x10000
|
||||||
|
elseif not b then
|
||||||
|
if a == 0 then return y
|
||||||
|
else return 1 + (y % a) end
|
||||||
|
else
|
||||||
|
return a + (y % (b - a + 1))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function linear_congruential_generator:randomseed(s)
|
||||||
|
if not s then s = seed() end
|
||||||
|
self.x = normalize(s)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function lcg(s, r)
|
||||||
|
local temp = {}
|
||||||
|
setmetatable(temp, linear_congruential_generator)
|
||||||
|
temp.a, temp.c, temp.m = 1103515245, 12345, 0x10000 --from Ansi C
|
||||||
|
if r then
|
||||||
|
if r == 'nr' then temp.a, temp.c, temp.m = 1664525, 1013904223, 0x10000 --from Numerical Recipes.
|
||||||
|
elseif r == 'mvc' then temp.a, temp.c, temp.m = 214013, 2531011, 0x10000 end--from MVC
|
||||||
|
end
|
||||||
|
temp:randomseed(s)
|
||||||
|
return temp
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Multiply-with-carry
|
||||||
|
local multiply_with_carry = {}
|
||||||
|
multiply_with_carry.__index = multiply_with_carry
|
||||||
|
|
||||||
|
function multiply_with_carry:random(a, b)
|
||||||
|
local m = self.m
|
||||||
|
local t = self.a * self.x + self.c
|
||||||
|
local y = t % m
|
||||||
|
self.x = y
|
||||||
|
self.c = math_floor(t / m)
|
||||||
|
if not a then return y / 0x10000
|
||||||
|
elseif not b then
|
||||||
|
if a == 0 then return y
|
||||||
|
else return 1 + (y % a) end
|
||||||
|
else
|
||||||
|
return a + (y % (b - a + 1))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function multiply_with_carry:randomseed(s)
|
||||||
|
if not s then s = seed() end
|
||||||
|
self.c = self.ic
|
||||||
|
self.x = normalize(s)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function mwc(s, r)
|
||||||
|
local temp = {}
|
||||||
|
setmetatable(temp, multiply_with_carry)
|
||||||
|
temp.a, temp.c, temp.m = 1103515245, 12345, 0x10000 --from Ansi C
|
||||||
|
if r then
|
||||||
|
if r == 'nr' then temp.a, temp.c, temp.m = 1664525, 1013904223, 0x10000 --from Numerical Recipes.
|
||||||
|
elseif r == 'mvc' then temp.a, temp.c, temp.m = 214013, 2531011, 0x10000 end--from MVC
|
||||||
|
end
|
||||||
|
temp.ic = temp.c
|
||||||
|
temp:randomseed(s)
|
||||||
|
return temp
|
||||||
|
end
|
||||||
|
-- Little bind for the methods: My code starts
|
||||||
|
local randomGen={}
|
||||||
|
randomGen.__index=randomGen
|
||||||
|
function randomGen:new(s)
|
||||||
|
local temp={}
|
||||||
|
setmetatable(temp,randomGen)
|
||||||
|
temp[1]=twister()
|
||||||
|
temp[2]=lcg()
|
||||||
|
temp[3]=mwc()
|
||||||
|
temp.pos=1
|
||||||
|
for i=1,3 do
|
||||||
|
temp[i]:randomseed(s)
|
||||||
|
end
|
||||||
|
return temp
|
||||||
|
end
|
||||||
|
function randomGen:randomseed(s)
|
||||||
|
self.pos=1
|
||||||
|
self[1]:randomseed(s)
|
||||||
|
self[2]:randomseed(s)
|
||||||
|
self[3]:randomseed(s)
|
||||||
|
end
|
||||||
|
function randomGen:randomInt(a,b)
|
||||||
|
local t=self[self.pos]:random(a,b)
|
||||||
|
self.pos=self.pos+1
|
||||||
|
if self.pos>3 then
|
||||||
|
self.pos=1
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
function randomGen:newND(a,b,s)
|
||||||
|
if not(a) or not(b) then error('You must include a range!') end
|
||||||
|
local temp=randomGen:new(s)
|
||||||
|
temp.a=a
|
||||||
|
temp.b=b
|
||||||
|
temp.range=b-a+1
|
||||||
|
temp.dups={no=0}
|
||||||
|
function temp:nextInt()
|
||||||
|
local t=self:randomInt(self.a,self.b)
|
||||||
|
if self.dups[t]==nil then
|
||||||
|
self.dups[t]=true
|
||||||
|
self.dups.no=self.dups.no+1
|
||||||
|
else
|
||||||
|
return self:nextInt()
|
||||||
|
end
|
||||||
|
if self.dups.no==self.range then
|
||||||
|
function self:nextInt()
|
||||||
|
return 1,true
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
else
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function temp:nextIInt()
|
||||||
|
return function() return self:nextInt() end
|
||||||
|
end
|
||||||
|
return temp
|
||||||
|
end
|
||||||
|
return randomGen
|
||||||
1
bin/bin/support/vfs.lua
Normal file
1
bin/bin/support/vfs.lua
Normal file
@ -0,0 +1 @@
|
|||||||
|
local bin = require("bin")
|
||||||
BIN
bin/freetype6.dll
Normal file
BIN
bin/freetype6.dll
Normal file
Binary file not shown.
BIN
bin/gd.dll
Normal file
BIN
bin/gd.dll
Normal file
Binary file not shown.
BIN
bin/jpeg62.dll
Normal file
BIN
bin/jpeg62.dll
Normal file
Binary file not shown.
1442
bin/json.lua
Normal file
1442
bin/json.lua
Normal file
File diff suppressed because it is too large
Load Diff
BIN
bin/lfs.dll
Normal file
BIN
bin/lfs.dll
Normal file
Binary file not shown.
BIN
bin/libgd2.dll
Normal file
BIN
bin/libgd2.dll
Normal file
Binary file not shown.
BIN
bin/libiconv2.dll
Normal file
BIN
bin/libiconv2.dll
Normal file
Binary file not shown.
BIN
bin/libpng13.dll
Normal file
BIN
bin/libpng13.dll
Normal file
Binary file not shown.
BIN
bin/lua5.1.dll
Normal file
BIN
bin/lua5.1.dll
Normal file
Binary file not shown.
BIN
bin/lua5.1.exe
Normal file
BIN
bin/lua5.1.exe
Normal file
Binary file not shown.
BIN
bin/lua51.dll
Normal file
BIN
bin/lua51.dll
Normal file
Binary file not shown.
396
bin/main.lua
Normal file
396
bin/main.lua
Normal file
@ -0,0 +1,396 @@
|
|||||||
|
package.cpath = "?.dll;".. package.cpath
|
||||||
|
package.path = "?.lua;./?/init.lua;" .. package.path
|
||||||
|
-- local multi, thread = require("multi"):init()
|
||||||
|
-- GLOBAL, THREAD = require("multi.integration.threading"):init()
|
||||||
|
bin = require("bin")
|
||||||
|
json = require("json")
|
||||||
|
lfs = require("lfs")
|
||||||
|
gd = require("gd")
|
||||||
|
md5 = require("bin/hashes/md5")
|
||||||
|
random = require("bin/numbers/random")
|
||||||
|
song_list = {}
|
||||||
|
name_list = {}
|
||||||
|
track_list = {}
|
||||||
|
local pack_version = 8
|
||||||
|
local version = "1.0"
|
||||||
|
|
||||||
|
function isDir(name)
|
||||||
|
if type(name)~="string" then return false end
|
||||||
|
local cd = lfs.currentdir()
|
||||||
|
local is = lfs.chdir(name) and true or false
|
||||||
|
lfs.chdir(cd)
|
||||||
|
return is
|
||||||
|
end
|
||||||
|
|
||||||
|
function isFile(name)
|
||||||
|
if type(name)~="string" then return false end
|
||||||
|
if not isDir(name) then
|
||||||
|
return os.rename(name,name) and true or false
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function tprint (tbl, indent)
|
||||||
|
if not indent then indent = 0 end
|
||||||
|
for k, v in pairs(tbl) do
|
||||||
|
formatting = string.rep(" ", indent) .. k .. ": "
|
||||||
|
if type(v) == "table" then
|
||||||
|
print(formatting)
|
||||||
|
tprint(v, indent+1)
|
||||||
|
elseif type(v) == 'boolean' then
|
||||||
|
print(formatting .. tostring(v))
|
||||||
|
else
|
||||||
|
print(formatting .. v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for song in lfs.dir("../music") do
|
||||||
|
if isFile("../music/"..song) then
|
||||||
|
table.insert(track_list, song:match("(.+)%.ogg"))
|
||||||
|
table.insert(name_list, song:lower():gsub("%s",""):match(".+%-(%S+)%."))
|
||||||
|
table.insert(song_list, song)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if isFile("index.json") then
|
||||||
|
-- We need to keep indexes for the old records
|
||||||
|
local data = json:decode(bin.load("index.json").data)
|
||||||
|
local old = {}
|
||||||
|
local new = {}
|
||||||
|
for i,v in pairs(track_list) do
|
||||||
|
if data[v] then
|
||||||
|
table.insert(old,"../music/"..v..".ogg")
|
||||||
|
else
|
||||||
|
table.insert(new,"../music/"..v..".ogg")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for i,v in pairs(new) do
|
||||||
|
table.insert(old,v)
|
||||||
|
end
|
||||||
|
track_list = {}
|
||||||
|
name_list = {}
|
||||||
|
song_list = {}
|
||||||
|
for _,song in pairs(old) do
|
||||||
|
if isFile(song) then
|
||||||
|
song = song:match("../music/(.+)")
|
||||||
|
table.insert(track_list, song:match("(.+)%.ogg"))
|
||||||
|
table.insert(name_list, song:lower():gsub("%s",""):match(".+%-(%S+)%."))
|
||||||
|
table.insert(song_list, song)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local data = {}
|
||||||
|
for i = 1,#track_list do
|
||||||
|
data[track_list[i]] = i
|
||||||
|
end
|
||||||
|
bin.new(json:encode_pretty(data)):tofile("index.json")
|
||||||
|
else
|
||||||
|
local data = {}
|
||||||
|
for i = 1,#track_list do
|
||||||
|
data[track_list[i]] = i
|
||||||
|
end
|
||||||
|
bin.new(json:encode_pretty(data)):tofile("index.json")
|
||||||
|
end
|
||||||
|
|
||||||
|
function string.split(inputstr, sep)
|
||||||
|
if sep == nil then
|
||||||
|
sep = "%s"
|
||||||
|
end
|
||||||
|
local t={}
|
||||||
|
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
|
||||||
|
table.insert(t, str)
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
function CreateDisk(path)
|
||||||
|
local hash = md5.sumhexa(path)
|
||||||
|
hash = hash:sub(1,math.floor(#hash/4))
|
||||||
|
seed = tonumber(hash,16)
|
||||||
|
rand = random:new(seed)
|
||||||
|
for i = 1,300 do
|
||||||
|
rand:randomInt(0,0)
|
||||||
|
end
|
||||||
|
function RandomColor()
|
||||||
|
return {rand:randomInt(0,255),rand:randomInt(0,255),rand:randomInt(0,255)}
|
||||||
|
end
|
||||||
|
function LightenColor(color,v)
|
||||||
|
return {color[1] + (255 - color[1]) * v,color[2] + (255 - color[2]) * v,color[3] + (255 - color[3]) * v}
|
||||||
|
end
|
||||||
|
disc = gd.createFromPng("source.png")
|
||||||
|
color = RandomColor()
|
||||||
|
lcolor = LightenColor(color,.35)
|
||||||
|
bg = disc:colorAllocate(0,0,0)
|
||||||
|
dark = disc:colorAllocate(unpack(color))
|
||||||
|
light = disc:colorAllocate(unpack(lcolor))
|
||||||
|
|
||||||
|
disc:colorTransparent(bg)
|
||||||
|
|
||||||
|
color_dark = {
|
||||||
|
{6,6},{7,6},{8,6},{5,7},{6,7}
|
||||||
|
}
|
||||||
|
color_light = {
|
||||||
|
{8,7},{9,7},{6,8},{7,8},{8,8}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _,p in pairs(color_dark) do
|
||||||
|
disc:setPixel(p[1],p[2],dark)
|
||||||
|
end
|
||||||
|
|
||||||
|
for _,p in pairs(color_light) do
|
||||||
|
disc:setPixel(p[1],p[2],light)
|
||||||
|
end
|
||||||
|
|
||||||
|
disc:png(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
function buildPath(path)
|
||||||
|
local paths = path:split("/")
|
||||||
|
local p = {}
|
||||||
|
for i = 1,#paths do
|
||||||
|
table.insert(p,paths[i])
|
||||||
|
lfs.mkdir(table.concat(p,"/"))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function writeMCFunction(name,fname,file)
|
||||||
|
file:tofile("../"..name.."/data/"..name.."/functions/"..fname..".mcfunction")
|
||||||
|
end
|
||||||
|
|
||||||
|
function BuildDatapack(name)
|
||||||
|
os.execute("rmdir /s /q ../"..name)
|
||||||
|
buildPath("../"..name .. "/data/minecraft/tags/functions")
|
||||||
|
buildPath("../"..name .. "/data/minecraft/loot_tables/entities")
|
||||||
|
buildPath("../"..name .. "/data/"..name.."/functions")
|
||||||
|
|
||||||
|
-- Write 'pack.mcmeta'
|
||||||
|
bin.new(json:encode_pretty({pack={
|
||||||
|
pack_format = 7;
|
||||||
|
description = "Adds " .. #name_list .. " custom music discs to minecraft"
|
||||||
|
}})):tofile("../"..name.."/pack.mcmeta")
|
||||||
|
|
||||||
|
-- Write 'load.json'
|
||||||
|
bin.new(json:encode_pretty({values={
|
||||||
|
name..":setup_load"
|
||||||
|
}})):tofile("../"..name.."/data/minecraft/tags/functions/load.json")
|
||||||
|
|
||||||
|
-- Write 'tick.json'
|
||||||
|
bin.new(json:encode_pretty({values={
|
||||||
|
name..":detect_play_tick",
|
||||||
|
name..":detect_stop_tick"
|
||||||
|
}})):tofile("../"..name.."/data/minecraft/tags/functions/tick.json")
|
||||||
|
|
||||||
|
-- Write 'setup_load.mcfunction'
|
||||||
|
writeMCFunction(name,'setup_load',bin.new([[
|
||||||
|
scoreboard objectives add usedDisc minecraft.used:minecraft.music_disc_11
|
||||||
|
scoreboard objectives add heldDisc dummy
|
||||||
|
|
||||||
|
tellraw @a {"text":"Custom Music Discs V]]..version..[[!","color":"yellow"}
|
||||||
|
]]))
|
||||||
|
|
||||||
|
-- Write 'detect_play_tick.mcfunction'
|
||||||
|
writeMCFunction(name,'detect_play_tick',bin.new([[
|
||||||
|
execute as @a[scores={usedDisc=0}] run scoreboard players set @s heldDisc -1
|
||||||
|
execute as @a[scores={usedDisc=0},nbt={Inventory:[{Slot:-106b,id:"minecraft:music_disc_11"}]}] store result score @s heldDisc run data get entity @s Inventory[{Slot:-106b}].tag.CustomModelData
|
||||||
|
execute as @a[scores={usedDisc=0},nbt={SelectedItem:{id:"minecraft:music_disc_11"}}] store result score @s heldDisc run data get entity @s SelectedItem.tag.CustomModelData
|
||||||
|
execute as @a[scores={usedDisc=2}] run function ]]..name..[[:disc_play
|
||||||
|
|
||||||
|
execute as @a run scoreboard players add @s usedDisc 0
|
||||||
|
execute as @a[scores={usedDisc=2..}] run scoreboard players set @s usedDisc 0
|
||||||
|
scoreboard players add @a[scores={usedDisc=1}] usedDisc 1
|
||||||
|
]]))
|
||||||
|
|
||||||
|
-- Write 'disc_play.mcfunction'
|
||||||
|
disc_play = bin.new()
|
||||||
|
for i,v in pairs(name_list) do
|
||||||
|
disc_play:tackE("execute as @s[scores={heldDisc="..i.."}] run function "..name..":play_"..v.."\n")
|
||||||
|
end
|
||||||
|
writeMCFunction(name,'disc_play',disc_play)
|
||||||
|
|
||||||
|
-- Write 'detect_stop_tick.mcfunction'
|
||||||
|
writeMCFunction(name,'detect_stop_tick',bin.new([[
|
||||||
|
execute as @e[type=item, nbt={Item:{id:"minecraft:music_disc_11"}}] at @s unless entity @s[tag=old] if block ~ ~-1 ~ minecraft:jukebox run function ]]..name..[[:disc_stop
|
||||||
|
execute as @e[type=item, nbt={Item:{id:"minecraft:music_disc_11"}}] at @s unless entity @s[tag=old] if block ~ ~ ~ minecraft:jukebox run function ]]..name..[[:disc_stop
|
||||||
|
execute as @e[type=item, nbt={Item:{id:"minecraft:music_disc_11"}}] at @s unless entity @s[tag=old] run tag @s add old
|
||||||
|
]]))
|
||||||
|
|
||||||
|
-- Write 'disc_stop.mcfunction'
|
||||||
|
disc_stop = bin.new()
|
||||||
|
for i,v in pairs(name_list) do
|
||||||
|
disc_stop:tackE("execute as @s[nbt={Item:{tag:{CustomModelData:"..i.."}}}] at @s run stopsound @a[distance=..64] record minecraft:music_disc."..v.."\n")
|
||||||
|
end
|
||||||
|
writeMCFunction(name,'disc_stop',disc_stop)
|
||||||
|
|
||||||
|
-- Write 'set_disc_track.mcfunction'
|
||||||
|
set_disc_track = bin.new()
|
||||||
|
for i,v in pairs(track_list) do
|
||||||
|
set_disc_track:tackE('execute as @s[nbt={SelectedItem:{id:"minecraft:music_disc_11", tag:{CustomModelData:'..i..'}}}] run item replace entity @s weapon.mainhand with minecraft:music_disc_11{CustomModelData:'..i..', HideFlags:32, display:{Lore:[\"\\\"\\\\u00a77'..(v:gsub('"',""))..'\\\"\"]}}\n')
|
||||||
|
end
|
||||||
|
writeMCFunction(name,"set_disc_track",set_disc_track)
|
||||||
|
|
||||||
|
-- Write 'play_*.mcfunction' files
|
||||||
|
for i,v in pairs(name_list) do
|
||||||
|
writeMCFunction(name,"play_"..v,bin.new([[
|
||||||
|
execute as @s at @s run title @a[distance=..64] actionbar {"text":"Now Playing: ]]..(track_list[i]:gsub('"',""))..[[","color":"green"}
|
||||||
|
execute as @s at @s run stopsound @a[distance=..64] record minecraft:music_disc.11
|
||||||
|
execute as @s at @s run playsound minecraft:music_disc.]]..v..[[ record @a[distance=..64] ~ ~ ~ 4 1
|
||||||
|
]]))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Write 'give_*_disc.mcfunction' files
|
||||||
|
for i,v in pairs(track_list) do
|
||||||
|
writeMCFunction(name,"give_"..name_list[i],bin.new([[execute as @s at @s run summon item ~ ~ ~ {Item:{id:"minecraft:music_disc_11", Count:1b, tag:{CustomModelData:]]..i..[[, HideFlags:32, display:{Lore:["\"\\u00a77]]..v..[[\""]}}}}]]))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Write 'give_all_discs.mcfunction'
|
||||||
|
give_all = bin.new()
|
||||||
|
for i,v in pairs(track_list) do
|
||||||
|
give_all:tackE([[execute as @s at @s run summon item ~ ~ ~ {Item:{id:"minecraft:music_disc_11", Count:1b, tag:{CustomModelData:]]..i..[[, HideFlags:32, display:{Lore:["\"\\u00a77]]..v..[[\""]}}}}]].."\n")
|
||||||
|
end
|
||||||
|
writeMCFunction(name,"give_all_discs",give_all)
|
||||||
|
|
||||||
|
-- Write 'creeper.json'
|
||||||
|
creeper_mdentries = {}
|
||||||
|
table.insert(creeper_mdentries,{
|
||||||
|
type="minecraft:tag",
|
||||||
|
weight = 1,
|
||||||
|
name = "minecraft:creeper_drop_music_discs",
|
||||||
|
expand = true
|
||||||
|
})
|
||||||
|
for i,track in pairs(track_list) do
|
||||||
|
table.insert( creeper_mdentries, {
|
||||||
|
type = 'minecraft:item',
|
||||||
|
weight = 1,
|
||||||
|
name = 'minecraft:music_disc_11',
|
||||||
|
functions = {
|
||||||
|
{
|
||||||
|
['function']='minecraft:set_nbt',
|
||||||
|
tag='{CustomModelData:'..i..', HideFlags:32, display:{Lore:[\"\\\"\\\\u00a77'..(track:gsub('"',''))..'\\\"\"]}}'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
creeper_normentries = {
|
||||||
|
{
|
||||||
|
type = 'minecraft:item',
|
||||||
|
functions = {
|
||||||
|
{
|
||||||
|
['function']='minecraft:set_count',
|
||||||
|
count={
|
||||||
|
min=0,
|
||||||
|
max=2,
|
||||||
|
type='minecraft:uniform'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
['function']='minecraft:looting_enchant',
|
||||||
|
count={
|
||||||
|
min = 0,
|
||||||
|
max = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
name = 'minecraft:gunpowder'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
creeper = bin.new(json:encode_pretty({
|
||||||
|
type = 'minecraft:entity',
|
||||||
|
pools={
|
||||||
|
{
|
||||||
|
rolls=1,
|
||||||
|
entries = creeper_normentries
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rolls=1,
|
||||||
|
entries = creeper_mdentries,
|
||||||
|
conditions = {
|
||||||
|
{
|
||||||
|
condition='minecraft:entity_properties',
|
||||||
|
predicate={
|
||||||
|
type='#minecraft:skeletons'
|
||||||
|
},
|
||||||
|
entity='killer'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
creeper:tofile("../"..name.."/data/minecraft/loot_tables/entities/creeper.json")
|
||||||
|
bin.load("pack.png"):tofile("../"..name.."/pack.png")
|
||||||
|
end
|
||||||
|
function BuildResourcepack(name)
|
||||||
|
os.execute("rmdir /s /q ../"..name)
|
||||||
|
buildPath("../"..name .. "/assets/minecraft/models/item")
|
||||||
|
buildPath("../"..name .. "/assets/minecraft/sounds/records")
|
||||||
|
buildPath("../"..name .. "/assets/minecraft/textures/item")
|
||||||
|
|
||||||
|
-- Write 'pack.mcmets'
|
||||||
|
bin.new(json:encode_pretty({
|
||||||
|
pack = {
|
||||||
|
pack_format = pack_version,
|
||||||
|
description = "Adds " .. #name_list .. " custom music discs to minecraft"
|
||||||
|
}
|
||||||
|
})):tofile("../"..name .. "/pack.mcmeta")
|
||||||
|
|
||||||
|
-- Write 'sounds.json'
|
||||||
|
pack = bin.new('{')
|
||||||
|
for i,v in pairs(name_list) do
|
||||||
|
pack:tackE('\n"music_disc.'..v..'":')
|
||||||
|
pack:tackE(json:encode_pretty({
|
||||||
|
sounds = {
|
||||||
|
{
|
||||||
|
name='records/'..v,
|
||||||
|
stream = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
if i < #name_list then
|
||||||
|
pack:tackE(",\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
pack:tackE('\n}')
|
||||||
|
pack:tofile("../"..name.."/assets/minecraft/sounds.json")
|
||||||
|
|
||||||
|
-- Write 'music_disc_11.json'
|
||||||
|
music_disc_11 = bin.new()
|
||||||
|
json_list = {}
|
||||||
|
for i,v in pairs(name_list) do
|
||||||
|
table.insert(json_list,{
|
||||||
|
predicate={
|
||||||
|
custom_model_data = i
|
||||||
|
},
|
||||||
|
model = 'item/music_disc_'..v
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
music_disc_11:tackE(json:encode_pretty({
|
||||||
|
parent='item/generated',
|
||||||
|
textures={
|
||||||
|
layer0 = 'item/music_disc_11'
|
||||||
|
},
|
||||||
|
overrides=json_list
|
||||||
|
}))
|
||||||
|
|
||||||
|
music_disc_11:tofile("../"..name.."/assets/minecraft/models/item/music_disc_11.json")
|
||||||
|
|
||||||
|
-- Write 'music_disc_*.json' files
|
||||||
|
for i,v in pairs(name_list) do
|
||||||
|
bin.new(json:encode_pretty({
|
||||||
|
parent='item/generated',
|
||||||
|
textures={
|
||||||
|
layer0='item/music_disc_'..v
|
||||||
|
}
|
||||||
|
})):tofile("../"..name.."/assets/minecraft/models/item/music_disc_"..v..".json")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Copy sound and texture files
|
||||||
|
for i,v in pairs(name_list) do
|
||||||
|
bin.load("../music/"..song_list[i]):tofile("../"..name.."/assets/minecraft/sounds/records/"..v..".ogg")
|
||||||
|
CreateDisk("../"..name.."/assets/minecraft/textures/item/music_disc_"..v..".png")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Copy pack.png
|
||||||
|
bin.load("pack.png"):tofile("../"..name.."/pack.png")
|
||||||
|
end
|
||||||
|
BuildDatapack("cmd_dp")
|
||||||
|
BuildResourcepack("cmd_rp")
|
||||||
BIN
bin/pack.png
Normal file
BIN
bin/pack.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 868 B |
BIN
bin/source.png
Normal file
BIN
bin/source.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.1 KiB |
BIN
bin/xpm4.dll
Normal file
BIN
bin/xpm4.dll
Normal file
Binary file not shown.
BIN
bin/zlib1.dll
Normal file
BIN
bin/zlib1.dll
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user