From 590475a8e35e4ca38c7e4a73ddccdd611bda6af7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 18 Feb 2023 23:28:54 -0300 Subject: [PATCH] Improve Services --- src/common/scripting/interface/vmnatives.cpp | 7 +++ src/gamedata/info.cpp | 27 +++++++++++ wadsrc/static/zscript/engine/base.zs | 1 + wadsrc/static/zscript/engine/service.zs | 49 ++++++-------------- 4 files changed, 48 insertions(+), 36 deletions(-) diff --git a/src/common/scripting/interface/vmnatives.cpp b/src/common/scripting/interface/vmnatives.cpp index cae27a4da7d..d3c3a83f320 100644 --- a/src/common/scripting/interface/vmnatives.cpp +++ b/src/common/scripting/interface/vmnatives.cpp @@ -53,6 +53,8 @@ #include "s_soundinternal.h" #include "i_time.h" +#include "maps.h" + //========================================================================== // // status bar exports @@ -1159,7 +1161,12 @@ DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, baseorder); DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, loop); DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, handle); +extern ZSMap AllServices; + DEFINE_GLOBAL_NAMED(PClass::AllClasses, AllClasses) + +DEFINE_GLOBAL(AllServices) + DEFINE_GLOBAL(Bindings) DEFINE_GLOBAL(AutomapBindings) DEFINE_GLOBAL(generic_ui) diff --git a/src/gamedata/info.cpp b/src/gamedata/info.cpp index 22ad8d42b74..ed516a1cfca 100644 --- a/src/gamedata/info.cpp +++ b/src/gamedata/info.cpp @@ -54,6 +54,7 @@ #include "g_levellocals.h" #include "texturemanager.h" #include "d_main.h" +#include "maps.h" extern void LoadActors (); extern void InitBotStuff(); @@ -64,6 +65,7 @@ FRandom FState::pr_statetics("StateTics"); cycle_t ActionCycles; +void InitServices(); //========================================================================== // @@ -368,6 +370,18 @@ static void LoadAltHudStuff() // //========================================================================== +ZSMap AllServices; + +static void MarkServices(){ + + ZSMap::Iterator it(AllServices); + ZSMap::Pair *pair; + while (it.NextPair(pair)) + { + GC::Mark(pair->Value); + } +} + void PClassActor::StaticInit() { sprites.Clear(); @@ -402,6 +416,19 @@ void PClassActor::StaticInit() } } + PClass * cls = PClass::FindClass("Service"); + for(PClass * clss : PClass::AllClasses) + { + if(clss != cls && cls->IsAncestorOf(clss)) + { + DObject * obj = clss->CreateNew(); + obj->ObjectFlags |= OF_Transient; + AllServices.Insert(clss->TypeName, obj); + } + } + + GC::AddMarkerFunc(&MarkServices); + LoadAltHudStuff(); InitBotStuff(); diff --git a/wadsrc/static/zscript/engine/base.zs b/wadsrc/static/zscript/engine/base.zs index 61376f228ec..7d02a9adfd8 100644 --- a/wadsrc/static/zscript/engine/base.zs +++ b/wadsrc/static/zscript/engine/base.zs @@ -181,6 +181,7 @@ struct Vector3 struct _ native // These are the global variables, the struct is only here to avoid extending the parser for this. { native readonly Array AllClasses; + native internal readonly Map AllServices; native readonly bool multiplayer; native @KeyBindings Bindings; native @KeyBindings AutomapBindings; diff --git a/wadsrc/static/zscript/engine/service.zs b/wadsrc/static/zscript/engine/service.zs index 5f834a809cf..50981ad80b0 100644 --- a/wadsrc/static/zscript/engine/service.zs +++ b/wadsrc/static/zscript/engine/service.zs @@ -54,6 +54,10 @@ class Service abstract { return null; } + + static Service Find(class serviceName){ + return AllServices.GetIfExists(serviceName.GetClassName()); + } } /** @@ -88,54 +92,27 @@ class ServiceIterator static ServiceIterator Find(String serviceName) { let result = new("ServiceIterator"); - - result.mServiceName = serviceName; - result.mClassIndex = 0; - result.FindNextService(); - + result.mServiceName = serviceName.MakeLower(); + result.it.Init(AllServices); return result; } /** * Gets the service and advances the iterator. * - * @returns service instance, or NULL if no more servers found. - * - * @note Each ServiceIterator will return new instances of services. + * @returns service instance, or NULL if no more services found. */ Service Next() { - uint classesNumber = AllClasses.Size(); - Service result = (mClassIndex == classesNumber) - ? NULL - : Service(new(AllClasses[mClassIndex])); - - ++mClassIndex; - FindNextService(); - - return result; - } - - private void FindNextService() - { - uint classesNumber = AllClasses.size(); - while (mClassIndex < classesNumber && !ServiceNameContains(AllClasses[mClassIndex], mServiceName)) + while(it.Next()) { - ++mClassIndex; + String cName = it.GetKey(); + if(cName.MakeLower().IndexOf(mServiceName) != -1); + return it.GetValue(); } + return null; } - private static bool ServiceNameContains(class aClass, String substring) - { - if (!(aClass is "Service")) return false; - - String className = aClass.GetClassName(); - String lowerClassName = className.MakeLower(); - String lowerSubstring = substring.MakeLower(); - bool result = lowerClassName.IndexOf(lowerSubstring) != -1; - return result; - } - + private MapIterator it; private String mServiceName; - private uint mClassIndex; }