[Editor1] Tingil's Scripting Thread

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
So, nun ist es bei mir so weit, daß meine Basteleien über einfaches Area Editing hinaus gehen und da werden sicherlich immer 'mal wieder ein paar Fragen auftauchen.

Mein erstes Problem betrifft eine Area Transition. Obwohl es ja eigentlich ganz einfach ist, eine Area Transition zu erstellen, tut sie dann leider doch nicht das, was sie tun soll, sprich: man kann sie nur in eine Richtung durchschreiten, obwohl ich sie so eingestellt hab', daß man sie in beide Richtungen durchschreiten kann. Hat jemand schonmal ein ähnliches Problem gehabt und gibt es vielleicht eine Lösung dafür? Das ist nämlich ziemlich dämlich, wenn die Charaktere aufgrund eines solchen Fehlers in einer Sackgasse sitzen.

Die zweite Frage bezieht sich auf Scripting. Gibt es eine Möglichkeit, z.B. durch ein Rest-Script, die natürliche Heilung eines Charakters zu steuern? Ich habe bisher nur ein (sehr einfaches) Rest-Script geschrieben, das dafür sort, daß während einer Rast 8 Stunden vergehen. Das würde ich gerne noch erweitern, und zwar so daß die Charaktere in dieser Zeit nicht voll geheilt werden, sondern nur die Anzahl an TP zurückgewinnen, die 1/3 ihrer Stufe entspricht. Dadurch würde das Ganze näher an die D&D-Regeln gebracht werden.
 
Zuletzt bearbeitet:

Hanah

Senior Member
Registriert
25.10.2001
Beiträge
397
Oft ist der Fehler bei Gebitsübergängen die Benennung. Namen sind nicht auf ein Gebiet beschränkt, sondern beziehen sich auf das gesamte Modul. Eine Möglichkeit, die Namen nicht doppelt zu vergebn, wäre, "gebietein" und "gebietaus" zu vergeben.
Bezüglich der Skripte (Ich habe bereits einmal einen Hinweis auf ein ähnliches Rest-Skript gsehen.) schau Dir doch mal das Ressourcen-Thread an.
 

Gala

Labyrinth-Leichnam
Registriert
20.11.2000
Beiträge
14.907
Tja, keine Ahnung, was du an der Area Transition falsch gemacht hast, ich hab einfach zwei Türen in zwei Areas gemacht und bin dann auf den Punkt 'Transiton erstellen' gegangen.

Und *zack* - schon hatte er als Ziel von Tür 1 die Tür 2 und als Ziel von Tür 2 die Tür 1 eingestellt.

Für deinen speziellen Fall würde ich btw das Hardcore Rule Pack empfehlen, Moment wo hatte ich das her *such*... hmm finde es leider gerade nicht. :(
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Das mit der Area Transition hat sich erledigt. Ich nehme an, der eine Auslöser war nicht richtig abgeschlossen (hab' ihn per Hand auf den Boden gemalt).

@Hanah: Danke für den Hinweis! Ich werd' in Zukunft darauf achten. :)

@Gala: Sowas wär' dann wahrscheinlich genau das Richtige :). Schade, daß Du den Link nicht mehr weißt. :(
 

Igor

Kobold-Kommando
Registriert
06.01.2002
Beiträge
73
Hier gibt es die HC RPG Skripte. Ich weiß nicht wie das da momentan aussieht, aber ich habe mal ein Modul gespielt was auf diesen Regeln basierte und da konnte man pro rasten nur 1 TP heilen. Das dürfte sich dann leicht umschreiben lassen. Ausserdem sind diese Regeln auch so recht interessant imho. :)
 

Theron

Kampfmagier
Registriert
01.04.2000
Beiträge
4.526
Bohar ohne Rasten würde ich ja voll ausrasten..:D
Bei schweren Modulen kann ich nach jedem Mittelschwerem Gegner rasten wenn der Char eigentlich noch nicht stark genug ist.
 

Gags

Headhunter
Registriert
11.07.2000
Beiträge
1.487
Oder du musst sehr viel Gold in Heiltränke Investieren. ;)

Schätze mal der Händler der die fertigt, kann dann getrost an die Börse gehen. :)

gruss Gags
 

Gala

Labyrinth-Leichnam
Registriert
20.11.2000
Beiträge
14.907
Ich persönlich empfinde HCR als äußerst mies:

- Meine geliebten Hexer sind endgültig für die Tonne. Ich habe nur ein Familiar, das sich nicht zum Kämpfen taugt, und mein Summon ist praktisch sofort wieder weg. Einen henchman kriege ich natürlich auch nicht. Dazu die begrenzte Auswahl an Magiesprüchen in NWN und Magiercharaktere sind endgültig nur noch für die Masochisten geeignet.

- Hingegen ein Kämpfercharakter, der hat durch HCR erstmal gar keine echten Nachteile, obwohl sie schon in der Standardkampagne besser sind als so ein magiebegabter Charakter.

- Viele neue Gegenstände, aaaaaaber dann auch so geniale Errungenschaften wie Potion of Healing, die sich nicht stapeln lassen.

- Die Bedienung wird auch komplizierter. Anstelle des normalen Suchens irgend so ein komisches Auge, das man dann tausendmal drücken darf. Na herzlichen Dank auch !

Freilich, runtergeladen habe ich mir HCR auch, schliesslich ist das eine dankenswerte Quelle von interessantem Code.

Aber für Tingil glaube ich genau das Richtige.
 

Igor

Kobold-Kommando
Registriert
06.01.2002
Beiträge
73
Nur um die HC RPG Regeln etwas zu verteidigen: Ich finde sie eigentlich ziemlich gut. Natürlich nur im MP, denn solo in der Kampagne kann man halt kein ordentliches RPG betreiben. ;)

- Meine geliebten Hexer sind endgültig für die Tonne. Ich habe nur ein Familiar, das sich nicht zum Kämpfen taugt, und mein Summon ist praktisch sofort wieder weg. Einen henchman kriege ich natürlich auch nicht. Dazu die begrenzte Auswahl an Magiesprüchen in NWN und Magiercharaktere sind endgültig nur noch für die Masochisten geeignet.

Ich muss zugeben den Magier noch nicht wirklich getestet zu haben, aber trifft das auf alle Summons zu? Ansonsten ist eben dieser Effekt beabsichtigt, damit man nicht nur Hack&Slay betreibt, sondern sich auch einfach mal eine Pause am Lagerfeuer gönnt. :)

- Hingegen ein Kämpfercharakter, der hat durch HCR erstmal gar keine echten Nachteile, obwohl sie schon in der Standardkampagne besser sind als so ein magiebegabter Charakter.

Dass Kämpfer in der Standart-Kampagne besser sein sollen sehe ich anders, aber darum gehts wohl nicht. ;)
Und in den HC RPG Regeln ist er sogar ohne Heiler verloren. Heiltränke kann man sich nicht allzuviele leisten, wenn es ein ordentliches Modul und was tut man dann? ...


- Viele neue Gegenstände, aaaaaaber dann auch so geniale Errungenschaften wie Potion of Healing, die sich nicht stapeln lassen.

Das stimmt schon, da wurde einiges nicht ganz ideal gelöst, aber normalerweise hat man so oder so wenig im Inventar, weil eben nicht an jeder Ecke eine Truhe steht. (ist zumindest bei fast allen HC RPG Modulen so)

- Die Bedienung wird auch komplizierter. Anstelle des normalen Suchens irgend so ein komisches Auge, das man dann tausendmal drücken darf. Na herzlichen Dank auch !

Durch legen in die Bereitschaftsleiste wirds besser, aber ich muss zugeben den Sinn dieses Dings auch nicht ganz verstanden zu haben...

Trotzdem sind die besten Module im Netz imho derzeit die, die auch HR RPG Regeln und dem damit verbundenen Rollenspiel setzen. :)
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
@Igor: Danke! :)

@Theron: Du kannst ja einfach so oft rasten, bis Du vollständig geheilt bist. :eek: :D ;)


Ich hab' sowieso nicht vor, das blind zu übernehmen. Mir geht es vielmehr um die Möglichkeiten, die die Scripts aufzeigen.
Ich hab' mir schon einiges 'runtergeladen, hatte aber noch nicht die Zeit, mir das 'mal anzuschauen.

Was die Summons angeht, so hat dieser Zauber ja nur eine Wirkungsdauer von 1 Runde/Stufe (1 Runde = 6 Sekunden). Ich weiß nicht, woran die bei diesem Patch diese Zeitspanne orientiert haben, aber wenn man mit der Standard-Zeitraffung spielt (2 Minuten = 1 Stunde, was übrigens noch schneller ist, als bei BG, wo galt 6 Minuten = 1 Stunde) und sagt, eine Runde ist 6 Sekunden lang, dann ist das Monster natürlich in null komma nix wieder weg. Das ist für mich aber eher weniger von Belang, da in meinen Modulen immer gelten wird 60 Minuten = 1 Stunde. (Wenn schon, denn schon! :D) Dafür benötigt man eben Zeit zum Rasten und zum Reisen. Der Grund dafür ist recht einfach: Egal welche Zeitraffung man einstellt, eine Kampfrunde ist immer 6 Sekunden in Realzeit und das entspricht auch den D&D Regeln. Wenn ich die Zeit nun z.B. 1:10 raffe (6 Minuten = 1 Stunde), dann wäre demnach eine Kampfrunde zwar noch 6 Sekunden Realzeit, aber 1 Minute Spielzeit, was schon ziemlich dämlich ist.
Der Nachteil der Summons bei NwN ist natürlich auch, daß man sich nicht aussuchen kann, welches Wesen man herbeizaubert und daß man auch immer nur ein Wesen herbeizaubern kann. Einer der Patches verspricht ja dieses an die Regeln anzupassen und wenn dem so ist, dann kann ich da eigentlich nichts dagegen haben, denn mit diesen Zauber kann man ja eigentlich mehr herbeizaubern als irgendwelche Schreckensviehcher. Mit dem 2. Grad Zauber kann man z.B. einen Lemur (Teufel) herbeizaubern und mit dem 3. Grad Zauber sogar einen Dretch (niederer Tanar'ri). Das die nicht viel bringen, wenn sie nicht lange halten, ist klar, aber normalerweise zieht man als Magier ja nicht allein durch die Gegend ;) und solche Summons sind in der Regel dafür da, um Gegner kurzzeitig zu beschäftigen.


Noch eine Frage zum Rasten im MP: Wie ist das da? Kann man da unabhängig voneinander rasten, oder rasten automatisch alle, wenn einer auf den Rasten-Knopf drückt?
Wenn ersteres der Fall ist, wäre ein Rasten-Skript, das Zeit vergehen läßt, nämlich ziemlich dämlich. :rolleyes:

Noch ein paar weitere Fragen:

1.) Kann ich in einem Modul von Haus aus spawnen verhindern?

2.) Gibt es eine Möglichkeit, Gebietsübergänge so zu schaffen, daß sie immer nur von allen Spielern gleichzeitig benutzt werden können... also a la "Sie müssen ihre Gruppe erst sammeln..." :D...
Stichwort: Reisezeiten; selbes Problem wie bei den Zeitkosten für's Rasten.
 

Igor

Kobold-Kommando
Registriert
06.01.2002
Beiträge
73
Also Rasten kann normalerweise jeder einzeln. Aber das kann man vielleicht umgehen, indem man das zB mit einem Lagerfeuer löst. Einer eröffnet ein Lagerfeuer und es wird erst gerastet, wenn alle drumherum sitzen.

Bei den Gebietsübergängen einfach davor eine Area setzen und dann den Gebietsübergang nur erlauben, wenn alle Partymitglieder in diesem Gebiet sind und die ganze Party springen lassen.

Bei beiden Sachen müsste man allerdings die Spieleranzahl abfragen und weiterverwenden können und ich weiß nicht ob dass so ohne weiteres geht. Ausserdem dürfte es natürlich nur eine Gruppe geben. ;)
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Das mit dem Lagerfeuer ist 'ne gute Idee. In Gasthäusern kann man dafür ja Tigger auf die Zimmerböden legen und überprüfen, ob jeder in einem Zimmer ist.
Was den Gebietsübergang angeht, kann man dann wohl auch einfach einen großen, unsichtbaren Tigger dahin setzen und überprüfen, ob alle drauf stehen.
Die Spieleranzahl abzufragen ist da bei beiden Dingen in der Tat ein Problem. Bisher hab' ich noch keine Funktion dafür gesehen. :(

A propos: Bin ich blind, oder gibt's auch keine Funktion, um zu überprüfen, ob eine Kreatur einen bestimmten Zauber wirken kann? Ich bastele nämlich gerade an 'nem Priester, der per Dialog Heilzauber (gegen Geld) auf den PCSpeaker wirkt. Da wäre es praktisch, vorher zu überprüfen, ob er den Zauber überhaupt noch kann, damit man diese Dialogoption ggf. abschalten kann. Sonst zahlt der SC Geld und bekommt keinen Zauber dafür. :rolleyes:
 

Hanah

Senior Member
Registriert
25.10.2001
Beiträge
397
Vorsichtshalber den Priester als Selbsterstellte Kreatur anlegen. Da kann man ihm den notwendigen Zauber dazugeben. Ansonsten kann man auch recht einfach einen "Heilbrunnen" erstellen, der das gleiche macht. Der Priester verweist dann auf den Brunnen und die Sache ist gegessen.
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
@Hanah: Ich möchte aber gerade, daß die Anzahl an Heilzaubern, die die SC von diesem Priester bekommen können, begrenzt ist ;) und natürlich hab' ich den Priester selbst erstellt. :)


Hab' inzwischen 'ne Funktion gefunden (GetHasSpell), aber kann es sein, daß man einem Dialogpunkt nicht eine Startbedingung UND eine Aktion zuordnen kann? Ich hab' z.B. folgende Kombination in einem Dialogpunkt:


Code:
int StartingConditional()
{
    int iResult;

    iResult = GetHasSpell(SPELL_CURE_MINOR_WOUNDS) > 0;
    return iResult;
}


...und...


Code:
void main()
{
    if(GetGold(GetPCSpeaker()) >= 15)
    {
        TakeGoldFromCreature(15, GetPCSpeaker());
        ActionCastSpellAtObject(SPELL_CURE_MINOR_WOUNDS, GetPCSpeaker());
    }
    else
    {
    SetLocalInt(GetPCSpeaker(), "NoGold", 1);
    }
}


Letzteres allein funktioniert und die Startbedingung scheint auch zu funktionieren. Es scheint so, als würde er das zweite Skript einfach ignorieren. :confused:
 
Zuletzt bearbeitet:

Silpion

Traumtänzer
Registriert
10.04.2001
Beiträge
2.104
Ich habe in dem Modul an dem ich zur Zeit bastle öfter, dass eine Startbedingung und eine Action angegeben sind, aber das gab nie irgendwelche Probleme.
Hast du zufällig Version 1.22 oder 1.23 und der Dialogpunkt beendet gleichzeitig das Gespräch? Dann geh mal auf die letzte Karte ('current file') und entferne die Scripts, die bei Ende des Gesprächs gestartet werden.
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
@Silpion: Danke, das habe ich gerade eben auch im BioWare Scripting-Forum gelesen. Verfluchte Bugs!
Damit funktioniert's aber leider immer noch nicht vollständig. Wahrscheinlich muß ich ein wenig weiter ausholen:
Also, ich bin in dem Dialog an einem Punkt, an dem der Spieler sich entscheiden muß, welchen Heilzauber der Priester auf ihn wirken soll. Er hat die Auswahl zwischen "Kleinere Wunden heilen", "Leichte Wunden heilen", "Mittelschwere Wunden heilen" und es bleiben zu lassen. (Der Kleriker ist nur Stufe 3 und es handelt sich dabei um ein Abenteuer für Charaktere der 1. Stufe.) Genau auf diese ersten drei Auswahlpunkte beziehen sich die Skripte, die im Prinzip ja alle gleich aufgebaut sind. Der einzige Unterschied ist eben der Zauber, der dann letztendlich gewirkt wird und der Geldbetrag, den der Spieler dafür berappen muß.
Es sieht nun so aus, daß das Skript des ersten Menüpunktes einwandfrei funktioniert (der Menüpunkt wird auch korrekt ausgeblendet, wenn dem Priester der entsprechende Spruch ausgeht). Bei den anderen Menüpunkten tut sich hingegen gar nichts. Die Startbedingung funktioniert wohl, aber das Skript scheint einfach ignoriert zu werden und zwar vollständig. Es wird dem Charakter weder Geld abgenommen, noch wird ein Zauber auf ihn gewirkt, obwohl er genug Geld dabei hat. Ich schätze, irgendwas beißt sich da gewaltig. :(
 

Hanah

Senior Member
Registriert
25.10.2001
Beiträge
397
Ich bin mir nicht sicher, wie es geht, aber man kann wohl im Script auch auf die einzelnen Punkte des Dialoges hinweisen. Dann würdest Du alle Optionen in ein Script einbauen können und es nur einmal starten müssen.
 

Silpion

Traumtänzer
Registriert
10.04.2001
Beiträge
2.104
Mir fällt zwar nichts ein, warum es nicht gehen sollte, aber versuch mal die Aktion später zu starten, also in etwa so (bei Test1 bzw. Test2):
Code:
+ PC: "Ich will Zauber XY" (Startbedingung)
   |
   + NPC: "Gut, dann haltet bitte still, während ich den Spruch spreche."
     |   (Aktion - Test1)
     |
     + PC: "" (End Dialog, Aktion - Test2)
An dem Bug den ich genannt hatte bzw. der ja im offiziellen Forum aufgelistet ist kann es nicht liegen, dann würde dem Charakter zumindest das Geld abgezogen werden.

@ Hanah:
Das müsste gehen, aber der einzige Weg dazu, der mir jetzt einfällt, ist, indem du dann schon bei der Auswahl eine Variable setzt, und dafür benötigst du auch ein Script, das ausgeführt werden muss. :(
 

Vernochan

Schabrackentapir
Registriert
09.07.2001
Beiträge
8.882
Moin...

Hmm.. also das Problem ( Wie ich es sehe ) besteht in darin, das er beides machen soll, das aber nicht macht, weil es in verscheidenden Funktionen steht... Und er nicht beide aufrufen kann..

Versuch das ganze doch mal so zu machen, das du die StartingConditional IND die main Funktion reinschreibst und dann mit Hilfe einer IF Verknüpfung das zu verbinden...

Also ungefähr nach dem Motto:

Code:
int iResult;

if ( GetHasSpell(SPELL_CURE_MINOR_WOUNDS) > 0 ) {

      if(GetGold(GetPCSpeaker()) >= 15)
    {
        TakeGoldFromCreature(15, GetPCSpeaker());
        ActionCastSpellAtObject(SPELL_CURE_MINOR_WOUNDS, GetPCSpeaker());
    }
    else
    {
    SetLocalInt(GetPCSpeaker(), "NoGold", 1);
    }

}


Also ich will jetzt mal nicht so tun, als ich viel vom NWN Scripten verstehe... Ich kenne mich nur in der Programmiersprache C recht gut aus... und das Prinzip ist genau das selbe... nur die Funktionsnamen nicht.... ;)

Also so könnte ich mir vorstellen das es funktioniert... ( wahrscheinlich muss da noch etwas angepasst werden... aber so in der Theorie... könnte es so funktionieren....

Jedoch bin ich mir jetzt net ganz sicher, wie genau du es haben willst.. Probier am besten einfach mal ein wenig aus...

Die Grundsätzliche Funktionsweise einer IF Verknüpfung ist immer folgende:

Code:
if ( [Wert oder Funktions- Rückgabewert] [ == (genau gleich), < , > , >=  , <= ]  [Zahl/Konstante])
{
AUSFÜHRUNG ( z.B. einen Wert in einer Variable erhöhen, oder eine Funktion ausführen.
}
else if (  [Wert oder Funktions- Rückgabewert] [ == , < , > , >= , <=] [andere Zahl/Konstante]
{
AUSFÜHRUNG 2 ( Beispiel wie oben.. )
}
else
{
AUSFÜHRUNG 3 ( Beispiel wie oben.. )
}

Das mit dem "else if" kann man dann auch beliebig vorsetzten.... :)

( Kleines anwendungs Beispiel aus einem Programm, das ich geschrieben habe. wenn man ein Menu programmiert ( auf ASCII Basis natürlich.. *g* ) und dann eine Auswahl nach Tasten macht... also
if ( taste == 1 ) { blablabla }
if ( taste == 2 ) { blablabla }
...
...
if ( taste == 7 ) { blablabla }
if ( taste == Q ) { blablabla }
Also wirklich undenkbar weiter zu setzen... :)

Gut.. ich weiß jetzt nicht in wiefern du das mit dem if kennst oder nicht.. ich bin jetzt mal davon ausgegangen, das das hier einer liest, der keine Ahnung davon hat.. :)

na ja.. ich hoffe das hat dir geholfen... Wenn ja, dann sag mir bitte Bescheid.. Damit ich sehen kann, wie groß die Unterschiede zwischen C und dem NWN Scripting ist... ;)


Auf ein schönes rumprobieren ;)
Bis denne, Patrick

[EDIT]
Wie das mit dem == für genau gleich aussieht, weiss ichi beim scripten nicht.. ich habe das jetzt gemacht wie bei C... da steht das == für ein genau gleich einer abfrage und ein = für eine Wert zuweisung.
[/EDIT]
 
Zuletzt bearbeitet:

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
@Silpion: Ja, so in der Art hab' ich das jetzt gemacht und nun funktioniert's. :)

@Vernochan: Ich kann zwar (noch) kein C, aber TurboPascal. ;) :D
Gibt es kein <> (ungleich)? Und was für boolische Operationen gibt's? Bisher kenne ich nur das "und" (&&). Was ist "oder" und was ist "nicht"?


PS: Ich hab' mir das Rest-Script von den HCR 'mal angeschaut, aber das ist ja so vollgeknallt von Extra-Zeug... das was das alles unterstützt brauche ich gar nicht, im Gegenteil: Das erschwert die Lesbarkeit ungemein. Ich hab' mir daraus zwar 'mal ein paar Anregungen geholt, aber irgendwie funktioniert's trotzdem nicht. Das Standart-Rest-Skript der Engine scheint mein Skript einfach zu überschreiben. Kann mir vielleicht jemand erklären, wie die von den HCR es hinbekommen haben, daß das bei ihnen nicht passiert? Das wäre eine sehr, sehr große Hilfe, denn Ideen zur konkreten Umsetzung habe ich schon, aber das hängt alles daran, daß die meisten Anweisungen (z.B. Effekt Blindheit/Taubheit) in meinem Skript einfach von der Engine überschrieben werden.
Was mir auch noch gleich am Anfang aufgefallen ist, daß dieses OnPlayerRest scheinbar zweimal aufgerufen wird. Einmal am Anfang der Rast und einmal am Ende. Kann mir jemand sagen, warum das so ist, wie ich das umgehen kann und am besten, wie ich dieses von der Engine vorgegebene Skript umgehe?
Ich hab' da irgendwas von "Events" läuten hören. Weiß jemand, was ich mir darunter vorstellen muß?
 
Zuletzt bearbeitet:
Oben