gold dragon and scales
Add two new monsters and two new objects: gold dragon baby gold dragon gold dragon scale mail set of gold dragon scales A couple of variants seem to have added these already, but this came off my ancient list of monsters to add and was done from scratch. It's a clone of silver dragon, but instead of having reflection and breathing cold, a gold dragon emits light and breathes fire; because of the latter it can be seen with infravision like a red dragon. Adult gold dragons are lawful as in the AD&D Monster Manual rather than chaotic as the wiki pages show for the variant versions. Worn gold dragon scales operate similar to wielded Sunsword: when blessed, radius is 3 (same as a lamp), if uncursed, radius is 2, and if cursed, radius is 1 (but functions as 2 when worn by the hero, otherwise there would be no tangible effect). Gold dragon scale mail gets an extra +1, making blessed gold DSM have a bigger radius than lamps. Embedded scales have radius 1 regardless of BUC state; light for that case comes from the gold dragon monster form the hero is in. When not worn, gold scales and scale-mail don't emit any light. The tiles use a mix of yellow (for gold) and red. The two object tiles seem reasonable variations of the corresponding silver dragon ones. The two monster tiles definitely need work since the silver ones were mostly cyan and changing that to red did not produce very good result; subsequent attempt at a mixture was haphazard at best.
This commit is contained in:
@@ -456,7 +456,9 @@ polyself(int psflags)
|
||||
by_class:
|
||||
class = name_to_monclass(buf, &mntmp);
|
||||
if (class && mntmp == NON_PM)
|
||||
mntmp = mkclass_poly(class);
|
||||
mntmp = (draconian && class == S_DRAGON)
|
||||
? armor_to_dragon(uarm->otyp)
|
||||
: mkclass_poly(class);
|
||||
}
|
||||
if (mntmp < LOW_PM) {
|
||||
if (!class)
|
||||
@@ -514,24 +516,23 @@ polyself(int psflags)
|
||||
do_merge:
|
||||
mntmp = armor_to_dragon(uarm->otyp);
|
||||
if (!(g.mvitals[mntmp].mvflags & G_GENOD)) {
|
||||
unsigned was_lit = uarm->lamplit;
|
||||
int arm_light = artifact_light(uarm) ? arti_light_radius(uarm)
|
||||
: 0;
|
||||
|
||||
/* allow G_EXTINCT */
|
||||
if (Is_dragon_scales(uarm)) {
|
||||
/* dragon scales remain intact as uskin */
|
||||
You("merge with your scaly armor.");
|
||||
} else { /* dragon scale mail */
|
||||
/* d.scale mail first reverts to scales */
|
||||
char *p, *dsmail;
|
||||
|
||||
} else { /* dragon scale mail reverts to scales */
|
||||
/* similar to noarmor(invent.c),
|
||||
shorten to "<color> scale mail" */
|
||||
dsmail = strcpy(buf, simpleonames(uarm));
|
||||
if ((p = strstri(dsmail, " dragon ")) != 0)
|
||||
while ((p[1] = p[8]) != '\0')
|
||||
++p;
|
||||
/* tricky phrasing; dragon scale mail
|
||||
is singular, dragon scales are plural */
|
||||
Your("%s reverts to scales as you merge with them.",
|
||||
dsmail);
|
||||
Strcpy(buf, simpleonames(uarm));
|
||||
strsubst(buf, " dragon ", " ");
|
||||
/* tricky phrasing; dragon scale mail is singular, dragon
|
||||
scales are plural (note: we don't use "set of scales",
|
||||
which usually overrides the distinction, here) */
|
||||
Your("%s reverts to scales as you merge with them.", buf);
|
||||
/* uarm->spe enchantment remains unchanged;
|
||||
re-converting scales to mail poses risk
|
||||
of evaporation due to over enchanting */
|
||||
@@ -543,6 +544,8 @@ polyself(int psflags)
|
||||
uarm = (struct obj *) 0;
|
||||
/* save/restore hack */
|
||||
uskin->owornmask |= I_SPECIAL;
|
||||
if (was_lit)
|
||||
maybe_adjust_light(uskin, arm_light);
|
||||
update_inventory();
|
||||
}
|
||||
} else if (iswere) {
|
||||
@@ -554,9 +557,10 @@ polyself(int psflags)
|
||||
} else if (isvamp) {
|
||||
do_vampyr:
|
||||
if (mntmp < LOW_PM || (mons[mntmp].geno & G_UNIQ)) {
|
||||
mntmp = (g.youmonst.data == &mons[PM_VAMPIRE_LEADER] && !rn2(10))
|
||||
? PM_WOLF
|
||||
: !rn2(4) ? PM_FOG_CLOUD : PM_VAMPIRE_BAT;
|
||||
mntmp = (g.youmonst.data == &mons[PM_VAMPIRE_LEADER]
|
||||
&& !rn2(10)) ? PM_WOLF
|
||||
: !rn2(4) ? PM_FOG_CLOUD
|
||||
: PM_VAMPIRE_BAT;
|
||||
if (g.youmonst.cham >= LOW_PM
|
||||
&& !is_vampire(g.youmonst.data) && !rn2(2))
|
||||
mntmp = g.youmonst.cham;
|
||||
@@ -920,6 +924,11 @@ break_armor(void)
|
||||
if ((otmp = uarm) != 0) {
|
||||
if (donning(otmp))
|
||||
cancel_don();
|
||||
/* for gold DSM, we don't want Armor_gone() to report that it
|
||||
stops shining _after_ we've been told that it is destroyed */
|
||||
if (otmp->lamplit)
|
||||
end_burn(otmp, FALSE);
|
||||
|
||||
You("break out of your armor!");
|
||||
exercise(A_STR, FALSE);
|
||||
(void) Armor_gone();
|
||||
@@ -945,6 +954,10 @@ break_armor(void)
|
||||
if (donning(otmp))
|
||||
cancel_don();
|
||||
Your("armor falls around you!");
|
||||
/* [note: _gone() instead of _off() dates to when life-saving
|
||||
could force fire resisting armor back on if hero burned in
|
||||
hell (3.0, predating Gehennom); the armor isn't actually
|
||||
gone here but also isn't available to be put back on] */
|
||||
(void) Armor_gone();
|
||||
dropp(otmp);
|
||||
}
|
||||
@@ -1653,12 +1666,17 @@ void
|
||||
skinback(boolean silently)
|
||||
{
|
||||
if (uskin) {
|
||||
int old_light = arti_light_radius(uskin);
|
||||
|
||||
if (!silently)
|
||||
Your("skin returns to its original form.");
|
||||
uarm = uskin;
|
||||
uskin = (struct obj *) 0;
|
||||
/* undo save/restore hack */
|
||||
uarm->owornmask &= ~I_SPECIAL;
|
||||
|
||||
if (artifact_light(uarm))
|
||||
maybe_adjust_light(uarm, old_light);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1877,6 +1895,9 @@ armor_to_dragon(int atyp)
|
||||
case SILVER_DRAGON_SCALE_MAIL:
|
||||
case SILVER_DRAGON_SCALES:
|
||||
return PM_SILVER_DRAGON;
|
||||
case GOLD_DRAGON_SCALE_MAIL:
|
||||
case GOLD_DRAGON_SCALES:
|
||||
return PM_GOLD_DRAGON;
|
||||
#if 0 /* DEFERRED */
|
||||
case SHIMMERING_DRAGON_SCALE_MAIL:
|
||||
case SHIMMERING_DRAGON_SCALES:
|
||||
@@ -1904,7 +1925,7 @@ armor_to_dragon(int atyp)
|
||||
case YELLOW_DRAGON_SCALES:
|
||||
return PM_YELLOW_DRAGON;
|
||||
default:
|
||||
return -1;
|
||||
return NON_PM;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user