#pragma once

#include <string>

// #include "../src/api.h"
#include "../src/Neuz.h"
#include "../src/object/mover/Mover.h"

#include "../src/object/Object.h"
#include "../src/object/ObjectProperty.h"
#include "../src/object/ObjectType.h"

#include "../src/skill/SkillID.h"
#include "../src/skill/SkillProperty.h"

#include "../src/import.h"

#define FN_CAST(return_type, ...) return_type (*)(__VA_ARGS__)  

#define REDEFINE_METHOD(target, name, return_type, ...) \
    static const auto& name = target;

namespace flyff {
    // #include "../src/raw/ItemProperty.h"
    // #include "../src/raw/MusicProperty.h"

    namespace api {
        // static_assert(sizeof(fugg::ModulePointer<void>) == sizeof(u32), "ModulePointer needs the same size as u32");

        extern "C" {
            // FinalizePacket(): Encrypts and constructs a packet for wire.
            extern void w2c_f2316(u32);
            // WebSocket::Send(): Sends a packet over the WebSocket connection.
            extern void w2c_f2314(u32, u32);
        };

        static const auto& finalize_packet = w2c_f2316;
        static const auto& websocket_send = w2c_f2314;
    };
};