From 9bd75bcac5c9128f06e9274e6f5bc09ea5149c48 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 22 Mar 2017 19:56:21 +0100 Subject: [PATCH] - some conceptual work on statusbar stuff. This looks like a viable approach to build something that can replace SBARINFO. --- src/g_statusbar/shared_sbar.cpp | 62 +++++++++++++++++++++++++++++++++ src/namedef.h | 6 ++++ src/scripting/vm/vm.h | 1 + wadsrc/static/zscript.txt | 1 + 4 files changed, 70 insertions(+) diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index a88b0aac3..8865192ab 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -1429,3 +1429,65 @@ DBaseStatusBar *CreateStrifeStatusBar() } return sb; } + + +static DObject *InitObject(PClass *type, int paramnum, VM_ARGS) +{ + auto obj = type->CreateNew(); + // Todo: init + return obj; +} + +DEFINE_ACTION_FUNCTION(DStatusbarWidget, AppendWidget) +{ + PARAM_SELF_PROLOGUE(DObject); + PARAM_CLASS(type, DObject); + if (!type->IsDescendantOf(NAME_StatusbarWidget) || type->IsDescendantOf(NAME_StatusbarCondition)) + { + ThrowAbortException(X_OTHER, "Invalid class %s for AppendWidget", type->TypeName.GetChars()); + } + auto obj = InitObject(type, paramnum, VM_ARGS_NAMES); + auto owner = self->PointerVar(NAME_Owner); + self->PointerVar(NAME_Next) = obj; + obj->PointerVar(NAME_Prev) = self; + obj->PointerVar(NAME_Owner) = owner; + ACTION_RETURN_POINTER(obj); +} + +DEFINE_ACTION_FUNCTION(DStatusbarWidget, BeginCondition) +{ + PARAM_SELF_PROLOGUE(DObject); + PARAM_CLASS(type, DObject); + if (!type->IsDescendantOf(NAME_StatusbarCondition)) + { + ThrowAbortException(X_OTHER, "Invalid class %s for BeginCondition", type->TypeName.GetChars()); + } + auto obj = InitObject(type, paramnum, VM_ARGS_NAMES); + auto head = PClass::FindClass(NAME_StatusbarWidget)->CreateNew(); + + head->PointerVar(NAME_Owner) = self; + self->PointerVar(NAME_Children) = head; + ACTION_RETURN_POINTER(head); +} + +DEFINE_ACTION_FUNCTION(DStatusbarWidget, EndCondition) +{ + PARAM_SELF_PROLOGUE(DObject); + auto owner = self->PointerVar(NAME_Owner); + if (owner == nullptr || !owner->IsKindOf(NAME_StatusbarCondition)) + { + ThrowAbortException(X_OTHER, "No matching BeginCondition found for EndCondition"); + } + ACTION_RETURN_POINTER(owner); +} + +DEFINE_ACTION_FUNCTION(DStatusbarWidget, Finish) +{ + PARAM_SELF_PROLOGUE(DObject); + auto owner = self->PointerVar(NAME_Owner); + if (owner == nullptr || owner->PointerVar(NAME_Owner) != owner || owner->GetClass()->TypeName != NAME_StatusbarWidget) + { + ThrowAbortException(X_OTHER, "No matching Begin found for Finish"); + } + ACTION_RETURN_POINTER(owner); +} diff --git a/src/namedef.h b/src/namedef.h index 9d1fb49b3..4d9a06e36 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -648,6 +648,12 @@ xx(Staticconst) xx(DeathmatchStatusScreen) xx(CoopStatusScreen) xx(RavenStatusScreen) +xx(StatusbarWidget) +xx(StatusbarCondition) +xx(Next) +xx(Prev) +xx(Children) +xx(Owner) // USDF keywords xx(Amount) diff --git a/src/scripting/vm/vm.h b/src/scripting/vm/vm.h index f567b2899..42558da09 100644 --- a/src/scripting/vm/vm.h +++ b/src/scripting/vm/vm.h @@ -914,6 +914,7 @@ void NullParam(const char *varname); #define PARAM_POINTERTYPE(x,type) ++paramnum; PARAM_POINTERTYPE_AT(paramnum,x,type) #define PARAM_OBJECT(x,type) ++paramnum; PARAM_OBJECT_AT(paramnum,x,type) #define PARAM_CLASS(x,base) ++paramnum; PARAM_CLASS_AT(paramnum,x,base) +#define PARAM_CLASS(x,base) ++paramnum; PARAM_CLASS_AT(paramnum,x,base) #define PARAM_POINTER_NOT_NULL(x,type) ++paramnum; PARAM_POINTER_NOT_NULL_AT(paramnum,x,type) #define PARAM_OBJECT_NOT_NULL(x,type) ++paramnum; PARAM_OBJECT_NOT_NULL_AT(paramnum,x,type) #define PARAM_CLASS_NOT_NULL(x,base) ++paramnum; PARAM_CLASS_NOT_NULL_AT(paramnum,x,base) diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index 82987b55f..b0eeba68e 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -35,6 +35,7 @@ version "2.5" #include "zscript/statusbar/statusbar.txt" #include "zscript/statusbar/strife_sbar.txt" #include "zscript/statusbar/sbarinfowrapper.txt" +#include "zscript/statusbar/statusbarwidget.txt" #include "zscript/inventory/inventory.txt" #include "zscript/inventory/inv_misc.txt"