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([[
---------------------------------------------------------------------------
|-.--|.......|......|..S....|.F.......|.............|.....................|
|-.--|.......|......|..S....|.F.......|.............|.......|.............|
|.-..........|......|--|....|.F.....|.|S-------.....|.....................|
||.--|.......|..T......|....|.F.....|.|.......|.....|.....................|
||.|.|.......|......|-.|....|.F.....|.|.......|.....|.....................|
||.--|.......|..T......|....|.F.....|.|.......|.....|.......|.............|
||.|.|.......|......|-.|....|.F.....|.|.......|.....|--------.............|
||.|.|.......|......||.|-.-----------.-.......|-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 = { 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 });
@@ -129,6 +133,9 @@ for i = 1, 4 do
coord = locs[i], victim = false });
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" });
@@ -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.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)
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 });
@@ -302,6 +310,26 @@ des.object({ id = "boulder", coord = {72,16} });
des.object({ id = "boulder", coord = {73,16} });
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

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
dwarves can sense buried items under their feet
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

View File

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

View File

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

View File

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

View File

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

View File

@@ -104,6 +104,7 @@ CURSESLIB = -lncurses -ltinfo
ifdef MAKEFILE_SRC
comma:=,
NCURSES_LFLAGS = $(shell pkg-config ncursesw --libs)
NCURSES_CFLAGS = $(shell pkg-config ncursesw --cflags)
ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS)))
ifeq (,$(findstring ncurses, $(NCURSES_LFLAGS)))
#this indicates that pkg-config itself was unavailable
@@ -125,8 +126,33 @@ CURSESLIB = $(subst -Wl$(comma)-Bsymbolic-functions,,$(NCURSES_LFLAGS))
else
CURSESLIB = $(NCURSES_LFLAGS)
endif
#$(info $(CURSESLIB))
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 #USE_CURSESLIB
@@ -152,6 +178,7 @@ NHCFLAGS+=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\"
#NHCFLAGS+=-DCHANGE_COLOR
NHCFLAGS+=-DSELF_RECOVER
ifdef WANT_WIN_CURSES
NHCFLAGS+=$(NCURSES_CFLAGS)
ifeq "$(HAVE_NCURSESW)" "1"
NHCFLAGS+=-DCURSES_UNICODE
else