From 076ebe8fcf1030b705cd7bb6c30124fddbe654d6 Mon Sep 17 00:00:00 2001 From: Anton Tarasenko Date: Wed, 8 Apr 2020 01:32:30 +0700 Subject: [PATCH] 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 (`_` / `_()`). --- sources/Acedia.uc | 1 + sources/AcediaActor.uc | 40 ++++++++++++++++++++++++++++++++++++++++ sources/AcediaObject.uc | 35 +++++++++++++++++++++++++++++++++++ sources/Global.uc | 29 +++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 sources/AcediaActor.uc create mode 100644 sources/AcediaObject.uc create mode 100644 sources/Global.uc diff --git a/sources/Acedia.uc b/sources/Acedia.uc index 3a7fe12..fbe7764 100644 --- a/sources/Acedia.uc +++ b/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 diff --git a/sources/AcediaActor.uc b/sources/AcediaActor.uc new file mode 100644 index 0000000..1950db2 --- /dev/null +++ b/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 . + */ +class AcediaActor extends Actor + abstract; + +var protected Global _; + +event PreBeginPlay() +{ + super.PreBeginPlay(); + if (_ == none) + { + _ = Global(class'Global'.static.GetInstance()); + default._ = _; + } +} + +defaultproperties +{ +} \ No newline at end of file diff --git a/sources/AcediaObject.uc b/sources/AcediaObject.uc new file mode 100644 index 0000000..ec6cb4d --- /dev/null +++ b/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 . + */ +class AcediaObject extends Object + abstract; + +public static final function Global _() +{ + return Global(class'Global'.static.GetInstance()); +} + +defaultproperties +{ +} \ No newline at end of file diff --git a/sources/Global.uc b/sources/Global.uc new file mode 100644 index 0000000..8c46772 --- /dev/null +++ b/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 . + */ +class Global extends Singleton; + +var public Acedia acedia; + +protected function OnCreated() +{ + acedia = class'Acedia'.static.GetInstance(); +} \ No newline at end of file