From 74119ea73d4785db5175a00800a93d38c3b8bfe1 Mon Sep 17 00:00:00 2001 From: YellowAfterlife Date: Sun, 23 Jun 2024 18:23:05 +0300 Subject: [PATCH] Hello! --- .gitattributes | 5 + .gitignore | 20 + README.md | 61 + docs/index.dmd | 326 ++++ docs/index.html | 797 +++++++++ misc/shrug.png | Bin 0 -> 774 bytes snippets.sln | 25 + snippets/CharTools.h | 16 + snippets/autogen.cpp | 2 + snippets/dllmain.cpp | 19 + snippets/gml_ext.h | 306 ++++ snippets/named_events.cpp | 195 ++ snippets/postBuild.bat | 39 + snippets/preBuild.bat | 19 + snippets/resource1.h | 14 + snippets/snippets.aps | Bin 0 -> 2688 bytes snippets/snippets.cpp | 342 ++++ snippets/snippets.rc | Bin 0 -> 5030 bytes snippets/snippets.vcxproj | 211 +++ snippets/snippets.vcxproj.filters | 73 + snippets/snippets.vcxproj.user | 22 + snippets/sniptools.cpp | 80 + snippets/stdafx.cpp | 23 + snippets/stdafx.h | 32 + snippets/targetver.h | 8 + snippets_gml/.gitignore | 5 + snippets_gml/extension.gmk-snips | 3 + snippets_gml/pack.bat | 11 + snippets_gml/snippets.gml | 518 ++++++ snippets_gml/snippets.gmxgen81 | 4 + snippets_gml/snippets_core.gml | 422 +++++ snippets_gml/tester/events.gml | 128 ++ snippets_gml/tester/fnames | 1885 ++++++++++++++++++++ snippets_gml/tester/obj_control.object.gml | 12 + snippets_gml/tester/obj_player.object.gml | 11 + snippets_gml/tester/overrides.gml | 5 + snippets_gml/tester/snippet_tester.gm81 | Bin 0 -> 26984 bytes snippets_gml/tester/snippets.dll | Bin 0 -> 256000 bytes snippets_gml/tester/spr_test.png | Bin 0 -> 290 bytes snippets_gml/tester/startup.gmk-snips | 4 + 40 files changed, 5643 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 docs/index.dmd create mode 100644 docs/index.html create mode 100644 misc/shrug.png create mode 100644 snippets.sln create mode 100644 snippets/CharTools.h create mode 100644 snippets/autogen.cpp create mode 100644 snippets/dllmain.cpp create mode 100644 snippets/gml_ext.h create mode 100644 snippets/named_events.cpp create mode 100644 snippets/postBuild.bat create mode 100644 snippets/preBuild.bat create mode 100644 snippets/resource1.h create mode 100644 snippets/snippets.aps create mode 100644 snippets/snippets.cpp create mode 100644 snippets/snippets.rc create mode 100644 snippets/snippets.vcxproj create mode 100644 snippets/snippets.vcxproj.filters create mode 100644 snippets/snippets.vcxproj.user create mode 100644 snippets/sniptools.cpp create mode 100644 snippets/stdafx.cpp create mode 100644 snippets/stdafx.h create mode 100644 snippets/targetver.h create mode 100644 snippets_gml/.gitignore create mode 100644 snippets_gml/extension.gmk-snips create mode 100644 snippets_gml/pack.bat create mode 100644 snippets_gml/snippets.gml create mode 100644 snippets_gml/snippets.gmxgen81 create mode 100644 snippets_gml/snippets_core.gml create mode 100644 snippets_gml/tester/events.gml create mode 100644 snippets_gml/tester/fnames create mode 100644 snippets_gml/tester/obj_control.object.gml create mode 100644 snippets_gml/tester/obj_player.object.gml create mode 100644 snippets_gml/tester/overrides.gml create mode 100644 snippets_gml/tester/snippet_tester.gm81 create mode 100644 snippets_gml/tester/snippets.dll create mode 100644 snippets_gml/tester/spr_test.png create mode 100644 snippets_gml/tester/startup.gmk-snips diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3948621 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +*.yy linguist-language=Game Maker Language +*.h linguist-language=C++ +*.html linguist-vendored +*.yy linguist-vendored +*/extensions/*/autogen.gml linguist-vendored diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb1fdfe --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +.vs/ +*/#backups/* +*/Configs/*/* + +*/datafiles/snippets.html + +*/Debug/ +*/Release/ +Debug/ +Release/ +export/*.gmz +export/*.gmez +export/*.yyz +export/*.yymp +export/*.yymps +export/*.png +export/*.zip + +*.sdf +help.rtf \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c8614f0 --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +# Snippet API (working title) +**Quick links:** [documentation](https://yal-gamemaker.github.io/gmk-snippets/)\ +**Supported versions:** GameMaker 8.1\[1] + +A collection of Cool Tricks for dynamically loading scripts in GameMaker 8.1¹. + +Based on my own findings and techniques of yesteryear. + +Features: +- Can load and call "scripts" (snippets) + Snippets can call each other, + support arguments, and generally act like scripts. +- Can load objects from a GMEdit-like single-file format +- A little syntactic sugar for snippet code +- A few helper functions + +\[1] Technically any version that has `argument[]`/`argument_count` and `execute_string`/`object_event_add`, +which is most likely versions between GM8.1 (incl.) and GM:HTML5 (incl.). + +## Technical +The extension consists of a DLL and a bunch of GML scripts. + +The DLL does code preprocessing and other operations that were deemed too slow to do in GM8.1. + +The scripts use `object_event_add` + `event_perform_object` to store and call the final code without parsing penalties that would occur with `execute_string`. + +## Intended use cases +
+ +![shrug](./misc/shrug.png)\ +~~What use cases?~~ + +
+ +You could use it for dynamic content loading if you are making a game in GM8.1. + +Myself I wanted something that could run snippets of GM8.1 code without opening GM8.1, +which is convenient timing given that GM8.1 +[doesn't open at the time of writing](https://forum.gamemaker.io/index.php?threads/gamemaker-8-1-unable-to-validate-license.113289/#post-675237). + +## snippet-tester +This is an example project that has snippets setup and does +```gml +snippet_init(); +snippet_load_listfile("startup.gmk-snips"); +``` +on game start. + +If you compile a [GMEdit](https://github.com/YellowAfterlife/GMEdit/) version from git, you can open `.gmk-snips` files in it for a slightly-better code editing experience. + +## TODOs + +- Wildcard support in listfiles?\ + (`folder/*.gml`) +- Arguments for `snippet_execute_string`?\ + (needs an "argument count waterfall") + +## Meta + +**Author:** [YellowAfterlife](https://github.com/YellowAfterlife) +**License:** MIT? \ No newline at end of file diff --git a/docs/index.dmd b/docs/index.dmd new file mode 100644 index 0000000..7dd1e18 --- /dev/null +++ b/docs/index.dmd @@ -0,0 +1,326 @@ +```set template default.html``` +```set title snippet_* cheat sheet``` +```set autoapi ext``` +```gmlapi fnames2``` +```setmd intro +This is a "cheat sheet" for the "snippets" extension by YellowAfterlife. +The extension can be found +[on GitHub](https://github.com/YAL-GameMaker/gmk-snippets) +``` + +#[Setting up](setup) { + --{ + - Import `snippets.gml` to your project.\ + This should add a folder of scripts. + - Add `events.gml`, `fnames`, and `snippets.dll` to your project folder + (_or_ Included Files) + - Call `snippets_init` before using the functions + } +} +#[Preprocessing](+preproc) { + Snippet code undergoes the following transformations: + #[argument / argument_count](.arg) { + Arguments cannot be passed to `event_perform_object`, + so instead [snippet_call] will store them in global variables + and argument-related variables will be replaced with reads/writes of these. + } + #[var, globalvar](.var) { + For purposes of offering baseline convenience, + ```gml + var v = 1; + globalvar g = 2; + ``` + will be translated to + ```gml + var v; v = 1; + globalvar g; g = 2; + ``` + Note that multiple declarations (`var a = 1, b = 2`) are not supported. + } + #[function calls](.call) { + Calls to unknown functions will be replaced by [snippet_call], so + ```gml + result = mystery_func(1, 2, 3); + ``` + becomes + ```gml + result = snippet_call("mystery_func", 1, 2, 3); + ``` + Functions can be [registered](signatures) to be called by snippets. + } + #[function overrides](.hook) { + A defined snippet takes precedence over the known functions + for the subsequently compiled snippets (but not the ones that were compiled with it in one call). + + This allows to "hook" a built-in function or project script if necessary. + For example, + ```gml + snippet_define("cool_hooks", ' + #define game_end + if (show_question("Really quit?")) { + game_end(); // calls the real game_end + } + ') + snippet_execute_string(' + game_end(); // calls the game_end "hook" + ') + ``` + } +} +#[General functions](general) { + #[snippet_init()]() { + Loads up the DLL and initializes the global variables. + + This will also do the equivalent of the following: + ```gml + snippet_parse_api_file("fnames"); + snippet_parse_event_file("events.gml"); + ``` + and a `snippet_function_add` for each script in the project. + } + #[snippet_execute_string(gml_code)->]() { + Like regular `execute_string`, but uses the snippet preprocessor + (e.g. can call snippets using `func()`). + } +} +#[Snippets](snippets) { + #[snippet_define(name, gml_code)]() { + Creates/overwrites a snippet. + + If the code contains `#define` sections, multiple snippets can be defined in one call. + + For example, the following would define snippets `test` and `add`: + ```gml + snippet_define("test", ' + return add(1, 2); + #define add + return argument0 + argument1; + ') + ``` + } + #[snippet_define_raw(name, gml_code)]() { + Like above, but does _not_ use the snippet preprocessor. + + This is mostly useful if you know what you're doing or to "clone" + a snippet using [snippet_get_code]. + } + State: + #[snippet_exists(name)->]() { + Returns whether a snippet with the given name exists + } + #[snippet_get_code(name)->]() { + Returns the [preprocessed](preproc) code of a snippet. + } + Calls: + #[snippet_call(name, ...arguments)->]() { + Calls a snippet with the given name and returns the result, not unlike `script_execute`. + } +} +#[Objects](objects) { + #[snippet_define_object(name, gml_code)->]() { + Creates/overwrites an object. + + Returns the object index. + + Events are defined using [GMEdit](https://yellowafterlife.itch.io/gmedit)-inspired syntax: + ```gml + snippet_define_object("obj_test", ' + #event create + points = 0; + + #event step + points += 1 + + #event draw + draw_text(5, 5, string(points)); + ') + ``` + (also see [event types](event_types)) + --- + If there is code before the first event, + it is considered to be one-time "properties" setup + and may define the following variables + ```gml + visible -> object_set_visible + depth -> object_set_depth + persistent -> object_set_persistent + parent_index -> object_set_parent + sprite_index -> object_set_sprite + mask_index -> object_set_mask + solid -> object_set_solid + ``` + You may also use this opportunity to load the resources that the object uses. + --- + If the object name is a valid variable name, a `globalvar` will be automatically set up + for it so that it can be referenced in other code without extra effort. + } + #[snippet_prepare_object(name)->]() { + Creates an object if that doesn't exist yet. + + Returns the object index. + } + --- + #[snippet_object_get_name(ind)->]() { + Like the regular `object_get_name`, but also knows what you've called the objects + that were created using [snippet_define_object]. + } + #[snippet_object_get_index(ind)->]() { + Returns the index of an object with the given name, + including ones that were created using [snippet_define_object]. + + Returns `-1` if there's no object with a name like that. + } +} +#[List files](+listfile) { + #[snippet_load_list(list, directory)]() { + Loads one or more files from the `directory` + (use `""` for current directory) + based on the instructions in the `list`. + + Each item is a string, which can be formatted like one of the following: --{ + - `test.gml`\ + Just some script(s) (calls [snippet_define]). + - `test.object.gml`\ + An object definition file (calls [snippet_define_object]).\ + If the line ends with a `>`, an instance of the object is automatically created at 0,0. + - `test.global.gml`\ + One-time code (calls [snippet_execute_string]). + - `>code`\ + A single-line snippet for [snippet_execute_string], + in case you don't want to make a file just for that. + } + } + #[snippet_load_listfile(path)]() { + This function calls the above, + but also adds support for comments (as `# comment`). + + An example file might be called `test.gmk-snips` and contain the following: + ``` + functions.gml + obj_control.object.gml> + obj_player.object.gml + > instance_create(100, 100, obj_player) + ``` + This would: --{ + - Load scripts from `functions.gml` + - Load an object from `obj_control.object.gml` and make an instance of it + - Load an object from `obj_player.object.gml` + - Create an instance of `obj_player` at 100, 100 + } + } +} +#[Event types](+event_types) { + #[Intro](.) { + For [snippet_define_object], + the extension supports named events in a few formats. + + You can find the supported event names in `events.gml` (and/or add your own). + + The extension also supports segmented (`type:number`) names.\ + For these, the following types are supported: --{ + - `create` + - `destroy` + - `alarm` + - `step` + - `collision` + - `keyboard` + - `mouse` + - `other` + - `draw` + - `keypress` + - `keyrelease` + } + "collision" event supports object names (per [snippet_object_get_index]), + such as `collision:obj_test`. + + The three keyboard event types recognize 0-9, A-Z, and `vk_` constants, + so `keyboard:vk_left` and `keypress:E` both work. + + You can dynamically register additional events/types using + [snippet_event_register] and [snippet_event_register_type]. + } + --- + #[snippet_event_get_type(name)->]() { + Parses an event name and returns its `event_type`. + + An event is invalid if [snippet_event_get_number] is `-1`. + } + #[snippet_event_get_number(name)->]() { + Parses an event name and returns its `event_number`. + + If an event is invalid, returns `-1`. + + If it's an event that uses an object name as an argument, + returns `-2` (the named can be retrieved using [snippet_event_get_number_object]). + } + #[snippet_event_get_number_object()->]() { + If the last [snippet_event_get_number] call returned `-2`, + this returns the object name. + } + --- + #[snippet_event_register(name, type, number)]() { + Registers a named event. + } + #[snippet_event_register_type(name, type, arg_kind)]() { + Registers a named event type (for `type:arg`). + + `arg_kind` can be: --{ + - `0`: just numbers + - `1`: object name + - `2`: key code + } + } + #[snippet_parse_event_file(path)]() { + Loads event definitions (like with `events.gml`) from a file. + } +} +#[Signatures](signatures) { + #[snippet_parse_api_file(path)]() { + Parses contents of an `fnames`-styled API definitions file. + } + #[snippet_parse_api_entry(line)]() { + Parses a single-line definition in the aforementioned format. + } + --- + #[snippet_function_add(name)]() { + Registers a known function name. + + Known function calls will not be replaced by the [preprocessor](preproc.call). + } + #[snippet_function_remove(name)]() { + Removes a known function registration. + + Calls to it in subsequently compiled snippet will be the [preprocessor](preproc.call). + } +} +#[Other stuff](other) { + File functions: + #[sniptools_file_get_contents(path)->]() { + Returns the contents of a file as a string (`""` if a file is missing). + } + String functions: + #[sniptools_string_trim(str)->]() { + Returns a string with spaces trimmed from the beginning and end of it. + } + #[sniptools_string_trim_start(str)->]() { + Returns a string with spaces trimmed from the beginning of it. + } + #[sniptools_string_trim_end(str)->]() { + Returns a string with spaces trimmed from the end of it. + } + --- + #[sniptools_string_split_start(str, delimiter)->]() { + Split a string and returns the number of sections in it. + + Can be used like so: + ```gml + repeat (sniptools_string_split_start("a;bb;ccc", ";")) { + show_message(sniptools_string_split_next()); + } + ``` + (which would show `a`, `bb`, `ccc`) + } + #[sniptools_string_split_next()->]() { + Returns the next item from the string list made by [sniptools_string_split_start]. + } +} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..c4b1939 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,797 @@ + + +snippet_* cheat sheet + + + + + + + + + + + + + + + +
+ +
+
+This is a "cheat sheet" for the "snippets" extension by YellowAfterlife.
+The extension can be found +on GitHub +
+
+Click on sections to expand/collapse them.
Quick display controls: +CategoriesSectionsEverything
+
+

+ + + + + + + + +

Setting up
    +
  • Import snippets.gml to your project.
    + This should add a folder of scripts. +
  • Add events.gml, fnames, and snippets.dll to your project folder + (_or_ Included Files) +
  • Call snippets_init before using the functions +
Preprocessing
Preprocessing

+ Snippet code undergoes the following transformations: +

argument / argument_count

+ Arguments cannot be passed to event_perform_object, + so instead snippet_call will store them in global variables + and argument-related variables will be replaced with reads/writes of these. +

var, globalvar

+ For purposes of offering baseline convenience, +

+var v = 1;
+globalvar g = 2;
+

+ will be translated to +

+var v; v = 1;
+globalvar g; g = 2;
+

+ Note that multiple declarations (var a = 1, b = 2) are not supported. +

function calls

+ Calls to unknown functions will be replaced by snippet_call, so +

+result = mystery_func(1, 2, 3);
+

+ becomes +

+result = snippet_call("mystery_func", 1, 2, 3);
+

+ Functions can be registered to be called by snippets. +

function overrides

+ A defined snippet takes precedence over the known functions + for the subsequently compiled snippets (but not the ones that were compiled with it in one call). +

+ This allows to "hook" a built-in function or project script if necessary. + For example, +

+snippet_define("cool_hooks", '
+#define game_end
+if (show_question("Really quit?")) {
+    game_end(); // calls the real game_end
+}
+')
+snippet_execute_string('
+game_end(); // calls the game_end "hook"
+')
+
General functions
Snippets
Snippets
snippet_define(name, gml_code)

+ Creates/overwrites a snippet. +

+ If the code contains #define sections, multiple snippets can be defined in one call. +

+ For example, the following would define snippets test and add: +

+snippet_define("test", '
+return add(1, 2);
+#define add
+return argument0 + argument1;
+')
+
snippet_define_raw(name, gml_code)

+ Like above, but does not use the snippet preprocessor. +

+ This is mostly useful if you know what you're doing or to "clone" + a snippet using snippet_get_code. +

+ State: +

snippet_exists(name)​

+ Returns whether a snippet with the given name exists +

snippet_get_code(name)​

+ Calls: +

snippet_call(name, ...arguments)​

+ Calls a snippet with the given name and returns the result, not unlike script_execute. +

Objects
Objects
snippet_define_object(name, gml_code)​

+ Creates/overwrites an object. +

+ Returns the object index. +

+ Events are defined using GMEdit-inspired syntax: +

+snippet_define_object("obj_test", '
+#event create
+points = 0;
+
+#event step
+points += 1
+
+#event draw
+draw_text(5, 5, string(points));
+')
+

+ (also see event types) +


+ If there is code before the first event, + it is considered to be one-time "properties" setup + and may define the following variables +

+visible -> object_set_visible
+depth -> object_set_depth
+persistent -> object_set_persistent
+parent_index -> object_set_parent
+sprite_index -> object_set_sprite
+mask_index -> object_set_mask
+solid -> object_set_solid
+

+ You may also use this opportunity to load the resources that the object uses. +


+ If the object name is a valid variable name, a globalvar will be automatically set up + for it so that it can be referenced in other code without extra effort. +

snippet_prepare_object(name)​

+ Creates an object if that doesn't exist yet. +

+ Returns the object index. +


snippet_object_get_name(ind)​

+ Like the regular object_get_name, but also knows what you've called the objects + that were created using snippet_define_object. +

snippet_object_get_index(ind)​

+ Returns the index of an object with the given name, + including ones that were created using snippet_define_object. +

+ Returns -1 if there's no object with a name like that. +

List files
List files
snippet_load_list(list, directory)

+ Loads one or more files from the directory + (use "" for current directory) + based on the instructions in the list. +

+ Each item is a string, which can be formatted like one of the following:

    +
  • test.gml
    + Just some script(s) (calls snippet_define). +
  • test.object.gml
    + An object definition file (calls snippet_define_object).
    + If the line ends with a >, an instance of the object is automatically created at 0,0. +
  • test.global.gml
    + One-time code (calls snippet_execute_string). +
  • >code
    + A single-line snippet for snippet_execute_string, + in case you don't want to make a file just for that. +
snippet_load_listfile(path)

+ This function calls the above, + but also adds support for comments (as # comment). +

+ An example file might be called test.gmk-snips and contain the following: +

+functions.gml
+obj_control.object.gml>
+obj_player.object.gml
+> instance_create(100, 100, obj_player)
+

+ This would:

    +
  • Load scripts from functions.gml +
  • Load an object from obj_control.object.gml and make an instance of it +
  • Load an object from obj_player.object.gml +
  • Create an instance of obj_player at 100, 100 +
Event types
Event types
Intro

+ For snippet_define_object, + the extension supports named events in a few formats. +

+ You can find the supported event names in events.gml (and/or add your own). +

+ The extension also supports segmented (type:number) names.
+ For these, the following types are supported:

    +
  • create +
  • destroy +
  • alarm +
  • step +
  • collision +
  • keyboard +
  • mouse +
  • other +
  • draw +
  • keypress +
  • keyrelease +

+ "collision" event supports object names (per snippet_object_get_index), + such as collision:obj_test. +

+ The three keyboard event types recognize 0-9, A-Z, and vk_ constants, + so keyboard:vk_left and keypress:E both work. +

+ You can dynamically register additional events/types using + snippet_event_register and snippet_event_register_type. +


snippet_event_get_type(name)​
snippet_event_get_number(name)​

+ Parses an event name and returns its event_number. +

+ If an event is invalid, returns -1. +

+ If it's an event that uses an object name as an argument, + returns -2 (the named can be retrieved using snippet_event_get_number_object). +

snippet_event_get_number_object()​

snippet_event_register(name, type, number)

+ Registers a named event. +

snippet_event_register_type(name, type, arg_kind)

+ Registers a named event type (for type:arg). +

+ arg_kind can be:

    +
  • 0: just numbers +
  • 1: object name +
  • 2: key code +
snippet_parse_event_file(path)

+ Loads event definitions (like with events.gml) from a file. +

Signatures
Other stuff
Other stuff

+ File functions: +

sniptools_file_get_contents(path)​

+ Returns the contents of a file as a string ("" if a file is missing). +

+ String functions: +

sniptools_string_trim(str)​

+ Returns a string with spaces trimmed from the beginning and end of it. +

sniptools_string_trim_start(str)​

+ Returns a string with spaces trimmed from the beginning of it. +

sniptools_string_trim_end(str)​

+ Returns a string with spaces trimmed from the end of it. +


sniptools_string_split_start(str, delimiter)​
sniptools_string_split_next()​

+
+ + diff --git a/misc/shrug.png b/misc/shrug.png new file mode 100644 index 0000000000000000000000000000000000000000..ba22181d1dc199aac71eb42862e3f964c6dfdcf1 GIT binary patch literal 774 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xeKd>+Z$)vawKY$ctage(c!@6@aFM%AEbVpxD z28NCO++*j69R28n(M-!;-O64f zpTCDwV)wf5QWf=iIUE)D7aTIU`z>g5(|*nwk|{fQKEGRaUz{pU+*2@_#w#XeD(b@{o_)~Ov_gNUi_eFm7z+)s^8wPvpfzM zGyM}_bY@CZ>lB$IXrPkdabQA&B2b`>g@;o@$iPH<2{7D|1RyF_ddf4Vv;5f(QKXXK ob#Ow1=3gf!CgenN;C$v=@#nAeISFVdQ&MBb@00?6wx&QzG literal 0 HcmV?d00001 diff --git a/snippets.sln b/snippets.sln new file mode 100644 index 0000000..ea374a5 --- /dev/null +++ b/snippets.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29424.173 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "snippets", "snippets\snippets.vcxproj", "{EA16C6EF-C7F3-42BC-A4AC-EBEE2E84C450}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EA16C6EF-C7F3-42BC-A4AC-EBEE2E84C450}.Debug|x86.ActiveCfg = Debug|Win32 + {EA16C6EF-C7F3-42BC-A4AC-EBEE2E84C450}.Debug|x86.Build.0 = Debug|Win32 + {EA16C6EF-C7F3-42BC-A4AC-EBEE2E84C450}.Release|x86.ActiveCfg = Release|Win32 + {EA16C6EF-C7F3-42BC-A4AC-EBEE2E84C450}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8FCBDF72-1C64-42B3-B970-F6A254875BD6} + EndGlobalSection +EndGlobal diff --git a/snippets/CharTools.h b/snippets/CharTools.h new file mode 100644 index 0000000..8cea18b --- /dev/null +++ b/snippets/CharTools.h @@ -0,0 +1,16 @@ +#pragma once + +namespace CharTools { + inline bool isSpace(char c) { + switch (c) { + case ' ': case '\t': case '\r': case '\n': return true; + default: return false; + } + } + inline bool isIdentStart(char c) { + return c == '_' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'; + } + inline bool isIdent(char c) { + return c == '_' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9'; + } +} \ No newline at end of file diff --git a/snippets/autogen.cpp b/snippets/autogen.cpp new file mode 100644 index 0000000..a4a3bf3 --- /dev/null +++ b/snippets/autogen.cpp @@ -0,0 +1,2 @@ +#include "gml_ext.h" +gmk_buffer gmk_buffer_args; diff --git a/snippets/dllmain.cpp b/snippets/dllmain.cpp new file mode 100644 index 0000000..69b5891 --- /dev/null +++ b/snippets/dllmain.cpp @@ -0,0 +1,19 @@ +// dllmain.cpp : Defines the entry point for the DLL application. +#include "stdafx.h" + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/snippets/gml_ext.h b/snippets/gml_ext.h new file mode 100644 index 0000000..49d4dd2 --- /dev/null +++ b/snippets/gml_ext.h @@ -0,0 +1,306 @@ +#pragma once +#include "stdafx.h" +#define gml_ext_h +#include +#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) +#include +#endif +#include +#include +#include +using namespace std; + +#define dllg /* tag */ +#define dllgm /* tag;mangled */ + +#if defined(_WINDOWS) +#define dllx extern "C" __declspec(dllexport) +#define dllm __declspec(dllexport) +#elif defined(GNUC) +#define dllx extern "C" __attribute__ ((visibility("default"))) +#define dllm __attribute__ ((visibility("default"))) +#else +#define dllx extern "C" +#define dllm /* */ +#endif + +#ifdef _WINDEF_ +/// auto-generates a window_handle() on GML side +typedef HWND GAME_HWND; +#endif + +/// auto-generates an asset_get_index("argument_name") on GML side +typedef int gml_asset_index_of; +/// Wraps a C++ pointer for GML. +template using gml_ptr = T*; +/// Same as gml_ptr, but replaces the GML-side pointer by a nullptr after passing it to C++ +template using gml_ptr_destroy = T*; +/// Wraps any ID (or anything that casts to int64, really) for GML. +template using gml_id = T; +/// Same as gml_id, but replaces the GML-side ID by a 0 after passing it to C++ +template using gml_id_destroy = T; + +class gml_buffer { +private: + uint8_t* _data; + int32_t _size; + int32_t _tell; +public: + gml_buffer() : _data(nullptr), _tell(0), _size(0) {} + gml_buffer(uint8_t* data, int32_t size, int32_t tell) : _data(data), _size(size), _tell(tell) {} + + inline uint8_t* data() { return _data; } + inline int32_t tell() { return _tell; } + inline int32_t size() { return _size; } +}; + +class gml_istream { + uint8_t* pos; + uint8_t* start; +public: + gml_istream(void* origin) : pos((uint8_t*)origin), start((uint8_t*)origin) {} + + template T read() { + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable to be read"); + T result{}; + std::memcpy(&result, pos, sizeof(T)); + pos += sizeof(T); + return result; + } + + char* read_string() { + char* r = (char*)pos; + while (*pos != 0) pos++; + pos++; + return r; + } + + template std::vector read_vector() { + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable to be read"); + auto n = read(); + std::vector vec(n); + std::memcpy(vec.data(), pos, sizeof(T) * n); + pos += sizeof(T) * n; + return vec; + } + #ifdef tiny_array_h + template tiny_const_array read_tiny_const_array() { + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable to be read"); + auto n = read(); + tiny_const_array arr((T*)pos, sizeof(T)); + pos += sizeof(T) * n; + return arr; + } + #endif + + std::vector read_string_vector() { + auto n = read(); + std::vector vec(n); + for (auto i = 0u; i < n; i++) { + vec[i] = read_string(); + } + return vec; + } + + gml_buffer read_gml_buffer() { + auto _data = (uint8_t*)read(); + auto _size = read(); + auto _tell = read(); + return gml_buffer(_data, _size, _tell); + } + + #ifdef tiny_optional_h + template tiny_optional read_tiny_optional() { + if (read()) { + return read; + } else return {}; + } + #endif + + #pragma region Tuples + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + template + std::tuple read_tuple() { + std::tuple tup; + std::apply([this](auto&&... arg) { + (( + arg = this->read>() + ), ...); + }, tup); + return tup; + } + + template optional read_optional() { + if (read()) { + return read; + } else return {}; + } + #else + template std::tuple read_tuple() { + A a = read(); + B b = read(); + return std::tuple(a, b); + } + + template std::tuple read_tuple() { + A a = read(); + B b = read(); + C c = read(); + return std::tuple(a, b, c); + } + + template std::tuple read_tuple() { + A a = read(); + B b = read(); + C c = read(); + D d = read(); + return std::tuple(a, b, c, d); + } + #endif +}; + +class gml_ostream { + uint8_t* pos; + uint8_t* start; +public: + gml_ostream(void* origin) : pos((uint8_t*)origin), start((uint8_t*)origin) {} + + template void write(T val) { + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable to be write"); + memcpy(pos, &val, sizeof(T)); + pos += sizeof(T); + } + + void write_string(const char* s) { + for (int i = 0; s[i] != 0; i++) write(s[i]); + write(0); + } + + template void write_vector(std::vector& vec) { + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable to be write"); + auto n = vec.size(); + write((uint32_t)n); + memcpy(pos, vec.data(), n * sizeof(T)); + pos += n * sizeof(T); + } + + #ifdef tiny_array_h + template void write_tiny_array(tiny_array& arr) { + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable to be write"); + auto n = arr.size(); + write(n); + memcpy(pos, arr.data(), n * sizeof(T)); + pos += n * sizeof(T); + } + template void write_tiny_const_array(tiny_const_array& arr) { + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable to be write"); + auto n = arr.size(); + write(n); + memcpy(pos, arr.data(), n * sizeof(T)); + pos += n * sizeof(T); + } + #endif + + void write_string_vector(std::vector vec) { + auto n = vec.size(); + write((uint32_t)n); + for (auto i = 0u; i < n; i++) { + write_string(vec[i]); + } + } + + #ifdef tiny_optional_h + template void write_tiny_optional(tiny_optional& val) { + auto hasValue = val.has_value(); + write(hasValue); + if (hasValue) write(val.value()); + } + #endif + + #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) + template + void write_tuple(std::tuple tup) { + std::apply([this](auto&&... arg) { + (this->write(arg), ...); + }, tup); + } + + template void write_optional(optional& val) { + auto hasValue = val.has_value(); + write(hasValue); + if (hasValue) write(val.value()); + } + #else + template void write_tuple(std::tuple& tup) { + write(std::get<0>(tup)); + write(std::get<1>(tup)); + } + template void write_tuple(std::tuple& tup) { + write(std::get<0>(tup)); + write(std::get<1>(tup)); + write(std::get<2>(tup)); + } + template void write_tuple(std::tuple& tup) { + write(std::get<0>(tup)); + write(std::get<1>(tup)); + write(std::get<2>(tup)); + write(std::get<3>(tup)); + } + #endif +}; + +class gmk_buffer { + uint8_t* buf = 0; + int pos = 0; + int len = 0; +public: + gmk_buffer() {} + uint8_t* prepare(int size) { + if (len < size) { + auto nb = (uint8_t*)realloc(buf, size); + if (nb == nullptr) { + show_error("Failed to reallocate %u bytes in gmk_buffer::prepare", size); + return nullptr; + } + len = size; + buf = nb; + if (buf == 0) MessageBoxA(0, "It would app", "", 0); + } + pos = 0; + return buf; + } + void init() { + buf = 0; + pos = 0; + len = 0; + } + void rewind() { pos = 0; } + inline uint8_t* data() { return buf; } + // + template void write(T val) { + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable to be write"); + int next = pos + sizeof(T); + if (next > len) { + auto nl = len; + while (nl < next) nl *= 2; + auto nb = (uint8_t*)realloc(buf, nl); + if (nb == nullptr) { + show_error("Failed to reallocate %u bytes in gmk_buffer::write", nl); + return; + } + len = nl; + buf = nb; + } + memcpy(buf + pos, &val, sizeof(T)); + pos = next; + } + template T read() { + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable to be read"); + int next = pos + sizeof(T); + T result{}; + if (next > len) return result; + memcpy(&result, buf + pos, sizeof(T)); + pos = next; + return result; + } +}; diff --git a/snippets/named_events.cpp b/snippets/named_events.cpp new file mode 100644 index 0000000..acb1dcc --- /dev/null +++ b/snippets/named_events.cpp @@ -0,0 +1,195 @@ +#include "stdafx.h" +#include +#include +#include + +struct gml_event_pair { + int type, number; + gml_event_pair() : type(-1), number(-1) {} + gml_event_pair(int _type, int _number) : type(_type), number(_number) {} +}; +std::unordered_map gml_named_events{ + {"properties", gml_event_pair(-1, 0)} +}; + +enum class gml_event_type_arg : int { + index, + object, + key, +}; +struct gml_event_type_pair { + int type; + gml_event_type_arg arg; + gml_event_type_pair() : type(-1), arg(gml_event_type_arg::index) {} + gml_event_type_pair(int _type) : type(_type), arg(gml_event_type_arg::index) {} + gml_event_type_pair(int _type, gml_event_type_arg _number) : type(_type), arg(_number) {} +}; +std::unordered_map gml_named_event_types{ + {"create", gml_event_type_pair(0)}, + {"destroy", gml_event_type_pair(1)}, + {"alarm", gml_event_type_pair(2)}, + {"step", gml_event_type_pair(3)}, + {"collision", gml_event_type_pair(4, gml_event_type_arg::object)}, + {"keyboard", gml_event_type_pair(5, gml_event_type_arg::key)}, + {"mouse", gml_event_type_pair(6)}, + {"other", gml_event_type_pair(7)}, + {"draw", gml_event_type_pair(8)}, + {"keypress", gml_event_type_pair(9, gml_event_type_arg::key)}, + {"keyrelease", gml_event_type_pair(10, gml_event_type_arg::key)}, +}; + +std::unordered_map gml_keycodes_init() { + std::unordered_map map{ + {"vk_nokey", 0}, + {"vk_anykey", 1}, + {"vk_backspace", 8}, + {"vk_tab", 9}, + {"vk_return", 13}, + {"vk_enter", 13}, + {"vk_shift", 16}, + {"vk_control", 17}, + {"vk_alt", 18}, + {"vk_pause", 19}, + {"vk_escape", 27}, + {"vk_space", 32}, + {"vk_pageup", 33}, + {"vk_pagedown", 34}, + {"vk_end", 35}, + {"vk_home", 36}, + {"vk_left", 37}, + {"vk_up", 38}, + {"vk_right", 39}, + {"vk_down", 40}, + {"vk_printscreen", 44}, + {"vk_insert", 45}, + {"vk_delete", 46}, + {"vk_numpad0", 96}, + {"vk_numpad1", 97}, + {"vk_numpad2", 98}, + {"vk_numpad3", 99}, + {"vk_numpad4", 100}, + {"vk_numpad5", 101}, + {"vk_numpad6", 102}, + {"vk_numpad7", 103}, + {"vk_numpad8", 104}, + {"vk_numpad9", 105}, + {"vk_multiply", 106}, + {"vk_add", 107}, + {"vk_subtract", 109}, + {"vk_decimal", 110}, + {"vk_divide", 111}, + {"vk_lshift", 160}, + {"vk_rshift", 161}, + {"vk_lcontrol", 162}, + {"vk_rcontrol", 163}, + {"vk_lalt", 164}, + {"vk_ralt", 165}, + }; + for (int c = 'A'; c <= 'Z'; c++) map[std::string(1, c)] = c; + for (int c = '0'; c <= '9'; c++) map[std::string(1, c)] = c; + for (int i = 1; i <= 24; i++) { + map["vk_f" + std::to_string(i)] = 111 + i; + } + return map; +} +std::unordered_map gml_keycodes = gml_keycodes_init(); + +/// +dllx double snippet_event_get_type(const char* name) { + static std::string str{}; + str.assign(name); + auto pos = str.find(':'); + if (pos != std::string::npos) { + auto pair = gml_named_event_types.find(str.substr(0, pos)); + if (pair == gml_named_event_types.end()) return -1; + return pair->second.type; + } else { + auto pair = gml_named_events.find(name); + if (pair == gml_named_events.end()) return -1; + return pair->second.type; + } +} + +static std::string snippet_event_object; +/// +dllx double snippet_event_get_number(const char* name) { + static std::string str{}; + str.assign(name); + auto pos = str.find(':'); + if (pos != std::string::npos) { + auto pair = gml_named_event_types.find(str.substr(0, pos)); + if (pair == gml_named_event_types.end()) return -1; + switch (pair->second.arg) { + case gml_event_type_arg::index: { + int numb = 0; + if (std::sscanf(str.c_str() + pos + 1, "%d", &numb)) { + if (numb < 0) numb = -1; + return numb; + } + return -1; + }; + case gml_event_type_arg::object: + snippet_event_object = str.substr(pos + 1); + return -2; + case gml_event_type_arg::key: { + auto key = str.substr(pos + 1); + auto kp = gml_keycodes.find(key); + if (kp != gml_keycodes.end()) kp->second; + + int numb = 0; + if (std::sscanf(key.c_str(), "%d", &numb)) { + if (numb < 0) numb = -1; + return numb; + } + + return -1; + }; + default: return -1; + } + } else { + auto pair = gml_named_events.find(name); + if (pair == gml_named_events.end()) return -1; + return pair->second.number; + } +} +/// +dllx const char* snippet_event_get_number_object() { + return snippet_event_object.c_str(); +} + +/// +dllx double snippet_event_register(const char* name, double type, double number) { + gml_event_pair pair{}; + pair.type = (int)type; + pair.number = (int)number; + gml_named_events[name] = pair; + return 1; +} + +/// +dllx double snippet_event_register_type(const char* name, double type, double arg_type) { + gml_event_type_pair pair{}; + pair.type = (int)type; + pair.arg = (gml_event_type_arg)arg_type; + gml_named_event_types[name] = pair; + return 1; +} + +/// +dllx double snippet_parse_event_file(const char* path) { + std::ifstream fs(path); + std::string line{}; + char ename[33]{}; + int n = 0; + while (std::getline(fs, line)) { + if (line.length() == 0) continue; + int type = 0, number = 0; + if (std::sscanf(line.c_str(), "%d:%d %32s", &type, &number, ename) > 0) { + snippet_event_register(ename, type, number); + //std::string m = std::string("type: ") + std::to_string(type) + " n:" + std::to_string(number) + " s:" + ename; + //MessageBoxA(0, m.c_str(), "", 0); + n += 1; + } + } + return n; +} diff --git a/snippets/postBuild.bat b/snippets/postBuild.bat new file mode 100644 index 0000000..e134f0f --- /dev/null +++ b/snippets/postBuild.bat @@ -0,0 +1,39 @@ +@echo off +set dllPath=%~1 +set solutionDir=%~2 +set projectDir=%~3 +set arch=%~4 +set config=%~5 + +echo Running post-build for %config% + +set extName=snippets +set dllName=snippets +set dllRel=%dllName%.dll +set cppRel=%dllName%.cpp +set outDir=%solutionDir%snippets_gml +set cppPath=%outDir%\%cppRel% + +echo Combining the source files... +type "%projectDir%*.h" "%projectDir%*.cpp" >"%cppPath%" 2>nul + +where /q gmxgen +if %ERRORLEVEL% EQU 0 ( +gmxgen "%outDir%\%extName%.gmxgen81" ^ + --copy "%dllPath%" "%dllRel%:%arch%" ^ + --copy "%outDir%/snippets_core.gml" "snippets_core_gm81.gml"^ + --gmk-loader snippet_init_dll + +) else ( + + copy /Y "%dllPath%" "%outDir%\%dllRel%" + + echo postBuild.bat: Warning N/A: Could not find GmxGen - extensions will not be updated automatically. See https://github.com/YAL-GameMaker-Tools/GmxGen for setup. +) +:: copy the DLL to the test project too: +copy /Y "%outDir%\%dllRel%" "%outDir%\tester\%dllRel%" + +:: clean up the mess that we made: +del /Q "%outDir%\snippets_core_gm81.gml" +del /Q "%outDir%\snippets_discard.gml" +del /Q "%outDir%\snippets_autogen.gml" diff --git a/snippets/preBuild.bat b/snippets/preBuild.bat new file mode 100644 index 0000000..c53dc20 --- /dev/null +++ b/snippets/preBuild.bat @@ -0,0 +1,19 @@ +@echo off +set dllPath=%~1 +set solutionDir=%~2 +set projectDir=%~3 +set arch=%~4 +set config=%~5 + +echo Running pre-build for %config% + +where /q GmlCppExtFuncs +if %ERRORLEVEL% EQU 0 ( + echo Running GmlCppExtFuncs... + GmlCppExtFuncs ^ + --prefix snippets^ + --cpp "%projectDir%autogen.cpp"^ + --gml "%solutionDir%snippets_gml/snippets_discard.gml"^ + --gmk "%solutionDir%snippets_gml/snippets_autogen.gml"^ + %projectDir%snippets.cpp +) \ No newline at end of file diff --git a/snippets/resource1.h b/snippets/resource1.h new file mode 100644 index 0000000..6825f47 --- /dev/null +++ b/snippets/resource1.h @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by snippets.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/snippets/snippets.aps b/snippets/snippets.aps new file mode 100644 index 0000000000000000000000000000000000000000..849b65d6298994d03794be7bc80435233c288f0c GIT binary patch literal 2688 zcmbVO&5qkt6#iU-)Zs^r5JF{x(xHnMDH&%vEoCG`J&tE;HL*vwC+$d)Ovso_)JZ0a zlMd`yuw;qE3$SFt3$U*c572da09ddleCK)`+sQN)*t+(;=l`B_&u0TbnPWCf2B(E< zhpQVL5AX=Pe9vZD%6}`JJi7|GJMDV(w7uUMM9t2VXxuj9IGV)mc-S9}E}c}zT^e}7 zQMCU|nbomYO6^})lj|5q@!53TjcU~sFpAJP@I%LX9E6_byN8}>g)O6TXrZRpu$JeW zZnJ4P^$Yg4u2bNRqJR^4Zey-b{+oHef7G;6b+OK^r$L?fhm1=_q_zC8WqH2sI-%|C zxv1e?Xm;HU{lExp6E`chTc|)&y7K&kSx>GX`6}k&H^s>3A>dwZ$7~$dxktsl!FuGW zTbELA&#AS$R9uYm|CR1DhC7?dz(2HKjD3^k0rd5(hAwu{Mja8J^1Y7^2Antfe!};d zGy^g32opZr97FUm;{9^Un7kNgm{PyXc@0&Z(66a{9gup49-rc?j6K>rRT^d7#Miio zySPP9k4PWln6l@zR>niFlNf5y$+yYvQgcd~h-;x%)!4!o-*U^kO^E@Y=gM9ZTN01t zLVBl|qslx-S44nUzLKnOe#ye-m#pZer39|gYSB-1$+VBtgq+30K%z!^i6W-q zm{x;(q?lbdc3m&P?PTFufp>)MWMS_+u4my+vO2PSCRV99EHVPk~%xR#Ywo(6%`OSa{5*4Too`fkU2Ki}V!xbbL_a zQeAmWdY_cl`bnkp`XBX&-P7rDRNhE|WaDi@6JC3zEs_|J&NCqIFZl%SW1YGtWd`i|4&}dLObJSe{Ui3?DR1dggSIAI zkGbx19+CeYdr+JE6P$_JwGzjOvVH0e#SHOb!h1yS4mNrB$eWNlWgJy%i2qG`Gg$Y^ zB{(G-17cQ%7K#WZwYZv#p`{{>bG`+iQtXgDZ%|rO_>$~q$o-xcb`5-i4=K~2t)Aja zhDOYd?5wADBY3w+6NEE~Zsk|z?PC>#dtpziCNZQ~DJ#M0oRls8i~}l z%0W?PF%ye)&sj~^O23qT;PEWtUUoXunf%L$ zuT}ptFUbF?AhY~GBH!wt=`XXh{H>O6;t3sRGRxn@UCMmVHqK<0zX^ipe-~ty@mz50 k{_Fn@w*;%cU8$2~EsrmPIKQvd5s4xu2_F4LotNR!zgJex*#H0l literal 0 HcmV?d00001 diff --git a/snippets/snippets.cpp b/snippets/snippets.cpp new file mode 100644 index 0000000..fed4243 --- /dev/null +++ b/snippets/snippets.cpp @@ -0,0 +1,342 @@ +/// @author YellowAfterlife + +#include "stdafx.h" +#include +#include +#include +#include +#include +#include +#include +#include "CharTools.h" + +const char* rets(std::string& s) { + static std::string _str{}; + _str = s; + return _str.c_str(); +} + +#define set_contains(set, thing) (set.find(thing) != set.end()) + +static std::unordered_set gml_keywords{ + "if", "then", "else", "begin", "end", "for", "while", "do", "until", "repeat", + "switch", "case", "default", "break", "continue", "with", "exit", "return", + "self", "other", "noone", "all", "global", "local", + "mod", "div", "not", "and", "or", "xor", +}; +static bool is_gml_keyword(std::string& s) { + return set_contains(gml_keywords, s); +} + +static std::unordered_set gml_functions{}; + +class snippet_preproc_t { +public: + std::stringstream out{}; + std::string out_name{}; + std::queue names{}; + std::queue codes{}; + /// (including the ones that were empty and weren't added to output) + int found = 0; + int pos = 0; + int len = 0; + int start = 0; + const char* str = nullptr; + snippet_preproc_t() {} + + void skipSpaces() { + while (pos < len) { + auto c = str[pos]; + if (CharTools::isSpace(c)) pos += 1; else break; + } + } + void skipLine() { + while (pos < len) { + if (str[pos++] == '\n') break; + } + } + std::string slice(int start, int end) { + return std::string(str + start, end - start); + } + std::string readIdent(bool afterFirst = true) { + auto identStart = pos; + if (afterFirst) identStart -= 1; + while (pos < len) { + auto c = str[pos]; + if (CharTools::isIdent(c)) pos += 1; else break; + } + return std::string(str + identStart, pos - identStart); + } + void flush(int till) { + if (till > start) out.write(str + start, till - start); + } + void flushPart(int till, bool last) { + auto first = found == 0; + found += 1; + + // #define right at the start? + if (till == 0 && !last) return; + + flush(till); + auto code = out.str(); + + // if the snip is 100% spaces, we'd like it trimmed: + int len = (int)code.length(); + int pos = 0; + while (pos < len) { + if (CharTools::isSpace(code[pos])) { + pos += 1; + } else break; + } + if (pos >= len) code = ""; + + // and we don't want to add a spaces-only first section unless that's also the last section + if (!first || last || !code.empty()) { + names.push(out_name); + codes.push(code); + } + out = std::stringstream(); + } + int run(const char* first_name, const char* code, const char* splitter) { + str = code; + pos = 0; + start = 0; + found = 0; + len = strlen(code); + out = std::stringstream(); + out_name = first_name; + while (!names.empty()) names.pop(); + while (!codes.empty()) codes.pop(); + + bool is_script = std::string(splitter) == "define"; + + while (pos < len) { + auto c = str[pos++]; + if (CharTools::isSpace(c)) continue; + + switch (c) { + case '/': + switch (str[pos]) { + case '/': + skipLine(); + continue; + case '*': + while (pos < len) { + c = str[pos]; + if (c == '/' && str[pos - 1] == '*') break; + if (c == '#' && str[pos - 1] == '\n') { + auto beforeWord = pos++; + auto word = readIdent(false); + if (word == splitter) { + pos = beforeWord; + break; + } + } + pos += 1; + } + continue; + } + continue; + case '"': case '\'': + while (pos < len) { + if (str[pos++] == c) break; + } + continue; + } + if (CharTools::isIdentStart(c)) { + auto before_pos = pos - 1; + auto word = readIdent(); + auto wlen = word.size(); + + if (is_script && word == "return") { // `return X` -> `for ({}; true; exit) global.__snippet_result = X` + flush(before_pos); + out << "for ({}; true; exit) global.__snippet__result ="; + start = pos; + continue; + } + + if (word == "var" || word == "globalvar") { // `var i = 1` -> `var i; i = 1` + skipSpaces(); + auto before_vname = pos; + auto vname = readIdent(false); + if (is_gml_keyword(vname)) { // `var var name` + pos = before_vname; + continue; + } + auto before_equ = pos; + skipSpaces(); + if (str[pos] == '=' || str[pos] == ':' && str[pos + 1] == '=') { + flush(before_pos); + out << word << " " << vname << "; " << vname; + start = before_equ; + } + continue; + } + + if (is_script && word == "argument_count") { + flush(before_pos); + out << "global.__snippet__argument_count"; + start = pos; + continue; + } + + // `argument[#]` / `argument#` -> `global.__snippet__argument[#]` + const auto argn = sizeof("argument") - 1; + if (is_script && wlen >= argn && wlen <= argn + 2 && strncmp(word.c_str(), "argument", argn) == 0) do { + int argi; + if (wlen == argn) { + argi = -1; + } else { + argi = word[argn] - '0'; + if (argi < 0 || argi > 9) break; + if (wlen > argn + 1) { + argi = word[argn + 1] - '0'; + if (argi < 0 || argi > 5) break; + argi += 10; + } + } + flush(before_pos); + out << "global.__snippet__argument"; + if (argi >= 0) { + out << "[" << std::to_string(argi) << "]"; + } + start = pos; + continue; + } while (false); + + if (word == splitter && before_pos > 0 && str[before_pos - 1] == '#' + && (before_pos == 1 || str[before_pos - 2] == '\n') + ) { // #define + skipSpaces(); + auto name_start = pos; + while (pos < len) { // name spans till eol/space/`(` + c = str[pos]; + if (c == '(') break; + if (CharTools::isSpace(c)) break; + pos += 1; + } + auto name = slice(name_start, pos); + flushPart(before_pos - 1, false); + out_name = name; + skipLine(); + start = pos; + continue; + } + + if (!is_gml_keyword(word) && word != "snippet_call" && !set_contains(gml_functions, word)) { // `func(` -> + auto peek = pos; + bool isCall = false; + while (peek < len) { + auto c1 = str[peek++]; + if (!CharTools::isSpace(c1)) { + isCall = c1 == '('; + break; + } + } + if (isCall) { + flush(before_pos); + pos = peek; + // it's okay! Trailing commas are allowed in argument lists in GML + out << "snippet_call(\"" << word << "\","; + start = pos; + } + } + } + } + flushPart(pos, true); + return names.size(); + } +} snippet_preproc; +/// #gmki +dllx double snippet_preproc_run(const char* name, const char* code, const char* splitter) { + return snippet_preproc.run(name, code, splitter); +} +/// #gmki +dllx const char* snippet_preproc_pop_name() { + static std::string s{}; + s = snippet_preproc.names.front(); + snippet_preproc.names.pop(); + return s.c_str(); +} +/// #gmki +dllx const char* snippet_preproc_pop_code() { + static std::string s{}; + s = snippet_preproc.codes.front(); + snippet_preproc.codes.pop(); + return s.c_str(); +} +/// #gmki +dllx const char* snippet_preproc_concat_names() { + static std::queue tmp{}; + tmp = snippet_preproc.names; + std::stringstream out{}; + auto sep = false; + while (!tmp.empty()) { + if (sep) out << "\n"; else sep = true; + out << tmp.front(); + tmp.pop(); + } + static std::string result{}; + result = out.str(); + return result.c_str(); +} + +bool snippet_def_parse_impl(const char* def) { + int pos = 0; + int len = strlen(def); + + // spaces at line start: + while (pos < len) { + if (CharTools::isSpace(def[pos])) pos += 1; else break; + } + + // read name: + int name_start = pos; + if (!CharTools::isIdentStart(def[pos])) return false; + while (pos < len) { + if (CharTools::isIdent(def[pos])) pos += 1; else break; + } + auto name = std::string(def + name_start, pos - name_start); + + // more spaces? + while (pos < len) { + if (CharTools::isSpace(def[pos])) pos += 1; else break; + } + + if (def[pos] == '(') { // a function! + if (!set_contains(gml_functions, name)) gml_functions.insert(name); + return true; + } + + return false; +} + +/// +dllx double snippet_function_add(const char* name) { + if (set_contains(gml_functions, name)) return -1; + gml_functions.insert(name); + return true; +} +/// +dllx double snippet_function_remove(const char* name) { + auto item = gml_functions.find(name); + if (item == gml_functions.end()) return -1; + gml_functions.erase(item); + return 1; +} + +/// +dllx double snippet_parse_api_entry(const char* line) { + return snippet_def_parse_impl(line); +} +/// +dllx double snippet_parse_api_file(const char* path) { + std::ifstream fs(path); + std::string line{}; + int n = 0; + while (std::getline(fs, line)) { + if (snippet_def_parse_impl(line.c_str())) n += 1; + } + return n; +} + diff --git a/snippets/snippets.rc b/snippets/snippets.rc new file mode 100644 index 0000000000000000000000000000000000000000..9546b6dc6f1d20556dfc3109fc483a4c18b1e071 GIT binary patch literal 5030 zcmd6rS#Q%o5Xa{kiSJ<27b;rPmcGDSk2F-IhsYt2Dn&h#G$JHbod}Tl?7;88+ih&e zhF(IJgm;UpU;#0{uEPmsWB3qFr*BeMc$o zTXt+sYgyZNZQqWpYagu!beH|1HS9BxCcg)^4Wz+7NFXW7cLnLf8d)97WUbuCP80iz z{!^?YJG9XH6Tkaty@Q^zM-BJ}ch)EW_QE%3Ur(2|fB7sHB=XTQ!&Zu=K6*baHiG2? z-*T-%x`;TRky|mIIz{KmUZx<+Iew25Su}JOdXdVe3wUhV9&zNes7c1O;krX4b&012 zm-znViV7)P@c2m7ibtD#TXv^5fF1&Ev({Z?21vkb61&1#fp-(UZBFwvI=hBkTRQb>2s?-T_>?{3T&LWB4JW!(hp0nht?*&<=isCQ% zEw8#P#+z(c%;BLKoQ#`t?WJ$H%OzP-8cC?XBmHSlE_qi1{jnRdxpNxWSlJ+XkK1df1Y6o2cx zVStB*Xx76|V`QCVdPhFDP{Y$)rOBGTbsC-Vo9;q$n!H{b-iEb(LRDNjA%nsO@GO1>F^^9?F}YblylkNOVF+dptlujzAwEq0+xesTG{2?PfRpqEF|#wiv(BBYRiu&zt3;TW_JH+^ldOu>zp`J2gX-iJR}T(xfyIKv`Ld>S zH^`_jzO~ys-xK+K8^|(1){(RNmHlv$GC;rSt;OY!^cz+E9ar6-&Kt*^JRyf>*mO!g zNY<$P=sBOlg2s!GbR>7s|N2pxk@i&!Zu-86v8p;@GM-eYeBLOU*O?Mk6Ou7Imv+9> z`{J4CX*zOwI#yN^X`j4(b^qHp>*7?IV*DbTl}wL(eL8)2h8zT6951J literal 0 HcmV?d00001 diff --git a/snippets/snippets.vcxproj b/snippets/snippets.vcxproj new file mode 100644 index 0000000..28494fd --- /dev/null +++ b/snippets/snippets.vcxproj @@ -0,0 +1,211 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {EA16C6EF-C7F3-42BC-A4AC-EBEE2E84C450} + Win32Proj + snippets + 10.0 + + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;snippets_EXPORTS;%(PreprocessorDefinitions) + + + Windows + true + + + cmd /C postBuild.bat "$(TargetPath)" "$(SolutionDir)" "$(ProjectDir)" "$(PlatformTarget)" "$(ConfigurationName)" + + + cmd /C preBuild.bat "$(TargetPath)" "$(SolutionDir)" "$(ProjectDir)" "$(PlatformTarget)" "$(ConfigurationName)" + + + + + + + Level3 + Disabled + _DEBUG;_WINDOWS;_USRDLL;snippets_EXPORTS;%(PreprocessorDefinitions) + + + Windows + true + + + cmd /C postBuild.bat "$(TargetPath)" "$(SolutionDir)" "$(ProjectDir)" "$(PlatformTarget)" "$(ConfigurationName)" + + + cmd /C preBuild.bat "$(TargetPath)" "$(SolutionDir)" "$(ProjectDir)" "$(PlatformTarget)" "$(ConfigurationName)" + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;snippets_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + None + + + Windows + true + true + No + + + cmd /C postBuild.bat "$(TargetPath)" "$(SolutionDir)" "$(ProjectDir)" "$(PlatformTarget)" "$(ConfigurationName)" + + + cmd /C preBuild.bat "$(TargetPath)" "$(SolutionDir)" "$(ProjectDir)" "$(PlatformTarget)" "$(ConfigurationName)" + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_WINDOWS;_USRDLL;snippets_EXPORTS;%(PreprocessorDefinitions) + None + MultiThreaded + + + Windows + true + true + false + + + cmd /C postBuild.bat "$(TargetPath)" "$(SolutionDir)" "$(ProjectDir)" "$(PlatformTarget)" "$(ConfigurationName)" + + + cmd /C preBuild.bat "$(TargetPath)" "$(SolutionDir)" "$(ProjectDir)" "$(PlatformTarget)" "$(ConfigurationName)" + + + + + + + + + + + + + false + + + false + + + false + + + false + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/snippets/snippets.vcxproj.filters b/snippets/snippets.vcxproj.filters new file mode 100644 index 0000000..647eeb6 --- /dev/null +++ b/snippets/snippets.vcxproj.filters @@ -0,0 +1,73 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {9a9fbe1a-e106-412a-839c-4a270587c3d1} + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Source Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + + + Build scripts + + + Build scripts + + + Build scripts + + + \ No newline at end of file diff --git a/snippets/snippets.vcxproj.user b/snippets/snippets.vcxproj.user new file mode 100644 index 0000000..89c6d0b --- /dev/null +++ b/snippets/snippets.vcxproj.user @@ -0,0 +1,22 @@ + + + + + Default + + + Default + $(NintendoTargetSerialNumber) + $(NintendoTargetName) + + + Default + $(NintendoTargetSerialNumber) + $(NintendoTargetName) + + + Default + $(NintendoTargetSerialNumber) + $(NintendoTargetName) + + \ No newline at end of file diff --git a/snippets/sniptools.cpp b/snippets/sniptools.cpp new file mode 100644 index 0000000..961979d --- /dev/null +++ b/snippets/sniptools.cpp @@ -0,0 +1,80 @@ +#include "stdafx.h" +#include +#include +#include "CharTools.h" + +/// +dllx const char* sniptools_file_get_contents(const char* path) { + std::ifstream fs(path); + std::ostringstream out{}; + out << fs.rdbuf(); + static std::string result{}; + result.assign(out.str()); + return result.c_str(); +} +/// +dllx const char* sniptools_string_trim(const char* str) { + static std::string s; + s = str; + s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int ch) { + return !std::isspace(ch); + })); + s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) { + return !std::isspace(ch); + }).base(), s.end()); + return s.c_str(); +} +/// +dllx const char* sniptools_string_trim_start(const char* str) { + static std::string s; + s = str; + s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int ch) { + return !std::isspace(ch); + })); + return s.c_str(); +} +/// +dllx const char* sniptools_string_trim_end(const char* str) { + static std::string s; + s = str; + s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) { + return !std::isspace(ch); + }).base(), s.end()); + return s.c_str(); +} +/// +dllx double sniptools_string_is_ident(const char* str) { + int n = strlen(str); + if (n == 0 || !CharTools::isIdentStart(str[0])) return false; + for (int i = 1; i < n; i++) { + if (!CharTools::isIdent(str[i])) return false; + } + return true; +} + +static std::queue sniptools_string_split_parts{}; +/// +dllx double sniptools_string_split_start(const char* str, const char* sep) { + static std::string tmp{}; + tmp = str; + + sniptools_string_split_parts = std::queue(); + size_t pos = 0; + size_t start = 0; + while ((pos = tmp.find(sep, start)) != std::string::npos) { + std::string part = tmp.substr(start, pos - start); + sniptools_string_split_parts.push(part); + start = pos + 1; + } + std::string part = tmp.substr(start); + sniptools_string_split_parts.push(part); + return sniptools_string_split_parts.size(); +} +/// +dllx const char* sniptools_string_split_next() { + if (sniptools_string_split_parts.empty()) return ""; + static std::string result{}; + result = sniptools_string_split_parts.front(); + sniptools_string_split_parts.pop(); + return result.c_str(); +} \ No newline at end of file diff --git a/snippets/stdafx.cpp b/snippets/stdafx.cpp new file mode 100644 index 0000000..c301026 --- /dev/null +++ b/snippets/stdafx.cpp @@ -0,0 +1,23 @@ +// stdafx.cpp : source file that includes just the standard includes +// snippets.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file + +#ifdef _WINDOWS +// https://yal.cc/printf-without-standard-library/ +void show_error(const char* pszFormat, ...) { + char buf[1024]; + va_list argList; + va_start(argList, pszFormat); + wvsprintfA(buf, pszFormat, argList); + va_end(argList); + auto len = strlen(buf); + buf[len] = '\n'; + buf[++len] = 0; + MessageBoxA(0, buf, gm_extension_name, MB_OK | MB_ICONERROR); +} +#endif diff --git a/snippets/stdafx.h b/snippets/stdafx.h new file mode 100644 index 0000000..a84bc8e --- /dev/null +++ b/snippets/stdafx.h @@ -0,0 +1,32 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once +#define gm_extension_name "snippets" + +#ifdef _WINDOWS + #include "targetver.h" + + #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + #include +#endif + +#if defined(WIN32) +#define dllx extern "C" __declspec(dllexport) +#elif defined(GNUC) +#define dllx extern "C" __attribute__ ((visibility("default"))) +#else +#define dllx extern "C" +#endif + +#define trace(...) { printf("[" gm_extension_name ":%d] ", __LINE__); printf(__VA_ARGS__); printf("\n"); fflush(stdout); } + +void show_error(const char* format, ...); + +#include "gml_ext.h" +#include +#include + +// TODO: reference additional headers your program requires here \ No newline at end of file diff --git a/snippets/targetver.h b/snippets/targetver.h new file mode 100644 index 0000000..87c0086 --- /dev/null +++ b/snippets/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/snippets_gml/.gitignore b/snippets_gml/.gitignore new file mode 100644 index 0000000..12c5023 --- /dev/null +++ b/snippets_gml/.gitignore @@ -0,0 +1,5 @@ +snippets.cpp +/snippets.dll +*.gb1 +*.zip +tester/*.exe \ No newline at end of file diff --git a/snippets_gml/extension.gmk-snips b/snippets_gml/extension.gmk-snips new file mode 100644 index 0000000..c6a570b --- /dev/null +++ b/snippets_gml/extension.gmk-snips @@ -0,0 +1,3 @@ +# comment +snippets.gml +snippets_core.gml \ No newline at end of file diff --git a/snippets_gml/pack.bat b/snippets_gml/pack.bat new file mode 100644 index 0000000..40f4eb7 --- /dev/null +++ b/snippets_gml/pack.bat @@ -0,0 +1,11 @@ +del /Q snippets-ext.zip +del /Q snippets-tester.zip + +cmd /C 7z a snippets-ext.zip snippets.gml snippets.dll +cd tester +cmd /C 7z a ..\snippets-ext.zip fnames events.gml + +cmd /C 7z a ..\snippets-tester.zip * +cmd /C 7z d ..\snippets-tester.zip snippet_tester.gb1 + +pause \ No newline at end of file diff --git a/snippets_gml/snippets.gml b/snippets_gml/snippets.gml new file mode 100644 index 0000000..e67c3ee --- /dev/null +++ b/snippets_gml/snippets.gml @@ -0,0 +1,518 @@ +#define snippet_init_dll +/// snippet_init_dll() +var _path, _dir; + +_dir = ""; +_path = _dir + "snippets.dll"; +global.f_snippet_event_get_type = external_define(_path, "snippet_event_get_type", dll_cdecl, ty_real, 1, ty_string); +global.f_snippet_event_get_number = external_define(_path, "snippet_event_get_number", dll_cdecl, ty_real, 1, ty_string); +global.f_snippet_event_get_number_object = external_define(_path, "snippet_event_get_number_object", dll_cdecl, ty_string, 0); +global.f_snippet_event_register = external_define(_path, "snippet_event_register", dll_cdecl, ty_real, 3, ty_string, ty_real, ty_real); +global.f_snippet_event_register_type = external_define(_path, "snippet_event_register_type", dll_cdecl, ty_real, 3, ty_string, ty_real, ty_real); +global.f_snippet_parse_event_file = external_define(_path, "snippet_parse_event_file", dll_cdecl, ty_real, 1, ty_string); +global.f_snippet_function_add = external_define(_path, "snippet_function_add", dll_cdecl, ty_real, 1, ty_string); +global.f_snippet_function_remove = external_define(_path, "snippet_function_remove", dll_cdecl, ty_real, 1, ty_string); +global.f_snippet_parse_api_entry = external_define(_path, "snippet_parse_api_entry", dll_cdecl, ty_real, 1, ty_string); +global.f_snippet_parse_api_file = external_define(_path, "snippet_parse_api_file", dll_cdecl, ty_real, 1, ty_string); +global.f_sniptools_file_get_contents = external_define(_path, "sniptools_file_get_contents", dll_cdecl, ty_string, 1, ty_string); +global.f_sniptools_string_trim = external_define(_path, "sniptools_string_trim", dll_cdecl, ty_string, 1, ty_string); +global.f_sniptools_string_trim_start = external_define(_path, "sniptools_string_trim_start", dll_cdecl, ty_string, 1, ty_string); +global.f_sniptools_string_trim_end = external_define(_path, "sniptools_string_trim_end", dll_cdecl, ty_string, 1, ty_string); +global.f_sniptools_string_is_ident = external_define(_path, "sniptools_string_is_ident", dll_cdecl, ty_real, 1, ty_string); +global.f_sniptools_string_split_start = external_define(_path, "sniptools_string_split_start", dll_cdecl, ty_real, 2, ty_string, ty_string); +global.f_sniptools_string_split_next = external_define(_path, "sniptools_string_split_next", dll_cdecl, ty_string, 0); +global.f_snippet_preproc_run = external_define(_path, "snippet_preproc_run", dll_cdecl, ty_real, 3, ty_string, ty_string, ty_string); +global.f_snippet_preproc_pop_name = external_define(_path, "snippet_preproc_pop_name", dll_cdecl, ty_string, 0); +global.f_snippet_preproc_pop_code = external_define(_path, "snippet_preproc_pop_code", dll_cdecl, ty_string, 0); +global.f_snippet_preproc_concat_names = external_define(_path, "snippet_preproc_concat_names", dll_cdecl, ty_string, 0); + + +#define snippet_init +/// () +snippet_init_dll(); +var i; i = 0; +global.__snippet__argument[0] = 0; +global.__snippet__argument_count = 0; +global.__snippet__result = 0; +global.__snippet__map = ds_map_create(); // name -> ID +global.__snippet__code_map = ds_map_create(); +global.__snippet__next = 100; + +// blank object is used to count objects and as a properties drop-in +global.__snippet__blank_object = object_add(); + +// populate object names<->ids +global.__snippet__object_names = ds_map_create(); +global.__snippet__object_ids = ds_map_create(); +for (i = 0; i < global.__snippet__blank_object; i += 1) if (object_exists(i)) { + var _name; _name = object_get_name(i); + ds_map_add(global.__snippet__object_ids, _name, i); +} + +// contains things like "create\nstep" in case we need to delete events later +global.__snippet__object_events = ds_map_create(); + +snippet_parse_api_file("fnames"); +snippet_parse_event_file("events.gml"); + +// collect scripts: +var _max_gap; _max_gap = 1024; +var _gap; _gap = _max_gap; +var _seen_snippet_init; _seen_snippet_init = false; +while (_gap < _max_gap || !_seen_snippet_init) { + if (script_exists(i)) { + _gap = 0; + var _name; _name = script_get_name(i); + if (!_seen_snippet_init && _name == "snippet_init") _seen_snippet_init = true; + snippet_function_add(_name); + } + i += 1; + _gap += 1; +} +//var _script_time = current_time - _time; + +/*show_message( + "Parse time: " + string(_fnames_time) + + "#Script time: " + string(_script_time) +);*/ + +#define snippet_execute_string +/// (gml_code) +var n; n = external_call(global.f_snippet_preproc_run, "", argument0, "define"); +var _result; _result = 0; +repeat (n) { + var _name; _name = external_call(global.f_snippet_preproc_pop_name); + var _code; _code = external_call(global.f_snippet_preproc_pop_code); + _result = execute_string(_code); +} +return _result; + +#define snippet_define +/// (name, gml_code) +var n; n = external_call(global.f_snippet_preproc_run, argument0, argument1, "define"); +repeat (n) { + var _name; _name = external_call(global.f_snippet_preproc_pop_name); + var _code; _code = external_call(global.f_snippet_preproc_pop_code); + snippet_define_raw(_name, _code); +} + +#define snippet_define_raw +/// (name, raw_gml_code) +var _name; _name = argument0; +var _code; _code = argument1; +// show_message(_name + ":" + chr(10) + _gml); + +// unregister name so that subsequent snippets call the snippet and not the built-in: +snippet_function_remove(_name); + +// one event per snippet: +var _enumb; +if (ds_map_exists(global.__snippet__map, _name)) { + _enumb = ds_map_find_value(global.__snippet__map, _name); + object_event_clear(obj_snippets, ev_alarm, _enumb); + ds_map_replace(global.__snippet__code_map, _name, _code); +} else { + _enumb = global.__snippet__next; + global.__snippet__next += 1; + + ds_map_add(global.__snippet__map, _name, _enumb); + ds_map_add(global.__snippet__code_map, _name, _code); +} +object_event_add(obj_snippets, ev_alarm, _enumb, _code); + +/* one object per snippet: +var _obj; +if (ds_map_exists(global.__snippet__map, _name)) { + _obj = ds_map_find_value(global.__snippet__map, _name); + object_event_clear(_obj, ev_other, 257); +} else { + _obj = object_add(); + ds_map_add(global.__snippet__map, _name, _obj); +} +object_event_add(_obj, ev_other, 257, _code);*/ + +#define snippet_exists +/// (name)-> +return ds_map_exists(global.__snippet__map, argument0); + +#define snippet_get_code +/// (name)-> +if (ds_map_exists(global.__snippet__code_map, argument0)) { + return ds_map_find_value(global.__snippet__code_map, argument0); +} else return ""; + +#define snippet_call +/// (name, ...args) +var _name; _name = argument0; + +// store old arguments: +var _old_argc; _old_argc = global.__snippet__argument_count; +var _old_args; _old_args = global.__snippet__argument; +var i; i = 1; +repeat (_old_argc - 1) { + _old_args[i] = global.__snippet__argument[i]; + i += 1; +} + +// copy new arguments: +var _argc; _argc = argument_count - 1; +global.__snippet__argument_count = _argc; +i = 0; +repeat (_argc) { + global.__snippet__argument[i] = argument[i + 1]; + i += 1; +} + +// clear "extra" arguments: +repeat (_old_argc - _argc) { + global.__snippet__argument[i] = 0; + i += 1; +} + +if (ds_map_exists(global.__snippet__map, _name)) { + // one snippet per event: + var _enumb; _enumb = ds_map_find_value(global.__snippet__map, _name); + event_perform_object(obj_snippets, ev_alarm, _enumb); + //*/ + + /* one snippet per object: + var _obj; _obj = ds_map_find_value(global.__snippet__map, _name); + event_perform_object(_obj, ev_other, 257); + //*/ +} else { + show_error('Snippet "' + _name + '" does not exist!', true); +} + +// restore previous arguments: +global.__snippet__argument_count = _old_argc; +i = 0; +repeat (_old_argc) { + global.__snippet__argument[i] = _old_args[i]; + i += 1; +} + +// clear the extra arguments (the other way around!): +repeat (_argc - _old_argc) { + global.__snippet__argument[i] = 0; + i += 1; +} + +return global.__snippet__result; + +#define snippet_prepare_object +/// (name) +var _name; _name = argument0; +if (ds_map_exists(global.__snippet__object_ids, _name)) { + return ds_map_find_value(global.__snippet__object_ids, _name); +} else { + var _obj; _obj = object_add(); + ds_map_add(global.__snippet__object_ids, _name, _obj); + ds_map_add(global.__snippet__object_names, _obj, _name); + if (sniptools_string_is_ident(_name)) { + // register so that it's globally accessible in code + execute_string('globalvar ' + _name + ';' + _name + ' = argument0', _obj); + } + return _obj; +} + +#define snippet_define_object +/// (name, gml_code) +var _name; _name = argument0; +var n; n = external_call(global.f_snippet_preproc_run, "properties", argument1, "event"); +var _obj; _obj = snippet_prepare_object(_name); + +// clear old events: +var _events; _events = external_call(global.f_snippet_preproc_concat_names); +if (ds_map_exists(global.__snippet__object_events, _obj)) { + var _old_events; _old_events = ds_map_find_value(global.__snippet__object_events, _obj); + repeat (sniptools_string_split_start(_old_events, chr(10))) { + var _ename; _ename = sniptools_string_split_next(); + var _type; _type = snippet_event_get_type(_ename); + var _numb; _numb = snippet_event_get_number(_ename); + if (_type == -1) { + if (_numb != 0) continue; + // revert properties! + object_set_visible(_obj, true); + object_set_depth(_obj, 0); + object_set_persistent(_obj, false); + object_set_parent(_obj, -1); + object_set_sprite(_obj, -1); + object_set_mask(_obj, -1); + object_set_solid(_obj, false); + continue; + } + if (_numb == -1) continue; + if (_numb == -2) { // object + _numb = snippet_object_get_index(snippet_event_get_number_object()); + if (_numb == -1) continue; + } + object_event_clear(_obj, _type, _numb); + } + ds_map_replace(global.__snippet__object_events, _obj, _events); +} else { + ds_map_add(global.__snippet__object_events, _obj, _events); +} + +repeat (n) { + var _ename; _ename = external_call(global.f_snippet_preproc_pop_name); + var _code; _code = external_call(global.f_snippet_preproc_pop_code); + var _type; _type = snippet_event_get_type(_ename); + var _numb; _numb = snippet_event_get_number(_ename); + if (_type == -1) { + if (_numb != 0) { + show_error('"' + _ename + '" is not a known event type!', false); + continue; + } + // properties! + with (instance_create(0, 0, global.__snippet__blank_object)) { + visible = object_get_visible(_obj); + depth = object_get_depth(_obj); + persistent = object_get_persistent(_obj); + parent_index = object_get_parent(_obj); + sprite_index = object_get_sprite(_obj); + mask_index = object_get_mask(_obj); + solid = object_get_solid(_obj); + // + execute_string(_code); + // + object_set_visible(_obj, visible); + object_set_depth(_obj, depth); + object_set_persistent(_obj, persistent); + object_set_parent(_obj, parent_index); + object_set_sprite(_obj, sprite_index); + object_set_mask(_obj, mask_index); + object_set_solid(_obj, solid); + // + instance_destroy(); + } + continue; + } + if (_numb == -1) { + show_error('"' + _ename + '" is not a known event (sub-)type!', false); + continue; + } + if (_numb == -2) { + var _cobj_name; _cobj_name = snippet_event_get_number_object(); + var _cobj; _cobj = snippet_object_get_index(_cobj_name); + if (_cobj == -1) { + show_error('"' + _cobj_name + '" in "' + _ename + '" is not a known object!', false); + continue; + } + _numb = _cobj; + } + object_event_add(_obj, _type, _numb, _code); + /*show_message(_name + + chr(10) + _ename + " -> (" + string(_type) + ", " + string(_numb) + ")" + + chr(10) + _code + );*/ +} +return _obj; + +#define snippet_object_get_name +/// (object_index)-> +if (ds_map_exists(global.__snippet__object_names, argument0)) { + return ds_map_find_value(global.__snippet__object_names, argument0); +} else { + return object_get_name(argument0); +} + +#define snippet_object_get_index +/// (object_name)-> +if (ds_map_exists(global.__snippet__object_ids, argument0)) { + return ds_map_find_value(global.__snippet__object_ids, argument0); +} else { + return -1; +} + +#define snippet_load_list +/// (path_list, dir) +var _files; _files = argument0; +var _pre; _pre = argument1; +if (_pre != "") switch (string_char_at(_pre, string_length(_pre))) { + case '/': case '\': break; + default: _pre += '\'; +} +var i; +var n; n = ds_list_size(_files); +var _grid; _grid = ds_grid_create(n, 4); // [kind, path, name, meta] + +// figure out what to do with each thing: +for (i = 0; i < n; i += 1) { + var _file; _file = ds_list_find_value(_files, i); + if (string_char_at(_file, 1) == '>') { + ds_grid_set(_grid, i, 0, "inline"); + ds_grid_set(_grid, i, 1, sniptools_string_trim_start(string_delete(_file, 1, 1))); + continue; + } + + var _meta; _meta = 0; + var _sep; _sep = string_pos('>', _file); + if (_sep != 0) { + _meta = sniptools_string_trim_start(string_delete(_file, 1, _sep)); + _file = sniptools_string_trim_end(string_copy(_file, 1, _sep - 1)); + } + + var _kind; _kind = ""; + + var _name; _name = filename_name(_file); + repeat (2) { + if (filename_ext(_name) == "") break; + _name = filename_change_ext(_name, ""); + } + + var _ext; _ext = string_lower(filename_ext(_file)); + if (_ext == ".gml") { + var _noext; _noext = filename_change_ext(_file, ""); + var _ext2; _ext2 = string_lower(filename_ext(_noext)); + switch (_ext2) { + case "": _kind = "script"; break; + case ".object": _kind = "object"; break; + case ".global": _kind = "global"; break; + default: + show_error('"' + _noext + '" is not a recognized sub-extension (for "' + _file + '")', false); + } + } else { + show_error('No idea how to load "' + _ext + '" files (for "' + _file + '")', false); + } + ds_grid_set(_grid, i, 0, _kind); + ds_grid_set(_grid, i, 1, _file); + ds_grid_set(_grid, i, 2, _name); + ds_grid_set(_grid, i, 3, _meta); +} + +// should we create objects beforehand? It's okay so long as children appear after parents +/*for (i = 0; i < n; i += 1) { + if (ds_grid_get(_grid, i, 0) == "object") { + snippet_prepare_object(ds_grid_get(_grid, i, 2)); + } +}*/ + +// load the code bits: +for (i = 0; i < n; i += 1) { + var _kind; _kind = ds_grid_get(_grid, i, 0); + var _file; _file = ds_grid_get(_grid, i, 1); + var _name; _name = ds_grid_get(_grid, i, 2); + var _meta; _meta = ds_grid_get(_grid, i, 3); + switch (_kind) { + case "script": case "object": + var _gml; _gml = sniptools_file_get_contents(_pre + _file); + //show_message(_name + ":" + chr(10) + _gml); + if (_gml == "") { + show_error('"' + _file + '" is missing or empty!', false); + } else if (_kind == "object") { + var _obj; _obj = snippet_define_object(_name, _gml); + if (is_string(_meta)) { + if (_meta == "") { + execute_string('instance_create(0, 0, argument0)', _obj); + } else { + show_error('Unsupported meta "' + _meta + '" for "' + _file + '"', false); + } + _meta = 0; + } + } else { + snippet_define(_name, _gml); + } + break; + case "global": + var _gml; _gml = sniptools_file_get_contents(_pre + _file); + if (_gml == "") { + show_error('"' + _file + '" is missing or empty!', false); + } else { + snippet_execute_string(_gml); + } + break; + case "inline": + snippet_execute_string(_file); + break; + } + if (is_string(_meta)) { + show_error('">' + _meta + '" was specified for "' + _file + '" but is not supported for the file type.', false) + } +} +ds_grid_destroy(_grid); + +#define snippet_load_listfile +/// (path) +var _path; _path = argument0; +var _tf; _tf = file_text_open_read(_path); +var _todo; _todo = ds_list_create(); +var _pre; _pre = filename_path(_path); +while (!file_text_eof(_tf)) { + var _line; _line = file_text_read_string(_tf); + file_text_readln(_tf); + + if (sniptools_string_trim_end(_line) == "") continue; + if (string_char_at(_line, 1) == "#") continue; + + ds_list_add(_todo, _line); +} +file_text_close(_tf); +snippet_load_list(_todo, _pre); +ds_list_destroy(_todo); +#define snippet_event_get_type +/// snippet_event_get_type(name) +return external_call(global.f_snippet_event_get_type, argument0); + +#define snippet_event_get_number +/// snippet_event_get_number(name) +return external_call(global.f_snippet_event_get_number, argument0); + +#define snippet_event_get_number_object +/// snippet_event_get_number_object() +return external_call(global.f_snippet_event_get_number_object); + +#define snippet_event_register +/// snippet_event_register(name, type, number) +return external_call(global.f_snippet_event_register, argument0, argument1, argument2); + +#define snippet_event_register_type +/// snippet_event_register_type(name, type, arg_type) +return external_call(global.f_snippet_event_register_type, argument0, argument1, argument2); + +#define snippet_parse_event_file +/// snippet_parse_event_file(path) +return external_call(global.f_snippet_parse_event_file, argument0); + +#define snippet_function_add +/// snippet_function_add(name) +return external_call(global.f_snippet_function_add, argument0); + +#define snippet_function_remove +/// snippet_function_remove(name) +return external_call(global.f_snippet_function_remove, argument0); + +#define snippet_parse_api_entry +/// snippet_parse_api_entry(line) +return external_call(global.f_snippet_parse_api_entry, argument0); + +#define snippet_parse_api_file +/// snippet_parse_api_file(path) +return external_call(global.f_snippet_parse_api_file, argument0); + +#define sniptools_file_get_contents +/// sniptools_file_get_contents(path) +return external_call(global.f_sniptools_file_get_contents, argument0); + +#define sniptools_string_trim +/// sniptools_string_trim(str) +return external_call(global.f_sniptools_string_trim, argument0); + +#define sniptools_string_trim_start +/// sniptools_string_trim_start(str) +return external_call(global.f_sniptools_string_trim_start, argument0); + +#define sniptools_string_trim_end +/// sniptools_string_trim_end(str) +return external_call(global.f_sniptools_string_trim_end, argument0); + +#define sniptools_string_is_ident +/// sniptools_string_is_ident(str) +return external_call(global.f_sniptools_string_is_ident, argument0); + +#define sniptools_string_split_start +/// sniptools_string_split_start(str, sep) +return external_call(global.f_sniptools_string_split_start, argument0, argument1); + +#define sniptools_string_split_next +/// sniptools_string_split_next() +return external_call(global.f_sniptools_string_split_next); diff --git a/snippets_gml/snippets.gmxgen81 b/snippets_gml/snippets.gmxgen81 new file mode 100644 index 0000000..8534f10 --- /dev/null +++ b/snippets_gml/snippets.gmxgen81 @@ -0,0 +1,4 @@ +>snippets.gml +snippets_autogen.gml +snippets_core_gm81.gml +snippets.dll \ No newline at end of file diff --git a/snippets_gml/snippets_core.gml b/snippets_gml/snippets_core.gml new file mode 100644 index 0000000..71e828b --- /dev/null +++ b/snippets_gml/snippets_core.gml @@ -0,0 +1,422 @@ +#define snippet_init +/// () +snippet_init_dll(); +var i = 0; +global.__snippet__argument[0] = 0; +global.__snippet__argument_count = 0; +global.__snippet__result = 0; +global.__snippet__map = ds_map_create(); // name -> ID +global.__snippet__code_map = ds_map_create(); +global.__snippet__next = 100; + +// blank object is used to count objects and as a properties drop-in +global.__snippet__blank_object = object_add(); + +// populate object names<->ids +global.__snippet__object_names = ds_map_create(); +global.__snippet__object_ids = ds_map_create(); +for (i = 0; i < global.__snippet__blank_object; i += 1) if (object_exists(i)) { + var _name = object_get_name(i); + ds_map_add(global.__snippet__object_ids, _name, i); +} + +// contains things like "create\nstep" in case we need to delete events later +global.__snippet__object_events = ds_map_create(); + +snippet_parse_api_file("fnames"); +snippet_parse_event_file("events.gml"); + +// collect scripts: +var _max_gap = 1024; +var _gap = _max_gap; +var _seen_snippet_init = false; +while (_gap < _max_gap || !_seen_snippet_init) { + if (script_exists(i)) { + _gap = 0; + var _name = script_get_name(i); + if (!_seen_snippet_init && _name == "snippet_init") _seen_snippet_init = true; + snippet_function_add(_name); + } + i += 1; + _gap += 1; +} +//var _script_time = current_time - _time; + +/*show_message( + "Parse time: " + string(_fnames_time) + + "#Script time: " + string(_script_time) +);*/ + +#define snippet_execute_string +/// (gml_code) +var n = external_call(global.f_snippet_preproc_run, "", argument0, "define"); +var _result = 0; +repeat (n) { + var _name = external_call(global.f_snippet_preproc_pop_name); + var _code = external_call(global.f_snippet_preproc_pop_code); + _result = execute_string(_code); +} +return _result; + +#define snippet_define +/// (name, gml_code) +var n = external_call(global.f_snippet_preproc_run, argument0, argument1, "define"); +repeat (n) { + var _name = external_call(global.f_snippet_preproc_pop_name); + var _code = external_call(global.f_snippet_preproc_pop_code); + snippet_define_raw(_name, _code); +} + +#define snippet_define_raw +/// (name, raw_gml_code) +var _name = argument0; +var _code = argument1; +// show_message(_name + ":" + chr(10) + _gml); + +// unregister name so that subsequent snippets call the snippet and not the built-in: +snippet_function_remove(_name); + +// one event per snippet: +var _enumb; +if (ds_map_exists(global.__snippet__map, _name)) { + _enumb = ds_map_find_value(global.__snippet__map, _name); + object_event_clear(obj_snippets, ev_alarm, _enumb); + ds_map_replace(global.__snippet__code_map, _name, _code); +} else { + _enumb = global.__snippet__next; + global.__snippet__next += 1; + + ds_map_add(global.__snippet__map, _name, _enumb); + ds_map_add(global.__snippet__code_map, _name, _code); +} +object_event_add(obj_snippets, ev_alarm, _enumb, _code); + +/* one object per snippet: +var _obj; +if (ds_map_exists(global.__snippet__map, _name)) { + _obj = ds_map_find_value(global.__snippet__map, _name); + object_event_clear(_obj, ev_other, 257); +} else { + _obj = object_add(); + ds_map_add(global.__snippet__map, _name, _obj); +} +object_event_add(_obj, ev_other, 257, _code);*/ + +#define snippet_exists +/// (name)-> +return ds_map_exists(global.__snippet__map, argument0); + +#define snippet_get_code +/// (name)-> +if (ds_map_exists(global.__snippet__code_map, argument0)) { + return ds_map_find_value(global.__snippet__code_map, argument0); +} else return ""; + +#define snippet_call +/// (name, ...args) +var _name = argument0; + +// store old arguments: +var _old_argc = global.__snippet__argument_count; +var _old_args = global.__snippet__argument; +var i = 1; +repeat (_old_argc - 1) { + _old_args[i] = global.__snippet__argument[i]; + i += 1; +} + +// copy new arguments: +var _argc = argument_count - 1; +global.__snippet__argument_count = _argc; +i = 0; +repeat (_argc) { + global.__snippet__argument[i] = argument[i + 1]; + i += 1; +} + +// clear "extra" arguments: +repeat (_old_argc - _argc) { + global.__snippet__argument[i] = 0; + i += 1; +} + +if (ds_map_exists(global.__snippet__map, _name)) { + // one snippet per event: + var _enumb = ds_map_find_value(global.__snippet__map, _name); + event_perform_object(obj_snippets, ev_alarm, _enumb); + //*/ + + /* one snippet per object: + var _obj = ds_map_find_value(global.__snippet__map, _name); + event_perform_object(_obj, ev_other, 257); + //*/ +} else { + show_error('Snippet "' + _name + '" does not exist!', true); +} + +// restore previous arguments: +global.__snippet__argument_count = _old_argc; +i = 0; +repeat (_old_argc) { + global.__snippet__argument[i] = _old_args[i]; + i += 1; +} + +// clear the extra arguments (the other way around!): +repeat (_argc - _old_argc) { + global.__snippet__argument[i] = 0; + i += 1; +} + +return global.__snippet__result; + +#define snippet_prepare_object +/// (name) +var _name = argument0; +if (ds_map_exists(global.__snippet__object_ids, _name)) { + return ds_map_find_value(global.__snippet__object_ids, _name); +} else { + var _obj = object_add(); + ds_map_add(global.__snippet__object_ids, _name, _obj); + ds_map_add(global.__snippet__object_names, _obj, _name); + if (sniptools_string_is_ident(_name)) { + // register so that it's globally accessible in code + execute_string('globalvar ' + _name + ';' + _name + ' = argument0', _obj); + } + return _obj; +} + +#define snippet_define_object +/// (name, gml_code) +var _name = argument0; +var n = external_call(global.f_snippet_preproc_run, "properties", argument1, "event"); +var _obj = snippet_prepare_object(_name); + +// clear old events: +var _events = external_call(global.f_snippet_preproc_concat_names); +if (ds_map_exists(global.__snippet__object_events, _obj)) { + var _old_events = ds_map_find_value(global.__snippet__object_events, _obj); + repeat (sniptools_string_split_start(_old_events, chr(10))) { + var _ename = sniptools_string_split_next(); + var _type = snippet_event_get_type(_ename); + var _numb = snippet_event_get_number(_ename); + if (_type == -1) { + if (_numb != 0) continue; + // revert properties! + object_set_visible(_obj, true); + object_set_depth(_obj, 0); + object_set_persistent(_obj, false); + object_set_parent(_obj, -1); + object_set_sprite(_obj, -1); + object_set_mask(_obj, -1); + object_set_solid(_obj, false); + continue; + } + if (_numb == -1) continue; + if (_numb == -2) { // object + _numb = snippet_object_get_index(snippet_event_get_number_object()); + if (_numb == -1) continue; + } + object_event_clear(_obj, _type, _numb); + } + ds_map_replace(global.__snippet__object_events, _obj, _events); +} else { + ds_map_add(global.__snippet__object_events, _obj, _events); +} + +repeat (n) { + var _ename = external_call(global.f_snippet_preproc_pop_name); + var _code = external_call(global.f_snippet_preproc_pop_code); + var _type = snippet_event_get_type(_ename); + var _numb = snippet_event_get_number(_ename); + if (_type == -1) { + if (_numb != 0) { + show_error('"' + _ename + '" is not a known event type!', false); + continue; + } + // properties! + with (instance_create(0, 0, global.__snippet__blank_object)) { + visible = object_get_visible(_obj); + depth = object_get_depth(_obj); + persistent = object_get_persistent(_obj); + parent_index = object_get_parent(_obj); + sprite_index = object_get_sprite(_obj); + mask_index = object_get_mask(_obj); + solid = object_get_solid(_obj); + // + execute_string(_code); + // + object_set_visible(_obj, visible); + object_set_depth(_obj, depth); + object_set_persistent(_obj, persistent); + object_set_parent(_obj, parent_index); + object_set_sprite(_obj, sprite_index); + object_set_mask(_obj, mask_index); + object_set_solid(_obj, solid); + // + instance_destroy(); + } + continue; + } + if (_numb == -1) { + show_error('"' + _ename + '" is not a known event (sub-)type!', false); + continue; + } + if (_numb == -2) { + var _cobj_name = snippet_event_get_number_object(); + var _cobj = snippet_object_get_index(_cobj_name); + if (_cobj == -1) { + show_error('"' + _cobj_name + '" in "' + _ename + '" is not a known object!', false); + continue; + } + _numb = _cobj; + } + object_event_add(_obj, _type, _numb, _code); + /*show_message(_name + + chr(10) + _ename + " -> (" + string(_type) + ", " + string(_numb) + ")" + + chr(10) + _code + );*/ +} +return _obj; + +#define snippet_object_get_name +/// (object_index)-> +if (ds_map_exists(global.__snippet__object_names, argument0)) { + return ds_map_find_value(global.__snippet__object_names, argument0); +} else { + return object_get_name(argument0); +} + +#define snippet_object_get_index +/// (object_name)-> +if (ds_map_exists(global.__snippet__object_ids, argument0)) { + return ds_map_find_value(global.__snippet__object_ids, argument0); +} else { + return -1; +} + +#define snippet_load_list +/// (path_list, dir) +var _files = argument0; +var _pre = argument1; +if (_pre != "") switch (string_char_at(_pre, string_length(_pre))) { + case '/': case '\': break; + default: _pre += '\'; +} +var i; +var n = ds_list_size(_files); +var _grid = ds_grid_create(n, 4); // [kind, path, name, meta] + +// figure out what to do with each thing: +for (i = 0; i < n; i += 1) { + var _file = ds_list_find_value(_files, i); + if (string_char_at(_file, 1) == '>') { + ds_grid_set(_grid, i, 0, "inline"); + ds_grid_set(_grid, i, 1, sniptools_string_trim_start(string_delete(_file, 1, 1))); + continue; + } + + var _meta = 0; + var _sep = string_pos('>', _file); + if (_sep != 0) { + _meta = sniptools_string_trim_start(string_delete(_file, 1, _sep)); + _file = sniptools_string_trim_end(string_copy(_file, 1, _sep - 1)); + } + + var _kind = ""; + + var _name = filename_name(_file); + repeat (2) { + if (filename_ext(_name) == "") break; + _name = filename_change_ext(_name, ""); + } + + var _ext = string_lower(filename_ext(_file)); + if (_ext == ".gml") { + var _noext = filename_change_ext(_file, ""); + var _ext2 = string_lower(filename_ext(_noext)); + switch (_ext2) { + case "": _kind = "script"; break; + case ".object": _kind = "object"; break; + case ".global": _kind = "global"; break; + default: + show_error('"' + _noext + '" is not a recognized sub-extension (for "' + _file + '")', false); + } + } else { + show_error('No idea how to load "' + _ext + '" files (for "' + _file + '")', false); + } + ds_grid_set(_grid, i, 0, _kind); + ds_grid_set(_grid, i, 1, _file); + ds_grid_set(_grid, i, 2, _name); + ds_grid_set(_grid, i, 3, _meta); +} + +// should we create objects beforehand? It's okay so long as children appear after parents +/*for (i = 0; i < n; i += 1) { + if (ds_grid_get(_grid, i, 0) == "object") { + snippet_prepare_object(ds_grid_get(_grid, i, 2)); + } +}*/ + +// load the code bits: +for (i = 0; i < n; i += 1) { + var _kind = ds_grid_get(_grid, i, 0); + var _file = ds_grid_get(_grid, i, 1); + var _name = ds_grid_get(_grid, i, 2); + var _meta = ds_grid_get(_grid, i, 3); + switch (_kind) { + case "script": case "object": + var _gml = sniptools_file_get_contents(_pre + _file); + //show_message(_name + ":" + chr(10) + _gml); + if (_gml == "") { + show_error('"' + _file + '" is missing or empty!', false); + } else if (_kind == "object") { + var _obj = snippet_define_object(_name, _gml); + if (is_string(_meta)) { + if (_meta == "") { + execute_string('instance_create(0, 0, argument0)', _obj); + } else { + show_error('Unsupported meta "' + _meta + '" for "' + _file + '"', false); + } + _meta = 0; + } + } else { + snippet_define(_name, _gml); + } + break; + case "global": + var _gml = sniptools_file_get_contents(_pre + _file); + if (_gml == "") { + show_error('"' + _file + '" is missing or empty!', false); + } else { + snippet_execute_string(_gml); + } + break; + case "inline": + snippet_execute_string(_file); + break; + } + if (is_string(_meta)) { + show_error('">' + _meta + '" was specified for "' + _file + '" but is not supported for the file type.', false) + } +} +ds_grid_destroy(_grid); + +#define snippet_load_listfile +/// (path) +var _path = argument0; +var _tf = file_text_open_read(_path); +var _todo = ds_list_create(); +var _pre = filename_path(_path); +while (!file_text_eof(_tf)) { + var _line = file_text_read_string(_tf); + file_text_readln(_tf); + + if (sniptools_string_trim_end(_line) == "") continue; + if (string_char_at(_line, 1) == "#") continue; + + ds_list_add(_todo, _line); +} +file_text_close(_tf); +snippet_load_list(_todo, _pre); +ds_list_destroy(_todo); \ No newline at end of file diff --git a/snippets_gml/tester/events.gml b/snippets_gml/tester/events.gml new file mode 100644 index 0000000..47a7a6d --- /dev/null +++ b/snippets_gml/tester/events.gml @@ -0,0 +1,128 @@ +-1:0 properties +0:0 create +1:0 destroy + +2:0 alarm0 +2:1 alarm1 +2:2 alarm2 +2:3 alarm3 +2:4 alarm4 +2:5 alarm5 +2:6 alarm6 +2:7 alarm7 +2:8 alarm8 +2:9 alarm9 +2:10 alarm10 +2:11 alarm11 + +3:0 step +3:1 step_begin +3:2 step_end + +6:0 mouse_left_button +6:4 mouse_left_press +6:7 mouse_left_release +6:2 mouse_middle_button +6:6 mouse_middle_press +6:9 mouse_middle_release +6:1 mouse_right_button +6:5 mouse_right_press +6:8 mouse_right_release +6:10 mouse_enter +6:11 mouse_leave +6:60 mouse_wheel_up +6:61 mouse_wheel_down +6:50 mouse_global_left_button +6:53 mouse_global_left_press +6:56 mouse_global_left_release +6:52 mouse_global_middle_button +6:55 mouse_global_middle_press +6:58 mouse_global_middle_release +6:51 mouse_global_right_button +6:54 mouse_global_right_press +6:57 mouse_global_right_release +6:3 mouse_no_button + +7:9 other_no_more_health +7:6 other_no_more_lives +7:7 other_animation_end +7:1 other_boundary +7:3 other_game_end +7:2 other_game_start +7:0 other_outside +7:4 other_room_start +7:5 other_room_end +7:8 other_end_of_path +7:30 other_close_button +7:10 other_user0 +7:11 other_user1 +7:12 other_user2 +7:13 other_user3 +7:14 other_user4 +7:15 other_user5 +7:16 other_user6 +7:17 other_user7 +7:18 other_user8 +7:19 other_user9 +7:20 other_user10 +7:21 other_user11 +7:22 other_user12 +7:23 other_user13 +7:24 other_user14 +7:25 other_user15 +7:40 other_outside_view0 +7:41 other_outside_view1 +7:42 other_outside_view2 +7:43 other_outside_view3 +7:44 other_outside_view4 +7:45 other_outside_view5 +7:46 other_outside_view6 +7:47 other_outside_view7 +7:50 other_boundary_view0 +7:51 other_boundary_view1 +7:52 other_boundary_view2 +7:53 other_boundary_view3 +7:54 other_boundary_view4 +7:55 other_boundary_view5 +7:56 other_boundary_view6 +7:57 other_boundary_view7 +7:59 other_animation_event +7:60 async_image +7:62 async_http +7:63 async_dialog +7:66 async_iap +7:67 async_cloud +7:68 async_network +7:69 async_steam +7:70 async_social +7:71 async_push_notification +7:72 async_save_load +7:73 async_audio_recording +7:74 async_audio_playback +7:75 async_system +7:76 other_broadcast_message + +8:0 draw +8:65 draw_resize +8:72 draw_begin +8:73 draw_end +8:77 draw_post +8:76 draw_pre +8:64 draw_gui +8:74 draw_gui_begin +8:75 draw_gui_end + +12:0 cleanup +13:1 gesture_double_tap +13:4 gesture_drag_end +13:2 gesture_drag_start +13:3 gesture_dragging +13:5 gesture_flick +13:9 gesture_pinch_end +13:7 gesture_pinch_in +13:8 gesture_pinch_out +13:6 gesture_pinch_start +13:12 gesture_rotate_end +13:10 gesture_rotate_start +13:11 gesture_rotating +13:0 gesture_tap \ No newline at end of file diff --git a/snippets_gml/tester/fnames b/snippets_gml/tester/fnames new file mode 100644 index 0000000..fca0f8f --- /dev/null +++ b/snippets_gml/tester/fnames @@ -0,0 +1,1885 @@ +////////////// +// Chapter 401 +////////////// + +// # = constant +// * = readonly + +argument_relative* +argument +argument0 +argument1 +argument2 +argument3 +argument4 +argument5 +argument6 +argument7 +argument8 +argument9 +argument10 +argument11 +argument12 +argument13 +argument14 +argument15 +argument_count +self# +other# +all# +noone# +global# +local# +////////////// +// Chapter 402 +////////////// + +// section 2.1 + +true# +false# +pi# + +// section 2.2 + +is_real(val) +is_string(val) +random(x) +random_range(x1,x2) +irandom(x) +irandom_range(x1,x2) +random_set_seed(seed) +random_get_seed() +randomize() +choose(x1,x2,x3,...) +abs(x) +round(x) +floor(x) +ceil(x) +sign(x) +frac(x) +sqrt(x) +sqr(x) +exp(x) +ln(x) +log2(x) +log10(x) +sin(x) +cos(x) +tan(x) +arcsin(x) +arccos(x) +arctan(x) +arctan2(y,x) +degtorad(x) +radtodeg(x) +power(x,n) +logn(n,x) +min(x1,x2,x3,...) +max(x1,x2,x3,...) +mean(x1,x2,x3,...) +median(x1,x2,x3,...) +clamp(val,min,max) +lerp(val1,val2,amount) +dot_product(x1,y1,x2,y2) +dot_product_3d(x1,y1,z1,x2,y2,z2) +point_distance_3d(x1,y1,z1,x2,y2,z2) +point_distance(x1,y1,x2,y2) +point_direction(x1,y1,x2,y2) +lengthdir_x(len,dir) +lengthdir_y(len,dir) + +// section 2.3 + +real(str) +string(val) +string_format(val,total,dec) +chr(val) +ansi_char(val) +ord(char) +string_length(str) +string_pos(substr,str) +string_copy(str,index,count) +string_char_at(str,index) +string_delete(str,index,count) +string_insert(substr,str,index) +string_lower(str) +string_upper(str) +string_repeat(str,count) +string_letters(str) +string_digits(str) +string_lettersdigits(str) +string_replace(str,substr,newstr) +string_replace_all(str,substr,newstr) +string_count(substr,str) +clipboard_has_text() +clipboard_set_text(str) +clipboard_get_text() + +// section 2.4 + +date_current_datetime() +date_current_date() +date_current_time() +date_create_datetime(year,month,day,hour,minute,second) +date_create_date(year,month,day) +date_create_time(hour,minute,second) +date_valid_datetime(year,month,day,hour,minute,second) +date_valid_date(year,month,day) +date_valid_time(hour,minute,second) +date_inc_year(date,amount) +date_inc_month(date,amount) +date_inc_week(date,amount) +date_inc_day(date,amount) +date_inc_hour(date,amount) +date_inc_minute(date,amount) +date_inc_second(date,amount) +date_get_year(date) +date_get_month(date) +date_get_week(date) +date_get_day(date) +date_get_hour(date) +date_get_minute(date) +date_get_second(date) +date_get_weekday(date) +date_get_day_of_year(date) +date_get_hour_of_year(date) +date_get_minute_of_year(date) +date_get_second_of_year(date) +date_year_span(date1,date2) +date_month_span(date1,date2) +date_week_span(date1,date2) +date_day_span(date1,date2) +date_hour_span(date1,date2) +date_minute_span(date1,date2) +date_second_span(date1,date2) +date_compare_datetime(date1,date2) +date_compare_date(date1,date2) +date_compare_time(date1,date2) +date_date_of(date) +date_time_of(date) +date_datetime_string(date) +date_date_string(date) +date_time_string(date) +date_days_in_month(date) +date_days_in_year(date) +date_leap_year(date) +date_is_today(date) +////////////// +// Chapter 403 +////////////// + +// section 3.1 + +x +y +xprevious +yprevious +xstart +ystart +hspeed +vspeed +direction +speed +friction +gravity +gravity_direction +motion_set(dir,speed) +motion_add(dir,speed) +place_free(x,y) +place_empty(x,y) +place_meeting(x,y,obj) +place_snapped(hsnap,vsnap) +move_random(hsnap,vsnap) +move_snap(hsnap,vsnap) +move_towards_point(x,y,sp) +move_contact_solid(dir,maxdist) +move_contact_all(dir,maxdist) +move_outside_solid(dir,maxdist) +move_outside_all(dir,maxdist) +move_bounce_solid(advanced) +move_bounce_all(advanced) +move_wrap(hor,vert,margin) +distance_to_point(x,y) +distance_to_object(obj) +position_empty(x,y) +position_meeting(x,y,obj) + +// section 3.2 + +path_start(path,speed,endaction,absolute) +path_end() +path_index* +path_position +path_positionprevious +path_speed +path_scale +path_orientation +path_endaction + +// section 3.3 + +mp_linear_step(x,y,speed,checkall) +mp_potential_step(x,y,speed,checkall) +mp_linear_step_object(x,y,speed,obj) +mp_potential_step_object(x,y,speed,obj) +mp_potential_settings(maxrot,rotstep,ahead,onspot) +mp_linear_path(path,xg,yg,stepsize,checkall) +mp_potential_path(path,xg,yg,stepsize,factor,checkall) +mp_linear_path_object(path,xg,yg,stepsize,obj) +mp_potential_path_object(path,xg,yg,stepsize,factor,obj) +mp_grid_create(left,top,hcells,vcells,cellwidth,cellheight) +mp_grid_destroy(id) +mp_grid_clear_all(id) +mp_grid_clear_cell(id,h,v) +mp_grid_clear_rectangle(id,left,top,right,bottom) +mp_grid_add_cell(id,h,v) +mp_grid_add_rectangle(id,left,top,right,bottom) +mp_grid_add_instances(id,obj,prec) +mp_grid_path(id,path,xstart,ystart,xgoal,ygoal,allowdiag) +mp_grid_draw(id) + +// section 3.4 + +collision_point(x,y,obj,prec,notme) +collision_rectangle(x1,y1,x2,y2,obj,prec,notme) +collision_circle(x1,y1,radius,obj,prec,notme) +collision_ellipse(x1,y1,x2,y2,obj,prec,notme) +collision_line(x1,y1,x2,y2,obj,prec,notme) + +// section 3.5 + +object_index* +id* +solid +persistent +mask_index +instance_count* +instance_id* +instance_find(obj,n) +instance_exists(obj) +instance_number(obj) +instance_position(x,y,obj) +instance_nearest(x,y,obj) +instance_furthest(x,y,obj) +instance_place(x,y,obj) +instance_create(x,y,obj) +instance_copy(performevent) +instance_change(obj,performevents) +instance_destroy() +position_destroy(x,y) +position_change(x,y,obj,performevents) + +// section 3.6 + +instance_deactivate_all(notme) +instance_deactivate_object(obj) +instance_deactivate_region(left,top,width,height,inside,notme) +instance_activate_all() +instance_activate_object(obj) +instance_activate_region(left,top,width,height,inside) + +// section 3.7 + +room_speed +fps* +current_time* +current_year* +current_month* +current_day* +current_weekday* +current_hour* +current_minute* +current_second* +sleep(millisec) +alarm[0..11] +timeline_index +timeline_position +timeline_speed +timeline_running +timeline_loop + +// section 3.8 + +room +room_first* +room_last* +room_width* +room_height* +room_caption +room_persistent +room_goto(numb) +room_goto_previous() +room_goto_next() +room_previous(numb) +room_next(numb) +room_restart() +game_end() +game_restart() +game_load(filename) +game_save(filename) + +transition_kind +transition_steps +transition_color +transition_define(kind,name) +transition_exists(kind) + +// section 3.9 + +score +lives +health +show_score +show_lives +show_health +caption_score +caption_lives +caption_health + +// section 3.10 + +event_perform(type,numb) +event_user(numb) +event_perform_object(obj,type,numb) +event_inherited() +event_type* +event_number* +event_object* +event_action* +ev_create# +ev_destroy# +ev_step# +ev_alarm# +ev_keyboard# +ev_mouse# +ev_collision# +ev_other# +ev_draw# +ev_keypress# +ev_keyrelease# +ev_trigger# +ev_left_button# +ev_right_button# +ev_middle_button# +ev_no_button# +ev_left_press# +ev_right_press# +ev_middle_press# +ev_left_release# +ev_right_release# +ev_middle_release# +ev_mouse_enter# +ev_mouse_leave# +ev_mouse_wheel_up# +ev_mouse_wheel_down# +ev_global_left_button# +ev_global_right_button# +ev_global_middle_button# +ev_global_left_press# +ev_global_right_press# +ev_global_middle_press# +ev_global_left_release# +ev_global_right_release# +ev_global_middle_release# +ev_joystick1_left# +ev_joystick1_right# +ev_joystick1_up# +ev_joystick1_down# +ev_joystick1_button1# +ev_joystick1_button2# +ev_joystick1_button3# +ev_joystick1_button4# +ev_joystick1_button5# +ev_joystick1_button6# +ev_joystick1_button7# +ev_joystick1_button8# +ev_joystick2_left# +ev_joystick2_right# +ev_joystick2_up# +ev_joystick2_down# +ev_joystick2_button1# +ev_joystick2_button2# +ev_joystick2_button3# +ev_joystick2_button4# +ev_joystick2_button5# +ev_joystick2_button6# +ev_joystick2_button7# +ev_joystick2_button8# +ev_outside# +ev_boundary# +ev_game_start# +ev_game_end# +ev_room_start# +ev_room_end# +ev_no_more_lives# +ev_animation_end# +ev_end_of_path# +ev_no_more_health# +ev_close_button# +ev_user0# +ev_user1# +ev_user2# +ev_user3# +ev_user4# +ev_user5# +ev_user6# +ev_user7# +ev_user8# +ev_user9# +ev_user10# +ev_user11# +ev_user12# +ev_user13# +ev_user14# +ev_user15# +ev_step_normal# +ev_step_begin# +ev_step_end# + +// section 3.11 + +gamemaker_pro* +gamemaker_registered* +gamemaker_version* +error_occurred +error_last +show_debug_message(str) +debug_mode* +variable_global_exists(name) +variable_global_get(name) +variable_global_array_get(name,ind) +variable_global_array2_get(name,ind1,ind2) +variable_global_set(name,value) +variable_global_array_set(name,ind,value) +variable_global_array2_set(name,ind1,ind2,value) +variable_local_exists(name) +variable_local_get(name) +variable_local_array_get(name,ind) +variable_local_array2_get(name,ind1,ind2) +variable_local_set(name,value) +variable_local_array_set(name,ind,value) +variable_local_array2_set(name,ind1,ind2,value) +set_program_priority(priority) +set_application_title(title) + + +////////////// +// Chapter 404 +////////////// + +// section 4.1 + +keyboard_key +keyboard_lastkey +keyboard_lastchar +keyboard_string +keyboard_set_map(key1,key2) +keyboard_get_map(key) +keyboard_unset_map() +keyboard_check(key) +keyboard_check_pressed(key) +keyboard_check_released(key) +keyboard_check_direct(key) +keyboard_get_numlock() +keyboard_set_numlock(on) +keyboard_key_press(key) +keyboard_key_release(key) +vk_nokey# +vk_anykey# +vk_enter# +vk_return# +vk_shift# +vk_control# +vk_alt# +vk_escape# +vk_space# +vk_backspace# +vk_tab# +vk_pause# +vk_printscreen# +vk_left# +vk_right# +vk_up# +vk_down# +vk_home# +vk_end# +vk_delete# +vk_insert# +vk_pageup# +vk_pagedown# +vk_f1# +vk_f2# +vk_f3# +vk_f4# +vk_f5# +vk_f6# +vk_f7# +vk_f8# +vk_f9# +vk_f10# +vk_f11# +vk_f12# +vk_numpad0# +vk_numpad1# +vk_numpad2# +vk_numpad3# +vk_numpad4# +vk_numpad5# +vk_numpad6# +vk_numpad7# +vk_numpad8# +vk_numpad9# +vk_divide# +vk_multiply# +vk_subtract# +vk_add# +vk_decimal# +vk_lshift# +vk_lcontrol# +vk_lalt# +vk_rshift# +vk_rcontrol# +vk_ralt# +keyboard_clear(key) +io_clear() +io_handle() +keyboard_wait() + +// section 4.2 + +mouse_x* +mouse_y* +mouse_button +mouse_lastbutton +mb_any# +mb_none# +mb_left# +mb_right# +mb_middle# +mouse_check_button(button) +mouse_check_button_pressed(button) +mouse_check_button_released(button) +mouse_wheel_up() +mouse_wheel_down() +mouse_clear(button) +mouse_wait() +cursor_sprite + +// section 4.3 + +joystick_exists(id) +joystick_direction(id) +joystick_name(id) +joystick_axes(id) +joystick_buttons(id) +joystick_has_pov(id) +joystick_check_button(id,button) +joystick_xpos(id) +joystick_ypos(id) +joystick_zpos(id) +joystick_rpos(id) +joystick_upos(id) +joystick_vpos(id) +joystick_pov(id) + + +////////////// +// Chapter 405 +////////////// + +// section 5.1 + +visible +sprite_index +sprite_width* +sprite_height* +sprite_xoffset* +sprite_yoffset* +image_number* +image_index +image_speed +depth +image_xscale +image_yscale +image_angle +image_alpha +image_blend +bbox_left* +bbox_right* +bbox_top* +bbox_bottom* + +// section 5.2 + +background_color +background_showcolor +background_visible[0..7] +background_foreground[0..7] +background_index[0..7] +background_x[0..7] +background_y[0...7] +background_width[0...7]* +background_height[0...7]* +background_htiled[0..7] +background_vtiled[0..7] +background_xscale[0..7] +background_yscale[0..7] +background_hspeed[0..7] +background_vspeed[0..7] +background_blend[0..7] +background_alpha[0..7] + +// section 5.3 + +draw_self() +YoYo_GetPlatform() +YoYo_EnableAlphaBlend(enable) +draw_sprite(sprite,subimg,x,y) +draw_sprite_pos(sprite,subimg,x1,y1,x2,y2,x3,y3,x4,y4,alpha) +draw_sprite_ext(sprite,subimg,x,y,xscale,yscale,rot,color,alpha) +draw_sprite_stretched(sprite,subimg,x,y,w,h) +draw_sprite_stretched_ext(sprite,subimg,x,y,w,h,color,alpha) +draw_sprite_tiled(sprite,subimg,x,y) +draw_sprite_tiled_ext(sprite,subimg,x,y,xscale,yscale,color,alpha) +draw_sprite_part(sprite,subimg,left,top,width,height,x,y) +draw_sprite_part_ext(sprite,subimg,left,top,width,height,x,y,xscale,yscale,color,alpha) +draw_sprite_general(sprite,subimg,left,top,width,height,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha) +draw_background(back,x,y) +draw_background_ext(back,x,y,xscale,yscale,rot,color,alpha) +draw_background_stretched(back,x,y,w,h) +draw_background_stretched_ext(back,x,y,w,h,color,alpha) +draw_background_tiled(back,x,y) +draw_background_tiled_ext(back,x,y,xscale,yscale,color,alpha) +draw_background_part(back,left,top,width,height,x,y) +draw_background_part_ext(back,left,top,width,height,x,y,xscale,yscale,color,alpha) +draw_background_general(back,left,top,width,height,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha) + +// section 5.4 + +draw_clear(col) +draw_clear_alpha(col,alpha) +draw_point(x,y) +draw_line(x1,y1,x2,y2) +draw_line_width(x1,y1,x2,y2,w) +draw_rectangle(x1,y1,x2,y2,outline) +draw_roundrect(x1,y1,x2,y2,outline) +draw_triangle(x1,y1,x2,y2,x3,y3,outline) +draw_circle(x,y,r,outline) +draw_ellipse(x1,y1,x2,y2,outline) +draw_set_circle_precision(precision) +draw_arrow(x1,y1,x2,y2,size) +draw_button(x1,y1,x2,y2,up) +draw_path(path,x,y,absolute) +draw_healthbar(x1,y1,x2,y2,amount,backcol,mincol,maxcol,direction,showback,showborder) +draw_getpixel(x,y) +draw_set_color(col) +draw_set_alpha(alpha) +draw_get_color() +draw_get_alpha() +c_aqua# +c_black# +c_blue# +c_dkgray# +c_fuchsia# +c_gray# +c_green# +c_lime# +c_ltgray# +c_maroon# +c_navy# +c_olive# +c_purple# +c_red# +c_silver# +c_teal# +c_white# +c_yellow# +c_orange# +make_color_rgb(red,green,blue) +make_color_hsv(hue,saturation,value) +color_get_red(col) +color_get_green(col) +color_get_blue(col) +color_get_hue(col) +color_get_saturation(col) +color_get_value(col) +merge_color(col1,col2,amount) +screen_save(fname) +screen_save_part(fname,x,y,w,h) + +// section 5.5 + +draw_set_font(font) +draw_set_halign(halign) +fa_left# +fa_center# +fa_right# +draw_set_valign(valign) +fa_top# +fa_middle# +fa_bottom# +draw_text(x,y,string) +draw_text_ext(x,y,string,sep,w) +string_width(string) +string_height(string) +string_width_ext(string,sep,w) +string_height_ext(string,sep,w) +draw_text_transformed(x,y,string,xscale,yscale,angle) +draw_text_ext_transformed(x,y,string,sep,w,xscale,yscale,angle) +draw_text_color(x,y,string,c1,c2,c3,c4,alpha) +draw_text_ext_color(x,y,string,sep,w,c1,c2,c3,c4,alpha) +draw_text_transformed_color(x,y,string,xscale,yscale,angle,c1,c2,c3,c4,alpha) +draw_text_ext_transformed_color(x,y,string,sep,w,xscale,yscale,angle,c1,c2,c3,c4,alpha) + +// section 5.6 + +draw_point_color(x,y,col1) +draw_line_color(x1,y1,x2,y2,col1,col2) +draw_line_width_color(x1,y1,x2,y2,w,col1,col2) +draw_rectangle_color(x1,y1,x2,y2,col1,col2,col3,col4,outline) +draw_roundrect_color(x1,y1,x2,y2,col1,col2,outline) +draw_triangle_color(x1,y1,x2,y2,x3,y3,col1,col2,col3,outline) +draw_circle_color(x,y,r,col1,col2,outline) +draw_ellipse_color(x1,y1,x2,y2,col1,col2,outline) +pr_pointlist# +pr_linelist# +pr_linestrip# +pr_trianglelist# +pr_trianglestrip# +pr_trianglefan# +draw_primitive_begin(kind) +draw_vertex(x,y) +draw_vertex_color(x,y,col,alpha) +draw_primitive_end() +sprite_get_texture(spr,subimg) +background_get_texture(back) +texture_preload(texid) +texture_set_priority(texid,prio) +texture_get_width(texid) +texture_get_height(texid) +draw_primitive_begin_texture(kind,texid) +draw_vertex_texture(x,y,xtex,ytex) +draw_vertex_texture_color(x,y,xtex,ytex,col,alpha) +texture_set_interpolation(linear) +texture_set_blending(blend) +texture_set_repeat(repeat) +draw_set_blend_mode(mode) +draw_set_blend_mode_ext(src,dest) +bm_normal# +bm_add# +bm_max# +bm_subtract# +bm_zero# +bm_one# +bm_src_color# +bm_inv_src_color# +bm_src_alpha# +bm_inv_src_alpha# +bm_dest_alpha# +bm_inv_dest_alpha# +bm_dest_color# +bm_inv_dest_color# +bm_src_alpha_sat# + +// section 5.7_1 + +surface_create(w,h) +surface_free(id) +surface_exists(id) +surface_get_width(id) +surface_get_height(id) +surface_get_texture(id) +surface_set_target(id) +surface_reset_target() +draw_surface(id,x,y) +draw_surface_stretched(id,x,y,w,h) +draw_surface_tiled(id,x,y) +draw_surface_part(id,left,top,width,height,x,y) +draw_surface_ext(id,x,y,xscale,yscale,rot,color,alpha) +draw_surface_stretched_ext(id,x,y,w,h,color,alpha) +draw_surface_tiled_ext(id,x,y,xscale,yscale,color,alpha) +draw_surface_part_ext(id,left,top,width,height,x,y,xscale,yscale,color,alpha) +draw_surface_general(id,left,top,width,height,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha) +surface_getpixel(id,x,y) +surface_save(id,fname) +surface_save_part(id,fname,x,y,w,h) +surface_copy(destination,x,y,source) +surface_copy_part(destination,x,y,source,xs,ys,ws,hs) + +// section 5.7 + +tile_add(background,left,top,width,height,x,y,depth) +tile_delete(id) +tile_exists(id) +tile_get_x(id) +tile_get_y(id) +tile_get_left(id) +tile_get_top(id) +tile_get_width(id) +tile_get_height(id) +tile_get_depth(id) +tile_get_visible(id) +tile_get_xscale(id) +tile_get_yscale(id) +tile_get_background(id) +tile_get_blend(id) +tile_get_alpha(id) +tile_set_position(id,x,y) +tile_set_region(id,left,top,width,height) +tile_set_background(id,background) +tile_set_visible(id,visible) +tile_set_depth(id,depth) +tile_set_scale(id,xscale,yscale) +tile_set_blend(id,color) +tile_set_alpha(id,alpha) +tile_layer_hide(depth) +tile_layer_show(depth) +tile_layer_delete(depth) +tile_layer_shift(depth,x,y) +tile_layer_find(depth,x,y) +tile_layer_delete_at(depth,x,y) +tile_layer_depth(depth,newdepth) + +// section 5.8 + +display_get_width() +display_get_height() +display_get_colordepth() +display_get_frequency() +display_set_size(w,h) +display_set_colordepth(coldepth) +display_set_frequency(frequency) +display_set_all(w,h,frequency,coldepth) +display_test_all(w,h,frequency,coldepth) +display_reset(aa_level) +display_mouse_get_x() +display_mouse_get_y() +display_mouse_set(x,y) + +// section 5.9 + +window_set_visible(visible) +window_get_visible() +window_set_fullscreen(full) +window_get_fullscreen() +window_set_showborder(show) +window_get_showborder() +window_set_showicons(show) +window_get_showicons() +window_set_stayontop(stay) +window_get_stayontop() +window_set_sizeable(sizeable) +window_get_sizeable() +window_set_caption(caption) +window_get_caption() +window_set_cursor(curs) +cr_default# +cr_none# +cr_arrow# +cr_cross# +cr_beam# +cr_size_nesw# +cr_size_ns# +cr_size_nwse# +cr_size_we# +cr_uparrow# +cr_hourglass# +cr_drag# +cr_nodrop# +cr_hsplit# +cr_vsplit# +cr_multidrag# +cr_sqlwait# +cr_no# +cr_appstart# +cr_help# +cr_handpoint# +cr_size_all# +window_get_cursor() +window_set_color(color) +window_get_color() +window_set_region_scale(scale,adaptwindow) +window_get_region_scale() +window_set_position(x,y) +window_set_size(w,h) +window_set_rectangle(x,y,w,h) +window_center() +window_default() +window_get_x() +window_get_y() +window_get_width() +window_get_height() +window_mouse_get_x() +window_mouse_get_y() +window_mouse_set(x,y) + +// section 5.10 + +view_enabled +view_current* +view_visible[0..7] +view_xview[0..7] +view_yview[0..7] +view_wview[0..7] +view_hview[0..7] +view_xport[0..7] +view_yport[0..7] +view_wport[0..7] +view_hport[0..7] +view_angle[0..7] +view_hborder[0..7] +view_vborder[0..7] +view_hspeed[0..7] +view_vspeed[0..7] +view_object[0..7] +window_set_region_size(w,h,adaptwindow) +window_get_region_width() +window_get_region_height() +window_view_mouse_get_x(id) +window_view_mouse_get_y(id) +window_view_mouse_set(id,x,y) +window_views_mouse_get_x() +window_views_mouse_get_y() +window_views_mouse_set(x,y) + +// section 5.11 + +screen_redraw() +screen_refresh() +screen_wait_vsync() +set_automatic_draw(value) +set_synchronization(value) + + +////////////// +// Chapter 406 +////////////// + +// section 6.1 + +sound_play(index) +sound_loop(index) +sound_stop(index) +sound_stop_all() +sound_isplaying(index) +sound_volume(index,value) +sound_global_volume(value) +sound_fade(index,value,time) +sound_pan(index,value) +sound_background_tempo(factor) +sound_set_search_directory(dir) + +// section 6.2 + +se_none# +se_chorus# +se_echo# +se_flanger# +se_gargle# +se_reverb# +se_compressor# +se_equalizer# +sound_effect_set(snd,effect) +sound_effect_chorus(snd,wetdry,depth,feedback,frequency,wave,delay,phase) +sound_effect_echo(snd,wetdry,feedback,leftdelay,rightdelay,pandelay) +sound_effect_flanger(snd,wetdry,depth,feedback,frequency,wave,delay,phase) +sound_effect_gargle(snd,rate,wave) +sound_effect_reverb(snd,gain,mix,time,ratio) +sound_effect_compressor(snd,gain,attack,release,threshold,ratio,delay) +sound_effect_equalizer(snd,center,bandwidth,gain) + +// section 6.3 + +sound_3d_set_sound_position(snd,x,y,z) +sound_3d_set_sound_velocity(snd,x,y,z) +sound_3d_set_sound_distance(snd,mindist,maxdist) +sound_3d_set_sound_cone(snd,x,y,z,anglein,angleout,voloutside) +//sound_3d_set_distance_factor(snd,factor) +//sound_3d_set_rolloff_factor(snd,factor) +//sound_3d_set_doppler_factor(snd,factor) +//sound_3d_set_listener_position(snd,x,y,z) +//sound_3d_set_listener_velocity(snd,x,y,z) +//sound_3d_set_listener_orientation(snd,xf,yf,zf,xt,yt,zt) + +// section 6.4 + +cd_init() +cd_present() +cd_number() +cd_playing() +cd_paused() +cd_track() +cd_length() +cd_track_length(n) +cd_position() +cd_track_position() +cd_play(first,last) +cd_stop() +cd_pause() +cd_resume() +cd_set_position(pos) +cd_set_track_position(pos) +cd_open_door() +cd_close_door() +MCI_command(str) + + +////////////// +// Chapter 407 +////////////// + +// section 7.1 + +splash_show_video(fname,loop) +splash_show_text(fname,delay) +splash_show_web(url,delay) +splash_show_image(fname,delay) +splash_set_caption(cap) +splash_set_fullscreen(full) +splash_set_border(border) +splash_set_size(w,h) +splash_set_position(x,y) +splash_set_adapt(adapt) +splash_set_top(top) +splash_set_color(col) +splash_set_main(main) +splash_set_scale(scale) +splash_set_cursor(vis) +splash_set_interrupt(interrupt) +splash_set_stop_key(stop) +splash_set_stop_mouse(stop) +splash_set_close_button(show) +show_info() +load_info(fname) + +// section 7.2 + +show_message(str) +show_message_ext(str,but1,but2,but3) +show_question(str) +get_integer(str,def) +get_string(str,def) +message_background(back) +message_button(sprite) +message_alpha(alpha) +message_text_font(name,size,color,style) +message_button_font(name,size,color,style) +message_input_font(name,size,color,style) +message_text_charset(type, charset_id) +message_mouse_color(col) +message_input_color(col) +message_position(x,y) +message_size(w,h) +message_caption(show,str) +show_menu(str,def) +show_menu_pos(x,y,str,def) +get_color(defcol) +get_open_filename(filter,fname) +get_save_filename(filter,fname) +get_directory(dname) +get_directory_alt(capt,root) +show_error(str,abort) + +// section 7.3 + +highscore_show_ext(numb,back,border,col1,col2,name,size) +highscore_show(numb) +highscore_set_background(back); +highscore_set_border(show); +highscore_set_font(name,size,style); +highscore_set_strings(caption,nobody,escape); +highscore_set_colors(back,new,other); +highscore_clear() +highscore_add(str,numb) +highscore_add_current() +highscore_value(place) +highscore_name(place) +draw_highscore(x1,y1,x2,y2) + + +////////////// +// Chapter 408 +////////////// + +// section 8.1 + +sprite_exists(ind) +sprite_get_name(ind) +sprite_get_number(ind) +sprite_get_width(ind) +sprite_get_height(ind) +sprite_get_xoffset(ind) +sprite_get_yoffset(ind) +sprite_get_bbox_left(ind) +sprite_get_bbox_right(ind) +sprite_get_bbox_top(ind) +sprite_get_bbox_bottom(ind) + +sprite_save(ind,subimg,fname) +sprite_save_strip(ind,fname) + +// section 8.2 + +sound_exists(ind) +sound_get_name(ind) +sound_get_kind(ind) +sound_get_preload(ind) +sound_discard(ind) +sound_restore(ind) + +// section 8.3 + +background_exists(ind) +background_get_name(ind) +background_get_width(ind) +background_get_height(ind) + +background_save(ind,fname) + + +// section 8.4 + +font_exists(ind) +font_get_name(ind) +font_get_fontname(ind) +font_get_bold(ind) +font_get_italic(ind) +font_get_first(ind) +font_get_last(ind) + +// section 8.5 + +path_exists(ind) +path_get_name(ind) +path_get_length(ind) +path_get_kind(ind) +path_get_closed(ind) +path_get_precision(ind) +path_get_number(ind) +path_get_point_x(ind,n) +path_get_point_y(ind,n) +path_get_point_speed(ind,n) +path_get_x(ind,pos) +path_get_y(ind,pos) +path_get_speed(ind,pos) + +// section 8.6 + +script_exists(ind) +script_get_name(ind) +script_get_text(ind) + +// section 8.7 + +timeline_exists(ind) +timeline_get_name(ind) + +// section 8.8 + +object_exists(ind) +object_get_name(ind) +object_get_sprite(ind) +object_get_solid(ind) +object_get_visible(ind) +object_get_depth(ind) +object_get_persistent(ind) +object_get_mask(ind) +object_get_parent(ind) +object_is_ancestor(ind1,ind2) + +// section 8.9 + +room_exists(ind) +room_get_name(ind) + +////////////// +// Chapter 409 +////////////// + +// section 9.1 + +sprite_set_offset(ind,xoff,yoff) +sprite_duplicate(ind) +sprite_assign(ind,source) +sprite_merge(ind1,ind2) +sprite_add(fname,imgnumb,removeback,smooth,xorig,yorig) +sprite_replace(ind,fname,imgnumb,removeback,smooth,xorig,yorig) +sprite_add_sprite(fname) +sprite_replace_sprite(ind,fname) +sprite_create_from_screen(x,y,w,h,removeback,smooth,xorig,yorig) +sprite_add_from_screen(ind,x,y,w,h,removeback,smooth) +sprite_create_from_surface(id,x,y,w,h,removeback,smooth,xorig,yorig) +sprite_add_from_surface(ind,id,x,y,w,h,removeback,smooth) +sprite_delete(ind) +sprite_set_alpha_from_sprite(ind,spr) +sprite_collision_mask(ind,sepmasks,bboxmode,bbleft,bbright,bbtop,bbbottom,kind,tolerance) + +// section 9.2 + +sound_add(fname,kind,preload) +sound_replace(ind,fname,kind,preload) +sound_delete(ind) + +// section 9.3 + +background_duplicate(ind) +background_assign(ind,source) +background_add(fname,removeback,smooth) +background_replace(ind,fname,removeback,smooth) +background_add_background(fname) +background_replace_background(ind,fname) +background_create_color(w,h,col) +background_create_gradient(w,h,col1,col2,kind) +background_create_from_screen(x,y,w,h,removeback,smooth) +background_create_from_surface(id,x,y,w,h,removeback,smooth) +background_delete(ind) +background_set_alpha_from_background(ind,back) + +// section 9.4 + +font_add(name,size,bold,italic,first,last) +font_add_sprite(spr,first,prop,sep) +font_replace(ind,name,size,bold,italic,first,last) +font_replace_sprite(ind,spr,first,prop,sep) +font_delete(ind) + +// section 9.5 + +path_set_kind(ind,kind) +path_set_closed(ind,closed) +path_set_precision(ind,prec) +path_add() +path_assign(ind,path) +path_duplicate(ind) +path_append(ind,path) +path_delete(ind) +path_add_point(ind,x,y,speed) +path_insert_point(ind,n,x,y,speed) +path_change_point(ind,n,x,y,speed) +path_delete_point(ind,n) +path_clear_points(ind) +path_reverse(ind) +path_mirror(ind) +path_flip(ind) +path_rotate(ind,angle) +path_scale(ind,xscale,yscale) +path_shift(ind,xshift,yshift) + +// section 9.6 + +execute_string(str,arg0,arg1,...) +execute_file(fname,arg0,arg1,...) +script_execute(ind,arg0,arg1,...) + +// section 9.7 + +timeline_add() +timeline_delete(ind) +timeline_clear(ind) +timeline_moment_clear(ind,step) +timeline_moment_add(ind,step,codestr) + +// section 9.8 + +object_set_sprite(ind,spr) +object_set_solid(ind,solid) +object_set_visible(ind,vis) +object_set_depth(ind,depth) +object_set_persistent(ind,pers) +object_set_mask(ind,spr) +object_set_parent(ind,obj) +object_add() +object_delete(ind) +object_event_clear(ind,evtype,evnumb) +object_event_add(ind,evtype,evnumb,codestr) + +// section 9.9 + +room_set_width(ind,w) +room_set_height(ind,h) +room_set_caption(ind,str) +room_set_persistent(ind,pers) +room_set_code(ind,codestr) +room_set_background_color(ind,col,show) +room_set_background(ind,bind,vis,fore,back,x,y,htiled,vtiled,hspeed,vspeed,alpha) +room_set_view(ind,vind,vis,xview,yview,wview,hview,xport,yport,wport,hport,hborder,vborder,hspeed,vspeed,obj) +room_set_view_enabled(ind,val) +room_add() +room_duplicate(ind) +room_assign(ind,source) +room_instance_add(ind,x,y,obj) +room_instance_clear(ind) +room_tile_add(ind,back,left,top,width,height,x,y,depth) +room_tile_add_ext(ind,back,left,top,width,height,x,y,depth,xscale,yscale,alpha) +room_tile_clear(ind) + + + +////////////// +// Chapter 410 +////////////// + +// section 10.1 + +file_text_open_read(fname) +file_text_open_write(fname) +file_text_open_append(fname) +file_text_close(file) +file_text_write_string(file,str) +file_text_write_real(file,val) +file_text_writeln(file) +file_text_read_string(file) +file_text_read_real(file) +file_text_readln(file) +file_text_eof(file) +file_text_eoln(file) +file_exists(fname) +file_delete(fname) +file_rename(oldname,newname) +file_copy(fname,newname) +directory_exists(dname) +directory_create(dname) +file_find_first(mask,attr) +file_find_next() +file_find_close() +file_attributes(fname,attr) +filename_name(fname) +filename_path(fname) +filename_dir(fname) +filename_drive(fname) +filename_ext(fname) +filename_change_ext(fname,newext) +file_bin_open(fname,mode) +file_bin_rewrite(file) +file_bin_close(file) +file_bin_position(file) +file_bin_size(file) +file_bin_seek(file,pos) +file_bin_write_byte(file,byte) +file_bin_read_byte(file) +export_include_file(fname) +export_include_file_location(fname,location) +discard_include_file(fname) +parameter_count() +parameter_string(n) +environment_get_variable(name) +fa_readonly# +fa_hidden# +fa_sysfile# +fa_volumeid# +fa_directory# +fa_archive# +game_id* +working_directory* +temp_directory* +program_directory* +disk_free(drive) +disk_size(drive) + +// section 10.2 + +registry_write_string(name,str) +registry_write_real(name,value) +registry_read_string(name) +registry_read_real(name) +registry_exists(name) +registry_write_string_ext(key,name,str) +registry_write_real_ext(key,name,value) +registry_read_string_ext(key,name) +registry_read_real_ext(key,name) +registry_exists_ext(key,name) +registry_set_root(root) + +// section 10.3 + +ini_open(fname) +ini_close() +ini_read_string(section,key,default) +ini_read_real(section,key,default) +ini_write_string(section,key,str) +ini_write_real(section,key,value) +ini_key_exists(section,key) +ini_section_exists(section) +ini_key_delete(section,key) +ini_section_delete(section) + +// section 10.4 + +execute_program(prog,arg,wait) +execute_shell(prog,arg) +secure_mode* + + + + +////////////// +// Chapter 411 +////////////// + +// section 11.0 + +ds_set_precision(prec) + +// section 11.1 + +ds_stack_create() +ds_stack_destroy(id) +ds_stack_clear(id) +ds_stack_copy(id,source) +ds_stack_size(id) +ds_stack_empty(id) +ds_stack_push(id,value) +ds_stack_pop(id) +ds_stack_top(id) +ds_stack_write(id) +ds_stack_read(id,str) + +// section 11.2 + +ds_queue_create() +ds_queue_destroy(id) +ds_queue_clear(id) +ds_queue_copy(id,source) +ds_queue_size(id) +ds_queue_empty(id) +ds_queue_enqueue(id,value) +ds_queue_dequeue(id) +ds_queue_head(id) +ds_queue_tail(id) +ds_queue_write(id) +ds_queue_read(id,str) + +// section 11.3 + +ds_list_create() +ds_list_destroy(id) +ds_list_clear(id) +ds_list_copy(id,source) +ds_list_size(id) +ds_list_empty(id) +ds_list_add(id,value) +ds_list_insert(id,pos,value) +ds_list_replace(id,pos,value) +ds_list_delete(id,pos) +ds_list_find_index(id,value) +ds_list_find_value(id,pos) +ds_list_sort(id,ascending) +ds_list_shuffle(id) +ds_list_write(id) +ds_list_read(id,str) + +// section 11.4 + +ds_map_create() +ds_map_destroy(id) +ds_map_clear(id) +ds_map_copy(id,source) +ds_map_size(id) +ds_map_empty(id) +ds_map_add(id,key,value) +ds_map_replace(id,key,value) +ds_map_delete(id,key) +ds_map_exists(id,key) +ds_map_find_value(id,key) +ds_map_find_previous(id,key) +ds_map_find_next(id,key) +ds_map_find_first(id) +ds_map_find_last(id) +ds_map_write(id) +ds_map_read(id,str) + +// section 11.5 + +ds_priority_create() +ds_priority_destroy(id) +ds_priority_clear(id) +ds_priority_copy(id,source) +ds_priority_size(id) +ds_priority_empty(id) +ds_priority_add(id,value,priority) +ds_priority_change_priority(id,value,priority) +ds_priority_find_priority(id,value) +ds_priority_delete_value(id,value) +ds_priority_delete_min(id) +ds_priority_find_min(id) +ds_priority_delete_max(id) +ds_priority_find_max(id) +ds_priority_write(id) +ds_priority_read(id,str) + +// section 11.6 + +ds_grid_create(w,h) +ds_grid_destroy(id) +ds_grid_copy(id,source) +ds_grid_resize(id,w,h) +ds_grid_width(id) +ds_grid_height(id) +ds_grid_clear(id,val) +ds_grid_set(id,x,y,val) +ds_grid_add(id,x,y,val) +ds_grid_multiply(id,x,y,val) +ds_grid_set_region(id,x1,y1,x2,y2,val) +ds_grid_add_region(id,x1,y1,x2,y2,val) +ds_grid_multiply_region(id,x1,y1,x2,y2,val) +ds_grid_set_disk(id,xm,ym,r,val) +ds_grid_add_disk(id,xm,ym,r,val) +ds_grid_multiply_disk(id,xm,ym,r,val) +ds_grid_set_grid_region(id,source,x1,y1,x2,y2,xpos,ypos) +ds_grid_add_grid_region(id,source,x1,y1,x2,y2,xpos,ypos) +ds_grid_multiply_grid_region(id,source,x1,y1,x2,y2,xpos,ypos) +ds_grid_get(id,x,y) +ds_grid_get_sum(id,x1,y1,x2,y2) +ds_grid_get_max(id,x1,y1,x2,y2) +ds_grid_get_min(id,x1,y1,x2,y2) +ds_grid_get_mean(id,x1,y1,x2,y2) +ds_grid_get_disk_sum(id,xm,ym,r) +ds_grid_get_disk_min(id,xm,ym,r) +ds_grid_get_disk_max(id,xm,ym,r) +ds_grid_get_disk_mean(id,xm,ym,r) +ds_grid_value_exists(id,x1,y1,x2,y2,val) +ds_grid_value_x(id,x1,y1,x2,y2,val) +ds_grid_value_y(id,x1,y1,x2,y2,val) +ds_grid_value_disk_exists(id,xm,ym,r,val) +ds_grid_value_disk_x(id,xm,ym,r,val) +ds_grid_value_disk_y(id,xm,ym,r,val) +ds_grid_shuffle(id) +ds_grid_write(id) +ds_grid_read(id,str) + +////////////// +// Chapter 412 +////////////// + +// section 12.1a + +effect_create_below(kind,x,y,size,color) +effect_create_above(kind,x,y,size,color) +effect_clear() +ef_explosion# +ef_ring# +ef_ellipse# +ef_firework# +ef_smoke# +ef_smokeup# +ef_star# +ef_spark# +ef_flare# +ef_cloud# +ef_rain# +ef_snow# + +// section 12.1 + +part_type_create() +part_type_destroy(ind) +part_type_exists(ind) +part_type_clear(ind) +part_type_shape(ind,shape) +part_type_sprite(ind,sprite,animat,stretch,random) +part_type_size(ind,size_min,size_max,size_incr,size_wiggle) +part_type_scale(ind,xscale,yscale) +part_type_orientation(ind,ang_min,ang_max,ang_incr,ang_wiggle,ang_relative) +part_type_life(ind,life_min,life_max) +part_type_step(ind,step_number,step_type) +part_type_death(ind,death_number,death_type) +part_type_speed(ind,speed_min,speed_max,speed_incr,speed_wiggle) +part_type_direction(ind,dir_min,dir_max,dir_incr,dir_wiggle) +part_type_gravity(ind,grav_amount,grav_dir) +part_type_color1(ind,color1) +part_type_color2(ind,color1,color2) +part_type_color3(ind,color1,color2,color3) +part_type_color_mix(ind,color1,color2) +part_type_color_rgb(ind,rmin,rmax,gmin,gmax,bmin,bmax) +part_type_color_hsv(ind,hmin,hmax,smin,smax,vmin,vmax) +part_type_alpha1(ind,alpha1) +part_type_alpha2(ind,alpha1,alpha2) +part_type_alpha3(ind,alpha1,alpha2,alpha3) +part_type_blend(ind,additive) +pt_shape_pixel# +pt_shape_disk# +pt_shape_square# +pt_shape_line# +pt_shape_star# +pt_shape_circle# +pt_shape_ring# +pt_shape_sphere# +pt_shape_flare# +pt_shape_spark# +pt_shape_explosion# +pt_shape_cloud# +pt_shape_smoke# +pt_shape_snow# + +// section 12.2 + +part_system_create() +part_system_destroy(ind) +part_system_exists(ind) +part_system_clear(ind) +part_system_draw_order(ind,oldtonew) +part_system_depth(ind,depth) +part_system_position(ind,x,y) +part_system_automatic_update(ind,automatic) +part_system_automatic_draw(ind,draw) +part_system_update(ind) +part_system_drawit(ind) + +part_particles_create(ind,x,y,parttype,number) +part_particles_create_color(ind,x,y,parttype,color,number) +part_particles_clear(ind) +part_particles_count(ind) + +// section 12.3 + +part_emitter_create(ps) +part_emitter_destroy(ps,ind) +part_emitter_destroy_all(ps) +part_emitter_exists(ps,ind) +part_emitter_clear(ps,ind) +part_emitter_region(ps,ind,xmin,xmax,ymin,ymax,shape,distribution) +part_emitter_burst(ps,ind,parttype,number) +part_emitter_stream(ps,ind,parttype,number) +ps_distr_linear# +ps_distr_gaussian# +ps_distr_invgaussian# +ps_shape_rectangle# +ps_shape_ellipse# +ps_shape_diamond# +ps_shape_line# + +// section 12.4 + +part_attractor_create(ps) +part_attractor_destroy(ps,ind) +part_attractor_destroy_all(ps) +part_attractor_exists(ps,ind) +part_attractor_clear(ps,ind) +part_attractor_position(ps,ind,x,y) +part_attractor_force(ps,ind,force,dist,kind,additive) +ps_force_constant# +ps_force_linear# +ps_force_quadratic# + +// section 12.5 + +part_destroyer_create(ps) +part_destroyer_destroy(ps,ind) +part_destroyer_destroy_all(ps) +part_destroyer_exists(ps,ind) +part_destroyer_clear(ps,ind) +part_destroyer_region(ps,ind,xmin,xmax,ymin,ymax,shape) + +// section 12.6 + +part_deflector_create(ps) +part_deflector_destroy(ps,ind) +part_deflector_destroy_all(ps) +part_deflector_exists(ps,ind) +part_deflector_clear(ps,ind) +part_deflector_region(ps,ind,xmin,xmax,ymin,ymax) +part_deflector_kind(ps,ind,kind) +part_deflector_friction(ps,ind,amount) +ps_deflect_vertical# +ps_deflect_horizontal# + +// section 12.7 + +part_changer_create(ps) +part_changer_destroy(ps,ind) +part_changer_destroy_all(ps) +part_changer_exists(ps,ind) +part_changer_clear(ps,ind) +part_changer_region(ps,ind,xmin,xmax,ymin,ymax,shape) +part_changer_kind(ps,ind,kind) +part_changer_types(ps,ind,parttype1,parttype2) +ps_change_all# +ps_change_shape# +ps_change_motion# + +////////////// +// Chapter 413 +////////////// + +// section 13.1 + +mplay_init_ipx() +mplay_init_tcpip(addrstring) +mplay_init_modem(initstr,phonenr) +mplay_init_serial(portno,baudrate,stopbits,parity,flow) +mplay_connect_status() +mplay_end() +mplay_ipaddress() + +// section 13.2 + +mplay_session_mode(move) +mplay_session_create(sesname,playnumb,playername) +mplay_session_find() +mplay_session_name(numb) +mplay_session_join(numb,playername) +mplay_session_status() +mplay_session_end() + +// section 13.3 + +mplay_player_find() +mplay_player_name(numb) +mplay_player_id(numb) + +// section 13.4 + +mplay_data_write(ind,value) +mplay_data_read(ind) +mplay_data_mode(guaranteed) + +// section 13.5 + +mplay_message_send(player,id,val) +mplay_message_send_guaranteed(player,id,val) +mplay_message_receive(player) +mplay_message_id() +mplay_message_value() +mplay_message_player() +mplay_message_name() +mplay_message_count(player) +mplay_message_clear(player) +////////////// +// Chapter 414 +////////////// + +external_call(id,arg1,arg2,...) +external_define(dll,name,calltype,restype,argnumb,arg1type,arg2type,...) +external_free(dllname) +get_function_address(function_name) +window_handle() +ty_real# +ty_string# +dll_cdecl# +dll_stdcall# +////////////// +// Chapter 415 +////////////// + +d3d_start() +d3d_end() +d3d_set_hidden(enable) +d3d_set_perspective(enable) +d3d_set_depth(depth) +d3d_set_zwriteenable(on_off) +d3d_primitive_begin(kind) +d3d_vertex(x,y,z) +d3d_vertex_color(x,y,z,col,alpha) +d3d_primitive_end() +d3d_primitive_begin_texture(kind,texid) +d3d_vertex_texture(x,y,z,xtex,ytex) +d3d_vertex_texture_color(x,y,z,xtex,ytex,col,alpha) +d3d_draw_block(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat) +d3d_draw_cylinder(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat,closed,steps) +d3d_draw_cone(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat,closed,steps) +d3d_draw_ellipsoid(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat,steps) +d3d_draw_wall(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat) +d3d_draw_floor(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat) +d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup) +d3d_set_projection_ext(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup,angle,aspect,znear,zfar) +d3d_set_projection_ortho(x,y,w,h,angle) +d3d_set_projection_perspective(x,y,w,h,angle) +d3d_transform_set_identity() +d3d_transform_set_translation(xt,yt,zt) +d3d_transform_set_scaling(xs,ys,zs) +d3d_transform_set_rotation_x(angle) +d3d_transform_set_rotation_y(angle) +d3d_transform_set_rotation_z(angle) +d3d_transform_set_rotation_axis(xa,ya,za,angle) +d3d_transform_add_translation(xt,yt,zt) +d3d_transform_add_scaling(xs,ys,zs) +d3d_transform_add_rotation_x(angle) +d3d_transform_add_rotation_y(angle) +d3d_transform_add_rotation_z(angle) +d3d_transform_add_rotation_axis(xa,ya,za,angle) +d3d_transform_stack_clear() +d3d_transform_stack_empty() +d3d_transform_stack_push() +d3d_transform_stack_pop() +d3d_transform_stack_top() +d3d_transform_stack_discard() +d3d_set_fog(enable,color,start,end) +d3d_set_lighting(enable) +d3d_set_shading(smooth) +d3d_set_culling(cull) +d3d_light_define_ambient( col ) +d3d_light_define_direction(ind,dx,dy,dz,col) +d3d_light_define_point(ind,x,y,z,range,col) +d3d_light_enable(ind,enable) +d3d_vertex_normal(x,y,z,nx,ny,nz) +d3d_vertex_normal_color(x,y,z,nx,ny,nz,col,alpha) +d3d_vertex_normal_texture(x,y,z,nx,ny,nz,xtex,ytex) +d3d_vertex_normal_texture_color(x,y,z,nx,ny,nz,xtex,ytex,col,alpha) + +d3d_model_create() +d3d_model_destroy(ind) +d3d_model_clear(ind) +d3d_model_save(ind,fname) +d3d_model_load(ind,fname) +d3d_model_draw(ind,x,y,z,texid) + +d3d_model_primitive_begin(ind,kind) +d3d_model_vertex(ind,x,y,z) +d3d_model_vertex_color(ind,x,y,z,col,alpha) +d3d_model_vertex_texture(ind,x,y,z,xtex,ytex) +d3d_model_vertex_texture_color(ind,x,y,z,xtex,ytex,col,alpha) +d3d_model_vertex_normal(ind,x,y,z,nx,ny,nz) +d3d_model_vertex_normal_color(ind,x,y,z,nx,ny,nz,col,alpha) +d3d_model_vertex_normal_texture(ind,x,y,z,nx,ny,nz,xtex,ytex) +d3d_model_vertex_normal_texture_color(ind,x,y,z,nx,ny,nz,xtex,ytex,col,alpha) +d3d_model_primitive_end(ind) + +d3d_model_block(ind,x1,y1,z1,x2,y2,z2,hrepeat,vrepeat) +d3d_model_cylinder(ind,x1,y1,z1,x2,y2,z2,hrepeat,vrepeat,closed,steps) +d3d_model_cone(ind,x1,y1,z1,x2,y2,z2,hrepeat,vrepeat,closed,steps) +d3d_model_ellipsoid(ind,x1,y1,z1,x2,y2,z2,hrepeat,vrepeat,steps) +d3d_model_wall(ind,x1,y1,z1,x2,y2,z2,hrepeat,vrepeat) +d3d_model_floor(ind,x1,y1,z1,x2,y2,z2,hrepeat,vrepeat) + + +// YoYo extension stuff +os_win32# +os_win64# +os_macosx# +os_psp# +os_ios# +os_android# + +device_ios_iphone# +device_ios_iphone_retina# +device_ios_ipad# + +os_type* +os_device* +display_aa* + +text_type# +button_type# +input_type# + +ANSI_CHARSET# +DEFAULT_CHARSET# +EASTEUROPE_CHARSET# +RUSSIAN_CHARSET# +SYMBOL_CHARSET# +SHIFTJIS_CHARSET# +HANGEUL_CHARSET# +GB2312_CHARSET# +CHINESEBIG5_CHARSET# +JOHAB_CHARSET# +HEBREW_CHARSET# +ARABIC_CHARSET# +GREEK_CHARSET# +TURKISH_CHARSET# +VIETNAMESE_CHARSET# +THAI_CHARSET# +MAC_CHARSET# +BALTIC_CHARSET# +OEM_CHARSET# + diff --git a/snippets_gml/tester/obj_control.object.gml b/snippets_gml/tester/obj_control.object.gml new file mode 100644 index 0000000..64220e4 --- /dev/null +++ b/snippets_gml/tester/obj_control.object.gml @@ -0,0 +1,12 @@ +#event create +start_time = current_time; + +#event keypress:vk_escape +if (keyboard_check(vk_shift)) { + game_end_direct() +} else { + game_end(); +} + +#event draw +draw_text(5, 5, string((current_time - start_time) div 1000)) \ No newline at end of file diff --git a/snippets_gml/tester/obj_player.object.gml b/snippets_gml/tester/obj_player.object.gml new file mode 100644 index 0000000..783174b --- /dev/null +++ b/snippets_gml/tester/obj_player.object.gml @@ -0,0 +1,11 @@ +sprite_index = sprite_add("spr_test.png", 1, false, false, 24, 24); + +#event step +//x += 4 * (keyboard_check(vk_right) - keyboard_check(vk_left)); +y += 4 * (keyboard_check(vk_down) - keyboard_check(vk_up)); + +#event keyboard:vk_left +x -= 4; + +#event keyboard:vk_right +x += 4; \ No newline at end of file diff --git a/snippets_gml/tester/overrides.gml b/snippets_gml/tester/overrides.gml new file mode 100644 index 0000000..254a04c --- /dev/null +++ b/snippets_gml/tester/overrides.gml @@ -0,0 +1,5 @@ +#define game_end +if (show_question("Really quit?")) game_end(); + +#define game_end_direct +game_end(); \ No newline at end of file diff --git a/snippets_gml/tester/snippet_tester.gm81 b/snippets_gml/tester/snippet_tester.gm81 new file mode 100644 index 0000000000000000000000000000000000000000..91472d78df9e5e5fcf5fa590e5895627c0db479f GIT binary patch literal 26984 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

&Z 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 ce(@hnJEyv(-1T|i1oS6^r>mdKI;Vst0H?}xeE +obj_player.object.gml +> instance_create(100, 100, obj_player) \ No newline at end of file