jcc@axis.fr (Jean-Christophe Collet) (08/02/88)
Hi folks,
my last contribution to Nethack before some times...
(I will be away for one month...).
These patches are a fundamental modification of the sacrifice stuff.
I've always finded it to easy (Got a luck of 10 after 300-400 moves,
then the hand of EL*TH a while later...). Was absolutly illogical
(was'nt it Mr Spock ?). So I introduced altars (#) in rooms. Now
you can only make sacrifices on altars, and only killed monsters.
BEWARE there are more than one type of altars... ( :-} grin) !
SPOILERS will be sent/posted on request (By Email, please).
NOTES :
1) you have to insert the line :
#define ALTARS /* Altars Code (imcompatible with SINKS) - JC Collet */
in the config.h
2) This code is incompatible with the KITCHEN SINKS (they
share the same symbol) so you have to comment out the
#define SINKS
from the config.h
Happy hacking
jcc
-------------------------------------------------------------------------------
jcc@axis.fr ! "An artificial intelligence is better than none !"
..!mcvax!inria!axis!jcc ! "Artificial intelligence matches natural stupidity !"
Collet jean-christophe ! "Objets inanimes avez vous donc une ame ?"
-------------------------------------------------------------------------------
Axis Digital |
135 rue d'aguesseau | <this space left intentionaly blank>
92100 Boulogne |
France |
-------------------------------------------------------------------------------
------ CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE --- CUT HERE ------
*** config.h.old Mon Aug 1 20:47:12 1988
--- config.h Mon Aug 1 18:49:12 1988
***************
*** 234,239
#define YODA /* Light Sword Code - JC Collet */
#define JCC /* Some change for display - JC Collet */
#define DRAGONS /* Complete Dragons Code - JC Collet */
#if defined(MSDOS) && defined(GRAPHICS)
#define TERMLIB /* enable use of termcap file c:\etc\termcap */
--- 234,240 -----
#define YODA /* Light Sword Code - JC Collet */
#define JCC /* Some change for display - JC Collet */
#define DRAGONS /* Complete Dragons Code - JC Collet */
+ #define ALTARS /* Altars Code (imcompatible with SINKS) - JC Collet */
#if defined(MSDOS) && defined(GRAPHICS)
#define TERMLIB /* enable use of termcap file c:\etc\termcap */
*** decl.c.old Mon Aug 1 20:48:06 1988
--- decl.c Mon Aug 1 20:48:29 1988
***************
*** 20,25
#ifdef SINKS
'#',
#endif
#ifdef JCC
'-','-','-','-','-',
#endif
--- 20,28 -----
#ifdef SINKS
'#',
#endif
+ #ifdef ALTARS
+ '#',
+ #endif /* ALTARS */
#ifdef JCC
'-','-','-','-','-',
#endif
*** dothrow.c.old Mon Aug 1 20:49:32 1988
--- dothrow.c Mon Aug 1 18:49:14 1988
***************
*** 153,158
hitfloor(obj)
register struct obj *obj;
{
pline("%s hits the floor.", Doname(obj));
if(obj->otyp == EXPENSIVE_CAMERA) {
pline("It is shattered in a thousand pieces!");
--- 153,163 -----
hitfloor(obj)
register struct obj *obj;
{
+ #ifdef ALTARS
+ if (IS_ALTAR(levl[u.ux][u.uy].typ))
+ pline("%s hits the altar.",Doname(obj));
+ else
+ #endif /* ALTARS */
pline("%s hits the floor.", Doname(obj));
if(obj->otyp == EXPENSIVE_CAMERA) {
pline("It is shattered in a thousand pieces!");
***************
*** 172,177
obfree(obj, Null(obj));
#endif
} else if(obj->olet == POTION_SYM) {
pline("The flask breaks, and you smell a peculiar odor ...");
potionbreathe(obj);
obfree(obj, Null(obj));
--- 177,202 -----
obfree(obj, Null(obj));
#endif
} else if(obj->olet == POTION_SYM) {
+ #ifdef ALTARS
+ if (IS_ALTAR(levl[u.ux][u.uy].typ)) {
+ if (obj->otyp == POT_HOLY_WATER) {
+ pline("The flask breaks, and the potion flows on the altar!");
+ if (levl[u.ux][u.uy].typ < BLESSED_ALTAR) {
+ levl[u.ux][u.uy].typ++;
+ pline("The altar seems cleaner!");
+ return;
+ }
+ }
+ if (obj->otyp == POT_SICKNESS) {
+ pline("The flask breaks, and the potion flows on the altar!");
+ if (levl[u.ux][u.uy].typ > CURSED_ALTAR) {
+ levl[u.ux][u.uy].typ--;
+ pline("The altar seems darker!");
+ return;
+ }
+ }
+ }
+ #endif /* ALTARS */
pline("The flask breaks, and you smell a peculiar odor ...");
potionbreathe(obj);
obfree(obj, Null(obj));
*** hack.c.old Mon Aug 1 20:49:53 1988
--- hack.c Mon Aug 1 18:49:17 1988
***************
*** 307,312
#ifdef SINKS
|| IS_SINK(levl[u.ux][u.uy].typ)
#endif
)
nomul(0);
}
--- 307,315 -----
#ifdef SINKS
|| IS_SINK(levl[u.ux][u.uy].typ)
#endif
+ #ifdef ALTARS
+ || IS_ALTAR(levl[u.ux][u.uy].typ)
+ #endif
)
nomul(0);
}
*** invent.c.old Mon Aug 1 20:46:26 1988
--- invent.c Mon Aug 1 18:49:21 1988
*** makedefs.c.old Mon Aug 1 20:50:37 1988
--- makedefs.c Mon Aug 1 18:49:29 1988
***************
*** 260,265
printf("#\ta corridor (or a kitchen sink)\n");
else
#endif
#ifdef SPELLS
if (!strcmp(inline, "+ a door"))
printf("+\ta door (or a spell book)\n");
--- 260,270 -----
printf("#\ta corridor (or a kitchen sink)\n");
else
#endif
+ #ifdef ALTARS
+ if (!strcmp(inline, "# a corridor"))
+ printf("#\ta corridor (or an altar)\n");
+ else
+ #endif
#ifdef SPELLS
if (!strcmp(inline, "+ a door"))
printf("+\ta door (or a spell book)\n");
*** mklev.c.old Mon Aug 1 20:51:19 1988
--- mklev.c Mon Aug 1 18:49:35 1988
***************
*** 162,167
#ifdef SINKS
if(!rn2(80)) mksink(croom);
#endif
if(!rn2(3)) {
(void) mkobj_at(0, somex(), somey());
tryct = 0;
--- 162,170 -----
#ifdef SINKS
if(!rn2(80)) mksink(croom);
#endif
+ #ifdef ALTARS
+ if (!rn2(40)) mkaltar(croom);
+ #endif
if(!rn2(3)) {
(void) mkobj_at(0, somex(), somey());
tryct = 0;
***************
*** 995,997
}
#endif /* SINKS /**/
--- 998,1027 -----
}
#endif /* SINKS /**/
+ #ifdef ALTARS
+ mkaltar(croom)
+ register struct mkroom *croom;
+ {
+ register xchar mx,my;
+ register int tryct = 0;
+
+ do {
+ if(++tryct > 200)
+ return;
+ mx = somex();
+ my = somey();
+ } while(t_at(mx, my) || levl[mx][my].typ == STAIRS
+ #ifdef FOUNTAINS
+ || IS_FOUNTAIN(levl[mx][my].typ)
+ #endif
+ #ifdef NEWCLASS
+ || IS_THRONE(levl[mx][my].typ)
+ #endif
+ );
+
+ /* Put an altar at mx, my */
+
+ levl[mx][my].typ = CURSED_ALTAR + rn2(3);
+ levl[mx][my].scrsym = ALTAR_SYM;
+ }
+ #endif /* ALTARS */
*** options.c.old Mon Aug 1 20:51:44 1988
--- options.c Mon Aug 1 18:49:39 1988
***************
*** 269,274
#ifdef SINKS
SETPCHAR(sink, 34);
#endif
SETPCHAR(crwall,36);
SETPCHAR(twall,38);
SETPCHAR(tdwall,40);
--- 269,277 -----
#ifdef SINKS
SETPCHAR(sink, 34);
#endif
+ #ifdef ALTARS
+ SETPCHAR(altar, 34);
+ #endif
SETPCHAR(crwall,36);
SETPCHAR(twall,38);
SETPCHAR(tdwall,40);
***************
*** 303,308
#endif
#ifdef SINKS
SETPCHAR(sink, 17);
#endif
#undef SETPCHAR
#endif /* JCC */
--- 306,314 -----
#endif
#ifdef SINKS
SETPCHAR(sink, 17);
+ #endif
+ #ifdef ALTARS
+ SETPCHAR(altar, 17);
#endif
#undef SETPCHAR
#endif /* JCC */
*** pager.c.old Mon Aug 1 20:52:17 1988
--- pager.c Mon Aug 1 18:49:42 1988
***************
*** 74,79
#ifdef SINKS
else if (r == showsyms.sink) q = defsyms.sink;
#endif
else
q = r;
#endif /* GRAPHICS */
--- 74,82 -----
#ifdef SINKS
else if (r == showsyms.sink) q = defsyms.sink;
#endif
+ #ifdef ALTARS
+ else if (r == showsyms.altar) q = defsyms.altar;
+ #endif
else
q = r;
#endif /* GRAPHICS */
*** pray.c.old Mon Aug 1 20:55:06 1988
--- pray.c Mon Aug 1 18:49:46 1988
***************
*** 174,179
char let;
char *hcolor ();
otmp = getobj("%", "sacrifice");
if(!otmp) return(0);
--- 174,188 -----
char let;
char *hcolor ();
+ #ifdef ALTARS
+ extern struct permonst d_lord;
+ struct monst *mtmp;
+
+ if (!IS_ALTAR(levl[u.ux][u.uy].typ)) {
+ pline("Thou shalt find a better place, dumb !");
+ return 0;
+ }
+ #endif
otmp = getobj("%", "sacrifice");
if(!otmp) return(0);
***************
*** 178,183
if(!otmp) return(0);
ftmp = &objects[otmp->otyp];
#ifndef DRAGONS
#ifdef KAA
if(otmp->otyp == DEAD_DEMON) let='&';
--- 187,198 -----
if(!otmp) return(0);
ftmp = &objects[otmp->otyp];
+ #ifdef ALTARS
+ if (otmp->otyp < CORPSE) {
+ pline("Thou shalt find a better thing to sacrifice, stingy!");
+ return 0;
+ }
+ #endif /* ALTARS */
#ifndef DRAGONS
#ifdef KAA
if(otmp->otyp == DEAD_DEMON) let='&';
***************
*** 190,195
let = CORPSE_I_TO_C(otmp->otyp);
#endif /* DRAGONS */
/* judge the food value by the nutrition, as well as some aging behavior */
value = ftmp->nutrition;
--- 205,211 -----
let = CORPSE_I_TO_C(otmp->otyp);
#endif /* DRAGONS */
+ #ifndef ALTARS
/* judge the food value by the nutrition, as well as some aging behavior */
value = ftmp->nutrition;
***************
*** 202,207
else if(index(POISONOUS, let)) {
value = -10; /* gods get annoyed */
}
if (value == 0)
{
--- 218,285 -----
else if(index(POISONOUS, let)) {
value = -10; /* gods get annoyed */
}
+ #else
+ /* We'll try to make the sacrifice stuff smarter */
+
+ if (index("@NnLu",let)) { /* Human sacrifice, AAAARRRRRGGGGHHHH */
+ if (levl[u.ux][u.uy].typ == CURSED_ALTAR) {
+ /* Human sacrifice on cursed altars
+ is equivalent to demon summoning */
+ pline("The blood flood on the altar,");
+ pline("which vanishes in a black cloud !");
+ levl[u.ux][u.uy].typ = ROOM;
+ if(Invis) newsym(u.ux, u.uy);
+ useup(otmp); /* Make the bodie disapear */
+ #ifdef HARD
+ if(!(mtmp = makemon(&d_lord,u.ux,u.uy))){
+ #else
+ if(!(mtmp = makemon(PM_DEMON,u.ux,u.uy))){
+ #endif
+ pline("The cloud dissipates.");
+ return 1;
+ }
+ mnexto(mtmp);
+ pline("You have summoned a demon lord !");
+ pline("You are frightened to death, and unable to move.");
+ nomul(-3);
+ return 1;
+ }
+ pline("You'll regret this infamous offense !");
+ change_luck(-5);
+ u.ugangr += 2;
+ value = -10;
+ /* Make the altar cursed because of you */
+ levl[u.ux][u.uy].typ = CURSED_ALTAR;
+ #ifdef DRAGONS
+ } else if (let == 'D') {
+ /* Do something special about Dragons */
+ switch (otmp->otyp) {
+ case DEAD_GREY_DRAGON :
+ case DEAD_RED_DRAGON :
+ case DEAD_WHITE_DRAGON :
+ value = 400;
+ break;
+ case DEAD_ORANGE_DRAGON :
+ case DEAD_BLUE_DRAGON :
+ case DEAD_YELLOW_DRAGON :
+ value = 500;
+ break;
+ case DEAD_GREEN_DRAGON :
+ value = 600;
+ break;
+ case DEAD_BLACK_DRAGON :
+ value = 800;
+ break;
+ }
+ #endif
+ } else if (let == '&') {
+ /* Jack Pot */
+ value = 800;
+ } else if (let != 'a' && (moves > otmp->age + 50))
+ value = 0; /* Old Stuff */
+ else {
+ int ct;
+ struct permonst *ptr;
for(ct = 0; ct < CMNUM; ct++) {
ptr = &mons[ct];
***************
*** 203,208
value = -10; /* gods get annoyed */
}
if (value == 0)
{
pline ("Nothing happens.");
--- 281,306 -----
int ct;
struct permonst *ptr;
+ for(ct = 0; ct < CMNUM; ct++) {
+ ptr = &mons[ct];
+ if(ptr->mlet == let)
+ break;
+ }
+ value = (ptr->mlevel * 70) - ( ptr->ac * 20) + (ptr->damn*10);
+ }
+ if (levl[u.ux][u.uy].typ == CURSED_ALTAR) {
+ if (value > 0)
+ value = -value;
+ else
+ value -= 10;
+ }
+ if (levl[u.ux][u.uy].typ == BLESSED_ALTAR)
+ if (value > 0) {
+ value *= 3; /* +50% */
+ value /= 2;
+ }
+ #endif /* ALTARS */
+
if (value == 0)
{
pline ("Nothing happens.");
***************
*** 232,237
else pline("Your sacrifice is consumed in a burst of flame!");
if(u.ugangr)
{
u.ugangr -= ((value / 800) * 4);
if(u.ugangr < 0) u.ugangr = 0;
if(u.ugangr != saved_anger)
--- 330,338 -----
else pline("Your sacrifice is consumed in a burst of flame!");
if(u.ugangr)
{
+ #ifdef ALTARS
+ u.ugangr -= ((value * 4) / 800);
+ #else
u.ugangr -= ((value / 800) * 4);
#endif /* ALTARS */
if(u.ugangr < 0) u.ugangr = 0;
***************
*** 233,238
if(u.ugangr)
{
u.ugangr -= ((value / 800) * 4);
if(u.ugangr < 0) u.ugangr = 0;
if(u.ugangr != saved_anger)
if (u.ugangr)
--- 334,340 -----
u.ugangr -= ((value * 4) / 800);
#else
u.ugangr -= ((value / 800) * 4);
+ #endif /* ALTARS */
if(u.ugangr < 0) u.ugangr = 0;
if(u.ugangr != saved_anger)
if (u.ugangr)
***************
*** 248,253
}
else if (u.ublesscnt > 0)
{
u.ublesscnt -= ((value / 800 /* a food ration */) * 300);
if(u.ublesscnt < 0) u.ublesscnt = 0;
if(u.ublesscnt != saved_cnt)
--- 350,358 -----
}
else if (u.ublesscnt > 0)
{
+ #ifdef ALTARS
+ u.ublesscnt -= ((value * 300) / 800);
+ #else
u.ublesscnt -= ((value / 800 /* a food ration */) * 300);
#endif /* ALTARS */
if(u.ublesscnt < 0) u.ublesscnt = 0;
***************
*** 249,254
else if (u.ublesscnt > 0)
{
u.ublesscnt -= ((value / 800 /* a food ration */) * 300);
if(u.ublesscnt < 0) u.ublesscnt = 0;
if(u.ublesscnt != saved_cnt)
{
--- 354,360 -----
u.ublesscnt -= ((value * 300) / 800);
#else
u.ublesscnt -= ((value / 800 /* a food ration */) * 300);
+ #endif /* ALTARS */
if(u.ublesscnt < 0) u.ublesscnt = 0;
if(u.ublesscnt != saved_cnt)
{
***************
*** 265,270
}
else /* you were already in pretty good standing */
{
change_luck((value / 800) * LUCKMAX);
if (u.uluck != saved_luck)
{
--- 371,379 -----
}
else /* you were already in pretty good standing */
{
+ #ifdef ALTARS
+ change_luck((value * LUCKMAX) / 1600);
+ #else
change_luck((value / 800) * LUCKMAX);
#endif /* ALTARS */
if (u.uluck != saved_luck)
***************
*** 266,271
else /* you were already in pretty good standing */
{
change_luck((value / 800) * LUCKMAX);
if (u.uluck != saved_luck)
{
if (Hallucination) pline ("You see crabgrass at your feet. A funny thing in a dungeon.");
--- 375,381 -----
change_luck((value * LUCKMAX) / 1600);
#else
change_luck((value / 800) * LUCKMAX);
+ #endif /* ALTARS */
if (u.uluck != saved_luck)
{
if (Hallucination) pline ("You see crabgrass at your feet. A funny thing in a dungeon.");
*** prisym.c.old Mon Aug 1 20:55:34 1988
--- prisym.c Mon Aug 1 18:49:50 1988
***************
*** 279,284
tmp = SINK_SYM;
break;
#endif
/*
case POOL:
tmp = POOL_SYM;
--- 279,291 -----
tmp = SINK_SYM;
break;
#endif
+ #ifdef ALTARS
+ case CURSED_ALTAR:
+ case NEUTRAL_ALTAR:
+ case BLESSED_ALTAR:
+ tmp = ALTAR_SYM;
+ break;
+ #endif
/*
case POOL:
tmp = POOL_SYM;
*** rm.h.old Mon Aug 1 20:56:29 1988
--- rm.h Mon Aug 1 18:49:58 1988
***************
*** 33,38
#define FOUNTAIN 20
#define THRONE 21
#define SINK 22
#else
#define SDOOR 3
#define SCORR 4
--- 33,43 -----
#define FOUNTAIN 20
#define THRONE 21
#define SINK 22
+ #ifdef ALTARS
+ #define CURSED_ALTAR 22
+ #define NEUTRAL_ALTAR 23
+ #define BLESSED_ALTAR 24
+ #endif
#else
#define SDOOR 3
#define SCORR 4
***************
*** 46,51
#define FOUNTAIN 11
#define THRONE 12
#define SINK 13
#endif
/*
* Avoid using the level types in inequalities:
--- 51,60 -----
#define FOUNTAIN 11
#define THRONE 12
#define SINK 13
+ #ifdef ALTARS
+ #define CURSED_ALTAR 13
+ #define NEUTRAL_ALTAR 14
+ #define BLESSED_ALTAR 15
#endif
#endif
/*
***************
*** 47,52
#define THRONE 12
#define SINK 13
#endif
/*
* Avoid using the level types in inequalities:
* these types are subject to change.
--- 56,62 -----
#define NEUTRAL_ALTAR 14
#define BLESSED_ALTAR 15
#endif
+ #endif
/*
* Avoid using the level types in inequalities:
* these types are subject to change.
***************
*** 71,76
#define IS_THRONE(typ) ((typ) == THRONE)
#define IS_FOUNTAIN(typ) ((typ) == FOUNTAIN)
#define IS_SINK(typ) ((typ) == SINK)
/*
* The level-map symbols may be compiled in or defined at initialization time
*/
--- 81,89 -----
#define IS_THRONE(typ) ((typ) == THRONE)
#define IS_FOUNTAIN(typ) ((typ) == FOUNTAIN)
#define IS_SINK(typ) ((typ) == SINK)
+ #ifdef ALTARS
+ #define IS_ALTAR(typ) ((typ) >= CURSED_ALTAR && (typ) <= BLESSED_ALTAR)
+ #endif
/*
* The level-map symbols may be compiled in or defined at initialization time
*/
***************
*** 98,103
#define THRONE_SYM '\\'
#define WEB_SYM '"'
#define SINK_SYM '#'
#else /* GRAPHICS */
/* screen symbols for using character graphics. */
--- 111,119 -----
#define THRONE_SYM '\\'
#define WEB_SYM '"'
#define SINK_SYM '#'
+ #ifdef ALTARS
+ #define ALTAR_SYM '#'
+ #endif
#else /* GRAPHICS */
/* screen symbols for using character graphics. */
***************
*** 116,121
#ifdef SINKS
unsigned char sink;
#endif
#ifdef JCC
unsigned char crwall, twall, tdwall, tlwall, trwall;
#endif
--- 132,140 -----
#ifdef SINKS
unsigned char sink;
#endif
+ #ifdef ALTARS
+ unsigned char altar;
+ #endif
#ifdef JCC
unsigned char crwall, twall, tdwall, tlwall, trwall;
#endif
***************
*** 140,145
#define THRONE_SYM showsyms.throne
#define WEB_SYM showsyms.web
#define SINK_SYM showsyms.sink
#ifdef JCC
#define CRWALL_SYM showsyms.crwall
#define TUPWALL_SYM showsyms.twall
--- 159,167 -----
#define THRONE_SYM showsyms.throne
#define WEB_SYM showsyms.web
#define SINK_SYM showsyms.sink
+ #ifdef ALTARS
+ #define ALTAR_SYM showsyms.altar;
+ #endif
#ifdef JCC
#define CRWALL_SYM showsyms.crwall
#define TUPWALL_SYM showsyms.twall
*** zap.c.old Mon Aug 1 20:57:02 1988
--- zap.c Mon Aug 1 18:50:02 1988
***************
*** 459,464
if(u.uswallow)
bhitm(u.ustuck, obj);
else if(u.dz) {
if(u.dz > 0 && o_at(u.ux,u.uy)) {
register struct obj *otmp;
--- 459,485 -----
if(u.uswallow)
bhitm(u.ustuck, obj);
else if(u.dz) {
+ #ifdef ALTARS
+ /* Wands of probing help to know the true nature
+ of altars */
+ if ( obj->otyp == WAN_PROBING && u.dz > 0
+ && IS_ALTAR(levl[u.ux][u.uy].typ) ) {
+ char *s;
+ switch (levl[u.ux][u.uy].typ) {
+ case CURSED_ALTAR :
+ s = "black";
+ break;
+ case NEUTRAL_ALTAR :
+ s = "red";
+ break;
+ case BLESSED_ALTAR :
+ s = "gold";
+ break;
+ }
+ pline("the altar glows %s for a moment.",
+ Hallucination ? hcolor() : s);
+ }
+ #endif /* ALTARS */
if(u.dz > 0 && o_at(u.ux,u.uy)) {
register struct obj *otmp;