Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Seite 1 von 3 123 Letzte »
Ergebnis 1 bis 20 von 54
  1. Beiträge anzeigen #1 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline

    [TIPP] Diverse Zeit-Skripte

    [TIPP] Diverse Zeit-Skripte


    Einleitung

    In den Original-Skripten gibt es kaum Funktionen, um mit der Spielzeit zu arbeiten. Deshalb habe ich mich hingesetzt und mit Nodrogs Skripten als Grundlage einige Funktionen geskriptet, die mir nützlich erscheinen. Weiter unten werde ich ein paar Anwendungsbeispiele nennen, dennoch würde ich mich freuen, wenn ihr kurz hier posten würdet, was ihr mit den Funktionen macht. So können dann vielleicht auch andere Modder noch Anregungen oder Problemlösungen finden.


    Skripte

    Die Skripte können so früh wie nötig geparst werden, sie brauchen keine weiteren Funktionen. Es ist davon abzuraten, die Reihenfolge der Funktionen zu verändern, da sie zum Teil aufeinander aufbauen. Ein geübter Skripter sollte allerdings auch damit keine Probleme haben.
    Ich habe in den Skripten nicht kommentiert, was ich wieso mache. Fragen dazu beantworte ich hier gerne. Ich hoffe aber, die Funktionen und erwarteten Parameter ausreichend beschrieben zu haben. Hier nun der Code:


    Version 1.5.1

    18.06.2011: 2 kleine Fehler in B_PrintTime, die Neconspictor aufgefallen waren, ausgebessert.

    Es gibt eine neue Version, bei der zusätzlich zur Uhrzeit auch der Tag beachtet (und zurückgegeben) wird. Dabei wird die Gothic-Konvention, dass der Starttag "Tag 0" ist, beibehalten, um einen Vergleich mit Wld_GetDay() zu erleichtern. Durch die Erweiterung kann man nicht einfach die alte Version überschreiben, da eine Funktion umbenannt ist und einige Funktionen nun zusätzliche Parameter brauchen.
    Geändert wurde: B_CalcHrMin in B_CalcDayHrMin
    Wld_AddTime, Wld_SubTime, Wld_GetTimePlus, Wld_GetTimeSub verlangen nun 3 Parameter, der 1. ist die Anzahl der Tage, der 2. Stunden, der 3. Minuten.
    Zudem wurden Wld_IsExactTime, Wld_IsBeforeTime und Wld_IsAfterTime angepasst. Sie verlangen nun nicht mehr eine Uhrzeit, sondern eine Gesamtzeit (also mit Tagen). Das war nötig und nützlich bei der Umstellung auf das neue System dhhmm (wobei d beliebig viele Stellen haben kann). Umrechnung dieses Formats:
    Tage = dhhmm /10000
    Stunden = (dhhmm % 10000) / 100
    Minuten = dhhmm % 100
    Sollte eine der oben genannten Funktionen genutzt werden, so sollte geprüft werden, welche Anpassungen vorgenommen werden müssen.

    Code:
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    //		Wld_GetTime V. 1.5.1
    //		----------------------------------------------------
    //
    //		Wiedergabe der Zeit in Minuten und Ähnliches
    //		Basiert auf einem Skript von Nodrog
    //
    //		B_CalcDayHrMin (VAR int dy, VAR int hr, VAR int min) gibt die Zeit im Format dhhmm wieder, Minuten > 60 werden dabei in Stunden umgerechnet, Stunden > 24 in Tage
    //		Wld_GetHour () gibt die aktuelle Stunde zurück
    //		Wld_GetMinute () gibt die aktuelle Minute zurück
    //		Wld_GetTime() gibt die aktuelle Zeit im Format dhhmm zurück
    //		Wld_AddTime (VAR int days_add, VAR int hours_add, VAR int minutes_add) stellt die Zeit um days_add Tage, hours_add Stunden und minutes_add Minuten vor
    //		Wld_SubTime (VAR int days_sub, VAR int hours_sub, VAR int minutes_sub) stellt die Zeit um days_sub Tage, hours_sub Stunden und minutes_sub Minuten zurück
    //		Wld_GetTimePlus (VAR int days_add, VAR int hours_add, VAR int minutes_add) gibt die Uhrzeit in days_add Tagen, hours_add Stunden und minutes_add Minuten im Format dhhmm zurück
    //		Wld_GetTimeSub (VAR int days_sub, VAR int hours_sub, VAR int minutes_sub) gibt die Uhrzeit vor days_sub Tagen, hours_add Stunden und minutes_add Minuten im Format dhhmm zurück
    //		B_PrintTime (VAR int hhmm, VAR int x, VAR int y, VAR int t) Printet die Uhrzeit im Format hh:mm an Position (x|y) für t Sekunden
    //		Wld_IsExactTime (VAR int hhmm) liefert TRUE zurück, wenn es genau hh:mm Uhr ist
    //		SCRIPT_TIME () mindestens einmal die Sekunde vom Trigger TRIGGER_TIME aufrufen lassen, damit die Uhrzeit angezeigt wird
    //		Wld_IsBeforeTime (VAR int dhhmm) liefert TRUE zurück, wenn es vor d Tage, hh:mm Uhr ist
    //		Wld_IsAfterTime (VAR int dhhmm) liefert TRUE zurück, wenn es nach d Tage, hh:mm Uhr ist
    //
    //
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    FUNC int B_CalcDayHrMin (VAR int dy, VAR int hr, VAR int min)	// Bricht Stunden und Minuten zu einer Zahl
    {
    	VAR int ret;
    	IF (min >= 60)
    	{
    		RETURN B_CalcDayHrMin (dy, hr+1, min-60);
    	}
    	ELSE IF (hr >= 24)
    	{
    		RETURN B_CalcDayHrMin (dy+1, hr-24, min);
    	}	
    	ELSE
    	{
    		dy = dy * 10000;
    		hr = hr * 100;
    		ret = dy + hr + min;
    		RETURN ret;
    	};	
    };
    
    FUNC int Wld_FindMinute(var int Hour,var int from,var int till)		// Returned die aktuelle Minute
    {
    	IF (from >= 60)
    	{
    		RETURN -1;
    	};
    	IF (Wld_IsTime (hour, 59, hour+1, 10))
    	{
    		RETURN 59;
    	}	
    	ELSE IF (Wld_IsTime (hour, 58, hour+1, 10))
    	{
    		RETURN 58;
    	}
    	ELSE IF (Wld_IsTime (hour, 57, hour+1, 10))
    	{
    		RETURN 57;
    	}
    	ELSE IF (Wld_IsTime(Hour,from+1,Hour,till))
    	{
    		RETURN Wld_FindMinute(Hour,from+1,till);
    	}
    	ELSE
    	{
    		RETURN from;
    	};
    };
    
    FUNC int Wld_FindHour(var int from,var int till)		// Returned die aktuelle Stunde
    {
    	IF (Wld_IsTime (23,00,0,0))
    	{
    		RETURN 23;
    	}
    	ELSE IF (Wld_IsTime (22,55,23,10))
    	{
    		RETURN 22;
    	}
    	ELSE IF (from >= 24)
    	{
    		RETURN -1;    
    	}
    	ELSE IF (Wld_IsTime(from+1,0,till,0))
    	{
    		RETURN Wld_FindHour(from+1,till);
    	}
    	ELSE
    	{
    		RETURN from;
    	};
    	
    };
    
    FUNC int Wld_GetHour ()		// Returned die aktuelle Stunde
    {
    	var int hour;
    	hour = Wld_FindHour(0,23);
    	RETURN hour;
    };
    
    FUNC int Wld_GetMinute ()	// Returned die aktuelle Minute
    {
    	VAR int minute;
    	minute = Wld_FindMinute (Wld_GetHour(),0,59);
    	RETURN minute;
    };
    
    FUNC int Wld_GetTime()		// Returned die Uhrzeit im Format hhmm
    {
    	var int d;
    	VAR int h;
    	VAR int m;
    	h = Wld_GetHour();
    	m = Wld_GetMinute();
    	d = Wld_GetDay ();
    	
    	VAR int ret;
    	ret = d * 10000 + h * 100 + m;
    	RETURN ret;
    };
    
    FUNC void Wld_AddTime (VAR int days_add, VAR int hours_add, VAR int minutes_add)	// Stellt die Zeit vor
    {
    	VAR int calc;
    	calc = B_CalcDayHrMin (days_add, hours_add, minutes_add);
    	days_add = calc / 10000;
    	hours_add = calc % 10000;
    	hours_add = hours_add / 100;
    	minutes_add = calc % 100;
    	
    	VAR int hour;
    	hour = Wld_GetHour () + hours_add + 24 * days_add;
    	
    	VAR int minutes;
    	minutes = Wld_GetMinute ();
    	hour = hour + ((minutes	+ minutes_add) / 60);
    	minutes = (minutes + minutes_add)%60;
    	
    	Wld_SetTime (hour,minutes);
    };
    
    FUNC void Wld_SubTime (VAR int days_sub, VAR int hours_sub, VAR int minutes_sub)		// Stellt die Zeit zurück
    {
    	VAR int calc;
    	calc = B_CalcDayHrMin (days_sub, hours_sub, minutes_sub);
    	days_sub = calc / 10000;
    	hours_sub = calc % 10000;
    	hours_sub = hours_sub / 100;
    	minutes_sub = calc % 100;
    	
    	VAR int hour;
    	hour = Wld_GetHour () - hours_sub - 24 * days_sub;
    	
    	VAR int minutes;
    	minutes = Wld_GetMinute ();
    	
    	IF (minutes >= minutes_sub)
    	{
    		minutes = minutes - minutes_sub;
    	}
    	ELSE
    	{
    		hour = hour - 1;
    		minutes = 60 - (minutes_sub - minutes);
    	};	
    	
    	Wld_SetTime (hour,minutes);
    };
    
    FUNC int Wld_GetTimePlus (VAR int days_add, VAR int hours_add, VAR int minutes_add)		//Wie viel Uhr ist es in x Stunden und y Minuten?
    {
    	VAR int calc;
    	calc = B_CalcDayHrMin (days_add, hours_add, minutes_add);
    	days_add = calc / 10000;
    	hours_add = calc % 10000;
    	hours_add = hours_add / 100;
    	minutes_add = calc % 100;
    	
    	VAR int newDay;
    	newDay = Wld_GetDay ()+ days_add;
    	
    	VAR int hour;
    	hour = Wld_GetHour () + hours_add;
    	
    	VAR int minutes;
    	minutes = Wld_GetMinute ();
    	hour = hour + ((minutes	+ minutes_add) / 60);
    	newDay = newDay + hour / 24;
    	hour = hour % 24;
    	minutes = (minutes + minutes_add)%60;
    	
    	VAR int ret;
    	newDay =  newDay * 10000;
    	hour = hour * 100;
    	ret = newDay + hour + minutes;
    	RETURN ret;
    };
    
    
    FUNC int Wld_GetTimeSub (VAR int days_sub, VAR int hours_sub, VAR int minutes_sub)		// Wie viel Uhr war es vor x Stunden und y Minuten?
    {
    	VAR int calc;
    	calc = B_CalcDayHrMin (days_sub, hours_sub, minutes_sub);
    	days_sub = calc / 10000;
    	hours_sub = calc % 10000;
    	hours_sub = hours_sub / 100;
    	minutes_sub = calc % 100;
    	
    	VAR int newDay;
    	newDay = Wld_GetDay () - days_sub;
    	
    	VAR int hour;
    	hour = Wld_GetHour () - hours_sub;
    	
    	VAR int minutes;
    	minutes = Wld_GetMinute ();
    	
    	IF (minutes >= minutes_sub)
    	{
    		minutes = minutes - minutes_sub;
    	}
    	ELSE
    	{
    		hour = hour - 1;
    		minutes = 60 - (minutes_sub - minutes);
    	};	
    	
    	IF (hour < 0)
    	{
    		newDay = newDay - 1;
    		hour = 24 + hour;
    	};
    	
    	VAR int ret;
    	newDay = newDay * 10000;
    	hour = hour * 100;
    	ret = newDay + hour + minutes;
    	RETURN ret;	
    };
    
    Func void B_PrintTime (VAR int dhhmm, VAR int x, VAR int y, VAR int t)	// Umrechnung und Print einer Uhrzeit vom Format hhmm
    {
    	VAR int curDay;
    	VAR int hour;
    	VAR int minute;
    	curDay = dhhmm / 10000;
    	hour = dhhmm % 10000;
    	hour = hour / 100;
    	minute = dhhmm % 100;
    	VAR string prnt;
    	VAR string dy;
    	VAR string hr;
    	VAR string min;
    	dy = IntToString (curDay);
    	hr = IntToString (hour);
    	min = IntToString (minute);
    	IF (hour < 10)
    	{
    		hr = ConcatStrings ("0", hr);
    	};
    	IF (minute < 10)
    	{
    		min = ConcatStrings ("0", min);
    	};
    	prnt = ConcatStrings (dy, ". Tag - ");
    	prnt = ConcatStrings (prnt, hr);
    	prnt = ConcatStrings (prnt, ":");
    	prnt = ConcatStrings (prnt, min);
    	PrintScreen (prnt, x,y, FONT_Screen, t);
    };
    
    FUNC int Wld_IsExactTime (VAR int dhhmm)		//Ist es genau hhmm Uhr?
    {
    	IF (dhhmm == Wld_GetTime ())
    	{
    		RETURN TRUE;
    	}
    	ELSE
    	{
    		RETURN FALSE;
    	};	
    };
    
    FUNC void SCRIPT_TIME ()			//Für Uhrzeit von einem sekündlichem Trigger "TRIGGER_TIME" aufrufen lassen
    {
    	B_PrintTime (Wld_GetTime (), 5,5,1);
    	Wld_SendTrigger ("TRIGGER_TIME");
    };
    
    FUNC int Wld_IsBeforeTime (VAR int dhhmm)		//Ist es vor hhmm Uhr?
    {
    	IF (Wld_GetTime() >= dhhmm)
    	{
    		RETURN FALSE;
    	}
    	ELSE
    	{
    		RETURN TRUE;
    	};	
    };
    
    FUNC int Wld_IsAfterTime (VAR int dhhmm)		//Ist es nach hhmm Uhr?
    {
    	IF (Wld_GetTime() <= dhhmm)
    	{
    		RETURN FALSE;
    	}
    	ELSE
    	{
    		RETURN TRUE;
    	};	
    };

    Version 1.0

    Falls jemand gerne die alte Version nutzen möchte, gibt es sie hier:

    Code:
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    //		Wld_GetTime
    //		----------------------------------------------------
    //
    //		Wiedergabe der Zeit in Minuten und Ähnliches
    //		Basiert auf einem Skript von Nodrog
    //
    //		B_CalcHrMin (VAR int hr, VAR int min) gibt die Zeit im Format hhmm wieder, Minuten > 60 werden dabei in Stunden umgerechnet
    //		Wld_GetHour () gibt die aktuelle Stunde zurück
    //		Wld_GetMinute () gibt die aktuelle Minute zurück
    //		Wld_GetTime() gibt die aktuelle Zeit im Format hhmm zurück
    //		Wld_AddTime (VAR int hours_add, VAR int minutes_add) stellt die Zeit um hours_add Stunden und minutes_add Minuten vor
    //		Wld_SubTime (VAR int hours_sub, VAR int minutes_sub) stellt die Zeit um hours_sub Stunden und minutes_sub Minuten zurück
    //		Wld_GetTimePlus (VAR int hours_add, VAR int minutes_add) gibt die Uhrzeit in hours_add Stunden und minutes_add Minuten im Format hhmm zurück
    //		Wld_GetTimeSub (VAR int hours_sub, VAR int minutes_sub) gibt die Uhrzeit vor hours_add Stunden und minutes_add Minuten im Format hhmm zurück
    //		B_PrintTime (VAR int hhmm, VAR int x, VAR int y, VAR int t) Printet die Uhrzeit im Format hh:mm an Position (x|y) für t Sekunden
    //		Wld_IsExactTime (VAR int hhmm) liefert TRUE zurück, wenn es genau hh:mm Uhr ist
    //		SCRIPT_TIME () mindestens einmal die Sekunde vom Trigger TRIGGER_TIME aufrufen lassen, damit die Uhrzeit angezeigt wird
    //		Wld_IsBeforeTime (VAR int hhmm) liefert TRUE zurück, wenn es vor hh:mm Uhr ist
    //		Wld_IsAfterTime (VAR int hhmm) liefert TRUE zurück, wenn es nach hh:mm Uhr ist
    //
    //
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    FUNC int B_CalcHrMin (VAR int hr, VAR int min)	// Bricht Stunden und Minuten zu einer Zahl
    {
    	VAR int ret;
    	IF (min >= 60)
    	{
    		RETURN B_CalcHrMin (hr+1, min-60);
    	}
    	ELSE
    	{
    		hr = hr * 100;
    		ret = hr + min;
    		RETURN ret;
    	};	
    };
    
    FUNC int Wld_FindMinute(var int Hour,var int from,var int till)		// Returned die aktuelle Minute
    {
    	IF (from >= 60)
    	{
    		RETURN -1;
    	};
    	IF (Wld_IsTime (hour, 59, hour+1, 10))
    	{
    		RETURN 59;
    	}	
    	ELSE IF (Wld_IsTime (hour, 58, hour+1, 10))
    	{
    		RETURN 58;
    	}
    	ELSE IF (Wld_IsTime (hour, 57, hour+1, 10))
    	{
    		RETURN 57;
    	}
    	ELSE IF (Wld_IsTime(Hour,from+1,Hour,till))
    	{
    		RETURN Wld_FindMinute(Hour,from+1,till);
    	}
    	ELSE
    	{
    		RETURN from;
    	};
    };
    
    FUNC int Wld_FindHour(var int from,var int till)		// Returned die aktuelle Stunde
    {
    	IF (Wld_IsTime (23,00,0,0))
    	{
    		RETURN 23;
    	}
    	ELSE IF (Wld_IsTime (22,55,23,10))
    	{
    		RETURN 22;
    	}
    	ELSE IF (from >= 24)
    	{
    		RETURN -1;    
    	}
    	ELSE IF (Wld_IsTime(from+1,0,till,0))
    	{
    		RETURN Wld_FindHour(from+1,till);
    	}
    	ELSE
    	{
    		RETURN from;
    	};
    	
    };
    
    FUNC int Wld_GetHour ()		// Returned die aktuelle Stunde
    {
    	var int hour;
    	hour = Wld_FindHour(0,23);
    	RETURN hour;
    };
    
    FUNC int Wld_GetMinute ()	// Returned die aktuelle Minute
    {
    	VAR int minute;
    	minute = Wld_FindMinute (Wld_GetHour(),0,59);
    	RETURN minute;
    };
    
    FUNC int Wld_GetTime()		// Returned die Uhrzeit im Format hhmm
    {
    	VAR int h;
    	VAR int m;
    	h = Wld_GetHour();
    	m = Wld_GetMinute();
    	
    	VAR int ret;
    	ret = h * 100 + m;
    	return ret;
    };
    
    FUNC void Wld_AddTime (VAR int hours_add, VAR int minutes_add)	// Stellt die Zeit vour
    {
    	VAR int calc;
    	calc = B_CalcHrMin (hours_add, minutes_add);
    	hours_add = calc / 100;
    	minutes_add = calc % 100;
    	
    	VAR int hour;
    	hour = Wld_GetHour () + hours_add;
    	
    	VAR int minutes;
    	minutes = Wld_GetMinute ();
    	hour = hour + ((minutes	+ minutes_add) / 60);
    	minutes = (minutes + minutes_add)%60;
    	
    	Wld_SetTime (hour,minutes);
    };
    
    FUNC void Wld_SubTime (VAR int hours_sub, VAR int minutes_sub)		// Stellt die Zeit zurück
    {
    	VAR int calc;
    	calc = B_CalcHrMin (hours_sub, minutes_sub);
    	hours_sub = calc / 100;
    	minutes_sub = calc % 100;
    	
    	VAR int hour;
    	hour = Wld_GetHour () - hours_sub;
    	
    	VAR int minutes;
    	minutes = Wld_GetMinute ();
    	
    	IF (minutes >= minutes_sub)
    	{
    		minutes = minutes - minutes_sub;
    	}
    	ELSE
    	{
    		hour = hour - 1;
    		minutes = 60 - (minutes_sub - minutes);
    	};	
    	
    	Wld_SetTime (hour,minutes);
    };
    
    FUNC int Wld_GetTimePlus (VAR int hours_add, VAR int minutes_add)		//Wie viel Uhr ist es in x Stunden und y Minuten?
    {
    	VAR int calc;
    	calc = B_CalcHrMin (hours_add, minutes_add);
    	hours_add = calc / 100;
    	minutes_add = calc % 100;
    	
    	VAR int hour;
    	hour = Wld_GetHour () + hours_add;
    	
    	VAR int minutes;
    	minutes = Wld_GetMinute ();
    	hour = hour + ((minutes	+ minutes_add) / 60);
    	minutes = (minutes + minutes_add)%60;
    	
    	VAR int ret;
    	hour = hour * 100;
    	ret = hour + minutes;
    	RETURN ret;
    };
    
    
    FUNC int Wld_GetTimeSub (VAR int hours_sub, VAR int minutes_sub)		// Wie viel Uhr war es vor x Stunden und y Minuten?
    {
    	VAR int calc;
    	calc = B_CalcHrMin (hours_sub, minutes_sub);
    	hours_sub = calc / 100;
    	minutes_sub = calc % 100;
    	
    	VAR int hour;
    	hour = Wld_GetHour () - hours_sub;
    	
    	VAR int minutes;
    	minutes = Wld_GetMinute ();
    	
    	IF (minutes >= minutes_sub)
    	{
    		minutes = minutes - minutes_sub;
    	}
    	ELSE
    	{
    		hour = hour - 1;
    		minutes = 60 - (minutes_sub - minutes);
    	};	
    	
    	VAR int ret;
    	hour = hour * 100;
    	ret = hour + minutes;
    	RETURN ret;	
    };
    
    Func void B_PrintTime (VAR int hhmm, VAR int x, VAR int y, VAR int t)	// Umrechnung und Print einer Uhrzeit vom Format hhmm
    {
    	VAR int hour;
    	VAR int minute;
    	hour = hhmm / 100;
    	minute = hhmm % 100;
    	VAR string prnt;
    	VAR string hr;
    	VAR string min;
    	hr = IntToString (hour);
    	min = IntToString (minute);
    	IF (hour < 10)
    	{
    		hr = ConcatStrings ("0", hr);
    	};
    	IF (minute < 10)
    	{
    		min = ConcatStrings ("0", min);
    	};
    	prnt = ConcatStrings (hr, ":");
    	prnt = ConcatStrings (prnt, min);
    	PrintScreen (prnt, x,y, FONT_Screen, t);
    };
    
    FUNC int Wld_IsExactTime (VAR int hhmm)		//Ist es genau hhmm Uhr?
    {
    	IF (hhmm == Wld_GetTime ())
    	{
    		RETURN TRUE;
    	}
    	ELSE
    	{
    		RETURN FALSE;
    	};	
    };
    
    FUNC void SCRIPT_TIME ()			//Für Uhrzeit von einem sekündlichem Trigger "TRIGGER_TIME" aufrufen lassen
    {
    	B_PrintTime (Wld_GetTime (), 5,5,1);
    	Wld_SendTrigger ("TRIGGER_TIME");
    };
    
    FUNC int Wld_IsBeforeTime (VAR int hhmm)		//Ist es vor hhmm Uhr?
    {
    	IF (Wld_GetTime() >= hhmm)
    	{
    		RETURN FALSE;
    	}
    	ELSE
    	{
    		RETURN TRUE;
    	};	
    };
    
    FUNC int Wld_IsAfterTime (VAR int hhmm)		//Ist es nach hhmm Uhr?
    {
    	IF (Wld_GetTime() <= hhmm)
    	{
    		RETURN FALSE;
    	}
    	ELSE
    	{
    		RETURN TRUE;
    	};	
    };

    Anwendungsbeispiel

    1) Eine Uhr:
    Mit Hilfe der Funktionen kann man die Uhrzeit anzeigen. Ich habe das mit einer Trigger-Schleife schon einmal gemacht:
    Auf ähnliche Art und Weise ließe sich auch ein Countdown realisieren, der die verbliebene Zeit nicht in Echtzeit, sondern in Spielzeit angibt. Geübte Grafiker und Skripter könnten daraus wohl auch mit einem neuen Schriftsatz und Print-Befehlen (ähnlich wie Balken) noch eine analoge Uhr machen.

    2) (Spiel-)Zeitverzögerte Änderungen:
    Ein NPC sagt: "Komm in zwei Stunden wieder!"
    Mit Wld_GetTimePlus und Vergleichen mit Wld_GetTime ist das möglich. Über andere Schleifen, etc. können auch andere Aktionen (TA-Wechsel, Trigger, Mover) spielzeitverzögert ausgeführt werden.

    3) Zeit verstellen:
    Der Zweck, für den ich ursprünglich die Skripte geschrieben habe. Es ist möglich, die Spielzeit vor- und zurück-zustellen. Dadurch kann zum Beispiel ein neues Schlaf-System eingeführt werden, bei dem der Spieler entscheidet, wie lange er schläft, und dann prozentual Lebenspunkte wieder bekommt.


    Sonstiges

    Ich habe die Funktionen noch nicht ausgiebig getestet, konnte bisher aber keine Probleme feststellen. Mit diesen Funktionen lassen sich ein paar ganz nette Dinge anstellen, und, damit auch andere Modder etwas davon haben, veröffentliche ich sie. Ihr könnt die Skripte also in euren Mods frei verwenden.
    Solltet ihr Vorschläge für weitere nützliche Funktionen haben, kann ich versuchen, diese umzusetzen.


    Updates

    06.02.2010: Der Code wurde angepasst, um die bei manchen Uhrzeiten auftauchenden Fehler mit Spezialbehandlungen zu beheben. Es sind mir keine weiteren Fehler bekannt, meine Tests verliefen problemlos (Zeitvergleich mit toggle time).
    Geändert von Milky-Way (28.07.2012 um 17:39 Uhr)

  2. Homepage besuchen Beiträge anzeigen #2 Zitieren
    Ehrengarde Avatar von jesus123
    Registriert seit
    Jan 2007
    Beiträge
    2.278
     
    jesus123 ist offline
    sehr gute sache! kann man mit sicherheit für vielerlei komplexe quests etc. verwenden. mir ist nur ein kleiner flüchtigkeitsfehler in der beschreibung aufgefallen:

    Code:
    [...]
    //		Wld_IsBeforeTime (VAR int hhmm) liefert TRUE zurück, wenn es nach hh:mm Uhr ist
    //		Wld_IsAfterTime (VAR int hhmm) liefert TRUE zurück, wenn es vor hh:mm Uhr ist
    [...]
    das sollte wohl umgekehrt sein.

    ansonsten: und vielen dank für die bereitstellung!

  3. Beiträge anzeigen #3 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline
    Zitat Zitat von jesus123 Beitrag anzeigen
    sehr gute sache! kann man mit sicherheit für vielerlei komplexe quests etc. verwenden. mir ist nur ein kleiner flüchtigkeitsfehler in der beschreibung aufgefallen:

    Code:
    [...]
    //		Wld_IsBeforeTime (VAR int hhmm) liefert TRUE zurück, wenn es nach hh:mm Uhr ist
    //		Wld_IsAfterTime (VAR int hhmm) liefert TRUE zurück, wenn es vor hh:mm Uhr ist
    [...]
    das sollte wohl umgekehrt sein.

    ansonsten: und vielen dank für die bereitstellung!
    Ja, das stimmt - ich ändere es schnell.

  4. Beiträge anzeigen #4 Zitieren
    Deus Avatar von Milgo
    Registriert seit
    Jul 2002
    Beiträge
    15.557
     
    Milgo ist offline
    Ja, die Skripte von Nodrog hab ich auch benutzt.

    Die Kommentierung (solltest du dir unbedingt angewöhnen) ist so ziemlich unter aller Sau. Deswegen versteh ich was nicht: Die Parameter für Wld_IsAfterTime und Wld_IsBeforeTime sind doch beispielsweise für 8:30 Uhr doch 0830 - oder? Dieser Wert wird aber nur mit der aktuellen Stunde verglichen, deswegen wird jegliche Uhrzeit doch niemals kleiner als 830.

  5. Homepage besuchen Beiträge anzeigen #5 Zitieren
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Anmerkung dazu: Ich nutze eigentlich fast immer absolute Stunden oder Minuten seit dem Spielbeginn.
    Wenn es auf Stunden oder Minuten ankommt, dann sind das eigentlich immer relative Aufforderungen wie "komm in zwei Stunden wieder" oder Wirkungen von Effekten, die in Minuten gemessen werden. Selten brauche ich Zugriff auf die Tageszeit.
    Dabei ist es unpraktisch, wenn mein Referenzzähler (die "Uhr", d.h. die Uhrzeitfunktion) eine Sägezahnkurve ist, das heißt alle 24 wieder auf 0 springt.
    Einfache größer-kleine Vergleiche gehen dann nicht, wenn man nicht zusätzlich den Tag betrachtet.

    Funktionen der Form:
    Wld_GetHour_abs() := 24*Wld_GetDay() + Wld_GetHour();
    Wld_GetMinute_abs() := 1440*Wld_GetDay() + 60 * Wld_GetHour() + Wld_GetMinute();


    wären sicher noch praktisch.

    Ich habe die Funktionen noch nicht ausgiebig getestet
    Dann tu das mal, speziell bei Stunden und Tagesgrenzen. Mein erster Versuch hatte seinerzeit ne Endlosschleife drin, weil Wld_IsTime sich anders verhielt als ich dachte, weiß aber nicht mehr genau was da schief ging.

    Einfach mal das in ne Schleife packen:
    Code:
    var int exactTime;
    exactTime = Wld_GetTime();
    
    var int assertion;
    assertion = Wld_IsExactTime(exactTime);
    
    if (!assertion) {
    Print ("BUG");
    } else {
    SCRIPT_TIME ();
    };
    und bei Stunden bzw. Tagesübergängen beobachten.

    Wenn das problemlos läuft ist die Wahrscheinlichkeit groß, dass es immer problemlos läuft.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  6. Beiträge anzeigen #6 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline
    Zitat Zitat von Milgo Beitrag anzeigen
    Die Kommentierung (solltest du dir unbedingt angewöhnen) ist so ziemlich unter aller Sau. Deswegen versteh ich was nicht: Die Parameter für Wld_IsAfterTime und Wld_IsBeforeTime sind doch beispielsweise für 8:30 Uhr doch 0830 - oder? Dieser Wert wird aber nur mit der aktuellen Stunde verglichen, deswegen wird jegliche Uhrzeit doch niemals kleiner als 830.
    Die Kommentierung ist wirklich notdürftig, da gebe ich Dir recht. Deshalb habe ich auch bewusst geschrieben, dass ich die einzelnen Schritte nicht kommentiert habe. Besser macht es das natürlich trotzdem nicht.

    Ja, das war mein Fehler, ich hatte die Funktion einmal umgeschrieben, dabei habe ich das wohl falsch übernommen. Ist korrigiert.

  7. Homepage besuchen Beiträge anzeigen #7 Zitieren
    Team K Avatar von Kurzer
    Registriert seit
    Jul 2005
    Ort
    Dresden
    Beiträge
    6.549
     
    Kurzer ist offline
    Finde erstmal ne Klasse Sache, dass du das gemacht hast.
    Ich habe mich noch nicht tiefgründiger mit der Problematik beschäftigt, hatte es aber notgerdrungen vor. Aber das kann ich mir ja (wenns funzt) sparen

  8. Beiträge anzeigen #8 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline
    Erstmal danke für Deine ausführliche Kritik.

    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Anmerkung dazu: Ich nutze eigentlich fast immer absolute Stunden oder Minuten seit dem Spielbeginn.
    Wenn es auf Stunden oder Minuten ankommt, dann sind das eigentlich immer relative Aufforderungen wie "komm in zwei Stunden wieder" oder Wirkungen von Effekten, die in Minuten gemessen werden. Selten brauche ich Zugriff auf die Tageszeit.
    Dabei ist es unpraktisch, wenn mein Referenzzähler (die "Uhr", d.h. die Uhrzeitfunktion) eine Sägezahnkurve ist, das heißt alle 24 wieder auf 0 springt.
    Einfache größer-kleine Vergleiche gehen dann nicht, wenn man nicht zusätzlich den Tag betrachtet.
    Dafür sind diese Skripte auch nicht unbedingt gedacht. Nodrog hatte ein Skript dabei, dass aber genau diese Funktion bringt. Da sich mir der Sinn nicht ganz erschlossen hat, habe ich es aber nicht mit reingenommen. Generell ist es kein Problem, das System auch noch auf ddhhmm zu erweitern (wobei die Anzahl der Tage nich auf 2 Stellen begrenzt ist). Es ging mir hier ursprünglich um die Zeitverstellung um eine bestimmte Anzahl Stunden und Minuten, unabhängig von der momentanen Zeit. Meine Funktionen beachten dabei auch die Tage.
    Die Funktionen Wld_IsBeforeTime und Wld_IsAfterTime sind eher für die Tageszeit gedacht und können so genauso gut mit Wld_IsTime ersetzt werden.
    Das größte Problem wegen Tagen sehe ich bei Wld_GetTimePlus und Wld_GetTimeSub. Die kann man da kaum für Abfragen benutzen.


    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Funktionen der Form:
    Wld_GetHour_abs() := 24*Wld_GetDay() + Wld_GetHour();
    Wld_GetMinute_abs() := 1440*Wld_GetDay() + 60 * Wld_GetHour() + Wld_GetMinute();
    So etwas war bei Nodrog dabei. Ich würde solche Funktionen wieder in meinem ddhhmm Format einbauen, da sie dann mMn leichter zu interpedieren sind.

    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Dann tu das mal, speziell bei Stunden und Tagesgrenzen. Mein erster Versuch hatte seinerzeit ne Endlosschleife drin, weil Wld_IsTime sich anders verhielt als ich dachte, weiß aber nicht mehr genau was da schief ging.

    Einfach mal das in ne Schleife packen:
    Code:
    var int exactTime;
    exactTime = Wld_GetTime();
    
    var int assertion;
    assertion = Wld_IsExactTime(exactTime);
    
    if (!assertion) {
    Print ("BUG");
    } else {
    SCRIPT_TIME ();
    };
    und bei Stunden bzw. Tagesübergängen beobachten.

    Wenn das problemlos läuft ist die Wahrscheinlichkeit groß, dass es immer problemlos läuft.
    Ich sehe da momentan nichts, was zu einem Problem führen könnte, werde es aber einmal ausprobieren. Ein ztimer multiplier im Marvon Mode sollte ja keine Probleme verursachen, oder?

  9. Homepage besuchen Beiträge anzeigen #9 Zitieren
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Zitat Zitat von Milky-Way Beitrag anzeigen
    Ich sehe da momentan nichts, was zu einem Problem führen könnte, werde es aber einmal ausprobieren. Ein ztimer multiplier im Marvon Mode sollte ja keine Probleme verursachen, oder?
    Nö, time multiplier macht wohl keine Probleme. Aber wie gesagt, eigentlich sind nur die Nahtstellen kritisch und an die kannst du dich mit set time [stunde] [minute] ja sehr schnell ran cheaten.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  10. Beiträge anzeigen #10 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline
    Ok, getestet mit folgendem Ergebnis:

    Es kommt keine Fehlermeldung (auch nicht der Print-Befehl).

    Um 8:59 zeigt die Uhr 8:00 an, um 9:00 dann 9:00

    Von 23:00 bis 0:00 wird 0:00 angezeigt.

    Mal sehen, was ich dagegen tun kann.

  11. Homepage besuchen Beiträge anzeigen #11 Zitieren
    banned
    Registriert seit
    Nov 2006
    Ort
    Peine / Germany
    Beiträge
    1.997
     
    Feuerbarde ist offline
    Würde es mit einer angesprochenen grafischen Anzeige auch so gehen, das um einen Halbkreis (der der einfach Miniscreen in Tages oder Nachtversion beinhaltet) tagsüber eine Sonne von links nach rechts wandert - nachts ein Mond.

    Das "ungefähr" würde mir in G besser gefallen als eine minutöse Anzeige. Zumal man dann ein Zeitgefühl mit einer realistischen Unterstützung hätte.

  12. Beiträge anzeigen #12 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline
    Zitat Zitat von Feuerbarde Beitrag anzeigen
    Würde es mit einer angesprochenen grafischen Anzeige auch so gehen, das um einen Halbkreis (der der einfach Miniscreen in Tages oder Nachtversion beinhaltet) tagsüber eine Sonne von links nach rechts wandert - nachts ein Mond.

    Das "ungefähr" würde mir in G besser gefallen als eine minutöse Anzeige. Zumal man dann ein Zeitgefühl mit einer realistischen Unterstützung hätte.
    Das wäre sogar deutlich einfacher.

  13. Homepage besuchen Beiträge anzeigen #13 Zitieren
    banned
    Registriert seit
    Nov 2006
    Ort
    Peine / Germany
    Beiträge
    1.997
     
    Feuerbarde ist offline
    *fein* In welchen Größen benötigst Du die Grafiken, oder kommst Du mit EPS klar?

  14. Beiträge anzeigen #14 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline
    Zitat Zitat von Feuerbarde Beitrag anzeigen
    *fein* In welchen Größen benötigst Du die Grafiken, oder kommst Du mit EPS klar?
    EPS?

    128*128 ist das maximal mögliche.

  15. Beiträge anzeigen #15 Zitieren
    #11 Avatar von Alpha
    Registriert seit
    Oct 2008
    Beiträge
    23.040
     
    Alpha ist offline
    Coole Sache, die du da gemacht hast

    Könnten wirklich einige gebrauchen, werd schon etwas finden, was nützlich ist.

  16. Beiträge anzeigen #16 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline
    Zitat Zitat von Alpha Beitrag anzeigen
    Coole Sache, die du da gemacht hast

    Könnten wirklich einige gebrauchen, werd schon etwas finden, was nützlich ist.
    Ich würde momentan noch davon abraten, die Skripte zu benutzen, da es Probleme bei ein paar späten Uhrzeiten (späte Stunden und Minutenzahl) gibt. Das allgemeine 57 - 59 Problem habe ich bereits per Sonderbehandlung gelöst, jetzt gibt es noch 3 problematische Uhrzeiten, für die ich Sonderbehandlungen einbauen muss:
    22:59
    23:58
    23:59
    Für alle anderen Uhrzeiten scheint es bereits zu funktionieren. Ich werde mich in den nächsten Tagen um diese letzten Zeiten kümmern.

  17. Beiträge anzeigen #17 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.629
     
    Bisasam ist offline
    vielen Dank für deine Mühe!

    Das ist äußerst nützlich für Teil zw- ähm mich, mein ich^^

    wie sähe denn die Funktion aus, wenn ich um 8:15 einen Mover zu Punkt B fahren lasse und um 16:00 von Punkt B zurück zu Punkt A? und wo müsste ich die reinschreiben? in die startup meiner welt?


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  18. Beiträge anzeigen #18 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline
    Zitat Zitat von Assasine91 Beitrag anzeigen
    vielen Dank für deine Mühe!

    Das ist äußerst nützlich für Teil zw- ähm mich, mein ich^^

    wie sähe denn die Funktion aus, wenn ich um 8:15 einen Mover zu Punkt B fahren lasse und um 16:00 von Punkt B zurück zu Punkt A? und wo müsste ich die reinschreiben? in die startup meiner welt?
    Das ließe sich zum Beispiel über einen Trigger regeln, der alle paar Sekunden die Funktion aufruft:
    Code:
    FUNC void DEINTRIGGERSKRIPT ()
    {
        IF (Wld_IsExactTime (815) == TRUE)
        {
            //was auch immer um 8:15 Uhr passieren soll
        };
        IF (Wld_IsExactTime (1600) == TRUE)
        {
            //was auch immer um 16:00 Uhr passieren soll
        };
        Wld_SendTrigger ("DEINTRIGGER");
    };

  19. Beiträge anzeigen #19 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.629
     
    Bisasam ist offline
    Zitat Zitat von Milky-Way Beitrag anzeigen
    ...
    müsste der nicht so aussehen?

    Code:
    FUNC void BAHN ()
    {
        IF (Wld_IsExactTime (815) == TRUE)
        {
            Wld_SendTrigger ("ZUG_HIN");
        };
        IF (Wld_IsExactTime (1600) == TRUE)
        {
            Wld_SendTrigger ("ZUG_ZURUECK");
        };
        
    };
    ich mein immerhin sind das einmal hin und einmal zurück.


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette
    Geändert von Bisasam (17.01.2010 um 20:11 Uhr)

  20. Beiträge anzeigen #20 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.191
     
    Milky-Way ist offline
    1) Dein Trigger ist nicht der jeweilige Mover, sondern der Trigger, der die Funktion immer wieder aufruft.

    2) Hinter Wld_SendTrigger("[...]") fehlen bei Dir die Semikolons ;

    3) Wie Du die Mover einsetzt, bleibt Dir überlassen. Übrigens reicht für Dein Beispiel ein Mover.
    Zitat Zitat von Lehona Beitrag anzeigen
    Ein Mover wird mit Wld_SendTrigger() einfach um einen State weiter geschickt. Wenn es nur State 0 und State 1 gibt, ist er nach State 1 wieder bei 0 (Alle Angaben sowohl ohne Gewehr als auch ohne Gewähr). Daher versuchs mal mit:

    Code:
    Wld_SendTrigger("WLD_ARENA_GATE");

Seite 1 von 3 123 Letzte »

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide