World of Gothic Archiv > Editing
Schmieden
Seite 1 von 1  1 
06.04.2004, 14:04 #1
König Rhobar II
Beiträge: 639
Schmieden
Ich habe versucht das Schmieden etwas zu erweitern, sodass man mehr als nur ein Schwert schmieden kann.
Dazu habe ich mir das vom schlafen abgeguckt (sleepabit) und die funktion einfach mal Smith genannt:
code\:
//****************************
// PC_Smith
//****************************

func void PC_Smith (var int s)
{
AI_StopProcessInfos(self); // [SK] ->muss hier stehen um das update zu gewährleisten
self.aivar[AIV_INVINCIBLE]=FALSE;
if (s == 1)
{
CreateInvItem (hero, ItMiSwordbladehot);
Npc_RemoveInvItem (hero, ItMiSwordraw);

}
else
{

CreateInvItem (hero, ItMiSwordbladehot);
Npc_RemoveInvItem (hero, ItMiSwordraw);
Npc_RemoveInvItem (hero, ItMiNugget);
};

PrintScreen ("Waffe hergestellt!", -1,-1,"font_old_20_white.tga",3);


};



func void SMITH_S1 ()
{
var C_NPC her; her = Hlp_GetNpc(PC_Hero);
var C_NPC rock; rock = Hlp_GetNpc(PC_Rockefeller);

//***ALT** if (Hlp_GetInstanceID (self)== Hlp_GetInstanceID (Hero)) // MH: geändert, damit kontrollierte NSCs nicht schlafen können!
if ( (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))||(Hlp_GetInstanceID(se lf)==Hlp_GetInstanceID(rock)) )
{
self.aivar[AIV_INVINCIBLE]=TRUE;
Ai_ProcessInfos (her);
};
};






//-------------------- Gar nicht schmieden -------------------------

INSTANCE PC_NoSmith (c_Info)

{
npc = PC_Hero;
nr = 999;
condition = PC_NoSmith_Condition;
information = PC_NoSmith_Info;
important = 0;
permanent = 1;
description = DIALOG_ENDE;
};

FUNC INT PC_NoSmith_Condition()
{
return 1;
};

func VOID PC_NoSmith_Info()
{
AI_StopProcessInfos (self);
self.aivar[AIV_INVINCIBLE]=FALSE;

};

//---------------------- grobes Schwert --------------------------------------

INSTANCE PC_Smith_easy (C_INFO)
{
npc = PC_Hero;
condition = PC_Smith_easy_Condition;
information = PC_Smith_easy_Info;
important = 0;
permanent = 1;
description = "Einfaches Schwert schmieden";
};

FUNC INT PC_Smith_easy_Condition()
{
return 1;
};

func void PC_Smith_easy_Info ()
{
PC_Smith (1);
};

//--------------------- Erzklinge-----------------------------------------

INSTANCE PC_Smith_Ore (C_INFO)
{
npc = PC_Hero;
condition = PC_Smith_Ore_Condition;
information = PC_Smith_Ore_Info;
important = 0;
permanent = 1;
description = "Erzklinge schmieden";
};

FUNC INT PC_Smith_Ore_Condition()
{
return 1;
};

func void PC_Smith_Ore_Info ()
{
PC_Smith (2);
};



Wenn ich das im Spiel aber testen will, kommt nur das normale schmieden. (Ich hab im Spacer dem Amboss die funktion smith zugewiesen)
06.04.2004, 14:13 #2
JonathanSalznik
Beiträge: 22

Die Funktion muss SMITH_S1() heißen. Gothic hängt immer ein _S<erreichter Zustand des MOBs> hinten an.

Bei deiner Lösung wirst du außerdem eine Mischung von "Schlafen" und "Schmieden"-Optionen im erscheinen Mulitple-Choice-Fenster bekommen. Das wird auch passieren, wenn sich der Spieler ins Bett legt. Du mußt leider sowohl sleepabit als auch deine Smith-Funktion so anpassen, dass die Conditions der C_Info-Objektt nur dann wahr sind, wenn der Spieler ein Bett bzw. einen Amboss verwendet.
06.04.2004, 14:17 #3
König Rhobar II
Beiträge: 639

Ich hab das getrennt von sleepabit gespeichert, hab nur vergessen "mittags" in "Erzklinge schmieden" umzubenennen^^
Muss ich trotzdem da eine Bedingung einbauen, auch wenn beide funktionen anders heißen und getrennt gespeichert sind?

edit: Ok, Frage hat sich erledigt, seit ich im bett ein Schwert geschmiedet hab^^
Beim Amboss kommt allerdings gar nichts
06.04.2004, 14:25 #4
JonathanSalznik
Beiträge: 22

Leider ja.. Die Auswahl wird realisiert, indem der Spieler mit sich selbst "spricht".. und für Dialoge trägt Gothic alle passenden C_Info-Objekte aus allen Source-Dateien zusammen.
06.04.2004, 14:41 #5
König Rhobar II
Beiträge: 639

was muss ich denn da reinschreiben, damit er erkennt, ob es ein Bett oder ein Amboos ist?
also: if (???)
{
return 1;
};

Was muss ich anstelle con ??? schreiben?

edit: Ich hab das script oben editiert, so sieht es im Moment aus.
beim Amboss kommen leider immernoch keine Optionen
06.04.2004, 14:50 #6
JonathanSalznik
Beiträge: 22

Am besten definierst du an zentraler Stelle

code\:

var int mobInUse;

const int MOBINUSE_ANVIL = 1;
const int MOBINUSE_BED = 2;
const int MOBINUSE_PSILAB = 3;
..



Die *_S1-Funktionen setzen die mobInUse-Variable dann entsprechend und die Conditions fragen sie ab.

Ich habe es gerade mal ausprobiert: Wenn ich bei der "onStateFunc" vom Amboss im Aussenring des alten Lager SMITH eintrage, wird bei mir SMITH_S1() korrekt aufgerufen. Vielleicht Probleme mit der Groß-/Kleinschreibung?
06.04.2004, 15:03 #7
König Rhobar II
Beiträge: 639

das mit dem Amboss klappt, hatte nur vergessen auf Apply zu klicken^^
Ob das mit den variablen geklappt hat kann ich nicht sagen, weil ich bei beiden nur "ENDE." (komischerweise mit punkt) auswählen kann.
Ein weiteres Problem ist, das der Amboss neben der neuen Funktion weiterhin normal glühenden Stahl zu einer glühenden Klinge verarbeitet
06.04.2004, 15:09 #8
JonathanSalznik
Beiträge: 22

Dann hat es nicht funktioniert. "ENDE." mit Punkt ist ein spezieller Eintrag, den Gothic automatisch anzeigt, wenn überhaupt kein C_Info-Objekt gefunden wurde, bei dem die Condition wahr ist.
06.04.2004, 15:26 #9
Black Daemon
Beiträge: 218

quote:
Ein weiteres Problem ist, das der Amboss neben der neuen Funktion weiterhin normal glühenden Stahl zu einer glühenden Klinge verarbeitet

Das leigt daran, dass das in der humans.mds so definiert ist.
Am besten lässt du die Glühende Klinge im Script entfernen.
Vergess nicht, dem Spieler, wenn den Ende Dialog auswählt einmal glühendes Stahl zu geben.
06.04.2004, 16:55 #10
König Rhobar II
Beiträge: 639

Woran liegt das denn nun mit dem "ENDE."?
06.04.2004, 16:59 #11
JonathanSalznik
Beiträge: 22

Poste bitte mal, was du genau gemacht hast.

Sehen deine Condition-Funktionen so aus?

code\:

FUNC INT PC_Smith_easy_Condition()
{
if (mobInUse == MOBINUSE_ANVIL)
{
return 1;
};
};



Steht in SMITH_S1()

code\:

mobInUse = MOBINUSE_ANVIL;



und in SLEEPABIT_S1()

code\:

mobInUse = MOBINUSE_BED;



jeweils direkt VOR dem Ai_ProcessInfos (her)?
06.04.2004, 17:03 #12
König Rhobar II
Beiträge: 639

Jetzt schon :D
Danke
06.04.2004, 17:41 #13
aragorn_16
Beiträge: 529

Wo kann man denn die Schmiedebedingungen ändern?
06.04.2004, 18:04 #14
JonathanSalznik
Beiträge: 22

quote:
Zitat von König Rhobar II
Jetzt schon :D
Danke



Kein Problem, ich habe die Infos mal ins Wiki eingetragen..

@aragorn_16: Was für Schmiedebedingungen meinst du genau? In conditionFunc kannst du eine Funktion einfügen, die TRUE zurückgeben muss, damit der Character das MOB benutzen kann. In useWithItem kommt der Name des Gegenstandes rein, den man im Inventar haben muss, um den MOB zu verwenden.
07.04.2004, 17:47 #15
aragorn_16
Beiträge: 529

Ich hab eigentlich gemeint, was man machen muss, um neue Waffen schmieden zu können. Werd mir das dann mal im Wiki durchlesen.
07.04.2004, 18:29 #16
König Rhobar II
Beiträge: 639

meinst du, dass man auswählen kann, welche Waffe man schmieden will (Wie in Gothic 2)?
Dann kann ich dir wenn du willst ein Beispielscript schicken, da sieht man dann, wie das genau funktioniert.
07.04.2004, 20:49 #17
aragorn_16
Beiträge: 529

@König Rhober II: Ich probiers mal aus, und wenn ich des nicht hinbekomm, kannst du mir schicken.
07.04.2004, 22:18 #18
aragorn_16
Beiträge: 529

Wenn ich diese Zeile hier einfüge:
mobInUse = MOBINUSE_BED;
dann kommt ständig eine Fehlermeldung.
Und was ist dmit gemeint:
An zentraler Stelle



var int mobInUse;

const int MOBINUSE_ANVIL = 1;
const int MOBINUSE_BED = 2;
const int MOBINUSE_PSILAB = 3;
Wo soll man des denn einfügen?
07.04.2004, 22:59 #19
JonathanSalznik
Beiträge: 22

Zentrale Stelle = (hier)Eine Datei, die vor sleepabit.d und deinen erstellten Variationen in gothic.src steht. Entweder erstellt du selbst eine oder verwendest z.B. STORYSTORY_GLOBALS.D

Danach geht die Fehlermeldung auch weg.. Die kommt daher, dass die Variable mobInUse und die Konstante MOBINUSE_BED nicht vorher definiert wurden.
08.04.2004, 14:36 #20
aragorn_16
Beiträge: 529

Die Fehlermeldung kommt jetzt nicht mehr, allerdings kommt kein Auswahlmenü am Amboss. Woran liegt das?
08.04.2004, 14:43 #21
König Rhobar II
Beiträge: 639

poste mal das script, sonst kann ich dir nicht helfen.
Hats du im Spacer beim Amboss die funktion eingetragen?
08.04.2004, 17:20 #22
Maharreshi
Beiträge: 82

Hallöchen!

quote:
aragorn_16 schrieb:
[...], allerdings kommt kein Auswahlmenü am Amboss.



Ich habe das selbe Problem, allerdings beim Bett.
Ich habe die jeweiligen Bedingungen zu den Dialogen hinzugefügt, kompiliert und ausprobiert (und das mehrfach). Es funktioniert nicht! Ich habe keine Ahnung wieseo, es ist jedenfalls nicht so, dass dann die Bedingungen alle 'FALSE' wären, sondern die Funktion 'SLEEPABIT_S1' (bei mir heißt sie 'SLEEP_S1', dass habe ich auch beim VOB eingetragen: OnStateFunc: SLEEP) wird einfach nicht aufgerufen, d. h. der PC legt sich einfach aufs Bett und NICHTS weiter passiert.
08.04.2004, 18:28 #23
aragorn_16
Beiträge: 529

Ja, ich hab beim Amboss die Funktion eingetragen: SMITH_S1.
Hier ist mal das Script:

//****************************
// PC_Sleep
//****************************

func void PC_Smith (var int s)
{
AI_StopProcessInfos(self); // [SK] ->muss hier stehen um das update zu gewährleisten
self.aivar[AIV_INVINCIBLE]=FALSE;
if (s == 1)
{
CreateInvItem(hero, ItMiSwordbladehot);
Npc_RemoveInvItem(hero, ItMiSwordraw);
}
else
{

CreateInvItem(hero, ItMiSwordbladehot);
Npc_RemoveInvItem(hero, ItMiSwordraw);
Npc_RemoveInvItem(hero, ItMiNugget);
};

PrintScreen("Waffe hergestellt!", -1,-1,"font_old_20_white.tga",3);

};


func void SMITH_S1 ()
{
var C_NPC her; her = Hlp_GetNpc(PC_Hero);
var C_NPC rock; rock = Hlp_GetNpc(PC_Rockefeller);

//***ALT** if(Hlp_GetInstanceID (self)== Hlp_GetInstanceID (Hero)) // MH: geändert, damit kontrollierte NSCs nicht schlafen können!
if ( (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))||(Hlp_GetInstanceID(se lf)==Hlp_GetInstanceID(rock)) )
{
self.aivar[AIV_INVINCIBLE]=TRUE;
mobInUse = MOBINUSE_ANVIL;
Ai_ProcessInfos (her);
};
};






//-------------------- Gar nicht schlafen -------------------------

INSTANCE PC_NoSmith (c_Info)

{
npc = PC_Hero;
nr = 999;
condition = PC_NoSmith_Condition;
information = PC_NoSmith_Info;
important = 0;
permanent = 1;
description = DIALOG_ENDE;
};

FUNC INT PC_NoSmith_Condition()
{
if (mobInUse == MOBINUSE_ANVIL)
{
return 1;
};
};

func VOID PC_NoSmith_Info()
{
AI_StopProcessInfos (self);
self.aivar[AIV_INVINCIBLE]=FALSE;

};

//---------------------- morgens --------------------------------------

INSTANCE PC_Smith_LowWeapons (C_INFO)
{
npc = PC_Hero;
condition = PC_Smith_LowWeapons_Condition;
information = PC_Smith_LowWeapons_Info;
important = 0;
permanent = 1;
description = "Leichte Waffen schmieden";
};

FUNC INT PC_Smith_LowWeapons_Condition()
{
if (mobInUse == MOBINUSE_ANVIL)
{
return 1;
};
};

func void PC_Smith_LowWeapons_Info ()
{
PC_Smith (1);
};
08.04.2004, 18:53 #24
König Rhobar II
Beiträge: 639

beim Amboss muss einfach nur SMITH stehen, das _S1 kannst du im Spacer weglassen
08.04.2004, 20:05 #25
aragorn_16
Beiträge: 529

Okay, werds mal versuchen. Danke.
Seite 1 von 1  1