diff --git a/include/binding/definitions.h b/include/binding/definitions.h index 32c4fc8..b7ea837 100644 --- a/include/binding/definitions.h +++ b/include/binding/definitions.h @@ -390,6 +390,24 @@ static mrb_value element_text_equal(mrb_state *mrb, mrb_value self) { return mrb_bool_value(id_self == id_other); } +static mrb_value element_text_inspect(mrb_state *mrb, mrb_value self) { + uint64_t id = get_id_ElementText(mrb, self); + app::EText *element = (app::EText *)app::element_pool[id]; + std::string str = "#key) + + " font_id=" + std::format("0x{:016x}", element->font_id) + + ">"; + return mrb_str_new_cstr(mrb, str.c_str()); +} + +static mrb_value element_text_to_s(mrb_state *mrb, mrb_value self) { + uint64_t id = get_id_ElementText(mrb, self); + app::EText *element = (app::EText *)app::element_pool[id]; + std::string localized_text = Localization::get(Ruby::mrb, element->key, element->params); + return mrb_str_new_cstr(mrb, localized_text.c_str()); +} + static mrb_value element_text_hash(mrb_state *mrb, mrb_value self) { uint64_t id = get_id_ElementText(mrb, self); return mrb_fixnum_value(id); @@ -620,10 +638,10 @@ static mrb_value ElementRect_init(mrb_state *mrb, mrb_value self) { mrb_data_init(self, nullptr, &ElementRect_type); Wrapper *s = new Wrapper(); - mrb_int w, h; + mrb_float w, h; mrb_int color_i = 0xFFFFFF; mrb_value kwargs; - mrb_get_args(mrb, "iii|H", &w, &h, &color_i, &kwargs); + mrb_get_args(mrb, "ffi|H", &w, &h, &color_i, &kwargs); float x = 0, y = 0, z = 0, rotation = 0, scale_x = 1, scale_y = 1, alpha = 1; bool click_through = false; @@ -756,6 +774,17 @@ static mrb_value element_rect_equal(mrb_state *mrb, mrb_value self) { return mrb_bool_value(id_self == id_other); } +static mrb_value element_rect_inspect(mrb_state *mrb, mrb_value self) { + uint64_t id = get_id_ElementRect(mrb, self); + app::ERect *element = (app::ERect *)app::element_pool[id]; + std::string str = "#shape.x) + + " height=" + std::format("{}", element->shape.y) + + ">"; + return mrb_str_new_cstr(mrb, str.c_str()); +} + static mrb_value element_rect_hash(mrb_state *mrb, mrb_value self) { uint64_t id = get_id_ElementRect(mrb, self); return mrb_fixnum_value(id); @@ -975,6 +1004,17 @@ static mrb_value element_image_equal(mrb_state *mrb, mrb_value self) { return mrb_bool_value(id_self == id_other); } +static mrb_value element_image_inspect(mrb_state *mrb, mrb_value self) { + uint64_t id = get_id_ElementImage(mrb, self); + app::EImage *element = (app::EImage *)app::element_pool[id]; + std::string str = "#animation_id) + + ">"; + return mrb_str_new_cstr(mrb, str.c_str()); +} + static mrb_value element_image_hash(mrb_state *mrb, mrb_value self) { uint64_t id = get_id_ElementImage(mrb, self); return mrb_fixnum_value(id); @@ -1344,6 +1384,11 @@ static mrb_value scene_equal(mrb_state *mrb, mrb_value self) { return mrb_bool_value(id_self == id_other); } +static mrb_value scene_inspect(mrb_state *mrb, mrb_value self) { + uint64_t id = get_id_Scene(mrb, self); + return mrb_str_new_cstr(mrb, ("#").c_str()); +} + static mrb_value scene_hash(mrb_state *mrb, mrb_value self) { uint64_t id = get_id_Scene(mrb, self); return mrb_fixnum_value(id); @@ -1517,8 +1562,10 @@ inline void setup() { DEF_CLASS(ElementText, MRB_ARGS_REQ(3) | MRB_ARGS_OPT(2)); ADD_METHOD(ElementText, "==", element_text_equal, MRB_ARGS_REQ(1)); ADD_METHOD(ElementText, "eql?", element_text_equal, MRB_ARGS_REQ(1)); + ADD_METHOD(ElementText, "inspect", element_text_inspect, MRB_ARGS_NONE()); ADD_METHOD(ElementText, "hash", element_text_hash, MRB_ARGS_NONE()); ADD_METHOD(ElementText, "on_click", element_text_on_click, MRB_ARGS_BLOCK()); + ADD_METHOD(ElementText, "to_s", element_text_to_s, MRB_ARGS_NONE()); ADD_METHOD(ElementText, "key=", element_text_key_set, MRB_ARGS_REQ(1)); ADD_METHOD(ElementText, "key", element_text_key_get, MRB_ARGS_NONE()); ADD_METHOD(ElementText, "color=", element_text_color_set, MRB_ARGS_REQ(1)); @@ -1545,6 +1592,8 @@ inline void setup() { DEF_CLASS(ElementRect, MRB_ARGS_REQ(3) | MRB_ARGS_OPT(1)); ADD_METHOD(ElementRect, "==", element_rect_equal, MRB_ARGS_REQ(1)); ADD_METHOD(ElementRect, "eql?", element_rect_equal, MRB_ARGS_REQ(1)); + ADD_METHOD(ElementRect, "inspect", element_rect_inspect, MRB_ARGS_NONE()); + ADD_METHOD(ElementRect, "to_s", element_rect_inspect, MRB_ARGS_NONE()); ADD_METHOD(ElementRect, "hash", element_rect_hash, MRB_ARGS_NONE()); ADD_METHOD(ElementRect, "on_click", element_rect_on_click, MRB_ARGS_BLOCK()); ADD_METHOD(ElementRect, "width=", element_rect_width_set, MRB_ARGS_REQ(1)); @@ -1570,6 +1619,8 @@ inline void setup() { ADD_METHOD(ElementImage, "on_click", element_image_on_click, MRB_ARGS_BLOCK()); ADD_METHOD(ElementImage, "==", element_image_equal, MRB_ARGS_REQ(1)); ADD_METHOD(ElementImage, "eql?", element_image_equal, MRB_ARGS_REQ(1)); + ADD_METHOD(ElementImage, "inspect", element_image_inspect, MRB_ARGS_NONE()); + ADD_METHOD(ElementImage, "to_s", element_image_inspect, MRB_ARGS_NONE()); ADD_METHOD(ElementImage, "hash", element_image_hash, MRB_ARGS_NONE()); ADD_METHOD(ElementImage, "animation=", element_image_animation_set, MRB_ARGS_REQ(1)); ADD_METHOD(ElementImage, "animation", element_image_animation_get, MRB_ARGS_NONE()); @@ -1589,6 +1640,8 @@ inline void setup() { DEF_CLASS(Scene, MRB_ARGS_NONE()); ADD_METHOD(Scene, "==", scene_equal, MRB_ARGS_REQ(1)); ADD_METHOD(Scene, "eql?", scene_equal, MRB_ARGS_REQ(1)); + ADD_METHOD(Scene, "inspect", scene_inspect, MRB_ARGS_NONE()); + ADD_METHOD(Scene, "to_s", scene_inspect, MRB_ARGS_NONE()); ADD_METHOD(Scene, "hash", scene_hash, MRB_ARGS_NONE()); ADD_METHOD(Scene, "<<", scene_add_element, MRB_ARGS_REQ(1)); ADD_METHOD(Scene, "delete", scene_delete_element, MRB_ARGS_REQ(1)); diff --git a/include/localization/localization.h b/include/localization/localization.h index f6cf1c2..d3194b1 100644 --- a/include/localization/localization.h +++ b/include/localization/localization.h @@ -134,4 +134,12 @@ inline Key key_from_sym(mrb_state *mrb, mrb_sym sym) { localization_key_map[key_name] = new_id; return new_id; } + +// This is only used for debugging and inspect output, so performance is not a concern +inline std::string get_key_name(Key key) { + for (const auto &[str, k] : localization_key_map) + if (k == key) + return str; + return "Unknown Key"; +} } // namespace Localization \ No newline at end of file diff --git a/include/utils.h b/include/utils.h index 9d330eb..9552bab 100644 --- a/include/utils.h +++ b/include/utils.h @@ -160,7 +160,7 @@ template struct Pool { T *operator[](uint64_t index) { if (!is_valid(index)) { - fprintf(stderr, "Invalid pool index: %llu\n", (unsigned long long)index); + fprintf(stderr, "Invalid pool index: %lu\n", (uint64_t)index); return nullptr; } uint32_t id = (uint32_t)(index & 0xFFFFFFFFULL);