指定範囲の文字シャッフル
https://gyazo.com/a785b48ffbe9e3835d00bddce2bfbe3c
https://video.twimg.com/ext_tw_video/1435542614560837635/pu/vid/1280x720/OTC4R1nRgwHrybQd.mp4
code:text
<?local s=MINAMI-NOBEOKA -- 文字列
local r=GT1 -- 置換数(0でなにもしない) local seed=0
local function split(s)
local t={}
local i=1
while i<=#s do
local b=string.byte(string.sub(s,i,i))
if(0x81<=b and b<=0x9f or 0xe0<=b and b<=0xfc)then
t#t+1=string.sub(s,i,i+1) i=i+1
else
end
i=i+1
end
return t
end
local function clamp(x,mn,mx)return math.min(math.max(x,mn),mx)end
local t=split(s)
rb=clamp(math.floor(rb*.01*(#t-1)+.5)+1,1,#t)
re=clamp(math.floor(re*.01*(#t-1)+.5)+1,1,#t)
if(rb>=re)then mes(s)return end
for i=1,r do
local r1,r2=rand(rb,re,seed,i*2-1),rand(rb,re-1,seed,i*2)
r2=r2+(r1==r2 and 1 or 0)
end
mes(table.concat(t))
?>
作例
https://video.twimg.com/ext_tw_video/1435549649943728138/pu/vid/1280x720/Wb8CRNuyxi2izytX.mp4
もっと楽したい
テキストバッファ書き換えるやつやる?
MINAMI-NOBEOKA<?shuf(GT[1],GT[2],GT[3])?>などでよくなります
4番目の引数はseedを入れてもよいです
code:Lua
local ffi=require"ffi"
if(TXTSHUF_INIT==nil)then
TXTSHUF_INIT=true
ffi.cdef[[
typedef int BOOL;
typedef BOOL *LPBOOL;
typedef unsigned char BYTE;
typedef void *PVOID;
typedef PVOID HINSTANCE;
typedef HINSTANCE HMODULE;
typedef unsigned int UINT;
typedef unsigned long DWORD;
typedef char CHAR;
typedef const CHAR *LPCSTR, *LPCCH;
typedef CHAR *LPSTR;
typedef wchar_t WCHAR;
typedef WCHAR *LPWSTR;
typedef const WCHAR *LPCWCH;
BOOL IsDBCSLeadByte(BYTE);
LPSTR CharNextA(LPCSTR);
HMODULE GetModuleHandleA(LPCSTR);
int WideCharToMultiByte(UINT,DWORD,LPCWCH,int,LPSTR,int,LPCCH,LPBOOL);
int MultiByteToWideChar(UINT,DWORD,LPCCH,int,LPWSTR,int);
]]
end
code:Lua
local ffi=require"ffi"
if(TXTSHUF_INIT==nil)then return end
local exedit=ffi.cast("uint32_t",ffi.C.GetModuleHandleA("exedit.auf"))
local buf=ffi.cast("wchar_t*",exedit+0x1a6bd0)
function shuf(rn,rb,re,seed)
seed=seed or 0
local n=ffi.C.WideCharToMultiByte(932,0,buf,2048,nil,0,nil,nil)
local tmp=ffi.new(ffi.typeof("char$",n)) ffi.C.WideCharToMultiByte(932,0,buf,2048,tmp,n,nil,nil)
local str=ffi.string(tmp)
local s,i={},1
while(i<=#str)do
local l=ffi.C.IsDBCSLeadByte(str:byte(i))
s#s+1=str:sub(i,i+l)i=i+l+1 end
local function clamp(x,mn,mx)return math.min(math.max(x,mn),mx)end
rb=clamp(math.floor(rb*.01*(#s-1)+.5)+1,1,#s)
re=clamp(math.floor(re*.01*(#s-1)+.5)+1,1,#s)
if(rb>=re)then return end
for i=1,rn do
local r1,r2=rand(rb,re,seed,i*2-1),rand(rb,re-1,seed,i*2)
r2=r2+(r1==r2 and 1 or 0)
end
local r=table.concat(s)
ffi.C.MultiByteToWideChar(932,0,r,#r+1,buf,2048)
end
サイズ1透明度100の四角形とかに書いといて下さい(ベジエTの軌道登録と同じノリで置く)(1枠じゃ収まらんので2枠)
もっともっと楽したい
上2つの定義とパラメーターをカスタムオブジェクトに書いてみました exoで良かったんじゃない?
ここでパラメータを設定したら、<?shuf()?>でよくなります
使い方
この項目はもっと上に書くものだろ