ScreenStackSubClasses
Tracking Issue: #290
Tags: compatibility
A number of functions in UIScreenStack operate on classes, but fail
to consider subclasses. This causes subtle bugs in base game and mod
code that fails to consider the possibility that a given class can
be subclassed/overridden. For example, UIArmory does something like this:
// Don't allow jumping to the geoscape from the armory when coming from squad select
if (!`ScreenStack.IsInStack(class'UISquadSelect'))
{
    NavHelp.AddGeoscapeButton();
}
However, if UISquadSelect is being overridden or replaced, this can cause the
campaign to permanently deadlock because UIArmory fails to find the changed
squad select screen. The proper fix would be using HasInstanceOf, but this error
is extremely common in base game and mod code. As a result, it was decided that
the best fix is to change all functions in UIScreenStack to always consider
subclasses. A full list of affected functions:
GetScreenIsCurrentClassIsInStackIsNotInStack
Compatibility
If you legitimately want to not consider subclasses, you can use the functions
function UIScreen GetScreen_CH(class<UIScreen> ScreenClass, bool IncludeSubTypes);
function bool IsCurrentClass_CH(class<UIScreen> ScreenClass, bool IncludeSubTypes);
and rewrite IsInStack/IsNotInStack in terms of GetScreen_CH(...) !=/== none.