diff -cr nethack-3.3.1\include\artifact.h nethack-patched\include\artifact.h *** nethack-3.3.1\include\artifact.h Thu Dec 30 07:40:50 1999 --- nethack-patched\include\artifact.h Tue Sep 12 15:54:15 2000 *************** *** 47,52 **** --- 47,53 ---- aligntyp alignment; /* alignment of bequeathing gods */ short role; /* character role associated with */ short race; /* character race associated with */ + short level; /* 'Level' of artifact */ }; /* invoked properties with special powers */ diff -cr nethack-3.3.1\include\artilist.h nethack-patched\include\artilist.h *** nethack-3.3.1\include\artilist.h Sat Jul 22 11:31:21 2000 --- nethack-patched\include\artilist.h Thu Sep 14 11:20:04 2000 *************** *** 5,18 **** #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 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 NO_ATTK {0,0,0,0} /* no attack */ #define NO_DFNS {0,0,0,0} /* no defense */ --- 5,18 ---- #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,lev) 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, lev) \ ! { typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, lev } #define NO_ATTK {0,0,0,0} /* no attack */ #define NO_DFNS {0,0,0,0} /* no defense */ *************** *** 26,69 **** #define ELEC(a,b) {0,AD_ELEC,a,b} /* electrical shock */ #define STUN(a,b) {0,AD_STUN,a,b} /* magical attack */ STATIC_OVL NEARDATA struct artifact artilist[] = { #endif /* MAKEDEFS_C */ /* 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 ), 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 ), /* * 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 ), /* * 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 ), A("Cleaver", BATTLE_AXE, SPFX_RESTR, 0, 0, ! PHYS(3,6), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_BARBARIAN, NON_PM ), A("Grimtooth", ORCISH_DAGGER, SPFX_RESTR, 0, 0, ! PHYS(2,6), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC ), /* * 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 ), /* * The combination of SPFX_WARN and M2_something on an artifact --- 26,86 ---- #define ELEC(a,b) {0,AD_ELEC,a,b} /* electrical shock */ #define STUN(a,b) {0,AD_STUN,a,b} /* magical attack */ + #define LEVEL_1 1 + #define LEVEL_2 2 + #define LEVEL_3 3 + #define LEVEL_4 4 + #define LEVEL_CROWNING 5 + #define LEVEL_QUEST 0 + + #ifdef AARDVARK_ARTIFACTS + + #define EXCALIBUR_DAMAGE 5 + + #else + + #define EXCALIBUR_DAMAGE 10 + + #endif + STATIC_OVL NEARDATA struct artifact artilist[] = { #endif /* MAKEDEFS_C */ /* 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 ), A("Excalibur", LONG_SWORD, (SPFX_NOGEN|SPFX_RESTR|SPFX_SEEK|SPFX_DEFN|SPFX_INTEL|SPFX_SEARCH),0,0, ! PHYS(5,EXCALIBUR_DAMAGE), DRLI(0,0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM, LEVEL_CROWNING ), /* * 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, LEVEL_CROWNING ), /* * 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, LEVEL_3 ), A("Cleaver", BATTLE_AXE, SPFX_RESTR, 0, 0, ! PHYS(3,6), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_BARBARIAN, NON_PM, LEVEL_2 ), A("Grimtooth", ORCISH_DAGGER, SPFX_RESTR, 0, 0, ! PHYS(2,6), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, LEVEL_1 ), /* * 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, LEVEL_1 ), /* * The combination of SPFX_WARN and M2_something on an artifact *************** *** 73,122 **** */ 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 ), /* * 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 ), 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 ), 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 ), A("Dragonbane", BROADSWORD, (SPFX_RESTR|SPFX_DCLAS), 0, S_DRAGON, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ), 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 ), 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 ), A("Grayswandir", SILVER_SABER, (SPFX_RESTR|SPFX_HALRES), 0, 0, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM ), 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 ), 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 ), 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 ), /* * Two problems: 1) doesn't let trolls regenerate heads, * 2) doesn't give unusual message for 2-headed monsters (but --- 90,139 ---- */ 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, LEVEL_1 ), /* * 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, LEVEL_3 ), 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, LEVEL_4 ), 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, LEVEL_3 ), A("Dragonbane", BROADSWORD, (SPFX_RESTR|SPFX_DCLAS), 0, S_DRAGON, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, LEVEL_1 ), 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, LEVEL_2 ), 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, LEVEL_1 ), A("Grayswandir", SILVER_SABER, (SPFX_RESTR|SPFX_HALRES), 0, 0, ! PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, LEVEL_4 ), 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, LEVEL_1 ), 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, LEVEL_1 ), 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, LEVEL_1 ), /* * Two problems: 1) doesn't let trolls regenerate heads, * 2) doesn't give unusual message for 2-headed monsters (but *************** *** 124,130 **** */ 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 ), /* * Ah, never shall I forget the cry, * or the shriek that shrieked he, --- 141,147 ---- */ 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, LEVEL_CROWNING ), /* * Ah, never shall I forget the cry, * or the shriek that shrieked he, *************** *** 135,145 **** */ A("Snickersnee", KATANA, SPFX_RESTR, 0, 0, ! PHYS(0,8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM ), 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 ), /* * The artifacts for the quest dungeon, all self-willed. --- 152,162 ---- */ A("Snickersnee", KATANA, SPFX_RESTR, 0, 0, ! PHYS(0,8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM, LEVEL_2 ), 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, LEVEL_2 ), /* * The artifacts for the quest dungeon, all self-willed. *************** *** 148,232 **** 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 ), A("The Heart of Ahriman", LUCKSTONE, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), SPFX_STLTH, 0, NO_ATTK, NO_DFNS, NO_CARY, ! LEVITATION, A_NEUTRAL, PM_BARBARIAN, NON_PM ), 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 ), #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), #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 ), 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 ), 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 ), 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 ), 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 ), 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 ), 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 ), #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 ), #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 ), 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 ), /* * terminator; otyp must be zero */ ! A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM ) }; /* artilist[] (or artifact_names[]) */ --- 165,249 ---- 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, LEVEL_QUEST ), A("The Heart of Ahriman", LUCKSTONE, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), SPFX_STLTH, 0, NO_ATTK, NO_DFNS, NO_CARY, ! LEVITATION, A_NEUTRAL, PM_BARBARIAN, NON_PM, LEVEL_QUEST ), 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, LEVEL_QUEST ), #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, LEVEL_QUEST), #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, LEVEL_QUEST ), 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, LEVEL_QUEST ), 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, LEVEL_QUEST ), 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, LEVEL_QUEST ), 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, LEVEL_QUEST ), 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, LEVEL_QUEST ), 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, LEVEL_QUEST ), #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, LEVEL_QUEST ), #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, LEVEL_QUEST ), 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, LEVEL_QUEST ), /* * terminator; otyp must be zero */ ! A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 0 ) }; /* artilist[] (or artifact_names[]) */ diff -cr nethack-3.3.1\include\config.h nethack-patched\include\config.h *** nethack-3.3.1\include\config.h Fri Jul 21 18:13:51 2000 --- nethack-patched\include\config.h Tue Sep 12 16:02:12 2000 *************** *** 309,314 **** --- 309,315 ---- #define TOURIST /* Tourist players with cameras and Hawaiian shirts */ /* difficulty */ #define ELBERETH /* Engraving the E-word repels monsters */ + #define AARDVARK_ARTIFACTS /* Makes it more difficult to get high-level artifacts. */ /* I/O */ #define REDO /* support for redoing last command - DGK */ #if !defined(MAC) diff -cr nethack-3.3.1\include\extern.h nethack-patched\include\extern.h *** nethack-3.3.1\include\extern.h Wed Aug 09 08:46:17 2000 --- nethack-patched\include\extern.h Thu Sep 14 11:24:16 2000 *************** *** 54,60 **** E void FDECL(save_artifacts, (int)); E void FDECL(restore_artifacts, (int)); E const char *FDECL(artiname, (int)); ! E struct obj *FDECL(mk_artifact, (struct obj *,ALIGNTYP_P)); E const char *FDECL(artifact_name, (const char *,short *)); E boolean FDECL(exist_artifact, (int,const char *)); E void FDECL(artifact_exists, (struct obj *,const char *,BOOLEAN_P)); --- 54,60 ---- E void FDECL(save_artifacts, (int)); E void FDECL(restore_artifacts, (int)); E const char *FDECL(artiname, (int)); ! E struct obj *FDECL(mk_artifact, (struct obj *,ALIGNTYP_P,boolean)); E const char *FDECL(artifact_name, (const char *,short *)); E boolean FDECL(exist_artifact, (int,const char *)); E void FDECL(artifact_exists, (struct obj *,const char *,BOOLEAN_P)); diff -cr nethack-3.3.1\include\you.h nethack-patched\include\you.h *** nethack-3.3.1\include\you.h Sat Jul 15 08:08:29 2000 --- nethack-patched\include\you.h Tue Sep 12 16:35:05 2000 *************** *** 49,54 **** --- 49,57 ---- #ifdef ELBERETH Bitfield(uhand_of_elbereth,2); /* became Hand of Elbereth */ #endif + Bitfield(received_excalibur,2); /* Was crowned and recieved Excalibur as a gift. */ + /* 1 = crowned, but excalibur does not exist yet (is next gift) */ + /* 2 = crowned & excalibur gets its bonus. */ Bitfield(udemigod,1); /* killed the wiz */ Bitfield(ascended,1); /* has offered the Amulet */ }; diff -cr nethack-3.3.1\src\artifact.c nethack-patched\src\artifact.c *** nethack-3.3.1\src\artifact.c Sun Jul 23 08:00:15 2000 --- nethack-patched\src\artifact.c Thu Sep 14 11:23:50 2000 *************** *** 113,123 **** into an artifact of matching type, or returned as-is if that's not possible. For the 2nd case, caller should use ``obj = mk_artifact(obj, A_NONE);'' for the 1st, ``obj = mk_artifact((struct obj *)0, some_alignment);''. */ struct obj * ! mk_artifact(otmp, alignment) struct obj *otmp; /* existing object; ignored if alignment specified */ aligntyp alignment; /* target alignment, or A_NONE */ { const struct artifact *a; int n, m; --- 113,130 ---- into an artifact of matching type, or returned as-is if that's not possible. For the 2nd case, caller should use ``obj = mk_artifact(obj, A_NONE);'' for the 1st, ``obj = mk_artifact((struct obj *)0, some_alignment);''. + + Changes for aardvark artifacts patch: + If sacrificing, the maximum level for the artifact is u.ugifts; this can + be raised by 1 with high luck. The restriction that the first gift must + be coaligned has been lifted (since the beginning set is so limited + anyway.) */ struct obj * ! mk_artifact(otmp, alignment, sacflag) struct obj *otmp; /* existing object; ignored if alignment specified */ aligntyp alignment; /* target alignment, or A_NONE */ + boolean sacflag; /* This artifact is being created via sacrifice */ { const struct artifact *a; int n, m; *************** *** 125,137 **** short o_typ = (by_align || !otmp) ? 0 : otmp->otyp; boolean unique = !by_align && otmp && objects[o_typ].oc_unique; short eligible[NROFARTIFACTS]; /* gather eligible artifacts */ ! for (n = 0, a = artilist+1, m = 1; a->otyp; a++, m++) if ((!by_align ? a->otyp == o_typ : (a->alignment == alignment || ! (a->alignment == A_NONE && u.ugifts > 0))) && ! (!(a->spfx & SPFX_NOGEN) || unique) && !artiexist[m]) { if (by_align && a->race != NON_PM && race_hostile(&mons[a->race])) continue; /* skip enemies' equipment */ else if (by_align && Role_if(a->role)) --- 132,163 ---- short o_typ = (by_align || !otmp) ? 0 : otmp->otyp; boolean unique = !by_align && otmp && objects[o_typ].oc_unique; short eligible[NROFARTIFACTS]; + #ifdef AARDVARK_ARTIFACTS + short maxlevel; + maxlevel = u.ugifts + 1; + if(maxlevel > 3) maxlevel == 3; + if(rnl(5) < 2) maxlevel++; /* With high luck more artifacts are possible. */ + #endif /* gather eligible artifacts */ ! for (n = 0, a = artilist+1, m = 1; a->otyp; a++, m++) { ! #ifdef AARDVARK_ARTIFACTS ! if(sacflag && u.uevent.received_excalibur == 1 && ! a->level == LEVEL_CROWNING && ! a->alignment == alignment) ! goto make_artif; ! #endif if ((!by_align ? a->otyp == o_typ : (a->alignment == alignment || ! (a->alignment == A_NONE ! #ifndef AARDVARK_ARTIFACTS ! && u.ugifts > 0 ! #endif ! ))) && (!(a->spfx & SPFX_NOGEN) || unique) && !artiexist[m] ! #ifdef AARDVARK_ARTIFACTS ! && (a->level <= maxlevel || !sacflag) ! #endif ! ) { if (by_align && a->race != NON_PM && race_hostile(&mons[a->race])) continue; /* skip enemies' equipment */ else if (by_align && Role_if(a->role)) *************** *** 139,144 **** --- 165,171 ---- else eligible[n++] = m; } + } if (n) { /* found at least one candidate */ m = eligible[rn2(n)]; /* [0..n-1] */ *************** *** 712,717 **** --- 739,749 ---- /* since damage bonus didn't apply, nothing more to do */ return FALSE; } + + #ifdef AARDVARK_ARTIFACTS + if(spec_dbon_applies && otmp->oartifact == ART_EXCALIBUR && + u.uevent.received_excalibur == 2) *dmgptr += rnd(10); + #endif realizes_damage = (youdefend || vis); diff -cr nethack-3.3.1\src\mkobj.c nethack-patched\src\mkobj.c *** nethack-3.3.1\src\mkobj.c Fri Aug 04 16:39:04 2000 --- nethack-patched\src\mkobj.c Tue Sep 12 16:14:24 2000 *************** *** 407,413 **** otmp->opoisoned = 1; if (artif && !rn2(20)) ! otmp = mk_artifact(otmp, (aligntyp)A_NONE); break; case FOOD_CLASS: otmp->oeaten = 0; --- 407,413 ---- otmp->opoisoned = 1; if (artif && !rn2(20)) ! otmp = mk_artifact(otmp, (aligntyp)A_NONE, FALSE); break; case FOOD_CLASS: otmp->oeaten = 0; *************** *** 563,569 **** otmp->spe = rne(3); } else blessorcurse(otmp, 10); if (artif && !rn2(40)) ! otmp = mk_artifact(otmp, (aligntyp)A_NONE); /* simulate lacquered armor for samurai */ if (Role_if(PM_SAMURAI) && otmp->otyp == SPLINT_MAIL && (moves <= 1 || In_quest(&u.uz))) { --- 563,569 ---- otmp->spe = rne(3); } else blessorcurse(otmp, 10); if (artif && !rn2(40)) ! otmp = mk_artifact(otmp, (aligntyp)A_NONE, FALSE); /* simulate lacquered armor for samurai */ if (Role_if(PM_SAMURAI) && otmp->otyp == SPLINT_MAIL && (moves <= 1 || In_quest(&u.uz))) { *************** *** 621,627 **** } /* unique objects may have an associated artifact entry */ if (objects[otyp].oc_unique && !otmp->oartifact) ! otmp = mk_artifact(otmp, (aligntyp)A_NONE); otmp->owt = weight(otmp); return(otmp); } --- 621,627 ---- } /* unique objects may have an associated artifact entry */ if (objects[otyp].oc_unique && !otmp->oartifact) ! otmp = mk_artifact(otmp, (aligntyp)A_NONE, FALSE); otmp->owt = weight(otmp); return(otmp); } diff -cr nethack-3.3.1\src\mplayer.c nethack-patched\src\mplayer.c *** nethack-3.3.1\src\mplayer.c Sat Jul 15 18:46:47 2000 --- nethack-patched\src\mplayer.c Tue Sep 12 16:17:10 2000 *************** *** 229,235 **** if (!rn2(3)) otmp->oerodeproof = 1; else if (!rn2(2)) otmp->greased = 1; if (special && rn2(2)) ! otmp = mk_artifact(otmp, A_NONE); /* mplayers knew better than to overenchant Magicbane */ if (otmp->oartifact == ART_MAGICBANE) otmp->spe = rnd(4); --- 229,235 ---- if (!rn2(3)) otmp->oerodeproof = 1; else if (!rn2(2)) otmp->greased = 1; if (special && rn2(2)) ! otmp = mk_artifact(otmp, A_NONE, FALSE); /* mplayers knew better than to overenchant Magicbane */ if (otmp->oartifact == ART_MAGICBANE) otmp->spe = rnd(4); diff -cr nethack-3.3.1\src\objnam.c nethack-patched\src\objnam.c *** nethack-3.3.1\src\objnam.c Thu Aug 03 12:25:24 2000 --- nethack-patched\src\objnam.c Thu Sep 14 11:28:00 2000 *************** *** 4,9 **** --- 4,12 ---- #include "hack.h" + #include "artifact.h" + #include "artilist.h" + /* "an uncursed greased partly eaten guardian naga hatchling [corpse]" */ #define PREFIX 80 /* (56) */ #define SCHAR_LIM 127 *************** *** 1482,1487 **** --- 1485,1491 ---- char oclass; char *un, *dn, *actualn; const char *name=0; + struct artifact *oart; cnt = spe = spesgn = typ = very = rechrg = blessed = uncursed = iscursed = *************** *** 2362,2369 **** /* more wishing abuse: don't allow wishing for certain artifacts */ /* and make them pay; charge them for the wish anyway! */ if ((is_quest_artifact(otmp) || ! (otmp->oartifact && rn2(nartifact_exist()) > 1)) #ifdef WIZARD && !wizard #endif --- 2366,2388 ---- /* more wishing abuse: don't allow wishing for certain artifacts */ /* and make them pay; charge them for the wish anyway! */ + /* Aardvark Artifact patch: + * Wishing for artifacts is now further disouraged, based on their + * level: level 1 artifacts still have the base 100% chance, but + * it drops to 50% for level 4 artifacts. Crowning (level 5) + * artifacts are considered level 4 for this purpose, and quest + * (level 0) artifacts are considered level 2. */ + + oart = &artilist[otmp->oartifact]; + if ((is_quest_artifact(otmp) || ! (otmp->oartifact && rn2(nartifact_exist()) > 1 ! #ifdef AARDVARK_ARTIFACTS ! || rnd(8) < ((oart->level == LEVEL_CROWNING) ? ! LEVEL_4 : (oart->level == LEVEL_QUEST) ? ! LEVEL_2 : oart->level) ! #endif ! )) #ifdef WIZARD && !wizard #endif diff -cr nethack-3.3.1\src\pray.c nethack-patched\src\pray.c *** nethack-3.3.1\src\pray.c Mon Jul 03 18:39:25 2000 --- nethack-patched\src\pray.c Thu Sep 14 09:45:24 2000 *************** *** 717,726 **** --- 717,732 ---- switch(u.ualign.type) { case A_LAWFUL: u.uevent.uhand_of_elbereth = 1; + if(!exist_artifact(LONG_SWORD, artiname(ART_EXCALIBUR))) + u.uevent.received_excalibur = 1; + else + u.uevent.received_excalibur = 0; + verbalize("I crown thee... The Hand of Elbereth!"); if (obj && (obj->otyp == LONG_SWORD) && !obj->oartifact) { obj = oname(obj, artiname(ART_EXCALIBUR)); if (obj && obj->oartifact == ART_EXCALIBUR) u.ugifts++; + u.uevent.received_excalibur = 2; } /* acquire this skill regardless of weapon */ unrestrict_weapon_skill(P_LONG_SWORD); *************** *** 729,734 **** --- 735,741 ---- break; case A_NEUTRAL: u.uevent.uhand_of_elbereth = 2; + u.uevent.received_excalibur = 2; verbalize("Thou shalt be my Envoy of Balance!"); dropped_item = 0; if (uwep && uwep->oartifact == ART_VORPAL_BLADE) { *************** *** 771,776 **** --- 778,784 ---- break; case A_CHAOTIC: u.uevent.uhand_of_elbereth = 3; + u.uevent.received_excalibur = 2; in_hand = (uwep && uwep->oartifact == ART_STORMBRINGER); already_exists = exist_artifact(RUNESWORD, artiname(ART_STORMBRINGER)); *************** *** 1294,1301 **** /* you were already in pretty good standing */ /* The player can gain an artifact */ /* The chance goes down as the number of artifacts goes up */ ! if (u.ulevel > 2 && !rn2(10 + (2 * u.ugifts * nartifacts))) { ! otmp = mk_artifact((struct obj *)0, a_align(u.ux,u.uy)); if (otmp) { if (otmp->spe < 0) otmp->spe = 0; if (otmp->cursed) uncurse(otmp); --- 1302,1317 ---- /* you were already in pretty good standing */ /* The player can gain an artifact */ /* The chance goes down as the number of artifacts goes up */ ! if (u.ulevel > 2 && !rn2(10 + (2 * u.ugifts * nartifacts)) ! #ifdef AARDVARK_ARTIFACTS ! #ifdef ELBERETH ! && (!u.uevent.uhand_of_elbereth || ! (u.uevent.received_excalibur == 1 && ! !exist_artifact(LONG_SWORD, artiname(ART_EXCALIBUR)))) ! #endif ! #endif ! ) { ! otmp = mk_artifact((struct obj *)0, a_align(u.ux,u.uy), TRUE); if (otmp) { if (otmp->spe < 0) otmp->spe = 0; if (otmp->cursed) uncurse(otmp);