mirror of
https://forgejo.xatacraft.ru/Sunshine/mkxp-sunshine.git
synced 2026-08-19 13:29:54 +00:00
85 lines
3 KiB
C++
85 lines
3 KiB
C++
#include <SDL3/SDL_log.h>
|
||
#include <ruby.h>
|
||
#include <SDL3/SDL_version.h>
|
||
#include <SDL3/SDL_gamepad.h>
|
||
#include <SDL3/SDL_joystick.h>
|
||
#include <limits.h>
|
||
#include "ruby/backward/cxxanyargs.hpp"
|
||
#include "ruby/internal/arithmetic/double.h"
|
||
#include "ruby/internal/arithmetic/int.h"
|
||
#include "ruby/internal/intern/class.h"
|
||
#include "security.h"
|
||
#include "eventthread.h"
|
||
//Просто на C реализуем методы мне в падлу ебаться со статической линковкой и прочим дерьмом.
|
||
//Аминь.
|
||
|
||
static VALUE obj_clone(VALUE self){
|
||
return rb_obj_clone(self);
|
||
}
|
||
|
||
static VALUE a_last(VALUE self){
|
||
return rb_ary_entry(self, -1);
|
||
}
|
||
|
||
static VALUE int_times(VALUE self) {
|
||
long n = NUM2LONG(self);
|
||
|
||
if (!rb_block_given_p()) {
|
||
ID id_to_enum = rb_intern("to_enum");
|
||
VALUE sym = ID2SYM(rb_intern("times"));
|
||
return rb_funcall(self, id_to_enum, 1, sym);
|
||
}
|
||
|
||
if (n <= 0) return self;
|
||
|
||
for (long i = 0; i < n; ++i) {
|
||
rb_yield(LONG2NUM(i));
|
||
}
|
||
|
||
return self;
|
||
}
|
||
|
||
static VALUE SetLED(VALUE self, VALUE r, VALUE g, VALUE b) {
|
||
if (gc != nullptr) {
|
||
SDL_SetGamepadLED(gc, NUM2INT(r), NUM2INT(g), NUM2INT(b));
|
||
} else if (js != nullptr) {
|
||
SDL_SetJoystickLED(js, NUM2INT(r), NUM2INT(g), NUM2INT(b));
|
||
}
|
||
return Qnil;
|
||
}
|
||
|
||
static VALUE Rumble(VALUE self, VALUE low_frequency_rumble, VALUE high_frequency_rumble, VALUE duration_ms) {
|
||
Uint16 low_freq = NUM2DBL(low_frequency_rumble) * 65535;
|
||
Uint16 high_freq = NUM2DBL(high_frequency_rumble) * 65535;
|
||
|
||
if (gc != nullptr) {
|
||
SDL_RumbleGamepad(gc, low_freq, high_freq, NUM2INT(duration_ms));
|
||
} else if (js != nullptr) {
|
||
SDL_RumbleJoystick(js, low_freq, high_freq, NUM2INT(duration_ms));
|
||
}
|
||
return Qnil;
|
||
}
|
||
|
||
void SunshineBindingInit(){
|
||
printf("[SunshineBindingInit] Initializing Sunshine binding\n");
|
||
VALUE module = rb_define_module("Sunshine");
|
||
//SDL versions, for debug info in main menu and other shi idkkkkkkkk
|
||
rb_const_set(module, rb_intern("SDLVersion_major"), INT2NUM(SDL_MAJOR_VERSION));
|
||
rb_const_set(module, rb_intern("SDLVersion_minor"), INT2NUM(SDL_MINOR_VERSION));
|
||
rb_const_set(module, rb_intern("SDLVersion_micro"), INT2NUM(SDL_MICRO_VERSION));
|
||
rb_const_set(module, rb_intern("SECURITYSTATE"), rb_str_new_cstr(securitystate));
|
||
rb_define_singleton_method(module, "SetLED", SetLED, 3);
|
||
rb_define_singleton_method(module, "Vibrate", Rumble, 3);
|
||
//если методы доступны то просто не перезаписываем их
|
||
if (!rb_respond_to(rb_cObject, rb_intern("class"))) {
|
||
rb_define_method(rb_cObject, "class", rb_obj_class, 0);
|
||
}
|
||
//сразу для всех обьектов
|
||
if (!rb_respond_to(rb_cObject, rb_intern("clone"))) {
|
||
rb_define_method(rb_cObject, "clone", RUBY_METHOD_FUNC(obj_clone), 0);
|
||
}
|
||
|
||
if (!rb_respond_to(rb_cInteger, rb_intern("times"))) {
|
||
rb_define_method(rb_cInteger, "times", RUBY_METHOD_FUNC(int_times), 0);
|
||
}
|
||
}
|