PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mobsi-Bedienungszeit abfragen ...



Dalai Zoll
25.08.2011, 12:37
Ich suche nach einer Möglichkeit, die Zeit abzufragen, die bei der Mobsi Bedienung vergeht zwischen S1 und S0.

Lehona
25.08.2011, 12:43
MEM_Timer.totalTime bzw. MEM_Timer.totalTimeFloat geben dir die gesamte vergangene Zeit des Spieles. Einfach merken und nachher die Differenz bilden.

Der Ahnungslose
25.08.2011, 17:52
Lehonas Vorschlag setzt Ikarus voraus. Schau dir aber doch mal die Zeitskripte von Milky an. Die sollten dir weiterhelfen.

Lehona
25.08.2011, 17:59
Lehonas Vorschlag setzt Ikarus voraus. Schau dir aber doch mal die Zeitskripte von Milky an. Die sollten dir weiterhelfen.

Die sollten, wenn ich mich nicht irre, nur Ingame-Minuten berechnen. Ich weiß ja nicht, wie genau du es brauchst.

Der Ahnungslose
25.08.2011, 18:07
Stimmt glaube ich. Aber so ne Ingame-Minute vergeht schon zügig, und ich vermute mal, dass Dalai eine Mobsi-Benutzung abfragen möchte, die mit Sicherheit mindestens länger als eine Ingame-Minute dauern sollte.

Milky-Way
25.08.2011, 23:14
Die sollten, wenn ich mich nicht irre, nur Ingame-Minuten berechnen. Ich weiß ja nicht, wie genau du es brauchst.
Ja, nur ingame Minuten. Da ein Spieltag (24 Spielstunden) 100 echte Minuten sind, dauert eine Spielminute 4,1 Periode 6 echte Sekunden. (Rechnung kann gerne überprüft werden, die Angabe zu Minuten pro Spieltag hatte ich aus meinen eigenen Skripten, ursprünglich vermutlich irgendwo aus dem Forum)

Je nachdem, was man damit macht, würde ich aber tendenziell den MEM_Timer vorziehen. Wer weiß, vielleicht gibt es mit der Spielzeit kleine Verzögerungen (die gibt es ja zumindest bei Triggern), so dass die Rechnung nicht mehr hinkommt, wenn man es über längere Zeiträume nutzt (etwa mehrere Spielstunden). Außerdem bräuchte das ganz genaue Abfragen der Spielzeit dann auch wieder Ikarus für einen Trigger, der jeden Frame feuert, und am besten auch Floats.

Dalai Zoll
26.08.2011, 06:22
Wie weit kann ich denn mit der Zeit einer Triggerschleife runtergehen? Funzt das bei 0.1 Delay noch einigermassen genau?

Wir haben folgendes überlegt ..... Das mit der Weltzeit wird so nichts, wir arbeiten mit eigener Zeiteinheit.


func void zeitabfrage_S0() // Mobsi aus (Schmiedefeuer)
{
timego = 0;
if (mobsidauer < 13)
{
PrintScreen ("Der Stahl ist noch zu kalt", -1, YPOS_LOGENTRY, FONT_ScreenSmall, 3);
Npc_RemoveInvItems (hero, ItMiSwordBladeHot, 1); // Den heissen Stahl wieder wegnehmen
CreateInvItems (hero, ItMSwordblade, 1); // einen kalten Stahl wieder geben
}
else if (mobsidauer > 15)
{
PrintScreen ("Der Stahl ist überhitzt und unbrauchbar geworden", -1, YPOS_LOGENTRY, FONT_ScreenSmall, 3);
Npc_RemoveInvItems (hero, ItMiSwordBladeHot, 1); // Den heissen Stahl wieder wegnehmen, aber diemal keinen geben, der ist unbrauchbar
}

// Wenn das Zeitfenster getroffen wurde
else if ((mobsidauer == 13)
||(mobsidauer == 14)
||(mobsidauer == 15))
{
PrintScreen ("Glühenden Stahl erhalten, Temperatur perfekt!", -1, YPOS_LOGENTRY, FONT_ScreenSmall, 3);
};

};
func void zeitabfrage_S1() // Mobsi ein (Schmiedefeuer)
{
mobsidauer = 0; // Zeitfaktor zurück auf null stellen.
timego = 1;
if (timego == 1)
{
Wld_SendTrigger("Trigger_01");
};
};
func void triggerzeit_01() //Trigger01 ist ein Delaytrigger, Zeitdauer muss noch getestet werden, je nach dem wie schwer das werden soll
{
if (timego == 1)
{
Wld_SendTrigger("Trigger_01");
mobsidauer +=1;
};
};Damit will ich eine dynamische Zeitabfrage einbauen, dass zum Beispiel beim glühen eines Rohstahles, der Stahl nur dann richtig geglüht zählt, wenn der Player das in der Toleranzgrenze des sich hochzählenden Wertes "mobsidauer +=1" bei beispielsweise zwischen 12 und 16 abbricht. Weniger wäre dann Stahl zu kalt, mehr wäre dann Stahl ausgeglüht. Das stupide klick an und klick aus und Stahl geheizt, hat mich schon immer gestört. Jetzt muss der Spieler abschätzen wie ein Schmied, nach Gefühl, wie lange er den Stahl ins Feuer hält.

Diese Triggerschleife läuft eben immer nur in der Zeit, in welcher das Mobsi auch bedient wird und ist somit Performence sparend. Damit, wenn man mehrere Mobsis damit ausstattet, nicht viele (zu viele) Triggerschleifen endlos am laufen sind.

Baue das jetzt mal so ein und hoffe dass das klappt mit der abbrechbaren Triggerschleife und werde mal die Delayzeit auf 0.20 einstellen.

Sektenspinner
26.08.2011, 09:08
Bedenke, dass eine Triggerschleife immer nur einmal im Frame die Möglichkeit hat zu reagieren. Das heißt nachdem die Zeit abgelaufen ist, und die Triggerschleife reagieren müsste vergeht im Schnitt nochmal ein halber Frame an Zeit. Bei einer Framerate von 20/sec vergeht also 1/40 Sekunden, das heißt wenn du Zehntel Sekunden zählst ist nach 1 Sekunde (also 10 Ticks der Schleife) die Schleife um etwa 10 * 1/40 Sekunden daneben, indem Fall also 25% zu langsam.

Wenn man noch präzisere Überlegungen anstellt, wird man feststellen, dass die Ungenauigkeit abhängig von der Framerate eine Art Sägezahnkurve ist (bzw. theoretisch sein müsste), so und so bleibt aber die Moral sie selbe: Triggerschleifen mit hoher Frequenz sind ungenau.

Falls du Ikarus nutzt wäre die Abfrage wirklich sehr einfach:

var int startZeit;
//Startzeit festhalten:
startZeit = MEM_Timer.totalTimeFloat;

//Zeitdifferenz am Ende in Millisekunden bestimmen:
var int diffMS;
diffMS = roundf(subf(MEM_Timer.totalTimeFloat, startZeit));

Dalai Zoll
26.08.2011, 09:31
Ja, dann werde ich mich mal damit auseinandersetzen müssen. Das Apha Vob Script haben wir ja auch hinbekommen mit Ikarus. Früher oder später, bei unseren Ideen und Anforderungen wird man da ja wohl nicht darum herum kommen.

Danke mal an alle.

Dalai Zoll
26.08.2011, 13:03
Habe jetzt mal einen Testlauf gemacht, die Sache funktioniert perfekt. Auch ohne Ikarus. Die Verzögerung der Frames spielt ja in sofern keine Rolle, da ja keine Zeit vorgegeben ist, sondern sich der Player an die richtige Glühzeit ranarbeiten muss. Da die Abweichung ja immer gleichbleibend ist, kann man nach ein paar Versuchen schon das Gefühl entwickeln, wann der Richtige Zeitpunkt zum abbrechen des Mobsis ist.