Inhaltsverzeichnis

Einleitung

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…

SubFromPlayersResources( _id, _gold, _clay, _wood, _stone, _iron, _sulfur )

…wird diese Überprüfung automatisch durchgeführt. Wenn nicht genug Waren da sind, werden passende Warnungen des Mentors ausgegeben, und außerdem eine Message mit der fehlenden Menge der jeweiligen Ressource. Die Funktion gibt als ersten Wert true oder false zurück, je nachdem ob die Transaktion durchgeführt werden konnte. Im Falle von false werden außerdem (in folgender Reihenfolge) die fehlenden Mengen an Talern, Lehm, Holz, Stein, Eisen und Schwefel zurückgegeben.

Beispiel

-- Spieler 1 soll 200 Taler bezahlen:
local paid,goldmissing = SubFromPlayersResources( 1, 200, 0, 0, 0, 0, 0 );
-- nicht benötigte Rückgabewerte müssen nicht gespeichert werden
if paid then --Wenn true zurückgegeben wurde -> Es war genug Geld vorhanden...
    CreateSoeldner(); --Beispiel für eine Folgefunktion
else
    Message(goldmissing); --Die fehlenden Taler werden als Message ausgegeben; nicht wirklich nötig, hier nur zur Demonstration
end
 
-- Der Spieler soll 100 Taler, 200 Lehm, 300 Holz, 400 Steine, 500 Eisen und 600 Schwefel bezahlen:
local paid,goldmissing,claymissing,woodmissing,stonemissing,ironmissing,sulfurmissing = SubFromPlayersResources( 1, 100, 200, 300, 400, 500, 600 );
if paid then
    StelleHaendlerZufrieden();
else
    Sound.PlayQueuedFeedbackSound(Sounds.AOVoicesScout_Scout_NO_rnd_01,0);
end
 
-- Der Spieler soll 1000 Holz und 379 Steine bezahlen:
local paid,_,_,woodmissing,stonemissing = SubFromPlayersResources( 1, 0, 0, 1000, 379, 0, 0 );
-- Die Rückgabewerte für fehlende Taler und fehlenden Lehm werden hier nicht gebraucht, müssen aber gespeichert werden. Daher der Unterstrich als Platzhalter
if paid then
    BaueSchutzwall();
else
    if woodmissing > 0 then
        Message("Ohne Holz nix los!");
    end
    if stonemissing > 0 then
        Message("Rocky Horror - Steine fehlen!");
    end
end

Code

Das hier muss einfach nur im Skript stehen:

function SubFromPlayersResources( _id, _gold, _clay, _wood, _stone, _iron, _sulfur )
    local goldmissing,claymissing,woodmissing,stonemissing,ironmissing,sulfurmissing = 0,0,0,0,0,0;
    if _gold > 0 then
        local gold = GetGold(_id);
        if (gold-_gold) < 0 then
            goldmissing = (math.floor(_gold)-math.floor(gold));
            Message(goldmissing.." Taler fehlen im Säckel!")
            Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughGold_rnd_01,0);
        end
    end
    if _clay > 0 then
        local clay = GetClay(_id);
        if (clay-_clay) < 0 then
            claymissing = (math.floor(_clay)-math.floor(clay));
            Message(claymissing.." Lehm fehlt!")
            Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughClay_rnd_01,0);
        end
    end
    if _wood > 0 then
        local wood = GetWood(_id);
        if (wood-_wood) < 0 then
            woodmissing = (math.floor(_wood)-math.floor(wood));
            Message(woodmissing.." Holz muss noch geschlagen werden!")
            Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughWood_rnd_01,0);
        end
    end
    if _stone > 0 then
        local stone = GetStone(_id);
        if (stone-_stone) < 0 then
            stonemissing = (math.floor(_stone)-math.floor(stone));
            Message(stonemissing.." Stein muss noch beschafft werden!")
            Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughStone_rnd_01,0);
        end
    end
    if _iron > 0 then
        local iron = GetIron(_id);
        if (iron-_iron) < 0 then
            ironmissing = (math.floor(_iron)-math.floor(iron));
            Message(ironmissing.." Eisen fehlt!")
            Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughIron_rnd_01,0);
        end
    end
    if _sulfur > 0 then
        local sulfur = GetSulfur(_id);
        if (sulfur-_sulfur) < 0 then
            sulfurmissing = (math.floor(_sulfur)-math.floor(sulfur));
            Message(sulfurmissing.." Schwefel wird noch benötigt!")
            Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughSulfur_rnd_01,0);
        end
    end
    if not (goldmissing == 0) or not (claymissing == 0) or not (woodmissing == 0) or not (stonemissing == 0) or not (ironmissing == 0) or not (sulfurmissing == 0) then
        return false,goldmissing,claymissing,woodmissing,stonemissing,ironmissing,sulfurmissing;
    else
        AddGold(_id,-(_gold));
        AddClay(_id,-(_clay));
        AddWood(_id,-(_wood));
        AddStone(_id,-(_stone));
        AddIron(_id,-(_iron));
        AddSulfur(_id,-(_sulfur));
        return true;
    end
end