update dat src include...
This commit is contained in:
+3
-3
@@ -1384,7 +1384,7 @@ dispater
|
||||
Wealth". It refers to the wealth of precious stone below the
|
||||
earth.
|
||||
[ Encyclopedia Mythica, ed. M.F. Lindemans ]
|
||||
# 3.7; monster adapted from slash'em based on an AD&D Monster Manual entry;
|
||||
# 5.0; monster adapted from slash'em based on an AD&D Monster Manual entry;
|
||||
# slash'em lacked a description so this entry has been created from scratch;
|
||||
# the puma comparison is how the AD&D monster is described (except that
|
||||
# that creature has six legs and two tentacles!) but the actual monster's
|
||||
@@ -2048,7 +2048,7 @@ gem or rock
|
||||
same as for jewels: it is always the false ones that look the
|
||||
most real, the most brilliant.
|
||||
[ Salvador Dali ]
|
||||
# 3.7; monster derived from slash'em which lacked a description so this
|
||||
# 5.0; monster derived from slash'em which lacked a description so this
|
||||
# entry has been created from scratch
|
||||
genetic engineer
|
||||
These very odd people have mastered the ability to insert gene
|
||||
@@ -2418,7 +2418,7 @@ helm of caution
|
||||
A helmet which confers the "warning" property, sensing the
|
||||
strength of threats posed by unseen hostile creatures.
|
||||
# note: this quotation had "high of steel" but we're going to cheat--it is
|
||||
# now deliberately mistranslated as "high of crystal" to match nethack 3.7's
|
||||
# now deliberately mistranslated as "high of crystal" to match nethack 5.0's
|
||||
# change to helm of brilliance and become more useful to players.
|
||||
# PR #1109 wanted to change it to be for all helms but being covered with
|
||||
# gems and gold is not appropriate for ordinary helmets (plus it states that
|
||||
|
||||
+1
-1
@@ -185,7 +185,7 @@ dungeon = {
|
||||
},
|
||||
{
|
||||
name = "minend",
|
||||
-- 3.7.0: minend changed to no-bones to simplify achievement tracking
|
||||
-- 5.0.0: minend changed to no-bones to simplify achievement tracking
|
||||
-- bonetag = "E"
|
||||
base = -1,
|
||||
nlevels = 3
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
NetHack History file for release 3.7
|
||||
NetHack History file for release 5.0
|
||||
|
||||
Behold, mortal, the origins of NetHack...
|
||||
|
||||
|
||||
+2
-2
@@ -2464,7 +2464,7 @@ Dibbler removed his cigar.
|
||||
[Moving Pictures, by Terry Pratchett]
|
||||
%e passage
|
||||
#
|
||||
# New for 3.7 - these are worthy but 16 passages are already more than enough.
|
||||
# New for 5.0 - these are worthy but 16 passages are already more than enough.
|
||||
#-#
|
||||
#-# p. 304
|
||||
#-%passage 17
|
||||
@@ -4138,7 +4138,7 @@ followed by long periods of being dead."
|
||||
[Interesting Times, by Terry Pratchett]
|
||||
%e passage
|
||||
#
|
||||
# 3 new passages for 3.7
|
||||
# 3 new passages for 5.0
|
||||
#
|
||||
# p. 45
|
||||
%passage 11
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@ typedef long off_t;
|
||||
|
||||
/* data librarian defs */
|
||||
#define DLBFILE "nhdat" /* main library */
|
||||
/* nhsdat sound library not used in 3.7 */
|
||||
/* nhsdat sound library not used in 5.0 */
|
||||
#undef DLBFILE2
|
||||
|
||||
#ifndef CROSS_TO_AMIGA
|
||||
|
||||
+1
-1
@@ -422,7 +422,7 @@ extern struct nomakedefs_s nomakedefs;
|
||||
#include "color.h"
|
||||
|
||||
/*
|
||||
* Version 3.7.x has aspirations of portable file formats. We
|
||||
* Version 5.0.x has aspirations of portable file formats. We
|
||||
* make a distinction between MAIL functionality and MAIL_STRUCTURES
|
||||
* so that the underlying structures are consistent, whether MAIL is
|
||||
* defined or not.
|
||||
|
||||
+6
-6
@@ -972,7 +972,7 @@
|
||||
8, CLR_RED, SCORPION),
|
||||
/*
|
||||
* trappers, lurkers, &c
|
||||
* Note: prior to 3.7, these were defined to do AD_DGST damage,
|
||||
* Note: prior to 5.0, these were defined to do AD_DGST damage,
|
||||
* but they don't swallow their victims into their stomachs and
|
||||
* digest, they enfold and crush or suffocate.
|
||||
* The Monster Manual states that someone engulfed by a trapper
|
||||
@@ -2031,7 +2031,7 @@
|
||||
| M1_OMNIVORE,
|
||||
M2_STRONG, 0,
|
||||
13, HI_GOLD, GOLDEN_NAGA),
|
||||
/* 3.7: guardian naga used to have three attacks: bite, spit, hug
|
||||
/* 5.0: guardian naga used to have three attacks: bite, spit, hug
|
||||
but in order for the hug to succeed the two preceding attacks had
|
||||
to have hit, and it's not possible to both bite and spit, hence
|
||||
the hug never hit; change to spit, bite, touch, hug; if the bite
|
||||
@@ -2132,7 +2132,7 @@
|
||||
M1_HUMANOID | M1_OMNIVORE | M1_POIS | M1_TPORT, M2_HOSTILE,
|
||||
M3_INFRAVISIBLE,
|
||||
9, CLR_CYAN, QUANTUM_MECHANIC),
|
||||
/* 3.7: from slash'em, to expand Q class; hit polymorphs target */
|
||||
/* 5.0: from slash'em, to expand Q class; hit polymorphs target */
|
||||
MON(NAM("genetic engineer"), S_QUANTMECH,
|
||||
LVL(12, 12, 3, 10, 0), (G_GENO | 1),
|
||||
A(ATTK(AT_CLAW, AD_POLY, 1, 4),
|
||||
@@ -2695,7 +2695,7 @@
|
||||
| M2_SHAPESHIFTER,
|
||||
M3_INFRAVISIBLE,
|
||||
11, HI_DOMESTIC, DOPPELGANGER),
|
||||
/* 3.7: shopkeepers used to have speed 18, but if/when they were
|
||||
/* 5.0: shopkeepers used to have speed 18, but if/when they were
|
||||
hasted they always got 2 moves per turn and had a tendency to move
|
||||
away from blocking the door and then move right back; since they
|
||||
might start with a potion of speed and drink that as soon as the
|
||||
@@ -2925,7 +2925,7 @@
|
||||
#define SEDUCTION_ATTACKS_NO \
|
||||
A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), \
|
||||
ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK)
|
||||
/* incubus and succubus; prior to 3.7, succubus and incubus were
|
||||
/* incubus and succubus; prior to 5.0, succubus and incubus were
|
||||
distinct monsters; "amorous demon" is considered to be a temporary
|
||||
placeholder but may be here to stay... */
|
||||
MON(NAMS("incubus", "succubus", "amorous demon"), S_DEMON,
|
||||
@@ -3195,7 +3195,7 @@
|
||||
/*
|
||||
* sea monsters
|
||||
*
|
||||
* 3.7: all the fish except kraken used to specify M1_SLITHY, presumably
|
||||
* 5.0: all the fish except kraken used to specify M1_SLITHY, presumably
|
||||
* cloned from giant eel. Using "slither" to describe their movement
|
||||
* wasn't appropriate. Unfortunately, locomotion() isn't able to choose
|
||||
* "swim" as their movement description because it is only passed a
|
||||
|
||||
+1
-1
@@ -224,7 +224,7 @@ WEAPON("stiletto", NoDes,
|
||||
/* 3.6: worm teeth and crysknives now stack;
|
||||
when a stack of teeth is enchanted at once, they fuse into one crysknife;
|
||||
when a stack of crysknives drops, the whole stack reverts to teeth */
|
||||
/* 3.7: change crysknife from MINERAL to BONE and worm tooth from 0 to BONE */
|
||||
/* 5.0: change crysknife from MINERAL to BONE and worm tooth from 0 to BONE */
|
||||
WEAPON("worm tooth", NoDes,
|
||||
1, 1, 0, 0, 20, 2, 2, 2, 0, 0, P_KNIFE, BONE, CLR_WHITE,
|
||||
WORM_TOOTH),
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
/*#define VERSION_COMPATIBILITY 0x03070000L*/
|
||||
|
||||
/****************************************************************************/
|
||||
/* Version 3.7.x */
|
||||
/* Version 5.0.x */
|
||||
|
||||
/*
|
||||
* NetHack 5.0.0, <insert date here>
|
||||
@@ -95,7 +95,7 @@
|
||||
* the official 3.6.6 binary was built.
|
||||
* windows: switch from using keyhandling dll's to incorporating the three
|
||||
* variations (default, ray, 340) in sys/winnt/nttty.c
|
||||
* curses: cherry-picked selectsaved code from 3.7 for menu of save files
|
||||
* curses: cherry-picked selectsaved code from 5.0 for menu of save files
|
||||
* NetHackW: fix delayed rendering of cursor when using farlook
|
||||
*/
|
||||
|
||||
|
||||
+1
-1
@@ -157,7 +157,7 @@ typedef const char *vA;
|
||||
[nethack's core doesn't use VA_NEXT() so doesn't use VA_SHIFT()
|
||||
either, and this definition is just retained for completeness.
|
||||
lev_comp does use VA_NEXT(), but it passes all 'argX' arguments.
|
||||
Note: as of 3.7.0, lev_comp doesn't exist anymore.]
|
||||
Note: as of 5.0.0, lev_comp doesn't exist anymore.]
|
||||
*/
|
||||
#define VA_SHIFT() \
|
||||
(arg1 = arg2, arg2 = arg3, arg3 = arg4, arg4 = arg5, arg5 = arg6, \
|
||||
|
||||
+1
-1
@@ -164,7 +164,7 @@ PANICTRACE_GDB=2 #at conclusion of panic, show a call traceback and then
|
||||
*/
|
||||
|
||||
/* This used to be force-defined for VMS in topten.c, but with
|
||||
* the global variable consolidation into g in 3.7, it has to be
|
||||
* the global variable consolidation into g in 5.0, it has to be
|
||||
* defined here so that decl.h includes the field in g.
|
||||
*/
|
||||
#define UPDATE_RECORD_IN_PLACE
|
||||
|
||||
+3
-3
@@ -127,7 +127,7 @@ extern
|
||||
#define display_file (*windowprocs.win_display_file)
|
||||
#define start_menu (*windowprocs.win_start_menu)
|
||||
#define end_menu (*windowprocs.win_end_menu)
|
||||
/* 3.7: There are real add_menu() and select_menu in the core now.
|
||||
/* 5.0: There are real add_menu() and select_menu in the core now.
|
||||
* add_menu does some common activities, such as menu_colors.
|
||||
* select_menu does some before and after activities.
|
||||
* add_menu() and select_menu() are in windows.c
|
||||
@@ -151,7 +151,7 @@ extern
|
||||
#define nh_poskey (*windowprocs.win_nh_poskey)
|
||||
#define nhbell (*windowprocs.win_nhbell)
|
||||
#define nh_doprev_message (*windowprocs.win_doprev_message)
|
||||
/* 3.7: There is a real getlin() in the core now, which does
|
||||
/* 5.0: There is a real getlin() in the core now, which does
|
||||
* some before and after activities.
|
||||
* [alternative fix for menu search via ':'.]
|
||||
* getlin() is in windows.c
|
||||
@@ -297,7 +297,7 @@ struct wc_Opt {
|
||||
/* Macro for the currently active Window Port whose function
|
||||
pointers have been loaded */
|
||||
#if 0
|
||||
/* 3.7 The string comparison version isn't used anymore */
|
||||
/* 5.0 The string comparison version isn't used anymore */
|
||||
#define WINDOWPORT(wn) \
|
||||
(windowprocs.name && !strncmpi((#wn), windowprocs.name, strlen((#wn))))
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -167,7 +167,7 @@ typedef struct glyphinfo {
|
||||
#define MENU_ITEMFLAGS_SKIPINVERT 0x0000002U
|
||||
#define MENU_ITEMFLAGS_SKIPMENUCOLORS 0x0000004U
|
||||
|
||||
/* 3.7+ enhanced menu flags that not all window ports are likely to
|
||||
/* 5.0+ enhanced menu flags that not all window ports are likely to
|
||||
* support initially.
|
||||
*
|
||||
* As behavior and appearance modification flags are added, the various
|
||||
|
||||
+1
-1
@@ -683,7 +683,7 @@ rnd_attr(void)
|
||||
{
|
||||
int i, x = rn2(100);
|
||||
|
||||
/* 3.7: the x -= ... calculation used to have an off by 1 error that
|
||||
/* 5.0: the x -= ... calculation used to have an off by 1 error that
|
||||
resulted in the values being biased toward Str and away from Cha */
|
||||
for (i = 0; i < A_MAX; ++i)
|
||||
if ((x -= gu.urole.attrdist[i]) < 0)
|
||||
|
||||
@@ -455,7 +455,7 @@ dig(void)
|
||||
} else if (digtyp == DIGTYP_BOULDER
|
||||
&& (obj = sobj_at(BOULDER, dpx, dpy)) != 0) {
|
||||
fracture_rock(obj);
|
||||
/*[3.7: this probably isn't necessary anymore]*/
|
||||
/*[5.0: this probably isn't necessary anymore]*/
|
||||
if ((bobj = sobj_at(BOULDER, dpx, dpy)) != 0) {
|
||||
/* another boulder here, restack it to the top */
|
||||
obj_extract_self(bobj);
|
||||
|
||||
+2
-2
@@ -2214,7 +2214,7 @@ flush_screen(int cursor_on_u)
|
||||
glyph_info bkglyphinfo = nul_glyphinfo;
|
||||
int bkglyph;
|
||||
|
||||
/* 3.7: don't update map, status, or perm_invent during save/restore */
|
||||
/* 5.0: don't update map, status, or perm_invent during save/restore */
|
||||
if (_suppress_map_output())
|
||||
return;
|
||||
|
||||
@@ -3453,7 +3453,7 @@ t_warn(struct rm *lev)
|
||||
static const char warn_str[] = "wall_angle: %s: case %d: seenv = 0x%x";
|
||||
const char *wname;
|
||||
|
||||
/* 3.7: non-T_wall cases added after shop repair (via breaching a wall,
|
||||
/* 5.0: non-T_wall cases added after shop repair (via breaching a wall,
|
||||
using locking magic to put a door there, then unlocking the door;
|
||||
D_CLOSED carried over to the wall) triggered warning for "unknown" */
|
||||
switch (lev->typ) {
|
||||
|
||||
@@ -77,7 +77,7 @@ boulder_hits_pool(
|
||||
levl[rx][ry].typ = ROOM, levl[rx][ry].flags = 0;
|
||||
recalc_block_point(rx, ry);
|
||||
}
|
||||
/* 3.7: normally DEADMONSTER() is used when traversing the fmon
|
||||
/* 5.0: normally DEADMONSTER() is used when traversing the fmon
|
||||
list--dead monsters usually aren't still at specific map
|
||||
locations; however, if ice melts causing a giant to drown,
|
||||
that giant would still be on the map when it drops inventory;
|
||||
@@ -1533,7 +1533,7 @@ goto_level(
|
||||
* -2 5.21 4.17 0.0
|
||||
* -3 2.08 0.0 0.0
|
||||
*
|
||||
* 3.7.0: the chance for the "mysterious force" to kick in goes down
|
||||
* 5.0.0: the chance for the "mysterious force" to kick in goes down
|
||||
* as it kicks in, starting at 25% per climb attempt and dropping off
|
||||
* gradually but substantially. The drop off is greater when hero is
|
||||
* sent down farther so benefits lawfuls more than chaotics this time.
|
||||
@@ -2438,7 +2438,7 @@ set_wounded_legs(long side, int timex)
|
||||
set_itimeout(&HWounded_legs, (long) timex);
|
||||
/* the leg being wounded and its timeout might differ from one
|
||||
attack to the next, but we don't track the legs separately;
|
||||
3.7: both legs will ultimately heal together; this used to use
|
||||
5.0: both legs will ultimately heal together; this used to use
|
||||
direct assignment instead of bitwise-OR so getting wounded in
|
||||
one leg mysteriously healed the other */
|
||||
EWounded_legs |= side;
|
||||
|
||||
+1
-1
@@ -433,7 +433,7 @@ objtyp_is_callable(int i)
|
||||
|
||||
switch(objects[i].oc_class) {
|
||||
case AMULET_CLASS:
|
||||
/* 3.7: calling these used to be allowed but that enabled the
|
||||
/* 5.0: calling these used to be allowed but that enabled the
|
||||
player to tell whether two unID'd amulets of yendor were both
|
||||
fake or one was real by calling them distinct names and then
|
||||
checking discoveries to see whether first name was replaced
|
||||
|
||||
+1
-1
@@ -2501,7 +2501,7 @@ find_ac(void)
|
||||
uac -= u.ublessed;
|
||||
uac -= u.uspellprot;
|
||||
|
||||
/* put a cap on armor class [3.7: was +127,-128, now reduced to +/- 99 */
|
||||
/* put a cap on armor class [5.0: was +127,-128, now reduced to +/- 99 */
|
||||
if (abs(uac) > AC_MAX)
|
||||
uac = sgn(uac) * AC_MAX;
|
||||
|
||||
|
||||
+2
-2
@@ -601,13 +601,13 @@ really_kick_object(coordxy x, coordxy y)
|
||||
|| closed_door(x + u.dx, y + u.dy))
|
||||
range = 1;
|
||||
|
||||
/* 3.7: this used to skip 'costly' handling if kickedobj->no_charge
|
||||
/* 5.0: this used to skip 'costly' handling if kickedobj->no_charge
|
||||
was set but that optimization could result in no_charge staying set
|
||||
for objects kicked out of the shop */
|
||||
shkp = find_objowner(gk.kickedobj, x, y);
|
||||
costly = (shkp && (costly_spot(x, y) || (costly_adjacent(shkp, x, y)
|
||||
&& gk.kickedobj->unpaid)));
|
||||
/* 3.7: give feedback about the item being kicked; some follow-on
|
||||
/* 5.0: give feedback about the item being kicked; some follow-on
|
||||
messages refer to "it" */
|
||||
Norep("You kick %s.",
|
||||
!isgold ? singular(gk.kickedobj, doname) : doname(gk.kickedobj));
|
||||
|
||||
+1
-1
@@ -2082,7 +2082,7 @@ thitmonst(
|
||||
/* throwing real gems to co-aligned unicorns boosts Luck,
|
||||
to cross-aligned unicorns changes Luck by random amount;
|
||||
throwing worthless glass doesn't affect Luck but doesn't anger them;
|
||||
3.7: treat rocks and gray stones as attacks rather than like glass
|
||||
5.0: treat rocks and gray stones as attacks rather than like glass
|
||||
and also treat gems or glass shot via sling as attacks */
|
||||
if (obj->oclass == GEM_CLASS && is_unicorn(mon->data)
|
||||
&& objects[obj->otyp].oc_material != MINERAL && !uslinging()) {
|
||||
|
||||
@@ -839,7 +839,7 @@ cprefx(int pm)
|
||||
/* life-saving needed to reach here */
|
||||
exercise(A_WIS, FALSE);
|
||||
/* revive an actual corpse; can't do that if it was a tin;
|
||||
3.7: this used to assume that such tins were impossible but
|
||||
5.0: this used to assume that such tins were impossible but
|
||||
they can be wished for in wizard mode; they can't make it
|
||||
to normal play though because bones creation empties them */
|
||||
if (svc.context.victual.piece /* Null for tins */
|
||||
@@ -1891,7 +1891,7 @@ eatcorpse(struct obj *otmp)
|
||||
rotted -= 2L;
|
||||
}
|
||||
|
||||
/* 3.7: globs don't become tainted, they shrink away */
|
||||
/* 5.0: globs don't become tainted, they shrink away */
|
||||
if (!glob && !stoneable && !slimeable && rotted > 5L) {
|
||||
boolean cannibal = maybe_cannibal(mnum, FALSE);
|
||||
|
||||
@@ -2632,7 +2632,7 @@ edibility_prompts(struct obj *otmp)
|
||||
*/
|
||||
char buf[BUFSZ], foodsmell[BUFSZ],
|
||||
it_or_they[QBUFSZ];
|
||||
/* 3.7: decaying globs don't become tainted anymore; in 3.6, they did */
|
||||
/* 5.0: decaying globs don't become tainted anymore; in 3.6, they did */
|
||||
boolean cadaver = (otmp->otyp == CORPSE), stoneorslime = FALSE;
|
||||
int material = objects[otmp->otyp].oc_material, mnum = otmp->corpsenm;
|
||||
long rotted = 0L;
|
||||
@@ -3179,7 +3179,7 @@ gethungry(void)
|
||||
u.uhunger--; /* ordinary food consumption */
|
||||
|
||||
/*
|
||||
* 3.7: trigger is randomized instead of (moves % N). Makes
|
||||
* 5.0: trigger is randomized instead of (moves % N). Makes
|
||||
* ring juggling (using the 'time' option to see the turn counter
|
||||
* in order to time swapping of a pair of rings of slow digestion,
|
||||
* wearing one on one hand, then putting on the other and taking
|
||||
@@ -3209,7 +3209,7 @@ gethungry(void)
|
||||
* Possessing the real Amulet imposes a separate hunger penalty
|
||||
* from wearing an amulet (so gets a double penalty when worn).
|
||||
*
|
||||
* 3.7.0: Worn meat rings don't affect hunger.
|
||||
* 5.0.0: Worn meat rings don't affect hunger.
|
||||
* Same with worn cheap plastic imitation of the Amulet.
|
||||
* +0 ring of protection might do something (enhanced "magical
|
||||
* cancellation") if hero doesn't have protection from some
|
||||
@@ -3222,7 +3222,7 @@ gethungry(void)
|
||||
*/
|
||||
switch (accessorytime) { /* note: use even cases among 0..19 only */
|
||||
case 0:
|
||||
/* 3.7: if not wearing a ring of slow digestion, obtaining
|
||||
/* 5.0: if not wearing a ring of slow digestion, obtaining
|
||||
that property from worn armor (white dragon scales/mail)
|
||||
causes the armor to burn nutrition; since it's not
|
||||
actually a ring, we don't check for it on the ring
|
||||
|
||||
+2
-2
@@ -2298,7 +2298,7 @@ domove_fight_empty(coordxy x, coordxy y)
|
||||
} else if (solid) {
|
||||
/* glyph might indicate unseen terrain if hero is blind;
|
||||
unlike searching, this won't reveal what that terrain is;
|
||||
3.7: used to say "solid rock" for STONE, but that made it be
|
||||
5.0: used to say "solid rock" for STONE, but that made it be
|
||||
different from unmapped walls outside of rooms (and was wrong
|
||||
on arboreal levels) */
|
||||
if (levl[x][y].seenv || IS_STWALL(levl[x][y].typ)
|
||||
@@ -2310,7 +2310,7 @@ domove_fight_empty(coordxy x, coordxy y)
|
||||
}
|
||||
/* note: 'solid' is misleadingly named and catches pools
|
||||
of water and lava as well as rock and walls;
|
||||
3.7: furniture too */
|
||||
5.0: furniture too */
|
||||
} else {
|
||||
Strcpy(buf, "thin air");
|
||||
}
|
||||
|
||||
+1
-1
@@ -93,7 +93,7 @@ staticfn void opt_out_words(char *, int *) NONNULLPTRS;
|
||||
staticfn void build_savebones_compat_string(void);
|
||||
|
||||
static int idxopttext, done_runtime_opt_init_once = 0;
|
||||
#define MAXOPT 60 /* 3.7: currently 40 lines get inserted into opttext[] */
|
||||
#define MAXOPT 60 /* 5.0: currently 40 lines get inserted into opttext[] */
|
||||
static char *opttext[MAXOPT] = { 0 };
|
||||
#define STOREOPTTEXT(line) \
|
||||
((void) ((idxopttext < MAXOPT) \
|
||||
|
||||
+1
-1
@@ -1312,7 +1312,7 @@ gulpmu(struct monst *mtmp, struct attack *mattk)
|
||||
place_monster(mtmp, u.ux, u.uy);
|
||||
set_ustuck(mtmp);
|
||||
newsym(mtmp->mx, mtmp->my);
|
||||
/* 3.7: dismount for all engulfers, not just for purple worms */
|
||||
/* 5.0: dismount for all engulfers, not just for purple worms */
|
||||
if (u.usteed) {
|
||||
char buf[BUFSZ];
|
||||
|
||||
|
||||
+3
-3
@@ -957,7 +957,7 @@ mksobj_init(struct obj **obj, boolean artif)
|
||||
/* for emphasis; glob quantity is always 1 and weight varies
|
||||
when other globs coalesce with it or this one shrinks */
|
||||
otmp->quan = 1L;
|
||||
/* 3.7: globs in 3.6.x left owt as 0 and let weight() fix
|
||||
/* 5.0: globs in 3.6.x left owt as 0 and let weight() fix
|
||||
that up during 'obj->owt = weight(obj)' below, but now
|
||||
we initialize glob->owt explicitly so weight() doesn't
|
||||
need to perform any fix up and returns glob->owt as-is */
|
||||
@@ -1899,7 +1899,7 @@ weight(struct obj *obj)
|
||||
manage glob->owt and there is nothing for weight() to do except
|
||||
return the current value as-is */
|
||||
if (obj->globby) {
|
||||
/* 3.7: in 3.6.x this checked for owt==0 and then used
|
||||
/* 5.0: in 3.6.x this checked for owt==0 and then used
|
||||
owt as-is when non-zero or objects[].oc_weight if zero;
|
||||
we don't do that anymore because it confused calculating
|
||||
the weight of a container when a glob inside shrank down
|
||||
@@ -1964,7 +1964,7 @@ weight(struct obj *obj)
|
||||
} else if (obj->oclass == FOOD_CLASS && obj->oeaten) {
|
||||
return eaten_stat((int) obj->quan * wt, obj);
|
||||
} else if (obj->oclass == COIN_CLASS) {
|
||||
/* 3.7: always weigh at least 1 unit; used to yield 0 for 1..49 */
|
||||
/* 5.0: always weigh at least 1 unit; used to yield 0 for 1..49 */
|
||||
wt = (int) ((obj->quan + 50L) / 100L);
|
||||
return max(wt, 1);
|
||||
} else if (obj->otyp == HEAVY_IRON_BALL && obj->owt != 0) {
|
||||
|
||||
+2
-2
@@ -1784,13 +1784,13 @@ m_move(struct monst *mtmp, int after)
|
||||
* attack it.
|
||||
*/
|
||||
if (intruder && intruder != mtmp
|
||||
/* 3.7: this used to use 'dist2() < 2' which meant that intended
|
||||
/* 5.0: this used to use 'dist2() < 2' which meant that intended
|
||||
attack was disallowed if they were adjacent diagonally */
|
||||
&& dist2(mtmp->mx, mtmp->my, tx, ty) <= 2) {
|
||||
gb.bhitpos.x = tx, gb.bhitpos.y = ty;
|
||||
gn.notonhead = (intruder->mx != tx || intruder->my != ty);
|
||||
covetousattack = mattackm(mtmp, intruder);
|
||||
/* 3.7: this used to erroneously use '== 2' (M_ATTK_DEF_DIED) */
|
||||
/* 5.0: this used to erroneously use '== 2' (M_ATTK_DEF_DIED) */
|
||||
if (covetousattack & M_ATTK_AGR_DIED)
|
||||
return MMOVE_DIED;
|
||||
mmoved = MMOVE_MOVED;
|
||||
|
||||
+2
-2
@@ -4106,9 +4106,9 @@ readobjnam_preparse(struct _readobjnam_data *d)
|
||||
break;
|
||||
d->gsize = 1;
|
||||
} else if (!strncmpi(d->bp, "medium ", l = 7)) {
|
||||
/* 3.7: in 3.6, "medium" was only used during wishing and the
|
||||
/* 5.0: in 3.6, "medium" was only used during wishing and the
|
||||
mid-size glob had no adjective when formatted, but as of
|
||||
3.7, "medium" has become an explicit part of the name for
|
||||
5.0, "medium" has become an explicit part of the name for
|
||||
combined globs of at least 5 individual ones (owt >= 100)
|
||||
and less than 15 (owt < 300) */
|
||||
d->gsize = 2;
|
||||
|
||||
+1
-1
@@ -3679,7 +3679,7 @@ optfn_scores(
|
||||
if ((op = string_for_opt(opts, FALSE)) == empty_optstr)
|
||||
return optn_err;
|
||||
|
||||
/* 3.7: earlier versions left old values for unspecified arguments
|
||||
/* 5.0: earlier versions left old values for unspecified arguments
|
||||
if player's scores:foo option only specified some of the three;
|
||||
in particular, attempting to use 'scores:own' rather than
|
||||
'scores:0 top/0 around/own' didn't work as intended */
|
||||
|
||||
+1
-1
@@ -556,7 +556,7 @@ look_at_monster(
|
||||
|
||||
/* describe a pool location's contents; might return a static buffer so
|
||||
caller should use it or copy it before calling waterbody_name() again
|
||||
[3.7: moved here from mkmaze.c] */
|
||||
[5.0: moved here from mkmaze.c] */
|
||||
const char *
|
||||
waterbody_name(coordxy x, coordxy y)
|
||||
{
|
||||
|
||||
+1
-1
@@ -582,7 +582,7 @@ dodrink(void)
|
||||
* was no longer dealing with an inventory item. Unwearing
|
||||
* the current potion is intended to keep it in inventory.]
|
||||
*
|
||||
* 3.7: switch back to relying on useup() unless the object is
|
||||
* 5.0: switch back to relying on useup() unless the object is
|
||||
* actually worn. Otherwise drinking a stack of unpaid potions
|
||||
* one by one in a shop makes each one a separate used-up item
|
||||
* for 'Ix' invent display and for itemized shop billing instead
|
||||
|
||||
+2
-2
@@ -1505,7 +1505,7 @@ seffect_remove_curse(struct obj **sobjp)
|
||||
if (scursed) {
|
||||
pline_The("scroll disintegrates.");
|
||||
} else {
|
||||
/* 3.7: this used to use a straight
|
||||
/* 5.0: this used to use a straight
|
||||
for (obj = invent; obj; obj = obj->nobj) {}
|
||||
traversal, but for the confused case, secondary weapon might
|
||||
become cursed and be dropped, moving it from the invent chain
|
||||
@@ -3212,7 +3212,7 @@ create_particular_parse(
|
||||
d->which = name_to_mon(bufp, &gender_name_var);
|
||||
/*
|
||||
* With the introduction of male and female monster names
|
||||
* in 3.7, preserve that detail.
|
||||
* in 5.0, preserve that detail.
|
||||
*
|
||||
* If d->fem is already set to MALE or FEMALE at this juncture, it means
|
||||
* one of those terms was explicitly specified.
|
||||
|
||||
+1
-1
@@ -303,7 +303,7 @@ rumor_check(void)
|
||||
|
||||
DISABLE_WARNING_FORMAT_NONLITERAL
|
||||
|
||||
/* 3.7: augments rumors_check(); test 'engrave' or 'epitaph' or 'bogusmon' */
|
||||
/* 5.0: augments rumors_check(); test 'engrave' or 'epitaph' or 'bogusmon' */
|
||||
staticfn void
|
||||
others_check(
|
||||
const char *ftype, /* header: "{Engravings|Epitaphs|Bogus monsters}:" */
|
||||
|
||||
+1
-1
@@ -308,7 +308,7 @@ static long floc = 0L;
|
||||
|
||||
/*
|
||||
* historical structlevel savefile writing and reading routines follow.
|
||||
* These were moved here from save.c and restore.c between 3.6.3 and 3.7.0.
|
||||
* These were moved here from save.c and restore.c between 3.6.3 and 5.0.0,.
|
||||
*/
|
||||
|
||||
staticfn int getidx(int, int);
|
||||
|
||||
@@ -1525,7 +1525,7 @@ cheapest_item(int ibillct, Bill *ibill)
|
||||
long gmin = ibill[0].cost;
|
||||
|
||||
/*
|
||||
* 3.7: old version didn't determine cheapest item correctly if it
|
||||
* 5.0: old version didn't determine cheapest item correctly if it
|
||||
* was either the partly used or partly intact portion of a partially
|
||||
* used stack. Rather than modify it to use bp_to_obj() in order to
|
||||
* obtain quanities for every entry on eshkp->bill_p[], switch to
|
||||
@@ -2107,7 +2107,7 @@ pay_billed_items(
|
||||
} while (via_menu);
|
||||
|
||||
/*
|
||||
* 3.7: this used to make two passes through eshkp->bill_p[],
|
||||
* 5.0: this used to make two passes through eshkp->bill_p[],
|
||||
* the first for used up items and the second for unpaid ones.
|
||||
* Items which were partly used were processed on both passes.
|
||||
*
|
||||
|
||||
@@ -214,7 +214,7 @@ throne_sit_effect(void)
|
||||
You_feel("somehow out of place...");
|
||||
}
|
||||
|
||||
/* 3.7: when the random chance for removal is hit, ask for confirmation
|
||||
/* 5.0: when the random chance for removal is hit, ask for confirmation
|
||||
if in wizard mode, and remove the throne even if hero was teleported
|
||||
away from it. [This used to remove a throne at hero's current
|
||||
location if there happened to be one, so for the teleport case that
|
||||
|
||||
+1
-1
@@ -1080,7 +1080,7 @@ domonnoise(struct monst *mtmp)
|
||||
} else
|
||||
switch (monsndx(ptr)) {
|
||||
case PM_HOBBIT:
|
||||
/* 3.7: the 'complains' message used to be given if the
|
||||
/* 5.0: the 'complains' message used to be given if the
|
||||
hobbit's current hit points were at 10 below max or
|
||||
less, but their max is normally less than 10 so it
|
||||
would almost never occur */
|
||||
|
||||
+1
-1
@@ -961,7 +961,7 @@ fall_asleep(int how_long, boolean wakeup_msg)
|
||||
if (wakeup_msg && gm.multi == how_long) {
|
||||
/* caller can follow with a direct call to Hear_again() if
|
||||
there's a need to override this when wakeup_msg is true */
|
||||
/* 3.7: how_long is negative so wasn't actually incrementing the
|
||||
/* 5.0: how_long is negative so wasn't actually incrementing the
|
||||
deafness timeout when it used to be passed as-is */
|
||||
incr_itimeout(&HDeaf, abs(how_long));
|
||||
disp.botl = TRUE;
|
||||
|
||||
+3
-3
@@ -5311,7 +5311,7 @@ untrap_prob(
|
||||
chance = 1;
|
||||
/* else chance stays 3 */
|
||||
} else if (!webmaker(u.umonst->data)) {
|
||||
chance = 7; /* 3.7: used to be 30 */
|
||||
chance = 7; /* 5.0: used to be 30 */
|
||||
}
|
||||
}
|
||||
if (Confusion || Hallucination)
|
||||
@@ -5996,7 +5996,7 @@ untrap(
|
||||
} /* end if */
|
||||
|
||||
if (boxcnt) {
|
||||
/* 3.7: this used to allow searching for traps on multiple
|
||||
/* 5.0: this used to allow searching for traps on multiple
|
||||
containers on the same move and needed to keep track of
|
||||
whether any had been found but not attempted to untrap;
|
||||
now at most one per move may be checked and we only
|
||||
@@ -6855,7 +6855,7 @@ lava_effects(void)
|
||||
/* Check whether we should burn away boots *first* so we know whether to
|
||||
* make the player sink into the lava. Assumption: water walking only
|
||||
* comes from boots.
|
||||
* (3.7: that assumption is no longer true, but having boots be the first
|
||||
* (5.0: that assumption is no longer true, but having boots be the first
|
||||
* thing to come into contact with lava makes sense.)
|
||||
*/
|
||||
if (uarmf && (uarmf->in_use
|
||||
|
||||
+2
-2
@@ -2202,7 +2202,7 @@ steal_it(struct monst *mdef, struct attack *mattk)
|
||||
if (ustealo) { /* we will be taking everything */
|
||||
char heshe[20];
|
||||
|
||||
/* 3.7: this uses hero's base gender rather than nymph femininity
|
||||
/* 5.0: this uses hero's base gender rather than nymph femininity
|
||||
but was using hardcoded pronouns She/her for target monster;
|
||||
switch to dynamic pronoun */
|
||||
if (gender(mdef) == (int) u.mfemale
|
||||
@@ -4228,7 +4228,7 @@ mhitm_ad_ston(
|
||||
pline("%s seems to grimace.", Monnam(magr));
|
||||
}
|
||||
/*
|
||||
* 3.7: New moon is no longer overridden by carrying a
|
||||
* 5.0: New moon is no longer overridden by carrying a
|
||||
* lizard corpse. Having the moon's impact on terrestrial
|
||||
* activity be affected by carrying a dead critter felt
|
||||
* silly.
|
||||
|
||||
+1
-1
@@ -1186,7 +1186,7 @@ dump_fmtstr(
|
||||
else
|
||||
Strcpy(tmpbuf, "{current date+time}");
|
||||
break;
|
||||
case 'v': /* version, eg. "3.7.0-0" */
|
||||
case 'v': /* version, eg. "5.0.0,-0" */
|
||||
Sprintf(tmpbuf, "%s", version_string(verbuf, sizeof verbuf));
|
||||
break;
|
||||
case 'u': /* UID */
|
||||
|
||||
+1
-1
@@ -620,7 +620,7 @@ nasty(struct monst *summoner)
|
||||
for (i = rnd(tmp); i > 0 && count < MAXNASTIES; --i) {
|
||||
/* Of the 44 nasties[], 10 are lawful, 14 are chaotic,
|
||||
* and 20 are neutral. [These numbers are up date for
|
||||
* 3.7.0; the ones in the next paragraph are not....]
|
||||
* 5.0.0; the ones in the next paragraph are not....]
|
||||
*
|
||||
* Neutral caster, used for late-game harassment,
|
||||
* has 18/42 chance to stop the inner loop on each
|
||||
|
||||
+1
-1
@@ -224,7 +224,7 @@ worm_move(struct monst *worm)
|
||||
wgrowtime[wnum] = svm.moves + rnd(5);
|
||||
} else {
|
||||
int mmove = mcalcmove(worm, FALSE),
|
||||
/* prior to 3.7.0, next-grow increment was 3..17 but since
|
||||
/* prior to 5.0.0,, next-grow increment was 3..17 but since
|
||||
it got checked every 4th turn when the speed 3 worm got
|
||||
to move, it was effectively 0..5; also, its usage was
|
||||
'wgrowtime += incr', so often 'wgrowtime' would be
|
||||
|
||||
@@ -198,7 +198,7 @@ bhitm(struct monst *mtmp, struct obj *otmp)
|
||||
seemimic(mtmp);
|
||||
shieldeff(mtmp->mx, mtmp->my);
|
||||
pline("Boing!");
|
||||
/* 3.7: used to 'break' to avoid setting learn_it here */
|
||||
/* 5.0: used to 'break' to avoid setting learn_it here */
|
||||
} else if (u.uswallow || rnd(20) < 10 + find_mac(mtmp)) {
|
||||
if (disguised_mimic)
|
||||
seemimic(mtmp);
|
||||
@@ -1865,7 +1865,7 @@ poly_obj(struct obj *obj, int id)
|
||||
while (otmp->otyp == SPE_POLYMORPH)
|
||||
otmp->otyp = rnd_class(svb.bases[SPBOOK_CLASS], SPE_BLANK_PAPER);
|
||||
/* reduce spellbook abuse; non-blank books degrade;
|
||||
3.7: novels don't use spestudied so shouldn't degrade to blank
|
||||
5.0: novels don't use spestudied so shouldn't degrade to blank
|
||||
(but don't force spestudied to zero for them since a non-zero
|
||||
value could get passed along to a future polymorph) */
|
||||
if (otmp->otyp != SPE_BLANK_PAPER && otmp->otyp != SPE_NOVEL) {
|
||||
@@ -4547,7 +4547,7 @@ zhitu(
|
||||
}
|
||||
|
||||
/*
|
||||
* 3.7: when fatal, this used to yield "Killed by <fltxt>." without any
|
||||
* 5.0: when fatal, this used to yield "Killed by <fltxt>." without any
|
||||
* information about who was responsible. Now 'buzzer' is used to try
|
||||
* to supply "zapped/cast/breathed by <mon> [imitating <other_mon>]."
|
||||
*
|
||||
|
||||
+1
-1
@@ -1590,7 +1590,7 @@ do_oracles(void)
|
||||
/* Read one line from input, up to and including the next newline
|
||||
* character. Returns a pointer to the heap-allocated string, or a
|
||||
* null pointer if no characters were read.
|
||||
* 3.7: redone to use nethack's alloc() rather than libc's malloc()
|
||||
* 5.0: redone to use nethack's alloc() rather than libc's malloc()
|
||||
* and realloc().
|
||||
*/
|
||||
static char *
|
||||
|
||||
+1
-1
@@ -195,7 +195,7 @@ main(int argc, char *argv[])
|
||||
exit(EXIT_FAILURE);
|
||||
sz = strlen(folderbuf);
|
||||
(void) snprintf(eos(folderbuf), sizeof folderbuf - sz,
|
||||
"\\AppData\\Local\\NetHack\\3.7\\");
|
||||
"\\AppData\\Local\\NetHack\\5.0\\");
|
||||
// initoptions_init(); // This allows OPTIONS in syscf on Windows.
|
||||
set_default_prefix_locations(argv[0]);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user