billr@saab.CNA.TEK.COM (Bill Randle) (06/06/90)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 10, Issue 40
Archive-name: NetHack3/Patch8v
Patch-To: NetHack3: Volume 7, Issue 56-93
#! /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 22 (of 24)."
# Contents: mac/MacAlert.c others/Makefile.ovl vms/vmsbuild.com
# Wrapped by billr@saab on Mon Jun 4 15:40:33 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
echo shar: Extracting \"'mac/MacAlert.c'\" \(24474 characters\)
sed "s/^X//" >'mac/MacAlert.c' <<'END_OF_FILE'
X/* SCCS Id: @(#)MacAlert.c 3.0 90/01/06
X/* Copyright (c) Jon Watte 1989 */
X/* NetHack may be freely redistributed. See license for details. */
X
X#include "hack.h" /* */
X
X/* UseMacAlert is like UseMacAlertText, but without the text parameter.
X This is so you can simply say "UseMacAlert(CAUTION)" or similar, if
X you use predefined alert numbers.
X*/
X
X
Xextern WindowPtr HackWindow;
X
X
Xint
XUseMacAlert(MAno)
Xint MAno;
X{
X return UseMacAlertText(MAno, 0L);
X}
X
X
X/* UseMacAlertText fetches a record in a resource of type MAlt, and uses
X this as a template calling MacAlert. This is so you can have ready-
X made resources, like ALRT templates, for your MacAlerts, which makes
X it easier to customize the program, and to translate it. It also
X makes for clearer code...
X
X If the txt argument is NULL, the text from the template is used,
X otherwise the sypplied text is used.
X*/
Xint
XUseMacAlertText(MAno, txt)
Xint MAno;
Xchar * txt;
X{
X MAlrtHandle foo;
X MAlrtPtr bar;
X int item;
X
X SetResLoad(1);
X foo = (MAlrtHandle) GetResource(MAtype, MAno);
X if(foo) {
X MoveHHi(foo);
X HLock(foo);
X bar = *foo;
X item = MacAlert(bar->width, bar->height, bar->PICTno,
X txt != 0L ? txt : bar->text, bar->but1, bar->but2, bar->but3,
X bar->but4, bar->def, bar->esc);
X } else {
X if(!flags.silent) SysBeep(20);
X item = -1;
X }
X
X ReleaseResource(foo);
X DisposHandle(foo);
X return item;
X}
X
X
X/* This is the MacAlert function. It creates a new window, frames it
X (like a modal dialog) and tries to position the various buttons,
X text and picture in a reasonable way. The arguments are:
X
X width : width of the window. If less than a constant, it defaults
X to that constant.
X height: see width.
X PICTno: Resource ID of a PICT to display. If 0, no PICT is displayed.
X text : the C string containing the relevant text to be displayed.
X but1 -: These are the button texts. Empty strings (they point at 0)
X - but4: makes that button go away. If all are empty, the default OK
X button text is used.
X def : This is which button is default, starting button # 1.
X esc : This is the button that corresponds to the ESC key.
X
X The function returns the button hit, or maybe -1 on error.
X*/
Xint
XMacAlert(width, height, PICTno, text, but1, but2, but3, but4, def, esc)
Xint width, height, PICTno;
Xchar * text,* but1, * but2, * but3, * but4;
Xint def, esc;
X{
X PicHandle thePICT;
X char border[8];
X EventRecord theEvent;
X GrafPtr savedPort;
X WindowPtr theWindow, tmpWind;
X Rect bounds, textBox, brect[4];
X char hilite[4], * but[4], s1[2], s2[2];
X int nobutts, x, pool, spacing, heig, bwid[4],
X item, c, ret;
X long finalTicks;
X
X memset(hilite, sizeof(hilite), 0);
X memset(bwid, sizeof(bwid), 0);
X SetCursor(&arrow);
X def--;
X esc--;
X GetPort(&savedPort);
X
X if(PICTno)
X thePICT = (PicHandle) GetResource('PICT', PICTno);
X else
X thePICT = 0;
X if(thePICT) DetachResource(thePICT);
X bounds = (MAINGRAFPORT)->portRect;
X
X but[0] = but1;
X but[1] = but2;
X but[2] = but3;
X but[3] = but4;
X
X if(width > bounds.right) width = bounds.right;
X if(width < MIN_WIDTH) width = MIN_WIDTH;
X if(height > bounds.bottom) height = bounds.bottom;
X if(height < MIN_HEIGHT) height = MIN_HEIGHT;
X
X InsetRect(&bounds, (int) ((bounds.right - width) >> 1), (int)
X ((bounds.bottom - height) >> 1));
X theWindow = NewWindow(0L, &bounds, "", 1, plainDBox, 0L, 0, 0L);
X ShowWindow(theWindow);
X SelectWindow(theWindow);
X SetPort(theWindow);
X OffsetRect(&bounds, - bounds.left, - bounds.top);
X
X nobutts = 0;
X if(but1[0]) nobutts=1;
X if(but2[0]) nobutts=2;
X if(but3[0]) nobutts=3;
X if(but4[0]) nobutts=4;
X
X if(!nobutts) {
X but[0] = "OK";
X nobutts++;
X }
X
X spacing = 0;
X for(x=0 ; x < nobutts; x++) {
X bwid[x] = TextWidth(but[x], 0, strlen(but[x])) + 2 * BUT_MARGIN;
X spacing += bwid[x] + BUT_SPACING;
X }
X
X pool = bounds.right - 2 * BUT_MARGIN;
X
X heig = 1;
X while(spacing / heig > pool - (nobutts - 1) * BUT_SPACING) {
X heig++;
X }
X
X for(x=0; x<nobutts; x++) {
X bwid[x] = (int) ((float) bwid[x] / spacing * pool);
X }
X
X pool = BUT_MARGIN + BUT_SPACING;
X heig = bounds.bottom - BUT_MARGIN - BUT_SPACING - BUT_HEIGHT * heig;
X for(x=0; x<nobutts; x++) {
X SetRect(&(brect[x]), pool, heig, pool + bwid[x], bounds.bottom -
X BUT_SPACING - BUT_MARGIN);
X pool += bwid[x] + BUT_SPACING;
X hilite[x] = 0;
X }
X
X InsetRect(&bounds, 2, 2);
X textBox = bounds;
X if(thePICT) {
X textBox.left += (*thePICT)->picFrame.right;
X }
X textBox.left += 8;
X textBox.right -= 8;
X textBox.top += 8;
X textBox.bottom = heig - BUT_MARGIN;
X if(textBox.bottom < textBox.top + 15) {
X textBox.bottom = bounds.bottom - 8;
X }
X
X goto mainLoop;
X
XdrawWindow:
X SetPort(theWindow);
X EraseRect(&(theWindow->portRect));
X PenNormal();
X PenSize(BORDER_WIDTH, BORDER_WIDTH);
X GetIndPattern((void *) border, 0, BORDER_PAT);
X PenPat(border);
X FrameRect(&bounds);
X
X PenNormal();
X
X if(thePICT) {
X HLock(thePICT);
X DrawPicture(thePICT, &((*thePICT)->picFrame));
X HUnlock(thePICT);
X }
X
X PenNormal();
X TextFont(0);
X TextSize(12);
X TextBox(text, strlen(text), &textBox, teJustLeft);
X
X for(x=0; x<nobutts; x++) {
X EraseRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X FrameRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X InsetRect(&(brect[x]), BUT_MARGIN, 3);
X TextBox(but[x], strlen(but[x]), &(brect[x]), teJustCenter);
X InsetRect(&(brect[x]), - BUT_MARGIN, - 3);
X if(hilite[x]) {
X InvertRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X }
X if(x == def) {
X PenSize(FRAME_WIDTH, FRAME_WIDTH);
X InsetRect(&(brect[x]), - FRAME_WIDTH - FRAME_OFFSET,
X - FRAME_WIDTH - FRAME_OFFSET);
X FrameRoundRect(&(brect[x]), FRAME_CORNER, FRAME_CORNER);
X InsetRect(&(brect[x]), FRAME_WIDTH + FRAME_OFFSET,
X FRAME_WIDTH + FRAME_OFFSET);
X PenNormal();
X }
X }
X
XmainLoop:
X while(1) {
X if(WaitNextEvent(-1, &theEvent, 10L, 0L)) {
X switch(theEvent.what) {
X
X case updateEvt :
X BeginUpdate((WindowPtr) theEvent.message);
X EndUpdate((WindowPtr) theEvent.message);
X goto drawWindow;
X
X case mouseDown :
X if (FindWindow(theEvent.where, &tmpWind) < inContent ||
X tmpWind != theWindow) {
X if(!flags.silent) SysBeep(20);
X item = -1;
X } else {
X item = TrackThem(brect, hilite, nobutts);
X }
X if(item >= 0) {
X Delay(FLASH_TIME, &finalTicks);
X InvertRoundRect(&(brect[item]), BUT_CORNER, BUT_CORNER);
X ret = item + 1;
X goto getout;
X }
X break;
X
X case keyDown :
X c = theEvent.message & 0xFF;
X if((c == 13) || (c == 3)) {
X if(def >= 0) {
X InvertRoundRect(&(brect[def]), BUT_CORNER, BUT_CORNER);
X Delay(FLASH_TIME, &finalTicks);
X InvertRoundRect(&(brect[def]), BUT_CORNER, BUT_CORNER);
X ret = def + 1;
X goto getout;
X }
X }
X if(c == 27) {
X if(esc >= 0) {
X InvertRoundRect(&(brect[esc]), BUT_CORNER, BUT_CORNER);
X Delay(FLASH_TIME, &finalTicks);
X InvertRoundRect(&(brect[esc]), BUT_CORNER, BUT_CORNER);
X ret = esc + 1;
X goto getout;
X }
X }
X for(x=0; x<nobutts; x++) {
X s1[0] = 1;
X s1[1] = c;
X s2[0] = 1;
X s2[1] = but[x][0];
X UprString(s1, 1);
X UprString(s2, 1);
X if(s1[1] == s2[1]) {
X InvertRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X Delay(FLASH_TIME, &finalTicks);
X InvertRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X ret = x + 1;
X goto getout;
X }
X }
X
X PenSize(FRAME_WIDTH, FRAME_WIDTH);
X InsetRect(&(brect[def]), - FRAME_WIDTH - FRAME_OFFSET,
X - FRAME_WIDTH - FRAME_OFFSET);
X PenMode(patXor);
X FrameRoundRect(&(brect[def]), FRAME_CORNER, FRAME_CORNER);
X InsetRect(&(brect[def]), FRAME_WIDTH + FRAME_OFFSET,
X FRAME_WIDTH + FRAME_OFFSET);
X PenNormal();
X
X def++;
X def %= nobutts;
X
X PenSize(FRAME_WIDTH, FRAME_WIDTH);
X InsetRect(&(brect[def]), - FRAME_WIDTH - FRAME_OFFSET,
X - FRAME_WIDTH - FRAME_OFFSET);
X FrameRoundRect(&(brect[def]), FRAME_CORNER, FRAME_CORNER);
X InsetRect(&(brect[def]), FRAME_WIDTH + FRAME_OFFSET,
X FRAME_WIDTH + FRAME_OFFSET);
X PenNormal();
X
X break;
X
X default:
X ;
X }
X }
X }
X
Xgetout:
X DisposeWindow(theWindow);
X if(thePICT) DisposHandle(thePICT);
X SetPort(savedPort);
X
X return ret;
X}
X
X
X/* TrackThem is a help function to MacAlert, it tracks buttons,
X returns the button number (0 - (no_butts-1)) or -1 if no button
X was hit. */
Xint
XTrackThem(b_rect, hi_lite, no_butts)
XRect * b_rect;
Xchar * hi_lite;
Xint no_butts;
X{
XPoint p;
Xint x, i;
X
X while(Button()) {
X SystemTask();
X GetMouse(&p);
X for(x=0; x<no_butts; x++) {
X if(PtInRect(p, &(b_rect[x]))) {
X if(!hi_lite[x]) {
X hi_lite[x] = 1;
X InvertRoundRect(&(b_rect[x]), BUT_CORNER, BUT_CORNER);
X }
X } else {
X if(hi_lite[x]) {
X hi_lite[x] = 0;
X InvertRoundRect(&(b_rect[x]), BUT_CORNER, BUT_CORNER);
X }
X }
X }
X }
X
X i = -1;
X for(x=0; x<no_butts; x++) {
X if(hi_lite[x]) i=x;
X }
X
X return i;
X}
X
X
X/* #defines for the mini-pager */
X
X#define SLACK 400 /* How much extra is taken per chunk ? */
X#define TAB_SIZE 8 /* How large tabs ? */
X
X#define X_POS 8 /* Window init pos */
X#define Y_POS 64
X#define X_SIZE 80 /* Window size */
X#define Y_SIZE 24
X#define X_BORDER 20 /* Extra space besides text */
X#define Y_BORDER 4
X#define TOP_MARGIN 2 /* Offset of text from border */
X#define LEFT_MARGIN 2
X#define MAX_LINE_LEN 128
X
X#include <ControlMgr.h>
X
Xtypedef struct select {
X long start;
X long end;
X long startline;
X long endline;
X} SELECTION;
X
Xextern WindowPtr HackWindow;
X
Xstatic WindowPtr PagerWindow;
Xstatic width, height;
Xstatic Handle theData;
Xstatic long length, textPos;
Xstatic Rect text_area;
Xstatic Rect windowSize;
Xstatic int inited;
Xstatic ControlHandle theScrollBar;
Xstatic int scrollMax = 0, scrollPt = 0;
Xstatic long ** lineStarts;
Xstatic long noRs;
Xstatic MenuHandle editMenuH;
Xstatic SELECTION theSelect, oldSelect;
X
Xint DoMenu(long selection);
Xvoid DoScroll(long amount);
X
X
X/* The mini-pager */
X
X
Xlong
XLineLength(long from, long lines)
X{
Xlong ndx;
X if(lines + from > noRs) ndx = noRs;
X else ndx = lines + from;
X return (*lineStarts)[ndx] - (*lineStarts)[from];
X}
X
X
Xlong
XWhatOffset(Point p, long * line)
X{
Xint x, y;
Xlong l, ndx;
X
X x = (p.h - LEFT_MARGIN) / width;
X if(x < 0) x = 0;
X y = (p.v - TOP_MARGIN) / height;
X if(y < 0) {
X y = 0;
X DoScroll(-1);
X } else if(y >= Y_SIZE) {
X y = Y_SIZE;
X DoScroll(1);
X }
X l = y + scrollPt > noRs-1 ? noRs-1 : y + scrollPt;
X ndx = x + (*lineStarts)[l];
X if(l == noRs) ndx = length;
X else if(ndx > (*lineStarts)[l+1]) ndx = (*lineStarts)[l+1];
X
X * line = l;
X return ndx;
X}
X
X
Xvoid
XInvertRange(SELECTION * s, Rect * cr)
X{
Xlong sc = s->start;
Xlong ec = s->end;
Xlong sl = s->startline;
Xlong el = s->endline;
Xint sx, ex;
XRect r;
X
X#define HilitePtr (void *) 0x938
X
X if(sc > ec) {
X long t = sc;
X sc = ec;
X ec = t;
X t = sl;
X sl = el;
X el = t;
X }
X
X sx = sc - (*lineStarts)[sl];
X ex = ec - (*lineStarts)[el];
X sl -= scrollPt;
X el -= scrollPt;
X r = text_area;
X ClipRect(cr ? cr : &r);
X if(el == sl) {
X SetRect(&r, sx * width, sl * height, ex * width, (el + 1) * height);
X OffsetRect(&r, LEFT_MARGIN, TOP_MARGIN);
X BitClr(HilitePtr, pHiliteBit);
X InvertRect(&r);
X } else {
X SetRect(&r, sx * width, sl * height, X_SIZE * width, (sl + 1) * height);
X OffsetRect(&r, LEFT_MARGIN, TOP_MARGIN);
X BitClr(HilitePtr, pHiliteBit);
X InvertRect(&r);
X SetRect(&r, 0, el * height, ex * width, (el + 1) * height);
X OffsetRect(&r, LEFT_MARGIN, TOP_MARGIN);
X BitClr(HilitePtr, pHiliteBit);
X InvertRect(&r);
X SetRect(&r, 0, (sl + 1) * height, X_SIZE * width, el * height);
X OffsetRect(&r, LEFT_MARGIN, TOP_MARGIN);
X BitClr(HilitePtr, pHiliteBit);
X InvertRect(&r);
X }
X SetRect(&r, 0, 0, 20000, 20000);
X ClipRect(&r);
X}
X
X
Xvoid
XDoDraw(EventRecord * theEvent, term_info * t)
X{
X BeginUpdate((WindowPtr) theEvent->message);
X if(StripAddress(theEvent->message) == StripAddress(HackWindow)) {
X SetPort(HackWindow);
X docrt();
X } else if(StripAddress(theEvent->message) == StripAddress(PagerWindow)) {
X MoveHHi(theData);
X HLock(theData);
X MoveHHi(lineStarts);
X DrawControls(PagerWindow);
X TextBox(&((*theData)[(*lineStarts)[textPos]]), LineLength(textPos,
X Y_SIZE), &text_area, teJustLeft);
X HUnlock(theData);
X InvertRange(&theSelect, 0L);
X }
X EndUpdate((WindowPtr) theEvent->message);
X}
X
X
Xvoid
XDoScroll(long amount)
X{
Xint ab = amount > 0 ? amount : - amount;
X
X if(textPos == 0 && amount < 0) return;
X if(textPos == scrollMax && amount > 0) return;
X
X textPos += amount;
X if(textPos < 0) {
X amount -= textPos;
X textPos = 0;
X }
X if(textPos > scrollMax) {
X amount -= textPos - scrollMax;
X textPos = scrollMax;
X }
X scrollPt = textPos;
X
X if(ab > Y_SIZE - 1) {
X HLock(theData);
X TextBox(&((*theData)[(*lineStarts)[textPos]]), LineLength(textPos,
X ab), &text_area, teJustLeft);
X HUnlock(theData);
X InvertRange(&theSelect, (Rect *) 0L);
X } else {
X Rect r;
X RgnHandle rgn = NewRgn();
X r = text_area;
X ScrollRect(&text_area, 0, - amount * height, rgn);
X DisposHandle(rgn);
X if(amount < 0) {
X r.bottom -= (Y_SIZE - ab) * height;
X HLock(theData);
X TextBox(&((*theData)[(*lineStarts)[textPos]]), LineLength
X (textPos, ab), &r, teJustLeft);
X HUnlock(theData);
X InvertRange(&theSelect, &r);
X } else {
X r.top += (Y_SIZE - ab) * height;
X HLock(theData);
X TextBox(&((*theData)[(*lineStarts)[textPos + Y_SIZE - ab]]),
X LineLength(textPos + Y_SIZE - ab, ab), &r,
X teJustLeft);
X HUnlock(theData);
X InvertRange(&theSelect, &r);
X }
X }
X SetCtlValue(theScrollBar, scrollPt);
X DrawControls(PagerWindow);
X}
X
X
Xpascal void
XLineUp(ControlHandle stl, int part)
X{
X DoScroll(-1);
X}
X
Xpascal void
XLineDown(ControlHandle stl, int part)
X{
X DoScroll(1);
X}
X
Xpascal void
XPageUp(ControlHandle stl, int part)
X{
X DoScroll(- Y_SIZE + 1);
X}
X
Xpascal void
XPageDown(ControlHandle stl, int part)
X{
X DoScroll(Y_SIZE - 1);
X}
X
X
Xint
XDoKey(EventRecord * theEvent, term_info * t)
X{
Xchar c = theEvent->message & 0xFF;
Xchar k = (theEvent->message & 0xFF00) >> 8;
X
X switch(k) {
X
X case 0x7A:
X DoMenu((long)(editMenu << 16) | 1);
X return 1;
X
X case 0x78:
X DoMenu((long)(editMenu << 16) | 3);
X return 1;
X
X case 0x63:
X DoMenu((long)(editMenu << 16) | 4);
X return 1;
X
X case 0x76:
X DoMenu((long)(editMenu << 16) | 5);
X return 1;
X
X case 0x7E:
X case 0x7B:
X if(theEvent->modifiers & (optionKey | shiftKey | cmdKey))
X DoScroll(- Y_SIZE + 1);
X else DoScroll(-1);
X return 1;
X
X case 0x7C:
X case 0x7D:
X if(theEvent->modifiers & (optionKey | shiftKey | cmdKey))
X DoScroll(Y_SIZE - 1);
X else DoScroll(1);
X return 1;
X
X case 0x73:
X DoScroll(-scrollMax);
X return 1;
X
X case 0x77:
X DoScroll(scrollMax);
X return 1;
X
X case 0x74:
X DoScroll(1 - Y_SIZE);
X return 1;
X
X case 0x79:
X DoScroll(Y_SIZE - 1);
X return 1;
X
X case 0x7F:
X return 0;
X
X default:
X break;
X }
X
X switch(c) {
X
X case 'c':
X case 'C':
X if(theEvent->modifiers & cmdKey) {
X HiliteMenu(editMenu);
X DoMenu((long)(editMenu << 16) | 4);
X HiliteMenu(0);
X }
X return 1;
X
X case '.':
X if(!(theEvent->modifiers & cmdKey)) break;
X case 'q':
X case 'Q':
X case 0x1B:
X return 0;
X
X case ' ':
X case 0x9:
X if(theEvent->modifiers & (optionKey | shiftKey | cmdKey))
X DoScroll(- Y_SIZE + 1);
X else DoScroll(Y_SIZE - 1);
X break;
X
X case 0x3:
X case '\r':
X case '\n':
X if(theEvent->modifiers & (optionKey | shiftKey | cmdKey))
X DoScroll(-1);
X else DoScroll(1);
X break;
X
X case '<':
X DoScroll(- scrollMax);
X break;
X
X case '>':
X DoScroll(scrollMax);
X break;
X
X default:
X break;
X }
X
X return 1;
X}
X
X
Xvoid
XDoClick(EventRecord * theEvent, term_info * t)
X{
XControlHandle control;
XPoint pt = theEvent->where;
Xint part;
X
X GlobalToLocal(&pt);
X part = FindControl(pt, PagerWindow, &control);
X if(part) {
X switch(part) {
X
X case inThumb:
X if(TrackControl(control, pt, 0L) == inThumb) {
X scrollPt = GetCtlValue(control);
X DoScroll(scrollPt - textPos);
X }
X break;
X
X case inUpButton:
X TrackControl(control, pt, LineUp);
X break;
X
X case inDownButton:
X TrackControl(control, pt, LineDown);
X break;
X
X case inPageUp:
X TrackControl(control, pt, PageUp);
X break;
X
X case inPageDown:
X TrackControl(control, pt, PageDown);
X break;
X
X default:
X break;
X }
X } else {
X if(theEvent->modifiers & shiftKey) {
X theSelect.end = WhatOffset(pt, &(theSelect.endline));
X oldSelect.start = theSelect.end;
X oldSelect.startline = theSelect.endline;
X InvertRange(&oldSelect, (Rect *) 0L);
X oldSelect = theSelect;
X } else {
X InvertRange(&theSelect, (Rect *) 0L);
X theSelect.start = WhatOffset(pt, &(theSelect.startline));
X theSelect.end = theSelect.start;
X theSelect.endline = theSelect.startline;
X InvertRange(&theSelect, (Rect *) 0L);
X oldSelect = theSelect;
X }
X while(StillDown()) {
X GetMouse(&pt);
X theSelect.end = WhatOffset(pt, &(theSelect.endline));
X oldSelect.start = theSelect.end;
X oldSelect.startline = theSelect.endline;
X InvertRange(&oldSelect, (Rect *) 0L);
X oldSelect = theSelect;
X }
X if(theSelect.start > theSelect.end) {
X long t = theSelect.start;
X theSelect.start = theSelect.end;
X theSelect.end = t;
X t = theSelect.startline;
X theSelect.startline = theSelect.endline;
X theSelect.endline = t;
X oldSelect = theSelect;
X }
X }
X}
X
X
Xint
XDoMenu(long selection)
X{
Xint menu = HiWord(selection);
Xint item = LoWord(selection);
X
X switch(menu) {
X
X case fileMenu:
X if(item == 9) return 0;
X if(item == 4) {
X Rect foom = PagerWindow->portRect;
X OffsetRect(&foom, -foom.left, -foom.top);
X InvalRect(&foom);
X return 1;
X }
X break;
X
X case editMenu:
X switch(item) {
X
X case 1:
X SysBeep(20);
X break;
X
X case 3:
X SysBeep(20);
X break;
X
X case 4:
X if(theSelect.start == theSelect.end) {
X SysBeep(20);
X } else {
X ZeroScrap();
X HLock(theData);
X PutScrap(theSelect.end - theSelect.start, 'TEXT', &((*theData)
X [theSelect.start]));
X HUnlock(theData);
X }
X break;
X
X case 5:
X SysBeep(20);
X break;
X
X default:
X break;
X
X }
X break;
X
X default:
X break;
X
X }
X
X return 1;
X}
X
X
Xint
XDoMDown(EventRecord * theEvent, term_info * t)
X{
XWindowPtr whatWindow;
Xint where;
X
X where = FindWindow(theEvent->where, &whatWindow);
X switch(where) {
X
X case inMenuBar:
X if(theSelect.start != theSelect.end) {
X EnableItem(editMenuH, 4);
X } else {
X DisableItem(editMenuH, 4);
X }
X where = DoMenu(MenuSelect(theEvent->where));
X HiliteMenu(0);
X return where;
X
X case inGrow:
X case inContent:
X if(StripAddress(whatWindow) == StripAddress(PagerWindow)) {
X DoClick(theEvent, t);
X } else {
X SysBeep(20);
X }
X break;
X
X case inDrag:
X if(StripAddress(whatWindow) == StripAddress(PagerWindow)) {
X RgnHandle theRgn = GetGrayRgn();
X Point p;
X DragWindow(PagerWindow, theEvent->where, &((*theRgn)->rgnBBox));
X windowSize = PagerWindow->portRect;
X p.h = windowSize.left;
X p.v = windowSize.top;
X LocalToGlobal(&p);
X OffsetRect(&windowSize, p.h, p.v);
X } else {
X SysBeep(20);
X }
X break;
X
X case inGoAway:
X if(TrackGoAway(PagerWindow, theEvent->where)) return 0;
X break;
X
X default:
X break;
X
X }
X return 1;
X}
X
X
Xint
XCheckEvent(EventRecord * theEvent, term_info * t)
X{
X switch(theEvent->what) {
X
X case autoKey:
X case keyDown:
X return DoKey(theEvent, t);
X break;
X
X case updateEvt:
X DoDraw(theEvent, t);
X break;
X
X case mouseDown:
X return DoMDown(theEvent, t);
X break;
X
X case activateEvt:
X if(theEvent->modifiers & 1) {
X ShowControl(theScrollBar);
X } else {
X HideControl(theScrollBar);
X }
X break;
X
X case app4Evt:
X if(theEvent->message >> 24 == 1) {
X if(theEvent->message & 1) {
X HiliteControl(theScrollBar, scrollMax ? 0 : 254);
X } else {
X HiliteControl(theScrollBar, 255);
X }
X }
X
X default:
X break;
X }
X
X return 1;
X}
X
X
Xvoid
XMagicDisplay(term_info * t)
X{
XEventRecord theEvent;
X
X SetCursor(&ARROW_CURSOR);
X do {
X WaitNextEvent(everyEvent, &theEvent, 42L, 0L);
X SetPort(PagerWindow);
X } while(CheckEvent(&theEvent, t));
X}
X
X
Xint
XCountChars(char * s, long n, int c)
X{
Xint r = 0;
X
X while(n-- > 0) if(*(s++) == c) r++;
X
X return r;
X}
X
X
Xint
XTabSize(char * s)
X{
Xint r = 0, q;
X
X for(q = 0; s[q]; q++)
X r += (s[q] == '\t') ? 8 - (r & 7) : 1;
X
X return r;
X}
X
X
Xint
XExpandTabs(char * s, char * d)
X{
Xint r, q, c = 0, t = 0;
X
X for(q = 0; s[q]; q++)
X switch(s[q]) {
X
X case '\t':
X for(r = 0; r < 8 - (t & 7); r++, c++)
X *(d++) = 0x20;
X t += 8 - (t & 7);
X break;
X
X case '\n':
X *(d++) = '\r';
X c++;
X t = 0;
X break;
X
X default:
X *(d++) = s[q];
X c++;
X t++;
X break;
X }
X
X return c;
X}
X
X
Xint
XMoofFile(FILE * fp, int strip)
X{
Xlong fpos;
Xlong delta_slack;
Xlong slack_left;
Xchar buf[MAX_LINE_LEN];
X
X if(!fp) {
X panic("No file for pager");
X }
X fpos = ftell(fp);
X length = 0;
X theData = NewHandle(SLACK);
X slack_left = SLACK;
X
X do {
X if(!fgets(buf, MAX_LINE_LEN, fp)) break;
X if(!strip || isspace(*buf)) {
X delta_slack = TabSize(buf);
X slack_left -= delta_slack;
X if(slack_left < 0) {
X slack_left += SLACK;
X SetHandleSize(theData, length + SLACK + delta_slack);
X if(MemError())
X panic("Out of memory");
X }
X MoveHHi(theData);
X HLock(theData);
X length += ExpandTabs(buf+strip, &((*theData)[length]));
X HUnlock(theData);
X }
X } while(!feof(fp) && (isspace(*buf) || !strip));
X
X fclose(fp);
X return 0;
X}
X
X
Xvoid
XsetLineStarts(long ** starts, char * data, long length)
X{
Xlong x = length;
Xlong p = 0;
X
X **starts = 0;
X while(length--)
X if(*(data++) == '\r')
X (*starts)[++p] = x - length;
X}
X
X
Xvoid
XMoreDisabling(MenuHandle theMenu, int i)
X{
Xint x;
X
X switch(i) {
X
X default :
X DisableItem(theMenu, 0);
X break;
X
X case fileMenu:
X for(x = 1; x < 9; x++)
X DisableItem(theMenu, x);
X SetItem(theMenu, 9, "\PClose");
X EnableItem(theMenu, 9);
X EnableItem(theMenu, 0);
X EnableItem(theMenu, 4);
X break;
X
X case editMenu:
X for(x = 1; x < 7; x++)
X DisableItem(theMenu, x);
X EnableItem(theMenu, 0);
X editMenuH = theMenu;
X break;
X
X }
X}
X
X
Xvoid
XMoreEnabling(MenuHandle theMenu, int i)
X{
Xint x;
X
X switch(i) {
X
X default :
X EnableItem(theMenu, 0);
X break;
X
X case fileMenu:
X for(x = 0; x < 9; x++) if(x != 6 && x != 8)
X EnableItem(theMenu, x);
X SetItem(theMenu, 9, "\PQuit");
X break;
X
X case editMenu:
X for(x = 1; x < 7; x++)
X EnableItem(theMenu, x);
X DisableItem(theMenu, 0);
X break;
X
X }
X}
X
X
Xvoid
XMoreMenus(void)
X{
XMenuHandle theMenu;
Xint i;
X
X for(i=appleMenu; i <=extendMenu; i++) {
X if(theMenu = GetMHandle(i)) {
X MoreDisabling(theMenu, i);
X }
X }
X DrawMenuBar();
X}
X
X
Xvoid
XLessMenus(void)
X{
XMenuHandle theMenu;
Xint i;
X
X for(i=appleMenu; i <=extendMenu; i++) {
X if(theMenu = GetMHandle(i)) {
X MoreEnabling(theMenu, i);
X }
X }
X DrawMenuBar();
X}
X
X
Xint
Xmac_more(FILE * fp, int strip)
X{
XWindowRecord MoreWindow;
Xterm_info * t;
XGrafPtr savedPort;
X
X if(MoofFile(fp, strip)) return -1; /* God knows what happened */
X
X theSelect.start = theSelect.end = theSelect.startline =
X theSelect.endline = 0;
X oldSelect = theSelect;
X MoveHHi(theData);
X HLock(theData);
X noRs = CountChars(*theData, length, '\r');
X lineStarts = (long **) NewHandle((noRs + 1) * sizeof(long));
X if(!lineStarts || MemError()) panic("Out of memory");
X setLineStarts(lineStarts, *theData, length);
X HUnlock(theData);
X scrollMax = noRs - Y_SIZE;
X if(scrollMax < 0) scrollMax = 0;
X
X GetPort(&savedPort);
X t = (term_info *) GetWRefCon(HackWindow);
X
X if(t->inColor ? !GetNewCWindow(301, &MoreWindow, 0L) :
X !GetNewWindow(301, &MoreWindow, 0)) {
X DisposHandle(theData);
X panic("No WIND resource for pager");
X } else if(ResError()) {
X DisposHandle(theData);
X panic("No WIND resource for pager");
X } /* And now set the sizes & things */
X PagerWindow = (GrafPtr) &MoreWindow;
X
X width = t->charWidth;
X height = t->height;
X if(inited != t->height) {
X SetRect(&windowSize, X_POS, Y_POS, width * X_SIZE + X_BORDER + X_POS,
X height * Y_SIZE + Y_BORDER + Y_POS);
X inited = t->height;
X }
X SizeWindow(PagerWindow, windowSize.right - windowSize.left,
X windowSize.bottom - windowSize.top, 0);
X MoveWindow(PagerWindow, windowSize.left, windowSize.top, 0);
X ShowWindow(PagerWindow);
X SelectWindow(PagerWindow);
X SetPort(PagerWindow);
X
X text_area = windowSize;
X OffsetRect(&text_area, - text_area.left, - text_area.top);
X text_area.left = text_area.right - 14;
X InsetRect(&text_area, - 1, - 1);
X theScrollBar = NewControl(PagerWindow, &text_area,
X "\PMore Text", 1, 0, 0, scrollMax, scrollBarProc, 0);
X HiliteControl(theScrollBar, scrollMax ? 0 : 254);
X
X SetRect(&text_area, LEFT_MARGIN, TOP_MARGIN, width * X_SIZE + LEFT_MARGIN,
X height * Y_SIZE + TOP_MARGIN);
X TextFont(t->fontNum);
X TextSize(t->fontSize);
X TextMode(srcCopy);
X textPos = 0;
X
X MoreMenus();
X MagicDisplay(t);
X LessMenus();
X
X if(theScrollBar) KillControls((WindowPtr) &MoreWindow);
X CloseWindow((WindowPtr) &MoreWindow);
X DisposHandle(theData);
X SetPort(HackWindow);
X docrt();
X SetPort(savedPort);
X return 0;
X}
END_OF_FILE
if test 24474 -ne `wc -c <'mac/MacAlert.c'`; then
echo shar: \"'mac/MacAlert.c'\" unpacked with wrong size!
fi
# end of 'mac/MacAlert.c'
echo shar: Extracting \"'others/Makefile.ovl'\" \(24531 characters\)
sed "s/^X//" >'others/Makefile.ovl' <<'END_OF_FILE'
X# SCCS Id: @(#)Makefile.ovl 3.0 90/06/03
X# PC NetHack 3.0 Makefile for Microsoft(tm) "C" 5.1 -- Pierre Martineau
X# Overlay Arrangement -- Stephen Spackman, Pierre Martineau, Norm Meluch
X# Multiple Compilation Hack and so forth -- Stephen Spackman
X# Additional editing -- Kevin Smolkowski
X#
X# Other things that have to be reconfigured are in config.h, pcconf.h,
X# and possibly system.h.
X#
X# Nota Bene: OVERLAY *must* be defined in pcconf.h to use this makefile!
X# Also: Rename this file to "makefile", some targets rely on it.
X# -----------------------------------------------------------------------------
X# In addition to your C compiler,
X#
X# if you want to change you will need a
X# files with suffix workalike for
X# .y yacc
X# .l lex
X# .asm masm
X# -----------------------------------------------------------------------------
X# As it is set up, this makefile requires that exesmurf (the
X# NetHack overlay-aware .exe header editor) be on your path or in the
X# $(SRC) directory. If you wish to change the path or use Microsoft
X# EXEMOD instead, see the symbols EXEPATCH and EXEFLAGS.
X#
X# *****************************************************************************
X# ************************ Compiler Info **************************************
X# *****************************************************************************
XCC = cl /c
XLINK = link
XMODEL = L
XASM = masm
XEXEPATCH = exesmurf
X# $(MAKE) macro is often predefined, so we use $(MAKEBIN) instead.
XMAKEBIN = make
X# For those of us who have these on PC.
X# YACC = yacc
X# LEX = lex
XYACC = bison -y
XLEX = flex
X# Standard file names may vary in PC installations.
XYTABC = y_tab.c
XYTABH = y_tab.h
XLEXYYC = lexyy.c
X# Register bug, remove stack probes...
X# /Gt22 is currently about the largest value that keeps the initialised data
X# segment below 64K (and keeps the linker happy).
X# 286 or higher machines can use the /G2 CFLAG option for better performance.
XCFLAGS = /A$(MODEL) /Oa /Gs /Gt22 /Zp1 /W0 /I$(INCL)
XCOSPACE = /Os
XCOSPEED = /Os # MSC 5.1 seems to be broken, or maybe it's the NetHack code.
X# # Either way, setting COSPEED to /Ot wreaked jolly flaming havoc.
X#
XLFLAGS = /noi /seg:512 /map /st:4096
X#
X# Available assembler flags:
X# /Di386 = Use 386 specific enhancements
X# /DNOEMS = Do not use EMS memory
X# /DDEBUG = Report memory usage on startup
XAFLAGS = /MX
X#
X###############################################################################
X# Use the first line if you are using EXESMURF or the second for EXEMOD.
XEXEFLAGS = /max3000 /min3000
X# EXEFLAGS = /max BB8 /min BB8
X###############################################################################
X#
X# *****************************************************************************
X# ********* Directories (makedefs hardcodes these, don't change them) *********
X# *****************************************************************************
X#
XINCL = ..\include
XAUX = ..\auxil
XSRC = ..\src
XOTHERS = ..\others
XOBJ = $(SRC)\o
X#
X# *****************************************************************************
X# ************************ Local Variables ************************************
X# *****************************************************************************
X#
X# The game name
XGAME = NetHack
X#
X# The default make target (so just typing 'make' is useful)
XDEFAULT : $(GAME)
X#
X# The game directory
X# make sure GAMEDIR exists!
XGAMEDIR = ..
X#
X# The game filename
XGAMEFILE = $(GAMEDIR)\$(GAME).exe
X#
X# Target environment prefix
XTARG = pc
X#
X# Overlay manager object file.
XOVLMGR = ovlmgr.obj
X#
X# Termcap routines.
XTERMCAPS = $(SRC)\termlib.lib
X#
X###############################################################################
X# Switch the following lines if you have a MASM compatible assembler.
X# $(OBJ)\$(OVLMGR):
X$(OBJ)\$(OVLMGR): ; copy $(OTHERS)\$(OVLMGR) $(OBJ)\$(OVLMGR)
X###############################################################################
X# If you have yacc and lex programs and make any changes, comment out the
X# upper two targets and uncomment the lower two.
Xdo_yacc: yacc_msg
Xdo_lex: lex_msg
X# do_yacc: yacc_act
X# do_lex: lex_act
X###############################################################################
X# Optional high-quality BSD random number generation routines (see pcconf.h).
X# Set to nothing if not used.
XRANDOM = $(OBJ)\random.o
X# RANDOM =
X###############################################################################
X# Optional C library specifier for those with non-standard libraries or
X# a multiple-target library setup.
X# CLIB = llibcer /nod
XCLIB =
X###############################################################################
X# If TERMLIB is NOT #defined in the source, comment out the lower line and
X# uncomment the upper. Don't forget to copy the $(TERMCAPS) file to the
X# $(SRC) directory if you have uncommented the lower line.
X# TERMLIB =
XTERMLIB = $(TERMCAPS)
X###############################################################################
X#
X# nothing below this line should have to be changed
X
XROOT = $(OBJ)\$(OVLMGR) $(OBJ)\trampoli.o $(OBJ)\main.o $(OBJ)\msdos.o \
X $(OBJ)\alloc.o $(OBJ)\random.o $(OBJ)\decl.o $(OBJ)\monst.o \
X $(OBJ)\objects.o $(OBJ)\invent.0 $(OBJ)\mkobj.0 $(OBJ)\mkroom.0 \
X $(OBJ)\rnd.0 $(OBJ)\termcap.0
X# main monster code
XOVL01 = $(OBJ)\cmd.0 $(OBJ)\dbridge.0 $(OBJ)\dog.0 $(OBJ)\engrave.0-1 \
X $(OBJ)\hack.0 $(OBJ)\mon.0-1 $(OBJ)\mondata.0-1 $(OBJ)\monmove.0-1 \
X $(OBJ)\mthrowu.0 $(OBJ)\priest.0 $(OBJ)\shk.0 $(OBJ)\track.0 \
X $(OBJ)\trap.0-1 $(OBJ)\were.0
X# pet code
XOVL02 = $(OBJ)\apply.0 $(OBJ)\dog.1 $(OBJ)\dogmove.o
X# advanced monsters
XOVL03 = $(OBJ)\demon.o $(OBJ)\mcastu.o
XOVL04 = $(OBJ)\priest.1-b
XOVL05 = $(OBJ)\shk.1-b
XOVL06 = $(OBJ)\were.1-b
XOVL07 = $(OBJ)\wizard.1-b
XOVL08 = $(OBJ)\worm.o
X# main people things: you take your turn
XOVL09 = $(OBJ)\allmain.0 $(OBJ)\artifact.0 $(OBJ)\attrib.1 $(OBJ)\cmd.1 \
X $(OBJ)\do.1 $(OBJ)\do.3 $(OBJ)\eat.0 $(OBJ)\engrave.2 \
X $(OBJ)\getline.0-1 $(OBJ)\hack.1 $(OBJ)\lock.0 $(OBJ)\mail.0 \
X $(OBJ)\pickup.1 $(OBJ)\pri.1 $(OBJ)\prisym.1 $(OBJ)\sounds.0 \
X $(OBJ)\timeout.0 $(OBJ)\track.1 $(OBJ)\vault.0 $(OBJ)\wizard.0
XOVL10 = $(OBJ)\attrib.0
XOVL11 = $(OBJ)\attrib.2-b $(OBJ)\exper.o
XOVL12 = $(OBJ)\artifact.2 $(OBJ)\eat.1 $(OBJ)\invent.1
XOVL13 = $(OBJ)\makemon.0-2 $(OBJ)\mkobj.1
XOVL14 = $(OBJ)\makemon.b
XOVL15 = $(OBJ)\mkobj.2-b
XOVL16 = $(OBJ)\hack.2
XOVL17 = $(OBJ)\mhitm.1-b
XOVL18 = $(OBJ)\mthrowu.1
XOVL19 = $(OBJ)\mthrowu.2-b
XOVL20 = $(OBJ)\allmain.1 $(OBJ)\mhitm.0 $(OBJ)\mhitu.0-1 $(OBJ)\rnd.1 \
X $(OBJ)\weapon.0-1
XOVL21 = $(OBJ)\mon.2-b $(OBJ)\trap.2
XOVL22 = $(OBJ)\artifact.1 $(OBJ)\search.0 $(OBJ)\uhitm.o $(OBJ)\weapon.2-b
XOVL23 = $(OBJ)\do_wear.0-1 $(OBJ)\mhitu.2-b
XOVL24 = $(OBJ)\steal.0-1
XOVL25 = $(OBJ)\monmove.2-b $(OBJ)\steal.2-b
XOVL26 = $(OBJ)\rnd.2-b
XOVL27 = $(OBJ)\do_wear.2 $(OBJ)\getline.b $(OBJ)\mondata.2 $(OBJ)\objnam.0-1 \
X $(OBJ)\pager.0 $(OBJ)\polyself.0-1
XOVL28 = $(OBJ)\do_name.0
XOVL29 = $(OBJ)\objnam.2-b
XOVL30 = $(OBJ)\pager.1-b
XOVL31 = $(OBJ)\pri.0 $(OBJ)\prisym.0 $(OBJ)\topl.0
XOVL32 = $(OBJ)\pri.b $(OBJ)\topl.1-2
XOVL33 = $(OBJ)\prisym.2
XOVL34 = $(OBJ)\prisym.b
XOVL35 = $(OBJ)\topl.b
XOVL36 = $(OBJ)\termcap.1 $(OBJ)\unix.0
XOVL37 = $(OBJ)\termcap.2-b
XOVL38 = $(OBJ)\dog.b $(OBJ)\sounds.1-b
XOVL39 = $(OBJ)\read.0
XOVL40 = $(OBJ)\invent.b
XOVL41 = $(OBJ)\hack.b
XOVL42 = $(OBJ)\mondata.b $(OBJ)\timeout.1-b
XOVL43 = $(OBJ)\do.0 $(OBJ)\invent.3
XOVL44 = $(OBJ)\cmd.2-b $(OBJ)\getline.2 $(OBJ)\write.o
XOVL45 = $(OBJ)\apply.2-b
XOVL46 = $(OBJ)\do.b
XOVL47 = $(OBJ)\dokick.o
XOVL48 = $(OBJ)\dothrow.o
XOVL49 = $(OBJ)\eat.2-b
XOVL50 = $(OBJ)\invent.2 $(OBJ)\pickup.0 $(OBJ)\pickup.2-b
XOVL51 = $(OBJ)\lock.1-b
XOVL52 = $(OBJ)\polyself.2-b
XOVL53 = $(OBJ)\potion.o
XOVL54 = $(OBJ)\pray.o
XOVL55 = $(OBJ)\read.1-b $(OBJ)\spell.o
XOVL56 = $(OBJ)\search.1-b
X# clothing stuff
XOVL57 = $(OBJ)\do_wear.b $(OBJ)\wield.o $(OBJ)\worn.o
X# Zappage
XOVL58 = $(OBJ)\pri.2 $(OBJ)\zap.o
XOVL59 = $(OBJ)\dbridge.1-b
XOVL60 = $(OBJ)\trap.b
X# Unusual circumstances
XOVL61 = $(OBJ)\artifact.b $(OBJ)\do_name.1-b $(OBJ)\fountain.o $(OBJ)\music.o \
X $(OBJ)\rumors.o $(OBJ)\shknam.0 $(OBJ)\sit.o $(OBJ)\vault.1-b
X# Uppers and Downers
X# Note: version.o is in OVL62, but in a special way. See below.
XOVL62 = $(OBJ)\allmain.2-b $(OBJ)\end.o $(OBJ)\engrave.b $(OBJ)\mail.1-b \
X $(OBJ)\o_init.o $(OBJ)\options.o $(OBJ)\restore.o $(OBJ)\rip.o \
X $(OBJ)\save.o $(OBJ)\shknam.1-b $(OBJ)\topten.o $(OBJ)\tty.o \
X $(OBJ)\u_init.o $(OBJ)\unix.1-b
X# Levelling
XOVL63 = $(OBJ)\apply.1 $(OBJ)\bones.o $(OBJ)\do.2 $(OBJ)\dog.2 \
X $(OBJ)\extralev.o $(OBJ)\mklev.o $(OBJ)\mkmaze.o $(OBJ)\mkroom.1-b \
X $(OBJ)\sp_lev.o $(OBJ)\track.2-b
X
X
X# *****************************************************************************
X# ************************* Make Objects **************************************
X# *****************************************************************************
X
XMOBJ = $(OVL01) $(OVL02) $(OVL03) $(OVL04) $(OVL05) $(OVL06) $(OVL07) $(OVL08)\
X $(OVL09) $(OVL10) $(OVL11) $(OVL12) $(OVL13) $(OVL14) $(OVL15) $(OVL16)\
X $(OVL17) $(OVL18) $(OVL19) $(OVL20) $(OVL21) $(OVL22) $(OVL23) $(OVL24)\
X $(OVL25) $(OVL26) $(OVL27) $(OVL28) $(OVL29) $(OVL30) $(OVL31) $(OVL32)\
X $(OVL33) $(OVL34) $(OVL35) $(OVL36) $(OVL37) $(OVL38) $(OVL39) $(OVL40)\
X $(OVL41) $(OVL42) $(OVL43) $(OVL44) $(OVL45) $(OVL46) $(OVL47) $(OVL48)\
X $(OVL49) $(OVL50) $(OVL51) $(OVL52) $(OVL53) $(OVL54) $(OVL55) $(OVL56)\
X $(OVL57) $(OVL58) $(OVL59) $(OVL60) $(OVL61) $(OVL62) $(OVL63)
X
XVOBJ = $(ROOT) $(MOBJ)
X
XHOBJ = $(VOBJ) $(OBJ)\version.o
X
X# object files for makedefs
XMAKEOBJS = $(OBJ)\makedefs.o $(OBJ)\alloc.o $(OBJ)\monst.o \
X $(OBJ)\objects.o $(OBJ)\panic.o
X
XOVERLAYS = ($(OVL01)) ($(OVL02)) ($(OVL03)) ($(OVL04)) ($(OVL05)) ($(OVL06)) \
X ($(OVL07)) ($(OVL08)) ($(OVL09)) ($(OVL10)) ($(OVL11)) ($(OVL12)) \
X ($(OVL13)) ($(OVL14)) ($(OVL15)) ($(OVL16)) ($(OVL17)) ($(OVL18)) \
X ($(OVL19)) ($(OVL20)) ($(OVL21)) ($(OVL22)) ($(OVL23)) ($(OVL24)) \
X ($(OVL25)) ($(OVL26)) ($(OVL27)) ($(OVL28)) ($(OVL29)) ($(OVL30)) \
X ($(OVL31)) ($(OVL32)) ($(OVL33)) ($(OVL34)) ($(OVL35)) ($(OVL36)) \
X ($(OVL37)) ($(OVL38)) ($(OVL39)) ($(OVL40)) ($(OVL41)) ($(OVL42)) \
X ($(OVL43)) ($(OVL44)) ($(OVL45)) ($(OVL46)) ($(OVL47)) ($(OVL48)) \
X ($(OVL49)) ($(OVL50)) ($(OVL51)) ($(OVL52)) ($(OVL53)) ($(OVL54)) \
X ($(OVL55)) ($(OVL56)) ($(OVL57)) ($(OVL58)) ($(OVL59)) ($(OVL60)) \
X ($(OVL61)) ($(OVL62) $(OBJ)\version.o) ($(OVL63))
X
X# object files for special levels compiler
XSPLEVOBJS = $(OBJ)\lev_comp.o $(OBJ)\lev_lex.o $(OBJ)\lev_main.o \
X $(OBJ)\alloc.o $(OBJ)\monst.o $(OBJ)\objects.o \
X $(OBJ)\panic.o
X
X# *****************************************************************************
X# ************************** Header Objects ***********************************
X# *****************************************************************************
X
XPCCONF_H = $(INCL)\$(TARG)conf.h $(INCL)\msdos.h $(INCL)\system.h
XGLOBAL_H = $(PCCONF_H) $(INCL)\coord.h $(INCL)\global.h
XCONFIG_H = $(GLOBAL_H) $(INCL)\config.h $(INCL)\tradstdc.h
XPERMONST_H = $(INCL)\permonst.h $(INCL)\monattk.h $(INCL)\monflag.h
XYOUPROP_H = $(PERMONST_H) $(INCL)\prop.h $(INCL)\mondata.h \
X $(INCL)\pm.h $(INCL)\youprop.h
XYOU_H = $(YOUPROP_H) $(INCL)\attrib.h $(INCL)\monst.h \
X $(INCL)\you.h
XDECL_H = $(YOU_H) $(INCL)\decl.h $(INCL)\obj.h \
X $(INCL)\onames.h $(INCL)\spell.h $(INCL)\color.h
XHACK_H = $(CONFIG_H) $(DECL_H) $(INCL)\trap.h \
X $(INCL)\flag.h $(INCL)\gold.h $(INCL)\mkroom.h \
X $(INCL)\monsym.h $(INCL)\objclass.h $(INCL)\rm.h \
X $(INCL)\trampoli.h $(INCL)\hack.h
X
X# *****************************************************************************
X# ************************ File Dependencies **********************************
X# *****************************************************************************
X
X# Due to an NDMake inadequacy these must accord with a topological sort of the
X# generated-from relation... output on the left, input on the right. Trust me.
X.SUFFIXES: .exe .0 .0-1 .0-2 .0-3 .1 .1-2 .1-3 .1-b .2 .2-3 .2-b .3 .3-b .b \
X .o .c .y .l .obj .asm
X
X.c.o:
X $(CC) $(CFLAGS) $(COSPACE) /Fo$(OBJ)\$*.o $*.c
X.c.0:
X $(CC) $(CFLAGS) $(COSPEED) /DOVL0 /NT$*.0 /Fo$(OBJ)\$*.0 $*.c
X.c.0-1:
X $(CC) $(CFLAGS) $(COSPEED) /DOVL0 /DOVL1 /NT$*.0-1 /Fo$(OBJ)\$*.0-1 $*.c
X.c.0-2:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL0 /DOVL1 /DOVL2 /NT$*.0-2 /Fo$(OBJ)\$*.0-2 $*.c
X.c.0-3:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL0 /DOVL1 /DOVL2 /DOVL3 /NT$*.0-3 /Fo$(OBJ)\$*.0-3 $*.c
X.c.1:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL1 /NT$*.1 /Fo$(OBJ)\$*.1 $*.c
X.c.1-2:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL1 /DOVL2 /NT$*.1-2 /Fo$(OBJ)\$*.1-2 $*.c
X.c.1-3:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL1 /DOVL2 /DOVL3 /NT$*.1-3 /Fo$(OBJ)\$*.1-3 $*.c
X.c.1-b:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL1 /DOVL2 /DOVL3 /DOVLB /NT$*.1-b /Fo$(OBJ)\$*.1-b $*.c
X.c.2:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL2 /NT$*.2 /Fo$(OBJ)\$*.2 $*.c
X.c.2-3:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL2 /DOVL3 /NT$*.2-3 /Fo$(OBJ)\$*.2-3 $*.c
X.c.2-b:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL2 /DOVL3 /DOVLB /NT$*.2-b /Fo$(OBJ)\$*.2-b $*.c
X.c.3:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL3 /NT$*.3 /Fo$(OBJ)\$*.3 $*.c
X.c.3-b:
X $(CC) $(CFLAGS) $(COSPACE) /DOVL3 /DOVLB /NT$*.3-b /Fo$(OBJ)\$*.3-b $*.c
X.c.b:
X $(CC) $(CFLAGS) $(COSPACE) /DOVLB /NT$*.b /Fo$(OBJ)\$*.b $*.c
X.asm.obj:
X $(ASM) $(AFLAGS) $*.asm,$(OBJ)\$*.obj ;
X
X$(GAME): $(GAMEFILE)
X
X$(GAME).exe: $(GAMEFILE)
X
X$(GAMEFILE): $(OBJ) $(HOBJ)
X @echo Loading....
X $(LINK) $(ROOT) $(OVERLAYS),$(GAMEFILE),$(GAME),$(CLIB) $(TERMLIB) $(LFLAGS) ;
X $(EXEPATCH) $(GAMEFILE) $(EXEFLAGS)
X @echo NetHack is up to date.
X
X$(OBJ):
X if not exist .\$(OBJ)\*.* mkdir $(OBJ)
X
X# The following 3 modules vary depending on what OS you are using.
X
X$(OBJ)\main.o: $(HACK_H) $(TARG)main.c
X $(CC) $(CFLAGS) $(COSPACE) /Fo.\$(OBJ)\main.o $(TARG)main.c
X
X$(OBJ)\tty.o: $(HACK_H) $(INCL)\func_tab.h $(TARG)tty.c
X $(CC) $(CFLAGS) $(COSPACE) /Fo.\$(OBJ)\tty.o $(TARG)tty.c
X
X$(OBJ)\unix.0: $(HACK_H) $(TARG)unix.c
X $(CC) $(CFLAGS) $(COSPEED) /DOVL0 /Fo.\$(OBJ)\unix.0 $(TARG)unix.c
X$(OBJ)\unix.1-b: $(HACK_H) $(TARG)unix.c
X $(CC) $(CFLAGS) $(COSPACE) /DOVL1 /DOVL2 /DOVL3 /DOVLB /Fo.\$(OBJ)\unix.1-b $(TARG)unix.c
X
X$(OBJ)\makedefs.o: $(INCL)\config.h $(INCL)\permonst.h $(INCL)\objclass.h
X
Xmakedefs.exe: $(MAKEOBJS)
X $(LINK) $(LFLAGS) $(MAKEOBJS), makedefs.exe,, $(CLIB);
X
X# Targets for the special levels compiler
X
Xlev_comp.c: lev_comp.y
X $(MAKEBIN) do_yacc
X
Xlev_lex.c: lev_comp.l
X $(MAKEBIN) do_lex
X
Xyacc_msg:
X @echo lev_comp.y has changed. To update lev_comp.c and lev_comp.h run YACC.
X
Xyacc_act:
X $(YACC) -d lev_comp.y
X copy $(YTABC) lev_comp.c
X copy $(YTABH) $(INCL)\lev_comp.h
X del $(YTABC)
X del $(YTABH)
X
Xlex_msg:
X @echo lev_comp.l has changed. To update lev_lex.c run LEX.
X
Xlex_act:
X $(LEX) lev_comp.l
X copy $(LEXYYC) lev_lex.c
X del $(LEXYYC)
X
X# This is stupid but since the default rule does not work here ...
X
X$(OBJ)\lev_comp.o: $(HACK_H) $(INCL)\sp_lev.h lev_comp.c
X $(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $*.c
X$(OBJ)\lev_lex.o: $(HACK_H) $(INCL)\sp_lev.h $(INCL)\lev_comp.h \
X lev_lex.c
X $(CC) $(CFLAGS) /Fo$(OBJ)\$*.o $*.c
X
Xlev_comp.exe: $(SPLEVOBJS)
X $(LINK) $(LFLAGS) $(SPLEVOBJS),lev_comp.exe,, $(CLIB);
X
X# *****************************************************************************
X# ************************* Makedefs Stuff ***********************************
X# *****************************************************************************
X# The following include files depend on makedefs to be created.
X# date.h should be remade any time any of the source or include code
X# is modified.
X
X$(INCL)\date.h: $(VOBJ) makedefs.exe
X .\makedefs -v
X
X$(INCL)\onames.h: makedefs.exe
X .\makedefs -o
X
X$(INCL)\pm.h: makedefs.exe
X .\makedefs -p
X
X$(INCL)\trap.h: makedefs.exe
X .\makedefs -t
X
Xdata: $(AUX)\data.bas makedefs.exe
X .\makedefs -d
X
Xrumors: $(AUX)\rumors.tru $(AUX)\rumors.fal makedefs.exe
X .\makedefs -r
X
X# *****************************************************************************
X# ************************ Secondary targets **********************************
X# *****************************************************************************
X
Xall: install
X
Xinstall: $(OBJ) lev_comp.exe $(GAMEFILE) auxil.tag install.tag
X @echo Don't forget to check HACKDIR in NetHack.cnf.
X @echo Done.
X
Xinstall.tag:
X copy $(OTHERS)\termcap $(GAMEDIR)
X copy $(AUX)\*. $(GAMEDIR)
X del $(GAMEDIR)\MacHelp
X copy $(OTHERS)\NetHack.cnf $(GAMEDIR)
X echo install done > install.tag
X
Xspec_lev.tag: lev_comp.exe $(AUX)\castle.des $(AUX)\endgame.des $(AUX)\tower.des
X lev_comp $(AUX)\castle.des
X lev_comp $(AUX)\endgame.des
X lev_comp $(AUX)\tower.des
X copy castle $(GAMEDIR)
X copy endgame $(GAMEDIR)
X copy tower? $(GAMEDIR)
X del castle
X del endgame
X del tower?
X echo spec_lev done > spec_lev.tag
X
Xauxil.tag: spec_lev.tag data rumors
X echo special levels created > auxil.tag
X
Xclean:
X del $(OBJ)\*.o
X del $(OBJ)\*.0
X del $(OBJ)\*.0-1
X del $(OBJ)\*.0-2
X del $(OBJ)\*.0-3
X del $(OBJ)\*.1
X del $(OBJ)\*.1-2
X del $(OBJ)\*.1-3
X del $(OBJ)\*.1-b
X del $(OBJ)\*.2
X del $(OBJ)\*.2-3
X del $(OBJ)\*.2-b
X del $(OBJ)\*.3
X del $(OBJ)\*.3-b
X del $(OBJ)\*.b
X del $(OBJ)\*.obj
X rmdir $(OBJ)
X
Xspotless: clean
X del $(INCL)\date.h
X del $(INCL)\onames.h
X del $(INCL)\pm.h
X if exist makedefs.exe del makedefs.exe
X if exist lev_comp.exe del lev_comp.exe
X del castle
X del endgame
X del tower?
X del *.bak
X del *.tag
X del *.map
X del *.obj
X del *.lib
X del *.txt
X del $(AUX)\data
X del $(AUX)\rumors
X
X# *****************************************************************************
X# ************************* Other dependencies ********************************
X# *****************************************************************************
X# Other dependencies
X#
X# I deleted that line. ;-}
X
X$(OBJ)\allmain.0: $(HACK_H)
X$(OBJ)\allmain.1: $(HACK_H)
X$(OBJ)\allmain.2-b: $(HACK_H)
X$(OBJ)\alloc.o: $(CONFIG_H)
X$(OBJ)\apply.0: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\apply.1: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\apply.2-b: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\artifact.0: $(HACK_H) $(INCL)\artifact.h
X$(OBJ)\artifact.1: $(HACK_H) $(INCL)\artifact.h
X$(OBJ)\artifact.2: $(HACK_H) $(INCL)\artifact.h
X$(OBJ)\artifact.b: $(HACK_H) $(INCL)\artifact.h
X$(OBJ)\attrib.0: $(HACK_H)
X$(OBJ)\attrib.1: $(HACK_H)
X$(OBJ)\attrib.2-b: $(HACK_H)
X$(OBJ)\bones.o: $(HACK_H)
X$(OBJ)\cmd.0: $(HACK_H) $(INCL)\func_tab.h
X$(OBJ)\cmd.1: $(HACK_H) $(INCL)\func_tab.h
X$(OBJ)\cmd.2-b: $(HACK_H) $(INCL)\func_tab.h
X$(OBJ)\dbridge.0: $(HACK_H)
X$(OBJ)\dbridge.1-b: $(HACK_H)
X$(OBJ)\decl.o: $(HACK_H)
X$(OBJ)\demon.o: $(HACK_H)
X$(OBJ)\do.0: $(HACK_H)
X$(OBJ)\do.1: $(HACK_H)
X$(OBJ)\do.2: $(HACK_H)
X$(OBJ)\do.3: $(HACK_H)
X$(OBJ)\do.b: $(HACK_H)
X$(OBJ)\do_name.0: $(HACK_H)
X$(OBJ)\do_name.1-b: $(HACK_H)
X$(OBJ)\do_wear.0-1: $(HACK_H)
X$(OBJ)\do_wear.2: $(HACK_H)
X$(OBJ)\do_wear.b: $(HACK_H)
X$(OBJ)\dog.0: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\dog.1: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\dog.2: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\dog.b: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\dogmove.o: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h
X$(OBJ)\dokick.o: $(HACK_H) $(INCL)\eshk.h
X$(OBJ)\dothrow.o: $(HACK_H)
X$(OBJ)\eat.0: $(HACK_H)
X$(OBJ)\eat.1: $(HACK_H)
X$(OBJ)\eat.2-b: $(HACK_H)
X$(OBJ)\end.o: $(HACK_H) $(INCL)\eshk.h
X$(OBJ)\engrave.0-1: $(HACK_H)
X$(OBJ)\engrave.2: $(HACK_H)
X$(OBJ)\engrave.b: $(HACK_H)
X$(OBJ)\exper.o: $(HACK_H)
X$(OBJ)\extralev.o: $(HACK_H)
X$(OBJ)\fountain.o: $(HACK_H)
X$(OBJ)\getline.0-1: $(HACK_H) $(INCL)\func_tab.h
X$(OBJ)\getline.2: $(HACK_H) $(INCL)\func_tab.h
X$(OBJ)\getline.b: $(HACK_H) $(INCL)\func_tab.h
X$(OBJ)\hack.0: $(HACK_H)
X$(OBJ)\hack.1: $(HACK_H)
X$(OBJ)\hack.2: $(HACK_H)
X$(OBJ)\hack.b: $(HACK_H)
X$(OBJ)\invent.0: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\invent.1: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\invent.2: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\invent.3: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\invent.b: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\ioctl.o: $(HACK_H)
X$(OBJ)\lev_main.o: $(HACK_H) $(INCL)\sp_lev.h
X$(OBJ)\lock.0: $(HACK_H)
X$(OBJ)\lock.1-b: $(HACK_H)
X$(OBJ)\mail.0: $(HACK_H)
X$(OBJ)\mail.1-b: $(HACK_H)
X$(OBJ)\makemon.0-2: $(HACK_H)
X$(OBJ)\makemon.b: $(HACK_H)
X$(OBJ)\mcastu.o: $(HACK_H)
X$(OBJ)\mhitm.0: $(HACK_H) $(INCL)\artifact.h
X$(OBJ)\mhitm.1-b: $(HACK_H) $(INCL)\artifact.h
X$(OBJ)\mhitu.0-1: $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h
X$(OBJ)\mhitu.2-b: $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h
X$(OBJ)\mklev.o: $(HACK_H)
X$(OBJ)\mkmaze.o: $(HACK_H)
X$(OBJ)\mkobj.0: $(HACK_H)
X$(OBJ)\mkobj.1: $(HACK_H)
X$(OBJ)\mkobj.2-b: $(HACK_H)
X$(OBJ)\mkroom.0: $(HACK_H)
X$(OBJ)\mkroom.1-b: $(HACK_H)
X$(OBJ)\mon.0-1: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\wseg.h
X$(OBJ)\mon.2-b: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\wseg.h
X$(OBJ)\mondata.0-1: $(HACK_H) $(INCL)\eshk.h $(INCL)\epri.h
X$(OBJ)\mondata.2: $(HACK_H) $(INCL)\eshk.h $(INCL)\epri.h
X$(OBJ)\mondata.b: $(HACK_H) $(INCL)\eshk.h $(INCL)\epri.h
X$(OBJ)\monmove.0-1: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h
X$(OBJ)\monmove.2-b: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h
X$(OBJ)\monst.o: $(CONFIG_H) $(PERMONST_H) $(INCL)\eshk.h \
X $(INCL)\vault.h $(INCL)\epri.h $(INCL)\color.h
X$(OBJ)\msdos.o: $(HACK_H)
X$(OBJ)\mthrowu.0: $(HACK_H)
X$(OBJ)\mthrowu.1: $(HACK_H)
X$(OBJ)\mthrowu.2-b: $(HACK_H)
X$(OBJ)\music.o: $(HACK_H)
X$(OBJ)\o_init.o: $(HACK_H)
X$(OBJ)\objects.o: $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \
X $(INCL)\prop.h $(INCL)\color.h
X$(OBJ)\objnam.0-1: $(HACK_H)
X$(OBJ)\objnam.2-b: $(HACK_H)
X$(OBJ)\options.o: $(HACK_H)
X$(OBJ)\pager.0: $(HACK_H)
X$(OBJ)\pager.1-b: $(HACK_H)
X$(OBJ)\panic.o: $(CONFIG_H)
X$(OBJ)\pickup.0: $(HACK_H)
X$(OBJ)\pickup.1: $(HACK_H)
X$(OBJ)\pickup.2-b: $(HACK_H)
X$(OBJ)\polyself.0-1: $(HACK_H)
X$(OBJ)\polyself.2-b: $(HACK_H)
X$(OBJ)\potion.o: $(HACK_H)
X$(OBJ)\pray.o: $(HACK_H)
X$(OBJ)\pri.0: $(HACK_H) $(INCL)\epri.h $(INCL)\termcap.h
X$(OBJ)\pri.1: $(HACK_H) $(INCL)\epri.h $(INCL)\termcap.h
X$(OBJ)\pri.2: $(HACK_H) $(INCL)\epri.h $(INCL)\termcap.h
X$(OBJ)\pri.b: $(HACK_H) $(INCL)\epri.h $(INCL)\termcap.h
X$(OBJ)\priest.0: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\eshk.h \
X $(INCL)\epri.h
X$(OBJ)\priest.1-b: $(HACK_H) $(INCL)\mfndpos.h $(INCL)\eshk.h \
X $(INCL)\epri.h
X$(OBJ)\prisym.0: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\prisym.1: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\prisym.2: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\prisym.b: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\random.o:
X$(OBJ)\read.0: $(HACK_H)
X$(OBJ)\read.1-b: $(HACK_H)
X$(OBJ)\restore.o: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\rip.o: $(HACK_H)
X$(OBJ)\rnd.0: $(HACK_H)
X$(OBJ)\rnd.1: $(HACK_H)
X$(OBJ)\rnd.2-b: $(HACK_H)
X$(OBJ)\rumors.o: $(HACK_H)
X$(OBJ)\save.o: $(HACK_H) $(INCL)\lev.h $(INCL)\wseg.h
X$(OBJ)\search.0: $(HACK_H) $(INCL)\artifact.h
X$(OBJ)\search.1-b: $(HACK_H) $(INCL)\artifact.h
X$(OBJ)\shk.0: $(HACK_H) $(INCL)\eshk.h
X$(OBJ)\shk.1-b: $(HACK_H) $(INCL)\eshk.h
X$(OBJ)\shknam.0: $(HACK_H) $(INCL)\eshk.h
X$(OBJ)\shknam.1-b: $(HACK_H) $(INCL)\eshk.h
X$(OBJ)\sit.o: $(HACK_H)
X$(OBJ)\sounds.0: $(HACK_H) $(INCL)\edog.h $(INCL)\eshk.h
X$(OBJ)\sounds.1-b: $(HACK_H) $(INCL)\edog.h $(INCL)\eshk.h
X$(OBJ)\sp_lev.o: $(HACK_H) $(INCL)\sp_lev.h
X$(OBJ)\spell.o: $(HACK_H)
X$(OBJ)\steal.0-1: $(HACK_H)
X$(OBJ)\steal.2-b: $(HACK_H)
X$(OBJ)\termcap.0: $(HACK_H) $(INCL)\termcap.h
X$(OBJ)\termcap.1: $(HACK_H) $(INCL)\termcap.h
X$(OBJ)\termcap.2-b: $(HACK_H) $(INCL)\termcap.h
X$(OBJ)\timeout.0: $(HACK_H)
X$(OBJ)\timeout.1-b: $(HACK_H)
X$(OBJ)\topl.0: $(HACK_H)
X$(OBJ)\topl.1-2: $(HACK_H)
X$(OBJ)\topl.b: $(HACK_H)
X$(OBJ)\topten.o: $(HACK_H)
X$(OBJ)\track.0: $(HACK_H)
X$(OBJ)\track.1: $(HACK_H)
X$(OBJ)\track.2-b: $(HACK_H)
X$(OBJ)\trampoli.o: $(HACK_H)
X$(OBJ)\trap.0-1: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\trap.2: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\trap.b: $(HACK_H) $(INCL)\edog.h
X$(OBJ)\u_init.o: $(HACK_H)
X$(OBJ)\uhitm.o: $(HACK_H) $(INCL)\artifact.h
X$(OBJ)\vault.0: $(HACK_H) $(INCL)\vault.h
X$(OBJ)\vault.1-b: $(HACK_H) $(INCL)\vault.h
X$(OBJ)\version.o: $(HACK_H) $(INCL)\date.h $(INCL)\patchlev.h
X$(OBJ)\weapon.0-1: $(HACK_H)
X$(OBJ)\weapon.2-b: $(HACK_H)
X$(OBJ)\were.0: $(HACK_H)
X$(OBJ)\were.1-b: $(HACK_H)
X$(OBJ)\wield.o: $(HACK_H)
X$(OBJ)\wizard.0: $(HACK_H)
X$(OBJ)\wizard.1-b: $(HACK_H)
X$(OBJ)\worm.o: $(HACK_H) $(INCL)\wseg.h
X$(OBJ)\worn.o: $(HACK_H)
X$(OBJ)\write.o: $(HACK_H)
X$(OBJ)\zap.o: $(HACK_H)
END_OF_FILE
if test 24531 -ne `wc -c <'others/Makefile.ovl'`; then
echo shar: \"'others/Makefile.ovl'\" unpacked with wrong size!
fi
# end of 'others/Makefile.ovl'
echo shar: Extracting \"'vms/vmsbuild.com'\" \(8030 characters\)
sed "s/^X//" >'vms/vmsbuild.com' <<'END_OF_FILE'
X$ ! vms/vmsbuild.com -- compile and link NetHack 3.0 patchlevel 8 [pr]
X$ !
X$ ! usage:
X$ ! $ set default [.src] !or [-.src] if starting from [.vms]
X$ ! $ @[-.vms]vmsbuild [compiler-option] [link-option] [cc-switches]
X$ ! options:
X$ ! compiler-option : either "VAXC" or "GNUC" or "" !default VAXC
X$ ! link-option : either "SHARE[able]" or "LIB[rary]" !default SHARE
X$ ! cc-switches : optional qualifiers for CC (such as "/noOpt/Debug")
X$ ! notes:
X$ ! If the symbol "CC" is defined, compiler-option is not used.
X$ ! The link-option refers to VAXCRTL (C Run-Time Library) handling;
X$ ! to specify it while letting compiler-option default, use "" as
X$ ! the compiler-option.
X$ ! To re-link without compiling, use "LINK" as special 'compiler-option';
X$ ! to re-link with GNUC library, 'CC' must begin with "G" (or "g").
X$ ! Default wizard definition moved to include/vmsconf.h.
X$
X$ vaxc_ = "CC/NOLIST/OPTIMIZE=NOINLINE" !vaxc v3.x (2.x fixed below)
X$ gnuc_ = "GCC/CC1=""-fwritable-strings"""
X$ gnulib = "gnu_cc:[000000]gcclib/Library" !(not used w/ vaxc)
X$ ! common CC options (/obj=file doesn't work for GCC 1.36, use rename instead)
X$ c_c_ = "/INCLUDE=[-.INCLUDE]" !/DEFINE=(""WIZARD=""""GENTZEL"""""")
X$ if f$extract(1,3,f$getsyi("VERSION")).lts."4.6" then -
X$ c_c_ = c_c_ + "/DEFINE=(""VERYOLD_VMS"")"
X$ ! miscellaneous setup
X$ ivqual = %x00038240 !DCL-W-IVQUAL (used to check for ancient vaxc)
X$ abort := exit %x1000002A
X$ ! validate first parameter
X$ p1 := 'p1'
X$ c_opt = f$locate("|"+p1, "|VAXC|GNUC|LINK|SPECIAL|") !5
X$ if (c_opt/5)*5 .eq. c_opt then goto p1_ok
X$ copy sys$input: sys$error: !p1 usage
X%first arg is compiler option; it must be one of
X "VAXC" -- use VAX C to compile everything
X or "GNUC" -- use GNU C to compile everything
X or "LINK" -- skip compilation, just relink nethack.exe
X or "SPEC[IAL]" -- just compile and link lev_comp.exe
X or "" -- default operation (VAXC unless 'CC' is defined)
X
XNote: if a DCL symbol for CC is defined, "VAXC" and "GNUC" are no-ops.
X If the symbol value begins with "G" (or "g"), then the GNU C
X library will be included in all link operations. Do not rebuild
X lev_comp with "SPECIAL" unless you have a CC symbol setup with
X the proper options.
X$ abort
X$p1_ok:
X$ ! validate second parameter
X$ p2 := 'p2'
X$ l_opt = f$locate("|"+p2, "|SHAREABLE|LIBRARY__|") !10
X$ if (l_opt/10)*10 .eq. l_opt then goto p2_ok
X$ copy sys$input: sys$error: !p2 usage
X%second arg is VAXCRTL handling; it must be one of
X "SHAREABLE" -- link with SYS$SHARE:VAXCRTL.EXE/SHAREABLE
X or "LIBRARY" -- link with SYS$LIBRARY:VAXCRTL.OLB/LIBRARY
X or "" -- default operation (use shareable image)
X
XNote: for MicroVMS 4.x, "SHAREABLE" (which is the default) is required.
X$ abort
X$p2_ok:
X$ ! compiler setup; if a symbol for "CC" is already defined it will be used
X$ if f$type(cc).eqs."STRING" then goto got_cc
X$ cc = vaxc_ !assume "VAXC" requested or defaulted
X$ if c_opt.eq.5 then cc = gnuc_ !explicitly invoked w/ "GNUC" option
X$ if c_opt.ne.0 then goto got_cc !"GNUC" or "LINK", skip compiler check
X$ ! we want to prevent function inlining with vaxc v3.x (/opt=noinline)
X$ ! but we can't use noInline with v2.x, so need to determine version
X$ set noOn
X$ msgenv = f$environment("MESSAGE")
X$ set message/noFacil/noSever/noIdent/noText
X$ cc/noObject _NLA0:/Include=[] !strip 'noinline' if error
X$ sts = $status
X$ if sts then goto reset_msg !3.0 or later will check out OK
X$ ! must be dealing with vaxc 2.x; ancient version (2.2 or earlier)
X$ ! can't handle /include='dir', needs c$include instead
X$ cc = cc - "=NOINLINE" - ",NOINLINE" - "NOINLINE,"
X$ if sts.ne.IVQUAL then goto reset_msg
X$ define/noLog c$include [-.INCLUDE]
X$ c_c_ = "/DEFINE=(""ANCIENT_VAXC"")"
X$ if f$extract(1,3,f$getsyi("VERSION")).lts."4.6" then -
X$ c_c_ = c_c_ - ")" + ",""VERYOLD_VMS"")"
X$reset_msg:
X$ set message 'msgenv'
X$ set On
X$got_cc:
X$ cc = cc + c_c_ !append common qualifiers
X$ if p3.nes."" then cc = cc + p3 !append optional user preferences
X$ g := 'f$extract(0,1,cc)'
X$ if g.nes."G" then gnulib = ""
X$ if g.eqs."G" then gnulib = "," + gnulib
X$ ! linker setup; if a symbol for "LINK" is defined, we'll use it
X$ if f$type(link).nes."STRING" then link = "LINK/NOMAP"
X$ if p4.nes."" then link = link + p4 !append optional user preferences
X$ vaxcrtl = "sys$library:vaxcrtl.olb/Library" !object library
X$ if l_opt.ne.0 then goto vaxcrtl_ok
X$ vaxcrtl = "sys$disk:[]vaxcrtl.opt/Options" !shareable image
X$ if f$search("vaxcrtl.opt").nes."" then goto vaxcrtl_ok !assume its right
X$ create sys$disk:[]vaxcrtl.opt
Xsys$share:vaxcrtl/Shareable
Xsys$library:vaxcrtl/Library !/Include=C$$TRANSLATE !for link() substitute
X$vaxcrtl_ok:
X$ ! final setup
X$ nethacklib = "nethack.olb"
X$ milestone = "write sys$output f$fao("" !5%T "",0),"
X$ if c_opt.eq.10 then goto link !"LINK" requested, skip compilation
X$ rename := rename/New_Vers
X$ touch := set file/Truncate
X$ makedefs := $sys$disk:[]makedefs
X$ show symbol cc
X$!
X$! compile and link makedefs, then nethack, finally lev_comp.
X$!
X$ milestone "<compiling...>"
X$ cc [-.vms]vmsmisc !try simplest one first
X$ cc alloc.c
X$ if f$search("monst.c").eqs."" then copy/Concat monst.c1+.c2 *.c
X$ cc monst.c
X$ milestone " (monst)"
X$ cc objects.c
X$ if c_opt.eq.15 then goto special !"SPECIAL" requested, skip main build
X$ cc makedefs.c
X$ link makedefs.obj,monst.obj,objects.obj,vmsmisc.obj,-
X 'vaxcrtl''gnulib',sys$input:/Opt
Xidentification="makedefs 3.0.8"
X$ milestone "makedefs"
X$! create some build-time files
X$ makedefs -p !pm.h
X$ makedefs -o !onames.h
X$ makedefs -t !trap.h
X$ makedefs -v !date.h
X$! create new object library
X$ libr/Obj 'nethacklib'/Create=(Block=2000,Hist=2) vmsmisc.obj,alloc.obj/Insert
X$ if f$search(f$parse(".olb;-2",nethacklib)).nes."" then -
X$ purge/Keep=2 'nethacklib'
X$! compile most of the source files:
X$ c1 = "decl,version,[-.vms]vmsmain,[-.vms]vmsunix,[-.vms]vmstty," -
X + "[-.others]random,[-.vms]vmstparam"
X$ c2 = "allmain,apply,artifact,attrib,bones,cmd,dbridge,demon,do,do_name," -
X + "do_wear,dog,dogmove,dokick,dothrow,eat,end,engrave,exper,extralev"
X$ c3 = "fountain,getline,hack,invent,lock,mail,makemon,mcastu,mhitm,mhitu," -
X + "mklev,mkmaze,mkobj,mkroom,mon,mondata,monmove,mthrowu,music,o_init"
X$ c4 = "objnam,options,pager,pickup,polyself,potion,pray,pri,priest,prisym," -
X + "read,restore,rip,rnd,rumors,save,search,shk,shknam,sit,sounds,sp_lev"
X$ c5 = "spell,steal,termcap,timeout,topl,topten,track,trap,u_init,uhitm," -
X + "vault,weapon,were,wield,wizard,worm,worn,write,zap"
X$! process all 5 lists of files
X$ i = 1
X$list_loop:
X$ list = c'i' !get next list
X$ j = 0
X$file_loop:
X$ file = f$element(j,",",list) !get next file
X$ if file.eqs."" .or. file.eqs."," then goto list_done
X$ cc 'file'.c
X$ if f$extract(0,1,file).eqs."[" then -
X$ file = f$edit(f$parse(file,,,"NAME"),"LOWERCASE")
X$ libr/Obj 'nethacklib' 'file'.obj/Insert
X$ delete 'file'.obj;*
X$ milestone " (",file,")"
X$ j = j + 1
X$ goto file_loop
X$list_done:
X$ i = i + 1
X$ if i.le.5 then goto list_loop
X$! one special case left
X$ cc [-.vms]vmstermcap.c -
X /Define=("bcopy(s,d,n)=memcpy((d),(s),(n))","exit=vms_exit")
X$ libr/Obj 'nethacklib' vmstermcap.obj/Insert
X$!
X$link:
X$ milestone "<linking...>"
X$ link/Exe=nethack 'nethacklib'/Lib/Incl=(vmsmain,allmain,vmsunix,vmstty,decl),-
X sys$disk:[]monst.obj,objects.obj,- !(data-only modules, like decl)
X sys$input:/Opt,'vaxcrtl''gnulib'
Xidentification="NetHack 3.0.8"
X$ milestone "NetHack"
X$ if c_opt.eq.10 then goto done !"LINK" only
X$special:
X$!
X$! build special level compiler
X$!
X$ cc lev_main.c
X$ cc lev_comp.c
X$ copy [-.vms]lev_lex.h stdio.*/Prot=(s:rwd,o:rwd)
X$ cc lev_lex.c
X$ rename stdio.h lev_lex.*
X$ cc panic.c
X$ link lev_comp.obj,lev_lex.obj,lev_main.obj,-
X monst.obj,objects.obj,alloc.obj,panic.obj,vmsmisc.obj,-
X 'vaxcrtl''gnulib',sys$input:/Opt
Xidentification="lev_comp 3.0.8"
X$ milestone "lev_comp"
X$!
X$done:
X$ exit
END_OF_FILE
if test 8030 -ne `wc -c <'vms/vmsbuild.com'`; then
echo shar: \"'vms/vmsbuild.com'\" unpacked with wrong size!
fi
# end of 'vms/vmsbuild.com'
echo shar: End of archive 22 \(of 24\).
cp /dev/null ark22isdone
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 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 24 archives.
rm -f 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