Völkerwahl
» Siedler Map Source Forum » Siedler DEdK Script Forum » Völkerwahl
Seiten: 1
andre111
|
#1 29.03.2010 19:07 Beiträge: 220 |
Völkerwahl
Hier der Script zur Völkerwahl:
Aufruf mit: VolkWahl()
function VolkWahl() ShowBoard("V\195\182lkerwahl","W\195\164hlt euer Volk: @cr Mit den Zahlentasten: @cr 1)Normal @cr 2)Nebelvolk @cr 3)Banditen @cr 4)Schwarzes Volk") GroupSelection_SelectTroopsOld = GroupSelection_SelectTroops GroupSelection_SelectTroops = function( _count ) if _count == 1 then GroupSelection_SelectTroops = GroupSelection_SelectTroopsOld HideBoard() volk = 1 Message("Ihr spielt nun mit: Normales Volk!") AktivVolk() AktivVolk2() elseif _count == 2 then GroupSelection_SelectTroops = GroupSelection_SelectTroopsOld HideBoard() volk = 2 Message("Ihr spielt nun mit: Nebelvolk!") AktivVolk() AktivVolk2() elseif _count == 3 then GroupSelection_SelectTroops = GroupSelection_SelectTroopsOld HideBoard() volk = 3 Message("Ihr spielt nun mit: Banditen!") AktivVolk() AktivVolk2() elseif _count == 4 then GroupSelection_SelectTroops = GroupSelection_SelectTroopsOld HideBoard() volk = 4 Message("Ihr spielt nun mit: Schwarzes Volk!") AktivVolk() AktivVolk2() end end end function AktivVolk() XGUIEng.ShowWidget( "Build_Stables",0 ); -- if volk == 4 then XGUIEng.ShowWidget( "Build_Archery",0 ); -- XGUIEng.ShowWidget( "Buy_LeaderBow",0 ); -- end GUIUpdate_BuildingButtons_Orig = GUIUpdate_BuildingButtons GUIUpdate_BuildingButtons = function(_a,_b) if _a == "Build_Stables" then else if volk == 4 then if _a == "Build_Archery" then else GUIUpdate_BuildingButtons_Orig(_a,_b) end end GUIUpdate_BuildingButtons_Orig(_a,_b) end end XGUIEng.ShowWidget( "Buy_LeaderSpear",0 ); -- XGUIEng.ShowWidget( "Buy_LeaderRifle",0 ); -- GUIUpdate_BuyMilitaryUnitButtons_Orig = GUIUpdate_BuyMilitaryUnitButtons GUIUpdate_BuyMilitaryUnitButtons = function(_a,_b,_c) if _a == "Buy_LeaderSpear" or _a == "Buy_LeaderRifle" then else if volk == 4 then if _a == "Buy_LeaderBow" then else GUIUpdate_BuyMilitaryUnitButtons_Orig(_a,_b,_c) end end GUIUpdate_BuyMilitaryUnitButtons_Orig(_a,_b,_c) end end XGUIEng.ShowWidget( "Research_UpgradeSword1",0 ); -- XGUIEng.ShowWidget( "Research_UpgradeSword2",0 ); -- XGUIEng.ShowWidget( "Research_UpgradeSword3",0 ); -- XGUIEng.ShowWidget( "Research_UpgradeSpear1",0 ); -- XGUIEng.ShowWidget( "Research_UpgradeSpear2",0 ); -- XGUIEng.ShowWidget( "Research_UpgradeSpear3",0 ); -- XGUIEng.ShowWidget( "Research_UpgradeBow1",0 ); -- XGUIEng.ShowWidget( "Research_UpgradeBow2",0 ); -- XGUIEng.ShowWidget( "Research_UpgradeBow3",0 ); -- XGUIEng.ShowWidget( "Research_UpgradeRifle1",0 ); -- GUIUpdate_SettlersUpgradeButtons_Orig = GUIUpdate_SettlersUpgradeButtons GUIUpdate_SettlersUpgradeButtons = function(_a,_b) end end function AktivVolk2() GUIAction_BuyMilitaryUnit_Orig = GUIAction_BuyMilitaryUnit GUIAction_BuyMilitaryUnit = function(_a) if _a == UpgradeCategories.LeaderSword then if volk == 1 then GUIAction_BuyMilitaryUnit_Orig(UpgradeCategories.LeaderSword) elseif volk == 2 then if GetGold(1) >= 200 then AddGold(-50) GUIAction_BuyMilitaryUnit_Orig(UpgradeCategories.Evil_LeaderBearman) else Message("Nicht gen\195\188gend Taler!") end elseif volk == 3 then if GetGold(1) >= 150 then if GetIron(1) < 60 then Message("Nicht gen\195\188gend Eisen!") else AddGold(-150) AddIron(-60) GUIAction_BuyMilitaryUnit_Orig(UpgradeCategories.LeaderBandit) end else Message("Nicht gen\195\188gend Taler!") if GetIron(1) < 60 then Message("Nicht gen\195\188gend Eisen!") end end elseif volk == 4 then if GetGold(1) >= 200 then AddGold(-50) GUIAction_BuyMilitaryUnit_Orig(UpgradeCategories.BlackKnightLeaderMace1) else Message("Nicht gen\195\188gend Taler!") end end elseif _a == UpgradeCategories.LeaderBow then if volk == 1 then GUIAction_BuyMilitaryUnit_Orig(UpgradeCategories.LeaderBow) elseif volk == 2 then if GetGold(1) >= 200 then AddGold(-50) GUIAction_BuyMilitaryUnit_Orig(UpgradeCategories.Evil_LeaderSkirmisher) else Message("Nicht gen\195\188gend Taler!") end elseif volk == 3 then GUIAction_BuyMilitaryUnit_Orig(UpgradeCategories.LeaderBanditBow) end else end end GUITooltip_BuyMilitaryUnit_Orig = GUITooltip_BuyMilitaryUnit GUITooltip_BuyMilitaryUnit = function(_a,_b,_c,_d,_e) if _a == UpgradeCategories.LeaderSword then GUITooltip_BuyMilitaryUnit_Orig(_a,_b,_c,_d,_e) XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:170,170,170 Nahk\195\164mpfer: @cr @color:255,255,255 Bildet einen Nahk\195\164mpfer eures Volkes aus." ); if volk == 2 then XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: "..GibTTGold( 200, 1 ).." @cr Eisen: "..GibTTEisen(30,1).." @cr Pl\195\164tze: 1" ); elseif volk == 3 then XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: "..GibTTGold( 150, 1 ).." @cr Eisen: "..GibTTEisen(60,1).." @cr Pl\195\164tze: 1" ); elseif volk == 4 then XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: "..GibTTGold( 200, 1 ).." @cr Eisen: "..GibTTEisen(30,1).." @cr Pl\195\164tze: 1" ); end elseif _a == UpgradeCategories.LeaderBow then GUITooltip_BuyMilitaryUnit_Orig(_a,_b,_c,_d,_e) XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:170,170,170 Fernk\195\164mpfer: @cr @color:255,255,255 Bildet einen Fernk\195\164mpfer eures Volkes aus." ); if volk == 2 then XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: "..GibTTGold( 200, 1 ).." @cr Holz: "..GibTTHolz(60,1).." @cr Pl\195\164tze: 1" ); end end end end function GibTTGold( _amount, _id ) if not type(_id) == "number" then _id = 1; end local da = GetGold(_id); if da < _amount then return "@color:255,0,0 ".._amount.." @color:255,255,255" end return tostring(_amount); end function GibTTLehm( _amount, _id ) if not type(_id) == "number" then _id = 1; end local da = GetClay(_id); if da < _amount then return "@color:255,0,0 ".._amount.." @color:255,255,255" end return tostring(_amount); end function GibTTHolz( _amount, _id ) if not type(_id) == "number" then _id = 1; end local da = GetWood(_id); if da < _amount then return "@color:255,0,0 ".._amount.." @color:255,255,255" end return tostring(_amount); end function GibTTStein( _amount, _id ) if not type(_id) == "number" then _id = 1; end local da = GetStone(_id); if da < _amount then return "@color:255,0,0 ".._amount.." @color:255,255,255" end return tostring(_amount); end function GibTTEisen( _amount, _id ) if not type(_id) == "number" then _id = 1; end local da = GetIron(_id); if da < _amount then return "@color:255,0,0 ".._amount.." @color:255,255,255" end return tostring(_amount); end function GibTTSchwefel( _amount, _id ) if not type(_id) == "number" then _id = 1; end local da = GetSulfur(_id); if da < _amount then return "@color:255,0,0 ".._amount.." @color:255,255,255" end return tostring(_amount); end function ShowBoard(_title,_text) XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 1 ); XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "CreditsWindowLogo" ), 0 ); XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarTop" ), 0 ); XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarBottom" ), 0 ); XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieInvisibleClickCatcher" ), 0 ); XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowTextTitle" ), "".._title.."" ); XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowText" ), "".._text..""); end function HideBoard() XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 0 ); end
FG
andre111
Noigi
|
#2 29.03.2010 20:50 Beiträge: 772 |
Sieht ja schon richtig professionell aus.
Wenn du das ändern der Tooltip-Kosten und das Abbuchen der veränderten Kosten noch etwas eleganter lösen willst, könnten die Komforts hier hilfreich sein:
Zitat von Noigi:
Noch ein Hinweis zu Rohstoffkosten im Tooltip:
Wie ich unlängst herausgefunden habe hat das Spiel eine interne Comfort-Fkt, die automatische Kosten-strings für Tooltips ausspuckt! Und zwar korrekt mit roter Farbe, wenn die Rohstoffe nicht reichen. Ich habe noch eine eigene Funktion drumrum geschrieben, damit die Bedienung einfacher wird:
function CreateCostString(_t); local t = {0,0,0,0,0,0,0,0,0,0,0,0,0} for k,v in pairs(_t) do assert(ResourceType[k]); t[ResourceType[k]] = v; end return InterfaceTool_CreateCostString(t); end -- Aufruf zB: local kostenString1 = CreateCostString{Gold=200, Iron=50, Wood=100};
function PayResources( _tCosts, _noMessage, _onlyCheck ) -- Lässt den Spieler die angegebenen Rohstoffe bezahlen -- _noMessage optional, wenn keine "zu Wenig"-Message ausgegeben werden soll -- _onlyCheck optional, wenn nur überprüft, aber nicht abgebucht werden soll local tMissing = {}; local enough = true; for resType,costs in pairs(_tCosts) do assert(ResourceType[resType]); if costs > 0 then -- Message(resType..": "..costs) local goodStock = 0; if resType == "Gold" then goodStock = GetGold(1); elseif resType == "Clay" then goodStock = GetClay(1); elseif resType == "Wood" then goodStock = GetWood(1); elseif resType == "Stone" then goodStock = GetStone(1); elseif resType == "Iron" then goodStock = GetIron(1); elseif resType == "Sulfur" then goodStock = GetSulfur(1); end -- Message("goodStock: "..goodStock) if (goodStock - costs) < 0 then enough = false; tMissing[resType] = (costs - goodStock); if not _noMessage then PayResources_FeedbackNotEnoughRes(resType, tMissing[resType]); end end end end if not enough then return false,tMissing; end if not _onlyCheck then if _tCosts.Gold then AddGold(-_tCosts.Gold); end if _tCosts.Clay then AddClay(-_tCosts.Clay); end if _tCosts.Wood then AddWood(-_tCosts.Wood); end if _tCosts.Stone then AddStone(-_tCosts.Stone); end if _tCosts.Iron then AddIron(-_tCosts.Iron); end if _tCosts.Sulfur then AddSulfur(-_tCosts.Sulfur); end end return true; end function PayResources_FeedbackNotEnoughRes(_resType, _nMissing) if _resType == "Gold" then Message(_nMissing.." Taler fehlen im Säckel!"); Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughGold_rnd_01); elseif _resType == "Clay" then Message(_nMissing.." Lehm fehlt!"); Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughClay_rnd_01); elseif _resType == "Wood" then Message(_nMissing.." Holz muss noch geschlagen werden!"); Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughWood_rnd_01); elseif _resType == "Stone" then Message(_nMissing.." Stein muss noch beschafft werden!"); Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughStone_rnd_01); elseif _resType == "Iron" then Message(_nMissing.." Eisen fehlt!"); Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughIron_rnd_01); elseif _resType == "Sulfur" then Message(_nMissing.." Schwefel wird noch benötigt!"); Sound.PlayQueuedFeedbackSound(Sounds.VoicesMentor_INFO_NotEnoughSulfur_rnd_01); end end -- Aufruf zB: PayResources({Gold=200, Iron=50, Wood=100});
andre111
|
#3 29.03.2010 21:05 Beiträge: 220 |
@noigi:
Hab gleich noch ne Frage an dich, und zwar:
Kann man abfragen wieviel ein Ausbau des Selektierten Gebäudes kostet, wenn ja, wie?
FG
andre111
Noigi
|
#4 29.03.2010 21:58 Beiträge: 772 |
Es geht fast alles
Das hier zB würde dem Spieler die Ausbaukosten des sel. Gebäudes hinzufügen. Man kann in der Schleife natürlich machen, was man will.
local sel = GUI.GetSelectedEntity(); local selType = Logic.GetEntityType(sel); local kosten = {}; Logic.FillBuildingUpgradeCostsTable(selType, kosten) for resTyp,menge in pairs(kosten) do Logic.AddToPlayersGlobalResource(1, resTyp, menge); end
andre111
|
#5 30.03.2010 08:02 Beiträge: 220 |
@Noigi:
Und wie kann ich damit abfragen ob der Spieler genügend resourcen für den Ausbau besitzt?
edit: Habs jetzt geschaft!
Aber was ist: ResourceType.Silver ?
edit2:
Wieder zwei Fragen:
1)Wie finde ich heraus wieviel ein Hauptman zukaufen kostet?
Hab das hier gefunden: Logic.FillLeaderCostsTable aber wie benutze ich das?
2)Wie finde ich heraus wieviel eine Technologie zukaufen kostet?
Hab das hier gefunden: Logic.FillTechnologyCostsTable aber wie benutze ich das?
edit3: 2) habe ich gelöst
FG
andre111
Dieser Beitrag wurde von andre111 am 30.03.2010 um 08:59 editiert.
andre111
|
#6 30.03.2010 11:37 Beiträge: 220 |
--gelöscht wegen doppelpost
Dieser Beitrag wurde von andre111 am 30.03.2010 um 13:23 editiert.
Noigi
|
#7 30.03.2010 18:27 Beiträge: 772 |
1) und 2) müssten genau wie in dem Beispiel mit dem Gebäudeausbau funktionieren. Silver wird nicht verwendet (genau wie Knowledge), die sind wahrscheinlich verworfen worden.
Abfragen kannst du Ressourcen zB mit der Pay-Funktion und den beiden letzten Parametern:
genug = PayResources({Gold=200, Iron=50, Wood=100}, true, true); if genug then -- genug end
Was die bedeuten steht unten dran.
Alternativ: Die Schleife am Ende vom Gebäudeausbau-Beipiel wird für jeden "resTyp" in dem ermittelten Kosten-table durchlaufen, und der zugehörige Kosten-Betrag steht dann jeweilis in "menge". Daraus könntest du die Kosten ermitteln und per if-Konstrukt abfragen
if resTyp == ResourceType.Gold then if GetGold(1) >= menge then -- genug ...
andre111
|
#8 30.03.2010 19:03 Beiträge: 220 |
@noigi:
das hab ich!
Aber was muss ich Logic.FillLeaderCostsTable übergeben.
Bei UpgradeCategory.--- stürtzt das Spiel ohne Fehlermeldung ab
FG
andre111
andre111
|
#9 30.03.2010 19:03 Beiträge: 220 |
@noigi:
das hab ich!
Aber was muss ich Logic.FillLeaderCostsTable übergeben.
Bei UpgradeCategory.--- stürtzt das Spiel ohne Fehlermeldung ab
FG
andre111
Noigi
|
#10 30.03.2010 19:53 Beiträge: 772 |
Achja, das Dingen braucht als ersten Parameter noch die Spieler-ID, weil die Kosten ja vom Technologiestand abhängen.
andre111
|
#11 31.03.2010 08:25 Beiträge: 220 |
@noigi:
Und wie funktioniert dass bei: FillSoldierCostsTable ?
Weil bei einem klick auf den Soldat kaufen Button keine parameter übergeben werden, weis ich nicht wie ich das machen soll.
FG
andre111
Dieser Beitrag wurde von andre111 am 31.03.2010 um 09:20 editiert.
Noigi
|
#12 31.03.2010 19:01 Beiträge: 772 |
Da musst du den Soldatentyp wahrscheinlich manuell aus dem Leadertyp (selektierte Entity) ermitteln. Wenn es da keine Funktion zu gibt kannst dir zB einen Zuordnungstable schreiben.
Seiten: 1