[Release] X-Legend Server files: FFO / FFO2 / ARO / DJO / DSO / SDO

Hello ! Dragomon files seems to be incomplete, am I right ?

It neither has same file as GF or AK about server binaries

Where to find a client about this game ?


edit we can find it here but will need to automate a traduction...
 
Last edited:
Hi! Would anyone be able to help me and some friends with creating a server for Astral Tale? We have been wanting to make a public one, but we need someone who is capable of putting together the files and such together. If you are interested in helping us create a public project, please don't hesitate to message me! I wouldn't mind setting up the server and all files on my PC, I would just need some guidance!
 
☠️im dead
1725920623016 - [Release] X-Legend Server files: FFO / FFO2 / ARO / DJO / DSO / SDO - RaGEZONE Forums
 
I uploaded the database, I made all the updates manually to the database, I ran the servers, but I can't get past the character creation part, could you help me?

Please, I've dreamed of being able to play this game for years.

tmadafuq
 
I uploaded the database, I made all the updates manually to the database, I ran the servers, but I can't get past the character creation part, could you help me?

Please, I've dreamed of being able to play this game for years.

tmadafuq
Can u create character and passthrough to the loadingscreen? Or are u stuck at creating char? look into logs files.
 
Can u create character and passthrough to the loadingscreen? Or are u stuck at creating char? look into logs files.
It doesn't enter the game world, I've already examined it, in the log it says that the bin file is returning a NULL value, I don't have the assembly knowledge to fix this, that's why I'm asking for your help.

Please release fixs.
 
Laplace is weird, it doesn't support fully unpacked client. I gave up on it after only achieving partial unpacking. For packing, I've got absolutely no idea how to do it

no point starting a server that unable to modify client lol
 
Laplace is weird, it doesn't support fully unpacked client. I gave up on it after only achieving partial unpacking. For packing, I've got absolutely no idea how to do it

no point starting a server that unable to modify client lol
the client cant read the data folder with db and scene in it. so its what most important things.

rokeys very sorry I hope i can share. but not right now.
 
can share the game.bin or full client? server 100% work
I've also fixed it, but I need to do more tests. Soon I'll post the server with the installer. About the client and the new nfs system, I think I can get something out of it, considering that it's the old launcher pattern used in xleg (I have part of it reversed, I think it's good xD).



Edit:

Here's my modified exe ; I forced it not to display that existing message, so the client worked. Regarding the server files, I'm using Jagger1998 with a Grand Fantasia base. For the database, I used the one from AK v7 and the update script by Eperty123 . For the gateway server, I use the one from GF; the one that came in the release is odd and doesn't work properly (not for me, at least). Well, I didn't patch the binary; I just put the IP of my WSL2 and it worked, surprisingly. I searched for the function in IDA that initializes CSMTCP, but I couldn’t find anything, so I just ignored it. Regarding the mission server, yes, it seems not to be compatible. The error we receive might be caused by it—idk? However, everything works (well on the server side). If you have any questions, I’ll be here.

CLIENT: posted by Jagger1998

NOTE: I just want to get into the game to grab nifs xD, I find this game cute so I'll be studying the launcher. If there's anything to share, I'd appreciate it.


To run the .exe, use game.exe EasyFun, or any .bat from any other Xleg game that doesn't use .bin.

The reason I did it this way was that while debugging, I found it simpler.

If you don’t want to use the .exe, open HXD or any other hexadecimal editor you have, go to the offset :38FE10, change from C3 to 55, and it will work.

1726562972662 - [Release] X-Legend Server files: FFO / FFO2 / ARO / DJO / DSO / SDO - RaGEZONE Forums


1-hour fix for the mission server crash: Open the 'Mission Server HXD' or any hex editor you have. Go to offset: 2016BF and change from 08 66 34 01 to E8 4C 40 01, and it should work.

This is the Config.ini, still in enum. If anyone wants to start testing each one, feel free to do so.


C++:
 enum lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE : __int32{
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNONE = 0x0,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMAXLevel = 0x1,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eItemMall = 0x2,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyMAXLV = 0x3,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRaid = 0x4,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLimitPlayerNode = 0x5,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLimitPlayerCount = 0x6,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eSecondPassword = 0x7,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eSurvivalMode = 0x8,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMaxRemoveCharDaily = 0x9,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNoApex = 0xA,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRankSwitch = 0xB,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNoLevelDiffDKP = 0xC,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFortuneBagAutoBind = 0xD,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eBindAfterCombine = 0xE,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyInviteCheck = 0xF,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eDailyLoginBonus = 0x10,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLotteryAlchemy = 0x11,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eItemmallCharacter = 0x12,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloudeepControl = 0x13,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch = 0x14,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eXignCodeEnable = 0x15,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRemoveCharResetTime = 0x16,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestMission = 0x17,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestWorld = 0x18,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestZone = 0x19,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumFamilyRankInfo = 0x1A,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumFriendRankInfo = 0x1B,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eBannerStartTime = 0x1C,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch3VS3 = 0x1D,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyLandSwitch = 0x1E,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyRentNPCSwitch = 0x1F,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch4Camps = 0x20,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloseCaptchaLogin = 0x21,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eTransportFamilyDungeon = 0x22,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloseNewRefreshEQsAttr = 0x23,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePeakSpell = 0x24,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMAX = 0x25,
}


FUNCTIONSWITCH fixed



XML:
[FUNCTIONSWITCH]
MAXLevel=120
ItemMall=1
FamilyMAXLV=10
Raid=1
# Limit Node Number
eLimitPlayerNode=
# Limit Player Count
LimitPlayerCount=
SecondPassword=0
SurvivalMode=1
MaxRemoveCharDaily=4
NoApex=0
RankSwitch=1
FortuneBagAutoBind=1
LotteryAlchemy=1
BindAfterCombine=1
ItemmallCharacter=1
ItemmallNumLimitDeadLine=20200714
NoLevelDiffDKP=0
FamilyInviteCheck=0
DailyLoginBonus=0
CloudeepControl=0
ColosseumSwitch=0
XignCodeEnable=0
RemoveCharResetTime=0
PerfTestMission=0
PerfTestWorld=0
PerfTestZone=0
ColosseumFamilyRankInfo=0
ColosseumFriendRankInfo=0
BannerStartTime=0
ColosseumSwitch3VS3=0
FamilyLandSwitch=0
FamilyRentNPCSwitch=0
ColosseumSwitch4Camps=0
CloseCaptchaLogin=0
TransportFamilyDungeon=0
CloseNewRefreshEQsAttr=0
PeakSpell=0

Here is the source code for the Laplace decoder and others that use this type. I parsed it to C++, because I don't use Java, but here it is saved in case someone needs it one day.


C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <stdexcept>
#include <array>

std::array<unsigned int, 256> generateCRCTable() {
    std::array<unsigned int, 256> crcTable;
    unsigned int polynomial = 0xEDB88320;

    for (unsigned int i = 0; i < 256; i++) {
        unsigned int c = i;
        for (size_t j = 0; j < 8; j++) {
            if (c & 1) {
                c = polynomial ^ (c >> 1);
            }
            else {
                c >>= 1;
            }
        }
        crcTable[i] = c;
    }
    return crcTable;
}

void processFiles(const std::string& inputFilePath, const std::string& outputFilePath) {
    if (inputFilePath == outputFilePath) {
        throw std::invalid_argument("Input and Output file paths must be different");
    }

    std::ifstream inputFile(inputFilePath, std::ios::binary);
    std::ofstream outputFile(outputFilePath, std::ios::binary);

    if (!inputFile.is_open() || !outputFile.is_open()) {
        throw std::runtime_error("Failed to open files");
    }

    std::vector<unsigned char> inputData((std::istreambuf_iterator<char>(inputFile)),
        std::istreambuf_iterator<char>());

    if (inputData.size() <= 8) {
        throw std::runtime_error("Input file is too short");
    }

    std::vector<unsigned char> outputData;
    outputData.reserve(inputData.size() - 8);

    std::vector<unsigned char> trimmedData(inputData.begin() + 8, inputData.end());

    int encryptionKeys[] = { 'g', 'h', 'f', 'd', 's', 'j', 'd', 'l' };

    auto crcTable = generateCRCTable();

    unsigned int crcValue = 0x12345678;
    unsigned int secretKey1 = 0x23456789;
    unsigned int secretKey2 = 0x34567890;

    for (int key : encryptionKeys) {
        unsigned int tempCRC = (crcValue ^ key) & 0xFF;
        unsigned int crcStep = crcTable[tempCRC];
        crcValue = crcStep ^ (crcValue >> 8);

        unsigned int updatedKey1 = (crcValue & 0xFF) + secretKey1;
        secretKey1 = 0x8088405 * updatedKey1 + 1;

        unsigned int tempKey = (secretKey1 >> 24) & 0xFF;
        unsigned int secretStep = (secretKey2 ^ tempKey) & 0xFF;
        secretKey2 = crcTable[secretStep] ^ (secretKey2 >> 8);
    }

    for (size_t i = 0; i < trimmedData.size(); ++i) {
        unsigned char currentByte = trimmedData[i];

        unsigned int factor1 = (secretKey2 & 0xFFFF) | 2;
        unsigned int factor2 = factor1 ^ 1;
        unsigned int mixedFactor = factor1 * factor2;

        unsigned int encryptedByte = (currentByte ^ ((mixedFactor >> 8) & 0xFF)) & 0xFF;
        outputData.push_back(static_cast<unsigned char>(encryptedByte));

        unsigned int crcTemp = (crcValue ^ encryptedByte) & 0xFF;
        crcValue = crcTable[crcTemp] ^ (crcValue >> 8);

        unsigned int updatedKey2 = (crcValue & 0xFF) + secretKey1;
        secretKey1 = 0x8088405 * updatedKey2 + 1;

        unsigned int tempKeyUpdate = (secretKey1 >> 24) & 0xFF;
        unsigned int finalSecretStep = (secretKey2 ^ tempKeyUpdate) & 0xFF;
        secretKey2 = crcTable[finalSecretStep] ^ (secretKey2 >> 8);
    }

    outputFile.write(reinterpret_cast<const char*>(outputData.data()), outputData.size() - 2);
    inputFile.close();
    outputFile.close();
}

int main() {
    try {
            
        

        std::string inputFilePath;
        std::string outputFilePath;

        std::cout << "File for Decode\n";
        std::cin >> inputFilePath;


        processFiles(inputFilePath, inputFilePath+".DEC");
        std::cout << "Write successful";
    }
    catch (const std::exception& ex) {
        std::cerr << ex.what() << '\n';
        return 1;
    }
    return 0;
}
 
Last edited:
I've also fixed it, but I need to do more tests. Soon I'll post the server with the installer. About the client and the new nfs system, I think I can get something out of it, considering that it's the old launcher pattern used in xleg (I have part of it reversed, I think it's good xD).



Edit:

Here's my modified exe ; I forced it not to display that existing message, so the client worked. Regarding the server files, I'm using Jagger1998 with a Grand Fantasia base. For the database, I used the one from AK v7 and the update script by Eperty123 . For the gateway server, I use the one from GF; the one that came in the release is odd and doesn't work properly (not for me, at least). Well, I didn't patch the binary; I just put the IP of my WSL2 and it worked, surprisingly. I searched for the function in IDA that initializes CSMTCP, but I couldn’t find anything, so I just ignored it. Regarding the mission server, yes, it seems not to be compatible. The error we receive might be caused by it—idk? However, everything works (well on the server side). If you have any questions, I’ll be here.

CLIENT: posted by Jagger1998

NOTE: I just want to get into the game to grab nifs xD, I find this game cute so I'll be studying the launcher. If there's anything to share, I'd appreciate it.


To run the .exe, use game.exe EasyFun, or any .bat from any other Xleg game that doesn't use .bin.

The reason I did it this way was that while debugging, I found it simpler.

If you don’t want to use the .exe, open HXD or any other hexadecimal editor you have, go to the offset :38FE10, change from C3 to 55, and it will work.

View attachment 267186

1-hour fix for the mission server crash: Open the 'Mission Server HXD' or any hex editor you have. Go to offset: 2016BF and change from 08 66 34 01 to E8 4C 40 01, and it should work.

This is the Config.ini, still in enum. If anyone wants to start testing each one, feel free to do so.


C++:
 enum lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE : __int32{
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNONE = 0x0,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMAXLevel = 0x1,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eItemMall = 0x2,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyMAXLV = 0x3,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRaid = 0x4,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLimitPlayerNode = 0x5,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLimitPlayerCount = 0x6,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eSecondPassword = 0x7,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eSurvivalMode = 0x8,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMaxRemoveCharDaily = 0x9,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNoApex = 0xA,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRankSwitch = 0xB,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eNoLevelDiffDKP = 0xC,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFortuneBagAutoBind = 0xD,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eBindAfterCombine = 0xE,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyInviteCheck = 0xF,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eDailyLoginBonus = 0x10,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eLotteryAlchemy = 0x11,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eItemmallCharacter = 0x12,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloudeepControl = 0x13,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch = 0x14,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eXignCodeEnable = 0x15,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eRemoveCharResetTime = 0x16,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestMission = 0x17,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestWorld = 0x18,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePerfTestZone = 0x19,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumFamilyRankInfo = 0x1A,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumFriendRankInfo = 0x1B,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eBannerStartTime = 0x1C,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch3VS3 = 0x1D,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyLandSwitch = 0x1E,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eFamilyRentNPCSwitch = 0x1F,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eColosseumSwitch4Camps = 0x20,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloseCaptchaLogin = 0x21,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eTransportFamilyDungeon = 0x22,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eCloseNewRefreshEQsAttr = 0x23,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::ePeakSpell = 0x24,
 lapis::CFunctionSwitch::FUNCTION_SWITH_TYPE::eMAX = 0x25,
}


FUNCTIONSWITCH fixed



XML:
[FUNCTIONSWITCH]
MAXLevel=120
ItemMall=1
FamilyMAXLV=10
Raid=1
# Limit Node Number
eLimitPlayerNode=
# Limit Player Count
LimitPlayerCount=
SecondPassword=0
SurvivalMode=1
MaxRemoveCharDaily=4
NoApex=0
RankSwitch=1
FortuneBagAutoBind=1
LotteryAlchemy=1
BindAfterCombine=1
ItemmallCharacter=1
ItemmallNumLimitDeadLine=20200714
NoLevelDiffDKP=0
FamilyInviteCheck=0
DailyLoginBonus=0
CloudeepControl=0
ColosseumSwitch=0
XignCodeEnable=0
RemoveCharResetTime=0
PerfTestMission=0
PerfTestWorld=0
PerfTestZone=0
ColosseumFamilyRankInfo=0
ColosseumFriendRankInfo=0
BannerStartTime=0
ColosseumSwitch3VS3=0
FamilyLandSwitch=0
FamilyRentNPCSwitch=0
ColosseumSwitch4Camps=0
CloseCaptchaLogin=0
TransportFamilyDungeon=0
CloseNewRefreshEQsAttr=0
PeakSpell=0

Here is the source code for the Laplace decoder and others that use this type. I parsed it to C++, because I don't use Java, but here it is saved in case someone needs it one day.


C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <stdexcept>
#include <array>

std::array<unsigned int, 256> generateCRCTable() {
    std::array<unsigned int, 256> crcTable;
    unsigned int polynomial = 0xEDB88320;

    for (unsigned int i = 0; i < 256; i++) {
        unsigned int c = i;
        for (size_t j = 0; j < 8; j++) {
            if (c & 1) {
                c = polynomial ^ (c >> 1);
            }
            else {
                c >>= 1;
            }
        }
        crcTable[i] = c;
    }
    return crcTable;
}

void processFiles(const std::string& inputFilePath, const std::string& outputFilePath) {
    if (inputFilePath == outputFilePath) {
        throw std::invalid_argument("Input and Output file paths must be different");
    }

    std::ifstream inputFile(inputFilePath, std::ios::binary);
    std::ofstream outputFile(outputFilePath, std::ios::binary);

    if (!inputFile.is_open() || !outputFile.is_open()) {
        throw std::runtime_error("Failed to open files");
    }

    std::vector<unsigned char> inputData((std::istreambuf_iterator<char>(inputFile)),
        std::istreambuf_iterator<char>());

    if (inputData.size() <= 8) {
        throw std::runtime_error("Input file is too short");
    }

    std::vector<unsigned char> outputData;
    outputData.reserve(inputData.size() - 8);

    std::vector<unsigned char> trimmedData(inputData.begin() + 8, inputData.end());

    int encryptionKeys[] = { 'g', 'h', 'f', 'd', 's', 'j', 'd', 'l' };

    auto crcTable = generateCRCTable();

    unsigned int crcValue = 0x12345678;
    unsigned int secretKey1 = 0x23456789;
    unsigned int secretKey2 = 0x34567890;

    for (int key : encryptionKeys) {
        unsigned int tempCRC = (crcValue ^ key) & 0xFF;
        unsigned int crcStep = crcTable[tempCRC];
        crcValue = crcStep ^ (crcValue >> 8);

        unsigned int updatedKey1 = (crcValue & 0xFF) + secretKey1;
        secretKey1 = 0x8088405 * updatedKey1 + 1;

        unsigned int tempKey = (secretKey1 >> 24) & 0xFF;
        unsigned int secretStep = (secretKey2 ^ tempKey) & 0xFF;
        secretKey2 = crcTable[secretStep] ^ (secretKey2 >> 8);
    }

    for (size_t i = 0; i < trimmedData.size(); ++i) {
        unsigned char currentByte = trimmedData[i];

        unsigned int factor1 = (secretKey2 & 0xFFFF) | 2;
        unsigned int factor2 = factor1 ^ 1;
        unsigned int mixedFactor = factor1 * factor2;

        unsigned int encryptedByte = (currentByte ^ ((mixedFactor >> 8) & 0xFF)) & 0xFF;
        outputData.push_back(static_cast<unsigned char>(encryptedByte));

        unsigned int crcTemp = (crcValue ^ encryptedByte) & 0xFF;
        crcValue = crcTable[crcTemp] ^ (crcValue >> 8);

        unsigned int updatedKey2 = (crcValue & 0xFF) + secretKey1;
        secretKey1 = 0x8088405 * updatedKey2 + 1;

        unsigned int tempKeyUpdate = (secretKey1 >> 24) & 0xFF;
        unsigned int finalSecretStep = (secretKey2 ^ tempKeyUpdate) & 0xFF;
        secretKey2 = crcTable[finalSecretStep] ^ (secretKey2 >> 8);
    }

    outputFile.write(reinterpret_cast<const char*>(outputData.data()), outputData.size() - 2);
    inputFile.close();
    outputFile.close();
}

int main() {
    try {
           
       

        std::string inputFilePath;
        std::string outputFilePath;

        std::cout << "File for Decode\n";
        std::cin >> inputFilePath;


        processFiles(inputFilePath, inputFilePath+".DEC");
        std::cout << "Write successful";
    }
    catch (const std::exception& ex) {
        std::cerr << ex.what() << '\n';
        return 1;
    }
    return 0;
}
thanks for your work, NICE!
 
Thank you very much for your contribution soras2 I feel like we can now get this game out of the box. In celebration of this, I will make available a Japanese Laplace client that I have available for community studies, let's help each other and bring a functional version of LAPLACE guys <3

download:
 
Back