World of Gothic Archiv > NWN-Hilfe
Gasthaus-Script
Seite 1 von 1  1 
25.08.2002, 21:55 #1
Corky
Beiträge: 5
Gasthaus-Script
Hiho,

ich habe leider ein kleines Problem mit einem "Zimmervermietungs-Script"!
Und zwar soll der Vermieter nur einen bestimmten Schlüssel rausgeben und auch nur bei entsprechender Goldmenge.
Mein Script:

void main()
{
object oPC = GetPCSpeaker();
object oSchluessel = GetObjectByTag("schluesselkoenig");
string sDialogResRef;
int bPrivateConversation;
int nPCGold = GetGold(oPC);
string sName;
while (GetIsObjectValid(oSchluessel) == TRUE || sName == "Koenig")
{
oSchluessel = GetObjectByTag("schluesselkoenig");
sName = GetName(oSchluessel);
}
if (GetIsObjectValid(oSchluessel) == FALSE)
{
ActionStartConversation(oPC, sDialogResRef=("kath_inn_nein"), bPrivateConversation=TRUE);
}
if ((sName == "Koenig")&&(nPCGold>100))
{
ActionGiveItem(oSchluessel,oPC);
TakeGoldFromCreature(100, oPC);
ActionStartConversation(oPC, sDialogResRef=("kath_inn_ja"), bPrivateConversation=TRUE);
}
}

Leider bekomme ich im Spiel (nicht im Compiler, da ist alles Ok) die Fehlermeldung:
OID: 80000178, Tag: elmor_inn, Fehler: zu viele Anweisungen

Was kann das sein???

Tschö
Corky
25.08.2002, 23:08 #2
Rhaegar
Beiträge: 296

Uff, da liegt einiges im Argen.
Also erstmal: Das zu viele Anweisungen Problem heisst schlicht und einfach:Endlosschleife!
Ich kommentier' mal ein paar Stellen die mir aufgefallen sind:

code\:

void main()
{
object oPC = GetPCSpeaker();
object oSchluessel = GetObjectByTag("schluesselkoenig");
string sDialogResRef;
int bPrivateConversation;
int nPCGold = GetGold(oPC);
string sName;
while (GetIsObjectValid(oSchluessel) == TRUE || sName == "Koenig")
{
oSchluessel = GetObjectByTag("schluesselkoenig");
sName = GetName(oSchluessel);
}/*Öhm. Du weisst in diesem While zwei Variablen Werte zu.Allerdings gelten
Variablenzuweisungen vom Typ variable=Wert immer nur innerhalb
der {..} in denen sie stehen. D.h. die Wertzuweisungen gelten nur
innerhalb des Whiles.Da da aber gar nichts weiter damit gemacht wird
ist die ganze Whileschleife sinnlos .[und übrigens für NWN eine
Endlosschleife,egal ob das ganze irgendwann noch invalid wird oder
nicht, schliesslich kann man das nicht garantieren].

Die beiden Werte bleiben auf ihrem initialisierten Wert!*/
if (GetIsObjectValid(oSchluessel) == FALSE)
{
ActionStartConversation(oPC, sDialogResRef=("kath_inn_nein"), bPrivateConversation=TRUE);
}/*Das sDialogresref= weglassen. Es reicht den Wert hinzuschreiben (also "kath_inn_nein")*/
if ((sName == "Koenig")&&(nPCGold>100))
{
ActionGiveItem(oSchluessel,oPC);
TakeGoldFromCreature(100, oPC);
ActionStartConversation(oPC, sDialogResRef=("kath_inn_ja"), bPrivateConversation=TRUE);
}/*selbiges wie oben: einfach TRUE reicht vollkommen...Ausserdem ist
sName wie bereits erwähnt immer noch auf dem initialisierten Wert und der ist "".*/
}



Aber selbst wenn du die erwähnten Stellen korrigierst kann ich mit ziemlicher Sicherheit sagen, dass es nicht machen wird, was es machen soll.Du skriptest noch nicht allzulange,oder *nicht als Beleidigung verstehen ;)* ?
Deshalb mein Angebot:
Du erklärst mir was du genau von dem Skript willst.
Also: Wie wird bestimmt welchen Schlüssel der Mensch ausgibt?
Wenn du das machst hast du spätestens eine Stunde später ein fertiges Script, in dem ich auch erkläre, "warum" ich "was" mache.(Wenn du nicht gerade postest während ich schlafe ;) )
Je mehr du ins Detail erklärst was du willst, desto besser.

Ach ja: Mein erstes Tavernenskript hatte fast exakt dieselben Probleme wie deins, also Kopf hoch. Das wird schon :) !

Edit: oops, es lebe der Zeilenumbruch...


___________________________

Verliebt in den UserDefined Event ^^
Überzeugter Episode 2 Hasser[/font]
26.08.2002, 12:42 #3
Corky
Beiträge: 5

Erstmal Danke für die Hilfe!
Stimmt, ich mach das noch nicht lange. Aber wenn man es nicht selber probiert dann lernt man es auch nie! ;)
Hier meine genaue Vorstellung:
In dem Gasthaus gibt es vier unterschiedlich ausgestattete und auch vom Preis her variirende Zimmer.
Der Gastwirt fragt nun den PC welchen der vier Räume er denn mieten möchte. Hat der PC sich entschieden bezahlt der den Preis des Zimmers und erhält den richtigen Schlüssel der natürlich nur bei diesem Zimmer funktioniert (hab schon vier Schlüssel erstellt mit unterschiedlichem Tag und auch die Zimmer sind angeschlossen und mit unterschiedlichem Tag versehen)!
Natürlich muss der PC auch über die entsprechende Goldmenge verfügen.

So, ich hoffe das war verständlich erklärt...
26.08.2002, 13:45 #4
Rhaegar
Beiträge: 296

Ok.Einfachste Möglichkeit:

Du baust in den Dialog mit dem Dialogeditor vom Prinzip her so einen Dialogbaum ein:
code\:

-Spieler: "Ich hätte gern ein Zimmer!"
-NSC: "Was für eines, wir haben Teure,halbteure(:D), billige und ganz billige)
-Spieler: Ich nehme das Teure
-Nsc: Das macht 20 Gold!
-Spieler: Hier bitte! (*)
-NSC:Hier habt ihr den Schlüssel.(***)
-Spieler: Soviel habe ich nicht! (**)
-NSC: Dann bekommt ihr auch den Schlüssel nicht!
-Spieler: Ich nehme das halbteure!
-NSC: Das macht...
-Spieler:...
-Spieler:...
usw.




Natürlich kann der Spieler nun auch sagen er habe nicht soviel, obwohl er genug hat, oder "Hier bitte!" obwohl er nicht genug hat-

Deswegen brauchen wir die folgenden zwei Skripts, die wir in den jeweiligen "Text erscheint wenn..."-Feldern aufrufen:

(*):
code\:

int StartingConditional()
{
object oPC=GetPCSpeaker();
int nPCGold = GetGold(oPC);
int nRoomPrice=20; //(1)
int iResult;

iResult = (nPCGold>=nRoomPrice);
return iResult;
}



Das ist im wesentlichen einfach das Standardskript, das kommt, wenn man bei "Text erscheint wenn..." auf bearbeiten klickt, nur mit den zusätzlich nötigen Variablendeklarationen und als Bedingung eben (nPCGold>=nRoomPrice), was nur true liefert wenn man genug Gold dabei hat, um das Zimmer zu bezahlen.
An der Stelle (1) kannst du dann ganz einfach den Preis ändern, um das Skript für die anderen Zimmer zu benutzen.

Das entsprechende Skript für (**) sieht so aus:
code\:

[code]
int StartingConditional()
{
object oPC=GetPCSpeaker();
int nPCGold = GetGold(oPC);
int nRoomPrice=20; //(1)
int iResult;

iResult = (nPCGold<nRoomPrice);
return iResult;
}


Also einfach die Bedingung negiert.

Ok, jetzt kann der Spieler also "Hier bitte!" nur sagen, wenn er es auch bezahlen kann, ansonsten bleibt ihm nur"Soviel habe ich nicht!".

Jetzt müssen wir nur noch dafür sorgen, dass der Schlüssel und das Gold den Besitzer wechseln.

Dazu schreiben wir an Stelle (***) des Dialogbaumes ins "Erfolgte Aktionen" Feld folgendes Skript:
code\:

void main()
{object oPC = GetPCSpeaker();
object oSchluessel=GetObjectByTag("KEY");(1)
int nRoomPrice=20; //(2)

TakeGoldFromCreature(nRoomPrice,oPC);
ActionGiveItem(oSchluessel,oPC);
}



,wobei du für die Skripts der anderen Zimmer einfach bei (1) und (2) die jeweiligen Aenderungen eintragen musst!

Mist: hat länger als eine Stunde gedauert !


___________________________

Verliebt in den UserDefined Event ^^
Überzeugter Episode 2 Hasser[/font]
26.08.2002, 18:22 #5
Corky
Beiträge: 5

Vielen Dank! :)
Das Script funktioniert 1a! Hab die Teile einfach in meinen schon fertigen Gesprächsbaum eingefügt...
Und ich hab auch verstanden wie es funktioniet! ;)
26.08.2002, 18:51 #6
Rhaegar
Beiträge: 296

Freut mich zu hören.
Ich konnt's nämlich leider nicht selbst testen, weil mein Toolset heute Mittag ein wenig rumgezickt hat ;) !
Seite 1 von 1  1