Forum moved to if-forum.org
Autor Nachricht
<  Im Nebel des Grauens
Ally
BeitragVerfasst am: Do, 6 Feb 2003 - 16:19  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 25.08.2002
Beiträge: 142

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:

Code:
Raum sowieso
    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:

Code:
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?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Martin
BeitragVerfasst am: Do, 6 Feb 2003 - 18:14  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

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

Vor der Komplettlösung nur ganz kurz:

Ally hat folgendes geschrieben:
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 hat folgendes geschrieben:
(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:

Code:

    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...
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Ally
BeitragVerfasst am: Do, 6 Feb 2003 - 21:02  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 25.08.2002
Beiträge: 142

Martin hat folgendes geschrieben:

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!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Martin
BeitragVerfasst am: Fr, 7 Feb 2003 - 10:32  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

Ally hat folgendes geschrieben:
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 hat folgendes geschrieben:
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 hat folgendes geschrieben:
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.)
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Ally
BeitragVerfasst am: Sa, 8 Feb 2003 - 1:49  Antworten mit Zitat
Kompassleser
Kompassleser


Anmeldungsdatum: 25.08.2002
Beiträge: 142

Martin hat folgendes geschrieben:

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...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Alle Zeiten sind GMT + 1 Stunde (MEZ)

Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Seite 1 von 1
if-de :: Forum Foren-Übersicht  >  T.A.G.

Neues Thema eröffnen   Neue Antwort erstellen


 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.



Kontakt: Administrator

Powered by phpBB and NoseBleed v1.05