Config file
User privilege
Custom icon
Georges expression syntax
Georges file formats

# Config file

Your "georges.cfg" config file MUST have the following entries:

- root_search_directory = "R:\leveldesign\"; // (Root search path for georges files)
- typ_dfn_sub_folder = "DFN"; // (Sub directory for types and dfn files)
- remember_list_size = 11; // (Size of remember list in combobox)
- max_undo = 20; // (Size of the undo buffer)
- default_type = "default.typ"; // (Default type used when insert a new element in a DFN)
- default_dfn = "default.dfn"; // (Default dfn used when insert a new element in a DFN)
- plugins = { }; // (List of plugins to load with georges)
- superuser = 1; // (User mode. 0 for normal user, 1 for super user)
- user_type = { }; // (List of form type editable by a normal user. Superuser edit all kind of form)

# Custom icons

To have a custom icon for a form type (for exemple ".item"), place an icon file named "item.ico" in the Georges "DFN & TYPES" directory. then your file will shown with your custom icon in file explorer and in the georges file browser.

You can customise georges icons too. If can do the same thing to customise a special DFN or TYPE value in the left view of your document.

You can customise internal icons too. To do this, create one of the following icons:

- header.ico (Header of the document)
- type.ico (Type document)
- dfn.ico (Dfn document)
- root.ico (first node of the document)
- array.ico (Array node of the document)
- typedoc.ico (Type node of the document)
- struct.ico (Struct node of the document)
- vstruct.ico (Virtual struct node of the document)
- hold.ico (Hold buffers)

# User privilege

There is two privilege levels, user and superuser. To be a superuser, set to 1 the value superuser in georges.cfg. The user can't edit / open DFN and Type files, can't open the properties window. The user can create / modify only a subset of the forms. This subset is defined in the georges.cfg file by the parameter "user_type".

For exemple, if the user must only edit the files "*.animation" and "*.skeleton", set the config file like this:
user_type = { "animation", "skeleton" };

# Georges expression syntax

Georges expression syntax depends the type of value you edit. Non-numerical or numerical.
Numerical types are value of type UnsignedInt, SignedInt, Double.
Non-numerical are value of type Color, String, Filename.

### Non-numerical expression syntax

#### Exemples

Some exemples of Georges non-numerical expressions:

foo // Simple string
".Entities[0].Position.X" // Reference on a form string
{sqrt (24 * 2)} // Numerical expression converted in text
myname{".Level"*2}.creature // Strings and expressions concatenation

#### Grammar

non_num_expression: non_num_expression non_num_expression
| string
| value_reference
| numerical_expression
| constants
value_reference: "value_form_name"
numerical_expression: {numerical_expression_options num_expression (see above)}
numerical_expression_options: | $zN // Pad left the number with zeros until the size of the number reach N
constants: "$filename" : form filename

### Numerical expression syntax

#### Exemples

Some exemples of Georges numerical expressions:

1 // Simple number
1+1 // Basic operator
(1+2)*3 // Parentesis
sin (pi) // Math functions
2+$filename*4 // Operation with the number in the form filename
2+".Entities[0].Position.X"*4 // Operation with a form value

#### Grammar

num_expression: '-' num_expression
| '!' num_expression // Returns true if a equal false, else false (logical not)
| '~' num_expression // Returns ~ round(a) (bitwise not)
| '(' num_expression ')'
| num_expression operator num_expression
| function1 '(' num_expression ')'
| function2 '(' num_expression ',' num_expression ')'
| number
| constant
| value_reference
| value_existance
operator: '*' // Calculates (a * b)
| '/' // Calculates (a / b)
| '%' // Calculates the remainder of (a / b)
| '+' // Calculates (a + b)
| '-' // Calculates (a - b)
| '<<' // Returns round(a) left 32 bits unsigned shift by round(b)
| '>>' // Returns round(a) right 32 bits unsigned shift by round(b)
| '<-' // Returns round(a) left 32 bits signed shift by round(b)
| '->' // Returns round(a) right 32 bits signed shift by round(b)
| '<' // Returns true if a is strictly smaller than b
| '<=' // Returns true if a is smaller or equal than b
| '>' // Returns true if a is strictly bigger than b
| '>=' // Returns true if a is bigger or equal than b
| '==' // Returns true if a equal b, else returns false (warning, performs a floating point comparison)
| '!=' // Returns false if a equal b, else returns true (warning, performs a floating point comparison)
| '&' // Returns round(a) & round(b) over 32 bits
| '|' // Returns round(a) | round(b) over 32 bits
| '^' // Returns round(a) ^ round(b) over 32 bits
| '&&' // Returns true if a equal true and b equal true else returns false
| '||' // Returns true if a equal true or b equal true else returns false
| '^^' // Returns true if a equal true and b equal false, or, a equal false and b equal 1.0, else returns false
function1: abs // Calculates the absolute value
| acos // Calculates the arccosine
| asin // Calculates the arcsine
| atan // Calculates the arctangent
| ceil // Calculates the ceiling of a value ( ceil(-1.1) = -1, ceil(1.1) = 2 )
| cos // Calculates the cosine
| cosh // Calculates the hyperbolic cosine
| exp // Calculates the exponential
| exponent // Calculates the exponent of a floating point value
| floor // Calculates the floor of a value ( floor(-1.1) = -2, floor(1.1) = 1 )
| int // Calculates the C style integer value ( int(-1.6) = -1, int(1.6) = 1 )
| log // Calculates logarithms
| log10 // Calculates base-10 logarithms
| mantissa // Calculates the mantissa of a floating point value
| round // Calculates the nearest integer value ( round(-1.6) = -2, round(1.1) = 1 )
| sin // Calculate sines
| sinh // Calculate hyperbolic sines
| sq // Calculates the square
| sqrt // Calculates the square root
| tan // Calculates the tangent
| tanh // Calculates the hyperbolic tangent
function2: max // Returns the larger of two values
| min // Returns the smaller of two values
| atan2 // Calculates the arctangent of arg0/arg1
| pow // Calculates a raised at the power of b
| rand // Calculates a pseudo random value (arg0 <= randomValue < arg1)
number: [0-9]+ // Unsigned decimal integer
| "0x"[0-9a-fA-F]+ // Unsigned hexadecimal integer
| "0"[0-7]+ // Unsigned octal integer
| [0-9]*.[0-9]+ // Unsigned floating point value
| [0-9]*.[0-9]+[eE]-?[0-9]*.[0-9]+ // Unsigned floating point value with signed exponent
constant: e // 2.7182818284590452353602874713527
| pi // 3.1415926535897932384626433832795
| $filename // Returns the number found at the end of the form filename
value_reference: \"value_form_name\" // Return the value string. Must be a litteral expression. Return error if the value doesn't exist.
value_existance: \"#value_form_name\" // Return 1 if the form value is filled else 0. Return error if the value doesn't exist.

#### Operator precedence

0 - unary operator (-, ~, !)
1 - *, /, %
2 - +, -,
3 - <<, >>, <-, ->
4 - <, <=, >, >=
5 - ==, !=
6 - &
7 - |
8 - ^
9 - &&
10 - ||
11 - ^^

# Georges file formats

There is 3 kind of files:
Type files (*.typ), define a basic element type (string, color, number with default values, limit, enums and graphic user interface).
Dfn files (*.dfn), define a structure composed of basic elements, array of basic element, sub structures, array of sub structures and virtual sub structures.
Form files (*.dfn_name), implement a Dfn file (the name of the Dfn based file is dfn_name.dfn).