find_objects() kommentiert.
Change-Id: I7fda6ac7c0c267d4c3590c3be46307092a83dd35
diff --git a/std/living/put_and_get.c b/std/living/put_and_get.c
index 7340936..a0b9575 100644
--- a/std/living/put_and_get.c
+++ b/std/living/put_and_get.c
@@ -580,6 +580,9 @@
// 1: Objekt soll bewegt werden ("topf von herd")
// 2: intern
+ // ganz am Ende von den tokens steht ggf. der vom User gewuenschte Anfang
+ // der Suche nache dem Objekt (z.B. "fackel aus truhe hier" oder "seil aus
+ // paket in mir".
if (!env && sizeof(tokens) > 1 && tokens[<1] == "hier") {
tokens = tokens[..<2];
env = environment();
@@ -598,6 +601,9 @@
}
for (int i = sizeof(tokens)-1; i > 1; i--) {
+ // wird fangen am Ende der Tokens an und arbeiten uns wortweise nach
+ // vorne, um ein Objekt zu finden. (z.B. "... in paket 12" wuerde 2
+ // Durchlaeufe brauchen)
if (env)
ob = present(implode(tokens[i..], " "), env);
else
@@ -607,20 +613,32 @@
if (!ob)
continue;
+ // aus Lebewesen darf man nix rausnehmen oder reingucken
if (living(ob)) {
NF("Aber " + ob->name(WER, 1) + " lebt doch!");
continue;
}
+ // und aus geschlossenen Containern auch nicht.
if (ob->QueryProp(P_CNT_STATUS)) {
NF("Aber " + ob->name(WER, 1) + " ist doch geschlossen!");
continue;
}
-
+ // Wenn was rausgenommen werden soll und jetzt vor dem gefundenen
+ // Container die passende Praeposition steht (z.B. "aus"), wird
+ // angenommen, dass der vordere Teil der Tokens zu aus diesem
+ // Container zu nehmende Objekt bezeichnet und in present_objects
+ // dieses Containers verzweigt.
if (is_source != 0 &&
tokens[i-1] == ob->QueryProp(P_SOURCE_PREPOSITION))
return ob->present_objects(implode(tokens[..i-2], " "));
+ // Wenn vor dem gefundenen Objekt dessen normale Praeposition steht
+ // (z.B. "in", "auf"), wird rekursiv geschaut, ob der vordere Teil der
+ // Tokens erneut einen Container bezeichnet. is_source==2 wird
+ // uebergebeb, damit in der Rekursion nur Objekte vor der
+ // P_SOURCE_PREPOSITION geliefert werden, aber keine aus
+ // Environment/this_object() (s.u. nach der Schleife).
if (tokens[i-1] == ob->QueryProp(P_PREPOSITION))
return __find_objects(tokens[..i-2], ob, is_source ? 2 : 0);
@@ -630,14 +648,19 @@
if (is_source == 2)
return ({});
-
+ // wenn das for keine Container gefunden hat (auch: wenn tokens zu kurz
+ // fuers for), wird im uebergebenen env geguckt, ob der vorderste Rest von
+ // tokens nen Objekt bezeichnet.
+ // geguckt, ob nen pass
if (env)
return env->present_objects(implode(tokens, " "));
+ // Und wenn kein env uebergeben und gefunden wurde, wird geguckt, ob unser
+ // Environment nen passendes Objekt fuer tokens hat...
if (environment() &&
sizeof(obs = environment()->present_objects(implode(tokens, " "))))
return obs;
-
+ // oder eben wir selbst.
return present_objects(implode(tokens, " "));
}