Artifact prices

Each artifact has its own individual price, rather than being solely
based on the cost of its base item.
This commit is contained in:
kmhugo
2002-02-02 19:21:33 +00:00
parent 8f1ad60a0e
commit 532242f07f
7 changed files with 72 additions and 48 deletions
+1
View File
@@ -47,6 +47,7 @@ struct artifact {
aligntyp alignment; /* alignment of bequeathing gods */ aligntyp alignment; /* alignment of bequeathing gods */
short role; /* character role associated with */ short role; /* character role associated with */
short race; /* character race associated with */ short race; /* character race associated with */
long cost; /* price when sold to hero (default 100 x base cost) */
}; };
/* invoked properties with special powers */ /* invoked properties with special powers */
+46 -39
View File
@@ -5,14 +5,14 @@
#ifdef MAKEDEFS_C #ifdef MAKEDEFS_C
/* in makedefs.c, all we care about is the list of names */ /* in makedefs.c, all we care about is the list of names */
#define A(nam,typ,s1,s2,mt,atk,dfn,cry,inv,al,cl,rac) nam #define A(nam,typ,s1,s2,mt,atk,dfn,cry,inv,al,cl,rac,cost) nam
static const char *artifact_names[] = { static const char *artifact_names[] = {
#else #else
/* in artifact.c, set up the actual artifact list structure */ /* in artifact.c, set up the actual artifact list structure */
#define A(nam,typ,s1,s2,mt,atk,dfn,cry,inv,al,cl, rac) \ #define A(nam,typ,s1,s2,mt,atk,dfn,cry,inv,al,cl,rac,cost) \
{ typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac } { typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost }
#define NO_ATTK {0,0,0,0} /* no attack */ #define NO_ATTK {0,0,0,0} /* no attack */
#define NO_DFNS {0,0,0,0} /* no defense */ #define NO_DFNS {0,0,0,0} /* no defense */
@@ -29,41 +29,48 @@ static const char *artifact_names[] = {
STATIC_OVL NEARDATA struct artifact artilist[] = { STATIC_OVL NEARDATA struct artifact artilist[] = {
#endif /* MAKEDEFS_C */ #endif /* MAKEDEFS_C */
/* Artifact cost rationale:
* 1. The more useful the artifact, the better its cost.
* 2. Quest artifacts are highly valued.
* 3. Chaotic artifacts are inflated due to scarcity (and balance).
*/
/* dummy element #0, so that all interesting indices are non-zero */ /* dummy element #0, so that all interesting indices are non-zero */
A("", STRANGE_OBJECT, A("", STRANGE_OBJECT,
0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 0L ),
A("Excalibur", LONG_SWORD, A("Excalibur", LONG_SWORD,
(SPFX_NOGEN|SPFX_RESTR|SPFX_SEEK|SPFX_DEFN|SPFX_INTEL|SPFX_SEARCH),0,0, (SPFX_NOGEN|SPFX_RESTR|SPFX_SEEK|SPFX_DEFN|SPFX_INTEL|SPFX_SEARCH),0,0,
PHYS(5,10), DRLI(0,0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM ), PHYS(5,10), DRLI(0,0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM, 4000L ),
/* /*
* Stormbringer only has a 2 because it can drain a level, * Stormbringer only has a 2 because it can drain a level,
* providing 8 more. * providing 8 more.
*/ */
A("Stormbringer", RUNESWORD, A("Stormbringer", RUNESWORD,
(SPFX_RESTR|SPFX_ATTK|SPFX_DEFN|SPFX_INTEL|SPFX_DRLI), 0, 0, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN|SPFX_INTEL|SPFX_DRLI), 0, 0,
DRLI(5,2), DRLI(0,0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM ), DRLI(5,2), DRLI(0,0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 8000L ),
/* /*
* Mjollnir will return to the hand of the wielder when thrown * Mjollnir will return to the hand of the wielder when thrown
* if the wielder is a Valkyrie wearing Gauntlets of Power. * if the wielder is a Valkyrie wearing Gauntlets of Power.
*/ */
A("Mjollnir", WAR_HAMMER, /* Mjo:llnir */ A("Mjollnir", WAR_HAMMER, /* Mjo:llnir */
(SPFX_RESTR|SPFX_ATTK), 0, 0, (SPFX_RESTR|SPFX_ATTK), 0, 0,
ELEC(5,24), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_VALKYRIE, NON_PM ), ELEC(5,24), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_VALKYRIE, NON_PM, 4000L ),
A("Cleaver", BATTLE_AXE, A("Cleaver", BATTLE_AXE,
SPFX_RESTR, 0, 0, SPFX_RESTR, 0, 0,
PHYS(3,6), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_BARBARIAN, NON_PM ), PHYS(3,6), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_BARBARIAN, NON_PM, 1500L ),
A("Grimtooth", ORCISH_DAGGER, A("Grimtooth", ORCISH_DAGGER,
SPFX_RESTR, 0, 0, SPFX_RESTR, 0, 0,
PHYS(2,6), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC ), PHYS(2,6), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, 300L ),
/* /*
* Orcrist and Sting have same alignment as elves. * Orcrist and Sting have same alignment as elves.
*/ */
A("Orcrist", ELVEN_BROADSWORD, A("Orcrist", ELVEN_BROADSWORD,
SPFX_DFLAG2, 0, M2_ORC, SPFX_DFLAG2, 0, M2_ORC,
PHYS(5,0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF ), PHYS(5,0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 2000L ),
/* /*
* The combination of SPFX_WARN and M2_something on an artifact * The combination of SPFX_WARN and M2_something on an artifact
@@ -73,50 +80,50 @@ A("Orcrist", ELVEN_BROADSWORD,
*/ */
A("Sting", ELVEN_DAGGER, A("Sting", ELVEN_DAGGER,
(SPFX_WARN|SPFX_DFLAG2), 0, M2_ORC, (SPFX_WARN|SPFX_DFLAG2), 0, M2_ORC,
PHYS(5,0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF ), PHYS(5,0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 800L ),
/* /*
* Magicbane is a bit different! Its magic fanfare * Magicbane is a bit different! Its magic fanfare
* unbalances victims in addition to doing some damage. * unbalances victims in addition to doing some damage.
*/ */
A("Magicbane", ATHAME, A("Magicbane", ATHAME,
(SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0,
STUN(3,4), DFNS(AD_MAGM), NO_CARY, 0, A_NEUTRAL, PM_WIZARD, NON_PM ), STUN(3,4), DFNS(AD_MAGM), NO_CARY, 0, A_NEUTRAL, PM_WIZARD, NON_PM, 3500L ),
A("Frost Brand", LONG_SWORD, A("Frost Brand", LONG_SWORD,
(SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0,
COLD(5,0), COLD(0,0), NO_CARY, 0, A_NONE, NON_PM, NON_PM ), COLD(5,0), COLD(0,0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3200L ),
A("Fire Brand", LONG_SWORD, A("Fire Brand", LONG_SWORD,
(SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0,
FIRE(5,0), FIRE(0,0), NO_CARY, 0, A_NONE, NON_PM, NON_PM ), FIRE(5,0), FIRE(0,0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L ),
A("Dragonbane", BROADSWORD, A("Dragonbane", BROADSWORD,
(SPFX_RESTR|SPFX_DCLAS), 0, S_DRAGON, (SPFX_RESTR|SPFX_DCLAS), 0, S_DRAGON,
PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 500L ),
A("Demonbane", LONG_SWORD, A("Demonbane", LONG_SWORD,
(SPFX_RESTR|SPFX_DFLAG2), 0, M2_DEMON, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_DEMON,
PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM ), PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 2500L ),
A("Werebane", SILVER_SABER, A("Werebane", SILVER_SABER,
(SPFX_RESTR|SPFX_DFLAG2), 0, M2_WERE, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_WERE,
PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 1500L ),
A("Grayswandir", SILVER_SABER, A("Grayswandir", SILVER_SABER,
(SPFX_RESTR|SPFX_HALRES), 0, 0, (SPFX_RESTR|SPFX_HALRES), 0, 0,
PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM ), PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 8000L ),
A("Giantslayer", LONG_SWORD, A("Giantslayer", LONG_SWORD,
(SPFX_RESTR|SPFX_DFLAG2), 0, M2_GIANT, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_GIANT,
PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM ), PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 200L ),
A("Ogresmasher", WAR_HAMMER, A("Ogresmasher", WAR_HAMMER,
(SPFX_RESTR|SPFX_DCLAS), 0, S_OGRE, (SPFX_RESTR|SPFX_DCLAS), 0, S_OGRE,
PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L ),
A("Trollsbane", MORNING_STAR, A("Trollsbane", MORNING_STAR,
(SPFX_RESTR|SPFX_DCLAS), 0, S_TROLL, (SPFX_RESTR|SPFX_DCLAS), 0, S_TROLL,
PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L ),
/* /*
* Two problems: 1) doesn't let trolls regenerate heads, * Two problems: 1) doesn't let trolls regenerate heads,
* 2) doesn't give unusual message for 2-headed monsters (but * 2) doesn't give unusual message for 2-headed monsters (but
@@ -124,7 +131,7 @@ A("Trollsbane", MORNING_STAR,
*/ */
A("Vorpal Blade", LONG_SWORD, A("Vorpal Blade", LONG_SWORD,
(SPFX_RESTR|SPFX_BEHEAD), 0, 0, (SPFX_RESTR|SPFX_BEHEAD), 0, 0,
PHYS(5,1), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM ), PHYS(5,1), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 4000L ),
/* /*
* Ah, never shall I forget the cry, * Ah, never shall I forget the cry,
* or the shriek that shrieked he, * or the shriek that shrieked he,
@@ -135,11 +142,11 @@ A("Vorpal Blade", LONG_SWORD,
*/ */
A("Snickersnee", KATANA, A("Snickersnee", KATANA,
SPFX_RESTR, 0, 0, SPFX_RESTR, 0, 0,
PHYS(0,8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM ), PHYS(0,8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM, 1200L ),
A("Sunsword", LONG_SWORD, A("Sunsword", LONG_SWORD,
(SPFX_RESTR|SPFX_DFLAG2), 0, M2_UNDEAD, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_UNDEAD,
PHYS(5,0), DFNS(AD_BLND), NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM ), PHYS(5,0), DFNS(AD_BLND), NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 1500L ),
/* /*
* The artifacts for the quest dungeon, all self-willed. * The artifacts for the quest dungeon, all self-willed.
@@ -148,86 +155,86 @@ A("Sunsword", LONG_SWORD,
A("The Orb of Detection", CRYSTAL_BALL, A("The Orb of Detection", CRYSTAL_BALL,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_ESP|SPFX_HSPDAM), 0, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_ESP|SPFX_HSPDAM), 0,
NO_ATTK, NO_DFNS, CARY(AD_MAGM), NO_ATTK, NO_DFNS, CARY(AD_MAGM),
INVIS, A_LAWFUL, PM_ARCHEOLOGIST, NON_PM ), INVIS, A_LAWFUL, PM_ARCHEOLOGIST, NON_PM, 2500L ),
A("The Heart of Ahriman", LUCKSTONE, A("The Heart of Ahriman", LUCKSTONE,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), SPFX_STLTH, 0, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), SPFX_STLTH, 0,
/* this stone does double damage if used as a projectile weapon */ /* this stone does double damage if used as a projectile weapon */
PHYS(5,0), NO_DFNS, NO_CARY, PHYS(5,0), NO_DFNS, NO_CARY,
LEVITATION, A_NEUTRAL, PM_BARBARIAN, NON_PM ), LEVITATION, A_NEUTRAL, PM_BARBARIAN, NON_PM, 2500L ),
A("The Sceptre of Might", MACE, A("The Sceptre of Might", MACE,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DALIGN), 0, 0, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DALIGN), 0, 0,
PHYS(5,0), NO_DFNS, CARY(AD_MAGM), PHYS(5,0), NO_DFNS, CARY(AD_MAGM),
CONFLICT, A_LAWFUL, PM_CAVEMAN, NON_PM ), CONFLICT, A_LAWFUL, PM_CAVEMAN, NON_PM, 2500L ),
#if 0 /* OBSOLETE */ #if 0 /* OBSOLETE */
A("The Palantir of Westernesse", CRYSTAL_BALL, A("The Palantir of Westernesse", CRYSTAL_BALL,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL),
(SPFX_ESP|SPFX_REGEN|SPFX_HSPDAM), 0, (SPFX_ESP|SPFX_REGEN|SPFX_HSPDAM), 0,
NO_ATTK, NO_DFNS, NO_CARY, NO_ATTK, NO_DFNS, NO_CARY,
TAMING, A_CHAOTIC, NON_PM , PM_ELF), TAMING, A_CHAOTIC, NON_PM , PM_ELF, 8000L ),
#endif #endif
A("The Staff of Aesculapius", QUARTERSTAFF, A("The Staff of Aesculapius", QUARTERSTAFF,
(SPFX_NOGEN|SPFX_RESTR|SPFX_ATTK|SPFX_INTEL|SPFX_DRLI|SPFX_REGEN), 0,0, (SPFX_NOGEN|SPFX_RESTR|SPFX_ATTK|SPFX_INTEL|SPFX_DRLI|SPFX_REGEN), 0,0,
DRLI(0,0), DRLI(0,0), NO_CARY, DRLI(0,0), DRLI(0,0), NO_CARY,
HEALING, A_NEUTRAL, PM_HEALER, NON_PM ), HEALING, A_NEUTRAL, PM_HEALER, NON_PM, 5000L ),
A("The Magic Mirror of Merlin", MIRROR, A("The Magic Mirror of Merlin", MIRROR,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), SPFX_ESP, 0, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), SPFX_ESP, 0,
NO_ATTK, NO_DFNS, CARY(AD_MAGM), NO_ATTK, NO_DFNS, CARY(AD_MAGM),
0, A_LAWFUL, PM_KNIGHT, NON_PM ), 0, A_LAWFUL, PM_KNIGHT, NON_PM, 1500L ),
A("The Eyes of the Overworld", LENSES, A("The Eyes of the Overworld", LENSES,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_XRAY), 0, 0, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_XRAY), 0, 0,
NO_ATTK, NO_DFNS, CARY(AD_MAGM), NO_ATTK, NO_DFNS, CARY(AD_MAGM),
ENLIGHTENING, A_NEUTRAL, PM_MONK, NON_PM ), ENLIGHTENING, A_NEUTRAL, PM_MONK, NON_PM, 2500L ),
A("The Mitre of Holiness", HELM_OF_BRILLIANCE, A("The Mitre of Holiness", HELM_OF_BRILLIANCE,
(SPFX_NOGEN|SPFX_RESTR|SPFX_DFLAG2|SPFX_INTEL), 0, M2_UNDEAD, (SPFX_NOGEN|SPFX_RESTR|SPFX_DFLAG2|SPFX_INTEL), 0, M2_UNDEAD,
NO_ATTK, NO_DFNS, CARY(AD_FIRE), NO_ATTK, NO_DFNS, CARY(AD_FIRE),
ENERGY_BOOST, A_LAWFUL, PM_PRIEST, NON_PM ), ENERGY_BOOST, A_LAWFUL, PM_PRIEST, NON_PM, 2000L ),
A("The Longbow of Diana", BOW, A("The Longbow of Diana", BOW,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_REFLECT), SPFX_ESP, 0, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_REFLECT), SPFX_ESP, 0,
PHYS(5,0), NO_DFNS, NO_CARY, PHYS(5,0), NO_DFNS, NO_CARY,
CREATE_AMMO, A_CHAOTIC, PM_RANGER, NON_PM ), CREATE_AMMO, A_CHAOTIC, PM_RANGER, NON_PM, 8000L ),
A("The Master Key of Thievery", SKELETON_KEY, A("The Master Key of Thievery", SKELETON_KEY,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK),
(SPFX_WARN|SPFX_TCTRL|SPFX_HPHDAM), 0, (SPFX_WARN|SPFX_TCTRL|SPFX_HPHDAM), 0,
NO_ATTK, NO_DFNS, NO_CARY, NO_ATTK, NO_DFNS, NO_CARY,
UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM ), UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM, 7000L ),
A("The Tsurugi of Muramasa", TSURUGI, A("The Tsurugi of Muramasa", TSURUGI,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_BEHEAD|SPFX_LUCK), 0, 0, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_BEHEAD|SPFX_LUCK), 0, 0,
PHYS(0,8), NO_DFNS, NO_CARY, PHYS(0,8), NO_DFNS, NO_CARY,
0, A_LAWFUL, PM_SAMURAI, NON_PM ), 0, A_LAWFUL, PM_SAMURAI, NON_PM, 4000L ),
#ifdef TOURIST #ifdef TOURIST
A("The Platinum Yendorian Express Card", CREDIT_CARD, A("The Platinum Yendorian Express Card", CREDIT_CARD,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DEFN), (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DEFN),
(SPFX_ESP|SPFX_HSPDAM), 0, (SPFX_ESP|SPFX_HSPDAM), 0,
NO_ATTK, NO_DFNS, CARY(AD_MAGM), NO_ATTK, NO_DFNS, CARY(AD_MAGM),
CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM ), CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM, 7000L ),
#endif #endif
A("The Orb of Fate", CRYSTAL_BALL, A("The Orb of Fate", CRYSTAL_BALL,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_LUCK), (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_LUCK),
(SPFX_WARN|SPFX_HSPDAM|SPFX_HPHDAM), 0, (SPFX_WARN|SPFX_HSPDAM|SPFX_HPHDAM), 0,
NO_ATTK, NO_DFNS, NO_CARY, NO_ATTK, NO_DFNS, NO_CARY,
LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM ), LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM, 2500L ),
A("The Eye of the Aethiopica", AMULET_OF_ESP, A("The Eye of the Aethiopica", AMULET_OF_ESP,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_EREGEN|SPFX_HSPDAM), 0, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_EREGEN|SPFX_HSPDAM), 0,
NO_ATTK, NO_DFNS, CARY(AD_MAGM), NO_ATTK, NO_DFNS, CARY(AD_MAGM),
CREATE_PORTAL, A_NEUTRAL, PM_WIZARD, NON_PM ), CREATE_PORTAL, A_NEUTRAL, PM_WIZARD, NON_PM, 4000L ),
/* /*
* terminator; otyp must be zero * terminator; otyp must be zero
*/ */
A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ) A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 0L )
}; /* artilist[] (or artifact_names[]) */ }; /* artilist[] (or artifact_names[]) */
+1
View File
@@ -79,6 +79,7 @@ E void FDECL(arti_speak, (struct obj *));
E boolean FDECL(artifact_light, (struct obj *)); E boolean FDECL(artifact_light, (struct obj *));
E long FDECL(spec_m2, (struct obj *)); E long FDECL(spec_m2, (struct obj *));
E boolean FDECL(artifact_has_invprop, (struct obj *,UCHAR_P)); E boolean FDECL(artifact_has_invprop, (struct obj *,UCHAR_P));
E long FDECL(arti_cost, (struct obj *));
/* ### attrib.c ### */ /* ### attrib.c ### */
+13
View File
@@ -1342,6 +1342,19 @@ uchar inv_prop;
return((boolean)(arti && (arti->inv_prop == inv_prop))); return((boolean)(arti && (arti->inv_prop == inv_prop)));
} }
/* Return the price sold to the hero of a given artifact or unique item */
long
arti_cost(otmp)
struct obj *otmp;
{
if (!otmp->oartifact)
return ((long)objects[otmp->otyp].oc_cost);
else if (artilist[otmp->oartifact].cost)
return (artilist[otmp->oartifact].cost);
else
return (100L * (long)objects[otmp->otyp].oc_cost);
}
#endif /* OVLB */ #endif /* OVLB */
/*artifact.c*/ /*artifact.c*/
+3 -4
View File
@@ -469,8 +469,7 @@ struct obj *list;
otmp->otyp == BELL_OF_OPENING || otmp->otyp == BELL_OF_OPENING ||
otmp->otyp == SPE_BOOK_OF_THE_DEAD || otmp->otyp == SPE_BOOK_OF_THE_DEAD ||
otmp->otyp == CANDELABRUM_OF_INVOCATION) { otmp->otyp == CANDELABRUM_OF_INVOCATION) {
/* shopkeepers charge 100x; 250x is arbitrary */ u.urexp += (arti_cost(otmp) * 5 / 2);
u.urexp += 250L * (long)objects[otmp->otyp].oc_cost;
if (Has_contents(otmp)) if (Has_contents(otmp))
add_artifact_score(otmp->cobj); add_artifact_score(otmp->cobj);
} }
@@ -498,8 +497,8 @@ winid endwin;
Sprintf(pbuf, "%s (worth %ld %s and %ld points)", Sprintf(pbuf, "%s (worth %ld %s and %ld points)",
otmp->oartifact ? artifact_name(xname(otmp), &dummy) : otmp->oartifact ? artifact_name(xname(otmp), &dummy) :
OBJ_NAME(objects[otmp->otyp]), OBJ_NAME(objects[otmp->otyp]),
100L * (long)objects[otmp->otyp].oc_cost, currency(2L), arti_cost(otmp), currency(2L),
250L * (long)objects[otmp->otyp].oc_cost); arti_cost(otmp) * 5 / 2);
putstr(endwin, 0, pbuf); putstr(endwin, 0, pbuf);
} }
if (Has_contents(otmp)) if (Has_contents(otmp))
+4 -4
View File
@@ -553,7 +553,7 @@ OBJECT(OBJ("cheap plastic imitation of the Amulet of Yendor",
AMULET_CLASS, 0, 0, 20, 0, 0, 0, 0, 0, 1, HI_METAL), AMULET_CLASS, 0, 0, 20, 0, 0, 0, 0, 0, 1, HI_METAL),
OBJECT(OBJ("Amulet of Yendor", /* note: description == name */ OBJECT(OBJ("Amulet of Yendor", /* note: description == name */
"Amulet of Yendor"), BITS(0,0,1,0,1,0,1,1,0,0,0,0,MITHRIL), 0, "Amulet of Yendor"), BITS(0,0,1,0,1,0,1,1,0,0,0,0,MITHRIL), 0,
AMULET_CLASS, 0, 0, 20, 3500, 0, 0, 0, 0, 20, HI_METAL), AMULET_CLASS, 0, 0, 20, 30000, 0, 0, 0, 0, 20, HI_METAL),
#undef AMULET #undef AMULET
/* tools ... */ /* tools ... */
@@ -653,10 +653,10 @@ WEPTOOL("unicorn horn", (char *)0,
/* two special unique artifact "tools" */ /* two special unique artifact "tools" */
OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"), OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"),
BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,GOLD), 0, BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,GOLD), 0,
TOOL_CLASS, 0, 0,10, 3000, 0, 0, 0, 0, 200, HI_GOLD), TOOL_CLASS, 0, 0,10, 5000, 0, 0, 0, 0, 200, HI_GOLD),
OBJECT(OBJ("Bell of Opening", "silver bell"), OBJECT(OBJ("Bell of Opening", "silver bell"),
BITS(0,0,1,0,1,1,1,1,0,0,0,P_NONE,SILVER), 0, BITS(0,0,1,0,1,1,1,1,0,0,0,P_NONE,SILVER), 0,
TOOL_CLASS, 0, 0,10, 1000, 0, 0, 0, 0, 50, HI_SILVER), TOOL_CLASS, 0, 0,10, 5000, 0, 0, 0, 0, 50, HI_SILVER),
#undef TOOL #undef TOOL
#undef WEPTOOL #undef WEPTOOL
@@ -835,7 +835,7 @@ SPELL("freeze sphere", "hardcover", P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR
SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER), SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER),
/* a special, one of a kind, spellbook */ /* a special, one of a kind, spellbook */
OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0, OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0,
SPBOOK_CLASS, 0, 0,20, 3500, 0, 0, 0, 7, 20, HI_PAPER), SPBOOK_CLASS, 0, 0,20, 10000, 0, 0, 0, 7, 20, HI_PAPER),
#undef SPELL #undef SPELL
/* wands ... */ /* wands ... */
+4 -1
View File
@@ -2800,6 +2800,10 @@ boolean shk_buying;
{ {
register long tmp = (long) objects[obj->otyp].oc_cost; register long tmp = (long) objects[obj->otyp].oc_cost;
if (obj->oartifact) {
tmp = arti_cost(obj);
if (shk_buying) tmp /= 4;
}
switch(obj->oclass) { switch(obj->oclass) {
case FOOD_CLASS: case FOOD_CLASS:
/* simpler hunger check, (2-4)*cost */ /* simpler hunger check, (2-4)*cost */
@@ -2823,7 +2827,6 @@ boolean shk_buying;
tmp /= 2L; tmp /= 2L;
break; break;
} }
if (obj->oartifact) tmp *= 25L;
return tmp; return tmp;
} }