#include <lib.h> #include <vendor_types.h> inherit LIB_STORAGE; inherit "/lib/events/turn"; void SetLightLevel(int i); int eventRadiate(int i); object player,env,fl; string me,name, celltype, baseshort; int noflicker,Lit,lightlevel,drainrate,powered,level; int mincells, maxcells; void create(){ ::create(); SetKeyName("generic flashlight"); SetId( ({"fl","flashlight","light","torch","flashlite"}) ); SetAdjectives( ({"generic","simple","cheap"}) ); SetShort( "a flashlight" ); SetLong("This is a cheap, simple light source."); SetMass(20); SetBaseCost(10); SetLightLevel(6); Lit=0; mincells = 2; maxcells = 2; celltype = "D"; SetVendorType(VT_TREASURE); baseshort=GetShort(); } void init(){ ::init(); fl=this_object(); me=this_object()->GetKeyName(); } int SetHB(int i){ set_heart_beat(i); return query_heart_beat(); } int GetHB(){ return query_heart_beat(); } int SetMaxCells(int i){ maxcells = i; return i; } int GetMaxCells() { return maxcells; } int SetMinCells(int i){ mincells = i; return i; } int GetMinCells() { return mincells; } int SetCellType(string str) {celltype=str; return 1; } string GetCellType() { return celltype; } int SetDrainRate(int i){ drainrate = i; return i; } int eventUse(int i){ Lit = i; foreach(object ob in all_inventory(this_object())){ ob->eventUse(i); } return i; } int eventDie(){ if(!Lit || Lit == 0) return 1; Lit=0; eventRadiate(0); foreach(object ob in all_inventory(this_object())){ ob->eventUse(0); } SetShort(baseshort); tell_object(environment(this_object()),"The "+me+" flickers and dies."); if(living(environment())){ tell_room(environment(environment()),environment()->GetName()+"'s "+me+ " flickers and dies.",({ environment() }) ); } set_heart_beat(0); return 1; } int flicker(){ if(noflicker ==1) return; if(!living(environment())){ tell_object(environment(),capitalize(baseshort)+" flickers and shines less brightly than before."); return 1; } tell_room(environment(environment()),environment()->GetName()+"'s "+me+ " flickers and shines less brightly than before.",({ environment() }) ); tell_object(environment(),"The "+me+" flickers and shines less brightly."); return 1; } int CheckPower(){ object *batts; powered = 1; if( sizeof(all_inventory(this_object())) < mincells ) powered = 0; batts = all_inventory(this_object()); foreach(object batt in batts){ batt->Spent(); level = batt->GetCharge(); if(level == 10 || level == 30 || level == 50 ) flicker(); noflicker = 1; //write("The "+me+" flickers."); if( level < 1) powered = 0; } noflicker = 0; return powered; } int CanReceive(object ob) { if(ob->GetCellType() != celltype) { return 0; } if(sizeof(all_inventory(this_object())) >= maxcells ){ return 0; } return 1; } int eventRadiate(int i){ SetRadiantLight(i); } void SetLightLevel(int i){ if(i) lightlevel = i; } int GetLightLevel(){ if(lightlevel) return lightlevel; return 0; } void regetID(){ player=this_player(); name=this_player()->GetName(); env=environment(this_object()); } varargs mixed eventTurn(string str){ regetID(); if( player != env ) { write("You don't have that."); return 0; } write("You turn the "+me+" over in your hands."); say(name+" turns over a "+me+" in "+possessive(player)+" hands."); return 1; } int eventTurnOn(object ob){ regetID(); CheckPower(); if(powered != 1){ write("It isn't powered."); return 1; } if(player != env && environment(player) !=env) { write("It isn't within reach."); return 1; } if(Lit < 1){ write("You turn on the "+me+"."); say(name+" turns on a "+me+"."); if(drainrate && drainrate > 0) eventUse(drainrate); else eventUse(1); eventRadiate(lightlevel); set_heart_beat(1); SetShort(baseshort+" (%^BOLD%^YELLOW%^lit%^RESET%^)"); return 1; } if(Lit >= 1){ write("It is already lit."); return 1; } } varargs mixed eventTurnOff(string str){ regetID(); if(player != env && environment(player) !=env) { write("It isn't within reach."); return 1; } if(Lit > 0){ write("You turn off the "+me+"."); say(name+" turns off a "+me+"."); eventRadiate(0); eventUse(0); set_heart_beat(0); SetShort(baseshort); return 1; } if(Lit < 1){ write("It is already off."); return 1; } } mixed eventExtinguish(){ return eventTurnOff("foo"); } mixed eventLight(){ return eventTurnOn(this_object()); } void heart_beat(){ CheckPower(); if(powered != 1){ eventDie(); } }