blob: cf9979383cb6af7fb3d85d3b7322fea72ea3d506 [file] [log] [blame]
// (c) 2003 by Padreic (padreic@mg.mud.de)
//
// Es kann bestimmte Laeden zum Handeln von Kraeutern geben.
// Zunaechst einmal gibt es einen in der Dunkelelfengilde.
// Hier koennen Kraeuter ge- und verkauft werden.
// Grundsaetzlich kann es beliebig viele kraeuterkundige
// Haendler geben, eine kurze Absprache waere jedoch von Vorteil.
// Der Laden erweitert die room/shop Funktionen.
// Zur Verwendung muss dieser noch mit einem std/room kombiniert
// werden. Dies erlaubt die Verwendung von eigenen Standardraeumen oder
// Kombination mit Kneipen.
inherit "/std/room/shop";
#define NEED_PROTOTYPES
#include <items/kraeuter/kraeuter.h>
#include <properties.h>
// Flag, das im reset() das Speichern ausloest, wenn es gesetzt ist.
static int need_save;
static int basisvalue=400; // gibt den _Durchschnittswert_ eines Krauts an
static int maxvalue=10000; // bestimmt den max. Wert aller Kraeuter
// Enthaelt fuer jede PlantID einen Zaehler, der angibt, wieviel von dem
// jeweiligen Kraut verkauft wurde.
// private int *count=({});
// Summe ueber alle Eintraege in count
// private int sum;
protected void create()
{
if (object_name(this_object()) == __FILE__[0..<3])
{
set_next_reset(-1);
return;
}
::create();
SetProp(P_BUY_ONLY_PLANTS,1);
/*
seteuid(getuid()); // wird zum speichern benötigt
int si=sizeof(count);
// fuer jede PlantID einen Eintrag anlegen, d.h. wenn in count noch
// nicht genug vorhanden sind, werden fehlende Eintraege ergaenzt.
if (si<PLANTCOUNT)
count=count+allocate(PLANTCOUNT-si);
*/
}
protected void create_super()
{
set_next_reset(-1);
}
static string sell_obj_only_plants(object ob, int short)
{
if (!IS_PLANT(ob))
return "Tut mir leid, damit kann ich nichts anfangen.";
// es werden nur Kraeuter angekauft, die legal geclont wurden,
// d.h. im entsprechenden Master ordentlich eingetragen wurden!
if (ob->QueryPlantId()<=0)
return ob->Name(WER, 2)+" ist illegal auf die Welt gekommen. Ich darf "
+ob->QueryPronoun(WEN)+" leider nicht annehmen.";
return ::sell_obj(ob, short);
}
static string sell_obj(object ob, int short)
{
// es werden nur Kraeuter angekauft, die legal geclont wurden,
// d.h. im entsprechenden Master ordentlich eingetragen wurden!
if (IS_PLANT(ob) && ob->QueryPlantId()<=0)
return "Hm, "+ob->Name(WER, 2)+" stammt aber aus einer sehr dubiosen "
"Quelle. Ich kann "+ob->QueryPronoun(WEN)+" leider nicht annehmen.";
if (QueryProp(P_BUY_ONLY_PLANTS))
return sell_obj_only_plants(ob, short);
return ::sell_obj(ob,short);
}
/*
void reset()
{
::reset();
// Daten sind nicht sooo wichtig, als das bei jeder Aenderung
// gesavet werden muesste. Daher nun im reset speichern.
if (need_save) {
// basisvalue/PLANTCOUNT: Durchschnittswert eines einzelnen Krauts
// sum + PLANTCOUNT: Gesamtzahl verkaufter plus Zahl existierender
// Kraeuter
// Wenn also der Wert all dieser Kraeuter > 10k ist, wird jeder
// Einzelzaehler auf 90% gestutzt, damit die Werte nicht ins Uferlose
// steigen.
if (((sum+PLANTCOUNT)*basisvalue/PLANTCOUNT)>maxvalue) {
int i, newsum;
for (i=sizeof(count)-1; i>=0; i--) {
count[i] = count[i]*9/10;
newsum+=count[i];
}
sum=newsum;
}
need_save=0;
}
}
// Aktualisiert den Datenbestand beim Kaufen oder Verkaufen eines Objekts
void UpdateCounter(object ob, int num)
{
int id=ob->QueryPlantId();
if (id>0 && is_plant(ob)) {
// Kauf oder Verkauf von Kraeutern, veraendert den Wert der
// Kraeuter
// Zaehler in der Liste hochzaehlen
count[id]+=num;
if (count[id]<0) count[id]=0; // darf aber ansich nich passieren
// Gesamtsumme aktualisieren
sum+=num;
need_save=1;
}
::UpdateCounter(ob, num);
}
// Die Preise die hier im Labor fuer Kraeuter gezahlt und verlangt
// werden, sind nicht fix sondern haengen von Angebot und Nachfrage ab.
// Hier weiss man ueber den wahren Wert der einzelnen Kraeuter bescheid.
static int realValue(object ob, object player)
{
// Preise fuer normale Gueter ganz normal...
if (!is_plant(ob))
return ob->QueryProp(P_VALUE);
// jede Kraeuterkategorie bekommt den gleichen Wert zugewiesen.
// val entspricht dem aktuellen "Durchschnittswert" eines Krautes
int val=(sum+PLANTCOUNT)*basisvalue/PLANTCOUNT;
// aber dieser Wert verteilt sich auf unterschiedlich viele Kraeuter
// (AN: Dieser Kommentar erschliesst sich mir nicht.)
int id=ob->QueryPlantId();
if (id<=0) return 0; // illegal geclont -> wertlos
// ggf. die Zaehlerliste um die fehlenden Eintraege erweitern.
if ((id-1)>sizeof(count))
count=count+allocate(id-1-sizeof(count));
// "mittleren Wert" des abgefragten Krautes errechnen (Division durch
// dessen umgesetzte Anzahl)
val=val/(count[id]+1);
// Wert runden auf naechstniedrigeren glatt durch 10 teilbaren Wert.
return val-val%10;
}
// gibt den Preis zurück, der zum Ankauf des Objektes verwendet werden soll
static varargs int QueryValue(object ob, int value, object player)
{
return ::QueryValue(ob, realValue(ob, player), player);
}
// gibt den Preis an, zu dem das Objekt verkauft werden soll.
static varargs int QueryBuyValue(mixed ob, object player)
{
if (objectp(ob))
return (realValue(ob, player)*QueryBuyFact(player) + 50)/100;
// fixed Objekte...
return ::QueryBuyValue(ob, player);
}
*/