mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-31 00:15:54 -04:00
310 lines
10 KiB
Plaintext
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 );
|
|
}
|
|
}
|