|
|
|
# Acedia's API
|
|
|
|
|
|
|
|
Acedia's API is our way of solving the problem of adding new *global functions*.
|
|
|
|
Examples of *global functions* are `Log()`, `Caps()`, `Abs()`, `VSize()`
|
|
|
|
and a multitude of others that you can call from anywhere in UnrealScript.
|
|
|
|
They can be accessed from anywhere because they are all declared as
|
|
|
|
static methods inside `Object` - a base class for any other class.
|
|
|
|
Problem is, since we cannot add our own methods to the `Object`,
|
|
|
|
then we also can't add new global functions.
|
|
|
|
The best we can do is declare new static methods in our own classes,
|
|
|
|
but calling them would be cumbersome: `class'glb'.static.DoIt()`.
|
|
|
|
|
|
|
|
Idea that we've used to solve this problem for Acedia is to provide every single
|
|
|
|
Acedia object with an instance of a class that would contain all our
|
|
|
|
global functions.
|
|
|
|
We save an instance of this class in a local variable
|
|
|
|
`_`, which allows us to simply write `_.DoIt()`.
|
|
|
|
|
|
|
|
In actuality we don't just dump all of Acedia's global functions into
|
|
|
|
one object, but group them into different APIs that can be accessed
|
|
|
|
through `_` variable:
|
|
|
|
|
|
|
|
```unrealscript
|
|
|
|
_.text.FromString("I am here!"); // Text API
|
|
|
|
_.alias.ResolveColor("blue"); // Alias API
|
|
|
|
_.collections.EmptyDynamicArray(); // Collections API
|
|
|
|
_.memory.Allocate(class'SimpleSignal'); // Memory API
|
|
|
|
```
|
|
|
|
|
|
|
|
`_` can't be accessed in static methods, since only default values are
|
|
|
|
available in them.
|
|
|
|
Since writing `default._` would also be bulky, `AcediaObject` and `AcediaActor`
|
|
|
|
provide a static method `public static final function Global __()`
|
|
|
|
that is always available:
|
|
|
|
|
|
|
|
```unrealscript
|
|
|
|
__().text.FromString("I am here!");
|
|
|
|
__().alias.ResolveColor("blue");
|
|
|
|
__().collections.EmptyDynamicArray();
|
|
|
|
__().memory.Allocate(class'SimpleSignal');
|
|
|
|
```
|
|
|
|
|
|
|
|
Any class you make that derives from either `AcediaObject` or `AcediaActor`
|
|
|
|
will have `_` and `__()` defined.
|
|
|
|
If you need to create a class that does not derive from Acedia's classes,
|
|
|
|
but you want to make Acedia's API be available inside it,
|
|
|
|
then you simply need to redefine `_` and `__()`:
|
|
|
|
|
|
|
|
```unrealscript
|
|
|
|
var Global _;
|
|
|
|
|
|
|
|
public static final function Global __()
|
|
|
|
{
|
|
|
|
return class'Global'.static.GetInstance();
|
|
|
|
}
|
|
|
|
|
|
|
|
// ...
|
|
|
|
// Set `_`'s value somewhere before using your class:
|
|
|
|
_ = class'Global'.static.GetInstance();
|
|
|
|
```
|