WzComparerR2 icon indicating copy to clipboard operation
WzComparerR2 copied to clipboard

Please add LuaConsole example for dumping gif and sounds.

Open nanpuhaha opened this issue 4 years ago β€’ 12 comments

There are two Lua console examples on this repo.

However, could you make Lua console scripts to dump all sounds and animated images as apng format?

Thank you.

nanpuhaha avatar Sep 30 '21 11:09 nanpuhaha

I cannot find how to pass C# byte array (from Wz_Sound.ExtractSound()) to File.Write in Lua script... πŸ€”

So I know the following is verrrrrrrrrrry slow but just for PoC:

DumpSounds.lua

import 'WzComparerR2.PluginBase'
import 'WzComparerR2.WzLib'
import 'System.IO'
import 'System.Xml'

------------------------------------------------------------

local function enumAllWzNodes(node) 
  return coroutine.wrap(function()
    coroutine.yield(node)
    for _,v in each(node.Nodes) do
      for child in enumAllWzNodes(v) do
        coroutine.yield(child)
      end
    end
  end)
end

local function isSound(value)
  if value and type(value) == "userdata" and value:GetType().Name == 'Wz_Sound' then
    return true
  else 
    return false
  end
end

local p = Path.GetInvalidFileNameChars()
local ivStr = ""
for i, v in each(p) do
  if v >= 32 then
    ivStr = ivStr .. string.char(v)
  end
end
local ivPattern = "["..ivStr.."]"
------------------------------------------------------------

-- all variables
local topWzPath = 'Sound\\Bgm00.img'
local topNode = PluginManager.FindWz(topWzPath)
local outputDir = "D:\\wzDump"

------------------------------------------------------------
-- main function

if not topNode then
  env:WriteLine('"{0}" not loaded.', topWzPath)
  return
end



-- enum all wz_images
for n in enumAllWzNodes(topNode) do
  local img = Wz_NodeExtension.GetNodeWzImage(n)
  
  if img then
    --extract wz image
    env:WriteLine('(extract)'..(img.Name))
    if img:TryExtract() then
    
      local dir = outputDir.."\\"..(n.FullPathToFile)
      local dirCreated = false
      
      --find all sound
      for n2 in enumAllWzNodes(img.Node) do
        local sound = n2.Value
        if isSound(sound) then
          
          local fn = n2.FullPath:sub(img.Name:len()+2):gsub("\\", "."):gsub(ivPattern, "")
          if not n2.Text:find("\\.") then
            if sound.SoundType == Wz_SoundType.Mp3 then
              fn = fn .. ".mp3"
            end
            if sound.SoundType == Wz_SoundType.WavRaw then
              fn = fn .. ".wav"
            end
          end
          fn = Path.Combine(dir, fn)
          
          --ensure dir exists
          if not dirCreated then
            if not Directory.Exists(dir) then
              Directory.CreateDirectory(dir)
            end
            dirCreated = true
          end
          
          --save sound
          env:WriteLine('(output)'..fn)
          local file = io.open(fn, "wb")
          local bytes = sound:ExtractSound()
          for i = 0, (sound.DataLength - 1) / 4096 do
            file:write(string.char(table.unpack(bytes, i * 4096, math.min(i * 4096 + 4095, sound.DataLength - 1))))
          end
          file:close()
          env:WriteLine('(close)'..fn)
          
        end
      end
      
      img:Unextract()
    else --error
      
      env:WriteLine((img.Name)..' extract failed.')
      
    end --end extract
  end -- end type validate
end -- end foreach

env:WriteLine('--------Done.---------')

KENNYSOFT avatar Oct 02 '21 04:10 KENNYSOFT

Passing ByteArray should work years ago but now it doesn't work at all. :(

Kagamia avatar Oct 03 '21 08:10 Kagamia

@KENNYSOFT Thank you. It works! Now I can extract all sounds easily.

nanpuhaha avatar Oct 03 '21 11:10 nanpuhaha

File a issue to NLua: https://github.com/NLua/NLua/issues/438

I'm not sure if it is by design but when I remove this line all unit tests still passed.

Kagamia avatar Oct 04 '21 06:10 Kagamia

To unblock the performance issue, I create a branch and build our own NLua library with the fix, so that @KENNYSOFT, you won't have to join bytes to string. 🀣

The following code could execute in milliseconds,

import 'System'
import 'System.IO'

local buf = Byte[10000000]
local r = Random()
r:NextBytes(buf)
File.WriteAllBytes("out.bin", buf)

Kagamia avatar Oct 05 '21 11:10 Kagamia

Back to this thread.

The latest implementation of gif dumping has strong dependency with monogame/d3dDevice. Yes, I admit it is a bad design, but you can still use the old Gif and GifFrame classes for frame animation.

Here's the sample code written in C#, you can feel free to translate to lua code.

var wzs = new Wz_Structure();
try{
    wzs.LoadKMST1125DataWz(@"E:\MapleT\Data\Skill\Skill.wz");
    var effNode = wzs.WzNode.FindNodeByPath(@"110.img\skill\1101011\effect", true);
    var gif = Gif.CreateFromNode(effNode, null);
    var rect = gif.GetRect();
    using (var enc = new BuildInApngEncoder(@"G:\Temp\out.png", rect.Width, rect.Height)) {
        enc.OptimizeEnabled = true;
        foreach(var frame in gif.Frames) {
            using (var bmp = new Bitmap(rect.Width, rect.Height)) 
            using (var g = Graphics.FromImage(bmp))
            {
                frame.Draw(g, rect);
                enc.AppendFrame(bmp, frame.Delay);
            }
        }
    }
} finally{
    wzs.Clear();
}

Kagamia avatar Oct 05 '21 14:10 Kagamia

I don't know how can I detect some directory is an animation. So it does not find all animations but just exports the current path.

I used Gif.SaveGif() because it's more simple! πŸ˜„

For the strange import syntax, reference the issue: NLua/NLua#226

DumpAnimation.lua

import 'WzComparerR2.PluginBase'
import 'WzComparerR2.WzLib'
import 'WzComparerR2.Common'
import 'System.IO'
import 'System.Xml'
import 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
import 'System.Drawing'

------------------------------------------------------------

local p = Path.GetInvalidFileNameChars()
local ivStr = ""
for i, v in each(p) do
  if v >= 32 then
    ivStr = ivStr .. string.char(v)
  end
end
local ivPattern = "["..ivStr.."]"
------------------------------------------------------------

-- all variables
local topWzPath = 'Skill\\110.img\\skill\\1101011\\effect'
local topNode = PluginManager.FindWz(topWzPath)
local outputDir = "D:\\wzDump"

------------------------------------------------------------
-- main function

if not topNode then
  env:WriteLine('"{0}" not loaded.', topWzPath)
  return
end



local dir = outputDir.."\\"..(topNode.FullPathToFile:gsub("\\[^\\]*$", ""))
local dirCreated = false

local fn = topNode.Text:gsub(ivPattern, "") .. ".png"
fn = Path.Combine(dir, fn)

--ensure dir exists
if not dirCreated then
  if not Directory.Exists(dir) then
    Directory.CreateDirectory(dir)
  end
  dirCreated = true
end

--save animation
local gif = Gif.CreateFromNode(topNode, null)
local rect = gif:GetRect()
local enc = BuildInApngEncoder(fn, rect.Width, rect.Height)
enc.OptimizeEnabled = true
gif:SaveGif(enc, fn, Color.Transparent)

env:WriteLine('--------Done.---------')

KENNYSOFT avatar Oct 11 '21 04:10 KENNYSOFT

@KENNYSOFT Thank you!!! 😍

We can detect animation directory by children Wz_Png has delay value. So, I tried to make script for extracting all from the top node like Skill base on your DumpAnimation.lua, but the error occurred.. 😒

⚠ A .NET exception occured in user-code

How can I figure this out?

DumpAnimations_Failed.lua

import 'WzComparerR2.PluginBase'
import 'WzComparerR2.WzLib'
import 'WzComparerR2.Common'
import 'System.IO'
import 'System.Xml'
import 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
import 'System.Drawing'

------------------------------------------------------------

local function isPng(value)
  if value and type(value) == "userdata" and value:GetType().Name == 'Wz_Png' then
    return true
  else 
    return false
  end
end

local function isDelay(node)
  if node.Text == "delay" and node:GetType().Name == 'Wz_Node' then
    return true
  else 
    return false
  end
end

local function enumAllWzNodes(node) 
  return coroutine.wrap(function()
    coroutine.yield(node)
    for _,v in each(node.Nodes) do
      for child in enumAllWzNodes(v) do
        coroutine.yield(child)
      end
    end
  end)
end

local function isPngWithDelay(node)
  if isPng(node.Value) then
    for n in enumAllWzNodes(node) do
      if isDelay(n) then
        return true
      end
    end
  end
  return false
end

local function enumAllWzPngNodesWithDelay(node) 
  return coroutine.wrap(function()
    if isPng(node.Value) and isPngWithDelay(node) then
      coroutine.yield(node)
    end
    for _, n in each(node.Nodes) do
      for child in enumAllWzPngNodesWithDelay(n) do
        coroutine.yield(child)
      end
    end
  end)
end

local function saveAnimatedImage(node, fn)
  local gif = Gif.CreateFromNode(node, null)
  local rect = gif:GetRect()
  local enc = BuildInApngEncoder(fn, rect.Width, rect.Height)
  enc.OptimizeEnabled = false
  gif:SaveGif(enc, fn, Color.Transparent)
end

local p = Path.GetInvalidFileNameChars()
local ivStr = ""
for i, v in each(p) do
  if v >= 32 then
    ivStr = ivStr .. string.char(v)
  end
end
local ivPattern = "["..ivStr.."]"
------------------------------------------------------------

-- all variables
local topWzPath = 'Skill'
local topNode = PluginManager.FindWz(topWzPath)
local outputDir = "D:\\wzDump"

------------------------------------------------------------
-- main function

if not topNode then
  env:WriteLine('"{0}" not loaded.', topWzPath)
  return
end

for n in enumAllWzNodes(topNode) do
  local img = Wz_NodeExtension.GetNodeWzImage(n)
  if img then
    --extract wz image
    env:WriteLine('(extract) '..(img.Name))

    if img:TryExtract() then
      local dir = outputDir.."\\"..(n.FullPathToFile)
      local dirCreated = false
      local fullpaths = {}

      for n2 in enumAllWzPngNodesWithDelay(img.Node) do
        local parentNode = n2.ParentNode
        local fullpath = parentNode.FullPath

        -- Skip if 'fullpath' already done
        if (not fullpaths[fullpath]) then
          local fn = fullpath:sub(img.Name:len()+2):gsub("\\", "."):gsub(ivPattern, "")
          fn = Path.Combine(dir, fn .. ".apng")

          -- [ERROR Occured] "A .NET exception occured in user-code"

          --ensure dir exists
          if not dirCreated then
            if not Directory.Exists(dir) then
              Directory.CreateDirectory(dir)
            end
            dirCreated = true
          end

          --save animation
          saveAnimatedImage(parentNode, fn)
          
          fullpaths[fullpath] = true
        end
      end
      
      img:Unextract()

    else --error
      env:WriteLine((img.Name)..' extract failed.')
      
    end --end extract
  end -- end type validate
end -- end foreach

env:WriteLine('--------Done.---------')

nanpuhaha avatar Oct 13 '21 08:10 nanpuhaha

It's working well, do you have D: drive? You may adjust outputDir.

KENNYSOFT avatar Oct 13 '21 09:10 KENNYSOFT

I adjust outputDir to "C:\\Nexon\\wzDump", but an error occur right after "(extract) 212.img". 😒

local topWzPath = 'Skill'
local topNode = PluginManager.FindWz(topWzPath)
local outputDir = "C:\\Nexon\\wzDump"

Log

(extract) 000.img
(extract) 100.img
(extract) 110.img
(extract) 111.img
(extract) 112.img
(extract) 120.img
(extract) 121.img
(extract) 122.img
(extract) 130.img
(extract) 131.img
(extract) 132.img
(extract) 200.img
(extract) 210.img
(extract) 211.img
(extract) 212.img
A .NET exception occured in user-code   <---- 

nanpuhaha avatar Oct 14 '21 09:10 nanpuhaha

I've got success for 212.img. You can see the failing node by adding env:WriteLine(n2.FullPath) in the for n2 block. Please provide more detailed information to ask for debugging.

Expand to see logs

-- 도움말을 μ–»κΈ° μœ„ν•΄μ„œλŠ” env:Help() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ„Έμš”. (extract) 212.img 212.img\skill\2121006\hit\0\0 212.img\skill\2121006\hit\0\1 212.img\skill\2121006\hit\0\2 212.img\skill\2121006\hit\0\3 212.img\skill\2121006\hit\0\4 212.img\skill\2121006\hit\0\5 212.img\skill\2121006\hit\0\6 212.img\skill\2121006\effect\0 212.img\skill\2121006\effect\1 212.img\skill\2121006\effect\2 212.img\skill\2121006\effect\3 212.img\skill\2121006\effect\4 212.img\skill\2121006\effect\5 212.img\skill\2121006\effect\6 212.img\skill\2121006\effect\7 212.img\skill\2121006\effect\8 212.img\skill\2121006\effect\9 212.img\skill\2121006\effect\10 212.img\skill\2121006\effect\11 212.img\skill\2121006\effect\12 212.img\skill\2121006\mob\0 212.img\skill\2121006\mob\1 212.img\skill\2121006\mob\2 212.img\skill\2121006\mob\3 212.img\skill\2121006\mob\4 212.img\skill\2121006\mob\5 212.img\skill\2121003\effect\0 212.img\skill\2121003\effect\1 212.img\skill\2121003\effect\2 212.img\skill\2121003\effect\3 212.img\skill\2121003\effect\4 212.img\skill\2121003\effect\5 212.img\skill\2121003\effect\6 212.img\skill\2121003\effect\7 212.img\skill\2121003\effect\8 212.img\skill\2121003\effect\9 212.img\skill\2121003\effect\10 212.img\skill\2121003\effect\11 212.img\skill\2121003\effect\12 212.img\skill\2121003\effect\13 212.img\skill\2121003\effect\14 212.img\skill\2121003\effect\15 212.img\skill\2121003\effect\16 212.img\skill\2121003\effect2\0 212.img\skill\2121003\effect2\1 212.img\skill\2121003\effect2\2 212.img\skill\2121003\effect2\3 212.img\skill\2121003\effect2\4 212.img\skill\2121003\effect2\5 212.img\skill\2121003\effect2\6 212.img\skill\2121003\effect2\7 212.img\skill\2121003\effect2\8 212.img\skill\2121003\effect2\9 212.img\skill\2121003\effect2\10 212.img\skill\2121003\hit\0\0 212.img\skill\2121003\hit\0\1 212.img\skill\2121003\hit\0\2 212.img\skill\2121003\hit\0\3 212.img\skill\2121003\hit\0\4 212.img\skill\2121007\effect\0 212.img\skill\2121007\effect\1 212.img\skill\2121007\effect\2 212.img\skill\2121007\effect\3 212.img\skill\2121007\effect\4 212.img\skill\2121007\effect\5 212.img\skill\2121007\effect\6 212.img\skill\2121007\effect\7 212.img\skill\2121007\effect\8 212.img\skill\2121007\effect\9 212.img\skill\2121007\effect\10 212.img\skill\2121007\effect\11 212.img\skill\2121007\effect\12 212.img\skill\2121007\effect0\0 212.img\skill\2121007\effect0\1 212.img\skill\2121007\effect0\2 212.img\skill\2121007\effect0\3 212.img\skill\2121007\effect0\4 212.img\skill\2121007\effect0\5 212.img\skill\2121007\effect0\6 212.img\skill\2121007\effect0\7 212.img\skill\2121007\effect0\8 212.img\skill\2121007\effect0\9 212.img\skill\2121007\effect0\10 212.img\skill\2121007\effect0\11 212.img\skill\2121007\effect0\12 212.img\skill\2121007\effect0\13 212.img\skill\2121007\effect0\14 212.img\skill\2121007\effect0\15 212.img\skill\2121007\effect0\16 212.img\skill\2121007\effect0\17 212.img\skill\2121007\effect0\18 212.img\skill\2121007\effect0\19 212.img\skill\2121007\hit\0\0 212.img\skill\2121007\hit\0\1 212.img\skill\2121007\hit\0\2 212.img\skill\2121007\hit\0\3 212.img\skill\2121007\hit\0\4 212.img\skill\2121007\hit\0\5 212.img\skill\2121007\tile\0\0 212.img\skill\2121007\tile\0\1 212.img\skill\2121007\tile\0\2 212.img\skill\2121007\tile\0\3 212.img\skill\2121007\tile\0\4 212.img\skill\2121007\tile\0\5 212.img\skill\2121007\tile\0\6 212.img\skill\2121007\tile\0\7 212.img\skill\2121007\tile\0\8 212.img\skill\2121007\tile\0\9 212.img\skill\2121007\tile\0\10 212.img\skill\2121007\tile\0\11 212.img\skill\2121007\tile\0\12 212.img\skill\2121007\tile\0\13 212.img\skill\2121007\tile\0\14 212.img\skill\2121007\tile\0\15 212.img\skill\2121007\tile\0\16 212.img\skill\2121007\tile\0\17 212.img\skill\2121007\tile\0\18 212.img\skill\2121007\tile\0\19 212.img\skill\2121007\tile\0\20 212.img\skill\2121007\tile\1\0 212.img\skill\2121007\tile\1\1 212.img\skill\2121007\tile\1\2 212.img\skill\2121007\tile\1\3 212.img\skill\2121007\tile\1\4 212.img\skill\2121007\tile\1\5 212.img\skill\2121007\tile\1\6 212.img\skill\2121007\tile\1\7 212.img\skill\2121007\tile\1\8 212.img\skill\2121007\tile\1\9 212.img\skill\2121007\tile\1\10 212.img\skill\2121007\tile\1\11 212.img\skill\2121007\tile\1\12 212.img\skill\2121007\tile\1\13 212.img\skill\2121007\tile\1\14 212.img\skill\2121007\tile\1\15 212.img\skill\2121007\tile\1\16 212.img\skill\2121007\tile\1\17 212.img\skill\2121007\tile\1\18 212.img\skill\2121007\tile\1\19 212.img\skill\2121007\tile\1\20 212.img\skill\2121007\tile\2\0 212.img\skill\2121007\tile\2\1 212.img\skill\2121007\tile\2\2 212.img\skill\2121007\tile\2\3 212.img\skill\2121007\tile\2\4 212.img\skill\2121007\tile\2\5 212.img\skill\2121007\tile\2\6 212.img\skill\2121007\tile\2\7 212.img\skill\2121007\tile\2\8 212.img\skill\2121007\tile\2\9 212.img\skill\2121007\tile\2\10 212.img\skill\2121007\tile\2\11 212.img\skill\2121007\tile\2\12 212.img\skill\2121007\tile\2\13 212.img\skill\2121007\tile\2\14 212.img\skill\2121007\tile\2\15 212.img\skill\2121007\tile\2\16 212.img\skill\2121007\tile\2\17 212.img\skill\2121007\tile\2\18 212.img\skill\2121007\tile\2\19 212.img\skill\2121007\tile\2\20 212.img\skill\2121007\tile\2\21 212.img\skill\2121007\tile\2\22 212.img\skill\2121007\tile\3\0 212.img\skill\2121007\tile\3\1 212.img\skill\2121007\tile\3\2 212.img\skill\2121007\tile\3\3 212.img\skill\2121007\tile\3\4 212.img\skill\2121007\tile\3\5 212.img\skill\2121007\tile\3\6 212.img\skill\2121007\tile\3\7 212.img\skill\2121007\tile\3\8 212.img\skill\2121007\tile\3\9 212.img\skill\2121007\tile\3\10 212.img\skill\2121007\tile\3\11 212.img\skill\2121007\tile\3\12 212.img\skill\2121007\tile\3\13 212.img\skill\2121007\tile\3\14 212.img\skill\2121007\tile\3\15 212.img\skill\2121007\tile\3\16 212.img\skill\2121007\tile\3\17 212.img\skill\2121007\tile\3\18 212.img\skill\2121007\tile\3\19 212.img\skill\2121007\tile\3\20 212.img\skill\2121007\tile\3\21 212.img\skill\2121007\tile\3\22 212.img\skill\2121007\tile\4\0 212.img\skill\2121007\tile\4\1 212.img\skill\2121007\tile\4\2 212.img\skill\2121007\tile\4\3 212.img\skill\2121007\tile\4\4 212.img\skill\2121007\tile\4\5 212.img\skill\2121007\tile\4\6 212.img\skill\2121007\tile\4\7 212.img\skill\2121007\tile\4\8 212.img\skill\2121007\tile\4\9 212.img\skill\2121007\tile\4\10 212.img\skill\2121007\tile\4\11 212.img\skill\2121007\tile\4\12 212.img\skill\2121007\tile\4\13 212.img\skill\2121007\tile\4\14 212.img\skill\2121007\tile\4\15 212.img\skill\2121007\tile\4\16 212.img\skill\2121007\tile\4\17 212.img\skill\2121007\tile\4\18 212.img\skill\2121007\tile\4\19 212.img\skill\2121007\tile\4\20 212.img\skill\2121007\tile\4\21 212.img\skill\2121007\tile\4\22 212.img\skill\2121007\tile\5\0 212.img\skill\2121007\tile\5\1 212.img\skill\2121007\tile\5\2 212.img\skill\2121007\tile\5\3 212.img\skill\2121007\tile\5\4 212.img\skill\2121007\tile\5\5 212.img\skill\2121007\tile\5\6 212.img\skill\2121007\tile\5\7 212.img\skill\2121007\tile\5\8 212.img\skill\2121007\tile\5\9 212.img\skill\2121007\tile\5\10 212.img\skill\2121007\tile\5\11 212.img\skill\2121007\tile\5\12 212.img\skill\2121007\tile\5\13 212.img\skill\2121007\tile\5\14 212.img\skill\2121007\tile\5\15 212.img\skill\2121007\tile\5\16 212.img\skill\2121007\tile\5\17 212.img\skill\2121007\tile\5\18 212.img\skill\2121007\tile\5\19 212.img\skill\2121007\tile\5\20 212.img\skill\2121007\tile\5\21 212.img\skill\2121007\tile\5\22 212.img\skill\2121007\tile\5\23 212.img\skill\2121007\tile\6\0 212.img\skill\2121007\tile\6\1 212.img\skill\2121007\tile\6\2 212.img\skill\2121007\tile\6\3 212.img\skill\2121007\tile\6\4 212.img\skill\2121007\tile\6\5 212.img\skill\2121007\tile\6\6 212.img\skill\2121007\tile\6\7 212.img\skill\2121007\tile\6\8 212.img\skill\2121007\tile\6\9 212.img\skill\2121007\tile\6\10 212.img\skill\2121007\tile\6\11 212.img\skill\2121007\tile\6\12 212.img\skill\2121007\tile\6\13 212.img\skill\2121007\tile\6\14 212.img\skill\2121007\tile\6\15 212.img\skill\2121007\tile\6\16 212.img\skill\2121007\tile\6\17 212.img\skill\2121007\tile\6\18 212.img\skill\2121007\tile\6\19 212.img\skill\2121007\tile\6\20 212.img\skill\2121007\tile\6\21 212.img\skill\2121007\tile\6\22 212.img\skill\2121007\tile\6\23 212.img\skill\2121007\tile\7\0 212.img\skill\2121007\tile\7\1 212.img\skill\2121007\tile\7\2 212.img\skill\2121007\tile\7\3 212.img\skill\2121007\tile\7\4 212.img\skill\2121007\tile\7\5 212.img\skill\2121007\tile\7\6 212.img\skill\2121007\tile\7\7 212.img\skill\2121007\tile\7\8 212.img\skill\2121007\tile\7\9 212.img\skill\2121007\tile\7\10 212.img\skill\2121007\tile\7\11 212.img\skill\2121007\tile\7\12 212.img\skill\2121007\tile\7\13 212.img\skill\2121007\tile\7\14 212.img\skill\2121007\tile\7\15 212.img\skill\2121007\tile\7\16 212.img\skill\2121007\tile\7\17 212.img\skill\2121007\tile\7\18 212.img\skill\2121007\tile\7\19 212.img\skill\2121007\tile\7\20 212.img\skill\2121007\tile\7\21 212.img\skill\2121007\tile\7\22 212.img\skill\2121007\tile\7\23 212.img\skill\2121007\tile\8\0 212.img\skill\2121007\tile\8\1 212.img\skill\2121007\tile\8\2 212.img\skill\2121007\tile\8\3 212.img\skill\2121007\tile\8\4 212.img\skill\2121007\tile\8\5 212.img\skill\2121007\tile\8\6 212.img\skill\2121007\tile\8\7 212.img\skill\2121007\tile\8\8 212.img\skill\2121007\tile\8\9 212.img\skill\2121007\tile\8\10 212.img\skill\2121007\tile\8\11 212.img\skill\2121007\tile\8\12 212.img\skill\2121007\tile\8\13 212.img\skill\2121007\tile\8\14 212.img\skill\2121007\tile\8\15 212.img\skill\2121007\tile\8\16 212.img\skill\2121007\tile\8\17 212.img\skill\2121007\tile\8\18 212.img\skill\2121007\tile\8\19 212.img\skill\2121007\tile\8\20 212.img\skill\2121007\tile\8\21 212.img\skill\2121007\tile\8\22 212.img\skill\2121007\tile\8\23 212.img\skill\2121007\tile\8\24 212.img\skill\2121007\tile\8\25 212.img\skill\2121011\effect\0 212.img\skill\2121011\effect\1 212.img\skill\2121011\effect\2 212.img\skill\2121011\effect\3 212.img\skill\2121011\effect\4 212.img\skill\2121011\effect\5 212.img\skill\2121011\effect\6 212.img\skill\2121011\effect\7 212.img\skill\2121011\effect\8 212.img\skill\2121011\effect\9 212.img\skill\2121011\effect\10 212.img\skill\2121011\effect\11 212.img\skill\2121011\effect\12 212.img\skill\2121011\effect\13 212.img\skill\2121011\effect\14 212.img\skill\2121011\effect\15 212.img\skill\2121011\hit\0\0 212.img\skill\2121011\hit\0\1 212.img\skill\2121011\hit\0\2 212.img\skill\2121011\hit\0\3 212.img\skill\2121011\hit\0\4 212.img\skill\2121011\hit\0\5 212.img\skill\2121011\hit\0\6 212.img\skill\2121011\hit\0\7 212.img\skill\2121011\hit\0\8 212.img\skill\2121011\hit\0\9 212.img\skill\2121011\ball\0 212.img\skill\2121011\ball\1 212.img\skill\2121011\ball\2 212.img\skill\2121011\ball\3 212.img\skill\2121011\ball\4 212.img\skill\2121011\ball\5 212.img\skill\2121011\ball\6 212.img\skill\2121011\special\0\0 212.img\skill\2121011\special\0\1 212.img\skill\2121011\special\0\2 212.img\skill\2121011\special\0\3 212.img\skill\2121011\special\0\4 212.img\skill\2121011\special\0\5 212.img\skill\2121011\special\0\6 212.img\skill\2121011\special\0\7 212.img\skill\2121011\special\1\0 212.img\skill\2121011\special\1\1 212.img\skill\2121011\special\1\2 212.img\skill\2121011\special\1\3 212.img\skill\2121011\special\1\4 212.img\skill\2121011\special\1\5 212.img\skill\2121011\special\1\6 212.img\skill\2121011\special\1\7 212.img\skill\2121011\special\2\0 212.img\skill\2121011\special\2\1 212.img\skill\2121011\special\2\2 212.img\skill\2121011\special\2\3 212.img\skill\2121011\special\2\4 212.img\skill\2121011\special\2\5 212.img\skill\2121011\special\2\6 212.img\skill\2121011\special\2\7 212.img\skill\2121011\special\3\0 212.img\skill\2121011\special\3\1 212.img\skill\2121011\special\3\2 212.img\skill\2121011\special\3\3 212.img\skill\2121011\special\3\4 212.img\skill\2121011\special\3\5 212.img\skill\2121011\special\3\6 212.img\skill\2121011\special\3\7 212.img\skill\2121011\special\4\0 212.img\skill\2121011\special\4\1 212.img\skill\2121011\special\4\2 212.img\skill\2121011\special\4\3 212.img\skill\2121011\special\4\4 212.img\skill\2121011\special\4\5 212.img\skill\2121011\special\4\6 212.img\skill\2121011\special\4\7 212.img\skill\2121004\effect\0 212.img\skill\2121004\effect\1 212.img\skill\2121004\effect\2 212.img\skill\2121004\effect\3 212.img\skill\2121004\effect\4 212.img\skill\2121004\effect\5 212.img\skill\2121004\effect\6 212.img\skill\2121004\effect\7 212.img\skill\2121004\effect\8 212.img\skill\2121004\effect\9 212.img\skill\2121004\effect\10 212.img\skill\2121004\effect\11 212.img\skill\2121004\effect\12 212.img\skill\2121004\effect\13 212.img\skill\2121004\effect\14 212.img\skill\2121004\effect\15 212.img\skill\2121004\effect\16 212.img\skill\2121004\effect\17 212.img\skill\2121004\effect\18 212.img\skill\2121004\effect\19 212.img\skill\2121004\effect\20 212.img\skill\2121004\effect\21 212.img\skill\2121004\effect\22 212.img\skill\2121004\effect0\0 212.img\skill\2121004\effect0\1 212.img\skill\2121004\effect0\2 212.img\skill\2121004\effect0\3 212.img\skill\2121004\effect0\4 212.img\skill\2121004\effect0\5 212.img\skill\2121004\effect0\6 212.img\skill\2121004\effect0\7 212.img\skill\2121004\effect0\8 212.img\skill\2121004\effect0\9 212.img\skill\2121004\effect0\10 212.img\skill\2121004\effect0\11 212.img\skill\2121004\effect0\12 212.img\skill\2121004\effect0\13 212.img\skill\2121004\effect0\14 212.img\skill\2121004\effect0\15 212.img\skill\2121004\effect0\16 212.img\skill\2121004\effect0\17 212.img\skill\2121004\effect0\18 212.img\skill\2121004\effect0\19 212.img\skill\2121004\effect0\20 212.img\skill\2121004\effect0\21 212.img\skill\2121004\effect0\22 212.img\skill\2121004\special\0 212.img\skill\2121004\special\1 212.img\skill\2121004\special\2 212.img\skill\2121004\special\3 212.img\skill\2121004\special\4 212.img\skill\2121005\summon\summoned\0 212.img\skill\2121005\summon\summoned\1 212.img\skill\2121005\summon\summoned\2 212.img\skill\2121005\summon\summoned\3 212.img\skill\2121005\summon\summoned\4 212.img\skill\2121005\summon\summoned\5 212.img\skill\2121005\summon\summoned\6 212.img\skill\2121005\summon\summoned\7 212.img\skill\2121005\summon\move\0 212.img\skill\2121005\summon\move\1 212.img\skill\2121005\summon\move\2 212.img\skill\2121005\summon\move\3 212.img\skill\2121005\summon\move\4 212.img\skill\2121005\summon\move\5 212.img\skill\2121005\summon\stand\0 212.img\skill\2121005\summon\stand\1 212.img\skill\2121005\summon\stand\2 212.img\skill\2121005\summon\stand\3 212.img\skill\2121005\summon\stand\4 212.img\skill\2121005\summon\stand\5 212.img\skill\2121005\summon\attack1\0 212.img\skill\2121005\summon\attack1\1 212.img\skill\2121005\summon\attack1\2 212.img\skill\2121005\summon\attack1\3 212.img\skill\2121005\summon\attack1\4 212.img\skill\2121005\summon\attack1\5 212.img\skill\2121005\summon\attack1\6 212.img\skill\2121005\summon\attack1\7 212.img\skill\2121005\summon\attack1\8 212.img\skill\2121005\summon\attack1\9 212.img\skill\2121005\summon\attack1\10 212.img\skill\2121005\summon\attack1\11 212.img\skill\2121005\summon\attack1\12 212.img\skill\2121005\summon\attack1\13 212.img\skill\2121005\summon\attack1\14 212.img\skill\2121005\summon\attack1\15 212.img\skill\2121005\summon\attack1\16 212.img\skill\2121005\summon\attack1\17 212.img\skill\2121005\summon\die\0 212.img\skill\2121005\summon\die\1 212.img\skill\2121005\summon\die\2 212.img\skill\2121005\summon\die\3 212.img\skill\2121005\summon\die\4 212.img\skill\2121005\summon\die\5 212.img\skill\2121005\summon\die\6 212.img\skill\2121005\summon\die\7 212.img\skill\2121005\summon\die\8 212.img\skill\2121005\summon\die\9 212.img\skill\2121005\summon\attack2\0 212.img\skill\2121005\summon\attack2\1 212.img\skill\2121005\summon\attack2\2 212.img\skill\2121005\summon\attack2\3 212.img\skill\2121005\summon\attack2\4 212.img\skill\2121005\summon\attack2\5 212.img\skill\2121005\summon\attack2\6 212.img\skill\2121005\summon\attack2\7 212.img\skill\2121005\summon\attack2\8 212.img\skill\2121005\summon\attack2\9 212.img\skill\2121005\summon\attack2\10 212.img\skill\2121005\summon\attack2\27 212.img\skill\2121005\summon\attack2\28 212.img\skill\2121005\summon\attack2\29 212.img\skill\2121005\summon\attack2\30 212.img\skill\2121005\summon\attack2\31 212.img\skill\2121005\summon\attack2\32 212.img\skill\2121005\summon\attack2\33 212.img\skill\2121005\summon\attack2\34 212.img\skill\2121005\summon\attack2\35 212.img\skill\2121005\summon\attack2\36 212.img\skill\2121005\summon\attack2\37 212.img\skill\2121005\summon\attack2\38 212.img\skill\2121005\summon\attack2\39 212.img\skill\2121005\summon\attack2\40 212.img\skill\2121005\summon\attack2\41 212.img\skill\2121005\summon\attack2\42 212.img\skill\2121005\summon\attack2\info\hit\0 212.img\skill\2121005\summon\attack2\info\hit\1 212.img\skill\2121005\summon\attack2\info\hit\2 212.img\skill\2121005\summon\attack2\info\hit\3 212.img\skill\2121005\summon\attack2\info\hit\4 212.img\skill\2121005\summon\attack2\info\hit\5 212.img\skill\2121005\summon\attack2\info\hit\6 212.img\skill\2121005\summon\special\1 212.img\skill\2121005\summon\special\2 212.img\skill\2121005\summon\special\3 212.img\skill\2121005\summon\special\4 212.img\skill\2121005\summon\special\5 212.img\skill\2121005\summon\special\6 212.img\skill\2121005\summon\special\7 212.img\skill\2121005\summon\special\8 212.img\skill\2121005\summon\special\9 212.img\skill\2121005\summon\special\10 212.img\skill\2121005\summon\special\11 212.img\skill\2121005\summon\special\12 212.img\skill\2121005\summon\special\13 212.img\skill\2121005\summon\special\14 212.img\skill\2121005\hit\0\0 212.img\skill\2121005\hit\0\1 212.img\skill\2121005\hit\0\2 212.img\skill\2121005\hit\0\3 212.img\skill\2121005\hit\0\4 212.img\skill\2121005\hit\0\5 212.img\skill\2121005\hit\0\6 212.img\skill\2121000\effect\0 212.img\skill\2121000\effect\1 212.img\skill\2121000\effect\2 212.img\skill\2121000\effect\3 212.img\skill\2121000\effect\4 212.img\skill\2121000\effect\5 212.img\skill\2121000\effect\6 212.img\skill\2121000\effect\7 212.img\skill\2121000\effect\8 212.img\skill\2121000\effect\9 212.img\skill\2121000\effect\10 212.img\skill\2121000\effect\11 212.img\skill\2121000\effect\12 212.img\skill\2121000\effect\13 212.img\skill\2121000\effect\14 212.img\skill\2121000\effect\15 212.img\skill\2121000\effect\16 212.img\skill\2121000\effect\17 212.img\skill\2121000\effect\18 212.img\skill\2121000\effect\19 212.img\skill\2121000\effect\20 212.img\skill\2121000\effect\21 212.img\skill\2121000\effect\22 212.img\skill\2121000\affected\0 212.img\skill\2121000\affected\1 212.img\skill\2121000\affected\2 212.img\skill\2121000\affected\3 212.img\skill\2121000\affected\4 212.img\skill\2121000\affected\5 212.img\skill\2121000\affected\6 212.img\skill\2121000\affected\7 212.img\skill\2121000\affected\8 212.img\skill\2121000\affected\9 212.img\skill\2121000\affected\10 212.img\skill\2121000\affected\11 212.img\skill\2121000\affected\12 212.img\skill\2121000\affected\13 212.img\skill\2121000\affected\14 212.img\skill\2121008\effect\0 212.img\skill\2121008\effect\1 212.img\skill\2121008\effect\2 212.img\skill\2121008\effect\3 212.img\skill\2121008\effect\4 212.img\skill\2121008\effect\5 212.img\skill\2121008\effect\6 212.img\skill\2121008\effect\7 212.img\skill\2121008\effect\8 212.img\skill\2121008\effect\9 212.img\skill\2121008\effect\10 212.img\skill\2121008\effect\11 212.img\skill\2121008\effect\12 212.img\skill\2120013\hit\0\0 212.img\skill\2120013\hit\0\1 212.img\skill\2120013\hit\0\2 212.img\skill\2120013\hit\0\3 212.img\skill\2120013\hit\0\4 212.img\skill\2120013\hit\0\5 212.img\skill\2120013\hit\0\6 212.img\skill\2120013\hit\0\7 212.img\skill\2120013\hit\0\8 212.img\skill\2120013\hit\0\9 212.img\skill\2120013\hit\0\10 212.img\skill\2120013\hit\0\11 212.img\skill\2120013\hit\0\12 212.img\skill\2120013\hit\0\13 212.img\skill\2120013\hit\0\14 212.img\skill\2120013\hit\0\15 212.img\skill\2120013\hit\0\16 212.img\skill\2120013\hit\0\17 212.img\skill\2120013\hit\0\18 212.img\skill\2121052\effect\0 212.img\skill\2121052\effect\1 212.img\skill\2121052\effect\2 212.img\skill\2121052\effect\3 212.img\skill\2121052\effect\4 212.img\skill\2121052\effect\5 212.img\skill\2121052\effect\6 212.img\skill\2121052\effect\7 212.img\skill\2121052\effect\8 212.img\skill\2121052\effect\9 212.img\skill\2121052\effect\10 212.img\skill\2121052\effect\11 212.img\skill\2121052\effect\12 212.img\skill\2121052\hit\0\0 212.img\skill\2121052\hit\0\1 212.img\skill\2121052\hit\0\2 212.img\skill\2121052\hit\0\3 212.img\skill\2121052\hit\0\4 212.img\skill\2121052\hit\0\5 212.img\skill\2121053\effect\0 212.img\skill\2121053\effect\1 212.img\skill\2121053\effect\2 212.img\skill\2121053\effect\3 212.img\skill\2121053\effect\4 212.img\skill\2121053\effect\5 212.img\skill\2121053\effect\6 212.img\skill\2121053\effect\7 212.img\skill\2121053\effect\8 212.img\skill\2121053\effect\9 212.img\skill\2121053\effect\10 212.img\skill\2121053\effect\11 212.img\skill\2121053\effect\12 212.img\skill\2121053\effect\13 212.img\skill\2121053\effect\14 212.img\skill\2121053\effect\15 212.img\skill\2121053\effect\16 212.img\skill\2121053\effect\17 212.img\skill\2121053\attected\0 212.img\skill\2121054\effect\0 212.img\skill\2121054\effect\1 212.img\skill\2121054\effect\2 212.img\skill\2121054\effect\3 212.img\skill\2121054\effect\4 212.img\skill\2121054\effect\5 212.img\skill\2121054\effect\6 212.img\skill\2121054\effect\7 212.img\skill\2121054\effect\8 212.img\skill\2121054\effect\9 212.img\skill\2121054\effect\10 212.img\skill\2121054\effect\11 212.img\skill\2121054\effect\12 212.img\skill\2121054\effect\13 212.img\skill\2121054\effect\14 212.img\skill\2121054\effect\15 212.img\skill\2121054\effect\16 212.img\skill\2121054\effect\17 212.img\skill\2121054\effect\18 212.img\skill\2121054\repeat\0 212.img\skill\2121054\repeat\1 212.img\skill\2121054\repeat\2 212.img\skill\2121054\repeat\3 212.img\skill\2121054\repeat\4 212.img\skill\2121054\repeat\5 212.img\skill\2121054\repeat\6 212.img\skill\2121054\repeat\7 212.img\skill\2121054\hit\0\0 212.img\skill\2121054\hit\0\1 212.img\skill\2121054\hit\0\2 212.img\skill\2121054\hit\0\3 212.img\skill\2121054\hit\0\4 212.img\skill\2121054\hit\0\5 212.img\skill\2121054\hit\0\6 --------Done.---------

KENNYSOFT avatar Oct 16 '21 10:10 KENNYSOFT

Update for more detail errors. https://github.com/Kagamia/WzComparerR2/commit/7c5921f4c61d76fa974fc51c038b6fbad7305b18

Kagamia avatar Oct 17 '21 10:10 Kagamia