Commit Graph

2011 Commits

Author SHA1 Message Date
Ray Chason
c801f3ce00 Write Unicode to text save file 2022-10-16 22:57:28 -04:00
Ray Chason
f7aa79f939 Copy Unicode to the clipboard 2022-10-16 22:32:11 -04:00
Ray Chason
c5674fd10c Fix crashes when copying to clipboard 2022-10-16 21:42:42 -04:00
Ray Chason
426ef4d8d2 Add Unicode support to the map 2022-10-16 21:42:18 -04:00
nhmall
682291ca4e warning fix
../win/curses/cursmain.c: In function 'curses_init_nhwindows':
../win/curses/cursmain.c:157:17: warning: unused variable 'pdc_font' [-Wunused-variable]
  157 |     static char pdc_font[BUFSZ] = "";
      |                 ^~~~~~~~
../win/curses/cursmain.c: At top level:
../win/curses/cursmain.c:157:17: warning: 'pdc_font' defined but not used [-Wunused-variable]
2022-10-06 20:57:54 -04:00
nhmall
08163e94bb Merge branch 'unicode' of https://github.com/chasonr/NetHack into pr889 2022-10-06 12:31:21 -04:00
PatR
7a5372ae6d more PR #891 - build fix
More tty-specific hangup handling.  There's still doubt about the
origiinal testing, but not about testing after "post bitrot repair",
if there was any.  That wasn't useful because the new code was
accidentally suppressed by testing a misspelled macro. when deciding
whether to include it.
2022-10-04 15:21:04 -07:00
Michael Meyer
7caa113cc0 Fix HANGUPHANDLING ifdef for TTY
The SIGHUP handling for the TTY windowport added in 594cb5f was wrapped
in '#ifdef HANGUP_HANDLING', but the actual define is 'HANGUPHANDLING'
without the underscore.
2022-10-04 15:06:32 -07:00
Ray Chason
8b6fe9d205 Support wide Curses on MS-DOS
Also, fix IBMGraphics on Curses
2022-10-02 20:41:02 -04:00
Michael Meyer
44dcf95e04 Fix: X11 extcmd menu heap buffer overflow
Instead of allocating space for ((n + 1) * size) (to make room for all
entries plus terminator), it allocated space for (n * size + 1).
init_extended_commands_popup would therefore write past the end of the
memory allocated for command_list and command_indx when trying to store
their respective terminator entries.  This meant the X11 windowport
would crash when accessing the extended command menu, if NetHack had
been compiled with -fsanitize=address.

I also did some minor cleanup/refactoring to eliminate variables and
lines that were made redundant or useless by 9d64d13, which changed the
way the function worked and removed the need for things like tracking
indices in the source and destination arrays with separate variables.
2022-09-30 08:16:19 -07:00
PatR
3dea129a38 curses: scrollbars on clipped map
A change to the curses interface from three years ago to make sure
that round-off didn't make the horizontal and vertical clipped map
indicators appear to not be clipped was using ROWNO for both instead
of COLNO for the horizontal one.  For modest clipping the mistake
was unnoticeable; I don't know whether that remained true for more
extreme clipping.

[Not fixed:  the curses scrollbar stuff ignores the fact that map
column 0 is unused.]
2022-09-29 13:58:50 -07:00
nhmall
8bb4bf3e59 huge chunk of meant name change not comprehensive
warning: for tile 250 (numbered 250) of objects.txt,
        found 'huge chunk of meat' while expecting 'enormous meatball'
	../win/share/objects.txt: 460 tiles
2022-09-29 12:48:03 -04:00
Ray Chason
31862b95b0 Fix undefined behavior when exiting Curses
* When saving: curses_exit_nhwindows calls curses_uncurse_terminal,
  which calls endwin. curses_exit_nhwindows then calls raw_print,
  which calls more Curses functions after endwin has been called.
  Fix this by having curses_raw_print use puts if window_inited
  is false.

* When dying, quitting, etc.: really_done opens the "Goodbye" window,
  which refreshes the other windows when it closes. But the status
  window (and possibly the map and message windows) are gone by that
  point. The window pointers are properly NULLed, but the NULL is then
  passed to touchwin. Fix this by checking window pointers for NULL.
2022-09-28 14:23:27 -07:00
Pasi Kallinen
ef093d0b30 Fix curses cursor keys
My change to allow fuzzer run in curses caused the cursor keys
to not work (eg. paging through menus with left and right cursor),
so fix that.
2022-09-24 10:40:38 +03:00
PatR
c3b007186c italic attribute on tty
If switching to italic isn't supported for tty, switch to underline
instead.  Comparable to the curses interface.
2022-09-23 23:37:02 -07:00
Pasi Kallinen
fbb32ea7fa Curses: enable debug fuzzer 2022-09-22 13:10:19 +03:00
PatR
f4210542f0 enc_stat[], hu_stat[]
The definition of enc_stat[] got changed by a pull request nearly a
year ago ('const char *enc_stat[]' -> 'const char *const enc_stat[]')
but the separate declarations for it weren't changed to match.

Make the same change for hu_stat[].  Not sure why the pull request
didn't include it since the old declaration and the usage are same.

The curses one is in code that isn't used.
2022-09-10 19:30:36 -07:00
nhmall
c548fff9e4 some spelling corrections
The pull request included some changes that were neither accidental nor
unintentional, so only a subset of the changes from pull request #869
submitted by klorpa were manually applied.

behaviour  -> behavior
speach     -> speech
knowlege   -> knowledge
incrments  -> increments
stethscope -> stethoscope
staiway    -> stairway
arifact    -> artifact
extracing  -> extracting

The uses of "iff" were left alone.

Close #869
2022-09-08 10:54:11 -04:00
nhmall
4f2996758b follow-up 2022-09-06 10:12:19 -04:00
nhmall
0086e01967 return legal indexes for some display.h macros
Some static analyzers flagged the last-resort values as
out of bounds (which they were).

There's a small number of other complaint-suppression items in here too,
but nothing drastic.
2022-09-06 10:00:07 -04:00
PatR
4aefe3dae0 curses A_ITALIC build fix
My /usr/include/curses.h has various A_attribute macros but A_ITALIC
isn't one of them.  Compiling cursmisc.c failed because one of the
uses of that wasn't guarded by #ifdef A_ITALIC.  Instead of adding the
ommitted #if, substitute A_UNDERLINE for A_ITALIC when that's missing.

The select attribute menu when adding a menu color or a status hilite
now shows an entry for italic that's underlined (as expected) but the
underline entry itself does not display any sort of attribute.  I
didn't pursue that.
2022-09-05 14:40:41 -07:00
Patric Mueller
8bf5654eed tty and curses: support italic as text attribute 2022-09-04 22:33:25 +02:00
PatR
d4f0450afe fix the tty message spacing anomaly for messages \
delivered across level change checkpointing

Reported by entrez.  Simplest test case:  give level 1 a short
annotatation, level teleport to level 2, and level teleport back to
level 1.  The message window will show

|You materialize on another level.  You remember this level as <note>.

but ^P message history will show

|You materialize on another level.
|  You remember this level as <note>.

Spaces inserted to separate two messages that fit together on the
top line become part of the second message when saving a checkpoint
during level change flushes the top line into message history.

Change insurance checkpointing to record the full message history
without flushing the current top line so that toggling 'checkpoint'
doesn't affect what shows up on the screen or in message recall.
2022-08-30 15:01:49 -07:00
nhmall
443dc429e7 warning-free build without -Wno-missing-field-initializers
Also removes a GCC_WARN usage and the need for
#pragma GCC diagnostic ignored "-Wmissing-braces"
for src/decl.c when using gcc.
2022-08-29 14:06:12 -04:00
PatR
422a06f01f black and white ice, sink
When moat and lava use the same screen symbol and color is Off, lava
is rendered in inverse video.  It used to be similar for floor and
ice, but that got broken last year.  Fix inverse ice, and now that
fountain and sink might be same symbol (recent IBMgraphics change),
render sinks in inverse if they match fountains and color is Off.

I started to give sink its own mapglyph flag but then got lazy and
used the same value as ice.  That can be amended if some interface
wants to use some more elaborate distinction than inverse video.
2022-08-23 16:01:35 -07:00
PatR
8d29733fc4 curses: 'perm_invent' revisited
Redo the fix for using doset(#optionsfull) to toggle perm_invent
under curses.  Move it to curses code and let the core be unaware
of it.  It does the perm_invent update twice when creating the
window for that.
2022-08-22 18:36:53 -07:00
PatR
5c7f2945da curses: interactively toggling 'perm_invent' On
Enabling perm_invent with 'O' ('m O' these days) with curses used to
work but stopped at some point.  Analysis by entrez has attributed
the change to the g.program_state.in_docrt flag in docrt().  When
curses creates the perm_invent window for update_inventory(), it
calls docrt() to have nethack redraw the screen.

 docrt() -> update_inventory() -> curses_update_inventory() -> ...
  -> curs_reset_windows() -> doredraw() -> docrt() [early return]

resulted in room for the persistent inventory window but it was
blank.

This also replaces a couple of doredraw() calls with direct calls to
docrt() (one in code that isn't used).  doredraw() implements a user
command; docrt() does the actual redrawing.
2022-08-16 15:23:37 -07:00
PatR
44fc8576ed invent fixes, take II
Make sure that inventory listing when carrying only gold works when
build without TTY_PERM_INVENT as well as with that.
2022-08-15 18:00:10 -07:00
nhmall
c0d636fe32 a couple of warnings
invent.c: In function 'getobj':
invent.c:1579:29: warning: 'cnt' may be used uninitialized [-Wmaybe-uninitialized]
 1579 |                 if (cnt < 1 || otmp->quan <= cnt)
      |                     ~~~~~~~~^~~~~~~~~~~~~~~~~~~~
invent.c:1529:10: note: 'cnt' was declared here
 1529 |     long cnt;
      |          ^~~

../win/X11/winstat.c: In function 'update_fancy_status_field':
../win/X11/winstat.c:1920:28: warning: declaration of 'active' shadows a global declaration [-Wshadow]
 1920 |             static boolean active = FALSE;
      |                            ^~~~~~
In file included from ../include/hack.h:196,
                 from ../win/X11/winstat.c:36:
../include/wintype.h:180:5: note: shadowed declaration is here
  180 |     active           = 0x001,
      |     ^~~~~~
2022-08-13 09:09:10 -04:00
Pasi Kallinen
fd9745f9c6 Command repeating by using cmd queues
This replaces the old pushq/saveq arrays (which were used to save
the keys pressed by the user for repeating a previous command)
with a new command queue.  This means there's no hard-coded limit
to the saved keys, and it can repeat extended commands which are
not bound to any key.
2022-08-09 11:54:45 +03:00
PatR
32636099ce wizmgender fix
The 'wizmgender' option is flagged as 'wizonly' in optlist.h but that
doesn't prevent it from being set in NETHACKOPTIONS or .nethackrc.
Apply the fix from entrez to only honor it when running in wizard
mode.
2022-07-14 16:29:08 -07:00
PatR
2d0ee19df5 a few miscellaneous comments 2022-07-03 17:51:47 -07:00
Michael Meyer
406faad879 Get wizmgender working again
The wizard-mode option to highlight female monsters stopped having any
in-game effect after cb0c21e.  Formerly it caused female monsters to be
highlighted with a red background (red color + inverse); this commit
uses inverse video only without overriding their color.  Ensuring the
color override works consistently with the ENHANCED_SYMBOLS 24-bit color
doesn't seem worth it for what is a very niche debugging option, and I
think inverse video should probably suffice.

It also used to be a TTY-only option, but this enables it in curses as
well.
2022-07-03 16:34:28 -07:00
nhmall
c84e0ba6e1 rework TTY_PERM_INVENT; update window port interface
Change the inner workings of the experimental TTY_PERM_INVENT.

Switch to delivering the content to tty for the experimental perm_invent
via the existing window port interface (start_menu(), add_menu(), end_menu).

This also adds a new window port interface call ctrl_nhwindow() for
delivering information to the window port, and/or obtaining specific
information from the window port. The information and requests can
be extended as required. To be documented later once the changes settle
down.

Due to the intrusive nature of these changes and the possibility of
some bugs in the new code, I'm going to leave TTY_PERM_INVENT commented
out in the repository for a day or two.  Anyone wishing to test it out
can do so by uncommenting TTY_PERM_INVENT in config.h.
2022-07-03 00:35:32 -04:00
nhmall
3004cf2d34 be more consistent with coordinates 2022-07-02 09:10:03 -04:00
nhmall
30b557f7d5 change xchar to other typedefs
One of the drivers of this change was that screen coordinates require a
type that can hold values greater than 127. Parameters to the window
port routines require a large type in order to be able to have values
a fair bit larger than COLNO and ROWNO passed to them, particularly for
their use to the right of the map window.

This splits the uses of xchar into 3 different situations, and adjusts
their type and size:

                        xchar
                          |
               -----------------------
               |          |          |
            coordxy     xint16     xint8

coordxy: Actual x or y coordinates for various things (moved to 16-bits).

xint16:  Same data size as coordxy, but for non-coordinate use (16-bits).

xint8:   There are only a few use cases initially, where it was very
         plain to see that the variable could remain as 8-bits, rather
         than be bumped to 16-bits.  There are probably more such cases
         that could be changed after additional review.

Note: This first changed all xchar variables to coordxy. Some were
reviewed and got changed to xint16 or xint8 when it became apparent that
their usage was not for coordinates.

This increments EDITLEVEL in patchlevel.h
2022-06-30 23:48:18 -04:00
nhmall
f228fefabd updated window_procs
Add a non-string identifier to window_procs for use in runtime
identification of the current window port being used.

Use a macro WPID to add the identification at the top of the
various existing window_procs declarations. It expands to the
existing text string, as well as the newly added field wp_id
with a wp_ identifier.

For example, WPID(tty) expands to: "tty", wp_tty

The generated wp_tty must be present in the wp_ids enum at
the top of include/winprocs.h.

The WINDOWPORT(x) macro has been updated to expand to a simple
value comparison (port.wp_id == wp_x), instead of a
string comparison.
2022-06-29 23:21:19 -04:00
nhmall
af58acccd2 some tty perminvent follow-up() 2022-06-27 08:13:37 -04:00
Brian Campbell
f9d7bc63bf Fix underflow in free_window_info
At the end this is called after `WIN_MESSAGE` is reset to `-1`, so we
need a check here.
2022-06-26 15:30:58 +01:00
nhmall
d2ca61a0a0 TTY_PERM_INVENT tweaks 2022-06-25 22:26:18 -04:00
nhmall
4c3fb47900 initializers 2022-06-25 15:16:57 -04:00
nhmall
2770223d10 interface groundwork for core-side color decisions
(user-side decisions really, but as it stands right now
user-side decisions/options are made and processed by the core)

add a parameter to add_menu so color can be passed
2022-06-25 13:21:51 -04:00
nhmall
b60dae1706 remove now unneeded {} block in switch 2022-06-25 09:32:10 -04:00
nhmall
87475e2dda rework mode settings on the windowport-side 2022-06-25 09:17:56 -04:00
PatR
cde9b7e481 streamline the tty perm_invent bounder box set up
For the tty perm_invent boundary box initialiation, instead of doing
one of many assignments that do glyph lookup, do one of many symbol
assignments and one glyph lookup.  No change in observable behavior.

Also, use the main dungeon's walls for box rendering instead of
selecting ones for whatever branch the hero happens to be in at the
time perm_invent gets enabled.
2022-06-24 23:35:26 -07:00
nhmall
1c2cf78b48 fix perm_invent via 'O' border issue
> Start with default symbol set and with perm_invent Off.
> Use 'O' to change perm_invent to On.  The inventory with
> boundary box lines will briefly appear, then immediately be
> redrawn without those lines.
2022-06-24 20:10:11 -04:00
nhmall
18b28084f8 move some parts of TTY_PERM_INVENT into core
This starts the tty perm_invent just in time later in the
startup rather than initializing it with the other
game windows.

This also splits the duties:

The core will inquire from the window port about how many
inventory slots it can fill.

The core will handle figuring out the inventory text and
inventory letters, and will do the traversing of internal
data structures like obj chains, and passing customization
options on to the window port.

The window port will look after placing each inventory slot's
text at an appropriate location on the screen.

This, in theory, makes the core-portion available for
window ports other than tty to use, though none currently do.
The decision of what goes in an inventory slot is all left up
to the core with the update_invent_slot interface.

Documentation updates will come later, not at this time.
2022-06-24 15:01:38 -04:00
nhmall
90e7fdaa4b follow-up on corner menu appearance
move variable and its init out of ifdef block
add a comment and some range checking
2022-06-23 21:48:05 -04:00
nhmall
010eabcf38 refresh content between really long menu pages
For a long while, I've noticed that if the first page of corner menu is
quite long, and the second page is much shorter, the content obliterated
by the first page is left missing until the menu is fully dismissed.

This attempts to fix that missing content up.

===========================================================================
BEFORE THIS PATCH - menu Page 1
===========================================================================
                                   Amulets
                                   J - a circular amulet
        ------------               Weapons
        |..........|       ------- a - a +0 two-handed sword (weapon in hands)
        |..........|       |...... b - a +0 axe (alternate weapon; not wielded)
       #...........|      #....... w - 7 orcish arrows
       #|{..........#######|...... G - a battle-axe
       #------------       |...... P - 7 ya
       ###                 ------- Armor
         ##                        c - an uncursed +0 ring mail (being worn)
          #                        E - a splint mail
          #                        Comestibles
    ------#                        d - an uncursed food ration
    |.....#                        f - 6 food rations
    |....|                         h - 2 sprigs of wolfsbane
    |....|                         i - a cream pie
    |....-###                      k - 3 tripe rations
    |.<..|  ######  ############## Scrolls
    |.d@..######################## r - a scroll labeled ETAOIN SHRDLU
    ------                 ####    u - a scroll labeled PHOL ENDE WODAN
                              #### z - a scroll labeled XIXAXA XOXAXA XUXAXA
                                   Spellbooks
Wizard the Plunderer           St: o - a tan spellbook
Dlvl:1 $:0 HP:16(16) Pw:2(2) AC:7  q - a wrinkled spellbook
                                   v - a thin spellbook
---------------------------------- x - a plain spellbook
|a - +0 two-handed sword (weapon i y - a tan spellbook
|b - +0 axe (alternate weapon; not H - an indigo spellbook
|c - uncursed +0 ring mail (being  W - a light blue spellbook
|d - uncursed food ration          X - a velvet spellbook
|e - uncursed oil lamp             Potions
|f - 6 food rations                g - a brilliant blue potion
|g - brilliant blue potion         j - a fizzy potion
|h - 2 sprigs of wolfsbane         m - an effervescent potion
|i - cream pie                     B - 2 golden potions
|j - fizzy potion                  D - a dark green potion
|k - 3 tripe rations               I - a bubbly potion
|l - moonstone ring                Rings
|m - effervescent potion           l - a moonstone ring
|n - tiger eye ring                n - a tiger eye ring
|o - tan spellbook                 Y - a topaz ring
|p - tinning kit                   Wands
|q - wrinkled spellbook            s - a crystal wand
|r - scroll labeled ETAOIN SHRDLU  Tools
|s - crystal wand                  e - an uncursed oil lamp
|t - oil lamp                      p - a tinning kit
|u - scroll labeled PHOL ENDE WODA t - an oil lamp
|v - thin spellbook                A - a stethoscope
|w - 7 orcish arrows               C - a bugle
|x - plain spellbook               F - an oil lamp
|y - tan spellbook                 Gems/Stones
|z - scroll labeled XIXAXA XOXAXA  L - 4 blue gems
---------------------------------- (1 of 2)

===========================================================================
BEFORE THIS PATCH - menu Page 2

While the second page is displayed, there are gaping missing portions of
the map, status lines, and now the tty perm_invent window.
===========================================================================

                                   V - a white gem
                                   (2 of 2)
        ------------
        |..........|       -------
        |..........|       |......
       #...........|      #.......
       #|{..........#######|......
       #------------       |......
       ###                 -------
         ##
          #
          #
    ------#
    |.....#
    |....|
    |....|
    |....-###
    |.<..|  ######  ##############
    |.d@..########################
    ------                 ####
                              ####

Wizard the Plunderer           St:
Dlvl:1 $:0 HP:16(16) Pw:2(2) AC:7

----------------------------------
|a - +0 two-handed sword (weapon i
|b - +0 axe (alternate weapon; not
|c - uncursed +0 ring mail (being
|d - uncursed food ration
|e - uncursed oil lamp
|f - 6 food rations
|g - brilliant blue potion
|h - 2 sprigs of wolfsbane
|i - cream pie
|j - fizzy potion
|k - 3 tripe rations
|l - moonstone ring
|m - effervescent potion
|n - tiger eye ring
|o - tan spellbook
|p - tinning kit
|q - wrinkled spellbook
|r - scroll labeled ETAOIN SHRDLU
|s - crystal wand
|t - oil lamp
|u - scroll labeled PHOL ENDE WODA
|v - thin spellbook
|w - 7 orcish arrows
|x - plain spellbook
|y - tan spellbook
|z - scroll labeled XIXAXA XOXAXA
----------------------------------

===========================================================================
AFTER THIS PATCH - menu Page 2

The obliterated content of the map, status lines, and tty perm_invent
are refreshed prior to displaying menu Page 2.
===========================================================================

                                   V - a white gem
                                   (2 of 2)
        ------------                                    ----------------
        |..........|       ---------------             #...............|
        |..........|       |.............|             #|..............|
       #...........|      #..............|             #|........^.....|
       #|{..........#######|.........{...|             #-+--------------
       #------------       |.............|             ###############
       ###                 -------------.-                #          #
         ##                             #                 #          #####
          #                            ##       ----------#      --------.-
          #                            #       #+........|#      |........|
    ------#                            #     ###|.........#      |........|
    |.....#                          # #     #  |...>....|   ####.........|
    |....|                         ----.--######..........####   |........|
    |....|                         |.....|#     ----------       |........|
    |....-###                      |.....|#             #        |........|
    |.<..|  ######  ###############+......#                      ----------
    |.d@..#########################|.....|#
    ------                 ####    -------#
                              #############

Wizard the Plunderer           St:18/01 Dx:16 Co:18 In:8 Wi:8 Ch:6 Chaotic
Dlvl:1 $:0 HP:16(16) Pw:2(2) AC:7 Xp:1 Stressed

------------------------------------------------------------------------------
|a - +0 two-handed sword (weapon in hands|A - stethoscope                    |
|b - +0 axe (alternate weapon; not wielde|B - 2 golden potions               |
|c - uncursed +0 ring mail (being worn)  |C - bugle                          |
|d - uncursed food ration                |D - dark green potion              |
|e - uncursed oil lamp                   |E - splint mail                    |
|f - 6 food rations                      |F - oil lamp                       |
|g - brilliant blue potion               |G - battle-axe                     |
|h - 2 sprigs of wolfsbane               |H - indigo spellbook               |
|i - cream pie                           |I - bubbly potion                  |
|j - fizzy potion                        |J - circular amulet                |
|k - 3 tripe rations                     |L - 4 blue gems                    |
|l - moonstone ring                      |P - 7 ya                           |
|m - effervescent potion                 |V - white gem                      |
|n - tiger eye ring                      |W - light blue spellbook           |
|o - tan spellbook                       |X - velvet spellbook               |
|p - tinning kit                         |Y - topaz ring                     |
|q - wrinkled spellbook                  |                                   |
|r - scroll labeled ETAOIN SHRDLU        |                                   |
|s - crystal wand                        |                                   |
|t - oil lamp                            |                                   |
|u - scroll labeled PHOL ENDE WODAN      |                                   |
|v - thin spellbook                      |                                   |
|w - 7 orcish arrows                     |                                   |
|x - plain spellbook                     |                                   |
|y - tan spellbook                       |                                   |
|z - scroll labeled XIXAXA XOXAXA XUXAXA |                                   |
------------------------------------------------------------------------------
2022-06-23 20:35:43 -04:00
PatR
38433b4075 tty perm_invent bits
Mostly comments.
2022-06-23 16:10:17 -07:00