fnmwolf / Anaconda

Anaconda - Clickteam Fusion 2.5 decompiler by fnmwolf, pete7201, ClickNinYT, 1987Kostya, Blue Nova, and Mathias Kærlev
GNU General Public License v3.0
91 stars 19 forks source link

Chowdren won't run, IndexError: chunktype 'FrameItems' not found #17

Open Rob-Welch opened 2 years ago

Rob-Welch commented 2 years ago

Hi all,

I've been trying to use this to run chowdren on my own game. To check that it works, I created a test executable containing only frame with one active object. To setup, I ran build.sh and then python -m chowdren.run game.exe game. I made four versions of this test executable in total:

After some testing, I found that the mmfparser library will only build and run with gcc/g++<8 and using cython > 0.19 and < 0.25. I also tested on Windows using the provided python, the only thing I changed was installing Pillow. If I try and run chowdren on the game executable, I get the following results, regardless of OS:

With R293.10 with all the stuff disabled, I get the following:

(unknown chunk 8774)
(unknown chunk 8785)
creating new data transform
(unknown chunk 8797)
(unknown chunk 8783)
(unknown chunk 8796)
(unknown chunk 8787)
(unknown chunk 8788)
(unknown chunk 8789)
(unknown chunk 8790)
(unknown chunk 8791)
(unknown chunk 8781)
Traceback (most recent call last):
  File "/home/rob/anaconda2/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/home/rob/anaconda2/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/rob/Anaconda/Anaconda/Chowdren/chowdren/run.py", line 40, in <module>
    main()
  File "/home/rob/Anaconda/Anaconda/Chowdren/chowdren/run.py", line 37, in main
    Converter(args)
  File "chowdren/converter.py", line 594, in __init__
    exe = ExecutableData(ByteReader(fp), loadFrames = False)
  File "mmfparser\loader.pyx", line 20, in mmfparser.loader.DataLoader.__init__ (./mmfparser/loader.cpp:936)
  File "mmfparser\loader.pyx", line 31, in mmfparser.loader.DataLoader.init (./mmfparser/loader.cpp:1051)
  File "mmfparser\loader.pyx", line 49, in mmfparser.loader.DataLoader.read (./mmfparser/loader.cpp:1714)
  File "../mmfparser/data/exe.py", line 55, in read
    self.gameData = self.new(GameData, reader)
  File "mmfparser\loader.pyx", line 37, in mmfparser.loader.DataLoader.new (./mmfparser/loader.cpp:1245)
  File "mmfparser\loader.pyx", line 31, in mmfparser.loader.DataLoader.init (./mmfparser/loader.cpp:1051)
  File "mmfparser\loader.pyx", line 49, in mmfparser.loader.DataLoader.read (./mmfparser/loader.cpp:1714)
  File "../mmfparser/data/gamedata.py", line 254, in read
    self.frameItems = chunks.popChunk(FrameItems)
  File "mmfparser/data/chunk.pyx", line 234, in mmfparser.data.chunk.ChunkList.popChunk (./mmfparser/data/chunk.cpp:5544)
IndexError: chunktype 'FrameItems' not found

With all the default build settings, I get this

(unknown chunk 8774)
(unknown chunk 8785)
creating new data transform
(unknown chunk 8797)
(unknown chunk 8783)
(unknown chunk 8796)
(unknown chunk 8787)
(unknown chunk 8788)
(unknown chunk 8789)
(unknown chunk 8790)
(unknown chunk 8791)
(unknown chunk 8781)
  File "/home/rob/anaconda2/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/home/rob/anaconda2/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/rob/Anaconda/Anaconda/Chowdren/chowdren/run.py", line 40, in <module>
    main()
  File "/home/rob/Anaconda/Anaconda/Chowdren/chowdren/run.py", line 37, in main
    Converter(args)
  File "chowdren/converter.py", line 594, in __init__
    exe = ExecutableData(ByteReader(fp), loadFrames = False)
  File "../mmfparser/data/exe.py", line 55, in read
    self.gameData = self.new(GameData, reader)
  File "../mmfparser/data/gamedata.py", line 102, in read
    chunks = self.new(ChunkList, reader)
Traceback (most recent call last):
  File "/home/rob/anaconda2/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/home/rob/anaconda2/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/rob/Anaconda/Anaconda/Chowdren/chowdren/run.py", line 40, in <module>
    main()
  File "/home/rob/Anaconda/Anaconda/Chowdren/chowdren/run.py", line 37, in main
    Converter(args)
  File "chowdren/converter.py", line 594, in __init__
    exe = ExecutableData(ByteReader(fp), loadFrames = False)
  File "mmfparser\loader.pyx", line 20, in mmfparser.loader.DataLoader.__init__ (./mmfparser/loader.cpp:936)
  File "mmfparser\loader.pyx", line 31, in mmfparser.loader.DataLoader.init (./mmfparser/loader.cpp:1051)
  File "mmfparser\loader.pyx", line 49, in mmfparser.loader.DataLoader.read (./mmfparser/loader.cpp:1714)
  File "../mmfparser/data/exe.py", line 55, in read
    self.gameData = self.new(GameData, reader)
  File "mmfparser\loader.pyx", line 37, in mmfparser.loader.DataLoader.new (./mmfparser/loader.cpp:1245)
  File "mmfparser\loader.pyx", line 31, in mmfparser.loader.DataLoader.init (./mmfparser/loader.cpp:1051)
  File "mmfparser\loader.pyx", line 49, in mmfparser.loader.DataLoader.read (./mmfparser/loader.cpp:1714)
  File "../mmfparser/data/gamedata.py", line 102, in read
    chunks = self.new(ChunkList, reader)
  File "mmfparser\loader.pyx", line 37, in mmfparser.loader.DataLoader.new (./mmfparser/loader.cpp:1245)
  File "mmfparser\loader.pyx", line 31, in mmfparser.loader.DataLoader.init (./mmfparser/loader.cpp:1051)
  File "mmfparser/data/chunk.pyx", line 172, in mmfparser.data.chunk.ChunkList.read (./mmfparser/data/chunk.cpp:4553)
  File "mmfparser\loader.pyx", line 37, in mmfparser.loader.DataLoader.new (./mmfparser/loader.cpp:1245)
  File "mmfparser\loader.pyx", line 31, in mmfparser.loader.DataLoader.init (./mmfparser/loader.cpp:1051)
  File "mmfparser/data/chunk.pyx", line 86, in mmfparser.data.chunk.Chunk.read (./mmfparser/data/chunk.cpp:2650)
  File "mmfparser\loader.pyx", line 37, in mmfparser.loader.DataLoader.new (./mmfparser/loader.cpp:1245)
  File "mmfparser\loader.pyx", line 31, in mmfparser.loader.DataLoader.init (./mmfparser/loader.cpp:1051)
  File "mmfparser/data/chunkloaders/imagebank.pyx", line 574, in mmfparser.data.chunkloaders.imagebank.ImageBank.read (./mmfparser/data/chunkloaders/imagebank.cpp:11836)
  File "mmfparser\loader.pyx", line 37, in mmfparser.loader.DataLoader.new (./mmfparser/loader.cpp:1245)
  File "mmfparser\loader.pyx", line 31, in mmfparser.loader.DataLoader.init (./mmfparser/loader.cpp:1051)
  File "mmfparser/data/chunkloaders/imagebank.pyx", line 367, in mmfparser.data.chunkloaders.imagebank.ImageItem.read (./mmfparser/data/chunkloaders/imagebank.cpp:5134)
  File "mmfparser\bytereader.pyx", line 282, in mmfparser.bytereader.ByteReader.readInt (./mmfparser/bytereader.cpp:4070)
  File "mmfparser\bytereader.pyx", line 190, in mmfparser.bytereader.ByteReader._read (./mmfparser/bytereader.cpp:2761)
  File "mmfparser\bytereader.pyx", line 50, in mmfparser.bytereader.check_available (./mmfparser/bytereader.cpp:1186)
struct.error: 1 bytes required

With the R284 I get the same error with both executables, which is:

Could not import all platforms
(unknown chunk 8774)
(unknown chunk 8783)
(unknown chunk 8781)
Traceback (most recent call last):
  File "/home/rob/anaconda2/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/home/rob/anaconda2/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/rob/Anaconda/Anaconda/Chowdren/chowdren/run.py", line 40, in <module>
    main()
  File "/home/rob/Anaconda/Anaconda/Chowdren/chowdren/run.py", line 37, in main
    Converter(args)
  File "chowdren/converter.py", line 709, in __init__
    self.create_assets(cache)
  File "chowdren/converter.py", line 1111, in create_assets
    image.height), image.getImageData())
  File "mmfparser/data/chunkloaders/imagebank.pyx", line 480, in mmfparser.data.chunkloaders.imagebank.ImageItem.getImageData (./mmfparser/data/chunkloaders/imagebank.cpp:7574)
  File "mmfparser/data/chunkloaders/imagebank.pyx", line 75, in mmfparser.data.chunkloaders.imagebank.getImageData (./mmfparser/data/chunkloaders/imagebank.cpp:2147)
TypeError: expected string or Unicode object, NoneType found

As far as I can tell, it's the variable chunk.data that's empty. But I can't tell you much more than that, I don't know how the object is constructed or why it would end up that way. I know this repo is mostly for the decompiler, but this seems like a decompiler issue to me? I have quite a lot of C++ and Python experience, so I'm happy to put more work into this and try and fix it (or at least document what I've learned so far) but I don't really understand the nature of the error right now. Please let me know if you have any ideas.

Thanks

Rob

fnmwolf commented 1 year ago

Thanks for the detailed write up and sorry for the slow response. Chowdren is not maintained anymore.. I suggest trying build 282 or 283.