For status on the left or right of the map, show conditions in columns
rather than just space separated. Shows two conditions per line, 12
characters wide, unless the overall status becomes too tall for its
window. If that happens, they'll be condensed back to three per line,
8 characters wide. Hunger and encumbrance are always 12 characters
wide when non-blank.
old:
|Hungry Burdened
|Blind Conf Lev
new:
|Hungry Burdened
|Blind Conf
|Lev
(As before, if hunger is blank then encumbrance is left justified.
If they're both blank, their line is omitted and conditions move up.)
combine boolean and compound options into a single allopt[] array for
processing in options.c.
move the definitions of the options into new include/optlist.h file which
uses a set of macros to define them appropriately.
during compile of options.c each option described in include/optlist.h:
1. automatically results in a function prototype for an optfn called
optfn_xxxx (xxxx is the option name).
2. automatically results in an opt_xxxx enum value for referencing
its index throughout options.c (xxxx is the option name).
3. is used to initialize an element of the allopt[] array at index
opt_xxxx (xxxx is the option name) based on the settings in the
NHOPTB, NHOPTC, NHOPTP macros. Those macros only live during the
compilation of include/optlist.h.
each optfn_xxxx() function can be called with a req id of: do_init, do_set,
get_val or do_handler.
req do_init is called from options_init, and if initialization or memory
allocation or other initialization for that particular option is needed,
it can be done in response to the init req.
req do_set is called from parseoptions() for each option it encounters
and the optfn_xxxx() function is expected to react and set the option
based on the string values that parseoptions() passes to it.
req get_val expects each optfn_xxxx() function to write the current
option value into the buffer it is passed.
req do_handler is called during doset() operations in response to player
selections most likely from the 'O' option-setting menu, but only if the
option is identified as having do_handler support in the allopts[]
'has_handler' boolean flag. Not every optfn_xxxx() does.
function special_handling() is eliminated. It's code has been redistributed
to individual handler functions for the option or purpose that they serve.
moved reglyph_darkroom() function from options.c to display.c
Provide a way to communicate additional behaviors and/or appearances
desired from NetHack window port menus.
This is foundation work for changes to follow at a future date.
Use CONDITION_SIZE which does not require manual updating.
Also attempts to adjust win32 graphics window port for
the new fields.
That port has its own field names and should be adjusted
to using the following which are declared extern in
include/botl.h.
struct conditions[CONDITION_COUNT];
int cond_idx[CONDITION_COUNT];
The former contains the fields that were port-specifically
added to the win32 graphical port and more, plus it is
centrally maintained and currently utilized by tty and curses.
The cond_idx[] array contains the ranked ordering of the
condition fields from highest ranking to lowest. Instead
of indexing like this:
int i;
for (i = 0; i < CONDITION_COUNT; ++i) {
...conditons[i].enabled;
...condtions[i].text[0];
}
you can use the ranked ordering like this:
int i, ci;
for (i = 0; i < CONDITION_COUNT; ++i) {
ci = cond_idx[i];
...conditons[ci].enabled;
...condtions[ci].text[0];
}
Most of the additional ones are "opt-in" meaning that unless you add them
to your config file to enable them, they won't show up.
Two that aren't "opt-in", but can be "opted-out" (as can they all) are
cond_grab (for an eel grabbing you and drowing being imminent) and
cond_lava which leads to a fatality.
All the ones that already existed are "opt-out" options, meaning that
they will still show if you do nothing.
Here's the complete list of status conditions following this patch:
config option internal default mask id mask text1 tex2 text3
"cond_barehanded" bl_bareh opt_in BL_MASK_BAREH 0x00000001L Bare Bar Bh
"cond_blind" bl_blind opt_out BL_MASK_BLIND 0x00000002L Blind Blnd Bl
"cond_busy" bl_busy opt_in BL_MASK_BUSY 0x00000004L Busy Bsy By
"cond_conf" bl_conf opt_out BL_MASK_CONF 0x00000008L Conf Cnf Cf
"cond_deaf" bl_deaf opt_out BL_MASK_DEAF 0x00000010L Deaf Def Df
"cond_iron" bl_elf_iron opt_out BL_MASK_ELF_IRON 0x00000020L Iron Irn Fe
"cond_fly" bl_fly opt_out BL_MASK_FLY 0x00000040L Fly Fly Fl
"cond_foodPois" bl_foodpois opt_out BL_MASK_FOODPOIS 0x00000080L FoodPois Fpois Poi
"cond_glowhands" bl_glowhands opt_in BL_MASK_GLOWHANDS 0x00000100L Glow Glo Gl
"cond_grab" bl_grab opt_out BL_MASK_GRAB 0x00000200L Grab Grb Gr
"cond_hallu" bl_hallu opt_out BL_MASK_HALLU 0x00000400L Hallu Hal Hl
"cond_held" bl_held opt_in BL_MASK_HELD 0x00000800L Held Hld Hd
"cond_ice" bl_icy opt_in BL_MASK_ICY 0x00001000L Icy Icy Ic
"cond_lava" bl_inlava opt_out BL_MASK_INLAVA 0x00002000L Lava Lav La
"cond_lev" bl_lev opt_out BL_MASK_LEV 0x00004000L Lev Lev Lv
"cond_paralyze" bl_parlyz opt_in BL_MASK_PARLYZ 0x00008000L Parlyz Para Par
"cond_ride" bl_ride opt_out BL_MASK_RIDE 0x00010000L Ride Rid Rd
"cond_sleep" bl_sleeping opt_in BL_MASK_SLEEPING 0x00020000L Zzz Zzz Zz
"cond_slime" bl_slime opt_out BL_MASK_SLIME 0x00040000L Slime Slim Slm
"cond_slip" bl_slippery opt_in BL_MASK_SLIPPERY 0x00080000L Slip Sli Sl
"cond_stone" bl_stone opt_out BL_MASK_STONE 0x00100000L Stone Ston Sto
"cond_strngl" bl_strngl opt_out BL_MASK_STRNGL 0x00200000L Strngl Stngl Str
"cond_stun" bl_stun opt_out BL_MASK_STUN 0x00400000L Stun Stun St
"cond_submerged" bl_submerged opt_in BL_MASK_SUBMERGED 0x00800000L Sub Sub Sw
"cond_termIll" bl_termill opt_out BL_MASK_TERMILL 0x01000000L TermIll Ill Ill
"cond_tethered" bl_tethered opt_in BL_MASK_TETHERED 0x02000000L Teth Tth Te
"cond_trap" bl_trapped opt_in BL_MASK_TRAPPED 0x04000000L Trap Trp Tr
"cond_unconscious" bl_unconsc opt_in BL_MASK_UNCONSC 0x08000000L Out Out KO
"cond_woundedl" bl_woundedl opt_in BL_MASK_WOUNDEDL 0x10000000L Legs Leg Lg
Like lava when that looks the same as water with color Off, render ice
in inverse video if it looks the same as the floor of a room. (I tried
bold first but the result didn't look very good.)
Done for tty and curses; others may want to follow suit.
groundwork only - window port interface change
This changes the last parameter for add_menu() from a boolean
to an unsigned int, to allow additional itemflags in future
beyond just the "preselected" that the original boolean offered.
There shouldn't be any functionality changes with this groundwork-only
change, and if there are it is unintentional and should be reported.
Submitted for 3.7.0; all but one also apply to 3.6.3.
I rewrote the curses terminal-too-small message instead of just
fixing the spelling of "minumum".
Performance profiling showed that multiple strcmpi() calls were
occurring each and every time a character was going to the map.
This update:
- honors the WC_COLOR capability
- It allows a window-port to control individual color availability should the window-port wish to do so.
- Makes checking on the individual colors for the active window-port is a straightforward table lookup at the CLR_ offset.
iflags.use_color remains a master on/off switch for use of color, regardless of the capability
compiled into the game (default TRUE).
The has_color() routine, which is now a shared routine in src/windows.c, could likely be made
into a simple macro to eliminate the function call, but this update does not go that far.
This hits a lot of port files due to the window-port interface change, mostly cookie-cutter.
This fixes the issue brought up at https://www.reddit.com/r/nethack/comments/dv3pae/curses_and_the_numberpad/?st=k3hgply6&sh=dbc2bf7d .
I don't know why the "regular" (tty) method doesn't seem to work for him,
but I'm going to chalk it up to a PDCurses oddity. What I do know, however,
is that the alternate method I added a year ago or maybe longer, that allows
numpad usage even with number_pad:0 (to retain the default keybindings in case
an user is used to them, while keeping number pad behaviour making sense,
similar to NetHack4+friends) was only partially implemented, for some reason.
This adds the rest of the keys, meaning that this means of key interpretation
should be more realible. KEY_A2/B1/B3/C2 are not standard keys in the Curses
documentation, and is thus behind an ifdef -- but PDCurses, amongst other
implementations, makes use of them.
As a side effect, Home/End/PgUp/PgDn are now interpreted as diagonal movement,
since some terminals interpret number_pad keys that way. I do not consider this
a problem since they went unused in normal gameplay anyway (This does not
interfere with menus or similar).
'orient' is the name of an enum defined in wincurs.h so don't use it
as a variable name in cursstat.c. My compiler didn't complain using
'-Wshadow' but apparently some other one does.
Make the same change in the dead code located in the second half of
that file, plus a couple of formatting tweaks.
From hardfought; latest gcc complains that /* fall through other stuff */
doesn't match its pattern for /* fall through */ comment indicating
that omitted 'break' statement is intentional and one switch case is
deliberately continuing into the code for another.
Menus with wide header or separator lines were rendered wide enough
to avoid wrapping those lines, but ones with narrow header/separators
and wide selectable entries were limited to half the display even
though lots of lines that would fit with full width were being wrapped.
Change the latter behavior.
Menus are right justified with the edge of the map when narrower than
it, left justified otherwise, and if the display is wider than the map,
they'll extend beyond its right edge. (That hasn't actually changed;
it's just that left-justification is more likely now that menus will
be wide enough to show wide inventory lines without wrapping.)
Get rid of my ridiculous hack to force wider menu for the 'symset'
and 'roguesymset' sub-menus of 'O' since it's no longer useful.
There's still room for improvement. If any lines need to be wrapped
despite using the full width, or perhaps are just a lot wider than
most of the entries, menu width could be narrowed to just enough for
'normal' lines to fit so that one or two really long entries don't
distort the menu. That's a bit more complicated than I want to deal
with right now. [If implemented, it would be relevant for tty too.]
Fixes#235
For initial options under curses, specifying 'DECgraphics' as a
boolean rather than as 'symset:DECgraphics' wasn't overriding the
new default 'symset:curses'. Since previously DECgraphics was
rejected for curses, it's possible that no one noticed.
Primary and rogue symbols were being set to default if primary hadn't
been given a value, possibly clobbering rogue symbols if those had
been given a value. Initialize them independenly.
Return early from curses_convert_glyph() if the value doesn't have
the 8th bit set since it now deals exclusively with DECgraphics
handling. Force a sane value for returning early on rogue level.
Move a declaration that became mid-block when a preceding 'if () {'
got removed to top of block suppress warning about C99 feature.
Add new entry for the curses symset change to fixes36.3.
This time I'm putting things in as-is before making a few tweaks.
The pull request was three or four separate changes. I used the
patch instead so they've been collected into one commit.
Highlighting for monsters shown due to extended monster detection and
for lava shown in black and white didn't work because that keys off
of 'iflags.use_inverse' (actually a macro for 'iflags.wc_inverse') and
curses wasn't enabling that window-capability option. To be fair, it
was probably unconditional at the time the curses interface was first
developed. It checked for whether a monster was supposed to be drawn
with inverse highlighting but wouldn't draw it that way because the
flag was always false. Inverse b&w lava is relatively new and curses
hadn't been taught about it.
Various other things such as pets (if hilite_pet is on) and object
piles (if hilite_pile is on) get highlighted with inverse video when
use_color is off, regardless of whether use_inverse is on or off.
That's probably a bug.
Fixes#230
Incorporate github pull request #230, support for DECgraphics-style
line drawing in the curses interface. I've rewritten the
curses_convert_glyph() part so that it doesn't require C99 and
doesn't reinitialize its pair of arrays for every character written
to the map. The DECgraphics conversion is now a straight char for
char one, DEC line drawing code to ACS, without regard to what map
symbol is intended or what 'cursesgraphics' uses for that symbol.
Have the 'menucolors' option control menu color pattern matching
(instead of curses-specific 'guicolor') for all menus, not just for
the persistent inventory window.