├── tests ├── data │ ├── text_document.txt │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── explosion.wav ├── projects │ ├── GMLProject │ │ ├── objects │ │ │ ├── obj_child │ │ │ │ ├── Step_0.gml │ │ │ │ ├── Create_0.gml │ │ │ │ └── obj_child.yy │ │ │ ├── obj_child_child │ │ │ │ ├── Step_0.gml │ │ │ │ ├── Create_0.gml │ │ │ │ └── obj_child_child.yy │ │ │ ├── test_object1 │ │ │ │ ├── Step_0.gml │ │ │ │ └── test_object1.yy │ │ │ ├── obj_parent │ │ │ │ ├── Create_0.gml │ │ │ │ ├── Draw_0.gml │ │ │ │ └── obj_parent.yy │ │ │ ├── thisobjectshouldbegone │ │ │ │ └── thisobjectshouldbegone.yy │ │ │ ├── obj_using_simple_project │ │ │ │ └── obj_using_simple_project.yy │ │ │ ├── testing_shouldbe_here_test │ │ │ │ └── testing_shouldbe_here_test.yy │ │ │ ├── testing_shouldbe_gone_test2 │ │ │ │ └── testing_shouldbe_gone_test2.yy │ │ │ └── thisobjectshouldnotbegone_test3 │ │ │ │ └── thisobjectshouldnotbegone_test3.yy │ │ ├── datafiles │ │ │ └── text_document.txt │ │ ├── notes │ │ │ ├── note_inside_group.txt │ │ │ ├── note_not_in_group.txt │ │ │ ├── note_inside_group.yy │ │ │ └── note_not_in_group.yy │ │ ├── timelines │ │ │ └── tl_one │ │ │ │ ├── moment_0.gml │ │ │ │ ├── moment_30.gml │ │ │ │ └── tl_one.yy │ │ ├── run.sh │ │ ├── fonts │ │ │ └── fnt_arial_8 │ │ │ │ ├── fnt_arial_8.png │ │ │ │ └── fnt_arial_8.old.png │ │ ├── sounds │ │ │ └── snd_explosion │ │ │ │ ├── snd_explosion │ │ │ │ └── snd_explosion.yy │ │ ├── scripts │ │ │ ├── scr_multiply │ │ │ │ ├── scr_multiply.gml │ │ │ │ └── scr_multiply.yy │ │ │ ├── test_script1 │ │ │ │ └── test_script1.yy │ │ │ ├── script_gone_test2 │ │ │ │ └── script_gone_test2.yy │ │ │ ├── script_notgone_test3 │ │ │ │ └── script_notgone_test3.yy │ │ │ └── scr_in_group_to_ignore │ │ │ │ └── scr_in_group_to_ignore.yy │ │ ├── tilesets │ │ │ └── ts_numbers │ │ │ │ ├── output_tileset.png │ │ │ │ └── ts_numbers.yy │ │ ├── sprites │ │ │ ├── spr_numbers │ │ │ │ ├── 55f3e0fd-28e0-4673-8555-1eb43a7a3fcd.png │ │ │ │ ├── 624bbd80-09ca-4c9d-a977-61b54baa2dac.png │ │ │ │ ├── 81f2cbda-0b2b-45cf-9fbd-beced1b583cf.png │ │ │ │ └── layers │ │ │ │ │ ├── 55f3e0fd-28e0-4673-8555-1eb43a7a3fcd │ │ │ │ │ └── 1ce14796-9b17-4cb7-bf02-74f8475e41a1.png │ │ │ │ │ ├── 624bbd80-09ca-4c9d-a977-61b54baa2dac │ │ │ │ │ └── 1ce14796-9b17-4cb7-bf02-74f8475e41a1.png │ │ │ │ │ └── 81f2cbda-0b2b-45cf-9fbd-beced1b583cf │ │ │ │ │ └── 1ce14796-9b17-4cb7-bf02-74f8475e41a1.png │ │ │ └── spr_to_ignore │ │ │ │ ├── bc3ca4da-3afb-4fb9-9ed0-5353691cc828.png │ │ │ │ └── layers │ │ │ │ └── bc3ca4da-3afb-4fb9-9ed0-5353691cc828 │ │ │ │ └── 320be551-5d29-4ad9-9b4a-77d1851f6a89.png │ │ ├── shaders │ │ │ └── sh_passthrough │ │ │ │ ├── sh_passthrough.yy │ │ │ │ ├── sh_passthrough.fsh │ │ │ │ └── sh_passthrough.vsh │ │ ├── options │ │ │ ├── main │ │ │ │ ├── newconfig │ │ │ │ │ └── options_main.newconfig.yy │ │ │ │ └── inherited │ │ │ │ │ └── options_main.inherited.yy │ │ │ ├── linux │ │ │ │ └── options_linux.yy │ │ │ ├── mac │ │ │ │ └── options_mac.yy │ │ │ ├── tvos │ │ │ │ └── options_tvos.yy │ │ │ └── html5 │ │ │ │ └── options_html5.yy │ │ ├── views │ │ │ ├── 98a7ede6-69c9-45f5-91ac-ccdd8db943eb.yy │ │ │ ├── dc2198bd-3230-42f1-ae22-4df860543f85.yy │ │ │ ├── 75e726a7-cf89-40a6-bfa5-64f058241ec7.yy │ │ │ ├── 119cbe88-3522-4eb0-9a65-67592f368412.yy │ │ │ ├── e021792b-59ca-418e-a054-232fc8f68838.yy │ │ │ ├── 982c8bc9-bdab-4c71-b840-f77890b3ae9d.yy │ │ │ ├── 9d00475e-9e02-4d87-af66-74b7237b5d1e.yy │ │ │ ├── 2c6daa16-0197-401d-bb95-207f2b2990e3.yy │ │ │ ├── 5214ea11-2cc7-4e91-acd4-136b41310eef.yy │ │ │ ├── dd6a3339-5c46-41af-9c68-0eae5b436837.yy │ │ │ ├── f4ec481c-9aee-4d6b-92eb-bf29130bac47.yy │ │ │ ├── 6738071c-ba15-4757-9551-d747dd8a3597.yy │ │ │ ├── c1ba437e-11e9-4da7-928b-a432fa73885c.yy │ │ │ ├── c3314a25-3fa0-4251-bd84-390475eb2c27.yy │ │ │ ├── dcb3b9aa-efa0-4fc9-b29c-cd1a5e1d39ea.yy │ │ │ ├── 98d50ca0-61c1-4538-9b7c-2a7c2ba66602.yy │ │ │ ├── b3b45f12-a0aa-47c3-8eaa-8396e6a8967d.yy │ │ │ ├── b1ae34bc-a358-4ef9-af35-978fa1a8c21f.yy │ │ │ ├── 7e49f719-39c6-4bc4-8675-9db2de6fbca2.yy │ │ │ ├── 58d409a0-91fb-4c73-a851-274797e5000c.yy │ │ │ ├── 1980e77a-3df2-4b78-acdb-55b36295e218.yy │ │ │ ├── d23e5b4f-56e2-4fae-b64d-b60abeb2675b.yy │ │ │ ├── 0bb36c74-dc11-4a76-8ff5-0d89046b21bf.yy │ │ │ ├── ab958c18-ec8c-4be4-9684-62713fbc0cae.yy │ │ │ ├── 2ed040a7-59f4-4c9c-ad9b-001f105af88a.yy │ │ │ └── e8f3e171-c9ef-4af7-9f68-151e2f5ba191.yy │ │ ├── catalyst.json │ │ └── datafiles_yy │ │ │ └── text_document.txt.yy │ ├── SimpleProject │ │ ├── objects │ │ │ └── obj_simple_test │ │ │ │ ├── Step_0.gml │ │ │ │ └── obj_simple_test.yy │ │ ├── scripts │ │ │ └── scr_simple_test │ │ │ │ ├── scr_simple_test.gml │ │ │ │ └── scr_simple_test.yy │ │ ├── sprites │ │ │ ├── spr_simple_dots │ │ │ │ ├── 5400d35f-d01c-4b4f-90ee-8295547fc872.png │ │ │ │ └── layers │ │ │ │ │ └── 5400d35f-d01c-4b4f-90ee-8295547fc872 │ │ │ │ │ └── 0fa6dbb1-f565-4b84-a839-8ad094426a4d.png │ │ │ └── spr_inside_folder_dots │ │ │ │ ├── c9613987-4ffa-4cfd-ae00-3fa6edb7e0f0.png │ │ │ │ └── layers │ │ │ │ └── c9613987-4ffa-4cfd-ae00-3fa6edb7e0f0 │ │ │ │ └── 5211538f-d4c6-4514-8cdd-f4f3c6026a96.png │ │ ├── catalyst.json │ │ ├── options │ │ │ ├── main │ │ │ │ └── inherited │ │ │ │ │ └── options_main.inherited.yy │ │ │ ├── linux │ │ │ │ └── options_linux.yy │ │ │ ├── mac │ │ │ │ └── options_mac.yy │ │ │ ├── html5 │ │ │ │ └── options_html5.yy │ │ │ └── tvos │ │ │ │ └── options_tvos.yy │ │ └── views │ │ │ ├── 3313e2df-ca01-46f9-8cfd-517e06112e8d.yy │ │ │ ├── 6ecd5bab-50f7-48d5-b91b-da519300c634.yy │ │ │ ├── 93af89d6-828e-47c2-a1ba-45c67bebab37.yy │ │ │ ├── fd89cb67-7627-4450-bde9-03b21b1c940b.yy │ │ │ ├── 2fc98116-4e16-4014-98ba-0dc73dee61d5.yy │ │ │ ├── 7b7762a9-7c75-40a6-b161-1e203e869b69.yy │ │ │ ├── c31d0bbe-7836-49df-a8ce-a16ceff33973.yy │ │ │ ├── 35f4465f-a185-4d7b-85dd-6f265c4b4751.yy │ │ │ ├── 8374236d-0ffc-44ad-938f-0647ad835ca5.yy │ │ │ ├── ee0fd327-783c-4b64-aa2c-f01fe661b5a1.yy │ │ │ ├── f5811685-7896-4f7a-b24a-9cd14b421568.yy │ │ │ ├── ab73e87c-6346-426e-84c9-79ae8db8af38.yy │ │ │ ├── 08d87e74-32e9-44ea-87e8-36f76d214eed.yy │ │ │ ├── 60857659-fb3d-4020-9265-c5cf5d7cb5f2.yy │ │ │ ├── a0578d58-5e16-480e-9122-0b63cfd2eb41.yy │ │ │ ├── 155ae852-d984-4d5e-b8de-ec6bcd1e8a87.yy │ │ │ └── 94893bb6-4984-483b-9d8d-5a21df1483e3.yy │ └── OtherProject │ │ ├── sprites │ │ └── spr_other_squares │ │ │ ├── ba4199d9-cef2-4b68-baab-cae33026ff02.png │ │ │ └── layers │ │ │ └── ba4199d9-cef2-4b68-baab-cae33026ff02 │ │ │ └── 328a249e-f08b-46de-bb7d-20798c15d31d.png │ │ ├── catalyst.json │ │ ├── options │ │ ├── main │ │ │ └── inherited │ │ │ │ └── options_main.inherited.yy │ │ ├── linux │ │ │ └── options_linux.yy │ │ ├── mac │ │ │ └── options_mac.yy │ │ ├── html5 │ │ │ └── options_html5.yy │ │ └── tvos │ │ │ └── options_tvos.yy │ │ └── views │ │ ├── 3313e2df-ca01-46f9-8cfd-517e06112e8d.yy │ │ ├── 6ecd5bab-50f7-48d5-b91b-da519300c634.yy │ │ ├── 93af89d6-828e-47c2-a1ba-45c67bebab37.yy │ │ ├── fd89cb67-7627-4450-bde9-03b21b1c940b.yy │ │ ├── 08d87e74-32e9-44ea-87e8-36f76d214eed.yy │ │ ├── 2fc98116-4e16-4014-98ba-0dc73dee61d5.yy │ │ ├── 60857659-fb3d-4020-9265-c5cf5d7cb5f2.yy │ │ ├── 7b7762a9-7c75-40a6-b161-1e203e869b69.yy │ │ ├── c31d0bbe-7836-49df-a8ce-a16ceff33973.yy │ │ ├── 35f4465f-a185-4d7b-85dd-6f265c4b4751.yy │ │ ├── 8374236d-0ffc-44ad-938f-0647ad835ca5.yy │ │ ├── ee0fd327-783c-4b64-aa2c-f01fe661b5a1.yy │ │ ├── f5811685-7896-4f7a-b24a-9cd14b421568.yy │ │ ├── a0578d58-5e16-480e-9122-0b63cfd2eb41.yy │ │ ├── 155ae852-d984-4d5e-b8de-ec6bcd1e8a87.yy │ │ └── 94893bb6-4984-483b-9d8d-5a21df1483e3.yy ├── sandbox │ └── .gitignore ├── mocks │ ├── projects │ │ ├── 21_UninstalledNewFiles │ │ │ ├── scripts │ │ │ │ ├── newScript │ │ │ │ │ ├── newScript.gml │ │ │ │ │ └── newScript.yy │ │ │ │ ├── test_suite_init │ │ │ │ │ ├── test_suite_init.gml │ │ │ │ │ └── test_suite_init.yy │ │ │ │ ├── bit_from_byte │ │ │ │ │ ├── bit_from_byte.gml │ │ │ │ │ └── bit_from_byte.yy │ │ │ │ ├── pulse │ │ │ │ │ ├── pulse.gml │ │ │ │ │ └── pulse.yy │ │ │ │ ├── dectohex │ │ │ │ │ ├── dectohex.yy │ │ │ │ │ └── dectohex.gml │ │ │ │ ├── hextodec │ │ │ │ │ ├── hextodec.yy │ │ │ │ │ └── hextodec.gml │ │ │ │ ├── debug_log │ │ │ │ │ ├── debug_log.yy │ │ │ │ │ └── debug_log.gml │ │ │ │ ├── color_lerp │ │ │ │ │ ├── color_lerp.yy │ │ │ │ │ └── color_lerp.gml │ │ │ │ ├── round_whole │ │ │ │ │ ├── round_whole.yy │ │ │ │ │ └── round_whole.gml │ │ │ │ ├── string_mask │ │ │ │ │ ├── string_mask.yy │ │ │ │ │ └── string_mask.gml │ │ │ │ ├── string_trim │ │ │ │ │ ├── string_trim.yy │ │ │ │ │ └── string_trim.gml │ │ │ │ ├── url_decode │ │ │ │ │ ├── url_decode.yy │ │ │ │ │ └── url_decode.gml │ │ │ │ ├── url_encode │ │ │ │ │ ├── url_encode.yy │ │ │ │ │ └── url_encode.gml │ │ │ │ ├── array_implode │ │ │ │ │ ├── array_implode.yy │ │ │ │ │ └── array_implode.gml │ │ │ │ ├── string_append │ │ │ │ │ ├── string_append.yy │ │ │ │ │ └── string_append.gml │ │ │ │ ├── string_explode │ │ │ │ │ ├── string_explode.yy │ │ │ │ │ └── string_explode.gml │ │ │ │ ├── string_prepend │ │ │ │ │ ├── string_prepend.yy │ │ │ │ │ └── string_prepend.gml │ │ │ │ ├── string_reverse │ │ │ │ │ ├── string_reverse.yy │ │ │ │ │ └── string_reverse.gml │ │ │ │ ├── test_suite_end │ │ │ │ │ ├── test_suite_end.yy │ │ │ │ │ └── test_suite_end.gml │ │ │ │ ├── string_ends_with │ │ │ │ │ ├── string_ends_with.yy │ │ │ │ │ └── string_ends_with.gml │ │ │ │ ├── test_assert_same │ │ │ │ │ ├── test_assert_same.yy │ │ │ │ │ └── test_assert_same.gml │ │ │ │ ├── netevent_to_string │ │ │ │ │ ├── netevent_to_string.yy │ │ │ │ │ └── netevent_to_string.gml │ │ │ │ ├── string_starts_with │ │ │ │ │ ├── string_starts_with.yy │ │ │ │ │ └── string_starts_with.gml │ │ │ │ ├── get_nearest_instances │ │ │ │ │ └── get_nearest_instances.yy │ │ │ │ ├── get_furthest_instances │ │ │ │ │ └── get_furthest_instances.yy │ │ │ │ └── extract_header_from_string │ │ │ │ │ ├── extract_header_from_string.yy │ │ │ │ │ └── extract_header_from_string.gml │ │ │ ├── objects │ │ │ │ ├── ExtendedFunctions_obj_near_instance │ │ │ │ │ ├── Draw_0.gml │ │ │ │ │ └── ExtendedFunctions_obj_near_instance.yy │ │ │ │ ├── ExtendedFunctions_obj_test_near_instances │ │ │ │ │ ├── Create_0.gml │ │ │ │ │ ├── Draw_0.gml │ │ │ │ │ └── ExtendedFunctions_obj_test_near_instances.yy │ │ │ │ ├── obj_test │ │ │ │ │ └── obj_test.yy │ │ │ │ └── ExtendedFunctions_obj_test │ │ │ │ │ └── ExtendedFunctions_obj_test.yy │ │ │ ├── sprites │ │ │ │ └── newSprite │ │ │ │ │ ├── e131be19-5848-45f2-b020-57f4410cf2a5.png │ │ │ │ │ └── layers │ │ │ │ │ └── e131be19-5848-45f2-b020-57f4410cf2a5 │ │ │ │ │ └── 1fb31644-396c-40ab-95b2-00d06ba69873.png │ │ │ ├── catalyst.json │ │ │ ├── views │ │ │ │ ├── 026561d7-8e33-44e9-893c-9590e5254bfc.yy │ │ │ │ ├── 8c78d3d6-d356-45e9-b6a4-59c2dc18999e.yy │ │ │ │ ├── 8f4db28c-0f1f-49ba-ae88-4cb90aede7f4.yy │ │ │ │ ├── 2f9b3f7b-9b45-4290-b15f-f0dc4d5ac60d.yy │ │ │ │ ├── 33af6a91-194b-45c3-9783-97215e43a166.yy │ │ │ │ ├── c068ca74-7c47-456c-b103-02f4c25ddb83.yy │ │ │ │ ├── 479594f0-6da0-46fc-b0a0-97616daa4418.yy │ │ │ │ ├── df4293b2-a9c5-4173-8aa5-42d84930d8f5.yy │ │ │ │ ├── efeeaba1-bf8b-4494-9b6f-c02af20fa2ed.yy │ │ │ │ ├── 07a5c14a-1669-529d-15f9-07aca623ae5e.yy │ │ │ │ ├── 2b926b36-4456-ea86-e7cb-988601cd996e.yy │ │ │ │ ├── 38c881ae-10eb-4b96-bd4b-b20aa7094996.yy │ │ │ │ ├── 9e33827b-4dfb-a705-9d51-1b9855b9f63f.yy │ │ │ │ ├── e82be4ff-fe27-7360-234a-428d1eed32c9.yy │ │ │ │ ├── f7c27459-f01b-2208-c908-74c52eddfd69.yy │ │ │ │ ├── 857db639-f610-3c74-fb50-13ef1718f1b8.yy │ │ │ │ ├── 20d9d509-f96a-8c02-b2bd-0c6bd10380e8.yy │ │ │ │ ├── 2cc409bc-7fb6-888c-0cbe-970dbac6b6dd.yy │ │ │ │ ├── be569bd8-e7f1-49c5-9cbf-d6c735c774e2.yy │ │ │ │ ├── 1ce2ee19-8869-2da7-fa91-c3c0671e3285.yy │ │ │ │ ├── 20bdde62-c74a-4ed7-aceb-7381cff39e81.yy │ │ │ │ ├── eee014e8-3a24-3e03-097b-5139840b6272.yy │ │ │ │ ├── 86336395-3fd9-67e2-0521-61854eb28499.yy │ │ │ │ ├── c448d3d6-759b-4896-8e64-381f8bf22430.yy │ │ │ │ ├── 16eb5455-9985-4392-bba7-fada383da40d.yy │ │ │ │ ├── f3c2bf76-84d6-4fa4-80c4-8c8882dec302.yy │ │ │ │ ├── 5bf26e5c-6b8d-6f85-6855-ba5a8c7eb901.yy │ │ │ │ ├── 9b614e31-b06f-e488-824e-5c5b74294740.yy │ │ │ │ ├── 06592b8c-6360-98c3-7674-38b1132a6d28.yy │ │ │ │ ├── 99147da0-4268-bf21-da8f-70bc1d7c1795.yy │ │ │ │ ├── bf289c15-a08c-49cb-a473-506dcff64a02.yy │ │ │ │ ├── 044962af-a181-1b1c-cbba-bcd8f9e3e061.yy │ │ │ │ └── 1a99a9b8-fbb2-4a16-9537-a6272875a373.yy │ │ │ ├── options │ │ │ │ ├── main │ │ │ │ │ └── inherited │ │ │ │ │ │ └── options_main.inherited.yy │ │ │ │ ├── linux │ │ │ │ │ └── options_linux.yy │ │ │ │ ├── mac │ │ │ │ │ └── options_mac.yy │ │ │ │ ├── html5 │ │ │ │ │ └── options_html5.yy │ │ │ │ └── tvos │ │ │ │ │ └── options_tvos.yy │ │ │ └── .gitignore │ │ └── 20_IgnorableFiles │ │ │ ├── catalyst.json │ │ │ ├── views │ │ │ ├── 1661de33-c10c-47d4-8563-e9e6796ab2ae.yy │ │ │ ├── 4e2e3fde-6384-460f-87b7-66e6e85c8fe4.yy │ │ │ ├── a4cafe4b-ddd8-4cf9-9b98-49363c222b53.yy │ │ │ ├── 02c768e4-f6b6-48b4-a2e4-98b847481b97.yy │ │ │ ├── 0308bfe6-e741-4462-a822-b51973aaf568.yy │ │ │ ├── 1f697a03-bb14-404b-9364-2aa049382c15.yy │ │ │ ├── 2eba1da1-802b-4ca3-94a3-9e3e28bddf5c.yy │ │ │ ├── 407dcbed-d554-40f8-85af-eead7752aeb4.yy │ │ │ ├── e9b2c9b8-7a80-4238-b305-1b78ce69d927.yy │ │ │ ├── 878df58d-a95c-4aaa-ae30-69a4cc33ad75.yy │ │ │ ├── 69c57755-590b-466f-8faa-c1a7012243a4.yy │ │ │ ├── 80a02540-d0a1-41f2-a644-47cd8c8ee0a5.yy │ │ │ ├── 454e7cf0-c931-47fe-a2ad-d08fa830bd21.yy │ │ │ ├── dc0b760b-c9f3-440a-971e-e4c2a683c395.yy │ │ │ ├── 2a8652aa-30b7-45f6-bda2-82bf8fc8a54d.yy │ │ │ └── 4f95d0b1-21de-4c79-95e6-c6d42fa11ba2.yy │ │ │ └── options │ │ │ ├── main │ │ │ └── inherited │ │ │ │ └── options_main.inherited.yy │ │ │ ├── linux │ │ │ └── options_linux.yy │ │ │ ├── mac │ │ │ └── options_mac.yy │ │ │ ├── html5 │ │ │ └── options_html5.yy │ │ │ └── tvos │ │ │ └── options_tvos.yy │ └── catalyst │ │ └── empty.json └── src │ ├── Exception │ └── PackageNotFoundExceptionTest.php │ ├── Command │ ├── CommandTestCase.php │ ├── HelpCommandTest.php │ └── InitCommandTest.php │ ├── MockStorageTestCase.php │ ├── Entity │ ├── YoYoProjectEntityTest.php │ └── CatalystEntityTest.php │ ├── TestHelper.php │ ├── Model │ └── UuidTest.php │ └── Service │ └── JsonServiceTest.php ├── files ├── icon.ico ├── icon.png ├── installer.bmp ├── installer.png ├── repository-open-graph-template.png └── php.ini ├── src ├── Model │ ├── YoYo │ │ └── Resource │ │ │ └── GM │ │ │ ├── GMFont.php │ │ │ ├── GMPath.php │ │ │ ├── GMNotes.php │ │ │ ├── GMObject.php │ │ │ ├── GMRoom.php │ │ │ ├── GMScript.php │ │ │ ├── GMShader.php │ │ │ ├── GMSound.php │ │ │ ├── GMSprite.php │ │ │ ├── GMExtension.php │ │ │ ├── GMTileSet.php │ │ │ ├── GMTimeline.php │ │ │ ├── GMIncludedFile.php │ │ │ ├── Options │ │ │ ├── GMIosOptions.php │ │ │ ├── GMMacOptions.php │ │ │ ├── GMHtml5Options.php │ │ │ ├── GMLinuxOptions.php │ │ │ ├── GMTVOSOptions.php │ │ │ ├── GMAndroidOptions.php │ │ │ ├── GMWindowsOptions.php │ │ │ ├── GMAmazonFireOptions.php │ │ │ └── GMMainOptions.php │ │ │ └── GMFolder.php │ └── Uuid.php ├── Exception │ ├── MalformedJsonException.php │ ├── FileNotFoundException.php │ ├── PackageNotSatisfiableException.php │ ├── MalformedProjectFileException.php │ ├── UnresolveableDependenciesException.php │ └── PackageNotFoundException.php ├── Interfaces │ └── SaveableEntityInterface.php ├── Command │ ├── HelpCommand.php │ ├── ClearCacheCommand.php │ ├── CleanCommand.php │ └── ResourcesCommand.php ├── DependencyInjection │ └── CompilerPass │ │ └── CollectCommandsToApplicationCompilerPass.php ├── Service │ └── CatalystService.php └── Kernel.php ├── bin ├── catalyst.cmd └── catalyst_help.cmd ├── config ├── services.yml └── services.php ├── .gitignore ├── .travis.yml ├── index.php ├── bumpversion.sh ├── phpunit.xml ├── LICENSE └── composer.json /tests/data/text_document.txt: -------------------------------------------------------------------------------- 1 | Included text file. -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/obj_child/Step_0.gml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/obj_child_child/Step_0.gml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/test_object1/Step_0.gml: -------------------------------------------------------------------------------- 1 | // Okay -------------------------------------------------------------------------------- /tests/projects/GMLProject/datafiles/text_document.txt: -------------------------------------------------------------------------------- 1 | Included text file. -------------------------------------------------------------------------------- /tests/projects/GMLProject/notes/note_inside_group.txt: -------------------------------------------------------------------------------- 1 | This note is inside the group. -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/obj_parent/Create_0.gml: -------------------------------------------------------------------------------- 1 | myvalue = "Parent object"; -------------------------------------------------------------------------------- /tests/projects/SimpleProject/objects/obj_simple_test/Step_0.gml: -------------------------------------------------------------------------------- 1 | scr_simple_test(); -------------------------------------------------------------------------------- /files/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/files/icon.ico -------------------------------------------------------------------------------- /files/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/files/icon.png -------------------------------------------------------------------------------- /tests/data/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/tests/data/1.png -------------------------------------------------------------------------------- /tests/data/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/tests/data/2.png -------------------------------------------------------------------------------- /tests/data/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/tests/data/3.png -------------------------------------------------------------------------------- /tests/projects/GMLProject/notes/note_not_in_group.txt: -------------------------------------------------------------------------------- 1 | Some text for the note NOT in the group -------------------------------------------------------------------------------- /files/installer.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/files/installer.bmp -------------------------------------------------------------------------------- /files/installer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/files/installer.png -------------------------------------------------------------------------------- /tests/projects/GMLProject/timelines/tl_one/moment_0.gml: -------------------------------------------------------------------------------- 1 | show_debug_message("Timeline moment 0"); -------------------------------------------------------------------------------- /tests/projects/GMLProject/timelines/tl_one/moment_30.gml: -------------------------------------------------------------------------------- 1 | show_debug_message("Timeline moment 30"); -------------------------------------------------------------------------------- /tests/sandbox/.gitignore: -------------------------------------------------------------------------------- 1 | # This folder is to mess around in and test the software 2 | * 3 | !.gitignore -------------------------------------------------------------------------------- /tests/data/explosion.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/tests/data/explosion.wav -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/newScript/newScript.gml: -------------------------------------------------------------------------------- 1 | show_debug_message(argument0); -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/obj_child/Create_0.gml: -------------------------------------------------------------------------------- 1 | event_inherited(); 2 | myvalue = "Child object"; -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/obj_child_child/Create_0.gml: -------------------------------------------------------------------------------- 1 | event_inherited(); 2 | myvalue = "Child object of child"; -------------------------------------------------------------------------------- /tests/projects/GMLProject/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | git clean -f; git checkout -- .; ../../../index.php install --verbose 3 | -------------------------------------------------------------------------------- /tests/projects/SimpleProject/scripts/scr_simple_test/scr_simple_test.gml: -------------------------------------------------------------------------------- 1 | show_message("Message from a simple test project"); -------------------------------------------------------------------------------- /src/Model/YoYo/Resource/GM/GMFont.php: -------------------------------------------------------------------------------- 1 | > argument1; -------------------------------------------------------------------------------- /tests/projects/GMLProject/fonts/fnt_arial_8/fnt_arial_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/tests/projects/GMLProject/fonts/fnt_arial_8/fnt_arial_8.png -------------------------------------------------------------------------------- /tests/projects/GMLProject/sounds/snd_explosion/snd_explosion: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/tests/projects/GMLProject/sounds/snd_explosion/snd_explosion -------------------------------------------------------------------------------- /src/Exception/PackageNotSatisfiableException.php: -------------------------------------------------------------------------------- 1 | =1.2" 9 | } 10 | } -------------------------------------------------------------------------------- /tests/projects/SimpleProject/sprites/spr_inside_folder_dots/layers/c9613987-4ffa-4cfd-ae00-3fa6edb7e0f0/5211538f-d4c6-4514-8cdd-f4f3c6026a96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/tests/projects/SimpleProject/sprites/spr_inside_folder_dots/layers/c9613987-4ffa-4cfd-ae00-3fa6edb7e0f0/5211538f-d4c6-4514-8cdd-f4f3c6026a96.png -------------------------------------------------------------------------------- /tests/mocks/projects/20_IgnorableFiles/catalyst.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gmh/test", 3 | "description": "", 4 | "license": "BSD-4-Clause", 5 | "homepage": "", 6 | "yyp": "20_IgnorableFiles.yyp", 7 | "repositories": { 8 | "../../../projects": "directory" 9 | }, 10 | "require": { 11 | "dukesoft/gml-project": "*" 12 | } 13 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/sprites/newSprite/layers/e131be19-5848-45f2-b020-57f4410cf2a5/1fb31644-396c-40ab-95b2-00d06ba69873.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GameMakerHub/Catalyst/HEAD/tests/mocks/projects/21_UninstalledNewFiles/sprites/newSprite/layers/e131be19-5848-45f2-b020-57f4410cf2a5/1fb31644-396c-40ab-95b2-00d06ba69873.png -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/objects/ExtendedFunctions_obj_test_near_instances/Create_0.gml: -------------------------------------------------------------------------------- 1 | instnumber = get_integer("How many instances?", 30); 2 | nearnum = get_integer("How many to fetch near?", 8); 3 | repeat (instnumber) { 4 | instance_create_depth(random(room_width), random(room_height), 0, ExtendedFunctions_obj_near_instance); 5 | } 6 | 7 | -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/test_suite_end/test_suite_end.gml: -------------------------------------------------------------------------------- 1 | if (global.testnumber == global.testssucceeded) { 2 | show_message(string(global.testssucceeded) + "/" + string(global.testnumber) + " tests OK!"); 3 | } else { 4 | show_message(string(global.testssucceeded) + "/" + string(global.testnumber) + " tests OK! (FAILED TESTS)"); 5 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/round_whole/round_whole.gml: -------------------------------------------------------------------------------- 1 | /// @description round_whole(number, round); 2 | /// @function round_whole 3 | /// @param number 4 | /// @param round 5 | /** 6 | * Round number on big numbers 7 | * ex: round_whole(1234, 10) = 1230 8 | * @return int 9 | */ 10 | return round(round((argument0/argument1))*argument1); -------------------------------------------------------------------------------- /src/Exception/PackageNotFoundException.php: -------------------------------------------------------------------------------- 1 | assertSame($exception->getMessage(), 'package/name with version 1.0.0 was not found'); 13 | } 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/20_IgnorableFiles/options/main/inherited/options_main.inherited.yy: -------------------------------------------------------------------------------- 1 | 1.0.0←ed6a955d-5826-4f98-a450-10b414266c27←ed6a955d-5826-4f98-a450-10b414266c27|{ 2 | "option_window_colour": { 3 | "Value": 4278190080 4 | }, 5 | "option_gameguid": "619e81d8-6f02-4fbb-9c2b-61a322e78440", 6 | "option_game_speed": 60 7 | }←1225f6b0-ac20-43bd-a82e-be73fa0b6f4f|{ 8 | "targets": 461609314234257646 9 | }←7b2c4976-1e09-44e5-8256-c527145e03bb|{ 10 | "targets": 461609314234257646 11 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/string_trim/string_trim.gml: -------------------------------------------------------------------------------- 1 | ///@param string 2 | ///@desc trim a string (" trim . . spaces " -> "trim . . spaces") 3 | var str = argument0; 4 | var strlen = string_length(str); 5 | while (strlen > 0 && string_char_at(str, 0) == " ") { 6 | str = string_copy(str, 2, strlen-1); 7 | strlen -= 1; 8 | } 9 | 10 | while (strlen > 0 && string_char_at(str, strlen) == " ") { 11 | str = string_copy(str, 0, strlen-1); 12 | strlen -= 1; 13 | } 14 | 15 | return str; -------------------------------------------------------------------------------- /tests/projects/GMLProject/views/b1ae34bc-a358-4ef9-af35-978fa1a8c21f.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "b1ae34bc-a358-4ef9-af35-978fa1a8c21f", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "b1ae34bc-a358-4ef9-af35-978fa1a8c21f", 6 | "children": [ 7 | "fcb42a9e-cf5c-478f-aa06-8bcbe9e92af2", 8 | "982c8bc9-bdab-4c71-b840-f77890b3ae9d" 9 | ], 10 | "filterType": "GMObject", 11 | "folderName": "children", 12 | "isDefaultView": false, 13 | "localisedFolderName": "" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/options/main/inherited/options_main.inherited.yy: -------------------------------------------------------------------------------- 1 | 1.0.0←ed6a955d-5826-4f98-a450-10b414266c27←ed6a955d-5826-4f98-a450-10b414266c27|{ 2 | "option_window_colour": { 3 | "Value": 4278190080 4 | }, 5 | "option_gameguid": "acde4a44-790d-4482-94c6-3bb3a0c40473", 6 | "option_game_speed": 60 7 | }←1225f6b0-ac20-43bd-a82e-be73fa0b6f4f|{ 8 | "targets": 461609314234257646 9 | }←7b2c4976-1e09-44e5-8256-c527145e03bb|{ 10 | "targets": 461609314234257646 11 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/views/7e49f719-39c6-4bc4-8675-9db2de6fbca2.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "7e49f719-39c6-4bc4-8675-9db2de6fbca2", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "7e49f719-39c6-4bc4-8675-9db2de6fbca2", 6 | "children": [ 7 | "bc0f367b-e859-4b79-a39d-481caf1878b8", 8 | "a990669d-efdf-44de-b0ef-ad4d2fc92724" 9 | ], 10 | "filterType": "GMScript", 11 | "folderName": "group_notgone_test2", 12 | "isDefaultView": false, 13 | "localisedFolderName": "" 14 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/views/58d409a0-91fb-4c73-a851-274797e5000c.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "58d409a0-91fb-4c73-a851-274797e5000c", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "58d409a0-91fb-4c73-a851-274797e5000c", 6 | "children": [ 7 | "e021792b-59ca-418e-a054-232fc8f68838", 8 | "ffc9fb66-f6b4-45ec-b163-aeed4b967285" 9 | ], 10 | "filterType": "GMNotes", 11 | "folderName": "notes", 12 | "isDefaultView": false, 13 | "localisedFolderName": "ResourceTree_Notes" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/hextodec/hextodec.gml: -------------------------------------------------------------------------------- 1 | /// @description hextodec(string); 2 | /// @function hextodec 3 | /// @param string 4 | /** 5 | * Convert hexadecimal string to decimal number 6 | * @param string argument0 The string to convert 7 | * @return integer 8 | */ 9 | var d,r,l; 10 | r=0; 11 | d=string_upper(argument0); 12 | l=string_length(d); 13 | if(l>6) return -1; 14 | for (i=l;i>0;i-=1) { 15 | r+=(string_pos(string_char_at(d,i),"0123456789ABCDEF")-1) * power(16,l-i); 16 | } 17 | return r; -------------------------------------------------------------------------------- /tests/projects/GMLProject/views/1980e77a-3df2-4b78-acdb-55b36295e218.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "1980e77a-3df2-4b78-acdb-55b36295e218", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "1980e77a-3df2-4b78-acdb-55b36295e218", 6 | "children": [ 7 | "60dd397d-bc63-4ce0-90e9-c1c8ab08e8b7", 8 | "6778d752-1985-4c5b-9810-c7d2b486051c" 9 | ], 10 | "filterType": "GMSprite", 11 | "folderName": "sprites", 12 | "isDefaultView": false, 13 | "localisedFolderName": "ResourceTree_Sprites" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/1ce2ee19-8869-2da7-fa91-c3c0671e3285.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "1ce2ee19-8869-2da7-fa91-c3c0671e3285", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "1ce2ee19-8869-2da7-fa91-c3c0671e3285", 6 | "children": [ 7 | "04d5a8b0-ce83-4872-be7e-cb84abf8ac29", 8 | "b3448ea4-5fdb-4287-9d53-6ba4568c2dd3" 9 | ], 10 | "filterType": "Room", 11 | "folderName": "extended-functions", 12 | "isDefaultView": false, 13 | "localisedFolderName": "" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/20bdde62-c74a-4ed7-aceb-7381cff39e81.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "20bdde62-c74a-4ed7-aceb-7381cff39e81", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "20bdde62-c74a-4ed7-aceb-7381cff39e81", 6 | "children": [ 7 | "15b91ad5-7025-42f5-b277-ba17c26613be", 8 | "9c623872-826d-4ed7-b721-c1484e147a32" 9 | ], 10 | "filterType": "Script", 11 | "folderName": "find_instances", 12 | "isDefaultView": false, 13 | "localisedFolderName": "" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/eee014e8-3a24-3e03-097b-5139840b6272.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "eee014e8-3a24-3e03-097b-5139840b6272", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "eee014e8-3a24-3e03-097b-5139840b6272", 6 | "children": [ 7 | "0a9e51a6-1e72-464d-a390-e5159c883ce1", 8 | "525deb0d-8ac5-4355-81f7-a6be738454e9" 9 | ], 10 | "filterType": "Script", 11 | "folderName": "dechexfunctions", 12 | "isDefaultView": false, 13 | "localisedFolderName": "" 14 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/catalyst.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dukesoft/gml-project", 3 | "description": "A testing project with some contents", 4 | "license": "MIT", 5 | "homepage": "http://www.dukesoft.nl", 6 | "yyp": "GMLProject.yyp", 7 | "repositories": { 8 | "../projects": "directory" 9 | }, 10 | "ignore": { 11 | "spr_to_ignore": "resource", 12 | "group_to_ignore": "group", 13 | "test_*": "all", 14 | "*_test2": "resource", 15 | "*_test3": "group" 16 | } 17 | } -------------------------------------------------------------------------------- /tests/projects/SimpleProject/views/a0578d58-5e16-480e-9122-0b63cfd2eb41.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "a0578d58-5e16-480e-9122-0b63cfd2eb41", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "a0578d58-5e16-480e-9122-0b63cfd2eb41", 6 | "children": [ 7 | "2c06e728-9bcc-48ab-bbe4-82c08afddf60", 8 | "ab73e87c-6346-426e-84c9-79ae8db8af38" 9 | ], 10 | "filterType": "GMSprite", 11 | "folderName": "sprites", 12 | "isDefaultView": false, 13 | "localisedFolderName": "ResourceTree_Sprites" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/86336395-3fd9-67e2-0521-61854eb28499.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "86336395-3fd9-67e2-0521-61854eb28499", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "86336395-3fd9-67e2-0521-61854eb28499", 6 | "children": [ 7 | "c9b6b1ee-01e8-4dbe-b5e6-d8341b5cba87", 8 | "7c058ab3-5489-4814-be08-cbce0ec50f68" 9 | ], 10 | "filterType": "Script", 11 | "folderName": "animations and tweening", 12 | "isDefaultView": false, 13 | "localisedFolderName": "" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/c448d3d6-759b-4896-8e64-381f8bf22430.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "c448d3d6-759b-4896-8e64-381f8bf22430", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "c448d3d6-759b-4896-8e64-381f8bf22430", 6 | "children": [ 7 | "c4e53fd2-f1b5-4be5-964f-8f12891409c2", 8 | "9e33827b-4dfb-a705-9d51-1b9855b9f63f" 9 | ], 10 | "filterType": "GMRoom", 11 | "folderName": "rooms", 12 | "isDefaultView": false, 13 | "localisedFolderName": "ResourceTree_Rooms" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/16eb5455-9985-4392-bba7-fada383da40d.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "16eb5455-9985-4392-bba7-fada383da40d", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "16eb5455-9985-4392-bba7-fada383da40d", 6 | "children": [ 7 | "07a5c14a-1669-529d-15f9-07aca623ae5e", 8 | "6f831bda-4962-431b-8eb2-c45c8bba950e" 9 | ], 10 | "filterType": "GMObject", 11 | "folderName": "objects", 12 | "isDefaultView": false, 13 | "localisedFolderName": "ResourceTree_Objects" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/f3c2bf76-84d6-4fa4-80c4-8c8882dec302.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "f3c2bf76-84d6-4fa4-80c4-8c8882dec302", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "f3c2bf76-84d6-4fa4-80c4-8c8882dec302", 6 | "children": [ 7 | "f7c27459-f01b-2208-c908-74c52eddfd69", 8 | "75b7ff54-9869-4609-b472-4097ae69b2ac" 9 | ], 10 | "filterType": "GMScript", 11 | "folderName": "scripts", 12 | "isDefaultView": false, 13 | "localisedFolderName": "ResourceTree_Scripts" 14 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/string_prepend/string_prepend.gml: -------------------------------------------------------------------------------- 1 | /// @description string_prepend(string, prependchar, length); Prepend a string to a set length 2 | /// @function string_prepend 3 | /// @param string 4 | /// @param prependchar 5 | /// @param length 6 | var str = string(argument0); 7 | var prependchar = string(argument1); 8 | if (string_length(str) >= argument2) { 9 | return str; 10 | } 11 | while (string_length(str) < argument2) { 12 | str = prependchar + str; 13 | } 14 | return string_copy(str, 1, argument2); -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/5bf26e5c-6b8d-6f85-6855-ba5a8c7eb901.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "5bf26e5c-6b8d-6f85-6855-ba5a8c7eb901", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "5bf26e5c-6b8d-6f85-6855-ba5a8c7eb901", 6 | "children": [ 7 | "bf559592-fd8b-412a-b23f-f5e377954aa7", 8 | "687d82f8-8c08-4a9e-babc-3c3fafd281c3", 9 | "1a96beaf-0abb-41a8-bdd2-719de3fc434c" 10 | ], 11 | "filterType": "Script", 12 | "folderName": "general", 13 | "isDefaultView": false, 14 | "localisedFolderName": "" 15 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/views/d23e5b4f-56e2-4fae-b64d-b60abeb2675b.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "d23e5b4f-56e2-4fae-b64d-b60abeb2675b", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "d23e5b4f-56e2-4fae-b64d-b60abeb2675b", 6 | "children": [ 7 | "b9f7dc62-7c1b-4e68-b58d-8a2a4470e4be", 8 | "49f54f46-7362-4647-8ca9-9208e0790e00", 9 | "139d8ed0-90dd-4cce-a812-dcc8ae91bdb2" 10 | ], 11 | "filterType": "GMObject", 12 | "folderName": "Group for testing ignoring", 13 | "isDefaultView": false, 14 | "localisedFolderName": "" 15 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/9b614e31-b06f-e488-824e-5c5b74294740.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "9b614e31-b06f-e488-824e-5c5b74294740", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "9b614e31-b06f-e488-824e-5c5b74294740", 6 | "children": [ 7 | "6a0bc185-8e95-4d74-afda-1dc1443e7fe6", 8 | "c86e7bc6-ae4a-4b5c-b1fc-464149a0a693", 9 | "2681e4fc-a4c0-4bbc-ba94-525fac34d34c" 10 | ], 11 | "filterType": "Script", 12 | "folderName": "testfunctions", 13 | "isDefaultView": false, 14 | "localisedFolderName": "" 15 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/datafiles_yy/text_document.txt.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "8a9c5eec-725f-485c-a371-5e24a2741193", 3 | "modelName": "GMIncludedFile", 4 | "mvc": "1.0", 5 | "name": "text_document.txt", 6 | "CopyToMask": 153685337284018414, 7 | "exists": false, 8 | "exportAction": 0, 9 | "exportDir": "", 10 | "fileName": "text_document.txt", 11 | "filePath": "datafiles", 12 | "freeData": false, 13 | "origName": "", 14 | "overwrite": false, 15 | "removeEnd": false, 16 | "size": 0, 17 | "store": false, 18 | "tags": "" 19 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/06592b8c-6360-98c3-7674-38b1132a6d28.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "06592b8c-6360-98c3-7674-38b1132a6d28", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "06592b8c-6360-98c3-7674-38b1132a6d28", 6 | "children": [ 7 | "9f6ee3b0-f949-4238-a860-52e0261760eb", 8 | "68eaaff9-b1cb-4134-bdac-0ace16037b41", 9 | "c8a37efc-8cdc-43ec-b319-ba0ba6bc7584" 10 | ], 11 | "filterType": "Object", 12 | "folderName": "extended-functions", 13 | "isDefaultView": false, 14 | "localisedFolderName": "" 15 | } -------------------------------------------------------------------------------- /tests/src/Command/CommandTestCase.php: -------------------------------------------------------------------------------- 1 | application = new Application(); 15 | } 16 | 17 | protected function initCommand(Command $command) 18 | { 19 | $this->application->add($command); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/string_append/string_append.gml: -------------------------------------------------------------------------------- 1 | /// @description string_append(string, appendchar, length); Append a string to a set length 2 | /// @function string_append 3 | /// @param string 4 | /// @param appendchar 5 | /// @param length 6 | var str = string(argument0); 7 | var appendchar = string(argument1); 8 | if (string_length(str) >= argument2) { 9 | return str; 10 | } 11 | while (string_length(str) < argument2) { 12 | str = str + appendchar; 13 | } 14 | 15 | var overflow = string_length(str) - argument2; 16 | 17 | return string_copy(str, overflow, argument2); -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | boot(); 9 | 10 | $container = $kernel->getContainer(); 11 | 12 | //Override symfony's settings for the help generation... 13 | $_SERVER['PHP_SELF'] = 'catalyst'; 14 | $GLOBALS['SYMFONY_KERNEL'] = $kernel; 15 | 16 | /** @var Application $application */ 17 | $application = $container->get(Application::class); 18 | $application->setName('GameMakerHub Catalyst'); 19 | $application->setVersion('0.2.2-alpha'); 20 | $application->run(); -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | setAutowired(true) 7 | ->setAutoconfigured(true) 8 | ->setPublic(false); 9 | 10 | $this->registerClasses($definition, 'Catalyst\\', '../src/*'); 11 | 12 | $definitionPublic = new Definition(); 13 | 14 | $definitionPublic->setAutowired(true) 15 | ->setAutoconfigured(true) 16 | ->setPublic(true); 17 | 18 | /** @var \Symfony\Component\DependencyInjection\ContainerBuilder $container */ 19 | $container->getDefinition('Symfony\\Component\\Console\\Application')->setPublic(true); -------------------------------------------------------------------------------- /src/Model/YoYo/Resource/GM/Options/GMMainOptions.php: -------------------------------------------------------------------------------- 1 | name = '~MAIN OPTIONS FILE~'; 12 | $stdClass->is_options_file = true; 13 | return self::createFromObject($_filePath, $stdClass, ''); 14 | } 15 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/views/0bb36c74-dc11-4a76-8ff5-0d89046b21bf.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "0bb36c74-dc11-4a76-8ff5-0d89046b21bf", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "0bb36c74-dc11-4a76-8ff5-0d89046b21bf", 6 | "children": [ 7 | "e3b52a1a-e925-4144-bd8e-191c7c32e021", 8 | "9d00475e-9e02-4d87-af66-74b7237b5d1e", 9 | "292afb30-c1ad-4eae-bcc3-2584d4961c47", 10 | "7e49f719-39c6-4bc4-8675-9db2de6fbca2" 11 | ], 12 | "filterType": "GMScript", 13 | "folderName": "scripts", 14 | "isDefaultView": false, 15 | "localisedFolderName": "ResourceTree_Scripts" 16 | } -------------------------------------------------------------------------------- /tests/src/MockStorageTestCase.php: -------------------------------------------------------------------------------- 1 | mockStorage = \Mockery::mock(StorageService::class); 15 | StorageService::setInstance($this->mockStorage); 16 | } 17 | 18 | protected function tearDown(): void 19 | { 20 | StorageService::setInstance(null); //Reset! 21 | } 22 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/extract_header_from_string/extract_header_from_string.gml: -------------------------------------------------------------------------------- 1 | ///@param string 2 | ///@return array|false 3 | ///@description turns a header like "Host: www.dukesoft.nl" into an array: ["Host", "www.dukesoft.nl"] 4 | var str = argument0; 5 | var cut = string_pos(":", str); 6 | if (cut == 0) { 7 | return false; 8 | } 9 | 10 | //Remove all newlines 11 | str = string_replace_all(str, "\r", ""); 12 | str = string_replace_all(str, "\n", ""); 13 | 14 | var header = string_trim(string_copy(str, 0, cut-1)); 15 | var value = string_trim(string_copy(str, cut+1, string_length(str)-cut)); 16 | return [header, value]; -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/objects/ExtendedFunctions_obj_test_near_instances/Draw_0.gml: -------------------------------------------------------------------------------- 1 | x = mouse_x; 2 | y = mouse_y; 3 | 4 | nearest = get_nearest_instances(ExtendedFunctions_obj_near_instance, id, nearnum); 5 | 6 | while (!ds_stack_empty(nearest)) { 7 | inst = ds_stack_pop(nearest); 8 | draw_set_color(c_red); 9 | draw_ellipse(inst.x-8, inst.y-8, inst.x+8, inst.y+8, true); 10 | draw_ellipse(inst.x-10, inst.y-10, inst.x+10, inst.y+10, true); 11 | } 12 | 13 | ds_stack_destroy(nearest); 14 | 15 | draw_set_color(c_black); 16 | draw_text(10,10,string_hash_to_newline("FPS:" + string(fps) + " - REAL: " + string(fps_real))); 17 | 18 | -------------------------------------------------------------------------------- /bumpversion.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if [ ! $# -eq 1 ]; then 3 | echo "Error: missing version parameter" 4 | exit 1 5 | else 6 | if [[ $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then 7 | echo "Bumping version to $1" 8 | else 9 | echo "$1: Not a valid version number" 10 | exit 1 11 | fi 12 | fi 13 | 14 | sed -i -E -e "s/'[0-9]+\.[0-9]+\.[0-9]+'/'$1'/g" index.php 15 | sed -i -E -e "s/\"[0-9]+\.[0-9]+\.[0-9]\"+/\"$1\"/g" installer.nsi 16 | echo "Now making commit for version bump... Adding everything and tagging! Make sure you're on master branch" 17 | pause 18 | git add . 19 | git commit -m "Bump version to $1" 20 | git tag 21 | git push origin --tags -------------------------------------------------------------------------------- /tests/src/Entity/YoYoProjectEntityTest.php: -------------------------------------------------------------------------------- 1 | assertEquals( 19 | file_get_contents(__DIR__ . '/../../projects/GMLProject/GMLProject.yyp'), 20 | $subject->getJson() 21 | ); 22 | } 23 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/url_encode/url_encode.gml: -------------------------------------------------------------------------------- 1 | /// @description url_encode(string); 2 | /// @function url_encode 3 | /// @param string 4 | /** 5 | * Encode a string based on RFC 1738 6 | * @param string argument0 The string to encode 7 | * @return string 8 | */ 9 | //@todo - doesn't work over ord(255) (hex FF) characters... 10 | var char, i; 11 | var output = ""; 12 | for (i = 1; i <= string_length(argument0); i += 1) { 13 | char = string_char_at(argument0, i); 14 | if (string_pos(char, " {}[]|\\^`\"#%<>;/@$=:?&") > 0 || ord(char) > 126 && ord(char) < 255) { 15 | char = "%" + dectohex(ord(char)); 16 | } 17 | output += char; 18 | } 19 | return output; -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/string_starts_with/string_starts_with.gml: -------------------------------------------------------------------------------- 1 | /// @description string_starts_with(haystack, needle); 2 | /// @function string_starts_with 3 | /// @param haystack 4 | /// @param needle 5 | /** 6 | * Check if string starts with string 7 | * @param string argument0 haystack 8 | * @param string argument1 needle 9 | * @return boolean 10 | */ 11 | var sl0 = string_length(argument0); 12 | var sl1 = string_length(argument1); 13 | if (sl0+sl1 == 0) { return true; } 14 | if (argument0 == argument1) { return true; } 15 | if (sl0 == 0) { return false; } 16 | if (sl1 == 0) { return true; } 17 | if (sl1 > sl0) { return false; } 18 | 19 | return (string_copy(argument0, 1, sl1) == argument1); -------------------------------------------------------------------------------- /tests/projects/GMLProject/shaders/sh_passthrough/sh_passthrough.vsh: -------------------------------------------------------------------------------- 1 | // 2 | // Simple passthrough vertex shader 3 | // 4 | attribute vec3 in_Position; // (x,y,z) 5 | //attribute vec3 in_Normal; // (x,y,z) unused in this shader. 6 | attribute vec4 in_Colour; // (r,g,b,a) 7 | attribute vec2 in_TextureCoord; // (u,v) 8 | 9 | varying vec2 v_vTexcoord; 10 | varying vec4 v_vColour; 11 | 12 | void main() 13 | { 14 | vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0); 15 | gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos; 16 | 17 | v_vColour = in_Colour; 18 | v_vTexcoord = in_TextureCoord; 19 | } 20 | -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/string_ends_with/string_ends_with.gml: -------------------------------------------------------------------------------- 1 | /// @description string_ends_with(haystack, needle); 2 | /// @function string_ends_with 3 | /// @param haystack 4 | /// @param needle 5 | /** 6 | * Check if string ends with string 7 | * @param string argument0 haystack 8 | * @param string argument1 needle 9 | * @return boolean 10 | */ 11 | var sl0 = string_length(argument0); 12 | var sl1 = string_length(argument1); 13 | 14 | if (sl0+sl1 == 0) { return true; } 15 | if (argument0 == argument1) { return true; } 16 | if (sl1 == 0) { return true; } 17 | if (sl0 == 0) { return false; } 18 | if (sl1 > sl0) { return false; } //Quite sure. 19 | 20 | return (string_copy(argument0, sl0-sl1+1, sl1) == argument1); -------------------------------------------------------------------------------- /src/Command/HelpCommand.php: -------------------------------------------------------------------------------- 1 | setHelp(<<<'EOF' 13 | The %command.name% command displays help for a given command: 14 | 15 | %command.full_name% list 16 | 17 | You can also output the help in other formats by using the --format option: 18 | 19 | %command.full_name% --format=xml list 20 | 21 | To display the list of available commands, please use the list command. 22 | EOF 23 | ) 24 | ; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/test_assert_same/test_assert_same.gml: -------------------------------------------------------------------------------- 1 | ///@param expected 2 | ///@param actual 3 | ///@desc Run a unit test (has nothing to do with scripts. Just testing of the scripts). 4 | var expected = argument0; 5 | var given = argument1; 6 | global.testnumber++; 7 | 8 | show_debug_message("Testing #" + string(global.testnumber)); 9 | 10 | if (expected == given) { 11 | show_debug_message("OK"); 12 | global.testssucceeded++; 13 | return true; 14 | } else { 15 | global.testsuccess = false; 16 | show_debug_message(" FAIL!"); 17 | show_debug_message("Expected (+) Given (=)"); 18 | show_debug_message("+" + string(expected)); 19 | show_debug_message("=" + string(given)); 20 | return false; 21 | } -------------------------------------------------------------------------------- /tests/src/TestHelper.php: -------------------------------------------------------------------------------- 1 | initCommand(new HelpCommand()); 13 | } 14 | 15 | public function testExecute() 16 | { 17 | $command = $this->application->find('help'); 18 | $commandTester = new CommandTester($command); 19 | 20 | $commandTester->execute([ 21 | 'command' => $command->getName() 22 | ]); 23 | 24 | $output = $commandTester->getDisplay(); 25 | $this->assertStringContainsString('command displays help for a given command', $output); 26 | $this->assertStringNotContainsString(' php ', $output); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tests/src/Entity/CatalystEntityTest.php: -------------------------------------------------------------------------------- 1 | markTestSkipped(); 11 | return true; 12 | $subject = TestHelper::getTestCatalystEntity(); 13 | 14 | $this->assertSame(realpath('.'), $subject->path()); 15 | 16 | $this->assertSame('project/name', $subject->name()); 17 | $this->assertSame('A description for the project', $subject->description()); 18 | $this->assertSame('MIT', $subject->license()); 19 | $this->assertSame('https://github.com/my/repository', $subject->homepage()); 20 | $this->assertSame('somefile.yyp', $subject->yyp()); 21 | 22 | $this->assertSame([], $subject->require()); 23 | $this->assertSame([], $subject->repositories()); 24 | } 25 | } -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | tests 15 | 16 | 17 | 18 | 19 | 20 | src 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/objects/obj_test/obj_test.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "6f831bda-4962-431b-8eb2-c45c8bba950e", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "obj_test", 6 | "eventList": [ 7 | 8 | ], 9 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 10 | "overriddenProperties": null, 11 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 12 | "persistent": false, 13 | "physicsAngularDamping": 0.1, 14 | "physicsDensity": 0.5, 15 | "physicsFriction": 0.2, 16 | "physicsGroup": 0, 17 | "physicsKinematic": false, 18 | "physicsLinearDamping": 0.1, 19 | "physicsObject": false, 20 | "physicsRestitution": 0.1, 21 | "physicsSensor": false, 22 | "physicsShape": 1, 23 | "physicsShapePoints": null, 24 | "physicsStartAwake": true, 25 | "properties": null, 26 | "solid": false, 27 | "spriteId": "027bd1c0-6337-4c31-bd47-ce6ac0c36238", 28 | "visible": true 29 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/044962af-a181-1b1c-cbba-bcd8f9e3e061.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "044962af-a181-1b1c-cbba-bcd8f9e3e061", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "044962af-a181-1b1c-cbba-bcd8f9e3e061", 6 | "children": [ 7 | "f83411bf-0399-49ac-b2a2-e5b64094a60e", 8 | "5a91fe81-2c01-47f8-be11-c40932803e69", 9 | "b63484cb-ee59-44ed-b5de-332d5a5b17ea", 10 | "7c5af833-d15c-400f-ac4c-b169f2cd457b", 11 | "43223091-4066-4306-abe3-d34db8360e1c", 12 | "60d4a9eb-5df4-456e-8da4-788b4485eca3", 13 | "6c989c40-3f2d-4053-a43f-7c53c0927e2f", 14 | "0d4b292a-8a22-40f2-8ec8-bb44c8638cb9", 15 | "070a9150-886e-4734-857f-67d1d10c54d9", 16 | "16a094ef-d247-45e6-bfe3-2135c926f6cb", 17 | "3e6d6aa1-48d2-476e-9b40-4d45af977ab4" 18 | ], 19 | "filterType": "Script", 20 | "folderName": "stringfunctions", 21 | "isDefaultView": false, 22 | "localisedFolderName": "" 23 | } -------------------------------------------------------------------------------- /src/DependencyInjection/CompilerPass/CollectCommandsToApplicationCompilerPass.php: -------------------------------------------------------------------------------- 1 | getDefinition(Application::class); 15 | 16 | foreach ($containerBuilder->getDefinitions() as $name => $definition) { 17 | if (is_a($definition->getClass(), Command::class, true)) { 18 | $applicationDefinition->addMethodCall('add', [new Reference($name)]); 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/thisobjectshouldbegone/thisobjectshouldbegone.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "9e0a8f77-da97-42de-953f-a4c3fc786f9f", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "thisobjectshouldbegone", 6 | "eventList": [ 7 | 8 | ], 9 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 10 | "overriddenProperties": null, 11 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 12 | "persistent": false, 13 | "physicsAngularDamping": 0.1, 14 | "physicsDensity": 0.5, 15 | "physicsFriction": 0.2, 16 | "physicsGroup": 0, 17 | "physicsKinematic": false, 18 | "physicsLinearDamping": 0.1, 19 | "physicsObject": false, 20 | "physicsRestitution": 0.1, 21 | "physicsSensor": false, 22 | "physicsShape": 1, 23 | "physicsShapePoints": null, 24 | "physicsStartAwake": true, 25 | "properties": null, 26 | "solid": false, 27 | "spriteId": "00000000-0000-0000-0000-000000000000", 28 | "visible": true 29 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/obj_using_simple_project/obj_using_simple_project.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "6fd70c5a-55a8-4c35-842d-5e0cb43993d6", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "obj_using_simple_project", 6 | "eventList": [ 7 | 8 | ], 9 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 10 | "overriddenProperties": null, 11 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 12 | "persistent": false, 13 | "physicsAngularDamping": 0.1, 14 | "physicsDensity": 0.5, 15 | "physicsFriction": 0.2, 16 | "physicsGroup": 0, 17 | "physicsKinematic": false, 18 | "physicsLinearDamping": 0.1, 19 | "physicsObject": false, 20 | "physicsRestitution": 0.1, 21 | "physicsSensor": false, 22 | "physicsShape": 1, 23 | "physicsShapePoints": null, 24 | "physicsStartAwake": true, 25 | "properties": null, 26 | "solid": false, 27 | "spriteId": "00000000-0000-0000-0000-000000000000", 28 | "visible": true 29 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/testing_shouldbe_here_test/testing_shouldbe_here_test.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "49f54f46-7362-4647-8ca9-9208e0790e00", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "testing_shouldbe_here_test", 6 | "eventList": [ 7 | 8 | ], 9 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 10 | "overriddenProperties": null, 11 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 12 | "persistent": false, 13 | "physicsAngularDamping": 0.1, 14 | "physicsDensity": 0.5, 15 | "physicsFriction": 0.2, 16 | "physicsGroup": 0, 17 | "physicsKinematic": false, 18 | "physicsLinearDamping": 0.1, 19 | "physicsObject": false, 20 | "physicsRestitution": 0.1, 21 | "physicsSensor": false, 22 | "physicsShape": 1, 23 | "physicsShapePoints": null, 24 | "physicsStartAwake": true, 25 | "properties": null, 26 | "solid": false, 27 | "spriteId": "00000000-0000-0000-0000-000000000000", 28 | "visible": true 29 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/testing_shouldbe_gone_test2/testing_shouldbe_gone_test2.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "139d8ed0-90dd-4cce-a812-dcc8ae91bdb2", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "testing_shouldbe_gone_test2", 6 | "eventList": [ 7 | 8 | ], 9 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 10 | "overriddenProperties": null, 11 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 12 | "persistent": false, 13 | "physicsAngularDamping": 0.1, 14 | "physicsDensity": 0.5, 15 | "physicsFriction": 0.2, 16 | "physicsGroup": 0, 17 | "physicsKinematic": false, 18 | "physicsLinearDamping": 0.1, 19 | "physicsObject": false, 20 | "physicsRestitution": 0.1, 21 | "physicsSensor": false, 22 | "physicsShape": 1, 23 | "physicsShapePoints": null, 24 | "physicsStartAwake": true, 25 | "properties": null, 26 | "solid": false, 27 | "spriteId": "00000000-0000-0000-0000-000000000000", 28 | "visible": true 29 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/thisobjectshouldnotbegone_test3/thisobjectshouldnotbegone_test3.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "cc343efd-a931-4fb1-9960-3e4a10f728eb", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "thisobjectshouldnotbegone_test3", 6 | "eventList": [ 7 | 8 | ], 9 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 10 | "overriddenProperties": null, 11 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 12 | "persistent": false, 13 | "physicsAngularDamping": 0.1, 14 | "physicsDensity": 0.5, 15 | "physicsFriction": 0.2, 16 | "physicsGroup": 0, 17 | "physicsKinematic": false, 18 | "physicsLinearDamping": 0.1, 19 | "physicsObject": false, 20 | "physicsRestitution": 0.1, 21 | "physicsSensor": false, 22 | "physicsShape": 1, 23 | "physicsShapePoints": null, 24 | "physicsStartAwake": true, 25 | "properties": null, 26 | "solid": false, 27 | "spriteId": "00000000-0000-0000-0000-000000000000", 28 | "visible": true 29 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/scripts/string_explode/string_explode.gml: -------------------------------------------------------------------------------- 1 | /// @description string_explode(seperator, data); 2 | /// @function string_explode 3 | /// @param seperator 4 | /// @param data 5 | /** 6 | * Explode a string based on a key 7 | * @param string argument0 Seperator - Explode on what character(s) 8 | * @param string argument1 String to explode 9 | * @return array|null (Returns null if no seperator was found) 10 | */ 11 | var array, seperator, data, length; 12 | 13 | seperator = argument0; 14 | data = argument1; 15 | 16 | //Check if the seperator was found in the string. 17 | if (!string_count(seperator,data)) { 18 | array[0] = data; 19 | } else { 20 | length = string_length(seperator); 21 | i = 0; 22 | repeat (string_count(seperator,data)) { 23 | p = string_pos(seperator,data)-1; 24 | array[i] = string_copy(data,1,p); 25 | data = string_delete(data,1,p+length); 26 | i += 1; 27 | } 28 | array[i] = data; //Append final data to end 29 | } 30 | return array; 31 | -------------------------------------------------------------------------------- /src/Model/Uuid.php: -------------------------------------------------------------------------------- 1 | value = \Ramsey\Uuid\Uuid::fromString($value); 22 | } 23 | 24 | public function __toString(): string 25 | { 26 | return (string) $this->value; 27 | } 28 | 29 | public function jsonSerialize(): string 30 | { 31 | return (string) $this; 32 | } 33 | 34 | public function internalValue(): \Ramsey\Uuid\Uuid 35 | { 36 | return $this->value; 37 | } 38 | 39 | public function equals(Uuid $uuid):bool { 40 | return $this->value->equals($uuid->internalValue()); 41 | } 42 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 GameMakerHub 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tests/projects/GMLProject/views/e8f3e171-c9ef-4af7-9f68-151e2f5ba191.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "e8f3e171-c9ef-4af7-9f68-151e2f5ba191", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "e8f3e171-c9ef-4af7-9f68-151e2f5ba191", 6 | "children": [ 7 | "1980e77a-3df2-4b78-acdb-55b36295e218", 8 | "dcb3b9aa-efa0-4fc9-b29c-cd1a5e1d39ea", 9 | "c3314a25-3fa0-4251-bd84-390475eb2c27", 10 | "2c6daa16-0197-401d-bb95-207f2b2990e3", 11 | "0bb36c74-dc11-4a76-8ff5-0d89046b21bf", 12 | "c1ba437e-11e9-4da7-928b-a432fa73885c", 13 | "f4ec481c-9aee-4d6b-92eb-bf29130bac47", 14 | "98d50ca0-61c1-4538-9b7c-2a7c2ba66602", 15 | "ab958c18-ec8c-4be4-9684-62713fbc0cae", 16 | "5214ea11-2cc7-4e91-acd4-136b41310eef", 17 | "58d409a0-91fb-4c73-a851-274797e5000c", 18 | "b3b45f12-a0aa-47c3-8eaa-8396e6a8967d", 19 | "75e726a7-cf89-40a6-bfa5-64f058241ec7", 20 | "2ed040a7-59f4-4c9c-ad9b-001f105af88a", 21 | "dc2198bd-3230-42f1-ae22-4df860543f85" 22 | ], 23 | "filterType": "root", 24 | "folderName": "Default", 25 | "isDefaultView": true, 26 | "localisedFolderName": "" 27 | } -------------------------------------------------------------------------------- /tests/projects/OtherProject/views/94893bb6-4984-483b-9d8d-5a21df1483e3.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "94893bb6-4984-483b-9d8d-5a21df1483e3", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "94893bb6-4984-483b-9d8d-5a21df1483e3", 6 | "children": [ 7 | "a0578d58-5e16-480e-9122-0b63cfd2eb41", 8 | "35f4465f-a185-4d7b-85dd-6f265c4b4751", 9 | "7b7762a9-7c75-40a6-b161-1e203e869b69", 10 | "3313e2df-ca01-46f9-8cfd-517e06112e8d", 11 | "60857659-fb3d-4020-9265-c5cf5d7cb5f2", 12 | "2fc98116-4e16-4014-98ba-0dc73dee61d5", 13 | "6ecd5bab-50f7-48d5-b91b-da519300c634", 14 | "8374236d-0ffc-44ad-938f-0647ad835ca5", 15 | "08d87e74-32e9-44ea-87e8-36f76d214eed", 16 | "fd89cb67-7627-4450-bde9-03b21b1c940b", 17 | "93af89d6-828e-47c2-a1ba-45c67bebab37", 18 | "f5811685-7896-4f7a-b24a-9cd14b421568", 19 | "ee0fd327-783c-4b64-aa2c-f01fe661b5a1", 20 | "155ae852-d984-4d5e-b8de-ec6bcd1e8a87", 21 | "c31d0bbe-7836-49df-a8ce-a16ceff33973" 22 | ], 23 | "filterType": "root", 24 | "folderName": "Default", 25 | "isDefaultView": true, 26 | "localisedFolderName": "" 27 | } -------------------------------------------------------------------------------- /tests/projects/SimpleProject/views/94893bb6-4984-483b-9d8d-5a21df1483e3.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "94893bb6-4984-483b-9d8d-5a21df1483e3", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "94893bb6-4984-483b-9d8d-5a21df1483e3", 6 | "children": [ 7 | "a0578d58-5e16-480e-9122-0b63cfd2eb41", 8 | "35f4465f-a185-4d7b-85dd-6f265c4b4751", 9 | "7b7762a9-7c75-40a6-b161-1e203e869b69", 10 | "3313e2df-ca01-46f9-8cfd-517e06112e8d", 11 | "60857659-fb3d-4020-9265-c5cf5d7cb5f2", 12 | "2fc98116-4e16-4014-98ba-0dc73dee61d5", 13 | "6ecd5bab-50f7-48d5-b91b-da519300c634", 14 | "8374236d-0ffc-44ad-938f-0647ad835ca5", 15 | "08d87e74-32e9-44ea-87e8-36f76d214eed", 16 | "fd89cb67-7627-4450-bde9-03b21b1c940b", 17 | "93af89d6-828e-47c2-a1ba-45c67bebab37", 18 | "f5811685-7896-4f7a-b24a-9cd14b421568", 19 | "ee0fd327-783c-4b64-aa2c-f01fe661b5a1", 20 | "155ae852-d984-4d5e-b8de-ec6bcd1e8a87", 21 | "c31d0bbe-7836-49df-a8ce-a16ceff33973" 22 | ], 23 | "filterType": "root", 24 | "folderName": "Default", 25 | "isDefaultView": true, 26 | "localisedFolderName": "" 27 | } -------------------------------------------------------------------------------- /tests/mocks/projects/20_IgnorableFiles/views/4f95d0b1-21de-4c79-95e6-c6d42fa11ba2.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "4f95d0b1-21de-4c79-95e6-c6d42fa11ba2", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "4f95d0b1-21de-4c79-95e6-c6d42fa11ba2", 6 | "children": [ 7 | "407dcbed-d554-40f8-85af-eead7752aeb4", 8 | "878df58d-a95c-4aaa-ae30-69a4cc33ad75", 9 | "0308bfe6-e741-4462-a822-b51973aaf568", 10 | "a4cafe4b-ddd8-4cf9-9b98-49363c222b53", 11 | "02c768e4-f6b6-48b4-a2e4-98b847481b97", 12 | "2eba1da1-802b-4ca3-94a3-9e3e28bddf5c", 13 | "1661de33-c10c-47d4-8563-e9e6796ab2ae", 14 | "80a02540-d0a1-41f2-a644-47cd8c8ee0a5", 15 | "1f697a03-bb14-404b-9364-2aa049382c15", 16 | "dc0b760b-c9f3-440a-971e-e4c2a683c395", 17 | "4e2e3fde-6384-460f-87b7-66e6e85c8fe4", 18 | "454e7cf0-c931-47fe-a2ad-d08fa830bd21", 19 | "69c57755-590b-466f-8faa-c1a7012243a4", 20 | "2a8652aa-30b7-45f6-bda2-82bf8fc8a54d", 21 | "e9b2c9b8-7a80-4238-b305-1b78ce69d927" 22 | ], 23 | "filterType": "root", 24 | "folderName": "Default", 25 | "isDefaultView": true, 26 | "localisedFolderName": "" 27 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/views/1a99a9b8-fbb2-4a16-9537-a6272875a373.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "1a99a9b8-fbb2-4a16-9537-a6272875a373", 3 | "modelName": "GMFolder", 4 | "mvc": "1.1", 5 | "name": "1a99a9b8-fbb2-4a16-9537-a6272875a373", 6 | "children": [ 7 | "be569bd8-e7f1-49c5-9cbf-d6c735c774e2", 8 | "479594f0-6da0-46fc-b0a0-97616daa4418", 9 | "2f9b3f7b-9b45-4290-b15f-f0dc4d5ac60d", 10 | "8f4db28c-0f1f-49ba-ae88-4cb90aede7f4", 11 | "f3c2bf76-84d6-4fa4-80c4-8c8882dec302", 12 | "33af6a91-194b-45c3-9783-97215e43a166", 13 | "8c78d3d6-d356-45e9-b6a4-59c2dc18999e", 14 | "efeeaba1-bf8b-4494-9b6f-c02af20fa2ed", 15 | "16eb5455-9985-4392-bba7-fada383da40d", 16 | "c448d3d6-759b-4896-8e64-381f8bf22430", 17 | "026561d7-8e33-44e9-893c-9590e5254bfc", 18 | "38c881ae-10eb-4b96-bd4b-b20aa7094996", 19 | "df4293b2-a9c5-4173-8aa5-42d84930d8f5", 20 | "bf289c15-a08c-49cb-a473-506dcff64a02", 21 | "c068ca74-7c47-456c-b103-02f4c25ddb83" 22 | ], 23 | "filterType": "root", 24 | "folderName": "Default", 25 | "isDefaultView": true, 26 | "localisedFolderName": "" 27 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/options/linux/options_linux.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "a9188620-a624-4a5a-83ae-a1b53faf038b", 3 | "modelName": "GMLinuxOptions", 4 | "mvc": "1.0", 5 | "name": "Linux", 6 | "option_linux_allow_fullscreen": false, 7 | "option_linux_display_cursor": true, 8 | "option_linux_display_name": "Made in GameMaker Studio 2", 9 | "option_linux_display_splash": false, 10 | "option_linux_enable_steam": false, 11 | "option_linux_homepage": "http:\/\/www.yoyogames.com", 12 | "option_linux_icon": "${base_options_dir}\/linux\/icons\/64.png", 13 | "option_linux_interpolate_pixels": false, 14 | "option_linux_long_desc": "", 15 | "option_linux_maintainer_email": "", 16 | "option_linux_resize_window": false, 17 | "option_linux_scale": 0, 18 | "option_linux_short_desc": "", 19 | "option_linux_splash_screen": "${base_options_dir}\/linux\/splash\/splash.png", 20 | "option_linux_start_fullscreen": false, 21 | "option_linux_sync": false, 22 | "option_linux_texture_page": "2048x2048", 23 | "option_linux_version": { 24 | "build": 0, 25 | "major": 1, 26 | "minor": 0, 27 | "revision": 0 28 | } 29 | } -------------------------------------------------------------------------------- /tests/projects/OtherProject/options/linux/options_linux.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "a9188620-a624-4a5a-83ae-a1b53faf038b", 3 | "modelName": "GMLinuxOptions", 4 | "mvc": "1.0", 5 | "name": "Linux", 6 | "option_linux_allow_fullscreen": false, 7 | "option_linux_display_cursor": true, 8 | "option_linux_display_name": "Made in GameMaker Studio 2", 9 | "option_linux_display_splash": false, 10 | "option_linux_enable_steam": false, 11 | "option_linux_homepage": "http:\/\/www.yoyogames.com", 12 | "option_linux_icon": "${base_options_dir}\/linux\/icons\/64.png", 13 | "option_linux_interpolate_pixels": false, 14 | "option_linux_long_desc": "", 15 | "option_linux_maintainer_email": "", 16 | "option_linux_resize_window": false, 17 | "option_linux_scale": 0, 18 | "option_linux_short_desc": "", 19 | "option_linux_splash_screen": "${base_options_dir}\/linux\/splash\/splash.png", 20 | "option_linux_start_fullscreen": false, 21 | "option_linux_sync": false, 22 | "option_linux_texture_page": "2048x2048", 23 | "option_linux_version": { 24 | "build": 0, 25 | "major": 1, 26 | "minor": 0, 27 | "revision": 0 28 | } 29 | } -------------------------------------------------------------------------------- /tests/projects/SimpleProject/options/linux/options_linux.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "a9188620-a624-4a5a-83ae-a1b53faf038b", 3 | "modelName": "GMLinuxOptions", 4 | "mvc": "1.0", 5 | "name": "Linux", 6 | "option_linux_allow_fullscreen": false, 7 | "option_linux_display_cursor": true, 8 | "option_linux_display_name": "Made in GameMaker Studio 2", 9 | "option_linux_display_splash": false, 10 | "option_linux_enable_steam": false, 11 | "option_linux_homepage": "http:\/\/www.yoyogames.com", 12 | "option_linux_icon": "${base_options_dir}\/linux\/icons\/64.png", 13 | "option_linux_interpolate_pixels": false, 14 | "option_linux_long_desc": "", 15 | "option_linux_maintainer_email": "", 16 | "option_linux_resize_window": false, 17 | "option_linux_scale": 0, 18 | "option_linux_short_desc": "", 19 | "option_linux_splash_screen": "${base_options_dir}\/linux\/splash\/splash.png", 20 | "option_linux_start_fullscreen": false, 21 | "option_linux_sync": false, 22 | "option_linux_texture_page": "2048x2048", 23 | "option_linux_version": { 24 | "build": 0, 25 | "major": 1, 26 | "minor": 0, 27 | "revision": 0 28 | } 29 | } -------------------------------------------------------------------------------- /tests/mocks/projects/20_IgnorableFiles/options/linux/options_linux.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "a9188620-a624-4a5a-83ae-a1b53faf038b", 3 | "modelName": "GMLinuxOptions", 4 | "mvc": "1.0", 5 | "name": "Linux", 6 | "option_linux_allow_fullscreen": false, 7 | "option_linux_disable_sandbox": false, 8 | "option_linux_display_cursor": true, 9 | "option_linux_display_name": "Made in GameMaker Studio 2", 10 | "option_linux_display_splash": false, 11 | "option_linux_enable_steam": false, 12 | "option_linux_homepage": "http:\/\/www.yoyogames.com", 13 | "option_linux_icon": "${base_options_dir}\/linux\/icons\/64.png", 14 | "option_linux_interpolate_pixels": false, 15 | "option_linux_long_desc": "", 16 | "option_linux_maintainer_email": "", 17 | "option_linux_resize_window": false, 18 | "option_linux_scale": 0, 19 | "option_linux_short_desc": "", 20 | "option_linux_splash_screen": "${base_options_dir}\/linux\/splash\/splash.png", 21 | "option_linux_start_fullscreen": false, 22 | "option_linux_sync": false, 23 | "option_linux_texture_page": "2048x2048", 24 | "option_linux_version": { 25 | "build": 0, 26 | "major": 1, 27 | "minor": 0, 28 | "revision": 0 29 | } 30 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/options/linux/options_linux.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "a9188620-a624-4a5a-83ae-a1b53faf038b", 3 | "modelName": "GMLinuxOptions", 4 | "mvc": "1.0", 5 | "name": "Linux", 6 | "option_linux_allow_fullscreen": false, 7 | "option_linux_disable_sandbox": false, 8 | "option_linux_display_cursor": true, 9 | "option_linux_display_name": "Made in GameMaker Studio 2", 10 | "option_linux_display_splash": false, 11 | "option_linux_enable_steam": false, 12 | "option_linux_homepage": "http:\/\/www.yoyogames.com", 13 | "option_linux_icon": "${base_options_dir}\/linux\/icons\/64.png", 14 | "option_linux_interpolate_pixels": false, 15 | "option_linux_long_desc": "", 16 | "option_linux_maintainer_email": "", 17 | "option_linux_resize_window": false, 18 | "option_linux_scale": 0, 19 | "option_linux_short_desc": "", 20 | "option_linux_splash_screen": "${base_options_dir}\/linux\/splash\/splash.png", 21 | "option_linux_start_fullscreen": false, 22 | "option_linux_sync": false, 23 | "option_linux_texture_page": "2048x2048", 24 | "option_linux_version": { 25 | "build": 0, 26 | "major": 1, 27 | "minor": 0, 28 | "revision": 0 29 | } 30 | } -------------------------------------------------------------------------------- /src/Service/CatalystService.php: -------------------------------------------------------------------------------- 1 | persist(); 12 | } 13 | 14 | public function createNew( 15 | string $name, 16 | string $description, 17 | string $license, 18 | string $homepage, 19 | string $yyp 20 | ) : CatalystEntity { 21 | $entity = CatalystEntity::createNew( 22 | '.', $name, $description, $license, $homepage, $yyp 23 | ); 24 | 25 | StorageService::getInstance()->saveEntity($entity); 26 | return $entity; 27 | } 28 | 29 | public function load(string $path = null, $ignoreMissing = false) : CatalystEntity 30 | { 31 | if (null === $path) { 32 | $path = realpath('.'); 33 | } 34 | $entity = CatalystEntity::createFromPath($path, $ignoreMissing); 35 | return $entity; 36 | } 37 | 38 | public function existsHere() : bool 39 | { 40 | return $this->existsAt('.'); 41 | } 42 | 43 | public function existsAt(string $path) : bool 44 | { 45 | return StorageService::getInstance()->fileExists($path . '/catalyst.json'); 46 | } 47 | } -------------------------------------------------------------------------------- /src/Kernel.php: -------------------------------------------------------------------------------- 1 | load(__DIR__ . '/../config/services.yml'); 26 | //$loader->load(__DIR__ . '/../config/services.php'); //@todo, so we can remove YAML + yaml parser 27 | } 28 | 29 | public function getCacheDir() 30 | { 31 | return sys_get_temp_dir().'/gmh_catalyst/cache'; 32 | } 33 | 34 | public function getLogDir() 35 | { 36 | return sys_get_temp_dir().'/gmh_catalyst/log'; 37 | } 38 | 39 | protected function build(ContainerBuilder $containerBuilder): void 40 | { 41 | $containerBuilder->addCompilerPass(new CollectCommandsToApplicationCompilerPass); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/test_object1/test_object1.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "b9f7dc62-7c1b-4e68-b58d-8a2a4470e4be", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "test_object1", 6 | "eventList": [ 7 | { 8 | "id": "90a0d7d0-f7c1-4307-828a-ee150af454be", 9 | "modelName": "GMEvent", 10 | "mvc": "1.0", 11 | "IsDnD": false, 12 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 13 | "enumb": 0, 14 | "eventtype": 3, 15 | "m_owner": "b9f7dc62-7c1b-4e68-b58d-8a2a4470e4be" 16 | } 17 | ], 18 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 19 | "overriddenProperties": null, 20 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 21 | "persistent": false, 22 | "physicsAngularDamping": 0.1, 23 | "physicsDensity": 0.5, 24 | "physicsFriction": 0.2, 25 | "physicsGroup": 0, 26 | "physicsKinematic": false, 27 | "physicsLinearDamping": 0.1, 28 | "physicsObject": false, 29 | "physicsRestitution": 0.1, 30 | "physicsSensor": false, 31 | "physicsShape": 1, 32 | "physicsShapePoints": null, 33 | "physicsStartAwake": true, 34 | "properties": null, 35 | "solid": false, 36 | "spriteId": "00000000-0000-0000-0000-000000000000", 37 | "visible": true 38 | } -------------------------------------------------------------------------------- /tests/projects/SimpleProject/objects/obj_simple_test/obj_simple_test.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "5ebd0507-54c7-4a11-9bbe-0d3fe2b57d85", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "obj_simple_test", 6 | "eventList": [ 7 | { 8 | "id": "84791f78-8ab7-44ee-99db-76cfc336e82e", 9 | "modelName": "GMEvent", 10 | "mvc": "1.0", 11 | "IsDnD": false, 12 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 13 | "enumb": 0, 14 | "eventtype": 3, 15 | "m_owner": "5ebd0507-54c7-4a11-9bbe-0d3fe2b57d85" 16 | } 17 | ], 18 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 19 | "overriddenProperties": null, 20 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 21 | "persistent": false, 22 | "physicsAngularDamping": 0.1, 23 | "physicsDensity": 0.5, 24 | "physicsFriction": 0.2, 25 | "physicsGroup": 0, 26 | "physicsKinematic": false, 27 | "physicsLinearDamping": 0.1, 28 | "physicsObject": false, 29 | "physicsRestitution": 0.1, 30 | "physicsSensor": false, 31 | "physicsShape": 1, 32 | "physicsShapePoints": null, 33 | "physicsStartAwake": true, 34 | "properties": null, 35 | "solid": false, 36 | "spriteId": "2c06e728-9bcc-48ab-bbe4-82c08afddf60", 37 | "visible": true 38 | } -------------------------------------------------------------------------------- /files/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | ; required settings for Catalyst 3 | 4 | engine = On 5 | short_open_tag = Off 6 | precision = 14 7 | output_buffering = 4096 8 | zlib.output_compression = Off 9 | implicit_flush = Off 10 | unserialize_callback_func = 11 | serialize_precision = -1 12 | zend.enable_gc = On 13 | expose_php = On 14 | 15 | max_execution_time = 30 16 | max_input_time = 60 17 | memory_limit = 128M 18 | error_reporting = E_ALL 19 | display_errors = On 20 | display_startup_errors = On 21 | log_errors = On 22 | log_errors_max_len = 1024 23 | ignore_repeated_errors = Off 24 | ignore_repeated_source = Off 25 | report_memleaks = On 26 | 27 | html_errors = On 28 | variables_order = "GPCS" 29 | request_order = "GP" 30 | register_argc_argv = Off 31 | auto_globals_jit = On 32 | 33 | post_max_size = 8M 34 | default_mimetype = "text/html" 35 | default_charset = "UTF-8" 36 | extension_dir = "${PHPDIR}\ext" 37 | enable_dl = Off 38 | 39 | file_uploads = On 40 | upload_max_filesize = 2M 41 | max_file_uploads = 20 42 | 43 | allow_url_fopen = On 44 | allow_url_include = Off 45 | default_socket_timeout = 60 46 | 47 | 48 | extension=php_mbstring.dll 49 | extension=php_curl.dll 50 | extension=php_openssl.dll 51 | extension=php_sockets.dll 52 | 53 | 54 | [CLI Server] 55 | cli_server.color = On 56 | 57 | [Assertion] 58 | zend.assertions = 1 59 | 60 | [openssl] 61 | openssl.cafile="${PHPDIR}\cacert.pem" 62 | openssl.capath="${PHPDIR}\ext" -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/objects/ExtendedFunctions_obj_test/ExtendedFunctions_obj_test.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "9f6ee3b0-f949-4238-a860-52e0261760eb", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "ExtendedFunctions_obj_test", 6 | "eventList": [ 7 | { 8 | "id": "d6607564-c6ba-4301-a0e3-9964ad9fb8c7", 9 | "modelName": "GMEvent", 10 | "mvc": "1.0", 11 | "IsDnD": false, 12 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 13 | "enumb": 0, 14 | "eventtype": 0, 15 | "m_owner": "9f6ee3b0-f949-4238-a860-52e0261760eb" 16 | } 17 | ], 18 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 19 | "overriddenProperties": null, 20 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 21 | "persistent": false, 22 | "physicsAngularDamping": 0.1, 23 | "physicsDensity": 0.5, 24 | "physicsFriction": 0.2, 25 | "physicsGroup": 0, 26 | "physicsKinematic": false, 27 | "physicsLinearDamping": 0.1, 28 | "physicsObject": false, 29 | "physicsRestitution": 0.1, 30 | "physicsSensor": false, 31 | "physicsShape": 0, 32 | "physicsShapePoints": [ 33 | 34 | ], 35 | "physicsStartAwake": true, 36 | "properties": null, 37 | "solid": false, 38 | "spriteId": "00000000-0000-0000-0000-000000000000", 39 | "visible": true 40 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gamemakerhub/catalyst", 3 | "description": "A tool for Game Maker Studio 2 to manage dependencies and speed up your process", 4 | "type": "project", 5 | "config": { 6 | "platform": { 7 | "php": "7.2" 8 | } 9 | }, 10 | "require": { 11 | "php": "^7.2", 12 | "ext-ctype": "*", 13 | "ext-iconv": "*", 14 | "symfony/console": "^4.2", 15 | "beberlei/assert": "^3.2", 16 | "guzzlehttp/guzzle": "^6.3", 17 | "composer/semver": "^1.5", 18 | "ramsey/uuid": "^3.8", 19 | "symfony/dependency-injection": "^4.2", 20 | "symfony/config": "^4.2", 21 | "symfony/yaml": "^4.2", 22 | "symfony/process": "^4.2", 23 | "symfony/http-kernel": "^4.2", 24 | "ext-json": "*" 25 | }, 26 | "license": "MIT", 27 | "authors": [ 28 | { 29 | "name": "RobQuistNL", 30 | "email": "rob.quist@dukesoft.nl" 31 | } 32 | ], 33 | "autoload": { 34 | "psr-4": { 35 | "Catalyst\\": "src/" 36 | } 37 | }, 38 | "autoload-dev": { 39 | "psr-4": { 40 | "Catalyst\\Tests\\": "tests/src/" 41 | } 42 | }, 43 | "minimum-stability": "stable", 44 | "require-dev": { 45 | "phpunit/phpunit": "^8.0", 46 | "mockery/mockery": "^1.0", 47 | "symfony/phpunit-bridge": "^4.2" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /tests/src/Model/UuidTest.php: -------------------------------------------------------------------------------- 1 | assertEquals( 13 | Uuid::createFromString($this->randomUuid), 14 | Uuid::createFromString($this->randomUuid) 15 | ); 16 | } 17 | 18 | public function testEquals() 19 | { 20 | $this->assertTrue( 21 | Uuid::createFromString($this->randomUuid)->equals( 22 | Uuid::createFromString($this->randomUuid) 23 | ) 24 | ); 25 | } 26 | 27 | public function testCreateRandom() 28 | { 29 | $this->assertNotSame( 30 | Uuid::createRandom(), 31 | Uuid::createRandom() 32 | ); 33 | 34 | $this->assertNotSame( 35 | (string) Uuid::createRandom(), 36 | (string) Uuid::createRandom() 37 | ); 38 | } 39 | 40 | public function testJsonSerialize() 41 | { 42 | $this->assertSame($this->randomUuid, Uuid::createFromString($this->randomUuid)->jsonSerialize()); 43 | } 44 | 45 | public function testInternalValue() 46 | { 47 | $this->assertEquals(\Ramsey\Uuid\Uuid::fromString($this->randomUuid), Uuid::createFromString($this->randomUuid)->internalValue()); 48 | } 49 | } -------------------------------------------------------------------------------- /src/Model/YoYo/Resource/GM/GMFolder.php: -------------------------------------------------------------------------------- 1 | id = (string) $uuid; 26 | $yyFile->modelName = 'GMFolder'; 27 | $yyFile->mvc = '1.1'; 28 | $yyFile->name = (string) $uuid; 29 | $yyFile->children = []; 30 | $yyFile->filterType = $forType; 31 | $yyFile->folderName = basename($fullPath); 32 | $yyFile->isDefaultView = false; 33 | $yyFile->localisedFolderName = ''; 34 | 35 | StorageService::getInstance()->writeYYFile($filePath, $yyFile); 36 | 37 | return self::createFromFile($filePath); 38 | } 39 | 40 | public function setFullName($fullName) 41 | { 42 | $this->_fullName = $fullName; 43 | } 44 | 45 | public function getFullName() 46 | { 47 | return $this->_fullName; 48 | } 49 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/objects/ExtendedFunctions_obj_near_instance/ExtendedFunctions_obj_near_instance.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "68eaaff9-b1cb-4134-bdac-0ace16037b41", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "ExtendedFunctions_obj_near_instance", 6 | "eventList": [ 7 | { 8 | "id": "17f1e7e7-1ddc-428c-93fd-7b92e488aa42", 9 | "modelName": "GMEvent", 10 | "mvc": "1.0", 11 | "IsDnD": false, 12 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 13 | "enumb": 0, 14 | "eventtype": 8, 15 | "m_owner": "68eaaff9-b1cb-4134-bdac-0ace16037b41" 16 | } 17 | ], 18 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 19 | "overriddenProperties": null, 20 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 21 | "persistent": false, 22 | "physicsAngularDamping": 0.1, 23 | "physicsDensity": 0.5, 24 | "physicsFriction": 0.2, 25 | "physicsGroup": 0, 26 | "physicsKinematic": false, 27 | "physicsLinearDamping": 0.1, 28 | "physicsObject": false, 29 | "physicsRestitution": 0.1, 30 | "physicsSensor": false, 31 | "physicsShape": 0, 32 | "physicsShapePoints": [ 33 | 34 | ], 35 | "physicsStartAwake": true, 36 | "properties": null, 37 | "solid": false, 38 | "spriteId": "00000000-0000-0000-0000-000000000000", 39 | "visible": true 40 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/options/mac/options_mac.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "f418569b-3bdd-4706-a0e4-364317f54032", 3 | "modelName": "GMMacOptions", 4 | "mvc": "1.0", 5 | "name": "macOS", 6 | "option_mac_allow_fullscreen": false, 7 | "option_mac_allow_incoming_network": false, 8 | "option_mac_allow_outgoing_network": false, 9 | "option_mac_app_category": "Games", 10 | "option_mac_app_id": "com.company.game", 11 | "option_mac_build_app_store": false, 12 | "option_mac_copyright": "(c) 2018 CompanyName", 13 | "option_mac_display_cursor": true, 14 | "option_mac_display_name": "Made in GameMaker Studio 2", 15 | "option_mac_enable_retina": false, 16 | "option_mac_enable_steam": false, 17 | "option_mac_icon_png": "${base_options_dir}\/mac\/icons\/1024.png", 18 | "option_mac_interpolate_pixels": false, 19 | "option_mac_menu_dock": false, 20 | "option_mac_output_dir": "~\/GameMakerStudio2\/Mac", 21 | "option_mac_resize_window": false, 22 | "option_mac_scale": 0, 23 | "option_mac_signing_identity": "Developer ID Application:", 24 | "option_mac_splash_png": "${base_options_dir}\/mac\/splash\/splash.png", 25 | "option_mac_start_fullscreen": false, 26 | "option_mac_team_id": null, 27 | "option_mac_texture_page": "2048x2048", 28 | "option_mac_version": { 29 | "build": 0, 30 | "major": 1, 31 | "minor": 0, 32 | "revision": 0 33 | }, 34 | "option_mac_vsync": false 35 | } -------------------------------------------------------------------------------- /tests/projects/OtherProject/options/mac/options_mac.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "f418569b-3bdd-4706-a0e4-364317f54032", 3 | "modelName": "GMMacOptions", 4 | "mvc": "1.0", 5 | "name": "macOS", 6 | "option_mac_allow_fullscreen": false, 7 | "option_mac_allow_incoming_network": false, 8 | "option_mac_allow_outgoing_network": false, 9 | "option_mac_app_category": "Games", 10 | "option_mac_app_id": "com.company.game", 11 | "option_mac_build_app_store": false, 12 | "option_mac_copyright": "(c) 2018 CompanyName", 13 | "option_mac_display_cursor": true, 14 | "option_mac_display_name": "Made in GameMaker Studio 2", 15 | "option_mac_enable_retina": false, 16 | "option_mac_enable_steam": false, 17 | "option_mac_icon_png": "${base_options_dir}\/mac\/icons\/1024.png", 18 | "option_mac_interpolate_pixels": false, 19 | "option_mac_menu_dock": false, 20 | "option_mac_output_dir": "~\/GameMakerStudio2\/Mac", 21 | "option_mac_resize_window": false, 22 | "option_mac_scale": 0, 23 | "option_mac_signing_identity": "Developer ID Application:", 24 | "option_mac_splash_png": "${base_options_dir}\/mac\/splash\/splash.png", 25 | "option_mac_start_fullscreen": false, 26 | "option_mac_team_id": null, 27 | "option_mac_texture_page": "2048x2048", 28 | "option_mac_version": { 29 | "build": 0, 30 | "major": 1, 31 | "minor": 0, 32 | "revision": 0 33 | }, 34 | "option_mac_vsync": false 35 | } -------------------------------------------------------------------------------- /tests/projects/SimpleProject/options/mac/options_mac.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "f418569b-3bdd-4706-a0e4-364317f54032", 3 | "modelName": "GMMacOptions", 4 | "mvc": "1.0", 5 | "name": "macOS", 6 | "option_mac_allow_fullscreen": false, 7 | "option_mac_allow_incoming_network": false, 8 | "option_mac_allow_outgoing_network": false, 9 | "option_mac_app_category": "Games", 10 | "option_mac_app_id": "com.company.game", 11 | "option_mac_build_app_store": false, 12 | "option_mac_copyright": "(c) 2018 CompanyName", 13 | "option_mac_display_cursor": true, 14 | "option_mac_display_name": "Made in GameMaker Studio 2", 15 | "option_mac_enable_retina": false, 16 | "option_mac_enable_steam": false, 17 | "option_mac_icon_png": "${base_options_dir}\/mac\/icons\/1024.png", 18 | "option_mac_interpolate_pixels": false, 19 | "option_mac_menu_dock": false, 20 | "option_mac_output_dir": "~\/GameMakerStudio2\/Mac", 21 | "option_mac_resize_window": false, 22 | "option_mac_scale": 0, 23 | "option_mac_signing_identity": "Developer ID Application:", 24 | "option_mac_splash_png": "${base_options_dir}\/mac\/splash\/splash.png", 25 | "option_mac_start_fullscreen": false, 26 | "option_mac_team_id": null, 27 | "option_mac_texture_page": "2048x2048", 28 | "option_mac_version": { 29 | "build": 0, 30 | "major": 1, 31 | "minor": 0, 32 | "revision": 0 33 | }, 34 | "option_mac_vsync": false 35 | } -------------------------------------------------------------------------------- /src/Command/ClearCacheCommand.php: -------------------------------------------------------------------------------- 1 | setDescription('Clear all cache files that Catalyst generated') 18 | ->setHelp('Clear all cache files that Catalyst generated. This includes cached and downloaded packages!'); 19 | } 20 | 21 | protected function execute(InputInterface $input, OutputInterface $output): int 22 | { 23 | //@todo do a double check with the user? 24 | $output->writeln('Clearing cache at ' . $GLOBALS['SYMFONY_KERNEL']->getCacheDir() . ''); 25 | $this->rrmdir($GLOBALS['SYMFONY_KERNEL']->getCacheDir()); 26 | 27 | return 0; 28 | } 29 | 30 | private function rrmdir($path) { 31 | // @todo make this work with persist as well 32 | $i = new \DirectoryIterator($path); 33 | foreach($i as $f) { 34 | if($f->isFile()) { 35 | unlink($f->getRealPath()); 36 | } else if(!$f->isDot() && $f->isDir()) { 37 | $this->rrmdir($f->getRealPath()); 38 | } 39 | } 40 | rmdir($path); 41 | } 42 | 43 | } -------------------------------------------------------------------------------- /tests/src/Command/InitCommandTest.php: -------------------------------------------------------------------------------- 1 | application = new Application(); 18 | 19 | //$this->application->add(new InitCommand(new CatalystService())); 20 | } 21 | 22 | public function testExecute() 23 | { 24 | $this->assertTrue(true); 25 | $this->markTestIncomplete('Todo'); 26 | return true; 27 | $command = $this->application->find('init'); 28 | $commandTester = new CommandTester($command); 29 | 30 | $commandTester->setInputs([ 31 | 'test/test', 32 | 'description', 33 | 0, 34 | 'http://www.dukesoft.nl/', 35 | __DIR__ . '/../../projects/GMLProject/GMLProject.yyp' 36 | ]); 37 | 38 | $commandTester->execute([ 39 | 'command' => $command->getName() 40 | ]); 41 | 42 | $output = $commandTester->getDisplay(); 43 | $this->assertStringContainsString('Catalyst file initialized', $output); 44 | 45 | //@todo 46 | //unlink('catalyst.json'); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /tests/projects/GMLProject/timelines/tl_one/tl_one.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "dcd740e7-91f4-4b74-89cb-8c77d91dae56", 3 | "modelName": "GMTimeline", 4 | "mvc": "1.0", 5 | "name": "tl_one", 6 | "momentList": [ 7 | { 8 | "id": "59466e4c-831f-4f51-8790-5087bb8a66c7", 9 | "modelName": "GMMoment", 10 | "mvc": "1.0", 11 | "name": "", 12 | "evnt": { 13 | "id": "28393fc1-96fe-4a23-8e6d-e82ba9e013c0", 14 | "modelName": "GMEvent", 15 | "mvc": "1.0", 16 | "IsDnD": false, 17 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 18 | "enumb": 0, 19 | "eventtype": 0, 20 | "m_owner": "dcd740e7-91f4-4b74-89cb-8c77d91dae56" 21 | }, 22 | "moment": 0 23 | }, 24 | { 25 | "id": "3ab607da-b7e5-4edc-9649-0e10669be623", 26 | "modelName": "GMMoment", 27 | "mvc": "1.0", 28 | "name": "", 29 | "evnt": { 30 | "id": "76047097-beea-4cae-a029-f63049f35330", 31 | "modelName": "GMEvent", 32 | "mvc": "1.0", 33 | "IsDnD": false, 34 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 35 | "enumb": 30, 36 | "eventtype": 0, 37 | "m_owner": "dcd740e7-91f4-4b74-89cb-8c77d91dae56" 38 | }, 39 | "moment": 30 40 | } 41 | ] 42 | } -------------------------------------------------------------------------------- /tests/mocks/projects/20_IgnorableFiles/options/mac/options_mac.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "f418569b-3bdd-4706-a0e4-364317f54032", 3 | "modelName": "GMMacOptions", 4 | "mvc": "1.0", 5 | "name": "macOS", 6 | "option_mac_allow_fullscreen": false, 7 | "option_mac_allow_incoming_network": false, 8 | "option_mac_allow_outgoing_network": false, 9 | "option_mac_app_category": "Games", 10 | "option_mac_app_id": "com.company.game", 11 | "option_mac_apple_sign_in": false, 12 | "option_mac_build_app_store": false, 13 | "option_mac_copyright": "(c) 2018 CompanyName", 14 | "option_mac_disable_sandbox": false, 15 | "option_mac_display_cursor": true, 16 | "option_mac_display_name": "Made in GameMaker Studio 2", 17 | "option_mac_enable_retina": false, 18 | "option_mac_enable_steam": false, 19 | "option_mac_icon_png": "${base_options_dir}\/mac\/icons\/1024.png", 20 | "option_mac_interpolate_pixels": false, 21 | "option_mac_menu_dock": false, 22 | "option_mac_output_dir": "~\/GameMakerStudio2\/Mac", 23 | "option_mac_resize_window": false, 24 | "option_mac_scale": 0, 25 | "option_mac_signing_identity": "Developer ID Application:", 26 | "option_mac_splash_png": "${base_options_dir}\/mac\/splash\/splash.png", 27 | "option_mac_start_fullscreen": false, 28 | "option_mac_team_id": null, 29 | "option_mac_texture_page": "2048x2048", 30 | "option_mac_version": { 31 | "build": 0, 32 | "major": 1, 33 | "minor": 0, 34 | "revision": 0 35 | }, 36 | "option_mac_vsync": false 37 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/options/mac/options_mac.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "f418569b-3bdd-4706-a0e4-364317f54032", 3 | "modelName": "GMMacOptions", 4 | "mvc": "1.0", 5 | "name": "macOS", 6 | "option_mac_allow_fullscreen": false, 7 | "option_mac_allow_incoming_network": false, 8 | "option_mac_allow_outgoing_network": false, 9 | "option_mac_app_category": "Games", 10 | "option_mac_app_id": "com.company.game", 11 | "option_mac_apple_sign_in": false, 12 | "option_mac_build_app_store": false, 13 | "option_mac_copyright": "(c) 2018 CompanyName", 14 | "option_mac_disable_sandbox": false, 15 | "option_mac_display_cursor": true, 16 | "option_mac_display_name": "Made in GameMaker Studio 2", 17 | "option_mac_enable_retina": false, 18 | "option_mac_enable_steam": false, 19 | "option_mac_icon_png": "${base_options_dir}\/mac\/icons\/1024.png", 20 | "option_mac_interpolate_pixels": false, 21 | "option_mac_menu_dock": false, 22 | "option_mac_output_dir": "~\/GameMakerStudio2\/Mac", 23 | "option_mac_resize_window": false, 24 | "option_mac_scale": 0, 25 | "option_mac_signing_identity": "Developer ID Application:", 26 | "option_mac_splash_png": "${base_options_dir}\/mac\/splash\/splash.png", 27 | "option_mac_start_fullscreen": false, 28 | "option_mac_team_id": null, 29 | "option_mac_texture_page": "2048x2048", 30 | "option_mac_version": { 31 | "build": 0, 32 | "major": 1, 33 | "minor": 0, 34 | "revision": 0 35 | }, 36 | "option_mac_vsync": false 37 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/options/tvos/options_tvos.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "93566aad-c3b3-48a9-8fa7-9c5ee19f74ac", 3 | "modelName": "GMtvOSOptions", 4 | "mvc": "1.0", 5 | "name": "tvOS", 6 | "option_tvos_bundle_name": "com.company.game", 7 | "option_tvos_display_cursor": false, 8 | "option_tvos_display_name": "Made in GameMaker Studio 2", 9 | "option_tvos_icon_1280": "${base_options_dir}\\tvos\\icons\\1280.png", 10 | "option_tvos_icon_400": "${base_options_dir}\\tvos\\icons\\400.png", 11 | "option_tvos_icon_400_2x": "${base_options_dir}\\tvos\\icons\\400_2x.png", 12 | "option_tvos_interpolate_pixels": true, 13 | "option_tvos_output_dir": "~\/GameMakerStudio2\/tvOS", 14 | "option_tvos_push_notifications": false, 15 | "option_tvos_scale": 0, 16 | "option_tvos_splash_time": 10, 17 | "option_tvos_splashscreen": "${base_options_dir}\\tvos\\splash\\splash.png", 18 | "option_tvos_splashscreen_2x": "${base_options_dir}\\tvos\\splash\\splash_2x.png", 19 | "option_tvos_team_id": "", 20 | "option_tvos_texture_page": "2048x2048", 21 | "option_tvos_topshelf": "${base_options_dir}\\tvos\\topshelf\\topshelf.png", 22 | "option_tvos_topshelf_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_2x.png", 23 | "option_tvos_topshelf_wide": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide.png", 24 | "option_tvos_topshelf_wide_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide_2x.png", 25 | "option_tvos_version": { 26 | "build": 0, 27 | "major": 1, 28 | "minor": 0, 29 | "revision": 0 30 | } 31 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/options/html5/options_html5.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "75ac291e-7061-4bcb-8e8a-3b3545332d41", 3 | "modelName": "GMHtml5Options", 4 | "mvc": "1.0", 5 | "name": "HTML5", 6 | "option_html5_allow_fullscreen": true, 7 | "option_html5_browser_title": "Made in GameMaker Studio 2", 8 | "option_html5_centregame": false, 9 | "option_html5_display_cursor": true, 10 | "option_html5_facebook_app_display_name": "", 11 | "option_html5_facebook_id": "", 12 | "option_html5_flurry_enable": false, 13 | "option_html5_flurry_id": "", 14 | "option_html5_foldername": "html5game", 15 | "option_html5_google_analytics_enable": false, 16 | "option_html5_google_tracking_id": "", 17 | "option_html5_icon": "${base_options_dir}\/html5\/fav.ico", 18 | "option_html5_index": "", 19 | "option_html5_interpolate_pixels": false, 20 | "option_html5_jsprepend": "", 21 | "option_html5_loadingbar": "", 22 | "option_html5_localrunalert": true, 23 | "option_html5_outputdebugtoconsole": true, 24 | "option_html5_outputname": "index.html", 25 | "option_html5_scale": 0, 26 | "option_html5_splash_png": "${base_options_dir}\/html5\/splash.png", 27 | "option_html5_texture_page": "2048x2048", 28 | "option_html5_use_facebook": false, 29 | "option_html5_usebuiltinfont": true, 30 | "option_html5_usebuiltinparticles": true, 31 | "option_html5_usesplash": false, 32 | "option_html5_version": { 33 | "build": 0, 34 | "major": 1, 35 | "minor": 0, 36 | "revision": 0 37 | }, 38 | "option_html5_webgl": 2 39 | } -------------------------------------------------------------------------------- /tests/projects/OtherProject/options/html5/options_html5.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "75ac291e-7061-4bcb-8e8a-3b3545332d41", 3 | "modelName": "GMHtml5Options", 4 | "mvc": "1.0", 5 | "name": "HTML5", 6 | "option_html5_allow_fullscreen": true, 7 | "option_html5_browser_title": "Made in GameMaker Studio 2", 8 | "option_html5_centregame": false, 9 | "option_html5_display_cursor": true, 10 | "option_html5_facebook_app_display_name": "", 11 | "option_html5_facebook_id": "", 12 | "option_html5_flurry_enable": false, 13 | "option_html5_flurry_id": "", 14 | "option_html5_foldername": "html5game", 15 | "option_html5_google_analytics_enable": false, 16 | "option_html5_google_tracking_id": "", 17 | "option_html5_icon": "${base_options_dir}\/html5\/fav.ico", 18 | "option_html5_index": "", 19 | "option_html5_interpolate_pixels": false, 20 | "option_html5_jsprepend": "", 21 | "option_html5_loadingbar": "", 22 | "option_html5_localrunalert": true, 23 | "option_html5_outputdebugtoconsole": true, 24 | "option_html5_outputname": "index.html", 25 | "option_html5_scale": 0, 26 | "option_html5_splash_png": "${base_options_dir}\/html5\/splash.png", 27 | "option_html5_texture_page": "2048x2048", 28 | "option_html5_use_facebook": false, 29 | "option_html5_usebuiltinfont": true, 30 | "option_html5_usebuiltinparticles": true, 31 | "option_html5_usesplash": false, 32 | "option_html5_version": { 33 | "build": 0, 34 | "major": 1, 35 | "minor": 0, 36 | "revision": 0 37 | }, 38 | "option_html5_webgl": 2 39 | } -------------------------------------------------------------------------------- /tests/projects/SimpleProject/options/html5/options_html5.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "75ac291e-7061-4bcb-8e8a-3b3545332d41", 3 | "modelName": "GMHtml5Options", 4 | "mvc": "1.0", 5 | "name": "HTML5", 6 | "option_html5_allow_fullscreen": true, 7 | "option_html5_browser_title": "Made in GameMaker Studio 2", 8 | "option_html5_centregame": false, 9 | "option_html5_display_cursor": true, 10 | "option_html5_facebook_app_display_name": "", 11 | "option_html5_facebook_id": "", 12 | "option_html5_flurry_enable": false, 13 | "option_html5_flurry_id": "", 14 | "option_html5_foldername": "html5game", 15 | "option_html5_google_analytics_enable": false, 16 | "option_html5_google_tracking_id": "", 17 | "option_html5_icon": "${base_options_dir}\/html5\/fav.ico", 18 | "option_html5_index": "", 19 | "option_html5_interpolate_pixels": false, 20 | "option_html5_jsprepend": "", 21 | "option_html5_loadingbar": "", 22 | "option_html5_localrunalert": true, 23 | "option_html5_outputdebugtoconsole": true, 24 | "option_html5_outputname": "index.html", 25 | "option_html5_scale": 0, 26 | "option_html5_splash_png": "${base_options_dir}\/html5\/splash.png", 27 | "option_html5_texture_page": "2048x2048", 28 | "option_html5_use_facebook": false, 29 | "option_html5_usebuiltinfont": true, 30 | "option_html5_usebuiltinparticles": true, 31 | "option_html5_usesplash": false, 32 | "option_html5_version": { 33 | "build": 0, 34 | "major": 1, 35 | "minor": 0, 36 | "revision": 0 37 | }, 38 | "option_html5_webgl": 2 39 | } -------------------------------------------------------------------------------- /tests/mocks/projects/20_IgnorableFiles/options/html5/options_html5.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "75ac291e-7061-4bcb-8e8a-3b3545332d41", 3 | "modelName": "GMHtml5Options", 4 | "mvc": "1.0", 5 | "name": "HTML5", 6 | "option_html5_allow_fullscreen": true, 7 | "option_html5_browser_title": "Made in GameMaker Studio 2", 8 | "option_html5_centregame": false, 9 | "option_html5_display_cursor": true, 10 | "option_html5_facebook_app_display_name": "", 11 | "option_html5_facebook_id": "", 12 | "option_html5_flurry_enable": false, 13 | "option_html5_flurry_id": "", 14 | "option_html5_foldername": "html5game", 15 | "option_html5_google_analytics_enable": false, 16 | "option_html5_google_tracking_id": "", 17 | "option_html5_icon": "${base_options_dir}\/html5\/fav.ico", 18 | "option_html5_index": "", 19 | "option_html5_interpolate_pixels": false, 20 | "option_html5_jsprepend": "", 21 | "option_html5_loadingbar": "", 22 | "option_html5_localrunalert": true, 23 | "option_html5_outputdebugtoconsole": true, 24 | "option_html5_outputname": "index.html", 25 | "option_html5_scale": 0, 26 | "option_html5_splash_png": "${base_options_dir}\/html5\/splash.png", 27 | "option_html5_texture_page": "2048x2048", 28 | "option_html5_use_facebook": false, 29 | "option_html5_usebuiltinfont": true, 30 | "option_html5_usebuiltinparticles": true, 31 | "option_html5_usesplash": false, 32 | "option_html5_version": { 33 | "build": 0, 34 | "major": 1, 35 | "minor": 0, 36 | "revision": 0 37 | }, 38 | "option_html5_webgl": 2 39 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/options/html5/options_html5.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "75ac291e-7061-4bcb-8e8a-3b3545332d41", 3 | "modelName": "GMHtml5Options", 4 | "mvc": "1.0", 5 | "name": "HTML5", 6 | "option_html5_allow_fullscreen": true, 7 | "option_html5_browser_title": "Made in GameMaker Studio 2", 8 | "option_html5_centregame": false, 9 | "option_html5_display_cursor": true, 10 | "option_html5_facebook_app_display_name": "", 11 | "option_html5_facebook_id": "", 12 | "option_html5_flurry_enable": false, 13 | "option_html5_flurry_id": "", 14 | "option_html5_foldername": "html5game", 15 | "option_html5_google_analytics_enable": false, 16 | "option_html5_google_tracking_id": "", 17 | "option_html5_icon": "${base_options_dir}\/html5\/fav.ico", 18 | "option_html5_index": "", 19 | "option_html5_interpolate_pixels": false, 20 | "option_html5_jsprepend": "", 21 | "option_html5_loadingbar": "", 22 | "option_html5_localrunalert": true, 23 | "option_html5_outputdebugtoconsole": true, 24 | "option_html5_outputname": "index.html", 25 | "option_html5_scale": 0, 26 | "option_html5_splash_png": "${base_options_dir}\/html5\/splash.png", 27 | "option_html5_texture_page": "2048x2048", 28 | "option_html5_use_facebook": false, 29 | "option_html5_usebuiltinfont": true, 30 | "option_html5_usebuiltinparticles": true, 31 | "option_html5_usesplash": false, 32 | "option_html5_version": { 33 | "build": 0, 34 | "major": 1, 35 | "minor": 0, 36 | "revision": 0 37 | }, 38 | "option_html5_webgl": 2 39 | } -------------------------------------------------------------------------------- /tests/projects/OtherProject/options/tvos/options_tvos.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "93566aad-c3b3-48a9-8fa7-9c5ee19f74ac", 3 | "modelName": "GMtvOSOptions", 4 | "mvc": "1.0", 5 | "name": "tvOS", 6 | "option_tvos_apple_sign_in": false, 7 | "option_tvos_bundle_name": "com.company.game", 8 | "option_tvos_display_cursor": false, 9 | "option_tvos_display_name": "Made in GameMaker Studio 2", 10 | "option_tvos_icon_1280": "${base_options_dir}\\tvos\\icons\\1280.png", 11 | "option_tvos_icon_400": "${base_options_dir}\\tvos\\icons\\400.png", 12 | "option_tvos_icon_400_2x": "${base_options_dir}\\tvos\\icons\\400_2x.png", 13 | "option_tvos_interpolate_pixels": true, 14 | "option_tvos_output_dir": "~\/GameMakerStudio2\/tvOS", 15 | "option_tvos_push_notifications": false, 16 | "option_tvos_scale": 0, 17 | "option_tvos_splash_time": 10, 18 | "option_tvos_splashscreen": "${base_options_dir}\\tvos\\splash\\splash.png", 19 | "option_tvos_splashscreen_2x": "${base_options_dir}\\tvos\\splash\\splash_2x.png", 20 | "option_tvos_team_id": "", 21 | "option_tvos_texture_page": "2048x2048", 22 | "option_tvos_topshelf": "${base_options_dir}\\tvos\\topshelf\\topshelf.png", 23 | "option_tvos_topshelf_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_2x.png", 24 | "option_tvos_topshelf_wide": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide.png", 25 | "option_tvos_topshelf_wide_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide_2x.png", 26 | "option_tvos_version": { 27 | "build": 0, 28 | "major": 1, 29 | "minor": 0, 30 | "revision": 0 31 | } 32 | } -------------------------------------------------------------------------------- /tests/projects/SimpleProject/options/tvos/options_tvos.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "93566aad-c3b3-48a9-8fa7-9c5ee19f74ac", 3 | "modelName": "GMtvOSOptions", 4 | "mvc": "1.0", 5 | "name": "tvOS", 6 | "option_tvos_apple_sign_in": false, 7 | "option_tvos_bundle_name": "com.company.game", 8 | "option_tvos_display_cursor": false, 9 | "option_tvos_display_name": "Made in GameMaker Studio 2", 10 | "option_tvos_icon_1280": "${base_options_dir}\\tvos\\icons\\1280.png", 11 | "option_tvos_icon_400": "${base_options_dir}\\tvos\\icons\\400.png", 12 | "option_tvos_icon_400_2x": "${base_options_dir}\\tvos\\icons\\400_2x.png", 13 | "option_tvos_interpolate_pixels": true, 14 | "option_tvos_output_dir": "~\/GameMakerStudio2\/tvOS", 15 | "option_tvos_push_notifications": false, 16 | "option_tvos_scale": 0, 17 | "option_tvos_splash_time": 10, 18 | "option_tvos_splashscreen": "${base_options_dir}\\tvos\\splash\\splash.png", 19 | "option_tvos_splashscreen_2x": "${base_options_dir}\\tvos\\splash\\splash_2x.png", 20 | "option_tvos_team_id": "", 21 | "option_tvos_texture_page": "2048x2048", 22 | "option_tvos_topshelf": "${base_options_dir}\\tvos\\topshelf\\topshelf.png", 23 | "option_tvos_topshelf_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_2x.png", 24 | "option_tvos_topshelf_wide": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide.png", 25 | "option_tvos_topshelf_wide_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide_2x.png", 26 | "option_tvos_version": { 27 | "build": 0, 28 | "major": 1, 29 | "minor": 0, 30 | "revision": 0 31 | } 32 | } -------------------------------------------------------------------------------- /tests/mocks/projects/20_IgnorableFiles/options/tvos/options_tvos.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "93566aad-c3b3-48a9-8fa7-9c5ee19f74ac", 3 | "modelName": "GMtvOSOptions", 4 | "mvc": "1.0", 5 | "name": "tvOS", 6 | "option_tvos_apple_sign_in": false, 7 | "option_tvos_bundle_name": "com.company.game", 8 | "option_tvos_display_cursor": false, 9 | "option_tvos_display_name": "Made in GameMaker Studio 2", 10 | "option_tvos_icon_1280": "${base_options_dir}\\tvos\\icons\\1280.png", 11 | "option_tvos_icon_400": "${base_options_dir}\\tvos\\icons\\400.png", 12 | "option_tvos_icon_400_2x": "${base_options_dir}\\tvos\\icons\\400_2x.png", 13 | "option_tvos_interpolate_pixels": true, 14 | "option_tvos_output_dir": "~\/GameMakerStudio2\/tvOS", 15 | "option_tvos_push_notifications": false, 16 | "option_tvos_scale": 0, 17 | "option_tvos_splash_time": 10, 18 | "option_tvos_splashscreen": "${base_options_dir}\\tvos\\splash\\splash.png", 19 | "option_tvos_splashscreen_2x": "${base_options_dir}\\tvos\\splash\\splash_2x.png", 20 | "option_tvos_team_id": "", 21 | "option_tvos_texture_page": "2048x2048", 22 | "option_tvos_topshelf": "${base_options_dir}\\tvos\\topshelf\\topshelf.png", 23 | "option_tvos_topshelf_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_2x.png", 24 | "option_tvos_topshelf_wide": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide.png", 25 | "option_tvos_topshelf_wide_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide_2x.png", 26 | "option_tvos_version": { 27 | "build": 0, 28 | "major": 1, 29 | "minor": 0, 30 | "revision": 0 31 | } 32 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/options/tvos/options_tvos.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "93566aad-c3b3-48a9-8fa7-9c5ee19f74ac", 3 | "modelName": "GMtvOSOptions", 4 | "mvc": "1.0", 5 | "name": "tvOS", 6 | "option_tvos_apple_sign_in": false, 7 | "option_tvos_bundle_name": "com.company.game", 8 | "option_tvos_display_cursor": false, 9 | "option_tvos_display_name": "Made in GameMaker Studio 2", 10 | "option_tvos_icon_1280": "${base_options_dir}\\tvos\\icons\\1280.png", 11 | "option_tvos_icon_400": "${base_options_dir}\\tvos\\icons\\400.png", 12 | "option_tvos_icon_400_2x": "${base_options_dir}\\tvos\\icons\\400_2x.png", 13 | "option_tvos_interpolate_pixels": true, 14 | "option_tvos_output_dir": "~\/GameMakerStudio2\/tvOS", 15 | "option_tvos_push_notifications": false, 16 | "option_tvos_scale": 0, 17 | "option_tvos_splash_time": 10, 18 | "option_tvos_splashscreen": "${base_options_dir}\\tvos\\splash\\splash.png", 19 | "option_tvos_splashscreen_2x": "${base_options_dir}\\tvos\\splash\\splash_2x.png", 20 | "option_tvos_team_id": "", 21 | "option_tvos_texture_page": "2048x2048", 22 | "option_tvos_topshelf": "${base_options_dir}\\tvos\\topshelf\\topshelf.png", 23 | "option_tvos_topshelf_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_2x.png", 24 | "option_tvos_topshelf_wide": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide.png", 25 | "option_tvos_topshelf_wide_2x": "${base_options_dir}\\tvos\\topshelf\\topshelf_wide_2x.png", 26 | "option_tvos_version": { 27 | "build": 0, 28 | "major": 1, 29 | "minor": 0, 30 | "revision": 0 31 | } 32 | } -------------------------------------------------------------------------------- /tests/src/Service/JsonServiceTest.php: -------------------------------------------------------------------------------- 1 | value = 'some string'; 14 | $testClass->boolean = true; 15 | $testClass->array = ['item 1', 'item 2', true, 1234]; 16 | 17 | $this->assertEquals( 18 | JsonService::decode(json_encode($testClass)), 19 | $testClass 20 | ); 21 | } 22 | 23 | public function testGetBrokenJson() 24 | { 25 | $this->expectException(MalformedJsonException::class); 26 | JsonService::decode('borked json'); 27 | } 28 | 29 | public function testGetBrokenJsonWithJustCommas() 30 | { 31 | $this->expectException(MalformedJsonException::class); 32 | JsonService::decode('{"test":["data", "data2",]}'); 33 | } 34 | 35 | /** 36 | * @dataProvider provideEncode 37 | */ 38 | public function testEncode($string) 39 | { 40 | $this->assertSame( 41 | $string, 42 | JsonService::encode(JsonService::decode($string)) 43 | ); 44 | } 45 | 46 | public function provideEncode() 47 | { 48 | return [ 49 | [file_get_contents(__DIR__ . '/../../projects/GMLProject/GMLProject.yyp')], 50 | [file_get_contents(__DIR__ . '/../../projects/OtherProject/OtherProject.yyp')], 51 | [file_get_contents(__DIR__ . '/../../projects/SimpleProject/SimpleProject.yyp')], 52 | ]; 53 | } 54 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/obj_child/obj_child.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "fcb42a9e-cf5c-478f-aa06-8bcbe9e92af2", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "obj_child", 6 | "eventList": [ 7 | { 8 | "id": "1ccf6dd8-99a6-47fb-b7b9-69370dba6f07", 9 | "modelName": "GMEvent", 10 | "mvc": "1.0", 11 | "IsDnD": false, 12 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 13 | "enumb": 0, 14 | "eventtype": 3, 15 | "m_owner": "fcb42a9e-cf5c-478f-aa06-8bcbe9e92af2" 16 | }, 17 | { 18 | "id": "7f46d566-bce8-4f2e-87e0-5e5f66f7d765", 19 | "modelName": "GMEvent", 20 | "mvc": "1.0", 21 | "IsDnD": false, 22 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 23 | "enumb": 0, 24 | "eventtype": 0, 25 | "m_owner": "fcb42a9e-cf5c-478f-aa06-8bcbe9e92af2" 26 | } 27 | ], 28 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 29 | "overriddenProperties": null, 30 | "parentObjectId": "b337607e-fe49-4e33-8428-d3728b9d9b23", 31 | "persistent": false, 32 | "physicsAngularDamping": 0.1, 33 | "physicsDensity": 0.5, 34 | "physicsFriction": 0.2, 35 | "physicsGroup": 0, 36 | "physicsKinematic": false, 37 | "physicsLinearDamping": 0.1, 38 | "physicsObject": false, 39 | "physicsRestitution": 0.1, 40 | "physicsSensor": false, 41 | "physicsShape": 1, 42 | "physicsShapePoints": null, 43 | "physicsStartAwake": true, 44 | "properties": null, 45 | "solid": false, 46 | "spriteId": "00000000-0000-0000-0000-000000000000", 47 | "visible": true 48 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/obj_parent/obj_parent.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "b337607e-fe49-4e33-8428-d3728b9d9b23", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "obj_parent", 6 | "eventList": [ 7 | { 8 | "id": "233adccc-c743-40d6-b90e-9da28019d250", 9 | "modelName": "GMEvent", 10 | "mvc": "1.0", 11 | "IsDnD": false, 12 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 13 | "enumb": 0, 14 | "eventtype": 0, 15 | "m_owner": "b337607e-fe49-4e33-8428-d3728b9d9b23" 16 | }, 17 | { 18 | "id": "33a098f8-1cda-4a13-af9b-ef2eb71c6ae0", 19 | "modelName": "GMEvent", 20 | "mvc": "1.0", 21 | "IsDnD": false, 22 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 23 | "enumb": 0, 24 | "eventtype": 8, 25 | "m_owner": "b337607e-fe49-4e33-8428-d3728b9d9b23" 26 | } 27 | ], 28 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 29 | "overriddenProperties": null, 30 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 31 | "persistent": false, 32 | "physicsAngularDamping": 0.1, 33 | "physicsDensity": 0.5, 34 | "physicsFriction": 0.2, 35 | "physicsGroup": 0, 36 | "physicsKinematic": false, 37 | "physicsLinearDamping": 0.1, 38 | "physicsObject": false, 39 | "physicsRestitution": 0.1, 40 | "physicsSensor": false, 41 | "physicsShape": 1, 42 | "physicsShapePoints": null, 43 | "physicsStartAwake": true, 44 | "properties": null, 45 | "solid": false, 46 | "spriteId": "00000000-0000-0000-0000-000000000000", 47 | "visible": true 48 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/objects/obj_child_child/obj_child_child.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ae41f6aa-5862-414b-8738-99e04eab6356", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "obj_child_child", 6 | "eventList": [ 7 | { 8 | "id": "b4dddd27-8de4-4614-997d-00866ec7eb98", 9 | "modelName": "GMEvent", 10 | "mvc": "1.0", 11 | "IsDnD": false, 12 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 13 | "enumb": 0, 14 | "eventtype": 3, 15 | "m_owner": "ae41f6aa-5862-414b-8738-99e04eab6356" 16 | }, 17 | { 18 | "id": "8ac5118d-8083-4ad0-aec5-c142dc776cbb", 19 | "modelName": "GMEvent", 20 | "mvc": "1.0", 21 | "IsDnD": false, 22 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 23 | "enumb": 0, 24 | "eventtype": 0, 25 | "m_owner": "ae41f6aa-5862-414b-8738-99e04eab6356" 26 | } 27 | ], 28 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 29 | "overriddenProperties": null, 30 | "parentObjectId": "fcb42a9e-cf5c-478f-aa06-8bcbe9e92af2", 31 | "persistent": false, 32 | "physicsAngularDamping": 0.1, 33 | "physicsDensity": 0.5, 34 | "physicsFriction": 0.2, 35 | "physicsGroup": 0, 36 | "physicsKinematic": false, 37 | "physicsLinearDamping": 0.1, 38 | "physicsObject": false, 39 | "physicsRestitution": 0.1, 40 | "physicsSensor": false, 41 | "physicsShape": 1, 42 | "physicsShapePoints": null, 43 | "physicsStartAwake": true, 44 | "properties": null, 45 | "solid": false, 46 | "spriteId": "00000000-0000-0000-0000-000000000000", 47 | "visible": true 48 | } -------------------------------------------------------------------------------- /src/Command/CleanCommand.php: -------------------------------------------------------------------------------- 1 | catalystService = $catalystService; 27 | $this->cleanService = $cleanService; 28 | 29 | parent::__construct(); 30 | } 31 | 32 | protected function configure() 33 | { 34 | $this 35 | ->setDescription('Removes all dependencies') 36 | ->setHelp('Remove all dependencies, files and folders installed by Catalyst') 37 | ->addOption('dry-run', 'd', InputOption::VALUE_NONE, 'Don\'t touch any files'); 38 | } 39 | 40 | protected function execute(InputInterface $input, OutputInterface $output): int 41 | { 42 | $output->writeln('Loading project...'); 43 | $thisProject = $this->catalystService->load(); 44 | 45 | $this->cleanService->setOutput($output); 46 | $this->cleanService->clean($thisProject); 47 | 48 | $thisProject->save(); 49 | 50 | StorageService::getInstance()->persist($input->getOption('dry-run')); 51 | 52 | return 0; 53 | } 54 | 55 | } -------------------------------------------------------------------------------- /tests/projects/GMLProject/tilesets/ts_numbers/ts_numbers.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "809833bc-8be7-46e6-a95b-d75f9a4ae2ec", 3 | "modelName": "GMTileSet", 4 | "mvc": "1.11", 5 | "name": "ts_numbers", 6 | "auto_tile_sets": [ 7 | { 8 | "id": "53b0c123-e55c-41f3-a504-f0ed302ea3b4", 9 | "modelName": "GMAutoTileSet", 10 | "mvc": "1.0", 11 | "closed_edge": false, 12 | "name": "autotile_1", 13 | "tiles": [ 14 | 0, 15 | 0, 16 | 0, 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0, 28 | 0, 29 | 0 30 | ] 31 | } 32 | ], 33 | "macroPageTiles": { 34 | "SerialiseData": null, 35 | "SerialiseHeight": 0, 36 | "SerialiseWidth": 0, 37 | "TileSerialiseData": [ 38 | 39 | ] 40 | }, 41 | "out_columns": 1, 42 | "out_tilehborder": 2, 43 | "out_tilevborder": 2, 44 | "spriteId": "60dd397d-bc63-4ce0-90e9-c1c8ab08e8b7", 45 | "sprite_no_export": false, 46 | "textureGroupId": "1225f6b0-ac20-43bd-a82e-be73fa0b6f4f", 47 | "tile_animation": { 48 | "AnimationCreationOrder": null, 49 | "FrameData": [ 50 | 0 51 | ], 52 | "SerialiseFrameCount": 1 53 | }, 54 | "tile_animation_frames": [ 55 | 56 | ], 57 | "tile_animation_speed": 15, 58 | "tile_count": 1, 59 | "tileheight": 16, 60 | "tilehsep": 0, 61 | "tilevsep": 0, 62 | "tilewidth": 16, 63 | "tilexoff": 0, 64 | "tileyoff": 0 65 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | ### CATALYST ### 3 | views/f7c27459-f01b-2208-c908-74c52eddfd69.yy 4 | views/20d9d509-f96a-8c02-b2bd-0c6bd10380e8.yy 5 | views/99147da0-4268-bf21-da8f-70bc1d7c1795.yy 6 | views/9b614e31-b06f-e488-824e-5c5b74294740.yy 7 | scripts/test_suite_end 8 | scripts/test_suite_init 9 | scripts/test_assert_same 10 | views/eee014e8-3a24-3e03-097b-5139840b6272.yy 11 | scripts/dectohex 12 | scripts/hextodec 13 | views/044962af-a181-1b1c-cbba-bcd8f9e3e061.yy 14 | scripts/string_explode 15 | scripts/array_implode 16 | scripts/string_reverse 17 | scripts/string_mask 18 | scripts/url_encode 19 | scripts/url_decode 20 | scripts/string_ends_with 21 | scripts/string_starts_with 22 | scripts/string_prepend 23 | scripts/string_append 24 | scripts/string_trim 25 | views/5bf26e5c-6b8d-6f85-6855-ba5a8c7eb901.yy 26 | scripts/round_whole 27 | scripts/netevent_to_string 28 | scripts/debug_log 29 | views/20bdde62-c74a-4ed7-aceb-7381cff39e81.yy 30 | scripts/get_nearest_instances 31 | scripts/get_furthest_instances 32 | views/e82be4ff-fe27-7360-234a-428d1eed32c9.yy 33 | scripts/bit_from_byte 34 | views/2b926b36-4456-ea86-e7cb-988601cd996e.yy 35 | scripts/extract_header_from_string 36 | views/86336395-3fd9-67e2-0521-61854eb28499.yy 37 | scripts/pulse 38 | scripts/color_lerp 39 | views/07a5c14a-1669-529d-15f9-07aca623ae5e.yy 40 | views/2cc409bc-7fb6-888c-0cbe-970dbac6b6dd.yy 41 | views/06592b8c-6360-98c3-7674-38b1132a6d28.yy 42 | objects/ExtendedFunctions_obj_test 43 | objects/ExtendedFunctions_obj_near_instance 44 | objects/ExtendedFunctions_obj_test_near_instances 45 | views/9e33827b-4dfb-a705-9d51-1b9855b9f63f.yy 46 | views/857db639-f610-3c74-fb50-13ef1718f1b8.yy 47 | views/1ce2ee19-8869-2da7-fa91-c3c0671e3285.yy 48 | rooms/ExtendedFunctions_rm_test 49 | rooms/ExtendedFunctions_test_nearest 50 | ### CATALYST ### -------------------------------------------------------------------------------- /src/Command/ResourcesCommand.php: -------------------------------------------------------------------------------- 1 | catalystService = $catalystService; 20 | 21 | parent::__construct(); 22 | } 23 | 24 | protected function configure() 25 | { 26 | $this 27 | ->setDescription('List the projects resources') 28 | ->setHelp('List all project resources'); 29 | } 30 | 31 | protected function execute(InputInterface $input, OutputInterface $output): int 32 | { 33 | try { 34 | $catalyst = $this->catalystService->load(realpath('.')); 35 | } catch (\Exception $e) { 36 | $output->writeLn('ERROR LOADING CATALYST PROJECT FILE: ' . $e->getMessage()); 37 | return 126; 38 | } 39 | 40 | foreach ($catalyst->YoYoProjectEntity()->resources as $resource) { 41 | $output->writeln( 42 | sprintf( 43 | '[%s] [%s%s] - %s', 44 | $resource->gmResource()->id, 45 | $resource->gmResource()->modelName, 46 | $resource->gmResource()->filterType ? ' / ' . $resource->gmResource()->filterType : '', 47 | $resource->gmResource()->getName() 48 | ) 49 | ); 50 | } 51 | 52 | return 0; 53 | } 54 | } -------------------------------------------------------------------------------- /tests/mocks/projects/21_UninstalledNewFiles/objects/ExtendedFunctions_obj_test_near_instances/ExtendedFunctions_obj_test_near_instances.yy: -------------------------------------------------------------------------------- 1 | { 2 | "id": "c8a37efc-8cdc-43ec-b319-ba0ba6bc7584", 3 | "modelName": "GMObject", 4 | "mvc": "1.0", 5 | "name": "ExtendedFunctions_obj_test_near_instances", 6 | "eventList": [ 7 | { 8 | "id": "118941ed-d13e-465b-bf03-d6cfb932c6cb", 9 | "modelName": "GMEvent", 10 | "mvc": "1.0", 11 | "IsDnD": false, 12 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 13 | "enumb": 0, 14 | "eventtype": 0, 15 | "m_owner": "c8a37efc-8cdc-43ec-b319-ba0ba6bc7584" 16 | }, 17 | { 18 | "id": "5a1a8ab3-ec60-45fa-ace8-aebc3137bf0c", 19 | "modelName": "GMEvent", 20 | "mvc": "1.0", 21 | "IsDnD": false, 22 | "collisionObjectId": "00000000-0000-0000-0000-000000000000", 23 | "enumb": 0, 24 | "eventtype": 8, 25 | "m_owner": "c8a37efc-8cdc-43ec-b319-ba0ba6bc7584" 26 | } 27 | ], 28 | "maskSpriteId": "00000000-0000-0000-0000-000000000000", 29 | "overriddenProperties": null, 30 | "parentObjectId": "00000000-0000-0000-0000-000000000000", 31 | "persistent": false, 32 | "physicsAngularDamping": 0.1, 33 | "physicsDensity": 0.5, 34 | "physicsFriction": 0.2, 35 | "physicsGroup": 0, 36 | "physicsKinematic": false, 37 | "physicsLinearDamping": 0.1, 38 | "physicsObject": false, 39 | "physicsRestitution": 0.1, 40 | "physicsSensor": false, 41 | "physicsShape": 0, 42 | "physicsShapePoints": [ 43 | 44 | ], 45 | "physicsStartAwake": true, 46 | "properties": null, 47 | "solid": false, 48 | "spriteId": "00000000-0000-0000-0000-000000000000", 49 | "visible": true 50 | } --------------------------------------------------------------------------------