-
Zitat von Lehona
You'll have to do minute = minute % 60;, otherwise for 2:15am you'll get 135 minutes.
No, it prints 2 and 15 correctly.
And rounding is a bad idea, too.
May I ask why?
-
Zitat von Frank-95
No, it prints 2 and 15 correctly.
May I ask why?
Oh my god. I was just writing an elaborate response why that couldn't work and then I noticed there's a scrollbar on the bottom of your codebox... fml.
And given that I just saw that little extra code, your code works even with rounding But I don't think there's any reason to use rounding over truncating, as you can save the little if-clause at the end.
-
Oh my god. I was just writing an elaborate response why that couldn't work and then I noticed there's a scrollbar on the bottom of your codebox... fml.
It happens man! You don't know how many times it happened to me too
I post the code for sake of completeness, even though there's already yours
Code:
var int x; x = MEM_WorldTimer.worldTime;
var int hourf; hourf = divf(x, mkf(oCWorldTimer_TicksPerHour));
var int hour; hour = truncf(hourf);
var int minute; minute = truncf(divf(x,mkf(oCWorldTimer_TicksPerMin_approx))) - (hour * 60);
EDIT: what does fml mean?
Geändert von Frank-95 (13.02.2016 um 10:28 Uhr)
-
Thanks!
Zitat von Frank-95
EDIT: what does fml mean?
http://www.internetslang.com/FML.asp
-
Apprentice
Hi Milky,
wenn ich den Tagesablauf allgemein verlangsamen möchte, könnte ich natürlich alle x Sekunden die Zeit zurücksetzen.
Aber ich frage mich, ob es da evtl. ein paar angenehmere Funktionen für mein Vorhaben gibt?
MfG
-
Wenn ich dein Ziel richtig verstanden habe, dann gibt es dafür eine deutlich bessere Lösung (verwendet Ikarus und Floatpaket)
Zitat von Sektenspinner
Ich hab mal etwas herumprobiert, an die TicksPerHour Konstante kommt man leider nicht ran, weil sie in einem schreibgeschützten Speicherbereich steht, aber was bei mir ziemlich problemlos ging war jeden Frame die Zeit ein bisschen zu justieren.
Code:
func void ScaleWorldTime (var int factor) {
//worldTime += frameTime * (factor - 1);
//Global instances have to be intialised!
var int deltaT; deltaT = MEM_Timer.frameTimeFloat;
deltaT = mulf (deltaT, subf (factor, mkf (1)));
MEM_WorldTimer.worldTime = addf (MEM_WorldTimer.worldTime, deltaT);
};
Ein Aufruf von ScaleWorldTime (mkf (10)); jeden Frame hat bei mir die Zeit 10 mal schneller verstreichen lassen. ScaleWorldTime (invf(mkf(10))); hat auch funktionert und die Zeit ist 10 mal langsamer verstrichen.
Sei dir aber bewusst, dass die Zeit so in jedem Frame erst vorwärts läuft und dann ein Stück rückwärts (falls factor < 1).
Sensible Systeme, die mehrmals in einem Frame aktiv sind und sich darauf verlassen, dass die Zeit niemals rückwärts läuft könnten merkwürdiges Verhalten zeigen. Wie groß die Gefahr wirklich ist muss man testen. Ich halte Probleme allerdings für unwahrscheinlich, schon allein, weil Triggerschleifen beinahe ausnahmslos am Ende des Frames aktiv sind.
Ab hier:
http://forum.worldofplayers.de/forum...1#post14840189
gibt es noch die Fragen, die ich damals dazu hatte.
Das Aufrufen in jedem Frame laesst sich heutzutage noch einfacher mit den FrameFunctions aus dem LeGo-Paket erreichen.
-
Apprentice
Zitat von Milky-Way
Wenn ich dein Ziel richtig verstanden habe, dann gibt es dafür eine deutlich bessere Lösung (verwendet Ikarus und Floatpaket)
Ab hier:
http://forum.worldofplayers.de/forum...1#post14840189
gibt es noch die Fragen, die ich damals dazu hatte.
Das Aufrufen in jedem Frame laesst sich heutzutage noch einfacher mit den FrameFunctions aus dem LeGo-Paket erreichen.
Hi, vielen Dank schon mal. Dann werde ich mal testen müssen, ob diese Herangehensweise überhaupt GMP-tauglich ist.
Aber ich berichte dann
MfG
-
29.05.2016 15:34
#48
hallo Milky-Way,
ich weiß, dass es nicht wirklich hierher gehört, da du aber darüber keinen eigenen thread erstellt hast (zumindest hab ich es nicht gefunden), schreibe ich es hier rein.
ich danke dir für viele, zahlreiche, gute, zur verfügung gestellten scripte, die mir im umgang mit dädalus sehr geholfen und mein wissen diesbezüglich sehr erweitert haben
(ganz besonders die implementierung von regeneration)
-
Lehrling
Ich möchte gerne eine "klassische" Abfrage erstellen, in der der Held mindestens 2 Stunden nach dem Dialog wiederkommen soll, um einen Gegenstand X abzuholen. Die Zeitscripte habe ich hinzugefügt. Wie setze ich dies nun um? Bei ganzen Tagen (also Wld_GetDay) habe ich mir immer eine Variable erstellt und dieser später abgefragt. Zum Beispiel so:
Code:
// ************************************************************
// DIALOG 1
// ************************************************************
var int TestNPC_Gesprochen;
// ************************************************************
.....
FUNC VOID DIA_OUT_99078_TESTNPC_HALLO_Info()
{
AI_Output (other, self, "DIA_OUT_99078_TESTNPC_HALLO_15_1"); //Hallo 1
AI_Output (self, other, "DIA_OUT_99078_TESTNPC_HALLO_1_1"); //Hallo 2
TestNPC_Gesprochen = Wld_GetDay ();
};
// ************************************************************
// DIALOG 2
// ************************************************************
....
Func int DIA_OUT_99078_TESTNPC2_HALLO_Condition ()
{
if (TestNPC_Gesprochen < Wld_GetDay())
{
return TRUE;
};
};
FUNC VOID DIA_OUT_99078_TESTNPC2_HALLO_Info()
{
AI_Output (other, self, "DIA_OUT_99078_TESTNPC2_HALLO_15_1"); //Hallo 3
AI_Output (self, other, "DIA_OUT_99078_TESTNPC2_HALLO_1_1"); //Hallo 4
};
-
Geht sehr ähnlich. Du speicherst in einer Variable einen Zeitpunkt ab, beispielsweise 2 Stunden in der Zukunft:
Code:
C4_Justin_ArmorReadyTimestamp = Wld_GetTimePlus(0, 2, 0); // 2 Stunden in der Zukunft
Und dann kannst du abfragen, ob dieser Zeitpunkt bereits überschritten wurde:
Code:
if(Wld_IsAfterTime(C4_Justin_ArmorReadyTimestamp)){
...
-
Zitat von Cryp18Struct
Geht sehr ähnlich. Du speicherst in einer Variable einen Zeitpunkt ab, beispielsweise 2 Stunden in der Zukunft:
Code:
C4_Justin_ArmorReadyTimestamp = Wld_GetTimePlus(0, 2, 0); // 2 Stunden in der Zukunft
Und dann kannst du abfragen, ob dieser Zeitpunkt bereits überschritten wurde:
Code:
if(Wld_IsAfterTime(C4_Justin_ArmorReadyTimestamp)){
...
Funktioniert das ganze auch, falls der Spieler genau in den 2 Stunden, einen Tag oder mehr schläft?
Edit:\\ Ja tut es, kacke... Jetzt kann ich alles umbauen xD
Geändert von neocromicon (05.03.2024 um 17:50 Uhr)
-
Lehrling
Danke für die Hilfe, hat direkt funktioniert!
-
Zitat von neocromicon
Funktioniert das ganze auch, falls der Spieler genau in den 2 Stunden, einen Tag oder mehr schläft?
Edit:\\ Ja tut es, kacke... Jetzt kann ich alles umbauen xD
Solange Zeit nur vorwärtsläuft, ist das alles problemlos.
Wenn man von Hand an der Tageszeit herumschiebt (Wld_SetTime), kann es ein, dass Zeit zurückgesetzt wird auf einen Zeitpunkt in der Vergangenheit.
Das könnte dann Probleme machen.
Klassiker: man möchte das es dunkel wird und setzt deswegen die Tageszeit auf einen Zeitpunkt in der Nacht:
Code:
Wld_SetTime (03,36); // ab 3:40 wird's wieder heller, um 4:00 ist es annehmbar hell für Jiran
Wenn dieser code vor 03:36 ausgeführt wird, läuft Zeit vorwärts.
Wenn dieser code um 18:00 ausgeführt wird (am X. Tag), läuft Zeit rückwärts und man landet in der Vergangenheit (X. Tag, 03:36), NICHT: (X+1. Tag, 03:36).
-
Zitat von Cryp18Struct
Solange Zeit nur vorwärtsläuft, ist das alles problemlos.
Wenn man von Hand an der Tageszeit herumschiebt (Wld_SetTime), kann es ein, dass Zeit zurückgesetzt wird auf einen Zeitpunkt in der Vergangenheit.
Das könnte dann Probleme machen.
Klassiker: man möchte das es dunkel wird und setzt deswegen die Tageszeit auf einen Zeitpunkt in der Nacht:
Code:
Wld_SetTime (03,36); // ab 3:40 wird's wieder heller, um 4:00 ist es annehmbar hell für Jiran
Wenn dieser code vor 03:36 ausgeführt wird, läuft Zeit vorwärts.
Wenn dieser code um 18:00 ausgeführt wird (am X. Tag), läuft Zeit rückwärts und man landet in der Vergangenheit (X. Tag, 03:36), NICHT: (X+1. Tag, 03:36).
Das war mir auch irgendwann mal aufgefallen. In fast allen Fällen möchte man vermutlich die Zeit nur vorwärts setzen. Das ist sogar relativ einfach:
Code:
FUNC void Wld_SetTime_forward(var int hh, var int mm)
{
if Wld_IsTime(00,00,hh,mm)
{
Wld_SetTime(hh,mm);
}
else
{
Wld_SetTime(hh+24,mm);
};
};
Stunden größer als 23 führen zum nächsten Tag.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|