Autor |
|
Coxaqha
Bard
Dabei seit: Juli 2005
Geschlecht:
Herkunft: Schilda
Beiträge: 45
|
|
Also das erste Scripting fällt mir ja deutlich schwerer, als ich es erwartet habe. Zwar habe ich eine gewisse 'Ahnung', wie man manche Dinge regeln könnte, aber mir fehlt wohl in erster Linie jegliches Vokabular nebst 'Grammatik', also die Grundlagen der Sprache.
Die Grundidee:
Ein von mir erstellter NPC lungert in Balmora vor Caius Cosades' Haus rum und spricht den Char an, nachdem er 'Meldet euch beim Meisterspion' erledigt hat. Da ich als Anfänger niemals CC selbst anfassen würde (Topic: da hat jemand nach euch gefragt), würde ich gern den Journal-Eintrag abgreifen, das wäre dann wohl "A1_1_FindSpymaster", um den NPC zu triggern. Darum habe ich mir 'ziemlich viele' Scripte angesehen, konnte aber nichts erhellendes finden (z.B. 'if PCJournalEntry' oder dgl.). Und selbst wenn ich da was gefunden hätte, wüßte ich nicht, wie das umzusetzen wäre. Es soll ja nur einmal geschehen, DoOnce oder set Status? Ich fühl mich wie ein Gör, das wahllos irgendwo gehörte Worte nachplappert...
Und dann die unklarste aller Fragen: Wo kommt das Script hin? Auf den NPC nehme ich mal an, weiß aber kaum warum... Also geh ich jetzt erstmal dabei, die Schatzkiste aus dem Tut nachzubauen, fürchte aber, daß mich das bezüglich des obigen Scripts kein Stück weiter bringt. Falls sich jemand finden sollte, der bereit ist, mir ein wenig auf die Sprünge zu helfen, wäre sowas von dankbar.
|
|
26.07.2005, 11:38 |
|
F.I.M.
Acid Monk
Dabei seit: März 2004
Geschlecht:
Herkunft: 127.0.0.1
Beiträge: 2058
|
|
wenn du journal abfragen willlst:
if ( GetJournalIndex == bla )
__________________
|
|
26.07.2005, 12:11 |
|
Coxaqha
Bard
Dabei seit: Juli 2005
Geschlecht:
Herkunft: Schilda
Beiträge: 45
|
|
Wenn ich also abfragen will, ob der Char sich gerade eben bei CC vorgestellt hat
if ( GetJournalIndex == A1_1_FindSpymaster )
und der NPC ist getriggert?
Danke für den Tip. Gleich mal antesten.
---
Die Rätselkiste aus dem Tut hab ich tatsächlich fertig gekriegt, sogar mit eigenem Rätsel an einem anderen Container. Ich wollte den ToolTip-Namen in "%PCName's Nachtschrank" ändern, wurde leider genau so angezeigt. Geht das generell nicht, oder hab ich falsche Syntax benutzt?
|
|
26.07.2005, 13:43 |
|
F.I.M.
Acid Monk
Dabei seit: März 2004
Geschlecht:
Herkunft: 127.0.0.1
Beiträge: 2058
|
|
Zitat: Original von Coxaqha
Die Rätselkiste aus dem Tut hab ich tatsächlich fertig gekriegt, sogar mit eigenem Rätsel an einem anderen Container.
naja is ja nicht wirklich schwer, muss man ja eigentlich eh nur abschreiben...
Zitat: Original von Coxaqha
Ich wollte den ToolTip-Namen in "%PCName's Nachtschrank" ändern, wurde leider genau so angezeigt. Geht das generell nicht, oder hab ich falsche Syntax benutzt?
soweit ich weiss geht das nur in dialogen...
__________________
|
|
26.07.2005, 14:13 |
|
Hephaistos
Verschollen
Dabei seit: Februar 2003
Geschlecht:
Herkunft: Wien
Beiträge: 2102
|
|
Ich würde dafür kein Script schreiben, sondern es direkt in den Dialogoptionen als Bedingung festlegen, damit wäre dann auch die Frage geklärt wo es hin soll.
Zitat: Original von F.I.M.
Zitat: Original von Coxaqha
Ich wollte den ToolTip-Namen in "%PCName's Nachtschrank" ändern, wurde leider genau so angezeigt. Geht das generell nicht, oder hab ich falsche Syntax benutzt?
soweit ich weiss geht das nur in dialogen...
Falsch, bei Büchern, Schriftrollen, etc. funktioniert es auch. Allerdings habe ich gerade keine CS zur Hand, deswegen kann ich nicht nachschauen wie der Befehl lauten muß.
Edit:
Zitat: Original von F.I.M.
wenn du journal abfragen willlst:
if ( GetJournalIndex == bla )
Der Befehl muß folgendermassen aussehen:
if ( GetJournalIndex "Index_ID" >= Wert )
__________________
Die Dummheit der Menschen und das Weltall sind unendlich, wobei ich mir beim Weltall noch nicht sicher bin.
Albert Einstein
Wenn die Klügeren nachgeben, regiert Dummheit die Welt.
Marie von Ebner-Eschenbach
|
|
26.07.2005, 14:17 |
|
Coxaqha
Bard
Dabei seit: Juli 2005
Geschlecht:
Herkunft: Schilda
Beiträge: 45
|
|
'Schwer' war nur die Überwindung, etwas zu tun, daß ich nicht will, um etwas ganz anderes zu erreichen. Manche nennen das 'Übung' (Meistermachend), andere hassen das. Ich werde mich wohl mal zu den ersteren begeben müssen.
@ Hephaistos
Echt? Ich kann in den Dialog-Optionen festlegen, daß ein NPC den Char anspricht, sobald dieser gewisse Bedingungen erfüllt? Das wäre allerdings genial (bin ja noch dankbar für alles, was mir die Peinlichkeit des Scriptens erspart).
Und danke für die Syntax.
Äh, nennt man Dich manchmal 'Heph', der das Armor-Mannequin gebastelt hat? Cooles Teil, würde ziemlich gern bei mir integrieren, wenn ich darf.
|
|
26.07.2005, 14:59 |
|
F.I.M.
Acid Monk
Dabei seit: März 2004
Geschlecht:
Herkunft: 127.0.0.1
Beiträge: 2058
|
|
Zitat: Original von Hephaistos
Falsch, bei Büchern, Schriftrollen, etc. funktioniert es auch. Allerdings habe ich gerade keine CS zur Hand, deswegen kann ich nicht nachschauen wie der Befehl lauten muß.
aber nicht im namen ! nur im inhalt ! und das beziehe ich bei dialogen mit ein
Zitat: Original von Hephaistos
Zitat: Original von F.I.M.
wenn du journal abfragen willlst:
if ( GetJournalIndex == bla )
Der Befehl muß folgendermassen aussehen:
if ( GetJournalIndex "Index_ID" >= Wert )
yap stimmt, schon lange nichts mehr gemoddet
__________________
|
|
26.07.2005, 15:41 |
|
Hephaistos
Verschollen
Dabei seit: Februar 2003
Geschlecht:
Herkunft: Wien
Beiträge: 2102
|
|
Zitat: Original von Coxaqha
Äh, nennt man Dich manchmal 'Heph', der das Armor-Mannequin gebastelt hat? Cooles Teil, würde ziemlich gern bei mir integrieren, wenn ich darf.
Nein, ich habe keine Mannequins gebastelt. Meine Erfahrungen mit dem CS beschränken sich auf eine kleine Mod (siehe Link in der Signatur).
__________________
Die Dummheit der Menschen und das Weltall sind unendlich, wobei ich mir beim Weltall noch nicht sicher bin.
Albert Einstein
Wenn die Klügeren nachgeben, regiert Dummheit die Welt.
Marie von Ebner-Eschenbach
|
|
26.07.2005, 15:59 |
|
Coxaqha
Bard
Dabei seit: Juli 2005
Geschlecht:
Herkunft: Schilda
Beiträge: 45
|
|
Klingt aber naheliegend, sorry.
So wie ich's haben wollte, hab ich's nicht hingekriegt. Sie hat zwar ein leicht abgewandeltes Träumer-Script, aber sie steht nur da ohne mich anzusprechen. Immerhin kann ich sie ansprechen und so die Nachricht erhalten. Man ist der Topic-Platz klein, kaum genug für's allernötigste. Mal sehen ob ich einen 'weiter'-Knopf einbauen kann. Und hier 'mein' Script, falls jemand Anregungen hat.
begin BoteCC_talkerEnable
addtopic Coxaqha-Nachricht
short test
Short NoLore
Set test to GetJournalIndex A1_1_FindSpymaster
if ( GetDisabled == 0 )
Return
endif
if ( test >= 14 )
Enable
Return
endif
End
Das 'GetDisabled' stammt vom Träumer.
14 heißt: Doks abgegeben + unterschrieben, so wie ich's wollte, aber da 99% der Spieler gleich nach Befehlen fragen...
|
|
26.07.2005, 17:07 |
|
HenryEX
Healer
Dabei seit: Juni 2005
Geschlecht: keine Angabe
Herkunft: A melancholy Town where we never smile
Beiträge: 63
|
|
Sieht gut aus, allerdings ist das Ding mit der zusätzlichen "test" Variable unnötig kompliziert. Du kannst ja die oben angegebene Abfrage benutzen.
Also: "Set test to..." wegstreichen und stattdessen:
if ( GetJournalIndex A1_1_FindSpymaster >= 14 )
Enable
Return
endif
Wo wir schonmal dabei sind: Ist zwar eine eher kosmetische Operation, aber ich würde den AddTopic Befehl nicht zu der Variablen-Deklarierung packen. Da dieser Befehl momentan ausserdem jede Sekunde ausgeführt wird (ziemlich unnötig) schlage ich vor, du packst ihn in die If-Klausel, die den NPC enablet - wird ja nur einmal gemacht.
|
|
26.07.2005, 20:07 |
|
Coxaqha
Bard
Dabei seit: Juli 2005
Geschlecht:
Herkunft: Schilda
Beiträge: 45
|
|
Ok, ersteres meine ich verstanden zu haben; hab's halt vom Träumer geborgt, weil die einen ziemlich penetrant anquatschen. Das war der Grundgedanke, mittlerweile bin ich's ja zufrieden, das sie ansprechbar ist und besagte Info raustut. Zur Zeit verzweifle ich an einem simplen Journaleintrag: Info bekommen und aufgeschrieben. Hab hier 4-5 verschiedene Dialog-Tuts parallel, und alle widersprechen einander und keines kommt zum eigentlichen Punkt. Gibt's denn wirklich kein gutes und halbwegs allumfassendes Tutorial zum Thema Dialoge? Deutsch oder englisch ist mir (fast) egal.
Nochmal zu Deinem Einwand: Daß die Position da oben was zu bedeuten hat, war so nicht klar. Dachte einfach, sie soll wissen, was sie sagen soll, bevor sie redet (könnte mir manchmal auch nicht schaden). Und warum wird es da unten nur einmal ausgeführt? Was meint 'return'? Bei 'enable' dachte ich die ganze Zeit, das isses: jetzt quatscht sie mich an. Liegt da der Fehler im Grundgedanken? Muß ich 'enable' erst noch mit etwas füttern?
Ich hab ihren Spruch noch mit einer zweiten Bedingung versehen: Function/TalkedToPC=0, ändert das was daran, das 'AddTopic' jeden Frame ausgeführt wird, oder heißt das vielmehr, daß wir nur einmal drüber reden?
|
|
26.07.2005, 21:45 |
|
F.I.M.
Acid Monk
Dabei seit: März 2004
Geschlecht:
Herkunft: 127.0.0.1
Beiträge: 2058
|
|
also so wie du oben schreibst und dann der script, irgenwie finde ich kein zusammen hang...
und warum hast du in den beiden if zeilen ein return???
ach ja ein einfaches script wenn dich ein NPC ansprechen soll:
code:
Begin blabla
short done
if ( done == 0 )
if ( GetDistance Player <= 250 )
forcegreeting ;das is der befehl der n NPC ansprechen laest, hier wenn man naeher oder gleich 250 entfernt ist
set done to 1
endif
endif
end
__________________
Dieser Beitrag wurde von F.I.M. am 26.07.2005, 22:21 Uhr editiert.
|
|
26.07.2005, 22:15 |
|
Coxaqha
Bard
Dabei seit: Juli 2005
Geschlecht:
Herkunft: Schilda
Beiträge: 45
|
|
War mir doch klar, daß das irgendwann auffällt: ich hab vom Scripten keine Ahnung, mea Culpa. Und der fehlende Zusammenhang kommt wieder zusammen, wenn meine ursprüngliche Idee war, angesprochen zu werden, sobald ich mich bei CC gemeldet hab. Da ich das nicht hingekriegt habe, war ich (vorerst) damit zufrieden, meinen NPC immerhin selbst ansprechen zu können. Ich will ja auch weiterkommen und nicht an einer Stelle zu Grunde verzweifeln, die ich in 1-2 Wochen mit links erledigen kann.
Vielen Dank für den Tip, Du kannst Dir wahrscheinlich nicht (mehr) vorstellen, wie unglaublich hilfreich eine neue Vokabel sein kann, wenn man noch nicht in der Lage ist, in einer neuen Sprache zu denken.
...daß ich diesen blöden Journal-Eintrag nicht hinkriege wurmt mich...
|
|
26.07.2005, 23:10 |
|
Hephaistos
Verschollen
Dabei seit: Februar 2003
Geschlecht:
Herkunft: Wien
Beiträge: 2102
|
|
Zitat: Original von Coxaqha
Was meint 'return'? Bei 'enable' dachte ich die ganze Zeit, das isses: jetzt quatscht sie mich an.
Return beendet das laufende Script für diesen Frame.
Enable ohne Objektangabe bezieht sich immer auf das Objekt auf dem das Script liegt (das gilt übrigens für fast alle Befehle). Das heißt es hätte in deinem Fall überhaupt keine Funktion da der entsprechende NPC ja schon "eingeschalten" ist.
Im übrigen würde ich von der Anwendung von Addtopic abraten. Das ist nicht die feine Art zu Modden, da das neue Thema wie aus dem Nichts erscheint. Wesentlich stimmiger wäre es, das neue Thema durch ein geeignetes greeting vorzustellen, das du im übrigen für "Forcegreeting" sowieso machen solltest
Eine gute Informationsquelle für Scriptingbefehle ist die Hilfe des CS, dort sind auf einer Seite alle Befehle zusammengefast, zwar nicht sehr umfangreich, aber man gewinnt einen guten Eindruck was wofür zuständig ist.
__________________
Die Dummheit der Menschen und das Weltall sind unendlich, wobei ich mir beim Weltall noch nicht sicher bin.
Albert Einstein
Wenn die Klügeren nachgeben, regiert Dummheit die Welt.
Marie von Ebner-Eschenbach
|
|
27.07.2005, 07:43 |
|
Coxaqha
Bard
Dabei seit: Juli 2005
Geschlecht:
Herkunft: Schilda
Beiträge: 45
|
|
'Nicht die feine Art zu modden' würde ich mir in dem Zusammenhang, daß eine wildfremde Frau mich genau einmal anspricht, um eine Nachricht abzusetzen, noch gefallen lassen. Recht des Erstlingswerks...
Wir hatten gestern abend leider Stromausfall, was hätte ich dieses Script doch über Nacht hier hängen lassen können.
begin BoteCC_talkerEnable
Short NoLore
short done
if ( GetDisabled == 0 )
Return
endif
if ( GetJournalIndex A1_1_FindSpymaster >= 14 )
addtopic Coxaqha-Nachricht
Enable
Return
endif
if ( done == 0 )
if ( GetDistance Player <= 250 )
forcegreeting
set done to 1
endif
endif
End
Das ist mein derzeitiger Stand der Dinge, Resultat Null, weder Topic vorhanden noch forcegreeting, enttäuschend.
Kann aber auch gut damit zusammenhängen, daß ich seit einigen Stunden versuche, einen Journaleintrag auf die Reihe zu bringen, ohne den erscheint mir alles so sinnlos. Eine Autorin meinte, Journal-Entries müßten alle ein Prefix haben, damit fing das Drama an, seitdem klappt mit jedem Versuch weniger.
Dieses 'if GetDisabled' hab ich vom Träumer geerbt, wenn ich es rauswerfe, geht gar nichts.
EDIT:
Zehn MW-Starts später: alle Returns aus dem Script geschmissen (testhalber), AddTopic dto., Greeting + Result erstellt, Speaker-Condition vergessen!!!
ES FUNZT!!! Sobald ich CC's Haus verlasse quatscht sie mich an, Journaleintrag (wenn auch ohne 'Titel') wird gemacht, sauber!!Jetzt muß ich nur noch ihren Text wieder umschreiben und der erste Schritt ist getan.
Danke für Eure Hilfe bis hierhin, allein hätte ich's nicht gepeilt.
OFFTOPIC:
Beim Scripte-studieren bin ich auf einige strange Dinge gestoßen.
- auf Dren gibt's einen befreibaren Sklaven namens Gah-Julan, im ganzen Spiel gibt's gleichnamige Knochenrüstungsteile zu finden. Ob der noch mehr auf sich hat?
- Was es mit den Träumern auf sich hat, mag sich mir noch nicht erschließen. Fallen die wirklich einfach tot um, wenn D'Ur dahinne ist?
Dieser Beitrag wurde von Coxaqha am 27.07.2005, 11:02 Uhr editiert.
|
|
27.07.2005, 09:28 |
|
F.I.M.
Acid Monk
Dabei seit: März 2004
Geschlecht:
Herkunft: 127.0.0.1
Beiträge: 2058
|
|
GetDisabled, Enable, Return brauchste nicht ! weil nach enable return steht geht der script nicht weiter... und so wie ich verstanden habe soll der NPC ja schon immer da sein, also brauchste das enabled nicht...
du brauchst hier nur:
if ( done == 0 )
if ( GetDistance Player <= 250 )
if ( GetJournalIndex A1_1_FindSpymaster >= 14 )
und diese befehle kommen alle nach einander dann das was geschehen soll, vorher und nacher nichts also im aufbau von:
code:
Begin BlaBla
variablen
if blabla
if blabla2
if blabla3
do something
endif
endif
endif
end
__________________
|
|
27.07.2005, 11:01 |
|
Coxaqha
Bard
Dabei seit: Juli 2005
Geschlecht:
Herkunft: Schilda
Beiträge: 45
|
|
Ups, Edit-Überschneidung.
Also dieses Script (plus die Greetings) funzt:
begin BoteCC_talkerEnable
Short NoLore
short done
if ( GetDisabled == 0 )
endif
if ( GetJournalIndex A1_1_FindSpymaster >= 14 )
Enable
endif
if ( done == 0 )
if ( GetDistance Player <= 250 )
forcegreeting
set done to 1
endif
endif
End
Und Du meinst, den Disabler kann ich auch noch rausschmeißen? Ziemlich zu Anfang hab ich das mal gemacht, da ging dann plötzlich garnichts mehr. Was da im einzelnen nicht ging, keine Ahnung, hab jetzt für diese Aktion so knappe 100 Trial+Error-Neustarts gemacht...
Gut, dann werde ich das auch noch mal eben reinigen. Ist das nicht ein schöner sonniger Tag (draußen plattern)?
Danke, danke
|
|
27.07.2005, 11:12 |
|
F.I.M.
Acid Monk
Dabei seit: März 2004
Geschlecht:
Herkunft: 127.0.0.1
Beiträge: 2058
|
|
if ( GetDisabled == 0 )
endif
raus, das brauchste nicht ! das waere die abrage "is das objekt disabled" = 0 also nein...
nach
if ( GetJournalIndex A1_1_FindSpymaster >= 14 )
Enable raus brauchste nicht, dein NPC is ja aktiv, also musste ihn auch nicht enablen...
dann das endif nach dem getjournal auch am schluss bei den anderen beiden endif`s...
__________________
Dieser Beitrag wurde von F.I.M. am 27.07.2005, 11:26 Uhr editiert.
|
|
27.07.2005, 11:26 |
|
Hephaistos
Verschollen
Dabei seit: Februar 2003
Geschlecht:
Herkunft: Wien
Beiträge: 2102
|
|
Vielleicht noch zur Erklärung warum dein Script nie funktionieren hätte können:
Du hattest als erste Abfrage stehen
if ( GetDisabled == 0 )
Return
endif
Diese Bedingung wird erfüllt, da dein NPC nicht disabled ist. Das heißt der Return Befehl beendet dein Script noch bevor es eine Chance hatte die, für dich wichtigen Teile, abzuarbeiten, da diese erst später im Script gekommen wären.
__________________
Die Dummheit der Menschen und das Weltall sind unendlich, wobei ich mir beim Weltall noch nicht sicher bin.
Albert Einstein
Wenn die Klügeren nachgeben, regiert Dummheit die Welt.
Marie von Ebner-Eschenbach
|
|
27.07.2005, 11:50 |
|
HenryEX
Healer
Dabei seit: Juni 2005
Geschlecht: keine Angabe
Herkunft: A melancholy Town where we never smile
Beiträge: 63
|
|
Hm...
Ich glaube...
Weisst du denn, was "Enable" respektive "Disable" überhaupt macht?
"Disable" lässt einen Gegenstand oder auch NPC aus der Welt "verschwinden"; die Referenz ist noch da und kann jederzeit wieder erscheinen (eben durch Enable) aber der Spieler kann sie nicht sehen und auch nicht mit ihr interagieren. Sie ist praktisch "nicht mehr da".
So funktioniert das bei den Träumern: Wenn du dir mal im CS ein paar der Orte anschaust, wo die rumstehen müssten (falls es denn überhaupt fest hingestellte Träumer irgendwo gibt) wird dir vielleicht auffallen, dass die Typen da eigentlich rumstehen, aber das nicht tun, wenn du ein neues Spiel startest! Die werden nämlich per "Disable" sofort erstmal rausgenommen, um dann bei genügendem Fortschritt in der Mainquest wieder per "Enable" in die Spielwelt integriert zu werden.
Das heisst: Der ganze Disable/Enable Schmu muss dich nur interessieren, wenn du willst, dass der NPC "gar nicht da" ist, wenn der Spieler noch nicht bei Caius war. Da aber standardmässig alles, was du in die Spielwelt setzt, enable't ist, musst du den NPC dementsprechend erstmal im Spiel als erstes Disablen. Im falle der "Dreamer_Talker" wird das im Startup-Script gemacht, das bei Spielbeginn einmal durchläuft.
Du solltest aber keine bereits vorhandene Scripts abändern, um das zu machen! Am besten schreibst du das in das Script, das auf dem NPC selbst liegt.
Hm, ich geh mal noch weiter zurück. Ein sogenanntes "lokales" Script (wie das, das auf einem NPC liegt) wird nur ausgeführt, wenn sich der Spieler in der gleichen Zelle (bei Interiors) oder auch in einer der anliegenden Zellen (bei Exteriors) befindet. Das heisst, wenn du in dein NPC Script den Disable Befehl reinpackst, wird der NPC disablet, wenn der Spieler das erste Mal die Zelle betritt, wo der NPC steht. Wenn das ein Interior ist, solltest du es so einrichten, dass man den NPC nicht direkt beim Betreten sehen kann, sonst kann es sein, das man den NPC beim ersten Betreten kurz aufflackern sieht und dann isser weg.
Weiter: Da Disable/Enable permanente Befehle sind, bleibt ein NPC oder Gegenstand solange disablet, bis der entsprechende Gegenbefehl auf ihn angewandt wird. Soll heissen, du musst den NPC nur einmal disablen, dann bleibt er das auch. Also: Wenn du das überhaupt machen willst mit dem ganzen Disable/Enable Zeugs, pack das anfängliche "Disable" in eine if-Abfrage, die nur einmal läuft (-> doOnce).
Oh ja, und das vormals von dir verwendete "GetDisabled" ist 0, wenn der überprüfte Gegenstand/NPC enabled, also da ist und 1, wenn er momentan disabled ist.
"if ( GetDisabled == 0)" checkt also, ob der NPC momentan enablet ist.
[Edit]Ach, dat hatt ja der über mir grad dazwischen gepostet.[/Edit]
So, lange Rede kurzer Sinn, das muss ja alles nicht sein. Kannst auch einfach das Momentane Script (so wie oben gepostet) nehmen und die if-Klausel, wie F.I.M. sagt, rausschmeissen, die kleine Korrektur mit der Journalabfrage noch machen und dann den Rest im Dialog-Greeting machen.
Und ansonsten, schau dir nochmal an, was F.I.M. weiter oben gepostet hat...
code:
if xyz...
if 12345...
if blabla
[hier alle auszuführenden Befehle]
endif
endif
endif
So werden alle drei Bedingungen (xyz, 12345 und blabla) abgefragt, bevor die Befehle ausgeführt werden. Wende das jetzt auf dein Script an.
Dieser Beitrag wurde von HenryEX am 27.07.2005, 12:03 Uhr editiert.
|
|
27.07.2005, 12:02 |
|
|