Files
dsrc/sku.0/sys.server/compiled/game/script/library/doctor_bag.scriptlib
T

310 lines
10 KiB
Plaintext

/**
* Title: support library for the doctor bag
*/
//------------------------------------------------
// Includes
//------------------------------------------------
include library.prose;
include library.utils;
//------------------------------------------------
// Constants
//------------------------------------------------
const int MAX_MEDS = 25; // Limit to how many meds can be in the bag.
const int HEALING_RANGE = 0;
const int HEALING_AREA = 1;
const int HEALING_DOT_POWER = 2;
const int HEALING_DOT_POTENCY = 3;
const int HEALING_DOT_ATTRIBUTE = 4;
const int HEALING_DOT_DURATION = 5;
const string_id SID_MEDICINE_STORED = new string_id( "doctor_bag", "medicine_stored" );
const string_id SID_MEDICINE_REMOVED = new string_id( "doctor_bag", "medicine_removed" );
//------------------------------------------------
// isDoctorBag
//------------------------------------------------
boolean isDoctorBag( obj_id object )
{
return hasObjVar( object, "doctor_bag" );
}
//------------------------------------------------
// hasDoctorBag
//
// Returns true if the player has a doctor bag in their inventory.
//------------------------------------------------
boolean hasDoctorBag( obj_id player )
{
return ( null != getDoctorBag( player ) );
}
//------------------------------------------------
// getDoctorBag
//
// Returns true if the player has at least one doctor bag in their inventory.
//------------------------------------------------
obj_id getDoctorBag( obj_id player )
{
// Search the player's inventory for at least one doctor bag.
obj_id pInv = utils.getInventoryContainer( player );
if ( pInv == null )
return null;
obj_id[] contents = utils.getContents( pInv, true );
if ( contents == null )
return null;
for ( int i=0; i<contents.length; i++ )
{
if ( isDoctorBag( contents[i] ) )
{
return contents[i];
}
}
return null;
}
//------------------------------------------------
// addMedicine
//
// Tries to add a medicine to the specified doctor bag.
//------------------------------------------------
boolean addMedicine( obj_id player, obj_id bag, obj_id medicine )
{
if(hasScript(medicine, "systems.combat.combat_delayed_tracker"))
return false;
obj_var_list meds = getObjVarList( bag, "meds" );
if ( meds == null )
{
// Create the array.
meds = new obj_var_list( "meds" );
}
else if ( meds.getNumItems() >= MAX_MEDS )
{
// Send a message saying the bag is full.
return false;
}
// Add it to the first empty slot.
int free_index = -1;
for ( int i=0; i<MAX_MEDS; i++ )
{
obj_var_list med = meds.getObjVarList( Integer.toString( i ) );
if ( med == null )
{
free_index = i;
break;
}
}
if ( free_index == -1 )
return false;
// Copy the med data into our index.
string prefix = "meds."+free_index+".";
// Store the template name.
setObjVar( bag, prefix+"object_tangible", getTemplateName( medicine ) );
setObjVar( bag, prefix+"name_id", getNameStringId( medicine ) );
setObjVar( bag, prefix+"name", getName( medicine ) );
// Store the general medicine info.
setObjVar( bag, prefix+"consumable.medicine", getIntObjVar( medicine, "consumable.medicine" ) );
setObjVar( bag, prefix+"consumable.mods", getAttribModArrayObjVar( medicine, "consumable.mods" ) );
setObjVar( bag, prefix+"consumable.skillModMin", getIntArrayObjVar( medicine, "consumable.skillModMin" ) );
setObjVar( bag, prefix+"consumable.skillModRequired", getStringArrayObjVar( medicine, "consumable.skillModRequired" ) );
setObjVar( bag, prefix+"count", getCount( medicine ) );
// Store any enhanced functionality info.
if ( hasObjVar( medicine, "healing" ) )
{
if ( hasObjVar( medicine, "healing.apply_dot" ) )
setObjVar( bag, prefix+"healing.apply_dot", getStringObjVar( medicine, "healing.apply_dot" ) );
if ( hasObjVar( medicine, "healing.cure_dot" ) )
setObjVar( bag, prefix+"healing.cure_dot", getStringObjVar( medicine, "healing.cure_dot" ) );
if ( hasObjVar( medicine, "healing.dot_id" ) )
setObjVar( bag, prefix+"healing.dot_id", getStringObjVar( medicine, "healing.dot_id" ) );
if ( hasObjVar( medicine, "healing.state" ) )
setObjVar( bag, prefix+"healing.state", getStringObjVar( medicine, "healing.state" ) );
int dotInfo[] = new int[6];
dotInfo[0] = getIntObjVar( medicine, "healing.range" );
dotInfo[1] = getIntObjVar( medicine, "healing.area" );
dotInfo[2] = getIntObjVar( medicine, "healing.dot_power" );
dotInfo[3] = getIntObjVar( medicine, "healing.dot_potency" );
dotInfo[4] = getIntObjVar( medicine, "healing.dot_attribute" );
dotInfo[5] = getIntObjVar( medicine, "healing.dot_duration" );
setObjVar( bag, prefix+"healing.dot_info", dotInfo );
}
// Done!
prose_package pp = prose.getPackage( SID_MEDICINE_STORED, medicine );
sendSystemMessageProse( player, pp );
// Destroy the old medicine.
destroyObject( medicine );
return true;
}
//------------------------------------------------
// removeMedicine
//
// Tries to remove a medicine from the doctor bag.
//------------------------------------------------
boolean removeMedicine( obj_id player, obj_id bag, int med )
{
string prefix = "meds."+med+".";
obj_id pInv = utils.getInventoryContainer( player );
if ( pInv == null )
return false;
// Try to create the object.
string template = getStringObjVar( bag, prefix+"object_tangible" );
obj_id new_med = createObject( template, pInv, "" );
if ( new_med == null )
{
// The player doesn't have any room.
return false;
}
// Set the data on the new med.
// setName( new_med, getStringObjVar( bag, prefix+"name" ) );
setName( new_med, getStringIdObjVar( bag, prefix+"name_id" ) );
setCount( new_med, getIntObjVar( bag, prefix+"count" ) );
setObjVar( new_med, "consumable.medicine", getIntObjVar( bag, prefix+"consumable.medicine" ) );
setObjVar( new_med, "consumable.mods", getAttribModArrayObjVar( bag, prefix+"consumable.mods" ) );
setObjVar( new_med, "consumable.skillModMin", getIntArrayObjVar( bag, prefix+"consumable.skillModMin" ) );
setObjVar( new_med, "consumable.skillModRequired", getStringArrayObjVar( bag, prefix+"consumable.skillModRequired" ) );
// Set enhanced functionality info.
if ( hasObjVar( bag, prefix+"healing" ) )
{
if ( hasObjVar( bag, prefix+"healing.apply_dot" ) )
setObjVar( new_med, "healing.apply_dot", getStringObjVar( bag, prefix+"healing.apply_dot" ) );
if ( hasObjVar( bag, prefix+"healing.cure_dot" ) )
setObjVar( new_med, "healing.cure_dot", getStringObjVar( bag, prefix+"healing.cure_dot" ) );
if ( hasObjVar( bag, prefix+"healing.dot_id" ) )
setObjVar( new_med, "healing.dot_id", getStringObjVar( bag, prefix+"healing.dot_id" ) );
if ( hasObjVar( bag, prefix+"healing.state" ) )
setObjVar( new_med, "healing.state", getStringObjVar( bag, prefix+"healing.state" ) );
int dotInfo[] = getIntArrayObjVar( bag, prefix+"healing.dot_info" );
if ( dotInfo[0] != 0 )
setObjVar( new_med, "healing.range", dotInfo[0] );
if ( dotInfo[1] != 0 )
setObjVar( new_med, "healing.area", dotInfo[1] );
if ( dotInfo[2] != 0 )
setObjVar( new_med, "healing.dot_power", dotInfo[2] );
if ( dotInfo[3] != 0 )
setObjVar( new_med, "healing.dot_potency", dotInfo[3] );
if ( dotInfo[4] != 0 )
setObjVar( new_med, "healing.dot_attribute", dotInfo[4] );
if ( dotInfo[5] != 0 )
setObjVar( new_med, "healing.dot_duration", dotInfo[5] );
}
// Crafter id.
setCraftedId( new_med, new_med );
// Remove this med entry.
removeObjVar( bag, "meds."+med );
// Done!
prose_package pp = prose.getPackage( SID_MEDICINE_REMOVED, new_med );
sendSystemMessageProse( player, pp );
return true;
}
//------------------------------------------------
// setSurrogateState
//------------------------------------------------
boolean setSurrogateState( obj_id bag, string prefix )
{
clearSurrogateState( bag );
// Set the various obj vars.
setObjVar( bag, "consumable.medicine", getIntObjVar( bag, prefix+"consumable.medicine" ) );
setObjVar( bag, "consumable.mods", getAttribModArrayObjVar( bag, prefix+"consumable.mods" ) );
setObjVar( bag, "consumable.skillModMin", getIntArrayObjVar( bag, prefix+"consumable.skillModMin" ) );
setObjVar( bag, "consumable.skillModRequired", getStringArrayObjVar( bag, prefix+"consumable.skillModRequired" ) );
if ( hasObjVar( bag, prefix+"healing" ) )
{
if ( hasObjVar( bag, prefix+"healing.apply_dot" ) )
setObjVar( bag, "healing.apply_dot", getStringObjVar( bag, prefix+"healing.apply_dot" ) );
if ( hasObjVar( bag, prefix+"healing.cure_dot" ) )
setObjVar( bag, "healing.cure_dot", getStringObjVar( bag, prefix+"healing.cure_dot" ) );
if ( hasObjVar( bag, prefix+"healing.dot_id" ) )
setObjVar( bag, "healing.dot_id", getStringObjVar( bag, prefix+"healing.dot_id" ) );
if ( hasObjVar( bag, prefix+"healing.state" ) )
setObjVar( bag, "healing.state", getStringObjVar( bag, prefix+"healing.state" ) );
int dotInfo[] = getIntArrayObjVar( bag, prefix+"healing.dot_info" );
if ( dotInfo[0] != 0 )
setObjVar( bag, "healing.range", dotInfo[0] );
if ( dotInfo[1] != 0 )
setObjVar( bag, "healing.area", dotInfo[1] );
if ( dotInfo[2] != 0 )
setObjVar( bag, "healing.dot_power", dotInfo[2] );
if ( dotInfo[3] != 0 )
setObjVar( bag, "healing.dot_potency", dotInfo[3] );
if ( dotInfo[4] != 0 )
setObjVar( bag, "healing.dot_attribute", dotInfo[4] );
if ( dotInfo[5] != 0 )
setObjVar( bag, "healing.dot_duration", dotInfo[5] );
}
setCount( bag, getIntObjVar( bag, prefix+"count" ) );
setObjVar( bag, "surrogate", prefix );
int[] stomachMods = new int[3];
setObjVar( bag, "consumable.stomachValues", stomachMods );
return true;
}
//------------------------------------------------
// clearSurrogateState
//------------------------------------------------
boolean clearSurrogateState( obj_id bag )
{
removeObjVar( bag, "surrogate" );
removeObjVar( bag, "consumable.medicine" );
removeObjVar( bag, "consumable.mods" );
removeObjVar( bag, "consumable.skillModMin" );
removeObjVar( bag, "consumable.skillModRequired" );
removeObjVar( bag, "consumable.stomachValues" );
removeObjVar( bag, "healing" );
setCount( bag, 0 );
return true;
}
//------------------------------------------------
// decrementSurrogateCharge
//------------------------------------------------
void decrementSurrogateCharge( obj_id bag )
{
string prefix = getStringObjVar( bag, "surrogate" );
int charges = getIntObjVar( bag, prefix+"count" );
charges--;
if ( charges <= 0 )
{
string index = prefix.substring( 0, prefix.length()-1 );
removeObjVar( bag, index );
}
else
{
setObjVar( bag, prefix+"count", charges );
}
}