aboutsummaryrefslogtreecommitdiff
path: root/doc/squirrel.lyx
diff options
context:
space:
mode:
authorJuan Linietsky2014-02-09 22:10:30 -0300
committerJuan Linietsky2014-02-09 22:10:30 -0300
commit0b806ee0fc9097fa7bda7ac0109191c9c5e0a1ac (patch)
tree276c4d099e178eb67fbd14f61d77b05e3808e9e3 /doc/squirrel.lyx
parent0e49da1687bc8192ed210947da52c9e5c5f301bb (diff)
downloadgodot-0b806ee.tar.gz
godot-0b806ee.tar.zst
godot-0b806ee.zip
GODOT IS OPEN SOURCE
Diffstat (limited to 'doc/squirrel.lyx')
-rw-r--r--doc/squirrel.lyx984
1 files changed, 984 insertions, 0 deletions
diff --git a/doc/squirrel.lyx b/doc/squirrel.lyx
new file mode 100644
index 000000000..05270c1b8
--- /dev/null
+++ b/doc/squirrel.lyx
@@ -0,0 +1,984 @@
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass article
+\use_default_options true
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding auto
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\use_hyperref false
+\papersize default
+\use_geometry false
+\use_amsmath 1
+\use_esint 1
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 1
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Title
+Squirrel Usage in Godot
+\end_layout
+
+\begin_layout Section
+Introduction
+\end_layout
+
+\begin_layout Standard
+Squirrel is a nice scripting language.
+ It's sort of a mix between Lua, Java and JavaScript and ends up being easy
+ to learn for most programmers.
+ It has more language features than GDScript but it's also slower, more
+ limited and not as well integrated.
+ This guide will explain how Squirrel is integrated to Godot and all the
+ quirks that are needed to know in order to use it properly.
+\end_layout
+
+\begin_layout Section
+Enabling Squirrel
+\end_layout
+
+\begin_layout Standard
+Squirrel may not be enabled by default in a Godot build.
+ To enable it, execute SCons with the following parameters:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+shell$ scons squirrel=yes <target_binary>
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Documentation
+\end_layout
+
+\begin_layout Standard
+Godot utilizes Squirrel 2.2.
+ Documentation can be found at:
+\begin_inset CommandInset href
+LatexCommand href
+target "http://squirrel-lang.org/#documentation"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Class Files
+\end_layout
+
+\begin_layout Standard
+Unless writing a library, Godot expects a class for scripting an object.
+ Since a Squirrel source file can contain many classes, the main class must
+ be returned.
+ The following is an example of extending a button:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+class MyButton extends Button {
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ constructor() {
+\end_layout
+
+\begin_layout Plain Layout
+
+ // ALWAYS call parent constructor
+\end_layout
+
+\begin_layout Plain Layout
+
+ Button.constructor()
+\end_layout
+
+\begin_layout Plain Layout
+
+ }
+\end_layout
+
+\begin_layout Plain Layout
+
+}
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+return MyButton // main class returned
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Additionally, classes are all copied to the root table, so all class names
+ in scripts must be different if they are attempted to be loaded simultaneously.
+ The same can be said for any other globals declared in the script.
+
+\end_layout
+
+\begin_layout Standard
+Finally, squirrel scripts must be saved with the .nut or .sq extensions (both
+ are recognized).
+\end_layout
+
+\begin_layout Section
+Including Other Scripts
+\end_layout
+
+\begin_layout Standard
+Other scripts can be included with the include() directive.
+ Full and relative paths are supported.
+ When included, the classes and globals are moved to the root table, so
+ they become immediately available.
+ Constants, however, are only inlined in the current class on load, so Squirrel
+ does not make them available.
+ Example of including scripts:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+include("my_button.nut") # // relative to current script, expected to be
+ in the same path
+\end_layout
+
+\begin_layout Plain Layout
+
+include("res://buttons/my_button.nut") // using resource path
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Built-In Types
+\end_layout
+
+\begin_layout Standard
+There are some small differences between the Built-In types in Godot and
+ the ones in Squirrel, so the documentation will not match.
+ The differences are documented here.
+\end_layout
+
+\begin_layout Standard
+An attempt will be made to document everything here,but if in doubt about
+ bindings on built-in types, you can always take a loot at the bindings
+ source file in script/squirrel/sq_bind_types.cpp.
+\end_layout
+
+\begin_layout Standard
+Built-In Types in Squirrel are passed by reference (unlike by value like
+ in GD).
+ They also don't need to be freed.
+\end_layout
+
+\begin_layout Subsection
+AABB
+\end_layout
+
+\begin_layout Standard
+\begin_inset Quotes eld
+\end_inset
+
+pos
+\begin_inset Quotes erd
+\end_inset
+
+,
+\begin_inset Quotes eld
+\end_inset
+
+size
+\begin_inset Quotes erd
+\end_inset
+
+ and
+\begin_inset Quotes eld
+\end_inset
+
+end
+\begin_inset Quotes erd
+\end_inset
+
+ are not available Use get_pos()/set_pos and get_size()/set_size().
+\end_layout
+
+\begin_layout Subsection
+InputEvent
+\end_layout
+
+\begin_layout Standard
+InputEvent is a single datatype and contains everything.
+ Use only the fields meant for the event type:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+//for mouse motion and button
+\end_layout
+
+\begin_layout Plain Layout
+
+int mouse_x
+\end_layout
+
+\begin_layout Plain Layout
+
+int mouse_y
+\end_layout
+
+\begin_layout Plain Layout
+
+int mouse_button_mask
+\end_layout
+
+\begin_layout Plain Layout
+
+int mouse_global_x
+\end_layout
+
+\begin_layout Plain Layout
+
+int mouse_global_y
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+//for mouse button
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+int mouse_button_index
+\end_layout
+
+\begin_layout Plain Layout
+
+bool mouse_button_pressed
+\end_layout
+
+\begin_layout Plain Layout
+
+bool mouse_button_doubleclick
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+//for mouse motion
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+int mouse_motion_x
+\end_layout
+
+\begin_layout Plain Layout
+
+int mouse_motion_y
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+//for keyboard
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+int key_scancode
+\end_layout
+
+\begin_layout Plain Layout
+
+int key_unicode
+\end_layout
+
+\begin_layout Plain Layout
+
+bool key_pressed
+\end_layout
+
+\begin_layout Plain Layout
+
+bool key_echo
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+//for keyboard and mouse
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+bool mod_alt
+\end_layout
+
+\begin_layout Plain Layout
+
+bool mod_shift
+\end_layout
+
+\begin_layout Plain Layout
+
+bool mod_meta
+\end_layout
+
+\begin_layout Plain Layout
+
+bool mod_control
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+//joy button
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+int joy_button_index
+\end_layout
+
+\begin_layout Plain Layout
+
+bool joy_button_pressed
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+//joy axis
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+int joy_axis
+\end_layout
+
+\begin_layout Plain Layout
+
+float joy_axis_value
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+//screen drag and touch
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+int screen_index
+\end_layout
+
+\begin_layout Plain Layout
+
+int screen_x
+\end_layout
+
+\begin_layout Plain Layout
+
+int screen_y
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+//screen touch
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+int screen_index
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+//action
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+int action_id
+\end_layout
+
+\begin_layout Plain Layout
+
+bool action_pressed
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Matrix3
+\end_layout
+
+\begin_layout Standard
+x,y,z member vectors are not available.
+ Use get_row() and set_row() instead.
+ Individual float values of the matrix are available as swizzle masks such
+ as xxy, xyz, zzx, etc.
+\end_layout
+
+\begin_layout Standard
+Additional in-place versions of some functions are available: transpose(),
+ invert(), rotate(), scale(), orthonormalize().
+\end_layout
+
+\begin_layout Subsection
+Transform
+\end_layout
+
+\begin_layout Standard
+\begin_inset Quotes eld
+\end_inset
+
+basis
+\begin_inset Quotes erd
+\end_inset
+
+ and
+\begin_inset Quotes eld
+\end_inset
+
+origin
+\begin_inset Quotes erd
+\end_inset
+
+ members are not available.
+ Use get_basis()/set_basis() and get_origin()/set_origin() instead.
+ Additional in-place versions of some functions are available: invert(),
+ affine_invert(), orthonormalize(), rotate(), translate(), scale().
+\end_layout
+
+\begin_layout Standard
+Vector2
+\end_layout
+
+\begin_layout Subsection
+Plane
+\end_layout
+
+\begin_layout Standard
+\begin_inset Quotes eld
+\end_inset
+
+normal
+\begin_inset Quotes erd
+\end_inset
+
+ member vector is not available.
+ Use get_normal(), set_normal() instead.
+\end_layout
+
+\begin_layout Subsection
+Rect2
+\end_layout
+
+\begin_layout Standard
+\begin_inset Quotes eld
+\end_inset
+
+pos
+\begin_inset Quotes erd
+\end_inset
+
+,
+\begin_inset Quotes eld
+\end_inset
+
+size
+\begin_inset Quotes erd
+\end_inset
+
+ and
+\begin_inset Quotes eld
+\end_inset
+
+end
+\begin_inset Quotes erd
+\end_inset
+
+ are not available Use get_pos()/set_pos and get_size()/set_size().
+\end_layout
+
+\begin_layout Subsection
+Native Arrays
+\end_layout
+
+\begin_layout Standard
+Native arrays such as RawArray, IntArray,StringArray, etc are not supported.
+ Use regular squirrel arrays instead, since conversion to/from them will
+ happen automatically.
+\end_layout
+
+\begin_layout Subsection
+Math Functions
+\end_layout
+
+\begin_layout Standard
+Math functions are inside the Math namespace in Squirrel.
+ For example Math.sin , Math.PI, Math.atan2().
+\end_layout
+
+\begin_layout Subsection
+Native Types
+\end_layout
+
+\begin_layout Standard
+Array, Dictionary and NodePath are not available.
+ Use a native array, table and string respectively.
+\end_layout
+
+\begin_layout Section
+_get , _set
+\end_layout
+
+\begin_layout Standard
+_get and _set are reserved in Squirrel, for overriding Godot Object property
+ getter/setter, use _get_property and _set_property.
+\end_layout
+
+\begin_layout Section
+Member Export
+\end_layout
+
+\begin_layout Standard
+Simple exporting of members (so far only integer, floating point and string
+ are supported) is supported by the @export extension.
+ It is used like this:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+class MyButton extends Button {
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ aprop=1 // @export
+\end_layout
+
+\begin_layout Plain Layout
+
+ bprop=2.0 // @export
+\end_layout
+
+\begin_layout Plain Layout
+
+ cprop="3" // @export
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ //these will be available to the property editor, and will be loaded/saved
+ with the scene.
+\end_layout
+
+\begin_layout Plain Layout
+
+}
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Always Enabled Scripts
+\end_layout
+
+\begin_layout Standard
+Scripts are not enabled in the editor by default.
+ To enable a script always, add an @always_enabled comment.
+ Example:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+//@always_enabled
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+class MyButton extends Button {
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+...
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Threads
+\end_layout
+
+\begin_layout Standard
+Thread support in Squirrel is very poor.
+ This is because of the stack-based nature of the language implementation.
+ Since godot can run in multiple threads, it will forcibily lock the whole
+ VM when accessed from multiple threads, which will result in degraded performan
+ce.
+ Creating user threads in Squirrel is definitely not recomended, as it may
+ completely lock the main thread.
+\end_layout
+
+\begin_layout Section
+References
+\end_layout
+
+\begin_layout Standard
+Godot has a built-in reference counted type used in conjunction with a template
+ (objects that inherit the
+\begin_inset Quotes eld
+\end_inset
+
+Reference
+\begin_inset Quotes erd
+\end_inset
+
+ class).
+ Since Squirrel also uses reference counting, it becomes impossible for
+ such types in godot to contain a script, because it would result in an
+ un-breakable reference cycle.
+ To avoid this, a Ref() class was created in Squirrel.
+
+\end_layout
+
+\begin_layout Standard
+When calling Godot API functions, returned references are wrapped inside
+ Ref() transparently, but the problem arises when creating a Reference-derived
+ object from the code.
+ In such cases, the reference must be wrapped manually like this:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+local f = Ref( File() )
+\end_layout
+
+\begin_layout Plain Layout
+
+local err = f.open("hello.txt",File.READ)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Anything not a reference that inherits from Object can be freed manually
+ by calling .free(), just like in GDScript.
+ Object classes are in itself weak references to engine objects, and their
+ validity can be checked by calling the
+\begin_inset Quotes eld
+\end_inset
+
+has_instance()
+\begin_inset Quotes erd
+\end_inset
+
+ built-in method.
+\end_layout
+
+\begin_layout Section
+Unicode
+\end_layout
+
+\begin_layout Standard
+Squirrel source code is supposed to support Unicode, but the implementation
+ is very broken (Squirrel attempts to use 16 bit chars no matter what, making
+ it incompatible when the host OS is 32 bit, like Linux).
+ Squirrel source code is parsed as UTF-8, and strings also contain UTF-8.
+ Wide char access in strings is not supported.
+\end_layout
+
+\begin_layout Section
+Debugging
+\end_layout
+
+\begin_layout Standard
+Squirrel is well integrated into the Godot debugger.
+ To run the project in debug mode, execute the godot binary with the -debug
+ argument.
+ Godot will break on squirrel errors and allow the programmer to debug.
+\end_layout
+
+\begin_layout Section
+Utility Functions
+\end_layout
+
+\begin_layout Standard
+There are a few squirrel-only utility functions available:
+\end_layout
+
+\begin_layout Subsection
+print(value[,value])
+\end_layout
+
+\begin_layout Standard
+Print stuff to stdout.
+\end_layout
+
+\begin_layout Subsection
+dofile(path)
+\end_layout
+
+\begin_layout Standard
+Execute a squirrel script file and return whatever the file returns.
+ Not recommended to use in production because it can't be optimized.
+\end_layout
+
+\begin_layout Subsection
+nativeref(var)
+\end_layout
+
+\begin_layout Standard
+Convert any squirrel type to an engine type.
+ When this type returns to squirrel, it's converted back.
+ This is useful to add to Godot callbacks to ensure that the datatype is
+ not converted.
+\end_layout
+
+\begin_layout Subsection
+unicode_split(string)
+\end_layout
+
+\begin_layout Standard
+Split an unicode string (utf8) into an array of widechars.
+ Useful since there is no wide char access from Squirrel.
+\end_layout
+
+\begin_layout Subsection
+breakpoint()
+\end_layout
+
+\begin_layout Standard
+Stop the debugger when reaches here (when run inside the debugger).
+\end_layout
+
+\begin_layout Subsection
+backtrace()
+\end_layout
+
+\begin_layout Standard
+Print a backtrace of the call stack.
+\end_layout
+
+\begin_layout Subsection
+tr(text)
+\end_layout
+
+\begin_layout Standard
+Translate text (use string lookup in Godot translation system).
+\end_layout
+
+\begin_layout Subsection
+printerr(text)
+\end_layout
+
+\begin_layout Standard
+Print a string to stderr.
+\end_layout
+
+\end_body
+\end_document