From 51ca49d91bb661a5445e61056b821e331fc00d8b Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 11 Feb 2022 20:00:54 +0000 Subject: [PATCH 01/25] Fixes on_last_page() calling a deprecated method --- scripts/__scribble_class_element/__scribble_class_element.gml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/__scribble_class_element/__scribble_class_element.gml b/scripts/__scribble_class_element/__scribble_class_element.gml index 23945524b..cc605c6b7 100644 --- a/scripts/__scribble_class_element/__scribble_class_element.gml +++ b/scripts/__scribble_class_element/__scribble_class_element.gml @@ -893,7 +893,7 @@ function __scribble_class_element(_string, _unique_id) constructor static on_last_page = function() { - return (get_page() >= get_pages() - 1); + return (get_page() >= get_page_count() - 1); } #endregion From 64874a3dcae3a4dd908877d2aa1743d53265f1ef Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 11 Feb 2022 20:02:10 +0000 Subject: [PATCH 02/25] Moves text element dimension getters back into their region --- .../__scribble_class_element.gml | 456 +++++++++--------- 1 file changed, 228 insertions(+), 228 deletions(-) diff --git a/scripts/__scribble_class_element/__scribble_class_element.gml b/scripts/__scribble_class_element/__scribble_class_element.gml index cc605c6b7..a7e355089 100644 --- a/scripts/__scribble_class_element/__scribble_class_element.gml +++ b/scripts/__scribble_class_element/__scribble_class_element.gml @@ -140,234 +140,6 @@ function __scribble_class_element(_string, _unique_id) constructor __bbox_obb_x3 = 0; __bbox_obb_y3 = 0; - static __update_bbox_matrix = function() - { - __update_scale_to_box_scale(); - - if (__bbox_dirty) - { - __bbox_dirty = false; - - var _model = __get_model(true); - if (!is_struct(_model)) - { - __bbox_matrix = matrix_build(-__origin_x, -__origin_y, 0, 0,0,0, 1,1,1); - __bbox_aabb_left = 0; - __bbox_aabb_top = 0; - __bbox_aabb_right = 0; - __bbox_aabb_bottom = 0; - __bbox_obb_x0 = 0; - __bbox_obb_y0 = 0; - __bbox_obb_x1 = 0; - __bbox_obb_y1 = 0; - __bbox_obb_x2 = 0; - __bbox_obb_y2 = 0; - __bbox_obb_x3 = 0; - __bbox_obb_y3 = 0; - return; - } - - var _xscale = __scale_to_box_scale*_model.__fit_scale*__xscale; - var _yscale = __scale_to_box_scale*_model.__fit_scale*__yscale; - - //Left/top padding is baked into the model - var _bbox = _model.__get_bbox(SCRIBBLE_BOUNDING_BOX_USES_PAGE? __page : undefined, __padding_l, __padding_t, __padding_r, __padding_b); - - __bbox_raw_width = 1 + _bbox.right - _bbox.left; - __bbox_raw_height = 1 + _bbox.bottom - _bbox.top; - - if ((_xscale == 1) && (_yscale == 1) && (__angle == 0)) - { - __bbox_matrix = matrix_build(-__origin_x, -__origin_y, 0, 0,0,0, 1,1,1); - - //Avoid using matrices if we can - __bbox_aabb_left = -__origin_x + _bbox.left; - __bbox_aabb_top = -__origin_y + _bbox.top; - __bbox_aabb_right = -__origin_x + _bbox.right; - __bbox_aabb_bottom = -__origin_y + _bbox.bottom; - - __bbox_obb_x0 = __bbox_aabb_left; __bbox_obb_y0 = __bbox_aabb_top; - __bbox_obb_x1 = __bbox_aabb_right; __bbox_obb_y1 = __bbox_aabb_top; - __bbox_obb_x2 = __bbox_aabb_left; __bbox_obb_y2 = __bbox_aabb_bottom; - __bbox_obb_x3 = __bbox_aabb_right; __bbox_obb_y3 = __bbox_aabb_bottom; - } - else - { - //TODO - Optimize this - __bbox_matrix = matrix_multiply(matrix_build(-__origin_x, -__origin_y, 0, 0, 0, 0, 1, 1, 1), - matrix_multiply(matrix_build( 0, 0, 0, 0, 0, 0, _xscale, _yscale, 1), - matrix_build( 0, 0, 0, 0, 0, __angle, 1, 1, 1))); - - var _l = _bbox.left; - var _t = _bbox.top; - var _r = _bbox.right; - var _b = _bbox.bottom; - - var _vertex = matrix_transform_vertex(__bbox_matrix, _l, _t, 0); __bbox_obb_x0 = _vertex[0]; __bbox_obb_y0 = _vertex[1]; - var _vertex = matrix_transform_vertex(__bbox_matrix, _r, _t, 0); __bbox_obb_x1 = _vertex[0]; __bbox_obb_y1 = _vertex[1]; - var _vertex = matrix_transform_vertex(__bbox_matrix, _l, _b, 0); __bbox_obb_x2 = _vertex[0]; __bbox_obb_y2 = _vertex[1]; - var _vertex = matrix_transform_vertex(__bbox_matrix, _r, _b, 0); __bbox_obb_x3 = _vertex[0]; __bbox_obb_y3 = _vertex[1]; - - __bbox_aabb_left = min(__bbox_obb_x0, __bbox_obb_x1, __bbox_obb_x2, __bbox_obb_x3); - __bbox_aabb_top = min(__bbox_obb_y0, __bbox_obb_y1, __bbox_obb_y2, __bbox_obb_y3); - __bbox_aabb_right = max(__bbox_obb_x0, __bbox_obb_x1, __bbox_obb_x2, __bbox_obb_x3); - __bbox_aabb_bottom = max(__bbox_obb_y0, __bbox_obb_y1, __bbox_obb_y2, __bbox_obb_y3); - } - - __bbox_aabb_width = 1 + __bbox_aabb_right - __bbox_aabb_left; - __bbox_aabb_height = 1 + __bbox_aabb_bottom - __bbox_aabb_top; - } - } - - static get_left = function(_x = 0) - { - __update_bbox_matrix(); - return __bbox_aabb_left + _x; - } - - static get_top = function(_y = 0) - { - __update_bbox_matrix(); - return __bbox_aabb_top + _y; - } - - static get_right = function(_x = 0) - { - __update_bbox_matrix(); - return __bbox_aabb_right + _x; - } - - static get_bottom = function(_y = 0) - { - __update_bbox_matrix(); - return __bbox_aabb_bottom + _y; - } - - static get_width = function() - { - __update_bbox_matrix(); - return __bbox_raw_width; - } - - static get_height = function() - { - __update_bbox_matrix(); - return __bbox_raw_height; - } - - /// @param x - /// @param y - static get_bbox = function(_x = 0, _y = 0) - { - __update_bbox_matrix(); - - return { - left: _x + __bbox_aabb_left, - top: _y + __bbox_aabb_top, - right: _x + __bbox_aabb_right, - bottom: _y + __bbox_aabb_bottom, - - width: __bbox_aabb_width, - height: __bbox_aabb_height, - - x0: _x + __bbox_obb_x0, y0: _y + __bbox_obb_y0, - x1: _x + __bbox_obb_x1, y1: _y + __bbox_obb_y1, - x2: _x + __bbox_obb_x2, y2: _y + __bbox_obb_y2, - x3: _x + __bbox_obb_x3, y3: _y + __bbox_obb_y3 - }; - } - - /// @param x - /// @param y - /// @param [typist] - static get_bbox_revealed = function(_x, _y, _typist) - { - //No typist set up, return the whole bounding box - if ((_typist == undefined) && (__tw_reveal == undefined)) - { - return get_bbox(_x, _y); - } - - var _model = __get_model(true); - if (!is_struct(_model)) - { - //No extant model, return an empty bounding box - return { - left: _x, - top: _y, - right: _x, - bottom: _y, - - width: 1, - height: 1, - - x0: _x, y0: _y, - x1: _x, y1: _y, - x2: _x, y2: _y, - x3: _x, y3: _y - }; - } - - if (_typist != undefined) - { - var _bbox = _model.__get_bbox_revealed(__page, 0, _typist.__window_array[_typist.__window_index], __padding_l, __padding_t, __padding_r, __padding_b); - } - else if (__tw_reveal != undefined) - { - var _bbox = _model.__get_bbox_revealed(__page, 0, __tw_reveal, __padding_l, __padding_t, __padding_r, __padding_b); - } - - __update_bbox_matrix(); - var _xscale = __scale_to_box_scale*_model.__fit_scale*__xscale; - var _yscale = __scale_to_box_scale*_model.__fit_scale*__yscale; - - if ((_xscale == 1) && (_yscale == 1) && (__angle == 0)) - { - //Avoid using matrices if we can - var _l = _x - __origin_x + _bbox.left; - var _t = _y - __origin_y + _bbox.top; - var _r = _x - __origin_x + _bbox.right; - var _b = _y - __origin_y + _bbox.bottom; - - var _x0 = _l; var _y0 = _t; - var _x1 = _r; var _y1 = _t; - var _x2 = _l; var _y2 = _b; - var _x3 = _r; var _y3 = _b; - } - else - { - var _l = _bbox.left; - var _t = _bbox.top; - var _r = _bbox.right; - var _b = _bbox.bottom; - - var _vertex = matrix_transform_vertex(__bbox_matrix, _l, _t, 0); var _x0 = _x + _vertex[0]; var _y0 = _y + _vertex[1]; - var _vertex = matrix_transform_vertex(__bbox_matrix, _r, _t, 0); var _x1 = _x + _vertex[0]; var _y1 = _y + _vertex[1]; - var _vertex = matrix_transform_vertex(__bbox_matrix, _l, _b, 0); var _x2 = _x + _vertex[0]; var _y2 = _y + _vertex[1]; - var _vertex = matrix_transform_vertex(__bbox_matrix, _r, _b, 0); var _x3 = _x + _vertex[0]; var _y3 = _y + _vertex[1]; - - var _l = min(_x0, _x1, _x2, _x3); - var _t = min(_y0, _y1, _y2, _y3); - var _r = max(_x0, _x1, _x2, _x3); - var _b = max(_y0, _y1, _y2, _y3); - } - - return { - left: _l, - top: _t, - right: _r, - bottom: _b, - - width: 1 + _r - _l, - height: 1 + _b - _t, - - x0: _x0, y0: _y0, - x1: _x1, y1: _y1, - x2: _x2, y2: _y2, - x3: _x3, y3: _y3 - }; - } - #region Basics @@ -835,6 +607,234 @@ function __scribble_class_element(_string, _unique_id) constructor #region Dimensions + static __update_bbox_matrix = function() + { + __update_scale_to_box_scale(); + + if (__bbox_dirty) + { + __bbox_dirty = false; + + var _model = __get_model(true); + if (!is_struct(_model)) + { + __bbox_matrix = matrix_build(-__origin_x, -__origin_y, 0, 0,0,0, 1,1,1); + __bbox_aabb_left = 0; + __bbox_aabb_top = 0; + __bbox_aabb_right = 0; + __bbox_aabb_bottom = 0; + __bbox_obb_x0 = 0; + __bbox_obb_y0 = 0; + __bbox_obb_x1 = 0; + __bbox_obb_y1 = 0; + __bbox_obb_x2 = 0; + __bbox_obb_y2 = 0; + __bbox_obb_x3 = 0; + __bbox_obb_y3 = 0; + return; + } + + var _xscale = __scale_to_box_scale*_model.__fit_scale*__xscale; + var _yscale = __scale_to_box_scale*_model.__fit_scale*__yscale; + + //Left/top padding is baked into the model + var _bbox = _model.__get_bbox(SCRIBBLE_BOUNDING_BOX_USES_PAGE? __page : undefined, __padding_l, __padding_t, __padding_r, __padding_b); + + __bbox_raw_width = 1 + _bbox.right - _bbox.left; + __bbox_raw_height = 1 + _bbox.bottom - _bbox.top; + + if ((_xscale == 1) && (_yscale == 1) && (__angle == 0)) + { + __bbox_matrix = matrix_build(-__origin_x, -__origin_y, 0, 0,0,0, 1,1,1); + + //Avoid using matrices if we can + __bbox_aabb_left = -__origin_x + _bbox.left; + __bbox_aabb_top = -__origin_y + _bbox.top; + __bbox_aabb_right = -__origin_x + _bbox.right; + __bbox_aabb_bottom = -__origin_y + _bbox.bottom; + + __bbox_obb_x0 = __bbox_aabb_left; __bbox_obb_y0 = __bbox_aabb_top; + __bbox_obb_x1 = __bbox_aabb_right; __bbox_obb_y1 = __bbox_aabb_top; + __bbox_obb_x2 = __bbox_aabb_left; __bbox_obb_y2 = __bbox_aabb_bottom; + __bbox_obb_x3 = __bbox_aabb_right; __bbox_obb_y3 = __bbox_aabb_bottom; + } + else + { + //TODO - Optimize this + __bbox_matrix = matrix_multiply(matrix_build(-__origin_x, -__origin_y, 0, 0, 0, 0, 1, 1, 1), + matrix_multiply(matrix_build( 0, 0, 0, 0, 0, 0, _xscale, _yscale, 1), + matrix_build( 0, 0, 0, 0, 0, __angle, 1, 1, 1))); + + var _l = _bbox.left; + var _t = _bbox.top; + var _r = _bbox.right; + var _b = _bbox.bottom; + + var _vertex = matrix_transform_vertex(__bbox_matrix, _l, _t, 0); __bbox_obb_x0 = _vertex[0]; __bbox_obb_y0 = _vertex[1]; + var _vertex = matrix_transform_vertex(__bbox_matrix, _r, _t, 0); __bbox_obb_x1 = _vertex[0]; __bbox_obb_y1 = _vertex[1]; + var _vertex = matrix_transform_vertex(__bbox_matrix, _l, _b, 0); __bbox_obb_x2 = _vertex[0]; __bbox_obb_y2 = _vertex[1]; + var _vertex = matrix_transform_vertex(__bbox_matrix, _r, _b, 0); __bbox_obb_x3 = _vertex[0]; __bbox_obb_y3 = _vertex[1]; + + __bbox_aabb_left = min(__bbox_obb_x0, __bbox_obb_x1, __bbox_obb_x2, __bbox_obb_x3); + __bbox_aabb_top = min(__bbox_obb_y0, __bbox_obb_y1, __bbox_obb_y2, __bbox_obb_y3); + __bbox_aabb_right = max(__bbox_obb_x0, __bbox_obb_x1, __bbox_obb_x2, __bbox_obb_x3); + __bbox_aabb_bottom = max(__bbox_obb_y0, __bbox_obb_y1, __bbox_obb_y2, __bbox_obb_y3); + } + + __bbox_aabb_width = 1 + __bbox_aabb_right - __bbox_aabb_left; + __bbox_aabb_height = 1 + __bbox_aabb_bottom - __bbox_aabb_top; + } + } + + static get_left = function(_x = 0) + { + __update_bbox_matrix(); + return __bbox_aabb_left + _x; + } + + static get_top = function(_y = 0) + { + __update_bbox_matrix(); + return __bbox_aabb_top + _y; + } + + static get_right = function(_x = 0) + { + __update_bbox_matrix(); + return __bbox_aabb_right + _x; + } + + static get_bottom = function(_y = 0) + { + __update_bbox_matrix(); + return __bbox_aabb_bottom + _y; + } + + static get_width = function() + { + __update_bbox_matrix(); + return __bbox_raw_width; + } + + static get_height = function() + { + __update_bbox_matrix(); + return __bbox_raw_height; + } + + /// @param x + /// @param y + static get_bbox = function(_x = 0, _y = 0) + { + __update_bbox_matrix(); + + return { + left: _x + __bbox_aabb_left, + top: _y + __bbox_aabb_top, + right: _x + __bbox_aabb_right, + bottom: _y + __bbox_aabb_bottom, + + width: __bbox_aabb_width, + height: __bbox_aabb_height, + + x0: _x + __bbox_obb_x0, y0: _y + __bbox_obb_y0, + x1: _x + __bbox_obb_x1, y1: _y + __bbox_obb_y1, + x2: _x + __bbox_obb_x2, y2: _y + __bbox_obb_y2, + x3: _x + __bbox_obb_x3, y3: _y + __bbox_obb_y3 + }; + } + + /// @param x + /// @param y + /// @param [typist] + static get_bbox_revealed = function(_x, _y, _typist) + { + //No typist set up, return the whole bounding box + if ((_typist == undefined) && (__tw_reveal == undefined)) + { + return get_bbox(_x, _y); + } + + var _model = __get_model(true); + if (!is_struct(_model)) + { + //No extant model, return an empty bounding box + return { + left: _x, + top: _y, + right: _x, + bottom: _y, + + width: 1, + height: 1, + + x0: _x, y0: _y, + x1: _x, y1: _y, + x2: _x, y2: _y, + x3: _x, y3: _y + }; + } + + if (_typist != undefined) + { + var _bbox = _model.__get_bbox_revealed(__page, 0, _typist.__window_array[_typist.__window_index], __padding_l, __padding_t, __padding_r, __padding_b); + } + else if (__tw_reveal != undefined) + { + var _bbox = _model.__get_bbox_revealed(__page, 0, __tw_reveal, __padding_l, __padding_t, __padding_r, __padding_b); + } + + __update_bbox_matrix(); + var _xscale = __scale_to_box_scale*_model.__fit_scale*__xscale; + var _yscale = __scale_to_box_scale*_model.__fit_scale*__yscale; + + if ((_xscale == 1) && (_yscale == 1) && (__angle == 0)) + { + //Avoid using matrices if we can + var _l = _x - __origin_x + _bbox.left; + var _t = _y - __origin_y + _bbox.top; + var _r = _x - __origin_x + _bbox.right; + var _b = _y - __origin_y + _bbox.bottom; + + var _x0 = _l; var _y0 = _t; + var _x1 = _r; var _y1 = _t; + var _x2 = _l; var _y2 = _b; + var _x3 = _r; var _y3 = _b; + } + else + { + var _l = _bbox.left; + var _t = _bbox.top; + var _r = _bbox.right; + var _b = _bbox.bottom; + + var _vertex = matrix_transform_vertex(__bbox_matrix, _l, _t, 0); var _x0 = _x + _vertex[0]; var _y0 = _y + _vertex[1]; + var _vertex = matrix_transform_vertex(__bbox_matrix, _r, _t, 0); var _x1 = _x + _vertex[0]; var _y1 = _y + _vertex[1]; + var _vertex = matrix_transform_vertex(__bbox_matrix, _l, _b, 0); var _x2 = _x + _vertex[0]; var _y2 = _y + _vertex[1]; + var _vertex = matrix_transform_vertex(__bbox_matrix, _r, _b, 0); var _x3 = _x + _vertex[0]; var _y3 = _y + _vertex[1]; + + var _l = min(_x0, _x1, _x2, _x3); + var _t = min(_y0, _y1, _y2, _y3); + var _r = max(_x0, _x1, _x2, _x3); + var _b = max(_y0, _y1, _y2, _y3); + } + + return { + left: _l, + top: _t, + right: _r, + bottom: _b, + + width: 1 + _r - _l, + height: 1 + _b - _t, + + x0: _x0, y0: _y0, + x1: _x1, y1: _y1, + x2: _x2, y2: _y2, + x3: _x3, y3: _y3 + }; + } + #endregion From 14fc89e10724fef8a9e972fc477f81a195a2b454 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Sun, 13 Feb 2022 17:32:56 +0000 Subject: [PATCH 03/25] Starting on Devanagari support via Krutidev --- Scribble.yyp | 18 +- fonts/fnt_krutidev/fnt_krutidev.old.png | Bin 0 -> 50554 bytes fonts/fnt_krutidev/fnt_krutidev.old.yy | 222 +++++++++ fonts/fnt_krutidev/fnt_krutidev.png | Bin 0 -> 57120 bytes fonts/fnt_krutidev/fnt_krutidev.yy | 256 ++++++++++ objects/obj_test_devangari_basic/Create_0.gml | 3 + objects/obj_test_devangari_basic/Draw_0.gml | 1 + .../obj_test_devangari_basic.yy | 34 ++ rooms/rm_test/rm_test.yy | 4 +- .../UnicodeToKrutidev/UnicodeToKrutidev.gml | 442 ++++++++++++++++++ .../UnicodeToKrutidev/UnicodeToKrutidev.yy | 12 + .../__scribble_class_font.gml | 2 + .../__scribble_font_add_from_project.gml | 21 +- .../__scribble_gen_2_parser.gml | 176 +++---- .../__scribble_gen_3_devanagari.gml | 394 +++++++++++++++- .../__scribble_system/__scribble_system.gml | 6 +- 16 files changed, 1496 insertions(+), 95 deletions(-) create mode 100644 fonts/fnt_krutidev/fnt_krutidev.old.png create mode 100644 fonts/fnt_krutidev/fnt_krutidev.old.yy create mode 100644 fonts/fnt_krutidev/fnt_krutidev.png create mode 100644 fonts/fnt_krutidev/fnt_krutidev.yy create mode 100644 objects/obj_test_devangari_basic/Create_0.gml create mode 100644 objects/obj_test_devangari_basic/Draw_0.gml create mode 100644 objects/obj_test_devangari_basic/obj_test_devangari_basic.yy create mode 100644 scripts/UnicodeToKrutidev/UnicodeToKrutidev.gml create mode 100644 scripts/UnicodeToKrutidev/UnicodeToKrutidev.yy diff --git a/Scribble.yyp b/Scribble.yyp index 3591461b1..7dcd52d85 100644 --- a/Scribble.yyp +++ b/Scribble.yyp @@ -28,7 +28,7 @@ {"id":{"name":"obj_test_scale_to_box_plus_transformation","path":"objects/obj_test_scale_to_box_plus_transformation/obj_test_scale_to_box_plus_transformation.yy",},"order":14,}, {"id":{"name":"obj_test_hash_to_newline","path":"objects/obj_test_hash_to_newline/obj_test_hash_to_newline.yy",},"order":0,}, {"id":{"name":"obj_test_msdf_comparison","path":"objects/obj_test_msdf_comparison/obj_test_msdf_comparison.yy",},"order":6,}, - {"id":{"name":"spr_msdf_notoarabic","path":"sprites/spr_msdf_notoarabic/spr_msdf_notoarabic.yy",},"order":19,}, + {"id":{"name":"spr_msdf_notoarabic","path":"sprites/spr_msdf_notoarabic/spr_msdf_notoarabic.yy",},"order":20,}, {"id":{"name":"obj_test_legacy_typewriter_custom","path":"objects/obj_test_legacy_typewriter_custom/obj_test_legacy_typewriter_custom.yy",},"order":5,}, {"id":{"name":"obj_example_basic","path":"objects/obj_example_basic/obj_example_basic.yy",},"order":1,}, {"id":{"name":"obj_test_padding_fit_to_box","path":"objects/obj_test_padding_fit_to_box/obj_test_padding_fit_to_box.yy",},"order":3,}, @@ -40,7 +40,7 @@ {"id":{"name":"fnt_style_invalid","path":"fonts/fnt_style_invalid/fnt_style_invalid.yy",},"order":13,}, {"id":{"name":"obj_test_default","path":"objects/obj_test_default/obj_test_default.yy",},"order":0,}, {"id":{"name":"scribble_font_scale","path":"scripts/scribble_font_scale/scribble_font_scale.yy",},"order":11,}, - {"id":{"name":"spr_msdf_industrydemi","path":"sprites/spr_msdf_industrydemi/spr_msdf_industrydemi.yy",},"order":18,}, + {"id":{"name":"spr_msdf_industrydemi","path":"sprites/spr_msdf_industrydemi/spr_msdf_industrydemi.yy",},"order":19,}, {"id":{"name":"obj_test_combine_and_scale","path":"objects/obj_test_combine_and_scale/obj_test_combine_and_scale.yy",},"order":3,}, {"id":{"name":"example_dialogue_set_name","path":"scripts/example_dialogue_set_name/example_dialogue_set_name.yy",},"order":5,}, {"id":{"name":"obj_test_newline_left_trim","path":"objects/obj_test_newline_left_trim/obj_test_newline_left_trim.yy",},"order":9,}, @@ -85,6 +85,7 @@ {"id":{"name":"__scribble_config_colours","path":"scripts/__scribble_config_colours/__scribble_config_colours.yy",},"order":2,}, {"id":{"name":"__scribble_class_model","path":"scripts/__scribble_class_model/__scribble_class_model.yy",},"order":2,}, {"id":{"name":"scribble_font_rename","path":"scripts/scribble_font_rename/scribble_font_rename.yy",},"order":1,}, + {"id":{"name":"obj_test_devangari_basic","path":"objects/obj_test_devangari_basic/obj_test_devangari_basic.yy",},"order":0,}, {"id":{"name":"obj_test_debug_draw_bbox","path":"objects/obj_test_debug_draw_bbox/obj_test_debug_draw_bbox.yy",},"order":15,}, {"id":{"name":"obj_test_legacy_typewriter","path":"objects/obj_test_legacy_typewriter/obj_test_legacy_typewriter.yy",},"order":1,}, {"id":{"name":"obj_test_legacy_typewriter_pos","path":"objects/obj_test_legacy_typewriter_pos/obj_test_legacy_typewriter_pos.yy",},"order":6,}, @@ -110,7 +111,7 @@ {"id":{"name":"obj_test_anim_cycle","path":"objects/obj_test_anim_cycle/obj_test_anim_cycle.yy",},"order":7,}, {"id":{"name":"scribble_glyph_set","path":"scripts/scribble_glyph_set/scribble_glyph_set.yy",},"order":4,}, {"id":{"name":"obj_test_typewriter_sound_per_char","path":"objects/obj_test_typewriter_sound_per_char/obj_test_typewriter_sound_per_char.yy",},"order":10,}, - {"id":{"name":"fnt_hebrew","path":"fonts/fnt_hebrew/fnt_hebrew.yy",},"order":20,}, + {"id":{"name":"fnt_hebrew","path":"fonts/fnt_hebrew/fnt_hebrew.yy",},"order":21,}, {"id":{"name":"obj_test_newline","path":"objects/obj_test_newline/obj_test_newline.yy",},"order":8,}, {"id":{"name":"obj_test_reset","path":"objects/obj_test_reset/obj_test_reset.yy",},"order":17,}, {"id":{"name":"obj_test_wrap_very_narrow","path":"objects/obj_test_wrap_very_narrow/obj_test_wrap_very_narrow.yy",},"order":1,}, @@ -162,6 +163,7 @@ {"id":{"name":"__shd_scribble_bake_outline_8dir_2px","path":"shaders/__shd_scribble_bake_outline_8dir_2px/__shd_scribble_bake_outline_8dir_2px.yy",},"order":4,}, {"id":{"name":"obj_test_font_shadow","path":"objects/obj_test_font_shadow/obj_test_font_shadow.yy",},"order":10,}, {"id":{"name":"obj_test_anim_wobble","path":"objects/obj_test_anim_wobble/obj_test_anim_wobble.yy",},"order":4,}, + {"id":{"name":"UnicodeToKrutidev","path":"scripts/UnicodeToKrutidev/UnicodeToKrutidev.yy",},"order":6,}, {"id":{"name":"obj_test_msdf_drop_shadow","path":"objects/obj_test_msdf_drop_shadow/obj_test_msdf_drop_shadow.yy",},"order":3,}, {"id":{"name":"scribble_typewriter_add_character_delay","path":"scripts/scribble_typewriter_add_character_delay/scribble_typewriter_add_character_delay.yy",},"order":6,}, {"id":{"name":"obj_test_msdf_soft_drop_shadow","path":"objects/obj_test_msdf_soft_drop_shadow/obj_test_msdf_soft_drop_shadow.yy",},"order":4,}, @@ -173,6 +175,7 @@ {"id":{"name":"__scribble_gen_6_build_lines","path":"scripts/__scribble_gen_6_build_lines/__scribble_gen_6_build_lines.yy",},"order":7,}, {"id":{"name":"obj_test_typewriter_ignore_delay","path":"objects/obj_test_typewriter_ignore_delay/obj_test_typewriter_ignore_delay.yy",},"order":6,}, {"id":{"name":"obj_test_line_height","path":"objects/obj_test_line_height/obj_test_line_height.yy",},"order":5,}, + {"id":{"name":"fnt_krutidev","path":"fonts/fnt_krutidev/fnt_krutidev.yy",},"order":17,}, {"id":{"name":"obj_test_typewriter_pause","path":"objects/obj_test_typewriter_pause/obj_test_typewriter_pause.yy",},"order":7,}, {"id":{"name":"obj_test_anim_rainbow","path":"objects/obj_test_anim_rainbow/obj_test_anim_rainbow.yy",},"order":3,}, {"id":{"name":"obj_test_surface","path":"objects/obj_test_surface/obj_test_surface.yy",},"order":6,}, @@ -200,7 +203,7 @@ {"id":{"name":"__shd_scribble_msdf","path":"shaders/__shd_scribble_msdf/__shd_scribble_msdf.yy",},"order":1,}, {"id":{"name":"scribble_typewriter_add_event","path":"scripts/scribble_typewriter_add_event/scribble_typewriter_add_event.yy",},"order":5,}, {"id":{"name":"obj_test_blend","path":"objects/obj_test_blend/obj_test_blend.yy",},"order":2,}, - {"id":{"name":"fnt_segoe_ui_12","path":"fonts/fnt_segoe_ui_12/fnt_segoe_ui_12.yy",},"order":21,}, + {"id":{"name":"fnt_segoe_ui_12","path":"fonts/fnt_segoe_ui_12/fnt_segoe_ui_12.yy",},"order":22,}, {"id":{"name":"obj_test_typewriter_custom","path":"objects/obj_test_typewriter_custom/obj_test_typewriter_custom.yy",},"order":9,}, {"id":{"name":"scribble_anim_blink","path":"scripts/scribble_anim_blink/scribble_anim_blink.yy",},"order":9,}, {"id":{"name":"obj_test_pin_alignment","path":"objects/obj_test_pin_alignment/obj_test_pin_alignment.yy",},"order":16,}, @@ -243,7 +246,7 @@ {"id":{"name":"scribble_anim_wave","path":"scripts/scribble_anim_wave/scribble_anim_wave.yy",},"order":1,}, {"id":{"name":"scribble_anim_shake","path":"scripts/scribble_anim_shake/scribble_anim_shake.yy",},"order":2,}, {"id":{"name":"obj_test_stress_stashed","path":"objects/obj_test_stress_stashed/obj_test_stress_stashed.yy",},"order":2,}, - {"id":{"name":"spr_msdf_openhuninn","path":"sprites/spr_msdf_openhuninn/spr_msdf_openhuninn.yy",},"order":17,}, + {"id":{"name":"spr_msdf_openhuninn","path":"sprites/spr_msdf_openhuninn/spr_msdf_openhuninn.yy",},"order":18,}, {"id":{"name":"obj_test_glyph_properties","path":"objects/obj_test_glyph_properties/obj_test_glyph_properties.yy",},"order":5,}, {"id":{"name":"spr_white_coin","path":"sprites/spr_white_coin/spr_white_coin.yy",},"order":3,}, {"id":{"name":"obj_test_fit_to_box","path":"objects/obj_test_fit_to_box/obj_test_fit_to_box.yy",},"order":5,}, @@ -288,8 +291,8 @@ "children": [], }, "RoomOrderNodes": [ - {"roomId":{"name":"rm_example","path":"rooms/rm_example/rm_example.yy",},}, {"roomId":{"name":"rm_test","path":"rooms/rm_test/rm_test.yy",},}, + {"roomId":{"name":"rm_example","path":"rooms/rm_example/rm_example.yy",},}, ], "Folders": [ {"folderPath":"folders/Sprites.yy","order":1,"resourceVersion":"1.0","name":"Sprites","tags":[],"resourceType":"GMFolder",}, @@ -327,7 +330,8 @@ {"folderPath":"folders/Scribble/(System - don't call these functions)/Classes.yy","order":9,"resourceVersion":"1.0","name":"Classes","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Scribble/(System - don't call these functions)/Shaders.yy","order":11,"resourceVersion":"1.0","name":"Shaders","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Test Cases/Language Support/Hebrew.yy","order":7,"resourceVersion":"1.0","name":"Hebrew","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Fonts/Mallangche.yy","order":22,"resourceVersion":"1.0","name":"Mallangche","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Fonts/Mallangche.yy","order":23,"resourceVersion":"1.0","name":"Mallangche","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Language Support/Devanagari.yy","order":8,"resourceVersion":"1.0","name":"Devanagari","tags":[],"resourceType":"GMFolder",}, ], "AudioGroups": [ {"targets":-1,"resourceVersion":"1.3","name":"audiogroup_default","resourceType":"GMAudioGroup",}, diff --git a/fonts/fnt_krutidev/fnt_krutidev.old.png b/fonts/fnt_krutidev/fnt_krutidev.old.png new file mode 100644 index 0000000000000000000000000000000000000000..c674ed46f0cf7a53db30b3eded0a8916e40fbfa8 GIT binary patch literal 50554 zcmd3N=Q~{A7w_o38@>15duMbKoe`o85(%Qm=xy{~BM63w5N$*cf{Yqnf-rhb^g6oh zdw=ilUvS^d?B_XW&0c%$^PD~FQxc4y>W~mJ5CQ-I5e$%o|q?6^J5Z5dGYI0nFy7b7U9Q7M47913wG*d zkYSYD=1&3nF-=AII{9^JJ0CyiDwl5y={@c2f_UV&QF{;1f1^V`{aqFgh zrf|ZD(kF&au96^o>Bi)_EA&gy4TC~U+&Y7lyQ?c1h*e6e20lQ-?7DMiNBUY#EE-2n`r z;R=z^RZ+H^%e>#bQ#{dx0aI7fMAke&4|Aw`L$wo?9}UGary! zUzgFhFjR3TNsWUmsh%qBmPGFZ5cI8m`Qh1hHFaVxoKP*?(Gj#PedZ1F?F$Rm7AnL1 zPUZGoGg2(3t*4&F(<|8m5eZ&>h=-@qUF&$pO;e3<%naYU@7>5V3%_)g1qIMw7r~1M zv!i0K5Ou+-kR1n58beT7w>O1;acXGV`Hc+1_mvxHJPGKfqbH3KdvimKup>yzVfJ{n zbDAlXmjsaksnUD_XhvG7egn@cI;}8)iF6pQ{hbwOa%k^4GehrWWc-Q@D+@n;NNTzL zv;2^w$Q@G}kmpJWAiD5{2#@?G?%e3wz5~YE(F%qf><{fUME3dBfMacO4#gVV;A!;F z7AJm0_5%q8TW7zP7xc11*^|rTBUH_*0UA)@H?Ab0g2WF*wiTXq*ZJU|RMi}ot&q*I zwiR)T)R9o3)9>^OhIBgdf{pTDi%Lu4^Ww~h;8<9 zvYy))JiLY{r^EyA?`@5%WOe1=eQ$esZok?=omk|^!4I%`yds+9(jcl8_N`}vJ@$h3 zr{Cn}cQvL6*FU(6qi!fe0{=EbE!B5GRiaF=v-rwe(ex6Q@Yp%f($H zWoE6zh$9C(AEO!C-2-&@$$bvz79ZiRIs|9FCia5TEob~+^Y>Duw+RRN{R8zEx+Uf- z5~2$loe_D+T5uvTHKcz^tFoh_+xxA!)K_o}F8dx3Pv|YS$aYeuZzXs()S3*7Mz**3 zT-0|ZZ%k=L9v>lKrp~@YXhW6D9SanLQQBEH$vQDML5T5_>{E;j*7U=Z zga-~|x#c^g#HTMLp=v_w3Zi>rZmS~b>#m~I(tyj%U}cL>)c1O7j#{pq-Kpfe!~IpA zgLf)s3F|=t@-w%K){Kcj=t3g!9y|xWX-NPcsCq5j8dgiQ#F2@XI1F^+8qq&9bFal< z!RugTY+cSf{O)ronpL@Y!&1;XyY8&NS`52E#ulXdHO4NW`47+?yW43wej=(AinXN{sul8GeHt-!rLu#CeR(U-I*R_gI?x4anxos?numB1X?(X7u1^(Sx`Z1g0 z-W$aygR93x|7q5U5RfYbr=@$44OYsva}Y-d`6oO$cxUDf+-~JxfhA|X9-?lJ+PGwM z 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%0AYira`} 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 G$Nyi^besDC literal 0 HcmV?d00001 diff --git a/fonts/fnt_krutidev/fnt_krutidev.old.yy b/fonts/fnt_krutidev/fnt_krutidev.old.yy new file mode 100644 index 000000000..0c1361948 --- /dev/null +++ b/fonts/fnt_krutidev/fnt_krutidev.old.yy @@ -0,0 +1,222 @@ +{ + "hinting": 0, + "glyphOperations": 0, + "interpreter": 0, + "pointRounding": 0, + "applyKerning": 0, + "fontName": "Kruti Dev 010", + "styleName": "Regular", + "size": 32.0, + "bold": false, + "italic": false, + "charset": 0, + "AntiAlias": 1, + "first": 0, + "last": 0, + "sampleText": "abcdef ABCDEF\n0123456789 .,<>\"'&!?\nthe quick brown fox jumps over the lazy dog\nTHE QUICK BROWN FOX JUMPS OVER THE LAZY DOG\nDefault character: ▯ (9647)", + "includeTTF": false, + "TTFName": "", + "textureGroupId": { + "name": "Default", + "path": "texturegroups/Default", + }, + "ascenderOffset": 2, + "glyphs": { + "32": {"x":2,"y":2,"w":16,"h":61,"character":32,"shift":16,"offset":0,}, + "33": {"x":417,"y":254,"w":4,"h":61,"character":33,"shift":13,"offset":6,}, + "34": {"x":423,"y":254,"w":14,"h":61,"character":34,"shift":10,"offset":0,}, + "35": {"x":439,"y":254,"w":24,"h":61,"character":35,"shift":23,"offset":0,}, + "36": {"x":465,"y":254,"w":23,"h":61,"character":36,"shift":24,"offset":0,}, + "37": {"x":490,"y":254,"w":4,"h":61,"character":37,"shift":7,"offset":2,}, + "38": {"x":2,"y":317,"w":23,"h":61,"character":38,"shift":24,"offset":0,}, + "39": {"x":27,"y":317,"w":16,"h":61,"character":39,"shift":16,"offset":0,}, + "40": {"x":45,"y":317,"w":6,"h":61,"character":40,"shift":8,"offset":1,}, + "41": {"x":53,"y":317,"w":27,"h":61,"character":41,"shift":27,"offset":0,}, + "42": {"x":82,"y":317,"w":5,"h":61,"character":42,"shift":9,"offset":2,}, + "43": {"x":89,"y":317,"w":4,"h":61,"character":43,"shift":0,"offset":-12,}, + "44": {"x":95,"y":317,"w":20,"h":61,"character":44,"shift":19,"offset":0,}, + "45": {"x":117,"y":317,"w":4,"h":61,"character":45,"shift":7,"offset":2,}, + "46": {"x":123,"y":317,"w":16,"h":61,"character":46,"shift":15,"offset":0,}, + "47": {"x":141,"y":317,"w":16,"h":61,"character":47,"shift":12,"offset":0,}, + "48": {"x":159,"y":317,"w":15,"h":61,"character":48,"shift":17,"offset":1,}, + "49": {"x":176,"y":317,"w":9,"h":61,"character":49,"shift":17,"offset":3,}, + "50": {"x":187,"y":317,"w":16,"h":61,"character":50,"shift":17,"offset":0,}, + "51": {"x":205,"y":317,"w":15,"h":61,"character":51,"shift":17,"offset":1,}, + "52": {"x":399,"y":254,"w":16,"h":61,"character":52,"shift":17,"offset":0,}, + "53": {"x":382,"y":254,"w":15,"h":61,"character":53,"shift":17,"offset":1,}, + "54": {"x":365,"y":254,"w":15,"h":61,"character":54,"shift":17,"offset":1,}, + "55": {"x":154,"y":254,"w":15,"h":61,"character":55,"shift":17,"offset":1,}, + "56": {"x":474,"y":191,"w":15,"h":61,"character":56,"shift":17,"offset":1,}, + "57": {"x":491,"y":191,"w":15,"h":61,"character":57,"shift":17,"offset":1,}, + "58": {"x":2,"y":254,"w":28,"h":61,"character":58,"shift":27,"offset":0,}, + "59": {"x":32,"y":254,"w":22,"h":61,"character":59,"shift":22,"offset":0,}, + "60": {"x":56,"y":254,"w":22,"h":61,"character":60,"shift":21,"offset":0,}, + "61": {"x":80,"y":254,"w":24,"h":61,"character":61,"shift":22,"offset":-1,}, + "62": {"x":106,"y":254,"w":26,"h":61,"character":62,"shift":25,"offset":0,}, + "63": {"x":134,"y":254,"w":18,"h":61,"character":63,"shift":14,"offset":0,}, + "64": {"x":171,"y":254,"w":24,"h":61,"character":64,"shift":33,"offset":5,}, + "65": {"x":360,"y":254,"w":3,"h":61,"character":65,"shift":17,"offset":12,}, + "66": {"x":197,"y":254,"w":22,"h":61,"character":66,"shift":21,"offset":0,}, + "67": {"x":221,"y":254,"w":14,"h":61,"character":67,"shift":10,"offset":0,}, + "68": {"x":237,"y":254,"w":22,"h":61,"character":68,"shift":18,"offset":0,}, + "69": {"x":261,"y":254,"w":16,"h":61,"character":69,"shift":12,"offset":0,}, + "70": {"x":279,"y":254,"w":18,"h":61,"character":70,"shift":14,"offset":0,}, + "71": {"x":299,"y":254,"w":25,"h":61,"character":71,"shift":25,"offset":0,}, + "72": {"x":326,"y":254,"w":16,"h":61,"character":72,"shift":12,"offset":0,}, + "73": {"x":344,"y":254,"w":14,"h":61,"character":73,"shift":9,"offset":0,}, + "74": {"x":222,"y":317,"w":24,"h":61,"character":74,"shift":25,"offset":1,}, + "75": {"x":248,"y":317,"w":26,"h":61,"character":75,"shift":25,"offset":0,}, + "76": {"x":276,"y":317,"w":21,"h":61,"character":76,"shift":16,"offset":-1,}, + "77": {"x":299,"y":317,"w":23,"h":61,"character":77,"shift":22,"offset":0,}, + "78": {"x":340,"y":380,"w":26,"h":61,"character":78,"shift":25,"offset":0,}, + "79": {"x":368,"y":380,"w":14,"h":61,"character":79,"shift":10,"offset":0,}, + "80": {"x":384,"y":380,"w":18,"h":61,"character":80,"shift":14,"offset":0,}, + "81": {"x":404,"y":380,"w":27,"h":61,"character":81,"shift":27,"offset":0,}, + "82": {"x":433,"y":380,"w":16,"h":61,"character":82,"shift":12,"offset":0,}, + "83": {"x":451,"y":380,"w":15,"h":61,"character":83,"shift":0,"offset":-17,}, + "84": {"x":468,"y":380,"w":22,"h":61,"character":84,"shift":17,"offset":0,}, + "85": {"x":492,"y":380,"w":16,"h":61,"character":85,"shift":11,"offset":0,}, + "86": {"x":2,"y":443,"w":22,"h":61,"character":86,"shift":21,"offset":0,}, + "87": {"x":26,"y":443,"w":15,"h":61,"character":87,"shift":1,"offset":-15,}, + "88": {"x":43,"y":443,"w":13,"h":61,"character":88,"shift":12,"offset":0,}, + "89": {"x":58,"y":443,"w":21,"h":61,"character":89,"shift":16,"offset":0,}, + "90": {"x":81,"y":443,"w":8,"h":61,"character":90,"shift":0,"offset":-8,}, + "91": {"x":91,"y":443,"w":24,"h":61,"character":91,"shift":20,"offset":0,}, + "92": {"x":117,"y":443,"w":15,"h":61,"character":92,"shift":17,"offset":1,}, + "93": {"x":134,"y":443,"w":5,"h":61,"character":93,"shift":8,"offset":1,}, + "94": {"x":141,"y":443,"w":6,"h":61,"character":94,"shift":8,"offset":2,}, + "95": {"x":149,"y":443,"w":36,"h":61,"character":95,"shift":35,"offset":0,}, + "96": {"x":187,"y":443,"w":11,"h":61,"character":96,"shift":0,"offset":-11,}, + "97": {"x":334,"y":380,"w":4,"h":61,"character":97,"shift":0,"offset":-5,}, + "98": {"x":200,"y":443,"w":20,"h":61,"character":98,"shift":19,"offset":0,}, + "99": {"x":313,"y":380,"w":19,"h":61,"character":99,"shift":19,"offset":0,}, + "100": {"x":259,"y":380,"w":28,"h":61,"character":100,"shift":27,"offset":0,}, + "101": {"x":324,"y":317,"w":21,"h":61,"character":101,"shift":20,"offset":0,}, + "102": {"x":347,"y":317,"w":26,"h":61,"character":102,"shift":9,"offset":0,}, + "103": {"x":375,"y":317,"w":21,"h":61,"character":103,"shift":19,"offset":0,}, + "104": {"x":398,"y":317,"w":19,"h":61,"character":104,"shift":9,"offset":-9,}, + "105": {"x":419,"y":317,"w":20,"h":61,"character":105,"shift":19,"offset":0,}, + "106": {"x":441,"y":317,"w":18,"h":61,"character":106,"shift":16,"offset":-1,}, + "107": {"x":461,"y":317,"w":12,"h":61,"character":107,"shift":9,"offset":-1,}, + "108": {"x":475,"y":317,"w":27,"h":61,"character":108,"shift":25,"offset":-1,}, + "109": {"x":2,"y":380,"w":25,"h":61,"character":109,"shift":23,"offset":-1,}, + "110": {"x":29,"y":380,"w":22,"h":61,"character":110,"shift":21,"offset":0,}, + "111": {"x":53,"y":380,"w":21,"h":61,"character":111,"shift":19,"offset":-1,}, + "112": {"x":76,"y":380,"w":24,"h":61,"character":112,"shift":23,"offset":0,}, + "113": {"x":102,"y":380,"w":18,"h":61,"character":113,"shift":0,"offset":-17,}, + "114": {"x":122,"y":380,"w":23,"h":61,"character":114,"shift":21,"offset":-1,}, + "115": {"x":147,"y":380,"w":11,"h":61,"character":115,"shift":0,"offset":-14,}, + "116": {"x":160,"y":380,"w":28,"h":61,"character":116,"shift":27,"offset":0,}, + "117": {"x":190,"y":380,"w":22,"h":61,"character":117,"shift":21,"offset":0,}, + "118": {"x":214,"y":380,"w":25,"h":61,"character":118,"shift":25,"offset":0,}, + "119": {"x":241,"y":380,"w":16,"h":61,"character":119,"shift":0,"offset":-10,}, + "120": {"x":449,"y":191,"w":23,"h":61,"character":120,"shift":22,"offset":0,}, + "121": {"x":420,"y":191,"w":27,"h":61,"character":121,"shift":26,"offset":0,}, + "122": {"x":405,"y":191,"w":13,"h":61,"character":122,"shift":0,"offset":-17,}, + "123": {"x":380,"y":65,"w":18,"h":61,"character":123,"shift":13,"offset":0,}, + "124": {"x":2,"y":65,"w":26,"h":61,"character":124,"shift":25,"offset":0,}, + "125": {"x":30,"y":65,"w":21,"h":61,"character":125,"shift":21,"offset":0,}, + "126": {"x":53,"y":65,"w":7,"h":61,"character":126,"shift":0,"offset":-7,}, + "144": {"x":62,"y":65,"w":22,"h":61,"character":144,"shift":21,"offset":0,}, + "160": {"x":86,"y":65,"w":0,"h":61,"character":160,"shift":16,"offset":0,}, + "161": {"x":88,"y":65,"w":15,"h":61,"character":161,"shift":1,"offset":-15,}, + "162": {"x":105,"y":65,"w":11,"h":61,"character":162,"shift":0,"offset":-23,}, + "163": {"x":118,"y":65,"w":29,"h":61,"character":163,"shift":27,"offset":0,}, + "164": {"x":149,"y":65,"w":8,"h":61,"character":164,"shift":9,"offset":0,}, + "165": {"x":159,"y":65,"w":25,"h":61,"character":165,"shift":25,"offset":0,}, + "167": {"x":186,"y":65,"w":8,"h":61,"character":167,"shift":9,"offset":0,}, + "168": {"x":196,"y":65,"w":16,"h":61,"character":168,"shift":9,"offset":-6,}, + "169": {"x":214,"y":65,"w":19,"h":61,"character":169,"shift":9,"offset":-9,}, + "170": {"x":235,"y":65,"w":17,"h":61,"character":170,"shift":1,"offset":-19,}, + "171": {"x":254,"y":65,"w":19,"h":61,"character":171,"shift":14,"offset":-1,}, + "174": {"x":275,"y":65,"w":16,"h":61,"character":174,"shift":9,"offset":-6,}, + "177": {"x":293,"y":65,"w":8,"h":61,"character":177,"shift":1,"offset":-8,}, + "179": {"x":303,"y":65,"w":25,"h":61,"character":179,"shift":25,"offset":0,}, + "180": {"x":330,"y":65,"w":25,"h":61,"character":180,"shift":25,"offset":0,}, + "182": {"x":476,"y":2,"w":20,"h":61,"character":182,"shift":18,"offset":0,}, + "183": {"x":458,"y":2,"w":16,"h":61,"character":183,"shift":15,"offset":1,}, + "184": {"x":439,"y":2,"w":17,"h":61,"character":184,"shift":12,"offset":0,}, + "186": {"x":167,"y":2,"w":20,"h":61,"character":186,"shift":19,"offset":0,}, + "187": {"x":20,"y":2,"w":23,"h":61,"character":187,"shift":24,"offset":0,}, + "188": {"x":45,"y":2,"w":10,"h":61,"character":188,"shift":10,"offset":3,}, + "189": {"x":57,"y":2,"w":10,"h":61,"character":189,"shift":11,"offset":0,}, + "190": {"x":69,"y":2,"w":23,"h":61,"character":190,"shift":24,"offset":0,}, + "191": {"x":94,"y":2,"w":13,"h":61,"character":191,"shift":9,"offset":1,}, + "192": {"x":109,"y":2,"w":13,"h":61,"character":192,"shift":16,"offset":2,}, + "193": {"x":124,"y":2,"w":19,"h":61,"character":193,"shift":19,"offset":0,}, + "195": {"x":145,"y":2,"w":20,"h":61,"character":195,"shift":19,"offset":0,}, + "196": {"x":189,"y":2,"w":24,"h":61,"character":196,"shift":23,"offset":0,}, + "197": {"x":407,"y":2,"w":30,"h":61,"character":197,"shift":29,"offset":0,}, + "198": {"x":215,"y":2,"w":28,"h":61,"character":198,"shift":9,"offset":0,}, + "199": {"x":245,"y":2,"w":27,"h":61,"character":199,"shift":9,"offset":0,}, + "200": {"x":274,"y":2,"w":19,"h":61,"character":200,"shift":9,"offset":-9,}, + "201": {"x":295,"y":2,"w":28,"h":61,"character":201,"shift":9,"offset":0,}, + "202": {"x":325,"y":2,"w":20,"h":61,"character":202,"shift":9,"offset":-9,}, + "203": {"x":347,"y":2,"w":16,"h":61,"character":203,"shift":11,"offset":0,}, + "204": {"x":365,"y":2,"w":17,"h":61,"character":204,"shift":16,"offset":0,}, + "205": {"x":384,"y":2,"w":21,"h":61,"character":205,"shift":20,"offset":0,}, + "206": {"x":357,"y":65,"w":21,"h":61,"character":206,"shift":20,"offset":0,}, + "207": {"x":400,"y":65,"w":23,"h":61,"character":207,"shift":22,"offset":0,}, + "209": {"x":375,"y":191,"w":28,"h":61,"character":209,"shift":27,"offset":0,}, + "210": {"x":425,"y":65,"w":22,"h":61,"character":210,"shift":21,"offset":0,}, + "211": {"x":440,"y":128,"w":25,"h":61,"character":211,"shift":21,"offset":-4,}, + "212": {"x":467,"y":128,"w":23,"h":61,"character":212,"shift":22,"offset":0,}, + "214": {"x":2,"y":191,"w":20,"h":61,"character":214,"shift":16,"offset":0,}, + "216": {"x":24,"y":191,"w":28,"h":61,"character":216,"shift":27,"offset":0,}, + "217": {"x":54,"y":191,"w":19,"h":61,"character":217,"shift":15,"offset":0,}, + "218": {"x":75,"y":191,"w":12,"h":61,"character":218,"shift":11,"offset":0,}, + "219": {"x":89,"y":191,"w":10,"h":61,"character":219,"shift":12,"offset":2,}, + "220": {"x":101,"y":191,"w":19,"h":61,"character":220,"shift":16,"offset":1,}, + "221": {"x":122,"y":191,"w":27,"h":61,"character":221,"shift":27,"offset":0,}, + "222": {"x":151,"y":191,"w":9,"h":61,"character":222,"shift":11,"offset":2,}, + "223": {"x":162,"y":191,"w":9,"h":61,"character":223,"shift":12,"offset":2,}, + "224": {"x":173,"y":191,"w":20,"h":61,"character":224,"shift":19,"offset":0,}, + "225": {"x":195,"y":191,"w":29,"h":61,"character":225,"shift":29,"offset":0,}, + "226": {"x":226,"y":191,"w":21,"h":61,"character":226,"shift":20,"offset":0,}, + "227": {"x":249,"y":191,"w":30,"h":61,"character":227,"shift":29,"offset":0,}, + "228": {"x":281,"y":191,"w":31,"h":61,"character":228,"shift":30,"offset":0,}, + "229": {"x":314,"y":191,"w":15,"h":61,"character":229,"shift":19,"offset":3,}, + "230": {"x":331,"y":191,"w":21,"h":61,"character":230,"shift":21,"offset":0,}, + "231": {"x":354,"y":191,"w":19,"h":61,"character":231,"shift":19,"offset":0,}, + "232": {"x":422,"y":128,"w":16,"h":61,"character":232,"shift":11,"offset":0,}, + "233": {"x":398,"y":128,"w":22,"h":61,"character":233,"shift":22,"offset":0,}, + "234": {"x":375,"y":128,"w":21,"h":61,"character":234,"shift":20,"offset":0,}, + "235": {"x":149,"y":128,"w":21,"h":61,"character":235,"shift":20,"offset":0,}, + "236": {"x":449,"y":65,"w":23,"h":61,"character":236,"shift":22,"offset":0,}, + "237": {"x":474,"y":65,"w":17,"h":61,"character":237,"shift":16,"offset":0,}, + "238": {"x":2,"y":128,"w":25,"h":61,"character":238,"shift":21,"offset":-4,}, + "239": {"x":29,"y":128,"w":23,"h":61,"character":239,"shift":22,"offset":0,}, + "240": {"x":54,"y":128,"w":21,"h":61,"character":240,"shift":20,"offset":0,}, + "241": {"x":77,"y":128,"w":9,"h":61,"character":241,"shift":10,"offset":0,}, + "243": {"x":88,"y":128,"w":29,"h":61,"character":243,"shift":29,"offset":0,}, + "244": {"x":119,"y":128,"w":28,"h":61,"character":244,"shift":27,"offset":0,}, + "245": {"x":172,"y":128,"w":19,"h":61,"character":245,"shift":0,"offset":-17,}, + "246": {"x":351,"y":128,"w":22,"h":61,"character":246,"shift":21,"offset":-1,}, + "247": {"x":193,"y":128,"w":20,"h":61,"character":247,"shift":16,"offset":0,}, + "248": {"x":215,"y":128,"w":13,"h":61,"character":248,"shift":9,"offset":1,}, + "249": {"x":230,"y":128,"w":30,"h":61,"character":249,"shift":29,"offset":0,}, + "338": {"x":262,"y":128,"w":15,"h":61,"character":338,"shift":19,"offset":3,}, + "352": {"x":279,"y":128,"w":17,"h":61,"character":352,"shift":19,"offset":2,}, + "376": {"x":298,"y":128,"w":19,"h":61,"character":376,"shift":15,"offset":0,}, + "402": {"x":319,"y":128,"w":12,"h":61,"character":402,"shift":15,"offset":3,}, + "710": {"x":333,"y":128,"w":16,"h":61,"character":710,"shift":20,"offset":3,}, + "732": {"x":289,"y":380,"w":22,"h":61,"character":732,"shift":21,"offset":-1,}, + "9647": {"x":222,"y":443,"w":26,"h":61,"character":9647,"shift":42,"offset":2,}, + }, + "kerningPairs": [], + "ranges": [ + {"lower":32,"upper":732,}, + {"lower":9647,"upper":9647,}, + ], + "regenerateBitmap": false, + "canGenerateBitmap": true, + "maintainGms1Font": false, + "parent": { + "name": "Fonts", + "path": "folders/Fonts.yy", + }, + "resourceVersion": "1.0", + "name": "fnt_krutidev", + "tags": [], + "resourceType": "GMFont", +} \ No newline at end of file diff --git a/fonts/fnt_krutidev/fnt_krutidev.png b/fonts/fnt_krutidev/fnt_krutidev.png new file mode 100644 index 0000000000000000000000000000000000000000..7765379f7e6deb2325ff1b2241b9261bee425678 GIT binary patch literal 57120 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 Wn-=H~sTw+Ni2TFC=r2RZsQ&;-elunO literal 0 HcmV?d00001 diff --git a/fonts/fnt_krutidev/fnt_krutidev.yy b/fonts/fnt_krutidev/fnt_krutidev.yy new file mode 100644 index 000000000..b7918814a --- /dev/null +++ b/fonts/fnt_krutidev/fnt_krutidev.yy @@ -0,0 +1,256 @@ +{ + "hinting": 0, + "glyphOperations": 0, + "interpreter": 0, + "pointRounding": 0, + "applyKerning": 0, + "fontName": "Kruti Dev 010", + "styleName": "Regular", + "size": 32.0, + "bold": false, + "italic": false, + "charset": 0, + "AntiAlias": 1, + "first": 0, + "last": 0, + "sampleText": "abcdef ABCDEF\n0123456789 .,<>\"'&!?\nthe quick brown fox jumps over the lazy dog\nTHE QUICK BROWN FOX JUMPS OVER THE LAZY DOG\nDefault character: ▯ (9647)", + "includeTTF": false, + "TTFName": "", + "textureGroupId": { + "name": "Default", + "path": "texturegroups/Default", + }, + "ascenderOffset": 2, + "glyphs": { + "32": {"x":2,"y":2,"w":16,"h":61,"character":32,"shift":16,"offset":0,}, + "33": {"x":585,"y":128,"w":4,"h":61,"character":33,"shift":13,"offset":6,}, + "34": {"x":591,"y":128,"w":14,"h":61,"character":34,"shift":10,"offset":0,}, + "35": {"x":607,"y":128,"w":24,"h":61,"character":35,"shift":23,"offset":0,}, + "36": {"x":633,"y":128,"w":23,"h":61,"character":36,"shift":24,"offset":0,}, + "37": {"x":658,"y":128,"w":4,"h":61,"character":37,"shift":7,"offset":2,}, + "38": {"x":664,"y":128,"w":23,"h":61,"character":38,"shift":24,"offset":0,}, + "39": {"x":689,"y":128,"w":16,"h":61,"character":39,"shift":16,"offset":0,}, + "40": {"x":707,"y":128,"w":6,"h":61,"character":40,"shift":8,"offset":1,}, + "41": {"x":715,"y":128,"w":27,"h":61,"character":41,"shift":27,"offset":0,}, + "42": {"x":744,"y":128,"w":5,"h":61,"character":42,"shift":9,"offset":2,}, + "43": {"x":751,"y":128,"w":4,"h":61,"character":43,"shift":0,"offset":-12,}, + "44": {"x":757,"y":128,"w":20,"h":61,"character":44,"shift":19,"offset":0,}, + "45": {"x":779,"y":128,"w":4,"h":61,"character":45,"shift":7,"offset":2,}, + "46": {"x":785,"y":128,"w":16,"h":61,"character":46,"shift":15,"offset":0,}, + "47": {"x":803,"y":128,"w":16,"h":61,"character":47,"shift":12,"offset":0,}, + "48": {"x":821,"y":128,"w":15,"h":61,"character":48,"shift":17,"offset":1,}, + "49": {"x":838,"y":128,"w":9,"h":61,"character":49,"shift":17,"offset":3,}, + "50": {"x":849,"y":128,"w":16,"h":61,"character":50,"shift":17,"offset":0,}, + "51": {"x":867,"y":128,"w":15,"h":61,"character":51,"shift":17,"offset":1,}, + "52": {"x":884,"y":128,"w":16,"h":61,"character":52,"shift":17,"offset":0,}, + "53": {"x":902,"y":128,"w":15,"h":61,"character":53,"shift":17,"offset":1,}, + "54": {"x":568,"y":128,"w":15,"h":61,"character":54,"shift":17,"offset":1,}, + "55": {"x":551,"y":128,"w":15,"h":61,"character":55,"shift":17,"offset":1,}, + "56": {"x":534,"y":128,"w":15,"h":61,"character":56,"shift":17,"offset":1,}, + "57": {"x":276,"y":128,"w":15,"h":61,"character":57,"shift":17,"offset":1,}, + "58": {"x":69,"y":128,"w":28,"h":61,"character":58,"shift":27,"offset":0,}, + "59": {"x":99,"y":128,"w":22,"h":61,"character":59,"shift":22,"offset":0,}, + "60": {"x":123,"y":128,"w":22,"h":61,"character":60,"shift":21,"offset":0,}, + "61": {"x":147,"y":128,"w":24,"h":61,"character":61,"shift":22,"offset":-1,}, + "62": {"x":173,"y":128,"w":26,"h":61,"character":62,"shift":25,"offset":0,}, + "63": {"x":201,"y":128,"w":18,"h":61,"character":63,"shift":14,"offset":0,}, + "64": {"x":221,"y":128,"w":24,"h":61,"character":64,"shift":33,"offset":5,}, + "65": {"x":247,"y":128,"w":3,"h":61,"character":65,"shift":17,"offset":12,}, + "66": {"x":252,"y":128,"w":22,"h":61,"character":66,"shift":21,"offset":0,}, + "67": {"x":293,"y":128,"w":14,"h":61,"character":67,"shift":10,"offset":0,}, + "68": {"x":510,"y":128,"w":22,"h":61,"character":68,"shift":18,"offset":0,}, + "69": {"x":309,"y":128,"w":16,"h":61,"character":69,"shift":12,"offset":0,}, + "70": {"x":327,"y":128,"w":18,"h":61,"character":70,"shift":14,"offset":0,}, + "71": {"x":347,"y":128,"w":25,"h":61,"character":71,"shift":25,"offset":0,}, + "72": {"x":374,"y":128,"w":16,"h":61,"character":72,"shift":12,"offset":0,}, + "73": {"x":392,"y":128,"w":14,"h":61,"character":73,"shift":9,"offset":0,}, + "74": {"x":408,"y":128,"w":24,"h":61,"character":74,"shift":25,"offset":1,}, + "75": {"x":434,"y":128,"w":26,"h":61,"character":75,"shift":25,"offset":0,}, + "76": {"x":462,"y":128,"w":21,"h":61,"character":76,"shift":16,"offset":-1,}, + "77": {"x":485,"y":128,"w":23,"h":61,"character":77,"shift":22,"offset":0,}, + "78": {"x":919,"y":128,"w":26,"h":61,"character":78,"shift":25,"offset":0,}, + "79": {"x":947,"y":128,"w":14,"h":61,"character":79,"shift":10,"offset":0,}, + "80": {"x":963,"y":128,"w":18,"h":61,"character":80,"shift":14,"offset":0,}, + "81": {"x":983,"y":128,"w":27,"h":61,"character":81,"shift":27,"offset":0,}, + "82": {"x":560,"y":191,"w":16,"h":61,"character":82,"shift":12,"offset":0,}, + "83": {"x":578,"y":191,"w":15,"h":61,"character":83,"shift":0,"offset":-17,}, + "84": {"x":595,"y":191,"w":22,"h":61,"character":84,"shift":17,"offset":0,}, + "85": {"x":619,"y":191,"w":16,"h":61,"character":85,"shift":11,"offset":0,}, + "86": {"x":637,"y":191,"w":22,"h":61,"character":86,"shift":21,"offset":0,}, + "87": {"x":661,"y":191,"w":15,"h":61,"character":87,"shift":1,"offset":-15,}, + "88": {"x":678,"y":191,"w":13,"h":61,"character":88,"shift":12,"offset":0,}, + "89": {"x":693,"y":191,"w":21,"h":61,"character":89,"shift":16,"offset":0,}, + "90": {"x":716,"y":191,"w":8,"h":61,"character":90,"shift":0,"offset":-8,}, + "91": {"x":726,"y":191,"w":24,"h":61,"character":91,"shift":20,"offset":0,}, + "92": {"x":752,"y":191,"w":15,"h":61,"character":92,"shift":17,"offset":1,}, + "93": {"x":769,"y":191,"w":5,"h":61,"character":93,"shift":8,"offset":1,}, + "94": {"x":776,"y":191,"w":6,"h":61,"character":94,"shift":8,"offset":2,}, + "95": {"x":784,"y":191,"w":36,"h":61,"character":95,"shift":35,"offset":0,}, + "96": {"x":822,"y":191,"w":11,"h":61,"character":96,"shift":0,"offset":-11,}, + "97": {"x":835,"y":191,"w":4,"h":61,"character":97,"shift":0,"offset":-5,}, + "98": {"x":841,"y":191,"w":20,"h":61,"character":98,"shift":19,"offset":0,}, + "99": {"x":863,"y":191,"w":19,"h":61,"character":99,"shift":19,"offset":0,}, + "100": {"x":884,"y":191,"w":28,"h":61,"character":100,"shift":27,"offset":0,}, + "101": {"x":914,"y":191,"w":21,"h":61,"character":101,"shift":20,"offset":0,}, + "102": {"x":937,"y":191,"w":26,"h":61,"character":102,"shift":9,"offset":0,}, + "103": {"x":537,"y":191,"w":21,"h":61,"character":103,"shift":19,"offset":0,}, + "104": {"x":965,"y":191,"w":19,"h":61,"character":104,"shift":9,"offset":-9,}, + "105": {"x":515,"y":191,"w":20,"h":61,"character":105,"shift":19,"offset":0,}, + "106": {"x":475,"y":191,"w":18,"h":61,"character":106,"shift":16,"offset":-1,}, + "107": {"x":2,"y":191,"w":12,"h":61,"character":107,"shift":9,"offset":-1,}, + "108": {"x":16,"y":191,"w":27,"h":61,"character":108,"shift":25,"offset":-1,}, + "109": {"x":45,"y":191,"w":25,"h":61,"character":109,"shift":23,"offset":-1,}, + "110": {"x":72,"y":191,"w":22,"h":61,"character":110,"shift":21,"offset":0,}, + "111": {"x":96,"y":191,"w":21,"h":61,"character":111,"shift":19,"offset":-1,}, + "112": {"x":119,"y":191,"w":24,"h":61,"character":112,"shift":23,"offset":0,}, + "113": {"x":145,"y":191,"w":18,"h":61,"character":113,"shift":0,"offset":-17,}, + "114": {"x":165,"y":191,"w":23,"h":61,"character":114,"shift":21,"offset":-1,}, + "115": {"x":190,"y":191,"w":11,"h":61,"character":115,"shift":0,"offset":-14,}, + "116": {"x":203,"y":191,"w":28,"h":61,"character":116,"shift":27,"offset":0,}, + "117": {"x":233,"y":191,"w":22,"h":61,"character":117,"shift":21,"offset":0,}, + "118": {"x":257,"y":191,"w":25,"h":61,"character":118,"shift":25,"offset":0,}, + "119": {"x":284,"y":191,"w":16,"h":61,"character":119,"shift":0,"offset":-10,}, + "120": {"x":302,"y":191,"w":23,"h":61,"character":120,"shift":22,"offset":0,}, + "121": {"x":327,"y":191,"w":27,"h":61,"character":121,"shift":26,"offset":0,}, + "122": {"x":356,"y":191,"w":13,"h":61,"character":122,"shift":0,"offset":-17,}, + "123": {"x":371,"y":191,"w":18,"h":61,"character":123,"shift":13,"offset":0,}, + "124": {"x":391,"y":191,"w":26,"h":61,"character":124,"shift":25,"offset":0,}, + "125": {"x":419,"y":191,"w":21,"h":61,"character":125,"shift":21,"offset":0,}, + "126": {"x":442,"y":191,"w":7,"h":61,"character":126,"shift":0,"offset":-7,}, + "144": {"x":451,"y":191,"w":22,"h":61,"character":144,"shift":21,"offset":0,}, + "160": {"x":67,"y":128,"w":0,"h":61,"character":160,"shift":16,"offset":0,}, + "161": {"x":50,"y":128,"w":15,"h":61,"character":161,"shift":1,"offset":-15,}, + "162": {"x":37,"y":128,"w":11,"h":61,"character":162,"shift":0,"offset":-23,}, + "163": {"x":2,"y":65,"w":29,"h":61,"character":163,"shift":27,"offset":0,}, + "164": {"x":587,"y":2,"w":8,"h":61,"character":164,"shift":9,"offset":0,}, + "165": {"x":597,"y":2,"w":25,"h":61,"character":165,"shift":25,"offset":0,}, + "167": {"x":624,"y":2,"w":8,"h":61,"character":167,"shift":9,"offset":0,}, + "168": {"x":634,"y":2,"w":16,"h":61,"character":168,"shift":9,"offset":-6,}, + "169": {"x":652,"y":2,"w":19,"h":61,"character":169,"shift":9,"offset":-9,}, + "170": {"x":673,"y":2,"w":17,"h":61,"character":170,"shift":1,"offset":-19,}, + "171": {"x":692,"y":2,"w":19,"h":61,"character":171,"shift":14,"offset":-1,}, + "174": {"x":713,"y":2,"w":16,"h":61,"character":174,"shift":9,"offset":-6,}, + "177": {"x":731,"y":2,"w":8,"h":61,"character":177,"shift":1,"offset":-8,}, + "179": {"x":741,"y":2,"w":25,"h":61,"character":179,"shift":25,"offset":0,}, + "180": {"x":768,"y":2,"w":25,"h":61,"character":180,"shift":25,"offset":0,}, + "182": {"x":795,"y":2,"w":20,"h":61,"character":182,"shift":18,"offset":0,}, + "183": {"x":817,"y":2,"w":16,"h":61,"character":183,"shift":15,"offset":1,}, + "184": {"x":835,"y":2,"w":17,"h":61,"character":184,"shift":12,"offset":0,}, + "186": {"x":854,"y":2,"w":20,"h":61,"character":186,"shift":19,"offset":0,}, + "187": {"x":876,"y":2,"w":23,"h":61,"character":187,"shift":24,"offset":0,}, + "188": {"x":901,"y":2,"w":10,"h":61,"character":188,"shift":10,"offset":3,}, + "189": {"x":913,"y":2,"w":10,"h":61,"character":189,"shift":11,"offset":0,}, + "190": {"x":925,"y":2,"w":23,"h":61,"character":190,"shift":24,"offset":0,}, + "191": {"x":950,"y":2,"w":13,"h":61,"character":191,"shift":9,"offset":1,}, + "192": {"x":965,"y":2,"w":13,"h":61,"character":192,"shift":16,"offset":2,}, + "193": {"x":566,"y":2,"w":19,"h":61,"character":193,"shift":19,"offset":0,}, + "195": {"x":544,"y":2,"w":20,"h":61,"character":195,"shift":19,"offset":0,}, + "196": {"x":518,"y":2,"w":24,"h":61,"character":196,"shift":23,"offset":0,}, + "197": {"x":235,"y":2,"w":30,"h":61,"character":197,"shift":29,"offset":0,}, + "198": {"x":20,"y":2,"w":28,"h":61,"character":198,"shift":9,"offset":0,}, + "199": {"x":50,"y":2,"w":27,"h":61,"character":199,"shift":9,"offset":0,}, + "200": {"x":79,"y":2,"w":19,"h":61,"character":200,"shift":9,"offset":-9,}, + "201": {"x":100,"y":2,"w":28,"h":61,"character":201,"shift":9,"offset":0,}, + "202": {"x":130,"y":2,"w":20,"h":61,"character":202,"shift":9,"offset":-9,}, + "203": {"x":152,"y":2,"w":16,"h":61,"character":203,"shift":11,"offset":0,}, + "204": {"x":170,"y":2,"w":17,"h":61,"character":204,"shift":16,"offset":0,}, + "205": {"x":189,"y":2,"w":21,"h":61,"character":205,"shift":20,"offset":0,}, + "206": {"x":212,"y":2,"w":21,"h":61,"character":206,"shift":20,"offset":0,}, + "207": {"x":267,"y":2,"w":23,"h":61,"character":207,"shift":22,"offset":0,}, + "209": {"x":488,"y":2,"w":28,"h":61,"character":209,"shift":27,"offset":0,}, + "210": {"x":292,"y":2,"w":22,"h":61,"character":210,"shift":21,"offset":0,}, + "211": {"x":316,"y":2,"w":25,"h":61,"character":211,"shift":21,"offset":-4,}, + "212": {"x":343,"y":2,"w":23,"h":61,"character":212,"shift":22,"offset":0,}, + "214": {"x":368,"y":2,"w":20,"h":61,"character":214,"shift":16,"offset":0,}, + "216": {"x":390,"y":2,"w":28,"h":61,"character":216,"shift":27,"offset":0,}, + "217": {"x":420,"y":2,"w":19,"h":61,"character":217,"shift":15,"offset":0,}, + "218": {"x":441,"y":2,"w":12,"h":61,"character":218,"shift":11,"offset":0,}, + "219": {"x":455,"y":2,"w":10,"h":61,"character":219,"shift":12,"offset":2,}, + "220": {"x":467,"y":2,"w":19,"h":61,"character":220,"shift":16,"offset":1,}, + "221": {"x":980,"y":2,"w":27,"h":61,"character":221,"shift":27,"offset":0,}, + "222": {"x":33,"y":65,"w":9,"h":61,"character":222,"shift":11,"offset":2,}, + "223": {"x":26,"y":128,"w":9,"h":61,"character":223,"shift":12,"offset":2,}, + "224": {"x":44,"y":65,"w":20,"h":61,"character":224,"shift":19,"offset":0,}, + "225": {"x":521,"y":65,"w":29,"h":61,"character":225,"shift":29,"offset":0,}, + "226": {"x":552,"y":65,"w":21,"h":61,"character":226,"shift":20,"offset":0,}, + "227": {"x":575,"y":65,"w":30,"h":61,"character":227,"shift":29,"offset":0,}, + "228": {"x":607,"y":65,"w":31,"h":61,"character":228,"shift":30,"offset":0,}, + "229": {"x":640,"y":65,"w":15,"h":61,"character":229,"shift":19,"offset":3,}, + "230": {"x":657,"y":65,"w":21,"h":61,"character":230,"shift":21,"offset":0,}, + "231": {"x":680,"y":65,"w":19,"h":61,"character":231,"shift":19,"offset":0,}, + "232": {"x":701,"y":65,"w":16,"h":61,"character":232,"shift":11,"offset":0,}, + "233": {"x":719,"y":65,"w":22,"h":61,"character":233,"shift":22,"offset":0,}, + "234": {"x":743,"y":65,"w":21,"h":61,"character":234,"shift":20,"offset":0,}, + "235": {"x":766,"y":65,"w":21,"h":61,"character":235,"shift":20,"offset":0,}, + "236": {"x":789,"y":65,"w":23,"h":61,"character":236,"shift":22,"offset":0,}, + "237": {"x":814,"y":65,"w":17,"h":61,"character":237,"shift":16,"offset":0,}, + "238": {"x":833,"y":65,"w":25,"h":61,"character":238,"shift":21,"offset":-4,}, + "239": {"x":860,"y":65,"w":23,"h":61,"character":239,"shift":22,"offset":0,}, + "240": {"x":885,"y":65,"w":21,"h":61,"character":240,"shift":20,"offset":0,}, + "241": {"x":908,"y":65,"w":9,"h":61,"character":241,"shift":10,"offset":0,}, + "243": {"x":919,"y":65,"w":29,"h":61,"character":243,"shift":29,"offset":0,}, + "244": {"x":950,"y":65,"w":28,"h":61,"character":244,"shift":27,"offset":0,}, + "245": {"x":980,"y":65,"w":19,"h":61,"character":245,"shift":0,"offset":-17,}, + "246": {"x":2,"y":128,"w":22,"h":61,"character":246,"shift":21,"offset":-1,}, + "247": {"x":499,"y":65,"w":20,"h":61,"character":247,"shift":16,"offset":0,}, + "248": {"x":484,"y":65,"w":13,"h":61,"character":248,"shift":9,"offset":1,}, + "249": {"x":452,"y":65,"w":30,"h":61,"character":249,"shift":29,"offset":0,}, + "338": {"x":238,"y":65,"w":15,"h":61,"character":338,"shift":19,"offset":3,}, + "352": {"x":66,"y":65,"w":17,"h":61,"character":352,"shift":19,"offset":2,}, + "376": {"x":85,"y":65,"w":19,"h":61,"character":376,"shift":15,"offset":0,}, + "402": {"x":106,"y":65,"w":12,"h":61,"character":402,"shift":15,"offset":3,}, + "710": {"x":120,"y":65,"w":16,"h":61,"character":710,"shift":20,"offset":3,}, + "732": {"x":138,"y":65,"w":22,"h":61,"character":732,"shift":21,"offset":-1,}, + "8208": {"x":162,"y":65,"w":4,"h":61,"character":8208,"shift":7,"offset":2,}, + "8211": {"x":168,"y":65,"w":22,"h":61,"character":8211,"shift":21,"offset":0,}, + "8212": {"x":192,"y":65,"w":28,"h":61,"character":8212,"shift":27,"offset":0,}, + "8216": {"x":222,"y":65,"w":14,"h":61,"character":8216,"shift":10,"offset":0,}, + "8217": {"x":255,"y":65,"w":14,"h":61,"character":8217,"shift":10,"offset":0,}, + "8218": {"x":434,"y":65,"w":16,"h":61,"character":8218,"shift":9,"offset":-5,}, + "8220": {"x":271,"y":65,"w":16,"h":61,"character":8220,"shift":16,"offset":0,}, + "8221": {"x":289,"y":65,"w":16,"h":61,"character":8221,"shift":16,"offset":0,}, + "8222": {"x":307,"y":65,"w":16,"h":61,"character":8222,"shift":19,"offset":2,}, + "8224": {"x":325,"y":65,"w":15,"h":61,"character":8224,"shift":18,"offset":3,}, + "8225": {"x":342,"y":65,"w":14,"h":61,"character":8225,"shift":18,"offset":3,}, + "8230": {"x":358,"y":65,"w":13,"h":61,"character":8230,"shift":17,"offset":3,}, + "8240": {"x":373,"y":65,"w":19,"h":61,"character":8240,"shift":20,"offset":1,}, + "8249": {"x":394,"y":65,"w":17,"h":61,"character":8249,"shift":19,"offset":2,}, + "8250": {"x":413,"y":65,"w":19,"h":61,"character":8250,"shift":0,"offset":-17,}, + "8482": {"x":495,"y":191,"w":18,"h":61,"character":8482,"shift":12,"offset":0,}, + "9647": {"x":986,"y":191,"w":26,"h":61,"character":9647,"shift":42,"offset":2,}, + }, + "kerningPairs": [], + "ranges": [ + {"lower":32,"upper":126,}, + {"lower":144,"upper":144,}, + {"lower":160,"upper":249,}, + {"lower":338,"upper":338,}, + {"lower":352,"upper":352,}, + {"lower":376,"upper":376,}, + {"lower":402,"upper":402,}, + {"lower":710,"upper":710,}, + {"lower":732,"upper":732,}, + {"lower":8208,"upper":8208,}, + {"lower":8211,"upper":8212,}, + {"lower":8216,"upper":8218,}, + {"lower":8220,"upper":8225,}, + {"lower":8230,"upper":8230,}, + {"lower":8240,"upper":8240,}, + {"lower":8249,"upper":8250,}, + {"lower":8482,"upper":8482,}, + {"lower":9647,"upper":9647,}, + ], + "regenerateBitmap": false, + "canGenerateBitmap": true, + "maintainGms1Font": false, + "parent": { + "name": "Fonts", + "path": "folders/Fonts.yy", + }, + "resourceVersion": "1.0", + "name": "fnt_krutidev", + "tags": [ + "scribble krutidev", + ], + "resourceType": "GMFont", +} \ No newline at end of file diff --git a/objects/obj_test_devangari_basic/Create_0.gml b/objects/obj_test_devangari_basic/Create_0.gml new file mode 100644 index 000000000..3ec4a7f1e --- /dev/null +++ b/objects/obj_test_devangari_basic/Create_0.gml @@ -0,0 +1,3 @@ +scribble_font_set_default("fnt_krutidev"); +unicode = "चाह नहीं मैं सुरबाला के गहनों में गूँथा जाऊँ"; +krutidev = UnicodeToKrutidev(unicode); \ No newline at end of file diff --git a/objects/obj_test_devangari_basic/Draw_0.gml b/objects/obj_test_devangari_basic/Draw_0.gml new file mode 100644 index 000000000..4cf0afc67 --- /dev/null +++ b/objects/obj_test_devangari_basic/Draw_0.gml @@ -0,0 +1 @@ +scribble(krutidev).draw(10, 10); \ No newline at end of file diff --git a/objects/obj_test_devangari_basic/obj_test_devangari_basic.yy b/objects/obj_test_devangari_basic/obj_test_devangari_basic.yy new file mode 100644 index 000000000..f8149ce45 --- /dev/null +++ b/objects/obj_test_devangari_basic/obj_test_devangari_basic.yy @@ -0,0 +1,34 @@ +{ + "spriteId": null, + "solid": false, + "visible": true, + "spriteMaskId": null, + "persistent": false, + "parentObjectId": null, + "physicsObject": false, + "physicsSensor": false, + "physicsShape": 1, + "physicsGroup": 1, + "physicsDensity": 0.5, + "physicsRestitution": 0.1, + "physicsLinearDamping": 0.1, + "physicsAngularDamping": 0.1, + "physicsFriction": 0.2, + "physicsStartAwake": true, + "physicsKinematic": false, + "physicsShapePoints": [], + "eventList": [ + {"isDnD":false,"eventNum":0,"eventType":0,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + {"isDnD":false,"eventNum":0,"eventType":8,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + ], + "properties": [], + "overriddenProperties": [], + "parent": { + "name": "Devanagari", + "path": "folders/Test Cases/Language Support/Devanagari.yy", + }, + "resourceVersion": "1.0", + "name": "obj_test_devangari_basic", + "tags": [], + "resourceType": "GMObject", +} \ No newline at end of file diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index fc87983ca..ca0d0c6a1 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -14,7 +14,7 @@ ], "layers": [ {"instances":[ - {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_font_shadow","path":"objects/obj_test_font_shadow/obj_test_font_shadow.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_3EECEFDA","tags":[],"resourceType":"GMRInstance",}, + {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_devangari_basic","path":"objects/obj_test_devangari_basic/obj_test_devangari_basic.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_49C40133","tags":[],"resourceType":"GMRInstance",}, ],"visible":true,"depth":0,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Example","tags":[],"resourceType":"GMRInstanceLayer",}, {"spriteId":null,"colour":4288702270,"x":0,"y":0,"htiled":false,"vtiled":false,"hspeed":0.0,"vspeed":0.0,"stretch":false,"animationFPS":15.0,"animationSpeedType":0,"userdefinedAnimFPS":false,"visible":true,"depth":100,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Background","tags":[],"resourceType":"GMRBackgroundLayer",}, ], @@ -22,7 +22,7 @@ "creationCodeFile": "", "inheritCode": false, "instanceCreationOrder": [ - {"name":"inst_3EECEFDA","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_49C40133","path":"rooms/rm_test/rm_test.yy",}, ], "inheritCreationOrder": false, "sequenceId": null, diff --git a/scripts/UnicodeToKrutidev/UnicodeToKrutidev.gml b/scripts/UnicodeToKrutidev/UnicodeToKrutidev.gml new file mode 100644 index 000000000..7ed69ec42 --- /dev/null +++ b/scripts/UnicodeToKrutidev/UnicodeToKrutidev.gml @@ -0,0 +1,442 @@ +/// Unicode to Krutidev +/// @jujuadams 2022-01-29 +/// +/// Krutidev is an old font format that allows for Devanagari ("Hindi") to be rendered without relying +/// on GSUB and GPOS tables found in modern .ttf font files. GameMaker doesn't allow us to access GPOS +/// and GSUB tables so this is the best we have until someone puts together a .ttf file reader. +/// +/// Krutidev works by inserting Devanagari glyphs into a font by overwriting Latin character slots. +/// For example, "k" is replaced by "ा". Devanagari glyphs can get quite complicated, for example "ह्न" +/// is made up of three Unicode characters but is represented in Krutidev using "à". +/// +/// This function converts Unicode-formatted Devanagari into the necessary Latin characters so that +/// when the outputted string is rendered using a Krutidev font the Devanagari glyphs are comfortably +/// readable to the player. +/// +/// There are, of course, more Devanagari glyph variants than there are Latin characters. This means +/// that Krutidev fonts need to be set up with an expanded range of glyphs. Judging by the sample font +/// I found (Krutidev 010), the glyph ranges required are: +/// 32 -> 126 0x0020 -> 0x007E +/// 144 0x0090 +/// 160 -> 249 0x00A0 -> 0x00F9 +/// 338 0x0152 +/// 352 0x0160 +/// 376 0x0178 +/// 402 0x0192 +/// 710 0x02C6 +/// 732 0x02DC +/// 8208 0x2010 +/// 8211 -> 8212 0x2013 -> 0x2014 +/// 8216 -> 8218 0x2018 -> 0x201A +/// 8220 -> 8225 0x201C -> 0x2021 +/// 8230 0x2026 +/// 8240 0x2030 +/// 8249 -> 8250 0x2039 -> 0x203A +/// 8482 0x2122 +/// This list may not be exhaustive. I highly recommend grabbing FontForge to help determined what +/// glyphs are available in your font of choice. +/// +/// Using Krutidev to render Devanagari has drawbacks: +/// 1) Only Krutidev fonts can be used with Krutidev-formatted text. There seem to be a *lot* of +/// Krutidev fonts out there but that may dry up over time. I found a website that seems to +/// host a bazillion Krutidev fonts: https://www.wfonts.com/search?kwd=Kruti+Dev +/// 2) Krutidev doesn't have a lot of the fancier Devanagari glyphs. I am unsure exactly what is +/// missing - I'm not a native Hindi speaker - so don't be surprised if some text doesn't look +/// quite right to people familiar with the language. +/// 3) Since Krutidev fonts replace Western characters with Devanagari glyphs, this means it is +/// not possible to draw Latin script and Devanagari script from the same font. This is a bit +/// of a pain but can be worked around if you're desperate. +/// 4) Setting Krutidev font glyph ranges is a faff. Not the worst thing in the world, but worth +/// bearing in mind. +/// +/// @param unicodeString + + + +#region Build find-replace lookup table + +var _unicodeSourceArray = [ + "‘", "’", "“", "”", "(", ")", "{", "}", "=", "।", "?", "-", "µ", "॰", ",", ".", + "०", "१", "२", "३", "४", "५", "६", "७", "८", "९", "x", + + "फ़्", "क़", "ख़", "ग़", "ज़्", "ज़", "ड़", "ढ़", "फ़", "य़", "ऱ", "ऩ", + "त्त्", "त्त", "क्त", "दृ", "कृ", + + "ह्न", "ह्य", "हृ", "ह्म", "ह्र", "ह्", "द्द", "क्ष्", "क्ष", "त्र्", "त्र","ज्ञ", + "छ्य", "ट्य", "ठ्य", "ड्य", "ढ्य", "द्य","द्व", + "श्र", "ट्र", "ड्र", "ढ्र", "छ्र", "क्र", "फ्र", "द्र", "प्र", "ग्र", "रु", "रू", + "्र", + + "ओ", "औ", "आ", "अ", "ई", "इ", "उ", "ऊ", "ऐ", "ए", "ऋ", + + "क्", "क", "क्क", "ख्", "ख", "ग्", "ग", "घ्", "घ", "ङ", + "चै", "च्", "च", "छ", "ज्", "ज", "झ्", "झ", "ञ", + + "ट्ट", "ट्ठ", "ट", "ठ", "ड्ड", "ड्ढ", "ड", "ढ", "ण्", "ण", + "त्", "त", "थ्", "थ", "द्ध", "द", "ध्", "ध", "न्", "न", + + "प्", "प", "फ्", "फ", "ब्", "ब", "भ्", "भ", "म्", "म", + "य्", "य", "र", "ल्", "ल", "ळ", "व्", "व", + "श्", "श", "ष्", "ष", "स्", "स", "ह", + + "ऑ", "ॉ", "ो", "ौ", "ा", "ी", "ु", "ू", "ृ", "े", "ै", + "ं", "ँ", "ः", "ॅ", "ऽ", chr(0x94D), //virama +]; + +var _krutidevSourceArray = [ + "^", "*", "Þ", "ß", "¼", "½", "¿", "À", "¾", "A", "\\", "&", "&", "Œ", "]","-", + "å", "ƒ", "„", "…", "†", "‡", "ˆ", "‰", "Š", "‹","Û", + + "¶", "d", "[k", "x", "T", "t", "M+", "<+", "Q", ";", "j", "u", + "Ù", "Ùk", "Dr", "–", "—", + + "à", "á", "â", "ã", "ºz", "º", "í", "{", "{k", "«", "=","K", + "Nî", "Vî", "Bî", "Mî", "<î", "|","}", + "J", "Vª", "Mª", "<ªª", "Nª", "Ø", "Ý", "æ", "ç", "xz", "#", ":", + "z", + + "vks", "vkS", "vk", "v", "bZ", "b", "m", "Å", ",s", ",", "_", + + "D", "d", "ô", "[", "[k", "X", "x", "?", "?k", "³", + "pkS", "P", "p", "N", "T", "t", "÷", ">", "¥", + + "ê", "ë", "V", "B", "ì", "ï", "M", "<", ".", ".k", + "R", "r", "F", "Fk", ")", "n", "/", "/k", "U", "u", + + "I", "i", "¶", "Q", "C", "c", "H", "Hk", "E", "e", + "¸", ";", "j", "Y", "y", "G", "O", "o", + "'", "'k", "\"", "\"k", "L", "l", "g", + + "v‚", "‚", "ks", "kS", "k", "h", "q", "w", "`", "s", "S", + "a", "¡", "%", "W", "·", "~", +]; + +//Use a ds_map rather than a struct since our keys will be integers +global.__scribble_krutidev_lookup_map = ds_map_create(); + +var _i = 0; +repeat(array_length(_unicodeSourceArray)) +{ + var _string = _unicodeSourceArray[_i]; + + var _searchInteger = 0; + var _j = string_length(_string); + repeat(_j) + { + _searchInteger = (_searchInteger << 16) | ord(string_char_at(_string, _j)); + --_j; + } + + var _string = _krutidevSourceArray[_i]; + var _writeArray = []; + var _j = 1; + repeat(string_length(_string)) + { + array_push(_writeArray, ord(string_char_at(_string, _j))); + ++_j; + } + + global.__scribble_krutidev_lookup_map[? _searchInteger] = _writeArray; + + ++_i; +} + +#endregion + + + +#region Build matra lookup table + +//Use a ds_map rather than a struct since our keys are integers +global.__scribble_krutidev_matra_lookup_map = ds_map_create(); +global.__scribble_krutidev_matra_lookup_map[? 58] = true; +global.__scribble_krutidev_matra_lookup_map[? 2305] = true; +global.__scribble_krutidev_matra_lookup_map[? 2306] = true; +global.__scribble_krutidev_matra_lookup_map[? 2366] = true; +global.__scribble_krutidev_matra_lookup_map[? 2367] = true; +global.__scribble_krutidev_matra_lookup_map[? 2368] = true; +global.__scribble_krutidev_matra_lookup_map[? 2369] = true; +global.__scribble_krutidev_matra_lookup_map[? 2370] = true; +global.__scribble_krutidev_matra_lookup_map[? 2371] = true; +global.__scribble_krutidev_matra_lookup_map[? 2373] = true; +global.__scribble_krutidev_matra_lookup_map[? 2375] = true; +global.__scribble_krutidev_matra_lookup_map[? 2376] = true; +global.__scribble_krutidev_matra_lookup_map[? 2379] = true; +global.__scribble_krutidev_matra_lookup_map[? 2380] = true; + +#endregion + + + +function UnicodeToKrutidev(_inString) +{ + //Convert the string into an array + var _stringLength = string_length(_inString); + //Pad the end because we'll need to read beyond the end of the string during the final find-replace + //We pad with 0xFFFF to avoid accidentally making incorrect substring matches later + var _charArray = array_create(_stringLength + 4, 0xFFFF); + + var _i = 0; + repeat(_stringLength) + { + _charArray[@ _i] = ord(string_char_at(_inString, _i+1)); + ++_i; + } + + + + #region Transform quotes and split up nukta ligatures + + var _inSingleQuote = false; + var _inDoubleQuote = false; + var _i = 0; + repeat(_stringLength) + { + switch(_charArray[_i]) + { + //Set up alternating single quote marks + case ord("'"): + _inSingleQuote = !_inSingleQuote; + _charArray[@ _i] = _inSingleQuote? ord("^") : ord("*"); + break; + + //Set up alternating double quote marks + case ord("\""): + _inDoubleQuote = !_inDoubleQuote; + _charArray[@ _i] = _inDoubleQuote? ord("ß") : ord("Þ"); + break; + + //Split up nukta ligatures into their componant parts + case ord("ऩ"): + _charArray[@ _i] = ord("न"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + + case ord("ऱ"): + _charArray[@ _i] = ord("र"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + + case ord("क़"): + _charArray[@ _i] = ord("क"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + + case ord("ख़"): + _charArray[@ _i] = ord("ख"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + + case ord("ग़"): + _charArray[@ _i] = ord("ग"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + + case ord("ज़"): + _charArray[@ _i] = ord("ज"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + + case ord("ड़"): + _charArray[@ _i] = ord("ड"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + + case ord("ढ़"): + _charArray[@ _i] = ord("ढ"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + + case ord("फ़"): + _charArray[@ _i] = ord("फ"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + + case ord("य़"): + _charArray[@ _i] = ord("य"); + array_insert(_charArray, _i+1, 0x093C); ++_i; ++_stringLength; //Nukta + break; + } + + ++_i; + } + + #endregion + + + + #region Reposition ि to the front of the word and replace it with an "f" + + //TODO - Log where ि is found during the nukta ligature sweep + var _i = 1; //Start at the second char because we don't care if the string starts with 0x093F (Vowel Sign I) + repeat(_stringLength-1) + { + var _char = _charArray[_i]; + if (_char == ord("ि")) + { + var _fPosition = _i; + + //If we find a virama behind us keep tracking backwards + //We go two indexes backwards because virama (should) always follows another character + var _j = _i - 1; + while((_j >= 0) && (_charArray[_j] == 0x094D)) _j -= 2; + + array_delete(_charArray, _fPosition, 1); + array_insert(_charArray, _j, ord("f")); + + _i = _fPosition; + } + + ++_i; + } + + #endregion + + + + #region Move र् (ra + virama) after matras + + var _matraLookupMap = global.__scribble_krutidev_matra_lookup_map; + + //Using a for-loop here as _stringLength may change + for(var _i = 0; _i < _stringLength; ++_i) + { + //TODO - Log where ra-virama is found during the nukta ligature sweep + if ((_charArray[_i] == ord("र")) && (_charArray[_i+1] == 0x094D)) //Ra followed by virama + { + var _probablePosition = _i + 3; + + var _charRight = _charArray[_probablePosition]; + while(ds_map_exists(_matraLookupMap, _charRight)) + { + _probablePosition++; + _charRight = _charArray[_probablePosition]; + } + + array_insert(_charArray, _probablePosition, ord("Z")); + array_delete(_charArray, _i, 2); + + --_stringLength; + } + } + + #endregion + + + + #region Perform bulk find-replace + + var _lookupMap = global.__scribble_krutidev_lookup_map; + + //Create a 64-bit minibuffer + //Fortunately all the characters we're looking for fit into 16 bits and we only need to look for 4 at a time + var _oneChar = 0x0000; + var _twoChar = ((_charArray[0] & 0xFFFF) << 16); + var _threeChar = _twoChar | ((_charArray[1] & 0xFFFF) << 32); + var _fourChar = _threeChar | ((_charArray[2] & 0xFFFF) << 48); + + //Using a for-loop here as _stringLength may change + for(var _i = 0; _i < _stringLength; ++_i;) + { + _oneChar = _twoChar >> 16; + _twoChar = _threeChar >> 16; + _threeChar = _fourChar >> 16; + _fourChar = _threeChar | ((_charArray[_i + 3] & 0xFFFF) << 48); + + //Try to find a matching substring + var _foundLength = 4; + var _replacementArray = _lookupMap[? _fourChar]; + + if (_replacementArray == undefined) + { + _foundLength = 3; + _replacementArray = _lookupMap[? _threeChar]; + + if (_replacementArray == undefined) + { + _foundLength = 2; + _replacementArray = _lookupMap[? _twoChar]; + + if (_replacementArray == undefined) + { + _foundLength = 1; + _replacementArray = _lookupMap[? _oneChar]; + } + } + } + + //Perform a character replacement if we found any matching substring + if (_replacementArray != undefined) + { + var _replacementLength = array_length(_replacementArray); + + if ((_foundLength == 1) && (_replacementLength == 1)) + { + //Shortcut for the most common replacement operation + _charArray[@ _i] = _replacementArray[0]; + } + else + { + //Heavyweight general replacement code... we want to avoid as many delete/insert commands as + //possible as it causes lots of reallocation in the background + + //Copy over as much data as possible from one array + var _copyCount = min(_foundLength, _replacementLength); + array_copy(_charArray, _i, _replacementArray, 0, _copyCount); + + if (_foundLength > _replacementLength) + { + //If we're replacing with fewer characters than we found then we need to delete some characters + array_delete(_charArray, _i + _copyCount, _foundLength - _replacementLength); + } + else + { + //Otherwise, we're adding characters to the array so we have to insert some characters + switch(_replacementLength - _foundLength) + { + case 1: + array_insert(_charArray, _i + _copyCount, _replacementArray[_copyCount]); + break; + + //I'm not sure the 2 or 3 case ever happens but we should cover it just in case + case 2: + array_insert(_charArray, _i + _copyCount, + _replacementArray[_copyCount ], + _replacementArray[_copyCount+1]); + break; + + case 3: + array_insert(_charArray, _i + _copyCount, + _replacementArray[_copyCount ], + _replacementArray[_copyCount+1], + _replacementArray[_copyCount+2]); + break; + } + } + + _i += _replacementLength - 1; //Off-by-one to account for ++_i in the for-loop + _stringLength += _replacementLength - _foundLength; + + //Recalculate our minibuffer since we've messed around with the array a lot + _twoChar = ((_charArray[_i+1] & 0xFFFF) << 16); + _threeChar = _twoChar | ((_charArray[_i+2] & 0xFFFF) << 32); + _fourChar = _threeChar | ((_charArray[_i+3] & 0xFFFF) << 48); + } + } + } + + #endregion + + + + //Convert the array back into a string + var _outString = ""; + var _i = 0; + repeat(_stringLength) + { + _outString += chr(_charArray[_i]); + ++_i; + } + + return _outString; +} \ No newline at end of file diff --git a/scripts/UnicodeToKrutidev/UnicodeToKrutidev.yy b/scripts/UnicodeToKrutidev/UnicodeToKrutidev.yy new file mode 100644 index 000000000..0958834b2 --- /dev/null +++ b/scripts/UnicodeToKrutidev/UnicodeToKrutidev.yy @@ -0,0 +1,12 @@ +{ + "isDnD": false, + "isCompatibility": false, + "parent": { + "name": "Scribble", + "path": "Scribble.yyp", + }, + "resourceVersion": "1.0", + "name": "UnicodeToKrutidev", + "tags": [], + "resourceType": "GMScript", +} \ No newline at end of file diff --git a/scripts/__scribble_class_font/__scribble_class_font.gml b/scripts/__scribble_class_font/__scribble_class_font.gml index 33040c75c..f4b82b319 100644 --- a/scripts/__scribble_class_font/__scribble_class_font.gml +++ b/scripts/__scribble_class_font/__scribble_class_font.gml @@ -10,6 +10,8 @@ function __scribble_class_font(_name, _glyph_count, _msdf) constructor __glyph_data_grid = ds_grid_create(_glyph_count, SCRIBBLE_GLYPH.__SIZE); __glyphs_map = ds_map_create(); + __is_krutidev = false; + __msdf = _msdf; __msdf_pxrange = undefined; __superfont = false; diff --git a/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml b/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml index 97c3b7c7e..94dc9fdd1 100644 --- a/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml +++ b/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml @@ -18,6 +18,22 @@ function __scribble_font_add_from_project(_font) global.__scribble_default_font = _name; } + //Check tags to see if this font is a Krutidev font + var _is_krutidev = false; + var _tagsArray = asset_get_tags(_font, asset_font); + var _i = 0; + repeat(array_length(_tagsArray)) + { + var _tag = _tagsArray[_i]; + if ((_tag == "scribble krutidev") || (_tag == "Scribble krutidev") || (_tag == "Scribble Krutidev")) + { + _is_krutidev = true; + break; + } + + ++_i; + } + var _global_glyph_bidi_map = global.__scribble_glyph_data.__bidi_map; //Get font info from the runtime @@ -68,12 +84,15 @@ function __scribble_font_add_from_project(_font) var _font_glyphs_map = _font_data.__glyphs_map; var _font_glyph_data_grid = _font_data.__glyph_data_grid; + if (_is_krutidev) _font_data.__is_krutidev = true; + var _i = 0; repeat(_size) { var _glyph_dict = _info_glyphs_array[_i]; - var _unicode = _glyph_dict.char; + var _unicode = _glyph_dict.char; + if (_is_krutidev && (_unicode != 0x20)) _unicode += __SCRIBBLE_DEVANAGARI_OFFSET; var _char = chr(_unicode); if ((_unicode >= 0x4E00) && (_unicode <= 0x9FFF)) //CJK Unified ideographs block diff --git a/scripts/__scribble_gen_2_parser/__scribble_gen_2_parser.gml b/scripts/__scribble_gen_2_parser/__scribble_gen_2_parser.gml index 1646e1217..7ae4d8926 100644 --- a/scripts/__scribble_gen_2_parser/__scribble_gen_2_parser.gml +++ b/scripts/__scribble_gen_2_parser/__scribble_gen_2_parser.gml @@ -6,6 +6,12 @@ +#macro __SCRIBBLE_PARSER_NEXT_GLYPH ++_glyph_count;\ + _glyph_prev = _glyph_write;\ + _glyph_prev_prev = _glyph_prev; + + + #macro __SCRIBBLE_PARSER_WRITE_NEWLINE _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.UNICODE ] = 0x0A;\ //ASCII line break (dec = 10) _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.BIDI ] = __SCRIBBLE_BIDI.ISOLATED;\ _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.X ] = 0;\ @@ -38,15 +44,13 @@ ds_grid_set_grid_region(_glyph_grid, _font_glyph_data_grid, _data_index, SCRIBBLE_GLYPH.UNICODE, _data_index, SCRIBBLE_GLYPH.BILINEAR, _glyph_count, __SCRIBBLE_GEN_GLYPH.UNICODE);\ _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _control_count;\ ;\ - ++_glyph_count;\ - ;\//We don't set _glyph_prev_arabic_join_next here, we do it further up - _glyph_prev = _glyph_write;\ - _glyph_prev_prev = _glyph_prev;\ + __SCRIBBLE_PARSER_NEXT_GLYPH\ } #macro __SCRIBBLE_PARSER_SET_FONT var _font_data = __scribble_get_font_data(_font_name);\ + if (_font_data.__is_krutidev) __has_devanagari = true;\ var _font_glyph_data_grid = _font_data.__glyph_data_grid;\ var _font_glyphs_map = _font_data.__glyphs_map;\ var _space_data_index = _font_glyphs_map[? 32];\ @@ -1099,121 +1103,129 @@ function __scribble_gen_2_parser() } #endregion + + __SCRIBBLE_PARSER_WRITE_GLYPH } else { //Not an Arabic colour, this glyph definitely doesn't join backwards... _glyph_prev_arabic_join_next = false; - if ((_glyph_write >= 0x0E00) && (_glyph_write <= 0x0E7F)) + if ((_glyph_write >= 0x0900) && (_glyph_write <= 0x097F)) { - #region C90 Thai handling + //Devanagari is so complex it gets its own function + __has_devanagari = true; - __has_thai = true; + //Create a placeholder glyph entry + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.UNICODE ] = _glyph_write; + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _control_count; - if (_thai_top_map[? _glyph_write] && (_glyph_count >= 1)) + __SCRIBBLE_PARSER_NEXT_GLYPH + } + else + { + if ((_glyph_write >= 0x0E00) && (_glyph_write <= 0x0E7F)) { - var _base = _glyph_prev; - if (_thai_lower_map[? _base] && (_glyph_count >= 2)) _base = _glyph_prev_prev; - - if (_thai_base_map[? _base]) + #region C90 Thai handling + + __has_thai = true; + + if (_thai_top_map[? _glyph_write] && (_glyph_count >= 1)) { - _glyph_next = __scribble_buffer_peek_unicode(_string_buffer, buffer_tell(_string_buffer)); - - var _followingNikhahit = ((_glyph_next == 0x0e33) || (_glyph_next == 0x0e4d)); - if (_thai_base_ascender_map[? _base]) + var _base = _glyph_prev; + if (_thai_lower_map[? _base] && (_glyph_count >= 2)) _base = _glyph_prev_prev; + + if (_thai_base_map[? _base]) { - if (_followingNikhahit) + _glyph_next = __scribble_buffer_peek_unicode(_string_buffer, buffer_tell(_string_buffer)); + + var _followingNikhahit = ((_glyph_next == 0x0e33) || (_glyph_next == 0x0e4d)); + if (_thai_base_ascender_map[? _base]) { - _glyph_write += 0xf713 - 0x0e48; - __SCRIBBLE_PARSER_WRITE_GLYPH; - - _glyph_write = 0xf711; - - if (_glyph_next == 0x0e33) + if (_followingNikhahit) { + _glyph_write += 0xf713 - 0x0e48; __SCRIBBLE_PARSER_WRITE_GLYPH; - _glyph_write = 0x0e32; - } - //Skip over the next glyph - buffer_seek(_string_buffer, buffer_seek_relative, 2); + _glyph_write = 0xf711; + + if (_glyph_next == 0x0e33) + { + __SCRIBBLE_PARSER_WRITE_GLYPH; + _glyph_write = 0x0e32; + } + + //Skip over the next glyph + buffer_seek(_string_buffer, buffer_seek_relative, 2); + + //Fall through remaining code + _skip_write = true; + } + else + { + _glyph_write += 0xf705 - 0x0e48; - //Fall through remaining code - _skip_write = true; + if ((_glyph_count >= 2) && _thai_upper_map[? _glyph_prev] && _thai_base_ascender_map[? _glyph_prev]) + { + _glyph_write += 0xf713 - 0x0e48; + } + } } - else + else if (!_followingNikhahit) { - _glyph_write += 0xf705 - 0x0e48; - + _glyph_write += 0xf70a - 0x0e48; + if ((_glyph_count >= 2) && _thai_upper_map[? _glyph_prev] && _thai_base_ascender_map[? _glyph_prev]) { _glyph_write += 0xf713 - 0x0e48; } } } - else if (!_followingNikhahit) - { - _glyph_write += 0xf70a - 0x0e48; - - if ((_glyph_count >= 2) && _thai_upper_map[? _glyph_prev] && _thai_base_ascender_map[? _glyph_prev]) - { - _glyph_write += 0xf713 - 0x0e48; - } - } } - } - else if (_thai_upper_map[? _glyph_write] && (_glyph_count > 0) && _thai_base_ascender_map[? _glyph_prev]) - { - switch(_glyph_write) + else if (_thai_upper_map[? _glyph_write] && (_glyph_count > 0) && _thai_base_ascender_map[? _glyph_prev]) { - case 0x0e31: _glyph_write = 0xf710; break; - case 0x0e34: _glyph_write = 0xf701; break; - case 0x0e35: _glyph_write = 0xf702; break; - case 0x0e36: _glyph_write = 0xf703; break; - case 0x0e37: _glyph_write = 0xf704; break; - case 0x0e4d: _glyph_write = 0xf711; break; - case 0x0e47: _glyph_write = 0xf712; break; + switch(_glyph_write) + { + case 0x0e31: _glyph_write = 0xf710; break; + case 0x0e34: _glyph_write = 0xf701; break; + case 0x0e35: _glyph_write = 0xf702; break; + case 0x0e36: _glyph_write = 0xf703; break; + case 0x0e37: _glyph_write = 0xf704; break; + case 0x0e4d: _glyph_write = 0xf711; break; + case 0x0e47: _glyph_write = 0xf712; break; + } } - } - else if (_thai_lower_map[? _glyph_write] && (_glyph_count > 0) && _thai_base_descender_map[? _glyph_prev]) - { - _glyph_write += 0xf718 - 0x0e38; - } - else - { - _glyph_next = __scribble_buffer_peek_unicode(_string_buffer, buffer_tell(_string_buffer)); - - if ((_glyph_write == 0x0e0d) && _thai_lower_map[? _glyph_next]) + else if (_thai_lower_map[? _glyph_write] && (_glyph_count > 0) && _thai_base_descender_map[? _glyph_prev]) { - _glyph_write = 0xf70f; + _glyph_write += 0xf718 - 0x0e38; } - else if ((_glyph_write == 0x0e10) && _thai_lower_map[? _glyph_next]) + else { - _glyph_write = 0xf700; + _glyph_next = __scribble_buffer_peek_unicode(_string_buffer, buffer_tell(_string_buffer)); + + if ((_glyph_write == 0x0e0d) && _thai_lower_map[? _glyph_next]) + { + _glyph_write = 0xf70f; + } + else if ((_glyph_write == 0x0e10) && _thai_lower_map[? _glyph_next]) + { + _glyph_write = 0xf700; + } } - } - #endregion - } - else if ((_glyph_write >= 0x0590) && (_glyph_write <= 0x05FF)) - { - //Hebrew handling is, mercifully, straight-forward beyond R2L directionality - __has_hebrew = true; - } - else if ((_glyph_write >= 0x0900) && (_glyph_write <= 0x097F)) - { - //Devanagari is so complex it gets its own function - __has_devanagari = true; + #endregion + } + else if ((_glyph_write >= 0x0590) && (_glyph_write <= 0x05FF)) + { + //Hebrew handling is, mercifully, straight-forward beyond R2L directionality + __has_hebrew = true; + } - //TODO - Follow the 16 unicode rules to reorder Devanagari for GSUB ligature substitution + //TODO - Ligature transform here + __SCRIBBLE_PARSER_WRITE_GLYPH } - - //TODO - Ligature transform here } - __SCRIBBLE_PARSER_WRITE_GLYPH; - if (_glyph_ord == SCRIBBLE_COMMAND_TAG_OPEN) _state_command_tag_flipflop = true; #endregion diff --git a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml index e8fbde7a1..41f13fe74 100644 --- a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml +++ b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml @@ -1,6 +1,398 @@ +#region Build find-replace lookup table + +var _unicode_source_array = [ + "‘", "’", "“", "”", "(", ")", "{", "}", "=", "।", "?", "-", "µ", "॰", ",", ".", + "०", "१", "२", "३", "४", "५", "६", "७", "८", "९", "x", + + "फ़्", "क़", "ख़", "ग़", "ज़्", "ज़", "ड़", "ढ़", "फ़", "य़", "ऱ", "ऩ", + "त्त्", "त्त", "क्त", "दृ", "कृ", + + "ह्न", "ह्य", "हृ", "ह्म", "ह्र", "ह्", "द्द", "क्ष्", "क्ष", "त्र्", "त्र","ज्ञ", + "छ्य", "ट्य", "ठ्य", "ड्य", "ढ्य", "द्य","द्व", + "श्र", "ट्र", "ड्र", "ढ्र", "छ्र", "क्र", "फ्र", "द्र", "प्र", "ग्र", "रु", "रू", + "्र", + + "ओ", "औ", "आ", "अ", "ई", "इ", "उ", "ऊ", "ऐ", "ए", "ऋ", + + "क्", "क", "क्क", "ख्", "ख", "ग्", "ग", "घ्", "घ", "ङ", + "चै", "च्", "च", "छ", "ज्", "ज", "झ्", "झ", "ञ", + + "ट्ट", "ट्ठ", "ट", "ठ", "ड्ड", "ड्ढ", "ड", "ढ", "ण्", "ण", + "त्", "त", "थ्", "थ", "द्ध", "द", "ध्", "ध", "न्", "न", + + "प्", "प", "फ्", "फ", "ब्", "ब", "भ्", "भ", "म्", "म", + "य्", "य", "र", "ल्", "ल", "ळ", "व्", "व", + "श्", "श", "ष्", "ष", "स्", "स", "ह", + + "ऑ", "ॉ", "ो", "ौ", "ा", "ी", "ु", "ू", "ृ", "े", "ै", + "ं", "ँ", "ः", "ॅ", "ऽ", chr(0x94D), //virama +]; + +var _krutidev_source_array = [ + "^", "*", "Þ", "ß", "¼", "½", "¿", "À", "¾", "A", "\\", "&", "&", "Œ", "]","-", + "å", "ƒ", "„", "…", "†", "‡", "ˆ", "‰", "Š", "‹","Û", + + "¶", "d", "[k", "x", "T", "t", "M+", "<+", "Q", ";", "j", "u", + "Ù", "Ùk", "Dr", "–", "—", + + "à", "á", "â", "ã", "ºz", "º", "í", "{", "{k", "«", "=","K", + "Nî", "Vî", "Bî", "Mî", "<î", "|","}", + "J", "Vª", "Mª", "<ªª", "Nª", "Ø", "Ý", "æ", "ç", "xz", "#", ":", + "z", + + "vks", "vkS", "vk", "v", "bZ", "b", "m", "Å", ",s", ",", "_", + + "D", "d", "ô", "[", "[k", "X", "x", "?", "?k", "³", + "pkS", "P", "p", "N", "T", "t", "÷", ">", "¥", + + "ê", "ë", "V", "B", "ì", "ï", "M", "<", ".", ".k", + "R", "r", "F", "Fk", ")", "n", "/", "/k", "U", "u", + + "I", "i", "¶", "Q", "C", "c", "H", "Hk", "E", "e", + "¸", ";", "j", "Y", "y", "G", "O", "o", + "'", "'k", "\"", "\"k", "L", "l", "g", + + "v‚", "‚", "ks", "kS", "k", "h", "q", "w", "`", "s", "S", + "a", "¡", "%", "W", "·", "~", +]; + +//Use a ds_map rather than a struct since our keys will be integers +global.__scribble_krutidev_lookup_map = ds_map_create(); + +var _i = 0; +repeat(array_length(_unicode_source_array)) +{ + var _string = _unicode_source_array[_i]; + + var _searchInteger = 0; + var _j = string_length(_string); + repeat(_j) + { + _searchInteger = (_searchInteger << 16) | ord(string_char_at(_string, _j)); + --_j; + } + + var _string = _krutidev_source_array[_i]; + var _writeArray = []; + var _j = 1; + repeat(string_length(_string)) + { + array_push(_writeArray, ord(string_char_at(_string, _j))); + ++_j; + } + + global.__scribble_krutidev_lookup_map[? _searchInteger] = _writeArray; + + ++_i; +} + +#endregion + + + +#region Build matra lookup table + +//Use a ds_map rather than a struct since our keys are integers +global.__scribble_krutidev_matra_lookup_map = ds_map_create(); +global.__scribble_krutidev_matra_lookup_map[? 58] = true; +global.__scribble_krutidev_matra_lookup_map[? 2305] = true; +global.__scribble_krutidev_matra_lookup_map[? 2306] = true; +global.__scribble_krutidev_matra_lookup_map[? 2366] = true; +global.__scribble_krutidev_matra_lookup_map[? 2367] = true; +global.__scribble_krutidev_matra_lookup_map[? 2368] = true; +global.__scribble_krutidev_matra_lookup_map[? 2369] = true; +global.__scribble_krutidev_matra_lookup_map[? 2370] = true; +global.__scribble_krutidev_matra_lookup_map[? 2371] = true; +global.__scribble_krutidev_matra_lookup_map[? 2373] = true; +global.__scribble_krutidev_matra_lookup_map[? 2375] = true; +global.__scribble_krutidev_matra_lookup_map[? 2376] = true; +global.__scribble_krutidev_matra_lookup_map[? 2379] = true; +global.__scribble_krutidev_matra_lookup_map[? 2380] = true; + +#endregion + + + +#macro __SCRIBBLE_PARSER_INSERT_NUKTA ds_grid_set_grid_region(_temp_grid, _glyph_grid, _i+1, 0, _glyph_count-1, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0);\ + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _glyph_count - (_i+1), __SCRIBBLE_GEN_GLYPH.__SIZE, 0, _i+2);\ + ;\ + _glyph_grid[# _i+1, __SCRIBBLE_GEN_GLYPH.UNICODE ] = 0x093C;\ //Nukta + _glyph_grid[# _i+1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT];\ + ;\ + ++_i;\ + ++_glyph_count; + + function __scribble_gen_3_devanagari() { if (!__has_devanagari) exit; - //TODO lol + var _glyph_grid = global.__scribble_glyph_grid; + var _temp_grid = global.__scribble_temp_grid; + var _glyph_count = global.__scribble_generator_state.__glyph_count; + + //Glyph count includes the terminating null. We don't need that for Krutidev conversion + --_glyph_count; + + //Pad the end because we'll need to read beyond the end of the string during the final find-replace + //We pad with 0xFFFF to avoid accidentally making incorrect substring matches later + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.UNICODE] = 0xFFFF; + _glyph_grid[# _glyph_count+1, __SCRIBBLE_GEN_GLYPH.UNICODE] = 0xFFFF; + _glyph_grid[# _glyph_count+2, __SCRIBBLE_GEN_GLYPH.UNICODE] = 0xFFFF; + _glyph_grid[# _glyph_count+3, __SCRIBBLE_GEN_GLYPH.UNICODE] = 0xFFFF; + + + + #region Transform quotes and split up nukta ligatures + + var _in_single_quote = false; + var _in_double_quote = false; + var _i = 0; + repeat(_glyph_count) + { + switch(_glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE]) + { + //Set up alternating single quote marks + case ord("'"): + _in_single_quote = !_in_single_quote; + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = _in_single_quote? ord("^") : ord("*"); + break; + + //Set up alternating double quote marks + case ord("\""): + _in_double_quote = !_in_double_quote; + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = _in_double_quote? ord("ß") : ord("Þ"); + break; + + //Split up nukta ligatures into their componant parts + case ord("ऩ"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("न"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + + case ord("ऱ"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("र"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + + case ord("क़"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("क"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + + case ord("ख़"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("ख"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + + case ord("ग़"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("ग"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + + case ord("ज़"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("ज"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + + case ord("ड़"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("ड"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + + case ord("ढ़"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("ढ"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + + case ord("फ़"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("फ"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + + case ord("य़"): + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("य"); + __SCRIBBLE_PARSER_INSERT_NUKTA + break; + } + + ++_i; + } + + #endregion + + + + #region Reposition ि to the front of the word and replace it with an "f" + + //TODO - Log where ि is found during the nukta ligature sweep + var _i = 1; //Start at the second char because we don't care if the string starts with 0x093F (Vowel Sign I) + repeat(_glyph_count-1) + { + var _char = _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE]; + if (_char == ord("ि")) + { + //If we find a virama behind us keep tracking backwards + //We go two indexes backwards because virama (should) always follows another character + var _j = _i - 1; + while((_j >= 0) && (_glyph_grid[# _j, __SCRIBBLE_GEN_GLYPH.UNICODE] == 0x094D)) _j -= 2; + + ds_grid_set_grid_region(_temp_grid, _glyph_grid, _j, 0, _i-1, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0); + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _i-1 - _j, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, _j+1); + + _glyph_grid[# _j, __SCRIBBLE_GEN_GLYPH.UNICODE ] = ord("f"); + _glyph_grid[# _j, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _j+1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT]; + } + + ++_i; + } + + #endregion + + + + #region Move र् (ra + virama) after matras + + var _matraLookupMap = global.__scribble_krutidev_matra_lookup_map; + + //Using a for-loop here as _glyph_count may change + for(var _i = 0; _i < _glyph_count; ++_i) + { + //TODO - Log where ra-virama is found during the nukta ligature sweep + if ((_glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] == ord("र")) && (_glyph_grid[# _i+1, __SCRIBBLE_GEN_GLYPH.UNICODE] == 0x094D)) //Ra followed by virama + { + var _probablePosition = _i + 3; + + var _charRight = _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.UNICODE]; + while(ds_map_exists(_matraLookupMap, _charRight)) + { + _probablePosition++; + _charRight = _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.UNICODE]; + } + + + + ds_grid_set_grid_region(_temp_grid, _glyph_grid, _i+2, 0, _glyph_count-1, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0); + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _probablePosition - (_i + 2), __SCRIBBLE_GEN_GLYPH.__SIZE, _i, 0); + + _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.UNICODE ] = ord("Z"); + _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _probablePosition-1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT]; + + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _glyph_count-1 - (_probablePosition - (_i + 2)), __SCRIBBLE_GEN_GLYPH.__SIZE, _probablePosition+1, 0); + + + + //array_insert(_charArray, _probablePosition, ord("Z")); + //array_delete(_charArray, _i, 2); + + --_glyph_count; + } + } + + #endregion + + + + #region Perform bulk find-replace + + var _lookupMap = global.__scribble_krutidev_lookup_map; + + //Create a 64-bit minibuffer + //Fortunately all the characters we're looking for fit into 16 bits and we only need to look for 4 at a time + var _oneChar = 0x0000; + var _twoChar = ((_charArray[0] & 0xFFFF) << 16); + var _threeChar = _twoChar | ((_charArray[1] & 0xFFFF) << 32); + var _fourChar = _threeChar | ((_charArray[2] & 0xFFFF) << 48); + + //Using a for-loop here as _glyph_count may change + for(var _i = 0; _i < _glyph_count; ++_i;) + { + _oneChar = _twoChar >> 16; + _twoChar = _threeChar >> 16; + _threeChar = _fourChar >> 16; + _fourChar = _threeChar | ((_charArray[_i + 3] & 0xFFFF) << 48); + + //Try to find a matching substring + var _foundLength = 4; + var _replacementArray = _lookupMap[? _fourChar]; + + if (_replacementArray == undefined) + { + _foundLength = 3; + _replacementArray = _lookupMap[? _threeChar]; + + if (_replacementArray == undefined) + { + _foundLength = 2; + _replacementArray = _lookupMap[? _twoChar]; + + if (_replacementArray == undefined) + { + _foundLength = 1; + _replacementArray = _lookupMap[? _oneChar]; + } + } + } + + //Perform a character replacement if we found any matching substring + if (_replacementArray != undefined) + { + var _replacementLength = array_length(_replacementArray); + + if ((_foundLength == 1) && (_replacementLength == 1)) + { + //Shortcut for the most common replacement operation + _charArray[@ _i] = _replacementArray[0]; + } + else + { + //Heavyweight general replacement code... we want to avoid as many delete/insert commands as + //possible as it causes lots of reallocation in the background + + //Copy over as much data as possible from one array + var _copyCount = min(_foundLength, _replacementLength); + array_copy(_charArray, _i, _replacementArray, 0, _copyCount); + + if (_foundLength > _replacementLength) + { + //If we're replacing with fewer characters than we found then we need to delete some characters + array_delete(_charArray, _i + _copyCount, _foundLength - _replacementLength); + } + else + { + //Otherwise, we're adding characters to the array so we have to insert some characters + switch(_replacementLength - _foundLength) + { + case 1: + array_insert(_charArray, _i + _copyCount, _replacementArray[_copyCount]); + break; + + //I'm not sure the 2 or 3 case ever happens but we should cover it just in case + case 2: + array_insert(_charArray, _i + _copyCount, + _replacementArray[_copyCount ], + _replacementArray[_copyCount+1]); + break; + + case 3: + array_insert(_charArray, _i + _copyCount, + _replacementArray[_copyCount ], + _replacementArray[_copyCount+1], + _replacementArray[_copyCount+2]); + break; + } + } + + _i += _replacementLength - 1; //Off-by-one to account for ++_i in the for-loop + _glyph_count += _replacementLength - _foundLength; + + //Recalculate our minibuffer since we've messed around with the array a lot + _twoChar = ((_charArray[_i+1] & 0xFFFF) << 16); + _threeChar = _twoChar | ((_charArray[_i+2] & 0xFFFF) << 32); + _fourChar = _threeChar | ((_charArray[_i+3] & 0xFFFF) << 48); + } + } + } + + #endregion } \ No newline at end of file diff --git a/scripts/__scribble_system/__scribble_system.gml b/scripts/__scribble_system/__scribble_system.gml index 27a038910..78caf486e 100644 --- a/scripts/__scribble_system/__scribble_system.gml +++ b/scripts/__scribble_system/__scribble_system.gml @@ -82,7 +82,7 @@ global.__scribble_control_grid = ds_grid_create(1000, __SCRIBBLE_GEN_CON global.__scribble_word_grid = ds_grid_create(1000, __SCRIBBLE_GEN_WORD.__SIZE); global.__scribble_line_grid = ds_grid_create(__SCRIBBLE_MAX_LINES, __SCRIBBLE_GEN_LINE.__SIZE); global.__scribble_stretch_grid = ds_grid_create(1000, __SCRIBBLE_GEN_STRETCH.__SIZE); -global.__scribble_temp_grid = ds_grid_create(1000, __SCRIBBLE_GEN_WORD.__SIZE); //Somewhat arbitrary size. Feel free to increase this size as is needed +global.__scribble_temp_grid = ds_grid_create(1000, __SCRIBBLE_GEN_GLYPH.__SIZE); //Somewhat arbitrary size. Feel free to increase this size as is needed global.__scribble_vbuff_pos_grid = ds_grid_create(1000, __SCRIBBLE_GEN_VBUFF_POS.__SIZE); //global.__scribble_window_array_null = array_create(2*__SCRIBBLE_WINDOW_COUNT, 1.0); //TODO - Do we still need this? @@ -737,7 +737,7 @@ enum __SCRIBBLE_GEN_GLYPH IMAGE_INDEX, //20 | Only used for sprites IMAGE_SPEED, //21 / - __SIZE, //20 + __SIZE, //22 } enum __SCRIBBLE_GEN_VBUFF_POS @@ -822,6 +822,8 @@ enum __SCRIBBLE_GEN_LINE #macro __SCRIBBLE_CACHE_TIMEOUT 120 //How long to wait (in milliseconds) before the text element cache automatically cleans up unused data #macro __SCRIBBLE_AUDIO_COMMAND_TAG "__scribble_audio_playback__" +#macro __SCRIBBLE_DEVANAGARI_OFFSET 0xFFFF + #macro __SCRIBBLE_MAX_LINES 1000 //Maximum number of lines in a textbox. This constant must match the corresponding values in __shd_scribble and __shd_scribble_msdf #endregion \ No newline at end of file From 51a5268e1a3097273c48bb229d2d9d7f86e89846 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Sun, 13 Feb 2022 18:27:50 +0000 Subject: [PATCH 04/25] A little more Krutidev --- Scribble.yyp | 4 +- options/ps5/options_ps5.yy | 38 +++++++++++++ options/xboxseriesxs/options_xboxseriesxs.yy | 37 ++++++++++++ .../__scribble_gen_3_devanagari.gml | 56 +++++++++---------- 4 files changed, 105 insertions(+), 30 deletions(-) create mode 100644 options/ps5/options_ps5.yy create mode 100644 options/xboxseriesxs/options_xboxseriesxs.yy diff --git a/Scribble.yyp b/Scribble.yyp index 7dcd52d85..3e97ca425 100644 --- a/Scribble.yyp +++ b/Scribble.yyp @@ -282,6 +282,8 @@ {"name":"macOS","path":"options/mac/options_mac.yy",}, {"name":"Main","path":"options/main/options_main.yy",}, {"name":"operagx","path":"options/operagx/options_operagx.yy",}, + {"name":"PlayStation 5","path":"options/ps5/options_ps5.yy",}, + {"name":"Xbox Series XS","path":"options/xboxseriesxs/options_xboxseriesxs.yy",}, ], "isDnDProject": false, "isEcma": false, @@ -346,7 +348,7 @@ {"CopyToMask":-1,"filePath":"datafiles","resourceVersion":"1.0","name":"blip.ogg","resourceType":"GMIncludedFile",}, ], "MetaData": { - "IDEVersion": "2.3.7.606", + "IDEVersion": "2.3.6.595", }, "resourceVersion": "1.4", "name": "Scribble", diff --git a/options/ps5/options_ps5.yy b/options/ps5/options_ps5.yy new file mode 100644 index 000000000..cabc42612 --- /dev/null +++ b/options/ps5/options_ps5.yy @@ -0,0 +1,38 @@ +{ + "option_ps5_package_id": "IV0002-NPXS29129_00-APP0990000000022", + "option_ps5_passcode": "GvE6xCpZxd96scOUGuLPbuLp8O800B0s", + "option_ps5_nptitleid": "", + "option_ps5_nptitlesecret": "", + "option_ps5_sharedbinarysubconfigs": "", + "option_ps5_paramsfo": "", + "option_ps5_nptitledat": "", + "option_ps5_trophyedit": "", + "option_ps5_shareparam": "", + "option_ps5_pronunciation": "", + "option_ps5_splash_screen": "${base_options_dir}/ps5/sce_sys/pic1.png", + "option_ps5_foreground_screen": "${base_options_dir}/ps5/sce_sys/pic2.png", + "option_ps5_save_data_icon": "${base_options_dir}/ps5/sce_sys/save_data.png", + "option_ps5_trophy_screen": "${base_options_dir}/ps5/sce_sys/pic0.png", + "option_ps5_interpolate_pixels": true, + "option_ps5_display_cursor": false, + "option_ps5_scale": 0, + "option_ps5_texture_page": "2048x2048", + "option_ps5_max_display_width": -1, + "option_ps5_max_display_height": -1, + "option_ps5_icon": "${base_options_dir}/ps5/sce_sys/icon0.png", + "option_ps5_shareoverlay_image": "${base_options_dir}/ps5/sce_sys/shareoverlayimage.png", + "option_ps5_nptitledat_file": "${options_dir}\\ps5\\sce_sys\\nptitle.dat", + "option_ps5_paramsfo_file": "${options_dir}\\ps5\\sce_sys\\param.sfo", + "option_ps5_trophy00trp_file": "${options_dir}\\ps5\\sce_sys\\trophy\\trophy00.trp", + "option_ps5_shareparam_file": "${options_dir}\\ps5\\sce_sys\\shareparam.json", + "option_ps5_pronunciation_file": "${options_dir}\\ps5\\sce_sys\\pronunciation.xml", + "option_ps5_pronunciation_sig": "${options_dir}\\ps5\\sce_sys\\pronunciation.sig", + "option_ps5_onion": 2048, + "option_ps5_garlic": 1024, + "option_ps5_neo_onion": 2048, + "option_ps5_neo_garlic": 1536, + "resourceVersion": "1.0", + "name": "PlayStation 5", + "tags": [], + "resourceType": "GMPS5Options", +} \ No newline at end of file diff --git a/options/xboxseriesxs/options_xboxseriesxs.yy b/options/xboxseriesxs/options_xboxseriesxs.yy new file mode 100644 index 000000000..4dee23db1 --- /dev/null +++ b/options/xboxseriesxs/options_xboxseriesxs.yy @@ -0,0 +1,37 @@ +{ + "option_xboxseriesxs_display_name": "Created with GameMaker Studio 2", + "option_xboxseriesxs_description": "Your Description", + "option_xboxseriesxs_publisher": "Company Name", + "option_xboxseriesxs_publisher_display_name": "Company Display Name", + "option_xboxseriesxs_version": "1.0.0.0", + "option_xboxseriesxs_product_id": "", + "option_xboxseriesxs_title_id": "01234567", + "option_xboxseriesxs_service_config_id": "00000000-0000-0000-0000-000000000000", + "option_xboxseriesxs_program_id": "ExactName.InPartnerCenter", + "option_xboxseriesxs_playfab_party_id": "00000", + "option_xboxseriesxs_require_xbox_live": false, + "option_xboxseriesxs_require_game_chat": false, + "option_xboxseriesxs_game_chat_slots": 4, + "option_xboxseriesxs_require_audio_recording": false, + "option_xboxseriesxs_stats_system": 0, + "option_xboxseriesxs_service_config_manifest": "", + "option_xboxseriesxs_network_config_manifest": "", + "option_xboxseriesxs_splash_screen": "${base_options_dir}/xboxseriesxs/SplashScreen.png", + "option_xboxseriesxs_splash_screen_colour": 4282795590, + "option_xboxseriesxs_logo_store": "${base_options_dir}/xboxseriesxs/logos/StoreLogo.png", + "option_xboxseriesxs_logo_small": "${base_options_dir}/xboxseriesxs/logos/SmallLogo.png", + "option_xboxseriesxs_logo_medium": "${base_options_dir}/xboxseriesxs/logos/Logo.png", + "option_xboxseriesxs_logo_large": "${base_options_dir}/xboxseriesxs/logos/LargeLogo.png", + "option_xboxseriesxs_logo_background_colour": 4282795590, + "option_xboxseriesxs_foreground_text": 0, + "option_xboxseriesxs_interpolate_pixels": false, + "option_xboxseriesxs_scale": 0, + "option_xboxseriesxs_texture_page": "2048x2048", + "option_xboxseriesxs_support_4k_one_x": false, + "option_xboxseriesxs_support_4k_one_s": false, + "option_xboxseriesxs_languages": "\n \n \n \n ", + "resourceVersion": "1.0", + "name": "Xbox Series XS", + "tags": [], + "resourceType": "GMXboxSeriesXSOptions", +} \ No newline at end of file diff --git a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml index 41f13fe74..6ed6365fb 100644 --- a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml +++ b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml @@ -113,14 +113,14 @@ global.__scribble_krutidev_matra_lookup_map[? 2380] = true; -#macro __SCRIBBLE_PARSER_INSERT_NUKTA ds_grid_set_grid_region(_temp_grid, _glyph_grid, _i+1, 0, _glyph_count-1, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0);\ - ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _glyph_count - (_i+1), __SCRIBBLE_GEN_GLYPH.__SIZE, 0, _i+2);\ - ;\ - _glyph_grid[# _i+1, __SCRIBBLE_GEN_GLYPH.UNICODE ] = 0x093C;\ //Nukta - _glyph_grid[# _i+1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT];\ +#macro __SCRIBBLE_PARSER_INSERT_NUKTA ds_grid_set_grid_region(_temp_grid, _glyph_grid, _i+1, 0, _glyph_count+3, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0);\ + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _glyph_count+3 - _i, __SCRIBBLE_GEN_GLYPH.__SIZE, _i+2, 0);\ ;\ ++_i;\ - ++_glyph_count; + ++_glyph_count;\ + ;\ + _glyph_grid[# _i+1, __SCRIBBLE_GEN_GLYPH.UNICODE ] = 0x093C;\ //Nukta + _glyph_grid[# _i+1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT]; function __scribble_gen_3_devanagari() @@ -238,7 +238,7 @@ function __scribble_gen_3_devanagari() while((_j >= 0) && (_glyph_grid[# _j, __SCRIBBLE_GEN_GLYPH.UNICODE] == 0x094D)) _j -= 2; ds_grid_set_grid_region(_temp_grid, _glyph_grid, _j, 0, _i-1, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0); - ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _i-1 - _j, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, _j+1); + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _i - _j, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, _j+1); _glyph_grid[# _j, __SCRIBBLE_GEN_GLYPH.UNICODE ] = ord("f"); _glyph_grid[# _j, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _j+1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT]; @@ -278,7 +278,7 @@ function __scribble_gen_3_devanagari() _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.UNICODE ] = ord("Z"); _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _probablePosition-1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT]; - ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _glyph_count-1 - (_probablePosition - (_i + 2)), __SCRIBBLE_GEN_GLYPH.__SIZE, _probablePosition+1, 0); + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _glyph_count - (_probablePosition - (_i + 2)), __SCRIBBLE_GEN_GLYPH.__SIZE, _probablePosition+1, 0); @@ -342,7 +342,7 @@ function __scribble_gen_3_devanagari() if ((_foundLength == 1) && (_replacementLength == 1)) { //Shortcut for the most common replacement operation - _charArray[@ _i] = _replacementArray[0]; + _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = _replacementArray[0]; } else { @@ -351,39 +351,37 @@ function __scribble_gen_3_devanagari() //Copy over as much data as possible from one array var _copyCount = min(_foundLength, _replacementLength); - array_copy(_charArray, _i, _replacementArray, 0, _copyCount); + + var _j = 0; + repeat(_copyCount) + { + _glyph_grid[# _i + _j, __SCRIBBLE_GEN_GLYPH.UNICODE] = _replacementArray[_j]; + ++_j; + } if (_foundLength > _replacementLength) { //If we're replacing with fewer characters than we found then we need to delete some characters + var _deleteStart = _i + _copyCount + _foundLength - _replacementLength; + var _deleteEnd = _deleteStart + _foundLength - _replacementLength; + array_delete(_charArray, _i + _copyCount, _foundLength - _replacementLength); + + ds_grid_set_grid_region(_temp_grid, _glyph_grid, _i + _copyCount } else { - //Otherwise, we're adding characters to the array so we have to insert some characters - switch(_replacementLength - _foundLength) + if (_replacementLength - _foundLength == 1) { - case 1: array_insert(_charArray, _i + _copyCount, _replacementArray[_copyCount]); - break; - - //I'm not sure the 2 or 3 case ever happens but we should cover it just in case - case 2: - array_insert(_charArray, _i + _copyCount, - _replacementArray[_copyCount ], - _replacementArray[_copyCount+1]); - break; - - case 3: - array_insert(_charArray, _i + _copyCount, - _replacementArray[_copyCount ], - _replacementArray[_copyCount+1], - _replacementArray[_copyCount+2]); - break; + } + else if (_replacementLength - _foundLength > 1) + { + __scribble_error("Insertion length > 1. Please report this error"); } } - _i += _replacementLength - 1; //Off-by-one to account for ++_i in the for-loop + _i += _replacementLength - 1; //Off-by-one to account for ++_i in the for-loop _glyph_count += _replacementLength - _foundLength; //Recalculate our minibuffer since we've messed around with the array a lot From cb2f3a786edb9daad319a919f420a8fe1a95df4d Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Sun, 20 Feb 2022 09:24:50 +0000 Subject: [PATCH 05/25] Finishes off porting Krutidev converter --- .../__scribble_gen_3_devanagari.gml | 120 +++++++++++++----- 1 file changed, 85 insertions(+), 35 deletions(-) diff --git a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml index 6ed6365fb..4192691c4 100644 --- a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml +++ b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml @@ -1,5 +1,7 @@ #region Build find-replace lookup table +//TODO - Precalculate the lookup table +//TODO - Move this to __scribble_system_glyph_data() var _unicode_source_array = [ "‘", "’", "“", "”", "(", ")", "{", "}", "=", "।", "?", "-", "µ", "॰", ",", ".", "०", "१", "२", "३", "४", "५", "६", "७", "८", "९", "x", @@ -93,6 +95,7 @@ repeat(array_length(_unicode_source_array)) #region Build matra lookup table //Use a ds_map rather than a struct since our keys are integers +//TODO - Convert these to hex and add comments global.__scribble_krutidev_matra_lookup_map = ds_map_create(); global.__scribble_krutidev_matra_lookup_map[? 58] = true; global.__scribble_krutidev_matra_lookup_map[? 2305] = true; @@ -125,6 +128,7 @@ global.__scribble_krutidev_matra_lookup_map[? 2380] = true; function __scribble_gen_3_devanagari() { + //Avoid this mess if we can if (!__has_devanagari) exit; var _glyph_grid = global.__scribble_glyph_grid; @@ -165,6 +169,7 @@ function __scribble_gen_3_devanagari() break; //Split up nukta ligatures into their componant parts + //TODO - Convert to hex and add comments case ord("ऩ"): _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] = ord("न"); __SCRIBBLE_PARSER_INSERT_NUKTA @@ -237,9 +242,12 @@ function __scribble_gen_3_devanagari() var _j = _i - 1; while((_j >= 0) && (_glyph_grid[# _j, __SCRIBBLE_GEN_GLYPH.UNICODE] == 0x094D)) _j -= 2; + //Copy everything from the start of the subtring (where ि will go) to the end (which is where ि currently is) ds_grid_set_grid_region(_temp_grid, _glyph_grid, _j, 0, _i-1, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0); - ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _i - _j, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, _j+1); + //Then copy that back into the glyph grid, but one character forwards + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _i-1 - _j, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, _j+1); + //Insert ि (encoded in Krutidev as f) into its new position _glyph_grid[# _j, __SCRIBBLE_GEN_GLYPH.UNICODE ] = ord("f"); _glyph_grid[# _j, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _j+1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT]; } @@ -261,30 +269,32 @@ function __scribble_gen_3_devanagari() //TODO - Log where ra-virama is found during the nukta ligature sweep if ((_glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE] == ord("र")) && (_glyph_grid[# _i+1, __SCRIBBLE_GEN_GLYPH.UNICODE] == 0x094D)) //Ra followed by virama { - var _probablePosition = _i + 3; + var _newPosition = _i + 3; - var _charRight = _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.UNICODE]; + //If the character after the probable position for ra+virama is a matra, keep searching right + var _charRight = _glyph_grid[# _newPosition, __SCRIBBLE_GEN_GLYPH.UNICODE]; while(ds_map_exists(_matraLookupMap, _charRight)) { - _probablePosition++; - _charRight = _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.UNICODE]; + _newPosition++; + _charRight = _glyph_grid[# _newPosition, __SCRIBBLE_GEN_GLYPH.UNICODE]; } + //Copy everything after the ra-virama position into the temp buffer + //We're going to copy that back into the glyph grid in two stages + ds_grid_set_grid_region(_temp_grid, _glyph_grid, _i+2, 0, _glyph_count, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0); + //First copy: Move the gylphs between the old position and the new position back two slots + // This effective deletes the old ra+virama position + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _newPosition - (_i+2), __SCRIBBLE_GEN_GLYPH.__SIZE, _i, 0); - ds_grid_set_grid_region(_temp_grid, _glyph_grid, _i+2, 0, _glyph_count-1, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0); - ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _probablePosition - (_i + 2), __SCRIBBLE_GEN_GLYPH.__SIZE, _i, 0); + //Insert the new ra+virama combined character. Krutidev handles this as a single glyph (encoded as Z) + _glyph_grid[# _newPosition, __SCRIBBLE_GEN_GLYPH.UNICODE ] = ord("Z"); + _glyph_grid[# _newPosition, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _newPosition-1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT]; - _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.UNICODE ] = ord("Z"); - _glyph_grid[# _probablePosition, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _probablePosition-1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT]; - - ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _glyph_count - (_probablePosition - (_i + 2)), __SCRIBBLE_GEN_GLYPH.__SIZE, _probablePosition+1, 0); - - - - //array_insert(_charArray, _probablePosition, ord("Z")); - //array_delete(_charArray, _i, 2); + //Second copy: Place the remainder of the glyphs after ra+virama + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _glyph_count - (_newPosition - (_i + 2)), __SCRIBBLE_GEN_GLYPH.__SIZE, _newPosition+1, 0); + //Overall this reduces the total number of glyphs by one since we're replace ra + virama with a single Z --_glyph_count; } } @@ -299,10 +309,10 @@ function __scribble_gen_3_devanagari() //Create a 64-bit minibuffer //Fortunately all the characters we're looking for fit into 16 bits and we only need to look for 4 at a time - var _oneChar = 0x0000; - var _twoChar = ((_charArray[0] & 0xFFFF) << 16); - var _threeChar = _twoChar | ((_charArray[1] & 0xFFFF) << 32); - var _fourChar = _threeChar | ((_charArray[2] & 0xFFFF) << 48); + var _oneChar = 0x0000; + var _twoChar = ((_glyph_grid[# 0, __SCRIBBLE_GEN_GLYPH.UNICODE] & 0xFFFF) << 16); + var _threeChar = _twoChar | ((_glyph_grid[# 1, __SCRIBBLE_GEN_GLYPH.UNICODE] & 0xFFFF) << 32); + var _fourChar = _threeChar | ((_glyph_grid[# 2, __SCRIBBLE_GEN_GLYPH.UNICODE] & 0xFFFF) << 48); //Using a for-loop here as _glyph_count may change for(var _i = 0; _i < _glyph_count; ++_i;) @@ -310,7 +320,7 @@ function __scribble_gen_3_devanagari() _oneChar = _twoChar >> 16; _twoChar = _threeChar >> 16; _threeChar = _fourChar >> 16; - _fourChar = _threeChar | ((_charArray[_i + 3] & 0xFFFF) << 48); + _fourChar = _threeChar | ((_glyph_grid[# _i+3, __SCRIBBLE_GEN_GLYPH.UNICODE] & 0xFFFF) << 48); //Try to find a matching substring var _foundLength = 4; @@ -362,22 +372,28 @@ function __scribble_gen_3_devanagari() if (_foundLength > _replacementLength) { //If we're replacing with fewer characters than we found then we need to delete some characters - var _deleteStart = _i + _copyCount + _foundLength - _replacementLength; - var _deleteEnd = _deleteStart + _foundLength - _replacementLength; + var _copyStart = _i + _copyCount + _foundLength - _replacementLength; + var _copyLength = _glyph_count - _copyStart; - array_delete(_charArray, _i + _copyCount, _foundLength - _replacementLength); - - ds_grid_set_grid_region(_temp_grid, _glyph_grid, _i + _copyCount + ds_grid_set_grid_region(_temp_grid, _glyph_grid, _copyStart, 0, _glyph_count, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0); + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _copyLength, __SCRIBBLE_GEN_GLYPH.__SIZE, _i + _copyCount, 0); } else { - if (_replacementLength - _foundLength == 1) - { - array_insert(_charArray, _i + _copyCount, _replacementArray[_copyCount]); - } - else if (_replacementLength - _foundLength > 1) + //Otherwise, we're adding characters to the array so we have to insert some characters + //This code presumes we're only adding 1 character + var _insertPos = _i + _copyCount; + ds_grid_set_grid_region(_temp_grid, _glyph_grid, _insertPos, 0, _glyph_count, __SCRIBBLE_GEN_GLYPH.__SIZE, 0, 0); + ds_grid_set_grid_region(_glyph_grid, _temp_grid, 0, 0, _glyph_count - _insertPos, __SCRIBBLE_GEN_GLYPH.__SIZE, _insertPos+1, 0); + + _glyph_grid[# _insertPos, __SCRIBBLE_GEN_GLYPH.UNICODE ] = _replacementArray[_copyCount]; + _glyph_grid[# _insertPos, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _glyph_grid[# _insertPos-1, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT]; + + //Throw an error if we're trying to add more than one character + //I don't think this ever comes up but it might in the future + if (_replacementLength - _foundLength > 1) { - __scribble_error("Insertion length > 1. Please report this error"); + __scribble_error("Devanagari substring insertion length > 1. Please report this error"); } } @@ -385,12 +401,46 @@ function __scribble_gen_3_devanagari() _glyph_count += _replacementLength - _foundLength; //Recalculate our minibuffer since we've messed around with the array a lot - _twoChar = ((_charArray[_i+1] & 0xFFFF) << 16); - _threeChar = _twoChar | ((_charArray[_i+2] & 0xFFFF) << 32); - _fourChar = _threeChar | ((_charArray[_i+3] & 0xFFFF) << 48); + _twoChar = ((_glyph_grid[# _i+1, __SCRIBBLE_GEN_GLYPH.UNICODE] & 0xFFFF) << 16); + _threeChar = _twoChar | ((_glyph_grid[# _i+2, __SCRIBBLE_GEN_GLYPH.UNICODE] & 0xFFFF) << 32); + _fourChar = _threeChar | ((_glyph_grid[# _i+3, __SCRIBBLE_GEN_GLYPH.UNICODE] & 0xFFFF) << 48); } } } #endregion + + + + #region Copy data across for all the Krutidev characters we've just inserted + + //FIXME + var _font_glyphs_map = undefined; + var _font_name = "?"; + var _font_glyph_data_grid = undefined; + + var _i = 0; + repeat(_glyph_count) + { + var _glyph_write = _glyph_grid[# _i, __SCRIBBLE_GEN_GLYPH.UNICODE]; + + //Pull info out of the font's data structures + var _data_index = _font_glyphs_map[? _glyph_write]; + //If our glyph is missing, choose the missing character glyph instead! + if (_data_index == undefined) _data_index = _font_glyphs_map[? ord(SCRIBBLE_MISSING_CHARACTER)]; + if (_data_index == undefined) + { + //This should only happen if SCRIBBLE_MISSING_CHARACTER is missing for a font + __scribble_trace("Couldn't find glyph data for character code " + string(_glyph_write) + " (" + chr(_glyph_write) + ") in font \"" + string(_font_name) + "\""); + } + else + { + //Add this glyph to our grid by copying from the font's own glyph data grid + ds_grid_set_grid_region(_glyph_grid, _font_glyph_data_grid, _data_index, SCRIBBLE_GLYPH.UNICODE, _data_index, SCRIBBLE_GLYPH.BILINEAR, _glyph_count, __SCRIBBLE_GEN_GLYPH.UNICODE); + } + + ++_i; + } + + #endregion } \ No newline at end of file From 6f788e166fd020e7b63ae5c97764b07dc3e69bc3 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 25 Feb 2022 14:17:59 +0000 Subject: [PATCH 06/25] Forces standard font mode on even if no drawable glyphs are found --- .../__scribble_gen_9_write_vbuffs.gml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/__scribble_gen_9_write_vbuffs/__scribble_gen_9_write_vbuffs.gml b/scripts/__scribble_gen_9_write_vbuffs/__scribble_gen_9_write_vbuffs.gml index 03ac30c20..73995029b 100644 --- a/scripts/__scribble_gen_9_write_vbuffs/__scribble_gen_9_write_vbuffs.gml +++ b/scripts/__scribble_gen_9_write_vbuffs/__scribble_gen_9_write_vbuffs.gml @@ -457,6 +457,10 @@ function __scribble_gen_9_write_vbuffs() _control_index++; } + //Ensure that the model thinks it is using at least one of the font types + //This ensures typists still process even if there's no drawable text + if (!__uses_standard_font && !__uses_msdf_font) __uses_standard_font = true; + //Ensure we've ended the vertex buffers we created __finalize_vertex_buffers(_element.__freeze); } \ No newline at end of file From 04367c1fb6033435f43490795f05d14ae112dad9 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 25 Feb 2022 14:28:28 +0000 Subject: [PATCH 07/25] Adds [zwsp] tag --- .../__scribble_gen_2_parser.gml | 24 ++++++++++++++++++- .../__scribble_system/__scribble_system.gml | 1 + 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/scripts/__scribble_gen_2_parser/__scribble_gen_2_parser.gml b/scripts/__scribble_gen_2_parser/__scribble_gen_2_parser.gml index 1646e1217..4a7cccf69 100644 --- a/scripts/__scribble_gen_2_parser/__scribble_gen_2_parser.gml +++ b/scripts/__scribble_gen_2_parser/__scribble_gen_2_parser.gml @@ -497,7 +497,29 @@ function __scribble_gen_2_parser() break; #endregion - + + #region Zero-width space emulation + + // [zwsp] + case 31: + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.UNICODE ] = 0x200B; + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.BIDI ] = __SCRIBBLE_BIDI.WHITESPACE; + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.X ] = 0; + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.Y ] = 0; + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.WIDTH ] = 0; + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.HEIGHT ] = _font_line_height; + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.FONT_HEIGHT ] = _font_line_height; + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.SEPARATION ] = 0; + _glyph_grid[# _glyph_count, __SCRIBBLE_GEN_GLYPH.CONTROL_COUNT] = _control_count; + + ++_glyph_count; + _glyph_prev_arabic_join_next = false; + _glyph_prev = 0x200B; + _glyph_prev_prev = _glyph_prev; + break; + + #endregion + #region Cycle // [cycle] diff --git a/scripts/__scribble_system/__scribble_system.gml b/scripts/__scribble_system/__scribble_system.gml index 27a038910..5b070f994 100644 --- a/scripts/__scribble_system/__scribble_system.gml +++ b/scripts/__scribble_system/__scribble_system.gml @@ -159,6 +159,7 @@ _map[? "bi" ] = 27; _map[? "surface" ] = 28; _map[? "region" ] = 29; _map[? "/region" ] = 30; +_map[? "zwsp" ] = 31; global.__scribble_command_tag_lookup_accelerator = _map; //Add bindings for default effect names From 4f39e9d933daba3edb5bdb5d95959a9491f5f2c1 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 25 Feb 2022 14:28:44 +0000 Subject: [PATCH 08/25] Adds [zwsp] test case --- Scribble.yyp | 1 + objects/obj_test_wrap_zwsp/Create_0.gml | 1 + objects/obj_test_wrap_zwsp/Draw_0.gml | 11 ++++++ objects/obj_test_wrap_zwsp/Step_0.gml | 1 + .../obj_test_wrap_zwsp/obj_test_wrap_zwsp.yy | 35 +++++++++++++++++++ rooms/rm_test/rm_test.yy | 4 +-- 6 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 objects/obj_test_wrap_zwsp/Create_0.gml create mode 100644 objects/obj_test_wrap_zwsp/Draw_0.gml create mode 100644 objects/obj_test_wrap_zwsp/Step_0.gml create mode 100644 objects/obj_test_wrap_zwsp/obj_test_wrap_zwsp.yy diff --git a/Scribble.yyp b/Scribble.yyp index 3591461b1..ee1562c52 100644 --- a/Scribble.yyp +++ b/Scribble.yyp @@ -160,6 +160,7 @@ {"id":{"name":"obj_test_style","path":"objects/obj_test_style/obj_test_style.yy",},"order":0,}, {"id":{"name":"obj_test_sprite_blend","path":"objects/obj_test_sprite_blend/obj_test_sprite_blend.yy",},"order":3,}, {"id":{"name":"__shd_scribble_bake_outline_8dir_2px","path":"shaders/__shd_scribble_bake_outline_8dir_2px/__shd_scribble_bake_outline_8dir_2px.yy",},"order":4,}, + {"id":{"name":"obj_test_wrap_zwsp","path":"objects/obj_test_wrap_zwsp/obj_test_wrap_zwsp.yy",},"order":7,}, {"id":{"name":"obj_test_font_shadow","path":"objects/obj_test_font_shadow/obj_test_font_shadow.yy",},"order":10,}, {"id":{"name":"obj_test_anim_wobble","path":"objects/obj_test_anim_wobble/obj_test_anim_wobble.yy",},"order":4,}, {"id":{"name":"obj_test_msdf_drop_shadow","path":"objects/obj_test_msdf_drop_shadow/obj_test_msdf_drop_shadow.yy",},"order":3,}, diff --git a/objects/obj_test_wrap_zwsp/Create_0.gml b/objects/obj_test_wrap_zwsp/Create_0.gml new file mode 100644 index 000000000..54e6ab384 --- /dev/null +++ b/objects/obj_test_wrap_zwsp/Create_0.gml @@ -0,0 +1 @@ +width = 500; \ No newline at end of file diff --git a/objects/obj_test_wrap_zwsp/Draw_0.gml b/objects/obj_test_wrap_zwsp/Draw_0.gml new file mode 100644 index 000000000..dd435cf94 --- /dev/null +++ b/objects/obj_test_wrap_zwsp/Draw_0.gml @@ -0,0 +1,11 @@ +var _string = "pneumonoultramicrosco[zwsp]picsilicovolca[zwsp]noconiosis"; + +var _element = scribble(_string).wrap(width); +_element.draw(x, y); + +draw_circle(x, y, 6, true); +draw_rectangle(x, y, x + width, y + _element.get_height(), true); + +draw_circle(room_width div 2, y + _element.get_height() + 40, 6, true); + +scribble(_string).wrap(width).draw(room_width div 2, y + _element.get_height() + 40); \ No newline at end of file diff --git a/objects/obj_test_wrap_zwsp/Step_0.gml b/objects/obj_test_wrap_zwsp/Step_0.gml new file mode 100644 index 000000000..64b4477d7 --- /dev/null +++ b/objects/obj_test_wrap_zwsp/Step_0.gml @@ -0,0 +1 @@ +if (mouse_check_button(mb_left)) width = mouse_x - x; \ No newline at end of file diff --git a/objects/obj_test_wrap_zwsp/obj_test_wrap_zwsp.yy b/objects/obj_test_wrap_zwsp/obj_test_wrap_zwsp.yy new file mode 100644 index 000000000..cbc09f5ba --- /dev/null +++ b/objects/obj_test_wrap_zwsp/obj_test_wrap_zwsp.yy @@ -0,0 +1,35 @@ +{ + "spriteId": null, + "solid": false, + "visible": true, + "spriteMaskId": null, + "persistent": false, + "parentObjectId": null, + "physicsObject": false, + "physicsSensor": false, + "physicsShape": 1, + "physicsGroup": 0, + "physicsDensity": 0.5, + "physicsRestitution": 0.1, + "physicsLinearDamping": 0.1, + "physicsAngularDamping": 0.1, + "physicsFriction": 0.2, + "physicsStartAwake": true, + "physicsKinematic": false, + "physicsShapePoints": [], + "eventList": [ + {"isDnD":false,"eventNum":0,"eventType":0,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + {"isDnD":false,"eventNum":0,"eventType":8,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + {"isDnD":false,"eventNum":0,"eventType":3,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + ], + "properties": [], + "overriddenProperties": [], + "parent": { + "name": "Wrapping", + "path": "folders/Test Cases/Wrapping.yy", + }, + "resourceVersion": "1.0", + "name": "obj_test_wrap_zwsp", + "tags": [], + "resourceType": "GMObject", +} \ No newline at end of file diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index fc87983ca..d26cb5488 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -14,7 +14,7 @@ ], "layers": [ {"instances":[ - {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_font_shadow","path":"objects/obj_test_font_shadow/obj_test_font_shadow.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_3EECEFDA","tags":[],"resourceType":"GMRInstance",}, + {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_wrap_zwsp","path":"objects/obj_test_wrap_zwsp/obj_test_wrap_zwsp.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_6B6F2BC8","tags":[],"resourceType":"GMRInstance",}, ],"visible":true,"depth":0,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Example","tags":[],"resourceType":"GMRInstanceLayer",}, {"spriteId":null,"colour":4288702270,"x":0,"y":0,"htiled":false,"vtiled":false,"hspeed":0.0,"vspeed":0.0,"stretch":false,"animationFPS":15.0,"animationSpeedType":0,"userdefinedAnimFPS":false,"visible":true,"depth":100,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Background","tags":[],"resourceType":"GMRBackgroundLayer",}, ], @@ -22,7 +22,7 @@ "creationCodeFile": "", "inheritCode": false, "instanceCreationOrder": [ - {"name":"inst_3EECEFDA","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_6B6F2BC8","path":"rooms/rm_test/rm_test.yy",}, ], "inheritCreationOrder": false, "sequenceId": null, From 84fb7c8d40ee553a45c76eb93da80039ed3b295c Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 25 Feb 2022 14:37:01 +0000 Subject: [PATCH 09/25] Adds animation speed setter/getter to text elements --- .../__scribble_class_element.gml | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/scripts/__scribble_class_element/__scribble_class_element.gml b/scripts/__scribble_class_element/__scribble_class_element.gml index 23945524b..77d791b01 100644 --- a/scripts/__scribble_class_element/__scribble_class_element.gml +++ b/scripts/__scribble_class_element/__scribble_class_element.gml @@ -87,9 +87,9 @@ function __scribble_class_element(_string, _unique_id) constructor __tw_legacy_typist_use = false; } - __animation_time = current_time; - __animation_tick_speed = 1; - __animation_blink_state = true; + __animation_time = current_time; + __animation_speed = 1; + __animation_blink_state = true; __padding_l = 0; __padding_t = 0; @@ -391,7 +391,7 @@ function __scribble_class_element(_string, _unique_id) constructor //If enough time has elapsed since we drew this element then update our animation time if (current_time - __last_drawn > __SCRIBBLE_EXPECTED_FRAME_TIME) { - __animation_time += __animation_tick_speed*SCRIBBLE_TICK_SIZE; + __animation_time += __animation_speed*SCRIBBLE_TICK_SIZE; if (SCRIBBLE_SAFELY_WRAP_TIME) __animation_time = __animation_time mod 16383; //Cheeky wrapping to prevent GPUs with low accuracy flipping out } @@ -980,7 +980,19 @@ function __scribble_class_element(_string, _unique_id) constructor static animation_tick_speed = function() { - __scribble_error(".animation_tick_speed() has been removed\nPlease get in touch if this feature is essential for your project"); + __scribble_error(".animation_tick_speed() has been replaced by animation_speed()"); + } + + static animation_speed = function(_speed) + { + __animation_speed = _speed; + + return self; + } + + static get_animation_speed = function() + { + return __animation_speed; } static animation_sync = function() From a4cb5cc5f1ea7aec88d6420f8bd14fe67e531010 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 25 Feb 2022 14:37:12 +0000 Subject: [PATCH 10/25] Adds animation speed setter/getter test case --- Scribble.yyp | 23 ++++----- objects/obj_test_animation_speed/Create_0.gml | 1 + objects/obj_test_animation_speed/Draw_0.gml | 49 +++++++++++++++++++ objects/obj_test_animation_speed/Step_0.gml | 2 + .../obj_test_animation_speed.yy | 35 +++++++++++++ rooms/rm_test/rm_test.yy | 4 +- 6 files changed, 101 insertions(+), 13 deletions(-) create mode 100644 objects/obj_test_animation_speed/Create_0.gml create mode 100644 objects/obj_test_animation_speed/Draw_0.gml create mode 100644 objects/obj_test_animation_speed/Step_0.gml create mode 100644 objects/obj_test_animation_speed/obj_test_animation_speed.yy diff --git a/Scribble.yyp b/Scribble.yyp index ee1562c52..afe6a278a 100644 --- a/Scribble.yyp +++ b/Scribble.yyp @@ -5,7 +5,7 @@ {"id":{"name":"spr_coin","path":"sprites/spr_coin/spr_coin.yy",},"order":1,}, {"id":{"name":"obj_test_sprite_animation_speed","path":"objects/obj_test_sprite_animation_speed/obj_test_sprite_animation_speed.yy",},"order":7,}, {"id":{"name":"obj_test_typewriter_external_sound_per_char","path":"objects/obj_test_typewriter_external_sound_per_char/obj_test_typewriter_external_sound_per_char.yy",},"order":13,}, - {"id":{"name":"obj_test_anim_wave","path":"objects/obj_test_anim_wave/obj_test_anim_wave.yy",},"order":1,}, + {"id":{"name":"obj_test_anim_wave","path":"objects/obj_test_anim_wave/obj_test_anim_wave.yy",},"order":2,}, {"id":{"name":"scribble_anim_rainbow","path":"scripts/scribble_anim_rainbow/scribble_anim_rainbow.yy",},"order":3,}, {"id":{"name":"obj_test_bezier_arabic","path":"objects/obj_test_bezier_arabic/obj_test_bezier_arabic.yy",},"order":3,}, {"id":{"name":"obj_test_hebrew_hyphenated","path":"objects/obj_test_hebrew_hyphenated/obj_test_hebrew_hyphenated.yy",},"order":1,}, @@ -59,6 +59,7 @@ {"id":{"name":"obj_test_pages_pause_before_pagebreak","path":"objects/obj_test_pages_pause_before_pagebreak/obj_test_pages_pause_before_pagebreak.yy",},"order":4,}, {"id":{"name":"obj_test_align","path":"objects/obj_test_align/obj_test_align.yy",},"order":1,}, {"id":{"name":"__scribble_system","path":"scripts/__scribble_system/__scribble_system.yy",},"order":1,}, + {"id":{"name":"obj_test_animation_speed","path":"objects/obj_test_animation_speed/obj_test_animation_speed.yy",},"order":1,}, {"id":{"name":"spr_portrait_2","path":"sprites/spr_portrait_2/spr_portrait_2.yy",},"order":5,}, {"id":{"name":"rm_example","path":"rooms/rm_example/rm_example.yy",},"order":0,}, {"id":{"name":"scribble_font_bake_shadow","path":"scripts/scribble_font_bake_shadow/scribble_font_bake_shadow.yy",},"order":9,}, @@ -107,7 +108,7 @@ {"id":{"name":"obj_test_typewriter_out","path":"objects/obj_test_typewriter_out/obj_test_typewriter_out.yy",},"order":18,}, {"id":{"name":"__scribble_gen_3_devanagari","path":"scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.yy",},"order":4,}, {"id":{"name":"obj_test_bezier","path":"objects/obj_test_bezier/obj_test_bezier.yy",},"order":12,}, - {"id":{"name":"obj_test_anim_cycle","path":"objects/obj_test_anim_cycle/obj_test_anim_cycle.yy",},"order":7,}, + {"id":{"name":"obj_test_anim_cycle","path":"objects/obj_test_anim_cycle/obj_test_anim_cycle.yy",},"order":8,}, {"id":{"name":"scribble_glyph_set","path":"scripts/scribble_glyph_set/scribble_glyph_set.yy",},"order":4,}, {"id":{"name":"obj_test_typewriter_sound_per_char","path":"objects/obj_test_typewriter_sound_per_char/obj_test_typewriter_sound_per_char.yy",},"order":10,}, {"id":{"name":"fnt_hebrew","path":"fonts/fnt_hebrew/fnt_hebrew.yy",},"order":20,}, @@ -131,7 +132,7 @@ {"id":{"name":"scribble_super_glyph_copy_all","path":"scripts/scribble_super_glyph_copy_all/scribble_super_glyph_copy_all.yy",},"order":2,}, {"id":{"name":"draw_text_scribble_ext","path":"scripts/draw_text_scribble_ext/draw_text_scribble_ext.yy",},"order":1,}, {"id":{"name":"scribble_font_bake_outline_4dir","path":"scripts/scribble_font_bake_outline_4dir/scribble_font_bake_outline_4dir.yy",},"order":6,}, - {"id":{"name":"obj_test_cycle_comparison","path":"objects/obj_test_cycle_comparison/obj_test_cycle_comparison.yy",},"order":10,}, + {"id":{"name":"obj_test_cycle_comparison","path":"objects/obj_test_cycle_comparison/obj_test_cycle_comparison.yy",},"order":11,}, {"id":{"name":"scribble_fallback_font","path":"fonts/scribble_fallback_font/scribble_fallback_font.yy",},"order":0,}, {"id":{"name":"obj_test_bbox_getters","path":"objects/obj_test_bbox_getters/obj_test_bbox_getters.yy",},"order":7,}, {"id":{"name":"obj_test_colour","path":"objects/obj_test_colour/obj_test_colour.yy",},"order":1,}, @@ -145,11 +146,11 @@ {"id":{"name":"scribble_font_add_msdf","path":"scripts/scribble_font_add_msdf/scribble_font_add_msdf.yy",},"order":3,}, {"id":{"name":"__scribble_class_typist","path":"scripts/__scribble_class_typist/__scribble_class_typist.yy",},"order":4,}, {"id":{"name":"__scribble_system_glyph_data","path":"scripts/__scribble_system_glyph_data/__scribble_system_glyph_data.yy",},"order":2,}, - {"id":{"name":"obj_test_anim_blink","path":"objects/obj_test_anim_blink/obj_test_anim_blink.yy",},"order":9,}, + {"id":{"name":"obj_test_anim_blink","path":"objects/obj_test_anim_blink/obj_test_anim_blink.yy",},"order":10,}, {"id":{"name":"obj_test_padding_scale_to_box","path":"objects/obj_test_padding_scale_to_box/obj_test_padding_scale_to_box.yy",},"order":2,}, {"id":{"name":"obj_test_typewriter_delay_per_character","path":"objects/obj_test_typewriter_delay_per_character/obj_test_typewriter_delay_per_character.yy",},"order":16,}, {"id":{"name":"obj_test_missing_character","path":"objects/obj_test_missing_character/obj_test_missing_character.yy",},"order":5,}, - {"id":{"name":"obj_test_anim_jitter","path":"objects/obj_test_anim_jitter/obj_test_anim_jitter.yy",},"order":8,}, + {"id":{"name":"obj_test_anim_jitter","path":"objects/obj_test_anim_jitter/obj_test_anim_jitter.yy",},"order":9,}, {"id":{"name":"obj_test_msdf_superfont","path":"objects/obj_test_msdf_superfont/obj_test_msdf_superfont.yy",},"order":7,}, {"id":{"name":"scribble_font_add_from_sprite","path":"scripts/scribble_font_add_from_sprite/scribble_font_add_from_sprite.yy",},"order":2,}, {"id":{"name":"obj_test_font_outline_4dir","path":"objects/obj_test_font_outline_4dir/obj_test_font_outline_4dir.yy",},"order":6,}, @@ -162,7 +163,7 @@ {"id":{"name":"__shd_scribble_bake_outline_8dir_2px","path":"shaders/__shd_scribble_bake_outline_8dir_2px/__shd_scribble_bake_outline_8dir_2px.yy",},"order":4,}, {"id":{"name":"obj_test_wrap_zwsp","path":"objects/obj_test_wrap_zwsp/obj_test_wrap_zwsp.yy",},"order":7,}, {"id":{"name":"obj_test_font_shadow","path":"objects/obj_test_font_shadow/obj_test_font_shadow.yy",},"order":10,}, - {"id":{"name":"obj_test_anim_wobble","path":"objects/obj_test_anim_wobble/obj_test_anim_wobble.yy",},"order":4,}, + {"id":{"name":"obj_test_anim_wobble","path":"objects/obj_test_anim_wobble/obj_test_anim_wobble.yy",},"order":5,}, {"id":{"name":"obj_test_msdf_drop_shadow","path":"objects/obj_test_msdf_drop_shadow/obj_test_msdf_drop_shadow.yy",},"order":3,}, {"id":{"name":"scribble_typewriter_add_character_delay","path":"scripts/scribble_typewriter_add_character_delay/scribble_typewriter_add_character_delay.yy",},"order":6,}, {"id":{"name":"obj_test_msdf_soft_drop_shadow","path":"objects/obj_test_msdf_soft_drop_shadow/obj_test_msdf_soft_drop_shadow.yy",},"order":4,}, @@ -175,7 +176,7 @@ {"id":{"name":"obj_test_typewriter_ignore_delay","path":"objects/obj_test_typewriter_ignore_delay/obj_test_typewriter_ignore_delay.yy",},"order":6,}, {"id":{"name":"obj_test_line_height","path":"objects/obj_test_line_height/obj_test_line_height.yy",},"order":5,}, {"id":{"name":"obj_test_typewriter_pause","path":"objects/obj_test_typewriter_pause/obj_test_typewriter_pause.yy",},"order":7,}, - {"id":{"name":"obj_test_anim_rainbow","path":"objects/obj_test_anim_rainbow/obj_test_anim_rainbow.yy",},"order":3,}, + {"id":{"name":"obj_test_anim_rainbow","path":"objects/obj_test_anim_rainbow/obj_test_anim_rainbow.yy",},"order":4,}, {"id":{"name":"obj_test_surface","path":"objects/obj_test_surface/obj_test_surface.yy",},"order":6,}, {"id":{"name":"scribble_external_sound_exists","path":"scripts/scribble_external_sound_exists/scribble_external_sound_exists.yy",},"order":10,}, {"id":{"name":"scribble_font_get_glyph_ranges","path":"scripts/scribble_font_get_glyph_ranges/scribble_font_get_glyph_ranges.yy",},"order":14,}, @@ -191,11 +192,11 @@ {"id":{"name":"scribble_anim_jitter","path":"scripts/scribble_anim_jitter/scribble_anim_jitter.yy",},"order":8,}, {"id":{"name":"obj_test_wrap","path":"objects/obj_test_wrap/obj_test_wrap.yy",},"order":0,}, {"id":{"name":"obj_test_starting_format","path":"objects/obj_test_starting_format/obj_test_starting_format.yy",},"order":0,}, - {"id":{"name":"obj_test_anim_shake","path":"objects/obj_test_anim_shake/obj_test_anim_shake.yy",},"order":2,}, + {"id":{"name":"obj_test_anim_shake","path":"objects/obj_test_anim_shake/obj_test_anim_shake.yy",},"order":3,}, {"id":{"name":"obj_test_region_msdf","path":"objects/obj_test_region_msdf/obj_test_region_msdf.yy",},"order":3,}, {"id":{"name":"obj_test_bbox_revealed","path":"objects/obj_test_bbox_revealed/obj_test_bbox_revealed.yy",},"order":1,}, {"id":{"name":"fnt_monospace","path":"fonts/fnt_monospace/fnt_monospace.yy",},"order":4,}, - {"id":{"name":"obj_test_anim_wheel","path":"objects/obj_test_anim_wheel/obj_test_anim_wheel.yy",},"order":6,}, + {"id":{"name":"obj_test_anim_wheel","path":"objects/obj_test_anim_wheel/obj_test_anim_wheel.yy",},"order":7,}, {"id":{"name":"__scribble_font_add_all_from_project","path":"scripts/__scribble_font_add_all_from_project/__scribble_font_add_all_from_project.yy",},"order":4,}, {"id":{"name":"obj_test_legacy_typewriter_pause","path":"objects/obj_test_legacy_typewriter_pause/obj_test_legacy_typewriter_pause.yy",},"order":3,}, {"id":{"name":"__shd_scribble_msdf","path":"shaders/__shd_scribble_msdf/__shd_scribble_msdf.yy",},"order":1,}, @@ -261,7 +262,7 @@ {"id":{"name":"__scribble_gen_5_finalize_bidi","path":"scripts/__scribble_gen_5_finalize_bidi/__scribble_gen_5_finalize_bidi.yy",},"order":6,}, {"id":{"name":"obj_test_alignment","path":"objects/obj_test_alignment/obj_test_alignment.yy",},"order":14,}, {"id":{"name":"obj_test_ignore_command_tags","path":"objects/obj_test_ignore_command_tags/obj_test_ignore_command_tags.yy",},"order":15,}, - {"id":{"name":"obj_test_anim_pulse","path":"objects/obj_test_anim_pulse/obj_test_anim_pulse.yy",},"order":5,}, + {"id":{"name":"obj_test_anim_pulse","path":"objects/obj_test_anim_pulse/obj_test_anim_pulse.yy",},"order":6,}, {"id":{"name":"obj_test_typewriter_gc","path":"objects/obj_test_typewriter_gc/obj_test_typewriter_gc.yy",},"order":17,}, {"id":{"name":"rm_test","path":"rooms/rm_test/rm_test.yy",},"order":1,}, ], @@ -289,8 +290,8 @@ "children": [], }, "RoomOrderNodes": [ - {"roomId":{"name":"rm_example","path":"rooms/rm_example/rm_example.yy",},}, {"roomId":{"name":"rm_test","path":"rooms/rm_test/rm_test.yy",},}, + {"roomId":{"name":"rm_example","path":"rooms/rm_example/rm_example.yy",},}, ], "Folders": [ {"folderPath":"folders/Sprites.yy","order":1,"resourceVersion":"1.0","name":"Sprites","tags":[],"resourceType":"GMFolder",}, diff --git a/objects/obj_test_animation_speed/Create_0.gml b/objects/obj_test_animation_speed/Create_0.gml new file mode 100644 index 000000000..574873c7f --- /dev/null +++ b/objects/obj_test_animation_speed/Create_0.gml @@ -0,0 +1 @@ +animation_speed = 1; \ No newline at end of file diff --git a/objects/obj_test_animation_speed/Draw_0.gml b/objects/obj_test_animation_speed/Draw_0.gml new file mode 100644 index 000000000..d6d7a1934 --- /dev/null +++ b/objects/obj_test_animation_speed/Draw_0.gml @@ -0,0 +1,49 @@ +draw_text(10, 10, animation_speed); + +var _x = 10; +var _y = 50; + +var _element = scribble("[wave]wavy text wavy text wavy text"); +_element.animation_speed(animation_speed); +_element.draw(_x, _y); +_y += _element.get_height() + 10; + +var _element = scribble("[shake]shaky text shaky text shaky text"); +_element.animation_speed(animation_speed); +_element.draw(_x, _y); +_y += _element.get_height() + 10; + +var _element = scribble("[wobble]wobbly text wobbly text wobbly text"); +_element.animation_speed(animation_speed); +_element.draw(_x, _y); +_y += _element.get_height() + 10; + +var _element = scribble("[pulse]pulsing text pulsing text pulsing text"); +_element.animation_speed(animation_speed); +_element.draw(_x, _y); +_y += _element.get_height() + 10; + +var _element = scribble("[wheel]wheely text wheely text wheely text"); +_element.animation_speed(animation_speed); +_element.draw(_x, _y); +_y += _element.get_height() + 10; + +var _element = scribble("[jitter]jittery text jittery text jittery text"); +_element.animation_speed(animation_speed); +_element.draw(_x, _y); +_y += _element.get_height() + 10; + +var _element = scribble("[blink]blinky text blinky text blinky text"); +_element.animation_speed(animation_speed); +_element.draw(_x, _y); +_y += _element.get_height() + 10; + +var _element = scribble("[rainbow]rainbow text rainbow text rainbow text"); +_element.animation_speed(animation_speed); +_element.draw(_x, _y); +_y += _element.get_height() + 10; + +var _element = scribble("[cycle, 200, 140, 190, 150]cycling text cycling text cycling text"); +_element.animation_speed(animation_speed); +_element.draw(_x, _y); +_y += _element.get_height() + 10; \ No newline at end of file diff --git a/objects/obj_test_animation_speed/Step_0.gml b/objects/obj_test_animation_speed/Step_0.gml new file mode 100644 index 000000000..51cefe760 --- /dev/null +++ b/objects/obj_test_animation_speed/Step_0.gml @@ -0,0 +1,2 @@ +if (keyboard_check(vk_up)) animation_speed = min(2, animation_speed + 0.01); +if (keyboard_check(vk_down)) animation_speed = max(0, animation_speed - 0.01); \ No newline at end of file diff --git a/objects/obj_test_animation_speed/obj_test_animation_speed.yy b/objects/obj_test_animation_speed/obj_test_animation_speed.yy new file mode 100644 index 000000000..b177704ac --- /dev/null +++ b/objects/obj_test_animation_speed/obj_test_animation_speed.yy @@ -0,0 +1,35 @@ +{ + "spriteId": null, + "solid": false, + "visible": true, + "spriteMaskId": null, + "persistent": false, + "parentObjectId": null, + "physicsObject": false, + "physicsSensor": false, + "physicsShape": 1, + "physicsGroup": 1, + "physicsDensity": 0.5, + "physicsRestitution": 0.1, + "physicsLinearDamping": 0.1, + "physicsAngularDamping": 0.1, + "physicsFriction": 0.2, + "physicsStartAwake": true, + "physicsKinematic": false, + "physicsShapePoints": [], + "eventList": [ + {"isDnD":false,"eventNum":0,"eventType":8,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + {"isDnD":false,"eventNum":0,"eventType":0,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + {"isDnD":false,"eventNum":0,"eventType":3,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + ], + "properties": [], + "overriddenProperties": [], + "parent": { + "name": "Animation", + "path": "folders/Test Cases/Animation.yy", + }, + "resourceVersion": "1.0", + "name": "obj_test_animation_speed", + "tags": [], + "resourceType": "GMObject", +} \ No newline at end of file diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index d26cb5488..31f685315 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -14,7 +14,7 @@ ], "layers": [ {"instances":[ - {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_wrap_zwsp","path":"objects/obj_test_wrap_zwsp/obj_test_wrap_zwsp.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_6B6F2BC8","tags":[],"resourceType":"GMRInstance",}, + {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_animation_speed","path":"objects/obj_test_animation_speed/obj_test_animation_speed.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_D2ED121","tags":[],"resourceType":"GMRInstance",}, ],"visible":true,"depth":0,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Example","tags":[],"resourceType":"GMRInstanceLayer",}, {"spriteId":null,"colour":4288702270,"x":0,"y":0,"htiled":false,"vtiled":false,"hspeed":0.0,"vspeed":0.0,"stretch":false,"animationFPS":15.0,"animationSpeedType":0,"userdefinedAnimFPS":false,"visible":true,"depth":100,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Background","tags":[],"resourceType":"GMRBackgroundLayer",}, ], @@ -22,7 +22,7 @@ "creationCodeFile": "", "inheritCode": false, "instanceCreationOrder": [ - {"name":"inst_6B6F2BC8","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_D2ED121","path":"rooms/rm_test/rm_test.yy",}, ], "inheritCreationOrder": false, "sequenceId": null, From 815eff8b5b5d141952760fff53c0fc052ed4acb2 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 25 Feb 2022 15:02:11 +0000 Subject: [PATCH 11/25] Adds .flash() (to replace the old .fog()) --- .../__scribble_class_element.gml | 39 ++++++++++++++++++- .../__scribble_system/__scribble_system.gml | 2 + shaders/__shd_scribble/__shd_scribble.vsh | 9 +++-- .../__shd_scribble_msdf.vsh | 11 +++--- 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/scripts/__scribble_class_element/__scribble_class_element.gml b/scripts/__scribble_class_element/__scribble_class_element.gml index 77d791b01..ee51a2954 100644 --- a/scripts/__scribble_class_element/__scribble_class_element.gml +++ b/scripts/__scribble_class_element/__scribble_class_element.gml @@ -39,9 +39,10 @@ function __scribble_class_element(_string, _unique_id) constructor __starting_valign = SCRIBBLE_DEFAULT_VALIGN; __blend_colour = c_white; __blend_alpha = 1.0; - __gradient_colour = c_black; __gradient_alpha = 0.0; + __flash_colour = c_white; + __flash_alpha = 1.0; __origin_x = 0.0; __origin_y = 0.0; @@ -523,6 +524,30 @@ function __scribble_class_element(_string, _unique_id) constructor return self; } + static fog = function() + { + __scribble_error(".fog() has been replaced by .flash()"); + } + + /// @param colour + /// @param alpha + static flash = function(_colour, _alpha) + { + if (is_string(_colour)) + { + _colour = global.__scribble_colours[? _colour]; + if (_colour == undefined) + { + __scribble_error("Colour name \"", _colour, "\" not recognised"); + exit; + } + } + + __flash_colour = _colour & 0xFFFFFF; + __flash_alpha = _alpha; + return self; + } + #endregion @@ -980,7 +1005,7 @@ function __scribble_class_element(_string, _unique_id) constructor static animation_tick_speed = function() { - __scribble_error(".animation_tick_speed() has been replaced by animation_speed()"); + __scribble_error(".animation_tick_speed() has been replaced by .animation_speed()"); } static animation_speed = function(_speed) @@ -1324,6 +1349,11 @@ function __scribble_class_element(_string, _unique_id) constructor colour_get_blue( __gradient_colour)/255, __gradient_alpha); + shader_set_uniform_f(global.__scribble_u_vFlash, colour_get_red( __flash_colour)/255, + colour_get_green(__flash_colour)/255, + colour_get_blue( __flash_colour)/255, + __flash_alpha); + shader_set_uniform_f(global.__scribble_u_vRegionActive, __region_glyph_start, __region_glyph_end); shader_set_uniform_f(global.__scribble_u_vRegionColour, colour_get_red( __region_colour)/255, @@ -1400,6 +1430,11 @@ function __scribble_class_element(_string, _unique_id) constructor colour_get_blue( __gradient_colour)/255, __gradient_alpha); + shader_set_uniform_f(global.__scribble_msdf_u_vFlash, colour_get_red( __flash_colour)/255, + colour_get_green(__flash_colour)/255, + colour_get_blue( __flash_colour)/255, + __flash_alpha); + shader_set_uniform_f(global.__scribble_msdf_u_vRegionActive, __region_glyph_start, __region_glyph_end); shader_set_uniform_f(global.__scribble_msdf_u_vRegionColour, colour_get_red( __region_colour)/255, diff --git a/scripts/__scribble_system/__scribble_system.gml b/scripts/__scribble_system/__scribble_system.gml index 5b070f994..407f83f4f 100644 --- a/scripts/__scribble_system/__scribble_system.gml +++ b/scripts/__scribble_system/__scribble_system.gml @@ -225,6 +225,7 @@ global.__scribble_passthrough_vertex_format = vertex_format_end(); global.__scribble_u_fTime = shader_get_uniform(__shd_scribble, "u_fTime" ); global.__scribble_u_vColourBlend = shader_get_uniform(__shd_scribble, "u_vColourBlend" ); global.__scribble_u_vGradient = shader_get_uniform(__shd_scribble, "u_vGradient" ); +global.__scribble_u_vFlash = shader_get_uniform(__shd_scribble, "u_vFlash" ); global.__scribble_u_vRegionActive = shader_get_uniform(__shd_scribble, "u_vRegionActive" ); global.__scribble_u_vRegionColour = shader_get_uniform(__shd_scribble, "u_vRegionColour" ); global.__scribble_u_aDataFields = shader_get_uniform(__shd_scribble, "u_aDataFields" ); @@ -242,6 +243,7 @@ global.__scribble_u_fTypewriterAlphaDuration = shader_get_uniform(__shd_scribble global.__scribble_msdf_u_fTime = shader_get_uniform(__shd_scribble_msdf, "u_fTime" ); global.__scribble_msdf_u_vColourBlend = shader_get_uniform(__shd_scribble_msdf, "u_vColourBlend" ); global.__scribble_msdf_u_vGradient = shader_get_uniform(__shd_scribble_msdf, "u_vGradient" ); +global.__scribble_msdf_u_vFlash = shader_get_uniform(__shd_scribble_msdf, "u_vFlash" ); global.__scribble_msdf_u_vRegionActive = shader_get_uniform(__shd_scribble_msdf, "u_vRegionActive" ); global.__scribble_msdf_u_vRegionColour = shader_get_uniform(__shd_scribble_msdf, "u_vRegionColour" ); global.__scribble_msdf_u_aDataFields = shader_get_uniform(__shd_scribble_msdf, "u_aDataFields" ); diff --git a/shaders/__shd_scribble/__shd_scribble.vsh b/shaders/__shd_scribble/__shd_scribble.vsh index fdc42d1a5..205c884b2 100644 --- a/shaders/__shd_scribble/__shd_scribble.vsh +++ b/shaders/__shd_scribble/__shd_scribble.vsh @@ -79,6 +79,7 @@ varying vec4 v_vColour; uniform vec4 u_vColourBlend; //4 uniform vec4 u_vGradient; //4 +uniform vec4 u_vFlash; //4 uniform vec2 u_vRegionActive; //2 uniform vec4 u_vRegionColour; //4 uniform float u_fTime; //1 @@ -460,10 +461,10 @@ void main() if ((BLINK_FLAG > 0.5) && (u_fBlinkState < 0.5)) v_vColour.a = 0.0; //Regions - if ((characterIndex >= u_vRegionActive.x) && (characterIndex <= u_vRegionActive.y)) - { - v_vColour.rgb = mix(v_vColour.rgb, u_vRegionColour.rgb, u_vRegionColour.a); - } + if ((characterIndex >= u_vRegionActive.x) && (characterIndex <= u_vRegionActive.y)) v_vColour.rgb = mix(v_vColour.rgb, u_vRegionColour.rgb, u_vRegionColour.a); + + //Flash + v_vColour.rgb = mix(v_vColour.rgb, u_vFlash.rgb, u_vFlash.a); diff --git a/shaders/__shd_scribble_msdf/__shd_scribble_msdf.vsh b/shaders/__shd_scribble_msdf/__shd_scribble_msdf.vsh index cf537e35d..b9f2858bd 100644 --- a/shaders/__shd_scribble_msdf/__shd_scribble_msdf.vsh +++ b/shaders/__shd_scribble_msdf/__shd_scribble_msdf.vsh @@ -81,6 +81,7 @@ varying float v_fTextScale; uniform vec4 u_vColourBlend; //4 uniform vec4 u_vGradient; //4 +uniform vec4 u_vFlash; //4 uniform vec2 u_vRegionActive; //2 uniform vec4 u_vRegionColour; //4 uniform float u_fTime; //1 @@ -475,13 +476,11 @@ void main() if (SPRITE_FLAG > 0.5) v_vColour.a *= filterSprite(in_Normal.y); //Use packed sprite data to filter out sprite frames that we don't want if ((BLINK_FLAG > 0.5) && (u_fBlinkState < 0.5)) v_vColour.a = 0.0; - - //Regions - if ((characterIndex >= u_vRegionActive.x) && (characterIndex <= u_vRegionActive.y)) - { - v_vColour.rgb = mix(v_vColour.rgb, u_vRegionColour.rgb, u_vRegionColour.a); - } + if ((characterIndex >= u_vRegionActive.x) && (characterIndex <= u_vRegionActive.y)) v_vColour.rgb = mix(v_vColour.rgb, u_vRegionColour.rgb, u_vRegionColour.a); + + //Flash + v_vColour.rgb = mix(v_vColour.rgb, u_vFlash.rgb, u_vFlash.a); From 3b4dc5c76dad99956f1657d2ca9adb59dff062e5 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 25 Feb 2022 15:06:04 +0000 Subject: [PATCH 12/25] Adds .flash() test case --- Scribble.yyp | 31 +++++++++++----------- objects/obj_test_flash/Draw_0.gml | 8 ++++++ objects/obj_test_flash/obj_test_flash.yy | 33 ++++++++++++++++++++++++ rooms/rm_test/rm_test.yy | 4 +-- 4 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 objects/obj_test_flash/Draw_0.gml create mode 100644 objects/obj_test_flash/obj_test_flash.yy diff --git a/Scribble.yyp b/Scribble.yyp index afe6a278a..803ab5cd4 100644 --- a/Scribble.yyp +++ b/Scribble.yyp @@ -23,7 +23,7 @@ {"id":{"name":"snd_crank","path":"sounds/snd_crank/snd_crank.yy",},"order":0,}, {"id":{"name":"snd_switch","path":"sounds/snd_switch/snd_switch.yy",},"order":1,}, {"id":{"name":"scribble_is_text_element","path":"scripts/scribble_is_text_element/scribble_is_text_element.yy",},"order":6,}, - {"id":{"name":"obj_test_sprite_colouring","path":"objects/obj_test_sprite_colouring/obj_test_sprite_colouring.yy",},"order":4,}, + {"id":{"name":"obj_test_sprite_colouring","path":"objects/obj_test_sprite_colouring/obj_test_sprite_colouring.yy",},"order":5,}, {"id":{"name":"scribble_external_sound_add","path":"scripts/scribble_external_sound_add/scribble_external_sound_add.yy",},"order":8,}, {"id":{"name":"obj_test_scale_to_box_plus_transformation","path":"objects/obj_test_scale_to_box_plus_transformation/obj_test_scale_to_box_plus_transformation.yy",},"order":14,}, {"id":{"name":"obj_test_hash_to_newline","path":"objects/obj_test_hash_to_newline/obj_test_hash_to_newline.yy",},"order":0,}, @@ -68,7 +68,7 @@ {"id":{"name":"scribble_flush_everything","path":"scripts/scribble_flush_everything/scribble_flush_everything.yy",},"order":2,}, {"id":{"name":"obj_test_pages_with_typist_and_events","path":"objects/obj_test_pages_with_typist_and_events/obj_test_pages_with_typist_and_events.yy",},"order":3,}, {"id":{"name":"scribble_font_add","path":"scripts/scribble_font_add/scribble_font_add.yy",},"order":1,}, - {"id":{"name":"obj_test_slant","path":"objects/obj_test_slant/obj_test_slant.yy",},"order":12,}, + {"id":{"name":"obj_test_slant","path":"objects/obj_test_slant/obj_test_slant.yy",},"order":13,}, {"id":{"name":"obj_test_font_outline_8dir","path":"objects/obj_test_font_outline_8dir/obj_test_font_outline_8dir.yy",},"order":7,}, {"id":{"name":"obj_test_msdf_border_thickness","path":"objects/obj_test_msdf_border_thickness/obj_test_msdf_border_thickness.yy",},"order":1,}, {"id":{"name":"fnt_style_b","path":"fonts/fnt_style_b/fnt_style_b.yy",},"order":10,}, @@ -76,12 +76,13 @@ {"id":{"name":"obj_test_msdf_feather","path":"objects/obj_test_msdf_feather/obj_test_msdf_feather.yy",},"order":5,}, {"id":{"name":"scribble_font_add_all","path":"scripts/scribble_font_add_all/scribble_font_add_all.yy",},"order":0,}, {"id":{"name":"obj_test_typewriter_get_position","path":"objects/obj_test_typewriter_get_position/obj_test_typewriter_get_position.yy",},"order":14,}, - {"id":{"name":"obj_test_sound_tag","path":"objects/obj_test_sound_tag/obj_test_sound_tag.yy",},"order":13,}, + {"id":{"name":"obj_test_sound_tag","path":"objects/obj_test_sound_tag/obj_test_sound_tag.yy",},"order":14,}, {"id":{"name":"obj_test_fit_to_box_plus_transformation","path":"objects/obj_test_fit_to_box_plus_transformation/obj_test_fit_to_box_plus_transformation.yy",},"order":13,}, {"id":{"name":"obj_test_transform","path":"objects/obj_test_transform/obj_test_transform.yy",},"order":4,}, {"id":{"name":"fnt_dialogue_2","path":"fonts/fnt_dialogue_2/fnt_dialogue_2.yy",},"order":14,}, {"id":{"name":"scribble_super_create","path":"scripts/scribble_super_create/scribble_super_create.yy",},"order":0,}, {"id":{"name":"obj_test_thai","path":"objects/obj_test_thai/obj_test_thai.yy",},"order":0,}, + {"id":{"name":"obj_test_flash","path":"objects/obj_test_flash/obj_test_flash.yy",},"order":4,}, {"id":{"name":"fnt_style_i","path":"fonts/fnt_style_i/fnt_style_i.yy",},"order":11,}, {"id":{"name":"__scribble_config_colours","path":"scripts/__scribble_config_colours/__scribble_config_colours.yy",},"order":2,}, {"id":{"name":"__scribble_class_model","path":"scripts/__scribble_class_model/__scribble_class_model.yy",},"order":2,}, @@ -112,8 +113,8 @@ {"id":{"name":"scribble_glyph_set","path":"scripts/scribble_glyph_set/scribble_glyph_set.yy",},"order":4,}, {"id":{"name":"obj_test_typewriter_sound_per_char","path":"objects/obj_test_typewriter_sound_per_char/obj_test_typewriter_sound_per_char.yy",},"order":10,}, {"id":{"name":"fnt_hebrew","path":"fonts/fnt_hebrew/fnt_hebrew.yy",},"order":20,}, - {"id":{"name":"obj_test_newline","path":"objects/obj_test_newline/obj_test_newline.yy",},"order":8,}, - {"id":{"name":"obj_test_reset","path":"objects/obj_test_reset/obj_test_reset.yy",},"order":17,}, + {"id":{"name":"obj_test_newline","path":"objects/obj_test_newline/obj_test_newline.yy",},"order":9,}, + {"id":{"name":"obj_test_reset","path":"objects/obj_test_reset/obj_test_reset.yy",},"order":18,}, {"id":{"name":"obj_test_wrap_very_narrow","path":"objects/obj_test_wrap_very_narrow/obj_test_wrap_very_narrow.yy",},"order":1,}, {"id":{"name":"obj_test_manual_page_break","path":"objects/obj_test_manual_page_break/obj_test_manual_page_break.yy",},"order":0,}, {"id":{"name":"obj_test_wrap_align_right","path":"objects/obj_test_wrap_align_right/obj_test_wrap_align_right.yy",},"order":3,}, @@ -177,7 +178,7 @@ {"id":{"name":"obj_test_line_height","path":"objects/obj_test_line_height/obj_test_line_height.yy",},"order":5,}, {"id":{"name":"obj_test_typewriter_pause","path":"objects/obj_test_typewriter_pause/obj_test_typewriter_pause.yy",},"order":7,}, {"id":{"name":"obj_test_anim_rainbow","path":"objects/obj_test_anim_rainbow/obj_test_anim_rainbow.yy",},"order":4,}, - {"id":{"name":"obj_test_surface","path":"objects/obj_test_surface/obj_test_surface.yy",},"order":6,}, + {"id":{"name":"obj_test_surface","path":"objects/obj_test_surface/obj_test_surface.yy",},"order":7,}, {"id":{"name":"scribble_external_sound_exists","path":"scripts/scribble_external_sound_exists/scribble_external_sound_exists.yy",},"order":10,}, {"id":{"name":"scribble_font_get_glyph_ranges","path":"scripts/scribble_font_get_glyph_ranges/scribble_font_get_glyph_ranges.yy",},"order":14,}, {"id":{"name":"__scribble_config_defaults","path":"scripts/__scribble_config_defaults/__scribble_config_defaults.yy",},"order":0,}, @@ -205,24 +206,24 @@ {"id":{"name":"fnt_segoe_ui_12","path":"fonts/fnt_segoe_ui_12/fnt_segoe_ui_12.yy",},"order":21,}, {"id":{"name":"obj_test_typewriter_custom","path":"objects/obj_test_typewriter_custom/obj_test_typewriter_custom.yy",},"order":9,}, {"id":{"name":"scribble_anim_blink","path":"scripts/scribble_anim_blink/scribble_anim_blink.yy",},"order":9,}, - {"id":{"name":"obj_test_pin_alignment","path":"objects/obj_test_pin_alignment/obj_test_pin_alignment.yy",},"order":16,}, - {"id":{"name":"obj_test_fa_middle","path":"objects/obj_test_fa_middle/obj_test_fa_middle.yy",},"order":18,}, + {"id":{"name":"obj_test_pin_alignment","path":"objects/obj_test_pin_alignment/obj_test_pin_alignment.yy",},"order":17,}, + {"id":{"name":"obj_test_fa_middle","path":"objects/obj_test_fa_middle/obj_test_fa_middle.yy",},"order":19,}, {"id":{"name":"obj_test_sprite_origins","path":"objects/obj_test_sprite_origins/obj_test_sprite_origins.yy",},"order":4,}, {"id":{"name":"__scribble_font_add_sprite","path":"scripts/__scribble_font_add_sprite/__scribble_font_add_sprite.yy",},"order":6,}, {"id":{"name":"__shd_scribble_bake_outline_4dir","path":"shaders/__shd_scribble_bake_outline_4dir/__shd_scribble_bake_outline_4dir.yy",},"order":2,}, {"id":{"name":"__shd_scribble_bake_shadow","path":"shaders/__shd_scribble_bake_shadow/__shd_scribble_bake_shadow.yy",},"order":5,}, {"id":{"name":"obj_test_region","path":"objects/obj_test_region/obj_test_region.yy",},"order":0,}, {"id":{"name":"fnt_test_0","path":"fonts/fnt_test_0/fnt_test_0.yy",},"order":1,}, - {"id":{"name":"obj_test_nbsp","path":"objects/obj_test_nbsp/obj_test_nbsp.yy",},"order":9,}, + {"id":{"name":"obj_test_nbsp","path":"objects/obj_test_nbsp/obj_test_nbsp.yy",},"order":10,}, {"id":{"name":"obj_test_flush","path":"objects/obj_test_flush/obj_test_flush.yy",},"order":10,}, {"id":{"name":"obj_test_get_events","path":"objects/obj_test_get_events/obj_test_get_events.yy",},"order":12,}, {"id":{"name":"fnt_test_1","path":"fonts/fnt_test_1/fnt_test_1.yy",},"order":2,}, {"id":{"name":"obj_test_typewriter_events","path":"objects/obj_test_typewriter_events/obj_test_typewriter_events.yy",},"order":2,}, - {"id":{"name":"obj_test_scale_tags","path":"objects/obj_test_scale_tags/obj_test_scale_tags.yy",},"order":11,}, + {"id":{"name":"obj_test_scale_tags","path":"objects/obj_test_scale_tags/obj_test_scale_tags.yy",},"order":12,}, {"id":{"name":"obj_test_superfont","path":"objects/obj_test_superfont/obj_test_superfont.yy",},"order":1,}, {"id":{"name":"obj_test_linewrap_multi_vbuff","path":"objects/obj_test_linewrap_multi_vbuff/obj_test_linewrap_multi_vbuff.yy",},"order":5,}, {"id":{"name":"obj_test_typewriter_delay_plus_sound","path":"objects/obj_test_typewriter_delay_plus_sound/obj_test_typewriter_delay_plus_sound.yy",},"order":11,}, - {"id":{"name":"obj_test_nbsp_repeat","path":"objects/obj_test_nbsp_repeat/obj_test_nbsp_repeat.yy",},"order":10,}, + {"id":{"name":"obj_test_nbsp_repeat","path":"objects/obj_test_nbsp_repeat/obj_test_nbsp_repeat.yy",},"order":11,}, {"id":{"name":"obj_test_typewriter_delay","path":"objects/obj_test_typewriter_delay/obj_test_typewriter_delay.yy",},"order":5,}, {"id":{"name":"obj_test_hebrew","path":"objects/obj_test_hebrew/obj_test_hebrew.yy",},"order":0,}, {"id":{"name":"__scribble_class_font","path":"scripts/__scribble_class_font/__scribble_class_font.yy",},"order":0,}, @@ -232,7 +233,7 @@ {"id":{"name":"obj_test_typewriter_manual_arabic","path":"objects/obj_test_typewriter_manual_arabic/obj_test_typewriter_manual_arabic.yy",},"order":1,}, {"id":{"name":"fnt_industrydemi","path":"fonts/fnt_industrydemi/fnt_industrydemi.yy",},"order":15,}, {"id":{"name":"obj_test_typewriter_duplicate_draw","path":"objects/obj_test_typewriter_duplicate_draw/obj_test_typewriter_duplicate_draw.yy",},"order":4,}, - {"id":{"name":"obj_test_new_cache","path":"objects/obj_test_new_cache/obj_test_new_cache.yy",},"order":5,}, + {"id":{"name":"obj_test_new_cache","path":"objects/obj_test_new_cache/obj_test_new_cache.yy",},"order":6,}, {"id":{"name":"fnt_noto_chinese","path":"fonts/fnt_noto_chinese/fnt_noto_chinese.yy",},"order":6,}, {"id":{"name":"obj_test_get_glyph_data","path":"objects/obj_test_get_glyph_data/obj_test_get_glyph_data.yy",},"order":3,}, {"id":{"name":"scribble_font_set_style_family","path":"scripts/scribble_font_set_style_family/scribble_font_set_style_family.yy",},"order":3,}, @@ -253,14 +254,14 @@ {"id":{"name":"fnt_noto_japanese","path":"fonts/fnt_noto_japanese/fnt_noto_japanese.yy",},"order":7,}, {"id":{"name":"__scribble_gen_9_write_vbuffs","path":"scripts/__scribble_gen_9_write_vbuffs/__scribble_gen_9_write_vbuffs.yy",},"order":10,}, {"id":{"name":"scribble_external_sound_remove","path":"scripts/scribble_external_sound_remove/scribble_external_sound_remove.yy",},"order":9,}, - {"id":{"name":"obj_test_alignment_changes","path":"objects/obj_test_alignment_changes/obj_test_alignment_changes.yy",},"order":15,}, + {"id":{"name":"obj_test_alignment_changes","path":"objects/obj_test_alignment_changes/obj_test_alignment_changes.yy",},"order":16,}, {"id":{"name":"scribble_super_glyph_delete","path":"scripts/scribble_super_glyph_delete/scribble_super_glyph_delete.yy",},"order":3,}, {"id":{"name":"obj_test_stress_lots_of_text","path":"objects/obj_test_stress_lots_of_text/obj_test_stress_lots_of_text.yy",},"order":3,}, {"id":{"name":"obj_test_line_spacing","path":"objects/obj_test_line_spacing/obj_test_line_spacing.yy",},"order":6,}, {"id":{"name":"scribble_font_bake_outline_8dir_2px","path":"scripts/scribble_font_bake_outline_8dir_2px/scribble_font_bake_outline_8dir_2px.yy",},"order":8,}, - {"id":{"name":"obj_test_world_matrix","path":"objects/obj_test_world_matrix/obj_test_world_matrix.yy",},"order":7,}, + {"id":{"name":"obj_test_world_matrix","path":"objects/obj_test_world_matrix/obj_test_world_matrix.yy",},"order":8,}, {"id":{"name":"__scribble_gen_5_finalize_bidi","path":"scripts/__scribble_gen_5_finalize_bidi/__scribble_gen_5_finalize_bidi.yy",},"order":6,}, - {"id":{"name":"obj_test_alignment","path":"objects/obj_test_alignment/obj_test_alignment.yy",},"order":14,}, + {"id":{"name":"obj_test_alignment","path":"objects/obj_test_alignment/obj_test_alignment.yy",},"order":15,}, {"id":{"name":"obj_test_ignore_command_tags","path":"objects/obj_test_ignore_command_tags/obj_test_ignore_command_tags.yy",},"order":15,}, {"id":{"name":"obj_test_anim_pulse","path":"objects/obj_test_anim_pulse/obj_test_anim_pulse.yy",},"order":6,}, {"id":{"name":"obj_test_typewriter_gc","path":"objects/obj_test_typewriter_gc/obj_test_typewriter_gc.yy",},"order":17,}, diff --git a/objects/obj_test_flash/Draw_0.gml b/objects/obj_test_flash/Draw_0.gml new file mode 100644 index 000000000..20e3388be --- /dev/null +++ b/objects/obj_test_flash/Draw_0.gml @@ -0,0 +1,8 @@ +var _t = mouse_x / room_width; + +scribble("[c_coquelicot]Test[/c] white").flash(c_red, _t).draw(x, y); +scribble("Test grey").blend(c_grey, 1.0).flash(c_red, _t).draw(x, y + 30); +scribble("Test red").blend("c_coquelicot", 1.0).flash(c_red, _t).draw(x, y + 60); +scribble("Test red").starting_format(undefined, "c_coquelicot").flash(c_red, _t).draw(x, y + 90); +scribble("[#ff3800]Test[/c] white").flash(c_red, _t).draw(x, y + 120); +scribble("[d#" + string(0x0038FF) + "]Test[/c] white").flash(c_red, _t).draw(x, y + 150); \ No newline at end of file diff --git a/objects/obj_test_flash/obj_test_flash.yy b/objects/obj_test_flash/obj_test_flash.yy new file mode 100644 index 000000000..c4b945852 --- /dev/null +++ b/objects/obj_test_flash/obj_test_flash.yy @@ -0,0 +1,33 @@ +{ + "spriteId": null, + "solid": false, + "visible": true, + "spriteMaskId": null, + "persistent": false, + "parentObjectId": null, + "physicsObject": false, + "physicsSensor": false, + "physicsShape": 1, + "physicsGroup": 1, + "physicsDensity": 0.5, + "physicsRestitution": 0.1, + "physicsLinearDamping": 0.1, + "physicsAngularDamping": 0.1, + "physicsFriction": 0.2, + "physicsStartAwake": true, + "physicsKinematic": false, + "physicsShapePoints": [], + "eventList": [ + {"isDnD":false,"eventNum":0,"eventType":8,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + ], + "properties": [], + "overriddenProperties": [], + "parent": { + "name": "Basic", + "path": "folders/Test Cases/Basic.yy", + }, + "resourceVersion": "1.0", + "name": "obj_test_flash", + "tags": [], + "resourceType": "GMObject", +} \ No newline at end of file diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index 31f685315..beaa08bdf 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -14,7 +14,7 @@ ], "layers": [ {"instances":[ - {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_animation_speed","path":"objects/obj_test_animation_speed/obj_test_animation_speed.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_D2ED121","tags":[],"resourceType":"GMRInstance",}, + {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_flash","path":"objects/obj_test_flash/obj_test_flash.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_B5CD13F","tags":[],"resourceType":"GMRInstance",}, ],"visible":true,"depth":0,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Example","tags":[],"resourceType":"GMRInstanceLayer",}, {"spriteId":null,"colour":4288702270,"x":0,"y":0,"htiled":false,"vtiled":false,"hspeed":0.0,"vspeed":0.0,"stretch":false,"animationFPS":15.0,"animationSpeedType":0,"userdefinedAnimFPS":false,"visible":true,"depth":100,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Background","tags":[],"resourceType":"GMRBackgroundLayer",}, ], @@ -22,7 +22,7 @@ "creationCodeFile": "", "inheritCode": false, "instanceCreationOrder": [ - {"name":"inst_D2ED121","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_B5CD13F","path":"rooms/rm_test/rm_test.yy",}, ], "inheritCreationOrder": false, "sequenceId": null, From f75ec26460b47d68de0af2dcda295b6a59e33db3 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 25 Feb 2022 15:16:07 +0000 Subject: [PATCH 13/25] Fix for HTML5 being broken *again* --- .../__scribble_font_add_from_project.gml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml b/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml index 97c3b7c7e..0bb10cb52 100644 --- a/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml +++ b/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml @@ -86,8 +86,8 @@ function __scribble_font_add_from_project(_font) if (_bidi == undefined) _bidi = __SCRIBBLE_BIDI.L2R; } - var _x = _glyph_dict.x; - var _y = _glyph_dict.y; + var _x = _glyph_dict[$ "x"]; + var _y = _glyph_dict[$ "y"]; var _w = _glyph_dict.w; var _h = _glyph_dict.h; From a22ea4e99332976d07e29638a8ebd6f88479cc88 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Fri, 25 Feb 2022 15:22:18 +0000 Subject: [PATCH 14/25] Update __scribble_font_add_from_project.gml --- .../__scribble_font_add_from_project.gml | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml b/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml index 0bb10cb52..37b162f9b 100644 --- a/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml +++ b/scripts/__scribble_font_add_from_project/__scribble_font_add_from_project.gml @@ -86,6 +86,7 @@ function __scribble_font_add_from_project(_font) if (_bidi == undefined) _bidi = __SCRIBBLE_BIDI.L2R; } + //FIXME - Workaround for HTML5 in GMS2.3.7.606 and above var _x = _glyph_dict[$ "x"]; var _y = _glyph_dict[$ "y"]; var _w = _glyph_dict.w; From a16ba690efd3179ff65d005b65f0e02c9a2a5731 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Mon, 28 Feb 2022 16:43:33 +0000 Subject: [PATCH 15/25] Fixes typist.get_state() being inaccurate when effect is smoothed --- scripts/__scribble_class_typist/__scribble_class_typist.gml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/__scribble_class_typist/__scribble_class_typist.gml b/scripts/__scribble_class_typist/__scribble_class_typist.gml index b111d0106..39dd12118 100644 --- a/scripts/__scribble_class_typist/__scribble_class_typist.gml +++ b/scripts/__scribble_class_typist/__scribble_class_typist.gml @@ -297,8 +297,8 @@ function __scribble_class_typist() constructor var _max = _page_data.__character_count; if (_max <= _min) return 1.0; + var _t = clamp((__window_array[__window_index] + max(0, __window_array[__window_index+1] + __smoothness - _max)) / (_max + __smoothness), 0, 1); - var _t = clamp((get_position() - _min) / (_max - _min), 0, 1); if (__in) { if (__delay_paused || (array_length(__event_stack) > 0)) From 4428236d0e9fe654d90ddda9d2c69ad69abb0c5f Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Mon, 28 Feb 2022 16:43:43 +0000 Subject: [PATCH 16/25] Bit of tidying up --- scripts/__scribble_class_typist/__scribble_class_typist.gml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/__scribble_class_typist/__scribble_class_typist.gml b/scripts/__scribble_class_typist/__scribble_class_typist.gml index 39dd12118..3f4d0a73b 100644 --- a/scripts/__scribble_class_typist/__scribble_class_typist.gml +++ b/scripts/__scribble_class_typist/__scribble_class_typist.gml @@ -293,10 +293,10 @@ function __scribble_class_typist() constructor var _pages_array = _model.__get_page_array(); if (array_length(_pages_array) <= __last_page) return 1.0; var _page_data = _pages_array[__last_page]; - var _min = 0; + var _max = _page_data.__character_count; + if (_max <= 0) return 1.0; - if (_max <= _min) return 1.0; var _t = clamp((__window_array[__window_index] + max(0, __window_array[__window_index+1] + __smoothness - _max)) / (_max + __smoothness), 0, 1); if (__in) From fc690a95aef54094ffdddc625ca51878bb6f4757 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Mon, 28 Feb 2022 16:43:56 +0000 Subject: [PATCH 17/25] Adds get_state() test case --- Scribble.yyp | 35 ++++++++++--------- .../Create_0.gml | 4 +++ .../obj_test_typewriter_get_state/Draw_0.gml | 5 +++ .../obj_test_typewriter_get_state/Step_0.gml | 1 + .../obj_test_typewriter_get_state.yy | 35 +++++++++++++++++++ rooms/rm_test/rm_test.yy | 4 +-- 6 files changed, 65 insertions(+), 19 deletions(-) create mode 100644 objects/obj_test_typewriter_get_state/Create_0.gml create mode 100644 objects/obj_test_typewriter_get_state/Draw_0.gml create mode 100644 objects/obj_test_typewriter_get_state/Step_0.gml create mode 100644 objects/obj_test_typewriter_get_state/obj_test_typewriter_get_state.yy diff --git a/Scribble.yyp b/Scribble.yyp index 3e97ca425..2559d91d3 100644 --- a/Scribble.yyp +++ b/Scribble.yyp @@ -193,6 +193,7 @@ {"id":{"name":"scribble_anim_jitter","path":"scripts/scribble_anim_jitter/scribble_anim_jitter.yy",},"order":8,}, {"id":{"name":"obj_test_wrap","path":"objects/obj_test_wrap/obj_test_wrap.yy",},"order":0,}, {"id":{"name":"obj_test_starting_format","path":"objects/obj_test_starting_format/obj_test_starting_format.yy",},"order":0,}, + {"id":{"name":"obj_test_typewriter_get_state","path":"objects/obj_test_typewriter_get_state/obj_test_typewriter_get_state.yy",},"order":19,}, {"id":{"name":"obj_test_anim_shake","path":"objects/obj_test_anim_shake/obj_test_anim_shake.yy",},"order":2,}, {"id":{"name":"obj_test_region_msdf","path":"objects/obj_test_region_msdf/obj_test_region_msdf.yy",},"order":3,}, {"id":{"name":"obj_test_bbox_revealed","path":"objects/obj_test_bbox_revealed/obj_test_bbox_revealed.yy",},"order":1,}, @@ -265,7 +266,7 @@ {"id":{"name":"obj_test_ignore_command_tags","path":"objects/obj_test_ignore_command_tags/obj_test_ignore_command_tags.yy",},"order":15,}, {"id":{"name":"obj_test_anim_pulse","path":"objects/obj_test_anim_pulse/obj_test_anim_pulse.yy",},"order":5,}, {"id":{"name":"obj_test_typewriter_gc","path":"objects/obj_test_typewriter_gc/obj_test_typewriter_gc.yy",},"order":17,}, - {"id":{"name":"rm_test","path":"rooms/rm_test/rm_test.yy",},"order":1,}, + {"id":{"name":"rm_test","path":"rooms/rm_test/rm_test.yy",},"order":0,}, ], "Options": [ {"name":"Switch","path":"options/switch/options_switch.yy",}, @@ -307,28 +308,28 @@ {"folderPath":"folders/Scribble/(System - don't call these functions).yy","order":9,"resourceVersion":"1.0","name":"(System - don't call these functions)","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Scribble/Configuration - Please edit these!.yy","order":4,"resourceVersion":"1.0","name":"Configuration - Please edit these!","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Scribble/Miscellaneous.yy","order":8,"resourceVersion":"1.0","name":"Miscellaneous","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Typewriter/Legacy.yy","order":19,"resourceVersion":"1.0","name":"Legacy","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Basic.yy","order":2,"resourceVersion":"1.0","name":"Basic","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Misc Positioning.yy","order":5,"resourceVersion":"1.0","name":"Misc Positioning","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Pages.yy","order":6,"resourceVersion":"1.0","name":"Pages","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Getters.yy","order":7,"resourceVersion":"1.0","name":"Getters","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Animation.yy","order":8,"resourceVersion":"1.0","name":"Animation","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Caching, Stress Testing.yy","order":11,"resourceVersion":"1.0","name":"Caching, Stress Testing","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Fonts.yy","order":12,"resourceVersion":"1.0","name":"Fonts","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Typewriter.yy","order":10,"resourceVersion":"1.0","name":"Typewriter","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Scribble Methods.yy","order":9,"resourceVersion":"1.0","name":"Scribble Methods","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/MSDF.yy","order":13,"resourceVersion":"1.0","name":"MSDF","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Configurations.yy","order":14,"resourceVersion":"1.0","name":"Configurations","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Typewriter/Legacy.yy","order":20,"resourceVersion":"1.0","name":"Legacy","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Basic.yy","order":1,"resourceVersion":"1.0","name":"Basic","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Misc Positioning.yy","order":4,"resourceVersion":"1.0","name":"Misc Positioning","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Pages.yy","order":5,"resourceVersion":"1.0","name":"Pages","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Getters.yy","order":6,"resourceVersion":"1.0","name":"Getters","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Animation.yy","order":7,"resourceVersion":"1.0","name":"Animation","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Caching, Stress Testing.yy","order":10,"resourceVersion":"1.0","name":"Caching, Stress Testing","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Fonts.yy","order":11,"resourceVersion":"1.0","name":"Fonts","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Typewriter.yy","order":9,"resourceVersion":"1.0","name":"Typewriter","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Scribble Methods.yy","order":8,"resourceVersion":"1.0","name":"Scribble Methods","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/MSDF.yy","order":12,"resourceVersion":"1.0","name":"MSDF","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Configurations.yy","order":13,"resourceVersion":"1.0","name":"Configurations","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Scribble/(System - don't call these functions)/Deprecated.yy","order":10,"resourceVersion":"1.0","name":"Deprecated","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Scribble/Animation.yy","order":7,"resourceVersion":"1.0","name":"Animation","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Scribble/Superfonts.yy","order":6,"resourceVersion":"1.0","name":"Superfonts","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Scribble/(System - don't call these functions)/Generator.yy","order":8,"resourceVersion":"1.0","name":"Generator","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Language Support.yy","order":16,"resourceVersion":"1.0","name":"Language Support","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Language Support.yy","order":15,"resourceVersion":"1.0","name":"Language Support","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Test Cases/Language Support/Arabic.yy","order":0,"resourceVersion":"1.0","name":"Arabic","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Test Cases/Language Support/Thai.yy","order":6,"resourceVersion":"1.0","name":"Thai","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Regions.yy","order":15,"resourceVersion":"1.0","name":"Regions","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Wrapping.yy","order":3,"resourceVersion":"1.0","name":"Wrapping","tags":[],"resourceType":"GMFolder",}, - {"folderPath":"folders/Test Cases/Padding.yy","order":4,"resourceVersion":"1.0","name":"Padding","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Regions.yy","order":14,"resourceVersion":"1.0","name":"Regions","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Wrapping.yy","order":2,"resourceVersion":"1.0","name":"Wrapping","tags":[],"resourceType":"GMFolder",}, + {"folderPath":"folders/Test Cases/Padding.yy","order":3,"resourceVersion":"1.0","name":"Padding","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Scribble/(System - don't call these functions)/Classes.yy","order":9,"resourceVersion":"1.0","name":"Classes","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Scribble/(System - don't call these functions)/Shaders.yy","order":11,"resourceVersion":"1.0","name":"Shaders","tags":[],"resourceType":"GMFolder",}, {"folderPath":"folders/Test Cases/Language Support/Hebrew.yy","order":7,"resourceVersion":"1.0","name":"Hebrew","tags":[],"resourceType":"GMFolder",}, diff --git a/objects/obj_test_typewriter_get_state/Create_0.gml b/objects/obj_test_typewriter_get_state/Create_0.gml new file mode 100644 index 000000000..78bc1d74a --- /dev/null +++ b/objects/obj_test_typewriter_get_state/Create_0.gml @@ -0,0 +1,4 @@ +text = "test test test test.!!!" + +typist = scribble_typist(); +typist.out(0.2, 10); \ No newline at end of file diff --git a/objects/obj_test_typewriter_get_state/Draw_0.gml b/objects/obj_test_typewriter_get_state/Draw_0.gml new file mode 100644 index 000000000..53994b300 --- /dev/null +++ b/objects/obj_test_typewriter_get_state/Draw_0.gml @@ -0,0 +1,5 @@ +scribble(text) +.align(fa_left, fa_top) +.draw(10, 50, typist); + +draw_text(10, 10, typist.get_state()); \ No newline at end of file diff --git a/objects/obj_test_typewriter_get_state/Step_0.gml b/objects/obj_test_typewriter_get_state/Step_0.gml new file mode 100644 index 000000000..915787579 --- /dev/null +++ b/objects/obj_test_typewriter_get_state/Step_0.gml @@ -0,0 +1 @@ +if (typist.get_state() == 2.0) instance_destroy(); \ No newline at end of file diff --git a/objects/obj_test_typewriter_get_state/obj_test_typewriter_get_state.yy b/objects/obj_test_typewriter_get_state/obj_test_typewriter_get_state.yy new file mode 100644 index 000000000..bdddce9c0 --- /dev/null +++ b/objects/obj_test_typewriter_get_state/obj_test_typewriter_get_state.yy @@ -0,0 +1,35 @@ +{ + "spriteId": null, + "solid": false, + "visible": true, + "spriteMaskId": null, + "persistent": false, + "parentObjectId": null, + "physicsObject": false, + "physicsSensor": false, + "physicsShape": 1, + "physicsGroup": 1, + "physicsDensity": 0.5, + "physicsRestitution": 0.1, + "physicsLinearDamping": 0.1, + "physicsAngularDamping": 0.1, + "physicsFriction": 0.2, + "physicsStartAwake": true, + "physicsKinematic": false, + "physicsShapePoints": [], + "eventList": [ + {"isDnD":false,"eventNum":0,"eventType":0,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + {"isDnD":false,"eventNum":0,"eventType":8,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + {"isDnD":false,"eventNum":0,"eventType":3,"collisionObjectId":null,"resourceVersion":"1.0","name":"","tags":[],"resourceType":"GMEvent",}, + ], + "properties": [], + "overriddenProperties": [], + "parent": { + "name": "Typewriter", + "path": "folders/Test Cases/Typewriter.yy", + }, + "resourceVersion": "1.0", + "name": "obj_test_typewriter_get_state", + "tags": [], + "resourceType": "GMObject", +} \ No newline at end of file diff --git a/rooms/rm_test/rm_test.yy b/rooms/rm_test/rm_test.yy index ca0d0c6a1..9292c04b6 100644 --- a/rooms/rm_test/rm_test.yy +++ b/rooms/rm_test/rm_test.yy @@ -14,7 +14,7 @@ ], "layers": [ {"instances":[ - {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_devangari_basic","path":"objects/obj_test_devangari_basic/obj_test_devangari_basic.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_49C40133","tags":[],"resourceType":"GMRInstance",}, + {"properties":[],"isDnd":false,"objectId":{"name":"obj_test_typewriter_get_state","path":"objects/obj_test_typewriter_get_state/obj_test_typewriter_get_state.yy",},"inheritCode":false,"hasCreationCode":false,"colour":4294967295,"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"imageIndex":0,"imageSpeed":1.0,"inheritedItemId":null,"frozen":false,"ignore":false,"inheritItemSettings":false,"x":32.0,"y":32.0,"resourceVersion":"1.0","name":"inst_77A23916","tags":[],"resourceType":"GMRInstance",}, ],"visible":true,"depth":0,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Example","tags":[],"resourceType":"GMRInstanceLayer",}, {"spriteId":null,"colour":4288702270,"x":0,"y":0,"htiled":false,"vtiled":false,"hspeed":0.0,"vspeed":0.0,"stretch":false,"animationFPS":15.0,"animationSpeedType":0,"userdefinedAnimFPS":false,"visible":true,"depth":100,"userdefinedDepth":false,"inheritLayerDepth":false,"inheritLayerSettings":false,"gridX":32,"gridY":32,"layers":[],"hierarchyFrozen":false,"resourceVersion":"1.0","name":"Background","tags":[],"resourceType":"GMRBackgroundLayer",}, ], @@ -22,7 +22,7 @@ "creationCodeFile": "", "inheritCode": false, "instanceCreationOrder": [ - {"name":"inst_49C40133","path":"rooms/rm_test/rm_test.yy",}, + {"name":"inst_77A23916","path":"rooms/rm_test/rm_test.yy",}, ], "inheritCreationOrder": false, "sequenceId": null, From d84ec80876b601f7fb475b05b7ef259f64d12454 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Mon, 28 Feb 2022 17:45:16 +0000 Subject: [PATCH 18/25] Update Draw_0.gml --- objects/obj_test_newline/Draw_0.gml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/objects/obj_test_newline/Draw_0.gml b/objects/obj_test_newline/Draw_0.gml index b8be9351c..e178421f1 100644 --- a/objects/obj_test_newline/Draw_0.gml +++ b/objects/obj_test_newline/Draw_0.gml @@ -1,8 +1,10 @@ -//scribble("Test text!").draw(10, 10); -//scribble("Text\ntext!").draw(210, 10); -//scribble( -//@"Text -//text!").draw(410, 10); +scribble("aaaaaaaaaaaaaaaaaaaa \nc").draw(410, 10); + + + +exit; + + var _demo_string = "[pin_center][scale,1.4]Contrary to popular belief,[/]\n\n[fa_justify]Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet...\", comes from a line in section 1.10.32."; From e68bb32b6ac04199f51419ffd54bbb7593d165f8 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Thu, 3 Mar 2022 14:31:43 +0000 Subject: [PATCH 19/25] Updates to GM 2022.2.0.614 --- Scribble.yyp | 7 +++---- options/main/options_main.yy | 8 +++++++- options/xboxseriesxs/options_xboxseriesxs.yy | 7 ++++++- sprites/spr_coin/spr_coin.yy | 4 ++-- sprites/spr_large_coin/spr_large_coin.yy | 4 ++-- sprites/spr_mallangche/spr_mallangche.yy | 2 +- sprites/spr_msdf_industrydemi/spr_msdf_industrydemi.yy | 2 +- sprites/spr_msdf_notoarabic/spr_msdf_notoarabic.yy | 2 +- sprites/spr_msdf_openhuninn/spr_msdf_openhuninn.yy | 2 +- sprites/spr_portrait/spr_portrait.yy | 4 ++-- sprites/spr_portrait_2/spr_portrait_2.yy | 4 ++-- sprites/spr_sprite_font/spr_sprite_font.yy | 2 +- sprites/spr_white_coin/spr_white_coin.yy | 2 +- 13 files changed, 30 insertions(+), 20 deletions(-) diff --git a/Scribble.yyp b/Scribble.yyp index 2559d91d3..e4a2c8d08 100644 --- a/Scribble.yyp +++ b/Scribble.yyp @@ -288,14 +288,13 @@ ], "isDnDProject": false, "isEcma": false, - "tutorialPath": "", "configs": { "name": "Default", "children": [], }, "RoomOrderNodes": [ - {"roomId":{"name":"rm_test","path":"rooms/rm_test/rm_test.yy",},}, {"roomId":{"name":"rm_example","path":"rooms/rm_example/rm_example.yy",},}, + {"roomId":{"name":"rm_test","path":"rooms/rm_test/rm_test.yy",},}, ], "Folders": [ {"folderPath":"folders/Sprites.yy","order":1,"resourceVersion":"1.0","name":"Sprites","tags":[],"resourceType":"GMFolder",}, @@ -349,9 +348,9 @@ {"CopyToMask":-1,"filePath":"datafiles","resourceVersion":"1.0","name":"blip.ogg","resourceType":"GMIncludedFile",}, ], "MetaData": { - "IDEVersion": "2.3.6.595", + "IDEVersion": "2022.2.0.614", }, - "resourceVersion": "1.4", + "resourceVersion": "1.5", "name": "Scribble", "tags": [], "resourceType": "GMProject", diff --git a/options/main/options_main.yy b/options/main/options_main.yy index 88549a40f..3935b3248 100644 --- a/options/main/options_main.yy +++ b/options/main/options_main.yy @@ -1,5 +1,6 @@ { "option_gameguid": "903ca60a-ecf4-4831-b61f-fc12bfdf5eb9", + "option_gameid": "0", "option_game_speed": 60, "option_mips_for_3d_textures": false, "option_draw_colour": 4294967295, @@ -7,9 +8,14 @@ "option_steam_app_id": "0", "option_sci_usesci": false, "option_author": "", + "option_collision_compatibility": true, + "option_copy_on_write_enabled": true, "option_lastchanged": "02 April 2019 13:26:05", "option_spine_licence": false, - "resourceVersion": "1.2", + "option_template_image": "${base_options_dir}/main/template_image.png", + "option_template_icon": "${base_options_dir}/main/template_icon.png", + "option_template_description": null, + "resourceVersion": "1.4", "name": "Main", "tags": [], "resourceType": "GMMainOptions", diff --git a/options/xboxseriesxs/options_xboxseriesxs.yy b/options/xboxseriesxs/options_xboxseriesxs.yy index 4dee23db1..7fd6a21db 100644 --- a/options/xboxseriesxs/options_xboxseriesxs.yy +++ b/options/xboxseriesxs/options_xboxseriesxs.yy @@ -8,7 +8,12 @@ "option_xboxseriesxs_title_id": "01234567", "option_xboxseriesxs_service_config_id": "00000000-0000-0000-0000-000000000000", "option_xboxseriesxs_program_id": "ExactName.InPartnerCenter", + "option_xboxseriesxs_store_id": "", + "option_xboxseriesxs_msaappid": "", + "option_xboxseriesxs_content_id": "", + "option_xboxseriesxs_ekbid": "", "option_xboxseriesxs_playfab_party_id": "00000", + "option_xboxseriesxs_simplified_user_model": false, "option_xboxseriesxs_require_xbox_live": false, "option_xboxseriesxs_require_game_chat": false, "option_xboxseriesxs_game_chat_slots": 4, @@ -30,7 +35,7 @@ "option_xboxseriesxs_support_4k_one_x": false, "option_xboxseriesxs_support_4k_one_s": false, "option_xboxseriesxs_languages": "\n \n \n \n ", - "resourceVersion": "1.0", + "resourceVersion": "1.1", "name": "Xbox Series XS", "tags": [], "resourceType": "GMXboxSeriesXSOptions", diff --git a/sprites/spr_coin/spr_coin.yy b/sprites/spr_coin/spr_coin.yy index 68539eceb..f68ebc522 100644 --- a/sprites/spr_coin/spr_coin.yy +++ b/sprites/spr_coin/spr_coin.yy @@ -54,7 +54,7 @@ {"id":"dd4c964e-f48c-462a-8b76-26290c93a4c5","Key":1.0,"Length":1.0,"Stretch":false,"Disabled":false,"IsCreationKey":false,"Channels":{"0":{"Id":{"name":"afebdf59-d1cb-407e-9399-c5ba9ecd658f","path":"sprites/spr_coin/spr_coin.yy",},"resourceVersion":"1.0","resourceType":"SpriteFrameKeyframe",},},"resourceVersion":"1.0","resourceType":"Keyframe",}, {"id":"04cc8232-80f1-4307-a381-7d97fd171b4f","Key":2.0,"Length":1.0,"Stretch":false,"Disabled":false,"IsCreationKey":false,"Channels":{"0":{"Id":{"name":"cfd13e51-b4a6-4c21-aedc-29597bdb4d1d","path":"sprites/spr_coin/spr_coin.yy",},"resourceVersion":"1.0","resourceType":"SpriteFrameKeyframe",},},"resourceVersion":"1.0","resourceType":"Keyframe",}, {"id":"96f2ee3e-8a21-4d9e-92bd-ac46d092d8de","Key":3.0,"Length":1.0,"Stretch":false,"Disabled":false,"IsCreationKey":false,"Channels":{"0":{"Id":{"name":"b6ba099f-f566-4d5e-af6d-3829f52f6323","path":"sprites/spr_coin/spr_coin.yy",},"resourceVersion":"1.0","resourceType":"SpriteFrameKeyframe",},},"resourceVersion":"1.0","resourceType":"Keyframe",}, - ],"resourceVersion":"1.0","resourceType":"KeyframeStore",},"trackColour":0,"inheritsTrackColour":true,"builtinName":0,"traits":0,"interpolation":1,"tracks":[],"events":[],"modifiers":[],"isCreationTrack":false,"resourceVersion":"1.0","tags":[],"resourceType":"GMSpriteFramesTrack",}, + ],"resourceVersion":"1.0","resourceType":"KeyframeStore",},"trackColour":0,"inheritsTrackColour":true,"builtinName":0,"traits":0,"interpolation":1,"tracks":[],"events":[],"isCreationTrack":false,"resourceVersion":"1.0","tags":[],"resourceType":"GMSpriteFramesTrack","modifiers":[],}, ], "visibleRange": {"x":0.0,"y":0.0,}, "lockOrigin": false, @@ -71,7 +71,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_coin","path":"sprites/spr_coin/spr_coin.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "", "tags": [], "resourceType": "GMSequence", diff --git a/sprites/spr_large_coin/spr_large_coin.yy b/sprites/spr_large_coin/spr_large_coin.yy index af4aa669b..5b35279f6 100644 --- a/sprites/spr_large_coin/spr_large_coin.yy +++ b/sprites/spr_large_coin/spr_large_coin.yy @@ -54,7 +54,7 @@ {"id":"2dbfa111-638a-4920-a845-0892c8aad258","Key":1.0,"Length":1.0,"Stretch":false,"Disabled":false,"IsCreationKey":false,"Channels":{"0":{"Id":{"name":"58545a18-7ff2-4e1f-b49f-ea6a18fa5cfa","path":"sprites/spr_large_coin/spr_large_coin.yy",},"resourceVersion":"1.0","resourceType":"SpriteFrameKeyframe",},},"resourceVersion":"1.0","resourceType":"Keyframe",}, {"id":"9ae87b4f-b859-4e1b-9810-8fab5ec43974","Key":2.0,"Length":1.0,"Stretch":false,"Disabled":false,"IsCreationKey":false,"Channels":{"0":{"Id":{"name":"62793700-91fa-44c1-a8ef-54ef48353efd","path":"sprites/spr_large_coin/spr_large_coin.yy",},"resourceVersion":"1.0","resourceType":"SpriteFrameKeyframe",},},"resourceVersion":"1.0","resourceType":"Keyframe",}, {"id":"99703bf3-7cd2-44da-932a-79b1418f7f43","Key":3.0,"Length":1.0,"Stretch":false,"Disabled":false,"IsCreationKey":false,"Channels":{"0":{"Id":{"name":"dd4a9069-8704-44e0-96e7-673d3402403e","path":"sprites/spr_large_coin/spr_large_coin.yy",},"resourceVersion":"1.0","resourceType":"SpriteFrameKeyframe",},},"resourceVersion":"1.0","resourceType":"Keyframe",}, - ],"resourceVersion":"1.0","resourceType":"KeyframeStore",},"trackColour":0,"inheritsTrackColour":true,"builtinName":0,"traits":0,"interpolation":1,"tracks":[],"events":[],"modifiers":[],"isCreationTrack":false,"resourceVersion":"1.0","tags":[],"resourceType":"GMSpriteFramesTrack",}, + ],"resourceVersion":"1.0","resourceType":"KeyframeStore",},"trackColour":0,"inheritsTrackColour":true,"builtinName":0,"traits":0,"interpolation":1,"tracks":[],"events":[],"isCreationTrack":false,"resourceVersion":"1.0","tags":[],"resourceType":"GMSpriteFramesTrack","modifiers":[],}, ], "visibleRange": null, "lockOrigin": false, @@ -71,7 +71,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_large_coin","path":"sprites/spr_large_coin/spr_large_coin.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "", "tags": [], "resourceType": "GMSequence", diff --git a/sprites/spr_mallangche/spr_mallangche.yy b/sprites/spr_mallangche/spr_mallangche.yy index 6ea7b43a7..443766858 100644 --- a/sprites/spr_mallangche/spr_mallangche.yy +++ b/sprites/spr_mallangche/spr_mallangche.yy @@ -9659,7 +9659,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_mallangche","path":"sprites/spr_mallangche/spr_mallangche.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "spr_mallangche", "tags": [], "resourceType": "GMSequence", diff --git a/sprites/spr_msdf_industrydemi/spr_msdf_industrydemi.yy b/sprites/spr_msdf_industrydemi/spr_msdf_industrydemi.yy index e39955eac..311e83788 100644 --- a/sprites/spr_msdf_industrydemi/spr_msdf_industrydemi.yy +++ b/sprites/spr_msdf_industrydemi/spr_msdf_industrydemi.yy @@ -59,7 +59,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_msdf_industrydemi","path":"sprites/spr_msdf_industrydemi/spr_msdf_industrydemi.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "spr_msdf_industrydemi", "tags": [], "resourceType": "GMSequence", diff --git a/sprites/spr_msdf_notoarabic/spr_msdf_notoarabic.yy b/sprites/spr_msdf_notoarabic/spr_msdf_notoarabic.yy index b7ba5fe14..09feb49b0 100644 --- a/sprites/spr_msdf_notoarabic/spr_msdf_notoarabic.yy +++ b/sprites/spr_msdf_notoarabic/spr_msdf_notoarabic.yy @@ -59,7 +59,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_msdf_notoarabic","path":"sprites/spr_msdf_notoarabic/spr_msdf_notoarabic.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "spr_msdf_notoarabic", "tags": [], "resourceType": "GMSequence", diff --git a/sprites/spr_msdf_openhuninn/spr_msdf_openhuninn.yy b/sprites/spr_msdf_openhuninn/spr_msdf_openhuninn.yy index 2098bcd12..19c051a1e 100644 --- a/sprites/spr_msdf_openhuninn/spr_msdf_openhuninn.yy +++ b/sprites/spr_msdf_openhuninn/spr_msdf_openhuninn.yy @@ -59,7 +59,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_msdf_openhuninn","path":"sprites/spr_msdf_openhuninn/spr_msdf_openhuninn.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "spr_msdf_openhuninn", "tags": [], "resourceType": "GMSequence", diff --git a/sprites/spr_portrait/spr_portrait.yy b/sprites/spr_portrait/spr_portrait.yy index c5e98c2a0..fc0d610d2 100644 --- a/sprites/spr_portrait/spr_portrait.yy +++ b/sprites/spr_portrait/spr_portrait.yy @@ -42,7 +42,7 @@ "tracks": [ {"name":"frames","spriteId":null,"keyframes":{"Keyframes":[ {"id":"e1545954-2b09-4893-8c02-49fb0e4edd94","Key":0.0,"Length":1.0,"Stretch":false,"Disabled":false,"IsCreationKey":false,"Channels":{"0":{"Id":{"name":"fb860c02-0362-4631-9587-120fac679e04","path":"sprites/spr_portrait/spr_portrait.yy",},"resourceVersion":"1.0","resourceType":"SpriteFrameKeyframe",},},"resourceVersion":"1.0","resourceType":"Keyframe",}, - ],"resourceVersion":"1.0","resourceType":"KeyframeStore",},"trackColour":0,"inheritsTrackColour":true,"builtinName":0,"traits":0,"interpolation":1,"tracks":[],"events":[],"modifiers":[],"isCreationTrack":false,"resourceVersion":"1.0","tags":[],"resourceType":"GMSpriteFramesTrack",}, + ],"resourceVersion":"1.0","resourceType":"KeyframeStore",},"trackColour":0,"inheritsTrackColour":true,"builtinName":0,"traits":0,"interpolation":1,"tracks":[],"events":[],"isCreationTrack":false,"resourceVersion":"1.0","tags":[],"resourceType":"GMSpriteFramesTrack","modifiers":[],}, ], "visibleRange": null, "lockOrigin": false, @@ -59,7 +59,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_portrait","path":"sprites/spr_portrait/spr_portrait.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "spr_portrait", "tags": [], "resourceType": "GMSequence", diff --git a/sprites/spr_portrait_2/spr_portrait_2.yy b/sprites/spr_portrait_2/spr_portrait_2.yy index 19fd4babb..d94cfacbf 100644 --- a/sprites/spr_portrait_2/spr_portrait_2.yy +++ b/sprites/spr_portrait_2/spr_portrait_2.yy @@ -42,7 +42,7 @@ "tracks": [ {"name":"frames","spriteId":null,"keyframes":{"Keyframes":[ {"id":"efd966a2-f187-4aca-a6f9-7560a6b643f4","Key":0.0,"Length":1.0,"Stretch":false,"Disabled":false,"IsCreationKey":false,"Channels":{"0":{"Id":{"name":"66a0d9ca-232d-47f3-91d7-67ee6206a8d8","path":"sprites/spr_portrait_2/spr_portrait_2.yy",},"resourceVersion":"1.0","resourceType":"SpriteFrameKeyframe",},},"resourceVersion":"1.0","resourceType":"Keyframe",}, - ],"resourceVersion":"1.0","resourceType":"KeyframeStore",},"trackColour":0,"inheritsTrackColour":true,"builtinName":0,"traits":0,"interpolation":1,"tracks":[],"events":[],"modifiers":[],"isCreationTrack":false,"resourceVersion":"1.0","tags":[],"resourceType":"GMSpriteFramesTrack",}, + ],"resourceVersion":"1.0","resourceType":"KeyframeStore",},"trackColour":0,"inheritsTrackColour":true,"builtinName":0,"traits":0,"interpolation":1,"tracks":[],"events":[],"isCreationTrack":false,"resourceVersion":"1.0","tags":[],"resourceType":"GMSpriteFramesTrack","modifiers":[],}, ], "visibleRange": null, "lockOrigin": false, @@ -59,7 +59,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_portrait_2","path":"sprites/spr_portrait_2/spr_portrait_2.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "spr_portrait_2", "tags": [], "resourceType": "GMSequence", diff --git a/sprites/spr_sprite_font/spr_sprite_font.yy b/sprites/spr_sprite_font/spr_sprite_font.yy index dfa6f51d3..702ccf3f9 100644 --- a/sprites/spr_sprite_font/spr_sprite_font.yy +++ b/sprites/spr_sprite_font/spr_sprite_font.yy @@ -467,7 +467,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_sprite_font","path":"sprites/spr_sprite_font/spr_sprite_font.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "", "tags": [], "resourceType": "GMSequence", diff --git a/sprites/spr_white_coin/spr_white_coin.yy b/sprites/spr_white_coin/spr_white_coin.yy index 88b584359..0d0a06485 100644 --- a/sprites/spr_white_coin/spr_white_coin.yy +++ b/sprites/spr_white_coin/spr_white_coin.yy @@ -71,7 +71,7 @@ "eventToFunction": {}, "eventStubScript": null, "parent": {"name":"spr_white_coin","path":"sprites/spr_white_coin/spr_white_coin.yy",}, - "resourceVersion": "1.3", + "resourceVersion": "1.4", "name": "spr_white_coin", "tags": [], "resourceType": "GMSequence", From 54d2a9029cc1d5aa65c8c818cd11043c82662b9a Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Thu, 3 Mar 2022 14:31:59 +0000 Subject: [PATCH 20/25] Works around weirdness in GM's grid copying behaviour --- .../__scribble_gen_3_devanagari.gml | 2 +- scripts/__scribble_system/__scribble_system.gml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml index 4192691c4..5968e9349 100644 --- a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml +++ b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml @@ -132,7 +132,7 @@ function __scribble_gen_3_devanagari() if (!__has_devanagari) exit; var _glyph_grid = global.__scribble_glyph_grid; - var _temp_grid = global.__scribble_temp_grid; + var _temp_grid = global.__scribble_temp2_grid; var _glyph_count = global.__scribble_generator_state.__glyph_count; //Glyph count includes the terminating null. We don't need that for Krutidev conversion diff --git a/scripts/__scribble_system/__scribble_system.gml b/scripts/__scribble_system/__scribble_system.gml index d4d134870..9cc89577e 100644 --- a/scripts/__scribble_system/__scribble_system.gml +++ b/scripts/__scribble_system/__scribble_system.gml @@ -82,7 +82,8 @@ global.__scribble_control_grid = ds_grid_create(1000, __SCRIBBLE_GEN_CON global.__scribble_word_grid = ds_grid_create(1000, __SCRIBBLE_GEN_WORD.__SIZE); global.__scribble_line_grid = ds_grid_create(__SCRIBBLE_MAX_LINES, __SCRIBBLE_GEN_LINE.__SIZE); global.__scribble_stretch_grid = ds_grid_create(1000, __SCRIBBLE_GEN_STRETCH.__SIZE); -global.__scribble_temp_grid = ds_grid_create(1000, __SCRIBBLE_GEN_GLYPH.__SIZE); //Somewhat arbitrary size. Feel free to increase this size as is needed +global.__scribble_temp_grid = ds_grid_create(1000, __SCRIBBLE_GEN_WORD.__SIZE); //For some reason, changing the width of this grid causes GM to crash +global.__scribble_temp2_grid = ds_grid_create(1000, __SCRIBBLE_GEN_GLYPH.__SIZE); global.__scribble_vbuff_pos_grid = ds_grid_create(1000, __SCRIBBLE_GEN_VBUFF_POS.__SIZE); //global.__scribble_window_array_null = array_create(2*__SCRIBBLE_WINDOW_COUNT, 1.0); //TODO - Do we still need this? From 05b73ca37d0f576890e23780f4b14885d723eda5 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Thu, 3 Mar 2022 14:32:36 +0000 Subject: [PATCH 21/25] Comments out Devanagari parser... for now... --- .../__scribble_gen_3_devanagari.gml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml index 5968e9349..ea65a0887 100644 --- a/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml +++ b/scripts/__scribble_gen_3_devanagari/__scribble_gen_3_devanagari.gml @@ -128,6 +128,9 @@ global.__scribble_krutidev_matra_lookup_map[? 2380] = true; function __scribble_gen_3_devanagari() { + return; + + /* //Avoid this mess if we can if (!__has_devanagari) exit; @@ -443,4 +446,5 @@ function __scribble_gen_3_devanagari() } #endregion + */ } \ No newline at end of file From 5c0d956e88cd73ed453b2de7b717fb3f4084343c Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Thu, 3 Mar 2022 14:52:29 +0000 Subject: [PATCH 22/25] Fixes new flash effect breaking text colour --- scripts/__scribble_class_element/__scribble_class_element.gml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/__scribble_class_element/__scribble_class_element.gml b/scripts/__scribble_class_element/__scribble_class_element.gml index 705a786af..3af36f31c 100644 --- a/scripts/__scribble_class_element/__scribble_class_element.gml +++ b/scripts/__scribble_class_element/__scribble_class_element.gml @@ -42,7 +42,7 @@ function __scribble_class_element(_string, _unique_id) constructor __gradient_colour = c_black; __gradient_alpha = 0.0; __flash_colour = c_white; - __flash_alpha = 1.0; + __flash_alpha = 0.0; __origin_x = 0.0; __origin_y = 0.0; From cf38ccf381bc79bc0c21060ce224e00f526401a3 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Thu, 3 Mar 2022 14:55:08 +0000 Subject: [PATCH 23/25] Fixes implementation of flash effect --- shaders/__shd_scribble/__shd_scribble.fsh | 3 +++ shaders/__shd_scribble/__shd_scribble.vsh | 4 ---- shaders/__shd_scribble_msdf/__shd_scribble_msdf.fsh | 3 +++ shaders/__shd_scribble_msdf/__shd_scribble_msdf.vsh | 4 ---- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/shaders/__shd_scribble/__shd_scribble.fsh b/shaders/__shd_scribble/__shd_scribble.fsh index b67c14db8..363ab2085 100644 --- a/shaders/__shd_scribble/__shd_scribble.fsh +++ b/shaders/__shd_scribble/__shd_scribble.fsh @@ -6,9 +6,12 @@ precision highp float; varying vec2 v_vTexcoord; varying vec4 v_vColour; +uniform vec4 u_vFlash; + void main() { gl_FragColor = v_vColour*texture2D(gm_BaseTexture, v_vTexcoord); + gl_FragColor.rgb = mix(gl_FragColor.rgb, u_vFlash.rgb, u_vFlash.a); if (PREMULTIPLY_ALPHA) { diff --git a/shaders/__shd_scribble/__shd_scribble.vsh b/shaders/__shd_scribble/__shd_scribble.vsh index 205c884b2..a6c6e5c46 100644 --- a/shaders/__shd_scribble/__shd_scribble.vsh +++ b/shaders/__shd_scribble/__shd_scribble.vsh @@ -79,7 +79,6 @@ varying vec4 v_vColour; uniform vec4 u_vColourBlend; //4 uniform vec4 u_vGradient; //4 -uniform vec4 u_vFlash; //4 uniform vec2 u_vRegionActive; //2 uniform vec4 u_vRegionColour; //4 uniform float u_fTime; //1 @@ -463,9 +462,6 @@ void main() //Regions if ((characterIndex >= u_vRegionActive.x) && (characterIndex <= u_vRegionActive.y)) v_vColour.rgb = mix(v_vColour.rgb, u_vRegionColour.rgb, u_vRegionColour.a); - //Flash - v_vColour.rgb = mix(v_vColour.rgb, u_vFlash.rgb, u_vFlash.a); - //Vertex animation diff --git a/shaders/__shd_scribble_msdf/__shd_scribble_msdf.fsh b/shaders/__shd_scribble_msdf/__shd_scribble_msdf.fsh index 99a65905a..f2cb98f86 100644 --- a/shaders/__shd_scribble_msdf/__shd_scribble_msdf.fsh +++ b/shaders/__shd_scribble_msdf/__shd_scribble_msdf.fsh @@ -18,6 +18,7 @@ uniform vec3 u_vShadowOffsetAndSoftness; uniform vec3 u_vBorderColour; uniform float u_fBorderThickness; uniform float u_fSecondDraw; +uniform vec4 u_vFlash; float median(vec3 v) { @@ -70,6 +71,8 @@ void main() } } + gl_FragColor.rgb = mix(gl_FragColor.rgb, u_vFlash.rgb, u_vFlash.a); + if (PREMULTIPLY_ALPHA) { gl_FragColor.rgb *= v_vColour.a; diff --git a/shaders/__shd_scribble_msdf/__shd_scribble_msdf.vsh b/shaders/__shd_scribble_msdf/__shd_scribble_msdf.vsh index b9f2858bd..f2454870a 100644 --- a/shaders/__shd_scribble_msdf/__shd_scribble_msdf.vsh +++ b/shaders/__shd_scribble_msdf/__shd_scribble_msdf.vsh @@ -81,7 +81,6 @@ varying float v_fTextScale; uniform vec4 u_vColourBlend; //4 uniform vec4 u_vGradient; //4 -uniform vec4 u_vFlash; //4 uniform vec2 u_vRegionActive; //2 uniform vec4 u_vRegionColour; //4 uniform float u_fTime; //1 @@ -479,9 +478,6 @@ void main() //Regions if ((characterIndex >= u_vRegionActive.x) && (characterIndex <= u_vRegionActive.y)) v_vColour.rgb = mix(v_vColour.rgb, u_vRegionColour.rgb, u_vRegionColour.a); - //Flash - v_vColour.rgb = mix(v_vColour.rgb, u_vFlash.rgb, u_vFlash.a); - //Vertex animation From e71097ceec9087705cbe39948510d3b79f202bff Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Thu, 3 Mar 2022 14:56:34 +0000 Subject: [PATCH 24/25] draw_text_scribble*() now uses Scribble's default font rather than (an emulation of) GameMaker's default font --- scripts/draw_text_scribble/draw_text_scribble.gml | 2 +- scripts/draw_text_scribble_ext/draw_text_scribble_ext.gml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/draw_text_scribble/draw_text_scribble.gml b/scripts/draw_text_scribble/draw_text_scribble.gml index 0b2b0b43c..d517446d1 100644 --- a/scripts/draw_text_scribble/draw_text_scribble.gml +++ b/scripts/draw_text_scribble/draw_text_scribble.gml @@ -18,7 +18,7 @@ function draw_text_scribble(_x, _y, _string, _reveal = undefined) { var _font = draw_get_font(); - _font = !font_exists(_font)? "scribble_fallback_font" : font_get_name(_font); + _font = !font_exists(_font)? global.__scribble_default_font : font_get_name(_font); var _element = scribble(_string) .align(draw_get_halign(), draw_get_valign()) diff --git a/scripts/draw_text_scribble_ext/draw_text_scribble_ext.gml b/scripts/draw_text_scribble_ext/draw_text_scribble_ext.gml index 4977ad1cb..f6acbb6e6 100644 --- a/scripts/draw_text_scribble_ext/draw_text_scribble_ext.gml +++ b/scripts/draw_text_scribble_ext/draw_text_scribble_ext.gml @@ -19,7 +19,7 @@ function draw_text_scribble_ext(_x, _y, _string, _width, _reveal = undefined) { var _font = draw_get_font(); - _font = !font_exists(_font)? "scribble_fallback_font" : font_get_name(_font); + _font = !font_exists(_font)? global.__scribble_default_font : font_get_name(_font); var _element = scribble(_string) .align(draw_get_halign(), draw_get_valign()) From 423ca6d39f06e90a10b11b99858fc6471e5dbb42 Mon Sep 17 00:00:00 2001 From: Juju Adams Date: Thu, 3 Mar 2022 14:58:14 +0000 Subject: [PATCH 25/25] 8.0.1 beta 8 --- README.md | 2 +- options/windows/options_windows.yy | 2 +- scripts/__scribble_system/__scribble_system.gml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fabea7c36..6d25cd8e4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

-

8.0.1 beta 7

+

8.0.1 beta 8

A modern text renderer for GameMaker Studio 2.3.6+ by @jujuadams

diff --git a/options/windows/options_windows.yy b/options/windows/options_windows.yy index 6dbd49a00..5766c3df4 100644 --- a/options/windows/options_windows.yy +++ b/options/windows/options_windows.yy @@ -1,7 +1,7 @@ { "option_windows_display_name": "Scribble", "option_windows_executable_name": "${project_name}", - "option_windows_version": "8.0.1.7", + "option_windows_version": "8.0.1.8", "option_windows_company_info": "@jujuadams", "option_windows_product_info": "Scribble", "option_windows_copyright_info": "@jujuadams (c) 2022", diff --git a/scripts/__scribble_system/__scribble_system.gml b/scripts/__scribble_system/__scribble_system.gml index 9cc89577e..c5c8b44a8 100644 --- a/scripts/__scribble_system/__scribble_system.gml +++ b/scripts/__scribble_system/__scribble_system.gml @@ -1,6 +1,6 @@ // @jujuadams -#macro __SCRIBBLE_VERSION "8.0.1 beta 7" -#macro __SCRIBBLE_DATE "2022-02-10" +#macro __SCRIBBLE_VERSION "8.0.1 beta 8" +#macro __SCRIBBLE_DATE "2022-03-03" #macro __SCRIBBLE_DEBUG false #macro __SCRIBBLE_VERBOSE_GC false #macro SCRIBBLE_LOAD_FONTS_ON_BOOT true