blob: 66b91f4c69ed947e3c8e040d5b35d067e9992998 [file] [log] [blame]
#pragma strong_types, save_types, rtt_checks
#pragma no_shadow, no_clone
inherit "/std/thing";
#include <language.h>
#include <properties.h>
#include <items/fishing/fishing.h>
#include <items/flasche.h>
#include <unit.h>
#define TP this_player()
#define ME this_object()
int QueryKoeder();
protected void create() {
::create();
AddId(({HAKEN_ID,"haken","angelhaken"}));
SetProp(P_NAME, "Haken");
SetProp(P_GENDER, MALE);
SetProp(P_ARTICLE, 1);
SetProp(P_WEIGHT, 5);
SetProp(P_SHORT, "Ein Angelhaken");
SetProp(P_LONG, "Ein Angelhaken aus Metall.\n");
SetProp(P_LONG_EMPTY,"Vielleicht kannst Du etwas damit aufspiessen?\n");
// Lang- und Kurzbeschreibungen reagieren auf einen evtl. vorhandenen
// Koeder, allerdings nur auf ein tatsaechlich existierendes Koeder-Objekt,
// nicht auf einen per ueberschriebenem QueryKoeder() vorgetaeuschten
// Koeder, wie es der Spezialhaken tut.
Set(P_SHORT, function string () {
object koeder = present(WURM_ID, ME);
return Query(P_SHORT,F_VALUE)+
(objectp(koeder)?" mit "+koeder->name(WEM):"");
}, F_QUERY_METHOD);
Set(P_LONG, function string () {
object koeder = present(WURM_ID, ME);
return Query(P_LONG,F_VALUE) + (objectp(koeder)?
koeder->Name(WER)+" haengt daran.\n":QueryProp(P_LONG_EMPTY));
}, F_QUERY_METHOD);
// P_FISH und P_WATER liefern die Daten eines evtl. vorhandenen Koeders
// Wenn kein Koeder dranhaengt, werden P_WATER und P_FISH des Hakens
// zurueckgegeben, falls es sich um einen Fake-Koeder handelt wie beim
// Spezialhaken; in diesem Fall hat der Haken selbst die Properties
// gesetzt.
Set(P_FISH, function int () {
object koeder = present(WURM_ID, ME);
return (objectp(koeder)?koeder->QueryProp(P_FISH):Query(P_FISH));
}, F_QUERY_METHOD);
Set(P_WATER, function int () {
object koeder = present(WURM_ID, ME);
return (objectp(koeder)?koeder->QueryProp(P_WATER):Query(P_WATER));
}, F_QUERY_METHOD);
SetProp(P_MATERIAL,([MAT_STEEL:100]));
AddCmd(({"spiess","spiesse"}),"spiessauf");
}
protected void create_super() {
set_next_reset(-1);
}
static int spiessauf(string str) {
string haken,wurmname,*substr;
object wurm;
int amount;
notify_fail("Was willst Du denn aufspiessen?\n");
if (!stringp(str) || !sizeof(str))
return 0;
if( sscanf(str, "%s auf%s", wurmname, haken) != 2 )
return 0;
haken = trim(haken);
notify_fail("So etwas hast Du nicht bei Dir.\n");
if ( !objectp(wurm=present(wurmname,TP)) )
return 0;
notify_fail("Das kannst Du nicht aufspiessen.\n");
if( !wurm->id(WURM_ID) )
return 0;
notify_fail("Worauf willst Du "+wurm->name(WEN,1)+" denn spiessen?\n");
if ( haken!="" && !id(haken) )
return 0;
notify_fail(break_string("Dazu solltest Du "+name(WEN,1)+" erst einmal "
"bei Dir haben.",78));
if ( environment(ME) != TP )
return 0;
notify_fail("An dem Haken haengt schon ein Koeder.\n");
if ( QueryKoeder() )
return 0;
// Haken und Koeder sind im Inventar und fuehlen sich von der Syntax
// angesprochen.
if( wurm->IsUnit() ) {
// Das QueryProp() ist nicht unnoetig. Bei der Abfrage von U_REQ wird
// U_REQ genullt, wenn das aktuelle query_verb() != dem letzten ist.
// Bei der ersten Abfrage wuerde also das hier gesetzte U_REQ wieder
// geloescht. Daher muss das jetzt hier als erstes einmal abgefragt
// werden...
wurm->QueryProp(U_REQ);
wurm->SetProp(U_REQ,1);
}
tell_object(TP, break_string(
"Du spiesst "+wurm->name(WEN,1)+" auf "+name(WEN,1)+".",78));
tell_room(environment(TP), break_string(
TP->Name(WER)+" spiesst "+wurm->name(WEN)+" auf "+name(WEN)+".",78),
({TP}));
// M_GET, damit auch P_NODROP-Koeder aufgespiesst werden koennen.
if ( wurm->move(ME,M_GET) != MOVE_OK) {
tell_object(TP, break_string(
"Verdammt! Jetzt hast Du Dir fast in den Finger gestochen! "+
wurm->Name(WEN,1)+" hast Du dabei natuerlich verfehlt.", 78));
}
return 1;
}
int QueryKoeder(){
return objectp(present(WURM_ID, ME));
}
object QueryKoederObject() {
return present(WURM_ID,ME);
}
int MayAddObject(object ob) {
return (objectp(ob) && ob->id(WURM_ID) && sizeof(all_inventory(ME))<=1);
}
int _query_total_weight() {
int tw;
foreach(int w: all_inventory(ME)+({ME}))
tw += w->QueryProp(P_WEIGHT);
return tw;
}
varargs int remove(int sil) {
all_inventory(ME)->remove(); // funktioniert auch mit leeren Arrays
return ::remove(sil);
}
int KoederGefressen() {
// Nicht QueryKoeder() pruefen, da das bei Spezialhaken immer 1 ist.
object koeder = present(WURM_ID, ME);
if ( objectp(koeder) )
return koeder->remove();
return -1;
}