Finden von Objekten ersetzt
Das Finden von Objekten sucht jetzt rekursiv in weiteren
Containern. Dabei werden die Praepositionen der Container
korrekt beachtet (z.B. "kerze in beutel an wand in raum").
Bugfix dabei: Je nach Sinn muessen Container offen oder
nur transparent sein.
Statt einer Schleife arbeitet examine jetzt rekursiv um
ggf. noch im Environment zu suchen, wenn am Referenzobjekt
nichts gefunden wird. Im Gegensatz zu frueher wird im
Environment nun aber auch die Angabe des Ortes ausgewertet.
("kerze in beutel an wand" ging frueher nicht, wenn es ein
Referenzobjekt gab. Dies ist nun moeglich.
Ausfuehrliche Kommentierung der Codes, damit das in Zukunft
auch verstanden wird, was passiert.
Change-Id: I4c7769f0621ade91c67a22666b6bad52e67ef1cd
diff --git a/std/player/viewcmd.c b/std/player/viewcmd.c
index d055c88..0b84332 100644
--- a/std/player/viewcmd.c
+++ b/std/player/viewcmd.c
@@ -232,7 +232,7 @@
return 1;
}
-private int select_sense(string str)
+private int select_sense(string str, closure transparent_check)
{
int sense = -1;
if(member(({"riech","rieche","schnupper","schnuppere"}),query_verb())!=-1)
@@ -296,117 +296,193 @@
}
}
+ switch(sense)
+ {
+ // Fuer diese Sinne muss der Container offen sein.
+ case SENSE_SMELL:
+ case SENSE_TOUCH:
+ case SENSE_SOUND:
+ transparent_check = function int (object o)
+ { return o->QueryProp(P_CNT_STATUS) == CNT_STATUS_OPEN;};
+ break;
+ // Fuer alle anderen reicht, wenn er transparent ist.
+ default:
+ transparent_check = function int (object o)
+ { return o->QueryProp(P_TRANSPARENT);};
+ }
+
return sense;
}
-private object get_ref_object(string str, string what)
+private object get_ref_object(string *tokens, closure transparent_check,
+ int ref_given)
{
object ref_object;
- // do we look at an object in our environment ?
- if (sscanf(str,"%s in raum", what) || sscanf(str,"%s im raum", what))
+
+ // im Kommando speziell beschrieben ist, wo die Suche losgehen soll, spielt
+ // das Referenzobjekt keine Rolle.
+ if (sizeof(tokens) > 1 && tokens[<1] == "hier") {
+ tokens = tokens[..<2];
ref_object = environment();
- // is the object inside of me (inventory)
- else if (sscanf(str,"%s in mir", what) || sscanf(str,"%s in dir", what))
- ref_object = this_object();
+ ref_given=1;
+ }
+ else if (sizeof(tokens) > 2 && tokens[<2] == "in")
+ {
+ if (tokens[<1] == "mir" ||
+ tokens[<1] == "dir")
+ {
+ tokens = tokens[..<3];
+ ref_object = this_object();
+ ref_given=1;
+ }
+ else if (tokens[<1] == "raum")
+ {
+ tokens = tokens[..<3];
+ ref_object = environment();
+ ref_given=1;
+ }
+ }
else
{
- // ansonsten ist das argument komplett der suchstring und wir nehmen das
- // Referenzobjekt (so existent).
- what = str;
- // get the last object we looked at
- ref_object = QueryProp(P_REFERENCE_OBJECT);
- // if a reference object exists, test for its existance in the room
- // or in our inventory
- if (objectp(ref_object))
+ // ansonsten bleibt tokens unmodifiziert und wir nehmen das
+ // Referenzobjekt (so existent).
+ ref_object = QueryProp(P_REFERENCE_OBJECT);
+ if (objectp(ref_object))
+ {
+ // Dieses muss aber "irgendwo" in unserem Umfeld sein.
+ if (ref_object == environment() || ref_object==this_object())
{
- if (ref_object == environment() || ref_object==this_object())
+ // Umgebung oder Spieler selber sind als Bezugsobjekt immer in
+ // Ordnung, nichts machen.
+ }
+ // Wenn es nicht wir oder environment ist, darf das Referenzobjekt
+ // nicht unsichtbar sein.
+ else if (!ref_object->short())
+ ref_object = 0;
+ // Und nur wenn das Ref-Objekt irgendwie in unserer Umgebung ist
+ // (direkt, in uns, in einem Container etc.) kommt es in Frage. Es
+ // wird daher geprueft, ob all_environments() des Ref-Objekts auch
+ // unser environment enthaelt.
+ else
+ {
+ object *all_envs=all_environment(ref_object);
+ int i=member(all_envs, environment());
+ if (i >= 0)
{
- // Umgebung oder Spieler selber sind als Bezugsobjekt immer in
- // Ordnung, nichts machen.
- }
- // Das Referenzobjekt darf nicht unsichtbar sein.
- else if (!ref_object->short())
- ref_object = 0;
- // Nur wenn das Ref-Objekt irgendwie in unserer Umgebung ist (direkt,
- // in uns, in einem Container etc.) kommt es in Frage. Es wird daher
- // geprueft, ob all_environments() des Ref-Objekts auch unser
- // environment enthaelt.
- else
- {
- object *all_envs=all_environment(ref_object);
- int i=member(all_envs, environment());
- if (i >= 0)
- {
- // dann von dem Environment an entlanglaufen und alle
- // intermediaeren Objekt pruefen, ob sie einsehbar und sichtbar
- // sind.
- foreach(object env : all_envs[..i]) {
- // Ist eine Umgebung Living oder intransparenter Container oder
- // unsichtbar?
- if (living(env) || !env->QueryProp(P_TRANSPARENT)
- || !env->short())
- {
- // Kette zum Ref-Objekt unterbrochen. Wenn das unterbrechende
- // Env nicht dieses Living selber oder sein Env ist, wird das
- // Referenzobjekt zusaetzlich genullt.
- if (env != this_object() && env != environment())
- ref_object = 0;
- break;
- }
+ // dann von dem Environment an entlanglaufen und alle
+ // intermediaeren Objekt pruefen, ob sie einsehbar und sichtbar
+ // sind.
+ foreach(object env : all_envs[..i]) {
+ // Ist eine Umgebung Living oder intransparenter Container oder
+ // unsichtbar?
+ if (living(env) || !funcall(transparent_check, env)
+ || !env->short())
+ {
+ // Kette zum Ref-Objekt unterbrochen. Wenn das unterbrechende
+ // Env nicht dieses Living selber oder sein Env ist, wird das
+ // Referenzobjekt zusaetzlich genullt.
+ if (env != this_object() && env != environment())
+ ref_object = 0;
+ break;
}
}
- else
- ref_object = 0; // nicht im Raum oder Inventory
}
- } // ref_object exists
+ else
+ ref_object = 0; // nicht im Raum oder Inventory
+ }
+ } // ref_object exists
}
return ref_object;
}
-private object find_base(object ref_object, string what, string detail,
- string parent)
+// Versucht ein Basisobjekt (ggf. in env) finden, was durch <tokens>
+// beschrieben wird.
+// Das Basisobjekt ist das, was bei einem "detail an parent" durch parent
+// gekennzeichnet wird oder notfalls das Ref-Objekt selber. Zu beachten ist,
+// dass find_base() ggf. rekursiv arbeitet, um sowas wie "riss an kerze in
+// kerzenstaender auf tisch" zu finden. detail ist dann der letzte Teil der
+// tokens (der Anfang!), was keinen Container mehr bezeichnet, das gefundene
+// Objekt ist der letzte Container/Item auf dem Weg zu detail.
+// detail muss als Referenz uebergeben werden.
+// transparent_check ist die Closure, die prueft, ob man in einen
+// Container reinforschen (sehen, lesen, riechen, tasten etc.) kann. Sie
+// bekommt den Container uebergeben.
+private object find_base(object env, string *tokens, string detail,
+ closure transparent_check)
{
- object base;
- // Suchen wir an/im/in/etc. einem bestimmten Objekt?
- if(sscanf(what, "%s an %s", detail, parent) == 2 ||
- sscanf(what, "%s am %s", detail, parent) == 2 ||
- sscanf(what, "%s in %s", detail, parent) == 2 ||
- sscanf(what, "%s im %s", detail, parent) == 2)
+ // zuerst pruefen, ob man in env reinsehen/reinforschen kann (in
+ // this_object() und environment() kann man immer reinsehen).
+ if (env && env != this_object() && env != environment())
{
- object *objs;
- // Wenn es ein Referenzobjekt gibt, wird das parent-Objekt in diesem
- // gesucht. (Oben wurde sichergestellt, dass das Referenzobjekt einsehbar
- // ist)
- if(ref_object)
- objs = ref_object->locate_objects(parent, 1) || ({});
- // sonst im Environment oder in uns.
- else {
- objs = environment()->locate_objects(parent, 1)
- + locate_objects(parent, 1);
- }
- objs = filter_objects(objs, "short"); // nur sichtbare...
- switch(sizeof(objs))
+ // Nicht in Lebewesen reingucken und nicht in intransparente/geschlossene
+ // Container
+ if (living(env) || !funcall(transparent_check, env))
{
- case 0:
- notify_fail("Hier ist kein(e) "+capitalize(parent)+".\n");
- return 0;
- case 1:
- // Basisobjekt gefunden.
- base = objs[0];
- break;
- default:
- notify_fail("Es gibt mehr als eine(n) "+capitalize(parent)+".\n");
- return 0;
+ if (living(env))
+ notify_fail("Aber " + env->name(WER, 1) + " lebt doch!");
+ else
+ notify_fail("Aber " + env->name(WER, 1)
+ + " ist doch nicht einsehbar!");
+ // suche nach Objekten in env ist jetzt zuende, weil nicht in env
+ // reinsehbar.
+ // Aber tokens koennte noch ein detail beschreiben, was der Aufrufer an
+ // env findet. Also tokens nach detail und env zurueckgeben.
+ detail = implode(tokens, " ");
+ return env;
}
}
- // im anderen fall ist das komplette what das gesuchte detail, was wir am
- // Referenzobjekt suchen (sofern vorhanden).
- else
+ // ansonsten schauen, ob in tokens noch ein (weiterer) Container beschrieben
+ // wird.
+ for (int i = sizeof(tokens)-1; i > 1; i--)
{
- base = ref_object;
- detail = what;
+ object ob;
+ // In env oder mir oder umgebung gucken, ob ein passendes Objekt da ist.
+ // Hierfuer werden mit jedem Schleifendurchlauf von hinten mehr worte aus
+ // tokens benutzt. (Beispiel "muenze in boerse 2")
+ if (env)
+ ob = present(implode(tokens[i..], " "), env);
+ else
+ ob = present(implode(tokens[i..], " "), environment()) ||
+ present(implode(tokens[i..], " "), this_object());
+ // Naechster durchlauf, mit einem Wort mehr aus tokens
+ if (!ob)
+ continue;
+
+ // an dieser Stelle wird (noch) nicht geprueft, ob man in das gefundene
+ // Objekt hineinforschen kann.
+
+ // Wenn passende Praeposition davor (z.B. "in" (beutel), "auf" (tisch)),
+ // rekursiv weitersuchen, ob der restliche Teil von tokens evtl. nochmal
+ // nen container in dem gefundenen Objekt bezeichnet.
+ if (tokens[i-1] == ob->QueryProp(P_PREPOSITION))
+ return find_base(ob, tokens[..i-2], &detail, transparent_check);
+
+ // Wenn tokens[i-1] "an" oder "am" ist, wird zwar nicht weiter verzweigt,
+ // aber vermutlich wird ein Detail an diesem Objekt gesucht, d.h. das
+ // Objekt wird env, tokens entsprechend gekuerzt und die Schleife beendet.
+ // Bemerkung: haette ob tatsaechlich eine Praeposition an|am gehabt,
+ // waeren wir vorher in find_base() verzweigt zum Suchen in dem Container.
+ if (tokens[i-1] == "an" || tokens[i-1] == "am") {
+ env = ob;
+ tokens=tokens[..i-2];
+ break;
+ }
+ notify_fail("Du kannst nichts " + tokens[i-1] + " "
+ + ob->name(WEM, 1) + " finden.");
}
- return base;
+ // an diesem Punkt sind in tokens nur noch worte drin, die keinen Container
+ // mehr beschreiben. Die Resttokens kommen nach <detail>, sie beschreiben
+ // dann entweder ein Objekt oder ein Detail.
+ detail = implode(tokens, " ");
+
+ // Wenn es ein env gibt, beschreibt detail nun ein Objekt in env oder ein
+ // Detail an env, was der Aufrufer prueft.
+ // Wenn es aber kein env gibt (das passiert, wenn der Aufrufer dieser
+ // Funktion schon kein env (->Referenzobjekt) hereingegeben hat, wurde auch
+ // kein Container gefunden, der durch die tokens beschrieben wurde. Dann
+ // kann der Aufrufer noch an/in this_object() oder environment() gucken, ob
+ // was zu finden ist.
+ return env;
}
private nosave int exa_cnt;
@@ -438,18 +514,157 @@
}
}
+private int _examine_rec(object ref_object, string *tokens, closure
+ transparent_check, int sense, int mode,
+ int ref_given)
+{
+ // Sodann ein Basisobjekt finden. Das Basisobjekt ist das, was bei einem
+ // "detail an parent" durch parent gekennzeichnet wird oder notfalls das
+ // Ref-Objekt von oben. Zu beachten ist, dass find_base() ggf. rekursiv
+ // arbeitet, um sowas wie "riss an kerze in kerzenstaender auf tisch" zu
+ // finden. detail ist dann das letzte Teil der tokens, der keinen Container
+ // mehr bezeichnet, das gefundene Objekt ist der letzte Container/Item auf
+ // dem Weg zu detail. (detail==riss, base==kerze)
+ string detail; // detail an parent
+ // das fuer parent gefundene objekt
+ object base = find_base(ref_object, tokens, &detail, transparent_check);
+
+ // Jetzt wird versucht, ein Objekt mit der ID "detail" in base oder
+ // ein Detail an base zu finden. Wenn nichts gefunden wird, wird ggf. noch
+ // die Umgebung als ref_object benutzt und das alles hier nochmal gemacht.
+ object *objs;
+ // Wenn base existiert und wir reingucken koennen, ermitteln wir alle zu
+ // detail in Frage kommenanden Objekte in seinem Inventar
+ if (base)
+ {
+ if (base == this_object() || base == environment() ||
+ (funcall(transparent_check, base) && !living(base)))
+ {
+ // ich kann in base reingucken...
+ objs = base->locate_objects(detail, 1) || ({});
+ }
+ else
+ {
+ // Basisobjekt da, aber nicht reinguckbar, also keine Objekte
+ // gefunden. base aber nicht nullen, denn es ist ja noch gueltig fuer
+ // Detailsuchen an base...
+ objs = ({});
+ }
+ }
+ // Wenn kein base, werden alle fuer detail in Frage kommenden Objekte in
+ // unserer Umgebung und in uns selber ermittelt.
+ else
+ {
+ base = environment();
+ objs = environment()->locate_objects(detail, 1)
+ + locate_objects(detail, 1);
+ }
+ // Und in jedem Fall werden alle Objekt raussortiert, die unsichtbar sind.
+ // ;-)
+ objs = filter_objects(objs, "short"); // nur sichtbare...
+
+ // Wenn es sichtbare gibt, werden die ggf. angeguckt.
+ if (sizeof(objs))
+ {
+ // Objekte gefunden, mal schauen, ob die taugen (d.h. fuer den jew. Sinn
+ // Infos haben. Wenn nicht, muessen wir weitersuchen.
+ // Aber erstmal die Objekte durchlaufen.
+ foreach(object ob: objs)
+ {
+ string out;
+ if (sense == SENSE_VIEW)
+ {
+ out = ob->long(mode);
+ }
+ else if (sense == SENSE_READ)
+ {
+ // Extrawurst: P_READ_MSG auch noch abfragen.
+ out = ob->QueryProp(P_READ_MSG);
+ if (!stringp(out))
+ out = ob->GetDetail(SENSE_DEFAULT,QueryProp(P_REAL_RACE),SENSE_READ);
+ }
+ else
+ out=ob->GetDetail(SENSE_DEFAULT,QueryProp(P_REAL_RACE),sense);
+ // Wenn was gefunden wurde, sind wir fertig.
+ if (stringp(out))
+ {
+ SetProp(P_REFERENCE_OBJECT, ob);
+ tell_object(ME, out);
+ return 1;
+ }
+ }
+ }
+ // keine Objekte gefunden oder die hatten nix fuer unseren Sinn
+ // dabei. Also nach ordinaeren Details an base/parent suchen.
+ string out = base->GetDetail(detail, QueryProp(P_REAL_RACE), sense);
+ // Achja, Tueren gibt es ja auch noch. :-o (TODO: die solten vItems werden)
+ if (!out && sense==SENSE_VIEW)
+ out = base->GetDoorDesc(detail);
+ if (out)
+ {
+ // Detail gefunden, base darf neues Referenzobjekt werden und nach
+ // Ausgabe sind wir fertig.
+ SetProp(P_REFERENCE_OBJECT, base);
+ write(out);
+ return 1;
+ }
+ else
+ {
+ // wenn auch keine Details gefunden, dann schauen, unser Env evtl.
+ // noch nen passendes Detail oder Objekt hat. Das ist aber natuerlich
+ // nur der Fall, wenn ref_object nicht eh schon das Environment war.
+ // Ausserdem nicht machen, wenn der Nutzer ein spezifisches Referenzobjekt
+ // angegeben hat (z.B. "in raum").
+ if (ref_object != environment() && !ref_given)
+ {
+ // Wir schauen uns das Env ueber Rekursion noch an. Bei den anderen
+ // Sinnen kein neues notify_fail, weil sonst staendig Meldungen kommen,
+ // dass x nicht da ist, nur weil es keine Beschreibung fuer den Sinn hat.
+ if (sense==SENSE_VIEW)
+ write(break_string("Du findest an "+base->name(WEM)
+ +" kein \"" + capitalize(detail) + "\"."
+ " Dein Blick wendet sich der Umgebung zu.",78));
+
+ return _examine_rec(environment(), tokens, transparent_check, sense,
+ mode, 0);
+ }
+ // Leider ist nix mehr uebrig zum angucken und in jedem Fall Ende.
+ else
+ {
+ // Wenn spezifisches ref_object vom Nutzer angegeben (ref_given!=0),
+ // gibt es eine leicht andere Meldung und das Bezugsobjekt muss weg.
+ // neue notify_fail gibt es nur fuer SENSE_VIEW (s.o.)
+ if (ref_given) {
+ SetProp(P_REFERENCE_OBJECT, 0);
+ if (sense==SENSE_VIEW)
+ _notify_fail("Sowas siehst Du da nicht!\n");
+ }
+ else if (sense==SENSE_VIEW) {
+ _notify_fail("Sowas siehst Du auch da nicht!\n");
+ }
+ return 0;
+ }
+ }
+ // Nie erreicht.
+ return 0;
+}
+
varargs int _examine(string str, int mode)
{
// Sinn auswaehlen, der benutzt wird. Wenn -1, abbrechen (kein Sinn bzw.
// Sinn erlaubt ggf. kein leeren <str> fuer Defaulmeldung). Je nach Sinn
- // wird auch <str>modifiziert.
- int sense=select_sense(&str);
+ // wird auch <str> modifiziert.
+ // transparent_check enthaelt spaeter die Closure, die entscheidet,
+ // ob man mit dem Sinn in einen Container reinforschen kann.
+ closure transparent_check;
+ int sense=select_sense(&str, &transparent_check);
if (sense<0) return 0;
unt_script_dings(str);
// Wenn kein str, dann SENSE_DEFAULT vom Environment ausgeben. Bei
- // SENSE_VIEW wurde das bereits bei den Aufrufern dieser Funktion gemacht.
+ // SENSE_VIEW wird das bereits bei den Aufrufern dieser Funktion gemacht und
+ // die Beschreibung der Umgebung ausgegeben.
if (sense!=SENSE_VIEW)
{
if (!str)
@@ -463,139 +678,17 @@
}
}
- // Das Ref-Objekt finden, das kann dann auch in <what> angeben sein. In dem
- // Fall wird <what> um die Angabe des Ref-Objekts gekuerzt.
- string what;
- object ref_object = get_ref_object(str, &what);
+ string *tokens = explode(str, " ");
+ int ref_given;
+ // Das Ref-Objekt finden, das kann dann auch in tokens angegeben sein. In dem
+ // Fall wird die Liste an tokens um die Angabe des Ref-Objekts gekuerzt und
+ // ref_given gesetzt.
+ object ref_object = get_ref_object(&tokens, transparent_check, &ref_given);
+ // Bemerkung: Das Referenzobjekt ist garantiert sichtbar, aber nicht
+ // unbedingt einsehbar. Wird weiter unten geprueft.
- // Sodann ein Basisobjekt finden. Das Basisobjekt ist das, was bei einem
- // "detail an parent" durch parent gekennzeichnet wird oder notfalls das
- // Ref-Objekt von oben.
- string detail, parent; // detail an parent
- object base; // das fuer parent gefundene objekt
- base = find_base(ref_object, what, &detail, &parent);
-
- // Jetzt wird versucht, ein Objekt mit der ID "detail" in base (parent) oder
- // ein Detail an base zu finden. Die Schleife laeuft ggf. zweimal. Wenn im
- // ersten Durchlauf nichts gefunden wird, wird ggf. noch die Umgebung in
- // einem zweiten Durchlauf anguckt.
- int first_base_was_env = (!base || base==environment() ? 1 : 0);
- do {
- object *objs;
- // Wenn base existiert und wir reingucken koennen, ermitteln wir alle zu
- // detail in Frage kommenanden Objekte in seinem Inventar
- if (base)
- {
- if (base == this_object() || base == environment() ||
- (base->QueryProp(P_TRANSPARENT) && !living(base)))
- {
- // ich kann in base reingucken...
- objs = base->locate_objects(detail, 1) || ({});
- }
- else
- {
- // Basisobjekt da, aber nicht reinguckbar, also keine Objekte
- // gefunden. base aber nicht nullen, denn es ist ja noch gueltig fuer
- // Detailsuchen an base...
- objs = ({});
- }
- }
- // Wenn nicht, werden alle fuer detail in Frage kommenden Objekt in
- // unserer Umgebung und in uns selber ermittelt.
- else
- {
- base = environment();
- objs = environment()->locate_objects(detail, 1)
- + locate_objects(detail, 1);
- }
- // Und in jedem Fall werden alle Objekt raussortiert, die unsichtbar sind.
- // ;-)
- objs = filter_objects(objs, "short"); // nur sichtbare...
-
- // Wenn es sichtbare gibt, werden die ggf. angeguckt.
- if (sizeof(objs))
- {
- // Objekte gefunden, mal schauen, ob die taugen (d.h. fuer den jew. Sinn
- // Infos haben. Wenn nicht, muessen wir weitersuchen.
- // Aber erstmal die Objekte durchlaufen.
- foreach(object ob: objs)
- {
- string out;
- if (sense == SENSE_VIEW)
- {
- out = ob->long(mode);
- }
- else if (sense == SENSE_READ)
- {
- // Extrawurst: P_READ_MSG auch noch abfragen.
- out = ob->QueryProp(P_READ_MSG);
- if (!stringp(out))
- out = ob->GetDetail(SENSE_DEFAULT,QueryProp(P_REAL_RACE),SENSE_READ);
- }
- else
- out=ob->GetDetail(SENSE_DEFAULT,QueryProp(P_REAL_RACE),sense);
- // Wenn was gefunden wurde, sind wir fertig.
- if (stringp(out))
- {
- SetProp(P_REFERENCE_OBJECT, ob);
- tell_object(ME, out);
- return 1;
- }
- }
- }
- // offenbar keine Objekte gefunden oder die hatten nix fuer unseren Sinn
- // dabei. Also nach ordinaeren Details an base/parent suchen.
- string out = base->GetDetail(detail, QueryProp(P_REAL_RACE), sense);
- if (!out && sense==SENSE_VIEW)
- out = base->GetDoorDesc(detail);
- if (out)
- {
- // Detail gefunden, base darf neues Referenzobjekt werden und nach
- // Ausgabe sind wir fertig.
- SetProp(P_REFERENCE_OBJECT, base);
- write(out);
- return 1;
- }
- else
- {
- // wenn auch keine Details gefunden, dann schauen, unser Env evtl.
- // noch nen passendes Detail oder Objekt hat. Das ist aber natuerlich
- // nur der Fall, wenn base nicht eh schon das Environment ist.
- if (base != environment())
- {
- // Wir schauen uns das Env noch an. Bei den anderen Sinnen kein neues
- // notify_fail, weil sonst staendig Meldungen kommen, dass x nicht da
- // ist, nur weil es keine Beschreibung fuer den Sinn hat.
- if (sense==SENSE_VIEW)
- write(break_string("Du findest an "+base->name(WEM)
- +" kein \"" + capitalize(detail) + "\"."
- " Dein Blick wendet sich der Umgebung zu.",78));
- // in diesem Fall nullen wir base und lassen die Schleife noch
- // einmal durchlaufen.
- base = 0;
- continue;
- }
- // Leider ist nix mehr uebrig zum angucken und in jedem Fall Ende.
- else
- {
- // Wenn schon das erste angeguckte base das Environment war (dann
- // ist diese Schleife uebrigens nur einmal gelaufen), gibt es eine
- // leicht andere Meldung und das Bezugsobjekt muss weg.
- // neue notify_fail gibt es nur fuer SENSE_VIEW (s.o.)
- if (first_base_was_env) {
- SetProp(P_REFERENCE_OBJECT, 0);
- if (sense==SENSE_VIEW)
- _notify_fail("Sowas siehst Du da nicht!\n");
- }
- else if (sense==SENSE_VIEW) {
- _notify_fail("Sowas siehst Du auch da nicht!\n");
- }
- return 0;
- }
- }
- } while(1);
- // Nie erreicht.
- return 0;
+ return _examine_rec(ref_object, tokens, transparent_check, sense, mode,
+ ref_given);
}
// Funktion fuer "schau in ..."