4.20 star(s) 15 Votes

MagowDeath

Newbie
Jul 19, 2017
74
95
completed quests just gives more lewd amount for shop + more rarer stuff to show up.
if you want companions you will have to explore every door in the dungeons on every level,
(forest) doesnt count its just Group Battles with rng loot drop chances+some exp
allways increase your CP points since they tend to get pretty costly with more companions 6 each companion at certain point
your companions lvl increase CP cost make sure to keep up with it (2handed Great Swords is easy mode)
 
Last edited:

john__cena

New Member
Oct 25, 2017
11
22
Untitled Enlit3D [v4.7.3] Linux Native!!!!


You need to open "electron" file to start the game!
Tested on Ubuntu 18.04 - Works like a charm!
Any guide on how to do this? I have a lot of programming experience but Electron is beyond me.
I assume you need to extract something from the game files and recompile it somehow.

Would be nice to have a script which does this rebuilding process (for updated versions). Even better if the game developer would make a package for us Linux users since it shouldn't be too difficult.

Side note: This is one of the only games on this entire site which doesn't run through Wine. Yeah, electron is a real bitch.
 
Last edited:

Dono1973

Newbie
Sep 25, 2017
72
59
How do we open the sliders to alter appearance like in the pictures in the opening post? It's not listed in the commands for the game or the options.

EDIT Nvm did not realize I had to talk to the lady in town to get the sliders.
 
Last edited:

Laughingfox

Active Member
Apr 2, 2017
971
870
Not exactly sure how I'm accomplishing this, but aside from the one companion I've had forever, I've yet to encounter any others, anywhere, anytime, regarding recruitment.

Been zipping through every different dungeon type as well as I can with the army of two, but no dice so far. There a trick to this I'm missing? It's not a huge deal, but it does make me curious.

Also, does anybody know if we'll be able to fully recruit a foe or attack type? For example, the short stack goblins are pretty fun with their various dive and leaping attacks. Adds some flavor to typical walk slash parry. (And yes, I know you can temporarily gain them by securing them to a device here and there, but I was looking for a more permanent rendition of the ally.)
 

p3akhawk

Member
Jan 2, 2018
133
67
Most of the mods can be found on his discord (server or group... i don't join any so dunno what they are called...) Also check at some mods get posted on their. Some peps been answering question so if you guy's need to know stuff, try to read threw previous pages, 9 times out of 10, someone's already asked. Unless its about new content. Also the no companion thing, just do the normal dungeon 10 or so times, if none spawn then delete your save. If someone wants to go copy the downloads from his discord into a post on here, that would be great.
 
Last edited:

ea3794

Member
Modder
Mar 30, 2018
434
832
Any guide on how to do this? I have a lot of programming experience but Electron is beyond me.
I assume you need to extract something from the game files and recompile it somehow.

Would be nice to have a script which does this rebuilding process (for updated versions). Even better if the game developer would make a package for us Linux users since it shouldn't be too difficult.

Side note: This is one of the only games on this entire site which doesn't run through Wine. Yeah, electron is a real bitch.
Hmm... I didn't know that someone else already prepared a thing... oh well. In my case, I wrote an extract utility to unpack the .asar files (btw, the most retarded archive format I have ever seen in my life). I then proceeded on installing node and electron with npm, adjusted package.json and finally fixed all the retarded Windows folder separator hard-coding in compiled.js.

What always stumps me is that there's a lot of developers that use a cross-platform toolkit (such as Electron, RenPy, Unity, UE4, RPGMV) and then only build for Windows. I don't get it. Most of the official sites tout multi-platform support as being one of the major features yet no developer uses it.

Ps. Running Chrome (Node) on Wine never worked properly (for me) cause it does too many fancy things with render contexts. Try running with nwjs instead.
 

Frederiksc

Member
Aug 17, 2017
119
112
I wrote an extract utility to unpack the .asar files
Well technically you could have used WINE and a 7Zip plugin for .asar, like I did.

So if you are on WIN, just grab the plugin for 7Zip to get the files ea3794 talked about. There are also the mesh files and textures under /voxel in the .asar file. Happy modding.
 

W65

Active Member
May 31, 2018
779
849
Hmm... I didn't know that someone else already prepared a thing... oh well. In my case, I wrote an extract utility to unpack the .asar files (btw, the most retarded archive format I have ever seen in my life). I then proceeded on installing node and electron with npm, adjusted package.json and finally fixed all the retarded Windows folder separator hard-coding in compiled.js.

What always stumps me is that there's a lot of developers that use a cross-platform toolkit (such as Electron, RenPy, Unity, UE4, RPGMV) and then only build for Windows. I don't get it. Most of the official sites tout multi-platform support as being one of the major features yet no developer uses it.

Ps. Running Chrome (Node) on Wine never worked properly (for me) cause it does too many fancy things with render contexts. Try running with nwjs instead.
My guess is that it's a kind of developer provinciality issue. Most devs probably don't think like professional software designers (to whom multiplatform considerations come as part of the job, I assume) or just assume that most people will play it on the platform that they're developing it on (probably Windows).

It also kinda becomes more work for them if they need to support on multiple platforms. Unless they have a testing environment for every platform, they end up unable to test it, can't answer player questions on that platform, whatever. So it might just be that they don't want to invite support questions they can't answer, even with a "I can't help you with X platform" disclaimers.

Part of it might just be that they don't know how much or how little work it would end up being to support multiple platforms. I'm sure in some of those toolkits it's just a matter of checking some boxes, but I don't know what it'd take in others.

Or it could be that they're using the toolkit for features that have nothing to do with multiplatform support, and that major feature just doesn't register with them.

That's not to say users on other platforms aren't important. Have you tried asking the dev directly if they'll support other platforms? They'd be in the best position to explain their thinking. It might really just be that they didn't think they had enough folks on non-Windows platforms to make it worth their effort, and they won't realize people want those platforms unless folks ask about it.
 

shittyguy

Member
Jun 8, 2017
297
207
that "Mysterydungeon" is a dungeon mod that is pokemon theme and yes all the enemys are pokemon
 
Last edited:

ea3794

Member
Modder
Mar 30, 2018
434
832
Well technically you could have used WINE and a 7Zip plugin for .asar, like I did.

So if you are on WIN, just grab the plugin for 7Zip to get the files ea3794 talked about. There are also the mesh files and textures under /voxel in the .asar file. Happy modding.
Yea... or you could pull the official repo and download like 6 billion dependencies to run the nodejs-based tool.

FWIW... Here's my poorly-written C++ asar unpacker, just add nlohmann's single-file json header (its on github). Unpacks all arguments to current folder.
Code:
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <cstring>
#include <system_error>
#include <stdexcept>
#include <vector>
#include <memory>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include "json.hpp"

using json = nlohmann::json;

struct istream {
    inline virtual ~istream() noexcept = default;
    virtual void read(void * buffer, size_t amount) = 0;
    template<typename T> T read();
};

struct ostream {
    inline virtual ~ostream() noexcept = default;
    virtual void write(const void * buffer, size_t amount) = 0;
    template<typename T> void write(const T &);
};

struct iostream : istream, ostream {
    inline virtual ~iostream() noexcept = default;
};

template<> inline uint8_t istream::read<uint8_t>() {
    uint8_t tmp;
    read(&tmp, sizeof(tmp));
    return tmp;
}

template<> inline uint32_t istream::read<uint32_t>() {
    uint32_t tmp;
    read(&tmp, sizeof(tmp));
    return tmp;
}

class filestream : public iostream {
public:

    filestream(const filestream &) = delete;
    filestream & operator=(const filestream &) = delete;

    static filestream * open(const std::string & filename) {
        const auto fd = ::open(filename.c_str(), O_RDONLY);
        if (fd < 0) {
            throw std::system_error(errno, std:: system_category());
        }
        return new filestream(fd);
    }

    static filestream * create(const std::string & filename) {
        const auto fd = ::open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0666);
        if (fd < 0) {
            throw std::system_error(errno, std:: system_category());
        }
        return new filestream(fd);
    }

    ~filestream() noexcept {
        ::close(m_fd);
    }

    void read(void * buffer, size_t amount) override {
        if (::read(m_fd, buffer, amount) != ssize_t(amount)) {
            throw std::system_error(errno, std:: system_category());
        }
    }

    void write(const void * buffer, size_t amount) override {
        if (::write(m_fd, buffer, amount) != ssize_t(amount)) {
            throw std::system_error(errno, std:: system_category());
        }
    }

protected:
    inline explicit filestream(int fd) noexcept : m_fd(fd) {}

    int m_fd;
};

void make_containing_folder(const std::string & filename) {
    for (
        size_t i = 0, end = filename.find('/', 0);
        end != std::string::npos;
        i = end + 1, end = filename.find('/', i)
    ) {
        const std::string path(filename, 0, end);
        if (mkdir(path.c_str(), 0755) != 0) {
            if (errno != EEXIST) {
                throw std::system_error(errno, std:: system_category());
            }
        }
    }
}

const json::object_t * get_object(
    const json & node,
    const char * key
) {
    const auto it = node.find(key);
    if (it != node.end()) {
        return it->get_ptr<const json::object_t *>();
    }
    return nullptr;
}

const json::number_unsigned_t * get_unsigned(
    const json & node,
    const char * key
) {
    const auto it = node.find(key);
    if (it != node.end()) {
        return it->get_ptr<const json::number_unsigned_t *>();
    }
    return nullptr;
}

const json::string_t * get_string(
    const json & node,
    const char * key
) {
    const auto it = node.find(key);
    if (it != node.end()) {
        return it->get_ptr<const json::string_t *>();
    }
    return nullptr;
}

size_t to_unsigned(const std::string & value) {
    return strtoull(value.c_str(), nullptr, 10);
}

struct file_entry {
    std::string m_filename;
    size_t m_offset;
    size_t m_size;

    inline file_entry(
        std::string filename,
        size_t offset,
        size_t size
    )
    : m_filename(filename)
    , m_offset(offset)
    , m_size(size)
    {}
};

void traverse(
    const json & node,
    const std::string & path,
    std::vector<file_entry> & toc
) {
    if (const auto files = get_object(node, "files")) {
        for (const auto & it : *files) {
            traverse(it.second, path + "/" + it.first, toc);
        }
    } else {
        const auto size = get_unsigned(node, "size");
        const auto offset_str = get_string(node, "offset");
        if (size && offset_str) {
            const auto offset = to_unsigned(*offset_str);
            toc.emplace_back(path, offset, *size);
        }
    }
}

void unpack(istream & input) {
    // triple-serialized bullshit cause fucktards
    const auto header_size_size = input.read<uint32_t>(); // must be 4
    if (header_size_size != 4) {
        throw std::runtime_error("header_size_size not 4");
    }
    const auto header_size_1 = input.read<uint32_t>(); // header_size_2 + 4
    const auto header_size_2 = input.read<uint32_t>(); // header_length + 4 + null byte
    if (header_size_1 < header_size_2 + 4) {
        throw std::runtime_error("header_size_2 too big");
    }
    const auto header_length = input.read<uint32_t>(); // length of header string (sans null byte)
    if (header_size_2 < header_length + 4) {
        throw std::runtime_error("header_length too big");
    }
    std::vector<char> json_header(header_length);
    input.read(json_header.data(), header_length);
    const auto header = json::parse(json_header);

    std::vector<file_entry> toc;
    if (const auto files = get_object(header, "files")) {
        for (const auto & it : *files) {
            traverse(it.second, it.first, toc);
        }
    }
    std::sort(
        toc.begin(),
        toc.end(),
        [] (const file_entry & left, const file_entry & right) noexcept -> bool {
            return left.m_offset < right.m_offset;
        }
    );
    size_t current_offset = 0;
    for (const auto & f : toc) {
        printf("%s (@%lu, %lu)\n", f.m_filename.c_str(), f.m_offset, f.m_size);
        if (f.m_offset > current_offset) {
            std::vector<char> padding(current_offset - f.m_offset);
            input.read(padding.data(), padding.size());
        }
        std::vector<char> buffer(f.m_size);
        input.read(buffer.data(), buffer.size());

        make_containing_folder(f.m_filename);
        std::unique_ptr<filestream> output(filestream::create(f.m_filename));
        output->write(buffer.data(), buffer.size());

        current_offset = f.m_offset + f.m_size;
    }
}

int main(int argc, char ** argv) {
    for (int i = 1; i < argc; ++i) {
        printf("Parsing %s...\n", argv[i]);
        std::unique_ptr<filestream> stream(filestream::open(argv[i]));
        unpack(*stream);
    }
    return 0;
}
 
  • Like
Reactions: georgetakei

Denisman

Newbie
May 31, 2018
25
60
Any guide on how to do this? I have a lot of programming experience but Electron is beyond me.
I assume you need to extract something from the game files and recompile it somehow.

Would be nice to have a script which does this rebuilding process (for updated versions). Even better if the game developer would make a package for us Linux users since it shouldn't be too difficult.

Side note: This is one of the only games on this entire site which doesn't run through Wine. Yeah, electron is a real bitch.
Ok! You need to extract compiled.js from resources/app.asar (I can do this using 7zip asar plugin in windows ) and replace all file path in compiled.js written with \ to / and few other changes and replace compiled.js in app.asar with new one.... Then you need to dowload electron linux 3.X.X.X from and replace app.asar file with previously created.... + copy data dir from game dir.... "compiled.js" is obfuscated JS source.... You can see a difference when you compare my linux version of compiled.js and windows version of compiled.js
Using this method I can change a lot of game parameters such as EXP= 1000000*EXP, gold and items drop rate ...

Sorry for my english!!!
 
Last edited:

Pokeahontas

Newbie
Nov 15, 2018
33
12
Does anyone know how to get Mewtwo from the Pokemon Mod ? I downloaded it from Discord but it didnt include Mewtwo. Kinda want it for the dungeon.
 
4.20 star(s) 15 Votes