Files
Anphillia_PRC8/_module/nss/util_inc.nss
Jaysyn904 00d2c183e8 Update for PRC8 parity
Update for PRC8 parity.  Full compile.
2025-02-08 14:10:00 -05:00

429 lines
15 KiB
Plaintext

#include "nwnx_object"
#include "nwnx_player"
#include "inc_utility"
#include "prc_misc_const"
const int PERIOD_DAY = 1;
const int PERIOD_NIGHT = 2;
const int PERIOD_DAWN = 3;
const int PERIOD_DUSK = 4;
// Clear all items from object's inventory
void util_ClearInventory(object o);
// SendMessageToPC() for all PCs
void util_SendMessageToAllPCs(string message);
// Delete all items in owners inventory that have a resref in reslist
// Separate reslist with # or ; or other resref-invalid characters
void util_DestroyAllItemsByResRef(object owner, string reslist);
// Returns a random location in oArea
location util_GetRandomLocation(object oArea);
void util_PopUp(object oPC, string sTitle, string sMsg, string sIcon="");
int util_GetLevelByXP (int nXP);
int util_GetLevel(object oPC);
int util_GetXPByLevel(int nLevel);
void util_ToggleEncountersInArea(object oArea, int bActive);
int util_GetItemEquipSlot(object oItem);
int util_GetDayPeriod();
// Convert a location to string and back
string util_EncodeLocation(location l);
location util_DecodeLocation(string s);
// Returns true if oItem's base type is some weapon
int util_IsWeapon(object oItem);
//int PRCMax(int a, int b) { return (a>b) ? a : b; } //:: Defined exactly the same in the PRC's
//int PRCMin(int a, int b) { return (a<b) ? a : b; } //:: inc_utility.nss
void util_ClearInventory(object o)
{
object item = GetFirstItemInInventory(o);
while (item != OBJECT_INVALID)
{
if (GetHasInventory(item))
{
object item2 = GetFirstItemInInventory(item);
while (item2 != OBJECT_INVALID)
{
DestroyObject(item2);
item2 = GetNextItemInInventory(item);
}
}
DestroyObject(item);
item = GetNextItemInInventory(o);
}
if (GetObjectType(o) == OBJECT_TYPE_CREATURE)
{
int i;
for (i = 0; i < NUM_INVENTORY_SLOTS; i++)
DestroyObject(GetItemInSlot(i, o));
}
}
void util_SendMessageToAllPCs(string message)
{
object pc = GetFirstPC();
while (pc != OBJECT_INVALID)
{
SendMessageToPC(pc, message);
pc = GetNextPC();
}
}
void util_DestroyAllItemsByResRef(object owner, string reslist)
{
object item = GetFirstItemInInventory(owner);
while (item != OBJECT_INVALID)
{
if (GetHasInventory(item))
{
object item2 = GetFirstItemInInventory(item);
while (item2 != OBJECT_INVALID)
{
if (FindSubString(reslist, GetResRef(item2)) >= 0)
DestroyObject(item2);
item2 = GetNextItemInInventory(item);
}
}
if (FindSubString(reslist, GetResRef(item)) >= 0)
DestroyObject(item);
item = GetNextItemInInventory(owner);
}
if (GetObjectType(owner) == OBJECT_TYPE_CREATURE)
{
int i;
for (i = 0; i < NUM_INVENTORY_SLOTS; i++)
{
item = GetItemInSlot(i, owner);
if (FindSubString(reslist, GetResRef(item)) >= 0)
DestroyObject(item);
}
}
}
location util_GetRandomLocation(object oArea)
{
int nX = Random(GetAreaSize(AREA_WIDTH, oArea)*100);
int nY = Random(GetAreaSize(AREA_HEIGHT, oArea)*100);
float fX = IntToFloat(nX)/100;
float fY = IntToFloat(nY)/100;
return Location(oArea, Vector(fX, fY, 0.0), 0.0);
}
void util_PopUp(object oPC, string sTitle, string sMsg, string sIcon="")
{
object oPlc = GetObjectByTag("PLC_POPUP");
SetName(oPlc, sTitle);
SetDescription(oPlc, sMsg);
SetPortraitResRef(oPlc, sIcon);
SendMessageToPC(oPC, sMsg);
NWNX_Player_ForcePlaceableExamineWindow(oPC, oPlc);
}
int util_GetLevelByXP (int nXP)
{
float fXP = IntToFloat(nXP) / 1000;
float fLevel = (sqrt(8 * fXP + 1) + 1) / 2;
int nLevel = FloatToInt(fLevel);
return nLevel;
}
int util_GetLevel (object oPC)
{
return GetHitDice(oPC);
}
int util_GetXPByLevel(int nLevel)
{
int nXP = (((nLevel - 1)*nLevel)/2)*1000;
return nXP;
}
void util_ToggleEncountersInArea(object oArea, int bActive)
{
object oEncounter = GetFirstInPersistentObject(oArea, OBJECT_TYPE_ENCOUNTER);
while (oEncounter != OBJECT_INVALID)
{
SetEncounterActive(bActive, oEncounter);
oEncounter = GetNextInPersistentObject(oArea, OBJECT_TYPE_ENCOUNTER);
}
}
int util_GetItemEquipSlot(object oItem)
{
switch (GetBaseItemType(oItem))
{
case BASE_ITEM_AMULET: return INVENTORY_SLOT_NECK;
case BASE_ITEM_ARMOR: return INVENTORY_SLOT_CHEST;
case BASE_ITEM_ARROW: return INVENTORY_SLOT_ARROWS;
case BASE_ITEM_BASTARDSWORD: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_BATTLEAXE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_BELT: return INVENTORY_SLOT_BELT;
case BASE_ITEM_BOLT: return INVENTORY_SLOT_BOLTS;
case BASE_ITEM_BOOTS: return INVENTORY_SLOT_BOOTS;
case BASE_ITEM_BRACER: return INVENTORY_SLOT_ARMS;
case BASE_ITEM_BULLET: return INVENTORY_SLOT_BULLETS;
case BASE_ITEM_CLOAK: return INVENTORY_SLOT_CLOAK;
case BASE_ITEM_CLUB: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_DAGGER: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_DART: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_DIREMACE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_DOUBLEAXE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_GLOVES: return INVENTORY_SLOT_ARMS;
case BASE_ITEM_GREATAXE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_GREATSWORD: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_HALBERD: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_HANDAXE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_HEAVYCROSSBOW: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_HEAVYFLAIL: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_HELMET: return INVENTORY_SLOT_HEAD;
case BASE_ITEM_KAMA: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_KATANA: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_KUKRI: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_LARGESHIELD: return INVENTORY_SLOT_LEFTHAND;
case BASE_ITEM_LIGHTCROSSBOW: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_LIGHTFLAIL: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_LIGHTHAMMER: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_LIGHTMACE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_LONGBOW: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_LONGSWORD: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_MAGICSTAFF: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_MORNINGSTAR: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_QUARTERSTAFF: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_RAPIER: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_RING: return INVENTORY_SLOT_RIGHTRING;
case BASE_ITEM_SCIMITAR: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SCYTHE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SHORTBOW: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SHORTSPEAR: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SHORTSWORD: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SHURIKEN: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SICKLE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SLING: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SMALLSHIELD: return INVENTORY_SLOT_LEFTHAND;
case BASE_ITEM_THROWINGAXE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_TORCH: return INVENTORY_SLOT_LEFTHAND;
case BASE_ITEM_TOWERSHIELD: return INVENTORY_SLOT_LEFTHAND;
case BASE_ITEM_TWOBLADEDSWORD: return INVENTORY_SLOT_RIGHTHAND;
//:: PRC Weapons
case BASE_ITEM_LIGHT_LANCE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_HEAVY_PICK: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_LIGHT_PICK: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SAI: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_NUNCHAKU: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_FALCHION: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_SAP: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_KATAR: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_HEAVY_MACE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_MAUL: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_DOUBLE_SCIMITAR: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_GOAD: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_EAGLE_CLAW: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_ELVEN_LIGHTBLADE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_ELVEN_THINBLADE: return INVENTORY_SLOT_RIGHTHAND;
case BASE_ITEM_ELVEN_COURTBLADE: return INVENTORY_SLOT_RIGHTHAND;
}
return -1;
}
int ss_GetEncumberanceLevel(object oPC = OBJECT_SELF)
{
int nWeight = GetWeight(oPC);
int nStr = GetAbilityScore(oPC, ABILITY_STRENGTH);
int nEnc = StringToInt(Get2DAString("encumbrance", "Heavy", nStr));
if(nWeight > nEnc) return 2;
nEnc = StringToInt(Get2DAString("encumbrance", "Normal", nStr));
if(nWeight > nEnc) return 1;
return 0;
}
int util_GetDayPeriod()
{
if (GetIsNight())
return PERIOD_NIGHT;
else if (GetIsDawn())
return PERIOD_DAWN;
else if (GetIsDusk())
return PERIOD_DUSK;
else
return PERIOD_DAY;
}
string util_EncodeLocation(location l)
{
object area = GetAreaFromLocation(l);
vector pos = GetPositionFromLocation(l);
float facing = GetFacingFromLocation(l);
string sReturnValue;
return "#TAG#" + GetTag(area) + "#RESREF#" + GetResRef(area) +
"#X#" + FloatToString(pos.x, 5, 2) +
"#Y#" + FloatToString(pos.y, 5, 2) +
"#Z#" + FloatToString(pos.z, 5, 2) +
"#F#" + FloatToString(facing,5, 2) + "#";
}
location util_DecodeLocation(string s)
{
float facing, x, y, z;
int idx, cnt;
int strlen = GetStringLength(s);
idx = FindSubString(s, "#TAG#") + 5;
cnt = FindSubString(GetSubString(s, idx, strlen - idx), "#");
string tag = GetSubString(s, idx, cnt);
idx = FindSubString(s, "#RESREF#") + 8;
cnt = FindSubString(GetSubString(s, idx, strlen - idx), "#");
string resref = GetSubString(s, idx, cnt);
object area = GetFirstArea();
while (area != OBJECT_INVALID)
{
if (GetTag(area) == tag && GetResRef(area) == resref)
break;
area = GetNextArea();
}
idx = FindSubString(s, "#X#") + 3;
cnt = FindSubString(GetSubString(s, idx, strlen - idx), "#");
x = StringToFloat(GetSubString(s, idx, cnt));
idx = FindSubString(s, "#Y#") + 3;
cnt = FindSubString(GetSubString(s, idx, strlen - idx), "#");
y = StringToFloat(GetSubString(s, idx, cnt));
idx = FindSubString(s, "#Z#") + 3;
cnt = FindSubString(GetSubString(s, idx, strlen - idx), "#");
z = StringToFloat(GetSubString(s, idx, cnt));
idx = FindSubString(s, "#F#") + 3;
cnt = FindSubString(GetSubString(s, idx, strlen - idx), "#");
facing = StringToFloat(GetSubString(s, idx, cnt));
return Location(area, Vector(x, y, z), facing);
}
int util_IsWeapon(object oItem)
{
switch (GetBaseItemType(oItem))
{
case BASE_ITEM_SHORTSWORD:
case BASE_ITEM_LONGSWORD:
case BASE_ITEM_BATTLEAXE:
case BASE_ITEM_BASTARDSWORD:
case BASE_ITEM_LIGHTFLAIL:
case BASE_ITEM_WARHAMMER:
case BASE_ITEM_HEAVYCROSSBOW:
case BASE_ITEM_LIGHTCROSSBOW:
case BASE_ITEM_LONGBOW:
case BASE_ITEM_LIGHTMACE:
case BASE_ITEM_HALBERD:
case BASE_ITEM_SHORTBOW:
case BASE_ITEM_TWOBLADEDSWORD:
case BASE_ITEM_GREATSWORD:
case BASE_ITEM_GREATAXE:
case BASE_ITEM_ARROW:
case BASE_ITEM_DAGGER:
case BASE_ITEM_BOLT:
case BASE_ITEM_BULLET:
case BASE_ITEM_CLUB:
case BASE_ITEM_DART:
case BASE_ITEM_DIREMACE:
case BASE_ITEM_DOUBLEAXE:
case BASE_ITEM_HEAVYFLAIL:
case BASE_ITEM_LIGHTHAMMER:
case BASE_ITEM_HANDAXE:
case BASE_ITEM_KAMA:
case BASE_ITEM_KATANA:
case BASE_ITEM_KUKRI:
case BASE_ITEM_MORNINGSTAR:
case BASE_ITEM_QUARTERSTAFF:
case BASE_ITEM_RAPIER:
case BASE_ITEM_SCYTHE:
case BASE_ITEM_SHORTSPEAR:
case BASE_ITEM_SHURIKEN:
case BASE_ITEM_SICKLE:
case BASE_ITEM_SCIMITAR:
case BASE_ITEM_SLING:
case BASE_ITEM_DWARVENWARAXE:
case BASE_ITEM_WHIP:
case BASE_ITEM_GRENADE:
case BASE_ITEM_TRIDENT:
case BASE_ITEM_THROWINGAXE:
case BASE_ITEM_GLOVES:
case BASE_ITEM_CSLASHWEAPON:
case BASE_ITEM_CPIERCWEAPON:
case BASE_ITEM_CBLUDGWEAPON:
case BASE_ITEM_CSLSHPRCWEAP:
//:: PRC Weapons
case BASE_ITEM_LIGHT_LANCE:
case BASE_ITEM_HEAVY_PICK:
case BASE_ITEM_LIGHT_PICK:
case BASE_ITEM_SAI:
case BASE_ITEM_NUNCHAKU:
case BASE_ITEM_FALCHION:
case BASE_ITEM_SAP:
case BASE_ITEM_KATAR:
case BASE_ITEM_HEAVY_MACE:
case BASE_ITEM_MAUL:
case BASE_ITEM_DOUBLE_SCIMITAR:
case BASE_ITEM_GOAD:
case BASE_ITEM_EAGLE_CLAW:
case BASE_ITEM_ELVEN_LIGHTBLADE:
case BASE_ITEM_ELVEN_THINBLADE:
case BASE_ITEM_ELVEN_COURTBLADE:
// CEP weapons:
case 300: // trident_1h
case 301: // heavypick
case 302: // lightpick
case 303: // sai
case 304: // nunchaku
case 305: // falchion
case 308: // sap
case 309: // daggerassn
case 310: // katar
case 312: // lightmace2
case 313: // kukri2
case 316: // falchion_2
case 317: // heavy_mace
case 318: // maul
case 319: // mercurial_longsword
case 320: // mercurial_greatsword
case 321: // scimitar_double
case 322: // goad
case 323: // windfirewheel
case 324: // maugdoublesword
case 327: // Flowers_Crystal
case 329: // tool_2handed
case 330: // Longsword_2
return TRUE;
}
return FALSE;
}