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

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum