/**
* Module to handle the amount of magical charge (enchantment) of an
* object has. The maximum enchantment of an item is determined by
* by its weight - the material of composition is not yet taken into
* account.
* <p>
* Enchanting an object will add to its value, and, if the object
* is an item of armour, will improve its armour class.
*
* @change 20th May 1994 Deutha
* added a function to calculate the maximum
* enchantment based on weight.
* @author Pinkfish
*/
/*
* DS History:
* 3/8/1 Shiannar, changed messages, changed max enchant limit.
*/
nosave private int _enchanted;
nosave private int _set_enchant_time;
#define ENCHANT_DEGRADE_TIME (8 * 7 * 24 * 60 * 60)
/**
* This method returns the maximum possible enchantment for the
* object. This used to be based on its weight, though now
* is 100 so that we have a percentage rating.
* @return the maximum enchantment
*/
int query_max_enchant() {
return 100;
} /* query_max_enchant() */
/**
* This method returns the current enchantment string for the object. The
* string is created from the percentage of the max enchantment that it is
* enchanted to. If the object is also a talisman, an identifying string is
* appended to the enchantment message.
* <p>
* These messages are only visible to creators and players who can see
* octarine.
* <p>
* If the property "octarine_mess" is set, then this will be printed instead
* of the automatically generated enchantment message.
* <p>
* If the property "talisman_mess" is set, then this will be printed instead
* of the automatically generated talisman message if appropriate.
* @return the enchantment string and talisman string
* @see set_enchant()
* @see add_enchant()
* @see query_max_enchant()
* @see query_enchant()
*/
string enchant_string() {
string tal_msg, ench_msg, *pl;
if( TO->query_property( "talisman" ) ) {
tal_msg = (string)TO->query_property( "talisman_mess" );
if( !tal_msg )
tal_msg = "It has the hazy magical sparkle of a magical talisman.";
tal_msg += "\n";
} else {
tal_msg = "";
}
if( query_group(TO) )
pl = ({"They ", ""});
else
pl = ({"It ", "s"});
if( ench_msg = TO->query_property("octarine_mess") ) {
ench_msg += "\n";
} else {
switch( ( TO->query_enchant() * 100 ) / TO->query_max_enchant() ) {
case 1..10:
ench_msg = pl[0]+"occasionally pulse"+pl[1]+" with magical "
"energy.\n";
break;
case 11..20:
ench_msg = pl[0]+"emit"+pl[1]+" a slow other-worldly glow.\n";
break;
case 21..30:
ench_msg = pl[0]+"softly pulse"+pl[1]+" with a dim magical "
"glow.\n";
break;
case 31..40:
ench_msg = pl[0]+"emit"+pl[1]+" dim magical light in a steady "
"glow.\n";
break;
case 41..50:
ench_msg = pl[0]+"give"+pl[1]+" off magical energy in a steady "
"glow.\n";
break;
case 51..60:
ench_msg = pl[0]+"glow"+pl[1]+" with intense magical energy.\n";
break;
case 61..70:
ench_msg = pl[0]+"emit"+pl[1]+" magical energy in a steady, "
"bright haze.\n";
break;
case 71..80:
ench_msg = pl[0]+({"is", "are"})[query_group(TO)]+" filled with "
"bright, pulsing magical energy.\n";
break;
case 81..90:
ench_msg = pl[0]+"glow"+pl[1]+" with bright magical energy.\n";
break;
case 91..100:
ench_msg = pl[0]+"radiate"+pl[1]+" pure, strong, magical "
"energy.\n";
break;
default :
ench_msg = "";
}
}
return ench_msg + tal_msg;
} /* enchant_string() */
/**
* This method sets the current enchantment level. If it is greator than
* the max enchantment level then it will be set to the maximum
* enchantment level.
* @param number the new enchantment level
* @see enchant_string()
* @see query_enchant()
* @see query_max_enchant()
* @see add_enchant()
*/
void set_enchant( int number ) {
if( number > TO->query_max_enchant() )
number = TO->query_max_enchant();
_set_enchant_time = time();
_enchanted = number;
} /* set_enchant() */
/**
* This method changes the current enchanment level.
* @param numnber the amount to chant the enchantment level by
* @see enchant_string()
* @see query_enchant()
* @see set_enchant()
* @see query_max_enchant()
*/
int add_enchant( int number ) {
set_enchant( TO->query_enchant() + number );
return _enchanted;
} /* add_enchant() */
/**
* This method queries the current enchantment level.
* @param number the new enchantment level
* @see enchant_string()
* @see set_enchant()
* @see query_max_enchant()
* @see add_enchant()
*/
int query_enchant() {
int max;
int tmp;
int tmp2;
max = TO->query_max_enchant();
if( _enchanted > max )
_enchanted = max;
if( _enchanted > max / 2 ) {
if( !_set_enchant_time )
_set_enchant_time = time();
if( time() - _set_enchant_time >= ENCHANT_DEGRADE_TIME ) {
_enchanted = max / 2;
} else {
tmp2 = tmp = (_enchanted - ( max / 2 ) ) * 100 + 99;
tmp *= 100 - ( ( ( time() - _set_enchant_time ) * 100 ) /
ENCHANT_DEGRADE_TIME );
return ( max / 2 ) + ( tmp / 10000 );
}
}
return _enchanted;
} /* query_enchant() */
/**
* This method returns the actual enchant of the object.
* @return the actual enchant value
*/
int query_real_enchant() { return _enchanted; }
/**
* This method returns the time the time the enchantment was set.
* @return the time the enchantment was set
*/
int query_enchant_set_time() { return _set_enchant_time; }
/**
* This method sets the time at which the enchant level was set.
* @param tim the time to set it to
*/
protected void set_enchant_set_time(int tim) { _set_enchant_time = tim; }