The following describe the core functions of BooBoo. All of this can be used from the CLI version as well as the game engine.
Sections:
declare a variable or variables e.g. var x y z
Declare one or more constants. You must set a value for every constant. e.g. const var1 val1 var2 val2
load a different BooBoo script This is seamless and more or less instant. If you start drawing the same thing in the next script, the player may not know the script changed. It's useful for different game modes, menus, high scores etc... state information can be passed between scripts using the configuration API. e.g. reset "next_slide.boo"
Exit the app with a return code to the environment e.g. exit 0
Return a value from a function e.g. return 1 or just return if the function doesn't return a value
Include a BooBoo file at this point in the code e.g. include "my_functions.inc"
Define a label e.g. :jump_here
Define a comment e.g. = x 1 ; assign 1 to x
A multiline comment e.g. call foo bar /* foo bar */ baz
a string e.g. = name "Pelvis Johnson"
define a function
References can be defined by prefixing a parameter name by a tilde (~)
e.g. function foo param1 param2 ~param3 { ... }
Returns a string respresentation of the type of the second parameter e.g. = type_string (typeof my_var)
an expression e.g. (+ x (* y (* z w 2))) in C would be x+(y*(z*w*2)) Supported operators are: + - * / % && || > < >= <= == != ! | ^ & << >> The boolean operators return 1 or 0 Your own functions can be supplied as operators
Vector/map indexing operator e.g. = x [v [m "key"]] in C++ would be x = v[m["key"]] Can be used anywhere a variable is expected. You can use multiple indexes e.g. [v 3 2 1 0] is like v[3][2][1][0] in C.
Start a hexadecimal number e.g. #FF is equivalent to 255
A character. The character between quotes is turned to a number between 0 and 255. e.g. print "%(c)\n" 'a'
A reference. Function parameters preceded by a ~ can be modified
by a function
e.g. function foo a b ~c d ~e { ... } ; c and e can be modified
The address operator e.g. = my_pointer (@ my_var) or call foo (@ bar) ; where foo is expecting a pointer
Dereference operator. This is used to get/set the value pointed to by a pointer e.g. = p (@ some_num) e.g. = `p 10 ; some_num is now 10
You can do some basic "reflection" using toptr to get a pointer to the variable with the name in a string. e.g. var foo e.g. = number 10 e.g. var bar e.g. = bar "foo" e.g. = `(toptr bar) 1000 ; foo is now 1000 You can use this to script BooBoo with function names/etc in a text file. Returns NULL if the variable isn't found
assign e.g. = x 1
Cast to a number e.g. = n (number str)
Cast to a string e.g. = str (string num)
Cast to a vector e.g. var foo e.g. = foo (vector foo)
Cast to a map e.g. var foo e.g. = foo (map foo)
Cast to a function e.g. var foo e.g. = foo (function foo)
Cast to a label e.g. var foo e.g. = foo (label foo)
Cast to a pointer e.g. var foo e.g. = foo (pointer foo)
jump to a label e.g. goto next_loop
Comparison e.g. ? x 1 You can also evaluate an expression ? 1 (&& (> a b) (< x y)) je true jne false
Jumps like this one are based on the last comparison. If it was equal, this will jump, if not, it won't e.g. je process_x_equals_1
Jump if not equal e.g. jne process_x_not_1
Jump if less e.g. jl my_label
Jump if less or equal e.g. jle my_label
Jump if greater e.g. jg my_label
Jump if greater or equal e.g. jge my_label
Call a function that doesn't return anything e.g. call my_func param1 param2 param2
Call a function that returns a value e.g. call_result result my_func param1 param2
compare and jump e.g. if (expr1) the_if (expr2) elseif1 (expr3) elseif2 the_else ; expr1 true code :the_if ; expr2 true code :elseif1 ; expr3 true code :elseif2 ; else code :the_else the_if elseif1 elseif2 and the_else are labels that are the bottom of their code blocks. The else block is optional. Labels need to be in order of appearance in the if statement or behaviour is undefined.
A for loop e.g. for i start (expression) increment end_label ; your loop code here :end_label i is initialised to "start" then gets incremented by increment each loop until expression returns FALSE. break and continue work in loops
A while loop break and continue work in loops e.g. while (< i 10) loop /* code here */ :loop
A do/while loop The expression is first evaluated after the body is run, despite it being at the top... break and continue work in loops e.g. do_while (< i 10) loop /* code here */ :loop
format strings with replacements e.g. = dest (string_format "I'm % years old" age) printf-equivalent formating options are available with %(...) for example %(3.16g)
Get the value of character at index in a string This function is UTF8 compliant e.g. = dest (string_char_at str index)
Set character at position in string e.g. string_set_char_at s pos value
Get the length of a string This function is UTF8 compliant e.g. = dest (string_length str)
Turns the ascii value into a one character length string This function is UTF8 compliant e.g. = str (string_from_number 97) ; creates "a"
Create a substring of a string e.g. = s (string_substr s start end) End is optional, if not specified it will cut from start till the end of the string. This is UTF8 compliant
Make a string uppercase e.g. = s (string_uppercase s)
Make a string lowercase e.g. = s (string_lowercase s)
Trim leading and trailing whitespace from a string e.g. = s (string_trim s)
Trim leading whitespace from a string e.g. = s (string_trim s)
Trim trailing whitespace from a string e.g. = s (string_trim s)
regex replacement e.g. = str (string_replace str regex replacement)
Extract sub-strings from a string e.g. = out_vector (string_match str regex)
Check if a string matches a regex e.g. = yesno (string_matches str regex)
floating point modulus e.g. = x (fmod x 1.5)
trigonometry functions e.g. = n (sin n)
trigonometry functions e.g. = n (cos n)
trigonometry functions e.g. = n (tan n)
trigonometry functions e.g. = n (asin n)
trigonometry functions e.g. = n (acos n)
trigonometry functions e.g. = n (atan n)
trigonometry functions e.g. = n (atan2 y x)
absolute value e.g. = n (abs value)
exponentiation e.g. = n (pow x 2)
square root e.g. = n (sqrt x)
Calculate hypotenuse of a and b e.g. = n (hypot a b)
Drop the fractional part of a number e.g. = n (floor x)
Round to the next highest integer e.g. = n (ceil x)
Invert the sign of a number e.g. = n (neg x)
Returns the sign of a number e.g. = n (sign x)
Calculate the value of e e.g. = n (exp x)
Logarithm function e.g. = n (log x)
Base 10 logarithm e.g. = n (log10 x)
Get the minimum number in a list of values e.g. = n (min a b c d e f g)
Get the max number in a list of values e.g. = n (max a b)
Some vector and matrix math is available through expression operators. Supported are: mul, identity, scale, rotate, translate, length, dot, angle, cross, normalize, add, sub, inverse, transpose, frustum, perspective, ortho Most of these behave as you'd expect. identity takes 1 argument, the size of the matrix. scale, rotate and translate produce transformation matrices to be multiplied by another matrix (scale and translate take 3 parameters, rotate takes 4.)
push a value onto a vector e.g. vector_add v 0
get the number of elements in a vector e.g. = size (vector_size vec)
insert a value in any position in a vector e.g. vector_insert v index value
remove from a vector e.g. vector_erase v index
empty a vector or vectors e.g. vector_clear v1 v2
Allocate space for at least n elements to avoid reallocations e.g. vector_reserve v n
Sort a vector Takes a vector and a comparator function. The comparator function should take 2 arguments and return TRUE if the first is less than the second, otherwise FALSE. e.g. sort vec y_sort
Remove all non-unique elements from a sorted vector e.g. unique vec
Assign sequential vector elements to variables e.g. var v e.g. vector_init v 1 2 3 4 5 e.g. var a b c e.g. explode v a b c ; 1 2 3 in a b c
erase a key/value pair from a map e.g. map_erase m "key"
clear a map or maps e.g. map_clear m
Get the names of the keys from a map into a vector of strings e.g. = v (map_keys m)
open a file, mode can be either "a" "r" or "w" "a" means append, "w" means write (overwrite) and "r" means read mode. e.g. var f e.g. = f (file_open "out.txt "w") f will be -1 on failure
open a file from CPA. These are read only. All file read operations are supported. e.g. = f (file_open_cpa "foo.txt")
You should always close files you open with this e.g. file_close f
Read a word from a file Returns empty string on eof e.g. = s (file_read f)
Read a line from a file Returns empty string (no newline) on eof e.g. = s (file_read_line f)
Read a byte from a file. Returns a negative number on eof e.g. = n (file_read_byte f)
Write a byte to a file e.g. file_write_byte f 255
Write a word to a file e.g. file_write f "turkey"
Print to a file. Behaves exactly like print but takes a file e.g. file_print f "%(20s)%(20s)%(20s)" x y z
Return the current file offset e.g. = o (file_tell f)
Seek within file. Uses SEEK_* constants. e.g. file_seek f 0 SEEK_END
load a config file These files are saved in Saved Games\BooBoo along with every BooBoo app, so you should use a domain name or unique name e.g. = cfg (cfg_load "com.nooskewl.example")
save a config file e.g. = success (cfg_save cfg "com.nooskewl.example")
read a number from config. e.g. = dest (cfg_get_number cfg "x")
read a string from config e.g. = dest (cfg_get_string cfg "name")
set a value to be saved in a config file e.g. cfg_set_number cfg "x" 1
set a string value in a config file e.g. cfg_set_string cfg "name" "Trent"
check if a value exists in a config file e.g. = exists (cfg_exists cfg "x")
Erase a value in a config file e.g. cfg_erase cfg "example"
Free a configuration object e.g. cfg_destroy cfg
You can dig down into the file by separating keys with ">"
"[0]" "[1]" etc can be used to access arrays.
You can use NULL to access the shim5.json object.
Load a JSON file e.g. = j (json_load "file.json" ^ lffs) Returns -1 on fail
Create a blank JSON file. Takes a boolean that creates the root as either an array (TRUE) or hash (FALSE) e.g. = j (json_create FALSE) Returns -1 on fail
Check if a key exists in a JSON object e.g. = yesno (json_exists json "foo>bar>baz")
Return a string representation of JSON key type e.g. = val (json_typeof json "foo>bar>baz")
Return the number of children of a JSON key e.g. = n (json_size json "foo>bar>baz")
Read a string from JSON e.g. = s (json_get_string json "settings>profile>name")
Read a number from JSON e.g. = n (json_get_number json "settings>mouse>sensitivity")
Read a boolean from JSON e.g. = n (json_get_boolean json "settings>gfx>crt_filter")
Set a string in a JSON object e.g. json_set_string json "foo>bar>baz" "TURNIPS"
Set a number in a JSON object e.g. json_set_number json "foo>bar>baz" 762.4
Set a boolean in a JSON object e.g. json_set_bool json "foo>bar>baz" TRUE
Add an array element to a json object. e.g. json_add_array json "foo>bar>baz"
Add a hash element to a json object. e.g. json_add_array json "foo>bar>baz"
Remove a child from JSON tree e.g. json_remove json "foo>bar>baz"
Save a json object to json file e.g. = succeeded (json_save json "foo.json")
Free a JSON object e.g. json_destroy json
Register a number with DevSettings You can access devsettings by running with +debug and pressing F9 A "game>" prefix is added automatically. The optional callback is called with the key's name when the value is changed in devsettings e.g. json_register_number n "foo>baz" readonly ^ callback
Register a string with DevSettings You can access devsettings by running with +debug and pressing F9 A "game>" prefix is added automatically. The optional callback is called with the key's name when the value is changed in devsettings e.g. json_register_string s "foo>baz" readonly ^ callback
CPAs are extra datafiles with the same structure as data.cpa.
Load a CPA datafile. e.g. = cpa (cpa_load "file.cpa" ^ lffs) Returns -1 on fail
Change the default CPA file. All functions that load from data/data.cpa will now load from this CPA, until cpa_set_default is called. e.g. cpa_set cpa
Restore the default CPA datafile e.g. cpa_set_default
Free a CPA datafile e.g. cpa_destroy cpa
random integers between two numbers inclusive This uses a Mersenne Twister algorithm e.g. = r (rand 0 99)
Seed the random number generator e.g. srand (time)
Return time since epoch in seconds e.g. = t (time)
print a string (like string_format) e.g. print "Hello, I'm % and I like % and %" name like1 like2 printf-equivalent formating options are available with %(...) for example %(3.16g)
Read a word from stdin e.g. = str (input)
Get an environment variable e.g. = dest (getenv "HOME")
Create a directory e.g. mkdir my_string_path
List files and directories in a glob e.g. explode (list_directory "/home/Pelvis/*") filenames is_dir_flags
Returns the user interface language of the system e.g. = lang (get_system_language) lang will be in Steam format e.g. "french", "brazilian" etc Currently supported are: arabic bulgarian schinese tchinese czech danish dutch english finnish french german greek hungarian indonesian italian japanese korean norwegian polish portuguese brazilian romanian russian spanish latam swedish thai turkish ukrainian vietnamese
Get a list of active drive letters in a vector (e.g. "A", "C", ...) e.g. = v (list_drives)
Convert a pathname to a fully qualified pathname e.g. = filename (get_full_path filename)
Populate a vector with strings of the command line arguments e.g. = v (get_args)
Returns the path to the Saved Games folder e.g. = s (get_savedgames_path)
Change the text foreground colour. See constants for colours. Each colour has a bright version toggleable by a boolean. e.g. text_fore RED TRUE
Change the text background colour. See constants for colours. Each colour has a bright version toggleable by a boolean. e.g. text_back WHITE FALSE
Reset the text colour e.g. text_reset
Clear the screen e.g. text_clear
Input a single character from the terminal, not waiting for newline e.g. = input_number (getch)
These are used with text_fore/text_back:
Used with file_seek: