Merge branch 'master' of https://rodney.nethack.org:20040/git/NHsource
This commit is contained in:
+2
-1
@@ -901,6 +901,7 @@ lichen corpse is an acid indicator
|
|||||||
camera may contain a picture-painting demon
|
camera may contain a picture-painting demon
|
||||||
some monsters can eat through iron bars
|
some monsters can eat through iron bars
|
||||||
inaccessible niches occasionally have iron bars in front
|
inaccessible niches occasionally have iron bars in front
|
||||||
|
sinks may teleport or polymorph
|
||||||
|
|
||||||
|
|
||||||
Platform- and/or Interface-Specific Fixes
|
Platform- and/or Interface-Specific Fixes
|
||||||
@@ -1150,7 +1151,7 @@ tty,win32gui,win32tty: add menucolors
|
|||||||
NetHack Community Patches (or Variation) Included
|
NetHack Community Patches (or Variation) Included
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
Roderick Schertler's pickup_thrown patch
|
Roderick Schertler's pickup_thrown patch
|
||||||
Malcolm Ryan's Statue Glyphs patch
|
adopt/adapt/extend Malcolm Ryan's Statue Glyphs patch to work for tty and tiles
|
||||||
adopt/adapt/improve the Paranoid_Quit patch; default is paranoid_confirm:pray
|
adopt/adapt/improve the Paranoid_Quit patch; default is paranoid_confirm:pray
|
||||||
paranoid_confirm:Confirm when requiring "yes" instead of y to confirm,
|
paranoid_confirm:Confirm when requiring "yes" instead of y to confirm,
|
||||||
also require explicit "no" to reject
|
also require explicit "no" to reject
|
||||||
|
|||||||
+2
-1
@@ -39,6 +39,7 @@ E void FDECL(m_unleash, (struct monst *,BOOLEAN_P));
|
|||||||
E void NDECL(unleash_all);
|
E void NDECL(unleash_all);
|
||||||
E boolean NDECL(next_to_u);
|
E boolean NDECL(next_to_u);
|
||||||
E struct obj *FDECL(get_mleash, (struct monst *));
|
E struct obj *FDECL(get_mleash, (struct monst *));
|
||||||
|
E const char *NDECL(beautiful);
|
||||||
E void FDECL(check_leash, (XCHAR_P,XCHAR_P));
|
E void FDECL(check_leash, (XCHAR_P,XCHAR_P));
|
||||||
E boolean FDECL(um_dist, (XCHAR_P,XCHAR_P,XCHAR_P));
|
E boolean FDECL(um_dist, (XCHAR_P,XCHAR_P,XCHAR_P));
|
||||||
E boolean FDECL(snuff_candle, (struct obj *));
|
E boolean FDECL(snuff_candle, (struct obj *));
|
||||||
@@ -752,7 +753,7 @@ E void NDECL(really_close);
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
E boolean FDECL(showdebug, (const char *));
|
E boolean FDECL(showdebug, (const char *));
|
||||||
#endif
|
#endif
|
||||||
E void FDECL(read_tribute, (const char *,const char *,int));
|
E boolean FDECL(read_tribute, (const char *,const char *,int));
|
||||||
|
|
||||||
/* ### fountain.c ### */
|
/* ### fountain.c ### */
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,15 @@
|
|||||||
#define EXT_ENCUMBER 4 /* Overtaxed */
|
#define EXT_ENCUMBER 4 /* Overtaxed */
|
||||||
#define OVERLOADED 5 /* Overloaded */
|
#define OVERLOADED 5 /* Overloaded */
|
||||||
|
|
||||||
|
/* hunger states - see hu_stat in eat.c */
|
||||||
|
#define SATIATED 0
|
||||||
|
#define NOT_HUNGRY 1
|
||||||
|
#define HUNGRY 2
|
||||||
|
#define WEAK 3
|
||||||
|
#define FAINTING 4
|
||||||
|
#define FAINTED 5
|
||||||
|
#define STARVED 6
|
||||||
|
|
||||||
/* Macros for how a rumor was delivered in outrumor() */
|
/* Macros for how a rumor was delivered in outrumor() */
|
||||||
#define BY_ORACLE 0
|
#define BY_ORACLE 0
|
||||||
#define BY_COOKIE 1
|
#define BY_COOKIE 1
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.5 patchlevel.h $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
|
/* NetHack 3.5 patchlevel.h $NHDT-Date: 1429513493 2015/04/20 07:04:53 $ $NHDT-Branch: master $:$NHDT-Revision: 1.102 $ */
|
||||||
/* NetHack 3.5 patchlevel.h $Date: 2012/04/14 08:31:03 $ $Revision: 1.93 $ */
|
/* NetHack 3.5 patchlevel.h $Date: 2012/04/14 08:31:03 $ $Revision: 1.93 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
* Incrementing EDITLEVEL can be used to force invalidation of old bones
|
* Incrementing EDITLEVEL can be used to force invalidation of old bones
|
||||||
* and save files.
|
* and save files.
|
||||||
*/
|
*/
|
||||||
#define EDITLEVEL 61
|
#define EDITLEVEL 63
|
||||||
|
|
||||||
#define COPYRIGHT_BANNER_A \
|
#define COPYRIGHT_BANNER_A \
|
||||||
"NetHack, Copyright 1985-2015"
|
"NetHack, Copyright 1985-2015"
|
||||||
|
|||||||
+4
-3
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.5 you.h $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
|
/* NetHack 3.5 you.h $NHDT-Date: 1429513494 2015/04/20 07:04:54 $ $NHDT-Branch: master $:$NHDT-Revision: 1.25 $ */
|
||||||
/* NetHack 3.5 you.h $Date: 2012/04/14 08:31:03 $ $Revision: 1.13 $ */
|
/* NetHack 3.5 you.h $Date: 2012/04/14 08:31:03 $ $Revision: 1.13 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -39,12 +39,13 @@ struct u_have {
|
|||||||
struct u_event {
|
struct u_event {
|
||||||
Bitfield(minor_oracle,1); /* received at least 1 cheap oracle */
|
Bitfield(minor_oracle,1); /* received at least 1 cheap oracle */
|
||||||
Bitfield(major_oracle,1); /* " expensive oracle */
|
Bitfield(major_oracle,1); /* " expensive oracle */
|
||||||
|
Bitfield(read_tribute,1); /* read a passage from a novel */
|
||||||
Bitfield(qcalled,1); /* called by Quest leader to do task */
|
Bitfield(qcalled,1); /* called by Quest leader to do task */
|
||||||
Bitfield(qexpelled,1); /* expelled from the Quest dungeon */
|
Bitfield(qexpelled,1); /* expelled from the Quest dungeon */
|
||||||
Bitfield(qcompleted,1); /* successfully completed Quest task */
|
Bitfield(qcompleted,1); /* successfully completed Quest task */
|
||||||
Bitfield(uheard_tune,2); /* 1=know about, 2=heard passtune */
|
Bitfield(uheard_tune,2); /* 1=know about, 2=heard passtune */
|
||||||
Bitfield(uopened_dbridge,1); /* opened the drawbridge */
|
|
||||||
|
|
||||||
|
Bitfield(uopened_dbridge,1); /* opened the drawbridge */
|
||||||
Bitfield(invoked,1); /* invoked Gate to the Sanctum level */
|
Bitfield(invoked,1); /* invoked Gate to the Sanctum level */
|
||||||
Bitfield(gehennom_entered,1); /* entered Gehennom via Valley */
|
Bitfield(gehennom_entered,1); /* entered Gehennom via Valley */
|
||||||
Bitfield(uhand_of_elbereth,2); /* became Hand of Elbereth */
|
Bitfield(uhand_of_elbereth,2); /* became Hand of Elbereth */
|
||||||
@@ -67,7 +68,7 @@ struct u_achieve {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct u_realtime {
|
struct u_realtime {
|
||||||
time_t realtime; /* actual playing time up until the last restore */
|
long realtime; /* actual playing time up until the last restore, seconds */
|
||||||
time_t restored; /* time the game was started or restored */
|
time_t restored; /* time the game was started or restored */
|
||||||
time_t endtime;
|
time_t endtime;
|
||||||
};
|
};
|
||||||
|
|||||||
+1
-1
@@ -537,7 +537,7 @@ newgame()
|
|||||||
#endif
|
#endif
|
||||||
program_state.something_worth_saving++; /* useful data now exists */
|
program_state.something_worth_saving++; /* useful data now exists */
|
||||||
|
|
||||||
urealtime.realtime = (time_t)0L;
|
urealtime.realtime = 0L;
|
||||||
#if defined(BSD) && !defined(POSIX_TYPES)
|
#if defined(BSD) && !defined(POSIX_TYPES)
|
||||||
(void) time((long *)&urealtime.restored);
|
(void) time((long *)&urealtime.restored);
|
||||||
#else
|
#else
|
||||||
|
|||||||
+9
-2
@@ -703,6 +703,14 @@ register xchar x, y;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
beautiful()
|
||||||
|
{
|
||||||
|
return (ACURR(A_CHA) > 14) ?
|
||||||
|
(poly_gender() == 1 ? "beautiful" : "handsome") : "ugly";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define WEAK 3 /* from eat.c */
|
#define WEAK 3 /* from eat.c */
|
||||||
|
|
||||||
static const char look_str[] = "look %s.";
|
static const char look_str[] = "look %s.";
|
||||||
@@ -720,8 +728,7 @@ struct obj *obj;
|
|||||||
if(!getdir((char *)0)) return 0;
|
if(!getdir((char *)0)) return 0;
|
||||||
invis_mirror = Invis;
|
invis_mirror = Invis;
|
||||||
useeit = !Blind && (!invis_mirror || See_invisible);
|
useeit = !Blind && (!invis_mirror || See_invisible);
|
||||||
uvisage = (ACURR(A_CHA) > 14) ?
|
uvisage = beautiful();
|
||||||
(poly_gender() == 1 ? "beautiful" : "handsome") : "ugly";
|
|
||||||
mirror = simpleonames(obj); /* "mirror" or "looking glass" */
|
mirror = simpleonames(obj); /* "mirror" or "looking glass" */
|
||||||
if(obj->cursed && !rn2(2)) {
|
if(obj->cursed && !rn2(2)) {
|
||||||
if (!Blind)
|
if (!Blind)
|
||||||
|
|||||||
@@ -372,15 +372,6 @@ boolean inc_or_dec;
|
|||||||
if (moves > 0 && (i == A_STR || i == A_CON)) (void)encumber_msg();
|
if (moves > 0 && (i == A_STR || i == A_CON)) (void)encumber_msg();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* hunger values - from eat.c */
|
|
||||||
#define SATIATED 0
|
|
||||||
#define NOT_HUNGRY 1
|
|
||||||
#define HUNGRY 2
|
|
||||||
#define WEAK 3
|
|
||||||
#define FAINTING 4
|
|
||||||
#define FAINTED 5
|
|
||||||
#define STARVED 6
|
|
||||||
|
|
||||||
STATIC_OVL void
|
STATIC_OVL void
|
||||||
exerper()
|
exerper()
|
||||||
{
|
{
|
||||||
|
|||||||
+14
-8
@@ -564,15 +564,17 @@ feel_location(x, y)
|
|||||||
if (lev->typ != ROOM && lev->seenv) {
|
if (lev->typ != ROOM && lev->seenv) {
|
||||||
map_background(x, y, 1);
|
map_background(x, y, 1);
|
||||||
} else {
|
} else {
|
||||||
lev->glyph = lev->waslit ? cmap_to_glyph(S_room) :
|
lev->glyph = flags.dark_room ? cmap_to_glyph(S_darkroom) :
|
||||||
cmap_to_glyph(S_stone);
|
(lev->waslit ? cmap_to_glyph(S_room) :
|
||||||
|
cmap_to_glyph(S_stone));
|
||||||
show_glyph(x,y,lev->glyph);
|
show_glyph(x,y,lev->glyph);
|
||||||
}
|
}
|
||||||
} else if ((lev->glyph >= cmap_to_glyph(S_stone) &&
|
} else if ((lev->glyph >= cmap_to_glyph(S_stone) &&
|
||||||
lev->glyph < cmap_to_glyph(S_room)) ||
|
lev->glyph < cmap_to_glyph(S_darkroom)) ||
|
||||||
glyph_is_invisible(levl[x][y].glyph)) {
|
glyph_is_invisible(levl[x][y].glyph)) {
|
||||||
lev->glyph = lev->waslit ? cmap_to_glyph(S_room) :
|
lev->glyph = flags.dark_room ? cmap_to_glyph(S_darkroom) :
|
||||||
cmap_to_glyph(S_stone);
|
(lev->waslit ? cmap_to_glyph(S_room) :
|
||||||
|
cmap_to_glyph(S_stone));
|
||||||
show_glyph(x,y,lev->glyph);
|
show_glyph(x,y,lev->glyph);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -583,6 +585,9 @@ feel_location(x, y)
|
|||||||
if (lev->typ == CORR &&
|
if (lev->typ == CORR &&
|
||||||
lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit)
|
lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit)
|
||||||
show_glyph(x, y, lev->glyph = cmap_to_glyph(S_corr));
|
show_glyph(x, y, lev->glyph = cmap_to_glyph(S_corr));
|
||||||
|
else if (lev->typ == ROOM && flags.dark_room &&
|
||||||
|
lev->glyph == cmap_to_glyph(S_room))
|
||||||
|
show_glyph(x, y, lev->glyph = cmap_to_glyph(S_darkroom));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_map_location(x, y, 1);
|
_map_location(x, y, 1);
|
||||||
@@ -610,9 +615,9 @@ feel_location(x, y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Floor spaces are dark if unlit. Corridors are dark if unlit. */
|
/* Floor spaces are dark if unlit. Corridors are dark if unlit. */
|
||||||
if (lev->typ == ROOM &&
|
if (lev->typ == ROOM && lev->glyph == cmap_to_glyph(S_room) &&
|
||||||
lev->glyph == cmap_to_glyph(S_room) && !lev->waslit)
|
(!lev->waslit || flags.dark_room))
|
||||||
show_glyph(x,y, lev->glyph = cmap_to_glyph(S_stone));
|
show_glyph(x,y, lev->glyph = cmap_to_glyph(flags.dark_room ? S_darkroom : S_stone));
|
||||||
else if (lev->typ == CORR &&
|
else if (lev->typ == CORR &&
|
||||||
lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit)
|
lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit)
|
||||||
show_glyph(x,y, lev->glyph = cmap_to_glyph(S_corr));
|
show_glyph(x,y, lev->glyph = cmap_to_glyph(S_corr));
|
||||||
@@ -900,6 +905,7 @@ tmp_at(x, y)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default: /* do it */
|
default: /* do it */
|
||||||
|
if (!isok(x,y)) break;
|
||||||
if (tglyph->style == DISP_BEAM || tglyph->style == DISP_ALL) {
|
if (tglyph->style == DISP_BEAM || tglyph->style == DISP_ALL) {
|
||||||
if (tglyph->style != DISP_ALL && !cansee(x,y)) break;
|
if (tglyph->style != DISP_ALL && !cansee(x,y)) break;
|
||||||
if (tglyph->sidx >= TMP_AT_MAX_GLYPHS) break; /* too many locations */
|
if (tglyph->sidx >= TMP_AT_MAX_GLYPHS) break; /* too many locations */
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
#include "lev.h"
|
#include "lev.h"
|
||||||
|
|
||||||
STATIC_DCL void FDECL(trycall, (struct obj *));
|
STATIC_DCL void FDECL(trycall, (struct obj *));
|
||||||
|
STATIC_DCL void NDECL(polymorph_sink);
|
||||||
|
STATIC_DCL boolean NDECL(teleport_sink);
|
||||||
STATIC_DCL void FDECL(dosinkring, (struct obj *));
|
STATIC_DCL void FDECL(dosinkring, (struct obj *));
|
||||||
|
|
||||||
STATIC_PTR int FDECL(drop, (struct obj *));
|
STATIC_PTR int FDECL(drop, (struct obj *));
|
||||||
@@ -260,6 +262,72 @@ register struct obj *obj;
|
|||||||
docall(obj);
|
docall(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Transforms the sink at the player's position into
|
||||||
|
* a fountain, throne, altar or grave. */
|
||||||
|
STATIC_DCL
|
||||||
|
void
|
||||||
|
polymorph_sink()
|
||||||
|
{
|
||||||
|
if (levl[u.ux][u.uy].typ != SINK) return;
|
||||||
|
|
||||||
|
level.flags.nsinks--;
|
||||||
|
levl[u.ux][u.uy].doormask = 0;
|
||||||
|
switch(rn2(4)) {
|
||||||
|
default:
|
||||||
|
case 0:
|
||||||
|
levl[u.ux][u.uy].typ = FOUNTAIN;
|
||||||
|
level.flags.nfountains++;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
levl[u.ux][u.uy].typ = THRONE;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
levl[u.ux][u.uy].typ = ALTAR;
|
||||||
|
levl[u.ux][u.uy].altarmask = Align2amask(rn2((int)A_LAWFUL+2) - 1);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
levl[u.ux][u.uy].typ = ROOM;
|
||||||
|
make_grave(u.ux, u.uy, (char *) 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pline_The("sink transforms into %s!",
|
||||||
|
(levl[u.ux][u.uy].typ == THRONE) ?
|
||||||
|
"a throne" : an(surface(u.ux, u.uy)));
|
||||||
|
newsym(u.ux,u.uy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Teleports the sink at the player's position.
|
||||||
|
* @return TRUE if sink teleported */
|
||||||
|
STATIC_DCL
|
||||||
|
boolean
|
||||||
|
teleport_sink()
|
||||||
|
{
|
||||||
|
int cx, cy;
|
||||||
|
int cnt = 0;
|
||||||
|
struct trap *trp;
|
||||||
|
struct engr *eng;
|
||||||
|
do {
|
||||||
|
cx = rnd(COLNO-1);
|
||||||
|
cy = rn2(ROWNO);
|
||||||
|
trp = t_at(cx,cy);
|
||||||
|
eng = engr_at(cx,cy);
|
||||||
|
} while (((levl[cx][cy].typ != ROOM) || (trp) || (eng) ||
|
||||||
|
cansee(cx,cy)) && (cnt++ < 200));
|
||||||
|
if ((levl[cx][cy].typ == ROOM) && !trp && !eng) {
|
||||||
|
/* create sink at new position */
|
||||||
|
levl[cx][cy].typ = SINK;
|
||||||
|
levl[cx][cy].looted = levl[u.ux][u.uy].looted;
|
||||||
|
newsym(cx,cy);
|
||||||
|
/* remove old sink */
|
||||||
|
levl[u.ux][u.uy].typ = ROOM;
|
||||||
|
levl[u.ux][u.uy].looted = 0;
|
||||||
|
newsym(u.ux,u.uy);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC_OVL
|
STATIC_OVL
|
||||||
void
|
void
|
||||||
dosinkring(obj) /* obj is a ring being dropped over a kitchen sink */
|
dosinkring(obj) /* obj is a ring being dropped over a kitchen sink */
|
||||||
@@ -267,6 +335,7 @@ register struct obj *obj;
|
|||||||
{
|
{
|
||||||
register struct obj *otmp,*otmp2;
|
register struct obj *otmp,*otmp2;
|
||||||
register boolean ideed = TRUE;
|
register boolean ideed = TRUE;
|
||||||
|
boolean nosink = FALSE;
|
||||||
|
|
||||||
You("drop %s down the drain.", doname(obj));
|
You("drop %s down the drain.", doname(obj));
|
||||||
obj->in_use = TRUE; /* block free identification via interrupt */
|
obj->in_use = TRUE; /* block free identification via interrupt */
|
||||||
@@ -289,7 +358,8 @@ giveback:
|
|||||||
You("smell rotten %s.", makeplural(fruitname(FALSE)));
|
You("smell rotten %s.", makeplural(fruitname(FALSE)));
|
||||||
break;
|
break;
|
||||||
case RIN_AGGRAVATE_MONSTER:
|
case RIN_AGGRAVATE_MONSTER:
|
||||||
pline("Several flies buzz angrily around the sink.");
|
pline("Several %s buzz angrily around the sink.",
|
||||||
|
Hallucination ? makeplural(rndmonnam(NULL)) : "flies");
|
||||||
break;
|
break;
|
||||||
case RIN_SHOCK_RESISTANCE:
|
case RIN_SHOCK_RESISTANCE:
|
||||||
pline("Static electricity surrounds the sink.");
|
pline("Static electricity surrounds the sink.");
|
||||||
@@ -355,7 +425,8 @@ giveback:
|
|||||||
You_see("the ring slide right down the drain!");
|
You_see("the ring slide right down the drain!");
|
||||||
break;
|
break;
|
||||||
case RIN_SEE_INVISIBLE:
|
case RIN_SEE_INVISIBLE:
|
||||||
You_see("some air in the sink.");
|
You_see("some %s in the sink.",
|
||||||
|
Hallucination ? "oxygen molecules" : "air");
|
||||||
break;
|
break;
|
||||||
case RIN_STEALTH:
|
case RIN_STEALTH:
|
||||||
pline_The("sink seems to blend into the floor for a moment.");
|
pline_The("sink seems to blend into the floor for a moment.");
|
||||||
@@ -377,13 +448,15 @@ giveback:
|
|||||||
pline_The("sink glows %s for a moment.", hcolor(NH_WHITE));
|
pline_The("sink glows %s for a moment.", hcolor(NH_WHITE));
|
||||||
break;
|
break;
|
||||||
case RIN_TELEPORTATION:
|
case RIN_TELEPORTATION:
|
||||||
pline_The("sink momentarily vanishes.");
|
nosink = teleport_sink();
|
||||||
|
pline_The("sink %svanishes.", nosink ? "" : "momentarily ");
|
||||||
break;
|
break;
|
||||||
case RIN_TELEPORT_CONTROL:
|
case RIN_TELEPORT_CONTROL:
|
||||||
pline_The("sink looks like it is being beamed aboard somewhere.");
|
pline_The("sink looks like it is being beamed aboard somewhere.");
|
||||||
break;
|
break;
|
||||||
case RIN_POLYMORPH:
|
case RIN_POLYMORPH:
|
||||||
pline_The("sink momentarily looks like a fountain.");
|
polymorph_sink();
|
||||||
|
nosink = TRUE;
|
||||||
break;
|
break;
|
||||||
case RIN_POLYMORPH_CONTROL:
|
case RIN_POLYMORPH_CONTROL:
|
||||||
pline_The("sink momentarily looks like a regularly erupting geyser.");
|
pline_The("sink momentarily looks like a regularly erupting geyser.");
|
||||||
@@ -392,9 +465,9 @@ giveback:
|
|||||||
}
|
}
|
||||||
if(ideed)
|
if(ideed)
|
||||||
trycall(obj);
|
trycall(obj);
|
||||||
else
|
else if (!nosink)
|
||||||
You_hear("the ring bouncing down the drainpipe.");
|
You_hear("the ring bouncing down the drainpipe.");
|
||||||
if (!rn2(20)) {
|
if (!rn2(20) && !nosink) {
|
||||||
pline_The("sink backs up, leaving %s.", doname(obj));
|
pline_The("sink backs up, leaving %s.", doname(obj));
|
||||||
obj->in_use = FALSE;
|
obj->in_use = FALSE;
|
||||||
dropx(obj);
|
dropx(obj);
|
||||||
|
|||||||
+1
-4
@@ -421,10 +421,7 @@ do_mname()
|
|||||||
mtmp = u.usteed;
|
mtmp = u.usteed;
|
||||||
else {
|
else {
|
||||||
pline("This %s creature is called %s and cannot be renamed.",
|
pline("This %s creature is called %s and cannot be renamed.",
|
||||||
ACURR(A_CHA) > 14 ?
|
beautiful(), plname);
|
||||||
(flags.female ? "beautiful" : "handsome") :
|
|
||||||
"ugly",
|
|
||||||
plname);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
|||||||
@@ -40,15 +40,6 @@ STATIC_DCL boolean FDECL(maybe_cannibal, (int,BOOLEAN_P));
|
|||||||
|
|
||||||
char msgbuf[BUFSZ];
|
char msgbuf[BUFSZ];
|
||||||
|
|
||||||
/* hunger texts used on bottom line (each 8 chars long) */
|
|
||||||
#define SATIATED 0
|
|
||||||
#define NOT_HUNGRY 1
|
|
||||||
#define HUNGRY 2
|
|
||||||
#define WEAK 3
|
|
||||||
#define FAINTING 4
|
|
||||||
#define FAINTED 5
|
|
||||||
#define STARVED 6
|
|
||||||
|
|
||||||
/* also used to see if you're allowed to eat cats and dogs */
|
/* also used to see if you're allowed to eat cats and dogs */
|
||||||
#define CANNIBAL_ALLOWED() (Role_if(PM_CAVEMAN) || Race_if(PM_ORC))
|
#define CANNIBAL_ALLOWED() (Role_if(PM_CAVEMAN) || Race_if(PM_ORC))
|
||||||
|
|
||||||
@@ -76,6 +67,7 @@ STATIC_OVL NEARDATA const char allobj[] = {
|
|||||||
|
|
||||||
STATIC_OVL boolean force_save_hs = FALSE;
|
STATIC_OVL boolean force_save_hs = FALSE;
|
||||||
|
|
||||||
|
/* see hunger states in hack.h - texts used on bottom line */
|
||||||
const char *hu_stat[] = {
|
const char *hu_stat[] = {
|
||||||
"Satiated",
|
"Satiated",
|
||||||
" ",
|
" ",
|
||||||
|
|||||||
@@ -916,7 +916,7 @@ die:
|
|||||||
topten figure it out separately and possibly getting different
|
topten figure it out separately and possibly getting different
|
||||||
time or even day if player is slow responding to --More-- */
|
time or even day if player is slow responding to --More-- */
|
||||||
endtime = getnow();
|
endtime = getnow();
|
||||||
urealtime.realtime += (endtime - urealtime.restored);
|
urealtime.realtime += (long)(endtime - urealtime.restored);
|
||||||
|
|
||||||
/* Sometimes you die on the first move. Life's not fair.
|
/* Sometimes you die on the first move. Life's not fair.
|
||||||
* On those rare occasions you get hosed immediately, go out
|
* On those rare occasions you get hosed immediately, go out
|
||||||
|
|||||||
+14
-11
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.5 files.c $NHDT-Date: 1427337311 2015/03/26 02:35:11 $ $NHDT-Branch: derek-farming $:$NHDT-Revision: 1.141 $ */
|
/* NetHack 3.5 files.c $NHDT-Date: 1428972596 2015/04/14 00:49:56 $ $NHDT-Branch: master $:$NHDT-Revision: 1.164 $ */
|
||||||
/* NetHack 3.5 files.c $Date: 2012/03/10 02:49:08 $ $Revision: 1.124 $ */
|
/* NetHack 3.5 files.c $Date: 2012/03/10 02:49:08 $ $Revision: 1.124 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -3331,13 +3331,17 @@ const char *filename;
|
|||||||
|
|
||||||
/* ---------- BEGIN TRIBUTE ----------- */
|
/* ---------- BEGIN TRIBUTE ----------- */
|
||||||
|
|
||||||
/* 3.6 tribute code */
|
/* 3.6 tribute code
|
||||||
|
*
|
||||||
|
* Returns TRUE if you were able to read something.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
#define SECTIONSCOPE 1
|
#define SECTIONSCOPE 1
|
||||||
#define TITLESCOPE 2
|
#define TITLESCOPE 2
|
||||||
#define PASSAGESCOPE 3
|
#define PASSAGESCOPE 3
|
||||||
|
|
||||||
void
|
boolean
|
||||||
read_tribute(tribsection, tribtitle, tribpassage)
|
read_tribute(tribsection, tribtitle, tribpassage)
|
||||||
const char *tribsection, *tribtitle;
|
const char *tribsection, *tribtitle;
|
||||||
int tribpassage;
|
int tribpassage;
|
||||||
@@ -3346,19 +3350,18 @@ int tribpassage;
|
|||||||
char *endp;
|
char *endp;
|
||||||
char line[BUFSZ];
|
char line[BUFSZ];
|
||||||
|
|
||||||
int scopes[4] = {0, SECTIONSCOPE, TITLESCOPE, PASSAGESCOPE};
|
int scope = 0;
|
||||||
int scope = 0, section = 0, passage = 0, book = 0;
|
int linect = 0, passagecnt = 0, targetpassage = 0;
|
||||||
int linect = 0, passagecnt = 0, targetpassage = 0, textcnt = 0;
|
|
||||||
char *sectionnm = "", *booknm = "";
|
|
||||||
const char *badtranslation = "an incomprehensible foreign translation";
|
const char *badtranslation = "an incomprehensible foreign translation";
|
||||||
boolean matchedsection = FALSE, matchedtitle = FALSE;
|
boolean matchedsection = FALSE, matchedtitle = FALSE;
|
||||||
winid tribwin = WIN_ERR;
|
winid tribwin = WIN_ERR;
|
||||||
|
boolean grasped = FALSE;
|
||||||
|
|
||||||
/* check for mandatories */
|
/* check for mandatories */
|
||||||
if (!tribsection || !tribtitle) {
|
if (!tribsection || !tribtitle) {
|
||||||
pline("It's %s of \"%s\"!",
|
pline("It's %s of \"%s\"!",
|
||||||
badtranslation, tribtitle);
|
badtranslation, tribtitle);
|
||||||
return;
|
return grasped;
|
||||||
}
|
}
|
||||||
|
|
||||||
debugpline3("read_tribute %s, %s, %d.", tribsection, tribtitle, tribpassage);
|
debugpline3("read_tribute %s, %s, %d.", tribsection, tribtitle, tribpassage);
|
||||||
@@ -3367,7 +3370,7 @@ int tribpassage;
|
|||||||
if (!fp) {
|
if (!fp) {
|
||||||
/* this is actually an error - cannot open tribute file! */
|
/* this is actually an error - cannot open tribute file! */
|
||||||
pline("You feel too overwhelmed to continue!");
|
pline("You feel too overwhelmed to continue!");
|
||||||
return;
|
return grasped;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3467,13 +3470,13 @@ cleanup:
|
|||||||
display_nhwindow(tribwin, FALSE);
|
display_nhwindow(tribwin, FALSE);
|
||||||
destroy_nhwindow(tribwin);
|
destroy_nhwindow(tribwin);
|
||||||
tribwin = WIN_ERR;
|
tribwin = WIN_ERR;
|
||||||
u.uconduct.literate++;
|
grasped = TRUE;
|
||||||
} else {
|
} else {
|
||||||
pline("It seems to be %s of \"%s\"!",
|
pline("It seems to be %s of \"%s\"!",
|
||||||
badtranslation, tribtitle);
|
badtranslation, tribtitle);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return grasped;
|
||||||
}
|
}
|
||||||
/* ---------- END TRIBUTE ----------- */
|
/* ---------- END TRIBUTE ----------- */
|
||||||
|
|
||||||
|
|||||||
+31
-13
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.5 hack.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
|
/* NetHack 3.5 hack.c $NHDT-Date: 1429412557 2015/04/19 03:02:37 $ $NHDT-Branch: master $:$NHDT-Revision: 1.143 $ */
|
||||||
/* NetHack 3.5 hack.c $Date: 2013/10/26 21:33:47 $ $Revision: 1.120 $ */
|
/* NetHack 3.5 hack.c $Date: 2013/10/26 21:33:47 $ $Revision: 1.120 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -1336,12 +1336,14 @@ domove()
|
|||||||
if (context.forcefight ||
|
if (context.forcefight ||
|
||||||
/* remembered an 'I' && didn't use a move command */
|
/* remembered an 'I' && didn't use a move command */
|
||||||
(glyph_is_invisible(levl[x][y].glyph) && !context.nopick)) {
|
(glyph_is_invisible(levl[x][y].glyph) && !context.nopick)) {
|
||||||
struct obj *boulder = sobj_at(BOULDER, x, y);
|
struct obj *boulder = 0;
|
||||||
boolean explo = (Upolyd && attacktype(youmonst.data, AT_EXPL)),
|
boolean explo = (Upolyd && attacktype(youmonst.data, AT_EXPL)),
|
||||||
solid = !accessible(x, y);
|
solid = !accessible(x, y);
|
||||||
int glyph = glyph_at(x, y); /* might be monster */
|
int glyph = glyph_at(x, y); /* might be monster */
|
||||||
char buf[BUFSZ];
|
char buf[BUFSZ];
|
||||||
|
|
||||||
|
if (!Underwater) {
|
||||||
|
boulder = sobj_at(BOULDER, x, y);
|
||||||
/* if a statue is displayed at the target location,
|
/* if a statue is displayed at the target location,
|
||||||
player is attempting to attack it [and boulder
|
player is attempting to attack it [and boulder
|
||||||
handlng below is suitable for handling that] */
|
handlng below is suitable for handling that] */
|
||||||
@@ -1360,25 +1362,41 @@ domove()
|
|||||||
(void)use_pick_axe2(uwep);
|
(void)use_pick_axe2(uwep);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* about to become known empty -- remove 'I' if present */
|
||||||
|
unmap_object(x, y);
|
||||||
|
if (boulder) map_object(boulder, TRUE);
|
||||||
|
newsym(x, y);
|
||||||
|
glyph = glyph_at(x, y); /* might have just changed */
|
||||||
|
|
||||||
if (boulder)
|
if (boulder)
|
||||||
Strcpy(buf, ansimpleoname(boulder));
|
Strcpy(buf, ansimpleoname(boulder));
|
||||||
|
else if (Underwater && !is_pool(x, y))
|
||||||
|
/* Underwater, targetting non-water; the map just shows blank
|
||||||
|
because you don't see remembered terrain while underwater;
|
||||||
|
although the hero can attack an adjacent monster this way,
|
||||||
|
assume he can't reach out far enough to distinguish terrain */
|
||||||
|
Sprintf(buf, (Is_waterlevel(&u.uz) && levl[x][y].typ == AIR) ?
|
||||||
|
"an air bubble" : "nothing");
|
||||||
else if (solid)
|
else if (solid)
|
||||||
Strcpy(buf, the(defsyms[glyph_to_cmap(glyph)].explanation));
|
/* glyph might indicate unseen terrain if hero is blind;
|
||||||
else if (!Underwater)
|
unlike searching, this won't reveal what that terrain is
|
||||||
|
(except for solid rock, where the glyph would otherwise
|
||||||
|
yield ludicrous "dark part of a room") */
|
||||||
|
Strcpy(buf, (levl[x][y].typ == STONE) ? "solid rock" :
|
||||||
|
glyph_is_cmap(glyph) ?
|
||||||
|
the(defsyms[glyph_to_cmap(glyph)].explanation) :
|
||||||
|
(const char *)"an unknown obstacle");
|
||||||
|
/* note: 'solid' is misleadingly named and catches pools
|
||||||
|
of water and lava as well as rock and walls */
|
||||||
|
else
|
||||||
Strcpy(buf, "thin air");
|
Strcpy(buf, "thin air");
|
||||||
else if (is_pool(x, y))
|
|
||||||
Strcpy(buf, "empty water");
|
|
||||||
else /* Underwater, targetting non-water */
|
|
||||||
Sprintf(buf, "a vacant spot on the %s", surface(x,y));
|
|
||||||
You("%s%s %s.",
|
You("%s%s %s.",
|
||||||
!(boulder || solid) ? "" :
|
!(boulder || solid) ? "" : !explo ? "harmlessly " : "futilely ",
|
||||||
!explo ? "harmlessly " : "futilely ",
|
|
||||||
explo ? "explode at" : "attack",
|
explo ? "explode at" : "attack",
|
||||||
buf);
|
buf);
|
||||||
unmap_object(x, y); /* known empty -- remove 'I' if present */
|
|
||||||
if (boulder) map_object(boulder, TRUE);
|
|
||||||
newsym(x, y);
|
|
||||||
nomul(0);
|
nomul(0);
|
||||||
if (explo) {
|
if (explo) {
|
||||||
wake_nearby();
|
wake_nearby();
|
||||||
|
|||||||
+8
-1
@@ -783,6 +783,7 @@ time_t date;
|
|||||||
Sprintf(datestr, "%04ld%02d%02d%02d%02d%02d",
|
Sprintf(datestr, "%04ld%02d%02d%02d%02d%02d",
|
||||||
datenum, lt->tm_mon + 1, lt->tm_mday,
|
datenum, lt->tm_mon + 1, lt->tm_mday,
|
||||||
lt->tm_hour, lt->tm_min, lt->tm_sec);
|
lt->tm_hour, lt->tm_min, lt->tm_sec);
|
||||||
|
debugpline1("yyyymmddhhmmss() produced date string %s", datestr);
|
||||||
return(datestr);
|
return(datestr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -791,6 +792,7 @@ time_from_yyyymmddhhmmss(buf)
|
|||||||
char *buf;
|
char *buf;
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
|
time_t timeresult = (time_t)0;
|
||||||
struct tm t, *lt;
|
struct tm t, *lt;
|
||||||
char *g, *p, y[5],mo[3],md[3],h[3],mi[3],s[3];
|
char *g, *p, y[5],mo[3],md[3],h[3],mi[3],s[3];
|
||||||
if (buf && strlen(buf) == 14) {
|
if (buf && strlen(buf) == 14) {
|
||||||
@@ -828,8 +830,13 @@ char *buf;
|
|||||||
t.tm_hour = atoi(h);
|
t.tm_hour = atoi(h);
|
||||||
t.tm_min = atoi(mi);
|
t.tm_min = atoi(mi);
|
||||||
t.tm_sec = atoi(s);
|
t.tm_sec = atoi(s);
|
||||||
return mktime(&t);
|
timeresult = mktime(&t);
|
||||||
}
|
}
|
||||||
|
if ((int)timeresult == -1)
|
||||||
|
debugpline1("time_from_yyyymmddhhmmss(%s) would have returned -1",
|
||||||
|
buf ? buf : "");
|
||||||
|
else
|
||||||
|
return timeresult;
|
||||||
}
|
}
|
||||||
return (time_t)0;
|
return (time_t)0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2540,6 +2540,7 @@ mergable(otmp, obj) /* returns TRUE if obj & otmp can be merged */
|
|||||||
register struct obj *otmp, *obj;
|
register struct obj *otmp, *obj;
|
||||||
{
|
{
|
||||||
int objnamelth = 0, otmpnamelth = 0;
|
int objnamelth = 0, otmpnamelth = 0;
|
||||||
|
if (obj == otmp) return FALSE; /* already the same object */
|
||||||
if (obj->otyp != otmp->otyp) return FALSE;
|
if (obj->otyp != otmp->otyp) return FALSE;
|
||||||
/* coins of the same kind will always merge */
|
/* coins of the same kind will always merge */
|
||||||
if (obj->oclass == COIN_CLASS) return TRUE;
|
if (obj->oclass == COIN_CLASS) return TRUE;
|
||||||
|
|||||||
+5
-1
@@ -692,6 +692,8 @@ doclose() /* try to close a door */
|
|||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isok(x,y)) goto nodoor;
|
||||||
|
|
||||||
if ((mtmp = m_at(x,y)) &&
|
if ((mtmp = m_at(x,y)) &&
|
||||||
mtmp->m_ap_type == M_AP_FURNITURE &&
|
mtmp->m_ap_type == M_AP_FURNITURE &&
|
||||||
(mtmp->mappearance == S_hcdoor ||
|
(mtmp->mappearance == S_hcdoor ||
|
||||||
@@ -723,8 +725,10 @@ doclose() /* try to close a door */
|
|||||||
pline_The("drawbridge is already closed.");
|
pline_The("drawbridge is already closed.");
|
||||||
else if (portcullis || door->typ == DRAWBRIDGE_DOWN)
|
else if (portcullis || door->typ == DRAWBRIDGE_DOWN)
|
||||||
There("is no obvious way to close the drawbridge.");
|
There("is no obvious way to close the drawbridge.");
|
||||||
else
|
else {
|
||||||
|
nodoor:
|
||||||
You("%s no door there.", Blind ? "feel" : "see");
|
You("%s no door there.", Blind ? "feel" : "see");
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -440,7 +440,7 @@ struct obj *obj; /* missile (or stack providing it) */
|
|||||||
tmp_at(bhitpos.x, bhitpos.y);
|
tmp_at(bhitpos.x, bhitpos.y);
|
||||||
delay_output();
|
delay_output();
|
||||||
}
|
}
|
||||||
tmp_at(bhitpos.x, bhitpos.y);
|
if (isok(bhitpos.x, bhitpos.y)) tmp_at(bhitpos.x, bhitpos.y);
|
||||||
delay_output();
|
delay_output();
|
||||||
tmp_at(DISP_END, 0);
|
tmp_at(DISP_END, 0);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -453,7 +453,7 @@ struct obj *instr;
|
|||||||
if (do_spec && instr->spe > 0) {
|
if (do_spec && instr->spe > 0) {
|
||||||
consume_obj_charge(instr, TRUE);
|
consume_obj_charge(instr, TRUE);
|
||||||
|
|
||||||
You("produce soft music.");
|
You("produce %s music.", Hallucination ? "piped" : "soft");
|
||||||
put_monsters_to_sleep(u.ulevel * 5);
|
put_monsters_to_sleep(u.ulevel * 5);
|
||||||
exercise(A_DEX, TRUE);
|
exercise(A_DEX, TRUE);
|
||||||
break;
|
break;
|
||||||
|
|||||||
+1
-1
@@ -829,7 +829,7 @@ SPELL("freeze sphere", "hardcover", P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR
|
|||||||
SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER),
|
SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER),
|
||||||
/* tribute book for 3.6 */
|
/* tribute book for 3.6 */
|
||||||
OBJECT(OBJ("novel", "paperback"), BITS(0,0,1,0,0,0,0,1,0,0,0,P_NONE,HI_PAPER), 0,
|
OBJECT(OBJ("novel", "paperback"), BITS(0,0,1,0,0,0,0,1,0,0,0,P_NONE,HI_PAPER), 0,
|
||||||
SPBOOK_CLASS, 0, 0, 0, 1, 0, 0, 0, 1, 20, CLR_BRIGHT_BLUE),
|
SPBOOK_CLASS, 0, 0, 0, 20, 0, 0, 0, 1, 20, CLR_BRIGHT_BLUE),
|
||||||
/* a special, one of a kind, spellbook */
|
/* a special, one of a kind, spellbook */
|
||||||
OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0,
|
OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0,
|
||||||
SPBOOK_CLASS, 0, 0,20, 10000, 0, 0, 0, 7, 20, HI_PAPER),
|
SPBOOK_CLASS, 0, 0,20, 10000, 0, 0, 0, 7, 20, HI_PAPER),
|
||||||
|
|||||||
+37
-1
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.5 objnam.c $NHDT-Date: 1426470349 2015/03/16 01:45:49 $ $NHDT-Branch: derek-farming $:$NHDT-Revision: 1.108 $ */
|
/* NetHack 3.5 objnam.c $NHDT-Date: 1429413519 2015/04/19 03:18:39 $ $NHDT-Branch: master $:$NHDT-Revision: 1.128 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
#define NUMOBUF 12
|
#define NUMOBUF 12
|
||||||
|
|
||||||
STATIC_DCL char *FDECL(strprepend,(char *,const char *));
|
STATIC_DCL char *FDECL(strprepend,(char *,const char *));
|
||||||
|
STATIC_DCL short FDECL(rnd_otyp_by_wpnskill, (SCHAR_P));
|
||||||
STATIC_DCL boolean FDECL(wishymatch, (const char *,const char *,BOOLEAN_P));
|
STATIC_DCL boolean FDECL(wishymatch, (const char *,const char *,BOOLEAN_P));
|
||||||
STATIC_DCL char *NDECL(nextobuf);
|
STATIC_DCL char *NDECL(nextobuf);
|
||||||
STATIC_DCL void FDECL(releaseobuf, (char *));
|
STATIC_DCL void FDECL(releaseobuf, (char *));
|
||||||
@@ -566,6 +567,10 @@ struct obj *obj;
|
|||||||
!objects[otyp].oc_uses_known;
|
!objects[otyp].oc_uses_known;
|
||||||
bareobj.quan = 1L; /* don't want plural */
|
bareobj.quan = 1L; /* don't want plural */
|
||||||
bareobj.corpsenm = NON_PM; /* suppress statue and figurine details */
|
bareobj.corpsenm = NON_PM; /* suppress statue and figurine details */
|
||||||
|
/* but suppressing fruit details leads to "bad fruit #0"
|
||||||
|
[perhaps we should force "slime mold" rather than use xname?] */
|
||||||
|
if (obj->otyp == SLIME_MOLD) bareobj.spe = obj->spe;
|
||||||
|
|
||||||
bufp = distant_name(&bareobj, xname); /* xname(&bareobj) */
|
bufp = distant_name(&bareobj, xname); /* xname(&bareobj) */
|
||||||
if (!strncmp(bufp, "uncursed ", 9)) bufp += 9; /* Role_if(PM_PRIEST) */
|
if (!strncmp(bufp, "uncursed ", 9)) bufp += 9; /* Role_if(PM_PRIEST) */
|
||||||
|
|
||||||
@@ -2277,6 +2282,27 @@ struct alt_spellings {
|
|||||||
{ (const char *)0, 0 },
|
{ (const char *)0, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
short
|
||||||
|
rnd_otyp_by_wpnskill(skill)
|
||||||
|
schar skill;
|
||||||
|
{
|
||||||
|
int i,n = 0;
|
||||||
|
short otyp;
|
||||||
|
for (i = bases[WEAPON_CLASS]; i < NUM_OBJECTS && objects[i].oc_class == WEAPON_CLASS; i++)
|
||||||
|
if (objects[i].oc_skill == skill) {
|
||||||
|
n++;
|
||||||
|
otyp = i;
|
||||||
|
}
|
||||||
|
if (n > 0) {
|
||||||
|
n = rn2(n);
|
||||||
|
for (i = bases[WEAPON_CLASS]; i < NUM_OBJECTS && objects[i].oc_class == WEAPON_CLASS; i++)
|
||||||
|
if (objects[i].oc_skill == skill)
|
||||||
|
if (--n < 0) return i;
|
||||||
|
}
|
||||||
|
return STRANGE_OBJECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return something wished for. Specifying a null pointer for
|
* Return something wished for. Specifying a null pointer for
|
||||||
* the user request string results in a random object. Otherwise,
|
* the user request string results in a random object. Otherwise,
|
||||||
@@ -3024,6 +3050,16 @@ wiztrap:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!oclass && !typ) {
|
||||||
|
if (!strncmpi(bp, "polearm", 7)) {
|
||||||
|
typ = rnd_otyp_by_wpnskill(P_POLEARMS);
|
||||||
|
goto typfnd;
|
||||||
|
} else if (!strncmpi(bp, "hammer", 6)) {
|
||||||
|
typ = rnd_otyp_by_wpnskill(P_HAMMER);
|
||||||
|
goto typfnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!oclass) return((struct obj *)0);
|
if(!oclass) return((struct obj *)0);
|
||||||
any:
|
any:
|
||||||
if(!oclass) oclass = wrpsym[rn2((int)sizeof(wrpsym))];
|
if(!oclass) oclass = wrpsym[rn2((int)sizeof(wrpsym))];
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.5 pager.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
|
/* NetHack 3.5 pager.c $NHDT-Date: 1429408230 2015/04/19 01:50:30 $ $NHDT-Branch: master $:$NHDT-Revision: 1.62 $ */
|
||||||
/* NetHack 3.5 pager.c $Date: 2012/01/15 09:27:06 $ $Revision: 1.41 $ */
|
/* NetHack 3.5 pager.c $Date: 2012/01/15 09:27:06 $ $Revision: 1.41 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|||||||
+4
-4
@@ -708,7 +708,7 @@ menu_item **pick_list; /* return list of items picked */
|
|||||||
int how; /* type of query */
|
int how; /* type of query */
|
||||||
boolean FDECL((*allow), (OBJ_P));/* allow function */
|
boolean FDECL((*allow), (OBJ_P));/* allow function */
|
||||||
{
|
{
|
||||||
int i, n;
|
int i, n, actualn;
|
||||||
winid win;
|
winid win;
|
||||||
struct obj *curr, *last, fake_hero_object;
|
struct obj *curr, *last, fake_hero_object;
|
||||||
struct obj **oarray;
|
struct obj **oarray;
|
||||||
@@ -727,7 +727,7 @@ boolean FDECL((*allow), (OBJ_P));/* allow function */
|
|||||||
last = curr;
|
last = curr;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
actualn = n;
|
||||||
if (engulfer) {
|
if (engulfer) {
|
||||||
++n;
|
++n;
|
||||||
/* don't autoselect swallowed hero if it's the only choice */
|
/* don't autoselect swallowed hero if it's the only choice */
|
||||||
@@ -744,7 +744,7 @@ boolean FDECL((*allow), (OBJ_P));/* allow function */
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
oarray = objarr_init(n);
|
oarray = objarr_init(actualn);
|
||||||
/* Add objects to the array */
|
/* Add objects to the array */
|
||||||
i = 0;
|
i = 0;
|
||||||
for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
|
for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
|
||||||
@@ -767,7 +767,7 @@ boolean FDECL((*allow), (OBJ_P));/* allow function */
|
|||||||
pack = flags.inv_order;
|
pack = flags.inv_order;
|
||||||
do {
|
do {
|
||||||
printed_type_name = FALSE;
|
printed_type_name = FALSE;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < actualn; i++) {
|
||||||
curr = oarray[i];
|
curr = oarray[i];
|
||||||
if ((qflags & FEEL_COCKATRICE) && curr->otyp == CORPSE &&
|
if ((qflags & FEEL_COCKATRICE) && curr->otyp == CORPSE &&
|
||||||
will_feel_cockatrice(curr, FALSE)) {
|
will_feel_cockatrice(curr, FALSE)) {
|
||||||
|
|||||||
+1
-1
@@ -300,7 +300,7 @@ newman()
|
|||||||
enmax = rounddiv((long)enmax * (long)rn1(4, 8), 10);
|
enmax = rounddiv((long)enmax * (long)rn1(4, 8), 10);
|
||||||
for (i = 0; (u.ulevel = i) < newlvl; i++) enmax += newpw();
|
for (i = 0; (u.ulevel = i) < newlvl; i++) enmax += newpw();
|
||||||
if (enmax < u.ulevel) enmax = u.ulevel;
|
if (enmax < u.ulevel) enmax = u.ulevel;
|
||||||
u.uen = rounddiv((long)u.uen * (long)enmax, u.uenmax);
|
u.uen = rounddiv((long)u.uen * (long)enmax, ((u.uenmax < 1) ? 1 : u.uenmax));
|
||||||
u.uenmax = enmax;
|
u.uenmax = enmax;
|
||||||
/* [should alignment record be tweaked too?] */
|
/* [should alignment record be tweaked too?] */
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.5 potion.c $NHDT-Date: 1426953330 2015/03/21 15:55:30 $ $NHDT-Branch: master $:$NHDT-Revision: 1.99 $ */
|
/* NetHack 3.5 potion.c $NHDT-Date: 1428972597 2015/04/14 00:49:57 $ $NHDT-Branch: master $:$NHDT-Revision: 1.111 $ */
|
||||||
/* NetHack 3.5 potion.c $Date: 2013/11/05 00:57:55 $ $Revision: 1.91 $ */
|
/* NetHack 3.5 potion.c $Date: 2013/11/05 00:57:55 $ $Revision: 1.91 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -1820,7 +1820,7 @@ dodip()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(potion->otyp == POT_ACID && obj->otyp == CORPSE &&
|
if(potion->otyp == POT_ACID && obj->otyp == CORPSE &&
|
||||||
obj->corpsenm == PM_LICHEN & !Blind) {
|
obj->corpsenm == PM_LICHEN && !Blind) {
|
||||||
pline("%s %s %s around the edges.", The(cxname(obj)),
|
pline("%s %s %s around the edges.", The(cxname(obj)),
|
||||||
otense(obj, "turn"), potion->odiluted ?
|
otense(obj, "turn"), potion->odiluted ?
|
||||||
hcolor(NH_ORANGE) : hcolor(NH_RED));
|
hcolor(NH_ORANGE) : hcolor(NH_RED));
|
||||||
|
|||||||
-10
@@ -149,16 +149,6 @@ in_trouble()
|
|||||||
struct obj *otmp;
|
struct obj *otmp;
|
||||||
int i, j, count=0;
|
int i, j, count=0;
|
||||||
|
|
||||||
/* Borrowed from eat.c */
|
|
||||||
|
|
||||||
#define SATIATED 0
|
|
||||||
#define NOT_HUNGRY 1
|
|
||||||
#define HUNGRY 2
|
|
||||||
#define WEAK 3
|
|
||||||
#define FAINTING 4
|
|
||||||
#define FAINTED 5
|
|
||||||
#define STARVED 6
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* major troubles
|
* major troubles
|
||||||
*/
|
*/
|
||||||
|
|||||||
+1
-1
@@ -568,7 +568,7 @@ unsigned int *stuckid, *steedid;
|
|||||||
foo = time_from_yyyymmddhhmmss(timebuf);
|
foo = time_from_yyyymmddhhmmss(timebuf);
|
||||||
|
|
||||||
ReadTimebuf(ubirthday);
|
ReadTimebuf(ubirthday);
|
||||||
ReadTimebuf(urealtime.realtime);
|
mread(fd, &urealtime.realtime, sizeof(urealtime.realtime));
|
||||||
ReadTimebuf(urealtime.restored);
|
ReadTimebuf(urealtime.restored);
|
||||||
#if defined(BSD) && !defined(POSIX_TYPES)
|
#if defined(BSD) && !defined(POSIX_TYPES)
|
||||||
(void) time((long *)&urealtime.restored);
|
(void) time((long *)&urealtime.restored);
|
||||||
|
|||||||
+2
-2
@@ -307,10 +307,10 @@ register int fd, mode;
|
|||||||
#ifdef SYSFLAGS
|
#ifdef SYSFLAGS
|
||||||
bwrite(fd, (genericptr_t) &sysflags, sizeof(struct sysflag));
|
bwrite(fd, (genericptr_t) &sysflags, sizeof(struct sysflag));
|
||||||
#endif
|
#endif
|
||||||
urealtime.realtime += (getnow() - urealtime.restored);
|
urealtime.realtime += (long)(getnow() - urealtime.restored);
|
||||||
bwrite(fd, (genericptr_t) &u, sizeof(struct you));
|
bwrite(fd, (genericptr_t) &u, sizeof(struct you));
|
||||||
bwrite(fd, yyyymmddhhmmss(ubirthday), 14);
|
bwrite(fd, yyyymmddhhmmss(ubirthday), 14);
|
||||||
bwrite(fd, yyyymmddhhmmss(urealtime.realtime), 14);
|
bwrite(fd, (genericptr_t) &urealtime.realtime, sizeof(urealtime.realtime));
|
||||||
bwrite(fd, yyyymmddhhmmss(urealtime.restored), 14);
|
bwrite(fd, yyyymmddhhmmss(urealtime.restored), 14);
|
||||||
save_killers(fd, mode);
|
save_killers(fd, mode);
|
||||||
|
|
||||||
|
|||||||
@@ -67,9 +67,14 @@ dosit()
|
|||||||
register struct obj *obj;
|
register struct obj *obj;
|
||||||
|
|
||||||
obj = level.objects[u.ux][u.uy];
|
obj = level.objects[u.ux][u.uy];
|
||||||
|
if (youmonst.data->mlet == S_DRAGON && obj->oclass == COIN_CLASS) {
|
||||||
|
You("coil up around your %shoard.",
|
||||||
|
(obj->quan + money_cnt(invent) < u.ulevel*1000) ? "meager " : "");
|
||||||
|
} else {
|
||||||
You("sit on %s.", the(xname(obj)));
|
You("sit on %s.", the(xname(obj)));
|
||||||
if (!(Is_box(obj) || objects[obj->otyp].oc_material == CLOTH))
|
if (!(Is_box(obj) || objects[obj->otyp].oc_material == CLOTH))
|
||||||
pline("It's not very comfortable...");
|
pline("It's not very comfortable...");
|
||||||
|
}
|
||||||
} else if (trap != 0 || (u.utrap && (u.utraptype >= TT_LAVA))) {
|
} else if (trap != 0 || (u.utrap && (u.utraptype >= TT_LAVA))) {
|
||||||
if (u.utrap) {
|
if (u.utrap) {
|
||||||
exercise(A_WIS, FALSE); /* you're getting stuck longer */
|
exercise(A_WIS, FALSE); /* you're getting stuck longer */
|
||||||
|
|||||||
@@ -1001,6 +1001,9 @@ dochat()
|
|||||||
}
|
}
|
||||||
|
|
||||||
tx = u.ux+u.dx; ty = u.uy+u.dy;
|
tx = u.ux+u.dx; ty = u.uy+u.dy;
|
||||||
|
|
||||||
|
if (!isok(tx,ty)) return (0);
|
||||||
|
|
||||||
mtmp = m_at(tx, ty);
|
mtmp = m_at(tx, ty);
|
||||||
|
|
||||||
if ((!mtmp || mtmp->mundetected) &&
|
if ((!mtmp || mtmp->mundetected) &&
|
||||||
|
|||||||
+12
-4
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.5 spell.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
|
/* NetHack 3.5 spell.c $NHDT-Date: 1429513494 2015/04/20 07:04:54 $ $NHDT-Branch: master $:$NHDT-Revision: 1.57 $ */
|
||||||
/* NetHack 3.5 spell.c $Date: 2011/12/29 22:01:25 $ $Revision: 1.44 $ */
|
/* NetHack 3.5 spell.c $Date: 2011/12/29 22:01:25 $ $Revision: 1.44 $ */
|
||||||
/* Copyright (c) M. Stephenson 1988 */
|
/* Copyright (c) M. Stephenson 1988 */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -452,10 +452,18 @@ register struct obj *spellbook;
|
|||||||
|
|
||||||
/* 3.6.0 tribute */
|
/* 3.6.0 tribute */
|
||||||
if (booktype == SPE_NOVEL) {
|
if (booktype == SPE_NOVEL) {
|
||||||
/* Obtain current Terry Pratchett book
|
/* Obtain current Terry Pratchett book title */
|
||||||
title for the current game. */
|
|
||||||
const char *tribtitle = noveltitle(&spellbook->novelidx);
|
const char *tribtitle = noveltitle(&spellbook->novelidx);
|
||||||
read_tribute("books", tribtitle, 0);
|
if (read_tribute("books", tribtitle, 0)) {
|
||||||
|
u.uconduct.literate++;
|
||||||
|
check_unpaid(spellbook);
|
||||||
|
if (!u.uevent.read_tribute) {
|
||||||
|
/* give bonus of 20 xp and 4*20+0 pts */
|
||||||
|
more_experienced(20, 0);
|
||||||
|
newexplevel();
|
||||||
|
u.uevent.read_tribute = 1; /* only once */
|
||||||
|
}
|
||||||
|
}
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -3470,7 +3470,7 @@ drown()
|
|||||||
}
|
}
|
||||||
u.uinwater = 1;
|
u.uinwater = 1;
|
||||||
You("drown.");
|
You("drown.");
|
||||||
for (;;) {
|
for (i = 0; i < 5; i++) { /* arbitrary number of loops */
|
||||||
/* killer format and name are reconstructed every iteration
|
/* killer format and name are reconstructed every iteration
|
||||||
because lifesaving resets them */
|
because lifesaving resets them */
|
||||||
pool_of_water = waterbody_name(u.ux, u.uy);
|
pool_of_water = waterbody_name(u.ux, u.uy);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/* NetHack 3.5 posixregex.c $NHDT-Date: 1428590280 2015/04/09 14:38:00 $ $NHDT-Branch: scshunt-regex $:$NHDT-Revision: 1.0 $ */
|
/* NetHack 3.5 posixregex.c $NHDT-Date: 1428970913 2015/04/14 00:21:53 $ $NHDT-Branch: master $:$NHDT-Revision: 1.0 $ */
|
||||||
/* Copyright (c) Sean Hunt 2015. */
|
/* Copyright (c) Sean Hunt 2015. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
#include <hack.h>
|
#include "hack.h"
|
||||||
|
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ struct nhregex {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct nhregex *regex_init() {
|
struct nhregex *regex_init() {
|
||||||
return malloc (sizeof (struct nhregex));
|
return (struct nhregex *)alloc(sizeof (struct nhregex));
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean regex_compile(const char *s, struct nhregex *re) {
|
boolean regex_compile(const char *s, struct nhregex *re) {
|
||||||
@@ -65,7 +65,7 @@ const char *regex_error_desc(struct nhregex *re) {
|
|||||||
static char buf[BUFSZ];
|
static char buf[BUFSZ];
|
||||||
|
|
||||||
if (!re || !re->err)
|
if (!re || !re->err)
|
||||||
return NULL;
|
return (const char *)0;
|
||||||
|
|
||||||
/* FIXME: Using a static buffer here is not ideal, but avoids memory
|
/* FIXME: Using a static buffer here is not ideal, but avoids memory
|
||||||
* leaks. Consider the allocation more carefully. */
|
* leaks. Consider the allocation more carefully. */
|
||||||
@@ -75,11 +75,12 @@ const char *regex_error_desc(struct nhregex *re) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean regex_match(const char *s, struct nhregex *re) {
|
boolean regex_match(const char *s, struct nhregex *re) {
|
||||||
|
int result;
|
||||||
|
|
||||||
if (!re)
|
if (!re)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
int result;
|
if ((result = regexec(&re->re, s, 0, (genericptr_t)0, 0))) {
|
||||||
if ((result = regexec(&re->re, s, 0, NULL, 0))) {
|
|
||||||
if (result != REG_NOMATCH)
|
if (result != REG_NOMATCH)
|
||||||
re->err = result;
|
re->err = result;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|||||||
+2
-2
@@ -13,7 +13,7 @@
|
|||||||
/* +-------------------------------------------------------------------+ */
|
/* +-------------------------------------------------------------------+ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$
|
* $NHDT-Date: 1429464661 2015/04/19 17:31:01 $ $NHDT-Branch: master $:$NHDT-Revision: 1.2 $
|
||||||
* $Date: 2002/01/05 21:06:02 $ $Revision: 1.1 $
|
* $Date: 2002/01/05 21:06:02 $ $Revision: 1.1 $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ static void FDECL(ReadTileStrip, (FILE *fd, int len));
|
|||||||
|
|
||||||
/* These should be in gif.h, but there isn't one. */
|
/* These should be in gif.h, but there isn't one. */
|
||||||
boolean FDECL(fopen_gif_file, (const char *, const char *));
|
boolean FDECL(fopen_gif_file, (const char *, const char *));
|
||||||
boolean FDECL(read_gif_tile, (pixel(*)[]));
|
boolean FDECL(read_gif_tile, (pixel(*)[TILE_X]));
|
||||||
int NDECL(fclose_gif_file);
|
int NDECL(fclose_gif_file);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|||||||
+6264
-6252
File diff suppressed because it is too large
Load Diff
+7040
-7028
File diff suppressed because it is too large
Load Diff
+2800
-2788
File diff suppressed because it is too large
Load Diff
+34
-15
@@ -1,6 +1,4 @@
|
|||||||
/* NetHack 3.5 tile2bmp.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
|
/* NetHack 3.5 tile2bmp.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
|
||||||
/* NetHack 3.5 tile2bmp.c $Date: 2009/05/06 10:59:00 $ $Revision: 1.6 $ */
|
|
||||||
/* SCCS Id: @(#)tile2bmp.c 3.5 2002/03/14 */
|
|
||||||
/* Copyright (c) NetHack PC Development Team 1995 */
|
/* Copyright (c) NetHack PC Development Team 1995 */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -8,6 +6,7 @@
|
|||||||
* Edit History:
|
* Edit History:
|
||||||
*
|
*
|
||||||
* Initial Creation M.Allison 1994/01/11
|
* Initial Creation M.Allison 1994/01/11
|
||||||
|
* 256 colour bmp and statue support M.Allison 2015/04/19
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -19,27 +18,29 @@
|
|||||||
#include "win32api.h"
|
#include "win32api.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* #define COLORS_IN_USE MAXCOLORMAPSIZE /* 256 colors */
|
|
||||||
#if (TILE_X==32)
|
#if (TILE_X==32)
|
||||||
#define COLORS_IN_USE 256
|
#define COLORS_IN_USE 256
|
||||||
#else
|
#else
|
||||||
#define COLORS_IN_USE 16 /* 16 colors */
|
/*#define COLORS_IN_USE 16 */ /* 16 colors */
|
||||||
|
#define COLORS_IN_USE 256 /* 256 colors */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BITCOUNT 8
|
#define BITCOUNT 8
|
||||||
|
|
||||||
extern char *FDECL(tilename, (int, int));
|
extern char *FDECL(tilename, (int, int));
|
||||||
|
|
||||||
|
#define MAGICTILENO (340 + 440 + 231 + 340)
|
||||||
|
|
||||||
#if BITCOUNT==4
|
#if BITCOUNT==4
|
||||||
#define MAX_X 320 /* 2 per byte, 4 bits per pixel */
|
#define MAX_X 320 /* 2 per byte, 4 bits per pixel */
|
||||||
#define MAX_Y 480
|
#define MAX_Y 480
|
||||||
#else
|
#else
|
||||||
# if (TILE_X==32)
|
# if (TILE_X==32)
|
||||||
#define MAX_X (32 * 40)
|
#define MAX_X (32 * 40)
|
||||||
#define MAX_Y 960
|
#define MAX_Y ((MAGICTILENO * 32) / 40) * 2
|
||||||
# else
|
# else
|
||||||
#define MAX_X 640 /* 1 per byte, 8 bits per pixel */
|
#define MAX_X (16 * 40)
|
||||||
#define MAX_Y 480
|
#define MAX_Y ((MAGICTILENO * 16) / 40) * 2
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -119,7 +120,8 @@ struct tagBMP{
|
|||||||
#if (TILE_X==32)
|
#if (TILE_X==32)
|
||||||
#define RGBQUAD_COUNT 256
|
#define RGBQUAD_COUNT 256
|
||||||
#else
|
#else
|
||||||
#define RGBQUAD_COUNT 16
|
/*#define RGBQUAD_COUNT 16 */
|
||||||
|
#define RGBQUAD_COUNT 256
|
||||||
#endif
|
#endif
|
||||||
RGBQUAD bmaColors[RGBQUAD_COUNT];
|
RGBQUAD bmaColors[RGBQUAD_COUNT];
|
||||||
#endif
|
#endif
|
||||||
@@ -146,11 +148,11 @@ char *tilefiles[] = {
|
|||||||
#if (TILE_X == 32)
|
#if (TILE_X == 32)
|
||||||
"../win/share/mon32.txt",
|
"../win/share/mon32.txt",
|
||||||
"../win/share/obj32.txt",
|
"../win/share/obj32.txt",
|
||||||
"../win/share/oth32.txt"
|
"../win/share/oth32.txt",
|
||||||
#else
|
#else
|
||||||
"../win/share/monsters.txt",
|
"../win/share/monsters.txt",
|
||||||
"../win/share/objects.txt",
|
"../win/share/objects.txt",
|
||||||
"../win/share/other.txt"
|
"../win/share/other.txt",
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -160,6 +162,7 @@ int max_tiles_in_row = 40;
|
|||||||
int tiles_in_row;
|
int tiles_in_row;
|
||||||
int filenum;
|
int filenum;
|
||||||
int initflag;
|
int initflag;
|
||||||
|
int pass;
|
||||||
int yoffset,xoffset;
|
int yoffset,xoffset;
|
||||||
char bmpname[128];
|
char bmpname[128];
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
@@ -190,12 +193,14 @@ char *argv[];
|
|||||||
xoffset = yoffset = 0;
|
xoffset = yoffset = 0;
|
||||||
initflag = 0;
|
initflag = 0;
|
||||||
filenum = 0;
|
filenum = 0;
|
||||||
|
pass = 0;
|
||||||
fp = fopen(bmpname,"wb");
|
fp = fopen(bmpname,"wb");
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
printf("Error creating tile file %s, aborting.\n",bmpname);
|
printf("Error creating tile file %s, aborting.\n",bmpname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
while (filenum < (sizeof(tilefiles) / sizeof(char *))) {
|
while (pass < 4) {
|
||||||
|
filenum =pass % (sizeof(tilefiles) / sizeof(char *));
|
||||||
if (!fopen_text_file(tilefiles[filenum], RDTMODE)) {
|
if (!fopen_text_file(tilefiles[filenum], RDTMODE)) {
|
||||||
Fprintf(stderr,
|
Fprintf(stderr,
|
||||||
"usage: tile2bmp (from the util directory)\n");
|
"usage: tile2bmp (from the util directory)\n");
|
||||||
@@ -235,7 +240,7 @@ char *argv[];
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
(void) fclose_text_file();
|
(void) fclose_text_file();
|
||||||
++filenum;
|
++pass;
|
||||||
}
|
}
|
||||||
fwrite(&bmp, sizeof(bmp), 1, fp);
|
fwrite(&bmp, sizeof(bmp), 1, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@@ -303,18 +308,23 @@ BITMAPINFOHEADER *pbmih;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (TILE_X==16)
|
#if (TILE_X==16)
|
||||||
pbmih->biSizeImage = lelong(0);
|
/* pbmih->biSizeImage = lelong(0); */
|
||||||
|
pbmih->biSizeImage = lelong(((w * cClrBits +31) & ~31) /8 * h);
|
||||||
#else
|
#else
|
||||||
pbmih->biSizeImage = lelong(((w * cClrBits +31) & ~31) /8 * h);
|
pbmih->biSizeImage = lelong(((w * cClrBits +31) & ~31) /8 * h);
|
||||||
#endif
|
#endif
|
||||||
pbmih->biClrImportant = (DWORD)0;
|
pbmih->biClrImportant = (DWORD)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int graymappings[] = {
|
||||||
|
/* . A B C D E F G H I J K L M N O P */
|
||||||
|
0, 1,17,18,19,20,27,22,23,24,25,26,21,15,13,14,14};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
build_bmptile(pixels)
|
build_bmptile(pixels)
|
||||||
pixel (*pixels)[TILE_X];
|
pixel (*pixels)[TILE_X];
|
||||||
{
|
{
|
||||||
int cur_x, cur_y, cur_color;
|
int cur_x, cur_y, cur_color, apply_color;
|
||||||
int x,y;
|
int x,y;
|
||||||
|
|
||||||
for (cur_y = 0; cur_y < TILE_Y; cur_y++) {
|
for (cur_y = 0; cur_y < TILE_Y; cur_y++) {
|
||||||
@@ -328,6 +338,15 @@ pixel (*pixels)[TILE_X];
|
|||||||
if (cur_color >= num_colors)
|
if (cur_color >= num_colors)
|
||||||
Fprintf(stderr, "color not in colormap!\n");
|
Fprintf(stderr, "color not in colormap!\n");
|
||||||
y = (MAX_Y - 1) - (cur_y + yoffset);
|
y = (MAX_Y - 1) - (cur_y + yoffset);
|
||||||
|
apply_color = cur_color;
|
||||||
|
if (pass == 3) {
|
||||||
|
/* map to shades of gray */
|
||||||
|
if (cur_color > (SIZE(graymappings)-1))
|
||||||
|
Fprintf(stderr, "Gray mapping issue %d %d.\n",
|
||||||
|
cur_color, SIZE(graymappings)-1);
|
||||||
|
else
|
||||||
|
apply_color = graymappings[cur_color];
|
||||||
|
}
|
||||||
#if BITCOUNT==4
|
#if BITCOUNT==4
|
||||||
x = (cur_x / 2) + xoffset;
|
x = (cur_x / 2) + xoffset;
|
||||||
bmp.packtile[y][x] = cur_x%2 ?
|
bmp.packtile[y][x] = cur_x%2 ?
|
||||||
@@ -335,7 +354,7 @@ pixel (*pixels)[TILE_X];
|
|||||||
(uchar)(cur_color<<4);
|
(uchar)(cur_color<<4);
|
||||||
#else
|
#else
|
||||||
x = cur_x + xoffset;
|
x = cur_x + xoffset;
|
||||||
bmp.packtile[y][x] = (uchar)cur_color;
|
bmp.packtile[y][x] = (uchar)apply_color;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-7
@@ -1,5 +1,4 @@
|
|||||||
/* NetHack 3.5 tilemap.c $NHDT-Date: 1425082379 2015/02/28 00:12:59 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ */
|
/* NetHack 3.5 tilemap.c $NHDT-Date: 1429464668 2015/04/19 17:31:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */
|
||||||
/* NetHack 3.5 tilemap.c $Date: 2009/05/06 10:59:02 $ $Revision: 1.7 $ */
|
|
||||||
/* SCCS Id: @(#)tilemap.c 3.5 2000/06/04 */
|
/* SCCS Id: @(#)tilemap.c 3.5 2000/06/04 */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -238,7 +237,7 @@ int set, entry;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
short tilemap[MAX_GLYPH];
|
short tilemap[MAX_GLYPH];
|
||||||
int lastmontile, lastobjtile, lastothtile;
|
int lastmontile, lastobjtile, lastothtile, laststatuetile;
|
||||||
|
|
||||||
/* Number of tiles for invisible monsters */
|
/* Number of tiles for invisible monsters */
|
||||||
#define NUM_INVIS_TILES 1
|
#define NUM_INVIS_TILES 1
|
||||||
@@ -357,13 +356,25 @@ init_tilemap()
|
|||||||
tilenum++;
|
tilenum++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* statue patch: statues still use the same glyph as in vanilla */
|
lastothtile = tilenum - 1;
|
||||||
|
|
||||||
for ( i = 0; i < NUMMONS; i++) {
|
/* skip over the substitutes to get to the grayscale statues */
|
||||||
tilemap[GLYPH_STATUE_OFF+i] = tilemap[GLYPH_OBJ_OFF+STATUE];
|
for (i = 0; i < SIZE(substitutes); i++) {
|
||||||
|
tilenum += substitutes[i].last_glyph - substitutes[i].first_glyph + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
lastothtile = tilenum - 1;
|
/* statue patch: statues look more like the monster */
|
||||||
|
condnum = 0; /* doing monsters again, so reset */
|
||||||
|
for (i = 0; i < NUMMONS; i++) {
|
||||||
|
tilemap[GLYPH_STATUE_OFF+i] = tilenum;
|
||||||
|
tilenum++;
|
||||||
|
while (conditionals[condnum].sequence == MON_GLYPH &&
|
||||||
|
conditionals[condnum].predecessor == i) {
|
||||||
|
condnum++;
|
||||||
|
tilenum++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
laststatuetile = tilenum - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *prolog[] = {
|
const char *prolog[] = {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.5 tiletext.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
|
/* NetHack 3.5 tiletext.c $NHDT-Date: 1429484196 2015/04/19 22:56:36 $ $NHDT-Branch: master $:$NHDT-Revision: 1.6 $ */
|
||||||
/* NetHack 3.5 tiletext.c $Date: 2009/05/06 10:59:03 $ $Revision: 1.4 $ */
|
/* NetHack 3.5 tiletext.c $Date: 2009/05/06 10:59:03 $ $Revision: 1.4 $ */
|
||||||
/* SCCS Id: @(#)tiletext.c 3.5 1999/10/24 */
|
/* SCCS Id: @(#)tiletext.c 3.5 1999/10/24 */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -33,7 +33,7 @@ static void FDECL(write_txttile, (FILE *, pixel(*)[TILE_X]));
|
|||||||
|
|
||||||
/* Ugh. DICE doesn't like %[A-Z], so we have to spell it out... */
|
/* Ugh. DICE doesn't like %[A-Z], so we have to spell it out... */
|
||||||
#define FORMAT_STRING \
|
#define FORMAT_STRING \
|
||||||
"%[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789] = (%d, %d, %d) "
|
"%[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.] = (%d, %d, %d) "
|
||||||
|
|
||||||
static void
|
static void
|
||||||
read_text_colormap(txtfile)
|
read_text_colormap(txtfile)
|
||||||
|
|||||||
Reference in New Issue
Block a user