Path: uunet!news.tek.com!saab!billr From: billr@saab.CNA.TEK.COM (Bill Randle) Newsgroups: comp.sources.games Subject: v18i048: nethack31 - display oriented dungeons & dragons (Ver. 3.1), Patch3o/18 Date: 20 Jul 1993 22:33:33 GMT Organization: Tektronix, Inc, Redmond, OR, USA Lines: 2113 Approved: billr@saab.CNA.TEK.COM Message-ID: <22hrrt$9q7@ying.cna.tek.com> NNTP-Posting-Host: saab.cna.tek.com Xref: uunet comp.sources.games:1848 Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller) Posting-number: Volume 18, Issue 48 Archive-name: nethack31/patch3o Patch-To: nethack31: Volume 16, Issue 1-116 Environment: Amiga, Atari, Mac, MS-DOS, Windows-NT, 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 'sys/mac/macmenu.c' <<'END_OF_FILE' X/* SCCS Id: @(#)macmenu.c 3.1 93/04/29 */ X/* Copyright (c) Macintosh NetHack Port Team, 1993. */ X/* NetHack may be freely redistributed. See license for details. */ X X/****************************************\ X * Extended Macintosh menu support X * X * provides access to all keyboard commands from cmd.c X * provides control key functionality for classic keyboards X * provides key equivalent references and logical menu groups X * supports various menu highlighting modes X * does not (yet) provide balloon help support (maybe never will!) X\****************************************/ X X/****************************************\ X * Edit History: X * X * 930512 - More bug fixes and getting tty to work again, Jon W{tte X * 930508 - Bug fixes in-flight, Jon W{tte X * 04/29/93 - 1st Release Draft, David Hairston X * 04/11/93 - 1st Draft, David Hairston X\****************************************/ X X/******** Application Defines ********/ X#include "hack.h" X#include "patchlevel.h" X X/******** Toolbox Defines ********/ X/* #include */ X#include X/* #include */ X/* #include */ X#include X/* #include */ X#include X/* #include */ X#include X#include X#include X/* #include */ X X/* Think/MPW incompatibility from Think.h/Script.h */ X#if !defined(__THINK__) && !defined(__SCRIPT__) X#define GetMBarHeight() (* (short *) 0x0BAA) X#endif X X/* Think/MPW incompatibility from LoMem.h/SysEqu.h */ X#if !defined(__LOMEM__) && !defined(__SYSEQU__) Xenum { WindowList = 0x9D6 }; X#endif X X/* Think has separated out c2pstr and other pascal odditites */ X#if defined(THINK_C) X#include X#endif X X/******** Local Defines ********/ X X/* 'MNU#' (menu list record) */ Xtypedef union menuRefUnn X{ X short mresID; /* MENU resource ID (before GetMenu) */ X MenuHandle mhnd; /* MENU handle (after GetMenu) */ X} menuRefUnn; X Xtypedef struct menuListRec X{ X short firstMenuID; X short numMenus; X menuRefUnn mref[]; X} menuListRec, *menuListPtr, **menuListHandle; X X/* indices and resource IDs of the menu list data */ Xenum X{ X listMenubar, X listSubmenu, X X menuBarListID = 128, X subMenuListID X}; X X/* the following mref[] indices are reserved */ Xenum X{ X /* menu bar */ X menuApple, X menuFile, X menuEdit, X X /* submenu */ X menuWizard = 0 X}; X X/* the following menu items are reserved */ Xenum X{ X /* apple */ X menuAppleAboutBox = 1, X ____Apple__1, X X /* File */ X menuFileOpenMap = 1, X menuFileRedraw, X menuFilePrevMsg, X menuFileCleanup, X menuFileClose, X ____File___1, X menuFilePlayMode, X menuFileEnterExplore, X ____File___2, X menuFileOptionEdit, X ____File___3, X menuFileSave, X ____File___4, X menuFileQuit, X X /* standard minimum Edit menu items */ X X /* Wizard */ X menuWizardAttributes = 1 X}; X X/* symbols here correspond to arrays in DialogAskName */ X/* eventually this data will become a 'STR#' resource */ Xstatic unsigned char uitmChar[3][16] = {{"ABCEHKPRSTVW"}, {"MF"}, {" XD"}}; X X /* arrays here correspond to symbols in drawANUserItem */ X /* eventually this data will be moved to 'STR#' resources */ Xstatic unsigned char * nhRole [ askn_role_end ] = { X {"\pArcheologist"}, {"\pBarbarian"}, X {"\pCaveman"}, {"\pElf"}, {"\pHealer"}, {"\pKnight"}, X {"\pPriest"}, {"\pRogue"}, {"\pSamurai"}, {"\pTourist"}, X {"\pValkyrie"}, {"\pWizard"} X}; Xstatic unsigned char * nhSex [ 2 ] = { X {"\pMale"}, {"\pFemale"} X}; Xstatic unsigned char * nhMode [ 3 ] = { X {"\pRegular"}, {"\pExplore"}, {"\pDebug"} X}; X X X/* X * menuListRec data (preloaded and locked) specifies the number of menus in X * the menu bar, the number of hierarchal or submenus and the menu IDs of X * all of those menus. menus that go into in the menu bar are specified by X * 'MNU#' 128 and submenus are specified by 'MNU#' 129. the fields of the X * menuListRec are: X * firstMenuID - the menu ID (not resource ID) of the 1st menu. subsequent X * menus in the list are _forced_ to have consecutively incremented IDs. X * numMenus - the total count of menus in a given list (and the extent of X * valid menu IDs). X * mref[] - initially the MENU resource ID is stored in the placeholder for X * the resource handle. after loading (GetResource), the menu handle X * is stored and the menu ID, in memory, is set as noted above. X * X * NOTE: a ResEdit template editor is supplied to edit the 'MNU#' resources. X * X * NOTE: the resource IDs do not need to match the menu IDs in a menu list X * record although they have been originally set that way. X * X * NOTE: the menu ID's of menus in the submenu list record may be reset, as X * noted above. it is the programmers responsibility to make sure that X * submenu references/IDs are valid. X * X * WARNING: the existence of the submenu list record is assumed even if the X * number of submenus is zero. also, no error checking is done on the X * extents of the menu IDs. this must be correctly setup by the programmer. X */ X X#define ID1_MBAR pMenuList[listMenubar]->firstMenuID X#define ID1_SUBM pMenuList[listSubmenu]->firstMenuID X X#define NUM_MBAR pMenuList[listMenubar]->numMenus X#define NUM_SUBM pMenuList[listSubmenu]->numMenus X X#define MHND_APPLE pMenuList[listMenubar]->mref[menuApple].mhnd X#define MHND_FILE pMenuList[listMenubar]->mref[menuFile].mhnd X#define MHND_EDIT pMenuList[listMenubar]->mref[menuEdit].mhnd X X#define MBARHND(x) pMenuList[listMenubar]->mref[(x)].mhnd X X#define MHND_WIZ pMenuList[listSubmenu]->mref[menuWizard].mhnd X X X/* mutually exclusive (and prioritized) menu bar states */ Xenum X{ X mbarDim, X mbarNoWindows, X mbarDA, X mbarNoMap, X mbarRegular, X mbarSpecial /* explore or debug mode */ X}; X X#define WKND_MAP (WIN_BASE_KIND + NHW_MAP) X X X/* menu routine error numbers */ Xenum X{ X errGetMenuList, X errGetMenu, X errGetANDlogTemplate, X errGetANDlogItems, X errGetANDialog, X errANNewMenu, X err_Menu_total X}; X X X/* menu 'STR#' comment char */ X#define mstrEndChar 0xA5 /* '\245' or option-* or "bullet" */ X X/* max key queue (from macwin.c) */ X#define QUEUE_LEN keyQueueLen Xextern const int keyQueueLen ; X X/* 'ALRT' */ Xenum X{ X alrt_Menu_start = 5000, X alrtMenuNote = alrt_Menu_start, X alrtMenu_NY, X alrt_Menu_limit X}; X X#define beepMenuAlertErr 1 /* # of SysBeep()'s before exitting */ Xenum X{ X bttnMenuAlertNo = 1, X bttnMenuAlertYes X}; X X/* askname menus */ Xenum X{ X menuANRole, X menuANSex, X menuANMode, X menuAN_total X}; X X X/******** Globals ********/ Xstatic unsigned char *menuErrStr[err_Menu_total] = X { X "\pAbort: Bad \'MNU#\' resource!", /* errGetMenuList */ X "\pAbort: Bad \'MENU\' resource!", /* errGetMenu */ X "\pAbort: Bad \'DLOG\' resource!", /* errGetANDlogTemplate */ X "\pAbort: Bad \'DITL\' resource!", /* errGetANDlogItems */ X "\pAbort: Bad Dialog Allocation!", /* errGetANDialog */ X "\pAbort: Bad Menu Allocation!", /* errANNewMenu */ X }; Xstatic menuListPtr pMenuList[2]; Xstatic short theMenubar = mbarDA; /* force initial update */ Xstatic short kAdjustWizardMenu = 1; X X X/******** Prototypes ********/ Xstatic void alignAD(Rect *, short); Xstatic void mustGetMenuAlerts(void); Xstatic void menuError(short); X Xextern void AddToKeyQueue ( int ch , Boolean force ) ; Xpascal void drawANUserItem(WindowPtr, short); X void DialogAskName(asknameRec *); X void InitMenuRes(void); X void AdjustMenus(short); X void DoMenuEvt(long); Xextern void WindowGoAway(EventRecord *, WindowPtr); X Xstatic void aboutNetHack(void); Xstatic void openMap(void); Xstatic void closeFrontWindow(void); Xstatic void optionEditor(void); Xstatic void askSave(void); Xstatic void askQuit(void); X X X/******** Routines ********/ Xstatic void XalignAD(Rect *pRct, short vExempt) X{ X (*pRct).right -= (*pRct).left; /* width */ X (*pRct).bottom -= (*pRct).top; /* height */ X (*pRct).left = (qd.screenBits.bounds.right - (*pRct).right) / 2; X (*pRct).top = (qd.screenBits.bounds.bottom - (*pRct).bottom - vExempt) / 2; X (*pRct).top += vExempt; X (*pRct).right += (*pRct).left; X (*pRct).bottom += (*pRct).top; X} X Xstatic void XmustGetMenuAlerts() X{ X short i, mbarHgt = GetMBarHeight(); X Rect **hRct; X X for (i = alrt_Menu_start; i < alrt_Menu_limit; i++) X { X if (! (hRct = (Rect **) GetResource('ALRT', i))) /* AlertTHndl */ X { X for (i = 0; i < beepMenuAlertErr; i++) X SysBeep(3); X ExitToShell(); X } X X alignAD(*hRct, mbarHgt); X } X} X Xstatic void XmenuError(short menuErr) X{ X short i; X X for (i = 0; i < beepMenuAlertErr; i++) X SysBeep(3); X X ParamText(menuErrStr[menuErr], "\p", "\p", "\p"); X (void) Alert(alrtMenuNote, (ModalFilterProcPtr) 0L); X X ExitToShell(); X} X Xpascal void XdrawANUserItem(WindowPtr wPtr, short uItm) X{ X asknameRec *pANR; X short iTyp; X Handle iHnd; X Rect iRct; X short whichUserItem; X X pANR = (asknameRec *) GetWRefCon(wPtr); X GetDItem((DialogPtr) wPtr, uItm, &iTyp, &iHnd, &iRct); X X switch (uItm) X { X case uitmANOutlineDefault: X PenSize(3, 3); X FrameRoundRect(&iRct, 16, 16); X break; X X case uitmANRole: X case uitmANSex: X case uitmANMode: X whichUserItem = uItm - uitmANRole; X X PenNormal(); X EraseRect(&iRct); X X /* drop shadow */ X iRct.right--; X iRct.bottom--; X MoveTo(iRct.right, (iRct.top + 1)); X LineTo(iRct.right, iRct.bottom); X LineTo((iRct.left + 1), iRct.bottom); X X /* frame */ X FrameRect(&iRct); X X /* menu character */ X MoveTo((iRct.left + 2), (iRct.top + 12)); X DrawChar(uitmChar[whichUserItem][(*pANR).anMenu[whichUserItem]]); X X /* popup symbol */ X MoveTo((iRct.left + 18), (iRct.top + 6)); X LineTo((iRct.left + 28), (iRct.top + 6)); X LineTo((iRct.left + 23), (iRct.top + 11)); X LineTo((iRct.left + 19), (iRct.top + 7)); X LineTo((iRct.left + 26), (iRct.top + 7)); X LineTo((iRct.left + 23), (iRct.top + 10)); X LineTo((iRct.left + 21), (iRct.top + 8)); X LineTo((iRct.left + 24), (iRct.top + 8)); X LineTo((iRct.left + 23), (iRct.top + 9)); X break; X } X} X X/* this routine manages the extended askname dialog */ Xvoid XDialogAskName(asknameRec *pANR) X{ X GrafPtr pOldPort; X DialogTHndl dTHnd; X Handle dIHnd; X DialogRecord dRec; X short i, iHit, iTyp; X Handle iHnd; X Rect iRct, iRct2; X MenuHandle mhndAskName[menuAN_total]; X short mbarHgt = GetMBarHeight(); X short ndxItem, menuEntry; X Point pt; X X if (! (dTHnd = (DialogTHndl) GetResource('DLOG', dlogAskName))) X menuError(errGetANDlogTemplate); X alignAD((Rect *) *dTHnd, mbarHgt); X X if (! (dIHnd = GetResource('DITL', dlogAskName))) X menuError(errGetANDlogItems); X X GetPort(&pOldPort); X /* to do: check if theWorld.hasColorQD ... */ X (void) GetNewDialog(dlogAskName, (Ptr) &dRec, (WindowPtr) 0L); X if (ResError() || MemError()) X menuError(errGetANDialog); X X SetWRefCon((WindowPtr) &dRec, (long) pANR); X for (i = 0; i < menuAN_total; i++) { X if (! (mhndAskName[i] = NewMenu((dlogAskName + i), "\pPopup"))) X menuError(errANNewMenu); X } X X /* role menu */ X for (i = 0; i < askn_role_end; i++) X AppendMenu(mhndAskName[menuANRole], * (Str255 *) nhRole[i]); X X /* sex menu */ X for (i = 0; i < 2; i++) X AppendMenu(mhndAskName[menuANSex], * (Str255 *) nhSex[i]); X X /* mode menu */ X for (i = 0; i < 3; i++) X AppendMenu(mhndAskName[menuANMode], * (Str255 *) nhMode[i]); X X /* insert the popup menus */ X for (i = 0; i < menuAN_total; i++) X InsertMenu(mhndAskName[i], hierMenu); X X for (i = uitmANOutlineDefault; i <= uitmANMode; i++) X { X GetDItem((DialogPtr)&dRec, i, &iTyp, &iHnd, &iRct); X SetDItem((DialogPtr)&dRec, i, iTyp, (Handle) drawANUserItem, &iRct); X } X { X short kind ; Handle item ; Rect area ; X Str32 pName ; X pName [ 0 ] = 0 ; X if ( plname && plname [ 0 ] ) { X strcpy ( ( char * ) pName , plname ) ; X c2pstr ( ( char * ) pName ) ; X } else { X Handle h ; X h = GetResource ( 'STR ' , -16096 ) ; X if ( ( (Handle) NULL != h ) && ( GetHandleSize ( h ) > 0 ) ) { X DetachResource ( h ) ; X HLock ( h ) ; X if ( * * h > 31 ) { X * * h = 31 ; X } X BlockMove ( * h , pName , * * h + 1 ) ; X DisposeHandle ( h ) ; X } X } X if ( pName [ 0 ] ) { X GetDItem ( ( WindowPtr ) & dRec , etxtANWho , & kind , & item , & area ) ; X SetIText ( item , pName ) ; X if ( pName [ 0 ] > 2 && pName [ pName [ 0 ] - 1 ] == '-' ) { X (*pANR).anMenu[anRole] = ( strchr ( (char *) uitmChar [ 0 ] , pName [ pName [ 0 ] ] ) - X (char *) uitmChar [ 0 ] ) ; X } X } X } X SelIText ( ( WindowPtr ) & dRec , etxtANWho , 0 , 32767 ) ; X X SetPort((GrafPtr) &dRec); X ShowWindow((WindowPtr) &dRec); X SelectWindow((WindowPtr) &dRec); X X iHit = bttnANQuit + 1; X while (iHit > bttnANQuit) X { X /* adjust the askname menus */ X { X static short checkFeatures = 1; X static short currRole = -1, currSex = -1; X unsigned char anCavePerson[2][16] = {{"\pCaveman"}, {"\pCavewoman"}}; X unsigned char anCleric[2][16] = {{"\pPriest"}, {"\pPriestess"}}; X X if (checkFeatures) X { X checkFeatures = 0; X X#ifndef TOURIST X DisableItem(mhndAskName[menuANRole], (asknTourist + 1)); X#endif X#ifndef WIZARD X DisableItem(mhndAskName[menuANMode], (asknDebug + 1)); X#endif X#ifndef EXPLORE_MODE X DisableItem(mhndAskName[menuANMode], (asknExplore + 1)); X#endif X } X X /* check role 1st, valkyrie forces female */ X if (currRole != (*pANR).anMenu[anRole]) X { X currRole = (*pANR).anMenu[anRole]; X X if ((*pANR).anMenu[anRole] == asknValkyrie) X { X (*pANR).anMenu[anSex] = asknFemale; X X GetDItem((DialogPtr) &dRec, uitmANSex, &iTyp, &iHnd, &iRct); X InvalRect(&iRct); X X /* disable male sex option */ X DisableItem(mhndAskName[menuANSex], (asknMale + 1)); X } X else X /* enable male sex option */ X EnableItem(mhndAskName[menuANSex], (asknMale + 1)); X } X X if (currSex != (*pANR).anMenu[anSex]) X { X currSex = (*pANR).anMenu[anSex]; X X SetItem(mhndAskName[menuANRole], (asknCaveman + 1), X * (Str255 *) anCavePerson[currSex]); X SetItem(mhndAskName[menuANRole], (asknPriest + 1), X * (Str255 *) anCleric[currSex]); X } X } X X ModalDialog((ModalFilterProcPtr) 0L, &iHit); X X switch (iHit) X { X case bttnANPlay: /* done! let's play */ X break; X X case bttnANQuit: X (*pANR).anMenu[anMode] = asknQuit; X break; X X case uitmANRole: X case uitmANSex: X case uitmANMode: X ndxItem = iHit - uitmANRole; X X /* invert the popup title */ X GetDItem((DialogPtr) &dRec, (iHit + 3), &iTyp, &iHnd, &iRct2); X InvertRect(&iRct2); X X /* get the menu item */ X GetDItem((DialogPtr) &dRec, iHit, &iTyp, &iHnd, &iRct); X pt = * (Point *) &iRct; X LocalToGlobal(&pt); X if (menuEntry = PopUpMenuSelect(mhndAskName[ndxItem], X pt.v, pt.h, ((*pANR).anMenu[ndxItem] + 1))) X /* set last item selected */ X (*pANR).anMenu[ndxItem] = LoWord(menuEntry) - 1; X X InvertRect(&iRct2); X InvalRect(&iRct); X break; X X case etxtANWho: X /* limit the data here to 25 chars */ X { X short beepTEDelete = 1; X X while ((**dRec.textH).teLength > 25) X { X if (beepTEDelete++ <= 3) X SysBeep(3); X TEKey('\b', dRec.textH); X } X } X X /* special case filter (that doesn't plug all the holes!) */ X if (((**dRec.textH).teLength == 1) && (**((**dRec.textH).hText) < 32)) X TEKey('\b', dRec.textH); X X /* if no name then disable the play button */ X GetDItem((DialogPtr) &dRec, bttnANPlay, &iTyp, &iHnd, &iRct); X if ((**dRec.textH).teLength > 0) X iTyp &= ~itemDisable; X else X iTyp |= itemDisable; X HiliteControl((ControlHandle) iHnd, ((iTyp & itemDisable) ? 255 : 0)); X SetDItem((DialogPtr) &dRec, bttnANPlay, iTyp, iHnd, &iRct); X break; X } X } X X if ((*pANR).anMenu[anMode] != asknQuit) { X/* X * This is a good example of how NOT to get text from a dialog X * X * HLock((Handle) (**dRec.textH).hText); X * BlockMove(*((**dRec.textH).hText), &((*pANR).anWho[1]), (**dRec.textH).teLength); X * (*pANR).anWho[0] = (**dRec.textH).teLength; X * HUnlock((Handle) (**dRec.textH).hText); X */ X short kind ; Rect outline ; Handle item ; X Str32 pName ; X X GetDItem ( ( WindowPtr ) & dRec , etxtANWho , & kind , & item , & outline ) ; X GetIText ( item , ( * pANR ) . anWho ) ; X BlockMove ( pANR -> anWho , pName , pANR -> anWho [ 0 ] + 1 ) ; X if ( pName [ 0 ] > 2 && pName [ pName [ 0 ] - 1 ] == '-' ) { X (*pANR).anMenu[anRole] = ( strchr ( (char *) uitmChar [ 0 ] , pName [ pName [ 0 ] ] ) - X (char *) uitmChar [ 0 ] ) ; X } X } X X /* cleanup (in reverse order) and leave */ X for (i = 0; i < menuAN_total; i++) X { X DeleteMenu(dlogAskName + i); X DisposeMenu(mhndAskName[i]); X } X CloseDialog((DialogPtr)&dRec); X DisposHandle(dRec.items); X ReleaseResource(dIHnd); X ReleaseResource((Handle) dTHnd); X SetPort(pOldPort); X} X Xvoid XInitMenuRes() X{ Xstatic Boolean was_inited = 0 ; Xshort i, j; XmenuListHandle mlHnd; XMenuHandle mHnd; X X if ( was_inited ) { X return ; X } X was_inited = 1 ; X X mustGetMenuAlerts(); X X for (i = listMenubar; i <= listSubmenu; i++) X { X if (! (mlHnd = (menuListHandle) GetResource('MNU#', (menuBarListID + i)))) X menuError(errGetMenuList); X X pMenuList[i] = *mlHnd; X X for (j = 0; j < (**mlHnd).numMenus; j++) X { X if (! (mHnd = (MenuHandle) GetMenu((**mlHnd).mref[j].mresID))) { X Str31 d ; X NumToString ( (**mlHnd).mref[j].mresID , d ) ; X// DebugStr ( d ) ; X menuError(errGetMenu); X } X X (**mlHnd).mref[j].mhnd = mHnd; X * ((short *) *mHnd) = j + (**mlHnd).firstMenuID; /* consecutive IDs */ X X /* expand apple menu */ X if ((i == listMenubar) && (j == menuApple)) { X AddResMenu(mHnd, 'DRVR'); X } X X InsertMenu(mHnd, ((i == listSubmenu) ? hierMenu : 0)); X } X } X X DrawMenuBar(); X} X Xvoid XAdjustMenus(short dimMenubar) X{ Xshort newMenubar = mbarRegular; XWindowPeek peekWindow = (WindowPeek) FrontWindow(); Xshort i; X X/* X * if ( windowprocs != mac_procs ) { X * return ; X * } X */ X /* determine the new menubar state */ X if (dimMenubar) { X newMenubar = mbarDim; X } else if (! peekWindow) { X newMenubar = mbarNoWindows; X } else if (peekWindow->windowKind < 0) { X newMenubar = mbarDA; X } else { X while (peekWindow && (peekWindow->windowKind != WKND_MAP)) { X peekWindow = peekWindow->nextWindow; X } X if ((! peekWindow) || (! peekWindow->visible)) { X newMenubar = mbarNoMap; X } X } X X if (newMenubar != mbarRegular) X ; /* we've already found its state */ X#ifdef WIZARD X else if (wizard) X { X newMenubar = mbarSpecial; X X if (kAdjustWizardMenu) X { X kAdjustWizardMenu = 0; X X SetItem(MHND_FILE, menuFilePlayMode, "\pDebug"); X } X } X#endif X X#ifdef EXPLORE_MODE X else if (discover) X { X newMenubar = mbarSpecial; X X if (kAdjustWizardMenu) X { X kAdjustWizardMenu = 0; X X SetItem(MHND_FILE, menuFilePlayMode, "\pExplore"); X X for (i = CountMItems(MHND_WIZ); i > menuWizardAttributes; i--) X DelMenuItem(MHND_WIZ, i); X } X } X#endif X X /* adjust the menubar, if there's a state change */ X if (theMenubar != newMenubar) X { X switch(theMenubar = newMenubar) X { X case mbarDim: X /* disable all menus (except the apple menu) */ X for (i = menuFile; i < NUM_MBAR; i++) X DisableItem(MBARHND(i), 0); X break; X X case mbarNoWindows: X case mbarDA: X case mbarNoMap: X /* enable the file menu, but ... */ X EnableItem(MHND_FILE, 0); X X if (theMenubar == mbarDA) X DisableItem(MHND_FILE, menuFileOpenMap); X else X EnableItem(MHND_FILE, menuFileOpenMap); X X /* ... disable the window commands! */ X for (i = menuFileRedraw; i <= menuFileEnterExplore; i++) X DisableItem(MHND_FILE, i); X X if (theMenubar != mbarNoWindows) X EnableItem(MHND_FILE, menuFileClose); X X /* ... and disable the rest of the menus */ X for (i = menuEdit; i < NUM_MBAR; i++) X DisableItem(MBARHND(i), 0); X X if (theMenubar == mbarDA) X EnableItem(MHND_EDIT, 0); X X break; X X case mbarRegular: X case mbarSpecial: X /* enable all menus ... */ X for (i = menuFile; i < NUM_MBAR; i++) X EnableItem(MBARHND(i), 0); X X /* ... except the unused Edit menu */ X DisableItem(MHND_EDIT, 0); X X /* ... the map is already open! */ X DisableItem(MHND_FILE, menuFileOpenMap); X X /* ... enable the window commands */ X for (i = menuFileRedraw; i <= menuFileEnterExplore; i++) X EnableItem(MHND_FILE, i); X X if (theMenubar == mbarRegular) X DisableItem(MHND_FILE, menuFilePlayMode); X else X DisableItem(MHND_FILE, menuFileEnterExplore); X X break; X } X X DrawMenuBar(); X } X} X Xvoid XDoMenuEvt(long menuEntry) X{ X short menuID = HiWord(menuEntry); X short menuItem = LoWord(menuEntry); X X switch(menuID - ID1_MBAR) /* all submenus are default case */ X { X case menuApple: X if (menuItem == menuAppleAboutBox) X aboutNetHack(); X else X { X unsigned char daName[32]; X X GetItem(MHND_APPLE, menuItem, * (Str255 *) daName); X (void) OpenDeskAcc(daName); X } X break; X X /* X * Those direct calls are ugly: they should be installed into cmd.c . X * Those AddToKeyQueue() calls are also ugly: they should be put into X * the 'STR#' resource. X */ X case menuFile: X switch(menuItem) X { X case menuFileOpenMap: X openMap(); X break; X X case menuFileRedraw: X AddToKeyQueue ( 'R' & 0x1f , 1 ) ; X break; X X case menuFilePrevMsg: X AddToKeyQueue ( 'P' & 0x1f , 1 ) ; X break; X X case menuFileCleanup: X (void) SanePositions(); X break; X X case menuFileClose: X closeFrontWindow(); X break; X X case menuFileEnterExplore: X AddToKeyQueue ( 'X' , 1 ) ; X break; X X case menuFileOptionEdit: X optionEditor(); X break; X X case menuFileSave: X askSave(); X break; X X case menuFileQuit: X askQuit(); X break; X } X break; X X case menuEdit: X (void) SystemEdit(menuItem - 1); X break; X X default: /* get associated string and add to key queue */ X { X Str255 mstr; X short i; X X GetIndString(mstr, menuID, menuItem); X if (mstr[0] > QUEUE_LEN) X mstr[0] = QUEUE_LEN; X X for (i = 1; ((i <= mstr[0]) && (mstr[i] != mstrEndChar)); i++) X AddToKeyQueue(mstr[i], false); X } X break; X } X X HiliteMenu(0); X} X X Xstatic void XaboutNetHack() { X if (theMenubar >= mbarRegular) { X (void) doversion(); /* is this necessary? */ X } else { X unsigned char aboutStr[32] = "\pNetHack 3.1."; X X if (PATCHLEVEL > 10) { X aboutStr[++aboutStr[0]] = '0'+PATCHLEVEL/10; X } X X aboutStr[++aboutStr[0]] = '0' + (PATCHLEVEL % 10); X X ParamText(aboutStr, "\p\rnethack-bugs@linc.cis.upenn.edu", "\p", "\p"); X (void) Alert(alrtMenuNote, (ModalFilterProcPtr) 0L); X ResetAlrtStage(); X } X} X Xstatic void XopenMap() X{ X WindowPeek peekWindow = *(WindowPeek*) WindowList; X X while (peekWindow && (peekWindow->windowKind != WKND_MAP)) X peekWindow = peekWindow->nextWindow; X X if (! peekWindow) X return; /* impossible? */ X X ShowWindow((WindowPtr) peekWindow); X SelectWindow((WindowPtr) peekWindow); X} X Xstatic void XcloseFrontWindow() X{ X WindowPeek peekWindow = (WindowPeek) FrontWindow(); X X if (! peekWindow) X return; /* impossible? */ X else if (peekWindow->windowKind < 0) X CloseDeskAcc(peekWindow->windowKind); X else if (peekWindow->windowKind == WKND_MAP) X HideWindow((WindowPtr) peekWindow); X else X WindowGoAway((EventRecord *) 0L, (WindowPtr) peekWindow); X} X Xstatic void XoptionEditor() X{ X ParamText("\pSorry, not yet implemented! Use Options on the Help menu.", "\p", "\p", "\p"); X (void) Alert(alrtMenuNote, (ModalFilterProcPtr) 0L); X ResetAlrtStage(); X} X Xstatic void XaskSave() { XBoolean doSave = 1 ; XBoolean doYes = 0 ; X X if (theMenubar < mbarRegular) { X short itemHit; X X ParamText("\pReally Save?", "\p", "\p", "\p"); X itemHit = Alert(alrtMenu_NY, (ModalFilterProcPtr) 0L); X ResetAlrtStage(); X X if (itemHit != bttnMenuAlertYes) { X doSave = 0 ; X } else { X doYes = 1 ; X } X } X if ( doSave ) { X AddToKeyQueue ( 'S' , 1 ) ; X if ( doYes ) { X AddToKeyQueue ( 'y' , 1 ) ; X } X } X} X Xstatic void XaskQuit() { XBoolean doQuit = 1 ; XBoolean doYes = 0 ; X X if (theMenubar < mbarRegular) { X short itemHit; X X ParamText("\pReally Quit?", "\p", "\p", "\p"); X itemHit = Alert(alrtMenu_NY, (ModalFilterProcPtr) 0L); X ResetAlrtStage(); X X if (itemHit != bttnMenuAlertYes) { X doQuit = 0 ; X } else { X doYes = 1 ; X } X } X if ( doQuit ) { X AddToKeyQueue ( 'Q' , 1 ) ; X if ( doYes ) { X AddToKeyQueue ( 'y' , 1 ) ; X } X } X} END_OF_FILE if test 23678 -ne `wc -c <'sys/mac/macmenu.c'`; then echo shar: \"'sys/mac/macmenu.c'\" unpacked with wrong size! fi # end of 'sys/mac/macmenu.c' if test -f 'sys/share/dgn_yacc.c' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'sys/share/dgn_yacc.c'\" to \"'sys/share/dgn_yacc.c.orig'\" mv -f 'sys/share/dgn_yacc.c' 'sys/share/dgn_yacc.c.orig' fi echo shar: Extracting \"'sys/share/dgn_yacc.c'\" \(30875 characters\) sed "s/^X//" >'sys/share/dgn_yacc.c' <<'END_OF_FILE' X#ifndef lint Xstatic char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; X#endif X#define YYBYACC 1 X#define YYMAJOR 1 X#define YYMINOR 9 X#define yyclearin (yychar=(-1)) X#define yyerrok (yyerrflag=0) X#define YYRECOVERING (yyerrflag!=0) X#define YYPREFIX "yy" X/* SCCS Id: @(#)dgn_comp.c 3.1 93/05/15 */ X/* Copyright (c) 1989 by Jean-Christophe Collet */ X/* Copyright (c) 1990 by M. Stephenson */ X/* NetHack may be freely redistributed. See license for details. */ X X/* X * This file contains the Dungeon Compiler code X */ X X/* In case we're using bison in AIX. This definition must be X * placed before any other C-language construct in the file X * excluding comments and preprocessor directives (thanks IBM X * for this wonderful feature...). X * X * Note: some cpps barf on this 'undefined control' (#pragma). X * Addition of the leading space seems to prevent barfage for now, X * and AIX will still see the directive in its non-standard locale. X */ X X#ifdef _AIX X #pragma alloca /* keep leading space! */ X#endif X X#include "config.h" X#include "dgn_file.h" X Xvoid FDECL(yyerror, (const char *)); Xvoid FDECL(yywarning, (const char *)); Xint NDECL(yylex); Xint NDECL(yyparse); Xint FDECL(getchain, (char *)); Xint NDECL(check_dungeon); Xint NDECL(check_branch); Xint NDECL(check_level); Xvoid NDECL(init_dungeon); Xvoid NDECL(init_branch); Xvoid NDECL(init_level); Xvoid NDECL(output_dgn); X X#ifdef AMIGA X# undef printf X#ifndef LATTICE X# define memset(addr,val,len) setmem(addr,len,val) X#endif X#endif X X#ifdef MICRO X# undef exit Xextern void FDECL(exit, (int)); X#endif X X#undef NULL X X#define ERR (-1) X Xstatic struct couple couple; Xstatic struct tmpdungeon tmpdungeon[MAXDUNGEON]; Xstatic struct tmplevel tmplevel[LEV_LIMIT]; Xstatic struct tmpbranch tmpbranch[BRANCH_LIMIT]; X Xstatic int in_dungeon = 0, n_dgns = -1, n_levs = -1, n_brs = -1; X Xextern int fatal_error; Xextern const char *fname; X Xtypedef union X{ X int i; X char* str; X} YYSTYPE; X#define INTEGER 257 X#define A_DUNGEON 258 X#define BRANCH 259 X#define CHBRANCH 260 X#define LEVEL 261 X#define RNDLEVEL 262 X#define CHLEVEL 263 X#define RNDCHLEVEL 264 X#define UP_OR_DOWN 265 X#define PROTOFILE 266 X#define DESCRIPTION 267 X#define DESCRIPTOR 268 X#define LEVELDESC 269 X#define ALIGNMENT 270 X#define LEVALIGN 271 X#define ENTRY 272 X#define STAIR 273 X#define NO_UP 274 X#define NO_DOWN 275 X#define PORTAL 276 X#define STRING 277 X#define YYERRCODE 256 Xshort yylhs[] = { -1, X 0, 0, 4, 4, 5, 5, 5, 5, 6, 1, X 1, 7, 7, 7, 11, 12, 14, 14, 13, 9, X 9, 9, 9, 9, 15, 15, 16, 16, 17, 17, X 18, 18, 19, 19, 8, 8, 21, 22, 3, 3, X 3, 3, 3, 2, 2, 20, 10, X}; Xshort yylen[] = { 2, X 0, 1, 1, 2, 1, 1, 1, 1, 6, 0, X 1, 1, 1, 1, 3, 1, 3, 3, 3, 1, X 1, 1, 1, 1, 6, 7, 7, 8, 3, 3, X 7, 8, 8, 9, 1, 1, 7, 8, 0, 1, X 1, 1, 1, 0, 1, 5, 5, X}; Xshort yydefred[] = { 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 3, 5, 6, 7, 8, X 12, 13, 14, 16, 20, 21, 22, 23, 24, 35, X 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, X 0, 0, 19, 17, 29, 18, 30, 15, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 11, 9, 0, 40, 41, X 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, X 45, 37, 0, 27, 0, 0, 0, 0, 0, 38, X 28, 33, 0, 47, 46, 34, X}; Xshort yydgoto[] = { 14, X 77, 92, 83, 15, 16, 17, 18, 19, 20, 67, X 21, 22, 23, 24, 25, 26, 27, 28, 29, 69, X 30, 31, X}; Xshort yysindex[] = { -237, X -50, -49, -48, -47, -46, -45, -44, -43, -39, -38, X -30, -22, -21, 0, -237, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, -239, -238, -236, -235, -234, -233, -232, -230, -228, X -220, -219, -218, -206, 0, -225, -11, -223, -222, -221, X -217, -215, 0, 0, 0, 0, 0, 0, 17, 18, X 20, -5, 2, -213, -212, -190, -189, -188, -271, 17, X 18, 18, 27, 28, 29, 0, 0, 30, 0, 0, X 0, 0, -193, -271, -182, -180, 17, 17, -179, -178, X 0, 0, -193, 0, -177, -176, -175, 42, 43, 0, X 0, 0, -172, 0, 0, 0, X}; Xshort yyrindex[] = { 86, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 16, 0, 1, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 31, 1, 46, 0, 0, 0, 0, 0, X 0, 0, 31, 0, 61, 76, 0, 0, 0, 0, X 0, 0, 91, 0, 0, 0, X}; Xshort yygindex[] = { 0, X 0, -4, 4, 0, 75, 0, 0, 0, 0, -70, X 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, X 0, 0, X}; X#define YYTABLESIZE 363 Xshort yytable[] = { 84, X 39, 79, 80, 81, 82, 85, 86, 32, 33, 34, X 35, 36, 37, 38, 39, 10, 96, 97, 40, 41, X 1, 2, 3, 4, 5, 6, 7, 42, 8, 9, X 44, 10, 11, 12, 13, 43, 44, 46, 47, 54, X 48, 49, 50, 51, 52, 25, 53, 55, 56, 57, X 58, 59, 60, 61, 62, 63, 66, 68, 71, 64, X 26, 65, 70, 73, 74, 72, 75, 76, 78, 87, X 88, 91, 89, 90, 94, 31, 95, 98, 99, 101, X 102, 103, 104, 105, 106, 1, 2, 93, 100, 45, X 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, X 39, 39, 39, 39, 39, 39, 39, 39, 0, 39, X 39, 39, 39, 10, 10, 10, 10, 10, 10, 10, X 0, 10, 10, 0, 10, 10, 10, 10, 44, 44, X 44, 44, 44, 44, 44, 0, 44, 44, 0, 44, X 44, 44, 44, 25, 25, 25, 25, 25, 25, 25, X 0, 25, 25, 0, 25, 25, 25, 25, 26, 26, X 26, 26, 26, 26, 26, 0, 26, 26, 0, 26, X 26, 26, 26, 31, 31, 31, 31, 31, 31, 31, X 0, 31, 31, 0, 31, 31, 31, 31, 32, 32, X 32, 32, 32, 32, 32, 0, 32, 32, 0, 32, X 32, 32, 32, X}; Xshort yycheck[] = { 70, X 0, 273, 274, 275, 276, 71, 72, 58, 58, 58, X 58, 58, 58, 58, 58, 0, 87, 88, 58, 58, X 258, 259, 260, 261, 262, 263, 264, 58, 266, 267, X 0, 269, 270, 271, 272, 58, 58, 277, 277, 268, X 277, 277, 277, 277, 277, 0, 277, 268, 268, 268, X 257, 277, 64, 277, 277, 277, 40, 40, 64, 277, X 0, 277, 43, 277, 277, 64, 257, 257, 257, 43, X 43, 265, 44, 44, 257, 0, 257, 257, 257, 257, X 257, 257, 41, 41, 257, 0, 0, 84, 93, 15, X 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, X -1, -1, -1, -1, -1, -1, -1, -1, 258, 259, X 260, 261, 262, 263, 264, 265, 266, 267, -1, 269, X 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, X -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, X 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, X 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, X -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, X 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, X 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, X -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, X 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, X 270, 271, 272, X}; X#define YYFINAL 14 X#ifndef YYDEBUG X#define YYDEBUG 0 X#endif X#define YYMAXTOKEN 277 X#if YYDEBUG Xchar *yyname[] = { X"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, X0,0,0,0,0,0,"'('","')'",0,"'+'","','",0,0,0,0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0, X"'@'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, X0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, X0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, X0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, X0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"INTEGER", X"A_DUNGEON","BRANCH","CHBRANCH","LEVEL","RNDLEVEL","CHLEVEL","RNDCHLEVEL", X"UP_OR_DOWN","PROTOFILE","DESCRIPTION","DESCRIPTOR","LEVELDESC","ALIGNMENT", X"LEVALIGN","ENTRY","STAIR","NO_UP","NO_DOWN","PORTAL","STRING", X}; Xchar *yyrule[] = { X"$accept : file", X"file :", X"file : dungeons", X"dungeons : dungeon", X"dungeons : dungeons dungeon", X"dungeon : dungeonline", X"dungeon : dungeondesc", X"dungeon : branches", X"dungeon : levels", X"dungeonline : A_DUNGEON ':' STRING STRING rcouple optional_int", X"optional_int :", X"optional_int : INTEGER", X"dungeondesc : entry", X"dungeondesc : descriptions", X"dungeondesc : prototype", X"entry : ENTRY ':' INTEGER", X"descriptions : desc", X"desc : DESCRIPTION ':' DESCRIPTOR", X"desc : ALIGNMENT ':' DESCRIPTOR", X"prototype : PROTOFILE ':' STRING", X"levels : level1", X"levels : level2", X"levels : levdesc", X"levels : chlevel1", X"levels : chlevel2", X"level1 : LEVEL ':' STRING STRING '@' acouple", X"level1 : RNDLEVEL ':' STRING STRING '@' acouple INTEGER", X"level2 : LEVEL ':' STRING STRING '@' acouple INTEGER", X"level2 : RNDLEVEL ':' STRING STRING '@' acouple INTEGER INTEGER", X"levdesc : LEVELDESC ':' DESCRIPTOR", X"levdesc : LEVALIGN ':' DESCRIPTOR", X"chlevel1 : CHLEVEL ':' STRING STRING STRING '+' rcouple", X"chlevel1 : RNDCHLEVEL ':' STRING STRING STRING '+' rcouple INTEGER", X"chlevel2 : CHLEVEL ':' STRING STRING STRING '+' rcouple INTEGER", X"chlevel2 : RNDCHLEVEL ':' STRING STRING STRING '+' rcouple INTEGER INTEGER", X"branches : branch", X"branches : chbranch", X"branch : BRANCH ':' STRING '@' acouple branch_type direction", X"chbranch : CHBRANCH ':' STRING STRING '+' rcouple branch_type direction", X"branch_type :", X"branch_type : STAIR", X"branch_type : NO_UP", X"branch_type : NO_DOWN", X"branch_type : PORTAL", X"direction :", X"direction : UP_OR_DOWN", X"acouple : '(' INTEGER ',' INTEGER ')'", X"rcouple : '(' INTEGER ',' INTEGER ')'", X}; X#endif X#ifdef YYSTACKSIZE X#undef YYMAXDEPTH X#define YYMAXDEPTH YYSTACKSIZE X#else X#ifdef YYMAXDEPTH X#define YYSTACKSIZE YYMAXDEPTH X#else X#define YYSTACKSIZE 500 X#define YYMAXDEPTH 500 X#endif X#endif Xint yydebug; Xint yynerrs; Xint yyerrflag; Xint yychar; Xshort *yyssp; XYYSTYPE *yyvsp; XYYSTYPE yyval; XYYSTYPE yylval; Xshort yyss[YYSTACKSIZE]; XYYSTYPE yyvs[YYSTACKSIZE]; X#define yystacksize YYSTACKSIZE X Xvoid Xinit_dungeon() X{ X if(++n_dgns > MAXDUNGEON) { X fprintf(stderr, "FATAL - Too many dungeons (limit: %d).\n", X MAXDUNGEON); X fprintf(stderr, "To increase the limit edit MAXDUNGEON in global.h\n"); X exit(1); X } X X in_dungeon = 1; X tmpdungeon[n_dgns].lev.base = 0; X tmpdungeon[n_dgns].lev.rand = 0; X tmpdungeon[n_dgns].chance = 100; X strcpy(tmpdungeon[n_dgns].name, ""); X strcpy(tmpdungeon[n_dgns].protoname, ""); X tmpdungeon[n_dgns].flags = 0; X tmpdungeon[n_dgns].levels = 0; X tmpdungeon[n_dgns].branches = 0; X tmpdungeon[n_dgns].entry_lev = 0; X} X Xvoid Xinit_level() X{ X if(++n_levs > LEV_LIMIT) { X X yyerror("FATAL - Too many special levels defined."); X exit(1); X } X tmplevel[n_levs].lev.base = 0; X tmplevel[n_levs].lev.rand = 0; X tmplevel[n_levs].chance = 100; X tmplevel[n_levs].rndlevs = 0; X tmplevel[n_levs].flags = 0; X strcpy(tmplevel[n_levs].name, ""); X tmplevel[n_levs].chain = -1; X} X Xvoid Xinit_branch() X{ X if(++n_brs > BRANCH_LIMIT) { X X yyerror("FATAL - Too many special levels defined."); X exit(1); X } X tmpbranch[n_brs].lev.base = 0; X tmpbranch[n_brs].lev.rand = 0; X strcpy(tmpbranch[n_brs].name, ""); X tmpbranch[n_brs].chain = -1; X} X Xint Xgetchain(s) X char *s; X{ X int i; X X if(strlen(s)) { X X for(i = n_levs - tmpdungeon[n_dgns].levels + 1; i <= n_levs; i++) X if(!strcmp(tmplevel[i].name, s)) return i; X X yyerror("Can't locate the specified chain level."); X return(-2); X } X return(-1); X} X X/* X * Consistancy checking routines: X * X * - A dungeon must have a unique name. X * - A dungeon must have a originating "branch" command X * (except, of course, for the first dungeon). X * - A dungeon must have a proper depth (at least (1, 0)). X */ X Xint Xcheck_dungeon() X{ X int i; X X for(i = 0; i < n_dgns; i++) X if(!strcmp(tmpdungeon[i].name, tmpdungeon[n_dgns].name)) { X yyerror("Duplicate dungeon name."); X return(0); X } X X if(n_dgns) X for(i = 0; i < n_brs - tmpdungeon[n_dgns].branches; i++) { X if(!strcmp(tmpbranch[i].name, tmpdungeon[n_dgns].name)) break; X X if(i >= n_brs - tmpdungeon[n_dgns].branches) { X yyerror("Dungeon cannot be reached."); X return(0); X } X } X X if(tmpdungeon[n_dgns].lev.base <= 0 || X tmpdungeon[n_dgns].lev.rand < 0) { X yyerror("Invalid dungeon depth specified."); X return(0); X } X return(1); /* OK */ X} X X/* X * - A level must have a unique level name. X * - If chained, the level used as reference for the chain X * must be in this dungeon, must be previously defined, and X * the level chained from must be "non-probabalistic" (ie. X * have a 100% chance of existing). X */ X Xint Xcheck_level() X{ X int i; X X if(!in_dungeon) { X yyerror("Level defined outside of dungeon."); X return(0); X } X X for(i = 0; i < n_levs; i++) X if(!strcmp(tmplevel[i].name, tmplevel[n_levs].name)) { X yyerror("Duplicate level name."); X return(0); X } X X if(tmplevel[i].chain == -2) { X yyerror("Invaild level chain reference."); X return(0); X } else if(tmplevel[i].chain != -1) { /* there is a chain */ X if(tmplevel[tmpbranch[i].chain].chance != 100) { X yyerror("Level cannot chain from a probabalistic level."); X return(0); X } else if(tmplevel[i].chain == n_levs) { X yyerror("A level cannot chain to itself!"); X return(0); X } X } X return(1); /* OK */ X} X X/* X * - A branch may not branch backwards - to avoid branch loops. X * - A branch name must be unique. X * (ie. You can only have one entry point to each dungeon). X * - If chained, the level used as reference for the chain X * must be in this dungeon, must be previously defined, and X * the level chained from must be "non-probabalistic" (ie. X * have a 100% chance of existing). X */ X Xint Xcheck_branch() X{ X int i; X X if(!in_dungeon) { X yyerror("Branch defined outside of dungeon."); X return(0); X } X X for(i = 0; i < n_dgns; i++) X if(!strcmp(tmpdungeon[i].name, tmpbranch[n_brs].name)) { X X yyerror("Reverse branching not allowed."); X return(0); X } X X if(tmpbranch[i].chain == -2) { X X yyerror("Invaild branch chain reference."); X return(0); X } else if(tmpbranch[i].chain != -1) { /* it is chained */ X X if(tmplevel[tmpbranch[i].chain].chance != 100) { X yyerror("Branch cannot chain from a probabalistic level."); X return(0); X } X } X return(1); /* OK */ X} X X/* X * Output the dungon definition into a file. X * X * The file will have the following format: X * X * [ number of dungeons ] X * [ first dungeon struct ] X * [ levels for the first dungeon ] X * ... X * [ branches for the first dungeon ] X * ... X * [ second dungeon struct ] X * ... X */ X Xvoid Xoutput_dgn() X{ X int nd, cl = 0, nl = 0, X cb = 0, nb = 0; X X if(++n_dgns <= 0) { X X yyerror("FATAL - no dungeons were defined."); X exit(1); X } X X fwrite((char *)(&n_dgns), sizeof(int), 1, stdout); X for(nd = 0; nd < n_dgns; nd++) { X X fwrite((char *)&tmpdungeon[nd], sizeof(struct tmpdungeon), 1, X stdout); X X nl += tmpdungeon[nd].levels; X for(; cl < nl; cl++) X fwrite((char *)&tmplevel[cl], sizeof(struct tmplevel), 1, X stdout); X X nb += tmpdungeon[nd].branches; X for(; cb < nb; cb++) X fwrite((char *)&tmpbranch[cb], sizeof(struct tmpbranch), 1, X stdout); X } X} X#define YYABORT goto yyabort X#define YYREJECT goto yyabort X#define YYACCEPT goto yyaccept X#define YYERROR goto yyerrlab Xint Xyyparse() X{ X register int yym, yyn, yystate; X#if YYDEBUG X register char *yys; X extern char *getenv(); X X if ((yys = getenv("YYDEBUG")) != 0) X { X yyn = *yys; X if (yyn >= '0' && yyn <= '9') X yydebug = yyn - '0'; X } X#endif X X yynerrs = 0; X yyerrflag = 0; X yychar = (-1); X X yyssp = yyss; X yyvsp = yyvs; X *yyssp = yystate = 0; X Xyyloop: X if ((yyn = yydefred[yystate]) != 0) goto yyreduce; X if (yychar < 0) X { X if ((yychar = yylex()) < 0) yychar = 0; X#if YYDEBUG X if (yydebug) X { X yys = 0; X if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; X if (!yys) yys = "illegal-symbol"; X printf("%sdebug: state %d, reading %d (%s)\n", X YYPREFIX, yystate, yychar, yys); X } X#endif X } X if ((yyn = yysindex[yystate]) != 0 && (yyn += yychar) >= 0 && X yyn <= YYTABLESIZE && yycheck[yyn] == yychar) X { X#if YYDEBUG X if (yydebug) X printf("%sdebug: state %d, shifting to state %d\n", X YYPREFIX, yystate, yytable[yyn]); X#endif X if (yyssp >= yyss + yystacksize - 1) X { X goto yyoverflow; X } X *++yyssp = yystate = yytable[yyn]; X *++yyvsp = yylval; X yychar = (-1); X if (yyerrflag > 0) --yyerrflag; X goto yyloop; X } X if ((yyn = yyrindex[yystate]) != 0 && (yyn += yychar) >= 0 && X yyn <= YYTABLESIZE && yycheck[yyn] == yychar) X { X yyn = yytable[yyn]; X goto yyreduce; X } X if (yyerrflag) goto yyinrecovery; X#ifdef lint X goto yynewerror; X#endif Xyynewerror: X yyerror("syntax error"); X#ifdef lint X goto yyerrlab; X#endif Xyyerrlab: X ++yynerrs; Xyyinrecovery: X if (yyerrflag < 3) X { X yyerrflag = 3; X for (;;) X { X if ((yyn = yysindex[*yyssp]) != 0 && (yyn += YYERRCODE) >= 0 && X yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) X { X#if YYDEBUG X if (yydebug) X printf("%sdebug: state %d, error recovery shifting\ X to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); X#endif X if (yyssp >= yyss + yystacksize - 1) X { X goto yyoverflow; X } X *++yyssp = yystate = yytable[yyn]; X *++yyvsp = yylval; X goto yyloop; X } X else X { X#if YYDEBUG X if (yydebug) X printf("%sdebug: error recovery discarding state %d\n", X YYPREFIX, *yyssp); X#endif X if (yyssp <= yyss) goto yyabort; X --yyssp; X --yyvsp; X } X } X } X else X { X if (yychar == 0) goto yyabort; X#if YYDEBUG X if (yydebug) X { X yys = 0; X if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; X if (!yys) yys = "illegal-symbol"; X printf("%sdebug: state %d, error recovery discards token %d (%s)\n", X YYPREFIX, yystate, yychar, yys); X } X#endif X yychar = (-1); X goto yyloop; X } Xyyreduce: X#if YYDEBUG X if (yydebug) X printf("%sdebug: state %d, reducing by rule %d (%s)\n", X YYPREFIX, yystate, yyn, yyrule[yyn]); X#endif X yym = yylen[yyn]; X yyval = yyvsp[1-yym]; X switch (yyn) X { Xcase 2: X{ X output_dgn(); X } Xbreak; Xcase 9: X{ X init_dungeon(); X strcpy(tmpdungeon[n_dgns].name, yyvsp[-3].str); X if (!strcmp(yyvsp[-2].str, "none")) X tmpdungeon[n_levs].boneschar = '\0'; X else if (yyvsp[-2].str[1]) X yyerror("Bones marker must be a single char, or \"none\"!"); X else X tmpdungeon[n_dgns].boneschar = yyvsp[-2].str[0]; X tmpdungeon[n_dgns].lev.base = couple.base; X tmpdungeon[n_dgns].lev.rand = couple.rand; X tmpdungeon[n_dgns].chance = yyvsp[0].i; X } Xbreak; Xcase 10: X{ X yyval.i = 0; X } Xbreak; Xcase 11: X{ X yyval.i = yyvsp[0].i; X } Xbreak; Xcase 15: X{ X tmpdungeon[n_dgns].entry_lev = yyvsp[0].i; X } Xbreak; Xcase 17: X{ X if(yyvsp[0].i <= TOWN || yyvsp[0].i >= D_ALIGN_CHAOTIC) X yyerror("Illegal description - ignoring!"); X else X tmpdungeon[n_dgns].flags |= yyvsp[0].i ; X } Xbreak; Xcase 18: X{ X if(yyvsp[0].i && yyvsp[0].i < D_ALIGN_CHAOTIC) X yyerror("Illegal alignment - ignoring!"); X else X tmpdungeon[n_dgns].flags |= yyvsp[0].i ; X } Xbreak; Xcase 19: X{ X strcpy(tmpdungeon[n_dgns].protoname, yyvsp[0].str); X } Xbreak; Xcase 25: X{ X init_level(); X strcpy(tmplevel[n_levs].name, yyvsp[-3].str); X if (!strcmp(yyvsp[-2].str, "none")) X tmplevel[n_levs].boneschar = '\0'; X else if (yyvsp[-2].str[1]) X yyerror("Bones marker must be a single char, or \"none\"!"); X else X tmplevel[n_levs].boneschar = yyvsp[-2].str[0]; X tmplevel[n_levs].lev.base = couple.base; X tmplevel[n_levs].lev.rand = couple.rand; X tmpdungeon[n_dgns].levels++; X } Xbreak; Xcase 26: X{ X init_level(); X strcpy(tmplevel[n_levs].name, yyvsp[-4].str); X if (!strcmp(yyvsp[-3].str, "none")) X tmplevel[n_levs].boneschar = '\0'; X else if (yyvsp[-3].str[1]) X yyerror("Bones marker must be a single char, or \"none\"!"); X else X tmplevel[n_levs].boneschar = yyvsp[-3].str[0]; X tmplevel[n_levs].lev.base = couple.base; X tmplevel[n_levs].lev.rand = couple.rand; X tmplevel[n_levs].rndlevs = yyvsp[0].i; X tmpdungeon[n_dgns].levels++; X } Xbreak; Xcase 27: X{ X init_level(); X strcpy(tmplevel[n_levs].name, yyvsp[-4].str); X if (!strcmp(yyvsp[-3].str, "none")) X tmplevel[n_levs].boneschar = '\0'; X else if (yyvsp[-3].str[1]) X yyerror("Bones marker must be a single char, or \"none\"!"); X else X tmplevel[n_levs].boneschar = yyvsp[-3].str[0]; X tmplevel[n_levs].lev.base = couple.base; X tmplevel[n_levs].lev.rand = couple.rand; X tmplevel[n_levs].chance = yyvsp[0].i; X tmpdungeon[n_dgns].levels++; X } Xbreak; Xcase 28: X{ X init_level(); X strcpy(tmplevel[n_levs].name, yyvsp[-5].str); X if (!strcmp(yyvsp[-4].str, "none")) X tmplevel[n_levs].boneschar = '\0'; X else if (yyvsp[-4].str[1]) X yyerror("Bones marker must be a single char, or \"none\"!"); X else X tmplevel[n_levs].boneschar = yyvsp[-4].str[0]; X tmplevel[n_levs].lev.base = couple.base; X tmplevel[n_levs].lev.rand = couple.rand; X tmplevel[n_levs].chance = yyvsp[-1].i; X tmplevel[n_levs].rndlevs = yyvsp[0].i; X tmpdungeon[n_dgns].levels++; X } Xbreak; Xcase 29: X{ X if(yyvsp[0].i >= D_ALIGN_CHAOTIC) X yyerror("Illegal description - ignoring!"); X else X tmplevel[n_levs].flags |= yyvsp[0].i ; X } Xbreak; Xcase 30: X{ X if(yyvsp[0].i && yyvsp[0].i < D_ALIGN_CHAOTIC) X yyerror("Illegal alignment - ignoring!"); X else X tmplevel[n_levs].flags |= yyvsp[0].i ; X } Xbreak; Xcase 31: X{ X init_level(); X strcpy(tmplevel[n_levs].name, yyvsp[-4].str); X if (!strcmp(yyvsp[-3].str, "none")) X tmplevel[n_levs].boneschar = '\0'; X else if (yyvsp[-3].str[1]) X yyerror("Bones marker must be a single char, or \"none\"!"); X else X tmplevel[n_levs].boneschar = yyvsp[-3].str[0]; X tmplevel[n_levs].chain = getchain(yyvsp[-2].str); X tmplevel[n_levs].lev.base = couple.base; X tmplevel[n_levs].lev.rand = couple.rand; X if(!check_level()) n_levs--; X else tmpdungeon[n_dgns].levels++; X } Xbreak; Xcase 32: X{ X init_level(); X strcpy(tmplevel[n_levs].name, yyvsp[-5].str); X if (!strcmp(yyvsp[-4].str, "none")) X tmplevel[n_levs].boneschar = '\0'; X else if (yyvsp[-4].str[1]) X yyerror("Bones marker must be a single char, or \"none\"!"); X else X tmplevel[n_levs].boneschar = yyvsp[-4].str[0]; X tmplevel[n_levs].chain = getchain(yyvsp[-3].str); X tmplevel[n_levs].lev.base = couple.base; X tmplevel[n_levs].lev.rand = couple.rand; X tmplevel[n_levs].rndlevs = yyvsp[0].i; X if(!check_level()) n_levs--; X else tmpdungeon[n_dgns].levels++; X } Xbreak; Xcase 33: X{ X init_level(); X strcpy(tmplevel[n_levs].name, yyvsp[-5].str); X if (!strcmp(yyvsp[-4].str, "none")) X tmplevel[n_levs].boneschar = '\0'; X else if (yyvsp[-4].str[1]) X yyerror("Bones marker must be a single char, or \"none\"!"); X else X tmplevel[n_levs].boneschar = yyvsp[-4].str[0]; X tmplevel[n_levs].chain = getchain(yyvsp[-3].str); X tmplevel[n_levs].lev.base = couple.base; X tmplevel[n_levs].lev.rand = couple.rand; X tmplevel[n_levs].chance = yyvsp[0].i; X if(!check_level()) n_levs--; X else tmpdungeon[n_dgns].levels++; X } Xbreak; Xcase 34: X{ X init_level(); X strcpy(tmplevel[n_levs].name, yyvsp[-6].str); X if (!strcmp(yyvsp[-5].str, "none")) X tmplevel[n_levs].boneschar = '\0'; X else if (yyvsp[-5].str[1]) X yyerror("Bones marker must be a single char, or \"none\"!"); X else X tmplevel[n_levs].boneschar = yyvsp[-5].str[0]; X tmplevel[n_levs].chain = getchain(yyvsp[-4].str); X tmplevel[n_levs].lev.base = couple.base; X tmplevel[n_levs].lev.rand = couple.rand; X tmplevel[n_levs].chance = yyvsp[-1].i; X tmplevel[n_levs].rndlevs = yyvsp[0].i; X if(!check_level()) n_levs--; X else tmpdungeon[n_dgns].levels++; X } Xbreak; Xcase 37: X{ X init_branch(); X strcpy(tmpbranch[n_brs].name, yyvsp[-4].str); X tmpbranch[n_brs].lev.base = couple.base; X tmpbranch[n_brs].lev.rand = couple.rand; X tmpbranch[n_brs].type = yyvsp[-1].i; X tmpbranch[n_brs].up = yyvsp[0].i; X if(!check_branch()) n_brs--; X else tmpdungeon[n_dgns].branches++; X } Xbreak; Xcase 38: X{ X init_branch(); X strcpy(tmpbranch[n_brs].name, yyvsp[-5].str); X tmpbranch[n_brs].chain = getchain(yyvsp[-4].str); X tmpbranch[n_brs].lev.base = couple.base; X tmpbranch[n_brs].lev.rand = couple.rand; X tmpbranch[n_brs].type = yyvsp[-1].i; X tmpbranch[n_brs].up = yyvsp[0].i; X if(!check_branch()) n_brs--; X else tmpdungeon[n_dgns].branches++; X } Xbreak; Xcase 39: X{ X yyval.i = TBR_STAIR; /* two way stair */ X } Xbreak; Xcase 40: X{ X yyval.i = TBR_STAIR; /* two way stair */ X } Xbreak; Xcase 41: X{ X yyval.i = TBR_NO_UP; /* no up staircase */ X } Xbreak; Xcase 42: X{ X yyval.i = TBR_NO_DOWN; /* no down staircase */ X } Xbreak; Xcase 43: X{ X yyval.i = TBR_PORTAL; /* portal connection */ X } Xbreak; Xcase 44: X{ X yyval.i = 0; /* defaults to down */ X } Xbreak; Xcase 45: X{ X yyval.i = yyvsp[0].i; X } Xbreak; Xcase 46: X{ X if (yyvsp[-3].i < -MAXLEVEL || yyvsp[-3].i > MAXLEVEL) { X yyerror("Abs base out of dlevel range - zeroing!"); X couple.base = couple.rand = 0; X } else if (yyvsp[-1].i < -1 || X ((yyvsp[-3].i < 0) ? (MAXLEVEL + yyvsp[-3].i + yyvsp[-1].i + 1) > MAXLEVEL : X (yyvsp[-3].i + yyvsp[-1].i) > MAXLEVEL)) { X yyerror("Abs range out of dlevel range - zeroing!"); X couple.base = couple.rand = 0; X } else { X couple.base = yyvsp[-3].i; X couple.rand = yyvsp[-1].i; X } X } Xbreak; Xcase 47: X{ X if (yyvsp[-3].i < -MAXLEVEL || yyvsp[-3].i > MAXLEVEL) { X yyerror("Rel base out of dlevel range - zeroing!"); X couple.base = couple.rand = 0; X } else { X couple.base = yyvsp[-3].i; X couple.rand = yyvsp[-1].i; X } X } Xbreak; X } X yyssp -= yym; X yystate = *yyssp; X yyvsp -= yym; X yym = yylhs[yyn]; X if (yystate == 0 && yym == 0) X { X#if YYDEBUG X if (yydebug) X printf("%sdebug: after reduction, shifting from state 0 to\ X state %d\n", YYPREFIX, YYFINAL); X#endif X yystate = YYFINAL; X *++yyssp = YYFINAL; X *++yyvsp = yyval; X if (yychar < 0) X { X if ((yychar = yylex()) < 0) yychar = 0; X#if YYDEBUG X if (yydebug) X { X yys = 0; X if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; X if (!yys) yys = "illegal-symbol"; X printf("%sdebug: state %d, reading %d (%s)\n", X YYPREFIX, YYFINAL, yychar, yys); X } X#endif X } X if (yychar == 0) goto yyaccept; X goto yyloop; X } X if ((yyn = yygindex[yym]) != 0 && (yyn += yystate) >= 0 && X yyn <= YYTABLESIZE && yycheck[yyn] == yystate) X yystate = yytable[yyn]; X else X yystate = yydgoto[yym]; X#if YYDEBUG X if (yydebug) X printf("%sdebug: after reduction, shifting from state %d \ Xto state %d\n", YYPREFIX, *yyssp, yystate); X#endif X if (yyssp >= yyss + yystacksize - 1) X { X goto yyoverflow; X } X *++yyssp = yystate; X *++yyvsp = yyval; X goto yyloop; Xyyoverflow: X yyerror("yacc stack overflow"); Xyyabort: X return (1); Xyyaccept: X return (0); X} END_OF_FILE if test 30875 -ne `wc -c <'sys/share/dgn_yacc.c'`; then echo shar: \"'sys/share/dgn_yacc.c'\" unpacked with wrong size! fi # end of 'sys/share/dgn_yacc.c' echo shar: End of archive 15 \(of 18\). cp /dev/null ark15isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 18 archives. echo "Now execute ./patchit3.sh" 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