/** * Put this script in the module wide OnAcquireItem * * The script gives pc's a chance to spot objects that are moved * around. So if someone is removing items from a chest, a pc * gets a spot check to see if they see the item. Large items * like armor are seen by everyone. Rogues (or anyone else with * pick pocket) automatically "palm" items and makes it harder * to spot. * * The pc also gets an identity check (though at a penalty) to * see if they can tell what specific type of object it is. * * There is also a penalty if the pc is currently engaged in combat * * Most of the configurable options are near the top of the script * * Copyright 2002 Jim Woodgate (woody@realtime.net) All Rights Reserved */ /* Configurable Options */ int PARTY_ONLY = FALSE; // Only check the party, if false check entire area int DONT_CHECK_FROM_PC = FALSE; // Set to true if you don't want pc exchanges to trigger int BASE_DC = 15; // The base dc for a small item int COMBAT_PENALTY = -10; // This is the spot penalty if a pc is in combat int IDENTITY_PENALTY = -5; // This penalty is to see if the pc can identify the item int DEBUG = TRUE; // Set to true to get some semi-interesting information // in the log file /* Declare the fuctions */ void doChecks(object oTo, int dc, object oItem, object oMember); string getItemDescription(object oItem, object oMember); int isMagical(object oItem); void loadDescriptionStrings(); /* And the main */ void main() { object oFrom = GetModuleItemAcquiredFrom(); object oTo = GetModuleItemAcquiredBy(); object oItem = GetModuleItemAcquired(); if (GetIsObjectValid(oFrom) && GetIsPC(oTo) && GetBaseItemType(oItem) != BASE_ITEM_INVALID) { if (GetIsPC(oFrom) && DONT_CHECK_FROM_PC) { return; } object oArea = GetArea(oTo); int pickPocket = GetSkillRank(SKILL_PICK_POCKET ,oTo); int weight = GetWeight(oItem); int dc = BASE_DC; if (weight > 50) { dc = -5; } else if (weight > 1) { dc -= (weight / 4); } dc += pickPocket; if (DEBUG) { PrintString("DC is "+IntToString(dc)); } if (PARTY_ONLY) { object oMember = GetFirstFactionMember(oTo, TRUE); while (GetIsObjectValid(oMember)) { if (oArea == GetArea(oMember) && GetObjectSeen(oTo, oMember) && !(oTo == oMember)) { doChecks(oTo, dc, oItem, oMember); } oMember = GetNextFactionMember(oTo, TRUE); } } else { object oMember = GetFirstPC(); while (GetIsObjectValid(oMember)) { if (oArea == GetArea(oMember) && GetObjectSeen(oTo, oMember) && !(oTo == oMember)) { doChecks(oTo, dc, oItem, oMember); } oMember = GetNextPC(); } } } } /** * Do the actualy check */ void doChecks(object oTo, int dc, object oItem, object oMember) { int roll = d20(); int spotCheck = GetSkillRank(SKILL_SPOT, oMember); if (GetIsInCombat(oMember)) { spotCheck += COMBAT_PENALTY; } if (DEBUG) { PrintString("Roll "+IntToString(roll)+" spot " +IntToString(spotCheck)+" checking against a dc of "+IntToString(dc)); } if (roll + spotCheck >= dc) { SendMessageToPC(oMember, "You see "+GetName(oTo)+" getting " +getItemDescription(oItem, oMember)); } } /** * Function to get a description of an item, uses oMember's lore * skill */ string getItemDescription(object oItem, object oMember) { int lore = GetSkillRank(SKILL_LORE, oMember) + IDENTITY_PENALTY; if (lore < 0) { lore = 0; } int maxValue = StringToInt(Get2DAString("SkillVsItemCost", "DeviceCostMax", lore)); int itemValue = GetGoldPieceValue(oItem); if (!GetIdentified(oItem)) { SetIdentified(oItem, TRUE); itemValue = GetGoldPieceValue(oItem); SetIdentified(oItem, FALSE); } if (GetItemStackSize(oItem) > 1) { itemValue /= GetItemStackSize(oItem); } if (DEBUG) { PrintString("lore "+IntToString(lore)+" max value " +IntToString(maxValue)+" itemvalue " +IntToString(itemValue)+" "+GetName(oItem)); } if (maxValue > itemValue) { return GetName(oItem); } string magicalString = ""; if (isMagical(oItem)) { magicalString = " (magical) "; } if (!GetLocalInt(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_LOADED")) { loadDescriptionStrings(); } string baseItemName = GetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_" +IntToString(GetBaseItemType(oItem))); if (baseItemName == "") { return "Unknown Item"+magicalString; } return baseItemName+magicalString; } /** * Bunch of sets, only do this once! */ void loadDescriptionStrings() { SetLocalInt(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_LOADED", TRUE); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_AMULET), "an amulet"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_ARMOR), "some armor"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_ARROW), "some arrows"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_BASTARDSWORD), "a bastard sword"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_BATTLEAXE), "a battle axe"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_BELT), "a belt"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_BOLT), "some bolts"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_BOOK), "a book"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_BOOTS), "some boots"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_BRACER), "some bracers"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_BULLET), "some bullets"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_CBLUDGWEAPON), "some weapon"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_CLOAK), "a cloak"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_CLUB), "a club"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_CPIERCWEAPON), "some pointy weapon"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_CREATUREITEM), "some piece of a creature"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_CSLASHWEAPON), "some sharp weapon"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_CSLSHPRCWEAP), "some weapon"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_DAGGER), "a dagger"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_DART), "some darts"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_DIREMACE), "a dire mace"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_DOUBLEAXE), "a double axe"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_GEM), "some gems"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_GLOVES), "some gloves"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_GOLD), "some gold"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_GREATAXE), "a great axe"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_GREATSWORD), "a great sword"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_GRENADE), "some grenades"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_HALBERD), "a halberd"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_HANDAXE), "a hand axe"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_HEALERSKIT), "a healer's kit"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_HEAVYCROSSBOW), "a large crossbow"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_HEAVYFLAIL), "a large flail"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_HELMET), "a helmet"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_KAMA), "a kama"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_KATANA), "a katana"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_KEY), "a key"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_KUKRI), "a kukri"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_LARGEBOX), "a large box"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_LARGESHIELD), "a large shield"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_LIGHTCROSSBOW), "a small crossbow"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_LIGHTFLAIL), "a small flail"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_LIGHTHAMMER), "a small hammer"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_LIGHTMACE), "a small mace"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_LONGBOW), "a longbow"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_LONGSWORD), "a longword"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MAGICROD), "a rod"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MAGICSTAFF), "a staff"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MAGICWAND), "a wand"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MISCLARGE), "some large item"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MISCMEDIUM), "some medium item"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MISCSMALL), "some small item"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MISCTALL), "some tall item"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MISCTHIN), "some thin item"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MISCWIDE), "some wide item"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_MORNINGSTAR), "a morningstar"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_POTIONS), "a potion"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_QUARTERSTAFF), "a quarterstaff"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_RAPIER), "a rapier"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_RING), "a ring"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SCIMITAR), "a scimitar"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SCROLL), "a scroll"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SCYTHE), "a scythe"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SHORTBOW), "a shortbow"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SHORTSPEAR), "a short spear"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SHORTSWORD), "a shortsword"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SHURIKEN), "some shuriken"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SICKLE), "a sickle"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SLING), "a sling"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SMALLSHIELD), "a small shield"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_SPELLSCROLL), "a scroll"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_THIEVESTOOLS), "thieves tools"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_THROWINGAXE), "some throwing axes"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_TORCH), "a torch"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_TOWERSHIELD), "a tower shield"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_TRAPKIT), "a trap kit"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_TWOBLADEDSWORD), "a two bladed sword"); SetLocalString(OBJECT_SELF, "MODULE_BASE_ITEM_DESC_"+IntToString(BASE_ITEM_WARHAMMER), "a warhammer"); } /** * Check if there is anything "special" about this item */ int isMagical(object oItem) { int i; for (i=0; i<70; i++) { if (GetItemHasItemProperty(oItem, i)) { return TRUE; } } return FALSE; }