ES2 MUD LIB :: 東方故事二(ES2) 天朝帝國 mudlib 瀏覽展示

/std/item/liquid.c

HOME :: std :: item :: liquid.c
// liquid.c

inherit ITEM;

static int volume;

int query_volume() { return volume; }

void set_volume(int v)
{
if( v < 0 ) error("liquid: volume less than zero.\n");
volume = v;
if( v==0 ) destruct(this_object());
else this_object()->set_weight( to_int(v * query("density")) );
}

void add_volume(int v) 

if( (volume+v) < 0)  // fix by tears 
   set_volume(0);
else 
   set_volume(volume+v); 
}

string short(int raw)
{
if( raw ) return ::short(raw);
if( volume < 500 )
return "不到一升的" + ::short(raw);
else
return "大約" + chinese_number((volume+500)/1000) + "升左右的"
+ ::short(raw);
}

void dissolve_with(object ob)
{
// Checking existence of ob is nessessary because we call dissolve_with()
// in the form:
// all_environment(environment())->dissolve_with(this_object());
// after moved, so we might go dissolved by another liquid which has more
// volume than us before calling another object dissolve_with().

if(!ob || ob==this_object()) return;

if(base_name(ob)==base_name(this_object())) {
ob->add_volume(volume);
set_volume(0);
return;
}

// This algorithm of inter-dissolve of liquid objects is somewhat rough,
// may need refine in the future.
if( ob->query_volume() <= volume ) {
set("density", (float)(weight() + ob->weight())  / (volume + ob->query_volume()) );
set_name("不明液體", ({ "unknown liquid", "liquid"}) );
set("long", "一些不明成份的液體。\n");
add_volume(ob->query_volume());
ob->set_volume(0);
} else {
ob->set("density", (float)(weight() + ob->weight())  / (volume + ob->query_volume()) );
ob->set_name("不明液體", ({ "unknown liquid", "liquid"}) );
ob->set("long", "一些不明成份的液體。\n");
ob->add_volume(ob->query_volume());
set_volume(0);
}
}

varargs int move(mixed dest, int silent)
{
object env, *inv;
int i, total;
string file;

if( !dest->query("liquid_container") )
return notify_fail( name() + "必須放在容器裡。\n");

// write("weight = " + weight() + "\n");
if( ::move(dest, silent) ) {
if( (env = environment()) )
all_inventory(env)->dissolve_with(this_object());
return 1;
}
return 0;
}

int render_value()
{
return to_int(query("base_value") * volume);
}

void setup()
{
::setup();
set("no_get", 1);
if( !volume ) set_volume(1);
set("value", (: render_value :));
}

HOME :: std :: item :: liquid.c