mud/lib/domains/campus/weap/zpem.c
2020-09-06 05:43:07 -07:00

178 lines
4.7 KiB
C

#include <lib.h>
#include <damage_types.h>
#include <vendor_types.h>
#include <daemons.h>
inherit LIB_SHOOT;
inherit LIB_AIM;
inherit LIB_SURFACE;
inherit LIB_ACTIVATE;
static int active = 0;
static void create() {
::create();
SetKeyName("manipulator");
SetId(({"gun","zpem"}));
SetAdjectives(({"zero","point","energy","bulky","boxy","futuristic"}));
SetShort("a zero-point energy manipulator");
SetLong("A large, bulky device appearing to be a kind of boxy, "
"futuristic gun.");
set_heart_beat(1);
SetMass(400);
SetDollarCost(5);
SetVendorType(VT_WEAPON);
SetHands(2);
SetMaxCarry(20000);
SetDamageType(BLUNT);
SetWeaponType("blunt");
}
varargs mixed eventShoot(object shooter, mixed target, string direction){
string name,patsy;
object killer, env;
object *inv = all_inventory(this_object());
//tc("target: "+identify(target));
if(!active){
write("You have to activate it first.");
return 1;
}
if(!target || direction){
if(!sizeof(inv)){
write("You can't do that.");
return 1;
}
}
if(sizeof(inv)){
write("The zero-point energy manipulator is already actively "+
"manipulating "+inv->GetShort()+".");
return 1;
}
if(living(target)){
if(!(RACES_D->GetNonMeatRace(target->GetRace()))){
write("The zero-point energy manipulator does not work "+
"well on meat-based objects.");
return 1;
}
}
if(base_name(target) == LIB_CORPSE || base_name(target) == LIB_LIMB){
write("The zero-point energy manipulator does not work "+
"well on meat-based objects.");
return 1;
}
if(target->isDummy() || target->GetMass() > 5000 ||
target->GetPreventGet()){
write("The zero-point energy manipulator clicks and whines.");
return 1;
}
if(!GetWielded()){
write("You are not wielding it.");
return 0;
}
killer = this_player();
name = killer->GetName();
env = environment(killer);
patsy = target->GetShort();
tell_room(env,name+" picks up "+patsy+" with "+possessive(killer)+" "+
"zero-point energy manipulator.",({killer,target}) );
tell_object(killer,"You surround "+patsy+" in a zero-point energy field, "+
" and "+nominative(target)+" is picked up by "+
"your zero-point energy manipulator.");
tell_object(target,name+" picks you up with "+possessive(killer)+" "+
"zero-point energy manipulator. You are helpless in its field.");
active = 1;
target->SetZPG(1);
target->eventMove(this_object());
return 1;
}
int eventTurnOff(){
object *inv;
if(!active){
write("It's already inactive.");
return 1;
}
inv = all_inventory();
active = 0;
write("You deactivate the zero-point energy manipulator.");
if(sizeof(inv)){
inv->eventMove(room_environment(this_object()));
foreach(object ob in inv){
tell_object(ob, "You are released from "+this_player()->GetName()+
"'s zero-point energy manipulator.");
tell_room(environment(this_player()), capitalize(ob->GetShort())+
" is "+
"released from "+this_player()->GetName()+"'s zero-point "+
"energy manipulator.", ({ ob, this_player() }) );
write("You release "+ob->GetShort()+" from your zero-point "+
"energy manipulator.");
}
}
return 1;
}
int eventTurnOn(){
if(active){
write("It's already active.");
return 1;
}
write("You activate the zero-point energy manipulator.");
say(this_player()->GetName()+" activates "+possessive(this_player())+
" zero-point energy manipulator.");
active = 1;
return 1;
}
int GetZPEM(){
return 1;
}
void init(){
object *inv = all_inventory();
::init();
if(!active){
if(sizeof(inv) && room_environment(this_object())){
inv->eventMove(room_environment(this_object()));
eventDestruct();
}
}
}
void heart_beat(){
object *inv = all_inventory();
if(!active){
if(sizeof(inv) && room_environment(this_object())){
inv->eventMove(room_environment(this_object()));
eventDestruct();
}
}
}
int CanReceive(object ob){
object *inv = all_inventory(this_object());
if(!active) return 0;
if(sizeof(inv)) return 0;
return ::CanReceive(ob);
}
mixed eventUnequip(object who){
mixed tmp = surface::eventUnequip(who);
if(tmp == 1){
eventTurnOff();
}
return tmp;
}