Vlad's throne rebalance

This removes the container-cursing effect (which is too specific
and too easy to work around) and replaces it with an effect that
greases everything (largely but not entirely positive).
This commit is contained in:
Alex Smith
2026-01-11 22:12:35 +00:00
parent fd9f8cfd60
commit 6de59927a2
2 changed files with 17 additions and 16 deletions
+2
View File
@@ -2583,6 +2583,8 @@ grease_ok(struct obj *obj)
if (!obj) if (!obj)
return GETOBJ_SUGGEST; return GETOBJ_SUGGEST;
/* note: if changing the list of ungreasable objects, also change
special_throne_effect in sit.c */
if (obj->oclass == COIN_CLASS) if (obj->oclass == COIN_CLASS)
return GETOBJ_EXCLUDE; return GETOBJ_EXCLUDE;
+15 -16
View File
@@ -7,7 +7,6 @@
#include "artifact.h" #include "artifact.h"
staticfn void throne_sit_effect(void); staticfn void throne_sit_effect(void);
staticfn void rndcurse_inner(boolean);
staticfn int lay_an_egg(void); staticfn int lay_an_egg(void);
/* take away the hero's money */ /* take away the hero's money */
@@ -265,9 +264,20 @@ special_throne_effect(int effect) {
} }
break; break;
case 6: case 6:
/* containers become cursed */ {
rndcurse_inner(TRUE); /* grease hands and inventory
Same rules for which items can be affected as grease_ok in apply.c */
struct obj *otmp;
pline("A greasy liquid sprays all over you!");
for (otmp = gi.invent; otmp; otmp = otmp->nobj)
if (otmp->oclass != COIN_CLASS)
otmp->greased = 1;
make_glib(rn1(101, 100));
update_inventory();
break; break;
}
case 7: case 7:
/* lose an intrinsic */ /* lose an intrinsic */
attrcurse(); attrcurse();
@@ -313,7 +323,8 @@ special_throne_effect(int effect) {
break; break;
} }
case 11: case 11:
/* polymorph effect (not blocked by magic resistance) */ /* polymorph effect (not blocked by magic resistance, but other things
that protect from polymorphs work) */
pline("This throne was not meant for those such as you!"); pline("This throne was not meant for those such as you!");
You_feel("a change coming over you."); You_feel("a change coming over you.");
polyself(POLY_NOFLAGS); polyself(POLY_NOFLAGS);
@@ -552,12 +563,6 @@ dosit(void)
/* curse a few inventory items at random! */ /* curse a few inventory items at random! */
void void
rndcurse(void) rndcurse(void)
{
rndcurse_inner(FALSE);
}
staticfn void
rndcurse_inner(boolean prefer_containers)
{ {
int nobj = 0; int nobj = 0;
int cnt, onum; int cnt, onum;
@@ -579,13 +584,9 @@ rndcurse_inner(boolean prefer_containers)
/* gold isn't subject to being cursed or blessed */ /* gold isn't subject to being cursed or blessed */
if (otmp->oclass == COIN_CLASS) if (otmp->oclass == COIN_CLASS)
continue; continue;
if (prefer_containers && !otmp->cobj)
continue;
nobj++; nobj++;
} }
cnt = rnd(6 / ((!!Antimagic) + (!!Half_spell_damage) + 1)); cnt = rnd(6 / ((!!Antimagic) + (!!Half_spell_damage) + 1));
if (prefer_containers)
cnt = nobj * 2;
if (nobj) { if (nobj) {
for (; cnt > 0; cnt--) { for (; cnt > 0; cnt--) {
onum = rnd(nobj); onum = rnd(nobj);
@@ -593,8 +594,6 @@ rndcurse_inner(boolean prefer_containers)
/* as above */ /* as above */
if (otmp->oclass == COIN_CLASS) if (otmp->oclass == COIN_CLASS)
continue; continue;
if (prefer_containers && !otmp->cobj)
continue;
if (--onum == 0) if (--onum == 0)
break; /* found the target */ break; /* found the target */
} }