Skip to content

Commit

Permalink
crystal helmet
Browse files Browse the repository at this point in the history
Discussed a long time ago, change helm of brilliance from iron to
crystal so that it doesn't need to be a special case for metallic
armor's affect on spell casting.  It now has a fixed description of
"crystal helmet" but is not pre-discovered.

Add new helm of caution to retain the "etched helmet" description
among the shuffled helms.  Wearing it confers the Warning attribute.
That's fairly lame but not necessarily useless.  It's iron and gets
half the former probability for a random piece of armor being helm
of brilliance so is not likely to be popular.

Helm of caution keeps the old helm of brilliance tile and new helm
of brilliance is basically the same image with different color and
pointed on the top.

Not changed:  the etched helmet was marked as green and is drawn
that way for text but the tile doesn't actually use green for it.
Crystal helmet started as hi_glass (rendered as 'bright cyan') but
has been changed to clr_white to match crystal plate mail.

Old save and bones files are invalidated.
  • Loading branch information
PatR committed Apr 29, 2023
1 parent 90155cd commit f9a3513
Show file tree
Hide file tree
Showing 6 changed files with 432 additions and 398 deletions.
6 changes: 4 additions & 2 deletions doc/fixes3-7-0.txt
Expand Up @@ -1154,6 +1154,8 @@ warnings via impossible() would be unseen if message suppression via ESC at
wearing the Eyes of the Overworld overrides OPTIONS:blind; breaking the
always-blind conduct by doing that was intended but having permanent
blindness stay cured after removing them was not
change helm of brilliance from iron to crystal so that it no longer needs to
be a special case for metallic armor vs spell casting


Fixes to 3.7.0-x General Problems Exposed Via git Repository
Expand Down Expand Up @@ -1924,8 +1926,8 @@ boiling a pool or fountain now creates a temporary cloud of steam
random themed rooms in the dungeons of doom
extended achievement and conduct fields for xlogfile
record amount of gold in hero's possession in xlogfile
new objects: amulets of flying and guarding, gold dragon scale mail and
set of gold dragon scales
new objects: amulets of flying and guarding, helm of caution,
gold dragon scale mail and set of gold dragon scales
new monsters: displacer beast ('f') and genetic engineer ('Q'), gold dragon
and baby gold dragon (both 'D')
make camera flash which reveals previously unseen map features or objects or
Expand Down
15 changes: 11 additions & 4 deletions include/objects.h
Expand Up @@ -441,22 +441,29 @@ HELM("fedora", NoDes,
FEDORA),
HELM("cornuthaum", "conical hat",
0, 1, CLAIRVOYANT, 3, 1, 4, 80, 10, 1, CLOTH, CLR_BLUE,
CORNUTHAUM),
/* name coined by devteam; confers clairvoyance for wizards,
blocks clairvoyance if worn by role other than wizard */
CORNUTHAUM),
HELM("dunce cap", "conical hat",
0, 1, 0, 3, 1, 4, 1, 10, 0, CLOTH, CLR_BLUE,
/* sets Int and Wis to fixed value of 6, so actually provides
protection against death caused by Int being drained below 3 */
DUNCE_CAP),
HELM("dented pot", NoDes,
1, 0, 0, 2, 0, 10, 8, 9, 0, IRON, CLR_BLACK,
DENTED_POT),
HELM("helm of brilliance", "crystal helmet",
0, 1, 0, 3, 1, 40, 50, 9, 0, GLASS, CLR_WHITE,
/* used to be iron and shuffled as "etched helmet" but required
special case for the effect of iron armor on spell casting */
HELM_OF_BRILLIANCE),
/* with shuffled appearances... */
HELM("helmet", "plumed helmet",
0, 0, 0, 10, 1, 30, 10, 9, 0, IRON, HI_METAL,
HELMET),
HELM("helm of brilliance", "etched helmet",
0, 1, 0, 6, 1, 50, 50, 9, 0, IRON, CLR_GREEN,
HELM_OF_BRILLIANCE),
HELM("helm of caution", "etched helmet",
0, 1, WARNING, 3, 1, 50, 50, 9, 0, IRON, CLR_GREEN,
HELM_OF_CAUTION),
HELM("helm of opposite alignment", "crested helmet",
0, 1, 0, 6, 1, 50, 50, 9, 0, IRON, HI_METAL,
HELM_OF_OPPOSITE_ALIGNMENT),
Expand Down
2 changes: 1 addition & 1 deletion include/patchlevel.h
Expand Up @@ -17,7 +17,7 @@
* Incrementing EDITLEVEL can be used to force invalidation of old bones
* and save files.
*/
#define EDITLEVEL 83
#define EDITLEVEL 84

/*
* Development status possibilities.
Expand Down
8 changes: 6 additions & 2 deletions src/do_wear.c
Expand Up @@ -400,6 +400,9 @@ Helmet_on(void)
case ORCISH_HELM:
case HELM_OF_TELEPATHY:
break;
case HELM_OF_CAUTION:
see_monsters();
break;
case HELM_OF_BRILLIANCE:
adj_abon(uarmh, uarmh->spe);
break;
Expand Down Expand Up @@ -486,6 +489,7 @@ Helmet_off(void)
}
break;
case HELM_OF_TELEPATHY:
case HELM_OF_CAUTION:
/* need to update ability before calling see_monsters() */
setworn((struct obj *) 0, W_ARMH);
see_monsters();
Expand Down Expand Up @@ -1400,7 +1404,7 @@ Blindf_off(struct obj *otmp)
also used by poly_obj() when a worn item gets transformed */
void
set_wear(struct obj *obj) /* if null, do all worn items;
otherwise just obj itself */
* otherwise just obj itself */
{
gi.initial_don = !obj;

Expand Down Expand Up @@ -2078,7 +2082,7 @@ accessory_or_armor_on(struct obj *obj)
You("are suddenly overcome with shame and change your mind.");
u.ublessed = 0; /* lose your god's protection */
makeknown(obj->otyp);
gc.context.botl = 1; /*for AC after zeroing u.ublessed */
gc.context.botl = 1; /* for AC after zeroing u.ublessed */
return ECMD_TIME;
}
} else {
Expand Down
16 changes: 9 additions & 7 deletions src/spell.c
Expand Up @@ -1630,7 +1630,8 @@ sortspells(void)
}

/* usual case, sort the index rather than the spells themselves */
qsort((genericptr_t) gs.spl_orderindx, n, sizeof *gs.spl_orderindx, spell_cmp);
qsort((genericptr_t) gs.spl_orderindx, n,
sizeof *gs.spl_orderindx, spell_cmp);
return;
}

Expand Down Expand Up @@ -1662,7 +1663,8 @@ spellsortmenu(void)
any.a_int = i + 1;
add_menu(tmpwin, &nul_glyphinfo, &any, let, 0,
ATR_NONE, clr, spl_sortchoices[i],
(i == gs.spl_sortmode) ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
(i == gs.spl_sortmode) ? MENU_ITEMFLAGS_SELECTED
: MENU_ITEMFLAGS_NONE);
}
end_menu(tmpwin, "View known spells list sorted");

Expand Down Expand Up @@ -1823,10 +1825,10 @@ percent_success(int spell)
*/
int chance, splcaster, special, statused;
int difficulty;
int skill;
int skill, skilltype = spell_skilltype(spellid(spell));
/* Knights don't get metal armor penalty for clerical spells */
boolean paladin_bonus = Role_if(PM_KNIGHT)
&& spell_skilltype(spellid(spell)) == P_CLERIC_SPELL;
boolean paladin_bonus = (Role_if(PM_KNIGHT)
&& skilltype == P_CLERIC_SPELL);

/* Calculate intrinsic ability (splcaster) */

Expand All @@ -1843,7 +1845,7 @@ percent_success(int spell)
splcaster += gu.urole.spelshld;

if (!paladin_bonus) {
if (uarmh && is_metallic(uarmh) && uarmh->otyp != HELM_OF_BRILLIANCE)
if (uarmh && is_metallic(uarmh)) /* && otyp != HELM_OF_BRILLIANCE */
splcaster += uarmhbon;
if (uarmg && is_metallic(uarmg))
splcaster += uarmgbon;
Expand Down Expand Up @@ -1877,7 +1879,7 @@ percent_success(int spell)
* The difficulty is based on the hero's level and their skill level
* in that spell type.
*/
skill = P_SKILL(spell_skilltype(spellid(spell)));
skill = P_SKILL(skilltype);
skill = max(skill, P_UNSKILLED) - 1; /* unskilled => 0 */
difficulty =
(spellev(spell) - 1) * 4 - ((skill * 6) + (u.ulevel / 3) + 1);
Expand Down

0 comments on commit f9a3513

Please sign in to comment.