Jaysyn904 04165202c0 Initial upload
Initial upload
2024-11-25 19:36:07 -05:00

500 lines
18 KiB
Plaintext

////////////////////////////////////////////////////////////////////////////////
// lib_hos2_PC - PC Library Functions
// By Deva B. Winblood March 23rd, 2008
////////////////////////////////////////////////////////////////////////////////
#include "prc_inc_racial"
#include "nbde_inc"
#include "lib_nais_tool"
////////////////////////////////
// PROTOTYPES
////////////////////////////////
string PC_GetPCID(object oPC);
string PC_GetTeamID(object oPC);
void PC_SetTeamID(object oPC,string sTeamID);
void PC_SetRace(object oPC,string sRace="");
string PC_GetRace(object oPC);
int PC_GetTeamNum(object oPC);
void PC_SetTeamNum(object oPC,int nNum);
void PC_SetPCState(object oPC,int nState);
int PC_GetPCState(object oPC);
void PC_SavePC(object oPC,int bQuiet=TRUE);
void PC_LoadPC(object oPC);
void PC_SaveInventory(object oPC);
void PC_RestoreInventory(object oPC);
// FILE: lib_hos2_pc FUNCTION: Msg_Team()
// This will send a message to all team members. sColor will cause it to
// display in a specific color. sSound will cause it to play a sound.
// If sTeamID is "" then it will use oSpeaker's team.
void Msg_Team(object oSpeaker,string sMsg,string sColor="",string sSound="",string sTeamID="",int bNameSpeaker=TRUE);
// FILE: lib_hos2_pc FUNCTION: Msg_Players()
// This will send a message to all players. sColor will cause it to display
// in a specific color. sSound will cause it to play a sound.
void Msg_Players(object oSpeaker,string sMsg,string sColor="",string sSound="",int bNameSpeaker=FALSE);
// FILE: lib_hos2_pc FUNCTION: PC_SetFriend()
// This will set the faction of nTeamNum to be a friend to this PC.
void PC_SetFriend(object oPC,int nTeamNum);
// FILE: lib_hos2_pc FUNCTION: PC_SetEnemy()
// This will set the faction of nTeamNum to be an enemy to this PC.
void PC_SetEnemy(object oPC,int nTeamNum);
// FILE: lib_hos2_pc FUNCTION: PC_SetNeutral()
// This will set the faction of nTeamNum to be neutral to this PC.
void PC_SetNeutral(object oPC,int nTeamNum);
////////////////////////////////
// FUNCTIONS
////////////////////////////////
string PC_GetPCID(object oPC)
{ // PURPOSE: Return PC ID
return GetPCPublicCDKey(oPC,TRUE)+"_"+GetName(oPC);
} // PC_GetPCID()
string PC_GetTeamID(object oPC)
{ // PURPOSE: Return TeamID for PC
if (!GetIsPC(oPC)) return GetLocalString(oPC,"sTeamID");
string sDB=GetTag(GetModule())+"PC";
string sTID=NBDE_GetCampaignString(sDB,PC_GetPCID(oPC)+"_TID",oPC);
if (GetStringLength(sTID)<1)
{ // check local
sTID=GetLocalString(oPC,"sTeamID");
if (GetStringLength(sTID)>0)
{ // write to DB
NBDE_SetCampaignString(sDB,PC_GetPCID(oPC)+"_TID",sTID,oPC);
} // write to DB
} // check local
return sTID;
} // PC_GetTeamID()
void PC_SetTeamID(object oPC,string sTeamID)
{ // PURPOSE: Set the TeamID
string sDB=GetTag(GetModule())+"PC";
NBDE_SetCampaignString(sDB,PC_GetPCID(oPC)+"_TID",sTeamID,oPC);
} // PC_SetTeamID()
string PC_GetRace(object oPC)
{ // PURPOSE: Get Race
string sDB=GetTag(GetModule())+"PC";
string sRace=NBDE_GetCampaignString(sDB,PC_GetPCID(oPC)+"_RACE",oPC);
if (GetStringLength(sRace)<1)
{ // set default race
PC_SetRace(oPC);
sRace=NBDE_GetCampaignString(sDB,PC_GetPCID(oPC)+"_RACE",oPC);
} // set default race
return sRace;
} // PC_GetRace()
void PC_SetRace(object oPC, string sRace = "")
{
// PURPOSE: Set PC Race
string sSet;
string sDB = GetTag(GetModule()) + "PC";
int nR;
if (GetStringLength(sRace) < 1)
{
// Set to defaults
nR = MyPRCGetRacialType(oPC);
// Fetch the race name from racialtypes.2da
sSet = Get2DAString("racialtypes", "Name", nR);
// If fetching fails, set a default fallback value
if (GetStringLength(sSet) < 1)
{
sSet = "UNKNOWN";
}
// Store the race name in the database
NBDE_SetCampaignString(sDB, PC_GetPCID(oPC) + "_RACE", sSet, oPC);
}
else
{
// Set to specific race name provided
NBDE_SetCampaignString(sDB, PC_GetPCID(oPC) + "_RACE", sRace, oPC);
}
}
/* void PC_SetRace(object oPC,string sRace="")
{ // PURPOSE: Set PC Race
string sSet;
string sDB=GetTag(GetModule())+"PC";
int nR;
if (GetStringLength(sRace)<1)
{ // set to defaults
nR=MyPRCGetRacialType(oPC);
if (nR==RACIAL_TYPE_ANIMAL) sSet="ANIMAL";
else if (nR==RACIAL_TYPE_BEAST) sSet="BEAST";
else if (nR==RACIAL_TYPE_CONSTRUCT) sSet="CONSTRUCT";
else if (nR==RACIAL_TYPE_DRAGON) sSet="DRAGON";
else if (nR==RACIAL_TYPE_DWARF) sSet="DWARF";
else if (nR==RACIAL_TYPE_ELEMENTAL) sSet="ELEMENTAL";
else if (nR==RACIAL_TYPE_ELF) sSet="ELF";
else if (nR==RACIAL_TYPE_FEY) sSet="FEY";
else if (nR==RACIAL_TYPE_GIANT) sSet="GIANT";
else if (nR==RACIAL_TYPE_GNOME) sSet="GNOME";
else if (nR==RACIAL_TYPE_HALFELF) sSet="HALFELF";
else if (nR==RACIAL_TYPE_HALFLING) sSet="HALFLING";
else if (nR==RACIAL_TYPE_HALFORC) sSet="HALFORC";
else if (nR==RACIAL_TYPE_HUMAN) sSet="HUMAN";
else if (nR==RACIAL_TYPE_HUMANOID_GOBLINOID) sSet="GOBLIN";
else if (nR==RACIAL_TYPE_HUMANOID_MONSTROUS) sSet="MONSTROUS";
else if (nR==RACIAL_TYPE_HUMANOID_ORC) sSet="ORC";
else if (nR==RACIAL_TYPE_HUMANOID_REPTILIAN) sSet="REPTILIAN";
else if (nR==RACIAL_TYPE_MAGICAL_BEAST) sSet="MAGICAL";
else if (nR==RACIAL_TYPE_OOZE) sSet="OOZE";
else if (nR==RACIAL_TYPE_OUTSIDER) sSet="OUTSIDER";
else if (nR==RACIAL_TYPE_SHAPECHANGER) sSet="SHAPECHANGER";
else if (nR==RACIAL_TYPE_UNDEAD) sSet="UNDEAD";
else if (nR==RACIAL_TYPE_PLANT) sSet="PLANT";
else if (nR==RACIAL_TYPE_VERMIN) sSet="VERMIN";
NBDE_SetCampaignString(sDB,PC_GetPCID(oPC)+"_RACE",sSet,oPC);
} // set to defaults
else
{ // set to specific
NBDE_SetCampaignString(sDB,PC_GetPCID(oPC)+"_RACE",sRace,oPC);
} // set to specific
} // PC_SetRace() */
int PC_GetTeamNum(object oPC)
{ // PURPOSE: Get the team Number
string sDB=GetTag(GetModule())+"PC";
return NBDE_GetCampaignInt(sDB,PC_GetPCID(oPC)+"_TNUM",oPC);
} // PC_GetTeamNum()
void PC_SetTeamNum(object oPC,int nNum)
{ // PURPOSE: Set the team Number
string sDB=GetTag(GetModule())+"PC";
NBDE_SetCampaignInt(sDB,PC_GetPCID(oPC)+"_TNUM",nNum,oPC);
} // PC_SetTeamNum()
void PC_SetPCState(object oPC,int nState)
{ // PURPOSE: Set State
string sDB=GetTag(GetModule())+"PC";
NBDE_SetCampaignInt(sDB,PC_GetPCID(oPC)+"_PCS",nState,oPC);
} // PC_SetPCState()
int PC_GetPCState(object oPC)
{ // PURPOSE: Get State
string sDB=GetTag(GetModule())+"PC";
return NBDE_GetCampaignInt(sDB,PC_GetPCID(oPC)+"_PCS",oPC);
} // PC_GetPCState()
void PC_SavePC(object oPC,int bQuiet=TRUE)
{ // PURPOSE: Preserve the PC
string sDB=GetTag(GetModule())+"PC";
string sPCID=PC_GetPCID(oPC);
NBDE_SetCampaignLocation(sDB,sPCID+"_LOC",GetLocation(oPC),oPC);
NBDE_SetCampaignInt(sDB,sPCID+"_XP",GetXP(oPC),oPC);
NBDE_SetCampaignInt(sDB,sPCID+"_HP",GetCurrentHitPoints(oPC),oPC);
NBDE_SetCampaignInt(sDB,sPCID+"_GP",GetGold(oPC),oPC);
NBDE_SetCampaignInt(sDB,sPCID+"_TN",PC_GetTeamNum(oPC),oPC);
NBDE_SetCampaignString(sDB,sPCID+"_TID",PC_GetTeamID(oPC),oPC);
if (!bQuiet) SendMessageToPC(oPC,"SAVED TO DATABASE...");
} // PC_SavePC()
void PC_LoadPC(object oPC)
{ // PURPOSE: Reset oPC to state in Database
string sDB=GetTag(GetModule())+"PC";
string sPCID=PC_GetPCID(oPC);
location lLoc=NBDE_GetCampaignLocation(sDB,sPCID+"_LOC",oPC);
object oLoc=CreateObject(OBJECT_TYPE_PLACEABLE,"pathing_object",lLoc);
int nXP=NBDE_GetCampaignInt(sDB,sPCID+"_XP",oPC);
int nHP=NBDE_GetCampaignInt(sDB,sPCID+"_HP",oPC);
int nGP=NBDE_GetCampaignInt(sDB,sPCID+"_GP",oPC);
int nTeamNum=NBDE_GetCampaignInt(sDB,sPCID+"_TN",oPC);
string sTeamID=NBDE_GetCampaignString(sDB,sPCID+"_TID",oPC);
int nN;
SetLocalObject(oPC,"oShortPathDest",oLoc);
SetLocalObject(oLoc,"oOwner",oPC);
PC_SetTeamNum(oPC,nTeamNum);
PC_SetTeamID(oPC,sTeamID);
SendMessageToPC(oPC,"LOAD FROM DATABASE: Location '"+GetName(GetAreaFromLocation(lLoc))+"' XP:"+IntToString(nXP)+" HP:"+IntToString(nHP)+" GOLD:"+IntToString(nGP));
SetXP(oPC,nXP);
if (GetGold(oPC)!=nGP)
{ // reset gold
nN=GetGold(oPC);
if (nN>nGP)
{ // take gold
AssignCommand(oPC,TakeGoldFromCreature(nN-nGP,oPC,TRUE));
} // take gold
else if (nN<nGP)
{ // give gold
GiveGoldToCreature(oPC,nGP-nN);
} // give gold
} // reset gold
if (GetCurrentHitPoints(oPC)!=nHP)
{ // reset hit points
nN=GetCurrentHitPoints(oPC);
if (nN>nHP)
{ // take damage
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(nN-nHP),oPC);
} // take damage
else if (nN<nHP)
{ // heal damage
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(nHP-nN),oPC);
} // heal damage
} // reset hit points
lib_ForceJump(oPC,oLoc);
} // PC_LoadPC()
void PC_supPreserveInv(object oPC,string sDB,string sPCID,int nC=0)
{ // PURPOSE: Preserve Inventory
int nN;
string sS;
object oItem;
if (nC==0) oItem=GetFirstItemInInventory(oPC);
else { oItem=GetNextItemInInventory(oPC); }
if (GetIsObjectValid(oItem))
{ // store
NBDE_SetCampaignString(sDB,sPCID+"_sINVC"+IntToString(nC+1),GetResRef(oItem),oPC);
NBDE_SetCampaignInt(sDB,sPCID+"_nINVCC"+IntToString(nC+1),GetItemCharges(oItem),oPC);
NBDE_SetCampaignInt(sDB,sPCID+"_nINVCS"+IntToString(nC+1),GetItemStackSize(oItem),oPC);
DelayCommand(0.1,PC_supPreserveInv(oPC,sDB,sPCID,nC+1));
} // store
else
{ // end
NBDE_SetCampaignInt(sDB,sPCID+"_INVC",nC,oPC);
} // end
} // PC_supPreservInv()
void PC_supStoreSlot(object oPC,string sDB,string sPCID,int nSlot,string sVar)
{ // PURPOSE: store slotted item
object oItem;
NBDE_DeleteCampaignString(sDB,sPCID+"_sIS"+sVar,oPC);
NBDE_DeleteCampaignInt(sDB,sPCID+"_nIC"+sVar,oPC);
NBDE_DeleteCampaignInt(sDB,sPCID+"_nIS"+sVar,oPC);
oItem=GetItemInSlot(nSlot,oPC);
if (GetIsObjectValid(oItem))
{ // preserve slotted item
NBDE_SetCampaignString(sDB,sPCID+"_sIS"+sVar,GetResRef(oItem),oPC);
NBDE_SetCampaignInt(sDB,sPCID+"_nIC"+sVar,GetItemCharges(oItem),oPC);
NBDE_SetCampaignInt(sDB,sPCID+"_nIS"+sVar,GetItemStackSize(oItem),oPC);
} // preserve slotted item
} // PC_supStoreSlot()
void PC_SaveInventory(object oPC)
{ // PURPOSE: Inventory Store
string sDB=GetTag(GetModule())+"PC";
string sPCID=PC_GetPCID(oPC);
int nPrev=NBDE_GetCampaignInt(sDB,sPCID+"_INVC",oPC);
int nN;
object oItem;
string sS;
if (nPrev>0)
{ // delete previous save
nN++;
while(nN<=nPrev)
{ // delete older variables
NBDE_DeleteCampaignString(sDB,sPCID+"_sINVC"+IntToString(nN),oPC);
NBDE_DeleteCampaignInt(sDB,sPCID+"_nINVCC"+IntToString(nN),oPC);
NBDE_DeleteCampaignInt(sDB,sPCID+"_nINVCS"+IntToString(nN),oPC);
nN++;
} // delete older variables
NBDE_DeleteCampaignInt(sDB,sPCID+"_INVC",oPC);
} // delete previous save
DelayCommand(1.0,PC_supPreserveInv(oPC,sDB,sPCID));
PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_ARMS,"ARM");
DelayCommand(0.1,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_ARROWS,"ARR"));
DelayCommand(0.2,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_BELT,"BEL"));
DelayCommand(0.3,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_BOLTS,"BOL"));
DelayCommand(0.4,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_BOOTS,"BOO"));
DelayCommand(0.5,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_BULLETS,"BUL"));
DelayCommand(0.6,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_CHEST,"CHE"));
DelayCommand(0.7,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_CLOAK,"CLO"));
DelayCommand(0.8,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_HEAD,"HEA"));
DelayCommand(0.9,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_LEFTHAND,"LHA"));
DelayCommand(1.0,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_LEFTRING,"LRI"));
DelayCommand(1.1,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_NECK,"NEC"));
DelayCommand(1.2,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_RIGHTHAND,"RHA"));
DelayCommand(1.3,PC_supStoreSlot(oPC,sDB,sPCID,INVENTORY_SLOT_RIGHTRING,"RRI"));
} // PC_SaveInventory()
float PC_supCheckItem(object oPC,string sDB,string sPCID,int nSlot,string sVar)
{ // PURPOSE: Check specific item
float fRet=0.0;
object oItem;
int nCharges;
int nStack;
string sResRef;
sResRef=NBDE_GetCampaignString(sDB,sPCID+"_sIS"+sVar,oPC);
if (GetStringLength(sResRef)>0)
{ // item exists
fRet=0.1;
nCharges=NBDE_GetCampaignInt(sDB,sPCID+"_nIC"+sVar,oPC);
nStack=NBDE_GetCampaignInt(sDB,sPCID+"_nIS"+sVar,oPC);
oItem=CreateItemOnObject(sResRef,oPC);
if (nCharges>0) SetItemCharges(oItem,nCharges);
if (nStack>0) SetItemStackSize(oItem,nStack);
DelayCommand(0.03,AssignCommand(oPC,ActionEquipItem(oItem,nSlot)));
} // item exists
return fRet;
} // PC_supCheckItem()
void PC_supRestoreNormalInven(object oPC,string sDB,string sPCID,int nC=1)
{ // PURPOSE: Restore non-equipped inventory
string sResRef;
int nCharges;
int nStack;
object oItem;
int nCount=NBDE_GetCampaignInt(sDB,sPCID+"_INVC",oPC);
if (nC<=nCount)
{ // valid item
sResRef=NBDE_GetCampaignString(sDB,sPCID+"_sINVC"+IntToString(nC),oPC);
nCharges=NBDE_GetCampaignInt(sDB,sPCID+"_nINVCC"+IntToString(nC),oPC);
nStack=NBDE_GetCampaignInt(sDB,sPCID+"_nINVCS"+IntToString(nC),oPC);
oItem=CreateItemOnObject(sResRef,oPC);
if (nCharges>0) SetItemCharges(oItem,nCharges);
if (nStack>0) SetItemStackSize(oItem,nStack);
DelayCommand(0.02,PC_supRestoreNormalInven(oPC,sDB,sPCID,nC+1));
} // valid item
} // PC_supRestoreNormalInven()
void PC_supRestoreSlots(object oPC,string sDB,string sPCID)
{ // PURPOSE: Restore slots
float fDelay=1.0;
AssignCommand(oPC,ClearAllActions());
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_ARMS,"ARM");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_ARROWS,"ARR");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_BELT,"BEL");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_BOLTS,"BOL");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_BOOTS,"BOO");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_BULLETS,"BUL");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_CHEST,"CHE");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_CLOAK,"CLO");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_HEAD,"HEA");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_LEFTHAND,"LHA");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_LEFTRING,"LRI");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_NECK,"NEC");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_RIGHTHAND,"RHA");
fDelay=fDelay+PC_supCheckItem(oPC,sDB,sPCID,INVENTORY_SLOT_RIGHTRING,"RRI");
DelayCommand(0.1,SetCommandable(FALSE,oPC));
DelayCommand(fDelay,SetCommandable(TRUE,oPC));
} // PC_supRestoreSlots()
void PC_supRestoreTools(object oPC)
{ // PURPOSE: Restore Tools
object oItem=GetItemPossessedBy(oPC,"tool_it_create");
if (!GetIsObjectValid(oItem)) oItem=CreateItemOnObject("tool_it_create",oPC);
} // PC_supRestoreTools()
void PC_RestoreInventory(object oPC)
{ // PURPOSE: Restore Inventory
string sDB=GetTag(GetModule())+"PC";
string sPCID=PC_GetPCID(oPC);
lib_StripCreature(oPC);
DelayCommand(3.0,PC_supRestoreSlots(oPC,sDB,sPCID));
DelayCommand(5.0,PC_supRestoreNormalInven(oPC,sDB,sPCID));
DelayCommand(10.0,PC_supRestoreTools(oPC));
} // PC_RestoreInventory()
void Msg_Team(object oSpeaker,string sMsg,string sColor="",string sSound="",string sTeamID="",int bNameSpeaker=TRUE)
{ // PURPOSE: The message will be sent to all team members.
object oPC;
object oSound;
string sSend;
string sTID=sTeamID;
if (GetIsObjectValid(oSpeaker))
{ // valid speaker
if (GetStringLength(sTID)<1) sTID=PC_GetTeamID(oSpeaker);
if (GetStringLength(sTID)>0)
{ // team specified
if (bNameSpeaker) sSend=lib_SetStringColor(GetName(oSpeaker)+" sends:","555");
if (GetStringLength(sColor)==3) sSend=sSend+lib_SetStringColor(sMsg,sColor);
else { sSend=sSend+sMsg; }
oPC=GetFirstPC();
while(GetIsObjectValid(oPC))
{ // check all PCs
if (PC_GetTeamID(oPC)==sTID&&oPC!=oSpeaker)
{ // correct team
SendMessageToPC(oPC,sSend);
if (GetStringLength(sSound)>0)
{ // play sound
oSound=CreateObject(OBJECT_TYPE_PLACEABLE,"sound_object",GetLocation(oPC));
SetLocalString(oSound,"sSound",sSound);
} // play sound
} // correct team
oPC=GetNextPC();
} // check all PCs
} // team specified
} // valid speaker
} // Msg_Team()
void Msg_Players(object oSpeaker,string sMsg,string sColor="",string sSound="",int bNameSpeaker=FALSE)
{ // PURPOSE: Send a message to all players
object oPC;
object oSound;
string sSend;
if (GetIsObjectValid(oSpeaker))
{ // valid speaker
if (bNameSpeaker) sSend=lib_SetStringColor(GetName(oSpeaker)+" sends:","555");
if (GetStringLength(sColor)==3) sSend=sSend+lib_SetStringColor(sMsg,sColor);
else { sSend=sSend+sMsg; }
oPC=GetFirstPC();
while(GetIsObjectValid(oPC))
{ // check all PCs
if (oPC!=oSpeaker)
{ // send message here
SendMessageToPC(oPC,sSend);
if (GetStringLength(sSound)>0)
{ // play sound
oSound=CreateObject(OBJECT_TYPE_PLACEABLE,"sound_object",GetLocation(oPC));
SetLocalString(oSound,"sSound",sSound);
} // play sound
} // send message here
oPC=GetNextPC();
} // check all PCs
} // valid speaker
} // Msg_Players()
//void main(){}