#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= 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; }