| Geschrieben um 10:17 am 22.07.2003 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 | <td valign="top"><div class="post"><p>So, nach relativ langer Zeit melde ich mich auch mal wieder. Natürlich aufgrund eines Problems. :roll:</p> <p>Es geht darum, dass ich NPCs brauche, die mal tot und mal nicht sind. Bisher muss ich noch bei jedem Objekt die Routinen für die Todesnachrichten extra einfügen, weil das mit der Klasse nicht funktionieren wollte.</p> <p>Beispiel:</p> <p>“`</p> <p>Object Gardist “Gardist”</p> <p> with name ‘gardist’ ‘soldat’,</p> <p> dekl 3,</p> <p> description [; if (self hasnt dead) “Grimmig erwidert der Gardist deine Blicke.”;ddesc();rtrue; ],</p> <p> life [; Ask, Answer, Tell: if (self hasnt dead) “Er ist nicht zum Sprechen aufgelegt.”;dtalk();rtrue; ],</p> <p> before [;</p> <p> Touch: if (self hasnt dead) “~Lass deine dreckigen Finger von mir!~, knurrt er dich an.</p> <p> Du beschließt, seiner Aufforderung besser nachzukommen.”;dtouch();rtrue;</p> <p> Take, Push, Pull, Remove, Turn:</p> <p> if (self hasnt dead)</p> <p> “Ein warnendes Aufblitzen in den Augen des Soldaten überzeugt dich,</p> <p> es besser nicht zu versuchen.”;dget();rtrue;</p> <p> Attack: if (self hasnt dead) “Im Kampf Mann-zu-Mann bist du ihm nicht gewachsen.”;</p> <p> dattack();rtrue;</p> <p> ],</p> <p> has male animate;</p> <p>“`</p> <p>Weiß jemand eine bessere Möglichkeit, die auf mehrere Objekte übertragbar ist? So ist es nämlich ziemlich umständlich. Mit einer Klasse für die Toten habe ich es schon probiert, aber anstelle des Alternativtextes wurde dann gar nichts ausgegeben, sobald das Objekt das Attribut dead bekommen hatte(bzw. nur die standardnachrichten der library).</p> <p>Mein zweites Problem ist das Adjektiv. Wenn da steht:</p> <p>“Du siehst hier einen Gardist.”</p> <p>obwohl der Gardist tot ist, erscheint mir das etwas verwirrend, vor allem, wenn er in einem Satz mit anderen NPCs genannt wird, die noch leben.</p> <p>Ich habe allerdings nicht geschafft, nachträglich ein Adjektiv einzufügen. Wenn ich es auf ähnliche Weise wie oben versuche, wird ausgegeben:</p> <p>“Du siehst hier einen yten Gardist.”</p> <p>oder ein Buchstabensalat, wenn ich es mittels Object.adj und Routine versuche.</p> <p>Woran liegt das und wie kann ich es umgehen?</p> <p>Eine Alternative wäre natürlich die initial - property, aber das ist dann wieder ein Haufen Mehrarbeit, vor allem, wenn es viele verschiedene Tote im Spiel gibt. 8)</p> <p>Außerdem hätte ich (wenn möglich) schon gern wechselnde Adjektive…</p> <p>Vielen Dank im Vorraus schonmal für hoffentlich viele fachkundige Antworten. <img src="/images/smilies/wink.gif" alt=":wink:" align="bottom" /></p> </div></td> |
| Geschrieben um 14:21 am 23.07.2003 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 61 | <td valign="top"><div class="post"><p>Hi,</p> <p>es ist ein bisschen schwierig, zu sagen, was du falsch machst, weil du zu wenig Code gezeigt hast.</p> <p>Ich hab da was zusammengebastelt, das ist ein bisschen lang, aber es scheint mehr oder weniger zu funktionieren. Allerdings hab ich eine uralte deutsche Library gehabt, und weiss nicht, wie das bei neueren ist.</p> <p>“`Constant Story “Spass mit Gardisten”;</p> <p>Constant Headline “^Interaktive tote Gardisten^Jetzt leben sie noch. Um einen von ihnen^umzubringen, sing, spring oder warte.^”;</p> <p>Attribute dead;</p> <p>Include “Parser”;</p> <p>! Das brauch ich, weil ich nicht weiss, wie ich die Gardisten sonst</p> <p>! umbringen soll</p> <p>Object LibraryMessages</p> <p> with before [;</p> <p> Sing:</p> <p> if (gardist1 hasnt dead) {</p> <p> gardist1.die();</p> <p> “Ein greller Ton schneidet durch die Luft. Ein Gardist fällt tot um.”;</p> <p> }</p> <p> Jump:</p> <p> if (gardist2 hasnt dead) {</p> <p> gardist2.die();</p> <p> “Oops, aus Versehen springst du auf einen Gardisten. Er ist sofort tot.”;</p> <p> }</p> <p> Wait:</p> <p> if (gardist3 hasnt dead) {</p> <p> gardist3.die();</p> <p> “Die Zeit vergeht…^^Wumpf! Ein Gardist ist umgefallen. Er ist an einer</p> <p> Überdosis Zeit gestorben.”;</p> <p> }</p> <p> ];</p> <p>Include “VerbLib”;</p> <p>Object here “Hier”</p> <p> with description “In der Gardisterei sind Gardisten.”,</p> <p> has light;</p> <p>Class Gardist</p> <p> with name ‘gardist’ ‘soldat’ ‘toten’,</p> <p> dekl 3,</p> <p> short_name [;</p> <p> self.nummer();</p> <p> print “Gardist”;</p> <p> if (self has dead) print “, der tot ist”;</p> <p> rtrue;</p> <p> ],</p> <p> die [; give self dead; ],</p> <p> description [;</p> <p> if (self hasnt dead)</p> <p> “Grimmig erwidert der Gardist deine Blicke.”;</p> <p> ddesc(); rtrue;</p> <p> ],</p> <p> life [;</p> <p> Ask, Answer, Tell:</p> <p> if (self hasnt dead)</p> <p> “Er ist nicht zum Sprechen aufgelegt.”;</p> <p> dtalk(); rtrue;</p> <p> ],</p> <p> before [;</p> <p> Touch:</p> <p> if (self hasnt dead)</p> <p> ”~Lass deine dreckigen Finger von mir!~, knurrt er dich an. Du beschließt,</p> <p> seiner Aufforderung besser nachzukommen.”;</p> <p> dtouch(); rtrue;</p> <p> Take, Push, Pull, Remove, Turn:</p> <p> if (self hasnt dead)</p> <p> “Ein warnendes Aufblitzen in den Augen des Soldaten überzeugt dich, es</p> <p> besser nicht zu versuchen.”;</p> <p> dget(); rtrue;</p> <p> Attack:</p> <p> if (self hasnt dead) “Im Kampf Mann-zu-Mann bist du ihm nicht gewachsen.”;</p> <p> dattack(); rtrue;</p> <p> ],</p> <p> has male animate;</p> <p> Gardist gardist1 here</p> <p> with nummer [; print “ersten “; ],</p> <p> name ‘ersten’;</p> <p>Gardist gardist2 here</p> <p> with nummer [; print “zweiten “; ],</p> <p> name ‘zweiten’;</p> <p>Gardist gardist3 here</p> <p> with nummer [; print “dritten “; ],</p> <p> name ‘dritten’;</p> <p>[ ddesc; “Er liegt tot herum.”; ];</p> <p>[ dtalk; “Er sagt nichts, weil Tote reden normalerweise nicht.”; ];</p> <p>[ dtouch; “Er fühlt sich tot an.”; ];</p> <p>[ dget; “Er ist zu schwer.”; ];</p> <p>[ dattack; “Du kickst den Toten in die Rippen. Cool!”; ];</p> <p>[ Initialise;</p> <p> location = here;</p> <p> “^^Und hopp, in die Gardisterei…^^”;</p> <p>];</p> <p>Include “Germang”;“`</p> <p>Ich hoffe, du kannst was damit anfangen.</p> <p>(Außerdem hoff ich, dass das so ausschaut, wie es soll, hab noch nie hier gepostet.)</p> <p>Sophie</p> </div></td> |
| Geschrieben um 22:31 am 23.07.2003 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 | Danke! Ja, damit kann ich etwas anfangen. Mein ursprünglicher Fehler war, dem Gardist erst im toten Zustand seine Klasse zuzuweisen, die sich nur auf seine Todesnachrichten bezieht. Das hatte sich zwar zwischenzeitlich erledigt, aber auf die Idee, das Adjektiv zu umschreiben, statt selbst zu benutzen, bin ich noch gar nicht gekommen. Danke vielmals, das wird mir helfen! Das nächste Problem ist allerdings schon in Sicht. Wie in deinem Beispiel nämlich auch aufgeführt, brauche ich mehrere “Gardisten” (lassen wir sie mal weiterhin die Sündenböcke sein). Und zwar in Verbindung mit einem Kampfsystem. Alles funktioniert perfekt, solange wir bei einem Gardisten bleiben. Aber bei mehreren sieht es im Moment ja so aus: “`
Du siehst hier einen Gardist, einen Gardist und einen Gardist.
Ein Gardist stirbt.
Du siehst hier einen Gardist, einen Gardist und einen Gardist, der tot ist. “` etc. Was ich erreichen will, ist allerdings: “`
Du siehst hier drei Gardisten.
Ein Gardist stirbt.
Du siehst hier zwei Gardisten und einen Gardist, der tot ist.
Ein Gardist stirbt.
Du siehst hier einen Gardist und zwei Gardisten, die tot sind. “` Ich bin sicher, es gibt eine entsprechende Stelle im Manual, aber irgendwie hab ich das Richtige noch nicht gefunden, da sie sich auch unabhängig voneinander bewegen können müssen. Wenn z.B. der Spieler in eine Stadt kommt, und die Gardisten die Stadtwache darstellen, von denen hier und da einige sind und die Zahlen auch wechseln. Jemand ne Idee? Verweis auf Seite im Manual? Oder wäre das eine passende Aufgabe für den Guru-Wettbewerb? Vielen Dank schonmal für alle Antworten! |
| Geschrieben um 14:49 am 02.08.2003 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 | <td valign="top"><div class="post"><p>Wirklich niemand ne Idee?</p> <p>Im Moment kann ich die Gardisten nur zusammenlegen, wenn sie unangreifbar sind. Denn wenn ich sie als Klasse deklariere…</p> <p>“`</p> <p>attribute dead;</p> <p>Class Gardist</p> <p> with name ‘gardist’,</p> <p> dekl 3,</p> <p> description [; if (self hasnt dead) {”Ein grimmiger Gardist.”;}</p> <p> “Ein toter Gardist.”; ],</p> <p> before [; Attack: if (self hasnt dead) {</p> <p> give self dead;</p> <p> “Er fällt tot um.”;}</p> <p> “Er ist schon tot.”; ],</p> <p> has male animate;</p> <p>“`</p> <p>und dann ein paar von ihnen in einen Raum setze…</p> <p>“`</p> <p>Raum “Ein Raum”</p> <p> with description “Kahl und leer ist es hier.”,</p> <p> has light;</p> <p>Gardist “Gardist” Raum;</p> <p>Gardist “Gardist” Raum;</p> <p>Gardist “Gardist” Raum;</p> <p>“`</p> <p>Habe ich sie zwar gestapelt, aber sämtliche Aktionen beziehen sich nur auf den ersten. Bsp.:</p> <p>“`</p> <blockquote> <p>l</p> </blockquote> <p>Kahl und leer ist es hier.</p> <p>Du siehst hier drei Gardisten.</p> <blockquote> <p>b gardist</p> </blockquote> <p>Ein grimmiger Gardist.</p> <blockquote> <p>toete gardist</p> </blockquote> <p>Er fällt tot um.</p> <blockquote> <p>b gardist</p> </blockquote> <p>Ein toter Gardist.</p> <blockquote> <p>l</p> </blockquote> <p>Kahl und leer ist es hier.</p> <p>Du siehst hier drei Gardisten.</p> <blockquote> <p>toete gardist</p> </blockquote> <p>Er ist schon tot.</p> <p>“`</p> <p>Man sieht also weder, dass einer von ihnen tot ist, noch kann man mit den anderen interagieren, solange der erste sich noch im Raum befindet.</p> <p>Ich verzweifle noch daran!</p> </div></td> |
| Geschrieben um 13:47 am 04.08.2003 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 61 | <td valign="top"><div class="post"><p>Ich hab mir das jetzt genauer angeschaut. Ich glaube, es geht</p> <p>nicht, dass man das automatisch auflisten lässt, und trotzdem</p> <p>die Gardisten unterscheiden kann. Am Einfachsten wäre es</p> <p>wahrscheinlich, wenn du die Aufzählung selbst codierst, mit</p> <p>einer describe property in der Klassendefinition. (Nicht, dass ich</p> <p>das ausprobiert hätte.)</p> <p>Z.B. du zählst, wieviele Gardisten im Raum sind, und wieviele</p> <p>davon tot sind, und schreibst das dann selbst. Ungefähr so:</p> <p>“`</p> <p>describe [ i x y;</p> <p> objectloop (i in location && i ofclass Gardist) {</p> <p> if (i has dead) y++;</p> <p> else x++;</p> <p> }</p> <p> “^Im Raum sind “, (wie auch immer man Zahlen als Worte</p> <p> printed) x, ” lebende und “, (ebenfalls) y ” tote Gardisten.”;</p> <p>],</p> <p>“`</p> <p>oder</p> <p>“`</p> <p>describe [ i x y;</p> <p> objectloop (i in location && i ofclass Gardist) {</p> <p> x++;</p> <p> if (i has dead) y++;</p> <p> }</p> <p> print “^Im Raum sind “, (wie auch immer man Zahlen als Worte</p> <p> printed) x, ” Gardisten”;</p> <p> if (y) {</p> <p> print ” von denen “;</p> <p> if (y == 1) print ” einer tot ist”;</p> <p> else print (ebenfalls) y, ” tot sind”;</p> <p> “.”;</p> <p>],</p> <p>“`</p> <p>Und dann gibt’s noch den Fall, dass nur ein einziger Gardist im</p> <p>Raum ist, …</p> <p>Dann solltest du wahrscheinlich noch irgendeine Variable setzen,</p> <p>wenn das zum ersten mal ausgespuckt worden ist, damit das nicht</p> <p>für jeden Gardisten gezeigt wird, und am Ende des turns die</p> <p>Variable wieder zurücksetzen, oder so.</p> <p>Wie gesagt, nichts getestet, nur eine Idee.</p> <p>Sophie</p> </div></td> |
| Geschrieben um 19:30 am 04.08.2003 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 | Danke, werd ich mal ausprobieren. |
| Geschrieben um 16:23 am 07.08.2003 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 | <td valign="top"><div class="post"><p>Hm, irgendwie hab ich das Spiel nicht dazu bringen können, die Meldung bei mehreren Gardisten nur einmal auszuspucken.</p> <p>Aber was anderes hat (teilweise) geklappt, und das Gute daran ist, ich kann meine Gardisten einfach vervielfältigen.</p> <p>Folgend die beiden Klassen, die gebraucht werden:</p> <p>“`</p> <p>Class Gardist(3)</p> <p> with short_name “Gardist”,</p> <p> plural “Gardisten”,</p> <p> name ‘gardist’ ‘gardisten’,</p> <p> dekl 3,</p> <p> description “Der Gardist erwidert grimmig deine Blicke.”,</p> <p> before [;</p> <p> Attack:</p> <p> Gardist.destroy(self);</p> <p> SoldatTot();</p> <p> “Er geht zu Boden und stirbt.”;</p> <p> ],</p> <p> has male animate;</p> <p>Class DeadGardist(3)</p> <p> with short_name “Gardist”,</p> <p> plural “tote Gardisten”,</p> <p> dekl 3,</p> <p> adj “tot”,</p> <p> name ‘toten’ ‘tote’,</p> <p> description “Er sieht tot aus.”,</p> <p> has male animate;</p> <p>“`</p> <p>red Bei der Klasse DeadGardist musste ich das Adjektiv beim Plural schon in die Kurzbeschreibung setzen, weil es sonst bei mehreren Toten einfach weggelassen würde.</p> <p>Kann ich das verhindern?</p> <p>red Bei derselben Klasse kann ich in der name-property nicht ‘gardist’ oder ‘gardisten’ verwenden, solange die lebenden Gardisten kein Adjektiv haben.</p> <p>Wenn ich das aber vermeiden möchte, gibt es eine Möglichkeit, dass bei der Spielereingabe von ‘gardist’ die Klasse “DeadGardist” nur aufgerufen wird, wenn es kein Objekt mit der Klasse “Gardist” im selben Raum gibt?</p> <p>Fehlen noch zwei Routinen:</p> <p>“`</p> <p>[ Soldat l n;</p> <p> n = Gardist.create();</p> <p> move n to l;</p> <p>];</p> <p>[ SoldatTot n;</p> <p> n = DeadGardist.create();</p> <p> move n to location;</p> <p>];</p> <p>“`</p> <p>Und dann natürlich noch die Einträge in der Initialise-Routine, um am Anfang ein paar Gardisten zu haben:</p> <p>“`</p> <p>[ Initialise;</p> <p> location = Raum;</p> <p> Soldat(Raum);</p> <p> Soldat(Raum);</p> <p> Soldat(Raum);</p> <p> ”^^Test mit multiplen, sterblichen Gardisten!^^”;</p> <p>];</p> <p>“`</p> <p>Hm, soweit meine bisherige Lösung.</p> <p>Wär dankbar, wenn mir jemand sagen könnte, wie die beiden oben beschriebenen Schönheitsfehler in ihr zu bewältigen sind.</p> <p>Gruß</p> <p>Clive</p> </div></td> |
| Geschrieben um 10:54 am 08.08.2003 | Zitat | Editieren | Löschen | |
Mitglied Retired Gumby Beiträge: 700 | <td valign="top"><div class="post"><p><strong>Zitat:</strong></p> <blockquote> <p>Hm, irgendwie hab ich das Spiel nicht dazu bringen können, die Meldung bei mehreren Gardisten nur einmal auszuspucken.</p> </blockquote> <p>Wie Sophie bereits geschrieben hat: Du musst eine Flagge setzen, ob der Text bereits geschrieben wurde oder nicht, etwa so:</p> <p>“`</p> <p>Global Gardistenliste = 0;</p> <p>Class Gardist (3) {</p> <p> with short_name “Gardist”,</p> <p> …</p> <p> describe [;</p> <p> if (Gardistenliste) return;</p> <p> Gardistenliste++;</p> <p> ! Hier Sopies Code einfügen</p> <p> ],</p> <p> each_turn [;</p> <p> Gardistenliste = 0;</p> <p> ],</p> <p> has male animate;</p> <p>}</p> <p>“`</p> <p><strong>Zitat:</strong></p> <blockquote> <ol> <li>Problem: Bei der Klasse DeadGardist musste ich das Adjektiv beim Plural schon in die Kurzbeschreibung setzen, weil es sonst bei mehreren Toten einfach weggelassen würde. Kann ich das verhindern?</li> </ol> </blockquote> <p>Hmmm. Ist hier vielleicht der <em>List Writer</em> nicht an die deutsche Sprache angepasst? Die Eigenschaft <strong>adj</strong> wird wohl nur zusammen mit <strong>short_name</strong> verstanden.</p> <p><strong>Zitat:</strong></p> <blockquote> <p>Wenn ich das aber vermeiden möchte, gibt es eine Möglichkeit, dass bei der Spielereingabe von ‘gardist’ die Klasse “DeadGardist” nur aufgerufen wird, wenn es kein Objekt mit der Klasse “Gardist” im selben Raum gibt?</p> </blockquote> <p>Ja, Du kannst die Priorität von Objekten in <strong>ChooseObjects</strong> bestimmen:</p> <p>“`</p> <p>[ChooseObjects obj code;</p> <p> if (code == 2) {</p> <p> if (obj ofclass Gardist) return 3;</p> <p> }</p> <p> return 1;</p> <p>];</p> <p>“`</p> <p>Das hat allerdings den Nachteil, dass die Wahl des Parsers in Klammern angezeigt wird und dass “leere” Befehle versuchen, etwas mit dem Gardisten anzustellen:</p> <p>“`</p> <p>Ein Gardist steht hier neben zwei toten Kollegen.</p> <blockquote> <p>rede mit Gardist</p> </blockquote> <p>(mit dem Gardisten)</p> <p>“Tach!” Du erhältst keine Antwort.</p> <blockquote> <p>nimm</p> </blockquote> <p>(den Gardisten)</p> <p>Der Gardist ist dagegen.</p> <p>“`</p> <p>Außerdem würde ich das verschieben der Gardisten an einen Ort direkt in der Eigenschaft <strong>create</strong> der Klassen erzeugen:</p> <p>“`</p> <p>Class Gardist(3)</p> <p> with short_name “Gardist”,</p> <p> …</p> <p> create [l;</p> <p> move self to l;</p> <p> ],</p> <p> has male animate;</p> <p>[ Initialise;</p> <p> location = Raum;</p> <p> Gardist.create(Raum);</p> <p> Gardist.create(Raum);</p> <p> Gardist.create(Raum);</p> <p> …</p> <p>];</p> <p>“`</p> <p>Das Problem bei Deinen Ansätzen scheint mir zu sein, dass man die Klasse eines Objekts nicht während des Spiels ändern kann. Du musst also - wie Du es ja auch gemacht hast - mit parallelen Objekten für tote und lebendige Gardisten arbeiten. Oder Du arbeitest mit einer Klasse und dem Attribut <strong>dead</strong>. Dann wird die Ausgabe der Liste natürlich kompliziert.</p> <p>Vielleicht solltest Du Dir mal die Lösung zur Aufgabe mit den “featureless white cubes” (Aufgabe 79) ansehen, die werden auch durch eine Klasse dargestellt und haben zwei Zustände: Entweder sind sie “featureless” oder haben einen Namen. Vielleicht kannst Du da etwas pasendes für Deine Gardisten finden.</p> <p>Da Gardisten üblicherweise nicht in der Liste aller Gegenstände auftauchen, sondern in einem eigenen Absatz, muss hier wohl <strong>describe</strong> anstatt <strong>short_name</strong> und <strong>plural</strong> benutzt werden. Vielleicht kannst Du aber den <em>List Writer</em> für Deine Zwecke benutzen?</p> <p>Und zum Schluss der Disclaimer: Der Code ist mit dem Manual überprüft, aber nicht am Rechner getestet worden.</p> </div></td> |
| Geschrieben um 19:23 am 08.08.2003 | Zitat | Editieren | Löschen | |
Mitglied Bachelor Gumby Beiträge: 60 | Juhu, endlich funktioniert alles (soweit ich das bisher beurteilen kann) einwandfrei! Vielen Dank an euch! Falls das Spiel jemals fertig werden sollte, werdet ihr beiden in der Danksagung ganz oben erwähnt. Gruß Clive |