#include <lib.h> #include <vendor_types.h> inherit LIB_ITEM; int range = 10; int speed = 2; int damage = 200; int debugging = 0; int deployed; string omsg = "A missile flies $D."; string imsg = "A missile flies in."; object owner, ownerob; void create(){ ::create(); SetKeyName("generic missile"); SetId( ({"missile"}) ); SetAdjectives( ({"generic","sample","template"}) ); SetShort("a generic missile"); SetLong("This is an object that is launched."); SetMass(20); SetBaseCost("silver",10); SetVendorType(VT_TREASURE); } void init(){ ::init(); add_action("launch","launch"); } string GetName(){ return GetKeyName(); } int SetDebugging(int x){ debugging = x; return debugging; } int GetDebugging(){ return debugging; } int GetRange(){ return range; } int SetRange(int x){ if(x > 1) range = x; else range = 0; return range; } int GetDamage(){ return damage; } int SetDamage(int x){ if(x > 1) damage = x; else damage = 0; return damage; } int GetSpeed(){ return speed; } int SetSpeed(int x){ if(x > 1) speed = x; else speed = 0; return speed; } mixed eventNegotiateObstacles(){ return 1; } mixed eventRunOut(){ return 1; } int SetArmed(int x){ return 1; } mixed eventEncounterBlock(){ if(debugging && owner) tell_player(owner, "poop"); range = 0; return 1; } string SetCruiseInMessage(string str){ if(str){ imsg = str; } return imsg; } string SetCruiseOutMessage(string str){ if(str){ omsg = str; } return omsg; } mixed eventCruiseMessages(object this_room, object next_room, string dir){ string tmp = replace_string(omsg,"$D",dir); string tmp2 = replace_string(imsg,"$D",opposite_dir(dir, 1)); if(this_room) this_room->eventPrint(tmp); if(next_room) next_room->eventPrint(tmp2); return 1; } int eventCruise(string str){ object this_room, next_room; string exit; int err, success; this_room = room_environment(this_object()); exit = this_room->GetExit(str); if(exit) err = catch(next_room = load_object(exit)); if(!err && next_room){ success = this_object()->eventMove(next_room); } if(success && environment() == next_room){ eventCruiseMessages(this_room, next_room, str); success = eventNegotiateObstacles(); } else { eventEncounterBlock(); } return success; } void eventDeploy(string str){ int i, ret; if(!owner) owner = find_player("cratylus"); if(undefinedp(deployed)) deployed = time(); for(i=speed;i > 0; i--){ if(range){ range--; ret = eventCruise(str); if(!ret) break; } } if(time() - deployed > 30){ range = 0; } if(time() - deployed > 60){ this_object()->eventDestruct(); } if(range){ call_out("eventDeploy", 1, str); if(debugging && owner) tell_player(owner, "%^GREEN%^I am "+identify(this_object())+ ", range level: " + range + ", " + " cruising in " + identify(room_environment(this_object()))); } else { if(debugging && owner) tell_player(owner, "%^CYAN%^I am "+identify(this_object())+ " and I ran out of range at "+ identify(room_environment(this_object()))); eventRunOut(); } } int launch(string str){ object room = room_environment(this_object()); string exit; if(!this_player() || !creatorp(this_player())) return 0; owner = this_player(); if(room) exit = room->GetExit(str); if(exit) eventDeploy(str); SetArmed(1); return 1; } varargs object SetOwner(object who){ owner = who; return owner; } varargs object SetOwnerOb(object ob){ ownerob = ob; return ownerob; } object GetOwner(){ return owner; } object GetOwnerOb(){ return ownerob; }