Ich habe mittlerweile diese Alternative erfunden, die kürzer und unproblematischer ist und obendrein noch etwas mehr leistet (kombinierte Bezahlungen unterschiedlicher Rohstoffe können leichter realisiert werden).

Beschreibung

Wenn man dem Spieler per Skript Ressourcen abziehen will, muss man meistens erstmal einen umständlichen Check einbauen, ob denn genug Rohstoffe da sind. Mit…

ActivateAddResourcesExpansion()

…im Skript wird dieser Check beim Verwenden von AddGold, AddWood, AddClay, AddStone, AddIron oder AddSulfur automatisch durchgeführt. Wenn nicht genug Waren da sind, wird eine passende Warnung des Mentors ausgegeben, und außerdem eine Message mit der fehlenden Menge. Die 6 Funktionen geben nun außerdem 2 Werte zurück, zum Einen true oder false, je nach dem ob die Transaktion durchgeführt werden konnte, und zum Anderen die Menge der fehlenden Rohstoffe (bei true natürlich 0).

--Beispiel:
local hasDone,missing = AddGold(-500);
if not hasDone then
    Message(missing);
end

Code

function ActivateAddResourcesExpansion()
    AddGold_OrigExp = AddGold;
    AddClay_OrigExp = AddClay;
    AddWood_OrigExp = AddWood;
    AddStone_OrigExp = AddStone;
    AddIron_OrigExp = AddIron;
    AddSulfur_OrigExp = AddSulfur;
    AddGold = function(id,res)
        if res then assert((type(id)=="number") and (id>=1) and (id<=8));
        else res = id; id = nil; end
        assert(type(res)=="number");
        if (not id or id == 1) then
            id = 1;
            local gold = GetGold(id);
            if (gold+res) < 0 then
                local goldmissing = -(gold+res);
                Message( goldmissing.." Taler fehlen im Säckel!" )
                Sound.PlayQueuedFeedbackSound( Sounds.VoicesMentor_INFO_NotEnoughGold_rnd_01, 0 );
                return false,goldmissing;
            else
                AddGold_OrigExp(id,res);
                return true,0;
            end
        else
            AddGold_OrigExp(id,res);
        end
    end
    AddClay = function(id,res)
        if res then assert((type(id)=="number") and (id>=1) and (id<=8));
        else res = id; id = nil; end
        assert(type(res)=="number");
        if (not id or id == 1) then
            id = 1;
            local clay = GetClay(id);
            if (clay+res) < 0 then
                local claymissing = -(clay+res);
                Message( claymissing.." Lehm fehlt!" )
                Sound.PlayQueuedFeedbackSound( Sounds.VoicesMentor_INFO_NotEnoughClay_rnd_01, 0 );
                return false,claymissing;
            else
                AddClay_OrigExp(id,res);
                return true,0;
            end
        else
            AddClay_OrigExp(id,res);
        end
    end
    AddWood = function(id,res)
        if res then assert((type(id)=="number") and (id>=1) and (id<=8));
        else res = id; id = nil; end
        assert(type(res)=="number");
        if (not id or id == 1) then
            id = 1;
            local wood = GetWood(id);
            if (wood+res) < 0 then
                local woodmissing = -(wood+res);
                Message( woodmissing.." Holz muss noch geschlagen werden!" )
                Sound.PlayQueuedFeedbackSound( Sounds.VoicesMentor_INFO_NotEnoughWood_rnd_01, 0 );
                return false,woodmissing;
            else
                AddWood_OrigExp(id,res);
                return true,0;
            end
        else
            AddWood_OrigExp(id,res);
        end
    end
    AddStone = function(id,res)
        if res then assert((type(id)=="number") and (id>=1) and (id<=8));
        else res = id; id = nil; end
        assert(type(res)=="number");
        if (not id or id == 1) then
            id = 1;
            local stone = GetStone(id);
            if (stone+res) < 0 then
                local stonemissing = -(stone+res);
                Message( stonemissing.." Stein muss noch beschafft werden!" )
                Sound.PlayQueuedFeedbackSound( Sounds.VoicesMentor_INFO_NotEnoughStone_rnd_01, 0 );
                return false,stonemissing;
            else
                AddStone_OrigExp(id,res);
                return true,0;
            end
        else
            AddStone_OrigExp(id,res);
        end
    end
    AddIron = function(id,res)
        if res then assert((type(id)=="number") and (id>=1) and (id<=8));
        else res = id; id = nil; end
        assert(type(res)=="number");
        if (not id or id == 1) then
            id = 1;
            local iron = GetIron(id);
            if (iron+res) < 0 then
                local ironmissing = -(iron+res);
                Message( ironmissing.." Eisen fehlt!" )
                Sound.PlayQueuedFeedbackSound( Sounds.VoicesMentor_INFO_NotEnoughIron_rnd_01, 0 );
                return false,ironmissing;
            else
                AddIron_OrigExp(id,res);
                return true,0;
            end
        else
            AddIron_OrigExp(id,res);
        end
    end
    AddSulfur = function(id,res)
        if res then assert((type(id)=="number") and (id>=1) and (id<=8));
        else res = id; id = nil; end
        assert(type(res)=="number");
        if (not id or id == 1) then
            id = 1;
            local sulfur = GetSulfur(id);
            if (sulfur+res) < 0 then
                local sulfurmissing = -(sulfur+res);
                Message( sulfurmissing.." Schwefel wird noch benötigt!" )
                Sound.PlayQueuedFeedbackSound( Sounds.VoicesMentor_INFO_NotEnoughSulfur_rnd_01, 0 );
                return false,sulfurmissing;
            else
                AddSulfur_OrigExp(id,res);
                return true,0;
            end
        else
            AddSulfur_OrigExp(id,res);
        end
    end
end