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:
@@ -47,6 +47,7 @@ struct artifact {
|
||||
aligntyp alignment; /* alignment of bequeathing gods */
|
||||
short role; /* character role 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 */
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
#ifdef MAKEDEFS_C
|
||||
/* 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[] = {
|
||||
#else
|
||||
/* in artifact.c, set up the actual artifact list structure */
|
||||
|
||||
#define A(nam,typ,s1,s2,mt,atk,dfn,cry,inv,al,cl, rac) \
|
||||
{ typ, nam, 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, cost }
|
||||
|
||||
#define NO_ATTK {0,0,0,0} /* no attack */
|
||||
#define NO_DFNS {0,0,0,0} /* no defense */
|
||||
@@ -29,41 +29,48 @@ static const char *artifact_names[] = {
|
||||
STATIC_OVL NEARDATA struct artifact artilist[] = {
|
||||
#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 */
|
||||
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,
|
||||
(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,
|
||||
* providing 8 more.
|
||||
*/
|
||||
A("Stormbringer", RUNESWORD,
|
||||
(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
|
||||
* if the wielder is a Valkyrie wearing Gauntlets of Power.
|
||||
*/
|
||||
A("Mjollnir", WAR_HAMMER, /* Mjo:llnir */
|
||||
(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,
|
||||
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,
|
||||
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.
|
||||
*/
|
||||
A("Orcrist", ELVEN_BROADSWORD,
|
||||
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
|
||||
@@ -73,50 +80,50 @@ A("Orcrist", ELVEN_BROADSWORD,
|
||||
*/
|
||||
A("Sting", ELVEN_DAGGER,
|
||||
(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
|
||||
* unbalances victims in addition to doing some damage.
|
||||
*/
|
||||
A("Magicbane", ATHAME,
|
||||
(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,
|
||||
(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,
|
||||
(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,
|
||||
(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,
|
||||
(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,
|
||||
(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,
|
||||
(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,
|
||||
(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,
|
||||
(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,
|
||||
(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,
|
||||
* 2) doesn't give unusual message for 2-headed monsters (but
|
||||
@@ -124,7 +131,7 @@ A("Trollsbane", MORNING_STAR,
|
||||
*/
|
||||
A("Vorpal Blade", LONG_SWORD,
|
||||
(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,
|
||||
* or the shriek that shrieked he,
|
||||
@@ -135,11 +142,11 @@ A("Vorpal Blade", LONG_SWORD,
|
||||
*/
|
||||
A("Snickersnee", KATANA,
|
||||
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,
|
||||
(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.
|
||||
@@ -148,86 +155,86 @@ A("Sunsword", LONG_SWORD,
|
||||
A("The Orb of Detection", CRYSTAL_BALL,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_ESP|SPFX_HSPDAM), 0,
|
||||
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,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), SPFX_STLTH, 0,
|
||||
/* this stone does double damage if used as a projectile weapon */
|
||||
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,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DALIGN), 0, 0,
|
||||
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 */
|
||||
A("The Palantir of Westernesse", CRYSTAL_BALL,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL),
|
||||
(SPFX_ESP|SPFX_REGEN|SPFX_HSPDAM), 0,
|
||||
NO_ATTK, NO_DFNS, NO_CARY,
|
||||
TAMING, A_CHAOTIC, NON_PM , PM_ELF),
|
||||
TAMING, A_CHAOTIC, NON_PM , PM_ELF, 8000L ),
|
||||
#endif
|
||||
|
||||
A("The Staff of Aesculapius", QUARTERSTAFF,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_ATTK|SPFX_INTEL|SPFX_DRLI|SPFX_REGEN), 0,0,
|
||||
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,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), SPFX_ESP, 0,
|
||||
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,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_XRAY), 0, 0,
|
||||
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,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_DFLAG2|SPFX_INTEL), 0, M2_UNDEAD,
|
||||
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,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_REFLECT), SPFX_ESP, 0,
|
||||
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,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK),
|
||||
(SPFX_WARN|SPFX_TCTRL|SPFX_HPHDAM), 0,
|
||||
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,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_BEHEAD|SPFX_LUCK), 0, 0,
|
||||
PHYS(0,8), NO_DFNS, NO_CARY,
|
||||
0, A_LAWFUL, PM_SAMURAI, NON_PM ),
|
||||
0, A_LAWFUL, PM_SAMURAI, NON_PM, 4000L ),
|
||||
|
||||
#ifdef TOURIST
|
||||
A("The Platinum Yendorian Express Card", CREDIT_CARD,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_DEFN),
|
||||
(SPFX_ESP|SPFX_HSPDAM), 0,
|
||||
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
|
||||
|
||||
A("The Orb of Fate", CRYSTAL_BALL,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_LUCK),
|
||||
(SPFX_WARN|SPFX_HSPDAM|SPFX_HPHDAM), 0,
|
||||
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,
|
||||
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_EREGEN|SPFX_HSPDAM), 0,
|
||||
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
|
||||
*/
|
||||
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[]) */
|
||||
|
||||
|
||||
@@ -79,6 +79,7 @@ E void FDECL(arti_speak, (struct obj *));
|
||||
E boolean FDECL(artifact_light, (struct obj *));
|
||||
E long FDECL(spec_m2, (struct obj *));
|
||||
E boolean FDECL(artifact_has_invprop, (struct obj *,UCHAR_P));
|
||||
E long FDECL(arti_cost, (struct obj *));
|
||||
|
||||
/* ### attrib.c ### */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user