HiddenTradition_PRC8/_module/nss/gz_c2_woodcutter.nss
2024-06-20 15:47:42 -04:00

238 lines
5.9 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Custom User Defined Event
//:: gz_c2_woodcutter
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
*/
//:://////////////////////////////////////////////
//:: Created By: Dom Queron
//:://////////////////////////////////////////////
int WOODCUTTER_INIT = 0;
int WOODCUTTER_CUTTING = 1;
int WOODCUTTER_HOMING = 2;
int WOODCUTTER_RESTING = 4;
int WOODCUTTER_NIGHT = 8;
int WOODCUTTER_OUTOFTREES = 16;
int WOODCUTTER_DISABLED = 255;
void WCSetState(int iState)
{
SetLocalInt(OBJECT_SELF,"T1_NPC_STATE",iState);
}
void WCSetIHaveWood()
{
SetLocalInt(OBJECT_SELF,"T1_NPC_HASWOOD",TRUE);
}
int WCGetHasWood()
{
int iRet;
iRet = (GetLocalInt(OBJECT_SELF,"T1_NPC_HASWOOD") == TRUE);
return iRet;
}
/*
Here we handle if we run out of basheable trees
*/
void WCOutOfTrees()
{
if (GetIsNight())
{
WCSetState(WOODCUTTER_HOMING);
}
else
{
int iRoll = d20();
if (iRoll<10)
if (iRoll == 1 || iRoll == 2) //presumably If is faster than switch, but this may vary
{ ActionSpeakString("*sigh*, no more suitable trees around");
ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_BORED);
}
else if (iRoll == 3 || iRoll == 4)
{
ActionSpeakString("No good trees, no work, no food. This aint good");
ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD);
}
else if (iRoll == 5 || iRoll == 6)
{
ActionSpeakString("Tis a shame, no work to do");
ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD);
}
else if (iRoll > 6 || iRoll <10)
{
ActionRandomWalk(); //actionRandomWalk seems to stop never
DelayCommand(15.0f,ClearAllActions());
}
}
}
/*
Here we cut down trees
*/
void WCWork()
{
// get the next tree marked for cutting
object oTarget = GetNearestObjectByTag(GetTag(OBJECT_SELF)+"_TREE");
// do we have a tree?
if ((oTarget != OBJECT_INVALID) && !GetLocalInt(OBJECT_SELF,"T1_NPC_KILLEDLASTREE"))
{
if (GetDistanceToObject(oTarget)>5.0f)
ActionMoveToObject(oTarget);
else
{
if (d6() <3)
{
ActionSpeakString ("*sings* I'm a Lumberjack and I'm ok ...");
ActionWait(2.0f);
ActionSpeakString ("..I sleep all night and work all day");
}
DoPlaceableObjectAction(oTarget,PLACEABLE_ACTION_BASH);
WCSetIHaveWood();
}
}
else
if (WCGetHasWood())
WCSetState(WOODCUTTER_HOMING);// Enter out of trees mode
else
WCSetState(WOODCUTTER_OUTOFTREES);// Enter out of trees mode
}
void WCHome()
{
// here we reset the tree kill timer
DeleteLocalInt(OBJECT_SELF,"T1_NPC_KILLEDLASTREE");
DeleteLocalInt(OBJECT_SELF,"T1_NPC_HASWOOD");
location lTarget= GetLocalLocation(OBJECT_SELF,"T1_NPC_SPAWNLOC");
if (GetDistanceBetweenLocations(GetLocation(OBJECT_SELF),lTarget)>0.5f)
{
ActionSpeakString("Ahh, time for a rest!");
ActionMoveToLocation(lTarget);
}
else
{
// do we have a chair nearby?
object oChair = GetNearestObjectByTag(GetTag(OBJECT_SELF)+"_CHAIR");
// any chair here?
if (oChair != OBJECT_INVALID)
{
if (d4()<2) ActionSpeakString("Where is my chair? ... ah there!");
ActionSpeakString("Ahh, nothing better than a fresh bread and some cold ale!");
ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK);
ActionSit(oChair);
ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK);
WCSetState(WOODCUTTER_RESTING);// Enter out of trees mode
}
else
{
ActionSpeakString("Ahh, nothing better than a fresh bread and some cold ale!");
ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK);
WCSetState(WOODCUTTER_RESTING);// Enter out of trees mode
}
}
}
void WCRest()
{
effect eSleep = EffectSleep();
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSleep, OBJECT_SELF,60.0f);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), OBJECT_SELF);
WCSetState(WOODCUTTER_NIGHT);
}
void WCWake()
{
effect eSleep = EffectSleep();
RemoveEffect(OBJECT_SELF,eSleep);
WCSetState(WOODCUTTER_CUTTING);
}
void WCSleep()
{
if (GetIsDay())
WCWake();
else
{
effect eSleep = EffectSleep();
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSleep, OBJECT_SELF,60.0f);
}
}
void main()
{
int nUser = GetUserDefinedEventNumber();
if(nUser == 1001) //HEARTBEAT
{
int iState = GetLocalInt(OBJECT_SELF,"T1_NPC_STATE");
if (iState != WOODCUTTER_DISABLED)
switch (iState)
{
case 0 :
// Store our Start Location
SetLocalLocation(OBJECT_SELF,"T1_NPC_SPAWNLOC",GetLocation(OBJECT_SELF));
WCSetState(WOODCUTTER_CUTTING);
break; //first heartbeat
case 1 :
WCWork();break;
case 2 : WCHome();break;
case 4 : WCRest();break;
case 8 : WCSleep();break;
case 16 : WCOutOfTrees();break;
}
}
else if(nUser == 1002) // PERCEIVE
{
}
else if(nUser == 1003) // END OF COMBAT
{
}
else if(nUser == 1004) // ON DIALOGUE
{
}
else if(nUser == 1005) // ATTACKED
{
}
else if(nUser == 1006) // DAMAGED
{
}
else if(nUser == 1007) // DEATH
{
}
else if(nUser == 1008) // DISTURBED
{
}
}