IF-Forum

» IF-Forum - Autorencafé - Schreiben! - I6: Nicht offensichtliche Objekte...
AntwortenNeues ThemaNeue Umfrage

I6: Nicht offensichtliche Objekte...

Geschrieben um 13:13 am 17.08.2013 | Zitat | Editieren | Löschen
Mischa
Mitglied
Master Gumby
Beiträge: 107

Wieder eine aktuelle Frage aus meinem Projekt:

Wie erstellt ihr nicht offensichtliche Objekte?

  1. Wenn man sie als scenery erstellt, kann man sie nicht mitnehmen.
  2. Wenn man sie mit dem Attribut concealed erstellt, muss man ihnen das entweder beim Aufheben oder beim erneuten Ablegen wegnehmen, da sie sonst in Raumbeschreibungen nicht vorkommen.
  3. Oder man nimmt den Objekten das concealed Attribut nicht weg und sieht in jeder Raumbeschreibung einen Absatz vor, der das Objekt beschreibt, falls es gerade im Raum liegt.

Irgendwie alles nicht optimal...

Geschrieben um 13:45 am 18.08.2013 | Zitat | Editieren | Löschen
Hannes
Avatar
Mitglied
Prof Gumby
Beiträge: 598

Ich empfehle eine Kombination aus describe und moved:



    describe [;

        if (secret hasnt moved)

            rtrue;

    ];

Object cover

    description [;

        print "Eine schoene Decke";

        if (secret hasnt moved)

            print ". Darunter entdeckst du das Geheimnis";

        ".";

    ];```

Sobald es einmal aufgehoben wurde, bekommt es automatisch "moved" und wird dann regulaer gelistet, dafuer nicht mehr in der Beschreibung der Decke.
Geschrieben um 14:08 am 18.08.2013 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Ich habe nicht genau verstanden, was du erreichen möchtest. Ich vermute, es geht dir darum, ein Objekt, solange es noch nicht bewegt wurde, aus der Raumbeschreibung rauszuhalten, aber für den Parser sichtbar zu halten, ohne dass das Objekt die Attribute scenery oder concealed besitzt.

Im folgenden Beispiel wird eine Klasse HiddenObject definiert, die sich von normalen Objekten lediglich dadurch unterscheidet, dass sie eine Dummy-Initial-Property besitzt. Zusätzlich habe ich die Routine Locale() ersetzt und dort die Behandlung der Ausgabe der Initial-Property für Objekte der Klasse HiddenObject angepasst.

Im Beispiel ist der Fernseher ein HiddenObject. Er wird in der Raumbeschreibung nicht erwähnt, solange er noch nicht bewegt wurde.

Das Beispiel sieht wuchtiger aus, als es ist, denn die ersetzte Routine Locale() ist so lang. Dabei geht es nur um wenige Zeilen, die geändert wurden.



Constant Headline "^Ein interaktiver Probelauf^";

Include "Parser";

Class HiddenObject

    with initial [; rtrue; ];

Replace Locale;

Include "VerbLib";

[ Locale descin text1 text2 case    o k p j f2 flag;

    objectloop (o in descin) give o ~workflag;

    k=0;

    objectloop (o in descin)

        if (o hasnt concealed && NotSupportingThePlayer(o)) {

            #Ifndef MANUAL_PRONOUNS;

            PronounNotice(o);

            #Endif;

            if (o hasnt scenery) {

                give o workflag; k++;

                p = initial; f2 = 0;

                if ((o has door || o has container) && o has open && o provides when_open) {

                    p = when_open; f2 = 1; jump Prop_Chosen;

                }

                if ((o has door || o has container) && o hasnt open && o provides when_closed) {

                    p = when_closed; f2 = 1; jump Prop_Chosen;

                }

                if (o has switchable && o has on && o provides when_on) {

                    p = when_on; f2 = 1; jump Prop_Chosen;

                }

                if (o has switchable && o hasnt on && o provides when_off) {

                    p = when_off; f2 = 1;

                }

              .Prop_Chosen;

                if (o hasnt moved || o.&describe ~= 0 || f2 == 1) {

                    if (o.&describe ~= 0 && RunRoutines(o, describe) ~= 0) {

                        flag = 1;

                        give o ~workflag; k--;

                    }

                    else {

                      j = o.p;

                        if (j ~= 0) {

                            !!! Diese Abfrage ist neu!!!

                            if (o ofclass HiddenObject) {

                                print "";

                            } else {

                                new_line;

                                PrintOrRun(o, p);

                            }

                            flag = 1;

                            give o ~workflag; k--;

                            if (o has supporter && child(o) ~= 0) SayWhatsOn(o);

                        }

                    }

                }

            }

            else

                if (o has supporter && child(o) ~= 0) SayWhatsOn(o);

        }

    if (k == 0) return 0;

    if (text1 ~= 0) {

        new_line;

        if (flag == 1) text1 = text2;

        print (string) text1, " ";

        WriteListFrom(child(descin),

          ENGLISH_BIT + RECURSE_BIT + PARTINV_BIT + TERSE_BIT + CONCEAL_BIT

          + WORKFLAG_BIT, case);

        return k;

    }

    if (flag == 1) L__M(##Look, 5, descin);

    else           L__M(##Look, 6, descin);

];

Class Tasse

  with  name 'tasse' 'tassen//p' 'becher' 'm.',

        plural "Tassen",

   has  female

   ;

   

Object Testraum "Testraum"

  with 

    description "Hier wird getestet.",

  has light;

Object -> Bistrotisch "Bistrotisch"

  with  name 'bistrotisch' 'tisch' 'tischchen' 'n.' 'bistrotischchen' 'n.',

   has  male supporter;

   

Tasse ->-> "Tasse";

Tasse ->-> "Tasse";

Tasse ->-> "Tasse";

Tasse ->-> Espressotasse "Espressotasse"

  with  name 'espressotasse'

  ;

 

Object ->->-> Kaffee "Kaffee"

  with  name 'eklig' 'kaffee' 'espresso' 'bruehe' 'f.',

        article "etwas",

   has  male;

       

Object -> Fussboden "Fußboden"

  with  name 'fussboden' 'boden',

   has  male scenery;

HiddenObject -> Fernseher "Fernseher"

  with  name 'fernseher' 'tv',

        description "Ein neuer Fernseher ...",

        kanal 3,

   has  male switchable;

[ Initialise;

    location = Testraum;

    print "^^^";

];

Include "GermanG";```

Das ist vielleicht etwas weniger fehleranfällig als das jonglieren mit concealed und scenery.
AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz