/*
* This is a generic torch.
* It will have some good initialisations by default.
* The torch can't be sold when it is lit.
*/
inherit "inherit/treasure";
inherit "inherit/timer";
#define NAME (string)this_player()->query_name()
int fuel; /* time left in seconds */
int light_intensity; /* light intensity of this */
void reset(status arg) {
if(arg) return;
set_name("torch");
set_short("Torch");
set_long("This is a bundle of thatch tied together, with the end "+
"soaked in oil.\n");
set_extra_info("Looking at the fluttering flames, you think the torch\n"+
"will last for another @@query_approx_time:"+
file_name(this_object()) +"@@.\n");
set_weight(1);
fuel = 4000;
light_intensity = 2;
}
string short(status wiz) {
return ::short(wiz) +((query_time_left() == -1) ? "" : " (lit)");
}
int query_value() {
return (query_time_left() == -1) ? fuel/200 : 0;
}
void init() {
add_action("light", "light");
add_action("extinguish", "extinguish");
}
/* fuel */
int query_fuel() {
return fuel = (query_time_left() != -1) ? query_time_left() : fuel;
}
int set_fuel(int f) { return fuel = f; }
/* light intensity */
int query_light_intensity() { return light_intensity; }
int set_light_intensity(int l) { return light_intensity = l; }
status light(string str) {
object ob;
status current_light;
if(!str) {
notify_fail("light what?\n");
return 0;
}
if(!(ob = present(str, this_player()))) {
if(!(ob = present(str, environment(this_player())))) {
if(!environment(this_player())->id(str)) {
write("There is no "+ str +" here.\n");
return 1;
}
}
}
if(ob != this_object()) return 0;
if(query_time_left() != -1) {
write("It is already lit.\n");
return 1;
}
adj_time(fuel);
current_light = (set_light(0) > 0) ? 2 : 0;
adj_light(light_intensity);
if(!current_light && set_light(0) > 0) {
write("You can see again.\n");
say(NAME +" lights a "+ query_name() +".\n");
}
else {
write("Ok.\n");
}
return 1;
}
status extinguish(string str) {
object ob;
status current_light;
if(!str) {
notify_fail("extinguish what?\n");
return 0;
}
if(!(ob = present(str, this_player()))) {
if(!(ob = present(str, environment(this_player())))) {
if(!environment(this_player())->id(str)) {
write("There is no "+ str +" here.\n");
return 1;
}
}
}
if(ob != this_object()) return 0;
if(query_time_left() == -1) {
write("There "+ query_name() +" is not lit!\n");
return 1;
}
fuel = query_time_left();
remove_call_out("time_out");
current_light = (set_light(0) > 0) ? 2 : 0;
adj_light(light_intensity*(-1));
if(current_light && set_light(0) < 2) {
write("It turns dark.\n");
say(NAME +" extinguishes the only light source.\n");
}
else {
write("Ok.\n");
}
return 1;
}
void time_out() {
object ob;
if(set_light(light_intensity*(-2)) == 0)
say("There is darkness as a "+ query_name() +" flickers out.\n");
else
say("The " + query_name() +" flickers out.\n");
ob = environment(this_object());
call_other(ob, "add_weight", query_weight()*(-1));
::time_out();
}