home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 January
/
usenetsourcesnewsgroupsinfomagicjanuary1994.iso
/
sources
/
games
/
volume16
/
nethack31
/
part90
< prev
next >
Wrap
Internet Message Format
|
1993-02-06
|
60KB
Path: uunet!news.tek.com!master!saab!billr
From: billr@saab.CNA.TEK.COM (Bill Randle)
Newsgroups: comp.sources.games
Subject: v16i098: nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part90/108
Message-ID: <4463@master.CNA.TEK.COM>
Date: 5 Feb 93 22:02:33 GMT
Sender: news@master.CNA.TEK.COM
Lines: 1958
Approved: billr@saab.CNA.TEK.COM
Xref: uunet comp.sources.games:1649
Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
Posting-number: Volume 16, Issue 98
Archive-name: nethack31/Part90
Supersedes: nethack3p9: Volume 10, Issue 46-102
Environment: Amiga, Atari, Mac, MS-DOS, OS2, Unix, VMS, X11
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 90 (of 108)."
# Contents: dat/Barb.des include/winX.h src/mondata.c
# sys/mac/macmain.c sys/share/termcap
# Wrapped by billr@saab on Wed Jan 27 16:09:23 1993
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'dat/Barb.des' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'dat/Barb.des'\"
else
echo shar: Extracting \"'dat/Barb.des'\" \(13280 characters\)
sed "s/^X//" >'dat/Barb.des' <<'END_OF_FILE'
X# SCCS Id: @(#)Barb.des 3.1 91/12/22
X# Copyright (c) 1989 by Jean-Christophe Collet
X# Copyright (c) 1991 by M. Stephenson
X# NetHack may be freely redistributed. See license for details.
X#
X# The "start" level for the quest.
X#
X# Here you meet your (besieged) class leader, Pelias,
X# and receive your quest assignment.
X#
XMAZE: "B-start",' '
XFLAGS: noteleport,hardfloor
XGEOMETRY:center,center
XMAP
X..................................PP........................................
X...................................PP.......................................
X...................................PP.......................................
X....................................PP......................................
X........--------------......-----....PPP....................................
X........|...S........|......+...|...PPP.....................................
X........|----........|......|...|....PP.....................................
X........|.\..........+......-----...........................................
X........|----........|...............PP.....................................
X........|...S........|...-----.......PPP....................................
X........--------------...+...|......PPPPP...................................
X.........................|...|.......PPP....................................
X...-----......-----......-----........PP....................................
X...|...+......|...+..--+--.............PP...................................
X...|...|......|...|..|...|..............PP..................................
X...-----......-----..|...|.............PPPP.................................
X.....................-----............PP..PP................................
X.....................................PP...PP................................
X....................................PP...PP.................................
X....................................PP....PP................................
XENDMAP
X# Random Monsters
XRANDOM_MONSTERS: 'O', 'T'
X# Dungeon Description
XREGION:(00,00,75,19),lit,"ordinary"
XREGION:(09,05,11,05),unlit,"ordinary"
XREGION:(09,07,11,07),lit,"ordinary"
XREGION:(09,09,11,09),unlit,"ordinary"
XREGION:(13,05,20,09),lit,"ordinary"
XREGION:(29,05,31,06),lit,"ordinary"
XREGION:(26,10,28,11),lit,"ordinary"
XREGION:(04,13,06,14),lit,"ordinary"
XREGION:(15,13,17,14),lit,"ordinary"
XREGION:(22,14,24,15),lit,"ordinary"
X# Stairs
XSTAIR:(09,09),down
X# Portal arrival point
XBRANCH:(62,02,62,02),(0,0,0,0)
X# Doors
XDOOR:locked,(12,05)
XDOOR:locked,(12,09)
XDOOR:closed,(21,07)
XDOOR:open,(07,13)
XDOOR:open,(18,13)
XDOOR:open,(23,13)
XDOOR:open,(25,10)
XDOOR:open,(28,05)
X# Elder
XMONSTER:'@',"Pelias",(10,07)
X# The treasure of Pelias
XOBJECT:'(',"chest",(09,05)
X# chieftain guards for the audience chamber
XMONSTER:'@',"chieftain",(10,05)
XMONSTER:'@',"chieftain",(10,09)
XMONSTER:'@',"chieftain",(11,05)
XMONSTER:'@',"chieftain",(11,09)
XMONSTER:'@',"chieftain",(14,05)
XMONSTER:'@',"chieftain",(14,09)
XMONSTER:'@',"chieftain",(16,05)
XMONSTER:'@',"chieftain",(16,09)
X# Non diggable walls
XNON_DIGGABLE:(00,00,75,19)
X# One trap to keep the ogres at bay.
XTRAP:"spiked pit",(37,07)
X# Eels in the river
XMONSTER:';',"giant eel",(36,01)
XMONSTER:';',"giant eel",(37,09)
XMONSTER:';',"giant eel",(38,15)
X# Monsters on siege duty.
XMONSTER:'O',"ogre",(40,08),hostile
XMONSTER:'O',"ogre",(41,06),hostile
XMONSTER:'O',"ogre",(41,07),hostile
XMONSTER:'O',"ogre",(41,08),hostile
XMONSTER:'O',"ogre",(41,09),hostile
XMONSTER:'O',"ogre",(41,10),hostile
XMONSTER:'O',"ogre",(42,06),hostile
XMONSTER:'O',"ogre",(42,07),hostile
XMONSTER:'O',"ogre",(42,08),hostile
XMONSTER:'O',"ogre",(42,09),hostile
XMONSTER:'O',"ogre",(42,10),hostile
X
X#
X# The "locate" level for the quest.
X#
X# Here you have to infiltrate the Duali Oasis to go
X# further towards your assigned quest.
X#
X
XMAZE: "B-locate",' '
XFLAGS: hardfloor
XGEOMETRY:center,center
XMAP
X..........PPP.........................................
X...........PP.......................................... .......
X..........PP...........-----..........------------------ ..........
X...........PP..........+...|..........|....S...........|.. ............
X..........PPP..........|...|..........|-----...........|... .............
X...........PPP.........-----..........+....+...........|... .............
X..........PPPPPPPPP...................+....+...........S.................
X........PPPPPPPPPPPPP.........-----...|-----...........|................
X......PPPPPPPPPPPPPP..P.......+...|...|....S...........| ...
X.....PPPPPPP......P..PPPP.....|...|...------------------.. ...
X....PPPPPPP.........PPPPPP....-----........................ ........
X...PPPPPPP..........PPPPPPP.................................. ..........
X....PPPPPPP........PPPPPPP.................................... ..........
X.....PPPPP........PPPPPPP.........-----........................ ........
X......PPP..PPPPPPPPPPPP...........+...|......................... .....
X..........PPPPPPPPPPP.............|...|......................... ....
X..........PPPPPPPPP...............-----......................... .
X..............PPP.................................................
X...............PP....................................................
X................PPP...................................................
XENDMAP
X# Random Monsters
XRANDOM_MONSTERS: 'O', 'T'
X# Dungeon Description
XREGION:(00,00,75,19),lit,"ordinary"
XREGION:(24,03,26,04),unlit,"ordinary"
XREGION:(31,08,33,09),unlit,"ordinary"
XREGION:(35,14,37,15),unlit,"ordinary"
XREGION:(39,03,54,08),lit,"ordinary"
XREGION:(56,00,75,08),unlit,"ordinary"
XREGION:(64,09,75,16),unlit,"ordinary"
X# Doors
XDOOR:open,(23,03)
XDOOR:open,(30,08)
XDOOR:open,(34,14)
XDOOR:locked,(38,05)
XDOOR:locked,(38,06)
XDOOR:closed,(43,03)
XDOOR:closed,(43,05)
XDOOR:closed,(43,06)
XDOOR:closed,(43,08)
XDOOR:locked,(55,06)
X# Stairs
XSTAIR:(05,02),up
XSTAIR:(70,13),down
X# Objects
XOBJECT:random,random,(42,03)
XOBJECT:random,random,(42,03)
XOBJECT:random,random,(42,03)
XOBJECT:random,random,(41,03)
XOBJECT:random,random,(41,03)
XOBJECT:random,random,(41,03)
XOBJECT:random,random,(41,03)
XOBJECT:random,random,(41,08)
XOBJECT:random,random,(41,08)
XOBJECT:random,random,(42,08)
XOBJECT:random,random,(42,08)
XOBJECT:random,random,(42,08)
XOBJECT:random,random,(71,13)
XOBJECT:random,random,(71,13)
XOBJECT:random,random,(71,13)
X# Random traps
XTRAP:"spiked pit",(10,13)
XTRAP:"spiked pit",(21,07)
XTRAP:"spiked pit",(67,08)
XTRAP:"spiked pit",(68,09)
XTRAP:random,random
XTRAP:random,random
XTRAP:random,random
XTRAP:random,random
X# Random monsters.
XMONSTER:'O',"ogre",(12,09),hostile
XMONSTER:'O',"ogre",(18,11),hostile
XMONSTER:'O',"ogre",(45,05),hostile
XMONSTER:'O',"ogre",(45,06),hostile
XMONSTER:'O',"ogre",(47,05),hostile
XMONSTER:'O',"ogre",(46,05),hostile
XMONSTER:'O',"ogre",(56,03),hostile
XMONSTER:'O',"ogre",(56,04),hostile
XMONSTER:'O',"ogre",(56,05),hostile
XMONSTER:'O',"ogre",(56,06),hostile
XMONSTER:'O',"ogre",(57,03),hostile
XMONSTER:'O',"ogre",(57,04),hostile
XMONSTER:'O',"ogre",(57,05),hostile
XMONSTER:'O',"ogre",(57,06),hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',random,random,hostile
XMONSTER:'T',random,random,hostile
XMONSTER:'T',"rock troll",(46,06),hostile
XMONSTER:'T',"rock troll",(47,06),hostile
XMONSTER:'T',"rock troll",(56,07),hostile
XMONSTER:'T',"rock troll",(57,07),hostile
XMONSTER:'T',"rock troll",(70,13),hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',random,random,hostile
X
X#
X# The "goal" level for the quest.
X#
X# Here you meet Thoth Amon, your nemesis monster. You have to
X# defeat Thoth Amon in combat to gain the artifact you have
X# been assigned to retrieve.
X#
X
XMAZE: "B-goal", ' '
XGEOMETRY:center,center
XMAP
X
X .............
X ..................
X .... ......................... ....
X ....... .......................... .......
X ...... ........................ .......
X .. ...................................... ..
X .. ..................... ..
X .. .................. ..
X .. ..S...S.............. ................
X .. ........ ...
X ......... ..
X ...... .. ... ....
X .. ... .. ...... ........
X .... .. .................. ........ ......
X ...... ...................... ...... ..
X .... .................. ...........
X ..............
X ...........
X
XENDMAP
X# Random Monsters
XRANDOM_MONSTERS: 'O', 'T'
X# Dungeon Description
XREGION:(00,00,75,19),unlit,"ordinary"
X# Secret doors
XDOOR:locked,(22,09)
XDOOR:locked,(26,09)
X# Stairs
XSTAIR:(36,05),up
X# The altar. Unattended.
XALTAR:(63,04),align[2],altar
XNON_DIGGABLE:(00,00,75,19)
X# Objects
XOBJECT:'*',"luckstone",(63,04),blessed,0,"The Heart of Ahriman"
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
XOBJECT:random,random,random
X# Random traps
XTRAP:random,random
XTRAP:random,random
XTRAP:random,random
XTRAP:random,random
XTRAP:random,random
XTRAP:random,random
X# Random monsters.
XMONSTER:'@',"Thoth Amon",(63,04),hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',"ogre",random,hostile
XMONSTER:'O',random,random,hostile
XMONSTER:'O',random,random,hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',"rock troll",random,hostile
XMONSTER:'T',random,random,hostile
XWALLIFY
X
X#
X# The "fill" levels for the quest.
X#
X# These levels are used to fill out any levels not occupied by specific
X# levels as defined above. "filla" is the upper filler, between the
X# start and locate levels, and "fillb" the lower between the locate
X# and goal levels.
X#
X
XMAZE: "B-filla" , ' '
XINIT_MAP: '.' , '.' , true , true , unlit , false
XNOMAP
X# Random Monsters
XRANDOM_MONSTERS: 'O', 'T'
X#
XSTAIR: random, up
XSTAIR: random, down
X#
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
X#
XTRAP: random, random
XTRAP: random, random
XTRAP: random, random
XTRAP: random, random
X#
XMONSTER: 'O', "ogre", random, hostile
XMONSTER: 'O', "ogre", random, hostile
XMONSTER: 'O', random, random, hostile
XMONSTER: 'T', "rock troll", random, hostile
X
XMAZE: "B-fillb" , ' '
XINIT_MAP: '.' , ' ' , true , true , unlit , true
XNOMAP
X# Random Monsters
XRANDOM_MONSTERS: 'O', 'T'
X#
XSTAIR: random, up
XSTAIR: random, down
X#
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
XOBJECT: random, random, random
X#
XTRAP: random, random
XTRAP: random, random
XTRAP: random, random
XTRAP: random, random
X#
XMONSTER: 'O', "ogre", random, hostile
XMONSTER: 'O', "ogre", random, hostile
XMONSTER: 'O', "ogre", random, hostile
XMONSTER: 'O', "ogre", random, hostile
XMONSTER: 'O', "ogre", random, hostile
XMONSTER: 'O', "ogre", random, hostile
XMONSTER: 'O', "ogre", random, hostile
XMONSTER: 'O', random , random, hostile
XMONSTER: 'T', "rock troll", random, hostile
XMONSTER: 'T', "rock troll", random, hostile
XMONSTER: 'T', "rock troll", random, hostile
XMONSTER: 'T', random , random, hostile
END_OF_FILE
if test 13280 -ne `wc -c <'dat/Barb.des'`; then
echo shar: \"'dat/Barb.des'\" unpacked with wrong size!
fi
# end of 'dat/Barb.des'
fi
if test -f 'include/winX.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'include/winX.h'\"
else
echo shar: Extracting \"'include/winX.h'\" \(11646 characters\)
sed "s/^X//" >'include/winX.h' <<'END_OF_FILE'
X/* SCCS Id: @(#)winX.h 3.1 93/01/22 */
X/* Copyright (c) Dean Luick, 1992 */
X/* NetHack may be freely redistributed. See license for details. */
X
X/*
X * Definitions for the X11 window-port. See doc/window.doc for details on
X * the window interface.
X */
X#ifndef WINX_H
X#define WINX_H
X
X#ifndef E
X#define E extern
X#endif
X
X#if defined(BOS) || defined(NHSTDC)
X#define DIMENSION_P int
X#else
X# ifdef WIDENED_PROTOTYPES
X#define DIMENSION_P unsigned int
X# else
X#define DIMENSION_P Dimension
X# endif
X#endif
X
X/*
X * Generic text buffer.
X */
X#define START_SIZE 512 /* starting text buffer size */
Xstruct text_buffer {
X char *text;
X int text_size;
X int text_last;
X int num_lines;
X};
X
X
X/*
X * Information specific to a map window.
X */
Xstruct map_info_t {
X unsigned char text[ROWNO][COLNO], /* Actual displayed screen. */
X t_start[ROWNO], /* Staring column for new info. */
X t_stop[ROWNO]; /* Ending column for new info. */
X int char_width, /* Saved font information so we can */
X char_height, /* calculate the correct placement */
X char_ascent, /* of changes. */
X char_lbearing;
X Dimension viewport_width, /* Saved viewport size, so we can */
X viewport_height; /* clip to cursor on a resize. */
X#ifdef TEXTCOLOR
X unsigned char colors[ROWNO][COLNO]; /* Color of each character. */
X GC color_gcs[MAXCOLORS], /* GC for each color */
X inv_color_gcs[MAXCOLORS]; /* GC for each inverse color */
X#define copy_gc color_gcs[NO_COLOR]
X#define inv_copy_gc inv_color_gcs[NO_COLOR]
X#else
X GC copy_gc, /* Drawing GC */
X inv_copy_gc; /* Inverse drawing GC */
X#endif
X};
X
X/*
X * Information specific to a message window.
X */
Xstruct line_element {
X struct line_element *next;
X char *line; /* char buffer */
X int buf_length; /* length of buffer */
X int str_length; /* length of string in buffer */
X};
X
Xstruct mesg_info_t {
X XFontStruct *fs; /* Font for the window. */
X int num_lines; /* line count */
X struct line_element *head; /* head of circular line queue */
X struct line_element *last_pause;/* point to the line after the prev */
X /* bottom of screen */
X struct line_element *last_pause_head;/* pointer to head of previous */
X /* turn */
X GC gc; /* GC for text drawing */
X int char_width, /* Saved font information so we can */
X char_height, /* calculate the correct placement */
X char_ascent, /* of changes. */
X char_lbearing;
X Dimension viewport_width, /* Saved viewport size, so we can adjust */
X viewport_height;/* the slider on a resize. */
X Boolean dirty; /* Lines have been added to the window. */
X};
X
X/*
X * Information specific to a "text" status window.
X */
Xstruct status_info_t {
X struct text_buffer text; /* Just a text buffer. */
X};
X
X/*
X * Information specific to a menu window. First a structure for each
X * menu entry, then the structure for each menu window.
X */
Xstruct menu_item {
X struct menu_item *next;
X char selector; /* Char used to select this entry. */
X int attr; /* Attribute for the line. */
X char *str; /* The text of the item. */
X};
X
Xstruct menu_info_t {
X struct menu_item *base; /* Starting pointer for item list. */
X struct menu_item *last; /* End pointer for item list. */
X const char *query;
X const char *other_valid;
X char other_response;
X int count;
X String *list_pointer;
X boolean valid_widgets;
X boolean is_menu; /* Has been conformed to being a menu window. */
X};
X
X/*
X * Information specific to a text window.
X */
Xstruct text_info_t {
X struct text_buffer text;
X XFontStruct *fs; /* Font for the text window. */
X int max_width; /* Width of widest line so far. */
X int extra_width, /* Sum of left and right border widths. */
X extra_height; /* Sum of top and bottom border widths. */
X boolean blocked; /* */
X boolean destroy_on_ack; /* Destroy this window when acknowleged. */
X};
X
X
X/*
X * Basic window structure.
X */
Xstruct xwindow {
X int type; /* type of nethack window */
X Widget popup; /* direct parent of widget w or viewport */
X Widget w; /* the widget that does things */
X Dimension pixel_width; /* window size, in pixels */
X Dimension pixel_height;
X int prevx, cursx; /* Cursor position, only used by */
X int prevy, cursy; /* map and "plain" status windows.*/
X
X union {
X struct map_info_t *Map_info; /* map window info */
X struct mesg_info_t *Mesg_info; /* message window info */
X struct status_info_t *Status_info; /* status window info */
X struct menu_info_t *Menu_info; /* menu window info */
X struct text_info_t *Text_info; /* menu window info */
X } Win_info;
X};
X
X/* Defines to use for the window information union. */
X#define map_information Win_info.Map_info
X#define mesg_information Win_info.Mesg_info
X#define status_information Win_info.Status_info
X#define menu_information Win_info.Menu_info
X#define text_information Win_info.Text_info
X
X
X#define MAX_WINDOWS 20 /* max number of open windows */
X
X#define NHW_NONE 0 /* Unallocated window type. Must be */
X /* different from any other NHW_* type. */
X
X#define NO_CLICK 0 /* No click occured on the map window. Must */
X /* be different than CLICK_1 and CLICK_2. */
X
X#define DEFAULT_MESSAGE_WIDTH 60/* width in chars of the message window */
X
X#define DISPLAY_FILE_SIZE 35 /* Max number of lines in the default */
X /* file display window. */
X
X#define MAX_KEY_STRING 64 /* String size for converting a keypress */
X /* event into a character(s) */
X
X#define DEFAULT_LINES_DISPLAYED 12 /* # of lines displayed message window */
X#define MAX_HISTORY 60 /* max history saved on message window */
X
X
X/* Window variables (winX.c). */
XE struct xwindow window_list[MAX_WINDOWS];
XE XtAppContext app_context; /* context of application */
XE Widget toplevel; /* toplevel widget */
XE boolean exit_x_event; /* exit condition for event loop */
X#define EXIT_ON_KEY_PRESS 0 /* valid values for exit_x_event */
X#define EXIT_ON_KEY_OR_BUTTON_PRESS 1
X#define EXIT_ON_EXIT 2
X#define EXIT_ON_SENT_EVENT 3
XE int click_x, click_y, click_button;
X
Xtypedef struct {
X Boolean slow;
X Boolean autofocus;
X Boolean message_line;
X String icon; /* name of desired icon */
X} AppResources;
X
XE AppResources appResources;
XE void (*input_func)();
X
Xextern struct window_procs X11_procs;
X
X/* Check for an invalid window id. */
X#define check_winid(window) \
X if ((window) < 0 || (window) >= MAX_WINDOWS) { \
X panic("illegal windid [%d] in %s at line %d", \
X window, __FILE__, __LINE__); \
X }
X
X
X/* ### dialogs.c ### */
XE Widget FDECL(CreateDialog, (Widget, String, XtCallbackProc, XtCallbackProc));
XE void FDECL(SetDialogPrompt,(Widget, String));
XE String FDECL(GetDialogResponse,(Widget));
XE void FDECL(SetDialogResponse,(Widget, String));
XE void FDECL(positionpopup,(Widget));
X
X/* ### winX.c ### */
XE struct xwindow *FDECL(find_widget,(Widget));
XE char FDECL(key_event_to_char,(XKeyEvent*));
XE void FDECL(msgkey, (Widget, XtPointer, XEvent*));
XE void FDECL(nh_XtPopup, (Widget, int, Widget));
XE void FDECL(nh_XtPopdown, (Widget));
XE void NDECL(win_X11_init);
X
X/* ### winmesg.c ### */
XE void FDECL(set_message_height, (struct xwindow*, DIMENSION_P));
XE void FDECL(set_message_slider, (struct xwindow*));
XE void FDECL(create_message_window,(struct xwindow*, BOOLEAN_P, Widget));
XE void FDECL(destroy_message_window,(struct xwindow*));
XE void FDECL(display_message_window, (struct xwindow*));
XE void FDECL(append_message,(struct xwindow*, const char*));
XE void FDECL(set_last_pause, (struct xwindow*));
X
X/* ### winmap.c ### */
XE void FDECL(check_cursor_visibility,(struct xwindow*));
XE void FDECL(display_map_window,(struct xwindow*));
XE void FDECL(clear_map_window,(struct xwindow*));
XE void FDECL(extern_map_input,(XEvent*));
XE void FDECL(set_map_size,(struct xwindow*, DIMENSION_P, DIMENSION_P));
XE void FDECL(create_map_window,(struct xwindow*, BOOLEAN_P, Widget));
XE void FDECL(destroy_map_window,(struct xwindow*));
XE int FDECL(x_event,(int));
X
X/* ### winmenu.c ### */
XE void FDECL(menu_key,(Widget, XEvent*, String*, Cardinal*));
XE void FDECL(create_menu_window,(struct xwindow*));
XE void FDECL(destroy_menu_window,(struct xwindow*));
X
X/* ### winmisc.c ### */
XE void FDECL(ps_key,(Widget, XEvent*, String*, Cardinal*)); /* player selection action */
XE void FDECL(ec_key,(Widget, XEvent*, String*, Cardinal*)); /* extended command action */
XE void NDECL(init_extended_commands_popup);
X
X/* ### winstatus.c ### */
XE void FDECL(create_status_window,(struct xwindow*, BOOLEAN_P, Widget));
XE void FDECL(destroy_status_window,(struct xwindow*));
XE void FDECL(adjust_status,(struct xwindow*, const char*));
XE void NDECL(null_out_status);
XE void NDECL(check_turn_events);
X
X/* ### wintext.c ### */
XE void FDECL(dismiss_text,(Widget, XEvent*, String*, Cardinal*));
XE void FDECL(key_dismiss_text,(Widget, XEvent*, String*, Cardinal*));
XE void FDECL(add_to_text_window,(struct xwindow*, int, const char*));
XE void FDECL(display_text_window,(struct xwindow*, BOOLEAN_P));
XE void FDECL(create_text_window,(struct xwindow*));
XE void FDECL(destroy_text_window,(struct xwindow*));
XE void FDECL(append_text_buffer,(struct text_buffer*, const char*, BOOLEAN_P)); /* text buffer routines */
XE void FDECL(init_text_buffer,(struct text_buffer*));
XE void FDECL(clear_text_buffer,(struct text_buffer*));
XE void FDECL(free_text_buffer,(struct text_buffer*));
X
X/* ### winval.c ### */
XE Widget FDECL(create_value,(Widget, const char*));
XE void FDECL(set_name,(Widget, char*));
XE void FDECL(set_name_width,(Widget, int));
XE int FDECL(get_name_width,(Widget));
XE void FDECL(set_value,(Widget, const char*));
XE void FDECL(set_value_width,(Widget, int));
XE int FDECL(get_value_width,(Widget));
XE void FDECL(hilight_value,(Widget));
X
X/* external declarations */
XE void NDECL(X11_init_nhwindows);
XE void NDECL(X11_player_selection);
XE void NDECL(X11_askname);
XE void NDECL(X11_get_nh_event) ;
XE void FDECL(X11_exit_nhwindows, (const char *));
XE void FDECL(X11_suspend_nhwindows, (const char *));
XE void NDECL(X11_resume_nhwindows);
XE winid FDECL(X11_create_nhwindow, (int));
XE void FDECL(X11_clear_nhwindow, (winid));
XE void FDECL(X11_display_nhwindow, (winid, BOOLEAN_P));
XE void FDECL(X11_destroy_nhwindow, (winid));
XE void FDECL(X11_curs, (winid,int,int));
XE void FDECL(X11_putstr, (winid, int, const char *));
XE void FDECL(X11_display_file, (const char *, BOOLEAN_P));
XE void FDECL(X11_start_menu, (winid));
XE void FDECL(X11_add_menu, (winid, CHAR_P, int, const char *));
XE void FDECL(X11_end_menu, (winid, CHAR_P, const char *, const char *));
XE char FDECL(X11_select_menu, (winid));
XE void NDECL(X11_update_inventory);
XE void NDECL(X11_mark_synch);
XE void NDECL(X11_wait_synch);
X#ifdef CLIPPING
XE void FDECL(X11_cliparound, (int, int));
X#endif
XE void FDECL(X11_print_glyph, (winid,XCHAR_P,XCHAR_P,int));
XE void FDECL(X11_raw_print, (const char *));
XE void FDECL(X11_raw_print_bold, (const char *));
XE int NDECL(X11_nhgetch);
XE int FDECL(X11_nh_poskey, (int *, int *, int *));
XE void NDECL(X11_nhbell);
XE int NDECL(X11_doprev_message);
XE char FDECL(X11_yn_function, (const char *, const char *, CHAR_P));
XE void FDECL(X11_getlin, (const char *,char *));
X#ifdef COM_COMPL
XE void FDECL(X11_get_ext_cmd, (char *));
X#endif /* COM_COMPL */
XE void FDECL(X11_number_pad, (int));
XE void NDECL(X11_delay_output);
X
X/* other defs that really should go away (they're tty specific) */
XE void NDECL(X11_start_screen);
XE void NDECL(X11_end_screen);
X
X#endif /* WINX_H */
END_OF_FILE
if test 11646 -ne `wc -c <'include/winX.h'`; then
echo shar: \"'include/winX.h'\" unpacked with wrong size!
fi
# end of 'include/winX.h'
fi
if test -f 'src/mondata.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/mondata.c'\"
else
echo shar: Extracting \"'src/mondata.c'\" \(10482 characters\)
sed "s/^X//" >'src/mondata.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)mondata.c 3.1 92/11/24 */
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X#include "hack.h"
X#include "eshk.h"
X#include "epri.h"
X
X/* These routines provide basic data for any type of monster. */
X
X#ifdef OVL0
X
Xboolean
Xattacktype(ptr, atyp)
X register struct permonst *ptr;
X register int atyp;
X{
X int i;
X
X for(i = 0; i < NATTK; i++)
X if(ptr->mattk[i].aatyp == atyp) return(TRUE);
X
X return(FALSE);
X}
X
X#endif /* OVL0 */
X#ifdef OVLB
X
Xboolean
Xpoly_when_stoned(ptr)
X struct permonst *ptr;
X{
X return (is_golem(ptr) && ptr != &mons[PM_STONE_GOLEM] &&
X !(mons[PM_STONE_GOLEM].geno & G_GENOD)); /* allow G_EXTINCT */
X}
X
Xboolean
Xresists_drli(ptr) /* returns TRUE if monster is drain-life resistant */
X
X register struct permonst *ptr;
X{
X return(is_undead(ptr) || is_demon(ptr) || is_were(ptr));
X}
X
X#endif /* OVLB */
X#ifdef OVL0
X
Xboolean
Xranged_attk(ptr) /* returns TRUE if monster can attack at range */
X register struct permonst *ptr;
X{
X register int i, j;
X register int atk_mask = (1<<AT_BREA) | (1<<AT_SPIT) | (1<<AT_GAZE);
X
X /* was: (attacktype(ptr, AT_BREA) || attacktype(ptr, AT_WEAP) ||
X attacktype(ptr, AT_SPIT) || attacktype(ptr, AT_GAZE) ||
X attacktype(ptr, AT_MAGC));
X but that's too slow -dlc
X */
X for(i = 0; i < NATTK; i++) {
X if((j=ptr->mattk[i].aatyp) >= AT_WEAP || (atk_mask & (1<<j)))
X return TRUE;
X }
X
X return(FALSE);
X}
X
Xboolean
Xhates_silver(ptr)
Xregister struct permonst *ptr;
X/* returns TRUE if monster is especially affected by silver weapons */
X{
X return (is_were(ptr) || ptr->mlet==S_VAMPIRE || is_demon(ptr) ||
X ptr == &mons[PM_SHADE] ||
X (ptr->mlet==S_IMP && ptr != &mons[PM_TENGU]));
X}
X
X#endif /* OVL0 */
X#ifdef OVL1
X
Xboolean
Xcan_track(ptr) /* returns TRUE if monster can track well */
X register struct permonst *ptr;
X{
X if (uwep && uwep->oartifact == ART_EXCALIBUR)
X return TRUE;
X else
X return(haseyes(ptr));
X}
X
X#endif /* OVL1 */
X#ifdef OVLB
X
X#if defined(POLYSELF) || defined(MUSE)
Xboolean
Xsliparm(ptr) /* creature will slide out of armor */
X register struct permonst *ptr;
X{
X return is_whirly(ptr) || ptr->msize <= MZ_SMALL ||
X ptr == &mons[PM_GHOST];
X}
X
Xboolean
Xbreakarm(ptr) /* creature will break out of armor */
X register struct permonst *ptr;
X{
X return((bigmonst(ptr) || (ptr->msize > MZ_SMALL && !humanoid(ptr))
X || ptr == &mons[PM_MARILITH]) && !sliparm(ptr));
X /* Marilith is about the only case of a monster which is otherwise
X * humanoid but cannot wear armor (too many arms). Centaurs would
X * be another except that they are already accounted for by
X * bigmonst.
X */
X}
X#endif
X#endif /* OVLB */
X#ifdef OVL1
X
Xboolean
Xsticks(ptr) /* creature sticks other creatures it hits */
X register struct permonst *ptr;
X{
X return(dmgtype(ptr,AD_STCK) || dmgtype(ptr,AD_WRAP) ||
X attacktype(ptr,AT_HUGS));
X}
X
Xboolean
Xdmgtype(ptr, dtyp)
X register struct permonst *ptr;
X register int dtyp;
X{
X int i;
X
X for(i = 0; i < NATTK; i++)
X if(ptr->mattk[i].adtyp == dtyp) return TRUE;
X
X return FALSE;
X}
X
X/* returns the maximum damage a defender can do to the attacker via
X * a passive defense */
Xint
Xmax_passive_dmg(mdef, magr)
X register struct monst *mdef, *magr;
X{
X int i, dmg = 0;
X uchar adtyp;
X
X for(i = 0; i < NATTK; i++)
X if(mdef->data->mattk[i].aatyp == AT_NONE) {
X adtyp = mdef->data->mattk[i].adtyp;
X if((adtyp == AD_ACID && !resists_acid(magr->data)) ||
X (adtyp == AD_COLD && !resists_cold(magr->data)) ||
X (adtyp == AD_FIRE && !resists_fire(magr->data)) ||
X (adtyp == AD_ELEC && !resists_elec(magr->data))) {
X dmg = mdef->data->mattk[i].damn;
X if(!dmg) dmg = mdef->data->mlevel+1;
X dmg *= mdef->data->mattk[i].damd;
X } else dmg = 0;
X
X return dmg;
X }
X return 0;
X}
X
X#endif /* OVL1 */
X#ifdef OVL0
X
Xint
Xmonsndx(ptr) /* return an index into the mons array */
X struct permonst *ptr;
X{
X register int i;
X
X if(ptr == &playermon) return(-1);
X
X i = (int)(ptr - &mons[0]);
X if(i < 0 || i >= NUMMONS) {
X panic("monsndx - could not index monster (%lx)", (long)ptr);
X return FALSE; /* will not get here */
X }
X
X return(i);
X}
X
X#endif /* OVL0 */
X#ifdef OVL1
X
X
Xint
Xname_to_mon(str)
Xchar *str;
X{
X /* Be careful. We must check the entire string in case it was
X * something such as "ettin zombie corpse". The calling routine
X * doesn't know about the "corpse" until the monster name has
X * already been taken off the front, so we have to be able to
X * read the name with extraneous stuff such as "corpse" stuck on
X * the end.
X * This causes a problem for names which prefix other names such
X * as "ettin" on "ettin zombie". In this case we want the _longest_
X * name which exists.
X * This also permits plurals created by adding suffixes such as 's'
X * or 'es'. Other plurals must still be handled explicitly.
X */
X register int i;
X register int mntmp = -1;
X register char *s;
X char buf[BUFSZ];
X int len, slen;
X
X Strcpy(buf, str);
X str = buf;
X if (!strncmp(str, "a ", 2)) str += 2;
X else if (!strncmp(str, "an ", 3)) str += 3;
X
X /* Some irregular plurals */
X if (!strncmpi(str, "incubi", 6)) return PM_INCUBUS;
X if (!strncmpi(str, "succubi", 7)) return PM_SUCCUBUS;
X if (!strncmpi(str, "violet fungi", 12)) return PM_VIOLET_FUNGUS;
X if (!strncmpi(str, "homunculi", 9)) return PM_HOMUNCULUS;
X if (!strncmpi(str, "baluchitheria", 13)) return PM_BALUCHITHERIUM;
X if (!strncmpi(str, "lurkers above", 13)) return PM_LURKER_ABOVE;
X if (!strncmpi(str, "cavemen", 7)) return PM_CAVEMAN;
X if (!strncmpi(str, "cavewomen", 9)) return PM_CAVEWOMAN;
X if (!strncmpi(str, "zruties", 7)) return PM_ZRUTY;
X if (!strncmpi(str, "djinn", 5)) return PM_DJINNI;
X if (!strncmpi(str, "mumakil", 7)) return PM_MUMAK;
X if ((s = strstri(str, "vortices")) != 0)
X Strcpy(s+4, "ex");
X /* be careful with "ies"; "priest", "zombies" */
X else if ((s = strstri(str, "jellies")) != 0 ||
X (s = strstri(str, "mummies")) != 0)
X Strcpy(s+4, "y");
X /* luckily no monster names end in fe or ve with ves plurals */
X else if ((s = strstri(str, "ves")) != 0)
X Strcpy(s, "f");
X
X slen = strlen(str);
X for (len = 0, i = 0; i < NUMMONS; i++) {
X register int m_i_len = strlen(mons[i].mname);
X if (m_i_len > len && !strncmpi(mons[i].mname, str, m_i_len)) {
X if (m_i_len == slen) return i; /* exact match */
X else if (slen > m_i_len &&
X (str[m_i_len] == ' ' ||
X !strcmpi(&str[m_i_len], "s") ||
X !strncmpi(&str[m_i_len], "s ", 2) ||
X !strcmpi(&str[m_i_len], "es") ||
X !strncmpi(&str[m_i_len], "es ", 3))) {
X mntmp = i;
X len = m_i_len;
X }
X }
X }
X if (mntmp == -1) mntmp = title_to_mon(str, (int *)0, (int *)0);
X return mntmp;
X}
X
X#endif /* OVL1 */
X#ifdef OVLB
X
X#ifdef POLYSELF
Xboolean
Xwebmaker(ptr) /* creature can spin a web */
X register struct permonst *ptr;
X{
X return (ptr->mlet == S_SPIDER && ptr != &mons[PM_SCORPION]);
X}
X#endif
X
X#endif /* OVLB */
X#ifdef OVL2
X
X/* returns 3 values (0=male, 1=female, 2=none) */
Xint
Xgender(mtmp)
X register struct monst *mtmp;
X{
X if (is_neuter(mtmp->data)) return 2;
X return mtmp->female;
X}
X
X#endif /* OVL2 */
X#ifdef OVLB
X
Xboolean
Xlevl_follower(mtmp)
Xregister struct monst *mtmp;
X{
X return (mtmp->mtame || (mtmp->data->mflags2 & M2_STALK) || is_fshk(mtmp)
X || (mtmp->iswiz && !mon_has_amulet(mtmp)));
X}
X
Xstruct permonst *
Xplayer_mon()
X{
X switch (pl_character[0]) {
X case 'A': return &mons[PM_ARCHEOLOGIST];
X case 'B': return &mons[PM_BARBARIAN];
X case 'C': if (flags.female) return &mons[PM_CAVEWOMAN];
X else return &mons[PM_CAVEMAN];
X case 'E': return &mons[PM_ELF];
X case 'H': return &mons[PM_HEALER];
X case 'K': return &mons[PM_KNIGHT];
X case 'P': if (flags.female) return &mons[PM_PRIESTESS];
X else return &mons[PM_PRIEST];
X case 'R': return &mons[PM_ROGUE];
X case 'S': return &mons[PM_SAMURAI];
X#ifdef TOURIST
X case 'T': return &mons[PM_TOURIST];
X#endif
X case 'V': return &mons[PM_VALKYRIE];
X case 'W': return &mons[PM_WIZARD];
X default: impossible("what are you?");
X return &mons[PM_HUMAN];
X }
X}
X
Xconst int grownups[][2] = { {PM_LITTLE_DOG, PM_DOG}, {PM_DOG, PM_LARGE_DOG},
X {PM_HELL_HOUND_PUP, PM_HELL_HOUND}, {PM_KITTEN, PM_HOUSECAT},
X {PM_HOUSECAT, PM_LARGE_CAT}, {PM_BABY_GRAY_DRAGON, PM_GRAY_DRAGON},
X {PM_KOBOLD, PM_LARGE_KOBOLD}, {PM_LARGE_KOBOLD, PM_KOBOLD_LORD},
X {PM_GNOME, PM_GNOME_LORD}, {PM_GNOME_LORD, PM_GNOME_KING},
X {PM_DWARF, PM_DWARF_LORD}, {PM_DWARF_LORD, PM_DWARF_KING},
X {PM_SMALL_MIMIC, PM_LARGE_MIMIC}, {PM_LARGE_MIMIC, PM_GIANT_MIMIC},
X {PM_BAT, PM_GIANT_BAT},
X {PM_LICH, PM_DEMILICH}, {PM_DEMILICH, PM_MASTER_LICH},
X {PM_OGRE, PM_OGRE_LORD}, {PM_OGRE_LORD, PM_OGRE_KING},
X {PM_VAMPIRE, PM_VAMPIRE_LORD},
X {PM_BABY_RED_DRAGON, PM_RED_DRAGON},
X {PM_BABY_WHITE_DRAGON, PM_WHITE_DRAGON},
X {PM_BABY_BLUE_DRAGON, PM_BLUE_DRAGON},
X {PM_BABY_GREEN_DRAGON, PM_GREEN_DRAGON},
X {PM_BABY_ORANGE_DRAGON, PM_ORANGE_DRAGON},
X {PM_BABY_BLACK_DRAGON, PM_BLACK_DRAGON},
X {PM_BABY_YELLOW_DRAGON, PM_YELLOW_DRAGON},
X {PM_RED_NAGA_HATCHLING, PM_RED_NAGA},
X {PM_BLACK_NAGA_HATCHLING, PM_BLACK_NAGA},
X {PM_GOLDEN_NAGA_HATCHLING, PM_GOLDEN_NAGA},
X {PM_GUARDIAN_NAGA_HATCHLING, PM_GUARDIAN_NAGA},
X {PM_BABY_PURPLE_WORM, PM_PURPLE_WORM},
X {PM_BABY_LONG_WORM, PM_LONG_WORM},
X#ifdef ARMY
X {PM_SOLDIER, PM_SERGEANT},
X {PM_SERGEANT, PM_LIEUTENANT},
X {PM_LIEUTENANT, PM_CAPTAIN},
X#endif
X {PM_WATCHMAN, PM_WATCH_CAPTAIN},
X {PM_BABY_CROCODILE, PM_CROCODILE},
X {-1,-1}
X};
X
Xint
Xlittle_to_big(montype)
Xint montype;
X{
X#ifndef AIXPS2_BUG
X register int i;
X
X for(i=0; grownups[i][0] >= 0; i++)
X if(montype == grownups[i][0]) return grownups[i][1];
X return montype;
X#else
X/* AIX PS/2 C-compiler 1.1.1 optimizer does not like the above for loop,
X * and causes segmentation faults at runtime. (The problem does not
X * occur if -O is not used.)
X * lehtonen@cs.Helsinki.FI (Tapio Lehtonen) 28031990
X */
X int i;
X int monvalue;
X
X monvalue = montype;
X for(i=0; grownups[i][0] >= 0; i++)
X if(montype == grownups[i][0]) monvalue = grownups[i][1];
X
X return monvalue;
X#endif
X}
X
Xint
Xbig_to_little(montype)
Xint montype;
X{
X register int i;
X
X for(i=0; grownups[i][0] >= 0; i++)
X if(montype == grownups[i][1]) return grownups[i][0];
X return montype;
X}
X
X
Xconst char *
Xlocomotion(ptr, def)
Xconst struct permonst *ptr;
Xconst char *def;
X{
X return (
X is_floater(ptr) ? (const char *)"float" :
X is_flyer(ptr) ? (const char *)"fly" :
X slithy(ptr) ? (const char *)"slither" :
X amorphous(ptr) ? (const char *)"ooze" :
X nolimbs(ptr) ? (const char *)"crawl" :
X def
X );
X
X}
X
X#endif /* OVLB */
X
X/*mondata.c*/
END_OF_FILE
if test 10482 -ne `wc -c <'src/mondata.c'`; then
echo shar: \"'src/mondata.c'\" unpacked with wrong size!
fi
# end of 'src/mondata.c'
fi
if test -f 'sys/mac/macmain.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'sys/mac/macmain.c'\"
else
echo shar: Extracting \"'sys/mac/macmain.c'\" \(12965 characters\)
sed "s/^X//" >'sys/mac/macmain.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)macmain.c 3.1 92/12/04 */
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed. See license for details. */
X
X/* main.c - Mac NetHack */
X
X#include "hack.h"
X
X#include <OSUtils.h>
X#include <files.h>
X#include <Types.h>
X#ifdef MAC_MPW32
X#include <String.h>
X#include <Strings.h>
X#endif
X#ifdef MAC_THINKC5
X#include <pascal.h>
X#endif
X#include <Dialogs.h>
X#include <Packages.h>
X#include <ToolUtils.h>
X#include <Resources.h>
X#include <SysEqu.h>
X#include <Errors.h>
X
X#ifndef O_RDONLY
X#include <fcntl.h>
X#endif
X
Xint NDECL(main);
Xvoid NDECL(ListGUnloads);
X
Xstatic void NDECL(process_options);
Xstatic void NDECL(whoami);
X
Xextern char * PtoCstr ( unsigned char * ) ;
Xextern unsigned char * CtoPstr ( char * ) ;
Xvoid SetFrameItem ( DialogPtr , short , short ) ;
X
Xextern void NDECL ( finder_file_request ) ;
X// void NDECL( askname ) ;
X
Xextern void NDECL ( InitMac ) ;
X
Xint
Xmain ( void )
X{
X register int fd;
X
X windowprocs = mac_procs ;
X InitMac ( ) ;
X
X hname = "Mac Hack" ;
X hackpid = getpid();
X
X initoptions();
X init_nhwindows();
X whoami();
X
X /*
X * It seems you really want to play.
X */
X setrandom();
X u.uhp = 1; /* prevent RIP on early quits */
X
X process_options ( ) ; /* emulate command line options */
X finder_file_request ( ) ;
X
X#ifdef WIZARD
X if (wizard)
X Strcpy(plname, "wizard");
X else
X#endif
X if(!*plname || !strncmp(plname, "player", 4)
X || !strncmp(plname, "games", 4))
X askname();
X plnamesuffix(); /* strip suffix from name; calls askname() */
X /* again if suffix was whole name */
X /* accepts any suffix */
X
X Sprintf ( lock , "%d%s" , getuid ( ) , plname ) ;
X getlock ( ) ;
X
X /*
X * Initialisation of the boundaries of the mazes
X * Both boundaries have to be even.
X */
X
X x_maze_max = COLNO-1;
X if (x_maze_max % 2)
X x_maze_max--;
X y_maze_max = ROWNO-1;
X if (y_maze_max % 2)
X y_maze_max--;
X
X /*
X * Initialize the vision system. This must be before mklev() on a
X * new game or before a level restore on a saved game.
X */
X vision_init();
X
X display_gamewindows();
X
X set_savefile_name();
X uncompress(SAVEF);
X
X if((fd = open_savefile()) >= 0 &&
X /* if not up-to-date, quietly delete file via false condition */
X (uptodate(fd) || delete_savefile())) {
X#ifdef WIZARD
X /* Since wizard is actually flags.debug, restoring might
X * overwrite it.
X */
X boolean remember_wiz_mode = wizard;
X#endif
X#ifdef NEWS
X if(flags.news) display_file(NEWS, FALSE);
X#endif
X pline("Restoring save file...");
X mark_synch(); /* flush output */
X if(!dorecover(fd))
X goto not_recovered;
X#ifdef WIZARD
X if(!wizard && remember_wiz_mode) wizard = TRUE;
X#endif
X pline("Hello %s, welcome back to NetHack!", plname);
X check_special_room(FALSE);
X
X#ifdef EXPLORE_MODE
X if (discover)
X You("are in non-scoring discovery mode.");
X#endif
X#if defined(EXPLORE_MODE) || defined(WIZARD)
X if (discover || wizard) {
X if(yn("Do you want to keep the save file?") == 'n')
X (void) delete_savefile();
X else {
X compress(SAVEF);
X }
X }
X#endif
X flags.move = 0;
X } else {
Xnot_recovered:
X player_selection();
X newgame();
X /* give welcome message before pickup messages */
X pline("Hello %s, welcome to NetHack!", plname);
X#ifdef EXPLORE_MODE
X if (discover)
X You("are in non-scoring discovery mode.");
X#endif
X flags.move = 0;
X set_wear();
X pickup(1);
X }
X
X flags.moonphase = phase_of_the_moon();
X if(flags.moonphase == FULL_MOON) {
X You("are lucky! Full moon tonight.");
X change_luck(1);
X } else if(flags.moonphase == NEW_MOON) {
X pline("Be careful! New moon tonight.");
X }
X if(flags.friday13 = friday_13th()) {
X pline("Watch out! Bad things can happen on Friday the 13th.");
X change_luck(-1);
X }
X
X initrack();
X
X UndimMenuBar ( ) ; /* Yes, this is the place for it (!) */
X
X attemptingto("proceed");
X#if defined(MAC_MPW32) && !defined(MODEL_FAR)
X UnloadAllSegments(); /* Do this before naming residents */
X IsResident( (Ptr) display_nhwindow ); /* Sample resident segments */
X IsResident( (Ptr) rhack );
X IsResident( (Ptr) engr_at );
X IsResident( (Ptr) movemon );
X IsResident( (Ptr) attacktype ) ;
X IsResident( (Ptr) mac_get_nh_event ) ;
X#endif
X moveloop();
X /*NOTREACHED*/
X return 0;
X}
X
X
X/*
X * This filter handles the movable-modal dialog
X *
X */
Xstatic pascal Boolean
XDragFilter ( DialogPtr dp , EventRecord * event , short * item )
X{
X WindowPtr wp ;
X short code ;
X Rect r ;
X
X/*
X * Handle shortcut keys
X * enter, return -> OK
X * clear, escape, period -> Cancel
X * all others are handled default
X *
X */
X
X if ( event -> what == keyDown ) {
X
X char c = event -> message & 0xff ;
X unsigned char b = ( event -> message >> 8 ) & 0xff ;
X
X switch ( c ) {
X
X case 3 : /* 3 == Enter */
X case 10 : /* Newline */
X case 13 : /* Return */
X * item = 1 ;
X return 1 ;
X
X case '.' : /* Cmd-period - we allow only period */
X case 27 : /* Escape */
X * item = 2 ;
X return 1 ;
X }
X
X switch ( b ) {
X
X case 0x4c : /* Enter */
X case 0x24 : /* Return */
X * item = 1 ;
X return 1 ;
X
X case 0x35 : /* Escape */
X case 0x47 : /* Clear */
X * item = 2 ;
X return 1 ;
X }
X
X return 0 ;
X }
X
X/*
X * OK, don't handle others
X *
X */
X
X if ( event -> what != mouseDown ) {
X
X return 0 ;
X }
X code = FindWindow ( event -> where , & wp ) ;
X if ( wp != dp || code != inDrag ) {
X
X return 0 ;
X }
X r = ( * GetGrayRgn ( ) ) -> rgnBBox ;
X InsetRect ( & r , 3 , 3 ) ;
X
X DragWindow ( wp , event -> where , & r ) ;
X SaveWindowPos ( wp ) ;
X
X event -> what = nullEvent ;
X return 1 ;
X}
X
X
X/*
X * plname is filled either by an option (-u Player or -uPlayer) or
X * explicitly (by being the wizard) or by askname.
X * It may still contain a suffix denoting pl_character.
X */
Xvoid
Xmac_askname(void) /* Code taken from getlin */
X{
X ControlHandle ctrl ;
X DialogPtr promptDialog ;
X short itemHit , type ;
X Rect box ;
X Str255 pasStr ;
X
X /*
X ** Set the query line as parameter text.
X */
X
X ParamText ( "\PWho are you?" , "\p" , "\p" , "\p" ) ;
X
X promptDialog = GetNewDialog ( 130 , ( Ptr ) NULL , ( WindowPtr ) -1 ) ;
X ShowWindow ( promptDialog ) ;
X
X InitCursor ( ) ;
X SetFrameItem ( promptDialog , 6 , 1 ) ;
X do {
X
X ModalDialog ( ( ModalFilterProcPtr ) DragFilter , & itemHit ) ;
X
X } while ( ( itemHit != 1 ) && ( itemHit != 2 ) ) ;
X
X if ( itemHit == 1 ) {
X
X /*
X ** Get the text from the text edit item.
X */
X
X GetDItem ( promptDialog , 4 , & type , ( Handle * ) & ctrl , & box ) ;
X GetIText ( ( Handle ) ctrl , pasStr ) ;
X
X /*
X ** Convert it to a 'C' string and copy it into the return value.
X */
X
X PtoCstr ( pasStr ) ;
X strcpy ( plname , ( char * ) pasStr ) ;
X
X /*
X * Special check for debugging here
X *
X */
X#ifdef WIZARD
X if ( ! strcmp ( plname , WIZARD ) ) {
X
X flags . debug = 1 ;
X }
X#endif
X
X } else {
X
X /*
X ** Okay, we didn't want to run
X */
X
X /* * ( short * ) DSErrCode = dsBadLaunch ; */
X ExitToShell ( ) ;
X }
X
X DisposDialog ( promptDialog ) ;
X}
X
X
Xstatic void
Xprocess_options(void)
X{
X int argc = 0 ;
X char * foo [ ] = { "Mac Hack" , NULL } ;
X char * * argv = foo ;
X /*
X * Process options.
X */
X while(argc > 1 && argv[1][0] == '-'){
X argv++;
X argc--;
X switch(argv[0][1]){
X#if defined(WIZARD) || defined(EXPLORE_MODE)
X# ifndef EXPLORE_MODE
X case 'X':
X# endif
X case 'D':
X# ifdef WIZARD
X wizard = TRUE ;
X break ;
X# endif
X# ifdef EXPLORE_MODE
X case 'X':
X discover = TRUE;
X# endif
X break;
X#endif
X#ifdef NEWS
X case 'n':
X flags.news = FALSE;
X break;
X#endif
X case 'u':
X if(argv[0][2])
X (void) strncpy(plname, argv[0]+2, sizeof(plname)-1);
X else if(argc > 1) {
X argc--;
X argv++;
X (void) strncpy(plname, argv[0], sizeof(plname)-1);
X } else
X raw_print("Player name expected after -u");
X break;
X case 'I':
X case 'i':
X if (!strncmpi(argv[0]+1, "IBM", 3))
X switch_graphics(IBM_GRAPHICS);
X break;
X /* case 'D': */
X case 'd':
X if (!strncmpi(argv[0]+1, "DEC", 3))
X switch_graphics(DEC_GRAPHICS);
X break;
X default:
X /* allow -T for Tourist, etc. */
X (void) strncpy(pl_character, argv[0]+1,
X sizeof(pl_character)-1);
X
X /* raw_print("Unknown option: %s", *argv); */
X }
X }
X}
X
X
Xstatic void
Xwhoami ( void )
X{
X /*TODO*/
X donull ( ) ;
X}
X
X
X/*------------------- UnloadAllSegments and support stuff --------------------------*/
X/* Derived from MacApp source */
X
Xtypedef Handle **HandleListHandle;
Xtypedef Boolean **BoolListHandle;
Xtypedef short *ShortPtr, **ShortHandle;
X
Xshort FDECL(GetSegNumber,(ShortPtr));
Xvoid FDECL(InitSegMgmt,(void *));
Xpascal long NDECL(GetA5);
Xpascal short NDECL(GetCurJTOffset);
Xvoid NDECL(UnloadAllSegments);
Xvoid FDECL(IsResident,(void *));
Xvoid FDECL(NotResident, (void *));
X
Xshort pMaxSegNum = 0, /* Highest segment number */
X gCodeRefNum; /* rsrc refnum of the application */
XHandleListHandle gCodeSegs; /* List of code seg handles */
XBoolListHandle gIsResidentSeg; /* Resident flags */
X
X#define kLoaded 0x4EF9 /* if loaded then a JMP instruction */
X#define kUnLoaded 0x3F3C /* if unloaded then a LoadSeg trap */
X /* Note: probably incorrect for -model far! */
X
X/* #define TRACKSEGS /* Utility to print a trace of segment load frequencies. Add
X a call to ListGUnloads into terminate() in end.c to use it */
X
X#ifdef TRACKSEGS
X
Xlong gUnloads[120];
Xchar gSegNames[120][16];
X
Xvoid ListGUnloads(void)
X{
X int i;
X FILE *f;
X
X f = fopen("unloads","r+");
X fprintf(f,"%d calls to UnloadAllSegments\n\n",gUnloads[0]);
X for (i=1; i<=pMaxSegNum; i++) {
X fprintf(f,"Unloaded %10s, segment %2d, %6d times\n",gSegNames[i],i,gUnloads[i]);
X }
X fclose(f);
X}
X
X#endif
X
Xshort GetSegNumber(ShortPtr aProc)
X/* Derives seg number from a procedure ptr */
X
X{
X if (*aProc == kLoaded) /* loaded segment */
X return(*--aProc);
X else if (*aProc == kUnLoaded) /* unloaded segment */
X return(*++aProc);
X else {
X progerror("GetSegNumber was not passed an jump table address");
X return(1);
X }
X}
X
Xvoid InitSegMgmt(void * mainSeg)
X/* Initialise a list of handles to all the CODE segments and mark the mainseg as resident */
X{
X short i,
X lastRsrc,
X rsrcID,
X oldResFile;
X Handle seg;
X ResType rsrcType;
X Str255 rsrcName;
X
X gCodeRefNum = HomeResFile(GetResource('CODE', 1));
X oldResFile = CurResFile();
X UseResFile(gCodeRefNum);
X
X /* Discover the highest CODE rsrc ID: be ready for noncontiguous IDs */
X lastRsrc = Count1Resources('CODE');
X SetResLoad(false);
X for (i=1; i<=lastRsrc; i++)
X if (seg = Get1IndResource('CODE', i)) {
X GetResInfo(seg, &rsrcID, &rsrcType, rsrcName);
X if (rsrcID > pMaxSegNum) pMaxSegNum = rsrcID;
X }
X
X /* Make handles of appropriate size to keep flags/segment handles */
X SetResLoad(true); /* In case we fail */
X gCodeSegs = (HandleListHandle) NewHandle((pMaxSegNum+1) * sizeof(Handle));
X mustwork(MemError());
X gIsResidentSeg = (BoolListHandle) NewHandle((pMaxSegNum+1) * sizeof(Boolean));
X mustwork(MemError());
X SetResLoad(false);
X
X #ifdef TRACKSEGS
X gUnloads[0]=0;
X #endif
X for (i=1; i<=pMaxSegNum; i++) {
X (*gIsResidentSeg)[i] = false;
X (*gCodeSegs)[i] = Get1Resource('CODE',i); /* Will be NIL if it doesn't exist */
X #ifdef TRACKSEGS
X { /* Go get the segment name and save it */
X short id;
X ResType rType;
X Str255 name;
X char *cptr;
X
X GetResInfo((*gCodeSegs)[i],&id,&rType,&name);
X if (name[0]>15) name[0]=15;
X cptr = p2cstr(&name);
X cptr = strcpy(&gSegNames[i], &name);
X gUnloads[i] = 0;
X }
X #endif
X }
X SetResLoad(true);
X (*gIsResidentSeg)[GetSegNumber((ShortPtr)mainSeg)] = true;
X UseResFile(oldResFile);
X}
X
X#ifdef MAC_MPW32
Xpascal long GetA5(void) = { 0x2E8D }; /* MOVE.L A5,(A7) */
Xpascal short GetCurJTOffset(void) = { 0x3EB8, 0x934 }; /* MOVE.W CurJTOffset,(SP) */
X#endif
X#ifdef MAC_THINKC5
Xpascal long GetA5(void) = { 0x2E8D }; /* MOVE.L A5,(A7) */
Xpascal short GetCurJTOffset(void) = { 0x3EB8, 0x934 }; /* MOVE.W CurJTOffset,(SP) */
X#endif
X
Xvoid UnloadAllSegments(void)
X{
X short i,
X oldResFile;
X Handle seg;
X long jumpTablePtr;
X
X jumpTablePtr = GetA5() + GetCurJTOffset();
X oldResFile = CurResFile();
X UseResFile(gCodeRefNum);
X#ifdef TRACKSEGS
X gUnloads[0]++;
X#endif
X for (i=1; i<=pMaxSegNum; i++)
X if (!(*gIsResidentSeg)[i]) {
X seg = (*gCodeSegs)[i];
X if ((seg != (Handle) nil) && (*seg != (Ptr) nil)) /* Check it exists and hasn't been purged */
X if (HGetState(seg) & 0x80) { /* Is it locked? => loaded */
X#ifdef TRACKSEGS
X gUnloads[i]++;
X#endif
X UnloadSeg( (void *) (jumpTablePtr + **(ShortHandle)seg + 2) );
X }
X }
X
X UseResFile(oldResFile);
X}
X
Xvoid IsResident( void * routineaddr )
X/* We want to move this high up in the heap as it won't be shifted again, so... */
X{
X int segnum;
X Handle theseg;
X
X segnum = GetSegNumber((ShortPtr)routineaddr);
X theseg = (*gCodeSegs)[segnum];
X UnloadSeg( routineaddr );
X if (*theseg != nil) {
X MoveHHi( theseg ); /* If it has been purged we can't do this */
X HLock( theseg );
X }
X (*gIsResidentSeg)[segnum] = true;
X}
X
Xvoid NotResident( void * routineaddr )
X{
X (*gIsResidentSeg)[GetSegNumber((ShortPtr)routineaddr)] = false;
X}
X
X/*macmain.c*/
END_OF_FILE
if test 12965 -ne `wc -c <'sys/mac/macmain.c'`; then
echo shar: \"'sys/mac/macmain.c'\" unpacked with wrong size!
fi
# end of 'sys/mac/macmain.c'
fi
if test -f 'sys/share/termcap' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'sys/share/termcap'\"
else
echo shar: Extracting \"'sys/share/termcap'\" \(5404 characters\)
sed "s/^X//" >'sys/share/termcap' <<'END_OF_FILE'
X#
X# MS/PC-DOS ANSI.SYS termcap
X#
Xansi|color|ansi-color|ibm|ibmpc|ANSI.SYS color:\
X :co#80:li#24:bs:pt:bl=^G:le=^H:do=^J:\
X :cl=\E[H\E[2J:ce=\E[K:\
X :ho=\E[H:cm=\E[%i%d;%dH:\
X :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\
X :ti=\E[0;44m:te=\E[0m:\
X :so=\E[1;35;44m:se=\E[0;44m:\
X :us=\E[1;31;44m:ue=\E[0;44m:\
X :mb=\E[5m:md=\E[1m:me=\E[0;44m:
Xmono|ansi-mono|ANSI.SYS:\
X :co#80:li#24:bs:pt:bl=^G:le=^H:do=^J:\
X :cl=\E[H\E[2J:ce=\E[K:\
X :ho=\E[H:cm=\E[%i%d;%dH:\
X :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\
X :so=\E[1m:se=\E[m:us=\E[4m:ue=\E[m:\
X :mb=\E[5m:md=\E[1m:me=\E[m:
X#
X# This is a termcap for NNANSI.SYS (New & Improved NANSI.SYS),
X# a faster and more complete public domain replacement for
X# ANSI.SYS, and two other ANSI.SYS replacements, NANSI.SYS and
X# ZANSI.SYS.
X#
X# NANSI and ZANSI support line insert (al) and delete (dl)
X# and character insert (ic) and delete (dc) where ANSI.SYS
X# does not. NNANSI.SYS also supports clear to end of display
X# (cd), does reverse video (mr) properly, and emulates SGR
X# more fully, allowing correct end sequences for standout (se)
X# and end of underline (ue).
X#
Xnnansi-mono|NNANSI.SYS:\
X :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\
X :cl=\E[2J:cd=\E[J:ce=\E[K:\
X :ho=\E[H:cm=\E[%i%d;%dH:\
X :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\
X :so=\E[1m:se=\E[2m:\
X :us=\E[4m:ue=\E[24m:\
X :mb=\E[5m:md=\E[1m:mh=\E[2m:mr=\E[7m:me=\E[m:\
X :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P:
Xnnansi|NNANSI.SYS color:\
X :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\
X :cl=\E[2J:cd=\E[J:ce=\E[K:\
X :ho=\E[H:cm=\E[%i%d;%dH:\
X :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\
X :ti=\E[0;44m:te=\E[0m:\
X :so=\E[1;35;44m:se=\E[2;37m:\
X :us=\E[4m:ue=\E[24m:\
X :mb=\E[5m:md=\E[1m:mh=\E[2m:mr=\E[7m:me=\E[0;44m:\
X :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P:
Xnansi-mono|zansi-mono|N/ZANSI.SYS:\
X :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\
X :cl=\E[2J:ce=\E[K:\
X :ho=\E[H:cm=\E[%i%d;%dH:\
X :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\
X :ti=\E[0m:te=\E[0m:\
X :so=\E[1;35m:se=\E[0m:\
X :us=\E[1;31m:ue=\E[0m:\
X :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[m:\
X :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P:
Xnansi|zansi|N/ZANSI.SYS color:\
X :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\
X :cl=\E[2J:ce=\E[K:\
X :ho=\E[H:cm=\E[%i%d;%dH:\
X :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\
X :ti=\E[0;44m:te=\E[0m:\
X :so=\E[1;35;44m:se=\E[0;44m:\
X :us=\E[1;31;44m:ue=\E[0;44m:\
X :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[0;44m:\
X :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P:
X#
X# For ST NetHack:
X# for VT100/200/&c in VT52 mode, add :ti=\E[?2l:
Xvt52|atari|DEC VT52:\
X :co#80:li#24:bs:pt:bl=^G:le=^H:do=^J:\
X :cl=\EH\EJ:ce=\EK:cd=\EJ:\
X :ho=\EH:cm=\EY%+ %+ :\
X :up=\EA:do=\EB:le=\EC:ri=\ED:nd=\EC:\
X :ku=\EA:kd=\EB:kl=\EC:kr=\ED:kb=^H:\
X :sr=\EI:as=\EF:ae=\EG:
X#
X# For Amiga or VMS NetHack:
X# VT100 or clone without the advanced video option installed
Xvt100|amiga|vt100-80|vt100-noavo|DEC VT100:\
X :co#80:li#24:bs:pt:am:mi:bl=^G:le=^H:do=^J:xo:vt#3:\
X :cl=50\E[H\E[J:ce=3\E[K:cd=50\E[J:\
X :ho=\E[H:cm=5\E[%i%d;%dH:cs=\E[%i%d;%dr:\
X :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\
X :UP=\E[%dA:DO=\E[%dB:LE=\E[%dC:RI=\E[%dD:\
X :so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\
X :mb=2\E[5m:md=2\E[1m:mr=2\E[7m:me=2\E[m:\
X :ti=4\E<\E(B\E)0:as=^N:ae=^O:\
X :ks=\E[?1h\E=:ke=\E[?1l\E>:ku=\E[A:kd=\E[B:kl=\E[C:kr=\E[D:kb=^H:\
X :kn#4:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
X :sc=\E7:ec=\E8:sr=5\EM:
X#
X# VT102 and up:
X# includes VT100 with advanced video option
Xvt102|vt102-80|vt100-avo|DEC VT102:\
X :im=\E[4h:ei=\E[4l:al=5\E[L:dl=5\E[M:dc=5\E[P:\
X :AL=9\E[%dL:DL=9\E[%dM:tc=vt100:
Xvt200|vt200-80|vt220|vt240|vt241|VT200_Series:\
X :ic=5\E[@:tc=vt102:
Xvt300|vt300-80|vt320|vt330|vt340|VT300_Series:\
X :tc=vt200:
Xvt400|vt400-80|vt420|VT400_Series:\
X :tc=vt300:
X# VAXstations (should have full entries with no delays and 8-bit CSI's)
XVWS|UIS:tc=vt200:
XDECterm:tc=vt300:
X#
X# Wide screen (magnifying glass not included;-)
X# note: vt100 w/o AVO only supports 14 lines when in 132-column mode
Xvt132|vt100-132:vt102-132:\
X :co#132:ti=9\E<\E(B\E)0\E[?3h:tc=vt102:
Xvt200-132|vt300-132:\
X :co#132:ti=9\E<\E(B\E)0\E[?3h:tc=vt200:
X#
X#
X# For really complete ANSI emulations (FANSI-CONSOLE?):
X#
XAX|ANSI X3.64|full ANSI X3.64 (1977) standard:\
X :co#80:li#24:bs:pt:am:mi:bl=^G:le=^H:\
X :cl=\E[2J:ce=\E[K:cd=\E[J:\
X :ho=\E[H:cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:\
X :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\
X :UP=\E[%dA:DO=\E[%dB:LE=\E[%dC:RI=\E[%dD:\
X :so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\
X :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[m:as=^N:ae=^O:\
X :ku=\E[A:kd=\E[B:kl=\E[C:kr=\E[D:kb=^H:\
X :kn#4:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
X :im=\E[4h:ei=\E[4l:al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P:sf=\ED:sr=\EM:
X#
X# Display hacker's tool
X#
Xdebug|debugging entry:\
X :ae=<ae>:AL=<AL%d>:al=<al>:am:as=<as>:bl=<bl>:bs:bt=<bt>:bw:CC=<CC>:\
X :cd=<cd>:ce=<ce>:ch=<ch%d>:cl=<cl>:cm=<cm%d,%d>:co#80:cr=<cr>:\
X :cs=<cs%d,%d>:ct=<ct>:cv=<cv%d>:da:db:DC=<DC%d>:dc=<dc>:DL=<DL%d>:\
X :dl=<dl>:dm=<dm>:DO=<DO%d>:do=<do>:ds=<ds>:ec=<ec%d>:ed=<ed>:ei=<ei>:\
X :es:fs=<fs>:ho=<ho>:hs:IC=<IC%d>:ic=<ic>:im=<im>:ip=<ip>:is=<is>:\
X :it#8:ke=<ke>:LE=<LE%d>:le=<le>:li#24:ll=<ll>:mb=<mb>:md=<md>:me=<me>:\
X :mh=<mh>:mi:mk=<mk>:mm=<mm>:mo=<mo>:mp=<mp>:mr=<mr>:ms=<ms>:nd=<nd>:\
X :nw=<nw>:pc=<pc>:pf=<pf>:pO=<pO%d>:po=<po>:ps=<ps>:rc=<rc>:RI=<RI%d>:\
X :rp=<rp%.%d>:rs=<rs>:sc=<sc>:se=<se>:SF=<SF%d>:sf=<sf>:so=<so>:\
X :SR=<SR%d>:sr=<sr>:st=<st>:ta=<ta>:te=<te>:ti=<ti>:uc=<uc>:ue=<ue>:\
X :UP=<UP%d>:up=<up>:us=<us>:vb=<vb>:ve=<ve>:vi=<vi>:vs=<vs>:
X#
Xdumb:\
X :am:bl=^G:co#80:do=^J:nl=^M^J:
END_OF_FILE
if test 5404 -ne `wc -c <'sys/share/termcap'`; then
echo shar: \"'sys/share/termcap'\" unpacked with wrong size!
fi
# end of 'sys/share/termcap'
fi
echo shar: End of archive 90 \(of 108\).
cp /dev/null ark90isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
101 102 103 104 105 106 107 108 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 108 archives.
echo "Now execute 'rebuild.sh'"
rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0