Einleitung

Manchmal ist es für die Story einer Karte wichtig, dass der Spieler eine bestimmte Schlüsselfigur nicht entlässt. Oder er soll aus irgendeinem Grunde eins seiner Gebäude nicht einreissen können. Oder aber man will den Spieler einfach ärgern… ;-)

Diese Skripterweiterung bietet dafür die technischen Möglichkeiten. Sobald die Funktion…

SetupProtectedEntities()

…einmal irgendwo aufgerufen wurde (z.B. in der FMA), kann man mit…

ProtectEntity( _skriptname )

…die Selbstzerstörungsknöpfe der jeweiligen Entität verschwinden lassen.

Code

function SetupProtectedEntities()
    gvProtectedUnits = {};
    gvProtectedBuildings = {};
    GameCallback_GUI_SelectionChanged_OrigProtected = GameCallback_GUI_SelectionChanged;
    GameCallback_GUI_SelectionChanged = function()
        GameCallback_GUI_SelectionChanged_OrigProtected()
        for i = 1,table.getn(gvProtectedUnits) do
            if GUI.GetSelectedEntity() == GetEntityId( gvProtectedUnits[i] ) then
                XGUIEng.ShowWidget( gvGUI_WidgetID.ExpelSettler, 0 );
                return;
            else
                XGUIEng.ShowWidget( gvGUI_WidgetID.ExpelSettler, 1 );
            end
        end
        for i = 1,table.getn(gvProtectedBuildings) do
            if GUI.GetSelectedEntity() == GetEntityId( gvProtectedBuildings[i] ) then
                XGUIEng.ShowWidget( gvGUI_WidgetID.DestroyBuilding, 0 );
                return;
            else
                XGUIEng.ShowWidget( gvGUI_WidgetID.DestroyBuilding, 1 );
            end
        end
    end
    ProtectEntity = function( _entity )
        assert( type( _entity ) == "string" , "ProtectedEntities ERROR: Name of entity must be a string!" );
        if Logic.IsBuilding( GetEntityId( _entity ) ) == 1 then
            table.insert( gvProtectedBuildings, _entity );
        else
            table.insert( gvProtectedUnits, _entity );
        end
    end
end