MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | #pragma strong_types, save_types, rtt_checks |
| 2 | #pragma no_shadow, no_clone |
| 3 | |
| 4 | inherit "/std/thing"; |
| 5 | |
| 6 | #include <language.h> |
| 7 | #include <properties.h> |
| 8 | #include <items/fishing/fishing.h> |
| 9 | #include <items/flasche.h> |
| 10 | #include <unit.h> |
| 11 | |
| 12 | #define TP this_player() |
| 13 | #define ME this_object() |
| 14 | |
| 15 | int QueryKoeder(); |
| 16 | |
| 17 | protected void create() { |
| 18 | ::create(); |
| 19 | |
| 20 | AddId(({HAKEN_ID,"haken","angelhaken"})); |
| 21 | SetProp(P_NAME, "Haken"); |
| 22 | SetProp(P_GENDER, MALE); |
| 23 | SetProp(P_ARTICLE, 1); |
| 24 | SetProp(P_WEIGHT, 5); |
| 25 | SetProp(P_SHORT, "Ein Angelhaken"); |
| 26 | SetProp(P_LONG, "Ein Angelhaken aus Metall.\n"); |
| 27 | SetProp(P_LONG_EMPTY,"Vielleicht kannst Du etwas damit aufspiessen?\n"); |
| 28 | |
| 29 | // Lang- und Kurzbeschreibungen reagieren auf einen evtl. vorhandenen |
| 30 | // Koeder, allerdings nur auf ein tatsaechlich existierendes Koeder-Objekt, |
| 31 | // nicht auf einen per ueberschriebenem QueryKoeder() vorgetaeuschten |
| 32 | // Koeder, wie es der Spezialhaken tut. |
| 33 | Set(P_SHORT, function string () { |
| 34 | object koeder = present(WURM_ID, ME); |
| 35 | return Query(P_SHORT,F_VALUE)+ |
| 36 | (objectp(koeder)?" mit "+koeder->name(WEM):""); |
| 37 | }, F_QUERY_METHOD); |
| 38 | Set(P_LONG, function string () { |
| 39 | object koeder = present(WURM_ID, ME); |
| 40 | return Query(P_LONG,F_VALUE) + (objectp(koeder)? |
| 41 | koeder->Name(WER)+" haengt daran.\n":QueryProp(P_LONG_EMPTY)); |
| 42 | }, F_QUERY_METHOD); |
| 43 | |
| 44 | // P_FISH und P_WATER liefern die Daten eines evtl. vorhandenen Koeders |
| 45 | // Wenn kein Koeder dranhaengt, werden P_WATER und P_FISH des Hakens |
| 46 | // zurueckgegeben, falls es sich um einen Fake-Koeder handelt wie beim |
| 47 | // Spezialhaken; in diesem Fall hat der Haken selbst die Properties |
| 48 | // gesetzt. |
| 49 | Set(P_FISH, function int () { |
| 50 | object koeder = present(WURM_ID, ME); |
| 51 | return (objectp(koeder)?koeder->QueryProp(P_FISH):Query(P_FISH)); |
| 52 | }, F_QUERY_METHOD); |
| 53 | Set(P_WATER, function int () { |
| 54 | object koeder = present(WURM_ID, ME); |
| 55 | return (objectp(koeder)?koeder->QueryProp(P_WATER):Query(P_WATER)); |
| 56 | }, F_QUERY_METHOD); |
| 57 | |
| 58 | SetProp(P_MATERIAL,([MAT_STEEL:100])); |
| 59 | |
| 60 | AddCmd(({"spiess","spiesse"}),"spiessauf"); |
| 61 | } |
| 62 | |
| 63 | protected void create_super() { |
| 64 | set_next_reset(-1); |
| 65 | } |
| 66 | |
| 67 | static int spiessauf(string str) { |
| 68 | string haken,wurmname,*substr; |
| 69 | object wurm; |
| 70 | int amount; |
| 71 | |
| 72 | notify_fail("Was willst Du denn aufspiessen?\n"); |
| 73 | if (!stringp(str) || !sizeof(str)) |
| 74 | return 0; |
| 75 | |
| 76 | if( sscanf(str, "%s auf%s", wurmname, haken) != 2 ) |
| 77 | return 0; |
| 78 | |
| 79 | haken = trim(haken); |
| 80 | |
| 81 | notify_fail("So etwas hast Du nicht bei Dir.\n"); |
| 82 | if ( !objectp(wurm=present(wurmname,TP)) ) |
| 83 | return 0; |
| 84 | |
| 85 | notify_fail("Das kannst Du nicht aufspiessen.\n"); |
| 86 | if( !wurm->id(WURM_ID) ) |
| 87 | return 0; |
| 88 | |
| 89 | notify_fail("Worauf willst Du "+wurm->name(WEN,1)+" denn spiessen?\n"); |
| 90 | if ( haken!="" && !id(haken) ) |
| 91 | return 0; |
| 92 | |
| 93 | notify_fail(break_string("Dazu solltest Du "+name(WEN,1)+" erst einmal " |
| 94 | "bei Dir haben.",78)); |
| 95 | if ( environment(ME) != TP ) |
| 96 | return 0; |
| 97 | |
| 98 | notify_fail("An dem Haken haengt schon ein Koeder.\n"); |
| 99 | if ( QueryKoeder() ) |
| 100 | return 0; |
| 101 | |
| 102 | // Haken und Koeder sind im Inventar und fuehlen sich von der Syntax |
| 103 | // angesprochen. |
| 104 | if( wurm->IsUnit() ) { |
| 105 | // Das QueryProp() ist nicht unnoetig. Bei der Abfrage von U_REQ wird |
| 106 | // U_REQ genullt, wenn das aktuelle query_verb() != dem letzten ist. |
| 107 | // Bei der ersten Abfrage wuerde also das hier gesetzte U_REQ wieder |
| 108 | // geloescht. Daher muss das jetzt hier als erstes einmal abgefragt |
| 109 | // werden... |
| 110 | wurm->QueryProp(U_REQ); |
| 111 | wurm->SetProp(U_REQ,1); |
| 112 | } |
| 113 | tell_object(TP, break_string( |
| 114 | "Du spiesst "+wurm->name(WEN,1)+" auf "+name(WEN,1)+".",78)); |
| 115 | tell_room(environment(TP), break_string( |
| 116 | TP->Name(WER)+" spiesst "+wurm->name(WEN)+" auf "+name(WEN)+".",78), |
| 117 | ({TP})); |
| 118 | // M_GET, damit auch P_NODROP-Koeder aufgespiesst werden koennen. |
| 119 | if ( wurm->move(ME,M_GET) != MOVE_OK) { |
| 120 | tell_object(TP, break_string( |
| 121 | "Verdammt! Jetzt hast Du Dir fast in den Finger gestochen! "+ |
| 122 | wurm->Name(WEN,1)+" hast Du dabei natuerlich verfehlt.", 78)); |
| 123 | } |
| 124 | return 1; |
| 125 | } |
| 126 | |
| 127 | int QueryKoeder(){ |
| 128 | return objectp(present(WURM_ID, ME)); |
| 129 | } |
| 130 | |
| 131 | object QueryKoederObject() { |
| 132 | return present(WURM_ID,ME); |
| 133 | } |
| 134 | |
| 135 | int MayAddObject(object ob) { |
| 136 | return (objectp(ob) && ob->id(WURM_ID) && sizeof(all_inventory(ME))<=1); |
| 137 | } |
| 138 | |
| 139 | int _query_total_weight() { |
| 140 | int tw; |
| 141 | foreach(int w: all_inventory(ME)+({ME})) |
| 142 | tw += w->QueryProp(P_WEIGHT); |
| 143 | return tw; |
| 144 | } |
| 145 | |
| 146 | varargs int remove(int sil) { |
| 147 | all_inventory(ME)->remove(); // funktioniert auch mit leeren Arrays |
| 148 | return ::remove(sil); |
| 149 | } |
| 150 | |
| 151 | int KoederGefressen() { |
| 152 | // Nicht QueryKoeder() pruefen, da das bei Spezialhaken immer 1 ist. |
| 153 | object koeder = present(WURM_ID, ME); |
| 154 | if ( objectp(koeder) ) |
| 155 | return koeder->remove(); |
| 156 | return -1; |
| 157 | } |