#include <language.h>#include <thing/description.h>#include <thing/properties.h>#include <moving.h>#include <container.h>#include <defines.h>#include <wizlevels.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | NEED_PROTOTYPES |
| #define | TME(str) |
| #define | TOB(ob, str) tell_object(ob, break_string(str, 78, 0, BS_LEAVE_MY_LFS)) |
| #define | SAY(str) |
| #define | SAY2(obs, str) |
| #define | NF(str) _notify_fail(break_string(str, 78, 0, BS_LEAVE_MY_LFS)) |
Funktionen | |
| private string | put_or_get (object o, object dest) |
| varargs int | drop (object o, mixed msg) |
| varargs int | put (object o, object dest, mixed msg) |
| varargs int | pick (object o, mixed msg) |
| varargs int | give (object o, object dest, mixed msg) |
| varargs int | show (object o, object whom, mixed msg) |
| private object * | __find_objects (string *tokens, object env, int is_source) |
| object * | find_objects (string what, object env, int is_source) |
| varargs int | drop_objects (string str, mixed msg) |
| varargs int | put_objects (string str, int casus, string verb, mixed msg) |
| varargs int | pick_objects (string str, int flag, mixed msg) |
| varargs int | give_objects (string str, mixed msg) |
| varargs int | show_objects (string str, mixed msg) |
| object * | moved_objects (void) |
| object | moved_where (void) |
| static int | fallenlassen (string str) |
| static int | werfen (string str) |
| static int | legen (string str) |
| static int | stecken (string str) |
| static int | holen (string str) |
| static int | nehmen (string str) |
| static int | geben (string str) |
| static int | zeigen (string str) |
| protected void | add_put_and_get_commands (void) |
| object * | find_obs (string str, int meth) |
| int | pick_obj (object ob) |
| int | drop_obj (object ob) |
| int | put_obj (object ob, object where) |
| int | give_obj (object ob, object where) |
Variablen | |
| private nosave closure | cl |
| private nosave string | wen0 |
| private nosave string | wen1 |
| private nosave string | wer0 |
| private nosave object * | last_moved_objects |
| private nosave object | last_moved_where |
| #define NEED_PROTOTYPES |
Definiert in Zeile 97 der Datei put_and_get.c.
| #define NF | ( | str | ) | _notify_fail(break_string(str, 78, 0, BS_LEAVE_MY_LFS)) |
Definiert in Zeile 116 der Datei put_and_get.c.
Wird benutzt von __find_objects(), give_objects(), pick_objects(), put_objects() und show_objects().
| #define SAY | ( | str | ) |
tell_room(environment(), \
break_string(str, 78, 0, BS_LEAVE_MY_LFS), ({this_object()}))
Definiert in Zeile 112 der Datei put_and_get.c.
Wird benutzt von auswertung(), drop(), pick(), put() und show().
| #define SAY2 | ( | obs, | |||
| str | ) |
tell_room(environment(), \
break_string(str, 78, 0, BS_LEAVE_MY_LFS), ({this_object()}) + obs)
Definiert in Zeile 114 der Datei put_and_get.c.
| #define TME | ( | str | ) |
tell_object(this_object(), \
break_string(str, 78, 0, BS_LEAVE_MY_LFS))
Definiert in Zeile 109 der Datei put_and_get.c.
Wird benutzt von drop(), drop_objects(), give(), give_objects(), pick(), pick_objects(), put(), put_objects() und show().
| #define TOB | ( | ob, | |||
| str | ) | tell_object(ob, break_string(str, 78, 0, BS_LEAVE_MY_LFS)) |
Definiert in Zeile 111 der Datei put_and_get.c.
| private object* __find_objects | ( | string * | tokens, | |
| object | env, | |||
| int | is_source | |||
| ) |
Definiert in Zeile 571 der Datei put_and_get.c.
Benutzt i, NF, ob(), obs, P_CNT_STATUS, P_PREPOSITION, P_SOURCE_PREPOSITION, present_objects(), WEM und WER.
Wird benutzt von find_objects(), give_objects() und put_objects().
00572 { 00573 object ob, *obs; 00574 00575 // is_source == 0: Objekt soll nicht bewegt werden ("topf auf herd") 00576 // 1: Objekt soll bewegt werden ("topf von herd") 00577 // 2: intern 00578 00579 if (!env && sizeof(tokens) > 1 && tokens[<1] == "hier") { 00580 tokens = tokens[..<2]; 00581 env = environment(); 00582 } else if (!env && sizeof(tokens) > 2 && tokens[<2] == "in") 00583 if (tokens[<1] == "mir" || 00584 tokens[<1] == "dir") { 00585 tokens = tokens[..<3]; 00586 env = this_object(); 00587 } else if (tokens[<1] == "raum") { 00588 tokens = tokens[..<3]; 00589 env = environment(); 00590 } 00591 00592 for (int i = sizeof(tokens)-1; i > 1; i--) { 00593 if (env) 00594 ob = present(implode(tokens[i..], " "), env); 00595 else 00596 ob = present(implode(tokens[i..], " "), environment()) || 00597 present(implode(tokens[i..], " "), this_object()); 00598 00599 if (!ob) 00600 continue; 00601 00602 if (living(ob)) { 00603 NF("Aber " + ob->name(WER, 1) + " lebt doch!"); 00604 continue; 00605 } 00606 00607 if (ob->QueryProp(P_CNT_STATUS)) { 00608 NF("Aber " + ob->name(WER, 1) + " ist doch geschlossen!"); 00609 continue; 00610 } 00611 00612 if (is_source != 0 && 00613 tokens[i-1] == ob->QueryProp(P_SOURCE_PREPOSITION)) 00614 return ob->present_objects(implode(tokens[..i-2], " ")); 00615 00616 if (tokens[i-1] == ob->QueryProp(P_PREPOSITION)) 00617 return __find_objects(tokens[..i-2], ob, is_source ? 2 : 0); 00618 00619 NF("Du kannst nichts " + tokens[i-1] + " " + 00620 ob->name(WEM, 1) + " nehmen."); 00621 } 00622 00623 if (is_source == 2) 00624 return ({}); 00625 00626 if (env) 00627 return env->present_objects(implode(tokens, " ")); 00628 00629 if (environment() && 00630 sizeof(obs = environment()->present_objects(implode(tokens, " ")))) 00631 return obs; 00632 00633 return present_objects(implode(tokens, " ")); 00634 }


| protected void add_put_and_get_commands | ( | void | ) |
Definiert in Zeile 1060 der Datei put_and_get.c.
Wird benutzt von create().
01061 { 01062 add_action("fallenlassen", "lass"); 01063 add_action("fallenlassen", "lasse"); 01064 add_action("werfen", "wirf"); 01065 add_action("werfen", "werf"); 01066 add_action("werfen", "werfe"); 01067 add_action("legen", "leg"); 01068 add_action("legen", "lege"); 01069 add_action("stecken", "steck"); 01070 add_action("stecken", "stecke"); 01071 add_action("holen", "hol"); 01072 add_action("holen", "hole"); 01073 add_action("nehmen", "nimm"); 01074 add_action("nehmen", "nehm"); 01075 add_action("nehmen", "nehme"); 01076 add_action("geben", "gebe"); 01077 add_action("geben", "gib"); 01078 add_action("zeigen", "zeig"); 01079 add_action("zeigen", "zeige"); 01080 }

| varargs int drop | ( | object | o, | |
| mixed | msg | |||
| ) |
Definiert in Zeile 299 der Datei put_and_get.c.
Benutzt cl, Name(), P_DROP_MSG, put_or_get(), replace_personal(), SAY, TME, WEN, wen0, wen1, WER und wer0.
Wird benutzt von drop_objects().
00300 { 00301 string str; 00302 00303 // vorher speichern, falls das Objekt zerstoert wird 00304 cl = symbol_function("name", o); 00305 wen0 = funcall(cl, WEN, 0); 00306 wen1 = funcall(cl, WEN, 1); 00307 wer0 = 0; 00308 00309 if (!msg) 00310 msg = o->QueryProp(P_DROP_MSG); 00311 00312 if (str = put_or_get(o, environment())) { 00313 TME(str); 00314 return 0; 00315 } 00316 00317 if (!msg) { 00318 TME("Du laesst " + wen1 + " fallen."); 00319 SAY(Name(WER,1) + " laesst " + wen0 + " fallen."); 00320 } else if (pointerp(msg)) 00321 switch (sizeof(msg)) { 00322 // Wenn es zwei Strings gibt, geht die 2. ans Environment 00323 case 2: 00324 SAY(replace_personal(msg[1], ({this_object(), o||wen0}), 1)); 00325 case 1: 00326 TME(replace_personal(msg[0], ({this_object(), o||wen1}), 1)); 00327 break; 00328 default: 00329 raise_error(sprintf( 00330 "Falsches Format fuer P_DROP_MSG: %O\n", o||wen1)); 00331 } 00332 00333 return 1; 00334 }


| int drop_obj | ( | object | ob | ) |
Definiert in Zeile 1185 der Datei put_and_get.c.
Wird benutzt von give_notify().
01186 { 01187 if (!ob || ob==this_object() || environment(ob)!=this_object()) return 0; 01188 (void) drop(ob); 01189 return 1; 01190 }

| varargs int drop_objects | ( | string | str, | |
| mixed | msg | |||
| ) |
Definiert in Zeile 660 der Datei put_and_get.c.
Benutzt drop(), find_objects(), last_moved_objects, last_moved_where, obs und TME.
00661 { 00662 object *obs; 00663 00664 if (!sizeof(obs = find_objects(str, this_object(), 1))) 00665 return 0; 00666 00667 foreach (object o: obs) { 00668 if (objectp(o)) 00669 drop(o, msg); 00670 00671 if (get_eval_cost() < 100000) { 00672 TME("Den Rest behaeltst Du erst mal."); 00673 last_moved_objects = obs[..member(obs, o)]; 00674 last_moved_where = 0; 00675 return 1; 00676 } 00677 } 00678 00679 last_moved_objects = obs; 00680 last_moved_where = 0; 00681 return 1; 00682 }

| static int fallenlassen | ( | string | str | ) | [static] |
Definiert in Zeile 947 der Datei put_and_get.c.
00948 { 00949 if (QueryProp(P_GHOST)) { 00950 _notify_fail("Als Geist kannst Du nichts fallenlassen.\n"); 00951 return 0; 00952 } 00953 00954 if (!str || str[<7..] != " fallen") { 00955 _notify_fail("Lass etwas FALLEN, oder was meinst Du?\n"); 00956 return 0; 00957 } 00958 00959 _notify_fail("WAS moechtest Du fallenlassen?\n"); 00960 return drop_objects(str[0..<8]); 00961 }
| object* find_objects | ( | string | what, | |
| object | env, | |||
| int | is_source | |||
| ) |
Definiert in Zeile 636 der Datei put_and_get.c.
Benutzt __find_objects().
Wird benutzt von drop_objects(), give_objects() und pick_objects().
00637 { 00638 if (!stringp(what) || !strlen(what)) 00639 return ({}); 00640 return __find_objects(explode(what, " "), env, is_source); 00641 }


| object* find_obs | ( | string | str, | |
| int | meth | |||
| ) |
Definiert in Zeile 1085 der Datei put_and_get.c.
Wird benutzt von _destruct(), _process_command() und look_into().
01087 { 01088 object inv; 01089 if (!str) return 0; 01090 if (str[<7..]==" in mir") { 01091 inv=ME; 01092 str=str[0..<8]; 01093 } 01094 else if (str[<8..]==" in raum") { 01095 if (meth & PUT_GET_DROP) { // man kann nichts aus dem Raum wegwerfen 01096 _notify_fail("Du kannst nichts wegwerfen, das Du gar nicht hast.\n"); 01097 return 0; 01098 } 01099 inv=environment(); 01100 str=str[0..<9]; 01101 } 01102 else if (meth & PUT_GET_DROP) inv=ME; // Raum bei drop uninteressant 01103 // else kein besonderes inv ausgewaehlt also inv=0 01104 if (!strlen(str)) 01105 return 0; // hier passt die bereits gesetzte _notify_fail 01106 else { 01107 object *obs; 01108 string con; 01109 if (sscanf(str, "%s aus %s", str, con)==2 || 01110 sscanf(str, "%s in %s", str, con)==2 || 01111 sscanf(str, "%s von %s", str, con)==2 || 01112 sscanf(str, "%s vom %s", str, con)==2) { 01113 if (!inv) { 01114 if (!environment() || !(inv=present(con, environment()))) 01115 inv=present(con, ME); // sowohl im env als auch im inv suchen 01116 } 01117 else inv=present(con, inv); // nur in ausgewaehltem inv suchen 01118 if (inv==ME) inv=0; 01119 if (!inv || !(inv->short())) { 01120 _notify_fail(break_string("Du hast hier aber kein '"+capitalize(con) 01121 +"'.",78)); 01122 return 0; 01123 } 01124 if (living(inv)) { 01125 _notify_fail(break_string("Aber "+inv->name(WER,1)+" lebt doch!",78)); 01126 return 0; 01127 } 01128 // wieso man aus Objekten die von std/tray abgeleitet werden etwas 01129 // nehmen koennen soll, versteh ich zwar nicht so ganz... 01130 if (!(inv->QueryProp(P_CONTAINER)) && !(inv->QueryProp(P_TRAY))) { 01131 _notify_fail(break_string("Du kannst nichts aus "+inv->name(WEM,1) 01132 +" nehmen.",78)); 01133 return 0; 01134 } 01135 if (inv->QueryProp(P_CNT_STATUS)) { // Container ist geschlossen 01136 _notify_fail(break_string("Aber "+inv->name(WER,1) 01137 +" ist doch geschlossen.", 78)); 01138 return 0; 01139 } 01140 } 01141 else if (inv==ME && (meth & PUT_GET_TAKE)) { // nichts aus sich nehmen 01142 _notify_fail("Du kannst nichts nehmen, " 01143 "was Du schon bei Dir traegst.\n"); 01144 return 0; 01145 } 01146 if (!inv && (meth & PUT_GET_TAKE)) 01147 inv=environment(); // nichts nehmen was man schon hat 01148 01149 if (!inv) { 01150 if (environment()) { 01151 obs=(environment()->present_objects(str)||({})); 01152 if (!sizeof(obs)) obs+=(ME->present_objects(str)||({})); 01153 } 01154 else obs=(ME->present_objects(str) || ({})); 01155 } 01156 else obs=(inv->present_objects(str) || ({})); 01157 return obs-({ ME }); 01158 } 01159 return(0); 01160 }

| static int geben | ( | string | str | ) | [static] |
Definiert in Zeile 1038 der Datei put_and_get.c.
01039 { 01040 if (QueryProp(P_GHOST)) { 01041 _notify_fail("Als Geist kannst Du nichts weggeben.\n"); 01042 return 0; 01043 } 01044 01045 _notify_fail("WEM moechtest Du WAS geben?\n"); 01046 return give_objects(str); 01047 }
| varargs int give | ( | object | o, | |
| object | dest, | |||
| mixed | msg | |||
| ) |
Definiert in Zeile 420 der Datei put_and_get.c.
Benutzt cl, gname, Name(), P_GIVE_MSG, put_or_get(), replace_personal(), SAY2, TME, TOB, WEM, WEN, wen0, wen1, WER und wer0.
Wird benutzt von give_objects().
00421 { 00422 string zname, gname; 00423 string str; 00424 00425 // Falls das jemand von aussen ruft und Schrott uebergibt... 00426 if (!living(dest)) 00427 raise_error(sprintf("Totes Ziel fuer give(): %O\n", dest)); 00428 00429 zname = dest->name(WEM, 1); 00430 gname = Name(WER, 1); 00431 00432 // vorher speichern, falls das Objekt zerstoert wird 00433 cl = symbol_function("name", o); 00434 wen0 = funcall(cl, WEN, 0); 00435 wen1 = funcall(cl, WEN, 1); 00436 wer0 = 0; 00437 00438 if (!msg) 00439 msg = o->QueryProp(P_GIVE_MSG); 00440 00441 if (str = put_or_get(o, dest)) { 00442 TME(str); 00443 return 0; 00444 } 00445 00446 if (!msg) { 00447 TME("Du gibst " + zname + " " + wen1 + "."); 00448 TOB(dest, gname + " gibt Dir " + wen0 + "."); 00449 SAY2(({dest}), gname + " gibt " + zname + " " + wen0 + "."); 00450 } else if (pointerp(msg)) 00451 switch (sizeof(msg)) { 00452 case 3: 00453 TOB(dest, replace_personal( 00454 msg[2], ({this_object(), o||wen0, dest||zname}), 1)); 00455 case 2: 00456 SAY2(({dest, this_object()}), replace_personal( 00457 msg[1], ({this_object(), o||wen0, dest||zname}), 1)); 00458 case 1: 00459 TME(replace_personal( 00460 msg[0], ({this_object(), o||wen1, dest||zname}), 1)); 00461 break; 00462 default: 00463 raise_error(sprintf( 00464 "Falsches Format fuer P_GIVE_MSG: %O\n", o||wen1)); 00465 } 00466 00467 if (!query_once_interactive(dest)) 00468 dest->give_notify(o); 00469 00470 return 1; 00471 }


| int give_obj | ( | object | ob, | |
| object | where | |||
| ) |
Definiert in Zeile 1214 der Datei put_and_get.c.
Wird benutzt von give_notify().
01215 { 01216 object env; 01217 01218 if (environment(ob)!=this_object()) { 01219 TME("Das solltest Du erstmal nehmen."); 01220 return 1; 01221 } 01222 if (!ob || ob == this_object() || ob == where || 01223 environment(where)!=environment()) 01224 return 0; 01225 if (environment(ob) == where) { 01226 _notify_fail("Das Ziel ist in dem zu gebenden Object enthalten!\n"); 01227 return 0; 01228 } 01229 if (environment(ob)!=this_object()) { 01230 TME("Das hast Du nicht."); 01231 return 1; 01232 } 01233 (void) give(ob, where); 01234 return 1; 01235 }

| varargs int give_objects | ( | string | str, | |
| mixed | msg | |||
| ) |
Definiert in Zeile 802 der Datei put_and_get.c.
Benutzt __find_objects(), dest(), find_objects(), give(), i, last_moved_objects, last_moved_where, NF, obs, P_MAX_HANDS, QueryProp(), TME, tokens, WEM und WER.
00803 { 00804 object *obs, dest; 00805 00806 if (!stringp(str) || !strlen(str)) return 0; 00807 00808 string *tokens = explode(str, " "); 00809 00810 if (((int)QueryProp(P_MAX_HANDS)) < 1){ 00811 NF("Ohne Haende kannst Du nichts weggeben."); 00812 return 0; 00813 } 00814 00815 for (int i = 0; i < sizeof(tokens)-1; i++) { 00816 if (!(dest = present(implode(tokens[..i], " "), environment()))) 00817 continue; 00818 00819 if (!living(dest)) { 00820 NF("Aber " + dest->name(WER, 1) + " lebt doch gar nicht!"); 00821 dest = 0; 00822 continue; 00823 } 00824 00825 if (!sizeof(obs = __find_objects(tokens[i+1..], 0, 1))) { 00826 NF("WAS moechtest Du " + dest->name(WEM, 1)+" geben?"); 00827 dest = 0; 00828 } else 00829 break; 00830 } 00831 00832 if (!dest) { 00833 int pos; 00834 00835 if ((pos = strrstr(str, " an ")) >= 0) { 00836 dest = present(str[pos+4..], environment()); 00837 obs = find_objects(str[..pos-1], this_object(), 1); 00838 } 00839 } 00840 00841 if (!dest || !living(dest) || !sizeof(obs)) 00842 return 0; 00843 00844 foreach (object o: obs) { 00845 if (objectp(o)) 00846 give(o, dest, msg); 00847 00848 if (get_eval_cost() < 100000) { 00849 TME("Den Rest behaeltst Du erst mal."); 00850 last_moved_objects = obs[..member(obs, o)]; 00851 last_moved_where = dest; 00852 return 1; 00853 } 00854 } 00855 00856 last_moved_objects = obs; 00857 last_moved_where = dest; 00858 return 1; 00859 }

| static int holen | ( | string | str | ) | [static] |
Definiert in Zeile 1016 der Datei put_and_get.c.
01017 { 01018 if (QueryProp(P_GHOST)) { 01019 _notify_fail("Als Geist kannst Du nichts nehmen.\n"); 01020 return 0; 01021 } 01022 01023 _notify_fail("WAS moechtest Du aus WAS holen?\n"); 01024 return pick_objects(str, 1); 01025 }
| static int legen | ( | string | str | ) | [static] |
Definiert in Zeile 979 der Datei put_and_get.c.
00980 { 00981 if (QueryProp(P_GHOST)) { 00982 _notify_fail("Als Geist kannst Du nichts weglegen.\n"); 00983 return 0; 00984 } 00985 00986 if (!str) { 00987 _notify_fail("Lege etwas AB, oder was meinst Du?\n"); 00988 return 0; 00989 } 00990 00991 if (str[<3..] == " ab") { 00992 _notify_fail("WAS moechtest Du ablegen?\n"); 00993 return drop_objects(str[0..<4]); 00994 } 00995 00996 if (str[<4..] == " weg") { 00997 _notify_fail("WAS moechtest Du weglegen?\n"); 00998 return drop_objects(str[0..<5]); 00999 } 01000 01001 _notify_fail("WAS moechtest Du WOHIN legen?\n"); 01002 return put_objects(str, WEN, "legen"); 01003 }
| object* moved_objects | ( | void | ) |
Definiert in Zeile 920 der Datei put_and_get.c.
00921 { 00922 return last_moved_objects; 00923 }
| object moved_where | ( | void | ) |
Definiert in Zeile 925 der Datei put_and_get.c.
00926 { 00927 return last_moved_where; 00928 }
| static int nehmen | ( | string | str | ) | [static] |
Definiert in Zeile 1027 der Datei put_and_get.c.
01028 { 01029 if (QueryProp(P_GHOST)) { 01030 _notify_fail("Als Geist kannst Du nichts nehmen.\n"); 01031 return 0; 01032 } 01033 01034 _notify_fail("WAS moechtest Du nehmen?\n"); 01035 return pick_objects(str, 0); 01036 }
| varargs int pick | ( | object | o, | |
| mixed | msg | |||
| ) |
Definiert in Zeile 384 der Datei put_and_get.c.
Benutzt cl, Name(), P_PICK_MSG, put_or_get(), replace_personal(), SAY, TME, WEN, wen0, wen1, WER und wer0.
00385 { 00386 string str; 00387 00388 // vorher speichern, falls das Objekt zerstoert wird 00389 cl = symbol_function("name", o); 00390 wen0 = 0; 00391 wen1 = funcall(cl, WEN, 1); 00392 wer0 = 0; 00393 00394 if (!msg) 00395 msg = o->QueryProp(P_PICK_MSG); 00396 00397 if (str = put_or_get(o, this_object())) { 00398 TME(str); 00399 return 0; 00400 } 00401 00402 if (!msg) { 00403 TME("Du nimmst " + wen1 + "."); 00404 SAY(Name(WER, 1) + " nimmt " + wen1 + "."); 00405 } else if (pointerp(msg)) 00406 switch (sizeof(msg)) { 00407 case 2: 00408 SAY(replace_personal(msg[1], ({this_object(), o||wen1}), 1)); 00409 case 1: 00410 TME(replace_personal(msg[0], ({this_object(), o||wen1}), 1)); 00411 break; 00412 default: 00413 raise_error(sprintf( 00414 "Falsches Format fuer P_PICK_MSG: %O\n", o||wen1)); 00415 } 00416 00417 return 1; 00418 }

| int pick_obj | ( | object | ob | ) |
Definiert in Zeile 1162 der Datei put_and_get.c.
01163 { 01164 object env; 01165 01166 if (!ob || ob == this_object() || environment(ob) == this_object()) return 0; 01167 if ((env=environment(ob)) != environment()) { 01168 if (!env->QueryProp(P_CONTAINER) && !env->QueryProp(P_TRAY)) { 01169 TME("Du kannst nichts aus " + env->name(WEM,1) + " nehmen."); 01170 return 1; 01171 } 01172 else if (env->QueryProp(P_CNT_STATUS)) { // Container ist geschlossen 01173 TME("Aber " + env->name(WER, 1) + " ist doch geschlossen."); 01174 return 1; 01175 } 01176 } 01177 if (ob->IsUnit() && ob->QueryProp(P_AMOUNT)<0) { 01178 TME("Du kannst nicht mehr nehmen als da ist."); 01179 return 1; 01180 } 01181 (void) pick(ob); 01182 return 1; 01183 }
| varargs int pick_objects | ( | string | str, | |
| int | flag, | |||
| mixed | msg | |||
| ) |
Definiert in Zeile 772 der Datei put_and_get.c.
Benutzt find_objects(), last_moved_objects, last_moved_where, NF, obs, P_MAX_HANDS, pick(), QueryProp() und TME.
00773 { 00774 object *obs; 00775 00776 if (((int)QueryProp(P_MAX_HANDS)) < 1){ 00777 NF("Ohne Haende kannst Du nichts nehmen."); 00778 return 0; 00779 } 00780 00781 if (!sizeof(obs = find_objects(str, 0, 1) - all_inventory() 00782 - (flag ? all_inventory(environment()) : ({})))) 00783 return 0; 00784 00785 foreach (object o: obs) { 00786 if (objectp(o)) 00787 pick(o, msg); 00788 00789 if (get_eval_cost() < 100000) { 00790 TME("Den Rest laesst Du erst mal liegen."); 00791 last_moved_objects = obs[..member(obs, o)]; 00792 last_moved_where = 0; 00793 return 1; 00794 } 00795 } 00796 00797 last_moved_objects = obs; 00798 last_moved_where = 0; 00799 return 1; 00800 }

| varargs int put | ( | object | o, | |
| object | dest, | |||
| mixed | msg | |||
| ) |
Definiert in Zeile 336 der Datei put_and_get.c.
Benutzt cl, Name(), P_PUT_MSG, put_or_get(), replace_personal(), SAY, TME, WEN, wen0, wen1, WER und wer0.
00337 { 00338 string str; 00339 00340 // Falls das jemand von aussen ruft und Schrott uebergibt... 00341 //if (living(dest)) 00342 // raise_error(sprintf("Lebendes Ziel fuer put(): %O\n", dest)); 00343 if (dest == environment()) 00344 raise_error("Ziel fuer put() ist Umgebung des Spielers\n"); 00345 00346 // vorher speichern, falls das Objekt zerstoert wird 00347 cl = symbol_function("name", o); 00348 wen0 = funcall(cl, WEN, 0); 00349 wen1 = funcall(cl, WEN, 1); 00350 wer0 = funcall(cl, WER, 0); 00351 00352 if (!msg) 00353 msg = o->QueryProp(P_PUT_MSG); 00354 00355 if (str = put_or_get(o, dest)) { 00356 TME(str); 00357 return 0; 00358 } 00359 00360 00361 if (!msg) { 00362 TME("Du steckst " + wen1 + " in " + dest->name(WEN, 1) + "."); 00363 if (environment()) 00364 SAY(Name(WER, 1) + " steckt " + wen0 + 00365 " in " + dest->name(WEN, 0) + "."); 00366 } 00367 else if (pointerp(msg)) { 00368 switch (sizeof(msg)) { 00369 case 2: 00370 if (environment()) 00371 SAY(replace_personal(msg[1], ({this_object(), o||wen0, dest}), 1)); 00372 case 1: 00373 TME(replace_personal(msg[0], ({this_object(), o||wen1, dest}), 1)); 00374 break; 00375 default: 00376 raise_error(sprintf( 00377 "Falsches Format fuer P_PUT_MSG: %O\n",o||wen1)); 00378 } 00379 } 00380 00381 return 1; 00382 }

| int put_obj | ( | object | ob, | |
| object | where | |||
| ) |
Definiert in Zeile 1192 der Datei put_and_get.c.
01193 { 01194 object env; 01195 01196 if (ob == this_object() || ob == where || environment(ob) == where) return 0; 01197 env=environment(ob); 01198 if (!where->QueryProp(P_CONTAINER)) { 01199 TME("Du kannst in " + where->name(WEN,1) + " nix reinstecken."); 01200 return 1; 01201 } 01202 if (where->QueryProp(P_CNT_STATUS)) { // Container ist geschlossen 01203 TME("Aber " + where->name(WER, 1) + " ist doch geschlossen."); 01204 return 1; 01205 } 01206 if (env!=environment(this_object()) && env!=this_object()) { 01207 _notify_fail("Da kommst du so nicht ran.\n"); 01208 return 0; 01209 } 01210 (void) put(ob, where); 01211 return 1; 01212 }
| varargs int put_objects | ( | string | str, | |
| int | casus, | |||
| string | verb, | |||
| mixed | msg | |||
| ) |
Definiert in Zeile 684 der Datei put_and_get.c.
Benutzt __find_objects(), CountUp(), dest(), i, last_moved_objects, last_moved_where, NF, obs, P_CNT_STATUS, P_CONTAINER, P_DEST_PREPOSITION, put(), TME, tokens, WEM, WEN und WER.
00685 { 00686 object *obs, dest, *no_move; 00687 00688 if (!stringp(str) || !strlen(str)) return 0; 00689 00690 string *tokens = explode(str, " "); 00691 int allow_room = 1; 00692 int allow_me = 1; 00693 00694 if (sizeof(tokens) > 1 && tokens[<1] == "hier") { 00695 tokens = tokens[..<2]; 00696 allow_me = 0; 00697 } else if (sizeof(tokens) > 2 && tokens[<2] == "in") 00698 if (tokens[<1] == "mir" || 00699 tokens[<1] == "dir") { 00700 tokens = tokens[..<3]; 00701 allow_room = 0; 00702 } else if (tokens[<1] == "raum") { 00703 tokens = tokens[..<3]; 00704 allow_me = 0; 00705 } 00706 00707 for (int i = sizeof(tokens)-1; i > 1; i--) { 00708 if (!(dest = allow_room && present(implode(tokens[i..], " "), 00709 environment())) && 00710 !(dest = allow_me && present(implode(tokens[i..], " "), 00711 this_object()))) 00712 continue; 00713 00714 if (living(dest)) { 00715 NF("Aber " + dest->name(WER, 1) + " lebt doch!"); 00716 continue; 00717 } 00718 /* 00719 if (verb == "legen" && !dest->QueryProp(P_TRAY)) { 00720 NF("Du kannst nichts auf " + dest->name(WEN, 1) + " legen."); 00721 continue; 00722 } 00723 */ 00724 if (verb == "stecken" && !dest->QueryProp(P_CONTAINER)) { 00725 NF("Du kannst in " + dest->name(WEN, 1) + " nichts reinstecken."); 00726 continue; 00727 } 00728 00729 if (dest->QueryProp(P_CNT_STATUS)) { 00730 NF("Aber " + dest->name(WER, 1) + " ist doch geschlossen!"); 00731 continue; 00732 } 00733 00734 if (tokens[i-1] != dest->QueryProp(P_DEST_PREPOSITION)) { 00735 NF("Du kannst nichts " + tokens[i-1] + " " + 00736 dest->name(casus, 1) + " " + verb + "."); 00737 continue; 00738 } 00739 00740 if (!sizeof(obs = __find_objects(tokens[..i-2], 0, 1) - ({ dest }))) { 00741 NF("WAS moechtest Du " + tokens[i-1] + " " + 00742 dest->name(casus, 1) + " " + verb + "?"); 00743 return 0; 00744 } 00745 00746 if (sizeof(no_move = obs & all_inventory(dest))) { 00747 TME(capitalize(CountUp(map_objects(no_move, "name", WER, 1))) + 00748 (sizeof(no_move) == 1 ? " ist" : " sind") + 00749 " doch bereits in " + dest->name(WEM,1) + "."); 00750 if (!sizeof(obs -= no_move)) 00751 return 0; 00752 } 00753 00754 foreach (object o: obs) { 00755 if (objectp(o)) 00756 put(o, dest, msg); 00757 00758 if (get_eval_cost() < 100000) { 00759 TME("Den Rest laesst Du erst mal, wo er ist."); 00760 last_moved_objects = obs[..member(obs, o)]; 00761 last_moved_where = dest; 00762 return 1; 00763 } 00764 } 00765 00766 last_moved_objects = obs; 00767 last_moved_where = dest; 00768 return 1; 00769 } 00770 }

| private string put_or_get | ( | object | o, | |
| object | dest | |||
| ) |
Definiert in Zeile 126 der Datei put_and_get.c.
Benutzt M_GET, M_GIVE, M_PUT, ME_CANT_BE_DROPPED, ME_CANT_BE_INSERTED, ME_CANT_BE_TAKEN, ME_CANT_LEAVE_ENV, ME_TOO_HEAVY, ME_TOO_HEAVY_FOR_ENV, Name(), P_ENV_TOO_HEAVY_MSG, P_GHOST, P_NODROP, P_NOGET, P_NOINSERT_MSG, P_NOLEAVE_MSG, P_TOO_HEAVY_MSG, P_TOO_MANY_MSG, QueryProp(), replace_personal(), TOO_MANY_OBJECTS, WEM, WEN, wen0, wen1, WER und wer0.
Wird benutzt von drop(), give(), pick() und put().
00134 { 00135 int method, ret; 00136 string str; 00137 00138 //if (living(o)) 00139 // raise_error(sprintf("Lebendes Argument fuer put_or_get: %O\n", o)); 00140 00141 if (dest == this_object()) /* pick */ 00142 method = M_GET; 00143 else if (dest == environment()) /* drop */ 00144 method = M_PUT; 00145 else if (living(dest)) /* give */ 00146 method = M_GIVE; 00147 else { /* put */ 00148 method = M_PUT | M_GET; 00149 if (first_inventory(o)) 00150 return o->Name(WER, 1) + " ist nicht leer!"; 00151 } 00152 00153 if ((ret = o->move(dest, method)) > 0) 00154 return 0; 00155 00156 switch (ret) { 00157 case ME_TOO_HEAVY: 00158 if (dest == this_object()) 00159 if (QueryProp(P_GHOST)) 00160 return "Als Geist kannst Du nichts mitnehmen."; 00161 else 00162 return "Du kannst " + wen1 + " nicht mehr tragen."; 00163 00164 if (stringp(str = dest->QueryProp(P_TOO_HEAVY_MSG))) 00165 return capitalize(replace_personal(str, ({o, dest}), 1)); 00166 00167 if (living(dest)) { 00168 if (dest->QueryProp(P_GHOST)) 00169 return "Als Geist kann " + dest->name(WER, 1) + 00170 " nichts mitnehmen."; 00171 else 00172 return dest->Name(WER, 1) + " kann " + 00173 wen0 + " nicht mehr tragen."; 00174 } 00175 00176 if (dest == environment()) 00177 return (stringp(str = dest->Name(WER, 1)) && strlen(str) ? 00178 str : "Der Raum") + " wuerde dann zu schwer werden."; 00179 00180 return capitalize(wer0 + " passt in " + dest->name(WEN, 1) + 00181 " nicht mehr rein."); 00182 00183 case ME_CANT_BE_DROPPED: 00184 if (o && stringp(str = o->QueryProp(P_NODROP))) 00185 return str; 00186 00187 if (dest == environment()) 00188 return "Du kannst " + wen1 + " nicht wegwerfen!"; 00189 00190 if (living(dest)) 00191 return "Du kannst " + wen1 + " nicht weggeben."; 00192 00193 return "So wirst Du " + wen1 + " nicht los..."; 00194 00195 case ME_CANT_BE_TAKEN: 00196 if (o && stringp(str = o->QueryProp(P_NOGET))) 00197 return str; 00198 00199 if (stringp(str = environment(o)->QueryProp(P_NOLEAVE_MSG))) 00200 return capitalize( 00201 replace_personal(str, ({o, environment(o)}), 1)); 00202 00203 //if (dest != environment()) 00204 // return "Du kannst " + wen1 + " nicht einmal nehmen."; 00205 00206 return "Du kannst " + wen1 + " nicht nehmen."; 00207 00208 case ME_CANT_BE_INSERTED: 00209 if (stringp(str = dest->QueryProp(P_NOINSERT_MSG))) 00210 return capitalize(replace_personal(str, ({o, dest}), 1)); 00211 00212 if (dest == environment()) 00213 return "Das darfst Du hier nicht ablegen."; 00214 00215 if (dest == this_object()) 00216 return "Du kannst " + wen1 + " nicht nehmen."; 00217 00218 if (living(dest)) 00219 return "Das kannst Du " + dest->name(WEM, 1) + " nicht geben."; 00220 00221 return capitalize(wen0 + " kannst Du dort nicht hineinstecken."); 00222 00223 case ME_CANT_LEAVE_ENV: 00224 // ME_CANT_LEAVE_ENV kann nur auftreten, wenn o ein Environment 00225 // hat, deshalb kein Check dadrauf 00226 if (stringp(str = environment(o)->QueryProp(P_NOLEAVE_MSG))) 00227 return capitalize( 00228 replace_personal(str, ({o, environment(o)}), 1)); 00229 00230 if (environment(o) != this_object()) 00231 return "Du kannst " + wen1 + " nicht nehmen."; 00232 00233 if (dest == environment()) 00234 return "Du kannst " + wen1 + " nicht wegwerfen!"; 00235 00236 if (living(dest)) 00237 return "Du kannst " + wen1 + " nicht weggeben."; 00238 00239 return "So wirst Du " + wen1 + " nicht los..."; 00240 00241 case ME_TOO_HEAVY_FOR_ENV: 00242 if (stringp(str = dest->QueryProp(P_ENV_TOO_HEAVY_MSG))) 00243 return capitalize(replace_personal(str, ({o, dest}), 1)); 00244 00245 if (environment(dest) == this_object()) 00246 return dest->Name(WER, 1) + 00247 " wuerde Dir dann zu schwer werden."; 00248 00249 return (stringp(str = environment(dest)->Name(WER, 1)) 00250 && strlen(str) ? str : "Der Raum") + 00251 " wuerde dann zu schwer werden."; 00252 00253 case TOO_MANY_OBJECTS: 00254 if (stringp(str = dest->QueryProp(P_TOO_MANY_MSG))) 00255 return capitalize(replace_personal(str, ({o, dest}), 1)); 00256 00257 if (dest == this_object()) 00258 return "Soviele Gegenstaende kannst Du unmoeglich tragen!"; 00259 00260 if (dest == environment()) 00261 return "Dafuer ist hier nicht mehr genug Platz."; 00262 00263 if (living(dest)) 00264 return dest->Name(WER, 1) + " kann " + wen0 + 00265 " nicht mehr tragen."; 00266 00267 return "Dafuer ist nicht mehr genug Platz in " + 00268 dest->name(WEM, 1) + "."; 00269 00270 default: 00271 if (dest == this_object()) 00272 return "Du kannst " + wen1 + " nicht nehmen."; 00273 00274 if (dest == environment()) 00275 return "Du kannst " + wen1 + " nicht wegwerfen!"; 00276 00277 if (living(dest)) 00278 return "Du kannst " + wen1 + " nicht weggeben."; 00279 00280 return capitalize(wen0 + " kannst Du dort nicht hineinstecken."); 00281 } 00282 }


| varargs int show | ( | object | o, | |
| object | whom, | |||
| mixed | msg | |||
| ) |
Definiert in Zeile 473 der Datei put_and_get.c.
Benutzt FEMALE, gname, long(), MALE, Name(), P_AMOUNT, P_ARTICLE, P_GENDER, P_SHOW_MSG, PLURAL, QueryPossPronoun(), replace_personal(), SAY, SAY2, SINGULAR, TME, TOB, WEM, WEN, wen0 und WER.
00474 { 00475 string zname, gname; 00476 string wen0, wen2, long; 00477 00478 zname = whom ? whom->name(WEM, 1) : "allen"; 00479 gname = Name(WER, 1); 00480 00481 if (!msg) 00482 msg = o->QueryProp(P_SHOW_MSG); 00483 00484 if (environment(o) == this_object() || 00485 environment(environment(o)) == this_object()) { 00486 wen0 = o->name(WEN, 0); 00487 00488 /* Der Akkusativ muss mit dem unbestimmten Artikel gebildet werden, 00489 * damit eventuelle Adjektive die richtige Endung besitzen. 00490 * (ein kleines Schwert -> kleines Schwert -> Dein kleines Schwert) 00491 */ 00492 00493 if (o->QueryProp(P_ARTICLE) && member(wen0, ' ') >= 0) { 00494 int obgender = o->QueryProp(P_GENDER); 00495 int obnum = o->QueryProp(P_AMOUNT) > 1 ? PLURAL : SINGULAR; 00496 00497 // Wichtig: P_AMOUNT ist 0 fuer Objekte, die nicht von unit erben. 00498 // Da unit.c kein P_AMOUNT==0 zulaesst, nehmen wir diesen Fall als 00499 // singular an. *Rumata 00500 00501 wen2 = wen0[member(wen0, ' ')..]; 00502 wen0 = QueryPossPronoun(o, WEN, obnum) + wen2; 00503 00504 if (obnum == PLURAL || obgender == FEMALE) 00505 wen2 = "Deine" + wen2; 00506 else if (obgender == MALE) 00507 wen2 = "Deinen" + wen2; 00508 else 00509 wen2 = "Dein" + wen2; 00510 } else 00511 wen2 = wen0; 00512 } else 00513 wen2 = wen0 = o->name(WEN, 1); 00514 00515 // vorher speichern, falls das Objekt im catch_tell() zerstoert wird 00516 long = o->long(4); 00517 00518 if (!msg) { 00519 TME("Du zeigst " + zname + " " + wen2 + "."); 00520 if (!whom) 00521 SAY(gname + " zeigt Dir " + wen0 + "."); 00522 else { 00523 TOB(whom, gname + " zeigt Dir " + wen0 + "."); 00524 SAY2(({whom}), gname + " zeigt " + zname + " " + wen0 + "."); 00525 } 00526 } else if (pointerp(msg)) 00527 switch (sizeof(msg)) { 00528 case 3: 00529 if (whom) 00530 TOB(whom, replace_personal( 00531 msg[2], ({this_object(), o||wen0, whom||zname}), 1)); 00532 else 00533 SAY(replace_personal( 00534 msg[2], ({this_object(), o||wen0, whom||zname}), 1)); 00535 case 2: 00536 if (whom) 00537 SAY2(({whom, this_object()}), replace_personal( 00538 msg[1], ({this_object(), o||wen0, whom||zname}), 1)); 00539 case 1: 00540 TME(replace_personal( 00541 msg[0], ({this_object(), o||wen2, whom||zname}), 1)); 00542 break; 00543 default: 00544 raise_error(sprintf( 00545 "Falsches Format fuer P_SHOW_MSG: %O\n", o||wen0)); 00546 } 00547 00548 if (!whom) 00549 SAY(long); 00550 else { 00551 TOB(whom, long); 00552 if (!query_once_interactive(whom)) 00553 whom->show_notify(o); 00554 } 00555 00556 return 1; 00557 }

| varargs int show_objects | ( | string | str, | |
| mixed | msg | |||
| ) |
Definiert in Zeile 861 der Datei put_and_get.c.
Benutzt i, NF, obs, tokens und WER.
00862 { 00863 object *obs, whom; 00864 00865 if (!stringp(str) || !strlen(str)) 00866 return 0; 00867 00868 string *tokens = explode(str, " "); 00869 00870 for (int i = 0; i < sizeof(tokens)-1; i++) { 00871 if (whom = present(implode(tokens[..i], " "), environment())) { 00872 if (!living(whom)) { 00873 NF("Aber " + whom->name(WER, 1) + " lebt doch gar nicht!"); 00874 continue; 00875 } 00876 } else { 00877 if (i != 0 || tokens[0] != "allen") 00878 continue; 00879 00880 if (!sizeof(filter(all_inventory(environment()) - 00881 ({ this_object() }), #'living))) { 00882 NF("Hier ist niemand, dem Du etwas zeigen koenntest!"); 00883 continue; 00884 } 00885 } 00886 00887 if (whom == this_object()) { 00888 NF("Dazu solltest Du dann besser 'schau' benutzen!\n"); 00889 continue; 00890 } 00891 00892 if (!sizeof(obs = __find_objects(tokens[i+1..], this_object(), 0)) && 00893 !sizeof(obs = __find_objects(tokens[i+1..], 0, 0) 00894 - ({ this_object(), whom }))) { 00895 NF("WAS moechtest Du " + (whom ? whom->name(WEM, 1) : "allen") + 00896 " zeigen?"); 00897 continue; 00898 } 00899 00900 foreach (object o: obs) { 00901 if (objectp(o)) 00902 show(o, whom, msg); 00903 00904 if (get_eval_cost() < 100000) { 00905 TME("Das reicht erst mal."); 00906 last_moved_objects = obs[..member(obs, o)]; 00907 last_moved_where = whom; 00908 return 1; 00909 } 00910 } 00911 00912 last_moved_objects = obs; 00913 last_moved_where = whom; 00914 return 1; 00915 } 00916 00917 return 0; 00918 }
| static int stecken | ( | string | str | ) | [static] |
Definiert in Zeile 1005 der Datei put_and_get.c.
01006 { 01007 if (QueryProp(P_GHOST)) { 01008 _notify_fail("Das kannst Du in Deinem immateriellen Zustand nicht.\n"); 01009 return 0; 01010 } 01011 01012 _notify_fail("WAS moechtest Du WOHIN stecken?\n"); 01013 return put_objects(str, WEN, "stecken"); 01014 }
| static int werfen | ( | string | str | ) | [static] |
Definiert in Zeile 963 der Datei put_and_get.c.
00964 { 00965 if (QueryProp(P_GHOST)) { 00966 _notify_fail("Als Geist kannst Du nichts wegwerfen.\n"); 00967 return 0; 00968 } 00969 00970 if (!str || str[<4..] != " weg") { 00971 _notify_fail("Wirf etwas WEG, oder was meinst Du?\n"); 00972 return 0; 00973 } 00974 00975 _notify_fail("WAS moechtest Du loswerden?\n"); 00976 return drop_objects(str[0..<5]); 00977 }
| static int zeigen | ( | string | str | ) | [static] |
Definiert in Zeile 1049 der Datei put_and_get.c.
01050 { 01051 if (QueryProp(P_GHOST)) { 01052 _notify_fail("Als Geist kannst Du niemandem etwas zeigen.\n"); 01053 return 0; 01054 } 01055 01056 _notify_fail("WEM moechtest Du WAS zeigen?\n"); 01057 return show_objects(str); 01058 }
| private nosave closure cl |
Definiert in Zeile 118 der Datei put_and_get.c.
Wird benutzt von AddCmd(), AddSpecialInfo(), Attack(), check_restrictions(), DoAddMember(), DoUnwield(), DoWield(), drop(), get_uids(), give(), heart_beat(), Identify(), pick(), put(), QuerySkillAttribute(), RegisterEvent() und setup().
| private nosave object* last_moved_objects |
Definiert in Zeile 120 der Datei put_and_get.c.
Wird benutzt von drop_objects(), give_objects(), pick_objects() und put_objects().
| private nosave object last_moved_where |
Definiert in Zeile 121 der Datei put_and_get.c.
Wird benutzt von drop_objects(), give_objects(), pick_objects() und put_objects().
| private nosave string wen0 |
Definiert in Zeile 119 der Datei put_and_get.c.
Wird benutzt von drop(), give(), pick(), put(), put_or_get() und show().
| private nosave string wen1 |
Definiert in Zeile 119 der Datei put_and_get.c.
Wird benutzt von drop(), give(), pick(), put() und put_or_get().
| private nosave string wer0 |
Definiert in Zeile 119 der Datei put_and_get.c.
Wird benutzt von drop(), give(), pick(), put() und put_or_get().
1.6.3