Initial commit
Adding all of the current content for Anphillia Unlimited.
This commit is contained in:
428
_module/nss/util_inc.nss
Normal file
428
_module/nss/util_inc.nss
Normal file
@@ -0,0 +1,428 @@
|
||||
#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 max(int a, int b) { return (a>b) ? a : b; } //:: Defined exactly the same in the PRC's
|
||||
//int min(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;
|
||||
}
|
||||
Reference in New Issue
Block a user