409 lines
14 KiB
Plaintext
409 lines
14 KiB
Plaintext
/****************************************************
|
|
Common #include Script
|
|
ats_inc_common
|
|
|
|
Last Updated: August 2, 2002
|
|
|
|
***Ambrosia Tradeskill System***
|
|
Created by Mojo(Allen Sun)
|
|
|
|
This script contains basic functions needed by
|
|
most other script files.
|
|
|
|
**************************************************/
|
|
#include "ats_inc_debug"
|
|
#include "ats_inc_persist"
|
|
#include "ats_inc_allowed"
|
|
|
|
/////////////////////////////////////////////////////
|
|
// ATS_GetResRefFromTag //
|
|
// Converts a tag into a resref assuming tag //
|
|
// has the same name as resref. //
|
|
// Returns: string - ResRef //
|
|
/////////////////////////////////////////////////////
|
|
string ATS_GetResRefFromTag(string sTag)
|
|
{
|
|
return GetStringLowerCase(GetStringLeft(sTag, 16));
|
|
}
|
|
|
|
/////////////////////////////////////////////////////
|
|
// ATS_CreateItemOnPlayer //
|
|
// Wrapper for CreateItemOnObject() so it can //
|
|
// be used with DelayCommand() //
|
|
// Returns: None //
|
|
// Check local object variable: //
|
|
// "ats_returnvalue_created_item" for the //
|
|
// created object //
|
|
///////////////////////////////////////////////////
|
|
void ATS_CreateItemOnPlayer
|
|
(
|
|
string sItemTag, // Tag of the item
|
|
object oPlayer, // Player to create item on
|
|
int iStackSize = 1, // Size of the item stack
|
|
int iDropToFloor = TRUE, // Creates the item on the floor if inventory is full
|
|
)
|
|
{
|
|
string sItemResRef = ATS_GetResRefFromTag(sItemTag);
|
|
if ((GetStringRight(sItemTag,3)== "ARR") || (GetStringRight(sItemTag,3)== "arr"))
|
|
iStackSize = 20;
|
|
// Following lines by GilronS for stacking issues with the craftable Throwing Axes
|
|
// if (GetSubString(sItemTag, 6, 4) == "XXXX")
|
|
// iStackSize = 50;
|
|
if (GetStringUpperCase(GetSubString(sItemTag, 6, 4)) == "W036")
|
|
iStackSize = 50;
|
|
if (GetStringUpperCase(GetSubString(sItemTag, 6, 4)) == "W037")
|
|
iStackSize = 50;
|
|
if (GetStringUpperCase(GetSubString(sItemTag, 6, 4)) == "W038")
|
|
iStackSize = 50;
|
|
if (GetStringUpperCase(GetSubString(sItemTag, 6, 4)) == "W039")
|
|
iStackSize = 50;
|
|
// End Stacking Code for Throwing Axes
|
|
object oCreatedItem = CreateItemOnObject(sItemResRef, oPlayer, iStackSize);
|
|
// if(GetItemPossessor(oCreatedItem) == OBJECT_INVALID && iDropToFloor == TRUE)
|
|
// {
|
|
// oCreatedItem = CreateObject(OBJECT_TYPE_ITEM, sItemResRef, GetLocation(oPlayer));
|
|
// }
|
|
SetLocalObject(oPlayer, "ats_returnvalue_created_item", oCreatedItem);
|
|
SetLocalObject(oCreatedItem, "ats_obj_possessor", GetItemPossessor(oCreatedItem));
|
|
if(GetItemHasItemProperty(oCreatedItem, ITEM_PROPERTY_CAST_SPELL) == TRUE)
|
|
SetLocalInt(oCreatedItem, "ats_charges_fix", TRUE);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////
|
|
// ATS_CreateItemInContainer //
|
|
// Wrapper for CreateItemOnObject() so it can //
|
|
// be used with DelayCommand() //
|
|
// Returns: None //
|
|
// Check local object variable: //
|
|
// "ats_returnvalue_created_item" for the //
|
|
// created object //
|
|
/////////////////////////////////////////////////////
|
|
void ATS_CreateItemInContainer
|
|
(
|
|
string sItemTag, // Tag of the item
|
|
object oContainer, // Container to create the item in
|
|
int iStackSize = 1, // Size of the item stack
|
|
int iForceCreation = TRUE, // If container is full, the object is created on the owner
|
|
)
|
|
{
|
|
string sItemResRef = ATS_GetResRefFromTag(sItemTag);
|
|
|
|
object oCreatedItem = CreateItemOnObject(sItemResRef, oContainer, iStackSize);
|
|
if(GetItemPossessor(oCreatedItem) == OBJECT_INVALID && iForceCreation == TRUE)
|
|
{
|
|
oCreatedItem = CreateItemOnObject(sItemResRef, GetItemPossessor(oContainer),
|
|
iStackSize);
|
|
}
|
|
SetLocalObject(oContainer, "ats_returnvalue_created_item", oCreatedItem);
|
|
SetLocalObject(oCreatedItem, "ats_obj_possessor", GetItemPossessor(oCreatedItem));
|
|
if(GetItemHasItemProperty(oCreatedItem, ITEM_PROPERTY_CAST_SPELL) == TRUE)
|
|
SetLocalInt(oCreatedItem, "ats_charges_fix", TRUE);
|
|
}
|
|
/////////////////////////////////////////////////////
|
|
// ATS_CreateObject //
|
|
// Wrapper for CreateObject() so it can //
|
|
// be used with DelayCommand() //
|
|
// Returns: None //
|
|
/////////////////////////////////////////////////////
|
|
void ATS_CreateObject
|
|
(
|
|
int iObjectType, // object type constant
|
|
string sTemplate, // object resref
|
|
location lLocation, // location of new object
|
|
int bUseAppearAnimation = FALSE // use animation
|
|
)
|
|
{
|
|
object oObjectCreated = CreateObject(iObjectType, sTemplate, lLocation, bUseAppearAnimation);
|
|
if(GetItemHasItemProperty(oObjectCreated, ITEM_PROPERTY_CAST_SPELL) == TRUE)
|
|
SetLocalInt(oObjectCreated, "ats_charges_fix", TRUE);
|
|
SetLocalObject(oObjectCreated, "ats_obj_possessor", GetItemPossessor(oObjectCreated));
|
|
|
|
}
|
|
|
|
string ATS_GetUniquePlayerID(object oPlayer)
|
|
{
|
|
return ("ATS_PID_" + GetPCPlayerName(oPlayer) + GetName(oPlayer));
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////
|
|
// ATS_GetTradeskill //
|
|
// Returns the skill value of a particular //
|
|
// tradeskill of a player //
|
|
// Returns: int - current skill value //
|
|
/////////////////////////////////////////////////////
|
|
int ATS_GetTradeskill
|
|
(
|
|
object oPlayer, // player to get tradeskill value from
|
|
string sTradeSkillType // name of the tradeskill
|
|
)
|
|
{
|
|
string sVarName = "ats_skillvalue_" + sTradeSkillType;
|
|
return ATS_GetPersistentInt(oPlayer, sVarName);
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////
|
|
// ATS_GetTagBaseType //
|
|
// Gets an item's base tag which consists of //
|
|
// four characters within the tag. //
|
|
// Returns: String - Base Tag //
|
|
/////////////////////////////////////////////////////
|
|
string ATS_GetTagBaseType(object oTargetObject)
|
|
{
|
|
string sObjectTag = GetTag(oTargetObject);
|
|
// Return the 4 character substring 6 characters into the tag
|
|
return GetSubString(sObjectTag, 6, 4);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////
|
|
// ATS_GetCraftTag //
|
|
// Gets an item's craft tag from an object //
|
|
// Returns: String - Craft Tag //
|
|
/////////////////////////////////////////////////////
|
|
string ATS_GetCraftTag(object oTargetObject)
|
|
{
|
|
string sObjectTag = GetTag(oTargetObject);
|
|
return GetStringLeft(sObjectTag, 10);
|
|
|
|
}
|
|
|
|
|
|
object ATS_FindItemInInventoryByTag(object oTarget, string sTag, int iNth = 0)
|
|
{
|
|
int iCount = 0;
|
|
object oCurrentObject = OBJECT_INVALID;
|
|
|
|
if(GetHasInventory(oTarget) == FALSE)
|
|
return oCurrentObject;
|
|
|
|
oCurrentObject = GetFirstItemInInventory(oTarget);
|
|
|
|
while(GetIsObjectValid(oCurrentObject) == TRUE)
|
|
{
|
|
if(GetTag(oCurrentObject) == sTag)
|
|
{
|
|
if(iCount == iNth)
|
|
return oCurrentObject;
|
|
else
|
|
++iCount;
|
|
}
|
|
oCurrentObject = GetNextItemInInventory(oTarget);
|
|
}
|
|
return oCurrentObject;
|
|
|
|
}
|
|
|
|
object ATS_FindItemInInventoryByBaseTag(object oTarget, string sBaseTag, int iNth = 0)
|
|
{
|
|
int iCount = 0;
|
|
object oCurrentObject = OBJECT_INVALID;
|
|
|
|
if(GetHasInventory(oTarget) == FALSE)
|
|
return oCurrentObject;
|
|
|
|
oCurrentObject = GetFirstItemInInventory(oTarget);
|
|
|
|
while(GetIsObjectValid(oCurrentObject) == TRUE)
|
|
{
|
|
if(ATS_GetTagBaseType(oCurrentObject) == sBaseTag)
|
|
{
|
|
if(iCount == iNth)
|
|
return oCurrentObject;
|
|
else
|
|
++iCount;
|
|
}
|
|
oCurrentObject = GetNextItemInInventory(oTarget);
|
|
}
|
|
return oCurrentObject;
|
|
|
|
}
|
|
/////////////////////////////////////////////////////
|
|
// ATS_CapitalizeString //
|
|
// Capitalizes the first letter of a string //
|
|
// Returns: string - capitalized string //
|
|
/////////////////////////////////////////////////////
|
|
string ATS_CapitalizeString(string sStringToCap)
|
|
{
|
|
string sTempString = GetStringLeft(sStringToCap, 1);
|
|
sTempString = GetStringUpperCase(sTempString);
|
|
sTempString = sTempString + GetStringRight(sStringToCap, GetStringLength(sStringToCap) - 1);
|
|
return sTempString;
|
|
}
|
|
|
|
void ATS_RemoveAllInstances(string sTag)
|
|
{
|
|
int iNum = 0;
|
|
object oObjectToDestroy = GetObjectByTag(sTag, iNum++);
|
|
|
|
|
|
while(oObjectToDestroy != OBJECT_INVALID)
|
|
{
|
|
DestroyObject(oObjectToDestroy);
|
|
oObjectToDestroy = GetObjectByTag(sTag, iNum++);
|
|
}
|
|
|
|
}
|
|
|
|
void ATS_RemoveAllInstancesOnPlayer(object oPlayer, string sTag)
|
|
{
|
|
int iNum = 0;
|
|
object oObjectToDestroy = GetObjectByTag(sTag, iNum++);
|
|
|
|
|
|
while(oObjectToDestroy != OBJECT_INVALID)
|
|
{
|
|
if(GetItemPossessor(oObjectToDestroy) == oPlayer)
|
|
DestroyObject(oObjectToDestroy);
|
|
oObjectToDestroy = GetObjectByTag(sTag, iNum++);
|
|
}
|
|
|
|
}
|
|
|
|
string ATS_CraftToItemTag(string sCraftTag, string sQuality, string sMaterialType)
|
|
{
|
|
return (GetStringLeft(sCraftTag, 10) + "_" + sQuality + "_" + sMaterialType);
|
|
}
|
|
|
|
int ATS_IsItemNoDrop(object oItem)
|
|
{
|
|
string sUpperTag = GetStringUpperCase(GetTag(oItem));
|
|
if(FindSubString(sUpperTag, "_NOD") > 0 || FindSubString(sUpperTag, "NODROP") > 0)
|
|
return TRUE;
|
|
else if (GetLocalInt(oItem,"ats_nodrop")) // added by richterm to try and fix
|
|
return TRUE; // bags with NODROP items in them
|
|
else // the flag was set in ats_inc_nodrop but
|
|
return FALSE; // wass never checked
|
|
}
|
|
|
|
int ATS_IsItemResource(object oItem)
|
|
{
|
|
if(GetStringLeft(GetTag(oItem), 5) == "ATS_R")
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
int ATS_GetItemDurability(object oItem)
|
|
{
|
|
return GetLocalInt(oItem, "ats_durability");
|
|
}
|
|
|
|
void ATS_SetItemDurability(object oItem, int iDurability)
|
|
{
|
|
SetLocalInt(oItem, "ats_durability", iDurability);
|
|
}
|
|
|
|
void ATS_DecreaseItemDurability(object oItem, int iAmount)
|
|
{
|
|
ATS_SetItemDurability(oItem, ATS_GetItemDurability(oItem) - iAmount);
|
|
}
|
|
|
|
int ATS_GetItemMaxDurability(object oItem)
|
|
{
|
|
string sItemTag = GetTag(oItem);
|
|
int iStringIndex = FindSubString(sItemTag, "_DUR");
|
|
if(iStringIndex == -1)
|
|
return 0;
|
|
|
|
string sParsedString = GetSubString(sItemTag, iStringIndex + 4,
|
|
GetStringLength(sItemTag) - iStringIndex - 4);
|
|
iStringIndex = FindSubString(sParsedString, "_");
|
|
if(iStringIndex <= 0)
|
|
{
|
|
return StringToInt(sParsedString);
|
|
}
|
|
else
|
|
{
|
|
return StringToInt(GetStringLeft(sParsedString, iStringIndex));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
// ATS_BreakItem //
|
|
// Wrapper function to destroy an item and //
|
|
// display text that it was broken //
|
|
// Returns: none //
|
|
/////////////////////////////////////////////////////
|
|
void ATS_BreakItem
|
|
(
|
|
object oItemToBreak, // item to destroy
|
|
float fDelay = 0.5 // delay in seconds to destroy
|
|
)
|
|
{
|
|
|
|
string sArrayName = "durability_" + GetTag(oItemToBreak);
|
|
object oItemPossessor = GetItemPossessor(oItemToBreak);
|
|
string sItemName = GetName(oItemToBreak);
|
|
|
|
DestroyObject(oItemToBreak, fDelay);
|
|
AssignCommand(GetModule(), DelayCommand(fDelay, FloatingTextStringOnCreature("Your " + sItemName +
|
|
" has broken.", oItemPossessor, FALSE)));
|
|
|
|
}
|
|
/////////////////////////////////////////////////////
|
|
// ATS_StrTok //
|
|
// Mimics the C string function strtok() //
|
|
// Returns: string - string token //
|
|
// returns "" if end of string //
|
|
/////////////////////////////////////////////////////
|
|
string ATS_StrTok
|
|
(
|
|
string sString, // String to tokenize(send in "" to continue with previous
|
|
// string)
|
|
string sDelimeter // Delimiter string
|
|
)
|
|
{
|
|
string sStringToTok;
|
|
if(sString == "")
|
|
sStringToTok = GetLocalString(GetModule(), "ats_strtok_string");
|
|
else
|
|
sStringToTok = sString;
|
|
|
|
int iTokenEndPos = FindSubString(sStringToTok, sDelimeter);
|
|
if(iTokenEndPos == -1 || sDelimeter == "")
|
|
{
|
|
SetLocalString(GetModule(), "ats_strtok_string", "");
|
|
return sStringToTok;
|
|
}
|
|
else
|
|
{
|
|
int iStringLength = GetStringLength(sStringToTok);
|
|
int iDelimeterLength = GetStringLength(sDelimeter);
|
|
|
|
SetLocalString(GetModule(), "ats_strtok_string",
|
|
GetStringRight(sStringToTok, iStringLength - iTokenEndPos - iDelimeterLength));
|
|
return GetStringLeft(sStringToTok, iTokenEndPos);
|
|
}
|
|
}
|
|
|
|
int ATS_GetIsVowel(string sChar)
|
|
{
|
|
string sLowerChar = GetStringLowerCase(sChar);
|
|
if(sLowerChar == "a" || sLowerChar == "e" || sLowerChar == "i" || sLowerChar == "o" || sLowerChar == "u")
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
// Function borrowed from NWN Spawn System by Palor
|
|
location ATS_GetRandomLocationNearObject(object oNearObject, int iMaxDistance)
|
|
{
|
|
|
|
vector vNewPos = GetPosition(oNearObject);
|
|
object oArea = GetArea(oNearObject);
|
|
float fX, fY;
|
|
float fMaxY;
|
|
float fRadius = IntToFloat(iMaxDistance);
|
|
fX = (Random(200)/100.0 - 1.0) * fRadius;
|
|
fMaxY = sqrt(fRadius*fRadius-fX*fX);
|
|
fY = (Random(200)/100.0 - 1.0) * fMaxY;
|
|
vNewPos += Vector(fX, fY, 0.0);
|
|
location lNewLoc = Location(oArea, vNewPos, VectorToAngle(-1.0 * vNewPos));
|
|
return lNewLoc;
|
|
}
|
|
|
|
|