/* -*- LPC -*- */
/*
* $Locker: $
* $Id: enchant.c,v 1.16 2002/06/05 21:19:11 ohdamn Exp $
* $Log: enchant.c,v $
* Revision 1.16 2002/06/05 21:19:11 ohdamn
* Fixed typo
*
* Revision 1.15 2002/02/21 19:53:53 tannah
* added some call_others so that query_max_enchant() and
* query_degrade_enchant() could be shadowed... (and then didn't shadow
* them after all).
*
* Revision 1.14 2001/04/13 00:04:07 pinkfish
* Add in a degrade enchantment cutoff.
*
* Revision 1.13 2000/05/24 02:16:22 pinkfish
* Make the rounds up even more generous.
*
* Revision 1.12 2000/05/24 02:12:46 pinkfish
* It should round up the enchant values a little more generously.
*
* Revision 1.11 2000/05/19 19:36:06 pinkfish
* Fix up a typo that caused add_enchant not to work.
*
* Revision 1.9 2000/05/19 06:46:41 pinkfish
* Make enchantment degrade.
*
* Revision 1.8 2000/04/21 18:03:47 tannah
* Fixed another bug. Hat. Hat. Ernkgh.
*
* Revision 1.7 2000/04/20 21:14:17 tannah
* Fixed a tiny leetle bugge in enchant_string(). Hat. Hat. Hat.
*
* Revision 1.6 2000/04/20 20:16:09 pinkfish
* Add in talisman messages.
*
* Revision 1.5 1999/10/04 22:01:42 pinkfish
* Fix up enchant to be more useful in how it handles enchantment. Make the
* variable private.
*
* Revision 1.4 1999/05/20 17:04:45 dragonkin
* Added extra check in enchant_string() for enchants over max enchant
*
* Revision 1.3 1999/02/16 20:19:52 ceres
* Minor tweaks
*
* Revision 1.2 1998/03/23 21:29:58 olorin
* made query_max_enchant() maskable
*
* Revision 1.1 1998/01/06 03:59:10 ceres
* Initial revision
*
*/
/**
* 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
*/
nosave private int _enchanted;
nosave private int _set_enchant_time;
nosave private int _degrade_enchant;
#define ENCHANT_DEGRADE_TIME (8 * 7 * 24 * 60 * 60)
/**
* This method returns the maximum possible enchantment for the
* object. This is based on its weight.
* @return the maximum enchantment
*/
int query_max_enchant()
{
return 5 + (int) this_object()->query_weight() / 4;
} /* query_max_enchant() */
/**
* This method returns the maximum enchantment before the enchantment
* starts to degrade.
* @return the enchantment level which enchantment degrades to
*/
int query_degrade_enchant() {
if (!_degrade_enchant) {
return this_object()->query_max_enchant() / 2;
}
return _degrade_enchant;
} /* query_degrade_enchant() */
/**
* This method sets the enchantment at which things start to degrade.
* @param enchant the enchantment level to set it at
*/
void set_degrade_enchant(int enchant) {
if (enchant > this_object()->query_max_enchant()) {
enchant = this_object()->query_max_enchant();
}
_degrade_enchant = enchant;
} /* set_degreade_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;
string ench_msg;
if (this_object()->query_property("talisman")) {
tal_msg = (string) this_object()->query_property("talisman_mess");
if (!tal_msg)
tal_msg = "It has the hazy octarine sparkle of a magical talisman.";
tal_msg += "\n";
} else {
tal_msg = "";
}
if (this_object()->query_property("octarine_mess")) {
ench_msg = (string) this_object()->query_property("octarine_mess")
+ "\n";
} else {
switch ((this_object()->query_enchant() * 100) /
this_object()->query_max_enchant()) {
case 1..10:
ench_msg = "It occasionally pulses with octarine light.\n";
break;
case 11..20:
ench_msg = "It emits a slight octarine glow.\n";
break;
case 21..30:
ench_msg = "It softly pulses in dull octarine shades.\n";
break;
case 31..40:
ench_msg = "It gives off a steady but dull octarine glow.\n";
break;
case 41..50:
ench_msg = "It gives off a steady octarine glow.\n";
break;
case 51..60:
ench_msg = "It glows an intense octarine.\n";
break;
case 61..70:
ench_msg = "It emits a bright octarine colour.\n";
break;
case 71..80:
ench_msg = "It brightly pulses octarine.\n";
break;
case 81..90:
ench_msg = "It glows brilliant octarine shades.\n";
break;
case 91..100:
ench_msg = "It radiates pure octarine brilliance.\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 > this_object()->query_max_enchant()) {
number = this_object()->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(this_object()->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;
int degrade;
max = this_object()->query_max_enchant();
if (_enchanted > max) {
_enchanted = max;
}
degrade = this_object()->query_degrade_enchant();
if (_enchanted > degrade) {
if (!_set_enchant_time) {
_set_enchant_time = time();
}
if (time() - _set_enchant_time >= ENCHANT_DEGRADE_TIME) {
_enchanted = degrade;
} else {
tmp2 = tmp = (_enchanted - degrade) * 100 + 99;
tmp *= 100 - (((time() - _set_enchant_time) * 100) /
ENCHANT_DEGRADE_TIME);
/*
if (this_player() && this_player()->query_name() == "pinkfish") {
tell_creator("pinkfish", "Max %d start %d tmp %d enchant %d\n", max, tmp2, tmp, _enchanted);
}
*/
return degrade + (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;
} /* query_real_enchant() */
/**
* 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;
} /* query_enchant_set_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;
} /* set_enchant_time() */