Technologie erforschen(GUI-Frage)

» Siedler Map Source Forum » Siedler DEdK Script Forum » Technologie erforschen(GUI-Frage)

Seiten: 1

andre111
#1
26.03.2010 18:28
Beiträge: 220

Technologie erforschen(GUI-Frage)

Hallo,

ich habe eine Funktion geschrieben, mit der man eine Technologie(in der Hochschule) erforschen kann, um Tore(wenn man sie selektiert hat) zu öffnen und zu schliesen.

Meine frage hierzu:

bisher ist mit einem klick auf den button die Technologie sofort erforscht.
Wie kann ich bei einem klick auf einen selbst erstellten Button eine normale Forschungsleiste(Dauer) erstellen?

Hier der Script:

function TorErweiterung()
	aktivAufZu()
	StartSimpleHiResJob("AufZuAktivJob")
	toraz = ""
end

function aktivAufZu()

	XGUIEng.TransferMaterials("Research_Banking","DestroyBuildingButton")
	XGUIEng.SetWidgetPosition("DestroyBuilding",200,120)  
	
	XGUIEng.TransferMaterials("Research_Banking","Research_Gilds")
	XGUIEng.SetWidgetPosition("Research_Gilds",185,76) 
	
	GUIAction_ToDestroyBuildingWindowOrig = GUIAction_ToDestroyBuildingWindow
	GUIAction_ToDestroyBuildingWindow = function()
		local sel = GUI.GetSelectedEntity()
		if IsEntityOfType( sel, "XD_WallStraightGate" ) then
			ReplaceEntity( sel, Entities.XD_WallStraightGate_Closed )
		elseif IsEntityOfType( sel, "XD_WallStraightGate_Closed" ) then
			ReplaceEntity( sel, Entities.XD_WallStraightGate )
		elseif IsEntityOfType( sel, "XD_DarkWallStraightGate" ) then
			ReplaceEntity( sel, Entities.XD_DarkWallStraightGate_Closed )
		elseif IsEntityOfType( sel, "XD_DarkWallStraightGate_Closed" ) then
			ReplaceEntity( sel, Entities.XD_DarkWallStraightGate )
		end
	end
	
	GUIAction_ReserachTechnologyOrig = GUIAction_ReserachTechnology
	GUIAction_ReserachTechnology = function(_a)
		if _a == Technologies.GT_Gilds then
			if toraz == "erforscht" then
			else
				local sel = GUI.GetSelectedEntity()
				if Logic.GetBuildingWorkPlaceUsage( sel ) == 0 then
					Message("In diesem Geb\195\164ude arbeitet niemand!")
				else
					if GetWood(1) >= 200 and GetStone(1) >= 200 then
						AddWood(-200)
						AddStone(-200)
						toraz = "erforscht"
						Sound.PlayGUISound( Sounds.VoicesMentor_RESEARCH_ResearchReady_rnd_01, 200 )
						Message("Tore: \195\182ffnen und schliesen wurde erforscht!")
						GUITooltip_ResearchTechnologies = function(_a,_b)
							if _b == "MenuUniversity/Gilds" then
								XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:170,170,170 Tore @cr @color:255,200,0 erm\195\182glicht: @color:255,255,255 Tore \195\182ffnen und schliesen. @cr Bereits erforscht!" );
								XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Holz: "..GibTTHolz( 200, 1 ).." @cr Stein: "..GibTTStein( 200, 1 ).."" );
							else
								GUITooltip_ResearchTechnologiesOrig(_a,_b)
							end
						end
						GUITooltip_NormalButton = function(_a)
							if _a == "MenuBuildingGeneric/destroybuilding" then
								XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:170,170,170 Tor @cr @color:255,255,255 \195\150ffnet oder schliest das Tor" );
								XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "" );
							else
								GUITooltip_NormalButtonOrig(_a)
							end
						end
					else
						if GetWood(1) < 200 then
							local fehl = 200 - GetWood(1)
							Message("Euch fehlt "..fehl.." Holz!")
							Sound.PlayGUISound( Sounds.VoicesMentor_INFO_NotEnoughWood_rnd_01, 200 )
							if GetStone(1) < 200 then
								local fehl = 200 - GetStone(1)
								Message("Euch fehlt "..fehl.." Stein!")
							end
						elseif GetStone(1) < 200 then
							local fehl = 200 - GetStone(1)
							Message("Nicht genug Holz oder Stein!")
							Sound.PlayGUISound( Sounds.VoicesMentor_INFO_NotEnoughStone_rnd_01, 200 )
						end
					end
				end
			end
		else
			GUIAction_ReserachTechnologyOrig(_a)
		end
	end
	
	GUITooltip_NormalButtonOrig = GUITooltip_NormalButton
	GUITooltip_NormalButton = function(_a)
		if _a == "MenuBuildingGeneric/destroybuilding" then
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:170,170,170 Tor @cr @color:255,255,255 \195\150ffnet oder schliest das Tor @cr Ben\195\182tigt die Hochschultechnologie: Tore" );
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "" );
		else
			GUITooltip_NormalButtonOrig(_a)
		end
	end
	
	GUITooltip_ResearchTechnologiesOrig = GUITooltip_ResearchTechnologies
	GUITooltip_ResearchTechnologies = function(_a,_b)
		if _b == "MenuUniversity/Gilds" then
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:170,170,170 Tore @cr @color:255,200,0 erm\195\182glicht: @color:255,255,255 Tore \195\182ffnen und schliesen." );
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Holz: "..GibTTHolz( 200, 1 ).." @cr Stein: "..GibTTStein( 200, 1 ).."" );
		else
			GUITooltip_ResearchTechnologiesOrig(_a,_b)
		end
	end

end

function AufZuAktivJob()

	local sel = GUI.GetSelectedEntity()
	if IsEntityOfType( sel, "XD_WallStraightGate" ) or IsEntityOfType( sel, "XD_WallStraightGate_Closed" ) or IsEntityOfType( sel, "XD_DarkWallStraightGate" ) or IsEntityOfType( sel, "XD_DarkWallStraightGate_Closed" ) then
		XGUIEng.ShowWidget( "DestroyBuildingButton",1 ); --
		if toraz == "erforscht" then
			XGUIEng.DisableButton(XGUIEng.GetWidgetID("DestroyBuildingButton"), 0)
		else
			XGUIEng.DisableButton(XGUIEng.GetWidgetID("DestroyBuildingButton"), 1)
		end
	else
		XGUIEng.ShowWidget( "DestroyBuildingButton",0 ); --
	end
	if IsEntityOfType( sel, "PB_University1" ) or IsEntityOfType( sel, "PB_University2" ) then
		XGUIEng.ShowWidget( "Research_Gilds",1 ); --
		if toraz == "erforscht" then
			XGUIEng.HighLightButton(XGUIEng.GetWidgetID("Research_Gilds"), 1)
		else
			XGUIEng.HighLightButton(XGUIEng.GetWidgetID("Research_Gilds"), 0)
		end
	else
		XGUIEng.ShowWidget( "Research_Gilds",0 ); --
	end

end

function IsEntityOfType( _entity, _type )
	if type( _entity ) == "nil" then
		return false;
	elseif type( _entity ) == "string" then
		_entity = GetEntityId( _entity );
	end
	assert( type( _entity ) == "number" );
    assert( type( _type ) == "string" );
	if Logic.GetEntityTypeName( Logic.GetEntityType( _entity ) ) == _type then
		return true;
	end
	return false;
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


Zum Aufrufen einfach: TorErweiterung() schreiben

Noigi
#2
27.03.2010 02:32
Beiträge: 772

Ein manuelles Basteln von so einer Forschungs-Leiste kann ich nicht empfehlen, schon gar nicht wenn das "normale" Erforschen parallel auch funktionieren soll.

Du kannst deine verwendete Technologie (GT_Gilds) aber einfach regulär erforschen lassen, und die Tor-Mechanik dann erst nach Abschluss der Forschung aktivieren.

GameCallback_OnTechnologyResearched_Orig = GameCallback_OnTechnologyResearched;
GameCallback_OnTechnologyResearched = function(pID,techID,eID)
    GameCallback_OnTechnologyResearched_OrigWP(pID,techID,eID);
    if pID == 1 then
        if techID == Technologies.GT_Gilds then
        ...



Auf diese Weise werden natürlich die Originalkosten für GT_Gilds beim Klick mit abgebucht. Das kann man aber durch eine geschickte Abfragereihenfolge aushebeln.

andre111
#3
27.03.2010 08:04
Beiträge: 220

@Noigi: wie meinst du das mit normal erforschen lassen?

edit: wie viel kostet GT_Gilds denn normal?

edit2:

habs so versucht, kommt aber nur ne Leiste die sich nicht füllt:

GUIAction_ReserachTechnologyOrig = GUIAction_ReserachTechnology
	GUIAction_ReserachTechnology = function(_a)
		if _a == Technologies.GT_Gilds then
			if toraz == "erforscht" then
			else
				local sel = GUI.GetSelectedEntity()
				if Logic.GetBuildingWorkPlaceUsage( sel ) == 0 then
					Message("In diesem Geb\195\164ude arbeitet niemand!")
				else
					if GetWood(1) >= 200 and GetStone(1) >= 200 then
						AddWood(-200)
						AddStone(-200)
						GUIAction_ReserachTechnologyOrig(_a)
					else
						if GetWood(1) < 200 then
							local fehl = 200 - GetWood(1)
							Message("Euch fehlt "..fehl.." Holz!")
							Sound.PlayGUISound( Sounds.VoicesMentor_INFO_NotEnoughWood_rnd_01, 200 )
							if GetStone(1) < 200 then
								local fehl = 200 - GetStone(1)
								Message("Euch fehlt "..fehl.." Stein!")
							end
						elseif GetStone(1) < 200 then
							local fehl = 200 - GetStone(1)
							Message("Nicht genug Holz oder Stein!")
							Sound.PlayGUISound( Sounds.VoicesMentor_INFO_NotEnoughStone_rnd_01, 200 )
						end
					end
				end
			end
		else
			GUIAction_ReserachTechnologyOrig(_a)
		end
	end

Dieser Beitrag wurde von andre111 am 27.03.2010 um 08:29 editiert.

Noigi
#4
27.03.2010 14:48
Beiträge: 772

Mit normal erforschen meine ich genau das, was du gemacht hast, also in der gehackten GUIAction_ReserachTechnology nur die Ressourcen überprüfen und dann die Originalfuktion aufrufen.

Wenn das mit GT_Gilds nicht richtig klappt nimm GT_Taxation, damit hab ich sowas schonmal getestet. Taxation kostet meine ich 100 Taler.

Seiten: 1

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

Impressum