Browse Source

Change directory structure and `CoreAPI` naming

core_refactor
Anton Tarasenko 2 years ago
parent
commit
82ff13e230
  1. 2
      sources/Avarice/AvariceLink.uc
  2. 0
      sources/BaseAPI/API/Math/BigInt.uc
  3. 0
      sources/BaseAPI/API/Math/MathAPI.uc
  4. 0
      sources/BaseAPI/API/Math/Tests/TEST_BigInt.uc
  5. 0
      sources/BaseAPI/API/Memory/AcediaObjectPool.uc
  6. 0
      sources/BaseAPI/API/Memory/MemoryAPI.uc
  7. 0
      sources/BaseAPI/API/Memory/Tests/MockActor.uc
  8. 0
      sources/BaseAPI/API/Memory/Tests/MockObject.uc
  9. 0
      sources/BaseAPI/API/Memory/Tests/MockObjectNoPool.uc
  10. 4
      sources/BaseAPI/API/Memory/Tests/TEST_Memory.uc
  11. 0
      sources/BaseAPI/API/Scheduler/SchedulerAPI.uc
  12. 0
      sources/BaseAPI/API/Scheduler/SchedulerDiskRequest.uc
  13. 0
      sources/BaseAPI/API/Scheduler/SchedulerJob.uc
  14. 0
      sources/BaseAPI/API/Scheduler/Tests/MockJob.uc
  15. 0
      sources/BaseAPI/API/Scheduler/Tests/TEST_SchedulerAPI.uc
  16. 0
      sources/BaseAPI/AcediaEnvironment/AcediaEnvironment.uc
  17. 0
      sources/BaseAPI/AcediaEnvironment/Events/Environment_FeatureDisabled_Signal.uc
  18. 0
      sources/BaseAPI/AcediaEnvironment/Events/Environment_FeatureDisabled_Slot.uc
  19. 0
      sources/BaseAPI/AcediaEnvironment/Events/Environment_FeatureEnabled_Signal.uc
  20. 0
      sources/BaseAPI/AcediaEnvironment/Events/Environment_FeatureEnabled_Slot.uc
  21. 0
      sources/BaseAPI/Global.uc
  22. 0
      sources/BaseAPI/Iter.uc
  23. 0
      sources/BaseAPI/_manifest.uc
  24. 0
      sources/ClientAPI/API/Unreal/ClientUnrealAPI.uc
  25. 0
      sources/ClientAPI/API/Unreal/InteractionAPI/Events/Interaction_OnRender_Signal.uc
  26. 0
      sources/ClientAPI/API/Unreal/InteractionAPI/Events/Interaction_OnRender_Slot.uc
  27. 0
      sources/ClientAPI/API/Unreal/InteractionAPI/InteractionAPI.uc
  28. 0
      sources/ClientAPI/ClientAcediaAdapter.uc
  29. 0
      sources/ClientAPI/ClientGlobal.uc
  30. 0
      sources/ClientAPI/ClientLevelCore.uc
  31. 2
      sources/Data/Database/DBAPI.uc
  32. 12
      sources/Data/Database/Local/DBRecord.uc
  33. 6
      sources/Data/Database/Local/LocalDatabaseInstance.uc
  34. 10
      sources/Data/Database/Tests/TEST_DatabaseCommon.uc
  35. 46
      sources/Data/Database/Tests/TEST_LocalDatabase.uc
  36. 0
      sources/KFImplementation/Client/API/Unreal/InteractionAPI/KF1_InteractionAPI.uc
  37. 0
      sources/KFImplementation/Client/API/Unreal/KF1_ClientUnrealAPI.uc
  38. 0
      sources/KFImplementation/Client/AcediaInteraction.uc
  39. 0
      sources/KFImplementation/Core/ActorStalker.uc
  40. 0
      sources/KFImplementation/Core/KF1_SideEffectAPI.uc
  41. 0
      sources/KFImplementation/Core/Time/KF1_RealTimer.uc
  42. 0
      sources/KFImplementation/Core/Time/KF1_TimeAPI.uc
  43. 0
      sources/KFImplementation/Core/Time/KF1_Timer.uc
  44. 0
      sources/KFImplementation/Server/Unreal/BroadcastsAPI/BroadcastEventsObserver.uc
  45. 0
      sources/KFImplementation/Server/Unreal/BroadcastsAPI/BroadcastSideEffect.uc
  46. 0
      sources/KFImplementation/Server/Unreal/BroadcastsAPI/KF1_BroadcastAPI.uc
  47. 0
      sources/KFImplementation/Server/Unreal/Connections/ConnectionService.uc
  48. 0
      sources/KFImplementation/Server/Unreal/Connections/Events/Connection_Signal.uc
  49. 0
      sources/KFImplementation/Server/Unreal/Connections/Events/Connection_Slot.uc
  50. 0
      sources/KFImplementation/Server/Unreal/GameRulesAPI/AcediaGameRules.uc
  51. 0
      sources/KFImplementation/Server/Unreal/GameRulesAPI/GameRulesSideEffect.uc
  52. 2
      sources/KFImplementation/Server/Unreal/GameRulesAPI/KF1_GameRulesAPI.uc
  53. 0
      sources/KFImplementation/Server/Unreal/InventoryAPI/InventoryService.uc
  54. 0
      sources/KFImplementation/Server/Unreal/InventoryAPI/KF1_InventoryAPI.uc
  55. 0
      sources/KFImplementation/Server/Unreal/KF1_ServerUnrealAPI.uc
  56. 0
      sources/KFImplementation/Server/Unreal/MutatorAPI/KF1_MutatorAPI.uc
  57. 0
      sources/KFImplementation/Server/Unreal/NativeActorRef.uc
  58. 0
      sources/KFImplementation/Server/Unreal/ServerUnrealService.uc
  59. 0
      sources/KFImplementation/Server/Unreal/Tests/MockGameRulesA.uc
  60. 0
      sources/KFImplementation/Server/Unreal/Tests/MockGameRulesB.uc
  61. 0
      sources/KFImplementation/Server/Unreal/Tests/MockInventoryA.uc
  62. 0
      sources/KFImplementation/Server/Unreal/Tests/MockInventoryAChild.uc
  63. 0
      sources/KFImplementation/Server/Unreal/Tests/MockInventoryB.uc
  64. 14
      sources/KFImplementation/Server/Unreal/Tests/TEST_ServerUnrealAPI.uc
  65. 0
      sources/LevelAPI/API/SideEffects/SideEffect.uc
  66. 0
      sources/LevelAPI/API/SideEffects/SideEffectAPI.uc
  67. 0
      sources/LevelAPI/API/Time/Events/Timer_OnElapsed_Signal.uc
  68. 0
      sources/LevelAPI/API/Time/Events/Timer_OnElapsed_Slot.uc
  69. 0
      sources/LevelAPI/API/Time/TimeAPI.uc
  70. 0
      sources/LevelAPI/API/Time/Timer.uc
  71. 0
      sources/LevelAPI/API/UnrealAPI/ActorService.uc
  72. 0
      sources/LevelAPI/API/UnrealAPI/Events/Unreal_OnTick_Signal.uc
  73. 0
      sources/LevelAPI/API/UnrealAPI/Events/Unreal_OnTick_Slot.uc
  74. 0
      sources/LevelAPI/API/UnrealAPI/UnrealAPI.uc
  75. 0
      sources/LevelAPI/AcediaAdapter.uc
  76. 0
      sources/LevelAPI/CoreGlobal.uc
  77. 0
      sources/LevelAPI/Features/Commands/BuiltInCommands/ACommandHelp.uc
  78. 0
      sources/LevelAPI/Features/Commands/Command.uc
  79. 0
      sources/LevelAPI/Features/Commands/CommandDataBuilder.uc
  80. 0
      sources/LevelAPI/Features/Commands/CommandParser.uc
  81. 0
      sources/LevelAPI/Features/Commands/Commands.uc
  82. 0
      sources/LevelAPI/Features/Commands/Commands_Feature.uc
  83. 0
      sources/LevelAPI/Features/Commands/PlayersParser.uc
  84. 0
      sources/LevelAPI/Features/Commands/Tests/MockCommandA.uc
  85. 0
      sources/LevelAPI/Features/Commands/Tests/MockCommandB.uc
  86. 0
      sources/LevelAPI/Features/Commands/Tests/TEST_Command.uc
  87. 0
      sources/LevelAPI/Features/Commands/Tests/TEST_CommandDataBuilder.uc
  88. 0
      sources/LevelAPI/LevelCore.uc
  89. 0
      sources/LevelAPI/SideEffects.uc
  90. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/BroadcastAPI.uc
  91. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnBroadcastCheck_Signal.uc
  92. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnBroadcastCheck_Slot.uc
  93. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalizedFor_Signal.uc
  94. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalizedFor_Slot.uc
  95. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalized_Signal.uc
  96. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalized_Slot.uc
  97. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleTextFor_Signal.uc
  98. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleTextFor_Slot.uc
  99. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleText_Signal.uc
  100. 0
      sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleText_Slot.uc
  101. Some files were not shown because too many files have changed in this diff Show More

2
sources/Avarice/AvariceLink.uc

@ -241,7 +241,7 @@ public final function StartUp()
if (tcpStream == none) return; if (tcpStream == none) return;
if (tcpStream.Get() != none) return; if (tcpStream.Get() != none) return;
core = __core().GetLevelCore(); core = __level().GetLevelCore();
if (core == none) return; if (core == none) return;
newStream = AvariceTcpStream(core.Allocate(class'AvariceTcpStream')); newStream = AvariceTcpStream(core.Allocate(class'AvariceTcpStream'));

0
sources/BaseRealm/API/Math/BigInt.uc → sources/BaseAPI/API/Math/BigInt.uc

0
sources/BaseRealm/API/Math/MathAPI.uc → sources/BaseAPI/API/Math/MathAPI.uc

0
sources/BaseRealm/API/Math/Tests/TEST_BigInt.uc → sources/BaseAPI/API/Math/Tests/TEST_BigInt.uc

0
sources/BaseRealm/API/Memory/AcediaObjectPool.uc → sources/BaseAPI/API/Memory/AcediaObjectPool.uc

0
sources/BaseRealm/API/Memory/MemoryAPI.uc → sources/BaseAPI/API/Memory/MemoryAPI.uc

0
sources/BaseRealm/API/Memory/Tests/MockActor.uc → sources/BaseAPI/API/Memory/Tests/MockActor.uc

0
sources/BaseRealm/API/Memory/Tests/MockObject.uc → sources/BaseAPI/API/Memory/Tests/MockObject.uc

0
sources/BaseRealm/API/Memory/Tests/MockObjectNoPool.uc → sources/BaseAPI/API/Memory/Tests/MockObjectNoPool.uc

4
sources/BaseRealm/API/Memory/Tests/TEST_Memory.uc → sources/BaseAPI/API/Memory/Tests/TEST_Memory.uc

@ -93,9 +93,9 @@ protected static function Test_ActorConstructorsFinalizers() {
Context("Testing that Acedia actor's constructors and finalizers are called properly."); Context("Testing that Acedia actor's constructors and finalizers are called properly.");
Issue("Actor's constructor is not called."); Issue("Actor's constructor is not called.");
act1 = MockActor(__core().GetLevelCore().Allocate(class'MockActor')); act1 = MockActor(__level().GetLevelCore().Allocate(class'MockActor'));
TEST_ExpectTrue(class'MockActor'.default.actorCount == 1); TEST_ExpectTrue(class'MockActor'.default.actorCount == 1);
act2 = MockActor(__core().GetLevelCore().Allocate(class'MockActor')); act2 = MockActor(__level().GetLevelCore().Allocate(class'MockActor'));
TEST_ExpectTrue(class'MockActor'.default.actorCount == 2); TEST_ExpectTrue(class'MockActor'.default.actorCount == 2);
Issue("Actor's finalizer is not called."); Issue("Actor's finalizer is not called.");

0
sources/BaseRealm/API/Scheduler/SchedulerAPI.uc → sources/BaseAPI/API/Scheduler/SchedulerAPI.uc

0
sources/BaseRealm/API/Scheduler/SchedulerDiskRequest.uc → sources/BaseAPI/API/Scheduler/SchedulerDiskRequest.uc

0
sources/BaseRealm/API/Scheduler/SchedulerJob.uc → sources/BaseAPI/API/Scheduler/SchedulerJob.uc

0
sources/BaseRealm/API/Scheduler/Tests/MockJob.uc → sources/BaseAPI/API/Scheduler/Tests/MockJob.uc

0
sources/BaseRealm/API/Scheduler/Tests/TEST_SchedulerAPI.uc → sources/BaseAPI/API/Scheduler/Tests/TEST_SchedulerAPI.uc

0
sources/BaseRealm/AcediaEnvironment/AcediaEnvironment.uc → sources/BaseAPI/AcediaEnvironment/AcediaEnvironment.uc

0
sources/BaseRealm/AcediaEnvironment/Events/Environment_FeatureDisabled_Signal.uc → sources/BaseAPI/AcediaEnvironment/Events/Environment_FeatureDisabled_Signal.uc

0
sources/BaseRealm/AcediaEnvironment/Events/Environment_FeatureDisabled_Slot.uc → sources/BaseAPI/AcediaEnvironment/Events/Environment_FeatureDisabled_Slot.uc

0
sources/BaseRealm/AcediaEnvironment/Events/Environment_FeatureEnabled_Signal.uc → sources/BaseAPI/AcediaEnvironment/Events/Environment_FeatureEnabled_Signal.uc

0
sources/BaseRealm/AcediaEnvironment/Events/Environment_FeatureEnabled_Slot.uc → sources/BaseAPI/AcediaEnvironment/Events/Environment_FeatureEnabled_Slot.uc

0
sources/BaseRealm/Global.uc → sources/BaseAPI/Global.uc

0
sources/BaseRealm/Iter.uc → sources/BaseAPI/Iter.uc

0
sources/BaseRealm/_manifest.uc → sources/BaseAPI/_manifest.uc

0
sources/ClientRealm/API/Unreal/ClientUnrealAPI.uc → sources/ClientAPI/API/Unreal/ClientUnrealAPI.uc

0
sources/ClientRealm/API/Unreal/InteractionAPI/Events/Interaction_OnRender_Signal.uc → sources/ClientAPI/API/Unreal/InteractionAPI/Events/Interaction_OnRender_Signal.uc

0
sources/ClientRealm/API/Unreal/InteractionAPI/Events/Interaction_OnRender_Slot.uc → sources/ClientAPI/API/Unreal/InteractionAPI/Events/Interaction_OnRender_Slot.uc

0
sources/ClientRealm/API/Unreal/InteractionAPI/InteractionAPI.uc → sources/ClientAPI/API/Unreal/InteractionAPI/InteractionAPI.uc

0
sources/ClientRealm/ClientAcediaAdapter.uc → sources/ClientAPI/ClientAcediaAdapter.uc

0
sources/ClientRealm/ClientGlobal.uc → sources/ClientAPI/ClientGlobal.uc

0
sources/ClientRealm/ClientLevelCore.uc → sources/ClientAPI/ClientLevelCore.uc

2
sources/Data/Database/DBAPI.uc

@ -329,7 +329,7 @@ private function EraseAllPackageData(BaseText packageToErase)
if (packageName == "") { if (packageName == "") {
return; return;
} }
game = __core().unreal_api().GetGameType(); game = __level().unreal_api().GetGameType();
game.DeletePackage(packageName); game.DeletePackage(packageName);
// Delete any leftover objects. This has to be done *after* // Delete any leftover objects. This has to be done *after*
// `DeletePackage()` call, otherwise removed garbage can reappear. // `DeletePackage()` call, otherwise removed garbage can reappear.

12
sources/Data/Database/Local/DBRecord.uc

@ -267,7 +267,7 @@ public static final function Global __()
return class'Global'.static.GetInstance(); return class'Global'.static.GetInstance();
} }
public static final function CoreGlobal __core() public static final function CoreGlobal __level()
{ {
return class'CoreGlobal'.static.GetGenericInstance(); return class'CoreGlobal'.static.GetGenericInstance();
} }
@ -307,7 +307,7 @@ private final static function DBRecord NewRecordFor(string dbPackageName)
if (recordCandidate != none) { if (recordCandidate != none) {
continue; continue;
} }
recordCandidate = __core().unreal_api().GetGameType() recordCandidate = __level().unreal_api().GetGameType()
.CreateDataObject(class'DBRecord', nextName, dbPackageName); .CreateDataObject(class'DBRecord', nextName, dbPackageName);
recordCandidate.package = dbPackageName; recordCandidate.package = dbPackageName;
return recordCandidate; return recordCandidate;
@ -333,7 +333,7 @@ private final static function DBRecord LoadRecordFor(
string name, string name,
string package) string package)
{ {
return __core().unreal_api().GetGameType() return __level().unreal_api().GetGameType()
.LoadDataObject(class'DBRecord', name, package); .LoadDataObject(class'DBRecord', name, package);
} }
@ -692,7 +692,7 @@ private final function SetItem(
if (oldRecord != none) { if (oldRecord != none) {
oldRecord.EmptySelf(); oldRecord.EmptySelf();
} }
__core().unreal_api().GetGameType() __level().unreal_api().GetGameType()
.DeleteDataObject(class'DBRecord', oldItem.s, package); .DeleteDataObject(class'DBRecord', oldItem.s, package);
} }
} }
@ -726,7 +726,7 @@ private final function RemoveItem(int index)
if (oldRecord != none) { if (oldRecord != none) {
oldRecord.EmptySelf(); oldRecord.EmptySelf();
} }
__core().unreal_api().GetGameType() __level().unreal_api().GetGameType()
.DeleteDataObject(class'DBRecord', oldItem.s, package); .DeleteDataObject(class'DBRecord', oldItem.s, package);
} }
storage.Remove(index, 1); storage.Remove(index, 1);
@ -875,7 +875,7 @@ public final function EmptySelf()
return; return;
} }
lockEraseSelf = true; lockEraseSelf = true;
game = __core().unreal_api().GetGameType(); game = __level().unreal_api().GetGameType();
for (i = 0; i < storage.length; i += 1) for (i = 0; i < storage.length; i += 1)
{ {
if (storage[i].t != DBAT_Reference) continue; if (storage[i].t != DBAT_Reference) continue;

6
sources/Data/Database/Local/LocalDatabaseInstance.uc

@ -83,7 +83,7 @@ var private int lastTaskLifeVersion;
protected function Constructor() protected function Constructor()
{ {
__core().unreal_api().OnTick(self).connect = CompleteAllTasks; __level().unreal_api().OnTick(self).connect = CompleteAllTasks;
} }
protected function Finalizer() protected function Finalizer()
@ -93,7 +93,7 @@ protected function Finalizer()
CompleteAllTasks(); CompleteAllTasks();
WriteToDisk(); WriteToDisk();
rootRecord = none; rootRecord = none;
__core().unreal_api().OnTick(self).Disconnect(); __level().unreal_api().OnTick(self).Disconnect();
configEntry = none; configEntry = none;
} }
@ -130,7 +130,7 @@ public final function WriteToDisk()
packageName = _.text.IntoString(configEntry.GetPackageName()); packageName = _.text.IntoString(configEntry.GetPackageName());
} }
if (packageName != "") { if (packageName != "") {
__core().unreal_api().GetGameType().SavePackage(packageName); __level().unreal_api().GetGameType().SavePackage(packageName);
} }
} }

10
sources/Data/Database/Tests/TEST_DatabaseCommon.uc

@ -25,20 +25,20 @@ protected static function TESTS()
local JSONPointer pointer; local JSONPointer pointer;
Context("Testing extracting `JSONPointer` from database link."); Context("Testing extracting `JSONPointer` from database link.");
Issue("`JSONPointer` is incorrectly extracted."); Issue("`JSONPointer` is incorrectly extracted.");
pointer = __core().db.GetPointer( pointer = __level().db.GetPointer(
__().text.FromString("[local]default:/huh/what/is/")); __().text.FromString("[local]default:/huh/what/is/"));
TEST_ExpectNotNone(pointer); TEST_ExpectNotNone(pointer);
TEST_ExpectTrue(pointer.ToText().ToString() == "/huh/what/is/"); TEST_ExpectTrue(pointer.ToText().ToString() == "/huh/what/is/");
pointer = __core().db.GetPointer(__().text.FromString("[remote]db:")); pointer = __level().db.GetPointer(__().text.FromString("[remote]db:"));
TEST_ExpectNotNone(pointer); TEST_ExpectNotNone(pointer);
TEST_ExpectTrue(pointer.ToText().ToString() == ""); TEST_ExpectTrue(pointer.ToText().ToString() == "");
pointer = __core().db.GetPointer(__().text.FromString("[remote]:")); pointer = __level().db.GetPointer(__().text.FromString("[remote]:"));
TEST_ExpectNotNone(pointer); TEST_ExpectNotNone(pointer);
TEST_ExpectTrue(pointer.ToText().ToString() == ""); TEST_ExpectTrue(pointer.ToText().ToString() == "");
pointer = __core().db.GetPointer(__().text.FromString("db:/just/a/pointer")); pointer = __level().db.GetPointer(__().text.FromString("db:/just/a/pointer"));
TEST_ExpectNotNone(pointer); TEST_ExpectNotNone(pointer);
TEST_ExpectTrue(pointer.ToText().ToString() == "/just/a/pointer"); TEST_ExpectTrue(pointer.ToText().ToString() == "/just/a/pointer");
pointer = __core().db.GetPointer(__().text.FromString(":/just/a/pointer")); pointer = __level().db.GetPointer(__().text.FromString(":/just/a/pointer"));
TEST_ExpectNotNone(pointer); TEST_ExpectNotNone(pointer);
TEST_ExpectTrue(pointer.ToText().ToString() == "/just/a/pointer"); TEST_ExpectTrue(pointer.ToText().ToString() == "/just/a/pointer");
} }

46
sources/Data/Database/Tests/TEST_LocalDatabase.uc

@ -132,7 +132,7 @@ local LocalDatabaseInstance db;
source = GetJSONTemplateString(); source = GetJSONTemplateString();
parser = __().text.ParseString(source); parser = __().text.ParseString(source);
root = HashTable(__().json.ParseWith(parser)); root = HashTable(__().json.ParseWith(parser));
db = __core().db.NewLocal(P("TEST_ReadOnly")); db = __level().db.NewLocal(P("TEST_ReadOnly"));
db.WriteData(__().json.Pointer(), root); db.WriteData(__().json.Pointer(), root);
*/ */
protected static function string GetJSONTemplateString() protected static function string GetJSONTemplateString()
@ -241,14 +241,14 @@ protected static function TESTS()
protected static function Test_LoadingPrepared() protected static function Test_LoadingPrepared()
{ {
local LocalDatabaseInstance db; local LocalDatabaseInstance db;
db = __core().db.LoadLocal(P("TEST_ReadOnly")); db = __level().db.LoadLocal(P("TEST_ReadOnly"));
Context("Testing reading prepared data from the local database."); Context("Testing reading prepared data from the local database.");
Issue("Existing database reported as missing."); Issue("Existing database reported as missing.");
TEST_ExpectTrue(__core().db.ExistsLocal(P("TEST_ReadOnly"))); TEST_ExpectTrue(__level().db.ExistsLocal(P("TEST_ReadOnly")));
Issue("Loading same database several times produces different" Issue("Loading same database several times produces different"
@ "`LocalDatabaseInstance` objects."); @ "`LocalDatabaseInstance` objects.");
TEST_ExpectTrue(__core().db.LoadLocal(P("TEST_ReadOnly")) == db); TEST_ExpectTrue(__level().db.LoadLocal(P("TEST_ReadOnly")) == db);
// Groups of read-only tests // Groups of read-only tests
SubTest_LoadingPreparedSuccessRoot(db); SubTest_LoadingPreparedSuccessRoot(db);
SubTest_LoadingPreparedSuccessSubValues(db); SubTest_LoadingPreparedSuccessSubValues(db);
@ -487,18 +487,18 @@ protected static function SubTest_LoadingPreparedGetKeysFail(
protected static function Test_Writing() protected static function Test_Writing()
{ {
local LocalDatabaseInstance db; local LocalDatabaseInstance db;
db = __core().db.NewLocal(P("TEST_DB")); db = __level().db.NewLocal(P("TEST_DB"));
Context("Testing (re-)creating and writing into a new local database."); Context("Testing (re-)creating and writing into a new local database.");
Issue("Cannot create a new database."); Issue("Cannot create a new database.");
TEST_ExpectNotNone(db); TEST_ExpectNotNone(db);
TEST_ExpectTrue(__core().db.ExistsLocal(P("TEST_DB"))); TEST_ExpectTrue(__level().db.ExistsLocal(P("TEST_DB")));
Issue("Freshly created database is not empty."); Issue("Freshly created database is not empty.");
TEST_ExpectTrue(CountRecordsInPackage("TEST_DB") == 1); // 1 root object TEST_ExpectTrue(CountRecordsInPackage("TEST_DB") == 1); // 1 root object
Issue("Loading just created database produces different" Issue("Loading just created database produces different"
@ "`LocalDatabaseInstance` object."); @ "`LocalDatabaseInstance` object.");
TEST_ExpectTrue(__core().db.LoadLocal(P("TEST_DB")) == db); TEST_ExpectTrue(__level().db.LoadLocal(P("TEST_DB")) == db);
// This set of tests fills our test database with objects // This set of tests fills our test database with objects
SubTest_WritingSuccess(db); SubTest_WritingSuccess(db);
SubTest_WritingDataCheck(db); SubTest_WritingDataCheck(db);
@ -511,33 +511,33 @@ protected static function Test_Writing()
@ "local database."); @ "local database.");
__().memory.Free(db); // For `NewLocal()` call __().memory.Free(db); // For `NewLocal()` call
__().memory.Free(db); // For `LoadLocal()` call __().memory.Free(db); // For `LoadLocal()` call
TEST_ExpectTrue(__core().db.DeleteLocal(P("TEST_DB"))); TEST_ExpectTrue(__level().db.DeleteLocal(P("TEST_DB")));
Issue("Newly created database is reported to still exist after deletion."); Issue("Newly created database is reported to still exist after deletion.");
TEST_ExpectFalse(__core().db.ExistsLocal(P("TEST_DB"))); TEST_ExpectFalse(__level().db.ExistsLocal(P("TEST_DB")));
TEST_ExpectFalse(db.IsAllocated()); TEST_ExpectFalse(db.IsAllocated());
Issue("`DeleteLocal()` does not return `false` after trying to delete" Issue("`DeleteLocal()` does not return `false` after trying to delete"
@ "non-existing local database."); @ "non-existing local database.");
TEST_ExpectFalse(__core().db.DeleteLocal(P("TEST_DB"))); TEST_ExpectFalse(__level().db.DeleteLocal(P("TEST_DB")));
} }
protected static function Test_Recreate() protected static function Test_Recreate()
{ {
local LocalDatabaseInstance db; local LocalDatabaseInstance db;
Issue("Freshly created database is not empty."); Issue("Freshly created database is not empty.");
db = __core().db.NewLocal(P("TEST_DB")); db = __level().db.NewLocal(P("TEST_DB"));
TEST_ExpectTrue(CountRecordsInPackage("TEST_DB") == 1); TEST_ExpectTrue(CountRecordsInPackage("TEST_DB") == 1);
Issue("Cannot create a database after database with the same name was" Issue("Cannot create a database after database with the same name was"
@ "just deleted."); @ "just deleted.");
TEST_ExpectNotNone(db); TEST_ExpectNotNone(db);
TEST_ExpectTrue(__core().db.ExistsLocal(P("TEST_DB"))); TEST_ExpectTrue(__level().db.ExistsLocal(P("TEST_DB")));
SubTest_WritingArrayIndicies(db); SubTest_WritingArrayIndicies(db);
__core().db.DeleteLocal(P("TEST_DB")); __level().db.DeleteLocal(P("TEST_DB"));
Issue("Newly created database is reported to still exist after deletion."); Issue("Newly created database is reported to still exist after deletion.");
__().memory.Free(db); __().memory.Free(db);
TEST_ExpectFalse(__core().db.ExistsLocal(P("TEST_DB"))); TEST_ExpectFalse(__level().db.ExistsLocal(P("TEST_DB")));
TEST_ExpectFalse(db.IsAllocated()); TEST_ExpectFalse(db.IsAllocated());
} }
@ -546,15 +546,15 @@ protected static function Test_TaskChaining()
local LocalDatabaseInstance db; local LocalDatabaseInstance db;
Context("Testing (re-)creating and writing into a new local database."); Context("Testing (re-)creating and writing into a new local database.");
Issue("Freshly created database is not empty."); Issue("Freshly created database is not empty.");
db = __core().db.NewLocal(P("TEST_DB")); db = __level().db.NewLocal(P("TEST_DB"));
TEST_ExpectTrue(CountRecordsInPackage("TEST_DB") == 1); TEST_ExpectTrue(CountRecordsInPackage("TEST_DB") == 1);
Issue("Cannot create a database after database with the same name was" Issue("Cannot create a database after database with the same name was"
@ "just deleted."); @ "just deleted.");
TEST_ExpectNotNone(db); TEST_ExpectNotNone(db);
TEST_ExpectTrue(__core().db.ExistsLocal(P("TEST_DB"))); TEST_ExpectTrue(__level().db.ExistsLocal(P("TEST_DB")));
SubTest_TaskChaining(db); SubTest_TaskChaining(db);
__core().db.DeleteLocal(P("TEST_DB")); __level().db.DeleteLocal(P("TEST_DB"));
} }
protected static function HashTable GetJSONSubTemplateObject() protected static function HashTable GetJSONSubTemplateObject()
@ -792,7 +792,7 @@ protected static function Test_Removal()
local HashTable templateObject; local HashTable templateObject;
templateObject = GetJSONSubTemplateObject(); templateObject = GetJSONSubTemplateObject();
templateArray = GetJSONSubTemplateArray(); templateArray = GetJSONSubTemplateArray();
db = __core().db.NewLocal(P("TEST_DB")); db = __level().db.NewLocal(P("TEST_DB"));
db.WriteData(__().json.Pointer(P("")), templateObject); db.WriteData(__().json.Pointer(P("")), templateObject);
db.WriteData(__().json.Pointer(P("/B")), templateObject); db.WriteData(__().json.Pointer(P("/B")), templateObject);
db.WriteData(__().json.Pointer(P("/B/A")), templateArray); db.WriteData(__().json.Pointer(P("/B/A")), templateArray);
@ -803,7 +803,7 @@ protected static function Test_Removal()
SubTest_RemovalResult(db); SubTest_RemovalResult(db);
SubTest_RemovalCheckValuesAfter(db); SubTest_RemovalCheckValuesAfter(db);
SubTest_RemovalRoot(db); SubTest_RemovalRoot(db);
__core().db.DeleteLocal(P("TEST_DB")); __level().db.DeleteLocal(P("TEST_DB"));
} }
protected static function SubTest_RemovalResult(LocalDatabaseInstance db) protected static function SubTest_RemovalResult(LocalDatabaseInstance db)
@ -877,7 +877,7 @@ protected static function Test_Increment()
local HashTable templateObject; local HashTable templateObject;
templateObject = GetJSONSubTemplateObject(); templateObject = GetJSONSubTemplateObject();
templateArray = GetJSONSubTemplateArray(); templateArray = GetJSONSubTemplateArray();
db = __core().db.NewLocal(P("TEST_DB")); db = __level().db.NewLocal(P("TEST_DB"));
db.WriteData(__().json.Pointer(P("")), templateObject); db.WriteData(__().json.Pointer(P("")), templateObject);
db.WriteData(__().json.Pointer(P("/B")), templateObject); db.WriteData(__().json.Pointer(P("/B")), templateObject);
db.WriteData(__().json.Pointer(P("/C")), __().box.int(-5)); db.WriteData(__().json.Pointer(P("/C")), __().box.int(-5));
@ -920,7 +920,7 @@ protected static function Test_Increment()
Issue("Incrementing database values has created garbage objects."); Issue("Incrementing database values has created garbage objects.");
// 5 initial records + 1 made for a new array in `SubTest_IncrementNull()` // 5 initial records + 1 made for a new array in `SubTest_IncrementNull()`
TEST_ExpectTrue(CountRecordsInPackage("TEST_DB") == 6); TEST_ExpectTrue(CountRecordsInPackage("TEST_DB") == 6);
__core().db.DeleteLocal(P("TEST_DB")); __level().db.DeleteLocal(P("TEST_DB"));
} }
protected static function SubTest_IncrementNull(LocalDatabaseInstance db) protected static function SubTest_IncrementNull(LocalDatabaseInstance db)
@ -1280,7 +1280,7 @@ protected static function Test_RequestID()
local HashTable templateObject; local HashTable templateObject;
templateObject = GetJSONSubTemplateObject(); templateObject = GetJSONSubTemplateObject();
templateArray = GetJSONSubTemplateArray(); templateArray = GetJSONSubTemplateArray();
db = __core().db.NewLocal(P("TEST_DB")); db = __level().db.NewLocal(P("TEST_DB"));
db.WriteData(__().json.Pointer(P("")), templateObject); db.WriteData(__().json.Pointer(P("")), templateObject);
db.WriteData(__().json.Pointer(P("/B")), templateObject); db.WriteData(__().json.Pointer(P("/B")), templateObject);
db.WriteData(__().json.Pointer(P("/C")), __().box.int(-5)); db.WriteData(__().json.Pointer(P("/C")), __().box.int(-5));
@ -1315,7 +1315,7 @@ protected static function Test_RequestID()
SubTest_RequestIDForRemove(db); SubTest_RequestIDForRemove(db);
SubTest_RequestIDForSize(db); SubTest_RequestIDForSize(db);
SubTest_RequestIDForWrite(db); SubTest_RequestIDForWrite(db);
__core().db.DeleteLocal(P("TEST_DB")); __level().db.DeleteLocal(P("TEST_DB"));
} }
protected static function SubTest_RequestIDForCheck(LocalDatabaseInstance db) protected static function SubTest_RequestIDForCheck(LocalDatabaseInstance db)

0
sources/KFRealm/Client/API/Unreal/InteractionAPI/KF1_InteractionAPI.uc → sources/KFImplementation/Client/API/Unreal/InteractionAPI/KF1_InteractionAPI.uc

0
sources/KFRealm/Client/API/Unreal/KF1_ClientUnrealAPI.uc → sources/KFImplementation/Client/API/Unreal/KF1_ClientUnrealAPI.uc

0
sources/KFRealm/Client/AcediaInteraction.uc → sources/KFImplementation/Client/AcediaInteraction.uc

0
sources/KFRealm/Core/ActorStalker.uc → sources/KFImplementation/Core/ActorStalker.uc

0
sources/KFRealm/Core/KF1_SideEffectAPI.uc → sources/KFImplementation/Core/KF1_SideEffectAPI.uc

0
sources/KFRealm/Core/Time/KF1_RealTimer.uc → sources/KFImplementation/Core/Time/KF1_RealTimer.uc

0
sources/KFRealm/Core/Time/KF1_TimeAPI.uc → sources/KFImplementation/Core/Time/KF1_TimeAPI.uc

0
sources/KFRealm/Core/Time/KF1_Timer.uc → sources/KFImplementation/Core/Time/KF1_Timer.uc

0
sources/KFRealm/Server/Unreal/BroadcastsAPI/BroadcastEventsObserver.uc → sources/KFImplementation/Server/Unreal/BroadcastsAPI/BroadcastEventsObserver.uc

0
sources/KFRealm/Server/Unreal/BroadcastsAPI/BroadcastSideEffect.uc → sources/KFImplementation/Server/Unreal/BroadcastsAPI/BroadcastSideEffect.uc

0
sources/KFRealm/Server/Unreal/BroadcastsAPI/KF1_BroadcastAPI.uc → sources/KFImplementation/Server/Unreal/BroadcastsAPI/KF1_BroadcastAPI.uc

0
sources/KFRealm/Server/Unreal/Connections/ConnectionService.uc → sources/KFImplementation/Server/Unreal/Connections/ConnectionService.uc

0
sources/KFRealm/Server/Unreal/Connections/Events/Connection_Signal.uc → sources/KFImplementation/Server/Unreal/Connections/Events/Connection_Signal.uc

0
sources/KFRealm/Server/Unreal/Connections/Events/Connection_Slot.uc → sources/KFImplementation/Server/Unreal/Connections/Events/Connection_Slot.uc

0
sources/KFRealm/Server/Unreal/GameRulesAPI/AcediaGameRules.uc → sources/KFImplementation/Server/Unreal/GameRulesAPI/AcediaGameRules.uc

0
sources/KFRealm/Server/Unreal/GameRulesAPI/GameRulesSideEffect.uc → sources/KFImplementation/Server/Unreal/GameRulesAPI/GameRulesSideEffect.uc

2
sources/KFRealm/Server/Unreal/GameRulesAPI/KF1_GameRulesAPI.uc → sources/KFImplementation/Server/Unreal/GameRulesAPI/KF1_GameRulesAPI.uc

@ -173,7 +173,7 @@ public function GameRules Add(class<GameRules> newRulesClass)
if (AreAdded(newRulesClass)) { if (AreAdded(newRulesClass)) {
return none; return none;
} }
newGameRules = GameRules(__core().GetLevelCore().Allocate(newRulesClass)); newGameRules = GameRules(__level().GetLevelCore().Allocate(newRulesClass));
_server.unreal.GetGameType().AddGameModifier(newGameRules); _server.unreal.GetGameType().AddGameModifier(newGameRules);
return newGameRules; return newGameRules;
} }

0
sources/KFRealm/Server/Unreal/InventoryAPI/InventoryService.uc → sources/KFImplementation/Server/Unreal/InventoryAPI/InventoryService.uc

0
sources/KFRealm/Server/Unreal/InventoryAPI/KF1_InventoryAPI.uc → sources/KFImplementation/Server/Unreal/InventoryAPI/KF1_InventoryAPI.uc

0
sources/KFRealm/Server/Unreal/KF1_ServerUnrealAPI.uc → sources/KFImplementation/Server/Unreal/KF1_ServerUnrealAPI.uc

0
sources/KFRealm/Server/Unreal/MutatorAPI/KF1_MutatorAPI.uc → sources/KFImplementation/Server/Unreal/MutatorAPI/KF1_MutatorAPI.uc

0
sources/KFRealm/Server/Unreal/NativeActorRef.uc → sources/KFImplementation/Server/Unreal/NativeActorRef.uc

0
sources/KFRealm/Server/Unreal/ServerUnrealService.uc → sources/KFImplementation/Server/Unreal/ServerUnrealService.uc

0
sources/KFRealm/Server/Unreal/Tests/MockGameRulesA.uc → sources/KFImplementation/Server/Unreal/Tests/MockGameRulesA.uc

0
sources/KFRealm/Server/Unreal/Tests/MockGameRulesB.uc → sources/KFImplementation/Server/Unreal/Tests/MockGameRulesB.uc

0
sources/KFRealm/Server/Unreal/Tests/MockInventoryA.uc → sources/KFImplementation/Server/Unreal/Tests/MockInventoryA.uc

0
sources/KFRealm/Server/Unreal/Tests/MockInventoryAChild.uc → sources/KFImplementation/Server/Unreal/Tests/MockInventoryAChild.uc

0
sources/KFRealm/Server/Unreal/Tests/MockInventoryB.uc → sources/KFImplementation/Server/Unreal/Tests/MockInventoryB.uc

14
sources/KFRealm/Server/Unreal/Tests/TEST_ServerUnrealAPI.uc → sources/KFImplementation/Server/Unreal/Tests/TEST_ServerUnrealAPI.uc

@ -139,21 +139,21 @@ protected static function Test_InventoryChainFetching()
// where A = `MockInventoryA` // where A = `MockInventoryA`
// a = `MockInventoryAChild` // a = `MockInventoryAChild`
// B = `MockInventoryB` // B = `MockInventoryB`
chainStart = Inventory(__core().GetLevelCore().Allocate(class'MockInventoryAChild')); chainStart = Inventory(__level().GetLevelCore().Allocate(class'MockInventoryAChild'));
chainEnd = chainStart; chainEnd = chainStart;
chainEnd.inventory = Inventory(__core().GetLevelCore().Allocate(class'MockInventoryB')); chainEnd.inventory = Inventory(__level().GetLevelCore().Allocate(class'MockInventoryB'));
chainEnd = chainEnd.inventory; chainEnd = chainEnd.inventory;
chainEnd.inventory = Inventory(__core().GetLevelCore().Allocate(class'MockInventoryA')); chainEnd.inventory = Inventory(__level().GetLevelCore().Allocate(class'MockInventoryA'));
chainEnd = chainEnd.inventory; chainEnd = chainEnd.inventory;
chainEnd.inventory = chainEnd.inventory =
Inventory(__core().GetLevelCore().Allocate(class'MockInventoryAChild')); Inventory(__level().GetLevelCore().Allocate(class'MockInventoryAChild'));
chainEnd = chainEnd.inventory; chainEnd = chainEnd.inventory;
chainEnd.inventory = Inventory(__core().GetLevelCore().Allocate(class'MockInventoryB')); chainEnd.inventory = Inventory(__level().GetLevelCore().Allocate(class'MockInventoryB'));
chainEnd = chainEnd.inventory; chainEnd = chainEnd.inventory;
chainEnd.inventory = chainEnd.inventory =
Inventory(__core().GetLevelCore().Allocate(class'MockInventoryAChild')); Inventory(__level().GetLevelCore().Allocate(class'MockInventoryAChild'));
chainEnd = chainEnd.inventory; chainEnd = chainEnd.inventory;
chainEnd.inventory = Inventory(__core().GetLevelCore().Allocate(class'MockInventoryA')); chainEnd.inventory = Inventory(__level().GetLevelCore().Allocate(class'MockInventoryA'));
chainEnd = chainEnd.inventory; chainEnd = chainEnd.inventory;
Context("Testing auxiliary methods for working with inventory chains."); Context("Testing auxiliary methods for working with inventory chains.");
SubTest_InventoryChainFetchingSingle(chainStart); SubTest_InventoryChainFetchingSingle(chainStart);

0
sources/CoreRealm/API/SideEffects/SideEffect.uc → sources/LevelAPI/API/SideEffects/SideEffect.uc

0
sources/CoreRealm/API/SideEffects/SideEffectAPI.uc → sources/LevelAPI/API/SideEffects/SideEffectAPI.uc

0
sources/CoreRealm/API/Time/Events/Timer_OnElapsed_Signal.uc → sources/LevelAPI/API/Time/Events/Timer_OnElapsed_Signal.uc

0
sources/CoreRealm/API/Time/Events/Timer_OnElapsed_Slot.uc → sources/LevelAPI/API/Time/Events/Timer_OnElapsed_Slot.uc

0
sources/CoreRealm/API/Time/TimeAPI.uc → sources/LevelAPI/API/Time/TimeAPI.uc

0
sources/CoreRealm/API/Time/Timer.uc → sources/LevelAPI/API/Time/Timer.uc

0
sources/CoreRealm/API/UnrealAPI/ActorService.uc → sources/LevelAPI/API/UnrealAPI/ActorService.uc

0
sources/CoreRealm/API/UnrealAPI/Events/Unreal_OnTick_Signal.uc → sources/LevelAPI/API/UnrealAPI/Events/Unreal_OnTick_Signal.uc

0
sources/CoreRealm/API/UnrealAPI/Events/Unreal_OnTick_Slot.uc → sources/LevelAPI/API/UnrealAPI/Events/Unreal_OnTick_Slot.uc

0
sources/CoreRealm/API/UnrealAPI/UnrealAPI.uc → sources/LevelAPI/API/UnrealAPI/UnrealAPI.uc

0
sources/CoreRealm/AcediaAdapter.uc → sources/LevelAPI/AcediaAdapter.uc

0
sources/CoreRealm/CoreGlobal.uc → sources/LevelAPI/CoreGlobal.uc

0
sources/CoreRealm/Features/Commands/BuiltInCommands/ACommandHelp.uc → sources/LevelAPI/Features/Commands/BuiltInCommands/ACommandHelp.uc

0
sources/CoreRealm/Features/Commands/Command.uc → sources/LevelAPI/Features/Commands/Command.uc

0
sources/CoreRealm/Features/Commands/CommandDataBuilder.uc → sources/LevelAPI/Features/Commands/CommandDataBuilder.uc

0
sources/CoreRealm/Features/Commands/CommandParser.uc → sources/LevelAPI/Features/Commands/CommandParser.uc

0
sources/CoreRealm/Features/Commands/Commands.uc → sources/LevelAPI/Features/Commands/Commands.uc

0
sources/CoreRealm/Features/Commands/Commands_Feature.uc → sources/LevelAPI/Features/Commands/Commands_Feature.uc

0
sources/CoreRealm/Features/Commands/PlayersParser.uc → sources/LevelAPI/Features/Commands/PlayersParser.uc

0
sources/CoreRealm/Features/Commands/Tests/MockCommandA.uc → sources/LevelAPI/Features/Commands/Tests/MockCommandA.uc

0
sources/CoreRealm/Features/Commands/Tests/MockCommandB.uc → sources/LevelAPI/Features/Commands/Tests/MockCommandB.uc

0
sources/CoreRealm/Features/Commands/Tests/TEST_Command.uc → sources/LevelAPI/Features/Commands/Tests/TEST_Command.uc

0
sources/CoreRealm/Features/Commands/Tests/TEST_CommandDataBuilder.uc → sources/LevelAPI/Features/Commands/Tests/TEST_CommandDataBuilder.uc

0
sources/CoreRealm/LevelCore.uc → sources/LevelAPI/LevelCore.uc

0
sources/CoreRealm/SideEffects.uc → sources/LevelAPI/SideEffects.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/BroadcastAPI.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/BroadcastAPI.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnBroadcastCheck_Signal.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnBroadcastCheck_Signal.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnBroadcastCheck_Slot.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnBroadcastCheck_Slot.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalizedFor_Signal.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalizedFor_Signal.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalizedFor_Slot.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalizedFor_Slot.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalized_Signal.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalized_Signal.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalized_Slot.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleLocalized_Slot.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleTextFor_Signal.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleTextFor_Signal.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleTextFor_Slot.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleTextFor_Slot.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleText_Signal.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleText_Signal.uc

0
sources/ServerRealm/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleText_Slot.uc → sources/ServerAPI/API/Unreal/BroadcastsAPI/Events/Broadcast_OnHandleText_Slot.uc

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save