IF-Forum

» IF-Forum - Autorencafé - Schreiben! - Container
AntwortenNeues ThemaNeue Umfrage

Container

Geschrieben um 12:14 am 06.12.2007 | Zitat | Editieren | Löschen
Flo05
Mitglied
Pupil Gumby
Beiträge: 12

Hallo,

ich habe mal ein paar Fragen zu Containern in Inform 6. Wie bekomme ich es weg, dass in der Raumbeschreibung der Inhalt von Containern angezeigt wird? Z.Zt. sieht es so aus:

<Raumbeschreibung>....

Du siehst hier ein altes Auto und einen Werkzeugkasten (darin einen Hammer,

einen Schraubenschlüssel und eine Zange).

Besser wäre es, wenn da nur Werkzeugkasten stehen würde.

Meine nächste Frage ist, wie bekomme ich es hin, dass wenn man einen Container anschaut, dessen Inhalt mit aufgelistet bekomme? Momentan sehe ich den Inhalt nur, wenn man den Container im Inventar hat:

Du hast Folgendes:

einen Werkzeugkasten

einen Ledergurt

einen Hammer

einen Schraubenschlüssel

eine Zange

Hier ist auch gleich das nächste Problem: der Ledergurt im Kasten hat die Eigenschaft "scenery" und sollte eigentlich nicht in der Liste da stehen, wie kann ich das ändern?

Hier nochmal der aktuelle Code des Kastens und dessen Inhalt


Object -> ToolBox

    with dekl 1,

         short_name "Werkzeugkasten",

         name "Werkzeugkasten" "Kasten",

         description "Der Werkzeugkasten ist ein kleiner Kasten aus Holz und einem

                      Ledergurt zum Tragen.",

         before &#91;;

             take&#58; if&#40;AttemptToTakeObject&#40;noun&#41; == false&#41;

                   &#123;

                       print_ret "Du nimmst den Werkzeugkasten und hängst ihn

                                  dir über die Schulter.";

                   &#125;

                   else

                       print_ret "";

         &#93;,

    has male container open;

Object -> -> ToolBox_Strap

    with dekl 1,

         short_name "Ledergurt",

         name "Ledergurt" "Gurt",

         description "Der Ledergurt ist braun und ca. 6 cm breit. Mit seiner

                      Hilfe kann man den Werkzeugkasten bequem tragen.",

    has male scenery;

Object -> -> ToolBox_Hammer

    with dekl 2,

         short_name "Hammer",

         name "Hammer",

         description "Das ist ein ca. 200g schwerer Schlosserhammer mit einem Stiel aus Holz.",

    has male;

Object -> -> ToolBox_Wrench

    with dekl 2,

         short_name "Schraubenschlüssel",

         parse_name &#91;n;

             while &#40;WordMatch&#40;"schraubenschluessel"&#41;

                ||  WordMatch&#40;"ring-maulschluessel"&#41;

                ||  WordMatch&#40;"ringschluessel"&#41;

                ||  WordMatch&#40;"maulschluessel"&#41;

                ||  WordInProperty&#40;NextWord&#40;&#41;,

                   self, name&#41;&#41; n++;

             return n;

         &#93;,

         description "Das ist ein Ring-Maulschlüssel, eine Seite Maulschlüssel mit Grösse 13 und

                      die andere Seite Ringschlüssel Grösse 10.",

    has male;

Object -> -> ToolBox_Claw

    with dekl 7,

         short_name "Zange",

         name "Zange" "Spitzzange",

         description "Das ist eine Spitzzange, mit der man Dinge greifen und schneiden kann.

                      Ihre Griffe sind mit rotem Kunststoff überzogen.",

    has female;

Vielleicht kann mir ja jemand dabei helfen.

Schönen Gruss, Flo05

Geschrieben um 17:48 am 06.12.2007 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Hallo Flo,

Flo05:

Besser wäre es, wenn da nur Werkzeugkasten stehen würde.

hier ein Vorschlag, der vielleicht nicht die Eleganz in Reinkultur darstellt, aber funktioniert:



    with

       ...

       

         react_before &#91;;

            Look&#58; give self ~container;

         &#93;,

         react_after &#91;;

            Look&#58; give self container;

         &#93;,

     has male container open;```

Damit unterdrückst du allerdings auch die Ausgabe von "(der geschlossen ist)", wenn der Container geschlossen ist.

**Flo05:**
> [...] wie bekomme ich es hin, dass wenn man einen Container anschaut, dessen Inhalt mit aufgelistet bekomme?

Zum Beispiel so:

```Object -> ToolBox

    with

       ...

        description &#91;;

            print "Der Werkzeugkasten ist ein kleiner

                Kasten aus Holz und einem

                Ledergurt zum Tragen. ";

            &lt;&lt;Search self>>;

         &#93;,

         ...

     has male container open;```

**Flo05:**
> [...] der Ledergurt im Kasten hat die Eigenschaft "scenery" und sollte eigentlich nicht in der Liste da stehen, wie kann ich das ändern?

Du kannst die property add_to_scope benutzen und sie zum Kasten-Objekt hinzufügen. Dort kannst du Objekte eintragen, die NICHT Kinder des Kastens sind, aber immer in Sichtweite sein sollen, wenn auch der Kasten in Sichtweite ist. Der Gurt muss allerdings Kind eines Objekts sein. Hat er kein Mutterobjekt, kommt es (zumindest mit deform) zu einem Programmierfehler. Hier mein Vorschlag:

```Object Limbo "Limbus" has light;

Object ToolBox_Strap Limbo

    with dekl 1,

         short_name "Ledergurt",

         name "Ledergurt" "Gurt",

         description "Der Ledergurt ist braun und ca.

            6 cm breit. Mit seiner

            Hilfe kann man den Werkzeugkasten

            bequem tragen.",

    has male scenery;

   ! ... und dann später im Text&#58;

Object -> ToolBox

    with ...

         add_to_scope ToolBox_Strap,

         ...       

    has male container open;```

Wenn du (wie ich) dazu neigst, auch Details untersuchbar zu implementieren, dann ist vielleicht die Erweiterung [scenic.h](http://ifarchive.giga.or.at/if-archive/infocom/compilers/inform6/library/contributions/scenic.h) etwas für dich. Damit musst du nicht für jedes Detail ein Objekt definieren; allerdings muss die Erweiterung etwas ans Deutsche angepasst werden.

Viele Grüße, CB
Geschrieben um 12:11 am 07.12.2007 | Zitat | Editieren | Löschen
Flo05
Mitglied
Pupil Gumby
Beiträge: 12

Hallo,

vielen Dank für deine Hilfe, das klappt alles prima. Jetzt sieht das alles viel besser aus. Die "scenic.h" werde ich mir mal anschauen, weil ich immer versuche jedes Detail einzubauen, so dass man es zumindest ansehen kann.

Geschrieben um 14:48 am 07.12.2007 | Zitat | Editieren | Löschen
Flo05
Mitglied
Pupil Gumby
Beiträge: 12

Hallo nochmal,

nun habe ich noch ein ähnliches Problem, mit einer Theke auf der Dinge stehen. Hier mal der Code:


Object -> BigCity_Mission_DH_Bar

    with dekl 7,

         short_name "Theke",

         name "Theke",

         description &#91;;

             print "Auf der hölzernen Theke stehen die Speisen die hier verkauf werden.

                    Darüber hängt an der Wand eine Preisliste und ein Geldkartenlesegerät. ";

              &lt;&lt;Search self>>;

         &#93;,

         before &#91;;

             letgo&#58;  if&#40;noun has forsale&#41;

                         if&#40;noun.sold == 0&#41;

                             print_ret &#40;GDer&#41;noun," kann nur käuflich erworben werden.";

         &#93;,

         react_before &#91;;

             look&#58; give self ~supporter;

         &#93;,

         react_after &#91;;

             look&#58; give self supporter;

         &#93;,

    has female supporter static;

In der Raumbeschreibung sieht es leider so aus:

Du siehst hier eine Theke (darauf ein Brathähnchen, ein Schnitzel, einen Salat

und ein Mineralwasser).

Wieso klappt das hier nicht mit dem react_before / react_after? Ist zwar irgendwie logisch, dass man Dinge auf der Theke auch sieht, aber ich finde es schöner, wenn man die Dinge nur sieht wenn man die Theke anschaut.

Geschrieben um 23:33 am 07.12.2007 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Seltsam. Bei mir macht dein Code genau das, was du erreichen möchtest: Der Inhalt des Supporters wird während der Aktion ##Look erfolgreich unterdrückt.

Mein Testspiel:

Spielwiese

Dies ist eine Testzone.

Du siehst hier eine Theke.

u theke

Auf der hölzernen Theke stehen die Speisen die hier verkauf werden. Darüber hängt an der Wand eine Preisliste und ein Geldkartenlesegerät. Auf der Theke siehst du einen Werkzeugkasten, einen Hammer, einen Schraubenschlüssel und eine Zange.

Dass der Inhalt der Theke bei dir immer noch angezeigt wird, muss andere Gründe haben. Welche Library-Version benutzt du? Ich teste dein Beispiel mit deform (Release 6/11 2007-07-11).

Geschrieben um 00:37 am 08.12.2007 | Zitat | Editieren | Löschen
Flo05
Mitglied
Pupil Gumby
Beiträge: 12

Hatte laut der Datei deform.hst eine Version vom 29.09.2005. Habe nun mal die Version vom 11.07.2007 installiert (Danke an Martin Oehm, dass er an deform noch arbeitet, auch ein Dank an dir ChristianB für den Hinweis auf eine neue Version). Also wenn man den Raum betritt, sehe ich folgendes:

Du siehst hier eine Theke (darauf ein Brathähnchen, ein Schnitzel, einen Salat

und ein Mineralwasser).

Wenn ich aber im Raum nochmal die Raumbeschreibung aufrufe, sehe ich das hier:

Du siehst hier eine Theke.

Der Code ist wie oben beschrieben, ausser den Lebensmitteln die ich mir hier gespart habe. Woran kann das liegen, dass es bei dir funktioniert und bei mir nicht?

Geschrieben um 02:20 am 08.12.2007 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Ahh, knifflig. Wenn ich das Spiel neu starte und sich die Theke im Startraum befindet, dann klappt alles. Wenn ich aber den Raum, in dem die Theke steht, betrete, dann funktioniert es nicht mehr. Das Phänomen, das du beschreibst konnte ich hier reproduzieren:

Mein Testspiel:

Spielwiese

Dies ist eine Testzone.

Du kannst nach Westen gehen.

w

Spielwiese (der uncoole westliche Teil)

Dies ist der westliche Teil der Spielwiese. Da ist normalerweise nichts los, da hängen höchstens mal die Typen ab, die nicht auf die coolen Partys eingeladen werden. Bill Gates und Howard Sherman waren früher oft hier.

Du kannst in Richtung Osten gehen.

Du siehst hier eine Theke (darauf einen Werkzeugkasten (der leer ist), einen Hammer, einen Schraubenschlüssel und eine Zange).

Ok. Das liegt daran, dass nach dem Befehl GEHE NACH WESTEN die aktuelle Action nicht ##Look ist, sondern ##Go. Ich schlage Folgendens vor (recht dreckig):



         ...

         react_after &#91;;

             Go&#58; give self ~supporter; ! NEU !

             look&#58; give self supporter;

         &#93;,

    has female supporter static;```

Das müsste vorerst funktionieren. Nach ##Go folgt ##Look, deshalb bekommt die Bar ihr Attribut *supporter* am Ende zurück.
Geschrieben um 02:48 am 08.12.2007 | Zitat | Editieren | Löschen
Flo05
Mitglied
Pupil Gumby
Beiträge: 12

Hallo,

du bist ein Genie. Das funktioniert. Vielen vielen Dank. Habe auch gleich mal meinen Werkzeugkasten angepasst. Dann kann ich meine Geschichte nun weiter schreiben, und dank dir sieht es auch noch schön aus.

Geschrieben um 23:50 am 08.12.2007 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Flo05:

[...] sieht es auch noch schön aus

... aber das ganze Geben und Nehmen von Attributen in react_before und react_after ist nicht so schön. Es geht natürlich hübscher, nämlich mit der Property describe; wenn die true zurückgibt, dann wird die Ausgabe als vollendet angesehen und die Kinder des Objekts nicht mehr mit angegeben.



    with

         ...

         describe &#91;;

            "^In der Mitte des Raums steht eine Theke.";

         &#93;,

         

    has female supporter static;```

Viele Grüße, CB
Geschrieben um 14:31 am 09.12.2007 | Zitat | Editieren | Löschen
Flo05
Mitglied
Pupil Gumby
Beiträge: 12

Hallo,

habe es mal so eingebaut. Bei der Theke, die fest im Raum steht, sieht das recht gut aus. Aber bei tragbaren Gegenständen wie dem Werkzeugkasten gefällt mir das nicht so, dass der Kasten in einer extra Zeile im Raum erwähnt wird. Was gibt es denn für Nachteile, wenn ich die Version mit react_before und react_after drin lasse?

Geschrieben um 15:22 am 09.12.2007 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Flo05:

Was gibt es denn für Nachteile, wenn ich die Version mit react_before und react_after drin lasse?

Solange es funktioniert, keine (außer stilistischen). Ich kann mir aber vorstellen, dass die Mogelei mit den Attributen in komplexeren Zusammenhängen zu Fehlern führen könnte, z.B. dass ein weggenommenes Attribut nach der Raumbeschreibung nicht wieder zurückgegeben wird.

[Edit:]Wenn du es aber als natürlich empfindest, dass der Inhalt von Supportern und Containern in der Raumbeschreibung erscheint und dir lediglich die Ausgabe in Klammern nach dem Objekt-Short-Name nicht gefällt, kannst du die Konstante NO_NESTED_LISTS definieren (eine hübsche deform-Besonderheit) -- der Inhalt der Objekte wird dann in einem eigenen Absatz aufgelistet.

[Edit2]Mir kam das Thema gleich so bekannt vor; wir haben das schon mal für T.A.G. diskutiert. In T.A.G. gibt es eine Darin-Property, mit der man die Ausgabe des Objektinhalts ganz einfach steuern kann. Gibt es vielleicht ein Pendant in Inform?

Geschrieben um 19:24 am 09.12.2007 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

So. Neuer Post. Manchmal kommt die Erkenntnis nur sehr langsam... Ich habe jetzt die Alternative zu der Methode mit react_before und react_after und der Attribut-Klauerei gefunden, die mir im Hinterkopf rumschwirrte: Füge den Objekten (container oder supporter), bei denen die Ausgabe des Inhalts unterdrückt werden soll folgende Property hinzu:



invent &#91;;

    if &#40;inventory_stage == 2 && action ~= ##Inv&#41; rtrue;

&#93;```

Das sollte in der Raumbeschreibung verhindern, dass der Inhalt angezeigt wird (auch mit NO_NESTED_LISTS). Im Inventar bleibt alles wie gehabt. Ich meine, dass diese Variante weniger fehleranfällig ist.

Grüße, CB
Geschrieben um 22:56 am 09.12.2007 | Zitat | Editieren | Löschen
Flo05
Mitglied
Pupil Gumby
Beiträge: 12

Hallo,

noch einmal vielen vielen Dank. Danke für diese grossartige Hilfe. Habe das nun so eingebaut, es es funktioniert ebenfalls wunderbar. Dann lasse ich es mal so, wenn das die eleganteste Lösung ist.

Geschrieben um 12:27 am 05.07.2009 | Zitat | Editieren | Löschen
Patrick34
Mitglied
Baby Gumby
Beiträge: 3

Nur zur Info für euch

Falls jemand OLE Containers benutzen will sollte er mit Dekomprimierungs-Probleme bei Windows vista rechnen.

AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz