#include #include #include #include #include inherit LIB_RIFLE; int active, cache; mapping Prey = ([]); object myroom; varargs mixed DoWield(object who, mixed where); string LongDesc(){ string ret = "A highly advanced weapon of Poleepkwa design."; if(!active) return ret; if(cache < 5) ret += " A %^RED%^red%^RESET%^ light is illuminated on it."; else if(cache < 25) ret += " A %^YELLOW%^yellow%^RESET%^ light is illuminated on it."; else if(cache < 40) ret += " A %^GREEN%^green%^RESET%^ light is illuminated on it."; else ret += " A %^BLUE%^blue%^RESET%^ light is illuminated on it."; return ret; } static void create() { ::create(); SetKeyName("plasma rifle"); SetId(({"rifle"})); AddSave(({"cache","Prey"})); SetAdjectives(({"small","poleepkwa","plasma"})); SetShort("a small plasma rifle"); SetLong((:LongDesc:)); SetHands(2); SetMass(100); SetDollarCost(5000); SetVendorType(VT_WEAPON); SetClass(20); SetDamageType(BLUNT); SetFirearmType("auto"); SetWeaponType("blunt"); SetWield( (: DoWield :) ); AddItem( ({"light","status light"}), "A status light."); set_heart_beat(2); Prey = ([]); } varargs mixed eventShoot(object who, mixed target, string dir, string whom){ string name, patsy; object bolt, killer, env, room = room_environment(); int fuel, dam; killer = (who || this_player()); fuel = killer->GetMagicPoints(); name = killer->GetName(); env = environment(killer); if(target) patsy = target->GetName(); if(creatorp(who)){ cache = 50; fuel = 800; who->AddMagicPoints(800); } dam = cache + random(50); if(!active){ write("The rifle clicks."); say(name+"'s rifle emits a click."); return 1; } if(cache < 5){ cache = 0; write("The rifle clicks."); say(name+"'s rifle emits a click."); if(room) room->eventHearTalk(this_object(),0,TALK_LOCAL,"say", "Power cache too low.", "poleepkwa"); return 1; } if(fuel < 50){ cache = 0; write("The rifle emits a harsh buzzing noise."); say(name+"'s rifle emits a harsh buzzing noise."); if(room) room->eventHearTalk(this_object(),0,TALK_LOCAL,"say", "Operator essence too low.", "poleepkwa"); return 1; } if(dir){ if(!env){ write("No environment."); return 1; } if(!env->GetExit(dir)){ write("You can't shoot in that direction."); return 1; } bolt = new("/domains/default/weap/plasma"); if(!bolt){ write("There appears to be some sort of malfunction."); return 1; } write("You fire your plasma rifle "+dir+"!"); tell_room(env, name+" fires "+possessive(killer)+ " plasma rifle "+dir+"!", ({killer})); bolt->SetOwner(who); bolt->SetDamage(dam); bolt->eventMove(env); bolt->SetArmed(1); bolt->eventDeploy(dir); killer->AddMagicPoints(-50); cache = 0; return 1; } write("You blast "+patsy+" with your plasma rifle!"); tell_room(env, name+" blasts "+patsy+" with "+possessive(killer)+ " plasma rifle!", ({killer, target})); target->eventPrint(name+" blasts you with "+possessive(killer)+ " plasma rifle!"); dam = cache + random(50); cache = 0; Prey = ([ "ob" : target, "name" : patsy, "player" : (userp(target)) ]); target->eventReceiveDamage(killer, HEAT, dam); killer->AddMagicPoints(-50); target->AddEnemy(killer); Prey = ([ "ob" : target, "name" : patsy, "room" : environment(target), "player" : userp(target) ]); if(room) room->eventHearTalk(this_object(),0,TALK_LOCAL,"say", "New prey being tracked.", "poleepkwa"); return 1; } void heart_beat(){ int notify; string str; object env = environment(); object room = room_environment(); if(active && !GetWorn()){ if(env) tell_room(env, "The "+remove_article(GetShort())+ " whines and clicks off."); active = 0; } else if(active){ int fuel = env->GetMagicPoints(); if(!fuel){ active = 0; if(environment(env)){ tell_room(environment(env), env->GetName()+"'s "+ "plasma rifle whines and clicks off.", ({env})); env->eventPrint("Your plasma rifle whines and clicks off."); } } else if(cache < 50){ env->AddMagicPoints(-1); cache++; } } if(active){ object tmp; object penv, menv; if(Prey["name"] && !Prey["ob"]){ if(Prey["player"] && tmp = find_player(Prey["name"])){ Prey["ob"] = tmp; Prey["room"] = environment(tmp); Prey["lost"] = 0; if(room){ room->eventHearTalk(this_object(),0,TALK_LOCAL,"say", "Contact with prey re-established.", "poleepkwa"); } return; } else if(!Prey["player"]) Prey = ([]); if(room && !Prey["lost"]){ room->eventHearTalk(this_object(),0,TALK_LOCAL,"say", "Contact with prey lost.", "poleepkwa"); Prey["lost"] = 1; } return; } penv = room_environment(Prey["ob"]); menv = room_environment(this_object()); if(Prey["ob"] && (!Prey["room"] || penv != Prey["room"])){ if(room) room->eventHearTalk(this_object(),0,TALK_LOCAL,"say", "Prey on the move.", "poleepkwa"); Prey["room"] = penv; notify = 1; } if(menv != myroom && Prey["ob"]){ myroom = menv; notify = 1; } if(notify && room){ string mycords = ROOMS_D->GetCoordinates(menv); string theircords = ROOMS_D->GetCoordinates(penv); int i, j, x1, y1, x2, y2, bearing; i = sscanf(mycords, "%d,%d,%*s", x1, y1); j = sscanf(theircords, "%d,%d,%*s", x2, y2); if(i < 2 || j < 2){ return; } bearing = bearing(x2, y2, x1, y1, 1); if(bearing != -1) str = "Prey's bearing currently: "+bearing; else str = "Prey is in the immediate environment."; room->eventHearTalk(this_object(),0,TALK_LOCAL,"say", str, "poleepkwa"); } } } void init(){ object env = environment(); ::init(); if(active && !GetWorn()){ if(env) tell_room(env, "The "+remove_article(GetShort())+ " whines and clicks off."); active = 0; } } varargs mixed DoWield(object who, mixed where){ string extra; object env = environment(who); if(creatorp(who) || who->GetRace() == "poleepkwa"){ active = 1; if(creatorp(who)) cache = 50; } if(active) extra = " and it beeps and clicks on."; else extra = "."; who->eventPrint("You wield "+GetShort()+extra); if(env) tell_room(env, who->GetName()+" wields "+ GetShort()+extra, ({who})); return 1; } mixed eventUnequip(object who){ mixed ret = ::eventUnequip(who); object env = environment(who); if(ret && active){ who->eventPrint("The rifle whines and clicks off."); if(env) tell_room(env, who->GetName()+"'s rifle "+ "whines and clicks off.", ({who})); active = 0; } return ret; }