generated from Jaysyn/ModuleTemplate
258 lines
13 KiB
Plaintext
258 lines
13 KiB
Plaintext
/**
|
|
* 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;
|
|
}
|
|
|