mud/lib/domains/town/obj/charity.c
2020-09-06 05:43:07 -07:00

102 lines
3.1 KiB
C

#include <lib.h>
inherit LIB_STORAGE;
static int maxlevel = 5;
string ReadSign(){
string ret = "Only players of level "+cardinal(maxlevel)+" and below "+
"may take from this bin with impunity.";
return ret;
}
void create() {
::create();
SetKeyName("charity bin");
SetId(({"bin"}));
SetAdjectives(({"large","charity"}));
SetShort("a large bin");
SetLong("This a very large bin for holding donations to the "
"needy. Since it is in a church, and for charity, it is "
"reasonable to guess that folks above a certain level will "
"receive a minor bonus for donating valuable things, and a "
"severe penalty for taking them. There is a sign on "
"the charity bin that you can read.");
SetItems( ([
({ "sign" }) : "A sign on the bin you can read.",
]) );
SetReads( ([
"default" : "Try 'read label on bin'",
({"sign"}) : (: ReadSign :),
]) );
SetPreventGet("It's bolted down you filthy scum.");
SetMass(5000);
SetBaseCost("silver",500);
SetMaxCarry(15000);
SetCanClose(0);
SetClosed(0);
SetPersistent(1);
RestoreObject();
}
void init(){
::init();
}
varargs int eventCalculateBonus(object ob, int take){
int value, cls, sum, bonus, duration;
object thingy, who = this_player();
if(!ob || !this_player()) return 0;
if(this_player()->GetLevel() <= maxlevel) return 0;
value = ob->GetBaseCost();
cls = (ob->GetClass() || 1);
sum = (value + (cls * 1000) || 1);
bonus = (sum/10000 || 1);
duration = bonus * 10;
if(bonus > 10) bonus = 10;
if(duration > 1000) duration = 1000;
if(take && bonus > 0) bonus = -bonus - (to_float(bonus) * 0.1);
if(bonus > 0 && take) duration = -duration - (to_float(duration) * 0.1);
if(sum >= 10000 || take){
thingy = present_bonus("charity_bonus", who);
if(thingy){
bonus += thingy->GetStats()["luck"];
duration += thingy->GetDuration();
if(bonus > 33) bonus = 33;
if(duration > 5000) duration = 5000;
}
else thingy = new(LIB_BONUS);
thingy->SetBonusName("charity_bonus");
thingy->SetStats( ([
"luck" : bonus,
]) );
thingy->SetBonusDuration(duration);
if(present(thingy, who) || thingy->eventMove(who)){
object env = environment(this_object());
object wenv = environment(who);
if(env && wenv && env == wenv){
if(!take){
write("You experience a pleasant sense of kinship "+
" with the rest of the world.");
}
else {
write("You feel cheap and petty.");
}
}
}
}
return 1;
}
int eventReceiveObject(object ob){
int ret = ::eventReceiveObject(ob);
if(ret) eventCalculateBonus(ob);
return ret;
}
int eventReleaseObject(object ob){
int ret = ::eventReleaseObject(ob);
if(ret) eventCalculateBonus(ob, 1);
return ret;
}