Program Listing for File PDJE_Judge_Init.hpp

Return to documentation for file (include/judge/Init/PDJE_Judge_Init.hpp)

#pragma once
#include "PDJE_ATOMIC_EVENT.hpp"
#include "PDJE_Core_DataLine.hpp"
#include "PDJE_EXPORT_SETTER.hpp"
#include "PDJE_Input_DataLine.hpp"
#include "PDJE_Note_OBJ.hpp"
#include "PDJE_Rule.hpp"
#include <chrono>
#include <cstdint>
#include <optional>
#include <unordered_map>
namespace PDJE_JUDGE {
constexpr long double TO_MICRO = 1000.0 / 48.0;
inline uint64_t
Convert_Frame_Into_MicroSecond(const uint64_t pcm_frame)
{
    return static_cast<uint64_t>(static_cast<long double>(pcm_frame) *
                                 TO_MICRO);
}

using RAIL_ID = uint64_t;
using MISS_CALLBACK =
    std::function<void(std::unordered_map<uint64_t, NOTE_VEC>)>;
using USE_CALLBACK = std::function<void(
    uint64_t railid, bool Pressed, bool IsLate, uint64_t diff)>;
using MOUSE_AXIS_PARSE_CALLBACK =
    std::function<void(const LOCAL_TIME     microSecond,
                       const P_NOTE_VEC    &found_events,
                       uint64_t             railID,
                       int                  x,
                       int                  y,
                       PDJE_Mouse_Axis_Type axis_type)>;
struct PDJE_API Custom_Events {
    MISS_CALLBACK             missed_event;
    USE_CALLBACK              used_event;
    MOUSE_AXIS_PARSE_CALLBACK custom_axis_parse;
    std::chrono::milliseconds use_event_sleep_time =
        std::chrono::milliseconds(100);
    std::chrono::milliseconds miss_event_sleep_time =
        std::chrono::milliseconds(200);
};

class PDJE_API Judge_Init {
  private:
    void
    DefaultFill(NOTE            &obj,
                const uint64_t   railid,
                const LOCAL_TIME axis1,
                const LOCAL_TIME axis2);

  public:
    Custom_Events                       lambdas;
    std::optional<PDJE_CORE_DATA_LINE>  coreline;
    std::optional<PDJE_INPUT_DATA_LINE> inputline;

    // note object
    std::optional<OBJ> note_objects;

    // rules
    std::optional<EVENT_RULE>               ev_rule;
    std::unordered_map<INPUT_RULE, RAIL_ID> dev_rules;

    void
    SetInputRule(const INPUT_CONFIG &device_config);
    void
    SetEventRule(const EVENT_RULE &event_rule);

    void
    SetCustomEvents(const Custom_Events &events);

    void
    NoteObjectCollector(const std::string        noteType,
                        const uint16_t           noteDetail,
                        const std::string        firstArg,
                        const std::string        secondArg,
                        const std::string        thirdArg,
                        const unsigned long long Y_Axis,
                        const unsigned long long Y_Axis_2,
                        const uint64_t           railID);

    void
    SetCoreLine(const PDJE_CORE_DATA_LINE &coreline);
    void
    SetInputLine(const PDJE_INPUT_DATA_LINE &inputline);
};
}; // namespace PDJE_JUDGE