From ee49f6741449b07fccb4f01de715ae4ba87be5a8 Mon Sep 17 00:00:00 2001 From: Tanasart Date: Wed, 20 Nov 2024 15:05:51 +0700 Subject: [PATCH] patreon manual verification --- PixelComposer.resource_order | 4 + PixelComposer.yyp | 4 + objects/o_dialog_color_quick_pick/Draw_64.gml | 67 +++++----- objects/o_dialog_patreon/Create_0.gml | 65 +++++++--- objects/o_dialog_patreon/Draw_64.gml | 23 +++- objects/o_main/Create_0.gml | 1 + objects/o_main/Other_62.gml | 2 +- objects/o_main/Other_68.gml | 4 + scripts/binder_gamemaker/binder_gamemaker.gml | 25 +--- .../binder_gamemaker_room.gml | 56 +++++++++ .../binder_gamemaker_room.yy | 13 ++ scripts/console_commands/console_commands.gml | 86 +++++++++---- scripts/ds_map/ds_map.gml | 13 +- scripts/file_functions/file_functions.gml | 1 + scripts/globals/globals.gml | 8 +- scripts/network_data/network_data.gml | 39 ++++++ scripts/network_data/network_data.yy | 13 ++ scripts/node_gm_room/node_gm_room.gml | 89 +++++++++++++- scripts/node_registry/node_registry.gml | 5 +- scripts/node_value_path/node_value_path.gml | 8 ++ .../node_websocket_sender.gml | 24 ++-- .../notification_system.gml | 12 +- scripts/panel_console/panel_console.gml | 88 +++++++++----- .../panel_gm_explorer/panel_gm_explorer.gml | 12 +- scripts/panel_graph/panel_graph.gml | 5 + scripts/panel_menu/panel_menu.gml | 93 +++++++------- scripts/panel_patreon/panel_patreon.gml | 11 +- .../patreon_email_check.gml | 81 +++++++++++++ scripts/struct_functions/struct_functions.gml | 2 +- .../6327ddfc-a4fa-4bf4-9a22-511c4581e6c2.png | Bin 0 -> 686 bytes .../6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b.png | Bin 0 -> 626 bytes .../793151f9-7bc7-4285-af9a-e4c5f3d6105e.png | Bin 0 -> 593 bytes .../7ec25b15-c8dc-4ce5-9f17-c5e9923a9525.png | Bin 0 -> 662 bytes .../cc9f6201-c9f5-414e-8b28-97566eb6b405.png | Bin 0 -> 589 bytes .../d81c8a0c-7ea7-4c85-95ad-0b7394936c31.png | Bin 0 -> 615 bytes .../f17dd9a2-d5cb-44d9-9ec1-903968019825.png | Bin 0 -> 622 bytes .../3c6fc479-708a-439a-8f0c-80dd14f575f8.png | Bin 0 -> 686 bytes .../3c6fc479-708a-439a-8f0c-80dd14f575f8.png | Bin 0 -> 626 bytes .../3c6fc479-708a-439a-8f0c-80dd14f575f8.png | Bin 0 -> 593 bytes .../3c6fc479-708a-439a-8f0c-80dd14f575f8.png | Bin 0 -> 662 bytes .../3c6fc479-708a-439a-8f0c-80dd14f575f8.png | Bin 0 -> 589 bytes .../3c6fc479-708a-439a-8f0c-80dd14f575f8.png | Bin 0 -> 615 bytes .../3c6fc479-708a-439a-8f0c-80dd14f575f8.png | Bin 0 -> 622 bytes sprites/s_gmlayer/s_gmlayer.yy | 114 ++++++++++++++++++ .../cf8a0785-6466-41ac-a4b0-1d74a16a9e93.png | Bin 0 -> 849 bytes .../4ce347b1-ee6d-4cde-be23-eb243caf1c50.png | Bin 0 -> 849 bytes sprites/s_gmroom/s_gmroom.yy | 90 ++++++++++++++ 47 files changed, 847 insertions(+), 211 deletions(-) create mode 100644 scripts/binder_gamemaker_room/binder_gamemaker_room.gml create mode 100644 scripts/binder_gamemaker_room/binder_gamemaker_room.yy create mode 100644 scripts/network_data/network_data.gml create mode 100644 scripts/network_data/network_data.yy create mode 100644 sprites/s_gmlayer/6327ddfc-a4fa-4bf4-9a22-511c4581e6c2.png create mode 100644 sprites/s_gmlayer/6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b.png create mode 100644 sprites/s_gmlayer/793151f9-7bc7-4285-af9a-e4c5f3d6105e.png create mode 100644 sprites/s_gmlayer/7ec25b15-c8dc-4ce5-9f17-c5e9923a9525.png create mode 100644 sprites/s_gmlayer/cc9f6201-c9f5-414e-8b28-97566eb6b405.png create mode 100644 sprites/s_gmlayer/d81c8a0c-7ea7-4c85-95ad-0b7394936c31.png create mode 100644 sprites/s_gmlayer/f17dd9a2-d5cb-44d9-9ec1-903968019825.png create mode 100644 sprites/s_gmlayer/layers/6327ddfc-a4fa-4bf4-9a22-511c4581e6c2/3c6fc479-708a-439a-8f0c-80dd14f575f8.png create mode 100644 sprites/s_gmlayer/layers/6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b/3c6fc479-708a-439a-8f0c-80dd14f575f8.png create mode 100644 sprites/s_gmlayer/layers/793151f9-7bc7-4285-af9a-e4c5f3d6105e/3c6fc479-708a-439a-8f0c-80dd14f575f8.png create mode 100644 sprites/s_gmlayer/layers/7ec25b15-c8dc-4ce5-9f17-c5e9923a9525/3c6fc479-708a-439a-8f0c-80dd14f575f8.png create mode 100644 sprites/s_gmlayer/layers/cc9f6201-c9f5-414e-8b28-97566eb6b405/3c6fc479-708a-439a-8f0c-80dd14f575f8.png create mode 100644 sprites/s_gmlayer/layers/d81c8a0c-7ea7-4c85-95ad-0b7394936c31/3c6fc479-708a-439a-8f0c-80dd14f575f8.png create mode 100644 sprites/s_gmlayer/layers/f17dd9a2-d5cb-44d9-9ec1-903968019825/3c6fc479-708a-439a-8f0c-80dd14f575f8.png create mode 100644 sprites/s_gmlayer/s_gmlayer.yy create mode 100644 sprites/s_gmroom/cf8a0785-6466-41ac-a4b0-1d74a16a9e93.png create mode 100644 sprites/s_gmroom/layers/cf8a0785-6466-41ac-a4b0-1d74a16a9e93/4ce347b1-ee6d-4cde-be23-eb243caf1c50.png create mode 100644 sprites/s_gmroom/s_gmroom.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index 171b7898e..bd97bd4b3 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -451,6 +451,7 @@ {"name":"BBMOD_Vec3","order":5,"path":"scripts/BBMOD_Vec3/BBMOD_Vec3.yy",}, {"name":"BBMOD_Vec4","order":6,"path":"scripts/BBMOD_Vec4/BBMOD_Vec4.yy",}, {"name":"bin_function","order":11,"path":"scripts/bin_function/bin_function.yy",}, + {"name":"binder_gamemaker_room","order":2,"path":"scripts/binder_gamemaker_room/binder_gamemaker_room.yy",}, {"name":"biterator","order":1,"path":"scripts/biterator/biterator.yy",}, {"name":"buffer_object","order":1,"path":"scripts/buffer_object/buffer_object.yy",}, {"name":"buttonAnchor","order":5,"path":"scripts/buttonAnchor/buttonAnchor.yy",}, @@ -709,6 +710,7 @@ {"name":"meta_data","order":12,"path":"scripts/meta_data/meta_data.yy",}, {"name":"mouse_input","order":1,"path":"scripts/mouse_input/mouse_input.yy",}, {"name":"mtl_reader","order":6,"path":"scripts/mtl_reader/mtl_reader.yy",}, + {"name":"network_data","order":22,"path":"scripts/network_data/network_data.yy",}, {"name":"node_3d_camera_set","order":1,"path":"scripts/node_3d_camera_set/node_3d_camera_set.yy",}, {"name":"node_3d_displace","order":8,"path":"scripts/node_3d_displace/node_3d_displace.yy",}, {"name":"node_3d_instancer","order":3,"path":"scripts/node_3d_instancer/node_3d_instancer.yy",}, @@ -1996,6 +1998,8 @@ {"name":"s_gear_24","order":69,"path":"sprites/s_gear_24/s_gear_24.yy",}, {"name":"s_gizmo","order":4,"path":"sprites/s_gizmo/s_gizmo.yy",}, {"name":"s_globe","order":233,"path":"sprites/s_globe/s_globe.yy",}, + {"name":"s_gmlayer","order":4,"path":"sprites/s_gmlayer/s_gmlayer.yy",}, + {"name":"s_gmroom","order":3,"path":"sprites/s_gmroom/s_gmroom.yy",}, {"name":"s_grad_blend","order":70,"path":"sprites/s_grad_blend/s_grad_blend.yy",}, {"name":"s_gradient_mask","order":12,"path":"sprites/s_gradient_mask/s_gradient_mask.yy",}, {"name":"s_graph","order":71,"path":"sprites/s_graph/s_graph.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 297543a6e..971391f22 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -953,6 +953,7 @@ {"id":{"name":"BBMOD_Vec3","path":"scripts/BBMOD_Vec3/BBMOD_Vec3.yy",},}, {"id":{"name":"BBMOD_Vec4","path":"scripts/BBMOD_Vec4/BBMOD_Vec4.yy",},}, {"id":{"name":"bin_function","path":"scripts/bin_function/bin_function.yy",},}, + {"id":{"name":"binder_gamemaker_room","path":"scripts/binder_gamemaker_room/binder_gamemaker_room.yy",},}, {"id":{"name":"binder_gamemaker","path":"scripts/binder_gamemaker/binder_gamemaker.yy",},}, {"id":{"name":"biterator","path":"scripts/biterator/biterator.yy",},}, {"id":{"name":"blurSurface","path":"scripts/blurSurface/blurSurface.yy",},}, @@ -1255,6 +1256,7 @@ {"id":{"name":"migration_function","path":"scripts/migration_function/migration_function.yy",},}, {"id":{"name":"mouse_input","path":"scripts/mouse_input/mouse_input.yy",},}, {"id":{"name":"mtl_reader","path":"scripts/mtl_reader/mtl_reader.yy",},}, + {"id":{"name":"network_data","path":"scripts/network_data/network_data.yy",},}, {"id":{"name":"node_2d_light","path":"scripts/node_2d_light/node_2d_light.yy",},}, {"id":{"name":"node_3d_camera_set","path":"scripts/node_3d_camera_set/node_3d_camera_set.yy",},}, {"id":{"name":"node_3d_camera","path":"scripts/node_3d_camera/node_3d_camera.yy",},}, @@ -2721,6 +2723,8 @@ {"id":{"name":"s_gear_24","path":"sprites/s_gear_24/s_gear_24.yy",},}, {"id":{"name":"s_gizmo","path":"sprites/s_gizmo/s_gizmo.yy",},}, {"id":{"name":"s_globe","path":"sprites/s_globe/s_globe.yy",},}, + {"id":{"name":"s_gmlayer","path":"sprites/s_gmlayer/s_gmlayer.yy",},}, + {"id":{"name":"s_gmroom","path":"sprites/s_gmroom/s_gmroom.yy",},}, {"id":{"name":"s_grad_blend","path":"sprites/s_grad_blend/s_grad_blend.yy",},}, {"id":{"name":"s_gradient_mask","path":"sprites/s_gradient_mask/s_gradient_mask.yy",},}, {"id":{"name":"s_graph","path":"sprites/s_graph/s_graph.yy",},}, diff --git a/objects/o_dialog_color_quick_pick/Draw_64.gml b/objects/o_dialog_color_quick_pick/Draw_64.gml index 5c8602424..42a1c5e7a 100644 --- a/objects/o_dialog_color_quick_pick/Draw_64.gml +++ b/objects/o_dialog_color_quick_pick/Draw_64.gml @@ -1,42 +1,37 @@ /// @description -#region base - var pal = DEF_PALETTE; - var col = min(array_length(pal), 8); - var row = ceil(array_length(pal) / col); + +var pal = DEF_PALETTE; +var col = min(array_length(pal), 8); +var row = ceil(array_length(pal) / col); + +var ss = ui(24); +var ww = ui(16) + ss * col; +var hh = ui(16) + ss * row; + +var x0 = min(x, WIN_W - ww); +var y0 = min(y, WIN_H - hh); + +var x1 = x0 + ww; +var y1 = y0 + hh; + +draw_sprite_stretched(THEME.dialog, 0, x0 - ui(8), y0 - ui(8), ww + ui(8) * 2, hh + ui(8) * 2); + +for( var i = 0, n = array_length(pal); i < n; i++ ) { + var r = floor(i / col); + var c = i % col; - var ss = ui(24); - var ww = ui(16) + ss * col; - var hh = ui(16) + ss * row; + var _x = x0 + ui(8) + c * ss; + var _y = y0 + ui(8) + r * ss; - var x0 = min(x, WIN_W - ww); - var y0 = min(y, WIN_H - hh); + draw_sprite_stretched_ext(THEME.s_box_r2, 0, _x + 1, _y + 1, ss - 2, ss - 2, pal[i]); - var x1 = x0 + ww; - var y1 = y0 + hh; - - draw_sprite_stretched(THEME.dialog, 0, x0 - ui(8), y0 - ui(8), ww + ui(8) * 2, hh + ui(8) * 2); - - for( var i = 0, n = array_length(pal); i < n; i++ ) { - var r = floor(i / col); - var c = i % col; + if(point_in_rectangle(mouse_mx, mouse_my, _x, _y, _x + ss - 1, _y + ss - 1)) { + draw_sprite_stretched_add(THEME.s_box_r2, 1, _x + 1, _y + 1, ss - 2, ss - 2, c_white, 0.3); - var _x = x0 + ui(8) + c * ss; - var _y = y0 + ui(8) + r * ss; - - draw_set_color(pal[i]); - draw_rectangle(_x + 2, _y + 2, _x + ss - 2, _y + ss - 2, false); - - if(point_in_rectangle(mouse_mx, mouse_my, _x, _y, _x + ss - 1, _y + ss - 1)) { - draw_set_color(c_white); - draw_rectangle_border(_x + 2, _y + 2, _x + ss - 2, _y + ss - 2, 2); - - if(selecting != i) { - if(onApply) onApply(pal[i]); - } - selecting = i; - } + if(selecting != i && onApply) onApply(pal[i]); + selecting = i; } - - if(mouse_release(mb_left)) - instance_destroy(); -#endregion \ No newline at end of file +} + +if(mouse_release(mb_left)) + instance_destroy(); diff --git a/objects/o_dialog_patreon/Create_0.gml b/objects/o_dialog_patreon/Create_0.gml index 3a0749780..472812abc 100644 --- a/objects/o_dialog_patreon/Create_0.gml +++ b/objects/o_dialog_patreon/Create_0.gml @@ -3,7 +3,7 @@ event_inherited(); #region data dialog_w = ui(480); - dialog_h = ui(200); + dialog_h = ui(240); title_height = ui(28); destroy_on_click_out = false; @@ -13,29 +13,62 @@ event_inherited(); req_member = {}; access_token = ""; + page = 0; status = 0; + tb_code = new textBox(TEXTBOX_INPUT.text, function(t) /*=>*/ { submit_code(t); }); + if(IS_PATREON) { txt = "Patreon verified, thank you for supporting Pixel Composer!"; server = 0; - dialog_h += ui(40); } else { - txt = "Sign-in to Patreon on browser"; - var attmp = 0; - do { - port = irandom_range(7000, 20000); - server = network_create_server_raw(network_socket_ws, port, 32); - } until(server >= 0 || attmp++ >= 100); + if(!os_is_network_connected()) { + status = -1; + txt = "No internet connection, please try again."; + + } else { + txt = "Sign-in to Patreon on browser"; + var attmp = 0; + do { + port = irandom_range(7000, 20000); + server = network_create_server_raw(network_socket_ws, port, 32); + + } until(server >= 0 || attmp++ >= 100); + + if(server >= 0) { + var _url = "www.patreon.com/oauth2/authorize"; + _url += "?response_type=code"; + _url += "&client_id=oZ1PNvUY61uH0FiA7ZPMBy77Xau3Ok9tfvsT_Y8DQwyKeMNjaVC35r1qsK09QJhY"; + _url += "&redirect_uri=https://pixel-composer.com/verify"; + _url += "&scope=identity campaigns.members"; + _url += "&state=" + string(port); + + url_open(_url); + + } else { + status = -1; + txt = "Cannot connect to Patreon, please try again."; + } + } + } + + function submit_code(code) { + code = string_trim(code); - var _url = @"www.patreon.com/oauth2/authorize"; + var _header = ds_map_create(); + _header[? "User-Agent"] = "pixelcomposer"; + _header[? "Content-Type"] = "application/x-www-form-urlencoded"; + + var _content = $"code={code}"; + _content += $"&grant_type=authorization_code"; + _content += $"&client_id=oZ1PNvUY61uH0FiA7ZPMBy77Xau3Ok9tfvsT_Y8DQwyKeMNjaVC35r1qsK09QJhY"; + _content += $"&client_secret=winWb1rAgSGUn9JBXxCjWqIb7EYkfYWO9j4nK_Stmg4W_wtKbdE30ckqvcwcCn2o"; + _content += $"&redirect_uri=https://pixel-composer.com/verify"; - _url += "?response_type=code"; - _url += "&client_id=oZ1PNvUY61uH0FiA7ZPMBy77Xau3Ok9tfvsT_Y8DQwyKeMNjaVC35r1qsK09QJhY"; - _url += "&redirect_uri=https://pixel-composer.com/verify"; - _url += "&scope=identity campaigns.members"; - _url += $"&state={port}"; - - url_open(_url); + req_patreon = http_request("https://www.patreon.com/api/oauth2/token", "POST", _header, _content); + ds_map_destroy(_header); + + page = 1; } #endregion \ No newline at end of file diff --git a/objects/o_dialog_patreon/Draw_64.gml b/objects/o_dialog_patreon/Draw_64.gml index a1c4c8e69..fa4fb451b 100644 --- a/objects/o_dialog_patreon/Draw_64.gml +++ b/objects/o_dialog_patreon/Draw_64.gml @@ -27,14 +27,14 @@ if !ready exit; draw_sprite(s_patreon_banner, 0, cx, yy); - var _bw = ui(100); - var _bh = ui(32); - var _bx = cx - _bw / 2; - var _by = dialog_y + dialog_h - ui(16 + 32); - var _ty = yy + ui(120); if(IS_PATREON) { + var _bw = ui(100); + var _bh = ui(32); + var _bx = cx - _bw / 2; + var _by = dialog_y + dialog_h - ui(16 + 32); + draw_set_text(f_p1, fa_center, fa_center, COLORS._main_value_positive); draw_text(cx, _ty, txt); @@ -52,5 +52,18 @@ if !ready exit; } else { draw_set_text(f_p1, fa_center, fa_center, status == 0? COLORS._main_text : COLORS._main_value_negative); draw_text(cx, _ty, txt); + + var _tw = dialog_w - ui(32); + var _th = TEXTBOX_HEIGHT + ui(4); + var _tx = cx - _tw / 2; + var _ty = dialog_y + dialog_h - ui(16) - _th; + + if(page == 0) { + tb_code.setFocusHover(sFOCUS, sHOVER); + tb_code.draw(_tx, _ty, _tw, _th, ""); + + } else if(status == 0) { + draw_sprite_ext(THEME.loading_s, 0, cx, _ty + _th / 2, 1, 1, current_time, COLORS._main_icon, 1); + } } #endregion \ No newline at end of file diff --git a/objects/o_main/Create_0.gml b/objects/o_main/Create_0.gml index 69d111a04..59073ca75 100644 --- a/objects/o_main/Create_0.gml +++ b/objects/o_main/Create_0.gml @@ -156,6 +156,7 @@ asyncInit(); network_set_config(network_config_use_non_blocking_socket, 0); + if(!os_is_network_connected()) array_push(NETWORK_LOG, new notification(NOTI_TYPE.internal, $"Network offline")); #endregion #region steam diff --git a/objects/o_main/Other_62.gml b/objects/o_main/Other_62.gml index 262a15f00..a36eb1f55 100644 --- a/objects/o_main/Other_62.gml +++ b/objects/o_main/Other_62.gml @@ -1,5 +1,5 @@ /// @description network -var _id = async_load[? "id"]; +var _id = async_load[? "id"]; if(ds_map_exists(global.FILE_LOAD_ASYNC, async_load[? "id"])) { var cb = global.FILE_LOAD_ASYNC[? async_load[? "id"]]; diff --git a/objects/o_main/Other_68.gml b/objects/o_main/Other_68.gml index d28b79156..f55907735 100644 --- a/objects/o_main/Other_68.gml +++ b/objects/o_main/Other_68.gml @@ -1,5 +1,9 @@ /// @description var _id = async_load[? "id"]; +var _nid = $"net_{struct_names_count(NETWORK_LOG_DATA)}"; + +NETWORK_LOG_DATA[$ _nid] = ds_map_print(async_load); +array_push(NETWORK_LOG, new notification(NOTI_TYPE.internal, $"Received network event {_nid}")); if(_id == TCP_SERVER) { var t = async_load[? "type"]; diff --git a/scripts/binder_gamemaker/binder_gamemaker.gml b/scripts/binder_gamemaker/binder_gamemaker.gml index 17dfaf262..91e861f24 100644 --- a/scripts/binder_gamemaker/binder_gamemaker.gml +++ b/scripts/binder_gamemaker/binder_gamemaker.gml @@ -5,14 +5,16 @@ function Binder_Gamemaker(path) { return new __Binder_Gamemaker(path); } -function GMSprite(_gm, _path, _info) constructor { +function GMObject(_gm, _path, _info) constructor { gmBinder = _gm; path = $"{_gm.dir}/{_path}"; key = _path; raw = _info; type = _info.resourceType; thumbnail = noone; - +} + +function GMSprite(_gm, _path, _info) : GMObject(_gm, _path, _info) constructor { var _dirr = filename_dir(path); var _frame = raw.frames; var _layers = raw.layers; @@ -27,27 +29,10 @@ function GMSprite(_gm, _path, _info) constructor { } } -function GMTileset(_gm, _path, _info) constructor { - gmBinder = _gm; - path = $"{_gm.dir}/{_path}"; - key = _path; - raw = _info; - type = _info.resourceType; - thumbnail = noone; - +function GMTileset(_gm, _path, _info) : GMObject(_gm, _path, _info) constructor { sprite = raw.spriteId.path; } -function GMRoom(_gm, _path, _info) constructor { - gmBinder = _gm; - path = $"{_gm.dir}/{_path}"; - key = _path; - raw = _info; - type = _info.resourceType; - thumbnail = noone; - -} - function __Binder_Gamemaker(path) constructor { self.path = path; name = filename_name_only(path); diff --git a/scripts/binder_gamemaker_room/binder_gamemaker_room.gml b/scripts/binder_gamemaker_room/binder_gamemaker_room.gml new file mode 100644 index 000000000..b3338b8c4 --- /dev/null +++ b/scripts/binder_gamemaker_room/binder_gamemaker_room.gml @@ -0,0 +1,56 @@ +function GMRoom(_gm, _path, _info) : GMObject(_gm, _path, _info) constructor { + layers = GMRoom_create_layers(raw.layers); +} + +function GMRoom_create_layers(layers) { + var _l = []; + + for( var i = 0, n = array_length(layers); i < n; i++ ) { + var _dat = layers[i]; + + switch(_dat.resourceType) { + case "GMRBackgroundLayer" : _l[i] = new GMRoom_Background(_dat); break; + case "GMRTileLayer" : _l[i] = new GMRoom_Tile(_dat); break; + case "GMRInstanceLayer" : _l[i] = new GMRoom_Instance(_dat); break; + case "GMRPathLayer" : _l[i] = new GMRoom_Path(_dat); break; + case "GMRAssetLayer" : _l[i] = new GMRoom_Asset(_dat); break; + case "GMREffectLayer" : _l[i] = new GMRoom_Effect(_dat); break; + default : _l[i] = new GMRoom_Layer(_dat); break; + } + } + + return _l; +} + +function GMRoom_Layer(_raw) constructor { + name = _raw.name; + visible = _raw.visible; + depth = _raw.depth; + layers = GMRoom_create_layers(_raw.layers); + + index = 6; +} + +function GMRoom_Background(_raw) : GMRoom_Layer(_raw) constructor { + index = 0; + + x = _raw.x; + y = _raw.y; + + colour = _raw.colour; +} + +function GMRoom_Tile(_raw) : GMRoom_Layer(_raw) constructor { + index = 1; + + x = _raw.x; + y = _raw.y; + + tiles = _raw.tiles; + tilesetId = _raw.tilesetId; +} + +function GMRoom_Instance(_raw) : GMRoom_Layer(_raw) constructor { index = 2; } +function GMRoom_Path(_raw) : GMRoom_Layer(_raw) constructor { index = 3; } +function GMRoom_Asset(_raw) : GMRoom_Layer(_raw) constructor { index = 4; } +function GMRoom_Effect(_raw) : GMRoom_Layer(_raw) constructor { index = 5; } diff --git a/scripts/binder_gamemaker_room/binder_gamemaker_room.yy b/scripts/binder_gamemaker_room/binder_gamemaker_room.yy new file mode 100644 index 000000000..be681495c --- /dev/null +++ b/scripts/binder_gamemaker_room/binder_gamemaker_room.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"v1", + "%Name":"binder_gamemaker_room", + "isCompatibility":false, + "isDnD":false, + "name":"binder_gamemaker_room", + "parent":{ + "name":"binder", + "path":"folders/main/binder.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/console_commands/console_commands.gml b/scripts/console_commands/console_commands.gml index 18862468d..a11e566a3 100644 --- a/scripts/console_commands/console_commands.gml +++ b/scripts/console_commands/console_commands.gml @@ -11,24 +11,36 @@ CMD_COLOR = { BOLD : "\033[1m", } +function cmd_error_param(command) { + var _txt = $"[Error] `{command}` not enough argument."; + array_push(CMD, cmdLine(_txt, COLORS._main_value_negative) ); + log_console(_txt, true); +} + function cmd_submit(command) { - if(command == "") return; + if(command == "") return noone; array_push(CMD, cmdLineIn(command)); array_push(CMDIN, command); - - var cmd = string_splice(command, " ", false, false); - var cmd_type = cmd[0]; - cmd_type = string_trim(cmd_type); + var raw = string_splice(command, " ", false, false); + var opt = []; + var cmd = []; + + for( var i = 0, n = array_length(raw); i < n; i++ ) { + var _c = string_trim(raw[i]); + + if(string_starts_with(_c, "-")) + array_push(opt, _c); + else + array_push(cmd, _c); + } + + var cmd_type = cmd[0]; + switch(cmd_type) { - case "f": case "flag": - if(array_length(cmd) < 2) { - var _txt = $"[Error] `flag` not enough argument."; - array_push(CMD, cmdLine(_txt, COLORS._main_value_negative) ); - log_console(_txt, true); - break; - } + if(array_length(cmd) < 2) { cmd_error_param(cmd_type); break; } + var flg = cmd[1]; global.FLAG[$ flg] = !global.FLAG[$ flg]; @@ -37,14 +49,8 @@ function cmd_submit(command) { log_console(_txt, true); break; - case "s": case "set": - if(array_length(cmd) < 3) { - var _txt = $"[Error] `set` not enough argument."; - array_push(CMD, cmdLine(_txt, COLORS._main_value_negative) ); - log_console(_txt, true); - break; - } + if(array_length(cmd) < 3) { cmd_error_param(cmd_type); break; } var key = string_trim(cmd[1]); var val = string_trim(cmd[2]); @@ -73,18 +79,45 @@ function cmd_submit(command) { log_console(_txt, true); break; - case "r": case "render": PROGRAM_ARGUMENTS._run = true; PROGRAM_ARGUMENTS._rendering = true; CLI_EXPORT_AMOUNT = 0; break; - case "x": case "exit": game_end(); break; + case "print": + if(array_length(cmd) < 2) { cmd_error_param(cmd_type); break; } + print(cmd[1]); + break; + + case "netlog": + if(array_length(cmd) == 1) { + for( var i = 0, n = array_length(NETWORK_LOG); i < n; i++ ) { + var _log = NETWORK_LOG[i]; + print($"{_log.time} - {_log.txt}"); + } + + } else if(array_length(cmd) == 2) { + var _key = cmd[1]; + if(!struct_has(NETWORK_LOG_DATA, _key)) { + array_push(CMD, cmdLine($"[Error] netdat `{_key}` not found", COLORS._main_value_negative) ); + break; + } + + print(NETWORK_LOG_DATA[$ _key]); + } + break; + + case "patreon": + if(array_length(cmd) < 2) { cmd_error_param(cmd_type); break; } + var _leg = array_exists(opt, "-l"); + if(_leg) return new cmd_program_patreon_legacy(cmd[1]); + break; + default: if(struct_has(CMD_FUNCTIONS, cmd[0])) { var _f = CMD_FUNCTIONS[$ cmd[0]]; @@ -112,6 +145,8 @@ function cmd_submit(command) { log_console(_txt, true); break; } + + return noone; } function cmd_path(path) { @@ -142,4 +177,13 @@ function cmd_path(path) { } return vals; +} + +function cmd_program() constructor { + title = "cmd"; + color = CDEF.main_dkgrey; + + static close = function() { CMDPRG = noone; } + + static submit = function(arg) { return 0; } } \ No newline at end of file diff --git a/scripts/ds_map/ds_map.gml b/scripts/ds_map/ds_map.gml index e917c9e04..fc6a87301 100644 --- a/scripts/ds_map/ds_map.gml +++ b/scripts/ds_map/ds_map.gml @@ -58,9 +58,20 @@ function ds_map_print(map) { var k = ds_map_find_first(map); repeat(ds_map_size(map)) { - txt += string(k) + " : " + string(map[? k]) + ", "; + txt += $"{k} : {map[? k]}, "; k = ds_map_find_next(map, k); } txt += "}"; return txt; +} + +function ds_map_to_struct(map) { + var _s = {}; + var k = ds_map_find_first(map); + + repeat(ds_map_size(map)) { + _s[$ k] = map[? k]; + k = ds_map_find_next(map, k); + } + return _s; } \ No newline at end of file diff --git a/scripts/file_functions/file_functions.gml b/scripts/file_functions/file_functions.gml index d3816fade..34660ac6b 100644 --- a/scripts/file_functions/file_functions.gml +++ b/scripts/file_functions/file_functions.gml @@ -11,6 +11,7 @@ function filepath_resolve(path) { path = string_replace_all(path, "%DIR%/", DIRECTORY); path = string_replace_all(path, "%APP%/", APP_LOCATION); path = string_replace_all(path, "\\", "/"); + if(PROJECT) path = string_replace_all(path, "./", filename_dir(PROJECT.path) + "/"); return path; } diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index d02db799d..88d504bbc 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -21,7 +21,7 @@ #region ======================================================================= MAIN ======================================================================= globalvar OS, DEBUG, THEME, COLOR_KEYS, RUN_IDE; - globalvar CMD, CMDIN; + globalvar CMD, CMDIN, CMDPRG; globalvar FPS_REAL; #macro MAC (OS == os_macosx) @@ -29,6 +29,8 @@ OS = os_type; CMD = []; CMDIN = []; + CMDPRG = noone; + FPS_REAL = 0; RUN_IDE = GM_build_type == "run"; @@ -42,8 +44,8 @@ LATEST_VERSION = 1_18_00_0; VERSION = 1_18_04_0; SAVE_VERSION = 1_18_02_0; - VERSION_STRING = MAC? "1.18.003m" : "1.18.4"; - BUILD_NUMBER = 1_18_03_1; + VERSION_STRING = MAC? "1.18.003m" : "1.18.4b"; + BUILD_NUMBER = 1_18_04_1; HOTKEYS = ds_map_create(); HOTKEY_CONTEXT = ds_list_create(); diff --git a/scripts/network_data/network_data.gml b/scripts/network_data/network_data.gml new file mode 100644 index 000000000..002a40180 --- /dev/null +++ b/scripts/network_data/network_data.gml @@ -0,0 +1,39 @@ +globalvar NETWORK_LOG, NETWORK_LOG_DATA; +NETWORK_LOG = []; +NETWORK_LOG_DATA = {}; + +#macro network_create_socket Network_create_socket +#macro __network_create_socket network_create_socket + +function Network_create_socket(type) { + var c = __network_create_socket(type); + array_push(NETWORK_LOG, new notification(NOTI_TYPE.internal, $"Created socket {c} of type {type}")); + + return c; +} + +#macro network_create_server_raw Network_create_server_raw +#macro __network_create_server_raw network_create_server_raw + +function Network_create_server_raw(type, port, max_client) { + var s = __network_create_server_raw(type, port, max_client); + array_push(NETWORK_LOG, new notification(NOTI_TYPE.internal, $"Created server {s} of type {type} at port {port} (mclient {max_client})")); + + return s; +} + +#macro network_destroy Network_destroy +#macro __network_destroy network_destroy + +function Network_destroy(server) { + __network_destroy(server); + array_push(NETWORK_LOG, new notification(NOTI_TYPE.internal, $"Destroy server {server}")); +} + +#macro url_open URL_open +#macro __url_open url_open + +function URL_open(url) { + __url_open(url); + array_push(NETWORK_LOG, new notification(NOTI_TYPE.internal, $"Open {url}")); +} \ No newline at end of file diff --git a/scripts/network_data/network_data.yy b/scripts/network_data/network_data.yy new file mode 100644 index 000000000..a2d8dda28 --- /dev/null +++ b/scripts/network_data/network_data.yy @@ -0,0 +1,13 @@ +{ + "$GMScript":"v1", + "%Name":"network_data", + "isCompatibility":false, + "isDnD":false, + "name":"network_data", + "parent":{ + "name":"components", + "path":"folders/main/components.yy", + }, + "resourceType":"GMScript", + "resourceVersion":"2.0", +} \ No newline at end of file diff --git a/scripts/node_gm_room/node_gm_room.gml b/scripts/node_gm_room/node_gm_room.gml index 327539a37..5f031fe17 100644 --- a/scripts/node_gm_room/node_gm_room.gml +++ b/scripts/node_gm_room/node_gm_room.gml @@ -1,3 +1,88 @@ -function Script1257(){ - +function Node_GMRoom(_x, _y, _group = noone) : Node(_x, _y, _group) constructor { + name = "GMRoom"; + color = COLORS.node_blend_input; + gmRoom = noone; + + attributes.exposed_layer = []; + + layer_selecting = noone; + + layers_renderer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { + if(gmRoom == noone) { + draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _y, _w, ui(28), COLORS.node_composite_bg_blend, 1); + + draw_set_text(f_p3, fa_center, fa_center, COLORS._main_text_sub); + draw_text_add(_x + _w / 2, _y + ui(14), "No data"); + return ui(28); + } + + var _amo = array_length(gmRoom.layers); + var hh = ui(28); + var _h = hh * _amo + ui(16); + + draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _y, _w, _h, COLORS.node_composite_bg_blend, 1); + for( var i = 0, n = array_length(gmRoom.layers); i < n; i++ ) { + var _bx = _x + ui(24); + var _yy = _y + ui(8) + i * hh; + var _layer = gmRoom.layers[i]; + + var cc = layer_selecting == _layer? COLORS._main_text_accent : COLORS._main_text_sub; + + if(_hover && point_in_rectangle(_m[0], _m[1], _x, _yy, _x + _w, _yy + hh - 1)) { + cc = COLORS._main_text; + + if(mouse_press(mb_left, _focus)) + layer_selecting = layer_selecting == _layer? noone : _layer; + } + + draw_sprite_ui_uniform(s_gmlayer, _layer.index, _bx, _yy + hh / 2, 1, cc); + draw_set_text(f_p2, fa_left, fa_center, cc); + draw_text_add(_bx + ui(20), _yy + hh / 2, _layer.name); + } + + return _h; + }); + + layer_renderer = new Inspector_Custom_Renderer(function(_x, _y, _w, _m, _hover, _focus) { + if(layer_selecting == noone) { + draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _y, _w, ui(28), COLORS.node_composite_bg_blend, 1); + return ui(28); + } + + var _h = ui(64); + draw_sprite_stretched_ext(THEME.ui_panel_bg, 1, _x, _y, _w, _h, COLORS.node_composite_bg_blend, 1); + + return _h; + }); + + input_display_list = [ + layers_renderer, + new Inspector_Spacer(ui(4)), + layer_renderer, + ]; + + static step = function() { + + } + + static update = function() { + + } + + static attributeSerialize = function() { + var _attr = { + gm_key: gmRoom == noone? noone : gmRoom.key, + }; + + return _attr; + } + + static attributeDeserialize = function(attr) { + if(struct_has(attr, "gm_key")) { + var _key = attr.gm_key; + var _gm = project.bind_gamemaker; + + if(_gm != noone) gmRoom = struct_try_get(_gm.resourcesMap, _ey, noone); + } + } } \ No newline at end of file diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index 3d21a3117..996451b41 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -563,6 +563,9 @@ function __initNodes() { addNodeObject(input, "Spout Sender", s_node_spout, "Node_Spout_Send", [1, Node_Spout_Send],, "Send surface through Spout.").setVersion(11600); addNodeObject(input, "MIDI In", s_node_midi, "Node_MIDI_In", [1, Node_MIDI_In],, "Receive MIDI message.").setVersion(11630).notTest(); addNodeObject(input, "HTTP", s_node_http, "Node_HTTP_request", [1, Node_HTTP_request],, "Request data from the internet.").setVersion(11780); + + ds_list_add(input, "Gamemaker"); + addNodeObject(input, "GMRoom", s_gmroom, "Node_GMRoom", [1, Node_GMRoom]).setVersion(1_18_04_1); #endregion #region transform @@ -847,6 +850,7 @@ function __initNodes() { addNodeObject(generator, "MK Fracture", s_node_mk_fracture, "Node_MK_Fracture", [1, Node_MK_Fracture],, "Deterministically fracture and image and apply basic physics.").patreonExtra(); addNodeObject(generator, "MK Sparkle", s_node_mk_sparkle, "Node_MK_Sparkle", [1, Node_MK_Sparkle],, "Generate random star animation.").patreonExtra(); addNodeObject(generator, "MK Subpixel", s_node_mk_subpixel, "Node_MK_Subpixel", [1, Node_MK_Subpixel],, "Apply subpixel filter on top of a surface.").setVersion(1_17_11_0); + #endregion #region compose var compose = ds_list_create(); @@ -1284,5 +1288,4 @@ function __initNodes() { addNodeObject(hid, "getHeight", s_node_pixel_builder, "Node_DynaSurf_Out_Height", [1, Node_DynaSurf_Out_Height]).hideRecent(); #endregion - // NODE LIST } diff --git a/scripts/node_value_path/node_value_path.gml b/scripts/node_value_path/node_value_path.gml index d88194004..a7e0172ca 100644 --- a/scripts/node_value_path/node_value_path.gml +++ b/scripts/node_value_path/node_value_path.gml @@ -4,9 +4,17 @@ function __NodeValue_Path(_name, _node, _value, _tooltip = "") : NodeValue(_name /////============== GET ============= + static valueProcess = function(value, nodeFrom = undefined, applyUnit = true, arrIndex = 0) { + return is_string(value)? filepath_resolve(value) : value; + } + static getValue = function(_time = CURRENT_FRAME, applyUnit = true, arrIndex = 0, useCache = false, log = false) { //// Get value getValueRecursive(self.__curr_get_val, _time); var val = __curr_get_val[0]; + + if(is_array(val)) val = array_map(val, function(v) /*=>*/ {return valueProcess(v)}); + else val = valueProcess(val); + return val; } diff --git a/scripts/node_websocket_sender/node_websocket_sender.gml b/scripts/node_websocket_sender/node_websocket_sender.gml index e28f5cfa5..41714f3c9 100644 --- a/scripts/node_websocket_sender/node_websocket_sender.gml +++ b/scripts/node_websocket_sender/node_websocket_sender.gml @@ -33,7 +33,7 @@ function Node_Websocket_Sender(_x, _y, _group = noone) : Node(_x, _y, _group) co network_set_config(network_config_connect_timeout, val); }) ]); - static connectTo = function(newPort, newUrl, params) { #region + static connectTo = function(newPort, newUrl, params) { logNode($"Connecting to {newUrl}:{newPort}"); if(ds_map_exists(PORT_MAP, port)) @@ -58,7 +58,7 @@ function Node_Websocket_Sender(_x, _y, _group = noone) : Node(_x, _y, _group) co NETWORK_CLIENTS[? _conId] = socket; logNode($"Connected to {newUrl}:{newPort}"); - } #endregion + } setInspector(1, __txt("Resend"), [ THEME.refresh_icon, 1, COLORS._main_value_positive ], function() { triggerRender(); }); @@ -78,7 +78,7 @@ function Node_Websocket_Sender(_x, _y, _group = noone) : Node(_x, _y, _group) co } } - static asyncPackets = function(_async_load) { #region + static asyncPackets = function(_async_load) { if(!active) return; var aid = async_load[? "id"]; @@ -92,18 +92,18 @@ function Node_Websocket_Sender(_x, _y, _group = noone) : Node(_x, _y, _group) co var callBack = callbackMap[$ aid]; sendCall(aid, callBack); } - } #endregion + } - static step = function() { #region + static step = function() { var _type = getInputData(1); inputs[2].setVisible(_type == 0, _type == 0); inputs[3].setVisible(_type == 1, _type == 1); inputs[4].setVisible(_type == 2, _type == 2); inputs[6].setVisible(_type == 3, _type == 3); - } #endregion + } - static update = function(frame = CURRENT_FRAME) { #region + static update = function(frame = CURRENT_FRAME) { var _port = getInputData(0); var _target = getInputData(5); @@ -135,9 +135,9 @@ function Node_Websocket_Sender(_x, _y, _group = noone) : Node(_x, _y, _group) co params.content = _buff; connectTo(_port, _target, params); - } #endregion + } - static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region + static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { var bbox = drawGetBbox(xx, yy, _s); var network = ds_map_try_get(NETWORK_CLIENTS, port, noone); @@ -153,9 +153,9 @@ function Node_Websocket_Sender(_x, _y, _group = noone) : Node(_x, _y, _group) co draw_set_alpha(1); draw_sprite_fit(THEME.node_websocket_send, 0, bbox.xc, (_y0 + _y1) / 2, bbox.w, _y1 - _y0, cc, aa); - } #endregion + } - static postApplyDeserialize = function() { #region + static postApplyDeserialize = function() { if(struct_has(attributes, "network_timeout")) network_set_config(network_config_connect_timeout, attributes.network_timeout); - } #endregion + } } \ No newline at end of file diff --git a/scripts/notification_system/notification_system.gml b/scripts/notification_system/notification_system.gml index ea27d3aa3..4880ec3b8 100644 --- a/scripts/notification_system/notification_system.gml +++ b/scripts/notification_system/notification_system.gml @@ -8,9 +8,10 @@ #region classes enum NOTI_TYPE { - log = 1 << 0, - warning = 1 << 1, - error = 1 << 2, + log = 1 << 0, + warning = 1 << 1, + error = 1 << 2, + internal = 1 << 3, } function notification(type, str, icon = noone, color = c_ui_blue_dkgrey, life = -1) constructor { @@ -28,8 +29,7 @@ self.icon_end = noone; self.amount = 1; - - self.time = $"{string_lead_zero(current_hour, 2)}:{string_lead_zero(current_minute, 2)}.{string_lead_zero(current_second, 2)}"; + self.time = $"{string_lead_zero(current_hour, 2)}:{string_lead_zero(current_minute, 2)}.{string_lead_zero(current_second, 2)}"; static setOnClick = function(onClick, tooltip = "", icon_end = noone) { self.onClick = method(self, onClick); @@ -39,7 +39,7 @@ return self; } - array_push(CMD, self); + if(type != NOTI_TYPE.internal) array_push(CMD, self); } function noti_status(str, icon = noone, flash = false, ref = noone) { diff --git a/scripts/panel_console/panel_console.gml b/scripts/panel_console/panel_console.gml index c352f2419..633ed78de 100644 --- a/scripts/panel_console/panel_console.gml +++ b/scripts/panel_console/panel_console.gml @@ -22,7 +22,9 @@ function Panel_Console() : PanelContent() constructor { scroll_y = 0; prevFocus = false; - function drawHistory(_y) { #region + function setCommand(_com) { command = _com; keyboard_string = _com; } + + function drawHistory(_y) { var _x = ui(32 + 8); var _w = w - ui(16 + 32); @@ -69,9 +71,9 @@ function Panel_Console() : PanelContent() constructor { if(mouse_wheel_up()) scroll_y = clamp(scroll_y + 1, 0, array_length(CMD) - 1); if(mouse_wheel_down()) scroll_y = clamp(scroll_y - 1, 0, array_length(CMD) - 1); } - } #endregion + } - function drawContent(panel) { #region + function drawContent(panel) { if(pFOCUS) { if(prevFocus == false) keyboard_string = command; @@ -92,37 +94,65 @@ function Panel_Console() : PanelContent() constructor { var hy = h - ui(32); drawHistory(hy); - - draw_set_text(f_code, fa_right, fa_bottom, CDEF.main_dkgrey); - draw_text(ui(32 - 4), h - ui(4), ">"); + + var ty = ui(10); + + draw_set_text(f_code, fa_left, fa_bottom, CDEF.main_dkgrey); + var _curs = CMDPRG? CMDPRG.title + ":" : ">"; + if(CMDPRG) draw_set_color(CMDPRG.color); + + var _curw = string_width(_curs); + draw_text(ty, h - ui(4), _curs); + ty += _curw + ui(4); draw_set_text(f_code, fa_left, fa_bottom, COLORS._main_text); - draw_text(ui(32 + 8), h - ui(4), command); + draw_text(ty, h - ui(4), command); + ty += string_width(command); draw_set_color(COLORS._main_text_sub); - draw_text(ui(32 + 8) + string_width(command), h - ui(4), "_"); + draw_text(ty, h - ui(4), "_"); - if(pFOCUS) { - if(keyboard_check_pressed(vk_enter)) { - cmd_submit(command); - - command = ""; - keyboard_string = ""; - - } else if(keyboard_check_pressed(vk_up)) { - cmd_index = max(0, cmd_index - 1); - - var his = array_safe_get_fast(CMDIN, cmd_index, ""); - command = is_instanceof(his, __cmdLine)? his.txt : his; - keyboard_string = command; - - } else if(keyboard_check_pressed(vk_escape)) { - command = ""; - keyboard_string = ""; - - } else if(keyboard_check_pressed(vk_anykey)) { - cmd_index = array_length(CMDIN); + if(!pFOCUS) return; + + if(keyboard_check(vk_control)) { + if(keyboard_check_pressed(ord("V"))) { + setCommand(clipboard_get_text()); } + + } else if(keyboard_check_pressed(vk_enter)) { + if(CMDPRG) { + var res = CMDPRG.submit(command); + if(res) CMDPRG = noone; + + } else { + var prg = cmd_submit(command); + if(prg) { + CMDPRG = prg; + CMDPRG.console = self; + } + } + + setCommand(""); + cmd_index = array_length(CMDIN); + + } else if(keyboard_check_pressed(vk_up)) { + cmd_index = max(0, cmd_index - 1); + + var his = array_safe_get_fast(CMDIN, cmd_index, ""); + setCommand(is_instanceof(his, __cmdLine)? his.txt : his); + + } else if(keyboard_check_pressed(vk_down)) { + cmd_index = min(cmd_index + 1, array_length(CMDIN)); + + var his = array_safe_get_fast(CMDIN, cmd_index, ""); + setCommand(is_instanceof(his, __cmdLine)? his.txt : his); + + } else if(keyboard_check_pressed(vk_escape)) { + if(CMDPRG) CMDPRG = noone; + setCommand(""); + + } else if(keyboard_check_pressed(vk_anykey)) { + cmd_index = array_length(CMDIN); } - } #endregion + } } \ No newline at end of file diff --git a/scripts/panel_gm_explorer/panel_gm_explorer.gml b/scripts/panel_gm_explorer/panel_gm_explorer.gml index fde248507..62b398b4f 100644 --- a/scripts/panel_gm_explorer/panel_gm_explorer.gml +++ b/scripts/panel_gm_explorer/panel_gm_explorer.gml @@ -83,10 +83,14 @@ function Panel_GM_Explore(gmBinder) : PanelContent() constructor { var _raw = _ass.raw; var _thm = noone; - if(_ass.type == "GMSprite") _thm = _ass.thumbnail; - else if(_ass.type == "GMTileSet") { - var _spm = struct_try_get(gmBinder.resourcesMap, _ass.sprite, noone); - _thm = _spm == noone? noone : _spm.thumbnail; + switch(_ass.type) { + case "GMSprite" : _thm = _ass.thumbnail; break; + case "GMRoom" : _thm = s_gmroom; break; + + case "GMTileSet" : + var _spm = struct_try_get(gmBinder.resourcesMap, _ass.sprite, noone); + _thm = _spm == noone? noone : _spm.thumbnail; + break; } if(sprite_exists(_thm)) draw_sprite_bbox_uniform(_thm, 0, BBOX().fromWH(_asx + ui(2), _asy + ui(2), _ths - ui(4), _ths - ui(4))); diff --git a/scripts/panel_graph/panel_graph.gml b/scripts/panel_graph/panel_graph.gml index c1a303587..7ba90fdb3 100644 --- a/scripts/panel_graph/panel_graph.gml +++ b/scripts/panel_graph/panel_graph.gml @@ -3258,6 +3258,11 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor { node = nodeBuild("Node_Tile_Tileset", mouse_grid_x, mouse_grid_y).skipDefault(); node.gmTile = DRAGGING.data; break; + + case "GMRoom" : + node = nodeBuild("Node_GMRoom", mouse_grid_x, mouse_grid_y).skipDefault(); + node.gmRoom = DRAGGING.data; + break; } if(!key_mod_press(SHIFT) && node && struct_has(DRAGGING, "from") && DRAGGING.from.value_from == noone) { diff --git a/scripts/panel_menu/panel_menu.gml b/scripts/panel_menu/panel_menu.gml index 11de00606..2c460c922 100644 --- a/scripts/panel_menu/panel_menu.gml +++ b/scripts/panel_menu/panel_menu.gml @@ -148,7 +148,7 @@ function Panel_Menu() : PanelContent() constructor { }), -1, menuItem(__txtx("panel_menu_connect_patreon", "Connect to Patreon"), function() { dialogCall(o_dialog_patreon); }, THEME.patreon), - // menuItem(__txtx("panel_menu_connect_patreon", "Connect to Patreon (legacy)"), function() { dialogPanelCall(new Panel_Patreon()); }, THEME.patreon), + menuItem(__txtx("panel_menu_connect_patreon", "Connect to Patreon (legacy)"), function() { dialogPanelCall(new Panel_Patreon()); }, THEME.patreon), ]; menuItem_undo = MENU_ITEMS.undo; @@ -287,29 +287,21 @@ function Panel_Menu() : PanelContent() constructor { } function undoUpdate() { - var txt; - - if(ds_stack_empty(UNDO_STACK)) { - txt = __txt("Undo"); - } else { + var txt = __txt("Undo"); + if(!ds_stack_empty(UNDO_STACK)) { var act = ds_stack_top(UNDO_STACK); - if(array_length(act) > 1) - txt = $"{__txt("Undo")} {array_length(act)} {__txt("Actions")}"; - else - txt = $"{__txt("Undo")} {act[0]}"; + if(array_length(act) > 1) txt = $"{__txt("Undo")} {array_length(act)} {__txt("Actions")}"; + else txt = $"{__txt("Undo")} {act[0]}"; } menuItem_undo.active = !ds_stack_empty(UNDO_STACK); menuItem_undo.name = txt; - if(ds_stack_empty(REDO_STACK)) { - txt = __txt("Redo"); - } else { + txt = __txt("Redo"); + if(!ds_stack_empty(REDO_STACK)) { var act = ds_stack_top(REDO_STACK); - if(array_length(act) > 1) - txt = $"{__txt("Redo")} {array_length(act)} {__txt("Actions")}"; - else - txt = $"{__txt("Redo")} {act[0]}"; + if(array_length(act) > 1) txt = $"{__txt("Redo")} {array_length(act)} {__txt("Actions")}"; + else txt = $"{__txt("Redo")} {act[0]}"; } menuItem_redo.active = !ds_stack_empty(REDO_STACK); @@ -327,9 +319,9 @@ function Panel_Menu() : PanelContent() constructor { var xx = ui(40); var yy = ui(8); - #region about icon + #region about if(hori) { - if(PREFERENCES.panel_menu_right_control) + if(_right) xx = ui(24); else { xx = ui(140); @@ -337,16 +329,13 @@ function Panel_Menu() : PanelContent() constructor { draw_line_round(xx, ui(8), xx, h - ui(8), 3); } - var bx = xx; - if(!PREFERENCES.panel_menu_right_control) - bx = w - ui(24); - + var bx = _right? xx : w - ui(24); draw_sprite_ui_uniform(THEME.icon_24, 0, bx, h / 2, 1, c_white); if(pHOVER && point_in_rectangle(mx, my, bx - ui(16), 0, bx + ui(16), ui(32))) { _draggable = false; - if(mouse_press(mb_left, pFOCUS)) - dialogCall(o_dialog_about); + if(mouse_press(mb_left, pFOCUS)) dialogCall(o_dialog_about); } + } else { var bx = ui(20); var by = h - ui(20); @@ -354,40 +343,40 @@ function Panel_Menu() : PanelContent() constructor { draw_sprite_ui_uniform(THEME.icon_24, 0, bx, by, 1, c_white); if(pHOVER && point_in_rectangle(mx, my, bx - ui(16), by - ui(16), bx + ui(16), by + ui(16))) { _draggable = false; - if(mouse_press(mb_left, pFOCUS)) - dialogCall(o_dialog_about); + if(mouse_press(mb_left, pFOCUS)) dialogCall(o_dialog_about); } } #endregion #region menu - if(hori) { - if(PREFERENCES.panel_menu_right_control) - xx += ui(20); - else - xx += ui(8); - yy = 0; + xx += _right? ui(20) : ui(8); + yy = 0; + } else { xx = ui(8); yy = w < vertical_break? ui(72) : ui(40); } - var sx = xx; - var xc, x0, x1, yc, y0, y1, _mx = xx; - var row = 1, maxRow = ceil(h / ui(40)); - - var _ww = 0; + var xc, x0, x1, yc, y0, y1; + var sx = xx; + var _mx = xx; + var row = 1; + var maxRow = ceil(h / ui(40)); + var ww, _ww = 0; + + draw_set_text(font, fa_center, fa_center, COLORS._main_text); + for(var i = 0; i < array_length(menus) - 1; i++) { - draw_set_text(font, fa_center, fa_center, COLORS._main_text); - var ww = string_width(menus[i][0]) + ui(16 + 8); + ww = string_width(menus[i][0]) + ui(16 + 8); _ww += ww; + if(_ww > w * 0.4 - sx) { row++; _ww = 0; } } - + row = min(row, maxRow); var _curRow = 0, currY; var _rowH = (h - ui(12)) / row; @@ -403,7 +392,6 @@ function Panel_Menu() : PanelContent() constructor { if(hori) { xc = xx + ww / 2; - x0 = xx; x1 = xx + ww; y0 = ui(6) + _rowH * _curRow; @@ -411,6 +399,7 @@ function Panel_Menu() : PanelContent() constructor { yc = (y0 + y1) / 2; currY = yc; + } else { xc = w / 2; yc = yy + hh / 2; @@ -443,6 +432,7 @@ function Panel_Menu() : PanelContent() constructor { _ww = 0; xx = sx; } + } else yy += hh + 8; } @@ -551,6 +541,7 @@ function Panel_Menu() : PanelContent() constructor { if(b) _draggable = false; if(b == 2) window_close(); break; + case "maximize": var win_max = window_is_maximized || window_is_fullscreen; if(OS == os_macosx) @@ -563,29 +554,32 @@ function Panel_Menu() : PanelContent() constructor { if(window_is_fullscreen) { winMan_setFullscreen(false); winMan_Unmaximize(); + } else if(window_is_maximized) { winMan_Unmaximize(); DISPLAY_REFRESH + } else { winMan_Maximize(); DISPLAY_REFRESH } + } else if(OS == os_macosx) { if(__win_is_maximized) mac_window_minimize(); else mac_window_maximize(); } } break; + case "minimize": var b = buttonInstant(THEME.button_hide_fill, x1 - bs, ui(6), bs, bs, [mx, my], true, pHOVER,, THEME.window_minimize, 0, [ COLORS._main_icon, CDEF.yellow ]); if(b) _draggable = false; if(b == -2) { - if(OS == os_windows) - winMan_Minimize(); - else if(OS == os_macosx) - mac_window_dock(); + if(OS == os_windows) winMan_Minimize(); + else if(OS == os_macosx) mac_window_dock(); } break; + case "fullscreen": var win_full = window_is_fullscreen; var b = buttonInstant(THEME.button_hide_fill, x1 - bs, ui(6), bs, bs, [mx, my], true, pHOVER,, THEME.window_fullscreen, win_full, [ COLORS._main_icon, CDEF.cyan ]); @@ -593,6 +587,7 @@ function Panel_Menu() : PanelContent() constructor { if(b == 2) { if(OS == os_windows) winMan_setFullscreen(!win_full); + else if(OS == os_macosx) { if(win_full) { winMan_setFullscreen(false); @@ -612,7 +607,7 @@ function Panel_Menu() : PanelContent() constructor { #region version var _xx1 = _right? x1 : w - ui(40); - var txt = "v. " + string(VERSION_STRING); + var txt = $"v. {VERSION_STRING}"; if(STEAM_ENABLED) txt += " Steam"; version_name_copy = lerp_float(version_name_copy, 0, 10); @@ -637,6 +632,7 @@ function Panel_Menu() : PanelContent() constructor { if(mouse_press(mb_left, pFOCUS)) dialogCall(o_dialog_release_note); + if(mouse_press(mb_right, pFOCUS)) { clipboard_set_text(VERSION_STRING); version_name_copy = 3; @@ -646,6 +642,7 @@ function Panel_Menu() : PanelContent() constructor { draw_text(round((_x0 + _x1) / 2), round((_y0 + _y1) / 2), txt); _xx1 = _x0 - ui(8); } + } else { var _xx1 = ui(40); var y1 = h - ui(20); @@ -658,6 +655,7 @@ function Panel_Menu() : PanelContent() constructor { if(mouse_press(mb_left, pFOCUS)) dialogCall(o_dialog_release_note); + if(mouse_press(mb_right, pFOCUS)) { clipboard_set_text(VERSION_STRING); version_name_copy = 3; @@ -684,6 +682,7 @@ function Panel_Menu() : PanelContent() constructor { ty0 = 0; ty1 = h; tcx = (tx0 + tx1) / 2; + } else { tx0 = ui(8); tx1 = w < vertical_break? w - ui(16) : w - ui(144); diff --git a/scripts/panel_patreon/panel_patreon.gml b/scripts/panel_patreon/panel_patreon.gml index a90400bbb..cd3e10279 100644 --- a/scripts/panel_patreon/panel_patreon.gml +++ b/scripts/panel_patreon/panel_patreon.gml @@ -1,3 +1,5 @@ +global.PATREON_VERIFY_CODE = undefined; + function Panel_Patreon() : PanelContent() constructor { w = ui(480); h = ui(264); @@ -5,8 +7,6 @@ function Panel_Patreon() : PanelContent() constructor { resizable = false; auto_pin = true; - //patreon_email_check("tanasart_pt@outlook.co.th"); - mail = ""; code = ""; @@ -18,7 +18,6 @@ function Panel_Patreon() : PanelContent() constructor { tb_code = new textBox(TEXTBOX_INPUT.text, function(_code) { code = _code; }); mail_checking = false; - verify_code = ""; function mailCallback(response) { mail_checking = false; @@ -42,12 +41,11 @@ function Panel_Patreon() : PanelContent() constructor { var key = keys[0]; var member = map[$ key]; var stat = string_replace_all(string_lower(member.status), " ", "_"); - print(stat); if(string_pos("active", stat) > 0) { var _mail = member.email; var _code = patreon_generate_activation_key(_mail); //yea we doing this on client now. - verify_code = _code; + global.PATREON_VERIFY_CODE = _code; var _map = ds_map_create(); @@ -132,6 +130,7 @@ function Panel_Patreon() : PanelContent() constructor { } else draw_sprite_ext(THEME.loading_s, 0, w / 2, _yy + _bh / 2, 1, 1, current_time, COLORS._main_icon, 1); break; + case 1 : draw_set_text(f_p0, fa_center, fa_center, COLORS._main_text_inner); draw_text(w / 2, _yy, "Enter verification code:"); @@ -145,7 +144,7 @@ function Panel_Patreon() : PanelContent() constructor { _yy += TEXTBOX_HEIGHT + 12; if(buttonInstant(THEME.button_def, _bx, _yy, _bw, _bh, [ mx, my ], pFOCUS, pHOVER) == 2) { - if(code == verify_code) { + if(code == global.PATREON_VERIFY_CODE) { result = "Patreon verified, thank you for suporting Pixel Composer!"; result_color = COLORS._main_value_positive; diff --git a/scripts/patreon_email_check/patreon_email_check.gml b/scripts/patreon_email_check/patreon_email_check.gml index 0be9f5d27..ba7d63539 100644 --- a/scripts/patreon_email_check/patreon_email_check.gml +++ b/scripts/patreon_email_check/patreon_email_check.gml @@ -3,6 +3,87 @@ globalvar IS_PATREON; #macro FIRESTORE_ID "pixelcomposer-f9cef" +function cmd_program_patreon_legacy(mail) : cmd_program() constructor { + title = "Patreon"; + color = CDEF.pink; + + array_push(CMD, cmdLine($"Patreon legacy verifier", CDEF.pink) ); + array_push(CMD, cmdLine($"> Checking email: {mail}", COLORS._main_text_sub) ); + + mail_checking = true; + + function mailCallback(response) { + mail_checking = false; + + if (response[? "status"] != 200) { + array_push(CMD, cmdLine($"X Request error.", COLORS._main_value_negative) ); + CMDPRG = noone; + return; + } + + var val = response[? "value"]; + var map = json_try_parse(val); + + var keys = struct_get_names(map); + if(array_empty(keys)) { + array_push(CMD, cmdLine($"X Patreon email not found.", COLORS._main_value_negative) ); + CMDPRG = noone; + return; + } + + var key = keys[0]; + var member = map[$ key]; + var stat = string_replace_all(string_lower(member.status), " ", "_"); + + if(string_pos("active", stat) > 0) { + var _mail = member.email; + var _code = patreon_generate_activation_key(_mail); //yea we doing this on client now. + global.PATREON_VERIFY_CODE = _code; + + var _map = ds_map_create(); + + _map[? "Api-Token"] = patreon_get_email_token(); + _map[? "Content-Type"] = "application/json"; + + var _body = { + from: { + email: "verify@pixel-composer.com", + name: "Pixel Composer" + }, + to: [ { email: _mail } ], + template_uuid: "82b77e89-0343-4a20-a63d-063f4f8dcdfe", + template_variables: { verification_code: _code } + }; + + http_request("https://send.api.mailtrap.io/api/send", "POST", _map, json_stringify(_body)); + array_push(CMD, cmdLine($"> Verification code has been send to your email.", COLORS._main_text_sub) ); + array_push(CMD, cmdLine($"> Enter verification code: ", COLORS._main_text) ); + + } else { + array_push(CMD, cmdLine($"X Patreon membership not active.", COLORS._main_value_negative) ); + CMDPRG = noone; + + } + } + + patreon_email_check(mail, mailCallback); + + static submit = function(arg) { + if(arg == global.PATREON_VERIFY_CODE) { + array_push(CMD, cmdLine($"> Patreon verified, thank you for suporting Pixel Composer!", COLORS._main_value_positive) ); + return 1; + + } else { + array_push(CMD, cmdLine($"> Incorrect code, please try again.", COLORS._main_value_negative) ); + array_push(CMD, cmdLine($"> Enter verification code: ", COLORS._main_text) ); + return 0; + + } + + return 0; + } +} + function patreon_email_check(mail, callback) { PATREON_MAIL_CHECK = FirebaseFirestore("memberships").Where("email", "==", mail).Query(); PATREON_MAIL_CALLBACK = callback; diff --git a/scripts/struct_functions/struct_functions.gml b/scripts/struct_functions/struct_functions.gml index 19b4c9c91..045c596e0 100644 --- a/scripts/struct_functions/struct_functions.gml +++ b/scripts/struct_functions/struct_functions.gml @@ -61,4 +61,4 @@ function struct_try_override(original, override, key) { if(!struct_has(override, key)) return; original[$ key] = override[$ key]; -} \ No newline at end of file +} diff --git a/sprites/s_gmlayer/6327ddfc-a4fa-4bf4-9a22-511c4581e6c2.png b/sprites/s_gmlayer/6327ddfc-a4fa-4bf4-9a22-511c4581e6c2.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5cbd9f9fb97dc2008777342a652d2b749544a2 GIT binary patch literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfq`+Mr;B5V$ML;WH+nHU z3bg$f?w#Pr%^hgb(WMcVlqk4is}Re^EtkDE1hPoWA9DJ@I>lw<#Ej{O!UIHfSQY2C zDtUg`T+sA-*Yw>ij}8=?7aM;*|7W+g_Sc9-69i9qOT9D**X>&LeVg0?odQ0S7co*| z*0=R4H+LV|XVN%R;6SV89>(eeZ7;1I-q-{?9QFJm$)NfF;hlx4*K^#L&9B(^Sn}nm z-HsbS7Ym(W>|eH@;jr8Zh5&|bjn`SS9;-B{E_fAKza%0Hq2f6wtjna>Vs3OmvQ+pd$Mmn|0i!#fXMB2yUhPGp0M0^_<*LttHz#>ds{DS zZc>gn+$!Z7c=zXCrOen%3&lU{tbF%8Ydc$Lb$s==Ydy10@5_>N?W;ZXxx2yo^KXth z{T9Nmez*Po3idBa_FQW@d2$IS&$iPOcloY;#p)S8$tGbNiwc;I-n5SOoJoU9klsi&kzI?`u56kh*KX z(doKR|Mz~WR*Zjq@7>ne({JtpqffQOHKHUXu_VKYk@7?@d^ znpqiGY8x0>85q=Wn4y58AvZrIGp!Q02EMlnbATE&;5L+G=B5^xB<2?2))V=I(HW?R N!PC{xWt~$(695Be4~GB% literal 0 HcmV?d00001 diff --git a/sprites/s_gmlayer/6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b.png b/sprites/s_gmlayer/6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b.png new file mode 100644 index 0000000000000000000000000000000000000000..6381fb8ad992f544ea1025eaa3ddd653d1ffa61a GIT binary patch literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfq^mA)5S5w!8C1 zB6p@Q>3q3ToMe}Ng4Kd~%M#@lv$BIeX_?o0lv2EZzU?`_ zZBJFz?|Y}r3eqAnCZw=E*pzne)|peyVak>&mdcSE3%4BfW6^;RC%T9tD{O)f85IFIvvzadiTlbl&}cPY?-3)r3t(XvM$6r zUHfh&J}WwL;b+z_t6nlR%$%z7oI#FZ&jgc++v6T=YqEb`_s;V8^Yu_G;G^zO^4R(@uNj<<=`~ z}@be!YndbP+ zFE)9zwyb^vi~`jX*NBpo#FA92|H*Yfq~J*)5S5w1V0x6Yi@amH%AVI#UF{Ae^7nHmJORXZ1iE__7vk;bNo=` zOqJjJ^PaPxKF3#l{$_Q08#iyV=j2IY4OdsbEPcS+5wwLZO)PDf=PS>u5L35Fc`Bus zkL;dwO!R22lc)8@ywjg|Fg$Ct+rXd0Bz>>=mDiNxi!RUl@%zA14bSJ2sxi|R=KNr*gP6Bp@gf()K)(;+jLq>;sbbdiPU+0kUY(bAeA2f^LKe3U z2o_9|P+9pnH(D;8e&GnQZ|+-$KT zvEao$<>fz%C!f`sQo=rmF?`azM)5n5dJT-x2e$s+H}_@Uq_Y1j9`5ULC9V-ADTyViR>?)FK#IZ0z{o_`&`{UN zAjH7T%GAutz*5`5z{|H*Yfq}8p)5S5w$#eHslFZKx)<*_z zlemKKl_c~VCvaD=uWMvam=iEhB!Eq?A@_mEinH$yWd37JX%K!OxPzsrFM(&v*)B_Q7&r*NsGS%E&7r#Dvoj7j?*Q$9D=S~J4x_@k+>BQJ6QATnze^39f z(7K|H*Yfq~J%)5S5w!TY9td@n26?z?1L2}VykXDOC5BiqNRsL^<`=d-l;|K`|M z3-2&mlNoqP!Xx_In=@;Ay3{h&G^dBGkZrwvCTY&}SN%bkzD&8VQc=h1##|)DsK2-B z!JK;L$Bk>m9By5mysF9MkmUi{w@C~S%noJBexJ0!J9g40#9Um$_Ks`=#9(CmVOptaS;gwXm|8?K|H*Yfq^l~)5S5wNN|pNfREq`l^^>q_AS?M7q;fSk+=JBC5w@(T;pbzHzwN~tk&OK z(Ji=(N$Y@fjOYWaUX_g}vjXNT{af}f?WyPL1jZTtznKaa&0EQQ_t#9d4Ko{Znaf}O zn9p)0Fk!E673Yrd^#4Hzr3@}9+6%i*+sq~MsC*qa`>}@T(p692>04KQyYZE|ML_D6 z>U`g|D;wXO|Eg6W@?XE+cY7S~oUn44GndT3_=XdtW3?U3@o(`46FNm_#K+%w!pOTqY riCY8TTZK754H|G8N-}d(i%Sx73vla+{K4o9)WhKE>gTe~DWM4fjBoEK literal 0 HcmV?d00001 diff --git a/sprites/s_gmlayer/f17dd9a2-d5cb-44d9-9ec1-903968019825.png b/sprites/s_gmlayer/f17dd9a2-d5cb-44d9-9ec1-903968019825.png new file mode 100644 index 0000000000000000000000000000000000000000..7504ffdb8ec9b12810ff5dc0f7cd1d6e68b72d56 GIT binary patch literal 622 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfq^m6)5S5w{oQeooz1IN`bM6ZZX$Xu@)@r(c1`i&}%T+SQ;owuL$#JN2?*kC>L z%$?6Se%txIll+l>!)o!8+6M*B>o(5RHBwgDs>-W!cB|#HdAH9g#ZOW2OHy1Z`uQ4D zZ*&5G1^c_k@Px>M>QxTnJDB_Cyv|BJ-<-QsuX@3xygA9wp8t59!RFnwO`wBmo|;3d z?;WG&1?nrOFZ`&!-ObTs7t6fAzYm{@>v|H}#p0R8(0t&_lWli782S$s8rU()b*;0j zJaM+=z0%@m=Ra3;tyvI%Y5IQGNm>U?lv7?AK4m%chTDQw%0a!LG->wnB}&_U&b|?z z;bFy*o|iUx&z(D>Z;H<;D z-fl550|vipiEBhjN@7W>RdP`(kYX@0Ff!3KG}JXR2r)3TGBvX@u+%m%ure^H-!MY~ yMMG|WN@iLmZVh~I73KgnXuxeK$;?eHE=kNSz^y0p2ct7k4}+(xpUXO@geCydZ1dm% literal 0 HcmV?d00001 diff --git a/sprites/s_gmlayer/layers/6327ddfc-a4fa-4bf4-9a22-511c4581e6c2/3c6fc479-708a-439a-8f0c-80dd14f575f8.png b/sprites/s_gmlayer/layers/6327ddfc-a4fa-4bf4-9a22-511c4581e6c2/3c6fc479-708a-439a-8f0c-80dd14f575f8.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5cbd9f9fb97dc2008777342a652d2b749544a2 GIT binary patch literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfq`+Mr;B5V$ML;WH+nHU z3bg$f?w#Pr%^hgb(WMcVlqk4is}Re^EtkDE1hPoWA9DJ@I>lw<#Ej{O!UIHfSQY2C zDtUg`T+sA-*Yw>ij}8=?7aM;*|7W+g_Sc9-69i9qOT9D**X>&LeVg0?odQ0S7co*| z*0=R4H+LV|XVN%R;6SV89>(eeZ7;1I-q-{?9QFJm$)NfF;hlx4*K^#L&9B(^Sn}nm z-HsbS7Ym(W>|eH@;jr8Zh5&|bjn`SS9;-B{E_fAKza%0Hq2f6wtjna>Vs3OmvQ+pd$Mmn|0i!#fXMB2yUhPGp0M0^_<*LttHz#>ds{DS zZc>gn+$!Z7c=zXCrOen%3&lU{tbF%8Ydc$Lb$s==Ydy10@5_>N?W;ZXxx2yo^KXth z{T9Nmez*Po3idBa_FQW@d2$IS&$iPOcloY;#p)S8$tGbNiwc;I-n5SOoJoU9klsi&kzI?`u56kh*KX z(doKR|Mz~WR*Zjq@7>ne({JtpqffQOHKHUXu_VKYk@7?@d^ znpqiGY8x0>85q=Wn4y58AvZrIGp!Q02EMlnbATE&;5L+G=B5^xB<2?2))V=I(HW?R N!PC{xWt~$(695Be4~GB% literal 0 HcmV?d00001 diff --git a/sprites/s_gmlayer/layers/6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b/3c6fc479-708a-439a-8f0c-80dd14f575f8.png b/sprites/s_gmlayer/layers/6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b/3c6fc479-708a-439a-8f0c-80dd14f575f8.png new file mode 100644 index 0000000000000000000000000000000000000000..6381fb8ad992f544ea1025eaa3ddd653d1ffa61a GIT binary patch literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfq^mA)5S5w!8C1 zB6p@Q>3q3ToMe}Ng4Kd~%M#@lv$BIeX_?o0lv2EZzU?`_ zZBJFz?|Y}r3eqAnCZw=E*pzne)|peyVak>&mdcSE3%4BfW6^;RC%T9tD{O)f85IFIvvzadiTlbl&}cPY?-3)r3t(XvM$6r zUHfh&J}WwL;b+z_t6nlR%$%z7oI#FZ&jgc++v6T=YqEb`_s;V8^Yu_G;G^zO^4R(@uNj<<=`~ z}@be!YndbP+ zFE)9zwyb^vi~`jX*NBpo#FA92|H*Yfq~J*)5S5w1V0x6Yi@amH%AVI#UF{Ae^7nHmJORXZ1iE__7vk;bNo=` zOqJjJ^PaPxKF3#l{$_Q08#iyV=j2IY4OdsbEPcS+5wwLZO)PDf=PS>u5L35Fc`Bus zkL;dwO!R22lc)8@ywjg|Fg$Ct+rXd0Bz>>=mDiNxi!RUl@%zA14bSJ2sxi|R=KNr*gP6Bp@gf()K)(;+jLq>;sbbdiPU+0kUY(bAeA2f^LKe3U z2o_9|P+9pnH(D;8e&GnQZ|+-$KT zvEao$<>fz%C!f`sQo=rmF?`azM)5n5dJT-x2e$s+H}_@Uq_Y1j9`5ULC9V-ADTyViR>?)FK#IZ0z{o_`&`{UN zAjH7T%GAutz*5`5z{|H*Yfq}8p)5S5w$#eHslFZKx)<*_z zlemKKl_c~VCvaD=uWMvam=iEhB!Eq?A@_mEinH$yWd37JX%K!OxPzsrFM(&v*)B_Q7&r*NsGS%E&7r#Dvoj7j?*Q$9D=S~J4x_@k+>BQJ6QATnze^39f z(7K|H*Yfq~J%)5S5w!TY9td@n26?z?1L2}VykXDOC5BiqNRsL^<`=d-l;|K`|M z3-2&mlNoqP!Xx_In=@;Ay3{h&G^dBGkZrwvCTY&}SN%bkzD&8VQc=h1##|)DsK2-B z!JK;L$Bk>m9By5mysF9MkmUi{w@C~S%noJBexJ0!J9g40#9Um$_Ks`=#9(CmVOptaS;gwXm|8?K|H*Yfq^l~)5S5wNN|pNfREq`l^^>q_AS?M7q;fSk+=JBC5w@(T;pbzHzwN~tk&OK z(Ji=(N$Y@fjOYWaUX_g}vjXNT{af}f?WyPL1jZTtznKaa&0EQQ_t#9d4Ko{Znaf}O zn9p)0Fk!E673Yrd^#4Hzr3@}9+6%i*+sq~MsC*qa`>}@T(p692>04KQyYZE|ML_D6 z>U`g|D;wXO|Eg6W@?XE+cY7S~oUn44GndT3_=XdtW3?U3@o(`46FNm_#K+%w!pOTqY riCY8TTZK754H|G8N-}d(i%Sx73vla+{K4o9)WhKE>gTe~DWM4fjBoEK literal 0 HcmV?d00001 diff --git a/sprites/s_gmlayer/layers/f17dd9a2-d5cb-44d9-9ec1-903968019825/3c6fc479-708a-439a-8f0c-80dd14f575f8.png b/sprites/s_gmlayer/layers/f17dd9a2-d5cb-44d9-9ec1-903968019825/3c6fc479-708a-439a-8f0c-80dd14f575f8.png new file mode 100644 index 0000000000000000000000000000000000000000..7504ffdb8ec9b12810ff5dc0f7cd1d6e68b72d56 GIT binary patch literal 622 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj3dtTpz6=aiY77hwEes65fI|H*Yfq^m6)5S5w{oQeooz1IN`bM6ZZX$Xu@)@r(c1`i&}%T+SQ;owuL$#JN2?*kC>L z%$?6Se%txIll+l>!)o!8+6M*B>o(5RHBwgDs>-W!cB|#HdAH9g#ZOW2OHy1Z`uQ4D zZ*&5G1^c_k@Px>M>QxTnJDB_Cyv|BJ-<-QsuX@3xygA9wp8t59!RFnwO`wBmo|;3d z?;WG&1?nrOFZ`&!-ObTs7t6fAzYm{@>v|H}#p0R8(0t&_lWli782S$s8rU()b*;0j zJaM+=z0%@m=Ra3;tyvI%Y5IQGNm>U?lv7?AK4m%chTDQw%0a!LG->wnB}&_U&b|?z z;bFy*o|iUx&z(D>Z;H<;D z-fl550|vipiEBhjN@7W>RdP`(kYX@0Ff!3KG}JXR2r)3TGBvX@u+%m%ure^H-!MY~ yMMG|WN@iLmZVh~I73KgnXuxeK$;?eHE=kNSz^y0p2ct7k4}+(xpUXO@geCydZ1dm% literal 0 HcmV?d00001 diff --git a/sprites/s_gmlayer/s_gmlayer.yy b/sprites/s_gmlayer/s_gmlayer.yy new file mode 100644 index 000000000..a94e72bcf --- /dev/null +++ b/sprites/s_gmlayer/s_gmlayer.yy @@ -0,0 +1,114 @@ +{ + "$GMSprite":"", + "%Name":"s_gmlayer", + "bboxMode":0, + "bbox_bottom":22, + "bbox_left":1, + "bbox_right":22, + "bbox_top":1, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"d81c8a0c-7ea7-4c85-95ad-0b7394936c31","name":"d81c8a0c-7ea7-4c85-95ad-0b7394936c31","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"7ec25b15-c8dc-4ce5-9f17-c5e9923a9525","name":"7ec25b15-c8dc-4ce5-9f17-c5e9923a9525","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"cc9f6201-c9f5-414e-8b28-97566eb6b405","name":"cc9f6201-c9f5-414e-8b28-97566eb6b405","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"f17dd9a2-d5cb-44d9-9ec1-903968019825","name":"f17dd9a2-d5cb-44d9-9ec1-903968019825","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b","name":"6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"6327ddfc-a4fa-4bf4-9a22-511c4581e6c2","name":"6327ddfc-a4fa-4bf4-9a22-511c4581e6c2","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + {"$GMSpriteFrame":"","%Name":"793151f9-7bc7-4285-af9a-e4c5f3d6105e","name":"793151f9-7bc7-4285-af9a-e4c5f3d6105e","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":24, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"3c6fc479-708a-439a-8f0c-80dd14f575f8","blendMode":0,"displayName":"default","isLocked":false,"name":"3c6fc479-708a-439a-8f0c-80dd14f575f8","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_gmlayer", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"misc", + "path":"folders/sprites/misc.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_gmlayer", + "autoRecord":true, + "backdropHeight":768, + "backdropImageOpacity":0.5, + "backdropImagePath":"", + "backdropWidth":1366, + "backdropXOffset":0.0, + "backdropYOffset":0.0, + "events":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "eventStubScript":null, + "eventToFunction":{}, + "length":7.0, + "lockOrigin":false, + "moments":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "name":"s_gmlayer", + "playback":1, + "playbackSpeed":30.0, + "playbackSpeedType":0, + "resourceType":"GMSequence", + "resourceVersion":"2.0", + "showBackdrop":true, + "showBackdropImage":false, + "timeUnits":1, + "tracks":[ + {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"d81c8a0c-7ea7-4c85-95ad-0b7394936c31","path":"sprites/s_gmlayer/s_gmlayer.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"671d2d2f-be63-4494-b4c5-45e075521b78","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"7ec25b15-c8dc-4ce5-9f17-c5e9923a9525","path":"sprites/s_gmlayer/s_gmlayer.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"d7b6e61d-c1a8-49fe-a2fd-4dd847355e9f","IsCreationKey":false,"Key":1.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"cc9f6201-c9f5-414e-8b28-97566eb6b405","path":"sprites/s_gmlayer/s_gmlayer.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"4be75be3-bcca-48c9-8ef2-70c1a0f1bc5a","IsCreationKey":false,"Key":2.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"f17dd9a2-d5cb-44d9-9ec1-903968019825","path":"sprites/s_gmlayer/s_gmlayer.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"fc33d751-c70f-46e8-b4bd-460d0acec7f7","IsCreationKey":false,"Key":3.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"6e5e2b10-f3fc-47b7-be0c-1af0ed6c727b","path":"sprites/s_gmlayer/s_gmlayer.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"14350154-a924-46b2-859b-71a1c4217ed5","IsCreationKey":false,"Key":4.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"6327ddfc-a4fa-4bf4-9a22-511c4581e6c2","path":"sprites/s_gmlayer/s_gmlayer.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"f6c00056-1774-494a-acdf-4e14586da8d7","IsCreationKey":false,"Key":5.0,"Length":1.0,"resourceType":"Keyframe","resourceVersion":"2.0","Stretch":false,}, + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"793151f9-7bc7-4285-af9a-e4c5f3d6105e","path":"sprites/s_gmlayer/s_gmlayer.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"c25f7b51-19f0-44bf-afb6-aa3348a5050b","IsCreationKey":false,"Key":6.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, + "volume":1.0, + "xorigin":12, + "yorigin":12, + }, + "swatchColours":null, + "swfPrecision":0.5, + "textureGroupId":{ + "name":"Default", + "path":"texturegroups/Default", + }, + "type":0, + "VTile":false, + "width":24, +} \ No newline at end of file diff --git a/sprites/s_gmroom/cf8a0785-6466-41ac-a4b0-1d74a16a9e93.png b/sprites/s_gmroom/cf8a0785-6466-41ac-a4b0-1d74a16a9e93.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d1fa7ebb93ad731b4f39efb486d1f471d6a8a0 GIT binary patch literal 849 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI|H*Yfq}`z)5S5Q;?~<)zJAh< z0&el{I%_@%&u3(Lqx6932SeYcM{FCObL`{S*3sY8!ksWhcEJ-Kjg3p!#6<2;o>-`S z^@~Zca*Y3`lu-YxHD4?5C|7gI94`c-Yf~<$M7oqU2tVL>aoy)VWBbRy%paDg{WC7$ zztbvEw|A}Y>fZOACn8+LlFln--OOJ7lUs0Rbotx_H6`&}ll!ITUVm9~k2$5XvzFa% z-^$ZxXEM)s=CJpcHelPQGA-=@O9hkIsUqeFTZDGA=1uu2-%y*tk)wL;xMIut$ZvZu z{pnj`z9(O4)7-%PDJx7*t=KGU8WMTp6W`LJpu?Q2!%y>Aa4Y`NdsgE6Xy^HexNrY; zUC$onvG6*gHtlS<&kU7mecnK`fk#B2v*BxvOD&EHUz4L}ay4eDgLcW9<5woV5Jm8z)mBYPb zlZoQI-&{A==wQ=nY{8pnUoJhe;Y(r7*X(7}C8o_|x_qsDsVq3A z?=jais=v5&N3P*@C@_VombgZgq$HN4S|t~y0x1R~10xe%LqlC7gAfBVD+5a_69a7n z11kfAcXlerP&DM`r(~v8;?^)fc}^8jg9hA&lFZ!H;*!MN0^E8|lgTe~ HDWM4f@b+9~ literal 0 HcmV?d00001 diff --git a/sprites/s_gmroom/layers/cf8a0785-6466-41ac-a4b0-1d74a16a9e93/4ce347b1-ee6d-4cde-be23-eb243caf1c50.png b/sprites/s_gmroom/layers/cf8a0785-6466-41ac-a4b0-1d74a16a9e93/4ce347b1-ee6d-4cde-be23-eb243caf1c50.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d1fa7ebb93ad731b4f39efb486d1f471d6a8a0 GIT binary patch literal 849 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI|H*Yfq}`z)5S5Q;?~<)zJAh< z0&el{I%_@%&u3(Lqx6932SeYcM{FCObL`{S*3sY8!ksWhcEJ-Kjg3p!#6<2;o>-`S z^@~Zca*Y3`lu-YxHD4?5C|7gI94`c-Yf~<$M7oqU2tVL>aoy)VWBbRy%paDg{WC7$ zztbvEw|A}Y>fZOACn8+LlFln--OOJ7lUs0Rbotx_H6`&}ll!ITUVm9~k2$5XvzFa% z-^$ZxXEM)s=CJpcHelPQGA-=@O9hkIsUqeFTZDGA=1uu2-%y*tk)wL;xMIut$ZvZu z{pnj`z9(O4)7-%PDJx7*t=KGU8WMTp6W`LJpu?Q2!%y>Aa4Y`NdsgE6Xy^HexNrY; zUC$onvG6*gHtlS<&kU7mecnK`fk#B2v*BxvOD&EHUz4L}ay4eDgLcW9<5woV5Jm8z)mBYPb zlZoQI-&{A==wQ=nY{8pnUoJhe;Y(r7*X(7}C8o_|x_qsDsVq3A z?=jais=v5&N3P*@C@_VombgZgq$HN4S|t~y0x1R~10xe%LqlC7gAfBVD+5a_69a7n z11kfAcXlerP&DM`r(~v8;?^)fc}^8jg9hA&lFZ!H;*!MN0^E8|lgTe~ HDWM4f@b+9~ literal 0 HcmV?d00001 diff --git a/sprites/s_gmroom/s_gmroom.yy b/sprites/s_gmroom/s_gmroom.yy new file mode 100644 index 000000000..ce2fb4bdb --- /dev/null +++ b/sprites/s_gmroom/s_gmroom.yy @@ -0,0 +1,90 @@ +{ + "$GMSprite":"", + "%Name":"s_gmroom", + "bboxMode":0, + "bbox_bottom":54, + "bbox_left":9, + "bbox_right":54, + "bbox_top":9, + "collisionKind":1, + "collisionTolerance":0, + "DynamicTexturePage":false, + "edgeFiltering":false, + "For3D":false, + "frames":[ + {"$GMSpriteFrame":"","%Name":"cf8a0785-6466-41ac-a4b0-1d74a16a9e93","name":"cf8a0785-6466-41ac-a4b0-1d74a16a9e93","resourceType":"GMSpriteFrame","resourceVersion":"2.0",}, + ], + "gridX":0, + "gridY":0, + "height":64, + "HTile":false, + "layers":[ + {"$GMImageLayer":"","%Name":"4ce347b1-ee6d-4cde-be23-eb243caf1c50","blendMode":0,"displayName":"default","isLocked":false,"name":"4ce347b1-ee6d-4cde-be23-eb243caf1c50","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,}, + ], + "name":"s_gmroom", + "nineSlice":null, + "origin":4, + "parent":{ + "name":"misc", + "path":"folders/sprites/misc.yy", + }, + "preMultiplyAlpha":false, + "resourceType":"GMSprite", + "resourceVersion":"2.0", + "sequence":{ + "$GMSequence":"", + "%Name":"s_gmroom", + "autoRecord":true, + "backdropHeight":768, + "backdropImageOpacity":0.5, + "backdropImagePath":"", + "backdropWidth":1366, + "backdropXOffset":0.0, + "backdropYOffset":0.0, + "events":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "eventStubScript":null, + "eventToFunction":{}, + "length":1.0, + "lockOrigin":false, + "moments":{ + "$KeyframeStore":"", + "Keyframes":[], + "resourceType":"KeyframeStore", + "resourceVersion":"2.0", + }, + "name":"s_gmroom", + "playback":1, + "playbackSpeed":30.0, + "playbackSpeedType":0, + "resourceType":"GMSequence", + "resourceVersion":"2.0", + "showBackdrop":true, + "showBackdropImage":false, + "timeUnits":1, + "tracks":[ + {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore":"","Keyframes":[ + {"$Keyframe":"","Channels":{ + "0":{"$SpriteFrameKeyframe":"","Id":{"name":"cf8a0785-6466-41ac-a4b0-1d74a16a9e93","path":"sprites/s_gmroom/s_gmroom.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",}, + },"Disabled":false,"id":"b247d921-eb69-4dd9-a734-bc95ddcdd829","IsCreationKey":false,"Key":0.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, + "volume":1.0, + "xorigin":32, + "yorigin":32, + }, + "swatchColours":null, + "swfPrecision":0.5, + "textureGroupId":{ + "name":"Default", + "path":"texturegroups/Default", + }, + "type":0, + "VTile":false, + "width":64, +} \ No newline at end of file