Skip to content

Commit

Permalink
New branch: Vecna's domain (part two) - artifacts, Kas (unique monster).
Browse files Browse the repository at this point in the history
Part two of the 'Vecna's domain' commits. This one adds two new
artifacts - The Eye of Vecna and The Sword of Kas. I've also added the
monster template for Kas (Vecna's top lieutenant) and tweaked Vecna
himself a bit. Here's the details:

* The Eye of Vecna - an extremely powerful artifact that can only be
obtained if Vecna is killed in a certain way (not implemented in this
commit). The base item is an eyeball (new food object). The Eye of Vecna
confers cold resistance, ESP, astral vision, and half spell damage when
carried. When invoked, it will greatly reduce the hit points of all
living creatures that the player can or could see. However, this comes
at a significant cost to the player's luck and alignment record each
time it is invoked. If invoked when the player's luck is extremely low,
the Eye will turn on the player, instantly killing them. The Eye of
Vecna can be eaten, but this is not recommended, as Bad Things will
happen to the one that eats it. It can also be sacrificed at an altar
for max value, but this then permanently destroys the artifact.
* The Sword of Kas - this is the great sword (two-handed sword) forged
by Vecna himself for his top lieutenant, Kas. I repurposed the Sword of
Bheleu for this... sad to see it go, but it's for a good cause. The
Sword of Kas has many of the same attributes: it's chaotic, is
permanently poisoned, confers stoning resistance when wielded, and does
extra damage to non-aligned monsters. The extras, most of which I pulled
from ad&d lore - the sword confers giant-like strength when wielded,
it's bloodthirsty (same as Stormbringer), and if used against Vecna,
will dish out triple the normal damage.
* Neither of these new artifacts can be wished for.
* Kas - the right-hand man of Vecna. Was legendary in batle, rumored to
always come out unscathed. Kas is actually a fairly powerful vampire,
second only to Vlad. Per legend, Kas betrayed Vecna and destroyed him,
producing the Eye and the Hand of Vecna. Perhaps the player can beat him
to it...

Next commit will be development of how the Eye of Vecna is obtained, as
well as gear outfitting for both Vecna and Kas.
  • Loading branch information
k21971 committed Mar 17, 2021
1 parent cefb95f commit f0d1352
Show file tree
Hide file tree
Showing 19 changed files with 741 additions and 572 deletions.
2 changes: 0 additions & 2 deletions dat/tower.des
Original file line number Diff line number Diff line change
Expand Up @@ -316,8 +316,6 @@ NON_PASSWALL:(00,00,51,15)
# Gravity is in full effect here
MAZE:"tower4",' '
FLAGS: noteleport,hardfloor,nommap,graveyard,shortsighted,solidify
#MESSAGE: "You enter an enormous rock cavern, the bottom of which you cannot see."
#MESSAGE: "Off in the distance, you can barely make out what appears to be a ladder dangling from a hole in the cavern ceiling."
GEOMETRY:center,center
# 1 2 3 4 5 6 7 7
#123456789012345678901234567890123456789012345678901234567890123456789012345
Expand Down
1 change: 1 addition & 0 deletions doc/evilhack-changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1468,4 +1468,5 @@ Version 0.7.0
Queen's realm
- New branch: Vecna's domain (part one)
- More verbose message when entering Vlad's cavern for the first time
- New branch: Vecna's domain (part two) - artifacts, Kas (unique monster)

3 changes: 2 additions & 1 deletion include/artifact.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ enum invoke_prop_types {
ENLIGHTENING,
CREATE_AMMO,
PHASING,
CHANNEL
CHANNEL,
DEATH_GAZE
};

#endif /* ARTIFACT_H */
22 changes: 16 additions & 6 deletions include/artilist.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,14 +203,16 @@ STATIC_OVL NEARDATA struct artifact artilist[] = {
ACID(5, 10), DFNS(AD_ACID), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM,
4000L, NO_COLOR),
/*
* The Sword of Bheleu - from 'The Lords of Dus' series by Lawrence Watt-Evans.
* If I were to add all of the powers and abilities this sword possesses from the book,
* it would be way over-powered. It will be a worthy two-handed sword to try to obtain however...
* The Sword of Kas - the sword forged by Vecna and given to his top
* lieutenant, Kas. This sword's specs have changed throughout ad&d
* editions, so we'll take some creative license here while trying to
* stay true to some of its abilities from ad&d.
*/
A("The Sword of Bheleu", TWO_HANDED_SWORD,
(SPFX_NOGEN | SPFX_RESTR | SPFX_ATTK | SPFX_INTEL | SPFX_DALIGN), 0, 0,
A("The Sword of Kas", TWO_HANDED_SWORD,
(SPFX_NOGEN | SPFX_RESTR | SPFX_ATTK | SPFX_DEFN | SPFX_INTEL
| SPFX_DALIGN), 0, 0,
DRST(10, 0), DFNS(AD_STON), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM,
12000L, NO_COLOR),
15000L, NO_COLOR),
/* Thought the Oracle just knew everything on her own? Guess again. Should
* anyone ever be foolhardy enough to take on the Oracle and succeed,
* they might discover the true source of her knowledge.
Expand Down Expand Up @@ -263,6 +265,14 @@ STATIC_OVL NEARDATA struct artifact artilist[] = {
(SPFX_NOGEN | SPFX_RESTR | SPFX_ATTK | SPFX_INTEL),
SPFX_EXCLUDE, 0, DETH(5, 6), NO_DFNS, NO_CARY, 0, A_CHAOTIC,
NON_PM, NON_PM, 10000L, CLR_BLACK),
/* The Eye of Vecna, which can only be obtained by decapitating
Vecna, removing his head from his body as he is destroyed before
the rest of his body crumbles to dust */
A("The Eye of Vecna", EYEBALL,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL),
(SPFX_XRAY | SPFX_ESP | SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS,
CARY(AD_COLD), DEATH_GAZE, A_NONE, NON_PM, NON_PM,
50000L, NO_COLOR),

/*
* The artifacts for the quest dungeon, all self-willed.
Expand Down
5 changes: 3 additions & 2 deletions include/obj.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ struct obj {
(otmp->oartifact == ART_STORMBRINGER || otmp->oartifact == ART_GRIMTOOTH \
|| otmp->oartifact == ART_ORCRIST || otmp->oartifact == ART_STING \
|| otmp->oartifact == ART_LIFESTEALER || otmp->oartifact == ART_DIRGE \
|| otmp->oartifact == ART_SWORD_OF_BHELEU || otmp->oartifact == ART_LONGBOW_OF_DIANA \
|| otmp->oartifact == ART_SWORD_OF_KAS || otmp->oartifact == ART_LONGBOW_OF_DIANA \
|| otmp->oartifact == ART_MASTER_KEY_OF_THIEVERY || otmp->oartifact == ART_RING_OF_P_HUL \
|| otmp->oartifact == ART_LUCK_BLADE || otmp->oartifact == ART_IRON_BALL_OF_LIBERATION \
|| otmp->oartifact == ART_CROSSBOW_OF_CARL || otmp->oartifact == ART_SECESPITA \
Expand All @@ -224,7 +224,8 @@ struct obj {
#define non_wishable_artifact(otmp) \
(otmp->oartifact == ART_MAGIC___BALL || otmp->oartifact == ART_LIFESTEALER \
|| otmp->oartifact == ART_BAG_OF_THE_HESPERIDES || otmp->oartifact == ART_BUTCHER \
|| otmp->oartifact == ART_WAND_OF_ORCUS)
|| otmp->oartifact == ART_WAND_OF_ORCUS || otmp->oartifact == ART_EYE_OF_VECNA \
|| otmp->oartifact == ART_SWORD_OF_KAS)

#define is_magical_staff(otmp) \
(otmp->otyp == STAFF_OF_DIVINATION || otmp->otyp == STAFF_OF_HEALING \
Expand Down
35 changes: 34 additions & 1 deletion src/artifact.c
Original file line number Diff line number Diff line change
Expand Up @@ -1916,7 +1916,7 @@ int dieroll; /* needed for Magicbane and vorpal blades */
/* Sixth basic attack - poison */
if (attacks(AD_DRST, otmp)) {
if (realizes_damage) {
if (otmp->oartifact == ART_SWORD_OF_BHELEU) {
if (otmp->oartifact == ART_SWORD_OF_KAS) {
if (!youattack && magr && cansee(magr->mx, magr->my)) {
if (!spec_dbon_applies) {
if (!youdefend)
Expand Down Expand Up @@ -2431,6 +2431,8 @@ arti_invoke(obj)
struct obj *obj;
{
register const struct artifact *oart = get_artifact(obj);
register struct monst *mtmp;

if (!obj) {
impossible("arti_invoke without obj");
return 0;
Expand Down Expand Up @@ -2731,6 +2733,37 @@ struct obj *obj;
use_figurine(&obj);
}
break;
case DEATH_GAZE:
if (u.uluck < -9) {
pline("%s turns on you!", The(xname(obj)));
u.uhp = 0;
killer.format = KILLED_BY;
Strcpy(killer.name, "the Eye of Vecna");
done(DIED);
} else {
pline("%s looks around with its icy gaze!",
The(xname(obj)));
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
if (DEADMONSTER(mtmp))
continue;
/* The eye is never blind ... */
if (couldsee(mtmp->mx, mtmp->my)
&& !nonliving(mtmp->data)) {
if (!Deaf)
pline("%s screams in agony!", Monnam(mtmp));
else if (cansee(mtmp->mx, mtmp->my))
pline("%s trembles in agony!", Monnam(mtmp));
mtmp->mhp /= 3;
if (mtmp->mhp < 1)
mtmp->mhp = 1;
}
}
}
/* Use at your own risk... */
adjalign(-3);
u.uluck -= 3;
exercise(A_WIS, FALSE);
break;
}
} else {
long eprop = (u.uprops[oart->inv_prop].extrinsic ^= W_ARTI),
Expand Down
6 changes: 4 additions & 2 deletions src/attrib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1153,7 +1153,8 @@ int x;

if (x == A_STR) {
if (tmp >= 125 || (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER)
|| wielding_artifact(ART_GIANTSLAYER))
|| wielding_artifact(ART_GIANTSLAYER)
|| wielding_artifact(ART_SWORD_OF_KAS))
return (schar) 125;
else
#ifdef WIN32_BUG
Expand Down Expand Up @@ -1222,7 +1223,8 @@ int attrindx;
hilimit = STR19(25); /* 125 */
/* lower limit for Str can also be 25 */
if ((uarmg && uarmg->otyp == GAUNTLETS_OF_POWER)
|| wielding_artifact(ART_GIANTSLAYER))
|| wielding_artifact(ART_GIANTSLAYER)
|| wielding_artifact(ART_SWORD_OF_KAS))
lolimit = hilimit;
} else if (attrindx == A_CON) {
if (wielding_artifact(ART_OGRESMASHER))
Expand Down
10 changes: 8 additions & 2 deletions src/bones.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,11 +375,12 @@ struct obj *obj;
break;
case ART_BAG_OF_THE_HESPERIDES:
case ART_LIFESTEALER:
case ART_EYE_OF_VECNA:
case ART_SWORD_OF_KAS:
default:
return FALSE;
break;
}

return (Lcheck(&u.uz, lair));
}

Expand All @@ -406,6 +407,12 @@ struct obj *obj;
case ART_WAND_OF_ORCUS:
owner = PM_ORCUS;
break;
case ART_EYE_OF_VECNA:
owner = PM_VECNA;
break;
case ART_SWORD_OF_KAS:
owner = PM_KAS;
break;
default:
break;
}
Expand All @@ -416,7 +423,6 @@ struct obj *obj;
return mtmp;
}
}

return (struct monst *) 0;
}

Expand Down
4 changes: 4 additions & 0 deletions src/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2250,6 +2250,10 @@ int mode, final, attrindx;
hide_innate_value = TRUE;
if (u.twoweap && uswapwep->oartifact == ART_GIANTSLAYER && uswapwep->cursed)
hide_innate_value = TRUE;
if (uwep && uwep->oartifact == ART_SWORD_OF_KAS && uwep->cursed)
hide_innate_value = TRUE;
if (u.twoweap && uswapwep->oartifact == ART_SWORD_OF_KAS && uswapwep->cursed)
hide_innate_value = TRUE;
break;
case A_DEX:
break;
Expand Down
2 changes: 1 addition & 1 deletion src/do_name.c
Original file line number Diff line number Diff line change
Expand Up @@ -1385,7 +1385,7 @@ const char *name;
set_material(obj, METAL);
break;
case ART_SUNSWORD:
case ART_SWORD_OF_BHELEU:
case ART_SWORD_OF_KAS:
case ART_RING_OF_P_HUL:
case ART_WAND_OF_ORCUS:
set_material(obj, GEMSTONE);
Expand Down
16 changes: 15 additions & 1 deletion src/eat.c
Original file line number Diff line number Diff line change
Expand Up @@ -2398,9 +2398,23 @@ struct obj *otmp;
case FORTUNE_COOKIE:
outrumor(bcsign(otmp), BY_COOKIE);
if (!Blind)
if(!u.uconduct.literate++)
if (!u.uconduct.literate++)
livelog_write_string(LL_CONDUCT, "became literate by reading the fortune inside a cookie");
break;
case EYEBALL:
if (!otmp->oartifact)
break;
You("feel a burning deep inside your %s!", body_part(STOMACH));
if (otmp->cursed)
u.uhp -= rn1(150, 250);
else
u.uhp -= rn1(50, 150);
if (u.uhp <= 0) {
killer.format = KILLED_BY;
Strcpy(killer.name, "eating the Eye of Vecna");
done(DIED);
}
break;
case LUMP_OF_ROYAL_JELLY:
/* This stuff seems to be VERY healthy! */
gainstr(otmp, 1, TRUE);
Expand Down
19 changes: 15 additions & 4 deletions src/monst.c
Original file line number Diff line number Diff line change
Expand Up @@ -2062,18 +2062,18 @@ struct permonst _mons2[] = {
M2_HOSTILE | M2_MAGIC, M3_WANTSBOOK | M3_INFRAVISION,
0, MH_UNDEAD, 29, HI_LORD),
MON("Vecna", S_LICH, LVL(99, 12, -10, 90, -20),
(G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
(G_NOGEN | G_NOCORPSE | G_UNIQ),
A(ATTK(AT_TUCH, AD_COLD, 8, 6), ATTK(AT_TUCH, AD_WTHR, 6, 6),
ATTK(AT_MAGC, AD_SPEL, 4, 6), ATTK(AT_MAGC, AD_CLRC, 4, 6),
NO_ATTK, NO_ATTK),
ATTK(AT_GAZE, AD_STUN, 3, 4), ATTK(AT_MAGC, AD_SPEL, 4, 6),
ATTK(AT_MAGC, AD_CLRC, 4, 6), NO_ATTK),
SIZ(1200, 100, MS_CUSS, MZ_HUMAN),
MR_FIRE | MR_COLD | MR_SLEEP | MR_ELEC | MR_POISON, MR_FIRE | MR_COLD,
M1_FLY | M1_SEE_INVIS | M1_BREATHLESS | M1_HUMANOID
| M1_POIS | M1_REGEN,
M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG
| M2_MAGIC | M2_NASTY | M2_PRINCE | M2_MALE,
M3_WANTSBOOK | M3_WAITFORU | M3_INFRAVISION,
0, MH_UNDEAD, 50, CLR_BRIGHT_MAGENTA),
0, MH_UNDEAD, 50, CLR_BLACK),
/*
* Mummies
*/
Expand Down Expand Up @@ -2454,6 +2454,17 @@ struct permonst _mons2[] = {
M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD
| M2_MALE | M2_MAGIC | M2_SHAPESHIFTER,
M3_INFRAVISIBLE, M4_VULNERABLE_FIRE, MH_UNDEAD, 26, HI_ZAP),
/* Kas, top lieutenant to Vecna */
MON("Kas", S_VAMPIRE, LVL(26, 16, -5, 70, -10),
(G_NOGEN | G_NOCORPSE | G_UNIQ),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
ATTK(AT_BITE, AD_DRLI, 1, 12), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG
| M2_NASTY | M2_PRINCE | M2_SHAPESHIFTER,
M3_ACCURATE | M3_WAITFORU | M3_INFRAVISIBLE,
M4_VULNERABLE_FIRE, MH_UNDEAD, 30, CLR_BLACK),
/* The DevTeam buffed Vlad quite a bit. No need to pull any settings over
* from GruntHack. We do have an attack tweak here from SporkHack, plus
* Vlad will wield and use Lifestealer.
Expand Down
2 changes: 2 additions & 0 deletions src/objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,8 @@ OBJECT(OBJ("Bell of Opening", "engraved silver bell"),
/* meat */
FOOD("tripe ration", 140, 2, 10, 0, FLESH, 200, CLR_BROWN),
FOOD("corpse", 0, 1, 0, 0, FLESH, 0, CLR_BROWN),
/* body parts (currently only for base object: the Eye of Vecna) */
FOOD("eyeball", 0, 1, 1, 0, FLESH, 5, CLR_WHITE),
FOOD("egg", 85, 1, 1, 1, FLESH, 80, CLR_WHITE),
FOOD("meatball", 0, 1, 1, 0, FLESH, 5, CLR_BROWN),
FOOD("meat stick", 0, 1, 1, 0, FLESH, 5, CLR_BROWN),
Expand Down
Loading

0 comments on commit f0d1352

Please sign in to comment.