raze/wadsrc/static/zscript/engine/service.zs
Christoph Oelckers 6df1a14a92 gave translations a dedicated scripted type.
This is needed for implementing reliable serialization of custom translations. As long as they are merely ints they cannot be restored on loading a savegame because the serialization code does not know that these variables are special.
2023-12-05 22:40:56 +01:00

155 lines
4.2 KiB
Text

/**
* This is Service interface.
*/
class Service abstract
{
deprecated("4.6.1", "Use GetString() instead") virtual play String Get(String request)
{
return "";
}
deprecated("4.6.1", "Use GetStringUI() instead") virtual ui String UiGet(String request)
{
return "";
}
// Play variants
virtual play String GetString(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return "";
}
virtual play int GetInt(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return 0;
}
virtual play double GetDouble(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return 0.0;
}
virtual play Object GetObject(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return null;
}
virtual play Name GetName(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return '';
}
// UI variants
virtual ui String GetStringUI(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return "";
}
virtual ui int GetIntUI(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return 0;
}
virtual ui double GetDoubleUI(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return 0.0;
}
virtual ui Object GetObjectUI(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return null;
}
virtual ui Name GetNameUI(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return '';
}
// data/clearscope variants
virtual clearscope String GetStringData(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return "";
}
virtual clearscope int GetIntData(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return 0;
}
virtual clearscope double GetDoubleData(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return 0.0;
}
virtual clearscope Object GetObjectData(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return null;
}
virtual clearscope Name GetNameData(String request, string stringArg = "", int intArg = 0, double doubleArg = 0, Object objectArg = null, Name nameArg = '')
{
return '';
}
static Service Find(class<Service> serviceName){
return AllServices.GetIfExists(serviceName.GetClassName());
}
}
/**
* Use this class to find and iterate over services.
*
* Example usage:
*
* @code
* ServiceIterator i = ServiceIterator.Find("MyService");
*
* Service s;
* while (s = i.Next())
* {
* String request = ...
* String answer = s.Get(request);
* ...
* }
* @endcode
*
* If no services are found, the all calls to Next() will return NULL.
*/
class ServiceIterator
{
/**
* Creates a Service iterator for a service name. It will iterate over all existing Services
* with names that match @a serviceName or have it as a part of their names.
*
* Matching is case-independent.
*
* @param serviceName class name of service to find.
*/
static ServiceIterator Find(String serviceName)
{
let result = new("ServiceIterator");
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 services found.
*/
Service Next()
{
while(it.Next())
{
String cName = it.GetKey();
if(cName.MakeLower().IndexOf(mServiceName) != -1)
return it.GetValue();
}
return null;
}
private MapIterator<Name, Service> it;
private String mServiceName;
}