IF-Forum

» IF-Forum - Autorencafé - Schreiben! - Im Nebel des Grauens
AntwortenNeues ThemaNeue Umfrage

Im Nebel des Grauens

Geschrieben um 17:19 am 06.02.2003 | Zitat | Editieren | Löschen
Ally
Mitglied
Master Gumby
Beiträge: 126

Würde auch gerne mal ein wenig mit TAG experimentieren, wenn auch zugegebenermaßen nicht unbedingt ein ganzes Spiel programmieren.

Da ich das Problem seit mindestens einem Jahr nicht weiter bearbeitet habe und damals aufgegeben hatte, wären mir ein paar sanfte "Hints" willkommen. Ich will wirklich keinen fertigen Code -- nur wissen, wo ich anfangen könnte.

Angenommen, in der Spielwelt kriecht ein dichter magischer Nebel umher, der sich durch geschlossene Türen und ähnliche Hindernisse aussperren läßt. Der Nebel könnte demnach beispielsweise alle "Räume" eines Hafens "infizieren", ohne in ein Bootshaus oder die Kajüten der Boote einzudringen. Da es viele, evtl. unvorhersehbar viele Möglichkeiten der "Nebel/Nichtnebel"-Raumverteilung gibt und der Zustand benachbarter Räume ebenfalls von Bedeutung ist, sollte jedes Raumobjekt zu jeder Zeit "wissen" (oder eine Funktion, pardon, Aktion sollte zu jeder Zeit ermitteln können), ob ein Raum neblig ist (entweder oder, keine Zwischenschritte, kein langsames Vordringen).

Das, denke ich, ist das geringere Problem.

In nebligen Räumen soll es aber auch schwieriger sein, noch unbekannte Objekte zu erkennen. Beschreibung und Name eines Objekts sollen im Nebel also davon abhängen, ob der PC sie schon bei klarer Sicht erblickt hat. (Sobald das passiert, könnte ein Attribut "bekannt" gesetzt werden.) Da Beschreibungen ja nur auf Befehle hin ausgegeben werden, lassen sich diese relativ leicht mit VorAusf variieren, aber wie ist es mit den Namen von Objekten? Ich möchte wirklich keine Objekt-Vertausch-Spielchen anfangen...

Soll ich die Ausgabe der Objekte nach der "Lage"-Besch eines Raumes unterdrücken, etwa so:



    VorAusf

        (lage)

            wenn (daselbst neblig) dann

                Text 'Neblig hier!'

                | hier jetzt Objektliste(n) produzieren

                Stop

            ende

    EndeAusf```

...und (vor dem Stop) eine Aktion aufrufen, in der ich den Objektlister dann zu Fuß nachprogrammiere, unter Verwendung der korrekt vernebelten Alternativ-Namen? Danach ließen sich dann womöglich auch untersuchen, öffnen,  hineinschauen, inventar,... entsprechend an die grade herrschende Nebligkeit anpassen.  Aber wie kriegt man überhaupt erst mal raus, welche Objekte sich in einem Raum/anderen Objekt/dem PC befinden?

Aus dem Manual:

```ObjListe xObj (xObj in Andere_Seite)

Wenn (AnzListe) dann

    Text 'Auf der anderen Seite des Raums siehst du [liste 1].'

    Schleife xObj

        Wenn (xObj in Andere_Seite) dann

            InhListe xObj

        Ende

    Ende

Ende```

Kann mir mal jemand "AnzListe", "ObjListe" und "xObj" definieren? Ich find dazu nix. Die Schleife latscht über alle Elemente von xObj und gibt bei Bedarf deren Inhaltsliste aus, oder? Und xObj ist wohl eine Liste von Objekten, die in dem Raum sind, den Andere_Seite referenziert (oder wie man das nennen soll...)? Aber wieso dann die "Wenn (xObj in Andere_Seite)"-Bedingung, wenn xObj schon zuvor als Liste von Objekten in Andere_Seite initialisiert wurde? Und was ist AnzListe, und wann ist es wahr? (Sorry, die Syntax und Datentypen von TAG sind mir manchmal noch etwas schleierhaft, andere Sprachen kapier ich irgendwie schneller)

Hm. Und InhListe schießt vermutlich über mein Ziel hinaus und verwendet die Standard-Namen.

Oh je...  ich fürchte, das artet hier etwas aus.

Zudem soll der Nebel es unmöglich machen, mit bestimmten komplizierteren Objekten zu interagieren, z.B. in einem Buch zu lesen oder einen Computer zu bedienen, aber das ist wohl ein triviales Problem: die VorAusf-Aktionen des Raumes oder des Objektes könnten den Befehl sozusagen abfangen, je nachdem, ob er generell im Nebel unmöglich ist (sagen wir mal "lesen") oder davon abhängt, ob das Objekt "bekannt" ist. Oder irre ich mich da?
Geschrieben um 19:14 am 06.02.2003 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Uff! das ist mal eine anspruchsvolle Aufgabenstellung. Eine gute Alternative zum Guru-Wettbewerb...

Vor der Komplettlösung nur ganz kurz:

Ally:

Kann mir mal jemand "AnzListe", "ObjListe" und "xObj" definieren? Ich find dazu nix. Die Schleife latscht über alle Elemente von xObj und gibt bei Bedarf deren Inhaltsliste aus, oder? Und xObj ist wohl eine Liste von Objekten, die in dem Raum sind, den Andere_Seite referenziert (oder wie man das nennen soll...)? Aber wieso dann die "Wenn (xObj in Andere_Seite)"-Bedingung, wenn xObj schon zuvor als Liste von Objekten in Andere_Seite initialisiert wurde? Und was ist AnzListe, und wann ist es wahr?

xObj ist in diesem Fall eine Variable, die wahrscheinlich mit lokale ObjVar x irgendwo deklariert wurde, und die in der Schleife als Zählvariable verwendet wird.

ObjListe ist ein T.A.G.-Befehl, der alle Objekte, die eine Bedingung erfüllen, auf eine Liste schreibt. xObj wird hier nur als Variable für die (implizite) Objektschleife benötigt. Der Befehl macht nichts Offensichtliches, aber er schreibt die Anzahl der Objekte in der Liste auf AnzListe. In nachfolgende Texten kann dann mit [liste Fall] die Liste eingefügt werden. (Fall=1 ist Akkusativ.)

Nur, wenn etwas gefunden wurde, wird hier ein Text geschrieben. Mit InhListe Objekt wird direkt, ohne den Umweg des Textbefehls, ein Absatz über den Inhalt des Objekts gegeben, wie er auch in einer Raumbeschreibung auftauchen würde: "Im Eimer siehst du eine Axt" oder "Auf dem Tablett befinden sich drei leckere Kanapees". Meist wird aber gar nichts ausgegeben - das Objekt ist kein Behälter oder leer.

Ally:

(Sorry, die Syntax und Datentypen von TAG sind mir manchmal noch etwas schleierhaft, andere Sprachen kapier ich irgendwie schneller)

T.A.G. ist ein Sprachchaos, das stimmt. Es ist halt immer etwas hinzugekommen, was nicht in die vorige Syntax gepasst hat. Der Fachausdruck heisst, glaube ich "organisch gewachsen".

Zitat:

Da Beschreibungen ja nur auf Befehle hin ausgegeben werden, lassen sich diese relativ leicht mit VorAusf variieren, aber wie ist es mit den Namen von Objekten? Ich möchte wirklich keine Objekt-Vertausch-Spielchen anfangen...

Hier kannst Du die (relativ schlecht dokumentierte) Möglichkeit einer Ausführung als Namen benutzen:


    Obj

    Name Ausf

            wenn (daselbst neblig) dann

                ObjGenus selbst n %etwas

                Text 'Grau^/'

            sonst   

                ObjGenus selbst m

                Text 'alt^ Mantel/'

            Ende

        EndeAusf

Aber das ist auch keine schöne Syntax: Um Leerzeichen nach dem Namen zu vermeiden, muss ein Schrägstrich angestellt werden, die ObjGenus-Krücke muss angewendet werden, und, und, und...

Geschrieben um 22:02 am 06.02.2003 | Zitat | Editieren | Löschen
Ally
Mitglied
Master Gumby
Beiträge: 126

Martin:

Hier kannst Du die (relativ schlecht dokumentierte) Möglichkeit einer Ausführung als Namen benutzen:

Ahh! Das ist exakt das, was anwenden zu können ich nicht zu hoffen wagte :) Ich bin mir ziemlich sicher, daß ich diese Methode schon beim ersten Versuch damals ausprobiert hatte (jedenfalls hätte ich es bei TADS so gemacht), aber die Details fehlten einfach.

Hinter die Objektlistenschleifensache wäre ich vermutlich nie gekommen.

Danke!

Geschrieben um 11:32 am 07.02.2003 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Ally:

Ahh! Das ist exakt das, was anwenden zu können ich nicht zu hoffen wagte :) Ich bin mir ziemlich sicher, daß ich diese Methode schon beim ersten Versuch damals ausprobiert hatte (jedenfalls hätte ich es bei TADS so gemacht), aber die Details fehlten einfach.

Ich habe eben mal gesucht, wo dieses Feature in der Doku beschrieben ist. Es ist schon sehr gut versteckt: In der Lösung zu Aufgabe 22 des Tutoriums wird diese Möglichkeit kurz erwähnt.

(Die Überarbeitung des Handbuchs muss wohl mal ganz oben auf die To-Do-Liste.)

Ally:

Hinter die Objektlistenschleifensache wäre ich vermutlich nie gekommen.

T.A.G. hat als einfache Beschreibungssprache angefangen. Dann ist mir irgendwie das DM3 von Inform in die Hände gefallen, und ich fand viele schöne Features, die T.A.G. natürlich auch haben sollte. Und auch bekam, allerdings in einer unflexiblen Syntax, die sich an das Bestehende anlehnte. Alles, was bei Inform eine Library-Routine ist, ist bei T.A.G. ein eigener Opcode.

Und das Fehlen von Rückgabewerten macht dann so Krücken wie globale Variablen für das Ergebnis einer Aktion notwendig.

Ach, ja: Es gibt in T.A.G. übrigens ein Attribut bekannt, das automatisch gesetzt wird: Alles, was der Spieler einmal in einer Raumbeschreibung oder beim Öffnen eines Behälters beschrieben bekommen hat, hat dieses Attribut.

Die ganze Nebelproblematik ist ja der Aufgabenstellung des IF-Guru #1 nicht unähnlich. In meiner Lösung verwende ich die Aktion SichtUndRw, mit der man die normalen Regeln zur Sichtbarkeit und Erreichbarkeit von Objekten ändern kann: Alles was man im Halbdunkel nicht sehen kann, wird mit ObjAusserSicht versteckt.

Ally:

Zudem soll der Nebel es unmöglich machen, mit bestimmten komplizierteren Objekten zu interagieren, z.B. in einem Buch zu lesen oder einen Computer zu bedienen, aber das ist wohl ein triviales Problem: die VorAusf-Aktionen des Raumes oder des Objektes könnten den Befehl sozusagen abfangen, je nachdem, ob er generell im Nebel unmöglich ist (sagen wir mal "lesen") oder davon abhängt, ob das Objekt "bekannt" ist. Oder irre ich mich da?

Nein, das geht. Dazu könnte man schön eine Raumklasse benutzen für Räume die neblig sein können. (Ob der Raum dann neblig ist, würde man mit einem Attribut checken.)

Geschrieben um 02:49 am 08.02.2003 | Zitat | Editieren | Löschen
Ally
Mitglied
Master Gumby
Beiträge: 126

Martin:

Ach, ja: Es gibt in T.A.G. übrigens ein Attribut bekannt, das automatisch gesetzt wird: Alles, was der Spieler einmal in einer Raumbeschreibung oder beim Öffnen eines Behälters beschrieben bekommen hat, hat dieses Attribut.

Das würde aber nicht berücksichtigen, ob der Gegenstand in unvernebelter Umgebung gesichtet wurde oder nicht, oder?

Zitat:

Die ganze Nebelproblematik ist ja der Aufgabenstellung des IF-Guru #1 nicht unähnlich.

An den Guru hatte ich zwar nicht gedacht, aber:

Du hast mich ertappt. Im Grunde ging es mir gar nicht um Nebel, sondern um die Umsetzung von Halbdunkel, was ich spoilervermeidend verschwieg. Vielleicht mach ich ja auch was mit Nebel und Halbdunkel... (bei TADS hatte ich das noch mit "Ausweichen" auf Gerüche und Geräusche bei völliger Finsternis ergänzt, was einigermaßen klappte. Für's Erste spare ich mir das jetzt besser.)

Zitat:

In meiner Lösung verwende ich die Aktion SichtUndRw, mit der man die normalen Regeln zur Sichtbarkeit und Erreichbarkeit von Objekten ändern kann: Alles was man im Halbdunkel nicht sehen kann, wird mit ObjAusserSicht versteckt.

Für kleine Objekte hatte ich das auch vor. Wie ich sehe, hast du dich in deinem Beitrag dessen angenommen. Na, um so besser...

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