mirror of
https://bitbucket.org/seefoe/dsrc.git
synced 2026-07-31 01:15:55 -04:00
566 lines
15 KiB
Plaintext
566 lines
15 KiB
Plaintext
/* Title: camp_master.script
|
|
* Description: master object camping script
|
|
*/
|
|
|
|
//----------------------------------------------------------------------
|
|
// Includes
|
|
//----------------------------------------------------------------------
|
|
|
|
include library.camping;
|
|
include library.theater;
|
|
include library.prose;
|
|
include library.healing;
|
|
include library.ai_lib;
|
|
include library.xp;
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
// Constants
|
|
//----------------------------------------------------------------------
|
|
|
|
const string TOTAL_XP = "total_xp";
|
|
|
|
const int CAMP_TICK_XP = 25;
|
|
|
|
const int XP_MAX [] = { 0, 350, 600, 800, 1000, 1100, 1200 };
|
|
const float XP_MULT [] = { 0.f, 1.f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f };
|
|
|
|
const string IGNORE_RESTORE_MESSAGE = "ignoreRestoreMsg";
|
|
|
|
const string VAR_CAMP_CAMPFIRE = "campfire";
|
|
|
|
const string TEMPLATE_LOGS_FRESH = "object/static/structure/general/campfire_fresh.iff";
|
|
const string TEMPLATE_LOGS_BURNT = "object/static/structure/general/campfire_burnt.iff";
|
|
const string TEMPLATE_LOGS_SMOLDERING = "object/static/structure/general/campfire_smoldering.iff";
|
|
const string TEMPLATE_LOGS_ASH = "object/static/structure/general/campfire_ash.iff";
|
|
|
|
const string_id SID_SYS_COMBAT_ABANDONED = new string_id("camp", "sys_combat_abandoned");
|
|
const string_id SID_SYS_ABANDONED_CAMP = new string_id("camp", "sys_abandoned_camp");
|
|
const string_id SID_SYS_CAMP_HEAL = new string_id("camp", "sys_camp_heal");
|
|
|
|
const int HEALING_PULSE_MIN = 100;
|
|
const int HEALING_PULSE_MAX = 300;
|
|
const int WOUND_HEAL = 5;
|
|
const int SHOCK_HEAL = 1;
|
|
|
|
//----------------------------------------------------------------------
|
|
// OnAttach
|
|
//----------------------------------------------------------------------
|
|
|
|
trigger OnAttach()
|
|
{
|
|
setObjVar( self, camping.VAR_BEEN_INITIALIZED, true );
|
|
createTriggerVolume( "camp_" + self, camping.getCampSize(self), true );
|
|
|
|
// Check to see if owner is near.
|
|
camping.setCampMasterName( self );
|
|
obj_id owner = getObjIdObjVar( self, camping.VAR_OWNER );
|
|
obj_id[] players = getPlayerCreaturesInRange( getLocation(self), camping.getCampSize(self) );
|
|
//REMOVED! Originally this was necessary to send the message off to players in the camp when
|
|
//it instantiated because the triggerVolume enter didn't go off if you were inside the trigger
|
|
//volume when it was created. That bug was fixed which meant this was just sending a second
|
|
//Message for no real reason. TBailey 5/28/2004
|
|
/*if ( players != null )
|
|
{
|
|
for ( int i=0; i<players.length; i++ )
|
|
{
|
|
if ( players[i] != null )
|
|
debugSpeakMsg (self, "Came from OnAttach");
|
|
addCampMember( self, owner, players[i] );
|
|
}
|
|
}*/
|
|
setObjVar( self, camping.VAR_OWNER_NEAR, true );
|
|
|
|
// Start autoheal loop.
|
|
int campPower = getIntObjVar( self, camping.VAR_CAMP_POWER );
|
|
int campPowerBonus = campPower;
|
|
if ( campPowerBonus > 5 )
|
|
campPowerBonus = 5;
|
|
int min = HEALING_PULSE_MIN;
|
|
int max = HEALING_PULSE_MAX - (50*campPowerBonus);
|
|
int pulse = rand( min, max );
|
|
messageTo( self, "OnHealingLoop", null, pulse, false );
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// OnDestroy
|
|
//----------------------------------------------------------------------
|
|
|
|
trigger OnDestroy()
|
|
{
|
|
// Clean up the campfire.
|
|
obj_id item = getObjIdObjVar( self, VAR_CAMP_CAMPFIRE );
|
|
if ( (item == null) || (item == obj_id.NULL_ID) )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
destroyObject(item);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// theaterFinished
|
|
//----------------------------------------------------------------------
|
|
|
|
messageHandler theaterFinished()
|
|
{
|
|
notifyChildren( self, "handleCampPrep" );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// notifyChildren
|
|
//----------------------------------------------------------------------
|
|
|
|
void notifyChildren( obj_id self, string msg )
|
|
{
|
|
dictionary outparams = new dictionary();
|
|
outparams.put( "master", self );
|
|
obj_id[] children = getObjIdArrayObjVar( self, theater.VAR_CHILDREN );
|
|
if ( (children == null) || (children.length == 0) )
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
int j = 0;
|
|
for ( int i = 0; i < children.length; i++ )
|
|
{
|
|
obj_id child = children[i];
|
|
if ( (child == null) || (child == obj_id.NULL_ID) )
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
// Send a prep message.
|
|
messageTo( child, msg, outparams, 0, false );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// OnInitialize
|
|
//----------------------------------------------------------------------
|
|
|
|
trigger OnInitialize()
|
|
{
|
|
if ( hasObjVar( self, camping.VAR_BEEN_INITIALIZED ) )
|
|
camping.nukeCamp( self );
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// OnUnloadedFromMemory
|
|
//----------------------------------------------------------------------
|
|
|
|
trigger OnUnloadedFromMemory()
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// OnTriggerVolumeEntered
|
|
//----------------------------------------------------------------------
|
|
|
|
trigger OnTriggerVolumeEntered( string volName, obj_id who )
|
|
{
|
|
if ( who == self )
|
|
return SCRIPT_CONTINUE;
|
|
|
|
if ( volName.equals("camp_" + self) )
|
|
{
|
|
obj_id owner = getObjIdObjVar( self, camping.VAR_OWNER );
|
|
if ( (owner == null) || (owner == obj_id.NULL_ID) )
|
|
{
|
|
sendSystemMessage( who, camping.SID_CAMP_ENTER );
|
|
sendSystemMessage( who, SID_SYS_CAMP_HEAL );
|
|
}
|
|
else
|
|
{
|
|
addCampMember( self, owner, who );
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// addCampMember
|
|
//----------------------------------------------------------------------
|
|
|
|
void addCampMember( obj_id self, obj_id owner, obj_id who )
|
|
{
|
|
if ( who == owner )
|
|
{
|
|
setObjVar( self, camping.VAR_OWNER_NEAR, true );
|
|
int status = camping.getStatus( self );
|
|
if ( status == camping.STATUS_ABANDONED )
|
|
{
|
|
camping.setStatus( self, camping.STATUS_MAINTAIN );
|
|
camping.sendCampMaintenanceHeartbeat( self );
|
|
setObjVar( self, IGNORE_RESTORE_MESSAGE, true );
|
|
}
|
|
}
|
|
|
|
camping.setCurrentCamp( who, self );
|
|
prose_package pp = prose.getPackage( camping.PROSE_CAMP_ENTER, getName(self) );
|
|
sendSystemMessageProse( who, pp );
|
|
sendSystemMessage( who, SID_SYS_CAMP_HEAL );
|
|
|
|
// Increment visitor count.
|
|
int count = getIntObjVar( self, "visitor_count" );
|
|
count++;
|
|
setObjVar( self, "visitor_count", count );
|
|
|
|
// Increment current occupancy.
|
|
int occ = getIntObjVar( self, "occ_count" );
|
|
occ++;
|
|
setObjVar( self, "occ_count", occ );
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// OnTriggerVolumeExited
|
|
//----------------------------------------------------------------------
|
|
|
|
trigger OnTriggerVolumeExited( string volName, obj_id who )
|
|
{
|
|
if ( who == self )
|
|
return SCRIPT_CONTINUE;
|
|
|
|
if ( volName.equals("camp_" + self) )
|
|
{
|
|
obj_id owner = getObjIdObjVar( self, camping.VAR_OWNER );
|
|
if ( (owner == null) || (owner == obj_id.NULL_ID) )
|
|
{
|
|
sendSystemMessage( who, camping.SID_CAMP_EXIT );
|
|
}
|
|
else
|
|
{
|
|
if ( who == owner )
|
|
setObjVar( self, camping.VAR_OWNER_NEAR, false );
|
|
|
|
camping.clearCurrentCamp( who );
|
|
prose_package pp = prose.getPackage( camping.PROSE_CAMP_EXIT, getName(self) );
|
|
sendSystemMessageProse( who, pp );
|
|
}
|
|
|
|
// Decrement current occupancy.
|
|
int occ = getIntObjVar( self, "occ_count" );
|
|
occ--;
|
|
setObjVar( self, "occ_count", occ );
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// OnHealingLoop
|
|
//----------------------------------------------------------------------
|
|
|
|
messageHandler OnHealingLoop()
|
|
{
|
|
int campPower = getIntObjVar( self, camping.VAR_CAMP_POWER );
|
|
obj_id[] players = getPlayerCreaturesInRange( getLocation(self), camping.getCampSize(self) );
|
|
if ( players != null )
|
|
{
|
|
for ( int i = 0; i < players.length; i++ )
|
|
{
|
|
// Go through all attributes and heal wounds if the player is in the camp.
|
|
for ( int j = 0; j < NUM_ATTRIBUTES; j++ )
|
|
{
|
|
if ( healing.isWounded( players[i], j ) )
|
|
{
|
|
int xpAmt = getIntObjVar( self, camping.VAR_CAMP_XP );
|
|
int xpMax = XP_MAX[campPower];
|
|
if ( xpAmt < xpMax )
|
|
{
|
|
int toGrant = CAMP_TICK_XP;
|
|
xpAmt += toGrant;
|
|
setObjVar( self, camping.VAR_CAMP_XP, xpAmt );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int campPowerBonus = campPower;
|
|
if ( campPowerBonus > 5 )
|
|
campPowerBonus = 5;
|
|
int min = HEALING_PULSE_MIN;
|
|
int max = HEALING_PULSE_MAX - (25*campPowerBonus);
|
|
int pulse = rand( min, max );
|
|
messageTo( self, "OnHealingLoop", null, pulse, false );
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// handleSetStatus
|
|
//----------------------------------------------------------------------
|
|
|
|
messageHandler handleSetStatus()
|
|
{
|
|
if ( (params == null) || (params.isEmpty()) )
|
|
return SCRIPT_CONTINUE;
|
|
|
|
int status = params.getInt( camping.DICT_NEW_STATUS );
|
|
switch ( status )
|
|
{
|
|
case camping.STATUS_NEW:
|
|
setCampfire( self, TEMPLATE_LOGS_FRESH );
|
|
break;
|
|
|
|
case camping.STATUS_CREATION:
|
|
break;
|
|
|
|
case camping.STATUS_MAINTAIN:
|
|
setCampfire( self, TEMPLATE_LOGS_FRESH );
|
|
break;
|
|
|
|
case camping.STATUS_ABANDONED:
|
|
default:
|
|
setCampfire( self, TEMPLATE_LOGS_SMOLDERING );
|
|
break;
|
|
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// setCampfire
|
|
//----------------------------------------------------------------------
|
|
|
|
void setCampfire( obj_id self, string tpf )
|
|
{
|
|
obj_id item = getObjIdObjVar( self, VAR_CAMP_CAMPFIRE );
|
|
if ( (item == null) || (item == obj_id.NULL_ID) )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
string itemTemplate = getTemplateName( item );
|
|
if ( itemTemplate.equals(tpf) )
|
|
return;
|
|
destroyObject(item);
|
|
}
|
|
|
|
location here = getLocation( self );
|
|
item = createObject( tpf, here );
|
|
setObjVar( self, VAR_CAMP_CAMPFIRE, item );
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// handleCampCreationHeartbeat
|
|
//----------------------------------------------------------------------
|
|
|
|
messageHandler handleCampCreationHeartbeat()
|
|
{
|
|
// Validate owner.
|
|
if ( !hasObjVar(self, camping.VAR_OWNER) )
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id owner = getObjIdObjVar( self, camping.VAR_OWNER );
|
|
if ( (owner == null) || (owner == obj_id.NULL_ID) )
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ( (!exists(owner)) || (!isInWorld(owner)) || (!owner.isLoaded()) )
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if ( camping.getStatus(self) == camping.STATUS_NEW )
|
|
camping.setStatus( self, camping.STATUS_CREATION );
|
|
|
|
camping.sendCampCreationComplete( self );
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// handleCampComplete
|
|
//----------------------------------------------------------------------
|
|
|
|
messageHandler handleCampComplete()
|
|
{
|
|
// Validate owner.
|
|
if ( !hasObjVar( self, camping.VAR_OWNER ) )
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id owner = getObjIdObjVar( self, camping.VAR_OWNER );
|
|
if ( (owner == null) || (owner == obj_id.NULL_ID) )
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ( (!exists(owner)) || (!isInWorld(owner)) || (!owner.isLoaded()) )
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if ( !camping.isOwnerInVicinity(self) )
|
|
{
|
|
camping.nukeCamp(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
camping.setStatus( self, camping.STATUS_MAINTAIN );
|
|
camping.sendCampMaintenanceHeartbeat( self );
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// handleCampMaintenanceHeartbeat
|
|
//----------------------------------------------------------------------
|
|
|
|
messageHandler handleCampMaintenanceHeartbeat()
|
|
{
|
|
// Validate owner.
|
|
if ( !hasObjVar(self, camping.VAR_OWNER) )
|
|
{
|
|
setObjVar( self, camping.VAR_OWNER, obj_id.NULL_ID );
|
|
camping.sendCampRestoreHeartbeat( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id owner = getObjIdObjVar( self, camping.VAR_OWNER );
|
|
if ( (owner == null) || (owner == obj_id.NULL_ID) )
|
|
{
|
|
camping.campAbandoned( self );
|
|
camping.sendCampRestoreHeartbeat( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ( (!exists(owner)) || (!isInWorld(owner)) || (!owner.isLoaded()) )
|
|
{
|
|
camping.campAbandoned( self );
|
|
camping.sendCampRestoreHeartbeat( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ( ai_lib.isInCombat( owner ) )
|
|
{
|
|
// Destroy due to combat.
|
|
sendSystemMessage( owner, SID_SYS_COMBAT_ABANDONED );
|
|
camping.campAbandoned( self );
|
|
camping.sendCampRestoreHeartbeat( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// Build up ticks and destroy us if we've been around too long.
|
|
int ticks = getIntObjVar( self, "camp.ticks" );
|
|
ticks++;
|
|
setObjVar( self, "camp.ticks", ticks );
|
|
if ( ticks > 100 )
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// Check if abandoned.
|
|
if ( !camping.isOwnerInVicinity(self) )
|
|
{
|
|
camping.setStatus( self, camping.STATUS_ABANDONED );
|
|
camping.sendCampRestoreHeartbeat( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
// Grant XP skill check.
|
|
int campOcc = getIntObjVar( self, "occ_count" );
|
|
int roll = rand( 0, 100 );
|
|
roll += (campOcc-1)*5;
|
|
if ( campOcc > 5 )
|
|
campOcc = 5;
|
|
if ( roll > 40 )
|
|
{
|
|
int xpAmt = getIntObjVar( self, camping.VAR_CAMP_XP );
|
|
int campPower = getIntObjVar( self, camping.VAR_CAMP_POWER );
|
|
int xpMax = XP_MAX[campPower];
|
|
if ( xpAmt < xpMax )
|
|
{
|
|
int toGrant = (int) (CAMP_TICK_XP * campOcc * XP_MULT[campPower]);
|
|
xpAmt += toGrant;
|
|
setObjVar( self, camping.VAR_CAMP_XP, xpAmt );
|
|
}
|
|
}
|
|
|
|
// Send maint heartbeat.
|
|
camping.sendCampMaintenanceHeartbeat( self );
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// handleCampRestoreHeartbeat
|
|
//----------------------------------------------------------------------
|
|
|
|
messageHandler handleCampRestoreHeartbeat()
|
|
{
|
|
// Validate owner.
|
|
if ( !hasObjVar(self, camping.VAR_OWNER) )
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ( hasObjVar(self, IGNORE_RESTORE_MESSAGE) )
|
|
{
|
|
removeObjVar( self, IGNORE_RESTORE_MESSAGE );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id owner = getObjIdObjVar( self, camping.VAR_OWNER );
|
|
if ( (owner == null) || (owner == obj_id.NULL_ID) )
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
// Check if owner has entered area.
|
|
if ( camping.isOwnerInVicinity(self) )
|
|
{
|
|
camping.setStatus( self, camping.STATUS_MAINTAIN );
|
|
camping.sendCampMaintenanceHeartbeat( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
// Grant XP.
|
|
//int xpAmt = getIntObjVar( self, camping.VAR_CAMP_XP );
|
|
//if ( xpAmt > 0 )
|
|
// xp.grant( owner, xp.SCOUT, xpAmt );
|
|
//setObjVar( self, camping.VAR_CAMP_XP, 0 );
|
|
sendSystemMessage( owner, SID_SYS_ABANDONED_CAMP );
|
|
|
|
camping.clearCampOwner( self );
|
|
setObjVar( self, camping.VAR_CAMP_XP, 0 );
|
|
camping.setCampMasterName( self );
|
|
camping.sendCampRestoreHeartbeat( self );
|
|
camping.campAbandoned (self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// if camp is abandoned for 5 minutes...nuke it
|
|
//----------------------------------------------------------------------
|
|
|
|
messageHandler handleNuke()
|
|
{
|
|
camping.nukeCamp( self );
|
|
return SCRIPT_CONTINUE;
|
|
}
|