Browse Source

Add global namespace to Acedia actors and objects

We want all actors and objects defined in Acedia to share
a global namespace that provides an access to important variables
(such as `Acedia` reference) and functions.

We add a `Global` singleton and `AcediaActor` / `AcediaObject`
base classes with a quick accessor to it's instance (`_` / `_()`).
new
Anton Tarasenko 5 years ago
parent
commit
076ebe8fcf
  1. 1
      sources/Acedia.uc
  2. 40
      sources/AcediaActor.uc
  3. 35
      sources/AcediaObject.uc
  4. 29
      sources/Global.uc

1
sources/Acedia.uc

@ -49,6 +49,7 @@ event PreBeginPlay()
}
default.selfReference = self;
// Boot up Acedia
Spawn(class'Global');
LoadManifest(class'Manifest');
LaunchServices();
InjectBroadcastHandler(); // TODO: move this to 'SideEffect' mechanic

40
sources/AcediaActor.uc

@ -0,0 +1,40 @@
/**
* Actor base class to be used to Acedia instead of an `Actor`.
* The only difference is defined `_` member that provides convenient access to
* Acedia's API.
* It isn't guaranteed that `default._` will be defined for `AcediaActor`s.
* Copyright 2020 Anton Tarasenko
*------------------------------------------------------------------------------
* This file is part of Acedia.
*
* Acedia is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License, or
* (at your option) any later version.
*
* Acedia is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Acedia. If not, see <https://www.gnu.org/licenses/>.
*/
class AcediaActor extends Actor
abstract;
var protected Global _;
event PreBeginPlay()
{
super.PreBeginPlay();
if (_ == none)
{
_ = Global(class'Global'.static.GetInstance());
default._ = _;
}
}
defaultproperties
{
}

35
sources/AcediaObject.uc

@ -0,0 +1,35 @@
/**
* Object base class to be used to Acedia instead of an `Object`.
* The only difference is defined `_` member that provides convenient access to
* Acedia's API.
* Since `Global` is an actor, we wish to avoid storing it's instance in
* the object because it can mess with garbage collection on level change.
* So we provide an accessor function `_()` instead.
* Copyright 2020 Anton Tarasenko
*------------------------------------------------------------------------------
* This file is part of Acedia.
*
* Acedia is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License, or
* (at your option) any later version.
*
* Acedia is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Acedia. If not, see <https://www.gnu.org/licenses/>.
*/
class AcediaObject extends Object
abstract;
public static final function Global _()
{
return Global(class'Global'.static.GetInstance());
}
defaultproperties
{
}

29
sources/Global.uc

@ -0,0 +1,29 @@
/**
* Class for an object that will provide an access to a Acedia's functionality
* by giving a reference to this actor to all Acedia's objects and actors,
* emulating a global API namespace.
* Copyright 2020 Anton Tarasenko
*------------------------------------------------------------------------------
* This file is part of Acedia.
*
* Acedia is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License, or
* (at your option) any later version.
*
* Acedia is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Acedia. If not, see <https://www.gnu.org/licenses/>.
*/
class Global extends Singleton;
var public Acedia acedia;
protected function OnCreated()
{
acedia = class'Acedia'.static.GetInstance();
}