Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
		
			
				
	
	
		
			155 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*:://////////////////////////////////////////////
 | 
						|
//:: Spell Name Appraisal
 | 
						|
//:: Spell FileName XXX_S_Appraisal
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
//:: In Game Spell desctiption
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
    Divination
 | 
						|
    Level: Brd 1, Sor/Wiz 1
 | 
						|
    Components: V, S, F
 | 
						|
    Casting Time: 1 full round
 | 
						|
    Range: Touch
 | 
						|
    Target: One item
 | 
						|
    Duration: Instantaneous
 | 
						|
    Saving Throw: Will negates (harmless, object)
 | 
						|
    Spell Resistance: Yes (harmless, object)
 | 
						|
    Source: Various (Aenea DM)
 | 
						|
 | 
						|
    When this spell is cast, it brings to the caster's mind the amount of money,
 | 
						|
    to within 10% of their value, that the item is worth to the average buyer.
 | 
						|
    An item may be worth more or less to specific buyers, but this spell provides
 | 
						|
    only what an average buyer would pay for it.
 | 
						|
 | 
						|
    If this spell is cast on a magical item, the appraisal is based only on the
 | 
						|
    non-magical properties of the item, with any magical weapons being treated
 | 
						|
    as masterwork, +1 attack only, weapons.
 | 
						|
 | 
						|
    Focus: A miniature scale worth at least 50 gp.
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
//:: Spell Effects Applied / Notes
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
    The example was:
 | 
						|
 | 
						|
    If this spell is cast on a magical item, the appraisal is based only on the
 | 
						|
    non-magical properties of the item. As an example, a keen flaming longsword
 | 
						|
    +1 would, according to this spell, be worth between 284 gp and 346 gp
 | 
						|
    (within 10% of the price of a masterwork longsword, which is 315 gp).
 | 
						|
 | 
						|
    Which is fine.
 | 
						|
 | 
						|
    This is done via. 2da lookups, as to make it easier. Noting, of course, that
 | 
						|
    unless they know it is masterwork, they will not even get the +1 attack bonus
 | 
						|
    bonus to the price.
 | 
						|
 | 
						|
    Arrows ETC which are treated as 1 GP, cannot be anything but 1GP. Nothing
 | 
						|
    will be estimated at 0.
 | 
						|
 | 
						|
    Masterwork (+1 attack) costs 404 when added to a blank weapon - thusly, this
 | 
						|
    is how much will be added if the weapon is actually magical.
 | 
						|
 | 
						|
    NOTE:
 | 
						|
 | 
						|
    Average buyer, as it is only the base cost, is using a check of 100% basically.
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
//:: Created By: Jasperre
 | 
						|
//::////////////////////////////////////////////*/
 | 
						|
 | 
						|
#include "SMP_INC_SPELLS"
 | 
						|
 | 
						|
const int SMP_MASTERWORK_BONUSPRICE = 404;
 | 
						|
 | 
						|
void main()
 | 
						|
{
 | 
						|
    // Spell hook check.
 | 
						|
    if(!SMP_SpellHookCheck(SMP_SPELL_APPRAISAL)) return;
 | 
						|
 | 
						|
    //Declare major variables
 | 
						|
    object oCaster = OBJECT_SELF;
 | 
						|
    object oTarget = GetSpellTargetObject();
 | 
						|
    object oPossessor = GetItemPossessor(oTarget);
 | 
						|
    int nValue, nBasePrice;
 | 
						|
    int bMagical = SMP_IP_GetIsEnchanted(oTarget);
 | 
						|
    int bIdentified = GetIdentified(oTarget);
 | 
						|
    int bPlot = GetPlotFlag(oTarget);
 | 
						|
    float fTimesBy;
 | 
						|
 | 
						|
    // Check for focus
 | 
						|
    if(!SMP_ComponentFocusItem(SMP_ITEM_MINATURE_SCALES, "Minature scales worth at least 50GP", "Appraisal")) return;
 | 
						|
 | 
						|
    // Check target - must be an item
 | 
						|
    if(GetObjectType(oTarget) != OBJECT_TYPE_ITEM)
 | 
						|
    {
 | 
						|
        FloatingTextStringOnCreature("*You must cast appraisal on a item*", oCaster, FALSE);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    // Signal event for possessor - make sure it is some valid creature (else, the caster)
 | 
						|
    if(!GetIsObjectValid(oPossessor))
 | 
						|
    {
 | 
						|
        oPossessor = oCaster;
 | 
						|
    }
 | 
						|
 | 
						|
    // If plot, report it (they'd know if they tried to sell it anyway)
 | 
						|
    if(bPlot == TRUE)
 | 
						|
    {
 | 
						|
        FloatingTextStringOnCreature("*The item targeted is too important to sell*", oCaster, FALSE);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        // Report the price
 | 
						|
        nBasePrice = StringToInt(Get2DAString("baseitems", "BaseCost", GetBaseItemType(oTarget)));
 | 
						|
 | 
						|
        // If identified, we will know if it is magical
 | 
						|
        if(bIdentified == TRUE)
 | 
						|
        {
 | 
						|
            // If magical, add on the SMP_MASTERWORK_BONUSPRICE amount
 | 
						|
            if(bMagical == TRUE)
 | 
						|
            {
 | 
						|
                nBasePrice += SMP_MASTERWORK_BONUSPRICE;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        // 10% either way.
 | 
						|
        if(d2() == 1)
 | 
						|
        {
 | 
						|
            // Add 0-10% value
 | 
						|
            fTimesBy = 1.0 + (IntToFloat(Random(10001)) / 100000);
 | 
						|
            if(fTimesBy == 0.0 || fTimesBy == 1.0)
 | 
						|
            {
 | 
						|
                nValue = nBasePrice;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                nValue = FloatToInt(IntToFloat(nBasePrice) * fTimesBy);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            // Take away 0-10% value
 | 
						|
            fTimesBy = 1.0 - (IntToFloat(Random(10001)) / 100000);
 | 
						|
            if(fTimesBy == 0.0 || fTimesBy == 1.0)
 | 
						|
            {
 | 
						|
                nValue = nBasePrice;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                nValue = FloatToInt(IntToFloat(nBasePrice) * fTimesBy);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        // Check nValue, must be >= 1
 | 
						|
        if(nValue < 1) nValue = 1;
 | 
						|
 | 
						|
        // Report value
 | 
						|
        FloatingTextStringOnCreature("*You determine " + GetName(oTarget) + " to be worth around " + IntToString(nValue) + "GP*", oCaster, FALSE);
 | 
						|
 | 
						|
        // Delcare effects
 | 
						|
        effect eVis = EffectVisualEffect(VFX_IMP_MAGICAL_VISION);
 | 
						|
 | 
						|
        // Signal event
 | 
						|
        SMP_SignalSpellCastAt(oPossessor, SMP_SPELL_APPRAISAL, FALSE);
 | 
						|
 | 
						|
        // Apply effects
 | 
						|
        SMP_ApplyVFX(oPossessor, eVis);
 | 
						|
    }
 | 
						|
}
 |