Nachschlagewerk für den Spieler

» Siedler Map Source Forum » Siedler DEdK Script Forum » Nachschlagewerk für den Spieler

Seiten: 1

Noigi
#1
11.09.2011 19:11
Beiträge: 772

Nachschlagewerk für den Spieler

Neue Version 1.1!

Anstatt Einträge ins Questmenü zu machen, damit Spieler sich dauerhaft über Besonderheiten der Map informieren können, kann man dafür ein eigenes Fenster benutzen: Das Lektionen-Fenster.

Ich habe hier wieder das BuyHero-Fenster zweckentfremdet , da es perfekte Voraussetzungen bietet und im SP sonst nicht (unbedingt) gebraucht wird.

Von Story bis Steuerung kann alles rein, was während der Map für den Spieler interessant oder nützlich sein könnte. Die Anzahl der Lektionen ist nicht begrenzt.





Code (Anwendungsbeispiele stehen oben in der Doku):

-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- ### NOIGI COMFORT: Lektionen ###
-- ### Version: 1.10   (19.09.2011)
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--[[ DOKU
	Nachschlagewerk für den Spieler
	benötigte andere Comforts:
		- 
		
	PARAMETER (NeueLektion):
		- table mit Titel der Lektion, dem Textinhalt und dem Icon
		
		BEISPIEL:
			NeueLektion{
				title = "LEKTIONEN ",
				text = "Dies ist das Lektionen-Fenster! @cr Lektionen dienen als Einführung und Nachschlagewerk zu wichtigen Besonderheiten der Karte. @cr @cr Eine Übersicht über alle Euch zur Verfügung stehenden Lektionen findet Ihr links. @cr Mit den Pfeil-Buttons könnt Ihr scrollen, also den Anzeigebereich verschieben, und mit einem Klick auf eines der Icons könnt Ihr Euch die jeweilige Lektion anzeigen lassen. @cr @cr Öffnen und Schliessen könnt Ihr das Lektionen-Menü per Klick auf den gleichnamigen Reiter am oberen Bildschirmrand. @cr Das Statistik-Menü, für das dieser Reiter bisher zuständig war, lässt sich nach wie vor über die Taste [f5] aufrufen.",
				icon = "Research_Debenture",
			};
		
		LEKTION LÖSCHEN:
			ErsteLektion = NeueLektion{
				...
			}
			...
			RemoveLektion(ErsteLektion);
		
		LEKTION ÄNDERN:
			ZweiteLektion = NeueLektion{
				...
			}
			...
			Lektion_SetTitle(ZweiteLektion, "neuer Titel"); -- Titel ändern
			Lektion_SetText(ZweiteLektion, "neuer Text"); -- Text ändern
			Lektion_SetIcon(ZweiteLektion, "Hero6_Bless"); -- Icon ändern
--]]
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function Lektionen_Init()
	XGUIEng.SetText("TopStatisticsMenuTextButton", "@center Lektionen");

	gvLektionen = {
		counter = 0, -- aktuelle Anzahl Lektionen
		pointer_top = 0, -- welche Lektion ist z.Zt. oben in der Liste?
		pointer_open = -1, -- welche Lektion wird z.Zt. angezeigt? (-1: nichts)
		incPointer = function( _pointer, _offset )
			local limit = math.max( 6, gvLektionen.counter);
			return math.mod( limit + _pointer + _offset, limit );
		end,
		id_counter = 0,

		buttonAction = {
			[XGUIEng.GetWidgetID("BuyHeroWindowBuyHero1")] = function()
				-- Message("Scroll nach unten (pointer_top--)");
				gvLektionen.pointer_top = gvLektionen.incPointer( gvLektionen.pointer_top, -1 );
			end,
			[XGUIEng.GetWidgetID("BuyHeroWindowBuyHero8")] = function()
				-- Message("Scroll nach oben (pointer_top++)");
				gvLektionen.pointer_top = gvLektionen.incPointer( gvLektionen.pointer_top, 1 );
			end,
			
			[XGUIEng.GetWidgetID("BuyHeroWindowBuyHero2")] = function()
				gvLektionen.pointer_open = gvLektionen.incPointer( gvLektionen.pointer_top, 0 );
			end,
			[XGUIEng.GetWidgetID("BuyHeroWindowBuyHero3")] = function()
				gvLektionen.pointer_open = gvLektionen.incPointer( gvLektionen.pointer_top, 1 );
			end,
			[XGUIEng.GetWidgetID("BuyHeroWindowBuyHero4")] = function()
				gvLektionen.pointer_open = gvLektionen.incPointer( gvLektionen.pointer_top, 2 );
			end,
			[XGUIEng.GetWidgetID("BuyHeroWindowBuyHero5")] = function()
				gvLektionen.pointer_open = gvLektionen.incPointer( gvLektionen.pointer_top, 3 );
			end,
			[XGUIEng.GetWidgetID("BuyHeroWindowBuyHero6")] = function()
				gvLektionen.pointer_open = gvLektionen.incPointer( gvLektionen.pointer_top, 4 );
			end,
			[XGUIEng.GetWidgetID("BuyHeroWindowBuyHero7")] = function()
				gvLektionen.pointer_open = gvLektionen.incPointer( gvLektionen.pointer_top, 5 );
			end,
			
			[XGUIEng.GetWidgetID("BuyHeroWindowBuyHero9")] = function()
			end,
		},
	};
	
	AddEmptyLektion = function(_pos)
		local t = {
			title = "",
			text = "",
			id = 0,
			icon = "TutorialResourceHighlighter",
		};
		gvLektionen[_pos] = t;
	end
	
	AddEmptyLektion(0);
	AddEmptyLektion(1);
	AddEmptyLektion(2);
	AddEmptyLektion(3);
	AddEmptyLektion(4);
	AddEmptyLektion(5);
	
	BuyHeroWindow_UpdateInfoLine_OrigLektionen = BuyHeroWindow_UpdateInfoLine;
	BuyHeroWindow_UpdateInfoLine = function() end;
	BuyHeroWindow_Update_BuyHero_OrigLektionen = BuyHeroWindow_Update_BuyHero;
	BuyHeroWindow_Update_BuyHero = function() end;
	BuyHeroWindow_Action_BuyHero_OrigLektionen = BuyHeroWindow_Action_BuyHero;
	BuyHeroWindow_Action_BuyHero = function( _heroType )
		local wID = XGUIEng.GetCurrentWidgetID();
		assert( gvLektionen.buttonAction[wID], "invalid ButtonID: "..wID );
		gvLektionen.buttonAction[wID]();
		Lektionen_UpdateDisplay();
	end

	GUIAction_ToggleMenu_OrigLektionen = GUIAction_ToggleMenu;
	GUIAction_ToggleMenu = function(_widget, _flag)
		if ((_widget == gvGUI_WidgetID.StatisticsWindow) or (_widget == "StatisticsWindow")) and (_flag == 1) then
			Lektionen_OpenWindow();
		else
			GUIAction_ToggleMenu_OrigLektionen(_widget, _flag);
		end
	end
	
	Mission_OnSaveGameLoaded_OrigLektionen = Mission_OnSaveGameLoaded;
	Mission_OnSaveGameLoaded = function()
		Mission_OnSaveGameLoaded_OrigLektionen()
		XGUIEng.SetText("TopStatisticsMenuTextButton", "@center Lektionen");
	end
	
	Lektionen_OpenWindow = function()
		GUIAction_ToggleMenu( "BuyHeroWindow", -1 );
		Lektionen_UpdateDisplay();
	end
	
	Lektionen_UpdateDisplay = function()
		if XGUIEng.IsWidgetShown("BuyHeroWindow") == 1 then
			XGUIEng.SetText( "BuyHeroWindowHeadline", COLOR1.."LEKTIONEN" );

			-- ### Scroll rauf
			XGUIEng.SetWidgetPositionAndSize( "BuyHeroWindowBuyHero1", 4, 4, 32, 32 );
			XGUIEng.TransferMaterials("OptionsMenu20_Keys_Up", "BuyHeroWindowBuyHero1" )
			
			-- ### Lektions-Buttons
			XGUIEng.SetWidgetPositionAndSize( "BuyHeroWindowBuyHero2", 0, 40, 32, 32 );
			XGUIEng.TransferMaterials( gvLektionen[ gvLektionen.incPointer( gvLektionen.pointer_top, 0 ) ].icon, "BuyHeroWindowBuyHero2" )
			XGUIEng.SetWidgetPositionAndSize( "BuyHeroWindowBuyHero3", 0, 76, 32, 32 );
			XGUIEng.TransferMaterials( gvLektionen[ gvLektionen.incPointer( gvLektionen.pointer_top, 1 ) ].icon, "BuyHeroWindowBuyHero3" )
			XGUIEng.SetWidgetPositionAndSize( "BuyHeroWindowBuyHero4", 0, 112, 32, 32 );
			XGUIEng.TransferMaterials( gvLektionen[ gvLektionen.incPointer( gvLektionen.pointer_top, 2 ) ].icon, "BuyHeroWindowBuyHero4" )
			XGUIEng.SetWidgetPositionAndSize( "BuyHeroWindowBuyHero5", 0, 148, 32, 32 );
			XGUIEng.TransferMaterials( gvLektionen[ gvLektionen.incPointer( gvLektionen.pointer_top, 3 ) ].icon, "BuyHeroWindowBuyHero5" )
			XGUIEng.SetWidgetPositionAndSize( "BuyHeroWindowBuyHero6", 0, 184, 32, 32 );
			XGUIEng.TransferMaterials( gvLektionen[ gvLektionen.incPointer( gvLektionen.pointer_top, 4 ) ].icon, "BuyHeroWindowBuyHero6" )
			XGUIEng.SetWidgetPositionAndSize( "BuyHeroWindowBuyHero7", 0, 220, 32, 32 );
			XGUIEng.TransferMaterials( gvLektionen[ gvLektionen.incPointer( gvLektionen.pointer_top, 5 ) ].icon, "BuyHeroWindowBuyHero7" )
			
			-- ### Scroll runter
			XGUIEng.SetWidgetPositionAndSize( "BuyHeroWindowBuyHero8", 2, 258, 32, 32 );
			XGUIEng.TransferMaterials("OptionsMenu20_Keys_Down", "BuyHeroWindowBuyHero8" )
			
			-- ### angezeigte Lektion
			XGUIEng.SetWidgetPositionAndSize( "BuyHeroWindowBuyHero9", 56, 0, 32, 32 );
			local t = gvLektionen[ gvLektionen.pointer_open ];
			if t then
				XGUIEng.ShowWidget( "BuyHeroWindowBuyHero9", 1 );
				XGUIEng.TransferMaterials( t.icon, "BuyHeroWindowBuyHero9" )
				XGUIEng.SetText( "BuyHeroWindowInfoLine", t.title.." @cr @cr @cr @cr "..t.text );
			else
				XGUIEng.ShowWidget( "BuyHeroWindowBuyHero9", 0 );
				XGUIEng.SetText( "BuyHeroWindowInfoLine", "" );
			end
			XGUIEng.SetWidgetPosition( "BuyHeroWindowInfoLine", 120, 40);
			
			-- ### Buttons verfügbar machen, Restbuttons ausblenden
			for i = 1,9 do
				XGUIEng.DisableButton("BuyHeroWindowBuyHero"..i,0);
			end
			for i = 10,12 do
				XGUIEng.ShowWidget("BuyHeroWindowBuyHero"..i,0);
			end
		end
	end
end

function NeueLektion( _t )
	assert( type(_t) == "table" );
	assert( type(_t.title) == "string", "NeueLektion: \"title\" fehlt!" );
	assert( type(_t.text) == "string", "NeueLektion: \"text\" fehlt!" );
	assert( (type(_t.icon) == "string") or (type(_t.icon) == "number" ), "NeueLektion: \"icon\" fehlt!" );
	
	if not gvLektionen then
		Lektionen_Init();
	end
	
	local id = gvLektionen.id_counter +1;
	_t.id = id;
	gvLektionen[ gvLektionen.counter ] = _t;
	gvLektionen.counter = gvLektionen.counter +1;
	gvLektionen.id_counter = id;
	
	Lektionen_UpdateDisplay();
	return id;
end

function RemoveLektion( _id )
	assert(_id > 0);
	for i = 0,table.getn(gvLektionen) do
		local t = gvLektionen[i];
		if t.id == _id then
			table.remove(gvLektionen,i);
			local count = gvLektionen.counter -1;
			for l=count,5 do
				AddEmptyLektion(l);
			end
			gvLektionen.counter = count;
			
			Lektionen_UpdateDisplay();
			return t;
		end
	end
	return false;
end

function GetLektion( _id )
	assert( (type(_id) == "number") and (_id > 0), "GetLektion: Lektions-ID \""..tostring(_id).."\" ist ungueltig!" );
	for i = 0,table.getn(gvLektionen) do
		local t = gvLektionen[i];
		if t.id == _id then
			return t;
		end
	end
	return false;
end

function Lektion_SetTitle( _id, _title )
	assert( type(_title) == "string", "Lektion_SetTitle: \""..tostring(_title).."\" ist kein gueltiger Titel!" );
	local t = GetLektion(_id);
	assert( t, "Lektion_SetTitle: Lektions-ID \""..tostring(_id).."\" ist ungueltig!" );
	t.title = _title;
	Lektionen_UpdateDisplay();
end

function Lektion_SetText( _id, _text )
	assert( type(_text) == "string", "Lektion_SetText: \""..tostring(_text).."\" ist kein gueltiger Text!" );
	local t = GetLektion(_id);
	assert( t, "Lektion_SetText: Lektions-ID \""..tostring(_id).."\" ist ungueltig!" );
	t.text = _text;
	Lektionen_UpdateDisplay();
end

function Lektion_SetIcon( _id, _icon )
	assert( (type(_icon) == "string") or (type(_icon) == "number" ), "Lektion_SetIcon: \""..tostring(_icon).."\" ist kein gueltiges Icon!" );
	local t = GetLektion(_id);
	assert( t, "Lektion_SetIcon: Lektions-ID \""..tostring(_id).."\" ist ungueltig!" );
	t.icon = _icon;
	Lektionen_UpdateDisplay();
end

-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Dieser Beitrag wurde von Noigi am 19.09.2011 um 19:27 editiert.

Anarki
#2
12.09.2011 05:32
Beiträge: 518

habe mich schon gewundert wie du das in Schach gemacht hast denke mal da kam das so oder ähnlich zum Einsatz?

Mein Multiplayer-Skript erlaubt mittlerweile schon XX Regeleinstellungen und ich hab mir schon überlegt ob man da nicht was anderes als das Tributfenster nutzen kann.

Wird zwar ein schönes Stück Arbeit... aber das scheint mir ne gute Grundlage für ein neues Regelauswahl-Interface.

Danke!

____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

daniBIGdani
#3
12.09.2011 15:09
Beiträge: 153

Hi,

danke Noigi, genau so eine Funktion hab ich gesucht um meine Steuerung und meine Tipps unterzubringen. Das Moviefenster ist einfach zu klein für viiiiel Text.

Gruß Daniel

FastBow
#4
12.09.2011 20:33
Beiträge: 353

Vielen Dank

Wow Noigi das ist einfach großartig !! Das super Ding kann man für viele Sachen einsetzten

Liebe Grüße
FastBow

tws113
#5
15.09.2011 17:07
Beiträge: 256

Moin Noigi coole Funktion hast du da gebastellt
echt Spitze
Lg_Tws113

Noigi
#6
15.09.2011 19:43
Beiträge: 772

Danke für die Rückmeldungen!
Bei Problemen oder Vorschlägen einfach nachfragen.

daniBIGdani
#7
18.09.2011 15:20
Beiträge: 153

Hi Noigi,

wie kann man Lektionen wieder löschen bzw. durch mehr Text erweitern?

Gruß Daniel

Noigi
#8
18.09.2011 21:38
Beiträge: 772

Zitat von daniBIGdani:
Hi Noigi,

wie kann man Lektionen wieder löschen bzw. durch mehr Text erweitern?

Gruß Daniel



Hallo!
Das geht in der aktuellen Version nicht bzw nur sehr umständlich.
Ich werde die Optionen bei Gelegenheit einbauen.

Noigi
#9
19.09.2011 19:30
Beiträge: 772

So, der Code im ersten Beitrag ist auf Version 1.10 "geupdatet".
Neue Optionen sind Ändern und Löschen von Lektionen über IDs (wie z.B. bei Quest-IDS). Die ID einer Lektion wird automatisch vergeben und kann beim Erstellen der Lektion gespeichert werden, um die Lektion beim Ändern/Löschen damit anzusprechen.

Seiten: 1

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

Impressum