Merge branch 'NetHack-3.7' of https://rodney.nethack.org:20040/git/NHsource into NetHack-3.7

This commit is contained in:
nhkeni
2025-07-11 15:44:43 -04:00
7 changed files with 70 additions and 6 deletions

View File

@@ -32,10 +32,10 @@ des.level_flags("mazelevel", "noflip",
des.map([[ des.map([[
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
|-.--|.......|......|..S....|.F.......|.............|.....................| |-.--|.......|......|..S....|.F.......|.............|.......|.............|
|.-..........|......|--|....|.F.....|.|S-------.....|.....................| |.-..........|......|--|....|.F.....|.|S-------.....|.....................|
||.--|.......|..T......|....|.F.....|.|.......|.....|.....................| ||.--|.......|..T......|....|.F.....|.|.......|.....|.......|.............|
||.|.|.......|......|-.|....|.F.....|.|.......|.....|.....................| ||.|.|.......|......|-.|....|.F.....|.|.......|.....|--------.............|
||.|.|.......|......||.|-.-----------.-.......|-S----.....................| ||.|.|.......|......||.|-.-----------.-.......|-S----.....................|
|-+-S---------..---.||........................|...|.......................| |-+-S---------..---.||........................|...|.......................|
|......| |.-------------------.......|...|....--S----............| |......| |.-------------------.......|...|....--S----............|
@@ -80,6 +80,10 @@ local diagmovekeys = tut_key("movesouthwest") .. " " ..
des.engraving({ coord = { 9,3 }, type = "engrave", text = "Move around with " .. movekeys, degrade = false }); des.engraving({ coord = { 9,3 }, type = "engrave", text = "Move around with " .. movekeys, degrade = false });
des.engraving({ coord = { 5,2 }, type = "engrave", text = "Move diagonally with " .. diagmovekeys, degrade = false }); des.engraving({ coord = { 5,2 }, type = "engrave", text = "Move diagonally with " .. diagmovekeys, degrade = false });
if (u.role == "Knight") then
des.engraving({ coord = { 12,1 }, type = "engrave", text = "Knights can jump with '" .. tut_key("jump") .. "'", degrade = false });
end
-- --
des.engraving({ coord = { 2,4 }, type = "engrave", text = "Some actions may require multiple tries before succeeding", degrade = false }); des.engraving({ coord = { 2,4 }, type = "engrave", text = "Some actions may require multiple tries before succeeding", degrade = false });
@@ -129,6 +133,9 @@ for i = 1, 4 do
coord = locs[i], victim = false }); coord = locs[i], victim = false });
end end
des.engraving({ coord = { 15,15 }, type = "engrave", text = "Some traps can be disabled with '" .. tut_key("untrap") .. "'", degrade = false });
des.trap({ coord = { 15,16 }, type = "web", spider_on_web = false });
-- --
des.door({ coord = { 18,13 }, state = "closed" }); des.door({ coord = { 18,13 }, state = "closed" });
@@ -222,10 +229,11 @@ des.door({ coord = { 38,6 }, state = "closed" });
des.engraving({ coord = { 39,6 }, type = "engrave", text = "You loot containers with '" .. tut_key("loot") .. "'", degrade = false }); des.engraving({ coord = { 39,6 }, type = "engrave", text = "You loot containers with '" .. tut_key("loot") .. "'", degrade = false });
des.object({ coord = { 42,6 }, id = "large box", broken = true, trapped = false, des.object({ coord = { 41,6 }, id = "large box", broken = true, trapped = false,
contents = function(obj) contents = function(obj)
des.object({ id = "secret door detection", class = "/", spe = 30 }); end des.object({ id = "secret door detection", class = "/", spe = 30 }); end
}); });
des.engraving({ coord = { 42,6 }, type = "engrave", text = "Containers can also be emptied with '" .. tut_key("tip") .. "'", degrade = false });
des.engraving({ coord = { 45,6 }, type = "engrave", text = "Magic wands are used with '" .. tut_key("zap") .. "'", degrade = false }); des.engraving({ coord = { 45,6 }, type = "engrave", text = "Magic wands are used with '" .. tut_key("zap") .. "'", degrade = false });
@@ -302,6 +310,26 @@ des.object({ id = "boulder", coord = {72,16} });
des.object({ id = "boulder", coord = {73,16} }); des.object({ id = "boulder", coord = {73,16} });
des.trap({ type = "trap door", coord = { 73,15 } }); des.trap({ type = "trap door", coord = { 73,15 } });
--
des.engraving({ coord = { 60,2 }, type = "engrave", text = "Spellcasting", degrade = false });
if (u.uenmax < 5) then
-- TODO: make sure hero has enough Pw to cast the spell (5 pw) instead?
-- TODO: ensure the first cast of this spell succeeds?
des.engraving({ coord = { 59,2 }, type = "engrave", text = "Unfortunately you don't have enough energy to cast spells.", degrade = false });
end
des.engraving({ coord = { 57,2 }, type = "engrave", text = "Pick up the spellbook with '" .. tut_key("pickup") .. "'", degrade = false });
des.object({ coord = { 57,2 }, id = "spellbook of light", buc = "blessed" });
des.engraving({ coord = { 55,2 }, type = "engrave", text = "Read the spellbook with '" .. tut_key("read") .. "'", degrade = false });
des.engraving({ coord = { 53,2 }, type = "engrave", text = "Use '" .. tut_key("cast") .. "' to cast a spell", degrade = false });
des.region(selection.area(53,01, 59, 3), "unlit");
--
des.engraving({ coord = { 72,2 }, type = "engrave", text = "You \"quaff\" potions with '" .. tut_key("quaff") .. "'", degrade = false });
des.object({ coord = { 72,2 }, id = "potion of object detection", buc = "blessed" });
---------------- ----------------
-- entering and leaving tutorial _branch_ now handled by core -- entering and leaving tutorial _branch_ now handled by core

View File

@@ -1520,6 +1520,7 @@ the engraving pristine text field was not being appropriately populated during
worn alchemy smock reduces chances of dipped potions exploding worn alchemy smock reduces chances of dipped potions exploding
dwarves can sense buried items under their feet dwarves can sense buried items under their feet
monsters trapped in pits cannot kick monsters trapped in pits cannot kick
create familiar spell can create harder creatures
Fixes to 3.7.0-x General Problems Exposed Via git Repository Fixes to 3.7.0-x General Problems Exposed Via git Repository

View File

@@ -423,6 +423,7 @@ struct instance_globals_g {
long gmst_moves; long gmst_moves;
struct obj *gmst_invent; struct obj *gmst_invent;
genericptr_t *gmst_ubak, *gmst_disco, *gmst_mvitals; genericptr_t *gmst_ubak, *gmst_disco, *gmst_mvitals;
struct spell gmst_spl_book[MAXSPELL + 1];
/* pline.c */ /* pline.c */
struct gamelog_line *gamelog; struct gamelog_line *gamelog;

View File

@@ -372,6 +372,7 @@ static const struct instance_globals_g g_init_g = {
0L, /* gmst_moves */ 0L, /* gmst_moves */
NULL, /* gmst_invent */ NULL, /* gmst_invent */
NULL, NULL, NULL, /* gmst_ubak, gmst_disco, gmst_mvitals */ NULL, NULL, NULL, /* gmst_ubak, gmst_disco, gmst_mvitals */
{ DUMMY }, /* gmst_spl_book */
/* pline.c */ /* pline.c */
UNDEFINED_PTR, /* gamelog */ UNDEFINED_PTR, /* gamelog */
/* region.c */ /* region.c */

View File

@@ -124,7 +124,10 @@ pick_familiar_pm(struct obj *otmp, boolean quietly)
} else if (!rn2(3)) { } else if (!rn2(3)) {
pm = &mons[pet_type()]; pm = &mons[pet_type()];
} else { } else {
pm = rndmonst(); int skill = spell_skilltype(SPE_CREATE_FAMILIAR);
int max = 3 * P_SKILL(skill);
pm = rndmonst_adj(0, max);
if (!pm && !quietly) if (!pm && !quietly)
There("seems to be nothing available for a familiar."); There("seems to be nothing available for a familiar.");
} }

View File

@@ -1695,6 +1695,7 @@ nhl_gamestate(lua_State *L)
init_uhunger(); init_uhunger();
free_tutorial(); /* release gg.gmst_XYZ */ free_tutorial(); /* release gg.gmst_XYZ */
gg.gmst_stored = FALSE; gg.gmst_stored = FALSE;
(void) memcpy(svs.spl_book, gg.gmst_spl_book, sizeof svs.spl_book);
} else if (!reststate && !gg.gmst_stored) { } else if (!reststate && !gg.gmst_stored) {
/* store game state */ /* store game state */
gg.gmst_moves = svm.moves; gg.gmst_moves = svm.moves;
@@ -1715,6 +1716,8 @@ nhl_gamestate(lua_State *L)
gg.gmst_mvitals = (genericptr_t) alloc(sizeof svm.mvitals); gg.gmst_mvitals = (genericptr_t) alloc(sizeof svm.mvitals);
(void) memcpy(gg.gmst_mvitals, (genericptr_t) &svm.mvitals, (void) memcpy(gg.gmst_mvitals, (genericptr_t) &svm.mvitals,
sizeof svm.mvitals); sizeof svm.mvitals);
(void) memcpy(gg.gmst_spl_book, svs.spl_book, sizeof svs.spl_book);
(void) memset(svs.spl_book, 0, sizeof(svs.spl_book));
gg.gmst_stored = TRUE; gg.gmst_stored = TRUE;
} else { } else {
impossible("nhl_gamestate: inconsistent state (%s vs %s)", impossible("nhl_gamestate: inconsistent state (%s vs %s)",

View File

@@ -104,6 +104,7 @@ CURSESLIB = -lncurses -ltinfo
ifdef MAKEFILE_SRC ifdef MAKEFILE_SRC
comma:=, comma:=,
NCURSES_LFLAGS = $(shell pkg-config ncursesw --libs) NCURSES_LFLAGS = $(shell pkg-config ncursesw --libs)
NCURSES_CFLAGS = $(shell pkg-config ncursesw --cflags)
ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS))) ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS)))
ifeq (,$(findstring ncurses, $(NCURSES_LFLAGS))) ifeq (,$(findstring ncurses, $(NCURSES_LFLAGS)))
#this indicates that pkg-config itself was unavailable #this indicates that pkg-config itself was unavailable
@@ -125,8 +126,33 @@ CURSESLIB = $(subst -Wl$(comma)-Bsymbolic-functions,,$(NCURSES_LFLAGS))
else else
CURSESLIB = $(NCURSES_LFLAGS) CURSESLIB = $(NCURSES_LFLAGS)
endif endif
#$(info $(CURSESLIB))
endif #HAVE_NCURSESW endif #HAVE_NCURSESW
#$(info $(CURSESLIB))
ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS)))
ifeq (,$(findstring ncurses, $(NCURSES_LFLAGS)))
#this indicates that pkg-config itself was unavailable
NOPKGCONFIG = 1
endif #ncurses not in NCURSES_LFLAGS?
endif #ncursesw not in NCURSES_LFLAGS?
#
ifeq "$(NOPKGCONFIG)" "1"
NCURSES_CFLAGS = -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600
ifeq "$(HAVE_NCURSESW)" "1"
ifeq (,$(wildcard /usr/include/ncursesw/curses.h))
NCURSES_CFLAGS += -I/usr/include
else
NCURSES_CFLAGS += -I/usr/include/ncursesw
endif
NCURSES_LFLAGS = -lncursesw -ltinfo
else #HAVE_NCURSESW
ifeq (,$(wildcard /usr/include/ncurses/curses.h))
NCURSES_CFLAGS += -I/usr/include
else
NCURSES_CFLAGS += -I/usr/include/ncurses
endif
NCURSES_LFLAGS = -lncurses -ltinfo
endif #HAVE_NCURSESW
endif #NOPKGCONFIG
endif #MAKEFILE_SRC endif #MAKEFILE_SRC
endif #USE_CURSESLIB endif #USE_CURSESLIB
@@ -152,6 +178,7 @@ NHCFLAGS+=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\"
#NHCFLAGS+=-DCHANGE_COLOR #NHCFLAGS+=-DCHANGE_COLOR
NHCFLAGS+=-DSELF_RECOVER NHCFLAGS+=-DSELF_RECOVER
ifdef WANT_WIN_CURSES ifdef WANT_WIN_CURSES
NHCFLAGS+=$(NCURSES_CFLAGS)
ifeq "$(HAVE_NCURSESW)" "1" ifeq "$(HAVE_NCURSESW)" "1"
NHCFLAGS+=-DCURSES_UNICODE NHCFLAGS+=-DCURSES_UNICODE
else else