blob: 00e2dd417c8c6cddb19e5c7b3d0eeb040a9aaf98 [file] [log] [blame]
// Aenderungshistorie:
// 25.07.2015, Amaryllis: QueryFish implementiert, AddFishFood an/von Fraggle adaptiert
inherit "/std/container";
#include <moving.h>
#include <fishing.h>
#include <language.h>
#include <properties.h>
#include <defines.h>
#include <money.h>
#define TP this_player()
#define BS(x) break_string(x, 78)
private int good_price, bad_price, FAC, FOC, DIV;
private int waagen_preis_faktor=4; // Um wieviel teurer als in Laeden wird
// der Fisch verkauft / Im Fisch wird durch
// 4 geteilt, das wird hier wieder ausgeglichen.
private int get_price();
private void RemoveFish();
// Amaryllis, 25.07.2015: QueryFish "quick and dirty" reingehackt,
// damits funktioniert. Kann man sicher besser machen...
private int QueryFish(object ob); // wird hier im Objekt in PreventInsert verwendet
private int QueryFish(object ob) {
return (objectp(ob))&&(ob->id(FISCH_ID));
}
private int SetFactors(int good_value, int bad_value) {
FAC=good_value;
FOC=bad_value;
DIV=100;
if(!(FAC && FOC && DIV))
SetFactors(100,50);
return 1;
}
protected void create() {
if (!clonep(this_object())) return;
::create();
SetFactors(100,50); //100% fuer frische, 50% fuer alte Fische
SetProp(P_NAME, "Fischwaage");
AddId(({"waage","fischwaage"}));
SetProp(P_GENDER, FEMALE);
SetProp(P_SHORT, "Eine Fischwaage");
SetProp(P_LONG,
"Eine sehr genaue Fischwaage mit einem grossen Zeiger. Du kannst\n"
"Deine Beute drauflegen, den Zeiger ablesen und, sofern Du mit\n"
"dem Preis einverstanden bist, die Verkaufsglocke laeuten.\n");
SetProp(P_DEST_PREPOSITION, "auf");
SetProp(P_SOURCE_PREPOSITION, "von");
SetProp(P_MATERIAL, MAT_MISC_METAL);
SetProp(P_TRANSPARENT, 1);
SetProp(P_NOGET, 1);
SetProp(P_MAX_WEIGHT, 10000);
SetProp(P_WEIGHT, 5000);
AddDetail(({"zeiger"}), BS(
"Der Zeiger besteht aus Metall. Du kannst ihn ablesen, wenn Du "
"genau wissen willst, was Dein Fang wert ist."));
AddDetail(({"fang","beute"}), function string (string key) {
return BS(sizeof(all_inventory())?"Du schaust zufrieden auf die Beute, "
"die auf der Waage liegt. Welcher Preis sich dafuer wohl erzielen "
"laesst?":"Du muesstest erst einmal etwas drauflegen.");
});
AddReadDetail(({"zeige","zeiger ab"}), function string (string key) {
int current_weight = query_weight_contents();
get_price();
return
"Du schaust auf den grossen Zeiger der Waage, der erstaunlicherweise\n"
"nicht nur das Gewicht, sondern auch den Preis anzeigt.\n"
"Der Zeiger steht auf "+
(current_weight?current_weight+" Gramm.\n":"Null.\n")+
(good_price?good_price+" Goldmuenzen fuer fangfrischen Fisch.\n":"")+
(bad_price?bad_price+" Goldmuenzen fuer etwas aelteren Fisch.\n":"");
});
AddDetail(({"glocke"}), BS(
"An der Waage befindet sich eine kleine Glocke die Du laeuten kannst, "
"um den Inhalt der Waage zu verkaufen. Und warte damit nicht zu lange, "
"je aelter der Fisch, desto niedriger der Preis!"));
AddCmd("laeute&glocke|verkaufsglocke","cmd_laeute",
"Was willst Du denn laeuten?");
}
static int cmd_laeute(string str, mixed *param) {
tell_room(ME, TP->Name()+" laeutet eine kleine Glocke an der Fischwaage.",
({TP}));
tell_object(TP, "Du laeutest die Glocke, um Deine Ware zu verkaufen.\n");
foreach(object ob: all_inventory(ME)) {
if ( !ob->id(FISCH_ID) ) {
tell_object(TP,
"Auf der Waage liegt nicht nur Fisch!\n"
"Du solltest nicht versuchen, hier zu betruegen!\n");
tell_room(ME, TP->Name()+" macht sich hier gerade unbeliebt.\n",({TP}));
return 1;
}
if ( ob->QueryQuality()<=0 ) {
tell_object(TP, "Auf der Waage liegt alter, gammliger Fisch.\n"
"Den kannst Du nicht verkaufen!\n");
tell_room(ME, TP->Name()+" macht sich hier gerade unbeliebt.\n",({TP}));
return 1;
}
}
int price=get_price();
if( !price ) {
tell_object(TP,
"Du solltest Deine Beute erstmal auf die Waage legen!\n");
return 1;
}
tell_object(TP, "Du erhaeltst "+price+" Goldmuenzen fuer Deinen Fisch.\n");
tell_room(ME, TP->Name()+" erhaelt haufenweise Geld fuer "+
TP->QueryPossPronoun(MALE, WEN)+" Fisch.\n",({TP}));
//ZZ: AddMoney() gibt die werte von move() zurueck, d.h. !=0 geht nicht.
if (this_player()->AddMoney(price) != MOVE_OK) {
object money=clone_object(GELD);
tell_object(TP, BS(
"Du kannst das Geld nicht mehr tragen. Es faellt klimpernd zu "
"Boden."));
money->SetProp(P_AMOUNT, price);
money->move(environment(ME), M_MOVE_ALL|M_PUT);
}
RemoveFish();
return 1;
}
private int get_price() {
int preis, preis_von_diesem;
int gewicht;
good_price = 0;
bad_price = 0;
foreach(object ob : all_inventory(ME)) {
preis_von_diesem = ob->QueryProp(P_VALUE);
if(ob->QueryQuality()>2)
good_price += preis_von_diesem*FAC/DIV;
else
bad_price +=preis_von_diesem *FOC/DIV;
}
good_price *= waagen_preis_faktor;
bad_price *= waagen_preis_faktor;
return (good_price + bad_price);
}
int PreventInsert(object obj) {
// if( objectp(obj) && obj->QueryFish() )
if( objectp(obj) && QueryFish(obj) )
return ::PreventInsert(obj);
write("Das ist eine Fischwaage! Und keine Waage fuer "+obj->name(WEN)+
".\n");
return 1;
}
#define ETO environment(this_object())
private void RemoveFish() {
string pubname = ETO->GetPub();
object pub;
if ( stringp(pubname) )
pub = load_object(pubname);
else
pub = ETO;
foreach(object ob : all_inventory(ME)) {
// pub->AddFishFood(ob);
// Amaryllis, 25.07.2015: Angepasst wegen AddFishFood von Fraggle
pub->AddFishFood(ob->name(WER,0),ob->QueryProp(P_WEIGHT),ob->QueryQuality());
ob->remove();
}
}
#undef ETO