[Modding] Scripts für NPC-Mod und NPC Design

Romin

Member
Registriert
24.10.2011
Beiträge
43
Ah sch***

Noch was anderes über das ich auch noch nichts gefunden habe:
Wie schlimm ist es, wenn man in einem Dialog "viele" "LOCALS" benutzt? Die Dinger sind schön um "lebhaften" Gesprächsverlauf zu erzeugen (Thema schonmal angesprochen->Erhöhe Variable ...), aber in wie weit stören sie die Performance?
Gut, meine Variablen sind jetzt nur in dem Dialog den man vor der Aufnahme führt (welcher, wenn ich es richtig verstehe derselbe ist, der bei der Wiederaufnahme gestartet wird) und werden dann nicht mehr gebraucht, aber leben die trotzdem als Leichen irgendwo im Speicher weiter?

Mal wieder ein Danke und Gruß
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
982
Nimm soviele Locals, wie du brauchst. Ich glaube das macht nix, viele Globals hingegen ziehen an der Performance :)
 

Romin

Member
Registriert
24.10.2011
Beiträge
43
Und immer noch mehr Fragen

Hallo zusammen - mal wieder

Heute muss ich der hiesigen Community mit zwei neuen Fragen(blöcken) auf die Nerven fallen:

Vorab (falls es wichtig ist): Ich habe BWP in minimaler Installation mit minimalen Zusätzen drauf (Gavin, Breagar und der ein oder andere NPC).

1. Ich habe angefangen für meinen NPC Banter zu schreiben. Zu Testzwecken erstmal nur für Imoen (sitze in Beregost, dort kann ich ihn mitnehmen, danach soll er bantern). Nun weiß ich, dass die gute Imi irgendwie kein richtiges Banterfile haben soll, oder so. Jedenfalls habe ich in das Banterfile meines Chars (es heißt "NPCName"B.d) per CHAIN einen Banter eingefügt. Falls ich dabei auf IMOEN2J verweise kommt der Banter sowohl, wenn "Banter-Zeit" ist, als auch wenn ich es per Skript forciere, warum aber nicht, wenn ich das BIMOEN File nehme. Mit NearInfintiy habe ich gesehen, dass in letzterem File durchaus Banter oder sowas drinstehen. Wie also vorgehen?

2. Jetzt gehts um den Transport von meinem NPC. Der soll in Kerzenburg auftauchen (per Areaskript wird er erschaffen, wenn man in Winthrops 1.Stock geht), mit dem PC plaudern (dabei werden im .d LOCALS gesetzt, die ich später, wenn man ihn in sonstwo in die Party aufnimmt noch korrekt vorhanden sein sollen). Klar ist mir, dass ich den NPC per MoveBetweenAreas(...) aus dem Gespräch heraus nach sonstwo schicken kann, das funktioniert auch bestens (wie hab ich mich gefreut, als ichs getestet hab und sogar die LOCALS anstandslos da waren...). Was aber wenn ich ihn nicht per Gesprächsoption wegbeamen will? Etwa wenn er während des ganzen Tutorials/Prologs im ersten Stock von Winthrops rumhängen soll und erst mit verlassen Kerzenburgs (oder betreten der Region in der er auftauchen soll) an einem neuen Ort auftauchen soll?
Habe schon versucht das ins Player1D.baf reinzupacken (if AR==dieRichtige then MoveGlobal/MoveBetween...) aber das funktioniert nicht; auch nicht, wenn ich beim Erschaffen des Charakters gleich nach "CreateCreature..." ein "ActionOverride("NPC_DV",MakeGlobal())" anhänge...

Viele Fragen, langes BlaBla. Ich hoffe ich habe mich soweit wenigstens verständlich ausgedückt.

Vielen Dank schonmal (wieder)
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
982
zu 1: Die richtige Datei ist die BIMOEN2

zu 2: Die Sache mit MakeGlobal(), MoveGlobal() müsste eigentlich schon klappen, würde ich aber im entsprechenden Areascript machen.

Grundsätzlich würde ich das ganz anders aufziehen: Einfach nochmal per CreateCreature() den Charakter neu spawnen. Für diese "Kopie" des NPCs sind dann allerdings die LOCALS und solche Dinge wie NumTimesTalkedTo() wieder auf 0 gestellt!

Du musst auch für den NPC in Kerzenburg überhaupt nicht dieselbe CRE verwenden wie für den NPC, der dann später in die Gruppe kommt. Das könnte auch nur so eine Art "Dummy" sein, eine CRE, die genauso aussieht wie der NPC.

Gruß Jarl
 

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Mit den locals musst du aber vorsichtig sein. Sowohl beim setzen als auch beim Abfragen. Die sind nämlich recht beschränkt. ^^
 

Romin

Member
Registriert
24.10.2011
Beiträge
43
Hallo ehrwürdiger Jarl, danke für die schnelle Antwort.

zum 1ten: Sorry, hatte mich wohl verschrieben, ich habe auch die BIMOEN2 gemeint und versucht. Wenn ich diesen Banter starten möchte (per Skript), dann sagt mein NPC zwar seinen Teil, die erste Zeile, allerdings endet das Gespräch damit auch wieder... so schaut mein NPC_B-File aus.

Code:
BEGIN MeinNPCB_File

IF ~Cond~ THEN MeinNPCB_File ImiSagWas
    ~NPC sagt was, was auch kommt~ DO ~setze !Cond~
    == ~BIMOEN2~  ~Ich bin Imoen aber diese Zeile kommt nicht.~
    == ~MeinNPCB_File~ ~BlaBla - kommt auch nicht~
EXIT
Um es nochmal zu betonen, der obige Code funktioniert wenn ich BIMOEN2 durch IMOEN2J ersetze - für meine Logik schließt das irgendwelche Code-Fehler eigentlich aus... oder nicht?!?

zum 2ten: Tja, werde einfach noch länger mit den MakeGlobal, MoveGlobal rumspielen; Zur Not .cre-ate ich einfach neu, ist natürlich einfacher (aber die LOCALS haben, wäre eben lustig).

Gruß,
Romin

EDIT: Kommata und Vergessenes ergänzt.
EDIT2. Wedges Antwort zu spät gesehen...
EDIT3: Unter den Code noch Bemerkung hinzugefügt. Außerdem Dank an Sir Darian für die CodeBox - hab ich vergessen!

@Wedge: Was meinst Du mit LOCALS sind beschränkt?
 
Zuletzt bearbeitet:

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Das da kann nicht funktionieren. Du musst entweder mit States arbeiten oder mit einer Chain. Und für keines von beiden ist der Code da richtig. ^^

Beispiel für eine CHAIN, welche ich empfehlen würde:
Code:
CHAIN
IF ~Global("PWWyrmsBanter","LOCALS",2)~ THEN PWwedB WyrmsBanter1
~Kommt hier noch jemandem diese Brücke bekannt vor?~ DO ~SetGlobal("PWWyrmsBanter","LOCALS",3)~
== BIMOEN2 IF ~InParty("Imoen2") InMyArea("Imoen2") !StateCheck("Imoen2",CD_STATE_NOTVALID)~ THEN ~Ich schätze, für Euch Gnome sehen alle Brücken gleich aus, weil Ihr sie immer nur von unten seht...~
== PWwedB IF ~InParty("Imoen2") InMyArea("Imoen2") !StateCheck("Imoen2",CD_STATE_NOTVALID)~ THEN ~Ich schätze, ich werde gleich sauer...~
== PWeliB ~Wovon redest du?~
END
+ ~Global("PWwedgotcold","GLOBAL",2)~ + ~Vielleicht ist er immer noch im Fieberwahn...~ + WyrmsBanter1.1
++ ~Das weiß er allein.~ + WyrmsBanter1.2
++ ~Ja, kommt sie in der Tat.~ EXTERN PWeliB WyrmsBanter1.3
++ ~Nein, mir kommt sie nicht bekannt vor.~ + WyrmsBanter1.4
++ ~Können wir bitte weitergehen? Ich habe keine Lust auf Euer Geschnatter.~ + WyrmsBanter1.5
 

Romin

Member
Registriert
24.10.2011
Beiträge
43
Woah, langsam nerven meine Leichtsinnsfehler... vor allem, weil sie mir nur beim posten passieren: In obigem Codestück gehört natürlich ein CHAIN zwischen dem ersten BEGIN und das erste IF. Dann funktioniert's aber wirklich, habe es gerade nochmal compiliert und getestet. (Allerdings habe ich oben unwichtiges in PseudoCode gesteckt; d.h. mein "Cond" steht für mehrere Bedingungen, aber ich denke das ist klar.)

Danke trotzdem für die netten Anworten. Darf ich nochmal fragen, wie Du, Wedge, das mit den locals gemeint hast?

Gruß, Romin
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
982
zum 2ten: Tja, werde einfach noch länger mit den MakeGlobal, MoveGlobal rumspielen; Zur Not .cre-ate ich einfach neu, ist natürlich einfacher (aber die LOCALS haben, wäre eben lustig).

Mir fällt gerade ein: Es wäre sogar besser mit CreateCreature() und einem Dummy in Kerzenburg zu arbeiten:
1. Wenn der Spieler deinen NPC gar nicht in Kerzenburg anspricht, sondern sofort losreist.
2. Wenn du eine Anpassung der Charakterstufe einbauen willst, wie es auch bei den Bioware-NPCs ist.

Gruß Jarl
 

Romin

Member
Registriert
24.10.2011
Beiträge
43
zu 1: Der Punkt wäre nicht so schlimm, das ist quasi miteingerechnet- der Spieler hat (z.B.) schlimmstenfalls verpasst, dass Seamus (das ist der Name des NPC) beim Wiedersehen mit MC nicht sagt: "Ah du bist doch der, der mich unter den Tisch gesoffen hat." oder so ähnlich.

zu 2: Dazu hab' ich auch gleich (mal wieder) eine Frage: Gibt es eine Funktion dafür? Im BWP bekommen ja alle NPCs die ich in die Party die XP die MC hat (und zwar immer lustig mit +300, +300, +300, -100 usw. bis es etwa passt - warum wird das eigentlich so geregelt, gibt es keine Möglichkeit die XP auszulesen?). Oder muss man sowas selber implementieren (was ja auch nicht schwer wäre: habe bei Gavin-Mod gesehen, dass das über den Aufnahme-Dialog gesteuert werden kann).

Gruß,
Romin
 
Zuletzt bearbeitet:

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
1.
XP-Anpassung geht z.b. übers Override-Script des entsprechende NPCs. Sowas hier funzt beispielsweise:
Code:
IF
InParty(Myself)
XPLT(Player1,1000)
Global("PWeliXPadjust","LOCALS",0)
!Global("EndOfBG1","GLOBAL",2)
THEN
RESPONSE #100
SetGlobal("PWeliXPadjust","LOCALS",1)
END

IF
InParty(Myself)
XPGT(Player1,1000)
XPLT(Player1,3000)
Global("PWeliXPadjust","LOCALS",0)
!Global("EndOfBG1","GLOBAL",2)
THEN
RESPONSE #100
SetGlobal("PWeliXPadjust","LOCALS",1)
AddXPObject(Myself,1000)
END

etc. pp.


2.
Zu 90% ist es wesentlich besser, wenn du einen Dummy benutzt für alles was außerhalb der Gruppe mit deinem NPC passiert. Wenn du z.B. eine erste Begegnung mit dem NPC in einer Kneipe hast und ihn dann verschwinden lässt, bevor die Spieler ihn zwei Karten weiter in die Gruppe aufnehmen können, dann benutz auf jedenfall einen Dummy. Das erspart dir viel, viel, viel Mühe und Ärger. Wenn du deinen NPC mitten drinne irgendwo hinschicken willst und die Gruppe ein Nebenquest ohne ihn machen muss, dann verschieb ihn in die Area, deaktiviere ihn und arbeite mit einem Dummy. Und so weiter und so fort.

Wenn du deinen NPC per Areapatching in die Area reinhaust, er da aber noch nicht joined, sondern irgendwo anders hingeht, würde ich auch hier mit einem Dummy arbeiten. Die Teile lassen sich mit fünf Zeilen in der TP2 erstellen und sind zum Verschleiß gedacht. ^^


3.
LOCALS sind so eine Sache. Erstmal ist es so, dass die IE nicht für riesige Massen an globalen Variablen ausgelegt ist. Auch mit modernen PCs gibt das Ruckelprobleme. Der Grund dafür ist, dass die diversen ständig aktiven Scripte immer alle globalen Variablen abfragen bis sie ein true bekommen. Wenn du 20000 GLOBALs hast, dann hast du gleichzeitig auch den Salat. ^^

Der Vorteil ist natürlich, dass die GLOBAL von allem und jedem abgefragt und gesetzt werden kann.

Lokale Variablen hingegen sind kreaturspezifisch. 100 Kreaturen können dieselbe LOCALS haben - in Spiel ist das z.b. die NumTimesTalkedTo, die immer lokal für die Kreatur inkrementiert wird, wenn man sie anspricht. Sie müssen exakt von der Kreatur gesetzt werden, für die sie gelten sollen und können ausschließlich von der Kreatur ausgelesen werden, die sie hat. Wenn du also 789 lokale Variablen auf deinem NPC hast, ist das vollkommen uninteressant, weil kein anderes Script außer dein NPC-Override die durchackert.

Der Nachteil ist aber natürlich zum einen, dass alle Variablen weg sind, wenn die Kreatur weg ist. Unwiederruflich. Wenn also jemand durch nen Bug den NPC verliert und dann mit CLUAConsole:CreateCreature("blamuh") nen neuen erschafft, ist der gesammelte Spielfortschritt weg. Das ist natürlich ein Extremfall.

Viel wichtiger, einschränkender und aktueller ist allerdings die Tatsache, dass du mehr oder weniger ALLES über dein Override-Script lösen musst. Da niemand außer dem NPC seine Variablen abfragen kann, kann auch niemand mit denen irgendwas triggern. Das führt dann dazu, dass du manchmal recht abenteuerliche Scriptkonstruktionen basteln musst, die über 3 Ecken irgendwas auslösen.

Eine weitere Schwierigkeit kommt beim Programmieren dazu. Wenn du mit CHAINs arbeitest, werden lokale Variablen immer auf die Kreatur gesetzt, die die CHAIN eröffnet, nicht auf die Kreatur, hinter der das DO steht. Mit dem Abfragen war da auch irgendwas. Wenn du z.B. einen Banter von Imoen mit deinem NPC eröffnen lässt und mitten drinne eine Extrazeile kommt, wenn der NPC eine lokale Variable gesetzt hat, dann ging das nur du im String vorher schon auf dem NPC bist oder sowas in der Art. Ist schon ne weile her, dass ich mich mit den genauen Schwierigkeiten da beschäftigt habe. Alternativ müsste man die CHAIN halt aufsplitten. Oder an der Stelle einen normalen State reinquetschen oder sowas.

Gibt halt viele Möglichkeiten, aber sie alle sind irgendwie mit mehr Mühe und Tipperei verbunden als es nötig wäre, wenn man einfach GLOBALs benutzen würde. ^^
 
Zuletzt bearbeitet:

Romin

Member
Registriert
24.10.2011
Beiträge
43
Wow, das war eine lange Antwort zu später Stunde (wenn zu MEZ geschrieben.)

Zunächst einmal Danke für die vielen Einsichten in die Spielmechanik, sozusagen.

Zu 3. Ich mache (oder wollte es machen) deshalb so viel über LOCALS, weil man damit einen NPC, bzw. seinen Charakter recht gut modelieren kann; er merkt sich eben viele Dinge aus den Gesprächen, die man geführt hat. Das ist auf jeden Fall eine Heidenarbeit, macht aber auch Spaß, wenn man das Ergebnis sieht und der NPC Dinge sagt, die spürbar von dem abhängig sind was man als Spieler zu ihm gesagt hat. Und auf der anderen Seite war mir sehr daran gelegen ein absolutes Minimum an globalen Variablen zu verwenden, einfach weil es in einer großen Installation spürbar ist (hatte selbst schon gefühlte 1000 mal Ruckelprobleme; erwarte es schon, wenn in in BGI nach Baldurs Tor komme und bin überrascht wenn es mal nicht passiert).

Zu 2. Ich denke ich werde wirklich den Dummy-Weg wählen, ist in der Tat einfacher, ich gebe euch allen ja recht :D

Aus den (genannten) Punkten 2+3 heraus kann man natürlich einen Kompromis finden: Nach dem Treffen in Kerzenburg wird genau eine GLOBAL gesetzt deren Wertebereich vom Gesprächsverlauf abhängt (z.B. könnte das Gespräch 5 verschiedene Ausgänge haben: einmal hatte man eine nette Zeit, das andere mal hat MC Seamus beleidigt - ich sag nur "Dosenkopf" Seamus ist immer noch ein Paladin :) ).
Gib es eine Faustregel, die was über die Anzahl an Globals die man verwenden sollte sagt (ich meine außer: je weniger, desto besser). Wieviele Globals verwenden "gute" Mods (damit meine ich die, die selten Probleme machen, nicht unbedingt inhaltlich gut) denn so ungefähr? 5, 10, 100? Eine Größenordnung wäre nett zu wissen (aber bitte niemand jetzt im Mod nachzählen gehen :D, eine grobe Schätzung von erfahrener Seite wäre nett).

Zu 1: Danke für den Code; so macht Gavins Autor das glaube ich auch.

Nochmals Dank an alle beteiligten Hilfesteller für ihre Zeit und Mühen!
Gruß, Romin
 

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Schau mal in der Breagar-Installation nach der ACVIRGI.BAF - so hab ich das gelöst, das ist der Level 1 NPC Weg über eine Hilfsfigur.
 

Romin

Member
Registriert
24.10.2011
Beiträge
43
Hallo Ascalon!

@ACVIRGI.BAF: Hab's angeschaut! Ganz schön feine (i.S.v. genau, meine ich) Unterteilung der XP. Aber der Weg über eine Hilfsfigur ist cool, daran hatte ich gar nicht gedacht.
(Ich hatte Breagar bislang immer sehr frühzeitig dabei, wie ist das eigentlich: Der kriegt der nur die XP und wird vom Spieler selbst aufgestuft; also nicht von dir bis zur entsprechenden Stufe gesteigert?)

Wo Du schonmal da bist, Ascalon: Gibt es einen Grund das Breagars Banter-File AC*B.d heißt. Auf anderen Tutorial Seiten finde ich immer nur die Konvention B*.d? Und gleich noch ne Frage: Weiter oben hab ich ein Problem geschildert mit dem BanterFile von unserer kleinen, geliebten Imoen - bei mir funktionieren Banter nur mit IMOEN2J und nicht BIMOEN2...

Danke und Gruß,
Romin

EDIT: Und noch was: Warum hast du (Ascalon) bei CheckStatGT die StatNr 44 verwendet anstelle von "XP" (ohne " " natürlich :) ). Ich nehme an das wird schneller verarbeitet?
 
Zuletzt bearbeitet:

Ascalon

Senior Member
Registriert
08.04.2008
Beiträge
2.730
Zur ersten Frage: Genau so ist es.

Zur zweiten Frage: Wie die Banter-Datei heißt ist eigentlich egal, ich hab das B nach hinten gesetzt damit das Präfix AC bestehen bleibt. In der TP2 steht folgendes:

Code:
APPEND ~pdialog.2da~
~ACBre ACBreP ACBreJ ACBreD ACBre25P ACBre25J ACBre25D ACBre25~
UNLESS ~ACBre~

APPEND ~interdia.2da~
~ACBre ACBreB ACBre25B~
UNLESS ~ACBre~

Das wirst du schon auf die eine oder andere Weise gesehen haben. Das bedeutet einfach: In die beiden Tabellen pdialog und interdia wird eine Textzeile eingefügt, die dem Programm sagt welche .D Datei zu welchem Anlass angesteuert werden soll. In der pdialog.2da steht der Reihenfolge nach:

- Der Name (DV) der Figur
- Der Rauswurfdialog (P), der angesteuert wird wenn der Charakter mal Teil der Gruppe war
- Der Joined-Dialog (J), Wenn der Charakter in der Gruppe ist, angesprochen wird oder mittels StartDialogNoSet() und ähnlichem was sagen soll
- Das DreamScript (D), das ein SKRIPT und kein DIALOG ist. Dieses Skript wird abgefragt wenn gerastet wird
- und dann das ganze nochmal mit der Nummer 25 für Thron des Bhaal

Da ist es ganz egal wie die heißen, die könnten auch Horst, Kai-Uwe oder AcBreZ heißen, so lange eine entsprechende Datei gefunden wird. Es hat sich halt nur durchgesetzt, dass man die Bezeichnungne beibehält.

Und was den Checkstate angeht: Der ist drin weil ich den Code 1:1 aus dem Code von Level1-NPC gecopypastet hab und dann nur mittels Suchen&Ersetzen Breagars Namen eingesetzt hab. :D

Natürlich nachdem ich mir die Erlaubnis des Codeautors geholt hab.
 

Romin

Member
Registriert
24.10.2011
Beiträge
43
@File-Nomenklatur: Ah, Danke, habe ich mir auch schon gedacht, dass es nur auf den pdialog/interdia-Teil im *tp2 ankommt. Ich persönlich finde es, wenn man schon die Modder-Präfixe benutzt auch nicht so schön, das B vorzustellen (hab's selber auch nicht so gehandhabt, sondern es nachgestellt).

@checkstate: Ah, so. Naja, wenn man so einen recht professionellen Mod durchsieht, dann meint man als Anfänger auch, dass alles gecodete einen tieferen Sinn verfolgt.

@C-c,C-p: Natürlich hatte ich auch vor um Erlaubnis zu fragen ;) und natürlich kommen alle Helfer, wenn der Mod mal soweit kommt, dass er spielbar ist, in die Danksagungen. :)

Gruß, Romin
 

Wedge

Wedgetarian
Registriert
04.07.2007
Beiträge
9.373
Wieviele globale Variablen eine Mod benutzt, hängt vor allem vom Alter ab. In 2004 gab es das Problem mit den zuvielen GLOBALs noch nicht, darum wurde da einfach drauf losprogrammiert. Inzwischen benutzen die gewieften Leute viel mehr lokale Variablen und in einigen neueren Tutorials hab ich das auch shconh gesehen.

Der Knackpunkt ist eigentlich, dass es dieses Problem auch heute per se nicht wirklich gibt, wenn es denn nicht das Big World Project gäbe. Die Kombination von 300 Mods ist da nämlich das Problem. Wenn eine Mod 500 GLOBALs benutzt, ist das Wumpe. Wenn es 10 machen, auch noch. Aber wenn 50 Mods hast, die 500 benutzen, dann kommst du in die Problemzonen. Und es wird halt immer schlimmer, je mehr es werden. ^^

Wenn du also darauf aus bist, deine Mod im BWP unterzubringen, solltest du kompatibel programmieren. Wenn du deine Mod ausschließlich für kleine Installationen vorsiehst, kannst du auch mit globalen Variablen um dich schmeißen.

Generell ist eine gute herangehensweise, alles was einmalig ist und nur den NPC betrifft mit LOCALS zu machen, alles was später nochmal benutzt oder von irgendjemand oder -etwas nochmal referiert werden soll mit GLOBALs zu machen.
 
Zuletzt bearbeitet:

Romin

Member
Registriert
24.10.2011
Beiträge
43
@Wedge:
Schön gesagt... "Wumpe", wo kommt das denn her :D

Na gut, ich denke ich werde wahrscheinlich keine 50 Globals brauchen (nicht mal mit Quest), eher so um die 25 wenn ich verschwenderisch bin; aber andererseits ist es, da ich ja noch nicht gerade ein Profi bin auch schwer abzuschätzen. (Allerdings verfüge ich über Programmierkenntnisse außerhalb von BG und habe daher ein bisschen Bewußtsein dafür, nicht für jeden Krampf einfach mal ein Set "Global" draufzuhauen).

Natürlich ist eine riesige Installation immer ein Problem und zwar meist vom Installateur ;) Ich nehme nicht an dass es eine Gruppe gibt, die alte Mods auf Effizienz hin überarbeitet, das will sich wahrscheinlich nicht einmal der/die Autor/in antun :D

Was meine Pläne angeht: Primär wird das eine Mod für meine Freundin, die meist mit den meisten Romanzen-Mods unzufrieden ist oder sie fast schon auswendig kennt :D (möglicherweise übertrieben). Aber wo es das BWP schon einmal gibt und ich es als die beste Idee seit... ach, was weiß ich, seit ewig, sehe, strebe ich schon höchstmögliche Kompatibilität an, insbesondere mit den empfohlenen Mods (meinetwegen sogar die ganz großen Questmods, TDD und Konsorten, auch wenn mir die nicht liegen)...
 

Romin

Member
Registriert
24.10.2011
Beiträge
43
Hallo zusammen.

Mal was neues: Ich hab' ne Frage! :D

Habe heute damit angefangen mir das LoveTalk/Friendship-Kozept mit Timer anzusehen und umzusetzen und habe dazu dieses Tutorial genommen:
http://www.shsforums.net/topic/36780-coding-friendships-and-romances/
(Ich hoffe Links dieser Art sind erlaubt. Wenn der Link gelöscht werden muss/sollte, sei gesagt er führte zu den shs-Foren, Topic "coding-friendships-and-romances")

Wer den Link nicht lesen will hier die kurze Zusammenfassung des Prinzips:
Wenn ich 8 LoveTalks habe, habe ich eine LoveTalk-Nummerierungs-Variable (im weiteren LTNV) mit Reichweite 1 bis 16.
Im Override-Skript des Romazen-NPC Wird dann in einem Skriptblock gecheckt (neben anderen Dingen), ob gerade diese LTNV auf einem ungeraden Wert steht, falls
ja => Dialog initialisieren (das wäre LT 1)
nein => nächster If-Block wird angesteuert.
Dieser nächste Block checkt ob LTNV gerade ist (d.h. immer true, wenn erster false ist) und bewirkt "nur" eine Erhöhung der LTNV (auf eine ungerade Zahl).
Als nächstes ist dann wieder der erste IF-Block true und der nächste LoveTalk läuft ab.
Außerdem wird die LTNV in jedem Lovetalk um 1 erhöht (muss ja, sonst haut es nicht hin) und der Timer gesetzt.

Mein Frage nun und ich hoffe die ist nicht dumm oder sonst was: Warum das?
Wozu braucht man diese ZWEI If-Blöcke. Ich habs mal ausprobiert indem ich nur einen gemacht habe: Dieser hat, sobald der Timer auf Null war den Lovetalk ausgelöst (Befehl "Dialogue(...)") und im selben Zug den Timer neu gesetzt. Dann im Lovetalk selbst die LTNV erhöht - als Zeichen, dass der LT stattgefunden hatte. Irgendwie erscheint mir das intuitiver und v.a. Code sparender.
Allerdings komme ich nicht umhin zu denken, dass es vielleicht Sinn macht es wie oben im Tutorial zu regeln, nur komme ich nicht drauf, warum. Wenn mir da jemand auf die Sprünge helfen könnte (oder mir Recht geben, ist auch OK :))

Gruß, Romin
 
Zuletzt bearbeitet:

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
982
Ich nehme an, gegen deine Umsetzung dürfte eigentlich nichts sprechen. Jacke wie Hose :)
 
Oben