mud/lib/domains/default/armor/rocketpack.c
2020-09-06 05:43:07 -07:00

245 lines
6.3 KiB
C

#include <lib.h>
#include <armor_types.h>
#include <damage_types.h>
#include <medium.h>
inherit LIB_ARMOR;
inherit LIB_ACTIVATE;
inherit LIB_READ;
int activated;
int charge = 1000;
int maxcharge = 1000;
object rocketshadow, owner;
string current_direction;
mapping Directions = ([]);
string LongD(){
string ret = "This is a large device worn on the back and designed to \"boost\" " +
"the wearer through the air or through space. For continuous operation, "+
"it should probably be activated. The fuel gauge "+
"reads "+to_int(percent(charge,maxcharge))+" percent.";
return ret;
}
static void create(){
armor::create();
if(!Directions) Directions = ([]);
SetKeyName("rocket pack");
SetId(({"pack","rocket"}));
SetAdjectives(({"large","rocket"}));
SetShort("a small rocket pack");
SetLong( (: LongD :) );
SetMass(800);
SetBaseCost(18000);
SetArmorType(A_VEST);
AddSave( ({ "charge", "Directions" }) );
SetRestrictLimbs( ({ "torso" }) );
set_heart_beat(1);
}
void init(){
::init();
add_action("boost","boost");
}
int SetCharge(int i){
charge = i;
}
int SetMaxCharge(int i){
maxcharge = i;
}
void heart_beat(){
int medium;
if(activated) charge--;
if(charge < 1) charge = 0;
if(!charge && activated){
object env = environment();
activated = 0;
if(env){
tell_object(env,"The rocket pack sputters and fails.");
}
}
if(!owner) return;
medium = environment(owner)->GetMedium();
if(medium == MEDIUM_SPACE){
int i;
object env = environment(owner);
if(!current_direction){
current_direction = env->GetExits()[random(sizeof(env->GetExits()))];
}
if(activated){
if(!Directions[current_direction]) Directions[current_direction] = 1;
else Directions[current_direction]++;
}
foreach(mixed key, mixed val in Directions){
if(val > 20) val = 20;
for(i=val;i>0;i--){
this_object()->boost(key,1);
}
}
}
}
int boost(string str, int coasting){
string dest,imsg,omsg;
mapping Exit, Doors;
int ret, medium;
object env;
if(!owner) return 0;
env = environment(owner);
current_direction = str;
medium = environment(owner)->GetMedium();
if(!env) return 0;
Doors = env->GetDoorsMap();
if(medium == MEDIUM_SPACE && !coasting){
if(Directions[opposite_dir(str)]){
Directions[opposite_dir(str)]--;
}
else {
if(!Directions[str]) Directions[str] = 1;
else Directions[str]++;
//call_out( (: boost :), 1, str, 1);
}
}
if(!coasting && environment(this_object()) != owner){
write("You don't have the rocket pack.");
return 1;
}
if(!coasting && !GetWorn()){
write("You're not wearing the rocket pack.");
return 1;
}
if(!coasting && !str || !env){
write("Boost in which direction?");
return 1;
}
if(!coasting && !charge){
write("The rocket pack is out of fuel.");
return 1;
}
dest = env->GetExit(str);
if(!dest){
if(str == "up" && env->GetFlyRoom()) dest = env->GetFlyRoom();
else if(str == "down" && env->GetSinkRoom()) dest = env->GetSinkRoom();
else {
if(!coasting) write("No such direction");
return 1;
}
}
Exit = environment(owner)->GetExitData(str);
if( sizeof(Doors) && Doors[str] && Doors[str]->GetClosed() ){
message("my_action", "You bump into " +
Doors[str]->GetShort(str) + ".", owner);
return 1;
}
if( Exit && Exit["pre"] &&
!(evaluate(Exit["pre"], str)) ){
return 1;
//return 1;
}
if(!sizeof(dest)){
write("You can't go that way.");
return 1;
}
omsg = owner->GetName()+" rockets "+str+".";
imsg = owner->GetName()+" rockets in.";
if(!coasting) write("You engage your rocket pack's boosters to rocket you "+str+".");
if(!coasting) charge--;
ret = owner->eventMoveLiving(dest, omsg, imsg, str);
if(ret){
if( Exit && Exit["post"] ) evaluate(Exit["post"], str);
if(activated){
if(!coasting) write("The rocket pack's boosters resume normal operation.");
}
else {
if(!coasting) write("The rocket pack's boosters sputter and go silent.");
}
}
return 1;
}
int eventTurnOn(){
if(!(this_object()->GetWorn()) || !this_player() ||
environment(this_object()) != this_player()){
write("You are not wearing the rocket pack.");
return 1;
}
write("You activate the rocket pack with a deep, rumbling roar!");
say(this_player()->GetName()+" fires up "+possessive(this_player())+" "
"rocket pack with a deep, rumbling roar!");
activated = 1;
return 1;
}
int eventTurnOff(){
write("You deactivate the rocket pack. The boosters sputter and go silent.");
say(this_player()->GetName()+" deactivates "+possessive(this_player())+" "
"rocket pack. The boosters sputter and go silent.");
activated = 0;
return 1;
}
int GetRunning(){
return activated;
}
mixed eventEquip(object who, string array limbs){
mixed success = armor::eventEquip(who, limbs);
rocketshadow = new("/shadows/rocketpack");
owner = who;
if(success){
if(rocketshadow) rocketshadow->eventShadow(who);
}
else if(rocketshadow) destruct(rocketshadow);
activated = 0;
return success;
}
varargs mixed eventUnequip(object who) {
mixed success;
if(!who) who = this_player();
success = armor::eventUnequip(who);
if(success){
if(rocketshadow) rocketshadow->eventUnshadow();
}
if(rocketshadow) destruct(rocketshadow);
return success;
}
int eventDecrementCharge(){
if(!GetWorn()) return 0;
if(previous_object() != rocketshadow) return 0;
if(charge < 1) charge = 0;
else charge--;
if(charge < 50){
tell_object(environment(this_object()),"The rocket pack beeps loudly!");
return charge;
}
if(charge < 100){
tell_object(environment(this_object()),"The rocket pack beeps softly.");
return charge;
}
return charge;
}
int GetRemainingCharge(){
return charge;
}