diff --git a/scripts/__VFX/__VFX.gml b/scripts/__VFX/__VFX.gml index ca2d19b28..639342b1d 100644 --- a/scripts/__VFX/__VFX.gml +++ b/scripts/__VFX/__VFX.gml @@ -115,6 +115,8 @@ function __part(_node) : __particleObject() constructor { anim_speed = 1; anim_end = ANIM_END_ACTION.loop; + anim_stre = false; + anim_len = 1; line_draw = 1; @@ -149,6 +151,8 @@ function __part(_node) : __particleObject() constructor { drawx = x; drawy = y; + anim_len = is_array(surf)? array_length(surf) : 1; + life_incr = 0; life = _life; life_total = life; @@ -329,19 +333,21 @@ function __part(_node) : __particleObject() constructor { scy = drawsy * scCurve; if(arr_type == 2 && surf != noone && is_array(surf)) { - var ind = abs(round((life_total - life) * anim_speed)); - var len = array_length(surf); + var _life_prog = life_total - life; + var ind = anim_stre? _life_prog / life_total * anim_speed * (anim_len - 1) : + _life_prog * anim_speed; + ind = abs(round(ind)); switch(anim_end) { case ANIM_END_ACTION.loop: - ss = surf[safe_mod(ind, len)]; + ss = surf[safe_mod(ind, anim_len)]; break; case ANIM_END_ACTION.pingpong: - var ping = safe_mod(ind, (len - 1) * 2 + 1); - ss = surf[ping >= len? (len - 1) * 2 - ping : ping]; + var ping = safe_mod(ind, (anim_len - 1) * 2 + 1); + ss = surf[ping >= anim_len? (anim_len - 1) * 2 - ping : ping]; break; case ANIM_END_ACTION.destroy: - if(ind >= len) { + if(ind >= anim_len) { kill(); return; } diff --git a/scripts/_node_VFX_spawner/_node_VFX_spawner.gml b/scripts/_node_VFX_spawner/_node_VFX_spawner.gml index 6279b2cc7..c2c6ba10b 100644 --- a/scripts/_node_VFX_spawner/_node_VFX_spawner.gml +++ b/scripts/_node_VFX_spawner/_node_VFX_spawner.gml @@ -47,7 +47,6 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co inputs[| 15] = nodeValue("Rotate by direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false, "Make the particle rotates to follow its movement."); inputs[| 16] = nodeValue("Spawn type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) - .rejectArray() .setDisplay(VALUE_DISPLAY.enum_button, [ "Stream", "Burst", "Trigger" ]); inputs[| 17] = nodeValue("Spawn size", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ] ) @@ -57,15 +56,12 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co .setDisplay(VALUE_DISPLAY.range); inputs[| 19] = nodeValue("Gravity", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ] ) - .setDisplay(VALUE_DISPLAY.range, { linked : true }) - .rejectArray(); + .setDisplay(VALUE_DISPLAY.range, { linked : true }); inputs[| 20] = nodeValue("Direction wiggle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ] ) - .setDisplay(VALUE_DISPLAY.vector, { label: [ "Amplitude", "Period" ], linkable: false, per_line: true }) - .rejectArray(); + .setDisplay(VALUE_DISPLAY.vector, { label: [ "Amplitude", "Period" ], linkable: false, per_line: true }); - inputs[| 21] = nodeValue("Loop", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true ) - .rejectArray(); + inputs[| 21] = nodeValue("Loop", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true ); inputs[| 22] = nodeValue("Surface array", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0, "Whether to select image from an array in order, at random, or treat array as animation." ) .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Random", "Order", "Animation", "Scale" ]) @@ -73,98 +69,81 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co inputs[| 23] = nodeValue("Animation speed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 1, 1 ] ) .setDisplay(VALUE_DISPLAY.range, { linked : true }) - .rejectArray() .setVisible(false); inputs[| 24] = nodeValue("Scatter", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1) - .rejectArray() .setDisplay(VALUE_DISPLAY.enum_button, [ "Uniform", "Random" ]); inputs[| 25] = nodeValue("Boundary data", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, []) .setVisible(false, true); inputs[| 26] = nodeValue("On animation end", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, ANIM_END_ACTION.loop) - .rejectArray() .setDisplay(VALUE_DISPLAY.enum_button, [ "Loop", "Ping pong", "Destroy" ]) .setVisible(false); - inputs[| 27] = nodeValue("Spawn", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true) - .rejectArray(); + inputs[| 27] = nodeValue("Spawn", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true); inputs[| 28] = nodeValue("Random blend", self, JUNCTION_CONNECT.input, VALUE_TYPE.gradient, new gradientObject(c_white) ); - inputs[| 29] = nodeValue("Directed from center", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false, "Make particle move away from the spawn center.") - .rejectArray(); + inputs[| 29] = nodeValue("Directed from center", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false, "Make particle move away from the spawn center."); inputs[| 30] = nodeValue("Distribution map", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone) - .rejectArray() inputs[| 31] = nodeValue("Atlas", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, [] ); inputs[| 32] = nodeValue("Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, seed_random(6)) - .setDisplay(VALUE_DISPLAY._default, { side_button : button(function() { inputs[| 32].setValue(seed_random(6)); }).setIcon(THEME.icon_random, 0, COLORS._main_icon) }) - .rejectArray(); + .setDisplay(VALUE_DISPLAY._default, { side_button : button(function() { inputs[| 32].setValue(seed_random(6)); }).setIcon(THEME.icon_random, 0, COLORS._main_icon) }); inputs[| 33] = nodeValue("Gravity direction", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, -90 ) - .rejectArray() .setDisplay(VALUE_DISPLAY.rotation); inputs[| 34] = nodeValue("Turning", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ] ) .setDisplay(VALUE_DISPLAY.range, { linked : true }); - inputs[| 35] = nodeValue("Turn both directions", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false, "Apply randomized 1, -1 multiplier to the turning speed." ) - .rejectArray(); + inputs[| 35] = nodeValue("Turn both directions", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false, "Apply randomized 1, -1 multiplier to the turning speed." ); - inputs[| 36] = nodeValue("Turn scale with speed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, false ) - .rejectArray(); + inputs[| 36] = nodeValue("Turn scale with speed", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, false ); - inputs[| 37] = nodeValue("Collide ground", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ) - .rejectArray(); + inputs[| 37] = nodeValue("Collide ground", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); - inputs[| 38] = nodeValue("Ground offset", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0 ) - .rejectArray(); + inputs[| 38] = nodeValue("Ground offset", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0 ); inputs[| 39] = nodeValue("Bounce amount", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.5 ) - .rejectArray() .setDisplay(VALUE_DISPLAY.slider); inputs[| 40] = nodeValue("Bounce friction", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1, "Apply horizontal friction once particle stop bouncing." ) - .rejectArray() .setDisplay(VALUE_DISPLAY.slider); inputs[| 41] = nodeValue("Position wiggle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ] ) - .setDisplay(VALUE_DISPLAY.vector, { label: [ "Amplitude", "Period" ], linkable: false, per_line: true }) - .rejectArray(); + .setDisplay(VALUE_DISPLAY.vector, { label: [ "Amplitude", "Period" ], linkable: false, per_line: true }); inputs[| 42] = nodeValue("Rotation wiggle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ] ) - .setDisplay(VALUE_DISPLAY.vector, { label: [ "Amplitude", "Period" ], linkable: false, per_line: true }) - .rejectArray(); + .setDisplay(VALUE_DISPLAY.vector, { label: [ "Amplitude", "Period" ], linkable: false, per_line: true }); inputs[| 43] = nodeValue("Scale wiggle", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0 ] ) - .setDisplay(VALUE_DISPLAY.vector, { label: [ "Amplitude", "Period" ], linkable: false, per_line: true }) - .rejectArray(); + .setDisplay(VALUE_DISPLAY.vector, { label: [ "Amplitude", "Period" ], linkable: false, per_line: true }); inputs[| 44] = nodeValue("Spawn", self, JUNCTION_CONNECT.input, VALUE_TYPE.trigger, false ) - .setDisplay(VALUE_DISPLAY.button, { name: "Trigger" }) - .rejectArray(); + .setDisplay(VALUE_DISPLAY.button, { name: "Trigger" }); - inputs[| 45] = nodeValue("Follow Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ) - .rejectArray(); + inputs[| 45] = nodeValue("Follow Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); - inputs[| 46] = nodeValue("Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.pathnode, noone ) - .rejectArray(); + inputs[| 46] = nodeValue("Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.pathnode, noone ); - inputs[| 47] = nodeValue("Path Deviation", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_11 ) - .rejectArray(); + inputs[| 47] = nodeValue("Path Deviation", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_11 ); inputs[| 48] = nodeValue("Reset Seed", self, JUNCTION_CONNECT.input, VALUE_TYPE.trigger, false ) .setDisplay(VALUE_DISPLAY.button, { name: "Trigger" }) - .rejectArray(); + + inputs[| 49] = nodeValue("Stretch Animation", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ); + + for (var i = 16, n = ds_list_size(inputs); i < n; i++) + inputs[| i].rejectArray(); input_len = ds_list_size(inputs); input_display_list = [ 32, 48, - ["Sprite", false], 0, 22, 23, 26, + ["Sprite", false], 0, 22, 23, 49, 26, ["Spawn", true], 27, 16, 44, 1, 2, 3, 4, 30, 24, 5, ["Movement", true], 29, 6, 18, ["Follow path", true, 45], 46, 47, @@ -241,6 +220,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co var _arr_type = getInputData(22); var _anim_speed = getInputData(23); + var _anim_stre = getInputData(49); var _anim_end = getInputData(26); var _ground = getInputData(37); @@ -325,6 +305,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co part.seed = irandom_range(100000, 999999); part.create(_spr, xx, yy, _lif); part.anim_speed = random_range(_anim_speed[0], _anim_speed[1]); + part.anim_stre = _anim_stre; part.anim_end = _anim_end; part.arr_type = _arr_type; @@ -490,6 +471,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co inputs[| 22].setVisible(false); inputs[| 23].setVisible(false); inputs[| 26].setVisible(false); + inputs[| 49].setVisible(false); inputs[| 46].setVisible(true, _usePth); @@ -505,6 +487,7 @@ function Node_VFX_Spawner_Base(_x, _y, _group = noone) : Node(_x, _y, _group) co if(_type == 2) { inputs[| 23].setVisible(true); inputs[| 26].setVisible(true); + inputs[| 49].setVisible(true); } } diff --git a/scripts/node_curve/node_curve.gml b/scripts/node_curve/node_curve.gml index a3e7edfe5..92bb41b1e 100644 --- a/scripts/node_curve/node_curve.gml +++ b/scripts/node_curve/node_curve.gml @@ -24,11 +24,13 @@ function Node_Curve(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con __init_mask_modifier(5); // inputs 9, 10 + inputs[| 11] = nodeValue("Alpha", self, JUNCTION_CONNECT.input, VALUE_TYPE.curve, CURVE_DEF_01); + outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ 7, 8, ["Surfaces", true], 0, 5, 6, 9, 10, - ["Curve", false], 1, 2, 3, 4, + ["Curve", false], 1, 2, 3, 4, 11, ]; attribute_surface_depth(); @@ -42,6 +44,7 @@ function Node_Curve(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con var _rcur = _data[2]; var _gcur = _data[3]; var _bcur = _data[4]; + var _acur = _data[11]; surface_set_shader(_outSurf, sh_curve); shader_set_f("w_curve", _wcur); @@ -56,6 +59,9 @@ function Node_Curve(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con shader_set_f("b_curve", _bcur); shader_set_i("b_amount", array_length(_bcur)); + shader_set_f("a_curve", _acur); + shader_set_i("a_amount", array_length(_acur)); + draw_surface_safe(_data[0]); surface_reset_shader(); diff --git a/scripts/node_shape/node_shape.gml b/scripts/node_shape/node_shape.gml index a5ffd42e6..f5c4f266d 100644 --- a/scripts/node_shape/node_shape.gml +++ b/scripts/node_shape/node_shape.gml @@ -1,7 +1,8 @@ #region create global.node_shape_keys = [ "rectangle", "ellipse", "regular polygon", "star", "arc", "teardrop", "cross", "leaf", "crescent", "donut", - "square", "circle", "triangle", "pentagon", "hexagon", "ring", "diamond", "trapezoid", "parallelogram", + "square", "circle", "triangle", "pentagon", "hexagon", "ring", "diamond", "trapezoid", "parallelogram", "heart", + "arrow", ]; function Node_create_Shape(_x, _y, _group = noone, _param = {}) { #region @@ -37,11 +38,23 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con inputs[| 1] = nodeValue("Background", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false); - shape_types = [ "Rectangle", "Diamond", "Trapezoid", "Parallelogram", "Ellipse", "Regular polygon", "Star", "Arc", "Teardrop", "Cross", "Leaf", "Crescent", "Donut", ]; + shape_types = [ "Rectangle", "Diamond", "Trapezoid", "Parallelogram", + -1, + "Ellipse", "Arc", "Donut", "Crescent", "Disk Segment", "Pie", + -1, + "Regular polygon", "Star", "Cross", "Rounded Cross", + -1, + "Teardrop", "Leaf", "Heart", "Arrow", + ]; shape_types_str = []; - for( var i = 0, n = array_length(shape_types); i < n; i++ ) - shape_types_str[i] = new scrollItem(shape_types[i], s_node_shape_type, i); + var _ind = 0; + for( var i = 0, n = array_length(shape_types); i < n; i++ ) { + if(shape_types[i] == -1) + shape_types_str[i] = -1; + else + shape_types_str[i] = new scrollItem(shape_types[i], s_node_shape_type, _ind++); + } inputs[| 2] = nodeValue("Shape", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) .setDisplay(VALUE_DISPLAY.enum_scroll, shape_types_str); @@ -106,12 +119,17 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con inputs[| 22] = nodeValue("Skew", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.5 ) .setDisplay(VALUE_DISPLAY.slider); + inputs[| 23] = nodeValue("Arrow Sizes", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0.2, 0.3 ] ) + .setDisplay(VALUE_DISPLAY.slider_range); + + inputs[| 24] = nodeValue("Arrow Head", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 3 ); + outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ ["Output", false], 0, 6, ["Transform", false], 15, 3, 16, 17, 19, - ["Shape", false], 14, 2, 9, 4, 13, 5, 7, 8, 21, 22, + ["Shape", false], 14, 2, 9, 4, 13, 5, 7, 8, 21, 22, 23, 24, ["Render", true], 10, 12, 20, 18, ["Background", true, 1], 11, ]; @@ -277,6 +295,8 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con inputs[| 18].setVisible( true); inputs[| 21].setVisible(false); inputs[| 22].setVisible(false); + inputs[| 23].setVisible(false); + inputs[| 24].setVisible(false); var _shp = array_safe_get(shape_types, _shape, ""); if(is_struct(_shp)) _shp = _shp.data; @@ -291,14 +311,12 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con case "Diamond" : inputs[| 9].setVisible( true); - inputs[| 18].setVisible(false); shader_set_i("shape", 10); break; case "Trapezoid" : inputs[| 9].setVisible( true); - inputs[| 18].setVisible(false); inputs[| 21].setVisible( true); shader_set_i("shape", 11); @@ -307,7 +325,6 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con case "Parallelogram" : inputs[| 9].setVisible( true); - inputs[| 18].setVisible(false); inputs[| 22].setVisible( true); shader_set_i("shape", 12); @@ -415,6 +432,42 @@ function Node_Shape(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) con shader_set_f("inner", _data[13]); break; + case "Heart": + + shader_set_i("shape", 13); + break; + + case "Disk Segment": + inputs[| 13].setVisible(true); + + inputs[| 13].name = "Segment Size"; + + shader_set_i("shape", 14); + shader_set_f("inner", -1 + _data[13] * 2.); + break; + + case "Pie": + inputs[| 7].setVisible(true); + + shader_set_i("shape", 15); + shader_set_f("angle", degtorad(_data[7])); + break; + + case "Rounded Cross": + inputs[| 9].setVisible(true); + + shader_set_i("shape", 16); + break; + + case "Arrow": + inputs[| 23].setVisible(true); + inputs[| 24].setVisible(true); + + shader_set_i("shape", 17); + shader_set_f("arrow", _data[23]); + shader_set_f("arrow_head", _data[24]); + break; + } #endregion shader_set_f("dimension", _dim); diff --git a/shaders/sh_curve/sh_curve.fsh b/shaders/sh_curve/sh_curve.fsh index 973809494..a586849b3 100644 --- a/shaders/sh_curve/sh_curve.fsh +++ b/shaders/sh_curve/sh_curve.fsh @@ -16,6 +16,9 @@ uniform int g_amount; uniform float b_curve[64]; uniform int b_amount; +uniform float a_curve[64]; +uniform int a_amount; + float eval_curve_segment_t(in float _y0, in float ax0, in float ay0, in float bx1, in float by1, in float _y1, in float prog) { return _y0 * pow(1. - prog, 3.) + ay0 * 3. * pow(1. - prog, 2.) * prog + @@ -105,13 +108,12 @@ void main() { col.r = curveEval(r_curve, r_amount, col.r); col.g = curveEval(g_curve, g_amount, col.g); col.b = curveEval(b_curve, b_amount, col.b); + col.a = curveEval(a_curve, b_amount, col.a); float w = (col.r + col.g + col.b) / 3.; float wtarget = curveEval(w_curve, w_amount, w); - col.r *= wtarget / w; - col.g *= wtarget / w; - col.b *= wtarget / w; + col.rgb *= wtarget / w; gl_FragColor = col; } diff --git a/shaders/sh_shape/sh_shape.fsh b/shaders/sh_shape/sh_shape.fsh index 0e11de00c..5d283b4b4 100644 --- a/shaders/sh_shape/sh_shape.fsh +++ b/shaders/sh_shape/sh_shape.fsh @@ -29,6 +29,9 @@ uniform vec2 center; uniform vec2 scale; uniform vec2 trep; +uniform vec2 arrow; +uniform float arrow_head; + uniform vec4 bgColor; #define PI 3.14159265359 @@ -170,6 +173,95 @@ float sdParallelogram( in vec2 p, float wi, float he, float sk ) { return sqrt(d.x) * sign(-d.y); } +float sdHeart( in vec2 p ) { + p.x = abs(p.x); + p.y = -p.y + 0.9; + p /= 1.65; + + if( p.y+p.x>1.0 ) + return sqrt(dot2(p-vec2(0.25,0.75))) - sqrt(2.0)/4.0; + return sqrt(min(dot2(p-vec2(0.00,1.00)), + dot2(p-0.5*max(p.x+p.y,0.0)))) * sign(p.x-p.y); +} + +float sdCutDisk( in vec2 p, in float r, in float h ) { + float w = sqrt(r*r-h*h); // constant for any given shape + p.x = abs(p.x); + float s = max( (h-r)*p.x*p.x+w*w*(h+r-2.0*p.y), h*p.x-w*p.y ); + return (s<0.0) ? length(p)-r : + (p.x0.0 ) // conditional is optional + { + q = pz; + q -= vec2(k,-1.0)*clamp( (q.x*k-q.y)/(k*k+1.0), 0.0, w2 ); + di = min( di, dot(q,q) ); + } + + // === sign === + + float si = 1.0; + float z = l - p.x; + if( min(p.x,z)>0.0 ) //if( p.x>0.0 && z>0.0 ) + { + float h = (pz.x<0.0) ? w1 : z/k; + if( p.y":"", @@ -81,44 +86,59 @@ "tracks":[ {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"6c545309-6ffe-4c08-bed2-9c82065ad8d4","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"ee006fd1-e9eb-4d05-b46f-eae5fa8612b0","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"ac2c058e-dd94-4d88-9958-fac479f23660","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"2f766208-44fc-4bbb-ac0c-a6bbdf6aa948","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"d3111831-695a-4461-9130-3228744761bb","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"46c3d423-c7ec-4994-af09-809ef518a079","IsCreationKey":false,"Key":1.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"14bfe2b8-bba9-422d-9309-159a2068a2b8","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"e82eca16-b46d-4b08-adc4-3d700284a9e3","IsCreationKey":false,"Key":1.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"5526c2ef-3545-4dca-bec6-85357e76b6b1","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"31c2191f-90a4-40a8-89d2-1ff98308a5e7","IsCreationKey":false,"Key":2.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"6d6db666-0f53-414f-8e2e-75217cbcd027","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"455e0678-04b4-42e4-8b55-50c80b9f2fb5","IsCreationKey":false,"Key":2.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"7a237ffa-be4c-4d8e-bd2f-ae809eb3b319","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"67b85fa1-1715-453b-a9e3-c936d250dc7d","IsCreationKey":false,"Key":3.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"b1ec2af5-bef8-4227-95ad-3e2460e6e676","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"06a0723a-12ad-4b68-be76-0f7211427afe","IsCreationKey":false,"Key":3.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"83508ab4-faeb-411c-8b6e-d29be9cddea9","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"21957fda-cd5a-4e10-a5a8-ca944c8ccc65","IsCreationKey":false,"Key":4.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"b0761a58-4f3d-4174-8a91-3d14246ac152","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"3a442dac-3cd2-4edb-ad51-c2c739494466","IsCreationKey":false,"Key":4.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"71d205ee-df82-4582-bf38-39392d51dd23","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"766e25dd-8b26-47a2-996a-ca9f7b58f9ae","IsCreationKey":false,"Key":5.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"8ea8d1e8-6255-4f98-9112-0092f61f32d0","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"21287849-b4cb-4471-b37c-ab656344897d","IsCreationKey":false,"Key":5.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"bab10856-f499-4364-8bdb-230f241dcf0d","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"75551b21-9282-41fa-8c8a-855d0b527fbb","IsCreationKey":false,"Key":6.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"9619ab69-4168-4599-a598-8c722310ef03","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"842496cb-ff53-4eec-86d6-3c45d2e0a909","IsCreationKey":false,"Key":6.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"d3655d0c-9269-4162-9ae7-82c547edf674","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"f8425249-5e88-4123-a018-c3eb02073c4a","IsCreationKey":false,"Key":7.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"83cbb736-e130-438e-b366-d4834ff26292","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"d04f8de9-a47b-43e0-b589-f03e48d4f5dd","IsCreationKey":false,"Key":7.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"84e23289-8dc8-4aeb-b056-57889a5a04a9","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"8e68a1ba-fa7b-4a85-b48d-cdf67b539901","IsCreationKey":false,"Key":8.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"c993ff0d-daf9-4950-9c17-252474cc9195","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"794d4fe9-9547-44c3-992c-c3b9734c9cf1","IsCreationKey":false,"Key":8.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"2893727a-1872-4e51-b211-59df36bbc651","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"7c381e7f-8d22-4f8b-a9a8-00df7fe13c2e","IsCreationKey":false,"Key":9.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"41c086f9-4334-4833-a514-0a6c3194841b","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"4c444757-09fd-40d2-a457-c3a3ff5cc662","IsCreationKey":false,"Key":9.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"3b6185db-9a13-4cdc-a4e6-a483cf4d6281","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"60c28ee2-65e2-4896-923e-2ed609102398","IsCreationKey":false,"Key":10.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"1b712b1b-6360-41cb-8ff2-e1251fd32421","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"45408932-cb01-462e-9fee-4188d46331b4","IsCreationKey":false,"Key":10.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"8973bafa-9ba5-4018-82fe-49369c528c77","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"4c0e2a8c-e36a-43d2-a462-b1f386b96940","IsCreationKey":false,"Key":11.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"d2df5faf-acdc-4267-9fc3-e2587ea46ffb","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"12a7f51a-f928-49aa-8f69-1261ddf60d83","IsCreationKey":false,"Key":11.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, {"$Keyframe":"","Channels":{ - "0":{"$SpriteFrameKeyframe":"","Id":{"name":"651de5b3-7033-4983-aa29-7308549c5997","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, - },"Disabled":false,"id":"faf1f5e1-c375-4707-bb11-4ecc614a5126","IsCreationKey":false,"Key":12.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"9fbc0143-c73b-4d43-9ab1-2b54fdf9dfa0","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"f2a3bc4d-69bd-4b2a-95dc-b8b4095852ec","IsCreationKey":false,"Key":12.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"68cedd47-7826-45d0-936a-09d3f0b2514e","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"9b4d9126-b4d4-4c7a-82ce-cce6f63de1b1","IsCreationKey":false,"Key":13.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"d327df90-02a8-4278-a2f0-bad7924956ff","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"08e182fb-9797-4ce1-b4bd-d39862c036c0","IsCreationKey":false,"Key":14.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"4dd803df-0824-47d6-a1d9-a4c0b94aa30f","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"7b49830e-1876-4d95-99a2-c9a3f8401044","IsCreationKey":false,"Key":15.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"60deee41-cb26-435b-b3dd-7f03e79b3f50","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"ebd5e057-56d6-4239-9544-690c95b076f6","IsCreationKey":false,"Key":16.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"49f66653-48bb-46ca-adb5-39604325a9d1","path":"sprites/s_node_shape_type/s_node_shape_type.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"cd22fe67-e516-45a9-96de-b624bf5c6754","IsCreationKey":false,"Key":17.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, ],"resourceType":"KeyframeStore","resourceVersion":"2.0",},"modifiers":[],"name":"frames","resourceType":"GMSpriteFramesTrack","resourceVersion":"2.0","spriteId":null,"trackColour":0,"tracks":[],"traits":0,}, ], "visibleRange":null,