World of Gothic Archiv > Editing
'Der Schmied ist zu schnell'
Seite 1 von 1  1 
14.07.2003, 22:22 #1
Zirror
Beiträge: 472
'Der Schmied ist zu schnell'
Mir is kein anderer Titel eingefallen

Wie schaffe ich es denn das der schmied erst nach einem Tag fertig ist, wenn ich ihm einen Auftrag für eine Spezielle Waffe gebe, also der Script ist schon fertig ich brauch nur noch ne Condition bzw. ne möglichkeit das der Schmied erst einen Tag nach dem ersten Dialog fertig ist (ich glaub irgendwas mit wld_getday () oder so) für Hilfe wäre ich sehr dankbar :D
15.07.2003, 00:29 #2
Malek
Beiträge: 6.225

Nun, es gibt sicherlich ne Möglichkeit, siehe Wolf und die Minecrawlerrüstung. Aber eigentlich muss da eine Condition erfüllt sein, die im Dialog abgefragt wird ("Und, schon fertig?" o.ä.) Eine Abfrage, ob nun ein Tag verstrichen ist oder nicht, existiert meines Wissens nicht. Allerdings.....

Du könntest im Dialog beim Schmied einen Wert auf TRUE setzen lassen. Nun nimmst du die Funktion fürs Übernachten (GOTHIC_workDATAscriptscontentStoryEVENTSSleepabit.d), wo, falls dieser Wert TRUE ist, eine weitere funktion auf TRUE gesetzt wird, die wiederum beim Schmied abgefragt ist. Diese verrät dem Schmied nun, dass du gepennt hast. Das funktioniert allerdings nur ein einziges Mal, ist keine dauerhafte Lösung.
15.07.2003, 01:08 #3
roXtar
Beiträge: 341

...und funzt auch nicht, wenn man zb zum zeit totschlagen monster gekillt hat, statt zu schlafen...

rox
15.07.2003, 01:49 #4
Zirror
Beiträge: 472

*gähn* ich hasse Schlaflose Nächte :D. Egal zum Thema. Wolfs Minecrawler rüstung ist nicht Tagbedingt sondern Questbedingt, nachdem man den Ulumulu gemacht hat (CreatUlumulu == Log_Success) ist er fertig da könnt ihr selbst tausend mal schlafen. Ich bin noch nicht so lange im Scriptgeschäft, ich weiss zwar wo so eine Tages Funktion verwendet wird, aber ich kann sie irgendwie nicht erkennen. Der jenige der die Tagesfunktion verwendet ist Fortuno, der Krauthändler aus dem Sumpflager. Mein Problem ist da steht so einiges was ich nicht verstehe ;). Bzw befehle die mir unbekannt sind wenn also einer von euch Profis sich mal den Dia skript von ihm anschauen könnte wäre ich sehr verbunden. Aber danach mir noch schnell erklären wie das funktioniert ^^. Will ja schlieslich was lernen.
15.07.2003, 04:04 #5
Malek
Beiträge: 6.225

*vordenKopfKlatscht*
Stimmt! Fortuno hat ja die Abfrage für die tägliche Ration...
Also interessant ist ja nur die Funktion
quote:

Fortuno_RationDay = Wld_GetDay();



Diese Funktion ist in der Datei GOTHIC_workDATAscriptscontentStoryBB_SetDayTolerance.d
auch benutzt. Hier wird die Toleranz des Zeitwertes bestimmt.
quote:

func int B_SetDayTolerance()
{
if (Wld_IsTime (22,00,23,59))
{
return Wld_GetDay()+1;
}
else
{
return Wld_GetDay();
};
};



Die Funktion selber wird in dieser Datei initialisiert: GOTHIC_workDATAscriptscontentAIAI_Internexternals.d
und sieht folgendermassen aus:
quote:

FUNC INT Wld_GetDay () {};
// Liefert den aktuellen Tag zurück (Zähler), hierbei ist der StartTag (Gamestart) = 0.
FUNC INT Wld_IsTime (VAR INT hour1, VAR INT min1, VAR INT hour2, VAR INT min2) { return 0; };
// Liefert "1" wenn aktuelle Weltzeit zwischen den beiden angegebenen Zeiten liegt (von - bis)



Also im Klartext bedeutet das, dass die Tage von der Engine gezählt und damit auch gespeichert werden (sieht man ja bei den Savegames). Beim Spielstart also Tag 0. In der oben genannten Datei wird festgelegt dass der Zähler gegen Mitternacht um den Faktor 1 erhöht wird.

Ich interpretiere das so:
quote:

FUNC VOID DIA_Fortuno_DailyRation_Info()
{
AI_Output (other, self,"DIA_Fortuno_DailyRation_15_00"); //Ich will mir meine tägliche Ration abholen.
if (Fortuno_RationDay!=Wld_GetDay())
{
AI_Output (self, other,"DIA_Fortuno_DailyRation_05_01"); //Hier nimm. 3 Schwarzer Weiser - aber nicht alle auf einmal rauchen.
CreateInvItems(self, itmijoint_2, 3);
B_GiveInvItems(self, other, itmijoint_2, 3);
Fortuno_RationDay = Wld_GetDay();
}
else
{
AI_Output (self, other,"DIA_Fortuno_DailyRation_05_02"); //Du hattest deine Tagesration schon. Wenn du mehr willst, komm morgen wieder oder kauf was.
};
};



Bei ROT wird abgefragt, ob die globale "Fortuno_RatoinDay" ungleich der Funktion "Wld_GetDay" ist. Wenn ja, bekommt man die Joints, die Tagesfunktion wird ausgelöst, bei BLAU. Damit ist der Tag abgefragt und bleibt konstant, bis er sich bei Mitternacht im Counter um den Faktor 1 erhöht. Dann kann erneut abgefragt werden. Wenn die Funktion bereits abgefragt wurde, tritt natürlich die else-Funktion in Kraft. In dem Fall gibts leider kein Kraut.

Ich hoffe das war nicht zu kompliziert erklärt, ist aber an sich schon nicht einfach...
15.07.2003, 14:36 #6
Zirror
Beiträge: 472

Ahhh, also heist das im Klartext das wenn die Tage zumbeispiel 20 sind und man das erste mal mit furtone Spricht wird die Variable von Fortuno auf 20 gesetzt, Am nächsten Tag ist die Variable aber 21 aber bei Furtuno ist die Variable immernoch 20. Also weiss Gothic das es am 21. Tag noch nicht die Krautübergabe gegeben hat. Und dann setzt sich durch den Dialog der Wert auf 21, also heisst das das dann auch die Variable von Fortuno 21 ist, also weiss gothic da der 21 Tag ist und Fortuno die Variable 21 hat das der Spieler am 21. Tag schon da war. Um 00:01 wird die Variable von Wld_Getday + 1 Sprich also auf 22 gesetzt und dann beginnt das Ganze wieder von vorne, also Fortunos wert ist auf 21 und daher weiss Gothic das das
Kraut heute noch nicht abgeholt wurde.

Stimmt doch so oder ? Glaub ich habs kapiert. Das würde aber heissen das ich es einen Dialog davor auf Wld_GetDay () Setzten muss (also die Variable von meinem Schmied) ohne das es eien Effekt gibt und danach einen Dialog freischalten, der nur aktiviert ist wenn er 1. Den Dialog kennt, der die Variable des Schmiedes auf Wld_Getday () setzt und das die Variable vom Schmied ungleich wld_getday () ist, also erst am nächsten tag, stimmt doch oder ?

Danke Malek du bist echt verdammt Clever :D
15.07.2003, 17:18 #7
Zirror
Beiträge: 472

Würde es nicht eigentlich auch gehen das man, wenn zumbeispiel irgendwas 3 Tage dauern soll, einfach Variable=Wld_GetDay(+3) und dann nen Dialog macht der erst freigeschaltet wird wenn Variable=Wld_GetDay , sprich also wenn Wld_Getday um 3 sprich also das die Uhr 3 mal die 00:00 also 3 Tage später als der Tag an dem die Varialbe auf Wld_GetDay(+3) gestellt wurde oder ? Wird das dann auch so geschreiben oder eher Wld_Getday() + 3 ? Würde mich echt mal interessieren, das würde einige interesannte möglichkeiten eröffnen :D
15.07.2003, 21:27 #8
HornOx
Beiträge: 1.458

Wld_GetDay(+3) wird schon beim parsen fehler erzeugen weil Wld_GetDay nun mal keine Parameter hat; Wld_Getday() + 3 sollte funktionieren.
16.07.2003, 00:28 #9
Malek
Beiträge: 6.225

Ja, genau so hatte ich mir das gedacht :)
Aber ob das über mehrere Tage auch geht, weiss ich net, musst du halt mal ausprobieren.
quote:

FUNC VOID DIA_Fortuno_DailyRation_Info()
{
AI_Output (other, self,"DIA_Fortuno_DailyRation_15_00"); //Ich will mir meine tägliche Ration abholen.
if (Fortuno_RationDay!=Wld_GetDay() + 3)
{
AI_Output (self, other,"DIA_Fortuno_DailyRation_05_01"); //Hier nimm. 3 Schwarzer Weiser - aber nicht alle auf einmal rauchen.
CreateInvItems(self, itmijoint_2, 3);
B_GiveInvItems(self, other, itmijoint_2, 3);
Fortuno_RationDay = Wld_GetDay();
}
else
{
AI_Output (self, other,"DIA_Fortuno_DailyRation_05_02"); //Du hattest deine Tagesration schon. Wenn du mehr willst, komm morgen wieder oder kauf was.
};
};



Mir fällt grad ein dass diese Funktion auch bei Snaf benutzt wird:
quote:

// **************************************************
// AFTER SUCCESS
// **************************************************
var int Snaf_RagoutDay;
// **************************************************

INSTANCE DIA_Snaf_AfterSuccess (C_INFO)
{
npc = Vlk_581_Snaf;
nr = 2;
condition = DIA_Snaf_AfterSuccess_Condition;
information = DIA_Snaf_AfterSuccess_Info;
permanent = 1;
description = "Du hast gesagt, ich kann soviel von dem Eintopf haben, wie ich will...";
};

FUNC INT DIA_Snaf_AfterSuccess_Condition()
{
if ( (Snaf_Zutaten==LOG_SUCCESS) && (Snaf_FreeMBRagout==TRUE) )
{
return 1;
};
};

FUNC VOID DIA_Snaf_AfterSuccess_Info()
{
AI_Output (other, self,"DIA_Snaf_AfterSuccess_15_00"); //Du hast gesagt, ich kann so viel von den Eintopf haben, wie ich will ...

if (Snaf_RagoutDay!=Wld_GetDay())
{
AI_Output (self, other,"DIA_Snaf_AfterSuccess_01_01"); //Und das stimmt auch. Hier, nimm 3 Portionen!
CreateInvItems(self, ItFoMeatbugragout,3);
B_GiveInvItems(self, other,ItFoMeatbugragout,3);
Snaf_RagoutDay = Wld_GetDay();
}
else
{
AI_Output (self, other,"DIA_Snaf_AfterSuccess_01_02"); //Klar! Heute ist aber alles schon auf. Komm morgen wieder!
};
};



Ist dasselbe Prinzip.
Hier ist mir noch was wichtiges aufgefallen:
Vergiss nicht die Variable für die Tagesabfrage zu initialisieren:
quote:

var INT Heute_Nicht;
if (Heute_Nicht!=Wld_GetDay())

Seite 1 von 1  1