diff --git a/src/Common/Game/IW4/IW4_Assets.h b/src/Common/Game/IW4/IW4_Assets.h index 6bed2307..360462e4 100644 --- a/src/Common/Game/IW4/IW4_Assets.h +++ b/src/Common/Game/IW4/IW4_Assets.h @@ -1413,6 +1413,18 @@ namespace IW4 WINDOW_FLAG_TEXT_ONLY_FOCUS = 0x80000000, }; + enum WindowDefDynamicFlag : unsigned int + { + WINDOW_FLAG_HOVERED = 0x1, // guessed + WINDOW_FLAG_FOCUSED = 0x2, + WINDOW_FLAG_VISIBLE = 0x4, + WINDOW_FLAG_FADING_OUT = 0x10, + WINDOW_FLAG_FADING_IN = 0x20, + WINDOW_FLAG_80 = 0x80, + WINDOW_FLAG_SCRIPT_BACKCOLOR = 0x8000, + WINDOW_FLAG_SCRIPT_FORECOLOR = 0x10000 + }; + struct windowDef_t { const char* name; diff --git a/src/ObjLoading/Game/IW4/Menu/MenuConverterIW4.cpp b/src/ObjLoading/Game/IW4/Menu/MenuConverterIW4.cpp index bef4f19a..0cc72c24 100644 --- a/src/ObjLoading/Game/IW4/Menu/MenuConverterIW4.cpp +++ b/src/ObjLoading/Game/IW4/Menu/MenuConverterIW4.cpp @@ -388,7 +388,6 @@ namespace IW4 statement->supportingData = nullptr; // Supporting data is set upon using it std::vector expressionEntries; - ConvertExpressionEntry(statement, expressionEntries, expression, menu, item); auto* outputExpressionEntries = static_cast(m_memory->Alloc(sizeof(expressionEntry) * expressionEntries.size())); @@ -482,6 +481,23 @@ namespace IW4 return ConvertExpression(expression, menu, item); } + _NODISCARD Statement_s* ConvertVisibleExpression(itemDef_s* item, const ISimpleExpression* expression, const CommonMenuDef* commonMenu, const CommonItemDef* commonItem = nullptr) const + { + if (expression == nullptr) + return nullptr; + + if(expression->IsStatic()) + { + const auto staticValue = expression->Evaluate(); + if(staticValue.IsTruthy()) + item->window.dynamicFlags[0] |= WINDOW_FLAG_VISIBLE; + return nullptr; + } + + item->window.dynamicFlags[0] |= WINDOW_FLAG_VISIBLE; + return ConvertExpression(expression, commonMenu, commonItem); + } + _NODISCARD static EventType SetLocalVarTypeToEventType(const SetLocalVarType setLocalVarType) { switch (setLocalVarType) @@ -889,7 +905,7 @@ namespace IW4 item->type = ConvertItemType(commonItem.m_type); item->window.border = commonItem.m_border; item->window.borderSize = static_cast(commonItem.m_border_size); - item->visibleExp = ConvertExpression(commonItem.m_visible_expression.get(), &parentMenu, &commonItem); + item->visibleExp = ConvertVisibleExpression(item, commonItem.m_visible_expression.get(), &parentMenu, &commonItem); item->disabledExp = ConvertExpression(commonItem.m_disabled_expression.get(), &parentMenu, &commonItem); item->window.ownerDraw = commonItem.m_owner_draw; item->window.ownerDrawFlags = commonItem.m_owner_draw_flags; diff --git a/src/ObjWriting/Game/IW4/Menu/MenuDumperIW4.cpp b/src/ObjWriting/Game/IW4/Menu/MenuDumperIW4.cpp index 3f2c5e98..4c88454d 100644 --- a/src/ObjWriting/Game/IW4/Menu/MenuDumperIW4.cpp +++ b/src/ObjWriting/Game/IW4/Menu/MenuDumperIW4.cpp @@ -682,7 +682,12 @@ void MenuDumper::WriteItemData(const itemDef_s* item) WriteIntProperty("type", item->type, ITEM_TYPE_TEXT); WriteIntProperty("border", item->window.border, 0); WriteFloatProperty("borderSize", item->window.borderSize, 0.0f); - WriteStatementProperty("visible", item->visibleExp, true); + + if (item->visibleExp) + WriteStatementProperty("visible", item->visibleExp, true); + else if (item->window.dynamicFlags[0] & WINDOW_FLAG_VISIBLE) + WriteIntProperty("visible", 1, 0); + WriteStatementProperty("disabled", item->disabledExp, true); WriteIntProperty("ownerdraw", item->window.ownerDraw, 0); WriteFlagsProperty("ownerdrawFlag", item->window.ownerDrawFlags);