mirror of
https://github.com/LouisShark/chatgpt_system_prompt.git
synced 2025-07-05 14:20:33 -04:00
125 lines
4.6 KiB
C++
125 lines
4.6 KiB
C++
#include "features/relax.h"
|
|
#include "window.h"
|
|
|
|
float od_window = 5.f;
|
|
float od_window_left_offset = .0f;
|
|
float od_window_right_offset = .0f;
|
|
float od_check_ms = .0f;
|
|
|
|
float jumping_window_offset = .0f;
|
|
|
|
int wait_hitobjects_min = 10;
|
|
int wait_hitobjects_max = 25;
|
|
|
|
bool debug_relax = false;
|
|
|
|
static char current_click = cfg_relax_style == 'a' ? right_click[0] : left_click[0];
|
|
|
|
void calc_od_timing()
|
|
{
|
|
static const auto rand_range_f = [](float f_min, float f_max) -> float
|
|
{
|
|
float scale = rand() / (float)RAND_MAX;
|
|
return f_min + scale * (f_max - f_min);
|
|
};
|
|
static const auto rand_range_i = [](int i_min, int i_max) -> int
|
|
{
|
|
return rand() % (i_max + 1 - i_min) + i_min;
|
|
};
|
|
if (cfg_relax_checks_od && (od_check_ms == .0f))
|
|
{
|
|
od_check_ms = rand_range_f(od_window_left_offset, od_window_right_offset);
|
|
if (cfg_jumping_window)
|
|
{
|
|
static uint32_t hit_objects_passed = current_beatmap.hit_object_idx;
|
|
static int wait_hitojects_count = rand_range_i(wait_hitobjects_min, wait_hitobjects_max);
|
|
if (current_beatmap.hit_object_idx - hit_objects_passed >= wait_hitojects_count)
|
|
{
|
|
// NOTE(Ciremun): move od window to the left
|
|
if (rand_range_i(0, 1) >= 1)
|
|
jumping_window_offset = rand_range_f(.1337f, od_window - od_window_left_offset);
|
|
else
|
|
jumping_window_offset = -rand_range_f(.1337f, od_window_right_offset);
|
|
hit_objects_passed = current_beatmap.hit_object_idx;
|
|
wait_hitojects_count = rand_range_i(wait_hitobjects_min, wait_hitobjects_max);
|
|
}
|
|
od_check_ms += jumping_window_offset;
|
|
}
|
|
}
|
|
}
|
|
|
|
Vector2<float> mouse_position()
|
|
{
|
|
Vector2<float> mouse_pos;
|
|
uintptr_t osu_manager = *(uintptr_t *)(osu_manager_ptr);
|
|
uintptr_t osu_ruleset_ptr = *(uintptr_t *)(osu_manager + OSU_MANAGER_RULESET_PTR_OFFSET);
|
|
mouse_pos.x = *(float *)(osu_ruleset_ptr + OSU_RULESET_MOUSE_X_OFFSET);
|
|
mouse_pos.y = *(float *)(osu_ruleset_ptr + OSU_RULESET_MOUSE_Y_OFFSET);
|
|
|
|
return mouse_pos;
|
|
}
|
|
|
|
void update_relax(Circle &circle, const int32_t audio_time)
|
|
{
|
|
static double keydown_time = 0.0;
|
|
static double keyup_delay = 0.0;
|
|
|
|
if (cfg_relax_lock)
|
|
{
|
|
calc_od_timing();
|
|
|
|
auto current_time = audio_time + od_check_ms;
|
|
auto valid_timing = current_time >= circle.start_time;
|
|
auto mouse_pos = mouse_position();
|
|
Vector2 screen_pos = playfield_to_screen(circle.position);
|
|
auto scalar_dist = sqrt((mouse_pos.x - screen_pos.x) * (mouse_pos.x - screen_pos.x) + (mouse_pos.y - screen_pos.y) * (mouse_pos.y - screen_pos.y));
|
|
auto valid_position = scalar_dist <= current_beatmap.scaled_hit_object_radius;
|
|
|
|
if (debug_relax)
|
|
{
|
|
ImGui::GetBackgroundDrawList()->AddCircleFilled(
|
|
ImVec2(screen_pos.x, screen_pos.y),
|
|
current_beatmap.scaled_hit_object_radius,
|
|
ImColor( 0, 255, 255, 100 ) );
|
|
}
|
|
|
|
if (valid_timing /* && valid_position */)
|
|
{
|
|
if (!circle.clicked)
|
|
{
|
|
if (cfg_relax_style == 'a')
|
|
current_click = current_click == left_click[0] ? right_click[0] : left_click[0];
|
|
|
|
send_keyboard_input(current_click, 0);
|
|
FR_INFO_FMT("Relax hit %d!, %d %d", current_beatmap.hit_object_idx, circle.start_time, circle.end_time);
|
|
keyup_delay = circle.end_time ? circle.end_time - circle.start_time : 0.5;
|
|
|
|
if (cfg_timewarp_enabled)
|
|
{
|
|
double timewarp_playback_rate_div_100 = cfg_timewarp_playback_rate / 100.0;
|
|
keyup_delay /= timewarp_playback_rate_div_100;
|
|
}
|
|
else if (circle.type == HitObjectType::Slider || circle.type == HitObjectType::Spinner)
|
|
{
|
|
if (current_beatmap.mods & Mods::DoubleTime)
|
|
keyup_delay /= 1.5;
|
|
else if (current_beatmap.mods & Mods::HalfTime)
|
|
keyup_delay /= 0.75;
|
|
}
|
|
keydown_time = ImGui::GetTime();
|
|
circle.clicked = true;
|
|
od_check_ms = .0f;
|
|
}
|
|
}
|
|
}
|
|
if (cfg_relax_lock && keydown_time && ((ImGui::GetTime() - keydown_time) * 1000.0 > keyup_delay))
|
|
{
|
|
keydown_time = 0.0;
|
|
send_keyboard_input(current_click, KEYEVENTF_KEYUP);
|
|
}
|
|
}
|
|
|
|
void relax_on_beatmap_load()
|
|
{
|
|
current_click = cfg_relax_style == 'a' ? right_click[0] : left_click[0];
|
|
}
|