272 lines
11 KiB
Plaintext
272 lines
11 KiB
Plaintext
int CountEffectsOnObject(object oTarget)
|
|
//Again this is a standard counting effect, it simply deletes the local int
|
|
//Also because you can't SetLocalEffect, this has questionable utility
|
|
{
|
|
effect eTarget = GetFirstEffect(oTarget);
|
|
DeleteLocalInt(oTarget, "count_e");
|
|
do{
|
|
int iNum = GetLocalInt(oTarget, "count_e");
|
|
SetLocalInt(oTarget, "count_e", iNum+1);
|
|
}while(GetIsEffectValid(eTarget = GetNextEffect(oTarget)) != FALSE);
|
|
int iLocal = GetLocalInt(oTarget, "count_e");
|
|
DeleteLocalInt(oTarget, "count_e");
|
|
return iLocal;
|
|
|
|
}
|
|
int CountObjectTypeInArea(object oArea, int iObjectType)
|
|
//The int uses the same objecttype phrasing as GetObjectType
|
|
{
|
|
object oThing = GetFirstObjectInArea(oArea);
|
|
DeleteLocalInt(oArea, "count_ota");
|
|
do{
|
|
int iType = GetObjectType(oThing);
|
|
if(iType == iObjectType){
|
|
int iCount = GetLocalInt(oArea, "count_ota");
|
|
SetLocalInt(oArea, "count_ota", iCount+1);
|
|
int iNum = GetLocalInt(oArea, "count_ota");
|
|
string sNum = IntToString(iNum);
|
|
SetLocalObject(oArea, sNum, oThing);
|
|
}
|
|
else{}
|
|
}while((oThing = GetNextObjectInArea(oArea)) != OBJECT_INVALID);
|
|
int iLocal = GetLocalInt(oArea, "count_ota");
|
|
DeleteLocalInt(oArea, "count_ota");
|
|
return iLocal;
|
|
}
|
|
int CountEnemyTowardsInArea(object oArea, object oTarget)
|
|
//This is a counting function to return number of creatures hostile towards the target in the area
|
|
{
|
|
object oThing = GetFirstObjectInArea(oArea);
|
|
DeleteLocalInt(oArea, "count_ett");
|
|
do{
|
|
int iType = GetObjectType(oThing);
|
|
if(iType == OBJECT_TYPE_CREATURE){
|
|
int iEnemy = GetIsEnemy(oThing, oTarget);
|
|
if(iEnemy == TRUE){
|
|
int iCount = GetLocalInt(oArea, "count_ett");
|
|
SetLocalInt(oArea, "count_ett", iCount+1);
|
|
int iNum = GetLocalInt(oArea, "count_ett");
|
|
string sNum = IntToString(iNum);
|
|
SetLocalObject(oArea, sNum, oThing);
|
|
}
|
|
else{}
|
|
}
|
|
else{}
|
|
}while((oThing = GetNextObjectInArea(oArea)) != OBJECT_INVALID);
|
|
int iLocal = GetLocalInt(oArea, "count_ett");
|
|
DeleteLocalInt(oArea, "count_ett");
|
|
return iLocal;
|
|
}
|
|
int CountMembersOfFaction(object oMemberOfFaction, int iPcOnly=TRUE)
|
|
//the inputs are the same as per the getfirstfactionmember function
|
|
//Stores all variables on the faction member used for the input
|
|
{
|
|
object oMember = GetFirstFactionMember(oMemberOfFaction, iPcOnly);
|
|
do{
|
|
int iCount = GetLocalInt(oMemberOfFaction, "count_mfm");
|
|
SetLocalInt(oMemberOfFaction, "count_mfm", iCount+1);
|
|
int iNum = GetLocalInt(oMemberOfFaction, "count_mfm");
|
|
string sNum = IntToString(iNum);
|
|
SetLocalObject(oMemberOfFaction, sNum, oMember);
|
|
}while((oMember = GetNextFactionMember(oMemberOfFaction, iPcOnly)) != OBJECT_INVALID);
|
|
int iLocal = GetLocalInt(oMemberOfFaction, "count_mfm");
|
|
DeleteLocalInt(oMemberOfFaction, "count_mfm");
|
|
return iLocal;
|
|
}
|
|
int CountPlayersInModule()
|
|
{
|
|
object oPlayer = GetFirstPC();
|
|
object oModule = GetModule();
|
|
DeleteLocalInt(oModule, "count_mp");
|
|
do{
|
|
int iCount = GetLocalInt(oModule, "count_mp");
|
|
SetLocalInt(oModule, "count_mp", iCount+1);
|
|
int iNum = GetLocalInt(oModule, "count_mp");
|
|
string sNum = IntToString(iNum);
|
|
SetLocalObject(oModule, sNum, oPlayer);
|
|
}while((oPlayer = GetNextPC()) != OBJECT_INVALID);
|
|
int iLocal = GetLocalInt(oModule, "count_mp");
|
|
DeleteLocalInt(oModule, "count_mp");
|
|
return iLocal;
|
|
}
|
|
int CountPlayersInArea(object oArea)
|
|
{
|
|
object oThing = GetFirstObjectInArea(oArea);
|
|
DeleteLocalInt(oArea, "count_ap");
|
|
do{
|
|
int iPc = GetIsPC(oThing);
|
|
if(iPc == TRUE){
|
|
int iCount = GetLocalInt(oArea, "count_ap");
|
|
SetLocalInt(oArea, "count_ap", iCount+1);
|
|
int iNum = GetLocalInt(oArea, "count_ap");
|
|
string sNum = IntToString(iNum);
|
|
SetLocalObject(oArea, sNum, oThing);
|
|
}
|
|
else{}
|
|
}while((oThing = GetNextObjectInArea(oArea)) != OBJECT_INVALID);
|
|
int iLocal = GetLocalInt(oArea, "count_ap");
|
|
DeleteLocalInt(oArea, "count_ap");
|
|
return iLocal;
|
|
}
|
|
int CountItemsInInventory(object oChest)
|
|
//Counting functions output a int of the count as well as saving
|
|
//a number of local variables making GetRandom scripting possible
|
|
{
|
|
object oItem = GetFirstItemInInventory(oChest);
|
|
DeleteLocalInt(oChest, "count_i");
|
|
do{
|
|
int iCount = GetLocalInt(oChest, "count_i");
|
|
SetLocalInt(oChest, "count_i", iCount+1);
|
|
int iNum = GetLocalInt(oChest, "count_i");
|
|
string sNum = IntToString(iNum);
|
|
string sResref = GetResRef(oItem);
|
|
SetLocalString(oChest, sNum, sResref);
|
|
SetLocalObject(oChest, sNum, oItem);
|
|
}while((oItem = GetNextItemInInventory(oChest)) != OBJECT_INVALID);
|
|
int iLocal = GetLocalInt(oChest, "count_i");
|
|
DeleteLocalInt(oChest, "count_i");
|
|
return iLocal;
|
|
}
|
|
float RandomFloat(float fInput)
|
|
{
|
|
float fOutput = IntToFloat(Random(FloatToInt(fInput)));
|
|
return fOutput;
|
|
}
|
|
location GetLocationInArcOfObject(object oTarget, float fArcAngle, float fArcAngleLength, int iMinDistance, int iMaxDistance)
|
|
//This is ideal for say getting a location behind something
|
|
//The arcangle is the counterclockwise variation from the object's facing, ie 0 = objects facing, and 180 = objects rear
|
|
//arcangle length is the angle of the arc, a quarter circle is 90
|
|
//The min distance is the minimium distance the location will be from the target
|
|
//maximium distance is maximium distance of the location from target
|
|
//out put location's fOrient is always facing the object used to create it
|
|
{
|
|
float fFacing = GetFacing(oTarget)+fArcAngle;
|
|
float fHalfArc = (fArcAngleLength/2.0);
|
|
float fMax = fFacing+fHalfArc;
|
|
float fMin = fFacing+fHalfArc;
|
|
float fArcSpread = fMax-fMin;
|
|
float fAngle = RandomFloat(fArcSpread+1.0)+fMin;
|
|
int iDistSpread = iMaxDistance-iMinDistance;
|
|
float fDist = IntToFloat(Random(iDistSpread)+iMinDistance);
|
|
float fX1 = cos(fAngle);
|
|
float fY1 = sin(fAngle);
|
|
float fX = (fX1*fDist);
|
|
float fY = (fY1*fDist);
|
|
vector vPos = Vector(fX, fY, 0.0);
|
|
object oArea = GetArea(oTarget);
|
|
float fOrient = fAngle+180.0;
|
|
location lOutput = Location(oArea, vPos, fOrient);
|
|
return lOutput;
|
|
}
|
|
location GetLocationNear(int iMinDistance, int iMaxDistance, location lTarget)
|
|
//This returns a location near the target location such that it is at least min dist away and isn't more than max dist away
|
|
{
|
|
int iSpread = iMaxDistance-iMinDistance;
|
|
int iDist = Random(iSpread+1)+iMinDistance;
|
|
int iX = Random(iDist+1);
|
|
int iY = iDist-iX;
|
|
float fX = IntToFloat(iX);
|
|
float fY = IntToFloat(iY);
|
|
vector vAdd = Vector(fX, fY, 0.0);
|
|
vector vCurrent = GetPositionFromLocation(lTarget);
|
|
object oArea = GetAreaFromLocation(lTarget);
|
|
float fOrient = GetFacingFromLocation(lTarget);
|
|
vector vNew = vCurrent+vAdd;
|
|
location lOutput = Location(oArea, vNew, fOrient);
|
|
return lOutput;
|
|
}
|
|
location GetRandomLocation(object oArea, int iXTiles, int iYTiles, float fOrient)
|
|
{
|
|
int iX = Random(iXTiles*10); //Random # between 0- 10* number of tiles (each tile is 10 in each direction)
|
|
int iY = Random(iYTiles*10); //Same as above
|
|
float fX = IntToFloat(iX); //Convert int to float, because floats are necessary for distance and creating vectors
|
|
float fY = IntToFloat(iY);
|
|
vector vPos = Vector(fX, fY, 0.0);//Create a vector from your random coordinates of above
|
|
location lTarget = Location(oArea, vPos, fOrient);//Create a location from the position above and input data
|
|
return lTarget; //output the target location
|
|
}
|
|
int GetTotalHitDiceOfArea(object oArea)
|
|
//this returns the total hit dice of every creature currently in the area
|
|
//This is less like other counting functions in that it isn't met for prepatory work
|
|
//This function erases all its local ints
|
|
{
|
|
object oCritter = GetFirstObjectInArea(oArea);
|
|
DeleteLocalInt(oArea, "hitdice");
|
|
do{
|
|
int iType = GetObjectType(oCritter);
|
|
if(iType == OBJECT_TYPE_CREATURE){
|
|
int iHitDice = GetHitDice(oCritter);
|
|
int iNum = GetLocalInt(oArea, "hitdice");
|
|
SetLocalInt(oArea, "hitdice", iNum+iHitDice);
|
|
}
|
|
else{}
|
|
}while((oCritter = GetNextObjectInArea(oArea)) != OBJECT_INVALID);
|
|
int iLocal = GetLocalInt(oArea, "hitdice");
|
|
DeleteLocalInt(oArea, "hitdice");
|
|
return iLocal;
|
|
|
|
}
|
|
int GetTotalHitDiceOfPlayersInArea(object oArea)
|
|
//this returns the total hit dice of every creature currently in the area
|
|
//This is less like other counting functions in that it isn't met for prepatory work
|
|
//This function erases all its local ints
|
|
{
|
|
object oCritter = GetFirstObjectInArea(oArea);
|
|
DeleteLocalInt(oArea, "hitdice");
|
|
do{
|
|
int iType = GetIsPC(oCritter);
|
|
if(iType == TRUE){
|
|
int iHitDice = GetHitDice(oCritter);
|
|
int iNum = GetLocalInt(oArea, "hitdice");
|
|
SetLocalInt(oArea, "hitdice", iNum+iHitDice);
|
|
}
|
|
else{}
|
|
}while((oCritter = GetNextObjectInArea(oArea)) != OBJECT_INVALID);
|
|
int iLocal = GetLocalInt(oArea, "hitdice");
|
|
DeleteLocalInt(oArea, "hitdice");
|
|
return iLocal;
|
|
|
|
}
|
|
int GetAverageCreatureHitDice(object oArea)
|
|
//this returns the average hitdice count for all the creatures in an area
|
|
//This doesn't count players
|
|
{
|
|
int iCount = CountObjectTypeInArea(oArea, OBJECT_TYPE_CREATURE);
|
|
int iCountPlayers = CountPlayersInArea(oArea);
|
|
int iHDTotal = GetTotalHitDiceOfArea(oArea);
|
|
int iHDPlayers = GetTotalHitDiceOfPlayersInArea(oArea);
|
|
int iHD = iHDTotal-iHDPlayers;
|
|
int iDiv = iCount-iCountPlayers;
|
|
int iReturn = (iHD/iDiv);
|
|
return iReturn;
|
|
}
|
|
object GetRandomItemIn(object oTarget)
|
|
//This calls the Inventory Counting function as part of it
|
|
//Note these are local objects, so it actually retrieves that object, not a copy of it
|
|
{
|
|
int iNum = CountItemsInInventory(oTarget);
|
|
int iPick = Random(iNum)+1;
|
|
string sNum = IntToString(iPick);
|
|
object oReturn = GetLocalObject(oTarget, sNum);
|
|
return oReturn;
|
|
}
|
|
object GetRandomObjectInArea(object oArea, int iObjectType)
|
|
//This returns the actual object froma getlocal object after running the counting function
|
|
{
|
|
int iNum = CountObjectTypeInArea(oArea, iObjectType);
|
|
int iPick = Random(iNum)+1;
|
|
string sNum = IntToString(iPick);
|
|
object oReturn = GetLocalObject(oArea, sNum);
|
|
return oReturn;
|
|
}
|
|
void EmptyInventory(object oTarget)
|
|
//this destroys all items in a target object's inventory
|
|
//Including plot items...
|
|
{
|
|
object oItem = GetFirstItemInInventory(oTarget);
|
|
do{
|
|
SetPlotFlag(oItem, FALSE);
|
|
DestroyObject(oItem, 0.0);
|
|
}while((oItem = GetNextItemInInventory(oTarget)) != OBJECT_INVALID);
|
|
}
|