Merge branch 'NetHack-3.7' into twitch-interact

This commit is contained in:
2026-04-13 15:05:44 -07:00
312 changed files with 15860 additions and 10846 deletions

2
sys/amiga/.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
*.p NHSUBST
* NH_filestag=(file%s_for_Amiga_versions)

107
sys/amiga/README.amiga Normal file
View File

@@ -0,0 +1,107 @@
NetHack 3.7 for Amiga
====================
Requirements
------------
- AmigaOS 3.0 or later (Kickstart 39+)
- 6 MB free RAM minimum (8 MB recommended)
- Hard drive with ~5 MB free space
Recommended: RTG graphics card (Picasso96/CyberGraphX) for best
tile rendering. Native AGA/OCS/ECS chipsets are supported.
Installation
------------
Extract NH370AMI.ZIP to a directory and assign it:
assign NetHack: <path>
The directory should contain:
nethack - game binary
nhdat - data library
symbols - symbol set definitions
sysconf - system configuration
nethack.cnf - game options
hack.font - font descriptor
hack/8 - font bitmap (8pt)
tiles/tiles16.iff - 16-color tiles (OCS/ECS)
tiles/tiles32.iff - 32-color tiles (AGA/RTG)
tomb.iff - tombstone image
record - high score file
To play:
cd NetHack:
nethack
Display Modes
-------------
Two display modes are available, selected in nethack.cnf:
Text mode (AMII):
OPTIONS=symset:AmigaFont
Tile mode (AMIV):
OPTIONS=windowtype:amiv
Tile mode auto-selects tiles32.iff (32 colors, 5 bitplanes) when the
screen supports 32+ colors, otherwise tiles16.iff (16 colors, 4 planes).
Configuration
-------------
Edit nethack.cnf for game options. Key settings:
OPTIONS=windowtype:amiv - tile graphics (default)
OPTIONS=symset:AmigaFont - text mode with line-drawing chars
OPTIONS=menucolors - colored inventory items
OPTIONS=time,lit_corridor - show turn count, lit corridors
OPTIONS=boulder:0 - display boulders as '0'
Menu color examples (add after OPTIONS=menucolors):
MENUCOLOR=" blessed "=green
MENUCOLOR=" cursed "=red
MENUCOLOR=" uncursed "=cyan
Building from Source
--------------------
Cross-compilation from Linux using bebbo's m68k-amigaos-gcc toolchain
(https://franke.ms/git/bebbo/amiga-gcc):
# Install toolchain to /opt/amiga
# Clone NetHack 3.7 source
cd NetHack
sys/unix/setup.sh sys/unix/hints/linux.370
make fetch-lua
make CROSS_TO_AMIGA=1 fetch-regex
make CROSS_TO_AMIGA=1 all
make CROSS_TO_AMIGA=1 package
The distribution ZIP is created at targets/amiga/NH370AMI.ZIP.
Toolchain requirements:
- m68k-amigaos-gcc (bebbo's amigaos-cross-toolchain in /opt/amiga)
- -noixemul (libnix) for linking
- -m68000 for maximum compatibility (or -m68020/040/060)
Known Issues
------------
- Native Amiga compilation (SAS/C, DICE) is not supported;
cross-compilation with GCC is required
Credits
-------
Olaf Seibert first ported NetHack 2.3 and 3.0 to the Amiga.
Richard Addison, Andrew Church, Jochen Erwied, Mark Gooderum,
Ken Lorber, Greg Olson, Mike Passaretti, and Gregg Wonderly
polished and extended the 3.0 and 3.1 ports. Andrew Church,
Ken Lorber, and Gregg Wonderly are responsible for the 3.2 port.
Janne Salmijärvi resurrected the Amiga port for 3.3 and
Teemu Suikki joined before 3.4.0.
Updated for NetHack 3.7, cross compile fixes and 32 color tile support by Ingo
Paschke in 2026.

518
sys/amiga/amidos.c Normal file
View File

@@ -0,0 +1,518 @@
/* NetHack 3.6 amidos.c $NHDT-Date: 1432512796 2015/05/25 00:13:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */
/* Copyright (c) Olaf Seibert, Nijmegen, The Netherlands, 1988,1990. */
/* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1991,1992,1993,1996. */
/* NetHack may be freely redistributed. See license for details. */
/*
* An assortment of imitations of cheap plastic MSDOS and Unix functions.
*/
#include "hack.h"
#include "winami.h"
#include "windefs.h"
/* Defined in config.h, let's undefine it here (static function below) */
#undef strcmpi
#include <libraries/dos.h>
#include <exec/execbase.h>
#include <intuition/intuition.h>
#undef COUNT
#if defined(__SASC_60) || defined(__GNUC__)
#include <proto/exec.h>
#include <proto/dos.h>
#endif
/* POSIX stubs needed by libnix (-noixemul) */
#ifdef __noixemul__
int getpid(void) { return (int)FindTask(NULL); }
#endif
#ifdef AZTEC_50
#include <functions.h>
#undef strcmpi
#endif
/* Prototypes */
#ifndef CROSS_TO_AMIGA
#include "NH:sys/amiga/amiwind.p"
#include "NH:sys/amiga/winami.p"
#include "NH:sys/amiga/amidos.p"
#else
#include "amiwind.p"
#include "winami.p"
#include "amidos.p"
#endif
extern char Initialized;
extern struct window_procs amii_procs;
struct ami_sysflags sysflags = {0};
FILE *fopenp(const char *, const char *);
#ifndef __SASC_60
int Enable_Abort = 0; /* for stdio package */
#endif
/* Initial path, so we can find NetHack.cnf */
char PATH[PATHLEN] = "NetHack:";
static boolean record_exists(void);
void
flushout(void)
{
(void) fflush(stdout);
}
#ifndef getuid
int
getuid(void)
{
return 1;
}
#endif
#ifndef getlogin
char *
getlogin(void)
{
return ((char *) NULL);
}
#endif
/* abs() provided by libnix/stdlib */
#ifdef SHELL
int
dosh(void)
{
int i = 0;
char buf[BUFSZ];
extern struct ExecBase *SysBase;
/* Only under 2.0 and later ROMs do we have System() */
if (SysBase->LibNode.lib_Version >= 37 && !amibbs) {
getlin("Enter CLI Command...", buf);
if (buf[0] != '\033')
i = System(buf, NULL);
} else {
i = 0;
pline("No mysterious force prevented you from using multitasking.");
}
return i;
}
#endif /* SHELL */
#ifdef MFLOPPY
#include <ctype.h>
#define Sprintf (void) sprintf
#define EXTENSION 72
/*
* This routine uses an approximation of the free bytes on a disk.
* How large a file you can actually write depends on the number of
* extension blocks you need for it.
* In each extenstion block there are maximum 72 pointers to blocks,
* so every 73 disk blocks have only 72 available for data.
* The (necessary) file header is also good for 72 data block pointers.
*/
/* TODO: update this for FFS */
long
freediskspace(char *path)
{
#ifdef UNTESTED
/* these changes from Patric Mueller <bhaak@gmx.net> for AROS to
* handle larger disks. Also needs limits.h and aros/oldprograms.h
* for AROS. (keni)
*/
unsigned long long freeBytes = 0;
#else
long freeBytes = 0;
#endif
struct InfoData *infoData; /* Remember... longword aligned */
char fileName[32];
/*
* Find a valid path on the device of which we want the free space.
* If there is a colon in the name, it is an absolute path
* and all up to the colon is everything we need.
* Remember slashes in a volume name are allowed!
* If there is no colon, it is relative to the current directory,
* so must be on the current device, so "" is enough...
*/
{
char *colon;
strncpy(fileName, path, sizeof(fileName) - 1);
fileName[31] = 0;
if (colon = strchr(fileName, ':'))
colon[1] = '\0';
else
fileName[0] = '\0';
}
{
BPTR fileLock;
infoData = (struct InfoData *) alloc(sizeof(struct InfoData));
if (fileLock = Lock(fileName, SHARED_LOCK)) {
if (Info(fileLock, infoData)) {
/* We got a kind of DOS volume, since we can Lock it. */
/* Calculate number of blocks available for new file */
/* Kludge for the ever-full VOID: (oops RAM:) device */
if (infoData->id_UnitNumber == -1
&& infoData->id_NumBlocks == infoData->id_NumBlocksUsed) {
freeBytes = AvailMem(0L) - 64 * 1024L;
/* Just a stupid guess at the */
/* Ram-Handler overhead per block: */
freeBytes -= freeBytes / 16;
} else {
/* Normal kind of DOS file system device/volume */
freeBytes =
infoData->id_NumBlocks - infoData->id_NumBlocksUsed;
freeBytes -= (freeBytes + EXTENSION) / (EXTENSION + 1);
freeBytes *= infoData->id_BytesPerBlock;
#ifdef UNTESTED
if (freeBytes > LONG_MAX) {
freeBytes = LONG_MAX;
}
#endif
}
if (freeBytes < 0)
freeBytes = 0;
}
UnLock(fileLock);
}
free(infoData);
return freeBytes;
}
}
long
filesize(char *file)
{
BPTR fileLock;
struct FileInfoBlock *fileInfoBlock;
long size = 0;
fileInfoBlock =
(struct FileInfoBlock *) alloc(sizeof(struct FileInfoBlock));
if (fileLock = Lock(file, SHARED_LOCK)) {
if (Examine(fileLock, fileInfoBlock)) {
size = fileInfoBlock->fib_Size;
}
UnLock(fileLock);
}
free(fileInfoBlock);
return size;
}
#if 0
void
void
eraseall(const char *path, const char *files)
{
BPTR dirLock, dirLock2;
struct FileInfoBlock *fibp;
int chklen;
#if (NH_DEVEL_STATUS != NH_STATUS_RELEASED)
if(files != g.alllevels)panic("eraseall");
#endif
chklen=(int)index(files,'*')-(int)files;
if (dirLock = Lock( (char *)path ,SHARED_LOCK)) {
dirLock2=DupLock(dirLock);
dirLock2= CurrentDir(dirLock2);
fibp=AllocMem(sizeof(struct FileInfoBlock),0);
if(fibp){
if(Examine(dirLock,fibp)){
while(ExNext(dirLock,fibp)){
if(!strncmp(fibp->fib_FileName,files,chklen)){
DeleteFile(fibp->fib_FileName);
}
}
}
FreeMem(fibp,sizeof(struct FileInfoBlock));
}
UnLock(dirLock);
UnLock(CurrentDir(dirLock2));
}
}
#endif
/* This size makes that most files can be copied with two Read()/Write()s */
#if 0 /* Unused */
#define COPYSIZE 4096
char *CopyFile(const char *from, const char *to)
{
BPTR fromFile, toFile;
char *buffer;
long size;
char *error = NULL;
buffer = (char *) alloc(COPYSIZE);
if (fromFile = Open( (char *)from, MODE_OLDFILE)) {
if (toFile = Open( (char *)to, MODE_NEWFILE)) {
while (size = Read(fromFile, buffer, (long)COPYSIZE)) {
if (size == -1){
error = "Read error";
break;
}
if (size != Write(toFile, buffer, size)) {
error = "Write error";
break;
}
}
Close(toFile);
} else
error = "Cannot open destination";
Close(fromFile);
} else
error = "Cannot open source (this should not occur)";
free(buffer);
return error;
}
#endif
#ifdef MFLOPPY
/* this should be replaced */
int
saveDiskPrompt(int start)
{
char buf[BUFSIZ], *bp;
BPTR fileLock;
if (sysflags.asksavedisk) {
/* Don't prompt if you can find the save file */
if (fileLock = Lock(gs.SAVEF, SHARED_LOCK)) {
UnLock(fileLock);
#if defined(TTY_GRAPHICS)
if (windowprocs.win_init_nhwindows
!= amii_procs.win_init_nhwindows)
clear_nhwindow(WIN_MAP);
#endif
#if defined(AMII_GRAPHICS)
if (windowprocs.win_init_nhwindows
== amii_procs.win_init_nhwindows)
clear_nhwindow(WIN_BASE);
#endif
return 1;
}
pline("If save file is on a SAVE disk, put that disk in now.");
if (strlen(gs.SAVEF) > QBUFSZ - 25 - 22)
panic("not enough buffer space for prompt");
/* THIS IS A HACK */
#if defined(TTY_GRAPHICS)
if (windowprocs.win_init_nhwindows != amii_procs.win_init_nhwindows) {
getlin("File name ?", buf);
clear_nhwindow(WIN_MAP);
}
#endif
#if defined(AMII_GRAPHICS)
if (windowprocs.win_init_nhwindows == amii_procs.win_init_nhwindows) {
getlind("File name ?", buf, gs.SAVEF);
clear_nhwindow(WIN_BASE);
}
#endif
clear_nhwindow(WIN_MESSAGE);
if (!start && *buf == '\033')
return 0;
/* Strip any whitespace. Also, if nothing was entered except
* whitespace, do not change the value of gs.SAVEF.
*/
for (bp = buf; *bp; bp++) {
if (!isspace(*bp)) {
strncpy(gs.SAVEF, bp, PATHLEN);
break;
}
}
}
return 1;
}
#endif /* MFLOPPY */
/* Return 1 if the record file was found */
static boolean
record_exists(void)
{
FILE *file;
if (file = fopenp(RECORD, "r")) {
fclose(file);
return TRUE;
}
return FALSE;
}
#ifdef MFLOPPY
/*
* Under MSDOS: Prompt for game disk, then check for record file.
* For Amiga: do nothing, but called from restore.c
*/
void
gameDiskPrompt(void)
{
}
#endif
/*
* Add a slash to any name not ending in / or :. There must
* be room for the /.
*/
void
append_slash(char *name)
{
char *ptr;
if (!*name)
return;
ptr = eos(name) - 1;
if (*ptr != '/' && *ptr != ':') {
*++ptr = '/';
*++ptr = '\0';
}
}
void
getreturn(const char *str)
{
int ch;
raw_printf("Hit <RETURN> %s.", str);
while ((ch = nhgetch()) != '\n' && ch != '\r')
continue;
}
/* Follow the PATH, trying to fopen the file.
*/
#define PATHSEP ';'
FILE *
fopenp(const char *name, const char *mode)
{
char *bp, *pp, lastch = 0;
FILE *fp;
BPTR theLock;
char buf[BUFSIZ];
/* Try the default directory first. Then look along PATH.
*/
if (strlen(name) >= BUFSIZ)
return (NULL);
strcpy(buf, name);
if (theLock = Lock(buf, SHARED_LOCK)) {
UnLock(theLock);
if (fp = fopen(buf, mode))
return fp;
}
pp = PATH;
while (pp && *pp) {
bp = buf;
while (*pp && *pp != PATHSEP) {
if (bp > buf + BUFSIZ - 1)
return (NULL);
lastch = *bp++ = *pp++;
}
if (lastch != ':' && lastch != '/' && bp != buf)
*bp++ = '/';
if (bp + strlen(name) > buf + BUFSIZ - 1)
return (NULL);
strcpy(bp, name);
if (theLock = Lock(buf, SHARED_LOCK)) {
UnLock(theLock);
if (fp = fopen(buf, mode))
return fp;
}
if (*pp)
pp++;
}
return NULL;
}
#endif /* MFLOPPY */
#ifdef CHDIR
/*
* A not general-purpose directory changing routine.
* Assumes you want to return to the original directory eventually,
* by chdir()ing to orgdir (which is defined in pcmain.c).
* Assumes -1 is not a valid lock, since 0 is valid.
*/
#define NO_LOCK ((BPTR) -1)
static BPTR OrgDirLock = NO_LOCK;
int
chdir(
#ifdef CROSS_TO_AMIGA
const
#endif
char *dir)
{
extern char orgdir[];
if (dir == orgdir) {
/* We want to go back to where we came from. */
if (OrgDirLock != NO_LOCK) {
UnLock(CurrentDir(OrgDirLock));
OrgDirLock = NO_LOCK;
}
} else {
/*
* Go to some new place. If still at the original
* directory, save the FileLock.
*/
BPTR newDir;
if (newDir = Lock((char *) dir, SHARED_LOCK)) {
if (OrgDirLock == NO_LOCK) {
OrgDirLock = CurrentDir(newDir);
} else {
UnLock(CurrentDir(newDir));
}
} else {
return -1; /* Failed */
}
}
/* CurrentDir always succeeds if you have a lock */
return 0;
}
#endif /* CHDIR */
/* Chdir back to original directory
*/
#undef exit
void
nethack_exit(int code)
{
#ifdef CHDIR
extern char orgdir[];
#endif
#ifdef CHDIR
chdir(orgdir); /* chdir, not chdirx */
#endif
#ifdef AMII_GRAPHICS
if (windowprocs.win_init_nhwindows == amii_procs.win_init_nhwindows)
CleanUp();
#endif
exit(code);
}
void
regularize(char *s) /* normalize file name - we don't like :'s or /'s */
{
char *lp;
while ((lp = strchr(s, ':')) || (lp = strchr(s, '/')))
*lp = '_';
}

42
sys/amiga/amidos.p Normal file
View File

@@ -0,0 +1,42 @@
/* NetHack 3.6 amidos.p $NHDT-Date: 1432512796 2015/05/25 00:13:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1992, 1993. */
/* NetHack may be freely redistributed. See license for details. */
/* amidos.c */
void flushout (void);
#ifndef getuid
int getuid (void);
#endif
#ifndef getpid
int getpid (void);
#endif
#ifndef getlogin
char *getlogin (void);
#endif
#ifndef abs
int abs(int );
#endif
int tgetch (void);
int dosh (void);
long freediskspace(char *);
long filesize(char *);
void eraseall(const char * , const char *);
char *CopyFile(const char * , const char *);
void copybones(int );
void playwoRAMdisk (void);
int saveDiskPrompt(int );
void gameDiskPrompt (void);
void append_slash(char *);
void getreturn(const char *);
#ifndef msmsg
void msmsg( const char *, ... );
#endif
#if !defined(__SASC_60) && !defined(_DCC) && !defined(CROSS_TO_AMIGA)
int chdir(char *);
#endif
#ifndef strcmpi
int strcmpi(char * , char *);
#endif
#if !defined(memcmp) && !defined(AZTEC_C) && !defined(_DCC) && !defined(__GNUC__)
int memcmp(unsigned char * , unsigned char * , int );
#endif

9
sys/amiga/amifont.uu Normal file
View File

@@ -0,0 +1,9 @@
begin 777 hack.font
M#P```6AA8VLO.```````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
G````````````````````````````````````````````````"`!`
`
end

59
sys/amiga/amifont8.uu Normal file
View File

@@ -0,0 +1,59 @@
begin 644 8
M```#\P`````````!``````````````)E```#Z0```F5P_TYU```````````,
M`````!H/@``!``````````````````````````````````````````!&140`
M```````````,`````!H`````"20`"`!```@`!@`!```@_P```&X`M```!@X`
M```````````8;&P8`#@8##````````,\&#P\''X<?CP\```,`#`\?!C\//C^
M_CQF?@[F\(+&./PX_#Q^9L/&P\/^/,`\$``8`.``#@`<`.`8!N`X````````
M``@````````.&'!RS.?BY^?EY^?GY^?GY.?AY^?__\,8`&;GY^?GY^3GX>?G
MYVH```!J:A@````8&!@``!@88L!6`%96```8`!@8`*@5P8.BP:@5YP/_[W_^
M````P,```P`\;&P^QFP8&!AF&`````9F.&9F/&`P9F9F&!@8`!AFQCQF9FQF
M9F9F&`9F8,;F;&9L9F9:9L/&9L/&,&`,.``8`&``!@`V`&```&`8````````
M`!@````````8&!B<,Z6BH:&EI*2AI:6EI*2AI*3__\,8`&:DH:6EI:2DH:2D
MI58```!65CP````8&!@``!@\96-J`&IJ```8`!@8UB/$`\`C+"O4A`/_]Y_Y
M````P,```P`\`/Y@S&@P,`P\&`````QN&`8&;'Q@!F9F&!@P?@P&WCQFP&9@
M8,!F&`9L8.[VQF;&9G`89F;&/&:,,#`,;``,/&P\-CPP.VPX!F889GP\W#WL
M/CYF9F-C9GX8&!@`S.7BY^?GY^?AY^?GY^3GY^?_`.<8`,/GX>?GY^?DY^?G
MY6K_#_!KZCP````8&!@``!AF8#97_];7`&8<`#@\;&I6)F1I/&F6YP./]]_[
M#__PP,```P`8`&P\&'8`,`S_?@!^`!A^&!P<S`9\##P^``!@``8,WF9\P&9X
M>,Y^&`9X8/[>QGS&?#@89F;6&#P8,!@,Q@``!G9F;F9X9G88!FP8=V9F9F9V
M8!AF9FLV9DQP&`X`,Z6BI*&AH:6AI:&EI:2EI*3_`.<8_P`E(24A)24D)20D
MI595/5Q55F;_#_`/\/\``-O#?AMJ5:JJ```?__C_JIPY:];X*]I;A`-F[\_S
M.``<P&``!@`8`/X&,-P`,`P\&````#!V&#`&_@9F&&8&```P``P8WGYFP&9@
M8,9F&&9L8M;.QF#&;`X89CS^/!@R,`P,````'F9@9GXP9F88!G@8:V9F9F9F
M/!AF9FL<9A@8&!@`S.?BY^?AY^?AY^'EY^?GY^3_`.<8_P`G(2<A)2<G)R<D
MIVJJ:JHZK&8`&!@``!@``,/;9NQ5JE95&``</#@`;&O6G#DK^#?LYP/Q[_//
M8``&P#@`'````&Q\9LP`&!AF&!@`&&!F&&9F#&9F&&8,&!@8?A@`P,-F9FQF
M8&9F&&9F9L;&;&!L9F889CSN9AAF,`8,````9F9F9F`P/&88!FP88V9F?#Y@
M!AIF/#8V/#(8&!@`,P````````````````````#_`.<8`,,`````````````
M`%;_5=8/\,,`&!@``!AS`&889C9KU^K_```8&!@`UB9D:E8\:;0M``/_W_O?
MP``#P`__\``8`&P8QG8`##```!@`&,`\?GX\'CP\&#PX&!@,`#`8>,/\//C^
M\#YF?CSF_L;&./`\XSP\/AC&PSS^/`,\````.SP\.SQXQN8\9N8\8V8\8`;P
M?`P[&#9C&'X.&'``S`````````````````````#__\,8`&8`````````````
M`&H`:VH``,,`&!@``!B<&#P89F-6:E8``&88&!@`K`/`(\0L(T&"``/_W_F?
MP``#P````````````````````#```````````````````#``````````````
M```````````````&`````````````````/X`````````?```/```````\`<`
M````````<```````,P````````````````````#__\,8`&8`````````````
M`%8`5E8`````&!@``!@``!@8`,!J5FH````8&!@``,&#J!7!HL&#``/_[_Y_
MP``#P`````````@`"``(`!``"``8``@`(``(`"@`"``P``@`.``(`$``"`!(
M``@`4``(`%@`"`!@``@`:``(`'``"`!X``@`@``(`(@`"`"0``@`F``(`*``
M"`"H``@`L``(`+@`"`#```@`R``(`-``"`#8``@`X``(`.@`"`#P``@`^``(
M`0``"`$(``@!$``(`1@`"`$@``@!*``(`3``"`$X``@!0``(`4@`"`%0``@!
M6``(`6``"`%H``@!<``(`7@`"`&```@!B``(`9``"`&8``@!H``(`:@`"`&P
M``@!N``(`<``"`'(``@!T``(`=@`"`'@``@!Z``(`?``"`'X``@"```(`@@`
M"`(0``@"&``(`B``"`(H``@",``(`C@`"`)```@"2``(`E``"`)8``@"8``(
M`F@`"`)P``@">``(`H``"`*(``@"D``(`I@`"`*@``@"J``(`K``"`*X``@"
MP``(`L@`"`+0``@"V``(`N``"`+H``@"\``(`O@`"`,```@#"``(`Q``"`,8
M``@#(``(`R@`"`,P``@#.``(`T``"`-(``@#4``(`U@`"`-@``@#:``(`W``
M"`-X``@#@``(`X@`"`.0``@#F``(`Z``"`.H``@#L``(`[@`"`/```@#R``(
M`]``"`/8``@#X``(`^@`"`/P``@#^``(!```"``(``@`$``(`!@`"``@``@`
M*``(`#``"``X``@`0``(`$@`"`!0``@`6``(`&``"`!H``@`<``(`'@`"`"`
M``@`B``(`)``"`"8``@`H``(`*@`"`"P``@`N``(`,``"`#(``@`T``(`-@`
M"`#@``@`Z``(`/``"`#X``@$"``(!!``"`08``@$(``(!"@`"`0P``@#J``(
M!#@`"`.8``@$0``(!$@`"`10``@$6``(!&``"`1H``@$<``(!'@`"`2```@$
MB``(!)``"`28``@$H``(!*@`"`2P``@$N``(!,``"`3(``@!V``(`>``"`'H
M``@!\``(`?@`"`(```@$T``(!-@`"`3@``@$Z``(!/``"`3X``@%```(!0@`
M"`40``@%&``(!2``"`4H``@%,``(!3@`"`5```@%2``(!5``"`58``@%8``(
M!6@`"`5P``@%>``(!8``"`6(``@%D``(!9@`"`+8``@"X``(`N@`"`+P``@"
M^``(````"``````#[`````0`````````#@```$0```!<````8@````````/R
`
end

49
sys/amiga/amigst.c Normal file
View File

@@ -0,0 +1,49 @@
/* NetHack 3.6 amigst.c $NHDT-Date: 1432512794 2015/05/25 00:13:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* Copyright (c) Gregg Wonderly, Naperville, IL, 1992, 1993 */
/* NetHack may be freely redistributed. See license for details. */
#include <stdio.h>
#include <exec/types.h>
#include <exec/io.h>
#include <exec/alerts.h>
#include <exec/devices.h>
#include <devices/console.h>
#include <devices/conunit.h>
#include <graphics/gfxbase.h>
#include <intuition/intuition.h>
#include <libraries/dosextens.h>
#include <ctype.h>
#undef strcmpi
#include <string.h>
#include <errno.h>
#ifdef __SASC
#include <dos.h> /* for __emit */
#include <string.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/diskfont.h>
#include <proto/console.h>
#endif
#include "hack.h"
#include "winprocs.h"
#include "winami.h"
#ifdef AZTEC
#include <functions.h>
#endif
#ifndef CROSS_TO_AMIGA
#include "NH:sys/amiga/winami.p"
#include "NH:sys/amiga/amiwind.p"
#include "NH:sys/amiga/amidos.p"
#else
#include "winami.p"
#include "amiwind.p"
#include "amidos.p"
#endif
/* end amigst.c */

31
sys/amiga/amii.hlp Normal file
View File

@@ -0,0 +1,31 @@
Amiga-specific help file for NetHack 3.6
The Amiga port of NetHack supports a number of additional commands
and facilities specific to the Amiga. Listed below are the things
which are either specific to the Amiga port or might not appear
in other ports.
While playing NetHack you can press:
ALT-HELP Color requestor.
CTL-HELP Scale display (amitile only).
SHIFT-HELP Overview window (amitile only).
Amiga-specific run-time options:
altmeta use the alt keys as meta keys
flush throw away keyboard type-ahead
Command line options recognized are
-n No News at game startup.
-X Play in discovery mode.
-D Play in debug mode.
-L Interlaced screen.
-l Never Interlaced screen.
-u Play as player given as
an argument.
-r Pick a race given as an
argument.
-p Pick a profession given
as an argument
-? Gives command line usage.

107
sys/amiga/amimenu.c Normal file
View File

@@ -0,0 +1,107 @@
/* NetHack 3.6 amimenu.c $NHDT-Date: 1432512796 2015/05/25 00:13:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* Copyright (c) Olaf 'Rhialto' Seibert, 1989 */
/* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1992, 1993, 1996 */
/* Copyright (c) Janne Salmijärvi, 2000 */
/* NetHack may be freely redistributed. See license for details. */
/* Originally by John Toebes. */
/* GadTools menus by jhsa */
struct NewMenu GTHackMenu[] = {
{ NM_TITLE, "Commands", 0, 0, 0, 0 },
{ NM_ITEM, "? Display help menu", 0, 0, 0, (void *) '?' },
{ NM_ITEM, "& Explain a command", 0, 0, 0, (void *) '&' },
{ NM_ITEM, "O Set options", 0, 0, 0, (void *) 'O' },
{ NM_ITEM, "! AmigaDos command", 0, 0, 0, (void *) '!' },
{ NM_ITEM, "v Version number", 0, 0, 0, (void *) 'v' },
{ NM_ITEM, "V Long version and game history", 0, 0, 0, (void *) 'V' },
{ NM_ITEM, "^R Redraw screen", 0, 0, 0, (void *) 022 },
{ NM_ITEM, "^P Repeat previous messages", 0, 0, 0, (void *) 020 },
{ NM_ITEM, "M-q #quit the game", 0, 0, 0, (void *)(128 + 'q') },
{ NM_ITEM, "S Save the game", 0, 0, 0, (void *) 'S' },
{ NM_TITLE, "Inventory", 0, 0, 0, 0 },
{ NM_ITEM, "i Inventory", 0, 0, 0, (void *) 'i' },
{ NM_ITEM, "p Pay your bill", 0, 0, 0, (void *) 'p' },
{ NM_ITEM, "d Drop an object", 0, 0, 0, (void *) 'd' },
{ NM_ITEM, "D Drop several things", 0, 0, 0, (void *) 'D' },
{ NM_ITEM, ", Pickup an object", 0, 0, 0, (void *) ',' },
{ NM_ITEM, "@ Toggle pickup", 0, 0, 0, (void *) '@' },
{ NM_ITEM, "/ Identify something", 0, 0, 0, (void *) '/' },
{ NM_ITEM, "C Christen a monster", 0, 0, 0, (void *) 'C' },
{ NM_ITEM, "+ List known spells", 0, 0, 0, (void *) '+' },
{ NM_ITEM, "$ Your gold", 0, 0, 0, (void *) '$' },
{ NM_TITLE, "Actions", 0, 0, 0, 0 },
{ NM_ITEM, "a Apply/use something", 0, 0, 0, (void *) 'a' },
{ NM_ITEM, "e Eat something", 0, 0, 0, (void *) 'e' },
{ NM_ITEM, "f Fire ammunition", 0, 0, 0, (void *) 'f' },
{ NM_ITEM, "F Fight a monster", 0, 0, 0, (void *) 'F' },
{ NM_ITEM, "q Quaff a monster", 0, 0, 0, (void *) 'q' },
{ NM_ITEM, "r Read scroll/book", 0, 0, 0, (void *) 'r' },
{ NM_ITEM, "t Throw something", 0, 0, 0, (void *) 't' },
{ NM_ITEM, "z Zap a wand", 0, 0, 0, (void *) 'z' },
{ NM_ITEM, "Z Cast a spell", 0, 0, 0, (void *) 'Z' },
{ NM_TITLE, "Preparations", 0, 0, 0, 0 },
{ NM_ITEM, "A Remove all armor", 0, 0, 0, (void *) 'A' },
{ NM_ITEM, "P Put on a ring", 0, 0, 0, (void *) 'P' },
{ NM_ITEM, "R Remove ring", 0, 0, 0, (void *) 'R' },
{ NM_ITEM, "Q Select ammunition for quiver", 0, 0, 0, (void *) 'Q' },
{ NM_ITEM, "T Take off armor", 0, 0, 0, (void *) 'T' },
{ NM_ITEM, "w Wield a weapon", 0, 0, 0, (void *) 'w' },
{ NM_ITEM, "W Wear armor", 0, 0, 0, (void *) 'W' },
{ NM_ITEM, "x Swap wielded and secondary weapons", 0, 0, 0,
(void *) 'x' },
{ NM_ITEM, ") Current weapon", 0, 0, 0, (void *) ')' },
{ NM_ITEM, "[ Current armor", 0, 0, 0, (void *) '[' },
{ NM_ITEM, "= Current rings", 0, 0, 0, (void *) '=' },
{ NM_ITEM, "\" Current amulet", 0, 0, 0, (void *) '"' },
{ NM_ITEM, "( Current tools", 0, 0, 0, (void *) '(' },
{ NM_ITEM, "* Current equipment", 0, 0, 0, (void *) '*' },
{ NM_TITLE, "Movement", 0, 0, 0, 0 },
{ NM_ITEM, "o Open door", 0, 0, 0, (void *) 'o' },
{ NM_ITEM, "c Close door", 0, 0, 0, (void *) 'c' },
{ NM_ITEM, "^D Kick door", 0, 0, 0, (void *) 004 },
{ NM_ITEM, "s Search", 0, 0, 0, (void *) 's' },
{ NM_ITEM, "< Go up stairs", 0, 0, 0, (void *) '<' },
{ NM_ITEM, "> Go down stairs", 0, 0, 0, (void *) '>' },
{ NM_ITEM, "^T Teleport", 0, 0, 0, (void *) 024 },
{ NM_ITEM, ". Wait a moment", 0, 0, 0, (void *) '.' },
{ NM_ITEM, "E Engrave message on floor", 0, 0, 0, (void *) 'E' },
{ NM_TITLE, "Extended", 0, 0, 0, 0 },
{ NM_ITEM, "M-a #adjust inventory letters", 0, 0, 0,
(void *)(128 + 'a') },
{ NM_ITEM, "M-c #chat with someone", 0, 0, 0, (void *)(128 + 'c') },
{ NM_ITEM, "M-d #dip an object into something", 0, 0, 0,
(void *)(128 + 'd') },
#ifdef WEAPON_SKILLS
{ NM_ITEM, "M-e #enhance weapon skills", 0, 0, 0, (void *)(128 + 'e') },
#endif
{ NM_ITEM, "M-f #force a lock", 0, 0, 0, (void *)(128 + 'f') },
{ NM_ITEM, "M-i #invoke an object's special powers", 0, 0, 0,
(void *)(128 + 'i') },
{ NM_ITEM, "M-j #jump to another location", 0, 0, 0,
(void *)(128 + 'j') },
{ NM_ITEM, "M-l #loot a box on the floor", 0, 0, 0,
(void *)(128 + 'l') },
{ NM_ITEM, "M-m Use a #monster's special ability", 0, 0, 0,
(void *)(128 + 'm') },
{ NM_ITEM, "M-n #name an item or type of object", 0, 0, 0,
(void *)(128 + 'n') },
{ NM_ITEM, "M-o #offer a sacrifice to the gods", 0, 0, 0,
(void *)(128 + 'o') },
{ NM_ITEM, "M-p #pray to the gods for help", 0, 0, 0,
(void *)(128 + 'p') },
{ NM_ITEM, "M-q #quit the game", 0, 0, 0, (void *)(128 + 'q') },
{ NM_ITEM, "M-r #rub a lamp", 0, 0, 0, (void *)(128 + 'r') },
{ NM_ITEM, "M-s #sit down", 0, 0, 0, (void *)(128 + 's') },
{ NM_ITEM, "M-t #turn undead", 0, 0, 0, (void *)(128 + 't') },
{ NM_ITEM, "M-u #untrap something", 0, 0, 0, (void *)(128 + 'u') },
{ NM_ITEM, "M-v Long #version information", 0, 0, 0,
(void *)(128 + 'v') },
{ NM_ITEM, "M-w #wipe off your face", 0, 0, 0, (void *)(128 + 'w') },
{ NM_ITEM, " Your #conduct", 0, 0, 0, (void *) '#' }, /* "#co\n" */
{ NM_ITEM, " #ride your steed", 0, 0, 0, (void *) '#' }, /* "#ri\n" */
{ NM_ITEM, "M-2 Switch #twoweapon mode on/off", 0, 0, 0,
(void *)(128 + '2') },
{ NM_END, NULL, 0, 0, 0, 0 }
};

367
sys/amiga/amirip.c Normal file
View File

@@ -0,0 +1,367 @@
/* NetHack 3.6 amirip.c $NHDT-Date: 1450453302 2015/12/18 15:41:42 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.16 $ */
/* Copyright (c) Kenneth Lorber, Bethesda, Maryland 1991,1992,1993,1995,1996.
*/
/* NetHack may be freely redistributed. See license for details. */
#include "hack.h"
#include <exec/types.h>
#include <exec/io.h>
#include <exec/alerts.h>
#include <exec/devices.h>
#include <devices/console.h>
#include <devices/conunit.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuition.h>
#include <libraries/dosextens.h>
#include <ctype.h>
#include <string.h>
#include "winami.h"
#include "windefs.h"
#include "winext.h"
#include "winproto.h"
static struct RastPort *rp;
#ifdef AMII_GRAPHICS
#undef NULL
#define NULL 0
#ifdef AZTEC_C
#include <functions.h>
#else
#ifdef _DCC
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/console_protos.h>
#include <clib/diskfont_protos.h>
#else
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/console.h>
#include <proto/diskfont.h>
#endif
static BitMapHeader tomb_bmhd;
static struct BitMap *tombimg = NULL;
static const int cols_base[2] = { 154, 319 }; /* X location of center of columns */
static int cols[2]; /* cols_base[] + xoff, computed per call */
static int cno = 0; /* current column */
#define TEXT_TOP (65 + yoff)
static int xoff, yoff; /* image centering */
/* terrible kludge */
/* this is why prototypes should have ONLY types in them! */
#undef red
#undef green
#undef blue
#ifdef _DCC
#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
#else
#include <proto/graphics.h>
#include <proto/intuition.h>
#endif
#endif /* AZTEC_C */
static struct Window *ripwin = 0;
static void tomb_text(char *);
static void dofade(int, int, int);
static int search_cmap(int, int, int);
#define STONE_LINE_LEN \
13 /* # chars that fit on one line \
* (note 1 ' ' border) */
#define DEATH_LINE 10
#define YEAR_LINE 15
static unsigned short tomb_line;
extern struct amii_DisplayDesc *amiIDisplay;
extern struct Screen *HackScreen;
extern int havelace;
static unsigned short transpalette[AMII_MAXCOLORS] = {
0x0000,
};
static struct NewWindow newwin = { 0, 0, 640, 200, 1, 0,
MOUSEBUTTONS | VANILLAKEY | NOCAREREFRESH,
BORDERLESS | ACTIVATE | SMART_REFRESH,
NULL, NULL, (UBYTE *) NULL, NULL, NULL, -1,
-1, 0xffff, 0xffff, CUSTOMSCREEN };
int wh; /* was local in outrip, but needed for SCALE macro */
int cmap_white, cmap_black;
void
amii_outrip(winid tmpwin, int how, time_t when)
{
int just_return = 0;
int done, rtxth;
struct IntuiMessage *imsg;
int i;
char *dpx;
char buf[200];
int line, tw, ww;
long year;
if (!WINVERS_AMIV || HackScreen->RastPort.BitMap->Depth < 4)
goto cleanup;
/* Use the users display size */
newwin.Height = amiIDisplay->ypix - newwin.TopEdge;
newwin.Width = amiIDisplay->xpix;
newwin.Screen = HackScreen;
for (i = 0; i < amii_numcolors; ++i)
sysflags.amii_curmap[i] = GetRGB4(HackScreen->ViewPort.ColorMap, i);
ripwin = OpenWindow((void *) &newwin);
if (!ripwin)
goto cleanup;
LoadRGB4(&HackScreen->ViewPort, transpalette, amii_numcolors);
rp = ripwin->RPort;
wh = ripwin->Height;
ww = ripwin->Width;
#ifdef HACKFONT
if (HackFont)
SetFont(rp, HackFont);
#endif
tomb_bmhd = ReadImageFile("tomb.iff", &tombimg);
if (tomb_bmhd.w > ww || tomb_bmhd.h > wh)
goto cleanup;
#define GENOFF(full, used) ((((full) - (used)) / 2) & ~7)
xoff = GENOFF(ww, tomb_bmhd.w);
yoff = GENOFF(wh, tomb_bmhd.h);
for (i = 0; i < SIZE(cols); i++)
cols[i] = cols_base[i] + xoff;
cmap_white = search_cmap(0, 0, 0);
cmap_black = search_cmap(15, 15, 15);
BltBitMap(tombimg, 0, 0, rp->BitMap, xoff, yoff, tomb_bmhd.w, tomb_bmhd.h,
0xc0, 0xff, NULL);
/* Put together death description */
formatkiller(buf, sizeof buf, how, FALSE);
tw = TextLength(rp, buf, STONE_LINE_LEN) + 40;
{
char *p = buf;
int x, tmp;
for (x = STONE_LINE_LEN; x; x--)
*p++ = 'W';
*p = '\0';
tmp = TextLength(rp, buf, STONE_LINE_LEN) + 40;
tw = max(tw, tmp);
}
/* There are 5 lines of text on the stone. */
rtxth = ripwin->RPort->TxHeight * 5;
SetAfPt(rp, (UWORD *) NULL, 0);
SetDrPt(rp, 0xFFFF);
tomb_line = TEXT_TOP;
SetDrMd(rp, JAM1);
/* Put name on stone */
Sprintf(buf, "%s", svp.plname);
buf[STONE_LINE_LEN] = 0;
tomb_text(buf);
/* Put $ on stone */
Sprintf(buf, "%ld Au", gd.done_money);
buf[STONE_LINE_LEN] = 0; /* It could be a *lot* of gold :-) */
tomb_text(buf);
/* Put together death description */
formatkiller(buf, sizeof buf, how, FALSE);
/* Put death type on stone */
for (line = DEATH_LINE, dpx = buf; line < YEAR_LINE; line++) {
int i, i0;
char tmpchar;
if ((i0 = strlen(dpx)) > STONE_LINE_LEN) {
for (i = STONE_LINE_LEN; ((i0 > STONE_LINE_LEN) && i); i--) {
if (dpx[i] == ' ')
i0 = i;
}
if (!i)
i0 = STONE_LINE_LEN;
}
tmpchar = dpx[i0];
dpx[i0] = 0;
tomb_text(dpx);
if (tmpchar != ' ') {
dpx[i0] = tmpchar;
dpx = &dpx[i0];
} else {
dpx = &dpx[i0 + 1];
}
}
/* Put year on stone */
year = yyyymmdd(when) / 10000L;
Sprintf(buf, "%4ld", year);
tomb_text(buf);
#ifdef NH320_DEDICATION
/* dedication */
cno = 1;
tomb_line = TEXT_TOP;
tomb_text("This release");
tomb_text("of NetHack");
tomb_text("is dedicated");
tomb_text("to the");
tomb_text("memory of");
tomb_text("");
tomb_text("Izchak");
tomb_text(" Miller");
tomb_text("");
tomb_text("1935-1994");
tomb_text("");
tomb_text("Ascended");
#endif
/* Fade from black to full color */
dofade(0, 16, 1);
/* Flush all messages to avoid typeahead */
while (imsg = (struct IntuiMessage *) GetMsg(ripwin->UserPort))
ReplyMsg((struct Message *) imsg);
done = 0;
while (!done) {
WaitPort(ripwin->UserPort);
while (imsg = (struct IntuiMessage *) GetMsg(ripwin->UserPort)) {
switch (imsg->Class) {
case MOUSEBUTTONS:
case VANILLAKEY:
done = 1;
break;
}
ReplyMsg((struct Message *) imsg);
}
}
/* Fade out */
dofade(16, 0, -1);
just_return = 1;
cleanup:
/* free everything */
if (ripwin) {
Forbid();
while (imsg = (struct IntuiMessage *) GetMsg(ripwin->UserPort))
ReplyMsg((struct Message *) imsg);
CloseWindow(ripwin);
Permit();
}
LoadRGB4(&HackScreen->ViewPort, sysflags.amii_curmap, amii_numcolors);
FreeImageFile(&tombimg);
if (just_return)
return;
/* fall back to the straight-ASCII version */
genl_outrip(tmpwin, how, when);
}
static void
tomb_text(char *p)
{
char buf[STONE_LINE_LEN * 2];
int l;
tomb_line += rp->TxHeight;
if (!*p)
return;
sprintf(buf, " %s ", p);
l = TextLength(rp, buf, strlen(buf));
SetAPen(rp, cmap_white);
Move(rp, cols[cno] - (l / 2) - 1, tomb_line);
Text(rp, buf, strlen(buf));
SetAPen(rp, cmap_white);
Move(rp, cols[cno] - (l / 2) + 1, tomb_line);
Text(rp, buf, strlen(buf));
SetAPen(rp, cmap_white);
Move(rp, cols[cno] - (l / 2), tomb_line - 1);
Text(rp, buf, strlen(buf));
SetAPen(rp, cmap_white);
Move(rp, cols[cno] - (l / 2), tomb_line + 1);
Text(rp, buf, strlen(buf));
SetAPen(rp, cmap_black);
Move(rp, cols[cno] - (l / 2), tomb_line);
Text(rp, buf, strlen(buf));
}
/* search colormap for best match to given color */
static int
search_cmap(int r0, int g0, int b0)
{
int best = 0;
int bdiff = 0x0fffffff;
int x;
for (x = 0; x < amii_numcolors; x++) {
int r = r0 - ((amiv_init_map[x] >> 8) & 15);
int g = g0 - ((amiv_init_map[x] >> 4) & 15);
int b = b0 - ((amiv_init_map[x]) & 15);
int diff = (r * r) + (g * g) + (b * b);
if (diff < bdiff) {
bdiff = diff;
best = x;
}
}
return best;
}
/* caution: this is NOT general! */
static void
dofade(int start, int stop, int inc)
{
int i, j;
for (i = start; (i * inc) <= stop; i += inc) {
for (j = 0; j < amii_numcolors; ++j) {
int r, g, b;
r = (amiv_init_map[j] & 0xf00) >> 8;
g = (amiv_init_map[j] & 0xf0) >> 4;
b = (amiv_init_map[j] & 0xf);
r = (r * i) / 16;
g = (g * i) / 16;
b = (b * i) / 16;
transpalette[j] = ((r << 8) | (g << 4) | b);
}
LoadRGB4(&HackScreen->ViewPort, transpalette, amii_numcolors);
Delay(1);
}
}
#endif /* AMII_GRAPHICS */
/*
TODO:
memory leaks
fix ReadImageFiles to return error instead of panic on error
*/

27
sys/amiga/amistack.c Normal file
View File

@@ -0,0 +1,27 @@
/* NetHack 3.6 amistack.c $NHDT-Date: 1432512795 2015/05/25 00:13:15 $ $NHDT-Branch: master $:$NHDT-Revision: 1.8 $ */
/* Copyright (c) Janne Salmij<69>rvi, Tampere, Finland, 2000 */
/* NetHack may be freely redistributed. See license for details. */
/*
* Increase stack size to allow deep recursions.
*
* Note: This is SAS/C specific, using other compiler probably
* requires another method for increasing stack.
*
*/
#ifdef __SASC_60
#include <dos.h>
#endif
/*
* Increase stack size to allow deep recursions.
* NetHack 3.7 with Lua needs significantly more stack than 3.6.
*/
#ifdef __SASC_60
long __stack = 256 * 1024;
#else
/* For GCC with -noixemul (libnix), __stack is also recognized */
unsigned long __stack = 256 * 1024;
#endif

85
sys/amiga/amitty.c Normal file
View File

@@ -0,0 +1,85 @@
/* NetHack 3.6 amitty.c $NHDT-Date: 1432512795 2015/05/25 00:13:15 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* Copyright (c) Kenneth Lorber, Bethesda, Maryland 1993,1996 */
/* NetHack may be freely redistributed. See license for details. */
/* TTY-specific code for the Amiga
* This is still experimental.
* Still to do:
* add real termcap handling - currently requires ANSI_DEFAULT
*/
#include "hack.h"
#include "tcap.h"
#include <stdio.h>
#include <proto/dos.h>
#ifdef _DCC
#define getch() getchar()
#endif
#ifdef __SASC_60
#include <clib/dos_protos.h>
#endif
void tty_change_color(void);
char *tty_get_color_string(void);
int amibbs = 0; /* BBS mode */
char bbs_id[80] = ""; /* BBS uid equivalent */
long afh_in, afh_out; /* BBS mode Amiga filehandles */
#ifdef TTY_GRAPHICS
void
settty(const char *s)
{
end_screen();
if (s)
raw_print(s);
iflags.cbreak = ON; /* this is too easy: probably wrong */
#if 1 /* should be version>=36 */
/* if(IsInteractive(afh_in)){ */
SetMode(afh_in, 0); /* con mode */
/* } */
#endif
}
void
gettty()
{
#if 1 /* should be VERSION >=36 */
/* if(IsInteractive(afh_in)){ */
SetMode(afh_in, 1); /* raw mode */
/* } */
#endif
}
void
setftty()
{
iflags.cbreak = ON; /* ditto */
}
char kill_char = 'X' - '@';
char erase_char = '\b';
int
tgetch(void)
{
unsigned char x;
Read(afh_in, &x, 1);
return (x == '\r') ? '\n' : x;
}
void
get_scr_size()
{
CO = 80;
LI = 24;
}
#endif
void
tty_change_color()
{
}
char *
tty_get_color_string()
{
return ("");
}

913
sys/amiga/amiwind.c Normal file
View File

@@ -0,0 +1,913 @@
/* NetHack 3.6 amiwind.c $NHDT-Date: 1432512794 2015/05/25 00:13:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */
/* Copyright (c) Olaf Seibert (KosmoSoft), 1989, 1992 */
/* Copyright (c) Kenneth Lorber, Bethesda, Maryland 1993,1996 */
/* NetHack may be freely redistributed. See license for details. */
#ifndef CROSS_TO_AMIGA
#include "NH:sys/amiga/windefs.h"
#include "NH:sys/amiga/winext.h"
#include "NH:sys/amiga/winproto.h"
#else
#include "windefs.h"
#include "winext.h"
#include "winproto.h"
#endif
/* Have to undef CLOSE as display.h and intuition.h both use it */
#undef CLOSE
#ifdef AMII_GRAPHICS /* too early in the file? too late? */
#ifdef AMIFLUSH
static struct Message *GetFMsg(struct MsgPort *);
#endif
static int BufferGetchar(void);
static void ProcessMessage(struct IntuiMessage *message);
#define BufferQueueChar(ch) (KbdBuffer[KbdBuffered++] = (ch))
struct Device *ConsoleDevice = NULL;
/* Library bases - opened by amii_init_nhwindows, closed by amii_cleanup.
DOSBase is provided by newlib's startup code.
The rest must be defined here. */
struct IntuitionBase *IntuitionBase = NULL;
struct GfxBase *GfxBase = NULL;
struct Library *GadToolsBase = NULL;
struct Library *LayersBase = NULL;
struct Library *AslBase = NULL;
#ifndef CROSS_TO_AMIGA
#include "NH:sys/amiga/amimenu.c"
#else
#include "amimenu.c"
#endif
/* Now our own variables */
struct Screen *HackScreen;
struct Window *pr_WindowPtr;
struct MsgPort *HackPort;
struct IOStdReq ConsoleIO;
struct Menu *MenuStrip;
APTR *VisualInfo;
char Initialized = 0;
WEVENT lastevent;
#ifdef HACKFONT
struct Library *DiskfontBase;
#endif
#define KBDBUFFER 10
static unsigned char KbdBuffer[KBDBUFFER];
unsigned char KbdBuffered;
#ifdef HACKFONT
struct TextFont *TextsFont = NULL;
struct TextFont *HackFont = NULL;
struct TextFont *RogueFont = NULL;
UBYTE FontName[] = "NetHack:hack.font";
/* # chars in "NetHack:": */
#define SIZEOF_DISKNAME 8
#endif
struct TextAttr Hack80 = {
#ifdef HACKFONT
&FontName[SIZEOF_DISKNAME],
#else
(UBYTE *) "topaz.font",
#endif
8, FS_NORMAL, FPF_DISKFONT | FPF_DESIGNED | FPF_ROMFONT
};
struct TextAttr TextsFont13 = { (UBYTE *) "courier.font", 13, FS_NORMAL,
FPF_DISKFONT | FPF_DESIGNED
#ifndef HACKFONT
| FPF_ROMFONT
#endif
};
/* Avoid doing a ReplyMsg through a window that no longer exists. */
static enum { NoAction, CloseOver } delayed_key_action = NoAction;
/*
* Open a window that shares the HackPort IDCMP. Use CloseShWindow()
* to close.
*/
struct Window *
OpenShWindow(struct NewWindow *nw)
{
struct Window *win;
ULONG idcmpflags;
if (!HackPort) /* Sanity check */
return (struct Window *) 0;
idcmpflags = nw->IDCMPFlags;
nw->IDCMPFlags = 0;
if (!(win = OpenWindow((void *) nw))) {
nw->IDCMPFlags = idcmpflags;
return (struct Window *) 0;
}
nw->IDCMPFlags = idcmpflags;
win->UserPort = HackPort;
ModifyIDCMP(win, idcmpflags);
return win;
}
/*
* Close a window that shared the HackPort IDCMP port.
*/
void
CloseShWindow(struct Window *win)
{
struct IntuiMessage *msg;
if (!HackPort)
panic("HackPort NULL in CloseShWindow");
if (!win)
return;
Forbid();
/* Flush all messages for all windows to avoid typeahead and other
* similar problems...
*/
while (msg = (struct IntuiMessage *) GetMsg(win->UserPort))
ReplyMsg((struct Message *) msg);
KbdBuffered = 0;
win->UserPort = (struct MsgPort *) 0;
ModifyIDCMP(win, 0L);
Permit();
CloseWindow(win);
}
static int
BufferGetchar(void)
{
int c;
if (KbdBuffered > 0) {
c = KbdBuffer[0];
KbdBuffered--;
/* Move the remaining characters */
if (KbdBuffered < sizeof(KbdBuffer))
memcpy(KbdBuffer, KbdBuffer + 1, KbdBuffered);
return c;
}
return NO_CHAR;
}
/*
* This should remind you remotely of DeadKeyConvert, but we are cheating
* a bit. We want complete control over the numeric keypad, and no dead
* keys... (they are assumed to be on Alted keys).
*
* Also assumed is that the IntuiMessage is of type RAWKEY. For some
* reason, IECODE_UP_PREFIX events seem to be lost when they occur while
* our console window is inactive. This is particulary troublesome with
* qualifier keys... Is this because I never RawKeyConvert those events???
*/
int
ConvertKey(struct IntuiMessage *message)
{
static struct InputEvent theEvent;
static char numpad[] = "bjnh.lyku";
static char ctrl_numpad[] = "\x02\x0A\x0E\x08.\x0C\x19\x0B\x15";
static char shift_numpad[] = "BJNH.LYKU";
unsigned char buffer[10];
struct Window *w = message->IDCMPWindow;
int length;
ULONG qualifier;
char numeric_pad, shift, control, alt;
if (amii_wins[WIN_MAP])
w = amii_wins[WIN_MAP]->win;
qualifier = message->Qualifier;
control = (qualifier & IEQUALIFIER_CONTROL) != 0;
shift = (qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) != 0;
alt = (qualifier & (IEQUALIFIER_LALT | IEQUALIFIER_RALT)) != 0;
/* Allow ALT to function as a META key ... */
/* But make it switchable - alt is needed for some non-US keymaps */
if (sysflags.altmeta)
qualifier &= ~(IEQUALIFIER_LALT | IEQUALIFIER_RALT);
numeric_pad = (qualifier & IEQUALIFIER_NUMERICPAD) != 0;
/*
* Shortcut for HELP and arrow keys. I suppose this is allowed.
* The defines are in intuition/intuition.h, and the keys don't
* serve 'text' input, normally. Also, parsing their escape
* sequences is such a mess...
*/
switch (message->Code) {
case RAWHELP:
if (alt) {
EditColor();
return (-1);
}
#ifdef CLIPPING
else if (WINVERS_AMIV && control) {
EditClipping();
CO = (w->Width - w->BorderLeft - w->BorderRight) / mxsize;
LI = (w->Height - w->BorderTop - w->BorderBottom) / mysize;
clipxmax = CO + clipx;
clipymax = LI + clipy;
if (CO < COLNO || LI < ROWNO) {
clipping = TRUE;
amii_cliparound(u.ux, u.uy);
} else {
clipping = FALSE;
clipx = clipy = 0;
}
BufferQueueChar('R' - 64);
return (-1);
}
#endif
else if (WINVERS_AMIV && shift) {
if (WIN_OVER == WIN_ERR) {
WIN_OVER = amii_create_nhwindow(NHW_OVER);
BufferQueueChar('R' - 64);
} else {
delayed_key_action = CloseOver;
}
return (-1);
}
return ('?');
break;
case CURSORLEFT:
length = '4';
numeric_pad = 1;
goto arrow;
case CURSORDOWN:
length = '2';
numeric_pad = 1;
goto arrow;
case CURSORUP:
length = '8';
numeric_pad = 1;
goto arrow;
case CURSORRIGHT:
length = '6';
numeric_pad = 1;
goto arrow;
}
theEvent.ie_Class = IECLASS_RAWKEY;
theEvent.ie_Code = message->Code;
theEvent.ie_Qualifier = numeric_pad ? IEQUALIFIER_NUMERICPAD : qualifier;
theEvent.ie_EventAddress = (APTR)(message->IAddress);
length = RawKeyConvert(&theEvent, (char *) buffer, (long) sizeof(buffer),
NULL);
if (length == 1) { /* Plain ASCII character */
length = buffer[0];
/*
* If iflags.num_pad is set, movement is by 4286.
* If not set, translate 4286 into hjkl.
* This way, the numeric pad can /always/ be used
* for moving, though best results are when it is off.
*/
arrow:
if (!iflags.num_pad && numeric_pad && length >= '1'
&& length <= '9') {
length -= '1';
if (control) {
length = ctrl_numpad[length];
} else if (shift) {
length = shift_numpad[length];
} else {
length = numpad[length];
}
}
/* Kludge to allow altmeta on eg. scandinavian keymap (# ==
shift+alt+3)
and prevent it from interfering with # command (M-#) */
if (length == ('#' | 0x80))
return '#';
if (alt && sysflags.altmeta)
length |= 0x80;
return (length);
} /* else shift, ctrl, alt, amiga, F-key, shift-tab, etc */
else if (length > 1) {
int i;
if (length == 3 && buffer[0] == 155 && buffer[2] == 126) {
int got = 1;
switch (buffer[1]) {
case 53:
mxsize = mysize = 8;
break;
case 54:
mxsize = mysize = 16;
break;
case 55:
mxsize = mysize = 24;
break;
case 56:
mxsize = mysize = 32;
break;
case 57:
mxsize = mysize = 48;
break;
default:
got = 0;
break;
}
#ifdef OPT_DISPMAP
dispmap_sanity();
#endif
if (got) {
CO = (w->Width - w->BorderLeft - w->BorderRight) / mxsize;
LI = (w->Height - w->BorderTop - w->BorderBottom) / mysize;
clipxmax = CO + clipx;
clipymax = LI + clipy;
if (CO < COLNO || LI < ROWNO) {
amii_cliparound(u.ux, u.uy);
} else {
CO = COLNO;
LI = ROWNO;
}
reclip = 1;
doredraw();
flush_screen(1);
reclip = 0;
/*BufferQueueChar( 'R'-64 );*/
return (-1);
}
}
/* unrecognized key — silently ignore */
}
return (-1);
}
/*
* Process an incoming IntuiMessage.
* It would certainly look nicer if this could be done using a
* PA_SOFTINT message port, but we cannot call RawKeyConvert()
* during a software interrupt.
* Anyway, amikbhit()/kbhit() is called often enough, and usually gets
* ahead of input demands, when the user types ahead.
*/
static void
ProcessMessage(struct IntuiMessage *message)
{
int c;
int cnt;
menu_item *mip;
static int skip_mouse = 0; /* need to ignore next mouse event on
* a window activation */
struct Window *w = message->IDCMPWindow;
switch (message->Class) {
case ACTIVEWINDOW:
skip_mouse = 1;
break;
case MOUSEBUTTONS: {
if (skip_mouse) {
skip_mouse = 0;
break;
}
if (!amii_wins[WIN_MAP] || w != amii_wins[WIN_MAP]->win)
break;
if (message->Code == SELECTDOWN) {
lastevent.type = WEMOUSE;
lastevent.un.mouse.x = message->MouseX;
lastevent.un.mouse.y = message->MouseY;
/* With shift equals RUN */
lastevent.un.mouse.qual =
(message->Qualifier
& (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) != 0;
}
} break;
case MENUPICK: {
USHORT thismenu;
struct MenuItem *item;
thismenu = message->Code;
while (thismenu != MENUNULL) {
item = ItemAddress(MenuStrip, (ULONG) thismenu);
if (KbdBuffered < KBDBUFFER)
BufferQueueChar((char) (GTMENUITEM_USERDATA(item)));
thismenu = item->NextSelect;
}
} break;
case REFRESHWINDOW:
break;
case CLOSEWINDOW:
if (WIN_INVEN != WIN_ERR && w == amii_wins[WIN_INVEN]->win) {
dismiss_nhwindow(WIN_INVEN);
}
if (WINVERS_AMIV
&& (WIN_OVER != WIN_ERR && w == amii_wins[WIN_OVER]->win)) {
destroy_nhwindow(WIN_OVER);
WIN_OVER = WIN_ERR;
}
break;
case RAWKEY:
if (!(message->Code & IECODE_UP_PREFIX)) {
/* May queue multiple characters
* but doesn't do that yet...
*/
if ((c = ConvertKey(message)) > 0)
BufferQueueChar(c);
}
break;
case GADGETDOWN:
break;
case NEWSIZE:
if (WIN_MESSAGE != WIN_ERR && w == amii_wins[WIN_MESSAGE]->win) {
if (WINVERS_AMIV) {
/* Make sure that new size is honored for good. */
SetAPen(w->RPort, amii_msgBPen);
SetBPen(w->RPort, amii_msgBPen);
SetDrMd(w->RPort, JAM2);
RectFill(w->RPort, w->BorderLeft, w->BorderTop,
w->Width - w->BorderRight - 1,
w->Height - w->BorderBottom - 1);
}
ReDisplayData(WIN_MESSAGE);
} else if (WIN_INVEN != WIN_ERR && w == amii_wins[WIN_INVEN]->win) {
ReDisplayData(WIN_INVEN);
} else if (WINVERS_AMIV && (WIN_OVER != WIN_ERR
&& w == amii_wins[WIN_OVER]->win)) {
{
int i, have_redraw = 0;
for (i = 0; i < KbdBuffered; i++) {
if (KbdBuffer[i] == 'R' - 64) {
have_redraw = 1;
break;
}
}
if (!have_redraw)
BufferQueueChar('R' - 64);
}
} else if (WIN_MAP != WIN_ERR && w == amii_wins[WIN_MAP]->win) {
#ifdef CLIPPING
CO = (w->Width - w->BorderLeft - w->BorderRight) / mxsize;
LI = (w->Height - w->BorderTop - w->BorderBottom) / mysize;
clipxmax = CO + clipx;
clipymax = LI + clipy;
if (CO < COLNO || LI < ROWNO) {
amii_cliparound(u.ux, u.uy);
} else {
clipping = FALSE;
clipx = clipy = 0;
}
{
int i, have_redraw = 0;
for (i = 0; i < KbdBuffered; i++) {
if (KbdBuffer[i] == 'R' - 64) {
have_redraw = 1;
break;
}
}
if (!have_redraw)
BufferQueueChar('R' - 64);
}
#endif
}
break;
}
ReplyMsg((struct Message *) message);
switch (delayed_key_action) {
case CloseOver:
amii_destroy_nhwindow(WIN_OVER);
WIN_OVER = WIN_ERR;
delayed_key_action = NoAction;
break;
case NoAction:
break;
}
}
#endif /* AMII_GRAPHICS */
/*
* Get all incoming messages and fill up the keyboard buffer,
* thus allowing Intuition to (maybe) free up the IntuiMessages.
* Return when no more messages left, or keyboard buffer half full.
* We need to do this since there is no one-to-one correspondence
* between characters and incoming messages.
*/
#if defined(TTY_GRAPHICS) && !defined(AMII_GRAPHICS)
int
kbhit(void)
{
return 0;
}
#else
int
kbhit(void)
{
int c;
#ifdef TTY_GRAPHICS
/* a kludge to defuse the mess in allmain.c */
/* I hope this is the right approach */
if (windowprocs.win_init_nhwindows == amii_procs.win_init_nhwindows)
return 0;
#endif
c = amikbhit();
if (c <= 0)
return (0);
return (c);
}
#endif
#ifdef AMII_GRAPHICS
int
amikbhit(void)
{
struct IntuiMessage *message;
while (KbdBuffered < KBDBUFFER / 2) {
#ifdef AMIFLUSH
message = (struct IntuiMessage *) GetFMsg(HackPort);
#else
message = (struct IntuiMessage *) GetMsg(HackPort);
#endif
if (message) {
ProcessMessage(message);
if (lastevent.type != WEUNK && lastevent.type != WEKEY)
break;
} else
break;
}
return (lastevent.type == WEUNK) ? KbdBuffered : -1;
}
/*
* Get a character from the keyboard buffer, waiting if not available.
* Ignore other kinds of events that happen in the mean time.
*/
int
WindowGetchar(void)
{
while ((lastevent.type = WEUNK), amikbhit() <= 0) {
WaitPort(HackPort);
}
return BufferGetchar();
}
WETYPE
WindowGetevent(void)
{
lastevent.type = WEUNK;
while (amikbhit() == 0) {
WaitPort(HackPort);
}
if (KbdBuffered) {
lastevent.type = WEKEY;
lastevent.un.key = BufferGetchar();
}
return (lastevent.type);
}
/*
* Clean up everything. But before we do, ask the user to hit return
* when there is something that s/he should read.
*/
void
amii_cleanup(void)
{
struct IntuiMessage *msg;
/* Close things up */
if (HackPort) {
amii_raw_print("");
amii_getret();
}
if (ConsoleIO.io_Device)
CloseDevice((struct IORequest *) &ConsoleIO);
ConsoleIO.io_Device = 0;
if (ConsoleIO.io_Message.mn_ReplyPort)
DeleteMsgPort(ConsoleIO.io_Message.mn_ReplyPort);
ConsoleIO.io_Message.mn_ReplyPort = 0;
/* Strip messages before deleting the port */
if (HackPort) {
Forbid();
while (msg = (struct IntuiMessage *) GetMsg(HackPort))
ReplyMsg((struct Message *) msg);
kill_nhwindows(1);
DeleteMsgPort(HackPort);
HackPort = NULL;
Permit();
}
/* Close the screen, under v37 or greater it is a pub screen and there may
* be visitors, so check close status and wait till everyone is gone.
*/
if (HackScreen) {
#ifdef INTUI_NEW_LOOK
if (IntuitionBase->LibNode.lib_Version >= 37) {
if (MenuStrip)
FreeMenus(MenuStrip);
if (VisualInfo)
FreeVisualInfo(VisualInfo);
while (CloseScreen(HackScreen) == FALSE) {
struct EasyStruct easy = {
sizeof(struct EasyStruct), 0, "Nethack Problem",
"Can't Close Screen, Close Visiting Windows", "Okay"
};
EasyRequest(NULL, &easy, NULL, NULL);
}
} else
#endif
{
CloseScreen(HackScreen);
}
HackScreen = NULL;
}
#ifdef HACKFONT
if (HackFont) {
CloseFont(HackFont);
HackFont = NULL;
}
if (TextsFont) {
CloseFont(TextsFont);
TextsFont = NULL;
}
if (RogueFont) {
CloseFont(RogueFont);
RogueFont = NULL;
}
if (DiskfontBase) {
CloseLibrary(DiskfontBase);
DiskfontBase = NULL;
}
#endif
if (GadToolsBase) {
CloseLibrary((struct Library *) GadToolsBase);
GadToolsBase = NULL;
}
if (LayersBase) {
CloseLibrary((struct Library *) LayersBase);
LayersBase = NULL;
}
if (GfxBase) {
CloseLibrary((struct Library *) GfxBase);
GfxBase = NULL;
}
if (IntuitionBase) {
CloseLibrary((struct Library *) IntuitionBase);
IntuitionBase = NULL;
}
#ifdef SHAREDLIB
if (DOSBase) {
CloseLibrary((struct Library *) DOSBase);
DOSBase = NULL;
}
#endif
((struct Process *) FindTask(NULL))->pr_WindowPtr = (APTR) pr_WindowPtr;
Initialized = 0;
}
#endif /* AMII_GRAPHICS */
#ifndef SHAREDLIB
void
Abort(long rc)
{
int fault = 1;
#ifdef CHDIR
extern char orgdir[];
chdir(orgdir);
#endif
#ifdef AMII_GRAPHICS
if (Initialized && ConsoleDevice
&& windowprocs.win_init_nhwindows == amii_procs.win_init_nhwindows) {
printf("\n\nAbort with alert code %08lx...\n", rc);
amii_getret();
} else
#endif
printf("\n\nAbort with alert code %08lx...\n", rc);
/* Alert(rc); this is too severe */
#ifdef __SASC
#ifdef INTUI_NEW_LOOK
if (IntuitionBase->LibNode.lib_Version >= 37) {
struct EasyStruct es = {
sizeof(struct EasyStruct), 0, "NetHack Panic Request",
"NetHack is Aborting with code == 0x%08lx",
"Continue Abort|Return to Program|Clean up and exit",
};
fault = EasyRequest(NULL, &es, NULL, (long) rc);
if (fault == 2)
return;
}
#endif
if (fault == 1) {
/* __emit(0x4afc); */ /* illegal instruction */
__emit(0x40fc); /* divide by */
__emit(0x0000); /* #0 */
/* NOTE: don't move amii_cleanup() above here - */
/* it is too likely to kill the system */
/* before it can get the SnapShot out, if */
/* there is something really wrong. */
}
#endif
#ifdef AMII_GRAPHICS
if (windowprocs.win_init_nhwindows == amii_procs.win_init_nhwindows)
amii_cleanup();
#endif
#undef exit
#ifdef AZTEC_C
_abort();
#endif
exit((int) rc);
}
void
CleanUp(void)
{
amii_cleanup();
}
#endif
#ifdef AMII_GRAPHICS
#ifdef AMIFLUSH
/* This routine adapted from AmigaMail IV-37 by Michael Sinz */
static struct Message *
GetFMsg(struct MsgPort *port)
{
struct IntuiMessage *msg, *succ, *succ1;
if (msg = (struct IntuiMessage *) GetMsg(port)) {
if (!sysflags.amiflush)
return ((struct Message *) msg);
if (msg->Class == RAWKEY) {
Forbid();
succ = (struct IntuiMessage *) (port->mp_MsgList.lh_Head);
while (succ1 = (struct IntuiMessage *) (succ->ExecMessage.mn_Node
.ln_Succ)) {
if (succ->Class == RAWKEY) {
Remove((struct Node *) succ);
ReplyMsg((struct Message *) succ);
}
succ = succ1;
}
Permit();
}
}
return ((struct Message *) msg);
}
#endif
struct NewWindow *
DupNewWindow(struct NewWindow *win)
{
struct NewWindow *nwin;
struct Gadget *ngd, *gd, *pgd = NULL;
struct PropInfo *pip;
struct StringInfo *sip;
/* Copy the (Ext)NewWindow structure */
nwin = (struct NewWindow *) alloc(sizeof(struct NewWindow));
*nwin = *win;
/* Now do the gadget list */
nwin->FirstGadget = NULL;
for (gd = win->FirstGadget; gd; gd = gd->NextGadget) {
ngd = (struct Gadget *) alloc(sizeof(struct Gadget));
*ngd = *gd;
if (gd->GadgetType == STRGADGET) {
sip = (struct StringInfo *) alloc(sizeof(struct StringInfo));
*sip = *((struct StringInfo *) gd->SpecialInfo);
sip->Buffer = (UBYTE *) alloc(sip->MaxChars);
*sip->Buffer = 0;
ngd->SpecialInfo = (APTR) sip;
} else if (gd->GadgetType == PROPGADGET) {
pip = (struct PropInfo *) alloc(sizeof(struct PropInfo));
*pip = *((struct PropInfo *) gd->SpecialInfo);
ngd->SpecialInfo = (APTR) pip;
}
if (pgd)
pgd->NextGadget = ngd;
else
nwin->FirstGadget = ngd;
pgd = ngd;
ngd->NextGadget = NULL;
ngd->UserData = (APTR) 0x45f35c3d; // magic cookie for FreeNewWindow()
}
return (nwin);
}
void
FreeNewWindow(struct NewWindow *win)
{
struct Gadget *gd, *pgd;
struct StringInfo *sip;
for (gd = win->FirstGadget; gd; gd = pgd) {
pgd = gd->NextGadget;
if ((ULONG) gd->UserData == 0x45f35c3d) {
if (gd->GadgetType == STRGADGET) {
sip = (struct StringInfo *) gd->SpecialInfo;
free(sip->Buffer);
free(sip);
} else if (gd->GadgetType == PROPGADGET) {
free((struct PropInfo *) gd->SpecialInfo);
}
free(gd);
}
}
free(win);
}
void
bell(void)
{
if (flags.silent)
return;
DisplayBeep(NULL);
}
void
amii_delay_output(void)
{
/* delay 50 ms */
Delay(2L);
}
void
amii_number_pad(int state)
{
}
#endif /* AMII_GRAPHICS */
#ifndef SHAREDLIB
void
amiv_loadlib(void)
{
}
void
amii_loadlib(void)
{
}
#ifdef CROSS_TO_AMIGA
extern void Abort(long) NORETURN;
#endif
/* fatal error */
/*VARARGS1*/
void error
VA_DECL(const char *, s)
{
VA_START(s);
VA_INIT(s, char *);
putchar('\n');
vprintf(s, VA_ARGS);
putchar('\n');
VA_END();
Abort(0L);
}
#endif

40
sys/amiga/amiwind.p Normal file
View File

@@ -0,0 +1,40 @@
/* NetHack 3.6 amiwind.p $NHDT-Date: 1432512795 2015/05/25 00:13:15 $ $NHDT-Branch: master $:$NHDT-Revision: 1.6 $ */
/* Copyright (c) Gregg Wonderly, Naperville, IL, 1992, 1993 */
/* NetHack may be freely redistributed. See license for details. */
/* amiwind.c */
#ifdef INTUI_NEW_LOOK
struct Window * OpenShWindow(struct ExtNewWindow *) ;
#else
struct Window * OpenShWindow(struct NewWindow *) ;
#endif
void CloseShWindow(struct Window *);
int kbhit (void);
int amikbhit (void);
int WindowGetchar (void);
WETYPE WindowGetevent (void);
void WindowFlush (void);
void WindowPutchar(char );
void WindowFPuts(const char *);
void WindowPuts(const char *);
void WindowPrintf( char *,... );
void CleanUp (void);
int ConvertKey( struct IntuiMessage * );
#ifndef SHAREDLIB
void Abort(long );
#endif
void flush_glyph_buffer(struct Window *);
void amiga_print_glyph(winid , int , int );
void start_glyphout(winid );
void amii_end_glyphout(winid );
#ifdef INTUI_NEW_LOOK
struct ExtNewWindow * DupNewWindow(struct ExtNewWindow *);
void FreeNewWindow(struct ExtNewWindow *);
#else
struct NewWindow * DupNewWindow(struct NewWindow *);
void FreeNewWindow(struct NewWindow *);
#endif
void bell (void);
void amii_delay_output (void);
void amii_number_pad(int );
void amii_cleanup( void );

480
sys/amiga/bmp2iff_host.c Normal file
View File

@@ -0,0 +1,480 @@
/*
* bmp2iff_host.c - Convert a BMP to Amiga BMAP IFF.
* Copyright (c) 2026 by Ingo Paschke.
* NetHack may be freely redistributed. See license for details.
*
* IFF BMAP format matches sys/amiga/xpm2iff.c by Gregg Wonderly.
*
* Usage: bmp2iff_host -planes N input.bmp output.iff
*
* This is a HOST tool -- runs on the build machine.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#define TILE_X 16
#define TILE_Y 16
#pragma pack(push,1)
typedef struct {
uint16_t bfType;
uint32_t bfSize;
uint16_t bfReserved1, bfReserved2;
uint32_t bfOffBits;
} BMPFILEHEADER;
typedef struct {
uint32_t biSize;
int32_t biWidth, biHeight;
uint16_t biPlanes, biBitCount;
uint32_t biCompression;
uint32_t biSizeImage;
int32_t biXPelsPerMeter, biYPelsPerMeter;
uint32_t biClrUsed, biClrImportant;
} BMPINFOHEADER;
#pragma pack(pop)
typedef struct {
uint8_t r, g, b;
} RGB;
/* --------------------------------------------------------- */
/* Fixed 16-color AMIV UI palette */
/* Must match amiv_init_map[] in winami.c */
/* --------------------------------------------------------- */
static const RGB amiv_pal[16] = {
{0x00,0x00,0x00}, /* 0 black */
{0xFF,0xFF,0xFF}, /* 1 white */
{0x00,0xBB,0xFF}, /* 2 cyan */
{0xFF,0x66,0x00}, /* 3 orange */
{0x00,0x00,0xFF}, /* 4 blue */
{0x00,0x99,0x00}, /* 5 green */
{0x66,0x99,0xBB}, /* 6 grey */
{0xFF,0x00,0x00}, /* 7 red */
{0x66,0xFF,0x00}, /* 8 ltgreen */
{0xFF,0xFF,0x00}, /* 9 yellow */
{0xFF,0x00,0xFF}, /* 10 magenta */
{0x99,0x44,0x00}, /* 11 brown */
{0x44,0x66,0x66}, /* 12 greyblue */
{0xCC,0x44,0x00}, /* 13 ltbrown */
{0xDD,0xDD,0xBB}, /* 14 ltgrey */
{0xFF,0xBB,0x99}, /* 15 peach */
};
/* --------------------------------------------------------- */
/* Colour helpers */
/* --------------------------------------------------------- */
static int
coldist(const RGB *a, const RGB *b)
{
int dr = a->r - b->r;
int dg = a->g - b->g;
int db = a->b - b->b;
return dr*dr + dg*dg + db*db;
}
static int
nearest(const RGB *c, const RGB *pal, int n)
{
int best = 0, bestd = 0x7fffffff, i;
for (i = 0; i < n; i++) {
int d = coldist(c, &pal[i]);
if (d < bestd) { bestd = d; best = i; }
}
return best;
}
/* --------------------------------------------------------- */
/* IFF output */
/* --------------------------------------------------------- */
static FILE *iff_fp;
static void
wr32(uint32_t v)
{
uint8_t b[4] = { v>>24, v>>16, v>>8, v };
fwrite(b, 1, 4, iff_fp);
}
static void
wr_chunk(const char *id, const void *d, uint32_t len)
{
fwrite(id, 1, 4, iff_fp);
wr32(len);
fwrite(d, 1, len, iff_fp);
if (len & 1) fputc(0, iff_fp);
}
static void
iff_write(int nplanes, int ncolors, uint8_t *cmap,
int w, int h, uint8_t **planes,
int ntiles, int across, int down)
{
long spos;
uint32_t plsz = (uint32_t)(w / 8) * h;
int i;
fwrite("FORM", 1, 4, iff_fp);
spos = ftell(iff_fp);
wr32(0);
fwrite("BMAP", 1, 4, iff_fp);
/* BMHD */
{
uint8_t bm[20];
memset(bm, 0, 20);
bm[0] = w >> 8; bm[1] = w;
bm[2] = h >> 8; bm[3] = h;
bm[8] = (uint8_t)nplanes;
bm[14] = 100; bm[15] = 100;
wr_chunk("BMHD", bm, 20);
}
/* CAMG */
{
uint8_t c[4] = {0,0,0x80,0x04};
wr_chunk("CAMG", c, 4);
}
/* CMAP */
wr_chunk("CMAP", cmap, (uint32_t)ncolors * 3);
/* PDAT */
{
uint8_t pd[28], *p = pd;
uint32_t v[7];
v[0] = nplanes;
v[1] = plsz;
v[2] = across;
v[3] = down;
v[4] = ntiles;
v[5] = TILE_X;
v[6] = TILE_Y;
for (i = 0; i < 7; i++) {
p[0] = (v[i]>>24); p[1] = (v[i]>>16);
p[2] = (v[i]>> 8); p[3] = v[i];
p += 4;
}
wr_chunk("PDAT", pd, 28);
}
/* PLNE */
fwrite("PLNE", 1, 4, iff_fp);
wr32(plsz * nplanes);
for (i = 0; i < nplanes; i++)
fwrite(planes[i], 1, plsz, iff_fp);
/* fix FORM size */
{
long end = ftell(iff_fp);
uint32_t sz = (uint32_t)(end - spos - 4);
fseek(iff_fp, spos, SEEK_SET);
wr32(sz);
fseek(iff_fp, 0, SEEK_END);
}
}
/* --------------------------------------------------------- */
/* Pixel-to-bitplane conversion */
/* --------------------------------------------------------- */
static void
to_planes(uint8_t *pix, int w, int h,
int np, uint8_t **pl)
{
int rb = w / 8;
int x, y, p;
for (p = 0; p < np; p++)
memset(pl[p], 0, rb * h);
for (y = 0; y < h; y++)
for (x = 0; x < w; x++) {
uint8_t v = pix[y * w + x];
int off = y * rb + x / 8;
int bit = 7 - (x & 7);
for (p = 0; p < np; p++)
if (v & (1 << p))
pl[p][off] |= (1 << bit);
}
}
/* --------------------------------------------------------- */
/* Palette building */
/* --------------------------------------------------------- */
/*
* Build an output palette of 'maxcol' entries:
* - slots 0-15: fixed AMIV UI colors
* - slots 16+: tile colors from the BMP
*
* Returns remap[0..nsrc-1] mapping BMP palette index
* to output palette index.
*/
static void
build_palette(const RGB *src, int nsrc,
const uint8_t *pix, int npix,
int maxcol,
RGB *out, int *remap)
{
int freq[256] = {0};
int order[256];
int i, j, nfree, nuniq;
/* count pixel frequency per BMP palette entry */
for (i = 0; i < npix; i++)
freq[pix[i]]++;
/* sort BMP colors by frequency (descending) */
for (i = 0; i < nsrc; i++) order[i] = i;
for (i = 1; i < nsrc; i++) {
int k = order[i], kf = freq[k];
j = i - 1;
while (j >= 0 && freq[order[j]] < kf) {
order[j+1] = order[j];
j--;
}
order[j+1] = k;
}
/* count unique colors actually used */
nuniq = 0;
for (i = 0; i < nsrc; i++)
if (freq[i] > 0) nuniq++;
/* first 16 slots are AMIV UI */
for (i = 0; i < 16 && i < maxcol; i++)
out[i] = amiv_pal[i];
for (i = 16; i < maxcol; i++)
memset(&out[i], 0, sizeof(RGB));
nfree = maxcol - 16;
if (nfree < 0) nfree = 0;
/*
* Case 1: enough free slots for all unique colors.
* Assign each unique BMP color its own pen, exact
* AMIV matches share the UI pen.
*/
if (nuniq <= nfree) {
int next = 16;
for (i = 0; i < nsrc; i++) {
if (freq[i] == 0) {
remap[i] = 0;
continue;
}
/* exact match to an AMIV pen? */
int best = nearest(&src[i], amiv_pal, 16);
if (coldist(&src[i], &amiv_pal[best]) == 0) {
remap[i] = best;
} else {
remap[i] = next;
out[next] = src[i];
next++;
}
}
return;
}
/*
* Case 2: more unique colors than free slots.
* - Direct/near AMIV matches use UI pens.
* - Remaining slots filled by most-frequent colors.
* - Leftovers mapped to nearest in final palette.
*/
{
int next = 16;
int assigned[256];
memset(assigned, 0, sizeof(assigned));
/* pass 1: exact/near AMIV matches */
for (i = 0; i < nsrc; i++) {
if (freq[i] == 0) {
remap[i] = 0;
assigned[i] = 1;
continue;
}
int best = nearest(&src[i], amiv_pal, 16);
int d = coldist(&src[i], &amiv_pal[best]);
if (d < 200) { /* near match threshold */
remap[i] = best;
assigned[i] = 1;
}
}
/* pass 2: fill free slots with most-frequent
* unassigned colors (order[] is freq-sorted) */
for (i = 0; i < nsrc && next < maxcol; i++) {
int idx = order[i];
if (assigned[idx] || freq[idx] == 0)
continue;
remap[idx] = next;
out[next] = src[idx];
assigned[idx] = 1;
next++;
}
/* pass 3: map remaining to nearest in palette */
for (i = 0; i < nsrc; i++) {
if (!assigned[i])
remap[i] = nearest(&src[i], out, next);
}
}
}
/* --------------------------------------------------------- */
/* Main */
/* --------------------------------------------------------- */
int
main(int argc, char **argv)
{
FILE *bmpfp;
BMPFILEHEADER fhdr;
BMPINFOHEADER ihdr;
RGB palette[256];
int ncolors, img_w, img_h, rowstride;
uint8_t *bmpdata, *pixels;
int ntiles, across, down;
int nplanes, maxcol;
int i, y;
RGB outpal[256];
int remap[256];
uint8_t *remapped;
uint8_t *plane_data[8];
uint8_t cmap_rgb[256 * 3];
int planesize;
/* parse args */
if (argc != 5
|| strcmp(argv[1], "-planes") != 0) {
fprintf(stderr,
"Usage: %s -planes N input.bmp output.iff\n",
argv[0]);
return 1;
}
nplanes = atoi(argv[2]);
if (nplanes < 1 || nplanes > 8) {
fprintf(stderr, "planes must be 1-8\n");
return 1;
}
maxcol = 1 << nplanes;
/* read BMP */
bmpfp = fopen(argv[3], "rb");
if (!bmpfp) { perror(argv[3]); return 1; }
if (fread(&fhdr, sizeof(fhdr), 1, bmpfp) != 1
|| fread(&ihdr, sizeof(ihdr), 1, bmpfp) != 1) {
fprintf(stderr, "Failed to read BMP header\n");
return 1;
}
if (fhdr.bfType != 0x4D42) {
fprintf(stderr, "Not a BMP file\n");
return 1;
}
if (ihdr.biBitCount != 8) {
fprintf(stderr,
"Expected 8-bit BMP, got %d-bit\n",
ihdr.biBitCount);
return 1;
}
img_w = ihdr.biWidth;
img_h = abs(ihdr.biHeight);
ncolors = ihdr.biClrUsed ? ihdr.biClrUsed : 256;
if (ncolors > 256) ncolors = 256;
/* read palette (BMP stores BGRx) */
{
uint8_t raw[256][4];
if (fread(raw, 4, ncolors, bmpfp)
!= (size_t)ncolors) {
fprintf(stderr, "Failed to read palette\n");
return 1;
}
for (i = 0; i < ncolors; i++) {
palette[i].r = raw[i][2];
palette[i].g = raw[i][1];
palette[i].b = raw[i][0];
}
}
/* read pixel data */
rowstride = (img_w + 3) & ~3;
bmpdata = malloc(rowstride * img_h);
fseek(bmpfp, fhdr.bfOffBits, SEEK_SET);
if (fread(bmpdata, 1, rowstride * img_h, bmpfp)
!= (size_t)(rowstride * img_h)) {
fprintf(stderr, "Failed to read pixel data\n");
return 1;
}
fclose(bmpfp);
/* flip bottom-up to top-down */
pixels = malloc(img_w * img_h);
if (ihdr.biHeight > 0) {
for (y = 0; y < img_h; y++)
memcpy(pixels + y * img_w,
bmpdata + (img_h-1-y) * rowstride,
img_w);
} else {
for (y = 0; y < img_h; y++)
memcpy(pixels + y * img_w,
bmpdata + y * rowstride, img_w);
}
free(bmpdata);
across = img_w / TILE_X;
down = img_h / TILE_Y;
ntiles = across * down;
/* build palette and remap pixels */
build_palette(palette, ncolors,
pixels, img_w * img_h,
maxcol, outpal, remap);
remapped = malloc(img_w * img_h);
for (i = 0; i < img_w * img_h; i++)
remapped[i] = (uint8_t)remap[pixels[i]];
/* convert to bitplanes */
planesize = (img_w / 8) * img_h;
for (i = 0; i < nplanes; i++)
plane_data[i] = calloc(1, planesize);
to_planes(remapped, img_w, img_h,
nplanes, plane_data);
/* build CMAP */
for (i = 0; i < maxcol; i++) {
cmap_rgb[i*3+0] = outpal[i].r;
cmap_rgb[i*3+1] = outpal[i].g;
cmap_rgb[i*3+2] = outpal[i].b;
}
/* write IFF */
iff_fp = fopen(argv[4], "wb");
if (!iff_fp) { perror(argv[4]); return 1; }
iff_write(nplanes, maxcol, cmap_rgb,
img_w, img_h, plane_data,
ntiles, across, down);
fclose(iff_fp);
printf("%s: %dx%d, %d colors (%d planes), "
"%d tiles\n",
argv[4], img_w, img_h,
maxcol, nplanes, ntiles);
for (i = 0; i < nplanes; i++) free(plane_data[i]);
free(remapped);
free(pixels);
return 0;
}

258
sys/amiga/clipwin.c Normal file
View File

@@ -0,0 +1,258 @@
static USHORT Palette[] = {
0x0AAA, /* color #0 */
0x0000, /* color #1 */
0x0FFF, /* color #2 */
0x058B, /* color #3 */
0x000F, /* color #4 */
0x0F0F, /* color #5 */
0x00FF, /* color #6 */
0x0FFF /* color #7 */
#define PaletteColorCount 8
};
#define PALETTE Palette
static SHORT ClipBorderVectors1[] = { 0, 0, 76, 0, 76, 11, 0, 11, 0, 0 };
static struct Border ClipBorder1 = {
-1, -1, /* XY origin relative to container TopLeft */
3, 0, JAM1, /* front pen, back pen and drawmode */
5, /* number of XY vectors */
ClipBorderVectors1, /* pointer to XY vectors */
NULL /* next border in list */
};
static struct IntuiText ClipIText1 = {
4, 0, JAM1, /* front and back text pens, drawmode and fill byte */
15, 1, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Cancel", /* pointer to text */
NULL /* next IntuiText structure */
};
static struct Gadget ClipCancel = {
NULL, /* next gadget */
240, 59, /* origin XY of hit box relative to window TopLeft */
75, 10, /* hit box width and height */
NULL, /* gadget flags */
RELVERIFY, /* activation flags */
BOOLGADGET, /* gadget type flags */
(APTR) &ClipBorder1, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&ClipIText1, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
NULL, /* SpecialInfo structure */
GADCANCEL, /* user-definable data */
NULL /* pointer to user-definable data */
};
static SHORT ClipBorderVectors2[] = { 0, 0, 78, 0, 78, 11, 0, 11, 0, 0 };
static struct Border ClipBorder2 = {
-1, -1, /* XY origin relative to container TopLeft */
3, 0, JAM1, /* front pen, back pen and drawmode */
5, /* number of XY vectors */
ClipBorderVectors2, /* pointer to XY vectors */
NULL /* next border in list */
};
static struct IntuiText ClipIText2 = {
4, 0, JAM1, /* front and back text pens, drawmode and fill byte */
24, 1, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Okay", /* pointer to text */
NULL /* next IntuiText structure */
};
static struct Gadget ClipOkay = {
&ClipCancel, /* next gadget */
17, 60, /* origin XY of hit box relative to window TopLeft */
77, 10, /* hit box width and height */
NULL, /* gadget flags */
RELVERIFY, /* activation flags */
BOOLGADGET, /* gadget type flags */
(APTR) &ClipBorder2, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&ClipIText2, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
NULL, /* SpecialInfo structure */
GADOKAY, /* user-definable data */
NULL /* pointer to user-definable data */
};
static struct PropInfo ClipClipXCLIPSInfo = {
AUTOKNOB + FREEHORIZ, /* PropInfo flags */
24504, -1, /* horizontal and vertical pot values */
10922, -1, /* horizontal and vertical body values */
};
static struct Image ClipImage1 = {
43, 0, /* XY origin relative to container TopLeft */
24, 3, /* Image width and height in pixels */
0, /* number of bitplanes in Image */
NULL, /* pointer to ImageData */
0x0000, 0x0000, /* PlanePick and PlaneOnOff */
NULL /* next Image structure */
};
static struct IntuiText ClipIText3 = {
3, 0, JAM1, /* front and back text pens, drawmode and fill byte */
-116, -1, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"X Clip Border:", /* pointer to text */
NULL /* next IntuiText structure */
};
static struct Gadget ClipXCLIP = {
&ClipOkay, /* next gadget */
134, 37, /* origin XY of hit box relative to window TopLeft */
-199, 7, /* hit box width and height */
GRELWIDTH, /* gadget flags */
RELVERIFY + GADGIMMEDIATE, /* activation flags */
PROPGADGET, /* gadget type flags */
(APTR) &ClipImage1, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&ClipIText3, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
(APTR) &ClipClipXCLIPSInfo, /* SpecialInfo structure */
XCLIP, /* user-definable data */
NULL /* pointer to user-definable data */
};
static struct PropInfo ClipClipYCLIPSInfo = {
AUTOKNOB + FREEHORIZ, /* PropInfo flags */
13106, -1, /* horizontal and vertical pot values */
10922, -1, /* horizontal and vertical body values */
};
static struct Image ClipImage2 = {
22, 0, /* XY origin relative to container TopLeft */
24, 3, /* Image width and height in pixels */
0, /* number of bitplanes in Image */
NULL, /* pointer to ImageData */
0x0000, 0x0000, /* PlanePick and PlaneOnOff */
NULL /* next Image structure */
};
static struct IntuiText ClipIText4 = {
3, 0, JAM1, /* front and back text pens, drawmode and fill byte */
-116, -1, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Y Clip Border:", /* pointer to text */
NULL /* next IntuiText structure */
};
static struct Gadget ClipYCLIP = {
&ClipXCLIP, /* next gadget */
134, 46, /* origin XY of hit box relative to window TopLeft */
-199, 7, /* hit box width and height */
GRELWIDTH, /* gadget flags */
RELVERIFY + GADGIMMEDIATE, /* activation flags */
PROPGADGET, /* gadget type flags */
(APTR) &ClipImage2, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&ClipIText4, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
(APTR) &ClipClipYCLIPSInfo, /* SpecialInfo structure */
YCLIP, /* user-definable data */
NULL /* pointer to user-definable data */
};
static struct PropInfo ClipClipXSIZESInfo = {
AUTOKNOB + FREEHORIZ, /* PropInfo flags */
26212, -1, /* horizontal and vertical pot values */
10922, -1, /* horizontal and vertical body values */
};
static struct Image ClipImage3 = {
45, 0, /* XY origin relative to container TopLeft */
24, 3, /* Image width and height in pixels */
0, /* number of bitplanes in Image */
NULL, /* pointer to ImageData */
0x0000, 0x0000, /* PlanePick and PlaneOnOff */
NULL /* next Image structure */
};
static struct IntuiText ClipIText5 = {
3, 0, JAM1, /* front and back text pens, drawmode and fill byte */
-124, -1, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"X Scale Factor:", /* pointer to text */
NULL /* next IntuiText structure */
};
static struct Gadget ClipXSIZE = {
&ClipYCLIP, /* next gadget */
134, 15, /* origin XY of hit box relative to window TopLeft */
-199, 7, /* hit box width and height */
GRELWIDTH, /* gadget flags */
RELVERIFY + GADGIMMEDIATE, /* activation flags */
PROPGADGET, /* gadget type flags */
(APTR) &ClipImage3, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&ClipIText5, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
(APTR) &ClipClipXSIZESInfo, /* SpecialInfo structure */
XSIZE, /* user-definable data */
NULL /* pointer to user-definable data */
};
static struct PropInfo ClipClipYSIZESInfo = {
AUTOKNOB + FREEHORIZ, /* PropInfo flags */
-25937, -1, /* horizontal and vertical pot values */
10922, -1, /* horizontal and vertical body values */
};
static struct Image ClipImage4 = {
69, 0, /* XY origin relative to container TopLeft */
24, 3, /* Image width and height in pixels */
0, /* number of bitplanes in Image */
NULL, /* pointer to ImageData */
0x0000, 0x0000, /* PlanePick and PlaneOnOff */
NULL /* next Image structure */
};
static struct IntuiText ClipIText6 = {
3, 0, JAM1, /* front and back text pens, drawmode and fill byte */
-124, -1, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Y Scale Factor:", /* pointer to text */
NULL /* next IntuiText structure */
};
static struct Gadget ClipYSIZE = {
&ClipXSIZE, /* next gadget */
134, 24, /* origin XY of hit box relative to window TopLeft */
-199, 7, /* hit box width and height */
GRELWIDTH, /* gadget flags */
RELVERIFY + GADGIMMEDIATE, /* activation flags */
PROPGADGET, /* gadget type flags */
(APTR) &ClipImage4, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&ClipIText6, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
(APTR) &ClipClipYSIZESInfo, /* SpecialInfo structure */
YSIZE, /* user-definable data */
NULL /* pointer to user-definable data */
};
#define ClipGadgetList1 ClipYSIZE
static struct NewWindow ClipNewWindowStructure1 = {
114, 16, /* window XY origin relative to TopLeft of screen */
346, 76, /* window width and height */
0, 1, /* detail and block pens */
NEWSIZE + MOUSEMOVE + GADGETDOWN + GADGETUP + CLOSEWINDOW + ACTIVEWINDOW
+ VANILLAKEY + INTUITICKS, /* IDCMP flags */
WINDOWSIZING + WINDOWDRAG + WINDOWDEPTH + WINDOWCLOSE + ACTIVATE
+ NOCAREREFRESH, /* other window flags */
&ClipYSIZE, /* first gadget in gadget list */
NULL, /* custom CHECKMARK imagery */
"Edit Clipping Parameters", /* window title */
NULL, /* custom screen pointer */
NULL, /* custom bitmap */
350,
76, /* minimum width and height */
-1, -1, /* maximum width and height */
CUSTOMSCREEN /* destination screen type */
};
/* end of PowerWindows source generation */

242
sys/amiga/colorwin.c Normal file
View File

@@ -0,0 +1,242 @@
SHORT Col_BorderVectors1[] = { 0, 0, 59, 0, 59, 12, 0, 12, 0, 0 };
struct Border Col_Border1 = {
-1, -1, /* XY origin relative to container TopLeft */
3, 0, JAM1, /* front pen, back pen and drawmode */
5, /* number of XY vectors */
Col_BorderVectors1, /* pointer to XY vectors */
NULL /* next border in list */
};
struct IntuiText Col_IText1 = {
7, 0, JAM1, /* front and back text pens, drawmode and fill byte */
13, 1, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Save", /* pointer to text */
NULL /* next IntuiText structure */
};
struct Gadget Col_Save = {
NULL, /* next gadget */
9, 77, /* origin XY of hit box relative to window TopLeft */
58, 11, /* hit box width and height */
NULL, /* gadget flags */
RELVERIFY, /* activation flags */
BOOLGADGET, /* gadget type flags */
(APTR) &Col_Border1, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&Col_IText1, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
NULL, /* SpecialInfo structure */
GADCOLSAVE, /* user-definable data */
NULL /* pointer to user-definable data */
};
SHORT Col_BorderVectors2[] = { 0, 0, 59, 0, 59, 12, 0, 12, 0, 0 };
struct Border Col_Border2 = {
-1, -1, /* XY origin relative to container TopLeft */
3, 0, JAM1, /* front pen, back pen and drawmode */
5, /* number of XY vectors */
Col_BorderVectors2, /* pointer to XY vectors */
NULL /* next border in list */
};
struct IntuiText Col_IText2 = {
7, 0, JAM1, /* front and back text pens, drawmode and fill byte */
17, 1, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Use", /* pointer to text */
NULL /* next IntuiText structure */
};
struct Gadget Col_Okay = {
&Col_Save, /* next gadget */
128, 77, /* origin XY of hit box relative to window TopLeft */
58, 11, /* hit box width and height */
NULL, /* gadget flags */
RELVERIFY, /* activation flags */
BOOLGADGET, /* gadget type flags */
(APTR) &Col_Border2, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&Col_IText2, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
NULL, /* SpecialInfo structure */
GADCOLOKAY, /* user-definable data */
NULL /* pointer to user-definable data */
};
SHORT Col_BorderVectors3[] = { 0, 0, 59, 0, 59, 12, 0, 12, 0, 0 };
struct Border Col_Border3 = {
-1, -1, /* XY origin relative to container TopLeft */
3, 0, JAM1, /* front pen, back pen and drawmode */
5, /* number of XY vectors */
Col_BorderVectors3, /* pointer to XY vectors */
NULL /* next border in list */
};
struct IntuiText Col_IText3 = {
7, 0, JAM1, /* front and back text pens, drawmode and fill byte */
6, 1, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"Cancel", /* pointer to text */
NULL /* next IntuiText structure */
};
struct Gadget Col_Cancel = {
&Col_Okay, /* next gadget */
244, 77, /* origin XY of hit box relative to window TopLeft */
58, 11, /* hit box width and height */
NULL, /* gadget flags */
RELVERIFY, /* activation flags */
BOOLGADGET, /* gadget type flags */
(APTR) &Col_Border3, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
&Col_IText3, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
NULL, /* SpecialInfo structure */
GADCOLCANCEL, /* user-definable data */
NULL /* pointer to user-definable data */
};
struct PropInfo Col_Col_RedPenSInfo = {
AUTOKNOB + FREEHORIZ, /* PropInfo flags */
0, 0, /* horizontal and vertical pot values */
-1, -1, /* horizontal and vertical body values */
};
struct Image Col_Image1 = {
0, 0, /* XY origin relative to container TopLeft */
263, 7, /* Image width and height in pixels */
0, /* number of bitplanes in Image */
NULL, /* pointer to ImageData */
0x0000, 0x0000, /* PlanePick and PlaneOnOff */
NULL /* next Image structure */
};
struct Gadget Col_RedPen = {
&Col_Cancel, /* next gadget */
32, 12, /* origin XY of hit box relative to window TopLeft */
271, 11, /* hit box width and height */
NULL, /* gadget flags */
RELVERIFY + GADGIMMEDIATE + FOLLOWMOUSE, /* activation flags */
PROPGADGET, /* gadget type flags */
(APTR) &Col_Image1, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
NULL, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
(APTR) &Col_Col_RedPenSInfo, /* SpecialInfo structure */
GADREDPEN, /* user-definable data */
NULL /* pointer to user-definable data */
};
struct PropInfo Col_Col_GreenPenSInfo = {
AUTOKNOB + FREEHORIZ, /* PropInfo flags */
0, 0, /* horizontal and vertical pot values */
-1, -1, /* horizontal and vertical body values */
};
struct Image Col_Image2 = {
0, 0, /* XY origin relative to container TopLeft */
263, 7, /* Image width and height in pixels */
0, /* number of bitplanes in Image */
NULL, /* pointer to ImageData */
0x0000, 0x0000, /* PlanePick and PlaneOnOff */
NULL /* next Image structure */
};
struct Gadget Col_GreenPen = {
&Col_RedPen, /* next gadget */
32, 24, /* origin XY of hit box relative to window TopLeft */
271, 11, /* hit box width and height */
NULL, /* gadget flags */
RELVERIFY + GADGIMMEDIATE + FOLLOWMOUSE, /* activation flags */
PROPGADGET, /* gadget type flags */
(APTR) &Col_Image2, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
NULL, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
(APTR) &Col_Col_GreenPenSInfo, /* SpecialInfo structure */
GADGREENPEN, /* user-definable data */
NULL /* pointer to user-definable data */
};
struct PropInfo Col_Col_BluePenSInfo = {
AUTOKNOB + FREEHORIZ, /* PropInfo flags */
0, 0, /* horizontal and vertical pot values */
-1, -1, /* horizontal and vertical body values */
};
struct Image Col_Image3 = {
0, 0, /* XY origin relative to container TopLeft */
263, 7, /* Image width and height in pixels */
0, /* number of bitplanes in Image */
NULL, /* pointer to ImageData */
0x0000, 0x0000, /* PlanePick and PlaneOnOff */
NULL /* next Image structure */
};
struct Gadget Col_BluePen = {
&Col_GreenPen, /* next gadget */
32, 36, /* origin XY of hit box relative to window TopLeft */
271, 11, /* hit box width and height */
NULL, /* gadget flags */
RELVERIFY + GADGIMMEDIATE + FOLLOWMOUSE, /* activation flags */
PROPGADGET, /* gadget type flags */
(APTR) &Col_Image3, /* gadget border or image to be rendered */
NULL, /* alternate imagery for selection */
NULL, /* first IntuiText structure */
NULL, /* gadget mutual-exclude long word */
(APTR) &Col_Col_BluePenSInfo, /* SpecialInfo structure */
GADBLUEPEN, /* user-definable data */
NULL /* pointer to user-definable data */
};
#define Col_GadgetList1 Col_BluePen
struct IntuiText Col_IText6 = {
3, 0, JAM1, /* front and back text pens, drawmode and fill byte */
17, 38, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"B", /* pointer to text */
NULL /* next IntuiText structure */
};
struct IntuiText Col_IText5 = {
4, 0,
JAM1, /* front and back text pens, drawmode and fill byte */
16, 26, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"G", /* pointer to text */
&Col_IText6 /* next IntuiText structure */
};
struct IntuiText Col_IText4 = {
7, 0,
JAM1, /* front and back text pens, drawmode and fill byte */
16, 14, /* XY origin relative to container TopLeft */
NULL, /* font pointer or NULL for default */
"R", /* pointer to text */
&Col_IText5 /* next IntuiText structure */
};
#define Col_IntuiTextList1 Col_IText4
struct NewWindow Col_NewWindowStructure1 = {
175, 45, /* window XY origin relative to TopLeft of screen */
312, 93, /* window width and height */
0, 1, /* detail and block pens */
MOUSEBUTTONS + MOUSEMOVE + GADGETDOWN + GADGETUP + CLOSEWINDOW
+ VANILLAKEY + INTUITICKS, /* IDCMP flags */
WINDOWDRAG + WINDOWDEPTH + WINDOWCLOSE + ACTIVATE
+ NOCAREREFRESH, /* other window flags */
&Col_BluePen, /* first gadget in gadget list */
NULL, /* custom CHECKMARK imagery */
"Edit Screen Colors", /* window title */
NULL, /* custom screen pointer */
NULL, /* custom bitmap */
5,
5, /* minimum width and height */
-1, -1, /* maximum width and height */
CUSTOMSCREEN /* destination screen type */
};
/* end of PowerWindows source generation */

223
sys/amiga/grave16.xpm Normal file
View File

@@ -0,0 +1,223 @@
/* XPM */
static char *noname[] = {
/* width height ncolors chars_per_pixel */
"400 200 16 1",
/* colors */
"` c #66686A",
"a c #797979",
"b c #929291",
"c c #43444A",
"d c #758A74",
"e c #F2F2F2",
"f c #D1D0CE",
"g c #066906",
"h c #065506",
"i c #53535C",
"j c #0C0D0F",
"k c #A3A5A2",
"l c #2D332E",
"m c #C3C4C1",
"n c #B4B4B2",
"o c #07840A",
/* pixels */
"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjjjjjjjjjjjjjjljjjjjjjjjjjljljjljljjljjllljljclljlllljlllljlllllllllllllllcicl``clcllclclllclclclcclclclcccccccccccccccccccii`iiccicicicciiciiiiiibiic`iii`a`iiii`icaii`iiii`iiii`ii`ii`iii```iii`i`ii`ii`ii`iiii`iii`ii`iifi`ii`ii`iiiiiiiiiiiiiiiiiiiiii`iciibicicicicciiccciiibiicciiiiccccbicicccccccciccclcccccclc`aiciiiciccclilccccccccccclcccacccccccclccclcclccc",
"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjjjjjjljjjjjjljjjjjjajljjljljljljjjjljjljc`baljjllcljjcjlljllllllllllllllllllllllcclllllllclllcclcllclclccccccccclccccccccccccicciicciicicicic`cciiciciciciacicii`iiiiii``iiakii`iiii`ii`ii`iiii`bkb`i`ci``iiiiii`iii`ii``i`iiiiiaiiiiiiiiii`iiiiiiiiiiiiiiiiiiiiiciiciciicicciciiiicllic`iciiiicicciliccccccccccccc`ccccliccccccccciciccclccccclclclclcclccclclclllccclcllccll",
"ijjjjjjjjjjjjjjjjjjljjjjjjjjljjjjjjjjjjjljjjljjjjjjljljjjjjjjljjjljljljljjjjlljljljljcclljllllljlllljllllllllllllllllcclccclcjcllclclclclllcclclcccccccccccciccccciiic`a`icciiccciciiiiiiiiibi`iiiiii`ii`ci`iii`ii`i`iiiiiiiii`iii``ici`i`i`i``ii`ii`iiiiiiic``iiiiiiiiiiiiiiaiiiiiiiiiiciicicii`iiiiiliiccicicccicccci`ccicccicccclccinccccccccclcccaccccccclccccccccccilcl`lllccclcclcclcllcllclcccclllilcllci",
"jjjjjjjjjjjjj`cjjjjljjjjjjjjcljljjjjjjjljjljijjljjjjjjjljljljjljljljlljljllljjljllflcjljllljljlljllllcllllllllllllcllllccllcc`clclllcllcclclcccclccccccccciccciciccccccic`iciic`iiiiciiiiiiiaiii`iii`i`icak`c``i`iiiiii`ii`i`iii`i`ii`iiiiiiici`iii`ii`i`ii``iiii`c`iiiiiiiii`iiiiiiiiciiiiiiiiiiiccccciccicicciiccccciaillcccciiciccclcccccccccccccc`cclclccillccllcliibilikaicllcclccccclcccclcccccllccllcclcl",
"jjcjjjjjjjjljjjjjjjjjjjjjjjjljjjljjjjjjjjjjjljjjjjljjcjjjljjljjljjjljjljljjjlljllljlllcljllllllllllllcclllllllllclllcclccibccclclcclcclcllicicccccccclcccccccciciicciccciaaiciccciiiiiiii`ciiiiii`iiiii`ic`iiiiiiii`ii`iiiiiiiiii`iiiiiciiiii`i`iiiii`ii`iiiciiiiiiiiiiiiiiciiiciiciciiccicciiiiiicicc`cccccccicccccicciiccicccicclilccccccclccccclccllcccilcccclcciclccciclcclccclccclclllcllcllccllcccclaacccl",
"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljljjjjjjjlljjjjljljjjjjljjljjljljlljljlljlllllljajljljlllllllllllllllcllllllllclccilcicclc`clalcclclclcclcccicclclccccciiccicciccciciiiiiiciib`iiiiiiiiiii`iiii``i`i`iiiiiiii`iiiiiiiiiiiiiiiiiibaiiici`iiiiibiiiii`iiiic`kaiiiiiiiiiiiiiciiiciiiciiciciccicciiiiciiiciccicicccccccciclcccccciiccccaciclclcccciilcccclcclcclcllclilacclcccclccclclcccccclccclclccllcclllllkblllc",
"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjljjjljjjjjljljjjjjjjljljjljjljljlllljljljljjjjjljllljcjllllllllllllllllllllccclclabclccccciccccllclclcclcclclccccccccciiaiiicciciiicccccciiiiiiiiiciiiiiicii`i`i``i`iiiii`iiiiiiiiiiiiiiiiiiiiiibiciiiicciiii`iiiiiiiiiie`i``ic`iiiiiiiiiciiciciiciciciciciiiciic`cccclcccccccccciccccccciccciicilcillcccccclciccccclclccclibaili`lillccccciicliccccccclcccllallclliiiclcliilcll",
"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjljjjjjjjjljjljjjljjjjjljjljljlllllljllljlclllllljlllllllllllllllllllllllllcccclccliiccccciccccclclcclccccccclcciccccciacciciiiccci`iiiiciiiiiiiiiiiiiii`i`c``````i``iiiiciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii`kciiiiiiiiii`c`iciciiiiiiciiiiiiciccicicicciciiiiii`ifcccciccicccccccccccccccclccccccclcclccclccclclclcllilclcclcllclcliilclclclccicccccccccllllcecclclliaacllcllclc",
"jjjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjljljjjljjjjlljjljjjljljjlijjllllllllllllljljajlljlalllllllllllllllllllllccccclllccclclccccccccccclcccccc`clcccccccccccicacicciciciciiiiiiib`iiciiiii`c`iiii``iii``ii``ciiiiiiciiiiciiiii`biii`iiiiciiiiciiicib`iiiiiiiiiiiiiiiiicii```cccciciciciiiiiiiciiiciiccccccccccciicciccccccccccccciccccclccclcccllccclclc`ccclcclcccccclcccllclccclclllcllcliccllclmccclcccl`lclclclll",
"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjjljjjlljjjllljlljjjljljjjljljlcllllljcljjcljlllijllllllllllllllilcllcccccllicllllclcllcclliccccclccclcccccccccccccccc`iciicicciiiaiciciicl`ici`iiiiiiii`ii`i`ii``iiiiiiiiiiiiiii`iiiiiaciiciiiiiiiciiiciiiiiiicici`ciiciiiiciicciiiciiciciiiciiiiiii`cbi`liicicccccccccclccccccccclclccccccclcilccllccccllcclcccclcclclclllllcllllcllllllclcllccccclllcllilllclllclilillccll",
"jjjjjjjljljjjjjjjjjjjjjjjjjjljjjjljljjjjjjjjlljjljlllljllljllljlcljjljljcjlllljcljllllcllllllllllim`lljccllcclcbacllcllclccliclcccclccccccccccccccicciciciiciiciiiiiibiiiib``iiii`i`iiaii`ii`iiiiiciiiiiiiiiiicciiiiiii`iiiiiciiiiciciici`cciiciciiiiib`c`aaicciicicciccccciiiiiiiicciiicciilccccclcccccccccccclccccccclccliccccclclclcillccccllcclclccilcccclclcclcccclclclclllcllllcclllllllclllcllcllclcll`cc",
"jjjjjjjjjjjjjjjjjjjjijljjjjjjjljjljjljjjljjjjjjcjljljlcjjlcljlljkclllllllcllllljllllllljllllllllllliiccccclllllcccllcclcclclclcicccccclcclcccccccicccciicciciiciiiicc`ciii`ciiiiiiiiii``ii`iiiiiiiicii`i`i`iii`iicic`ii``iiiiiiiiiiciciciiiicc`ciicici`cc`iiiciciicicciicicci`iiiiiciciicicccibiccccccclcccccclclcclclcclccicclclcicclikclcllclllcllcllclccccllclclcliclci`cllclllillliccclcllclclbilllclllclcal",
"jjjjjjcbljjcajjjjjjjljjjljljjjjjljjjjjjljljjljjjlljcjllljlilllllaljlljjl`mllljcillllclllllllllllcllclllciiilccclllclclclcclckaclccccccccclccccccccciiciciiciiciiciiiiii`ic`ii`ii`ii`````i`iiiiiiiiciiciiiiiiiiiiic`ibiiciiiiiiiiicicicicccicicicciciccccicccciiicccciccciccciiiiiiiiciccii`cicbicciccciiciclcccccccclcclcccccllcclllliclclcccccclcclcllclcccclcllclclccllc`lllcllcll`llllllcllllllilllllllclcclc",
"jjjjjjjljjjlijjjjjjjjljjjjjjjjljjjjjlljjjjljjljljljajljljlljlljcljjlllllljlljijjlllllllllllllllcjcllllaclclllllcccclccclllccclcccccccccccccccccii``a`cccciciciiiiic`i`baba`iiii`ii```ii`ii`iiiiiiiiicciiccciciiiic`ia`iccii`c`iiciciccccccccbcccccic`iciciiiiccciccicicccccccccciiiiciccccccciccccccccccciicii`a``icccccccilclclciaa`iiccciclllcllclcllcllcccllllclllcllllclclcllllamiccaclllllccllllccllclcllcl",
"ljjjjjjjjljjjjjjjjljljnjjljljljjljllcjljjjljjjlbjllblljljjjljlcljclljlljlljclikllljlllllllllllllcljclccccccccllclllllcccccclcclcccciccciccciabbkakbnaccici`iciiiiiiic`bbnnnnkbaa``iiii`ciiiiicici``ic``ciiiaiiiiiiiciiciciiiiiiicccciciciiccbcciiccccccciccciicicicicccccccccicccicccccccliccicliiccccici```iabkbaccccccccclccclciammnbbbaaicclcclclclclllllllllllclllllclllllllllccijlakillcllllllclllllllcjcll",
"jjljjjjjjljjjjjljjjjjjjljjjjjjljjjjjljjjljjljljjljjijjljljl`liklljljllllllillljlllllllllllllllllllclllccccllccclcccccllcclcclccccccccciii`abnnbknmnmblciiibiiciicik`i`nbkmnmmnmnnk``i`niiiiciiiiciicccicccibciciiiciciccciciiciccicicccccccciccccccicc`ccccicibfcccccccicccccccccccccccclc`cclcclcci`abbbbaii`nnk`ccccccclllc`cciiknnnnbbakbkkicllclllclclllllclclllcllllclllllllllllclccllcllllllllkalllcljclll",
"jljjljjjjjljjjliljjljjjjjcljjjjjjljljljljlljjjljljljlljlljlijblljljlljljllcjllllllliklllllllllcllllclccccccclclcccclccclccclcccclccciiaa`babnmnnmnnmkjiiccacciiiiiiiiakkknmmmmmnmnkkbbaiibciiccciciiccccccccccciciicicciccccccciicccccccccccciiiilicicccccccciiiilcccccci`ailciclcccclcccckbcllclciabbkkb`icianmnkcccclllclccccii`ammmnbabknkkaa`iillclllcjcclllllcllli`lllllllllclclllclllllllllllllljcllclllll",
"jjjljjljlljljjjljjjjjjljcejjlljlljjjjjjjjjjjjlljjljljljljljllkijlllllllcjkllllcllllcallllllllllllclcclilcclclclcllcccllccccccccccc`bk```baabnmnmmmfmklciiciiiiiciiciiakbbknnmnmnnnkbbbbaknicciiiicccciiiccicciccccciicciiccicccccccccccccccccccccicililccccccciiccicccccciiclcclcccclilclliclccli`abbbnkkacciaknmkllllllclllcccii`amnnnnbbakbk`i`aaa`ccicclllcclcljclllclllllllllllllclllccllcllcjcj`alllllllcll",
"jjjjljljljjjjjjjjljljjjjljjjjljjjjlllljlljjlljjlljljljlllllljilljllljlciacjlljb`llllclllcllllcclclllccciccclclcccclcccccclccllc`aabnkii`bbabbnnnnnmnbljiiiciiiiii`i`i`kkkbknmmmnmnnbbknkak`iccccicicccccccccccccicccccibccccccclcciccccccccccccciciicni`ccccccccccccccclcclccclcclacclcclclliiciabbbbbbnb`cc`bkknnlllllclcllccc`iiamnknnnkaaknaiiabbabbkkcccclccjcclllllllllllllllillllllcllcccllllccelllccclicl",
"jljjjjjljjjljljljjjjjjljjjjjljbjljjjjjjljjljjlljjljljlljljjljljlllllljlllclllcjllllllllllllcllllll`ccilicccclclc`illcccccccci`bnbaakk``abbb``knbnmmkbllciii`i`i`i`i``akbbbbkmmnnnnbbkkkabnmnb`icccccccciccccccccccccccc`ccccccccciicccccccccccciccccciilcccccccclcclclclcclcclccclicllcllcc`aiiabbbkkbakacl`bnnknklccllllcclciiii`bmnknmmbaabka``akaaaakkicllclccibclllllllllllllc`lllllllcllcllllllcjlccclcc`ll",
"jjjjljljjjjjjjjjljjljjjljlljjjljljljljljljlljljlljllljlljlcjllllllllllllljcjllmclllljcllllccllllcclcccccclcccccccccclccccciibnmmaaabbbbbbbb``bmbbnmnbljc`ii`ib`iikb``bnkbabbknmmmkbnnkbbbkmmkkaccccccccccccccccccccccclccccclccclcicccclclccclciic`lccciccccccccclclilccclcclcllcllllc`cc`abaliabkkkkkabiciabnmnfnlllllcllllii`i`i`nkbbmmnbbabaakbbba`iknbbbciclcl`llljcllllllllllllllllllllcllllclljclcclllclll",
"jljjjjjjljjljljjjjjjlljjljjljjjljjjljljliljljljljlljlljllllllljljljllllllllcllallllclllllcbkbaclcciillclcccccccclcccccccciaaaknknbai`bbbbbbb`bmnkmnnalliii`i`aiii`ii``bbbbbbnmmnmmbkkkbbbbnmnnnbaiccccccccccccccccclcccillcccclclccllcclcclclccccclciliccclclclcclclcllclcclclcllcilclbaabb`icaakbbknkbaii`abknmnbclllccllllii`iiiibabbbkkkaa`abbbbkbaaknnkmnalclllclclllllllllllljllllllllccllclljlclclllclclll",
"jjjljjjjjjljjljljlljjjljlicjljlllljljli`cccjl`cjljlljlllljllllllllllllllljcjlllllllllllllliclclclcmbclicccccccclccccccci`bkbbbbbbaaaabbkbbbbabnmfnbacljici`iiii`ici`iiiaabbbkmmnmnbbbababbnnmknnkbiclc`acccccccclccccclccclccclcllclccccccclccccccicllciccccccccllcclilccllclclclcjccababbicc`bbbbbkknbac`ababbaicllllllllllcii`i`iiiababbbaaaabbbkabbabnnnmmfna`acclclllllllllllllllllllllllllclcalllllclclllll",
"jjjjjjljjljjjjjl`ailjljjjljjljjljlc`aabkbaba`aiclljllljljcb`ljlllllllllllclllclillllclllllcllclcililclkclcccccccccccccannbabbbbaaaabbbbkkkkbbkmnbiljlllciiiiic`i`i`iiillcakbbknfnkbbnbkbabbkmnnnknnbilccccclccccccccclcaacllcllccclclllcllclccccclclccccccccclllcclclbclclllcllllccl`aaabaicabkkbbkkknka``bkbbilljlllllllllcciiaaijlljcabaaaaaabbbkkkbbknmnnmnnmbillccjlllllllllljlllcllllllllllllllllclllccllll",
"jljljljjljjlljljcjljjljljjlljljc`bbknnkkkkkkkbbbbbcjllljllllllllllllljlllllllllcclllclllllclllcacclcccclcliliclcclcc`mfnnmkbkkbaai`a`aakmkkbikmmlllljllciiii`iiii`iin`iljcbbdbnmnbbbmknnkaaakmkmmnbbbilclclclclcclclk`abilcaclclcllclcclicccccclillcccclilccclclllclllclllcclllcllibbbaaailiakkkkbbnkkk`bbbaballllcllllllcllci`a`lljlllcba`c`a`aakmbkbabmmnnmnnmbacllccllllljllllllllbjlljljllllllclllllllclllll",
"jljjjljljjljjljjljljljjjjljjlc`akkkkbkmmnnmnkbkkbkb`cjjllllllllllllllcllllllclacjcllllflclllclc`cclliiicclccclciaciabkkmnmmkkka`cc`a`akbnkkb`knkjllljlll``iiii`aiiiiicccllakkkkkkbbbnnmnmkaabnmnkbbkkbiccccliacllillilccccllli`llllcllllcccclllcailllllcllclcclcclccllllclllllllliabka`i`clibbkknbbkknkbkkbbbillllllllllllllc```llllljjlb`cci``abbknkbianmnnmmnnnallilllljllllcjllljllllllcllllllllllcllllllijjl",
"ljljjjjjljjljjljljjjjjlljljjibbkmnnkknnfffmnnknnnkbaa`clllllllllllllllllclilllllcccllclclcllccccccclcccccccclcic`cannbbmnnmnbaiiii``akkdknkaabmblljllllciiiabknmniiiiiijljannkkkbbbkkmmnmk``bbkkbbkkkkkaclcclclclclcllclbilcclllillllccllccclclcclcliccll`llilcclllllllclllllllliabba````ccabbbkknbbkkbknkbbbiljcljcljcbnkbabballlljlllc`iii`a`bkbbknbabnnnnmnnnnalcicilllllljllllllljclljljllljljjclllllllla`ll",
"llljljljjljjljljjlj`ljljljlikbbmnfnnmmnfffmnmnmmmkkbkbiiljlllllllllllllciaiclcllllllclcllclccccclcccclcclaclcilc``bknnbkmnnnka`bba`adbkbbkbaabmkcljllllciicbnmnnkiiiiicljcanmnmnkkbbkmnnn`ibbabbbknkabknbclclllclllcllclcllllllcllcclllllilllilllllliclllllcjliccllclllclclllccci`aa`i`aii`bnkbkkkbabaakbnnkkacllllllc`knmkbbbbljjjjjlj``abba``bkkabkaaaknmnmnnnbacli`acllljllllljlllllllllljlbblljllljcllclabll",
"jljljljljjljljjljjl`jjljjcabkkbefmmfnfefefffmffmfmfnkkbaillllljlllllcllll`llllllajiclllclcccccclcclcccccc`lciccakbbbknkbnnnmnnnnbaabbbbkbb`iadmmaclllllcclcaknkmmkiiiiicc`knkmmmbkbnnnnnbi`bkbbkbkbbbaakkaiclcclclllcclllcclllllllllllcll`ill`cllcllcllcikllillc`cccclclllllcciii`aa``iii`akkkkbaaaaiakkbknknkaallllcabkknnkabkallllllibkmka`aaabkbbai`akmmnmnnmballcibbillcljllllljlljljlllljcjlllljlllcjlllljl",
"jlljljjjjljljjljlljljlajl`bkkkkmffffffeffefffmmfffmmnmkbbillllllllllllllcjcllclllilllilclcccccccllclcccccccclcakmnbbbbbkbkmnnmmbabnkbbbkk`cc`bmmmb`ciia`iii`aabnnmaa`c`abkknmnmmbbknmmnkbiababbbaba`ba`aakk`clclllllciccllllcllclllllllllclllllllllclllclllllllliclclcclcclli`aaaaaa`iclc`bbnnkbaiiiibnbnbbknkbb`ccci`knnknnkbbbb`cjjikfmnbabnnbakkk`li`knmnmnnnb`icccaabclilljll`llllllllljllcljlljlljlllllljal",
"ljljjllljljjljljjjljlabliakknmknmfffefmffefefffffffffnmkkailllllllllllialclcllilcllc`jicccccicccccccclcccciccbnnknnkbbkbbknnnmnbbkmmnkbbbiccabnnmmnknkb`ccii`abmnbbbmknnmmnmmmnmkbkkfmnkaa`aabaaa``ia`akbbkkacllccllliillllllllljiaaillclllclllcclllllllllllllclclllllcllcciaaabkbb`iicciabbkkba`iiiaknbmkbbkkbabknbabnknkknmkkbkabbkmnknnabnmmkbbbbiliabnmmnnnnbbaicii`akallllljilljjllllicljjlljljcljljllllcbl",
"jljllllcjjljljljlljlljllbbnnmmffffeffeefeefefeeffmmefmmknkbclllllllclllclllclclccccccicccicccclcccccccccclccbnmnnnnmmnbbbbbmnnkknmnnfnbb`i`aabnmmmmnnnbaiii`abbkkbkkknkmmfkmnmmmnkkknnmnaaabkkbaaiii`bknbkbkbcllclclclblllclllllllllllllclllllllcjllclcllllllllllllllllllliabbaaaaa````a`abbkba`a```abbknnkbbbkknkkk`bnmnmnnknnmkbkbabnmnnbnmknfnka`iiaabnmmmnnnnbaci``aabkaljllljlljcljllljllllljlliljlljlljjll",
"llljljjjljljjljljljjljc`bkbmnfffefeeeefeefeefffeefffmmnnmnkaclllclllclllllclccccccclccccccciccccccliccclbccanmnmmmnknmnbkbbkmnnnnfmmnmnbi`abbaknmnmnnkb``iai`aa`aabknmmnmnnnmnmmmbkbkfnnkbakmnabaabaabnakbbkbbilllllllllllllllllllllllllllllllllllcjallllllllllllllllllllinkbabbba`iaaaa`akbb``````abbbbkfmbabnmmnbakknmmnmnmnnnmkbbbbknnnnnnnmnnmbiiabbakknmmnnkb`````iaa`ailjlljljlljlljlljljlllljljljiclllljl",
"jljljljljljljljljjllljlbknkfnffffefeeeeefeeeeefeeeefffmmnkkbillllllllllclijcclclclccclclccccccccicinacciiibnmmnnnmnnnmnkbkbamnkmnmmnmmnabdaabbbbmmnnnba``iaii``ii`bnknmnnmnmmmmnnkkbbknmmkbknnbkkbbbabnbbkkbbnaclllllllllllllllllllllllclllllllllllcllllccclllllliclllllikfkbaaaaa``aba```baa`a`aaaabbbbkmnnknmnnkbbknnnnmmmnnnnnnnkbbbknnnnmmmnnnabaaakabbnnmnnba`````c``i`iicjlllljllllljllllijjcjlllllcjjjllj",
"lljljjljljljljljlcjjllkbknmfnffffeeefeeeeeeeeeefeeefffffmnkkbclllllcl`llllccccklllclclcclcccclcccccilccccbmmnmmnmnmnnnmmkkbbnnnbknmmnmkkmkaabbbaknnkkbaa```c``iiiabkbmmmmnmnnnnmmmkkkkknmnbnmkbkkkaa`bbbbbkkbnkacllljcllllllllllllllllllllllllllllllallllllllllll`cjlljlabkbab`aaa`iaba``abaaaa`aabkkkkkknnnmmnkbabnnnnnnmnnnmnknmnmkbbbnkkbnnnnnkbnnabbbbbbnnnkkaaiii`iaiciaailjjlll`bialjlljjclljljajjljjlljll",
"jlljjljljjljlljlcjllljanbmmfnffefeefefeeeeeeeeeeeeeeeeffmfnnk`clcllllaclllcclllclcllccciclcccccccccclicc`mmnnnmmnmnnnknmfbbbbdba`abbdbabkaaaabkbbnnnkbaa``ic`iiiaaabbmnbkkbbdbbkbbabkknmnmkmnnabkkbabbkbkbnkkkbb`llcjllllllllllljllllllllllllllllljlllclllljlllljlllcjl`kbbbbbaaaa```a```abaab`ii``aabbabbbbbkkai`bmnnmmmbbkbkmnnnnmka`aaa``aabbbbaknbabbkbbknmkb``a`ii``iiiaaacllijlcklllbljlljljlljijlljla`ljj",
"ljjllljljljljlljljjljibbknffmfeffeeeeeeeeeeeeeeeeeefeffemfmnkbclllcllclcicbcclillccccclcccccccccclcciclinmnnmnmnnnmmnnnnnnkaai``lllllcllllcllc`abknmnac`i`clclliaaaabnalllclclcclcllcc`kmmnnnkbbbkbkknkknkkkbbaa`iccclljlllljllllljllllljllllllllacljljlllllllllljllcliabnnbaaabbaa``````aababllllllcllllcllcciii`bnnnnnncllllnnnnnnnilcllllllcllllciadkbkkbbnnnb`i``iciilc`aaaaclealljllcecllljjjljljjljljjjjll",
"jjljljjjlljljljlljllclbbmnmffeefeeeeeeeeeeeeeeeeeeeeefefffmkkb`lclcllllclicciclccclccllccccccccccicccciknmnnmnnmmnnnmnnnkmnbiia`lllllllllllllllliaknnb`i`aclllli``i`abilllllllljllllllliknnnnkbbbbbbknnnkknkbkaiiaillljlllllllljlljlllllllljllllcjjlllcllllllljlllljlcabbbba`babbba```iaaaakkbllllllllllllllclicadkmnmnknlllllmmmnnnmijlllllllllllllccibbkkkkbknna`i```icli``i`aaclljjljljlljjlllljljlljjllllllj",
"ljljljllljljljlljifccibbmmfffeffeefeeeeeeeeeeeeeeeefefeffffnknaccclccclcccicclcllllclcccccccccccccccccanmnnnknnmnnmnmmmnnnnbi`nilllcllllllllllllliabbkb`aacllll```iiabillllllcllllllllllibnmnnbabbbknnnnnnknbkaiib`ijljcljlljljllllcljcljlllljll`cjlcjjlljllljlllllllibbka``bbbkbba`i``abbbknbcclclllllllclllllladnnnmnnncllllnnnnnnnallllllllllllllllc`bkknbbakbbaaaaaiiii```ciaalllllljljljljjjl`jljllljjjjjjl",
"ljljljl`llljlljljlcclaakmnfffffeeeeeeeeeeeeeeeeeeeeefefefffmnnacccccllccilcclclccci`cclccccccccccccccinknnmkkmmknnnnnmmmmnbaaakicclc``ai````illlllibbaabaalcllc`aai`abilllciada```aicllllannnmkbbbknnkkkkkbnbk````aklllllljlllllljlillijllljlllljlllllcjlljllllljljllbknbaa`kkbbkbai``abbbbbnbilclcccici`icccccllaknnnkkn`lclcknnfnmndlllc`````aaaaccclldbnnbbbabbaaaa`a`ai`aaiibb`jlljljllljljlll`ljljjjjjlljlj",
"jjljjljcjljlljlllllllcbnnmneemefeeeeeeeeeeeeeeeeeeeeefeeffmmnbbiccciccccccclcclcccccccccliclicccccicibknnnnnnnnnmnnnnnnmmkabbbbiliclnmmkkkbbkalcclcbbbbaaallllc`ab``abcllllaknffnnnkalllllnkmnbkbbkkknnkkkkkbb```i`alljllllljlljlllilljlljllljlljlllljllljlljljlllljakbkkkaabnmbababbbbkbbbbkacllccciiii``aablllccnkknnnkillcldnnnmnmblllc`kkkknmmnblcillbnnkbbbbabba```aaaaaaa`aabcjlljljljlljljjljjjljlljjjljj",
"lljlljljlljljlljlllllibnkmnmffefefeeeeeeeeeeeeeeeeeeefffeffmmkkaccccclcillcllclclccccccci`icicccciciakkbknkknnnnnknnnnmnnbadbkkilclcnnmkkbbkkbllllcabbkabblcllcaabaabkilcclakknnnkbkbcilllkbbbbbbbbkbkkbkkbbbaa`iaaaallljjllljljljlclljlllljlllllljljljlbcjllljljjj`nnkbknbbabkbaabkbkkbbbbbbalcllcciabb``bnnilclckkknkkniccccannnnnnalllc`bbbbnnmmnillcldbdnkdabbbbaaaabaabab`aabb`ljlljljljljljljljljjljjljljl",
"jjljllljljllllccjcljlcbmknnnfefeefeeeeeeeeeeeeeeeeeeeefffemmnkk`cclccli`clbcblilccccccccciccccciial`kkkkknkknnnnnkknnmnnbdaabbkclllcknmnkbkmn`cclliaabbbbbcllclabkdaabilllcbkkkmnkakaliilibbbakbbkbkkbbkkbkkba``ibbaailllljlllllllllljlljljlljljlllillllljlljlljllcaknnbbkkbaaa``abkkkkbbabaa`cllcci`abkkabkkclllcbkknkknilllcannnnnk`clcc`bkbabmnnkllccldkkbkb`abbbbbkbbbbbbbbaabknajljlljljljljljljjljljllljll",
"ljlljjjljljljlccjlllccamnnnnfemeefeeeeeeeeeeeeeeeeeeeeffmffmfnbacclclllillil`cclcclccccclccccciia`canbkknnnnmnnnmnnknnmkkiidnbbclccl`aa``i``illclc`abbbkkbcllllbbkb``b`llcl````a`a`illicl`bbbbkkabbbbbabbbbkb``i``aaaalljlljjljjljljllljljlljllljlcalljlljllljlibjcbkmkmkbab``iiabbbkbbkbabbaailllcci``iii`icllcl`kkknnnm`cllcannnnnb`lllli```i`ab`ccllccnfnnkdbabbbbkkbakbabkbaiabnkijjljljljljljljjljljlllljlj",
"lljlljcjlljlljclclljclamnnknnenefeeeeeeeeeeeeeeeeeeeeefemffmmnb`clcllcllcclccclicccccccccccccciiicinnkknknmnnnnnmnmnnnnkbcc`mnklccllllcllllclccll`kkkkbbkkclclcbbkbaabillclcclllclllllllidbbkbnkbkbbkkbkbbkbaii`aiabbklljlllljlljlllljljlljljljlljlcjljllljjjljljlbbannnmba`ii`akbbbbbbbbbkaad`lllclllllllcljlllidmkbnnmn`cllcannnnnb`llccclllllllccllcldkmmnnmkkbbbbkbbbbbbbbbb`babkaljljljljjljljjljllljljljjl",
"jjljlljljllljllljjcc`l`bnmnnkeffefeeeeeeeeeeeeeeeefeeeeemffnnnb`llclccccclccclciclccccccccicccciccknknkkknnkkkbknnnmnmnka``dnkkllclccllllllcllll`kmnkkbkkkclcllbkabbabclllllllllljlllllibkkabbnkknkbbbbabbkbai`aa`abkkbjljljljljljljljljljljljljljjlljljjlljlicjliakkkmnnkkacc`kkkkbbaababnkabalccclllllcllllllcdnnkkmnkkallll`nnnnnballiclllllllllllll`akkkmmnnkkbkkbbbabbabbbabbbbmnclljljljljljjljljljljljjjj",
"alljaklllljlllllllllllibknmnneefefeeeeeeeeeeeeeeeeefeeeffmfnmkbicccllclllclcliibcccccccciciiiiiic`nmnnnknnnbbbbkkknknmnkbbkkkbdccclcccllcijcjlcbnmnmnbbkbklllllbkbabbbilcclclllllcllc``kknnbbbkknmnbkkbabbbaa`aaabbabkncljlljjljllljljljljljlljljljljlllljljljjllkbbaannkknac`bkkkkkbbbbbknkbb`lclllllllllcllcibnmnkkmkkb`ccccannnmkbkllllclllllcllllidkbbknnnnnnkkbkkkbbbbbbbbaabbkmmaljjljjljjljljljljjjjjljjl",
"ljjl`ajljlllljlljllllliinbmnmmefefeeeeeeeeeeeeeeeeeeeeffmnmnnkblclccclccclilillccccccciciciiiicccamnmnknmnkbknnnkbbkkmmknmnmkballclc`aacl`ccibknnmnnmnkbbkclcclkbbbbab`lllc```aaab`iakkkbnmnkbbkkknbbkkbkbaii`babbbbakb`jlaaljllljljljjljljljljljljljljjjlljjljj`nkbbabkknk`cbkkbbkkbbabnkbbbb`lcllcaailllll`bbmmmknnnkkballlcibkkmnnmllclci`iiaaabbkknkbkbnnnnnnnnbbbbbbbbbkabbabkmnmmcljljljjljjljlljljljljjjj",
"lllljljlllbllljllllllllcaknknmffeffeeeeeeeeeeeefeefeefemmfnnnkacclccclclcccccccccccccccccciii`ciabnmmmnnnnbknnmnmmnkkkknnnmkdballcclbmn`llcll`nknmnknkmnbdlcllcbkbbbbk`lcllkkkknnmnkbbknbnknkbkbnkbbbkbakkaiabaabbbbbbabjljcljljlljjljljljljjlljljljljljljjljjclannbbaanbkacikmnkkbbkkbbnnnkbaacclcibbbilcclcaknmnmknmkbbklllccmkkbnkmclclcai``abbnnknnnkbkkknnnnnknkkbbbbbabkbbkbknmmkaljjlljjjlllljjjjjljjajlj",
"jljljccjllljllllljllilll`bbnmmfffefefeeeeeeeeeeeefffefenmfmnkbiclccclcccccccccccccccccccciiiiiii`bbknnnnknbbmnmnnnnnnkkkmnkaad`lcllcbkmk`cllll`knmnmnknnnkllllinbbkmnn`clllbnkknknnnkkkkbknnnkbbkkkbkb`iaba`abbbbbknnbbbllilljllljljljljjljjljljljljljjljjlljia`bnkbb`akab`aaknnnnbkbbaabnnbbbdllliibbbailllclabnnnmkbkkbkclcccmnnkkkniclcl`i`akbbknknknnbbkknnmnkknnkbbbabbkbbnknnnnmnnljljjjljljljljljjjjljjlj",
"klljljjclljlljllllll`cllcakbmmmfefmffeeeeeeeeeeeeefeeffmmfnnbailclccccclccccccccccccccccciiici`iabbbbkkbkkbnmnnknmnnnnnkkkbdab`lcccibknkn`clillakmnnmnkkmkllccinmnknmncjcccknnkkknmmnnbbkbnknnbbbkbabaciaaaabaabaknmnnbbilijljljlljjljjljljjljljjljjljljljjjljjaknkbbaaba``bknnnmnkkbbabbknkbbblllccbbbbailllcc`bkbkkbkbkklclccnnmnnknillcc`c`abbbknnnnnmkbkkknnnnnnnnnkmkbkmnknnmnknnmm`lljjjljjljljjjjljjcjljj",
"ljlllllljlcljcllllllillll`bbkkmmfffffefffeeeeefeeefefffmmmnkb`ccacclcliccclccccccccicciciiciciaibbbkbkbbakbmmbnnnknnnnnnkkkbbaiclllcbnmknncllllldmfknmnknkllllikbknnnniilllknnkkknnnmmnbkbnknnkkabbbaccaaaaabbabknnnnnnkallljjljjljljjljjljjlljljjjjljjljjjljlcbknkkkbbda`aknnnnnmnkbbbbbbbkbbalcclcknkkbaicllil`bkbbbkdmnlllclnknnnnk`llclii`bbabknkkknnbbbkknnnmnnknnnnnnkbkkknnknnmkkbjjjljjjljljljljjjanjjjj",
"llmjjljllllllilljlllllllllikbbnmmmfffffefeeeeffeefffmffmmnkbaicclcccccclccccccccccccccciiiiicc``bbkkknkbakbnnknknnkkknnnmnbbbaclcccibnmnmnncllclldmnnmnnnnllclckkkbkmmilllcknnnnbkknmfnnbkknkknnkabaic`bbbabbbbknmnknnnnkljjljljljjjljjljjljjijljljljljjjlljjj`ikkkbnkbaaadnnnkknmmkbbbbbbbkbballlclbbbbbabclllcidnkbbbbnmlccilnkkkknn`llccciabaabnmnnkmnnbbbbnknmmnkkkknmnkbbkbbnnnmnnnflljjljajljljjjjjljjjjjj",
"illllllllljllclllllllclllll`bbkmnmmfefeffeffefefmeffmffmknkaiclcclclcccccccccccccccicciciicici`aabbbkknkbabknnnkkkknkkkkkknkb`clcllibknnnmkkcllllcdkmfmnnkllllcbbbbabbclcllknnnnkkknnmnbbkkmnknnnkb`c`bbkbbbbbbbknnnnmnknlljljjljjljjljjljjljcjjjjjjjjljljjjllibkkkknnbaabknmnkkkkknkbkkkbbkknklcclcbkbbakdbilllliakkbabkncllllnnnkknkalllliiaaabbbnnnknmnkbbbkbknmmnkkknkbbkbbaabbknnkkniljjjjljjjljljjjjjljjlj",
"lcljlljlllllljlllllllclllillabbnknmmfmfffffffffffmefmnnnkkaicclcilccbcccccccccicciccciciiciiii`babbbbbbkkakkkmnnknkkkkkkknmnda`clllibbbbbakbacllcl`knmnnnklllc`nmb``bbcllclknnnnnnkknnkbbbknnkknnmna`bbbkbbbbbabkknnnnnnncjjjjjjjljjjjjljjljjjljjljljljljjljjj`anknnmnbbabknmmnnkabnnknmkkbaknkcllllbbkbbakaaillclibkbbbbkiclcckkkknkkaclll`bbkkbaabbkabkbbbabbkkbnmmnnkknmmkkkb`abbkkkbkbjjlljjjljljjjjjjjjjljj",
"cbjcjllljlllllllllllcllllllclcbbkkmnmnffffffemmmfnmnmknkkbiccccclccliclcccccccciccciccciiiiciciabaabaaabkbnkknnnkkkkknnnknkdakndbkbabbbbbnbkbbaaa`bkbkmfnmbkkbbnna`ammakaaamnnnkkkkkknnkkakknkkkkmnaabakkbbabbbkknnnnnnmkajjljljjjjljljjjjjjljiljjjjjjjjjljjcccknknknnbbdknnnmmnbbbknmmnnnkkbbbabababbbbbkkkbaaa`aiabakdnkdbdbbkbkkkkkkab``bnnnnbkbbbbbbkbkkbbabbbbnnmknnmknmmm``bnmkbkbknjjjjljjjljljljjljjj`jj",
"lljljlllllllllllllcllllllllllc`abbkknkmfmmfmfknfmmnnnkkba`cclliliccccncccccciicciccciciciiiiii`bbkbaaabbkbnnbkmkkkkkkbkbkkd`bknknnmnkabbnbkkbknbbbbbbbknmnnnnmnbkiannmnnnknnmnnkkkkkkkknnkkknnkknnnbbabbbkbbbbnkbknnmmmmnbcjjjjjjjljjjjlj`jjjlljjjjllljljljlliiknnnnnnkkbkknknfnkknknnnmmnmnmkkbbknkbaabbnknkbbbbaa`bbkbnkbkmnkkkkbbkbkkaabmkknnnnbbakkbkkkkkbakbbbdbmmnmkmnkbbcdnnmnknbkma`ijjjjjjljjjjljjjjljj",
"ljcbaljllllllllllclllllllclcllcci`bbnbkbnknnmkknkkmkkba`ilccilcclcicl`cccciclcliccicicic`icici`nkkkbaabbkbknkbkfnnkkbbkkbbaannknnnnnnbkbkmkknnkkabaaabbbknnnnmfnk`annnmmnnnnnmnnknnknkknnkkknnnkkkkkkbabkkbbbbbkkknmmnmmfkjjljjlljjjlcljjljjjljjljljjjljjlljii`nknnnmmkbbbbnnnmnknknknnnnnmnmnnnkkkkkbaabkmmnbbnbbaabbkbkkkkknkkkkbkkkkdabknknnnnnnbbbkkkbkkkkbaadbbbkknkkmmfkkibnknnnnknmajjjljjljljljjjjjjjjjj",
"lljci`cjlllllllllclllllllllccllllc``bbkkkkknknnkbnkba`icccccc`ccccccclcccccccaciciciciciiiiiiiankkmkbbbbbkbbkbbknnnnnkkkbaaknkknnnmmmkbbbnkbknkkbbabbbbbbkmmnmmmb`kmknnnmnknknnnkknnnnknknnkkknnnnkkmnkbbbbbkbbnnkkmmnnnnmjc`ljjjjjjjljjjjlj`jljjjljljjlljlj`c`nnknnnmkbbaabkbbknmnnknknnnnnmnmmnkbnkbbbkbnmnnknnkbbbbbbbkkbknnnnknkbkk`akkkknknnmnnbbknkbkkkkbaaabbabbknmnnmnk`kkknnnnnnbillljjljjjljjjjjjjjljj",
"jlljcillllllllllclclllllcllllcccclcliiaabbbbbkbabaaiiiiccccccacccclciciccccciaiccicicicici`iiibnnkfnknbbbkaaknkbnnnmnnnkkbknnnkknnnnmkbbbbkbbkkbaaabbbbbbknmnknkbbknnnnnmnnnnnmmnnknknkkkmnnbkknkkkknnkbbbbkknbkkkknnnkknfjjjjjljjlljjjjljjj`jjljljjlljijjjjccaknnkkknnkb`iaabknnmnnnnknnnnnnnnnmnbkkkabkbknmnkkfnkkkbbbabbbbbknnmnnknkaknknnkknnmnnbbbbkabkbbbadaabbaabnmnknkkaknnnnnnnnfkljcjljljljjjjjjjjjjjj",
"llllcjllllllcllllclllclclclclclcccclclcliiiai``icccccccccccibcccccccccccciciiiiciciciciciiiciinmnkmmnmkkbbbbbabbnnnmknnnkkknknnnnnnnnkkbabbbbkka`aabbbbbabnnnnkknnkmnnmmnmnnmmmnmmnnkkkknnnmkbkknnknnnnnkkkkbmmkkkkkkkkkbnjjjljjjljjjljljlljajljjjjljljjjljjjc`kmnnkknnnba```akmnnnnmnnnnknnnnnnmnkkkkbbkkknnnmknmmmnbbbkbbbbbknnmkknnkknknnknnnnnkkkbabbbbkkbiabbbbbbbdnnkkmbknnknnmnnmkmbjinijljljjjjjjjjjjjjj",
"llljllllllllllllccclllcllclclllcllcccccccccclcccccccclcccccc`lccccicciccciccicciciciciiiiii`ickmmnmnmnbbbbbclciicccilcciliiilciccicccccclcclicllllcclcccllciiciciiciiiiicciiiicci`iiclliiiciiccciiiicciiiccccamknkkbkbkkkblljljjljjjjjjjjjjljljjlljjljjjjjjlllinmmnnnknmkaacccciiiciiiiiiiciiiciiiicccclciiicc`cciccillccclclciiciclicliicccliiciccccccclccccllllciccccliiciiiakkknnmmnmnnkciijljjjjjjjjjjjjjjjj",
"ljlcljlllllllllllclllcllllccccccccclccllcccccccccccccccccccclccccccccicccicci`iiciiiicicii`a`ikmnmmmnkbabbijjjjjjjjljljjjjjljjjjjljjjjjjjjljljjjjjjjjjljjjljjjjjjljjljjjjjjjjljjjjljjjjjljjjljjjljjjjjjjjjjjjinnnkkbbbbbkbjjjjjjlljjjjjjjjljjljljjljajjjjjjljccknnnnknnmkbacjjjjjljjjjjljjljjljjjjljjjjjjjjljjljjljjjljjjjjjjjjjjljjljjjljjjjjljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlikkbknnmnnmkncjljjjljjjjjjjjjjjjjj",
"llllllcllllllllcclclclclccllclclclcclcccccclilccccccccccilicciccicccccciciciibiciciciiciiia``immmmnnmknnkkillljcccjljclljlllccjijljcllljljlljjljljjljlcjlllllllllcllljlcjljjljllljjlclljllilljllclljlcicjclclcknkkkkkabbbkljjjjljjjjjjjjjjjljjljjjjjjjjjjjjjjcianmnnnknmnbacjllclcjcjcjcjllllllllljllllccjlllllljljllcjjllllljlljljjljljjjjlljjjllllllllcjllljllclljjllljljjllabbbbbknknmkn`jjljjjjjjjjjjjjjjjjj",
"lllllljcllcllllccclllclcclclclclcccccccccmkcccilccccccccccccccicccciccccciciiaiiciiiiiiiciii`immmnmnnmmnnkclnmfffffffeeffmmffmmffmfffffmmffffeffemfffffmmmffffffffffffffffmmmffffffmffmmfffffmffffmffmmmmffmmkkmnnkbbnkabkjailjjjjjjjjjjjjjjjjjjjjjjjljjjjjjlcibknmknnnnmkdidkkkmnnnnmmmnkknkkkkkkkknkkkkkknknknnkkkkkkbkbknknnkkknnkkkbkkbbbbbkkbbbbbbbbnkkbbkbkbbkkkabbkbkda`dbbbbbbkbnmnljljljjjj`jljjjjjjjjj",
"jlllllcbccnnclclllklclllllcclcclcllccclcciclclciccccccicccccicaiccccciciicciciciiicicicii`ii`innmmnnnmfnmnilmffffeffffffffffffmffmmffffmmfffffffffffmfmmmmffffefffeffeffmffmmmfffmmmffffffffffffffffffmmfffffnbnnkkbbkkkbaljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlcibbmmnknnmkka`bnknmmnnnnnnknnnkkkkkbkknnkbkkknknknnkkkkkkbbbkkkkkkkkkkknnkkkkbbbbkbbbbbkbbbkkkbbbkkkkkkbbbbkkbba`bbabbbabaknniljjjjljjjjjjjjjjjjj`",
"c`iljllllliclclclkicllicllccccccccccccccaaiciclcccciclilcicccc`cciciccciciiaiiciiiciciiiii`i``nmmnkknmmmmmilmmmfffffmmffffffmmffmfmmfffmfmmfffffemmffffmmfffffffffffffffmffmmnmffmnmmfmmfeffffffffefffmmfffffkbknnmkbbknkbljjjjjjjjjjllcjjjjjjjjjjjjjjiljjjjliibknmkknnnmnnabkkkmnmnkkknknnkkkkknkkkkknkkkbkknknnkkkkkkbbkkbkkkbkbkkkkkkbkkbbbbkbbbbbkbkkkkkkbkbkbkbkkbbbkbkba`bbbbbbaabkknbjljjjjj`jjjjjjjjijjj",
"lljlcclllllllcccclcllcllccclclcccccclccccccclciccccccciccciccaccccccicicciibiiiciiiiiii`i``i``nmnnnkknmmmnicffffffffmmmmfffmmffmffmmfffffmmmffffffmefefmfffffffnfmmmmmmmmffffffffmmmfffffffffffmefffmmffffffmnbbnnmmkbbbknjjjjjjjjjjjjjjjjjjijjjjjjjjjljjjjjliidbnmnnnknmnnaaknmnnnkkkknknnkkknkkkkbknnknkkbbkknnkkkkkkbbnkknnbbbbkbkkbbbkkkkbkkkbbbbkkkkkbkkbkbkkkbbkbkbkbkkaiabbabkkkbbbbajjjjjjjbljjjjjjjljjj",
"llllllllcjccjlcllcclalccclclaccccccccccccccccccccciccicicccicbcicicicicicic`iciiiiiiii`iii`ii`nnnnnnknmmnmccmffffffmfmfmffffmffmfffmfeffmfmmffffffmfffmmmmfffffmmmmmmmmmmffffefffffmmffffmfffffffffmmfffefffmnkbkkmmnkbbbkjjjjjjjjjjjjjjljjjjjjjjjjjjjjjjjjjci`bbkmmnkknnnn`annnnnnnnkkknkkkknkkkkkkknnknbkbkkkkkkkkkkkkbnkkkkkbkbbbbbbbbkbknnkkbkbkbkbkbbbkbbbkkkbbbkkkkkkkbbibababbkkkkba`ljjjjjjjjjjjjjjjljjj",
"llllllcllclliccclllclccllccik`lc`ccicccccclccccccccciclccicccciciciciciciiccciiiciiiiiiiii`ii`nmnkkkknnmnnlcmmmmffmfmffffffmmffmmfffefffmffmfffmmmnmmmmfmfffffmmmfmmmfmmmfffffmmffffmmfffmmfffffffmmmfffmefmnnkkbbknnnkbabjjjjjjjjjjjjjjijjjjjjjjjjjjjjjjjjjlc`kkkbknnnkmnnaakkknknknnkknnkkknkkkkknmnnkkkkkkkkkbbkbbkkkbkkkkkbkbkbbbbkbbbkbkkkbkbkbkbbbkkbkbbkkkbbbbkbbkkbbba`abbbaabknkkb`ljjjjjjjjjjjjjjjcjjj",
"cllcclllllccccclclclccllcclliccciclcccccciccciccicccicaccciciciiciciciciiciiiiiiiii`i`iiiiiiibnmkkkkkknnnmcifmfmmmmmfmmffffmfffffffeffffmffffefmmfmmffmfmfefmmmmmmfmfmmmnfmmmmnmmffffffefmfffmfffmmmmmmnmfmnmnbkbbbkknnnkbljjcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`bmbbbknmkkkkbannnknkkkkkknnnknnnkkknnnnkkkknknkkkkbkbkkkbkbkkkbbbbkkbkkbbbbbbbbbbbkbkbkkkkbbkkbkbkbbbbbabbkbabb`abbbbaaabkkkbljjjjjjjjjdcjjjjjjjj",
"lccllcilclllccclllclcccccccclcclccccc`biccccccc`ccicicfiiccciiliiciciciiciiciiciiii``iii`iiiibnmmnkkknnnkklcmmmmmmmmmmmmefffffefffffmmffffmfffffnfmfffnfmfffmmmmfffmfmmmffmnmmmmmnmmfffffmfffnmfnmnmnnmmmfnmfnbkkkkkkknnnmljjljjjjjjjjjjjjjjjjjjjjjjjjljjjjjlciamkba`knnnnbb`nknkkkkkkkkknmkknmnnnkkkkkknknknknnkkkkkknkkbknbbbkkbkbbbbbbkkbbbbbbbbbbbkkkbakkbbbbbbabbababbbbb`aba`aaaabbbbbjjjjljjjjjjjjjjjjjjj",
"lclccc``cllccclclccclccclcccccccccccccccbaiccci`cicicciicciciciciciciciiiiaiiii````ii`iiii`i``nmmnnkknnmnklammffmfmmmmmmmmffffmffffffffeffffemmmmffffffmmffmmmmffmffmmmmfffmmnmmnfmmmffffffffffmmmmnmnmmmfffmmnkkkknkbkmnnjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjcccbnbbabbbnnknn`nnknnkkkkkkkkknnnkknnnnknkkknnkkbkbbkkkkkkkkkkbbbbkkbkbkbbbkkkbbbbbbbbbbbkkkkbkkkbbbbabbabbbkbbkbbbnbi`ii`abkbbjjjjeajjjjjjjjjjjjjj",
"ccllllcclclcclcclcllcclccccclcccccccccciciicicccilckciciiciciciciiciiicicii`i`iiii`iiiiii`ii``nnmnnnnnmnnklammfffmfmmmmmmmffmmmmffmfffmfffmffnmmmfmfmfmmnmmmmmmmmmmfmmnmmmmnmmmmmmmnnmmmefffmnmfnnnnmnnmnnffmmkbbkkkbabmnkljljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl``abkbkbbbknnmm`knknnknkkkkkkknkkkkkkbkkkkknnnknbkbbkkkbbbbbbbkbbbbkkbkkkbbbbbbbbbbbbbbbbbbbkkkbbbkbbbbabbaabbbkbaakbiiii`aabbkcljjjjjjjjjjljjjjdkj",
"clllclclimalccllcclclcccclcccccccccccccccicccciiiciiccicciciciciiciiiiic`iakciiiiiiiiii`ii`iiakmmnnnnnnmnkjanmmfffmfmmmnmmmmmnmmmmmmmmmmfeffmmfmmffmmffmmmmmmmmmmmffmmmmmmmmmmmmmnmmmnnmmfffffmnmnmmmnmnnmffmnnbbbbbbabnmmcjjjj`jjjjjjjjjjjjjjjjjjjjjjjjjcljlii`knkbbbkkbnnn`kknnnnkkkkkbkknkbbkkkkbbkkbknnknkkbkkkkbkkkbbbbkbbbbbbkbkbbbbbbbbbbbbbbbababbkbkbbbbabbbbababbbbb``ka`icc``aabkljjjjjjjjjjjjjjjjjjj",
"lclcllcccclcllcclc`kcclcclccclcacicciliccccccccccicciciciciciciciiiciciiii`i`iiiiiii`iiaiii`iakmnmnmnnnnnblbmmfmfffmmmmmmfmmmmmffmmnmnmfmffmmmmmmfmmmffnfmmmmnmnmmmmmmmmmmmmmmnmmmmmmmnmmmmffmmmmmmmmmnnffmfmnnnbbbkkbbbbbcjjjjiljjjljjjjjjjjjjjjjjjjjjjjljjlc`aknnkkbbkbbbk`knnnnnnnkkkkkkkkkkkkkkkkkbbkbnkkkkkbkkkbkkkkbbkbbbbbbbbbbkbbkbkbbbbbbbbbbbbbkbbbkbbababbbbbbbbbkba`bb``lciaabkncjjjjjjjjjjjjjjjjjjj",
"llllllccccllcclccccciclccclc`iliccclccicicciiicccicciiciciiciiiiciiiiiii`iicii`c`iiiiii`iii``annmmnnnmnnnbjbmffffmfmmmnnmmmmmmmfmmffmmmnmmfmmfmmmmfnmfmmnmnmmmmffmnmnmmmnmmmmmmmmnnmmnmmfmknffmknnmmmnmmffffnmnnnkbbkbbba`ljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`annnnnkbbbb`aiknnknknkkkkkkkkkbkknkkbkbkkbkkkkbkkbkkbbbbkbbbbbbbkkkkbbbbbbbbbbbbbbbbbbbbabkbbbkbbbbbabbbakbkbbbb`kbailciankkn`jjjjjjjjjjjljjjjjjj",
"clllccllllccjcilccllnacllicanaclccn`ccikaicccciicci`cciciciciciiii`iiii`ib`iiiciiiii`iiiii`i`knmmmnmnnmmmblkffffmfmmmmmmmnmmmmmmmmmmmmmnfmfnmffmmmmfmmfmmmfnmmffffmnmmmmmnmnmmnmmmnmmmmfnffffmffmmnmnmmfffffmnnnnnkbbakn``jjjjajji`jjjjjjjjjjjjjljjjjjjjjjjjl`i`nnnnnnbka`ciinnnnnknkkkbkbbkkkkkkkbkkbkbkkkbkbbkkbbkkkkbkkkkbbbnknkbbbbbbbbbbbbbbbbbbbbbkbbbbkbbbbbbbabbbkkkkka`kb`clciannkk`jjjjjjjjjjjjjjjjjjj",
"clclcclccclicllclcccacciccciicciicacccli`cccccccicimiiciiiciiiiii`i`i`i`iicii`iii`iiii`ii`ii`knnmnnnmmnmmblkmffmfmmmmnmmnmmmmmmfmnmmnmfffmfmmfmmmmmfmffffffmmffmffmnmmmmmmmmmmmmmmmnmmfmfmmmmmffffmmmnmffmffmmnnmnnkbbknblijjljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiiannnknkbbi`ciinnnnnkkkkkkkkkkkkkkkkkkkkbkkkkkkkkkbbkkkkkknkkkbkkkkkkbbbkbbbbbbbbbbbbbbbbbbbkkbbbkbkbbbbbbbbkbbbbibbicci`kknnnajjjjjjjjjjjjjjjjjjj",
"llcllclclcjcccclclcclcccbcccccccccicicicccciciiccccicciiciicicii`iii``iiiiiiicii`a`iii`iiiiiinnnnnmnnmnmnbjkmffmmmmmmmmmmmmmmmmmmmffffeffnmmffmmmmmmmnffmffnmffmmmmnnmmmmmmmmmmmmmmnnmmnnmmfmmmmmnmnnmmmmmmmmnmnnmnnkbbba`jijjjjjjjjjjjjjjjjjjjjjjjjjjjjljjjl`iaknmkkb`iiii``nnnkkkkkkkkkkkkkbbkkbbkknnmnkkkkkkkbkbkkbbbkkkkkkknkkkbbbbbkbbbbkbbbbbbbabbbbabkkbabbbbbabakbbbbbb`ab`````nnnkk`jjjjjjjjjjjjjjjjjjj",
"lcllccccccclclcccccccccciccccccccccccicciciccciciiciciciiciciiiiaiia`iiiiiiiiiii```i`iii`iiiikkkbmmmnmmnnalnfmmmnmmnmmmmmmmmnmmnmffmffmffffmmfmnmmmmmnmffmfmffffffmmmnnmnnmmmmmmmmmmnnnmmmmmmmnmmmmmmmnnmnnmmmnnmkmnnkabi`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjii`nnnka`ic`a``innknkkkkkkbkkkkkkkkbkkkknkkkknkkkkbbkkbkbbbkkkkkbknbkkbbbbbbbbbbbbbbbbbbbababbkbbbbbbabbbbbabbabbbcibbai`akkmkkbjjjjjjjjjjjjjjjjjjj",
"lccllccclclccclccccccccccccicccc`ciliciccccciccccciciciciciiiii`faiii`iiiiii`ii`ii`ii`iiiiiiikmnkbmmnmmnfalkmmfmmffnmnmmmmmmmmfmffffffnmfmfmffmmmmmmmmmfmfffffffmffmmmmmmmmmmnnmnnnnmmmmnmmmmmmmmmmmmnnmnnnmmmmnnmnnnkba`ajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj`i`nnbbaa`iaaa`inkkkkknkkkkkkkkkbkkkkkknknnbkkkkknkkkbkbbkbkkbbkkkkbkkknbbbbbbbbkbbbbbbabbbbbbbbbbbbbbbbbbabbababa``bba`aabbbnfkjjjjjjjjjjjjjjjjjjj",
"clcllclllclccclcclcccccccccclciccicccccciciiiciiciciciiciiiiii`iicciiiiiiiiiiiiiiiiiii`iiiii`nnmbbkmnmmnk`jnnmmmffmmnmnmmnmmnmfmmmfffffmfmfmffnmmmnmmmmfnfmfmfffffffmnnmmmmnmmnmmmnmnmmmmmmmmmmnmmmmmmmfnnnnnnknnfkkknn``aljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjji``nnnbbbaaabaaikknkknnkbkbkkkkkkbkknkkknnnkkkkkkkbbbbbbbkkbkkkknkknkkkkbbbbbkbbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbabba`aba`abbbkbakkjjjjjjjjjjjjjjjjjjj",
"lclclccccccllccccccccccccciciccclic`cciiiciiiiciiiicicciiiiiiiciii`iiiiiiii`iii`ii`i`iii`ii`akbmnabnnnmnb`jffffmfffmmmnmmnmmmmfmfmmmffffffffffmfnmmnmmmfmffmmfffmmfmmmmmmnnmmmmmmmmnmnmnmmmmmmmnmnnnmfmmfmmmmnknnmnkknkaabjlljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlic`bkmkbbbabbaainnnknnnkkkkbkkkkkkknkkkkkkknkknkkkkkkkbbbbbbnnkkkbnnkbbbkbbbbbbbbbbkbbbbbbbbbbbbbbbabbbabbbkbbbbbba`baaabkbnbbkbccjjjjjjjjjjjjjjjjj",
"clcccclcall`lcclccccccccccccbiciicicccicccciicciciciciiii`iiiiiiiiccii`iiiiii`ii`iiiiiiiiiciabbkbbbbmmnnn`jffmmfmfmmmmnfmmmfffffffmmmfffmfffffffffmnmnnmfffmmmffffmmmmnnmnmmfmfmnmmmmmmmmnmnnnnnmnnmmmmmmfmmmnnknknkknbbbkljjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjj`iabknnnkknnkbbinnnnnnnkkkkkkkkknnknnkkkkkkkkkkknnknnkkbkbbbnkkkbbkkkkkkbbbbbbbbkkkbkbbbbbbbbbbbbbabbabbbbbbbbbbbbaabababbbbmnkbljjjjjjjjjjjjjjjjjj",
"clclclcl`lcmcccccccccccccciikiiiii``iiicicciiccicicicii`iiiiiiiii```iiiiii`iiiiii`ii`iiiiiii`bbbbkbbmmnmmilmfnmmmmmmmmmmmmffffffffmmffmmffmmfmffmmmmmmmffmfnmmffffmmmmnnmmmffmmmmnmmmmmmmnmnmnmmmfffnnnnmnnmmnnkkknnkkbkbkljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjji``mnkkknnmmkbbiknnnkkkknnkkkknknnnnnnnkkkkkkknkkkkkkkkbkbkbkbkkbbbkkbkbkbbbbbbkbkkbbbbbbbbbbbbbabbbbbbbbbbbabbabba`b`bkkkkabmmbljjjjjjjjjjjjjjjjjj",
"clcccllclcikcc`cccccccciiciib`iiiiabibiiiiiiciiiiiiiiiiiiiiiiiiiiiiciiiiiiii`i`iiiiiiiiiiiic`kbkbbbbnmnnmicmfffmmmfmfmnmfmmfffffmmmmffmffffmmnmmmmmmffmmmmmnmfffnmmmmfffmffffmnmmmmmmmnnmmnmmmmmmffmmnmmnmmnmnnnkkknkkdbbkljjjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjji``mnkbbkknkkbaiknnnkbkknkkkknkknnknkkkkknnnknkkbkbbbkbkkkkkkkkkbbkkkbbbbkkbkbkkkbbbbbbbbbbbbbbabbkbbbkbbbbabababaaiiibknnkkknnnijjjjjjjjjjjjjjjjjj",
"cclcclcclccclcnicccccciiiiiiciii`ca`iaiciiiciiiiiiiii`iiiiiiiiiiiiii`ic`i`iiiii`iii`iiiiiiii`bknbkkbbnmnnilnfffnmmmmmmmffmfffffmmfnmffffffnmfnmfmfffffmnffmmnfmmmfmmfmmmmffffmmmmmmnmnmmnmmmmmmfmnnnmmnnmnmnnkknkkbnnkbbnbljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjii`kmnkbbkkbbbbiknnnkknkkkkkknkknnnknkbkkkkkkknbkkkkkkkkknnkbkkbbbkbbbkkkbkbbbkknkbbbkbbbbbbbbbbbbkbbbbbbabbbbbabbalilbkkkknnnnmijjjjjjjjjjjjjjjjjj",
"lccclccclcccccccccccciiiiiiiiciiiiii`i`iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii`ii`iiiiiiiiiiciankbbkbbbkkmmccnfffffffmffffmmnmmmmfmmmfffffmmfffmfffmmfffmmffffffnmmfffmmmfmfffmmmnfmnmmmnmnnmffmnnnnnnnnmmnmmnnnkknnkkbkkkknljjjjajjjjjjjjjjjjjjjjjjjjjjjjjjjjjc`iknmnbbbkbbba`bnmnnnnnnnnnnnkkkkbnkbkkknkkkkknnkbkknkkkkkbkknnkkbkbkkkbkbkkbbkkbkbbkbbbbbbababkbbabbaabbbaabbbaaalccankknkbnbkajjjjjjjjjjjjjjjjjj",
"lclliclcccccccccccccciiia`ccciiicickkiiiiiiii`ii`iiiiiiiiiiiiiiiiiiiii`ii`iiii`ai`iiiiii`ii``mnkkbbbabkkklcnnffffffffefffmmnfffmffffmmmmfmfmmnmmffmnmmmffffffmmmmmmmmmffmfffffmmmmnmnnmnmmmmnnnnnnmmmnnkmmmnmnbbknnkbbknnnljjjjjjjjjjjjjjljjjjjjjjjjjjjjjjjjjia`kbnmnbbbbbkaabknnnnmnnnnnnnkkkknkkknkkknkkbkbkkkkknkkkkknnkkkknkkbbkbkbbkkkkkkkkkbbbbbbbbbbbbbbbababbbabbbbbbkbalciakkknnknkkdjjjjjjjjjjjjjjjjjj",
"cclibccaccclcccccccciiicaccciiicic`aai`iiiiiiiiiiiiiiciii`iiiiiii`i`iii`iii`ii`iiiiiiiiciccc`knknkkkbaaa`lifmfmmmfffffffmmnmmffmmfmmmmmmffmfmfffffmfmmmfmfmmnnfnfmmmmnfffffffmmmnmnmmnmmmfmnnmfmfmmfffmmmnmnmnkkbkkkabkknncjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjc``kbknmnbbknnkabnkkbnnnnmnnnnnkkknknnnnkknbknkkkbkkkkkkkkkkbkkkbbbkbkbbbkbbkkkkkbbbbbbbbbabbbbbbbakbkbkkkbabbabbbkci`akknkknkkkajjjjjjjjjjjjjjjjjj",
"cclc`lcccccccccccccciiiccciiicciicac`ii`ii`i`iiiiiiiiiiiiiiiiiii`iiii`ii`iiiiiiiiiiiiiiciiiiakkknnmnba``ij`mmmmmffffmmnmnmfmmffmfffffmmmffmmmmnmnffffmmmmfnmmmfffnmfnnffmmmmmmmmmnmnnmmfmmnnnffffmmmmmmnmnnnmnknkbabkkkbbkljjjjjjjjjjjjjjjjjjljjjjjjjjjjjjjjji`ikkkkkmmnnnfnbbnknknnnnkknkkkkkkknkkkknnnbknnkkkkbkkknknkbkkkkbbbbkkkbkbbkkkkbbbbbbbbbabbbbkkababkbkbbbbbbbbbbabki`abkkkkkknnkbjjjjjjjjjjjjjjjjjj",
"lcllccclcccccccccciiiiiccciicciiciciiiiiiii`iiiiiciiiiiiiiiiiiiiii`iiiiii`bb`iiii`iiiciiiccibnkkbknbba`cijafmmfmfffmmmnmnnmffmffffffffffffmmmmffmffffmmnmfnnmnfmfmmfnnmnmmnnnnmmmnnnmmmmmnnnfmmmnmmfffnnnmmffmknkbabbbkkkkljjjjjjjjjjjjjjjjjjjjjjjjjjjjj`ljjjca`bknkknmnmnnmbannnknkkkkknkbkkkkknnknnnknknkkkbkknkkkkkkkkbbkbbbbbkbbkkbbbbbbbbabbbbbbbbbbkbbabbbbbbbbbkbkbaabkkbaakkkkbbbkknnnjjjjjjjjjjkjjjjjlj",
"cccclcccccccccccccccciiiiciicciccici`ii`i`i`iiiiiiiiiiiiiiiiiii`iiiii`iiiiiicci`iiiiciiiiiciakkkknkaaa`i`jamfmmmmmmfmmnnfnnmffmfmfmfmmffffffffffffmmmfmmmmnmmnfmmmmfmnmnnmmmmmnnmnnmmmmnnnnmfmmnffmmfmmmnnmmmnnnmkbkbbknnbljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjji`ikkknkbkmnnkkbannkkknknnkkbkbkbkknnnnnkkknknnknknkkkkkkkkkbbbkkbbbkkbbkbbabbbbbbbbbbbabbbbbbaabkkbbkkkbkbbbbbbkbbaakkkkkkkbbbknjjjjjjjjjjjjjjjjjj",
"clcccilcccccccciiciciiicccciciicic`iii``ii`iiiiiciiiiiiiii`iii`ii`iiiiiiiiii`iiiiiiiiiiiiiiibkknnkaaaa`abjanmnnfmmmfmmnnmmnmmmmmffmmnnmmffffmmnnfmfmfffmffmffmmmmfmmnmmnmmmmmnmnnmmmfmnnnnmmmmmfmmnnnnmmnmmnmmnmmnkkkkkkkkljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjc``kbkkkbknmnkkbannkknkkkkkbkkkbkkknkkkkkbbkkknnkkkkbkknkkkkknnkkkkbbbkkbbbbbbbbbbbbbbbbbbbbbabbbbkbbbbbbabbbbbbabbaaknknkknkkbkkljjjjjjjjjjjjjjjjk",
"lcccbf`cccccciiaccccciiiiciccciiiiim`iaii`iiiciiiiiiiiiiiii`iiiiiii`i`iii`iciiiiiiii```iiiicabbbkb`iba`abjamfnnmfmmmmmmfnffmmmmnnmmmmnmfmmmmmnnnnfffmmfffnmmmfnmmmmnnnmmmmmmnmnmnnnmmnnnnmfmnmmmnnnnnnnnmmfmffmnnmmnkknbbbljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl`ibabbkkkbnnkbkakkbkkkkknkkknkkknknkbbkkkbbkkbkkbkbbbknnkkkkkkbkkkbkbbkbbbbkbbkkbbbabbbbbbbbabbkbbakbabbabbbabbkkka`knknnmnnnbnkljjljjjjjjjjjjjjjj",
"k`ii`icclccccciccciicc`ccicicciiciicibniiiiiiiiiiiiiiii`caci`ii`i`iiiiiiiiiiiiciiciiiniiiiic`b`abaiiaaabbjbmmmmmnnnmmmfffffmfmnnmnffmnnnmmmnnnmnnmffmmmffmmffmmmnmfmmmnmmmmnnnmnfffmnnmmffmmmnmnnnnmmnmfnmmfmnnmnmmnnkkknbcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjci`akkbkkkbbbmkkanknnkkbkkknnkknnknbbbbnknkbkbkkkbbkbbbkkknbkkbbkkkbbbkknkbbbbkbbbbbbbbkkbbabkbbbbbkbbaaabbabbbbbbbaakknnnkbknnkbijjjjjjjjjjjjjjjjj",
"ilcciccciccccccciccccii`iiiiciiciiiiiiai`iiiiiiiiiiii`ic`ii`iiaciiiiiiiiiiiciiiiii`iiaiiiccaabaab`iiaabbblkfmmfmmnmmmfmmfffmmnnmnnmmffmmffffmmmmmmmmmmmnmnmmmnnmmmnmmnnmnnnnmmnmmmnmnnmfnmmfmnnnnnnmmmmmmmmmmnnnmmnmnnnkbk`jjjjjjjjjjajjjjjjjjjjjjjjjjjjjjjjjc`iabnkkkbbbbkkk`knnnnbbkknnnnnmnbkbkkkbkknkkkknkkkbbbbkkkkbbkbkbbkbbbbbbbbbbbbbbbbbbbbbbbabbkkbkbkababbbbbkkbbbbbbb`knnnnkbbkkkkijjjjjjjjjjjjjjjjj",
"cccciciclccicliaccccciliiicciiiiiii`iiiiiiiiiiiiifkiikaiiiiii`c`iiiii`aai`c`iiiiiiiiiciiiac`bb`aacc`bbkkalkmnmfmnnnnmmmnfffnnnnmnmmmmmmmmmnmmmnmmffffmmffmmmmmmmnnnffmnmnnmmfmmmnnmmmnmmnnmnnnnnnnmnffmmnmnnmmnfmnmmnmnnkbljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`bbbbkkkkkbkkk`knkkkkkbbkbkbknnkbbkbbbkkkbkkkkkbkkkkkkkkkkkkkkbbkbkkbbbknbbbbbbbbkbbbbkkbbbbbbbbabbbbbbbbbkbbbbabaannnknnbbknkk`jjjjjjjjjjjjjjjjj",
"cciccicccccccciicciciiiiiciiiiiiiiiii`iiiiiiiiiiiic`iicii``ii`iiiiiiiii`iaikiiiiiiiciciiikilab`a`ciakkbk`jnmnmmmmmnmmffmmfmnnmmnnmfmnmmfmmmnmmffmmmfmfmmfmmmmmmfnnmffmnmnnknnnknmmfffmnnnnnnnmmmnmfmnmnmnnnnnnmmnmmnnnnnmkljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjic`bkbbbbkkbbnkk`kkknnnnkbnnnknnkbkbbbkknkbkknkkbkbkkkkkkkkkkkkkbkkbkbbbbkkbbbbabbbbbbbbkkkkbbbaabbbbbbbbbbbbbabbaba`knnnnmkbmmnndjjjjjjjjjjjjjjjjj",
"ccccccciccccciclcicicia`aiiiicciii`iiai`iiiiiiiic`iikb```ii`eic`iiiiiciccnicbiciiccciciciiickai``c`bnkkkajnmmmmmmnmmmfmmmmmnmmmnnmfmmmffmmnnmmfmnmmfmfmfmnmmnmmnnmfmmmfffnnmnnnmmmfffnnnnnnfffmmmmfmnnmnmfmnnnnmmnkknnnnnn`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlicibnnnkbbkkbnkk`nknnkkkkknnnkkkkbkbbkbnnkkbkkkkkbkkkkbbbkkkkkbbkkbbbbbbkkbkkkbbbabbabkkkkkbbbbbkkkkkbbbkbbbabbbbbbb`aaknnknkmmnnbjjjjjjjjjjjjjjjjj",
"cclicciiccccccciccciccbib`ciiiiiiiiii`iiiiiiiiii`iiia`ica`iciin`iiii`iii``cinciccicccccciccinic``aaknnkkajnmfmmnnnnnnnnnnmnnmfmmffmfmmmmnmfmmmmnmmmffffmmmmfmnmnnmffmmmnmnnnnnnmmmmmnmnnmffffmmmmfmmmmmmnmmmnmnnmnnkknnnkn`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiciibkmnkkkkkkkkk`nmkkbbkbbkbbbbkbbkkkkkkkknkkkkbbkbkkbbbkkkknkbkkkbkkbbbkkkkbkbbbbbbbbkbbkbababkbkbkbbbkkbbbbbbbbbbb`baabnnnkmnnkkjjjjjjjjjjjjjjjjj",
"cclcccciaicccccciic`icacaiciiii`ii`iiiiiiiiiiiiiiiii`ii`i`i`ciaiiiiiiiiciliaf`ilcciccccccicckic`abkknnnnajmmmnnmmmmnmnmnnnnnmfmmnnnmffffmffffmmnnnmmmmmmmnffmmfmnmfffmmnmmfmmmffmmnmnmmffmmmnnmnfmmmfmmmnmmnmnnnnnmkbbknmkijjjjjjjbjjjjjjjjjjjjjjjjjjjjjjjjjlciibbkknnkknbkkbikkkknknkkkkkkkkbbkkknkbkkknnnnkknkkkbbbkkkbkkkkkkbbbkbbbkkbbbbkbbbkbkkbbbbbbkkkbbbbbbbbkbbbkbbbbbbbakkbbknmnmnnnkjjjjjjjjjjjjjjjjj",
"ccccciciiiicciccccciiciiii`iiiiiiiiiii`iiiiiiiiiiii```ii`iiiiiiiiiiiiii`cicia`aiicicccccciciaca`aknkknnn`jfmmnnmmnmmmnmmnnnnmnnmmmnnmnmffffffnnnnmmmfmfmnmmfmmmmfmmmmmnmnmffmmmnnnmmmmmfnnnnmfmnmmmfmmnmmnnnnnkknmnkabkknnijjjijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjci`akkkkknnbknkkannbnkkkkkkkkkbkbknbkbkbkbbkbkkkknkbbbbbbbbkkkkbbbnkkbkknkkkbkbkkkkbbbbbbbkkbbbabbbbbbbbkkkbbbbbabbb`bnnbbknmmnnkbjjjjjjjjjjjjjjjjj",
"cccccciiicccccicicicciiiii``biiii`ii`a`iiiiiiiiiiii`iiiia`ii``iciccici`ciicci`icbicccccccici`i`aknknnnnn`jffnnfmmnmnmmmnnnmmmmmnfmmmnmmmnmmffnmnnnmnnnnfnmmfmmmfmnmmmnnnmnnnmmmmmnmmfmmfnnnnmfmmmmmnnmmfnmnnmnmkknnkbbbbkkcjjjjjjjjjjjjjjjjjjjjjjjljcljjjjjjjci`abkkkknkmbnkn`nkkkkkkkkkkknkbkkkbkkknkkbkkkkbbkmkkbbbbbbbbkbbbknkbkkbbbkbkbbbbbbkkkbakkbkkkbbaabbkbkbabbbbkbbbbbbaannnkbbnnmnnnjjjjjjjjjjjjjjjjj",
"ccccccciicicicciciaaiccc`iii`iiiiiiiii`iiiiiiiii``iiiii`aiiiaa``ciiiiiiccciciiicilcclcccccciaabkkknnnnnn`jfmnnmnmmnnmmnnnnmmmmfmnnmmfnmfnmmffmmmmnmnnnmmnnnmmnnmmmmmmfffmnmmmmmmmnmmfmmmmnnnnmmnmnnnnmnnnnnmnmmnbnnbbkkbakijjjjcljjjjjjjjjjjjjjbljcjjljjjjjjcjiaakbkkbnknnnmm`nkkkkkkkkkkkbbbkkkkkkkkbknbkkkkbbkkkkkbkbbbbbkbbbkbbbbkbkkbkbkbbbbbbbkbbbkbbkkbkabkbkbbbbabbbbabbbaabnnnnbbbknmnnljjjjjjjjjjjjjjjj",
"lciccciiciciccicciiiiiciii```i``i`iiiiiiiiiiii`iii`ii``b`iiiiiicicicciiiciccccccccicccccccciabkkknnnnnnnilnnnmnmnnnnnnnmnffmmmmmnmmfmnmffmmmfmfmnmmmnnnmmmmmnmmnnnnmnmmmnnmmmnmmmmmmmmnnmmmmfffmmmmnnmmnmmnnnnnnbkbbbkbbabcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj``iabkbkbkkknknn`kkkkkkkkbkbkbkkknkknkkbkknbkknkkknkknbbkkbbbbbkbbbbbbbbbbkbbkkbbbkbkkbkkkbkbbabkbkbbbbbbaabkbbbbbbaaannnmnbbbkknmcjjjjjjjjjjjjjjjj",
"iiiccciiiiciciccicicccci``iiii`ii`iiiiiiiiii`iii`i`iiii`iiiiiciiiciciiiiciicccccci`ilccccccaabkknnnnnnnnclmnnmnnnnnnnnmnmfmmmnnmmmmmmnmmmmmmfmmmnnmnmnnnmmmnnmmmnnnnnnnnmnnnffmnmnmmmnnnfmmnmmmmmmmnmmffmmnmnkkknkbkkbabbbcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`abkbkbkkknkkkckkbkkbkbkbkbkkknkkkkbbknkkkbkkkkknkkkbbbkbbbbbkbkkbkkbbbbbbbbbbbbbbkkbbbkbkabbkkbbbknkbkkkbbkkbbbabaamnnnnkbbabbncjjjjj`ljjjjjjjjj",
"ciicciiiiiiiciicccciiiamb`i`i````iiiiiiiii`iii`iiii`iiciiiiiiiiiiciiiiiciiiccccccciccclccli`kkmmknknknnnccmnnfnnnnnnnnmfnmfnmnnnmmmmmmnnmnmmmmmmnnnmnnnnnnnnmmmmfmnnnnnmnnnmffmmmmmmnnnnnnnnnnmmnfmmnmmfmnnnnnkkkbbkkbabbbcjjjjjbjjjjjjjjjjjjjjjjjcjjjjjjjjjjcci`bbkbbkbkkkbkckkkkkkbbbbbkkkknkkbbbbnnkkkkbkkbbkkkkkbbbbbbbbbbbbbbkkbbbbbbbbbabkkbbbbbbkbabbbbababbbbbbbabkkbbaababnnmnmnbbbbab`jjjjjijjjjjjjjjj",
"ccccciiciiiiiiiiiiciiccaiii`iiii`iiiiiiiiiii`i`i`iii`i`iiiiiiicciiciii`iiiiiciccclcclccccccaknmmmmnnnkknlcmnnmnnnnnnnnmfmfmmmnnnfmmmffmmmmnnnmnfnmnnmnmnnnnnnmmfnnnmmmnnnmmmnmmmmfmmnknnnnnnmmmfmmmnnmmmmknnnnkbabbbabaakaljjjjjjjjjjjjjjjjjjcjjjjjjjjjjjj`jjli``bkbbbkbkknkkckkkkkbkbkbbkknnknnkbbkkkkknkkkkkbbbbbkkbbbkbbbbabbbkbkbbbbbbbbbbbbkkkkkkkkbdbaabbbkbbbkkbbbbbbbabbabakmnnnkkbkkbbijjjjjjjljjjjjjjj",
"cccciciiiiiiiiiiciiab`icci`a`ic`i`iii`ii`iiiii`i`iiiicciciiicciiiccicibiiiccccccicccccclcccanmnmmmmnkkkklimnnmnnnnnnnmfffffmnnnnfnnnmffffnmnnmnmmmnmnnnmnnnmmnmmnnmffmmnmmmnnnmmfmnmmnmmmmmnnnnnmmnmmmnmnnnnknkbabkbbbabbaljjjjjjjjjjjbjjjjjjjjjjjjjjjjjjjjijliiabbkbbkkbkkkb`kkkkkkbbkbbknnnnkkkbkbkbbkknkkkkkbbbbkkbkbbbbbbbbbbbbkbbbbkbbbbbbbbbbkbkbbbbbkkbbbbbbbbbbbbbbbbabbba`bnnnnknnbkbb`jjjjjjjjjjjjjjjj",
"ccccccciiiiiiiiii`iiiiii``iiiiciiiiiii`iiiiii`i`iiiiiiiiiiiciiicciiaicaicciiccccclcclcclllcafmnfnmnnnnnnlcmfnmnmnnnnnmmfmmnnnnnnnnnnmmmmmnmnmfnnfmnnnnnnnnnmnknnnnnnnnnmmnnnnmfmmnnnnmmmmnmnnnmfnnmmmnnmnknkknbbbbbkbaaaaaljjjjjjjjjjjljjji`jjjjjjjjjjjcljjjjj`iabkkkbkkkkkmaaknkkkkbkbbkknnkkkkbbbbnbbbkkkkkbkbnkkbkkkbbbbbbbbkbbbbbabbbbbbbbbbbbbkkbbbbbkbbbbbabbkbabkbbbbbbaaaa`aknnnmnkknbbajjjjjjjjjjjjjjjj",
"icccci`cciciiiiiii`iiiiiii``iiiiii`iiiii`i```iii``ci`ciiiiiccicicccciciiicicccccccclccccclikmmnmnmnnnnnklammnnknnnnnnnnnmmmnnknmnnnnnnmmmmmmfnnmnmmmmnmnmnnnmmnnnnnnnnnnnnmmmmmfnnnnnfnmmnnnnnkmmnnnmmnnmnmnnkbbabbba`aaailjjcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjliiakbknkkkbknnk`nkkbbkkbkbbbkknkkbbkbkbkbbbkkkkbknbnbbbkbnkbbbkbkbbbbbbbbbabbbbbbbkbbbbbbbabkkkbbbbbbbbbabbbabbbbbaaibbbbknmmknkabjjjjjjjjjjjjjjjj",
"icciccccciicci`bi``i`iii`i``ciiiciiiiiiiiiiiii`aci`iiiciiiiiiiccciicccccccciciccccccccclclcbnnmmnnnnnnnklaffmnnmnnnnnnmmmmmnnnmmnnknmmmmnnmmfnnnnnmmnmnnnmnnmnmnknmnnmmnmmfmmnnnnnnmmfmmnnnnnnnmmmmmnnnkmnnnnkbababaa`aaicjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjliiakkabkkkkknnnannkkbbkbbkbkkkknkkkbbnbbbbbbkkkkkkbkkbbbkkkkbbbbbbbbbbbabbbbbbbkkkbbbbbabbbkbbbbabbbabkkbbabbabbbabb`abbbkknmmmkbb`ljjjjjjjjjjjjjj",
"macciiiicicciii`iii`i`i`i`knai`c`iii`iii`ii`ii`aaciiafiiiciiiciacciccccciciiccclccclccllclcaknnmmnnmnnnnjbmffmnnmnnnnnmmmfnmnnmfmnknmmmnmnmnnnmnmmnmmmnnnnnnnnnnnmmmnmmnnmmnnnnnnnnnnnnnnnmnnnmnnnmnnnknnnnnnkabaaaai```iiljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiiakbaakkknnnmnankmnkkkkkkbbkkkkkkkbbnkkbbnkkkkbbbbbkbkbnkkkbbbbabbbbbbbkkkkbbbbbbbbbbbbbbabbbbabbabbbbabkabababbbbb`abbbbbknmmnbbljjjjjjjjjjjjjjj",
"biccclcciicciccii`iiii`iii``ci`ia`iiiii`iii`iii`c`iiii`ciiicccibccciciciiiiiiicccccclccclclabkkkmnnmmnmklanmmnnnmnnnnnnmmfmnnnnmmnknmmnnmnmnnmfmmnmmmmmnnknknnnnmmmmmmnnmnnmmmmmmnmknmmmnmmmmmnnnnnmnnnnknnnmkabbaa```a`iiljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlii`kkbabkbkknmnakknkkbkkkkbbkknkkkkbbnkkbbkkbbbkkkbbknkbkbbkkbabbbbbbbbbkkbbbbbkbbbbbbbbbbbbbbkbbbbkbbbabbabbababbbb`abbbbbabknkkajjjjjjjjjjjjjjjj",
"cciiiiiicciiccib`iii`ii`i`````ic`ii`iii`i`i`iiiiiiiciiciicciiciiiccciiiciiciccilcclclcllcll``aaknmmnmnmblbnnmnnmmnmnnnnmmmmmnknnmnnnnnnnnnmnmnfnknnnnknnnnnnnnnnnnmmnmnmnmnnmmmmmnfnfmmnnnnmmmmnnnnknnnknnkknkabbaaaabba``cjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjii`baaaabakkbknakkkkbkkkkkkbbkknkkkbbbkkkbbbbbbbkkbbkkbbbbbbbbbbbbbbbkbkbbbkbkbbbkbbkkbbbbbkbbbbbbkkbbabaabaaaabaaaa`i```aabaknnbacjjjjjjjjjjjjjjl",
"icccciccicciic`b```iiiiii``iiiiiiiii`iii`iiii`iiicii`cicciiciicccccccicciicicciclcclclcllcli``akkmmmnmnbjbnmmnmnmmmmnnnnmmmmnnnkmnnnnnnnkknnnnnnnnnnnknnmnnnnmmmnmmnnnnnnknknnnmmnmnnnnnnnknmmnnkkkknnkknnnknkabbaaabbkabaijjjjjjjjjjjjjjjjjjjjjjjjjjjljjjjjjjcci`ii`abbkkbkkabnkknknknknkbbkknnkkbbbkkbbkkbbbbbkkbkbbbbbbbabbbbbbkbkkkkbbkbbababbbbkbbbbbbabbabbkbabaababbbbbbabaiciii`aabbnnkacjjjjjjjjjjjjjjj",
"liiicciiiicciiii`i`iiiii``ii``iii`iiii`i`iiiiiiiki`cciciciiccccicccccccccicciiaicccllcllclcaaabknmmnmnnbjkmmfnnnmmfmmnnknmmfmnmnnnnnnnnnnnnnnnnmnnnnnnnnnnnnnnnmmmmnnmmknnnknnmmnnknnmmfmnnmmmnmnnnnnmmnnnnkkbabaaaabkkbnaijjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjjilcic``bkbkkkkbaankkkbkkkkkkkbbkknnkkbkbkbbbkkbbbkkbbbbkbbbbabbbbbabbbbbkbbbbbbbbababbkbbabbkkkbbbbkkkbbbbbabbbbabaaalccciabbbkkkbijjjjjjjjjjjjjjj",
"icciciccciiciiiiii`iiiiiii`iii`iiiii`i`iii`iiiiiiic`ciiiiicciicccciccccccilcclilclclclccllcbbbbmmmmmmnnbjkmmmnknnmmnmmmnmfmfmmmfnnmmmmnnknmnmnnmnnnnnnnnnnnnnnnnmmmmmmmmnnnnnnnmnnnmnmnnnnknnmmnmnnnnnnnnnnnnkbb`i`aabnnkaijjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjjcllcc`abbbabbkbaannkbbbkkkkkkkkkkknknnkbkbkkkbbbbkbbkbnbbbbbbbbbbbbbbbbkkkkkkkbbbbbabbbababbbabbabbbbbbbbabbbbabbbab`lllciibbabbbbijjjjjjjjjjjjjjj",
"ccciciicciiciii``c`i`cii``iiiii`ikbn`iiii`iiiiiiiciiiiiccakaiccccccccccciccccclccllcllclllcbbbnmmmmmmnnajmmmnnnnnnmmnnnmnmmmmmmmmnnnnmmnnnmnmmmknmmnknmnnknknnmnmnmmmnnnmnknnnnnnkkmmmnnmnmnnnnknkknmmmnmnmkkkaaii``bkkkbaijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjicllccaakbbbann`bnnkbbkkknkkkkbkknnkknkkbbbbkkbbbbbkkbbbkbbbbbbbbabbbbkkbbbkbbbbbabbabbbabbkkbbbbbbabbbaaabbbbbbbbaaalccc`abkbbbabajjjjjjjjjjjjjjj",
"ciiil`ciciciciiii`iiiii`ii```iiii`ia`i`iic`ci`iiiiiicciiiciccccciccccccccccllcclcccllclclccbbbnnnnnmmnn`lnmnknnnnnnmmnmnnmfmmmmmmknkknnknnmnmmmnmnnmmnnnnnnnmnnnnknnnnmmnnknnnnnnnnmmnnnmnnnnnnknnnknmnnknnnmka`i``abbknaaijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjicjcii`bkbkkknmaankbkbkbbknkkkkbknnnknkbbbbbbbbbkkbkkkbbbkkbbbbbbbbbkkbabbbbbbkbbabbbbbbbbbbbbbbbbabbbabbaabbbbaabbbblli``bkbbbbaaajjjjjjjjjjjjjjj",
"ccciina`iicicii`iaiiiiiii``i`iiii`i``ii`i`a`iic`iciciiccciicciccccccclcccccccclclclccllclciabkmnnnnmmnm`jnnnnknnkknmmmmknmfmmnmfmnnnnnmnnmmnnmmmmmmmmnknnnnnmmmnnnnnmmmfkknnkknnmmmmnnnnmnmnnnnknkkknnnmnnnnmna````bbknbaaijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjcila`i`bkbknnnnaabbkkkbbbbnkkkbbkkkkkkknkbbbkkbbbkbkbnkkkkbbbbbbbbbbkkbbabbkbkkbaabababbbbbbbabbkbbbaaabababbbbbbabbbllababkbbbbbbbjjjjjjjjjjjjjjj",
"iiccik`iiciacii`ibiiii`iii```i`ii`i`iciiiiiiiciciiiiiiiiiccciccccccccccccclccllcieillclllciabknnnnnnnnnilknnnnnnnnmmnmmnnmmmmmmmnnkknmmmmnnnnnmmnfmmnmmknnnnnmmnnnmmmmmmnnknnknnmnnmnnnnnmmnnknnknknkmmmmnkknkaaa`abakkaab`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjicca`iibbbknnnnb`bkbkbbkkkkkknkkknknnkkkbbbbbkkkbbbbbbkkkkbkkkbbbbbkbbbbkbkkkbkbabbbabbbbkbbbabbbbbbabbaabbabbbbbbaablcabbbkkbbbbbbjjjjjjjjjjjjjjj",
"ciccccicciibiiiiiaiiiiiiiii`i`i``iii```iiiiiiiiiciiiccciciccccicilclcicccilclclclccclclcll`kknnnnmnnnnn`jnknnnnkmmmmnmmmnmmmmmmmmnnnknnnnnknnnnmnnmnnfmmmmnnmnnnmmnnnmmnnnnnknknnmnmmnnknmnnknknnnmnnmmnnnnkkkabaaabbaaibk`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjliccb`iibbbbknknk`kkkkbknknkbnnkbkkknkkkkkbbbkkkkbkbakkkbbkbbkkkbbbkbbbbbkbbbbbkbbbababbbbbbbkbabbbbaabbabbbbbbbbaaabbcibbabbkbbaabbljjjjjjjjjjjjjj",
"ciciiciicii`iii`i`ii`iiiii`iii``i``iaaai`iici`ciiicc`iccciiiccclccicccciiaillcclcjlallllll`knnnmnmmnnnn`lnnnnnnnmnnnnmmnnnnnnmnnmfmnmmnnnnknnmmmnnmmmmnmmmnmknkkmmnnnmmmnnkknnnnmmmnmmnknnnknnknnnmmnmmnnnmnnkbbb`abba`abkijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiicnk`cakbbknknkabkbkbkkkbkbkkkbbbbkbkkkkkkkbkkbbbbkbkkkbbkkkkkkkkbbbabbkkdkkbkkbabbbbbbbbbkbbabbbabbabbbbbbbbbbabbbaiiabbabkbabbbbjjjjjjjjjjjjjjj",
"icciiciciicccii`iiiiiiiiiii`i````iiii`iikiiiabiiiiccaa`ibicbbicicc`iccc`ibcclclllacjclllll`bkknmmmnnnnnilnnnnknnnnnnnmmknnknnnnnnmnmmmnnnnnmnmnnmmmmnknnnnknnkknmmmmmmmmknknnmmmmnmnmnnnnnnknnknnnnnnmnnnnmnknkaiiiab`abbk`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjji`cnnic`bbkbknkk`bkkbbkkbkkkknkkbkkkkbkbkkkkkkkbbbkbbnbnbbkbbbbbbbbbbbabkkkkkkkbbababbbkbkbbbbbabbabbbabbbbabbbbabbab`ibbabbbbbbbkbljjjjjjjjjjjjjj",
"cciiciciciiii`iiii`iii`i`i`iiii`````iiiiiiciiiicciii`iccciccccicccilccccc`lclllcclcllcllll`bbkbknmnnnnnicnnnnknmnnnnnnnnnnnnnnnnkmmmmmnnknnmnmnnnmmnknnnnnnmnnknknmmmnmnnnknnnmnnnmnnnnnnmnknmnnnnnknnnkkbnmnmbilcci``abkkijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjic`kb``akmbakkknakkbbbbkbknbbkbbbbbbbkbbbkkkkbbbbkkkkbbbkkbbbabbbbkbbbbbbbkkbkkbabbbbkkbkbkbbbbbbkbabbbaababbbaaabbbb`ibkabbbbkbbabljjjjjjjjjjjjjj",
"iciciiiiiccci`i`iiiiiiiiii``i``i``iiiiiiiiiiciciiacciilccccciicciccccccclclclcllllllllllcl`abbbknmmnmnnlcnnkknnnnmnknnnnknnnnnnmmmnmmknnnffmmmnnnmnkknnnknnknnnnnkknnnnnkknnnmmnnmmnnnmnnnnmmmnknknnmnnnnkmnnnii`ciccikkbbijjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjjjic`bb``bkknbbbnnakkbbkkkkkbbbkkbbkbkbbbknkbkkbbbbnkkkbbbkkbabbbbbbbbbbbbababbbbababbbbbbbbbbbkbbakbbbbbbbabkbbbaabbbb``bbkaknbbkkakijjjajjjjjjjjjj",
"cicciccia``ii``i`i`iiiii`i```i```i`iiiiiciiiiiiic`ciccaiciicciicicccccccclclcllclllllllcjcabbbknnmnmnnnlinnnnknmnnnknnnnnmnmmnmnmmnmnkknknmnmnnmknnnknnnknnnkknknnnknnknnnnmmmmmnmnnnnnmnnmnmnnnnnnmmmnnnnnknk`c`iiciiabbbijjjjjjjjjjjjjjjjcjjjjjjjjjjjjjjjjjjci`bb``bkkkkbbkkakbkbbkkkkbbbkkkbkkkkkkkkkkkkbbbbkkkkkkbbbbbbbabbbbababbbbabbbabbbbkbkkbkbbbabbbbbbbbbbbabbbbbbbabbab``babbbkkbbkkbijjjljjjjjjjjjj",
"cciciiiciiciii``i`i`i`i`ii`````i`iiiiiii`iicicccciciicb`ciiicicicicccccclcllclllllllllllclakknmnmnnmnmmlinknkknmmnnmnkkmnnnmnmnnmnkmmnnmnmmnmmnmmnnmmkknnnnkknknnnnnnnnknnknnnnnnnnnnknmnmmmnnknknmmnnnnkknkkkiciiclcc`ank`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjic`kb`bbbkkkkbbk`bkbbkkknkkkkkbknbbknkkbkkkkbbbbbkbkkkkkbkbbbbbbbbbbbabbbbbkabbbbbbbbbbkbbbbaabbbkkbbbababbbbbbabaaabaibabbbbkkbbnkajjjjjjjjjjjjjj",
"ciciciciiciiiiiiii`i`i``a`i```i`iiiiiiiiicic`iiiiccccci`iicccciccicciclccllclllcllcllcll`c`bbbmfmnnmmmnl`nknnkkmnnnmmnnmmnknnnnknnnkkkkknmmmnmnnmmnmnnkknnnnkknknnnnnmnnnmnnnmnnnnnnnknnnnmmnnknknnnnnnkkknknk`iicclcciakkajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlli`bbbknkkkkkkbbibbkbbbkkkbnkkkkkbbbbbbbkbbbbbbbbkkkkbbbbkbkbbbabkkbbbbbbbbbbbbbbbbbbbbbabbbbbabbkbkbbbabbbbbbabaabakaikaabkbkkbbkkajjjjjjjjjjjjjj",
"cciciciciiiiiiiiiii````ibaiiiii`iiiiiiiiiciabiiliccciiiiccccccccccciclcllclllcllllllllllcjbnkbbknkmmmnmj`nnnnnknnnnnmmnmnnkknnnnknnkknnnnmmnnnkknnnnnnnnnnnnnknkknnkknnnnmmnmmnmknmnknnnmmnnnnknnnnknnkkknnnmkaiiccici`abbbjjjjjjjjjljjjcajjjjjjjjjjjjjjjjjjjjcciabbknkkkkkkkb`kkkkbbkkbkkkkkkkbbbbbbbbbbbbbbbkkkbbbbbbbkbbbbbbkbbababbbbbabbbkkbbbbbbbbbbbabbbbbbbbaabbbbabaaabbaba`nbabbkkkkbbkkjjjjjnljjjjjjj",
"iiciciciiciiiii`iiiiiii`a`iiiiiiiiiiiiiib`iciciiiciiiibiccccccccccccclcllllclllllccllllllcbbbkkbkkkmnmnlannmnknnknknnmmnmnkknnnmnknnmmnfmnnnknnnknknnmmnknnnnnknknkkknnnmmmnnnnknnmkknnnmnnnnnnknnkkknkkknknnb`icc`ai`a`aa`jjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjlci`abbknkkkknnk`kkkkkbkbbbbkkkkkkbbbbkkkbbbbkbkkkbbbbbbbbabkkkbbaabbbbabaababbbbkbbkbbabbbbabbbbbbbbbabbbaaaabaabaabbikkbakkbbnkbbbljjjjajjjjjjjj",
"iiciciiiiiiiiiiiiiiii`iiiii`i`iiiiiiiiii`ccciiciiiiiccalcccccccccclclc`lcllllllllcclllllllbbbnbabbbknmkjannmnnnknnknnmmmmnnnnknmfnmnnnkkmnnnnnnnkkkkknnkknknnnnkknknknknnnmnnnnknnnnknmmmnnnknnnnkkkkkkknnnnnk`cc`ab`a`cii`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlciaabbkknkkknnkakkkkkkbbkbbkkkkkkbbbbkkkkkkkkbbkbbkbbbbbabbbbbbbbbbbbbbababbabbbbbbbbbbbbbabakbkbbbabbbabaaabaabbabbaiakbabbbbbkankijjjjjjjjjjjjj",
"iiicciciciiiiiiiiii`iii`ii`iii`iiiiiiiiciiiiciiiicciccliccciicclcllclcaclcllclllllclllllllbabbdkdddbnnklannnknnkknknnnnmmnnnkknmmmmnnfnnnknnnnnknnknnnnnkknnnnnkkkknkknnnnnnnnmknnnnmnnnmnnkkknnkkkkkkkknnnknb`c`bkbba`i``ijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcibbbkkbknknkkn`kkbkkbbbbbkkbkkkbkkbbbknkkbkkbbbbbbbbbbbbbbbbbbbbbkbbbbbbabababbakbbbkabbbbkbbbkkbababbbaabaaaabbkaaa`bnabbkkbabbbkcjjjjjjjjjjjjj",
"ciiiiciiiiciiiiiiiiii``i`iiiiiii`iiiiiiiciiciiicicccicccililccccclccllllllclllllllllbllllikkabbbbbkbkmblanmnknnknnnkknnnnnnnmmnmmnnnnnnnnnnnknnnnknnnnnnnnnknnnknnnkknnnkkkknnknknmnkknnnnknknnbkkkkkkkknmkkkb`ibknnkbaa``cjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`akkbbkbknnnnnibkbbbbkbkbbbkkbkkkkkkknkkbkbbbbbbbbbbbbbbbbbbbbbabbbbbabbbbbbbbbababbbabbbkabbbbababbbaaabbaaaakbbaaa`bnbbbbnkkbbbbljjjjjjjjjjjjj",
"icciccicicii`c`ii`i``cc`ii`iii`ai`iic`iiciiciiiiccccccccclcccclcllciilclllllllllllllcjcllannkbbbkkbaknajknnkkkkkknnknmnnnnnnknnmnnnnnnnknnkkkkkkkknkknkkkknnnnkkmnnkkkkknkkknnnnnknnnknknkknknnnkkkkkkkknnmnnk`aknknknkb`d`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl``aknkbbkknnnkkikkbbbbbbbbkbbbkbbbbbbbkkkbbbbkbbbbbbbbbbbbbabbabbbbbbbabkbbaaaabaaababbbabbaabababbaabbbaaaaababbkbbb`ankabbknkbbkbijjjljjjjjjjjj",
"iccici`c`ciii`kiiiiiiiai`iiiiii`ii`iiiccicciiicccciccccc`mlclclclccccllcllllclllllllllail`bkkbaknkbabkijnnkknknnkkkkknnmnnkkknnmkkkknnnnnknknnkknnnnnkknknnnknkkmmmnnnnkkkknnnnnkkknknkknkkkknnkknnnnnnnnmmnkbaknnnknfnbbnbjjjjjljjjjlcjjjjjjjjjjjjjjjjjjjjjjjl``bnnknkkbkknkk`kbkbkbbbkbkbbkkkbbbbbbkbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbbbkkbbbbbbbbbbbkbbbbabbaabbbabbbaaabbdbbbbbbbaa`amkbbbknknkbbijjjjjjjjjjjjj",
"ciiiiia`ci`bna`iii`iibfiii``i`iiii`iiiiiiiciiicccccicccclccl`cilcllllllcclllccllllllll``liabbabkkkkbbbilknkknnknnnkkknnnknnnkknnkkknknknknknknknnnnnnknknnnkknnmmnnkkkkknknknnnmknmnkknnnnnmmmnkkknknkknknnkkbbnnnknmmkdakbjjjjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjli`bnknnnkkbbkkmabbbkbkbbkbbbbbkkbkbbbbbbbbbbkbbbbbbbbbbbbbbbbbbbbbababbbkbbbabaabababbbbabbabbbbabbbbabbababbbaabaabaaamnabbkkkkkkkijjjjjjjjjjjjj",
"c`icciiciiciiiii`ii`ian`i```iiiaiciiciibiciiiicccccccccccccinlclclcccccllllclclllljcljlilibbbbbbaabkkb`jbkkknkknknkkknnnkknkkkkknkknnkkkkkknknnknnnnkkknknnkknnmmmnnkkknnnnnnnkknnnmnknnkkknnnkbkknnkkkkkkknnkbkkknmnkbbknkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl`i`bknknmkkbbbk`bbbbbbkbbkbbbkbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbababbbabbbkkknbababkkbkbbbbkabbabbbabbbbbbaaabbaaabaababa`nkbabbkkkknbaljjjjjjjjjjjj",
"ibaiiiiiik`ciai`iiiiii`iii`iiii`iciiiciaiiciiccicccccccccllililcclllcclllllllllllclllllllibkbkndaabnkb`jknnkkkknkknnnnkkknknkkkknnnnnknkknkknnnnkkknknknknnnnnnnknnnnkkknmnnnnnnnnkkknnnnnnknmnmknnnkkkkkkkknnbnnknmnbbnnnncjjjjjjjjjjjjjjjjjjl`jjjjjjjjjjjjjjl``abkkkknmkbbbbibbbbbkbbbkbbkbbbkbbbbbbbbbbbbbbbabbbbbbbbbbbabbbabbbbbbbbbkbbbabbbbbbbabbbabbabbabbabbbbabbbaabbaaabaaikbbbabbkkbbbbjjjjjjjjjjjjj",
"c`iciiiii`i`iiii`a`ii`iiii`iiiiciiiiicciiiiicccccccccccclicjillccllcllcllllllllljlljllljlanmnnnbabnnnbclknnnnnnnkkknnkkkknknknnnnkknkkknnknnknnnknknnnnnknnnnnnnnnnnnnmmnnmnnnnnnkbkknnknnkkknnnnnnnkkkkkkbkkkbnknnkbbkmmnkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl`iakkkmnkknkkbbibkkkkkkbbbbbbbbbbbbkbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbkbbbbbkbbbbbkbkbbbbbaababbbbbaabbbbbbabaaaababaaaikbababbbkkkkbjjjjjjjjji`lj",
"iiiiiciii`iiiiiiiii`iii``i`ii`i`iiicciiciiicicccccccccicc`ciiilallccllcllllllllllllllllllannmnkbbmkkfkljknnmfnnknkkkkkknkkknnnnnknkkkkkknnkknkknkkkknnnnkknnnmmmnnknkknmmmmmmnnnbknnkkmnnnkknnnnnnkkkkkkkknnkkbnknnbbakmnmbjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl`iiaknnnnknnmnkcakknkbkbkbbbbbbbbbbbbkbbbbbbbabbbbbbbbbbababbbkbabbbbkkkbbbbbabkkbkbkbbaabaaabbbbbbaabbbbbbbaabaaabbabikbbbbaabbknbkjjjjjjjjjjjjj",
"iiiiiiiiiiiiiiiii`i````ii```ii`iiicicici`iicccccccccccclcclclcclclclllllcllllbllljcbcljllannnnbaknnmnncjnmnnnkkkkkknnkkknnnnnkkkkkkkknnnnknnknkknknnnkkkknmnnnnnmmnnnnnnnnnkkkkkkkkkkkkknnnkknnnnknnnkkknkknnb`knkkbdbnmnmbjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlii`abbkkknnkkmk`kknkkbbbbbbkbbbbbbbkkbbbbbabbbbbbbbbabbbbbbbbbbbbakkbbbbkkbbbkbkbkbbabaababbaaababbabakbbabbbaabbbababcanbaabbabkknkjjjjjjjjjjjjj",
"ciciiiiiiiiiii`i`i```i`i`icc``i`iiiiiiiiicciciccccclccccccclcccllllllclllllllijllllijllllaknkkabkkknmnclmnknknkbnknnnnkkkkkknnknkkkknknknnkknkkkkknnkkkkkknnkknfnmnnknnnnnkkkkknkkkkkkkbkknmnnnkkkknkkkkknkkkbabnkkkbknnfnmjijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlii`akdbbbbkmmk`cabbbbbbbbbkkkbbbbbbbbbbbabbbbbbbbbbbbbabbbbbbbaabbbbabbbkbbbbbbbbbbaaabbbaaaabaaabbbkbbaaaaabbbaadababiabbbabaaabbkbljjjjjjjjjjjj",
"iiiiiiiiiiiii`i````iiiiiiii`baiiiiiiiicccccccccccccccccclclclcclclllcccllllllllllllljlljlbknkbankabknncckknknnnmnnnnmnkkknknkkkkkkknnnkknkknkkknknnnnnnnkkkkkknmknnnkkknknnnnnnknkkkkkkknkknnnnnnnnnnnknkkkkkkbknkkkknnnmnajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiciakbkbkkkbbbaiakbkkkkbkkbkkkbbbbbbbbbbbbbbbbbbbbbbbbbababkbbbbbabbaabkbbbbaaabababbbbababbbabababbbkbbbbbbbbabbabaabc`aaaaaaaabkknijjjjjjjjjjjj",
"iiiiiiii``i`ii`i``i`i`iii`cciiia`i`i`iiiiiccccccccclccccccclccccclcllilllllllllllllllllllkmkkkknbdabkklcknmmnnnnnkknnnkkkkkknknkkkknknnkkkkkkkkkkknnkknknkkkkkkmkkkkkkknnnnnnkkkknnkknnnnkkkknmnnnkkkbkkknkkbkbnmnnnkknmnnajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjliiibbbbbbkka`caabkkbkkkkbkbbbkbbbbbbbbbbbbbbbbbbbabababbabbbbbbbbbababbbbaabbabbbbbbkbbaabbabbbbbbbbaabbbbaaaabaababaacc`iaaaa`aabkkijjjjjjjjjjjj",
"lllllllllllllllllllljlllllllllllllllllljlljlljljlljljljljjljjljljjljjljjljjjljjjljjjljjjjknknmnnbbbbkklcnnnnnnkknkknnnkbkkknkkkknknknkknkkkkkkknnnmnnnmnnnnnknnnkkkkkknnmnnkkkkkkknknkmmnknkknnkkbkkkkkkkkbkkbbnnmmkkkkmmnkjljjjjjjljljjjjjjljljjjjjjjjjjjjjjjli``bbbbbbbaiiiaaakbkbbkbkbbbkbbabbbbbbbbbbbbkbbbbbbbbbbbbbbbbbbkbkbbbbbkbbababbbkbbbaaabbbbabbbbbbbabbbbaaaaaaababaaaaiccii`ii``aaab`jjjjjjjjjjjj",
"ljljljljljljjljlljljlljljjljjjljjjjjjjljljlljljljjjjljljlljljljjljlllllljllljllljlljljjljbbknmmnkbbbbblinnnnnnnnknkknnnnkkkkknknknkkknkkkkkkknkknknnkknknnmnnnmnkkkkkknnnnkkkkknkkkknnnnknnknnnkkkknnnkkkbkkbbakmmkbbbbknnkjjjlljlljljllljljjljlllllllljlljljll`cibabaaa`cliaba`kkkkkbbkbbbbbkbbbbbbbbbbbbbbbbbbbababbbbbkkbbbbbkkbbbkbbbaababbbkbaabaabaabbbbbbababbkababbbbbbaaaaaaiciiicci```aad`ljllllllljlj",
"ljlljlljljljljljlllljljljljllljllllhllllljljljjjlllljllllllljljljjljjljljlljjjljllllllljlddknmmnkbkbbbj`mmmnkknnnknkknnnkkkkkkkknkkkkkkkkkknkknknknnnnnnnnnnnnnnknkkbkknnkkknkkkkkbkknnknnkkkknkkknnkkbkkkbkkkaknnbbbbbbknnjljljljllllljllllljlljljljljlllllljl```bbaa`cjlcabbakknkkbkkkbbkbbkkbbbbbbbbbbbbbbbababbbbbbbbbbbbbbbbbkbkbbbbbaaabbabbbbbbaaaaabbbbbbbbaabaababbaaaaaaaab`c``icci`aaaa`iljjjljjljljl",
"jlljlljlllhllhlhlljhlllljlljlljllhjljhjllhlllllhljljllhjllllhllhlhllhjllljhjlhjlhjjljlljlbkmmmmnmbkbkbj`knknnnnnnnknkknnkkkkkknkkkkkkkkkkkkknnknkkbnnnmnnnknkkkkknnnkknmmkkbkkkbkkkbknnnkkknkbkkkkkkkbkkknkknnbkmnkbbbabbadllllllhlllljhjhjljlljlllllllhjlllllc```bba`clliakkbabbbkbbbkkbkkbbbkbbbbbbbbbbbbbbbbbbbbbbbbbbabbbkkbbbbbbbabbbbbabbbbaaaabababaaabbababaaabaaaaaaaaababbaaiaa``i`a`add`cljhljlljljll",
"lljhjhlhjllllllllhlljlljhjlljllllllhlllhjllhllljlllljljlljljlllllllllhlllhllljljlllllljljnknmnmmmnkkbal`kkknnnkkkkknkknmkkkkkkkkmnkkkkkkkknmnkknnkkbkkkkkkknknknknnnknnnnkkkkbkkkkkkkbkkkkkkknkbkkkkkknnnmnkknnknmnbbbkbbbbljljljjljljhjljlhlhllhjhlllllljljllli``kkaiclc`bbkkkbbbbkkkkbbbbkbbkkbbbbabbbkbbababbabbkkbabbbaabbabbabbbbbbbbkbabbbbbbaaabaabaaabbbaababaaababaabbbbbbabacbbaaa`i`abb`iljlllljhjljj",
"llllljljlhllhlllhjllhjhllhlllllljhjljhjlllhjllhlhjhlhlhlhlhlhjhjlljhjljlljlllhlhllhllhllhkknmknmmnkkbbj`nnnnnnnnkkkknnkmnnmnkkkkkkkkkkkkkknnkkkkkkkkkkknkkkkkkkkknmnnnnnkkkkkkkkkkkkbkknkknnnkkknknknnnnknkknmnnnnnbbbbbdbdjlljhlhlhlhlllhlllllljljjhjllllllljhiiiba``ic`bnkbbkbbbkbkkbkbbbkbbbkkkkbbbbbababbbbabbbbbabbbbabbbbbbbbabaabbbkbbbkbbbaabaabaaabaaababbbbbbbabbbbbbbbbababiababba``add`iljhjllljhjhl",
"llhllhjhjllljhjhjlhjllllllllhjhlhllhlllhjljhljljllljlljljljhlllhlhllhlhlhlhlljllljljlllllkbnmkknmmnkkalakknnkkkknknnkkkkmnnnnnnkkkbkkkknkknnkkkkkkkkkknkkkkkkkkknnmnnnnnkkbkbkbkbkbkkbkkkknnkkkkbkknnkkkknknknbkbkbbbabbbkbhllhllljljljhjjljlljhllhlllhlllhjhlli`i````a`abnnkbb`bkkkbbbbbkbbbbbbkkbbkbbbbabababbbbbkbbbaaabaaaabbaababbbbbkbbkbbaaaaaabaabaaabababbabaaaaabbbbaabaabbbibabnnk`iaaa``llljhjhllllj",
"lllllhlllhllhlllhlllhlhlhjhjlllljlljlhjlllllllhlhlhlhlhlhlhlllllljlljljljlljlhjhjhjhllllckbbkkbknfmkbalannnnkkbknkkknkkknkbknnnkkkkkkknnnnnnnnkkkknnkkkkkkkkkkkkkknnnnnkbkkkkkkkkkkkkkknkkkkkbbkkkkkbkkbkkknnnbbbbbbabbbbbbllllllhlhlhljhlllllhjljljhjljhlllllhiiciiiaaabbnnmnk`kkkkbbbakbbbkbbbbbbbbkbbbbababbkbbkbbbbbbbbbbbabababbabaabbbbbbbaababaaaaabbababbabaaaaaaaaaaaaaabbbbbiabannnb``addahlllllljljll",
"jhjhjllhlllhllhlllhllllllllhjhjlllllljhjhjhjhljlllllllhlllllhlhllhlhlhlhlllhljhlllllllllhbbbbbkbknkkb`jamnnnnkkkkkkknnnnnkkkkknkkkkkkkknnnnnnkkkknnnnkkkkkkkkkkkkkkkkkkkkkkkkkkkbkkkknnknnkbkkkkkbkbkkbkbkbnnnkkkkkbbbbkbbdljhjhjljljlllllhlllllhlhllhlhljhlllli`lli`aabbkmmnnmakkkkbbbbbbbbkkkkbbbbbkbbbbbbbbbbbbkbbbkabbkbbbbbababbbaabababaaaababaabaabaabbbbbbaabababaaaababaaabbaibbaknmka`abbbillllllllllj",
"llljhjhjlllllllllhlllhlhlhllllhlhlhlhllhjllljlllljhjhljljllllllhllllhllllhlllhljlhllllllibdbbbbknkabkajbnnnnnnnkkbkknnnmkkkkkkknkkbkbkknnknmnnnnknnnnkkkkkkkkkkkkkkkkkkbkbkkbkbkbbkkkkknnkbkkkkbkkkkkkkkkkknnkbknkkkkbbbbkdlllllllhlhlhlhlljllllllllljljllllllliilc`abaabbknnnn`kkkkkkkkbabbbkkkbbbbbbbbbbababbbkbbkbkkbbbbbbbabababaabbabaaababaababaaaaaabababbbaaababaabbabaaaaaabb`abknkkka`abbbcljlljljllll",
"lllhjllllljhjhllljhllllllllhllllllllllllhlhlhlhlhlllljhlhllllljllllljlhjhjllllhlhllhllllibdkbabknnbbkalknnnnmmnnnkkkkknnkbbkknnknkkkkkkkkknnnnnnknnnkkkkkkkkkkkkkkbkkkkkkkkkkkkkbkkbknnknkkkkkkbkkkkkkkbbkbbkkbkkkkkbkbbkkkllhjhllljljljlllhlllhllhlhlhlhlllllhiic`aabbbbbbnmmn`kkbkkkkbbbbbbbbbbbbbbbbbkbbabbbbbbkbbkbbbbkbkbbbbbbaabbabababababaaabababaaabbbbbabaaaaaaaaabaaabaaaab`annnkbka`abbdilllllhllllh",
"lhlllhlhlhllllhjhlljljllllllllllhjhjhjhllllllllllllhlhllllhllhlhlhlhlhjllhjhlhllllllllll`ddbddaknmkkb`jnmnnknnkkkkkbkknnkknnkknnnkkkkkkknkknkbkknnnnnnnknnnkbkkkkkkkkkkkkkbkbkbkkkkknnnnnnkkbbbkkkkkkkkkkkbkbkbbkkbbbkkbkkbhllllhlllhlhlhllllllljljljlllljhjlll`ciakakbbkbbbknnakkkbkkkbbbkabbbkaabbbbkkbbbbbbbbbbbbbabbbkbbbkbabbbbababbabababbbbababaababbbbbbbbbbaaaababaaaabaaab`aibnmnkbnb`abbb`ljhlllllhll",
"lllhllllhllhlhlllllhlhlhlhllllllllllllllllhlhllhjlljllllllllhllhlhlhlhhhlhhlhlhhhhhhhhhlodddddddknmkdglknknnnnkkkkkkkkkkkkkkknnmkkkknkkbnkkknkknmnnnnnnknkkkkknbkkkkkknnknkkkkkkkkbnnknnnknnnnkbkbkbbbkbkkkbbbbbbkkbbkkkbkkljhlljlhlllllljhjhlllhlhlhlhllhllhlh`i`ababkbbkmbknmakkkbbkbbbbbbbbbabbbbabbbkbbbbbbabbbbbbbbbbbkbbbbbbbbbaabbababbbbbbbabaabbaabbbabbbabbbbaaaaaaaaabaaaa``annnnkbb`bbad`llllhlljlll",
"hlhllhlhllhlllhlhllllllllllllllhjhlllhjhlljhjhjhlhlhlhlhlhhhlhhhhhhhhhlhhllhhhhhhhhhhhhhhhhhhhhhghghhhhggghhghhhhhhgg`g`g`o`dddbddbbkkkkkkknnnkmnnmnnnkbnnnkbbbkbkbknkkbnknkkkknnkkkkkknnnnnmnkkkbkbkkkkbkkbkkbbbbkkkknnknklljhjhlljljhjllllljllljlllllhllhllllii`dbbbbbkbnnbkncbbbknkbabbkbbabbbbbbbbbbkbbbbabbbababbbbbbkkbkbbbbbbbabaababbbabababababbababbbbkbbbbbbaaaaaaabaaaabaa``mnmkkbb`bbdddllhllhlhlhl",
"ljllllllhllhlhllhlhhlhhlhhhhhhhlhlhhhlhhlhhlhhhhhhhhhhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhghghhhhhhhhhhhhhhhhhhhhhhhchhhco`oddkknnmnnkknnnkknkkbbkkkkkkbkkkkkkkknmnnnnnnnnnkkbkbkbkbbkkbkkkkbbbkknkbknkkhlllhllhlhllhlhlhlhllhlhlllllllljhjlii`abbbbakbmnkkkibbbbkbbbbbkbbbabbbbbbakbkbbbkbabaabbabbkbbkbbkbbbbbbbbbbbaaaaabaaababaabbaabbbbbbbbbbbbabaaadaaaaaaabaa`knnkbdaadd`ddhlhlhlhlllh",
"lhlhlhlhlhllhlhlhhlhhlhhhlhhlhhhhhhhhhhhhhhhhhhhhhhhgghhggggogoogggghhhhhhhhggggggghhhhhhhhhhhhhhhhhhlghhhhhhhhhgghghhhhlhhhhhghghhhhhhhhhhhhhhhhhhgho`oknknmnnmnkkkbkkkkkkkkkkkkknnnkknnnnnnnkbkbbbkbkbkkkbkkbbkkknnkkkkkblllhllllhlllhlllllllhllllhlhlhjhlllh`i`abbabbbknnnkn`bbbabbbbknkkkbkkbbbbbbbkbbbkkbdbbbbbbbbbbbbkbbkbbabbbbbbbbbaabaabbaabababbbbbbdabbbbbbddadddddddddddddd`kmkdd`higio`ghhhhhhhhhhh",
"lhlllhllhlhlhlhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhgggghgggggggggggggghghhhhhhhhhhhhhhhhlljhlhhhhhhhhhhhhhhhhhhgggghhhhghggghghhhhhgghhhhhhhgghhhhghhhlhlhhhhhh`oddnnnnkkkkbkkkkkkkkkbkkknnnnnnnnkbkkkbbkkkbkbkbkbbbbbkkkkbkdblhlllllljhlljhlllllllllllljllllljhlli``aaabbanbnnknncaabbbbbbbbbbabbbbbkkbkbbbbbkkdbbdabbbbabbbbbbbkbabbbbbbbkkbbbbbababbbababaaabdbbkbkkbkdddd`oig`og`ghhhhhhhghhhhghhhhhhhhghhhgghh",
"hhhhhhhhhhhhhhhhghgggggggggggggggggggghghghggggghghghggggogggggogggggghhhhhhggoggggghhghhghggggghhhhhhhhhghghhhhgggggghghhhhgggggggggggghhhhhgghhhhghhhhllhhhhhglhgiodddnknnnnnkkkkkknnnkknnkkbbbbbkkbbkbkkkkkkbbbbbbbbdbbdlljhjhjhlljhllllllllllllllhlhjlllljli`i`baabbbbnnkkblbkkkbbbbkbbbbbbbbbbkbbbbbbbkbdabbdddabbbbbbbabbbbbbbabbabbbkbabbbbabbbbbbbdddddkddd`oihhlhhhhghgggghhhhhhhhhghhhhhhhghghghghgggg",
"hhhhhhhhhhhhhhghggggghghgghghghgggggggghgggggggggghhhhhhggggggggggggggggggggghhhghghhhhhhhhhhhhhgggghhhhghgggghghggggggggggggggggggghhhhhhghghhhhhhhgghhhhhhhhhhhhlhlhhhhhh`ddkkddbbkkkkkknkkkbkkkkbkkkbbbkbbkknnnnnkbbbkkkllhlllhllhlllhlhlhlhllhllhlllhlhlhlhiii`abbbbakkbba`ibbbbkbbkbbbababbkbbabbkkbbkbdbdbbabbbbbkkbkbbbkbbbbbbbbbabbkkbbbkbkbbdbbddd``o`ohhhhhhhhhhhhhhhlhhhhghggghhhhgghhhggggggggghgggg",
"gggggggogggggggggggggggggggggggggggghgggggggggggghghgghhhggggghgggggghhhhhggghhghhhhhhhhhhhhhgggghgggggghhhhhghghhhhghhhghghhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhlhhghhhhhhhhhhhhhhhcg`bknnnnnnnnnnnknnnbbbbbbabkknnnnbbbkmnklllllllllllhllljllljlllllljhjllljlll`i`abababkaa`ii````aababbkkkkkkknnkbbbbbbbkbbabbnbkmnnmknknkkbkkkbbbbbkkkkbbkkddkkddd`gcglhhhhhhhhhhhhhhhhghghhhghhhgggggghghhhhhghhhgggghhhhhhhh",
"ggoggogogogoggggoggogoggggggghggggggghhgggggggggggggghghgggggggggggghghhhhhhhghhgghghhhhghgggggggggggghghgggghghhhhhhhhhhhhhhhghghhhhhghhhhhhhhlhhhhhhhhhhhhhhhhlhhhhhhlhhhhhhhlhlhhh`ddknnnknnnkknbnnnkabbbbbknnmnnnnnknnnhlllhjhjhjljlllhlllhllllllllllllhljhi`idkkbbabaiciiiccciabbabbknbbkkkkkbabbbbbbbbaabnnkkkmkknnnnkbbknkbdkkkknkkddo`ooggghhhghhhhhggggghghgghhhhhhhgghgggggggggghgggghggogghggghhhhggg",
"ggogoggoggggggoggggggggggggghggghgggggggggggggggghhgghgggggggggghhhhhhhhhhhhhhhhhhhlhhhhhhhhhhhhhhhhhhhhhghhghghhhhhhhhghghhhghgggghhhhhhhhhhhhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhhhhlhhhhhgddknnkkknknnkbbkkbbbkmnnnnnnnnnnncjhjlllllhlhlllljllljhjllllllllljllli`ibkkbbba`i`aaiccc`aka``abbkbkkkknnbkbaaabkbabbnnkbkknnnknnnkdddmkddo`gghhhhhhhchghhghhhghggggghgghhhhggghhhhhhhhhhggggghgggogogggghhhhhhhghgggg",
"hghghghghghhhhhhhghhhggghhghgggggogggggggggogggghghhgghgggggggggggghhhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhhhhhhggghhhhhhhhhhhhhhhhghghhhhhghhhhhhhhhhghghghhhhhhhhhhhhhhlhhhhhgddbkmmmnkakkkbbbkbbbbbbnnmmnnhlllhjhljlljhjhlhlllhllhjhlllllhlhjhi`idbnkkkb```aa`ii``i```i`abbbbknbnkkbaaabbbbbabkmnkbbnnnmnkddo`oghhhhhgghhghhhhgghggghghgggggggggggghghgggghhhhhgogogggggghggggggghgghhghhhhhhhg",
"hhhghhhhhhhhhhhhhhhhghhghgggggggggggoggogoggggggghgghhgghggggggggghhhhhhhhhhghhghhhhhhhhhhhhhhghhhhghggghhhhhhhhhhgggggghhhhhgghghghhghhhhhhhhhhgghhhghhhhhhhhhhggggggggggghhhhhhhhhlhhhhlhhhhhhhhgdddbbbbbabkkkkbbaabkknmnllhllhllhlhllhllllhllllllllhlhllllhli`iabkknkbaaaa`aa```aa`icl`akkkkkkkkka`abaabbbbbbkndddndkd`oghhhhhhhhhhhhhghghhhghggggggghgggggoggggooggghhgogggghghhhgggggggggghhghghgghgghghggh",
"ggghghhhhhhhlhhhhgggggghgggghghghggggggoggggggggggghhghhhgggggghhhhhhhhhhghhhhghghhhhhhlllhhhhhhhhhhhhhhhhhhhhhhgghggggggghgggggggggggggggghgggghhhhggghghghhhhhgghghhhhhgghghhhhlhhhhhlhhhhlhhhlhlhhhhi`dkdddbbknkkkkkknnmlllhlllhlllhllhlhllhlhlhlhllllhlhlll````bbbbbabbaaabka`akkbicliannkkkbkkba`abbbdkkkbdkkdo`ghhhhhhhhhggghghhggggghggggghhgghghhggggoggghhhhghhhhhhhghgghhhhggohghhhhhgggogogggggggghgh",
"hghghghhhhhhhhhhhhgggggggghghghggggghggggggggggggggggggghhhhghghhhhhhhhgghggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghggggggghghhhghggghghghhhhhhhhhhhhhhhhhhghhhhhhlhhhgggghhhhhhhhhhhhhhhhhhhhhhhlhhlhllhhhhh`dkkdkbbbbbbbkknlhlchlhllhllhlllllhlllllhllhlhlllhlhi`i`bbbbbbbbbabbbbaakkaiiliaknkkbkbbaddbddddddddohhhhhhhhhhhhhhhhggggggggggghhhhhggghghhhhgggoggggggggggghgggggggghghhhhhhhhhghggggggggggggghhhhh",
"gggggghghhhhhhhhggggggghhhghhhghhhgggggggggggggggogggggghgghgggggggggghhhhhhggggggggghhhhhhhhhhhgggghggghhhhhhhghgggggghhhhhhghghhhhhhhhhhhhhhhghhhghhhhhhhhhhhhhhhlhhhhgghgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdnmnnnkbbbkblllllhlchlchlchlhllhlhchlchllchcllcliiiabakbbkbaaaaabaaakaaicciabknbbkbaddbddo`gggghhhhhhhhggggggghhgggggoggggggggogggggghghhhhghgggghhhhghhhhhggggggggggggggggggggggogoogggggggggggg",
"ghhhhhhhhhhhhghggggggghhhhhhhhhhgggggggggggggoggggggggghggggghghhhhhhhhhhhggghggghgghghghhhhhhhhhhhhhhhhhhhhhghggggggggghghghhghggghhhhllllhhhhgghgggghgghghhhhhhlhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhlhhhhlhlhhlhh`dknmkkbbdlllhlchllhllchllchlchllclllchlllhchlgciabbkbbbbabbbabbabbaailcc`abkkbd`iiihhhhhhhhgghghghgggggggggghhghggggoggogggggggghhhhghgggggggggggghggggghhgggggghggggghggggogogogggggggggghhhh",
"hhhhhhggggggghghhhhhhhhhhhhhhhhhhhhhhhhhhggggggohggggggggghhhhhhhhhhhhggggggggghghghghhhhhhhhhhhlhlhlhhhhhhgggggggggghghghhghhhhhhhhhhhlhhhhhhhggghhhhhhhhhhghghhhhhhhgggghhhhhhhhhhhhhhhhhhhhlllhhhhhhhhhhhlhhhllhlgakmkdglhlllllclcclllchllchlchlhchllhcllllccciabbabbbbbbababbaaaiiiiii`ddd`dgghhghhggghhhghhgggggggggggggggggggggogggggghhhhhhgggggggghhhhhhgghgggggggggggoggggghghggggggggggggggggghhghgggg",
"hhgggggggggghhhhhhhhhhlhhhhhhhhhhlhhhhhhgghghhhhhhhhhgggghghhhhhhhhhhhgggggggghgggggggggggggghhhhhhhhhhhhgggggggggggggggghhhhhhhhhghhhhhhlhhhhhhgghhhhjljllhhgggghghhhhghghgghhhhhhlhhhhhhhhhhhhlhlhhhhhhhhhhhhhhhhhhhhg`gchllhlhlljjjjljjljljllllllllllllhllhllhidbbaabaabbkkbbbbaa````igioihhhhghghhhghhgggggggggghhhhgggggggghhhgghgggggghghhgghhhhggggggogggggggggggghggggggoggggggoggghhhhhhhhhhhhhgggggggg",
"ggggggogggghghhhhhhhhhhhhhhhhhhhhhhhhggghghhhghhhhhhghghgghghhhhhhhhhgggggggggghgggggggggggghghhhhhhhhhgggggggggggghgggghhhghhhhhghghhhhhhhhhhhhhgghhlhjhjhhhhgghhhhhhhhhhghghghhhhhhhhhhhhhlllhhhhhhhhhhhhhhhhhhhhhhjhlhlhlhlhjjjjjjjjjjjjjjjjjjjjjjjjjjljllllhiiidbababbabbbknnkkdido`hhhhhhhhhhghgghghggghhgghgggggggggoggggoggggogggggoggggghgggggghggggggghgggggghhghggggogogghhggggggggggghhhggggggghggggg",
"ogogoggggggggggghghggggghhhghggghghghggggghghhhghghghhgggggggggghhhhghgggggggggggggggggggghgggggggghggggggggggggggghghhhhghhhhhhggghhhhhhhhhhhhhhgghhhhhhlhjhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhlhhhhhhhhhhhhlhhhhhhhjhhhlhlhlhllljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjc`iibbbbbaaakbdkkkddighhhhhhhhhghgggggggghgghhhhghgggggggggggggggggogggggoggggggggghggggggggggggggogogghghhgggggggghhhhhhhhgghghhghghghhhgggggogo",
"ggogogogggggghhhhhhhhhhhhhghgghhghhhghhhgggggghhghgggghggggghhhhhhhghhhhgggggggggggggggghhghgggggghghghhghhhhgggggghghhghhhhhhggghghhhhhhhhhhhhhgghghhljhjhhhhhhhhghghgghhhhhhhghhhhhhhhlhhhhhhhhhhhhhghhhhhhhhhhhhhhhllhhhhlhlllljjjjjjjjjjjjjjjjjjjjjjjjjjjjlli``bababbddddddogggghhhhhghghgghgggggggghggghggggggggggoggoggggggggggggggggghgggggggggggggggggogggggghghghgggggogghhhhhhggggggggggggogogggoggogo",
"oogogogogogghgghhhhhhhhhhhhhhhhhhhhhhhgggggggggghghhhghghghhhhhhhhghgghghhhghhhhhhhhhhhhhghggggghgghghgghgghghhhgghghhghghhhhhhghhhhhhhhhhhhhhhhghghhhhhlhhhhhhhghhhhghhhhhhhhhhhhhhhhhhlhhlhhhhhhhhgghhhghhhhhhhhhhhhhhlhhhhhhhhlhlljjjjjjjjjjjjjjjjjjjjjjjjjjjiiibabbdbd`oghhhhghhghhohhhgggggghghgggghgggggggggggggogggggggogoggggggggogghhggggogoogggggogggggogggggggggggggggggghhgggggggggggggggggggogoogoo",
"ggogoggggggggghhhhhhhhhhhhhhhhhhhhgggggghhghhhhhhhhhhhhhhhhhhhhhgghggggggghhghhhhhhghggggggghggghghghghgghhhhhghhhghhghghggggggghhhhhhhhhghgggggghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhlhhhhhlhhhhhlhlhlhhhlhjljjjjjjjjjjjjjjjjjjjjjjjjl```kbbd`ggihhhhgggghhghhghhghhhhggggggghgggggghhghggggggoogggggggggggggggoggggggggghhggogggggoggghhhhhhhgggggghgghghgggggggogogggggggggggggggogg",
"ggggggogggggghhhhhhhhlllhlhhhhhhgghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhghghghghhhhhhhhhhhhhghggghghghghhhhhhghhhhhhhhhhhhhhhhgghhggghhghghhhhgghgggggggghhhhhhhhhhhghghhhhhhhhhhhhhhhhllhhhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhhhhhlhhhhlhhhhhhhlhlhjjjjjjjjjjjjjjjjjjjjjjlhi``ddihhhhhhhghhhghhhghhghhhhhhggggggggggggghhghgghgggggggogghhhghhgooogggogggggggggggggogoggggggogggggoggghghhhghhggogggghhhhghgggggggggggogggg",
"gggggggghhhhhhhhhlhhhhhhhhhhhhghghhghghhhghghhhhhhhhhhhhhhhhhhgghgggghghhghhhhhghgggggggghgggggggggggghhhhhhhhhhhhhhhghhhggggggggggghghghghggggghhhhhhlhhhhhhhghhhhhhhhhhhhghghhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhllhhhhhhhhhhlhhhhhhhlhlhlhjjjjjjjjjjjjjjjjjjhlhcgggghghhhhhgghghgghgghgggggghhhhgggggghggggghhhgghhgggggogoggggghggghhgoogogoogggooogogogoggogogogogoggghhgggghhhhhghhgoghghhghhhhhhhgggoogggggh",
"ghghhhhhhhhhlhhhhhhhhhhhghhhhghhghghhghghhghggghhhhhhhhhhhhhghhhgghghghggghghghghghhghhghggghghgggggggghhhhhlhlhhhhhhhghhhhghggggggghghghgghgggggghhhhhhhhhghhhhhhhhhghhgghgggghhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhhhllhhhhhhhhhhhhhhhhhhhlhlllljjjjjjjjjjjjljlhllhhghhghghhghgggghgghggggghhhhhhhhhghggggghgggggggghhggggogggogogggggggggggggggoggogggggggggggogoggghggggggghggggogggggggggoggggggoggggggggggggggg",
"hhhhhhhlhhhhhhhhhhhhhhhhhhghghghghghggggggggggggghhhhhhhhghghggggghghhghhhhhhhhghggghgghghhggggggggggggghhhhhhhhhhhhhhhhghgggghghgghghhghghgghggghhhhhhhhgggghghghghgghghghghhhhhhhhhlhhhhhghhghhhhhhhhhhhhhhlhhhhhhhhhhhhhhhhhlhhhhhlhhhlhhhhjljjjjjjllhhhhhhhhhhhggggogghhghhhggggggggggggghhhhhgghggghgggggggghhhhgggggggogoggggggggggggogogoggggggggggggggggggggggogggggggggogggggggoggggggghggghggggggggggg",
"hhhhhhhhhhhhhhhhhhhhhhhhhghhggggggggggggggggoggggggghghhghghghgghgghghhhhhhhhhhhghghgggggghghhhghggggghghhhhhhhhhhhhhhghhghhhghghgggghhghghghhhhhhghhhhghghgggggghggghghhhhhhhhhhhhhhhhhhhgggghhhhhhhhllhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhlhhlhlhhhlljjhjhlhlhhhhhhggggggggggggggggggggooggggggggggggggghghggggoggghgghhggggggggogogggooogggggoggogogogoggghghghhggggggggggooghhhhhgogggooggggogggghhhggggggghghghg",
"hhhhhhhghhhhhhhhhhhhhhhhghggggggggghhhghgggggggggghhghhhgghghghghghghhhhhhhhhgggggggghhghghghgghgggggggggggghhhhhhhhhhhhhhhhhhhggggghhhhhhhhghhhhhhhhhhgghghhhhghgghgghghghghhhhhhlhlhlhhhhhhhghhhhhhhhhhhhhhhhlhhhhhhghghhhhhhhhhhhhhlhhlhlhhlhhlhlhlhhhhhghhggggogggogggggghggggggghhggggggghgggggggggghggogggghghhggogggoggggoogggggggoggggggoggggggggggggggggggggggogggghhhghgggggggogoggggggggggggoggghhhhh",
"hhhhhhhhhhhhhhhhhhhhhhhggggggggggghghhhghhgggggggggghhghhhhghghggghhhhhhhhhhhghgggggggggghghghgggggogggggghhhghggghgghghhhhhhhhghgghghhhhhhhghghhhhhhghggghghhhhhhghghhghhghhhhhhhhlhjhlhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhghghhhhhhhhhhhhlhlhhhhhhhhhlhhhgghggggggggghggghggghghhggoggghhhggggggggggghhgggghggggggghhhhgggogoggogoggggggggggghghgggggoggggogoogggggogggoggggghggggggoogogggggggghghghggogogogoggog",
"hhhhhhhhhhhhhggggggggggggggggghghghhhhhhgggggogggghgghhhhhhggggghghhhhhhhhhhghgggggggggghghhghgggogogggghhhhhggghggghghghhhhgggggghhhhhhhhhghggghhhhhhhghgghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhgghhghhhhhhghhhhhhhhhhhhgghhhhghhhlhhhhhhhhhhhhhhhhllhhlhhhhggggggoghghggoggoggggggggggghhgggggghggghghgggggggggggghhhhhgoogoggoggggooggghggggggggghggogoggggggggggggoggggggghghhhhggggggoggghgggggggggooooogogoggg",
"hghhhhhhhhhhggggggggggghhhhhhhhhhhhhhhhgghgggggggghghhhhhghghghhhhhhhhhhhhhggggggggggghhhhghhggggggggghghghgghhghghgggggghggghghgghhhhhhhhhhgggggghhhhhhhhhhgghghhhhhhhhhhhhhhhhlhhhhhhhhhhhhggghhhhhhhgghghhhhhhghghhhghghhhhhhhhhhhhhhhlhlhlhhhhlhhhhhgggggggggghgggggoggggggggggghhhggghggggggggggggggoogggghhhhgoggggggggggggogghhhggggogghhghggghggghgggggggggogooogghhhghhhhhggggghhgggogogogoogogoogogogg",
"ghghhhhhgggggggghhhhhhhhhhhhhhhhhhhhhhgghgggghghghghghgggggghhhhhhhhhhhhhhggggggggghghghggggghghgghhhhhhhhhhggggggggggggggghgghggghghhhhhhhgghghhhhghhhhhhhhhhhhhhhghhhhhhhhhhllhlhhhhhhhhhhhhghghhgggghhhhhhhhhhhhghghhghhhghhhhhhhhhhlhhhlhlhhlhhhhhhlghhggoggggggogghggogggggggghhghghggghgghggoggogggggggoogggggggggogoggogogggogghhggogghhhhhggggghhggggoooooooogggoggggghhghhhgghggggggogoghgghgggggoggggg",
"ghghggggggggggggghghhhhhhhhhlhhhhhhhhhhhgghggghggggggggghghhghghhhhhhhghhggggggggggggggggggggggghhghghhhhhhghgghghggggogggggggggggghhhhhhggggghghhhhghhhhhhhhhhhggghhhhhlhlhlhhlhhhhhhhhhhhhhghghghhhghhgghhhhlhlhhhghghhhghhhhhhhhhhhhhhhhlhhhhhhhlhhhhhlhhhggoggggggooggggoggggggghhhhggggghgggggggggggggogogghgggggghhggggggghhgggggogoggggggggggggggggggggogogoggooggggggggggggggogoggggoggggggggghggggogggg",
"hgggggghghggghghgghghhhhhhhhhhlhhhhhhhhghghhhghgggggghhhghghghhhhhhghghgghghhgggoogogogggghghhgghgghghghghghgghgggggggggggghggggggggghhggggghghhhhghghggghghhhhhhhghhhhhhlhlhlhhhhhhghhhlhhhhhgghhhhhhgghhhhhhhhhhhhhhhghghhhhhhhhhhhghhhhhhhhhhlhhhhhhhlhhhhhhhgggggghhggooggggggoggggggggghghhgooggggogogggggggggghhhhhhgggoghhhggogooggggggggggggogghhggogogoggoggggogggggggggggogogggooogoggoggggggggoggoggg",
"ghghghhghhhhhghgggggghhhhhhhlhhhlhhhhhghghghhghggggggghhgggghgggggghhhhhhhhggggggggoggggghghhhhghgggggggggggggggggggggoggghghghgggggggghggggggggghhhhghghgghhhhhhhghhlhhlhhlhlhhhhhghhhlhllhhhhhhhhhhhhhhhhhhhhhhhhhhhgggghhhhhhhhlhhhhhhhlhlhhhlhhhhhhhhlhhhhhhhhggggggogoggggggggggggggghggghgggoogogoggoogogggggghhhhhhgggggggggggogggggggooggogoggghgggoogoogoggogogoggghgggggggggggghggggggggggggggoggogogg",
"hhhhhhhhhghghggggggghhhhhhhhhhhhhhhhhhgggggggggggggghgggghgggghghghhhhhhhhgggggggoggggghhhhhhhhhghgghghhggggggggggggggggggggggggggghghghgghghgghhhhghghgghhhhhhhhggghhlhlhlhlhlhhhghhhhhlhlhhhhhhhhhhhhhhhhhhhhhhhhhhgggghhhhhhhlhhlhlhhlhhlhhhhhhhllhhhhlhhhhhhhhggggghggghggghgghhgggghhggggghggggoggggoggggggggogggghhhgghggggghgggggghgggggggggggggggooggogggggogogoggggghggggoooogoggggggggggggggggggoggggg",
"hhhhhhhhghggggggggghghhhhhhhhhhhhhhhhggggggggggggggggggggggghghghhhhhhhggggggggoggggghhhhhhhhhhhhghgghggggggghghggggogggogggggghgghggghghghgggggggghghhhhhhhlllhhhghhhhhlhhlhlhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhgghhjljhlhhlhlhhlhhhhhhlhhhhlhjhhlhhjhhhhhggghhhoghhgggggghhggggogggghhggggggggoggggggggggggggoggghgggggghhggogggghgggggogggggoggggghghghhhgggggggggggggoggggggggggggogggoggggggogogggg",
"hhhhggggggggggggggghhhhhhhhhhhhhhhhggggggggggggghhhghghghghgghgghhhghgggghgggggggggghhhhhhhhhhhhghghggghgghhhhhghgggggggggggghggghgghgghhhgghgghghhgghghhhlllhlhhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhhlllhlhhhhhhhhhghhhhhhhhhhhhhhhlhjhlhhlhhhhhhhhhlhlhhhhllhhlhjhllhhlhlhggggogooggggggggogggggoggggggooggogggggggggggggggggggghggggggggogoggggggooogogggggggggghghhhhhhhhhhhhggggggggoggghhhhhggggogggghggggoooogg",
"gggggghggggggggggghgghhhhhhhhhhghgghghggggggggghggggghghggghggghghggghghhhghgggghghhghhhhhhhhhhghhhghggggggghhghghgggggogoggggghgghghghhghghgghghhhghghhhhlhhlhlhhhhhhhhhhhhhhhhhhhghhhhhhhgghhhhlhjhlhlhhhhhhhhhhhhhhhhhhhhhhhhlljlhhhlhhhhhhhhhhlhjhhhjhlhhhgjhhhhhhhhoggoogggoogghggghgggggggggoggggogoggoogggggghgghggghggggggogogogoooggghggoggggggggghhhhhhhhhhhhhhhhggghgggogoggghhhhhggogoghhhhhhgggggog"
};

44
sys/amiga/nethack.cnf Normal file
View File

@@ -0,0 +1,44 @@
# NetHack 3.7 Amiga Configuration
#
# For a full list of options, see the opthelp file or press '?'
# then 'o' during gameplay.
# *** DISPLAY MODE ***
#
# Tile mode (graphical tiles, recommended):
OPTIONS=windowtype:amiv
#
# Text mode (uses hack.font line-drawing characters):
#OPTIONS=windowtype:amii
#OPTIONS=symset:AmigaFont
# *** GENERAL OPTIONS ***
OPTIONS=time,showexp,lit_corridor
OPTIONS=boulder:0
OPTIONS=autopickup,pickup_types:$"=/!?+
OPTIONS=catname:Kaori
# *** MENU COLORS ***
# Colour-code inventory items by BUC status and value.
OPTIONS=menucolors
MENUCOLOR=" blessed "=green
MENUCOLOR=" holy "=green
MENUCOLOR=" uncursed "=cyan
MENUCOLOR=" cursed "=red
MENUCOLOR=" unholy "=red
MENUCOLOR=" cursed .* (being worn)"=red&underline
MENUCOLOR=" cursed .* (wielded)"=red&underline
MENUCOLOR="loadstone"=red&underline
MENUCOLOR="gold piece"=brown
MENUCOLOR="worthless"=brown
MENUCOLOR="wand of wishing"=magenta
MENUCOLOR="magic lamp"=magenta
MENUCOLOR="magic marker"=magenta
MENUCOLOR="bag of holding"=magenta
MENUCOLOR="amulet of life saving"=magenta
MENUCOLOR="cloak of magic resistance"=magenta
MENUCOLOR="silver dragon scale"=cyan
MENUCOLOR="gray dragon scale"=cyan
MENUCOLOR="speed boots"=magenta
MENUCOLOR="luckstone"=green
MENUCOLOR="unicorn horn"=green

1456
sys/amiga/winamenu.c Normal file

File diff suppressed because it is too large Load Diff

1677
sys/amiga/winami.c Normal file

File diff suppressed because it is too large Load Diff

57
sys/amiga/winami.p Normal file
View File

@@ -0,0 +1,57 @@
/* NetHack 3.6 winami.p $NHDT-Date: 1433806595 2015/06/08 23:36:35 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* Copyright (c) Gregg Wonderly, Naperville, IL, 1992, 1993 */
/* NetHack may be freely redistributed. See license for details. */
/* winami.c */
void amii_raw_print(const char *);
void amii_raw_print_bold(const char *);
void amii_start_menu(winid , unsigned long );
void amii_add_menu(winid, const glyph_info *, const anything *, char, char, int, int, const char *, unsigned int);
void amii_end_menu(winid , char , const char * , const char *);
char amii_select_menu(winid );
void amii_update_inventory(int);
void amii_mark_synch (void);
void amii_wait_synch (void);
void amii_setclipped (void);
void amii_cliparound(int , int );
void amii_askname (void);
void amii_player_selection (void);
void flush_output (void);
void amii_destroy_nhwindow(winid );
int amii_create_nhwindow(int );
void amii_init_nhwindows (void);
int amii_get_ext_cmd(void);
char amii_yn_function(const char * , const char * , char );
void amii_addtopl(const char *);
void TextSpaces(struct RastPort * , int );
void amii_putstr(winid , int , const char *);
void amii_putsym(winid , int , int , CHAR_P );
void amii_clear_nhwindow(winid );
void amii_exit_nhwindows(const char *);
int amii_nh_poskey(coordxy *, coordxy *, int *);
int amii_nhgetch (void);
void amii_get_nh_event (void);
void amii_remember_topl (void);
int amii_doprev_message (void);
void amii_display_nhwindow(winid , boolean );
void amii_display_file(const char * , boolean );
void amii_curs(winid , int , int );
void amii_print_glyph(winid, coordxy, coordxy, const glyph_info *, const glyph_info *);
void DoMenuScroll(int , int );
void DisplayData(int , int , int );
void SetPropInfo(struct Window * , struct Gadget * , long , long , long );
void kill_nhwindows(int );
void amii_cl_end(struct amii_WinDesc * , int );
void cursor_off(winid );
void cursor_on(winid );
void amii_getret (void);
void amii_getlin(const char * , char *);
void getlind(const char * , char * , const char *);
void amii_suspend_nhwindows(char * );
void amii_resume_nhwindows(void);
void amii_bell(void);
void EditColor(void);
void DrawCol( struct Window *, int, UWORD * ) ;
void DispCol( struct Window *w, int idx, UWORD * ) ;
void SetBorder(struct Gadget *) ;
void port_help (void);
void dismiss_nhwindow(winid) ;

1110
sys/amiga/winchar.c Normal file

File diff suppressed because it is too large Load Diff

199
sys/amiga/windefs.h Normal file
View File

@@ -0,0 +1,199 @@
/* NetHack 3.6 windefs.h $NHDT-Date: 1432512795 2015/05/25 00:13:15 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */
/* NetHack may be freely redistributed. See license for details. */
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/io.h>
#if !defined(_DCC) && !defined(__GNUC__)
#include <dos.h>
#endif
#include <exec/alerts.h>
#include <exec/devices.h>
#include <exec/execbase.h>
#include <devices/console.h>
#include <devices/conunit.h>
#include <graphics/gfxbase.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/gadtools.h>
#include <libraries/dosextens.h>
#include <libraries/asl.h>
/* stddef.h is included in the precompiled version of hack.h . If we include
* it here normally (through string.h) we'll get an "illegal typedef" later
* on. This is the easiest way I can think of to fix it without messing
* around with the rest of the #includes. --AMC
*/
#if defined(_DCC) && !defined(HACK_H)
#define ptrdiff_t ptrdiff_t_
#define size_t size_t_
#define wchar_t wchar_t_
#endif
#include <ctype.h>
#undef strcmpi
#include <string.h>
#include <errno.h>
#if defined(_DCC) && !defined(HACK_H)
#undef ptrdiff_t
#undef size_t
#undef wchar_T
#endif
#ifdef IDCMP_CLOSEWINDOW
#ifndef INTUI_NEW_LOOK
#define INTUI_NEW_LOOK
#endif
#endif
#ifndef HACK_H
#include "hack.h"
#endif
#include "wintype.h"
#include "winami.h"
#include "func_tab.h"
#ifndef CLIPPING
CLIPPING must be defined for the AMIGA version
#endif
#undef LI
#undef CO
/*#define TOPL_GETLINE /* Don't use a window for getlin() */
/*#define WINDOW_YN /* Use a window for y/n questions */
#ifdef AZTEC_C
#include <functions.h>
#else
#ifdef _DCC
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/console_protos.h>
#include <clib/layers_protos.h>
#include <clib/diskfont_protos.h>
#include <clib/gadtools_protos.h>
#else
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/console.h>
#include <proto/layers.h>
#include <proto/diskfont.h>
#include <proto/gadtools.h>
#include <proto/asl.h>
#endif
/* kludge - see amirip for why */
#undef red
#undef green
#undef blue
#ifdef _DCC
#include <clib/graphics_protos.h>
#else
#include <proto/graphics.h>
#endif
#ifdef _DCC
#define __asm /* DICE doesn't like __asm */
#endif
#ifdef _DCC
#include <clib/intuition_protos.h>
#else
#include <proto/intuition.h>
#endif
#endif
#ifdef SHAREDLIB
#include "NH:sys/amiga/lib/libmacs.h"
#endif
#ifdef INTUI_NEW_LOOK
#include <utility/tagitem.h>
#endif
#define WINVERS_AMII (strcmp("amii", windowprocs.name) == 0)
#define WINVERS_AMIV (strcmp("amiv", windowprocs.name) == 0)
#define WINVERS_AMIT (strcmp("amitty", windowprocs.name) == 0)
/* cw->data[x] contains 2 characters worth of special information. These
* characters are stored at the offsets as described here.
*/
#define VATTR 0 /* Video attribute is in this slot */
#define SEL_ITEM 1 /* If this is a select item, slot is 1 else 0 */
#define SOFF 2 /* The string starts here. */
#undef NULL
#define NULL 0L
/*
* Versions we need of various libraries. We can't use LIBRARY_VERSION
* as defined in <exec/types.h> because some of the libraries we need
* don't have that version number in the 1.2 ROM.
*/
#define LIBRARY_FONT_VERSION 34L
#define LIBRARY_TILE_VERSION 37L
/* These values are just sorta suggestions in use, but are minimum
* requirements
* in reality...
*/
#define WINDOWHEIGHT 192
#define SCREENHEIGHT 200
#define WIDTH 640
/* This character is a solid block (cursor) in Hack.font */
#define CURSOR_CHAR 0x90
#define FONTHEIGHT 8
#define FONTWIDTH 8
#define FONTBASELINE 8
#define MAPFTWIDTH 8
#define MAPFTHEIGHT 8
#define MAPFTBASELN 6
/* If Compiling with the "New Look", redefine these now */
#ifdef INTUI_NEW_LOOK
#define NewWindow ExtNewWindow
#define NewScreen ExtNewScreen
#endif
#define SIZEOF_DISKNAME 8
#define CSI '\x9b'
#define NO_CHAR -1
#define RAWHELP 0x5F /* Rawkey code of the HELP key */
#define C_BLACK 0
#define C_WHITE 1
#define C_BROWN (WINVERS_AMIV ? 11 : 2)
#define C_CYAN (WINVERS_AMIV ? 2 : 3)
#define C_GREEN (WINVERS_AMIV ? 5 : 4)
#define C_MAGENTA (WINVERS_AMIV ? 10 : 5)
#define C_BLUE (WINVERS_AMIV ? 4 : 6)
#define C_RED 7
#define C_ORANGE 3
#define C_GREY 6
#define C_LTGREEN 8
#define C_YELLOW 9
#define C_GREYBLUE 12
#define C_LTBROWN 13
#define C_LTGREY 14
#define C_PEACH 15
/* Structure describing tile files */
struct PDAT
{
long nplanes; /* Depth of images */
long pbytes; /* Bytes in a plane of data */
long across; /* Number of tiles across */
long down; /* Number of tiles down */
long npics; /* Number of pictures in this file */
long xsize; /* X-size of a tile */
long ysize; /* Y-size of a-tile */
};
#undef MAXCOLORS
#define MAXCOLORS 256

148
sys/amiga/winext.h Normal file
View File

@@ -0,0 +1,148 @@
/* NetHack 3.6 winext.h $NHDT-Date: 1432512794 2015/05/25 00:13:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */
/* NetHack may be freely redistributed. See license for details. */
extern int reclip;
#ifdef CLIPPING
extern int clipping;
extern int clipx;
extern int clipy;
extern int clipxmax;
extern int clipymax;
extern int xclipbord, yclipbord;
#endif
extern int CO;
extern int LI;
extern int scrollmsg;
extern int alwaysinvent;
#ifndef SHAREDLIB
extern unsigned short amii_defpens[20];
extern struct amii_DisplayDesc
*amiIDisplay; /* the Amiga Intuition descriptor */
extern struct window_procs amii_procs;
extern struct window_procs amiv_procs;
extern unsigned short amii_initmap[AMII_MAXCOLORS];
extern unsigned short amiv_init_map[AMII_MAXCOLORS];
extern unsigned short amii_init_map[AMII_MAXCOLORS];
extern int bigscreen;
extern int amii_numcolors;
extern long amii_scrnmode;
extern winid amii_rawprwin;
extern struct Screen *HackScreen;
extern char Initialized;
/* These have already been defined elsewhere (and some are conflicting)
* ... going ... going once ... going twice ....
* extern const char *roles[];
* extern struct Library *ConsoleDevice;
* extern char toplines[ TBUFSZ ];
* extern NEARDATA winid WIN_MESSAGE;
* extern NEARDATA winid WIN_MAP;
* extern NEARDATA winid WIN_STATUS;
* extern NEARDATA winid WIN_INVEN;
* extern winid WIN_OVER;
* extern struct GfxBase *GfxBase;
* extern struct Library *DiskfontBase;
* extern struct IntuitionBase *IntuitionBase;
* extern struct Library *LayersBase;
*/
extern int amii_msgAPen;
extern int amii_msgBPen;
extern int amii_statAPen;
extern int amii_statBPen;
extern int amii_menuAPen;
extern int amii_menuBPen;
extern int amii_textAPen;
extern int amii_textBPen;
extern int amii_otherAPen;
extern int amii_otherBPen;
#else
extern WinamiBASE *WinamiBase;
#endif
/* All kinds of shared stuff */
extern struct TextAttr Hack160;
extern struct TextAttr Hack40;
extern struct TextAttr Hack80;
extern struct TextAttr TextsFont13;
extern struct Window *pr_WindowPtr;
extern struct Menu HackMenu[];
extern struct Menu *MenuStrip;
extern struct NewMenu GTHackMenu[];
extern APTR *VisualInfo;
extern unsigned char KbdBuffered;
extern struct TextFont *TextsFont;
extern struct TextFont *HackFont;
extern struct IOStdReq ConsoleIO;
extern struct MsgPort *HackPort;
extern int txwidth, txheight, txbaseline;
#ifdef SUPERBITMAP_MAP
extern struct BitMap amii_vbm;
#endif
/* This gadget data is replicated for menu/text windows... */
extern struct PropInfo PropScroll;
extern struct Image Image1;
extern struct Gadget MenuScroll;
/* This gadget is for the message window... */
extern struct PropInfo MsgPropScroll;
extern struct Image MsgImage1;
extern struct Gadget MsgScroll;
extern struct TagItem tags[];
extern struct win_setup {
struct NewWindow newwin;
UWORD offx, offy, maxrow, rows, maxcol, cols; /* CHECK TYPES */
} new_wins[];
extern UWORD scrnpens[];
/* The last Window event is stored here for reference. */
extern WEVENT lastevent;
extern const char winpanicstr[];
extern struct TagItem scrntags[];
extern struct NewScreen NewHackScreen;
extern int topl_addspace;
extern char spaces[76];
extern int wincnt; /* # of nh windows opened */
extern struct Rectangle lastinvent, lastmsg;
typedef struct {
UWORD w, h;
WORD x, y;
UBYTE nPlanes;
UBYTE masking;
UBYTE compression;
UBYTE reserved1;
UWORD transparentColor;
UBYTE xAspect, yAspect;
WORD pageWidth, pageHeight;
} BitMapHeader;
typedef enum {
COL_MAZE_BRICK,
COL_MAZE_STONE,
COL_MAZE_HEAT,
COL_MAZE_WOOD
} MazeType;
extern struct PDAT pictdata;
extern struct Hook fillhook;
extern struct TagItem wintags[];
#ifndef SHAREDLIB
#ifndef __GNUC__
void __asm LayerFillHook(register __a0 struct Hook *hk,
register __a2 struct RastPort *rp,
register __a1 struct FillParams *fp);
#else
#ifdef __PPC__
struct EmulLibEntry LayerFillHook;
#else
void LayerFillHook(void);
#endif
#endif
#endif
extern int mxsize, mysize;

2373
sys/amiga/winfuncs.c Normal file

File diff suppressed because it is too large Load Diff

103
sys/amiga/winkey.c Normal file
View File

@@ -0,0 +1,103 @@
/* NetHack 3.6 winkey.c $NHDT-Date: 1432512794 2015/05/25 00:13:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */
/* NetHack may be freely redistributed. See license for details. */
#ifndef CROSS_TO_AMIGA
#include "NH:sys/amiga/windefs.h"
#include "NH:sys/amiga/winext.h"
#include "NH:sys/amiga/winproto.h"
#else
#include "windefs.h"
#include "winext.h"
#include "winproto.h"
#endif
int
amii_nh_poskey(coordxy *x, coordxy *y, int *mod)
{
struct amii_WinDesc *cw;
WETYPE type;
struct RastPort *rp;
struct Window *w;
/* No entry log for nh_poskey -- too noisy (called constantly) */
if (cw = amii_wins[WIN_MESSAGE]) {
cw->wflags &= ~FLMAP_SKIP;
if (scrollmsg)
cw->wflags |= FLMSG_FIRST;
cw->disprows = 0;
}
if (WIN_MAP != WIN_ERR && (cw = amii_wins[WIN_MAP]) && (w = cw->win)) {
cursor_on(WIN_MAP);
} else
panic("no MAP window opened for nh_poskey\n");
rp = w->RPort;
while (1) {
type = WindowGetevent();
if (type == WEMOUSE) {
*mod = CLICK_1;
if (lastevent.un.mouse.qual)
*mod = 0;
/* X coordinates are 1 based, Y are 1 based. */
*x = ((lastevent.un.mouse.x - w->BorderLeft) / mxsize) + 1;
*y = ((lastevent.un.mouse.y - w->BorderTop - MAPFTBASELN)
/ mysize) + 1;
#ifdef CLIPPING
if (clipping) {
*x += clipx;
*y += clipy;
}
#endif
return (0);
} else if (type == WEKEY) {
lastevent.type = WEUNK;
return (lastevent.un.key);
}
}
}
int
amii_nhgetch(void)
{
int ch;
struct amii_WinDesc *cw = amii_wins[WIN_MESSAGE];
/* No entry log for nhgetch -- too noisy (called constantly) */
if (WIN_MAP != WIN_ERR && amii_wins[WIN_MAP]) {
cursor_on(WIN_MAP);
}
if (cw)
cw->wflags &= ~FLMAP_SKIP;
ch = WindowGetchar();
return (ch);
}
void
amii_get_nh_event(void)
{
/* nothing now - later I have no idea. Is this just a Mac hook? */
}
void
amii_getret(void)
{
int c;
raw_print("");
raw_print("Press Return...");
c = 0;
while (c != '\n' && c != '\r') {
if (HackPort)
c = WindowGetchar();
else
c = getchar();
}
return;
}

151
sys/amiga/winproto.h Normal file
View File

@@ -0,0 +1,151 @@
/* NetHack 3.6 winproto.h $NHDT-Date: 1433806597 2015/06/08 23:36:37 $ $NHDT-Branch: master $:$NHDT-Revision: 1.9 $ */
/* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */
/* NetHack may be freely redistributed. See license for details. */
/* winreq.c */
void EditColor(void);
void EditClipping(void);
void DrawCol(struct Window *w, int idx, UWORD *colors);
void DispCol(struct Window *w, int idx, UWORD *colors);
void amii_change_color(int, long, int);
char *amii_get_color_string(void);
void amii_getlin(const char *prompt, char *bufp);
void getlind(const char *prompt, char *bufp, const char *dflt);
int filecopy(char *from, char *to);
char *basename(char *str);
char *dirname(char *str);
/* winstr.c */
void amii_putstr(winid window, int attr, const char *str);
void outmore(struct amii_WinDesc *cw);
void outsubstr(struct amii_WinDesc *cw, char *str, int len, int fudge);
void amii_putsym(winid st, int i, int y, CHAR_P c);
void amii_addtopl(const char *s);
void TextSpaces(struct RastPort *rp, int nr);
void amii_remember_topl(void);
long CountLines(winid);
long FindLine(winid, int);
int amii_doprev_message(void);
void flushIDCMP(struct MsgPort *);
int amii_msgborder(struct Window *);
void amii_scrollmsg(register struct Window *w,
register struct amii_WinDesc *cw);
/* winkey.c */
int amii_nh_poskey(coordxy *x, coordxy *y, int *mod);
int amii_nhgetch(void);
void amii_get_nh_event(void);
void amii_getret(void);
/* winmenu.c */
void amii_start_menu(winid window, unsigned long);
void amii_add_menu(winid, const glyph_info *, const anything *, CHAR_P, CHAR_P,
int, int, const char *, unsigned int);
void amii_end_menu(winid, const char *);
int amii_select_menu(winid, int, menu_item **);
int DoMenuScroll(int win, int blocking, int how, menu_item **);
void ReDisplayData(winid win);
void DisplayData(winid win, int start);
void SetPropInfo(struct Window *win, struct Gadget *gad, long vis, long total,
long top);
/* amiwind.c */
struct Window *OpenShWindow(struct NewWindow *nw);
void CloseShWindow(struct Window *win);
int ConvertKey(struct IntuiMessage *message);
int kbhit(void);
int amikbhit(void);
int WindowGetchar(void);
WETYPE WindowGetevent(void);
void amii_cleanup(void);
#ifndef SHAREDLIB
void Abort(long rc);
#endif
void CleanUp(void);
void flush_glyph_buffer(struct Window *w);
void amiga_print_glyph(winid window, int color_index, int glyph);
void start_glyphout(winid window);
void amii_end_glyphout(winid window);
struct NewWindow *DupNewWindow(struct NewWindow *win);
void FreeNewWindow(struct NewWindow *win);
void bell(void);
void amii_delay_output(void);
void amii_number_pad(int state);
#ifndef SHAREDLIB
void amiv_loadlib(void);
void amii_loadlib(void);
#endif
void preserve_icon(void);
void clear_icon(void);
/* winfuncs.c */
void amii_destroy_nhwindow(winid win);
int amii_create_nhwindow(int type);
void amii_init_nhwindows(int *, char **);
void amii_setdrawpens(struct Window *, int type);
void amii_sethipens(struct Window *, int type, int attr);
void amii_setfillpens(struct Window *, int type);
void amii_clear_nhwindow(winid win);
void dismiss_nhwindow(winid win);
void amii_exit_nhwindows(const char *str);
void amii_display_nhwindow(winid win, boolean blocking);
void amii_curs(winid window, int x, int y);
void kill_nhwindows(int all);
void amii_cl_end(struct amii_WinDesc *cw, int i);
void cursor_off(winid window);
void cursor_on(winid window);
void amii_suspend_nhwindows(const char *str);
void amii_resume_nhwindows(void);
void amii_bell(void);
void removetopl(int cnt);
void port_help(void);
void amii_print_glyph(winid win, coordxy x, coordxy y, const glyph_info *glyphinfo, const glyph_info *bkglyphinfo);
void amii_raw_print(const char *s);
void amii_raw_print_bold(const char *s);
void amii_update_inventory(int);
void amii_mark_synch(void);
void amii_wait_synch(void);
void amii_setclipped(void);
void amii_cliparound(int x, int y);
void amii_set_text_font(char *font, int size);
BitMapHeader ReadImageFile(const char *, struct BitMap **);
void FreeImageFile(struct BitMap **);
BitMapHeader ReadTileImageFiles(void);
void FreeTileImageFiles(void);
/* winami.c */
#ifdef SHAREDLIB
int __UserLibInit(void);
void __UserLibCleanup(void);
#endif
void amii_askname(void);
void amii_player_selection(void);
void RandomWindow(char *name);
int amii_get_ext_cmd(void);
char amii_yn_function(const char *query, const char *resp, char def);
void amii_display_file(const char *fn, boolean complain);
void SetBorder(struct Gadget *gd);
/* malloc/free provided by stdlib.h */
#ifdef SHAREDLIB
/* amilib.c */
void amii_loadlib(void);
void amiv_loadlib(void);
void CleanUp(void);
void setup_librefs(WinamiBASE *base);
#else
void Abort(long rc);
#endif
win_request_info *amii_ctrl_nhwindow(winid, int, win_request_info *);
/* amirip.c */
void amii_outrip(winid tmpwin, int how, time_t when);
/* winchar.c */
void SetMazeType(MazeType);
int GlyphToIcon(int glyph);
#ifdef OPT_DISPMAP
void dispmap_sanity(void);
int dispmap_sanity1(int);
#endif

1011
sys/amiga/winreq.c Normal file

File diff suppressed because it is too large Load Diff

485
sys/amiga/winstr.c Normal file
View File

@@ -0,0 +1,485 @@
/* NetHack 3.6 winstr.c $NHDT-Date: 1432512795 2015/05/25 00:13:15 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */
/* NetHack may be freely redistributed. See license for details. */
#ifndef CROSS_TO_AMIGA
#include "NH:sys/amiga/windefs.h"
#include "NH:sys/amiga/winext.h"
#include "NH:sys/amiga/winproto.h"
#else
#include "windefs.h"
#include "winext.h"
#include "winproto.h"
#endif
/* Put a string into the indicated window using the indicated attribute */
void
amii_putstr(winid window, int attr, const char *str)
{
int fudge;
int len;
struct Window *w;
register struct amii_WinDesc *cw;
char *ob;
int i, j, n0, bottom, totalvis, wheight;
static int wrapping = 0;
/* Always try to avoid a panic when there is no window */
if (window == WIN_ERR) {
window = WIN_BASE;
if (window == WIN_ERR)
window = WIN_BASE = amii_create_nhwindow(NHW_BASE);
}
if (window == WIN_ERR || (cw = amii_wins[window]) == NULL) {
iflags.window_inited = 0;
panic(winpanicstr, window, "putstr");
}
w = cw->win;
if (!str)
return;
amiIDisplay->lastwin = window; /* do we care??? */
/* NHW_MENU windows are not opened immediately, so check if we
* have the window pointer yet
*/
if (w) {
/* Set the drawing mode and pen colors */
SetDrMd(w->RPort, JAM2);
amii_sethipens(w, cw->type, attr);
} else if (cw->type != NHW_MENU && cw->type != NHW_TEXT) {
panic("NULL window pointer in putstr 2: %d", window);
}
/* Okay now do the work for each type */
switch (cw->type) {
case NHW_MESSAGE:
if (WINVERS_AMIV)
fudge = 2;
else {
/* 8 for --more--, 1 for preceeding sp, 1 for putstr pad */
fudge = 10;
}
/* There is a one pixel border at the borders, so subtract two */
bottom = amii_msgborder(w);
wheight = (w->Height - w->BorderTop - w->BorderBottom - 3)
/ w->RPort->TxHeight;
if (scrollmsg || wheight > 1)
fudge = 0;
amii_scrollmsg(w, cw);
while (isspace(*str))
str++;
strncpy(gt.toplines, str, TBUFSZ);
gt.toplines[TBUFSZ - 1] = 0;
/* For initial message to be visible, we need to explicitly position
* the
* cursor. This flag, cw->curx == -1 is set elsewhere to force the
* cursor to be repositioned to the "bottom".
*/
if (cw->curx == -1) {
amii_curs(WIN_MESSAGE, 1, bottom);
cw->curx = 0;
}
/* If used all of history lines, move them down */
if (cw->maxrow >= iflags.msg_history) {
if (cw->data[0])
free(cw->data[0]);
memcpy(cw->data, &cw->data[1],
(iflags.msg_history - 1) * sizeof(char *));
cw->data[iflags.msg_history - 1] =
(char *) alloc(strlen(gt.toplines) + SOFF + 4);
strcpy(cw->data[i = iflags.msg_history - 1] + SOFF
+ (scrollmsg != 0),
gt.toplines);
} else {
/* Otherwise, allocate a new one and copy the line in */
cw->data[cw->maxrow] = (char *) alloc(strlen(gt.toplines) + SOFF + 4);
strcpy(cw->data[i = cw->maxrow++] + SOFF + (scrollmsg != 0),
gt.toplines);
}
cw->data[i][SEL_ITEM] = 1;
cw->data[i][VATTR] = attr + 1;
if (scrollmsg) {
cw->curx = 0;
cw->data[i][2] = (cw->wflags & FLMSG_FIRST) ? '>' : ' ';
}
str = cw->data[i] + SOFF;
if (cw->curx + strlen(str) >= (cw->cols - fudge)) {
int i;
char *ostr = (char *) str;
char *p;
while (cw->curx + strlen(str) >= (cw->cols - fudge)) {
for (p = ((char *) &str[cw->cols - 1 - cw->curx]) - fudge;
!isspace(*p) && p > str;)
--p;
if (p < str)
p = (char *) str;
if (p == str) {
/* p = (char *)&str[ cw->cols ]; */
outmore(cw);
continue;
}
i = (long) p - (long) str;
outsubstr(cw, (char *) str, i, fudge);
cw->curx += i;
while (isspace(*p))
p++;
str = p;
#if 0
if( str != ostr ) {
outsubstr( cw, "+", 1, fudge );
cw->curx+=2;
}
#endif
if (*str)
amii_scrollmsg(w, cw);
amii_cl_end(cw, cw->curx);
}
if (*str) {
if (str != ostr) {
outsubstr(cw, "+", 1, fudge);
cw->curx += 2;
}
while (isspace(*str))
++str;
outsubstr(cw, (char *) str, i = strlen((char *) str), fudge);
cw->curx += i;
amii_cl_end(cw, cw->curx);
}
} else {
outsubstr(cw, (char *) str, i = strlen((char *) str), fudge);
cw->curx += i;
amii_cl_end(cw, cw->curx);
}
cw->wflags &= ~FLMSG_FIRST;
len = 0;
if (scrollmsg) {
totalvis = CountLines(window);
SetPropInfo(w, &MsgScroll,
(w->Height - w->BorderTop - w->BorderBottom)
/ w->RPort->TxHeight,
totalvis, totalvis);
}
i = strlen(gt.toplines + SOFF);
cw->maxcol = max(cw->maxcol, i);
cw->vwy = cw->maxrow;
break;
case NHW_STATUS:
if (cw->data[cw->cury] == NULL)
panic("NULL pointer for status window");
ob = &cw->data[cw->cury][j = cw->curx];
if (disp.botlx)
*ob = 0;
/* Display when beam at top to avoid flicker... */
WaitTOF();
{ int slen = strlen((char *) str);
if (slen > cw->cols) slen = cw->cols;
Text(w->RPort, (char *) str, slen);
}
if (cw->cols > strlen(str))
TextSpaces(w->RPort, cw->cols - strlen(str));
(void) strncpy(cw->data[cw->cury], str, cw->cols);
cw->data[cw->cury][cw->cols - 1] = '\0'; /* null terminate */
cw->cury = (cw->cury + 1) % 2;
cw->curx = 0;
break;
case NHW_MAP:
case NHW_BASE:
if (cw->type == NHW_BASE && wrapping) {
amii_curs(window, cw->curx + 1, cw->cury);
TextSpaces(w->RPort, cw->cols);
if (cw->cury < cw->rows) {
amii_curs(window, cw->curx + 1, cw->cury + 1);
TextSpaces(w->RPort, cw->cols);
cw->cury--;
}
}
amii_curs(window, cw->curx + 1, cw->cury);
Text(w->RPort, (char *) str, strlen((char *) str));
cw->curx = 0;
/* CR-LF is automatic in these windows */
cw->cury++;
if (cw->type == NHW_BASE && cw->cury >= cw->rows) {
cw->cury = 0;
wrapping = 1;
}
break;
case NHW_MENU:
case NHW_TEXT:
/* always grows one at a time, but alloc 12 at a time */
if (cw->cury >= cw->rows || !cw->data) {
char **tmp;
/* Allocate 12 more rows */
cw->rows += 12;
tmp = (char **) alloc(sizeof(char *) * cw->rows);
/* Copy the old lines */
for (i = 0; i < cw->cury; i++)
tmp[i] = cw->data[i];
if (cw->data) {
free(cw->data);
cw->data = NULL;
}
cw->data = tmp;
/* Null out the unused entries. */
for (i = cw->cury; i < cw->rows; i++)
cw->data[i] = 0;
}
if (!cw->data)
panic("no data storage");
/* Shouldn't need to do this, but... */
if (cw->data && cw->data[cw->cury]) {
free(cw->data[cw->cury]);
cw->data[cw->cury] = NULL;
}
n0 = strlen(str) + 1;
cw->data[cw->cury] = (char *) alloc(n0 + SOFF);
/* avoid nuls, for convenience */
cw->data[cw->cury][VATTR] = attr + 1;
cw->data[cw->cury][SEL_ITEM] = 0;
Strcpy(cw->data[cw->cury] + SOFF, str);
if (n0 > cw->maxcol)
cw->maxcol = n0;
if (++cw->cury > cw->maxrow)
cw->maxrow = cw->cury;
break;
default:
panic("Invalid or unset window type in putstr()");
}
}
void
amii_scrollmsg(struct Window *w, struct amii_WinDesc *cw)
{
int bottom, wheight;
bottom = amii_msgborder(w);
wheight =
(w->Height - w->BorderTop - w->BorderBottom - 3) / w->RPort->TxHeight;
if (scrollmsg) {
if (++cw->disprows > wheight) {
outmore(cw);
cw->disprows = 1; /* count this line... */
} else {
ScrollRaster(w->RPort, 0, w->RPort->TxHeight, w->BorderLeft,
w->BorderTop + 1, w->Width - w->BorderRight - 1,
w->Height - w->BorderBottom - 1);
}
amii_curs(WIN_MESSAGE, 1, bottom);
}
}
int
amii_msgborder(struct Window *w)
{
register int bottom;
/* There is a one pixel border at the borders, so subtract two */
bottom = w->Height - w->BorderTop - w->BorderBottom - 2;
bottom /= w->RPort->TxHeight;
if (bottom > 0)
--bottom;
return (bottom);
}
void
outmore(struct amii_WinDesc *cw)
{
struct Window *w = cw->win;
if ((cw->wflags & FLMAP_SKIP) == 0) {
if (scrollmsg) {
int bottom;
bottom = amii_msgborder(w);
ScrollRaster(w->RPort, 0, w->RPort->TxHeight, w->BorderLeft,
w->BorderTop + 1, w->Width - w->BorderRight - 1,
w->Height - w->BorderBottom - 1);
amii_curs(WIN_MESSAGE, 1, bottom); /* -1 for inner border */
Text(w->RPort, "--more--", 8);
} else
Text(w->RPort, " --more--", 9);
/* Make sure there are no events in the queue */
flushIDCMP(HackPort);
/* Allow mouse clicks to clear --more-- */
WindowGetchar();
if (lastevent.type == WEKEY && lastevent.un.key == '\33')
cw->wflags |= FLMAP_SKIP;
}
if (!scrollmsg) {
amii_curs(WIN_MESSAGE, 1, 0);
amii_cl_end(cw, cw->curx);
}
}
void
outsubstr(struct amii_WinDesc *cw, char *str, int len, int fudge)
{
struct Window *w = cw->win;
if (cw->curx) {
/* Check if this string and --more-- fit, if not,
* then put out --more-- and wait for a key.
*/
if ((len + fudge) + cw->curx >= cw->cols) {
if (!scrollmsg)
outmore(cw);
} else {
/* Otherwise, move and put out a blank separator */
Text(w->RPort, spaces, 1);
cw->curx += 1;
}
}
Text(w->RPort, str, len);
}
/* Put a graphics character onto the screen */
void
amii_putsym(winid st, int i, int y, CHAR_P c)
{
amii_curs(st, i, y);
Text(amii_wins[st]->win->RPort, &c, 1);
}
/* Add to the last line in the message window */
void
amii_addtopl(const char *s)
{
register struct amii_WinDesc *cw = amii_wins[WIN_MESSAGE];
while (*s) {
if (cw->curx == cw->cols - 1)
amii_putstr(WIN_MESSAGE, 0, "");
amii_putsym(WIN_MESSAGE, cw->curx + 1, amii_msgborder(cw->win), *s++);
cw->curx++;
}
}
void
TextSpaces(struct RastPort *rp, int nr)
{
if (nr < 1)
return;
while (nr > sizeof(spaces) - 1) {
Text(rp, spaces, (long) sizeof(spaces) - 1);
nr -= sizeof(spaces) - 1;
}
if (nr > 0)
Text(rp, spaces, (long) nr);
}
void
amii_remember_topl(void)
{
/* ignore for now. I think this will be done automatically by
* the code writing to the message window, but I could be wrong.
*/
}
int
amii_doprev_message(void)
{
struct amii_WinDesc *cw;
struct Window *w;
char *str;
if (WIN_MESSAGE == WIN_ERR || (cw = amii_wins[WIN_MESSAGE]) == NULL
|| (w = cw->win) == NULL) {
panic(winpanicstr, WIN_MESSAGE, "doprev_message");
}
/* When an interlaced/tall screen is in use, the scroll bar will be there
*/
/* Or in some other cases as well */
if (scrollmsg) {
struct Gadget *gd;
struct PropInfo *pip;
int hidden, topidx, i, total, wheight;
for (gd = w->FirstGadget; gd && gd->GadgetID != 1;)
gd = gd->NextGadget;
if (gd) {
pip = (struct PropInfo *) gd->SpecialInfo;
wheight = (w->Height - w->BorderTop - w->BorderBottom - 2)
/ w->RPort->TxHeight;
hidden = max(cw->maxrow - wheight, 0);
topidx = (((ULONG) hidden * pip->VertPot) + (MAXPOT / 2)) >> 16;
for (total = i = 0; i < cw->maxrow; ++i) {
if (cw->data[i][1] != 0)
++total;
}
i = 0;
topidx -= wheight / 4 + 1;
if (topidx < 0)
topidx = 0;
SetPropInfo(w, &MsgScroll, wheight, total, topidx);
DisplayData(WIN_MESSAGE, topidx);
}
return (0);
}
if (--cw->vwy < 0) {
cw->maxcol = 0;
DisplayBeep(NULL);
str = "\0\0No more history saved...";
} else
str = cw->data[cw->vwy];
amii_cl_end(cw, 0);
amii_curs(WIN_MESSAGE, 1, 0);
amii_setdrawpens(amii_wins[WIN_MESSAGE]->win, NHW_MESSAGE);
Text(w->RPort, str + SOFF, strlen(str + SOFF));
cw->curx = cw->cols + 1;
return (0);
}

346
sys/amiga/xpm2iff_host.c Normal file
View File

@@ -0,0 +1,346 @@
/* xpm2iff_host.c - host-side .xpm -> Amiga BMAP IFF converter.
* Copyright (c) 2026 by Ingo Paschke.
* NetHack may be freely redistributed. See license for details.
*
* Adapted from sys/amiga/xpm2iff.c, Copyright (c) 1995 by Gregg Wonderly.
* Rewritten for host-side cross-compilation using POSIX file I/O with
* explicit big-endian output instead of AmigaOS IFFParse library calls.
*
* Input: an XPM2 file, 1 char per pixel.
* Output: a BMAP IFF file readable by sys/amiga/winchar.c (tomb.iff).
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <ctype.h>
/* ------------------------------------------------------------------
* XPM screen descriptor and color translation table
* ------------------------------------------------------------------ */
static struct {
int Width;
int Height;
int Colors;
int BytesPerRow;
} XpmScreen;
/* Translation table: indexed by the single XPM character code.
* slot = output palette index (0-based)
* flag = 1 if this entry is valid
* r,g,b = RGB components (0-255) */
static struct {
unsigned char flag;
unsigned char r, g, b;
int slot;
} ttable[256];
/* ------------------------------------------------------------------
* XPM parsing
* Adapted directly from sys/amiga/xpm2iff.c (already POSIX).
* ------------------------------------------------------------------ */
static FILE *xpmfh;
#define XBUFSZ 2048
static char xbuf[XBUFSZ];
/* Read the next quoted line from the XPM file.
* Returns a pointer to the content between the first pair of double-quotes,
* or NULL on EOF. Trailing ", and whitespace are stripped. */
static char *
xpmgetline(void)
{
char *bp;
do {
if (fgets(xbuf, XBUFSZ, xpmfh) == NULL)
return NULL;
} while (xbuf[0] != '"');
/* strip trailing <",> and whitespace */
for (bp = xbuf; *bp; bp++)
;
bp--;
while (isspace((unsigned char)*bp))
bp--;
if (*bp == ',')
bp--;
if (*bp == '"')
bp--;
bp++;
*bp = '\0';
return &xbuf[1];
}
/* Open an XPM file and parse its header + color table.
* Populates XpmScreen and ttable[].
* Returns 1 on success, 0 on failure. */
static int
fopen_xpm_file(const char *fn)
{
int temp;
char *xb;
xpmfh = fopen(fn, "r");
if (!xpmfh)
return 0;
/* read dimensions header: "W H Colors 1" */
xb = xpmgetline();
if (!xb)
return 0;
if (sscanf(xb, "%d %d %d %d",
&XpmScreen.Width, &XpmScreen.Height,
&XpmScreen.Colors, &temp) != 4)
return 0;
if (temp != 1) {
fprintf(stderr, "xpm2iff_host: only 1 char/pixel XPM files supported\n");
return 0;
}
/* read color map: "%c c #rrggbb" */
{
int ccount = 0;
while (ccount < XpmScreen.Colors) {
char idx;
int r, g, b;
xb = xpmgetline();
if (!xb)
return 0;
if (sscanf(xb, "%c c #%2x%2x%2x", &idx, &r, &g, &b) != 4) {
fprintf(stderr, "xpm2iff_host: bad color entry: %s\n", xb);
return 0;
}
ttable[(unsigned char)idx].flag = 1;
ttable[(unsigned char)idx].r = (unsigned char)r;
ttable[(unsigned char)idx].g = (unsigned char)g;
ttable[(unsigned char)idx].b = (unsigned char)b;
ttable[(unsigned char)idx].slot = ccount;
ccount++;
}
}
return 1;
}
/* ------------------------------------------------------------------
* Bitplane packing
* ------------------------------------------------------------------ */
static char **planes;
#define SETBIT(plane, plane_offset, col, value) \
do { \
if (value) \
planes[plane][plane_offset + ((col) / 8)] \
|= (char)(1 << (7 - ((col) & 7))); \
} while (0)
static void
conv_image(int nplanes)
{
int row, col, planeno;
for (row = 0; row < XpmScreen.Height; row++) {
char *xb = xpmgetline();
int plane_offset;
if (!xb)
return;
plane_offset = row * XpmScreen.BytesPerRow;
for (col = 0; col < XpmScreen.Width; col++) {
int color = (unsigned char)xb[col];
int slot;
if (!ttable[color].flag) {
fprintf(stderr, "xpm2iff_host: bad image data at row %d col %d\n",
row, col);
continue;
}
slot = ttable[color].slot;
for (planeno = 0; planeno < nplanes; planeno++)
SETBIT(planeno, plane_offset, col, slot & (1 << planeno));
}
}
}
/* ------------------------------------------------------------------
* Big-endian IFF output helpers
* ------------------------------------------------------------------ */
static FILE *iff_out;
static void
wr32(uint32_t v)
{
fputc((v >> 24) & 0xff, iff_out);
fputc((v >> 16) & 0xff, iff_out);
fputc((v >> 8) & 0xff, iff_out);
fputc( v & 0xff, iff_out);
}
static void
write_chunk(const char *id, const void *data, uint32_t size)
{
fwrite(id, 1, 4, iff_out);
wr32(size);
fwrite(data, 1, size, iff_out);
if (size & 1)
fputc(0, iff_out);
}
/* ------------------------------------------------------------------
* main
* ------------------------------------------------------------------ */
int
main(int argc, char **argv)
{
int i, nplanes, colors;
uint32_t pbytes, plne_size, form_size;
if (argc != 3) {
fprintf(stderr, "Usage: %s source.xpm destination.iff\n", argv[0]);
return 1;
}
if (!fopen_xpm_file(argv[1])) {
fprintf(stderr, "%s: failed to open or parse XPM file\n", argv[1]);
return 1;
}
/* nplanes = ceil(log2(Colors)) */
nplanes = 0;
i = XpmScreen.Colors - 1;
while (i > 0) { nplanes++; i >>= 1; }
colors = 1 << nplanes;
XpmScreen.BytesPerRow = ((XpmScreen.Width + 15) / 16) * 2;
pbytes = (uint32_t)XpmScreen.BytesPerRow * (uint32_t)XpmScreen.Height;
/* Allocate zero-initialised bitplane buffers */
planes = malloc(nplanes * sizeof(char *));
if (!planes) { perror("malloc"); return 1; }
for (i = 0; i < nplanes; ++i) {
planes[i] = calloc(1, pbytes);
if (!planes[i]) { perror("calloc"); return 1; }
}
/* Pack pixel data into bitplanes */
conv_image(nplanes);
fclose(xpmfh);
/* Open output IFF file */
iff_out = fopen(argv[2], "wb");
if (!iff_out) { perror(argv[2]); return 1; }
/* Pre-compute FORM size:
* 4 (BMAP type tag)
* 8 + 20 (BMHD)
* 8 + 4 (CAMG)
* 8 + colors*3 (CMAP; colors is a power of 2, so colors*3 is even)
* 8 + 28 (PDAT: 7 x uint32_t)
* 8 + nplanes*pbytes (PLNE; pbytes is always even)
*/
plne_size = (uint32_t)nplanes * pbytes;
form_size = 4
+ (8 + 20)
+ (8 + 4)
+ (8 + (uint32_t)colors * 3)
+ (8 + 28)
+ (8 + plne_size);
/* FORM header */
fwrite("FORM", 1, 4, iff_out);
wr32(form_size);
fwrite("BMAP", 1, 4, iff_out);
/* BMHD chunk */
{
uint8_t bmhd[20];
uint8_t *p = bmhd;
uint16_t w = (uint16_t)XpmScreen.Width;
uint16_t h = (uint16_t)XpmScreen.Height;
p[0] = w >> 8; p[1] = w & 0xff; p += 2; /* w */
p[0] = h >> 8; p[1] = h & 0xff; p += 2; /* h */
memset(p, 0, 4); p += 4; /* x=0, y=0 */
*p++ = (uint8_t)nplanes; /* nPlanes */
*p++ = 0; /* masking: none */
*p++ = 0; /* compression: none */
*p++ = 0; /* reserved1 */
p[0] = 0; p[1] = 0; p += 2; /* transparentColor */
*p++ = 100; /* xAspect */
*p++ = 100; /* yAspect */
p[0] = 0; p[1] = 0; p += 2; /* pageWidth (not used) */
p[0] = 0; p[1] = 0; p += 2; /* pageHeight (not used) */
write_chunk("BMHD", bmhd, 20);
}
/* CAMG chunk: HIRES | LACE = 0x00008004 */
{
uint8_t camg[4] = { 0x00, 0x00, 0x80, 0x04 };
write_chunk("CAMG", camg, 4);
}
/* CMAP chunk: built from ttable (no color reordering for XPM images) */
{
uint8_t *cmap = calloc(colors, 3);
if (!cmap) { perror("calloc"); return 1; }
for (i = 0; i < 256; i++) {
if (ttable[i].flag) {
int s = ttable[i].slot;
cmap[s * 3 + 0] = ttable[i].r;
cmap[s * 3 + 1] = ttable[i].g;
cmap[s * 3 + 2] = ttable[i].b;
}
}
write_chunk("CMAP", cmap, (uint32_t)colors * 3);
free(cmap);
}
/* PDAT chunk: 7 x uint32_t big-endian
* nplanes, pbytes, across=0, down=0, npics=1, xsize=Width, ysize=Height */
{
uint32_t vals[7];
uint8_t pdat[28];
uint8_t *p = pdat;
vals[0] = (uint32_t)nplanes;
vals[1] = pbytes;
vals[2] = 0; /* across: not a tile sheet */
vals[3] = 0; /* down */
vals[4] = 1; /* npics */
vals[5] = (uint32_t)XpmScreen.Width;
vals[6] = (uint32_t)XpmScreen.Height;
for (i = 0; i < 7; i++) {
p[0] = (vals[i] >> 24) & 0xff;
p[1] = (vals[i] >> 16) & 0xff;
p[2] = (vals[i] >> 8) & 0xff;
p[3] = vals[i] & 0xff;
p += 4;
}
write_chunk("PDAT", pdat, 28);
}
/* PLNE chunk: concatenated bitplane data */
fwrite("PLNE", 1, 4, iff_out);
wr32(plne_size);
for (i = 0; i < nplanes; ++i)
fwrite(planes[i], 1, pbytes, iff_out);
if (plne_size & 1)
fputc(0, iff_out);
fclose(iff_out);
for (i = 0; i < nplanes; ++i) free(planes[i]);
free(planes);
printf("tomb.iff: %dx%d, %d colors (%d planes), %u bytes/plane\n",
XpmScreen.Width, XpmScreen.Height, colors, nplanes,
(unsigned)pbytes);
return 0;
}

View File

@@ -810,7 +810,7 @@ EM_JS(void, js_helpers_init, (), {
// used by update_inventory
function displayInventory() {
// Asyncify.handleAsync(async () => {
return _display_inventory(0, 0);
return _repopulate_perminvent();
// });
}

View File

@@ -42,7 +42,7 @@ II. There once was a time when people built NetHack right on their DOS machine.
a DOS-extender (for including in msdos packaging) from:
http://sandmann.dotster.com/cwsdpmi/csdpmi7b.zip
and Lua from:
http://www.lua.org/ftp/lua-5.4.6.tar.gz
http://www.lua.org/ftp/lua-5.4.8.tar.gz
If you want the DOSVGA build, to support higher resolutions and Unicode
symbols, you also need:
@@ -123,7 +123,7 @@ Appendix B - Common Difficulties Encountered
For example:
make CROSS_TO_MSDOS=1 package
( cd src ; make LUA_VERSION=5.4.6 nethack )
( cd src ; make LUA_VERSION=5.4.8 nethack )
make[1]: Entering directory '/home/johndoe/NHsource/src'
mkdir -p ../targets/msdos ; make ../targets/msdos/exceptn.o ;
make[2]: Entering directory '/home/johndoe/NHsource/src'

View File

@@ -56,7 +56,7 @@ endif
# Location of LUA
#
# Original source needs to be obtained from:
# http://www.lua.org/ftp/lua-5.4.6.tar.gz
# http://www.lua.org/ftp/lua-5.4.8.tar.gz
#
# This build assumes that the LUA sources are located
# at the specified location. If they are actually elsewhere
@@ -276,27 +276,27 @@ VOBJ02 = $(O)ball.o $(O)bones.o $(O)botl.o $(O)calendar.o $(O)cfgfile
VOBJ03 = $(O)cmd.o $(O)coloratt.o $(O)date.o $(O)dbridge.o $(O)decl.o
VOBJ04 = $(O)detect.o $(O)dig.o $(O)display.o $(O)do.o $(O)do_name.o
VOBJ05 = $(O)do_wear.o $(O)dog.o $(O)dogmove.o $(O)dokick.o $(O)dothrow.o
VOBJ06 = $(O)drawing.o $(O)dungeon.o $(O)eat.o $(O)end.o $(O)engrave.o
VOBJ07 = $(O)exper.o $(O)explode.o $(O)extralev.o $(O)files.o $(O)fountain.o
VOBJ08 = $(O)getpos.o $(O)glyphs.o $(O)getline.o $(O)hack.o $(O)hacklib.o
VOBJ09 = $(O)insight.o $(O)invent.o $(O)isaac64.o $(O)lock.o $(O)mail.o
VOBJ10 = $(O)main.o $(O)makemon.o $(O)mcastu.o $(O)mdlib.o $(O)mhitm.o
VOBJ11 = $(O)mhitu.o $(O)minion.o $(O)mkmap.o $(O)mklev.o $(O)mkmaze.o
VOBJ12 = $(O)mkobj.o $(O)mkroom.o $(O)mon.o $(O)mondata.o $(O)monmove.o
VOBJ13 = $(O)monst.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o $(O)music.o
VOBJ14 = $(O)o_init.o $(O)objects.o $(O)objnam.o $(O)options.o $(O)pickup.o
VOBJ15 = $(O)pline.o $(O)polyself.o $(O)potion.o $(O)quest.o $(O)questpgr.o
VOBJ16 = $(O)pager.o $(O)pray.o $(O)priest.o $(O)read.o $(O)rect.o
VOBJ17 = $(O)region.o $(O)report.o $(O)restore.o $(O)rip.o $(O)rnd.o
VOBJ18 = $(O)role.o $(O)rumors.o $(O)save.o $(O)selvar.o $(O)sfstruct.o
VOBJ19 = $(O)shk.o $(O)shknam.o $(O)sit.o $(O)sounds.o $(O)sp_lev.o
VOBJ20 = $(O)spell.o $(O)stairs.o $(O)steal.o $(O)steed.o $(O)symbols.o
VOBJ21 = $(O)sys.o $(O)teleport.o $(O)strutil.o $(O)termcap.o $(O)timeout.o
VOBJ22 = $(O)topl.o $(O)topten.o $(O)trap.o $(O)u_init.o $(O)uhitm.o
VOBJ23 = $(O)utf8map.o $(O)vault.o $(O)track.o $(O)vision.o $(O)weapon.o
VOBJ24 = $(O)were.o $(O)wield.o $(O)windows.o $(O)wintty.o $(O)wizard.o
VOBJ25 = $(O)wizcmds.o $(O)worm.o $(O)worn.o $(O)write.o $(O)zap.o
VOBJ26 = $(O)light.o $(O)dlb.o $(REGEX)
VOBJ06 = $(O)drawing.o $(O)dungeon.o $(O)earlyarg.o $(O)eat.o $(O)end.o
VOBJ07 = $(O)engrave.o $(O)exper.o $(O)explode.o $(O)extralev.o $(O)files.o
VOBJ08 = $(O)fountain.o $(O)getpos.o $(O)glyphs.o $(O)getline.o $(O)hack.o
VOBJ09 = $(O)hacklib.o $(O)iactions.o $(O)insight.o $(O)invent.o $(O)isaac64.o
VOBJ10 = $(O)lock.o $(O)mail.o $(O)main.o $(O)makemon.o $(O)mcastu.o
VOBJ11 = $(O)mdlib.o $(O)mhitm.o $(O)mhitu.o $(O)minion.o $(O)mkmap.o
VOBJ12 = $(O)mklev.o $(O)mkmaze.o $(O)mkobj.o $(O)mkroom.o $(O)mon.o
VOBJ13 = $(O)mondata.o $(O)monmove.o $(O)monst.o $(O)mplayer.o $(O)mthrowu.o
VOBJ14 = $(O)muse.o $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o
VOBJ15 = $(O)options.o $(O)pickup.o $(O)pline.o $(O)polyself.o $(O)potion.o
VOBJ16 = $(O)quest.o $(O)questpgr.o $(O)pager.o $(O)pray.o $(O)priest.o
VOBJ17 = $(O)read.o $(O)rect.o $(O)region.o $(O)report.o $(O)restore.o
VOBJ18 = $(O)rip.o $(O)rnd.o $(O)role.o $(O)rumors.o $(O)save.o
VOBJ19 = $(O)selvar.o $(O)sfstruct.o $(O)shk.o $(O)shknam.o $(O)sit.o
VOBJ20 = $(O)sounds.o $(O)sp_lev.o $(O)spell.o $(O)stairs.o $(O)steal.o
VOBJ21 = $(O)steed.o $(O)symbols.o $(O)sys.o $(O)teleport.o $(O)strutil.o
VOBJ22 = $(O)termcap.o $(O)timeout.o $(O)topl.o $(O)topten.o $(O)trap.o
VOBJ23 = $(O)u_init.o $(O)uhitm.o $(O)utf8map.o $(O)vault.o $(O)track.o
VOBJ24 = $(O)vision.o $(O)weapon.o $(O)were.o $(O)wield.o $(O)windows.o
VOBJ25 = $(O)wintty.o $(O)wizard.o $(O)wizcmds.o $(O)worm.o $(O)worn.o
VOBJ26 = $(O)write.o $(O)zap.o $(O)light.o $(O)dlb.o $(REGEX)
SOBJ = $(O)msdos.o $(O)pcsys.o $(O)tty.o $(O)unix.o \
$(O)video.o $(O)vidtxt.o $(O)pckeys.o
@@ -324,7 +324,7 @@ ALLOBJ = $(VOBJ) $(SOBJ) $(TILOBJ) $(TILOBJ2) $(VVOBJ)
#===============-=================================================
# LUA library
# Source from http://www.lua.org/ftp/lua-5.4.6.tar.gz
# Source from http://www.lua.org/ftp/lua-5.4.8.tar.gz
#=================================================================
LUASRC = $(LUATOP)/src
@@ -416,6 +416,7 @@ GLOBAL_H = $(PCCONF_H) $(INCL)/coord.h $(INCL)/global.h
HACK_H = $(CONFIG_H) $(INCL)/context.h $(DUNGEON_H) \
$(DECL_H) $(DISPLAY_H) $(INCL)/sym.h \
$(INCL)/defsym.h $(INCL)/mkroom.h $(INCL)/objclass.h \
$(INCL)/mcastu.h \
$(INCL)/trap.h $(INCL)/flag.h $(RM_H) \
$(INCL)/vision.h $(INCL)/wintype.h $(INCL)/engrave.h \
$(INCL)/rect.h $(INCL)/hack.h $(REGION_H) \
@@ -1388,6 +1389,7 @@ $(TARGETPFX)drawing.o: drawing.c $(CONFIG_H) ../include/color.h \
../include/objects.h ../include/wintype.h ../include/sym.h
$(TARGETPFX)dungeon.o: dungeon.c $(HACK_H) ../include/dgn_file.h \
../include/dlb.h
$(TARGETPFX)earlyarg.o: earlyarg.c $(HACK_H)
$(TARGETPFX)eat.o: eat.c $(HACK_H)
$(TARGETPFX)end.o: end.c $(HACK_H) ../include/dlb.h
$(TARGETPFX)engrave.o: engrave.c $(HACK_H)
@@ -1399,6 +1401,7 @@ $(TARGETPFX)files.o: files.c $(HACK_H) ../include/dlb.h ../include/wintty.h \
$(TARGETPFX)fountain.o: fountain.c $(HACK_H)
$(TARGETPFX)hack.o: hack.c $(HACK_H)
$(TARGETPFX)hacklib.o: hacklib.c $(HACK_H)
$(TARGETPFX)iactions.o: iactions.c $(HACK_H)
$(TARGETPFX)insight.o: insight.c $(HACK_H)
$(TARGETPFX)invent.o: invent.c $(HACK_H)
$(TARGETPFX)isaac64.o: isaac64.c $(CONFIG_H) ../include/isaac64.h
@@ -1406,7 +1409,7 @@ $(TARGETPFX)light.o: light.c $(HACK_H)
$(TARGETPFX)lock.o: lock.c $(HACK_H)
$(TARGETPFX)mail.o: mail.c $(HACK_H) ../include/mail.h
$(TARGETPFX)makemon.o: makemon.c $(HACK_H)
$(TARGETPFX)mcastu.o: mcastu.c $(HACK_H)
$(TARGETPFX)mcastu.o: mcastu.c $(HACK_H) ../include/mcastu.h
$(TARGETPFX)mdlib.o: mdlib.c $(CONFIG_H) ../include/permonst.h \
../include/align.h ../include/monattk.h ../include/monflag.h \
../include/monsters.h ../include/objclass.h \

View File

@@ -15,7 +15,7 @@ if [ -z "$GCCVER" ]; then
fi
if [ -z "$LUA_VERSION" ]; then
export LUA_VERSION=5.4.6
export LUA_VERSION=5.4.8
fi
if [ ! -d "$(pwd)/lib" ]; then

View File

@@ -449,7 +449,7 @@ filesize_nh(char *file)
* Chdrive() changes the default drive.
*/
void
chdrive(char *str)
chdrive(const char *str)
{
#define SELECTDISK 0x0E
char *ptr;

View File

@@ -174,28 +174,28 @@ term_curs_set(int visibility)
return;
if (!visibility) {
if (!iflags.grmode) {
if (!iflags.grmode) {
txt_hide_cursor();
#ifdef SCREEN_VGA
} else if (iflags.usevga) {
vga_hide_cursor();
} else if (iflags.usevga) {
vga_hide_cursor();
#endif
#ifdef SCREEN_VESA
} else if (iflags.usevesa) {
vesa_hide_cursor();
}
} else if (iflags.usevesa) {
vesa_hide_cursor();
}
#endif
} else if (visibility) {
if (!iflags.grmode) {
if (!iflags.grmode) {
txt_show_cursor();
#ifdef SCREEN_VGA
} else if (iflags.usevga) {
} else if (iflags.usevga) {
vga_show_cursor();
#endif
#ifdef SCREEN_VESA
} else if (iflags.usevesa) {
} else if (iflags.usevesa) {
vesa_show_cursor();
}
}
#endif
}
vis = visibility;

View File

@@ -128,6 +128,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
choose_windows(DEFAULT_WINDOW_SYS);
#if !defined(AMIGA) && !defined(GNUDOS)
/* Save current directory and make sure it gets restored when
* the game is exited.
@@ -147,6 +148,10 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
if (dir == (char *) 0)
dir = exepath(argv[0]);
#endif
#if defined(AMIGA) && defined(HACKDIR)
if (dir == (char *) 0)
dir = HACKDIR;
#endif
#ifdef _MSC_VER
if (IsDebuggerPresent()) {
static char exepath[_MAX_PATH];
@@ -666,7 +671,7 @@ nhusage(void)
#ifdef CHDIR
void
chdirx(char *dir, boolean wr)
chdirx(const char *dir, boolean wr)
{
#ifdef AMIGA
static char thisdir[] = "";

View File

@@ -43,7 +43,10 @@
*
* Modified 05 Jan 2024 to avoid K&R function declarations, marked KR_PROTO.
*
* $NHDT-Date: 1432512787 2015/05/25 00:13:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $
* Modified 09 Apr 2026 to change mode variable from (int) to (unsigned int)
* to match prototype of sscanf %o.
*
* $NHDT-Date: 1775744389 2026/04/09 14:19:49 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.21 $
*/
#ifndef lint
@@ -99,7 +102,7 @@ int
main(int argc, char **argv)
{
FILE *in, *out;
int mode;
unsigned int mode;
char dest[128];
char buf[80];

View File

@@ -198,7 +198,7 @@ ARFLAGS = rcs
# The Qt and Be window systems are written in C++, while the rest of
# NetHack is standard C. If using Qt, uncomment the LINK line here to get
# the C++ libraries linked in.
CXXFLAGS = $(CCXXFLAGS) -I. -I$(QTDIR)/include $(QTCXXFLAGS)
CXXFLAGS ?= $(CCXXFLAGS) -I. -I$(QTDIR)/include $(QTCXXFLAGS)
CXX ?= g++
MOC ?= moc
MOCPATH ?= $(QTDIR)/bin/$(MOC)
@@ -502,7 +502,7 @@ TARGET_HACKLIB = $(TARGETPFX)hacklib.a
MAKEDEFS = ../util/makedefs
# -lm required by lua
LUA_VERSION ?=5.4.6
LUA_VERSION ?=5.4.8
LUABASE = liblua-$(LUA_VERSION).a
LUALIB = ../lib/lua/$(LUABASE)
LUALIBS = $(LUALIB) -lm $(DLLIB)
@@ -517,9 +517,9 @@ HACK_H = ../src/hack.h-t
HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \
botl.c calendar.c cmd.c coloratt.c dbridge.c decl.c detect.c dig.c display.c \
dlb.c do.c do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c \
drawing.c dungeon.c eat.c end.c engrave.c exper.c explode.c \
drawing.c dungeon.c earlyarg.c eat.c end.c engrave.c exper.c explode.c \
extralev.c files.c fountain.c hack.c hacklib.c \
getpos.c glyphs.c insight.c invent.c isaac64.c light.c \
getpos.c glyphs.c iactions.c insight.c invent.c isaac64.c light.c \
lock.c mail.c makemon.c mcastu.c mdlib.c mhitm.c \
mhitu.c minion.c mklev.c mkmap.c mkmaze.c mkobj.c mkroom.c mon.c \
mondata.c monmove.c monst.c mplayer.c mthrowu.c muse.c music.c \
@@ -571,6 +571,7 @@ HACKINCL = align.h artifact.h artilist.h attrib.h botl.h \
color.h config.h config1.h context.h coord.h cstd.h decl.h \
defsym.h display.h dlb.h dungeon.h engrave.h extern.h flag.h \
fnamesiz.h func_tab.h global.h warnings.h hack.h lint.h mextra.h \
mcastu.h \
micro.h mfndpos.h mkroom.h monattk.h mondata.h monflag.h monst.h \
monsters.h nhmd4.h obj.h objects.h objclass.h optlist.h patchlevel.h \
pcconf.h permonst.h prop.h rect.h region.h savefile.h selvar.h sym.h \
@@ -597,21 +598,21 @@ HOBJ = $(TARGETPFX)allmain.o $(TARGETPFX)alloc.o \
$(TARGETPFX)dlb.o $(TARGETPFX)do.o $(TARGETPFX)do_name.o \
$(TARGETPFX)do_wear.o $(TARGETPFX)dog.o $(TARGETPFX)dogmove.o \
$(TARGETPFX)dokick.o $(TARGETPFX)dothrow.o $(TARGETPFX)drawing.o \
$(TARGETPFX)dungeon.o $(TARGETPFX)eat.o $(TARGETPFX)end.o \
$(TARGETPFX)engrave.o $(TARGETPFX)exper.o $(TARGETPFX)explode.o \
$(TARGETPFX)extralev.o $(TARGETPFX)files.o $(TARGETPFX)fountain.o \
$(TARGETPFX)getpos.o $(TARGETPFX)glyphs.o $(TARGETPFX)hack.o \
$(TARGETPFX)insight.o $(TARGETPFX)invent.o $(TARGETPFX)isaac64.o \
$(TARGETPFX)light.o $(TARGETPFX)lock.o $(TARGETPFX)mail.o \
$(TARGETPFX)makemon.o $(TARGETPFX)mcastu.o $(TARGETPFX)mdlib.o \
$(TARGETPFX)mhitm.o $(TARGETPFX)mhitu.o $(TARGETPFX)minion.o \
$(TARGETPFX)mklev.o $(TARGETPFX)mkmap.o $(TARGETPFX)mkmaze.o \
$(TARGETPFX)mkobj.o $(TARGETPFX)mkroom.o $(TARGETPFX)mon.o \
$(TARGETPFX)mondata.o $(TARGETPFX)monmove.o $(TARGETPFX)monst.o \
$(TARGETPFX)mplayer.o $(TARGETPFX)mthrowu.o $(TARGETPFX)muse.o \
$(TARGETPFX)music.o $(TARGETPFX)nhlua.o $(TARGETPFX)nhlsel.o \
$(TARGETPFX)nhlobj.o $(TARGETPFX)nhmd4.o \
$(TARGETPFX)objects.o $(TARGETPFX)o_init.o \
$(TARGETPFX)dungeon.o $(TARGETPFX)earlyarg.o $(TARGETPFX)eat.o \
$(TARGETPFX)end.o $(TARGETPFX)engrave.o $(TARGETPFX)exper.o \
$(TARGETPFX)explode.o $(TARGETPFX)extralev.o $(TARGETPFX)files.o \
$(TARGETPFX)fountain.o $(TARGETPFX)getpos.o $(TARGETPFX)glyphs.o \
$(TARGETPFX)hack.o $(TARGETPFX)iactions.o $(TARGETPFX)insight.o \
$(TARGETPFX)invent.o $(TARGETPFX)isaac64.o $(TARGETPFX)light.o \
$(TARGETPFX)lock.o $(TARGETPFX)mail.o $(TARGETPFX)makemon.o \
$(TARGETPFX)mcastu.o $(TARGETPFX)mdlib.o $(TARGETPFX)mhitm.o \
$(TARGETPFX)mhitu.o $(TARGETPFX)minion.o $(TARGETPFX)mklev.o \
$(TARGETPFX)mkmap.o $(TARGETPFX)mkmaze.o $(TARGETPFX)mkobj.o \
$(TARGETPFX)mkroom.o $(TARGETPFX)mon.o $(TARGETPFX)mondata.o \
$(TARGETPFX)monmove.o $(TARGETPFX)monst.o $(TARGETPFX)mplayer.o \
$(TARGETPFX)mthrowu.o $(TARGETPFX)muse.o $(TARGETPFX)music.o \
$(TARGETPFX)nhlua.o $(TARGETPFX)nhlsel.o $(TARGETPFX)nhlobj.o \
$(TARGETPFX)nhmd4.o $(TARGETPFX)objects.o $(TARGETPFX)o_init.o \
$(TARGETPFX)objnam.o $(TARGETPFX)options.o $(TARGETPFX)pager.o \
$(TARGETPFX)pickup.o $(TARGETPFX)pline.o $(TARGETPFX)polyself.o \
$(TARGETPFX)potion.o $(TARGETPFX)pray.o $(TARGETPFX)priest.o \
@@ -642,7 +643,11 @@ DATE_O = $(TARGETPFX)date.o
all: $(GAME)
@echo ""
pregame:
create_responsefiles:
echo $(CC_COMPILER_SWITCHES) >$(CC_RESPONSEFILE)
echo $(CXX_COMPILER_SWITCHES) >$(CXX_RESPONSEFILE)
pregame: $(RESPONSEFILES)
$(PREGAME)
$(GAME): pregame $(MAKEDEFS) $(LUALIB) $(WAVS) $(SYSTEM)
@@ -807,7 +812,8 @@ tags: $(CSOURCES)
clean:
-rm -f *.o $(HACK_H) $(CONFIG_H)
-rm -f monstr.c vis_tab.c ../include/vis_tab.h #obsolete generated files
true; $(CLEANMORE)
-true; $(CLEANMORE)
true; $(CLEAN_CC_RESPONSEFILE) $(CLEAN_CXX_RESPONSEFILE)
spotless: clean
-rm -f a.out core $(HACKLIB) $(GAMEBIN) Sys*
@@ -890,6 +896,7 @@ $(HACK_H): $(CONFIG_H) ../include/align.h ../include/artilist.h \
../include/decl.h ../include/defsym.h ../include/display.h \
../include/dungeon.h ../include/engrave.h ../include/flag.h \
../include/hack.h ../include/lint.h ../include/mextra.h \
../include/mcastu.h \
../include/mkroom.h ../include/monattk.h ../include/mondata.h \
../include/monflag.h ../include/monst.h ../include/monsters.h \
../include/nhlua.h ../include/obj.h ../include/objclass.h \
@@ -1158,6 +1165,7 @@ $(TARGETPFX)drawing.o: drawing.c $(CONFIG_H) ../include/defsym.h \
../include/sym.h ../include/wintype.h
$(TARGETPFX)dungeon.o: dungeon.c $(HACK_H) ../include/dgn_file.h \
../include/dlb.h
$(TARGETPFX)earlyarg.o: earlyarg.c $(HACK_H)
$(TARGETPFX)eat.o: eat.c $(HACK_H)
$(TARGETPFX)end.o: end.c $(HACK_H) ../include/dlb.h
$(TARGETPFX)engrave.o: engrave.c $(HACK_H)
@@ -1171,6 +1179,7 @@ $(TARGETPFX)getpos.o: getpos.c $(HACK_H)
$(TARGETPFX)glyphs.o: glyphs.c $(HACK_H)
$(TARGETPFX)hack.o: hack.c $(HACK_H)
$(TARGETPFX)hacklib.o: hacklib.c $(HACK_H)
$(TARGETPFX)iactions.o: iactions.c $(HACK_H)
$(TARGETPFX)insight.o: insight.c $(HACK_H)
$(TARGETPFX)invent.o: invent.c $(HACK_H)
$(TARGETPFX)isaac64.o: isaac64.c $(CONFIG_H) ../include/isaac64.h
@@ -1178,7 +1187,7 @@ $(TARGETPFX)light.o: light.c $(HACK_H)
$(TARGETPFX)lock.o: lock.c $(HACK_H)
$(TARGETPFX)mail.o: mail.c $(HACK_H) ../include/mail.h
$(TARGETPFX)makemon.o: makemon.c $(HACK_H)
$(TARGETPFX)mcastu.o: mcastu.c $(HACK_H)
$(TARGETPFX)mcastu.o: mcastu.c $(HACK_H) ../include/mcastu.h
$(TARGETPFX)mdlib.o: mdlib.c $(CONFIG_H) ../include/align.h \
../include/artilist.h ../include/attrib.h \
../include/context.h ../include/defsym.h ../include/dlb.h \

View File

@@ -85,7 +85,7 @@ VARDAT = $(VARDATD) $(VARDATND)
#CHGRP = chgrp
# Lua version
LUA_VERSION = 5.4.6
LUA_VERSION = 5.4.8
#
# end of configuration
@@ -440,6 +440,8 @@ update: $(PRECHECK) $(GAME) recover $(VARDAT) spec_levs sys/unix/sysconf
touch $(VARDIR)/perm $(VARDIR)/record
# sysconf, but only if it does not exist
true; $(SYSCONFENSURE)
# other steps from hints file
true; $(POSTUPDATE)
# and a reminder
@echo You may also want to install the man pages via the doc Makefile.

View File

@@ -394,8 +394,10 @@ $(TARGETPFX)sf-version.o: ../src/version.c $(HACK_H)
$(TARGETPFX)sf-worm.o: ../src/worm.c $(HACK_H)
$(TARGET_CC) $(TARGET_CFLAGS) $(SFFLAGS) -o $@ -c ../src/worm.c
sftags: sftags.o $(HACKLIB)
$(CLINK) $(LFLAGS) -o $@ sftags.o $(HACKLIB) $(LIBS)
sftags: sftags.o $(HACKLIB) $(TARGETPFX)sf-alloc.o $(TARGETPFX)panic.o
$(CLINK) $(LFLAGS) -o $@ sftags.o \
$(TARGETPFX)sf-alloc.o $(TARGETPFX)panic.o \
$(HACKLIB) $(LIBS)
sftags.o: sftags.c $(HACK_H)
$(CC) $(CFLAGS) -c sftags.c
../include/sfproto.h: sf.tags sftags

View File

@@ -202,12 +202,14 @@
BAE8015627B99CAE002B3786 /* lstrlib.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8013427B99CAD002B3786 /* lstrlib.c */; };
BAE8015727B99CAE002B3786 /* lzio.c in Sources */ = {isa = PBXBuildFile; fileRef = BAE8013527B99CAD002B3786 /* lzio.c */; };
BAE8015A27B9C872002B3786 /* date.c in Sources */ = {isa = PBXBuildFile; fileRef = 5439B3BB275AADC600B8FB2F /* date.c */; };
F50818312F6F564300D2AAFA /* iactions.c in Sources */ = {isa = PBXBuildFile; fileRef = F50818302F6F564300D2AAFA /* iactions.c */; };
F5457B212DED146B00039D83 /* hacklib.c in Sources */ = {isa = PBXBuildFile; fileRef = F5457B202DED146B00039D83 /* hacklib.c */; };
F5457B2C2DED16F200039D83 /* libhacklib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F5457B1C2DED143E00039D83 /* libhacklib.a */; };
F5457B2D2DED171800039D83 /* libhacklib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F5457B1C2DED143E00039D83 /* libhacklib.a */; };
F5857AA22DED026700A8CB4F /* version.c in Sources */ = {isa = PBXBuildFile; fileRef = 31B8A32721A238010055BD01 /* version.c */; };
F5857AA42DED032D00A8CB4F /* cfgfiles.c in Sources */ = {isa = PBXBuildFile; fileRef = F5857AA32DED032C00A8CB4F /* cfgfiles.c */; };
F5857AA62DED03BB00A8CB4F /* sfbase.c in Sources */ = {isa = PBXBuildFile; fileRef = F5857AA52DED03BB00A8CB4F /* sfbase.c */; };
F5E66A222F7D4B30000E30B7 /* earlyarg.c in Sources */ = {isa = PBXBuildFile; fileRef = F5E66A212F7D4B30000E30B7 /* earlyarg.c */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -561,40 +563,41 @@
54FB2B4A246310A600397C0E /* symbols.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = symbols.c; path = ../../src/symbols.c; sourceTree = "<group>"; };
54FCE8282223261F00F393C8 /* isaac64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = isaac64.c; path = ../../src/isaac64.c; sourceTree = "<group>"; };
BAE8010A27B97760002B3786 /* libnhlua.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libnhlua.a; sourceTree = BUILT_PRODUCTS_DIR; };
BAE8011427B99CAB002B3786 /* lopcodes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lopcodes.c; path = "../../lib/lua-5.4.6/src/lopcodes.c"; sourceTree = "<group>"; };
BAE8011527B99CAB002B3786 /* linit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = linit.c; path = "../../lib/lua-5.4.6/src/linit.c"; sourceTree = "<group>"; };
BAE8011627B99CAB002B3786 /* lobject.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lobject.c; path = "../../lib/lua-5.4.6/src/lobject.c"; sourceTree = "<group>"; };
BAE8011727B99CAC002B3786 /* loslib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = loslib.c; path = "../../lib/lua-5.4.6/src/loslib.c"; sourceTree = "<group>"; };
BAE8011827B99CAC002B3786 /* lcorolib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lcorolib.c; path = "../../lib/lua-5.4.6/src/lcorolib.c"; sourceTree = "<group>"; };
BAE8011927B99CAC002B3786 /* lutf8lib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lutf8lib.c; path = "../../lib/lua-5.4.6/src/lutf8lib.c"; sourceTree = "<group>"; };
BAE8011A27B99CAC002B3786 /* ltable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltable.c; path = "../../lib/lua-5.4.6/src/ltable.c"; sourceTree = "<group>"; };
BAE8011B27B99CAC002B3786 /* ltablib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltablib.c; path = "../../lib/lua-5.4.6/src/ltablib.c"; sourceTree = "<group>"; };
BAE8011C27B99CAC002B3786 /* llex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = llex.c; path = "../../lib/lua-5.4.6/src/llex.c"; sourceTree = "<group>"; };
BAE8011D27B99CAC002B3786 /* lcode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lcode.c; path = "../../lib/lua-5.4.6/src/lcode.c"; sourceTree = "<group>"; };
BAE8011E27B99CAC002B3786 /* lua.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua.c; path = "../../lib/lua-5.4.6/src/lua.c"; sourceTree = "<group>"; };
BAE8011F27B99CAC002B3786 /* ldo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldo.c; path = "../../lib/lua-5.4.6/src/ldo.c"; sourceTree = "<group>"; };
BAE8012027B99CAC002B3786 /* ldump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldump.c; path = "../../lib/lua-5.4.6/src/ldump.c"; sourceTree = "<group>"; };
BAE8012127B99CAC002B3786 /* lparser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lparser.c; path = "../../lib/lua-5.4.6/src/lparser.c"; sourceTree = "<group>"; };
BAE8012227B99CAC002B3786 /* lstate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstate.c; path = "../../lib/lua-5.4.6/src/lstate.c"; sourceTree = "<group>"; };
BAE8012327B99CAC002B3786 /* lapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lapi.c; path = "../../lib/lua-5.4.6/src/lapi.c"; sourceTree = "<group>"; };
BAE8012427B99CAC002B3786 /* ldebug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldebug.c; path = "../../lib/lua-5.4.6/src/ldebug.c"; sourceTree = "<group>"; };
BAE8012527B99CAC002B3786 /* lstring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstring.c; path = "../../lib/lua-5.4.6/src/lstring.c"; sourceTree = "<group>"; };
BAE8012627B99CAC002B3786 /* ltm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltm.c; path = "../../lib/lua-5.4.6/src/ltm.c"; sourceTree = "<group>"; };
BAE8012727B99CAC002B3786 /* lmem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lmem.c; path = "../../lib/lua-5.4.6/src/lmem.c"; sourceTree = "<group>"; };
BAE8012827B99CAC002B3786 /* lvm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lvm.c; path = "../../lib/lua-5.4.6/src/lvm.c"; sourceTree = "<group>"; };
BAE8012927B99CAC002B3786 /* lfunc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lfunc.c; path = "../../lib/lua-5.4.6/src/lfunc.c"; sourceTree = "<group>"; };
BAE8012A27B99CAC002B3786 /* lgc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lgc.c; path = "../../lib/lua-5.4.6/src/lgc.c"; sourceTree = "<group>"; };
BAE8012B27B99CAD002B3786 /* lundump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lundump.c; path = "../../lib/lua-5.4.6/src/lundump.c"; sourceTree = "<group>"; };
BAE8012C27B99CAD002B3786 /* lbaselib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lbaselib.c; path = "../../lib/lua-5.4.6/src/lbaselib.c"; sourceTree = "<group>"; };
BAE8012D27B99CAD002B3786 /* ldblib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldblib.c; path = "../../lib/lua-5.4.6/src/ldblib.c"; sourceTree = "<group>"; };
BAE8012E27B99CAD002B3786 /* lauxlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lauxlib.c; path = "../../lib/lua-5.4.6/src/lauxlib.c"; sourceTree = "<group>"; };
BAE8012F27B99CAD002B3786 /* liolib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = liolib.c; path = "../../lib/lua-5.4.6/src/liolib.c"; sourceTree = "<group>"; };
BAE8013027B99CAD002B3786 /* lctype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lctype.c; path = "../../lib/lua-5.4.6/src/lctype.c"; sourceTree = "<group>"; };
BAE8013127B99CAD002B3786 /* luac.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = luac.c; path = "../../lib/lua-5.4.6/src/luac.c"; sourceTree = "<group>"; };
BAE8013227B99CAD002B3786 /* loadlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = loadlib.c; path = "../../lib/lua-5.4.6/src/loadlib.c"; sourceTree = "<group>"; };
BAE8013327B99CAD002B3786 /* lmathlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lmathlib.c; path = "../../lib/lua-5.4.6/src/lmathlib.c"; sourceTree = "<group>"; };
BAE8013427B99CAD002B3786 /* lstrlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstrlib.c; path = "../../lib/lua-5.4.6/src/lstrlib.c"; sourceTree = "<group>"; };
BAE8013527B99CAD002B3786 /* lzio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lzio.c; path = "../../lib/lua-5.4.6/src/lzio.c"; sourceTree = "<group>"; };
BAE8011427B99CAB002B3786 /* lopcodes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lopcodes.c; path = "../../lib/lua-5.4.8/src/lopcodes.c"; sourceTree = "<group>"; };
BAE8011527B99CAB002B3786 /* linit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = linit.c; path = "../../lib/lua-5.4.8/src/linit.c"; sourceTree = "<group>"; };
BAE8011627B99CAB002B3786 /* lobject.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lobject.c; path = "../../lib/lua-5.4.8/src/lobject.c"; sourceTree = "<group>"; };
BAE8011727B99CAC002B3786 /* loslib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = loslib.c; path = "../../lib/lua-5.4.8/src/loslib.c"; sourceTree = "<group>"; };
BAE8011827B99CAC002B3786 /* lcorolib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lcorolib.c; path = "../../lib/lua-5.4.8/src/lcorolib.c"; sourceTree = "<group>"; };
BAE8011927B99CAC002B3786 /* lutf8lib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lutf8lib.c; path = "../../lib/lua-5.4.8/src/lutf8lib.c"; sourceTree = "<group>"; };
BAE8011A27B99CAC002B3786 /* ltable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltable.c; path = "../../lib/lua-5.4.8/src/ltable.c"; sourceTree = "<group>"; };
BAE8011B27B99CAC002B3786 /* ltablib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltablib.c; path = "../../lib/lua-5.4.8/src/ltablib.c"; sourceTree = "<group>"; };
BAE8011C27B99CAC002B3786 /* llex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = llex.c; path = "../../lib/lua-5.4.8/src/llex.c"; sourceTree = "<group>"; };
BAE8011D27B99CAC002B3786 /* lcode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lcode.c; path = "../../lib/lua-5.4.8/src/lcode.c"; sourceTree = "<group>"; };
BAE8011E27B99CAC002B3786 /* lua.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua.c; path = "../../lib/lua-5.4.8/src/lua.c"; sourceTree = "<group>"; };
BAE8011F27B99CAC002B3786 /* ldo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldo.c; path = "../../lib/lua-5.4.8/src/ldo.c"; sourceTree = "<group>"; };
BAE8012027B99CAC002B3786 /* ldump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldump.c; path = "../../lib/lua-5.4.8/src/ldump.c"; sourceTree = "<group>"; };
BAE8012127B99CAC002B3786 /* lparser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lparser.c; path = "../../lib/lua-5.4.8/src/lparser.c"; sourceTree = "<group>"; };
BAE8012227B99CAC002B3786 /* lstate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstate.c; path = "../../lib/lua-5.4.8/src/lstate.c"; sourceTree = "<group>"; };
BAE8012327B99CAC002B3786 /* lapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lapi.c; path = "../../lib/lua-5.4.8/src/lapi.c"; sourceTree = "<group>"; };
BAE8012427B99CAC002B3786 /* ldebug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldebug.c; path = "../../lib/lua-5.4.8/src/ldebug.c"; sourceTree = "<group>"; };
BAE8012527B99CAC002B3786 /* lstring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstring.c; path = "../../lib/lua-5.4.8/src/lstring.c"; sourceTree = "<group>"; };
BAE8012627B99CAC002B3786 /* ltm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltm.c; path = "../../lib/lua-5.4.8/src/ltm.c"; sourceTree = "<group>"; };
BAE8012727B99CAC002B3786 /* lmem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lmem.c; path = "../../lib/lua-5.4.8/src/lmem.c"; sourceTree = "<group>"; };
BAE8012827B99CAC002B3786 /* lvm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lvm.c; path = "../../lib/lua-5.4.8/src/lvm.c"; sourceTree = "<group>"; };
BAE8012927B99CAC002B3786 /* lfunc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lfunc.c; path = "../../lib/lua-5.4.8/src/lfunc.c"; sourceTree = "<group>"; };
BAE8012A27B99CAC002B3786 /* lgc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lgc.c; path = "../../lib/lua-5.4.8/src/lgc.c"; sourceTree = "<group>"; };
BAE8012B27B99CAD002B3786 /* lundump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lundump.c; path = "../../lib/lua-5.4.8/src/lundump.c"; sourceTree = "<group>"; };
BAE8012C27B99CAD002B3786 /* lbaselib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lbaselib.c; path = "../../lib/lua-5.4.8/src/lbaselib.c"; sourceTree = "<group>"; };
BAE8012D27B99CAD002B3786 /* ldblib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldblib.c; path = "../../lib/lua-5.4.8/src/ldblib.c"; sourceTree = "<group>"; };
BAE8012E27B99CAD002B3786 /* lauxlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lauxlib.c; path = "../../lib/lua-5.4.8/src/lauxlib.c"; sourceTree = "<group>"; };
BAE8012F27B99CAD002B3786 /* liolib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = liolib.c; path = "../../lib/lua-5.4.8/src/liolib.c"; sourceTree = "<group>"; };
BAE8013027B99CAD002B3786 /* lctype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lctype.c; path = "../../lib/lua-5.4.8/src/lctype.c"; sourceTree = "<group>"; };
BAE8013127B99CAD002B3786 /* luac.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = luac.c; path = "../../lib/lua-5.4.8/src/luac.c"; sourceTree = "<group>"; };
BAE8013227B99CAD002B3786 /* loadlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = loadlib.c; path = "../../lib/lua-5.4.8/src/loadlib.c"; sourceTree = "<group>"; };
BAE8013327B99CAD002B3786 /* lmathlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lmathlib.c; path = "../../lib/lua-5.4.8/src/lmathlib.c"; sourceTree = "<group>"; };
BAE8013427B99CAD002B3786 /* lstrlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstrlib.c; path = "../../lib/lua-5.4.8/src/lstrlib.c"; sourceTree = "<group>"; };
BAE8013527B99CAD002B3786 /* lzio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lzio.c; path = "../../lib/lua-5.4.8/src/lzio.c"; sourceTree = "<group>"; };
F50818302F6F564300D2AAFA /* iactions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = iactions.c; path = ../../src/iactions.c; sourceTree = "<group>"; };
F515A6F32DED074D006E1F63 /* sfctool.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sfctool.c; path = ../../util/sfctool.c; sourceTree = "<group>"; };
F515A6F52DED0916006E1F63 /* date.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = date.c; path = ../../src/date.c; sourceTree = "<group>"; };
F515A6F62DED0916006E1F63 /* sfbase.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sfbase.c; path = ../../src/sfbase.c; sourceTree = "<group>"; };
@@ -632,6 +635,7 @@
F54C1AE42E43D22A006CAA8E /* sfprocs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sfprocs.h; path = ../../include/include/sfprocs.h; sourceTree = "<group>"; };
F5857AA32DED032C00A8CB4F /* cfgfiles.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cfgfiles.c; path = ../../src/cfgfiles.c; sourceTree = "<group>"; };
F5857AA52DED03BB00A8CB4F /* sfbase.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = sfbase.c; path = ../../src/sfbase.c; sourceTree = "<group>"; };
F5E66A212F7D4B30000E30B7 /* earlyarg.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = earlyarg.c; path = ../../src/earlyarg.c; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
@@ -691,6 +695,8 @@
3189576821A1FCC100FB2ABE = {
isa = PBXGroup;
children = (
F5E66A212F7D4B30000E30B7 /* earlyarg.c */,
F50818302F6F564300D2AAFA /* iactions.c */,
F515A73B2DED0B47006E1F63 /* hacklib.c */,
F5457B202DED146B00039D83 /* hacklib.c */,
F515A72A2DED0A7C006E1F63 /* sftags.c */,
@@ -1570,6 +1576,7 @@
"$(NH_DAT_DIR)/bigrm-10.lua",
"$(NH_DAT_DIR)/bigrm-11.lua",
"$(NH_DAT_DIR)/bigrm-12.lua",
"$(NH_DAT_DIR)/bigrm-13.lua",
"$(NH_DAT_DIR)/bigrm-2.lua",
"$(NH_DAT_DIR)/bigrm-3.lua",
"$(NH_DAT_DIR)/bigrm-4.lua",
@@ -1872,6 +1879,7 @@
31B8A41321A23F650055BD01 /* version.c in Sources */,
31B8A3BB21A238060055BD01 /* allmain.c in Sources */,
31B8A39521A238060055BD01 /* windows.c in Sources */,
F5E66A222F7D4B30000E30B7 /* earlyarg.c in Sources */,
31B8A38621A238060055BD01 /* mondata.c in Sources */,
31B8A41921A244940055BD01 /* objects.c in Sources */,
31B8A3AA21A238060055BD01 /* wizard.c in Sources */,
@@ -1979,6 +1987,7 @@
31B8A38421A238060055BD01 /* do_name.c in Sources */,
31B8A3C421A238060055BD01 /* apply.c in Sources */,
31B8A3F721A23DD10055BD01 /* unixres.c in Sources */,
F50818312F6F564300D2AAFA /* iactions.c in Sources */,
31B8A3BD21A238060055BD01 /* files.c in Sources */,
31B8A39221A238060055BD01 /* do_wear.c in Sources */,
31B8A3E521A238B30055BD01 /* dlb.c in Sources */,
@@ -2189,7 +2198,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../include";
LUA_VERSION = 5.4.6;
LUA_VERSION = 5.4.8;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
@@ -2272,7 +2281,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../include";
LUA_VERSION = 5.4.6;
LUA_VERSION = 5.4.8;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;

View File

@@ -104,7 +104,8 @@ additional interfaces. See below.
| | | | support in your build. |
| | | | |
| | | | One possible way: |
| | | | brew install Qt |
| | | | brew install pkg-config |
| | | | brew install Qt6 |
|----------+-------+-----------------+--------------------------------------|
| Linux | tty | WANT_WIN_TTY | |
| (Ubuntu) | | | |

View File

@@ -49,7 +49,10 @@ make musl=1 Build with settings appropriate for linking with
musl libc, instead of glibc. This causes
NOCRASHREPORT to be defined, and avoids the use
of 'col' during the build.
make resp=1 Place the majority of the compiler switches into
a response file to de-clutter the build compiler
command lines and eliminate some of the
unsightly wrapping that occurs.
make CROSS_TO_MSDOS=1 package Cross-compile for an MSDOS target package.
make CROSS_TO_WASM=1 Cross-compile for a WASM target.
make CROSS_TO_MIPS=1 Cross-compile for a mips target.

View File

@@ -55,6 +55,7 @@ CFLAGS+=-Wall -Wextra \
CFLAGS+=-pedantic
CFLAGS+=-Wmissing-declarations
#CFLAGS+=-Wformat=2
#CFLAGS+=-Wdiscarded-qualifiers
# these are left out of the C++ flags
CFLAGS+=-Wformat-nonliteral
@@ -98,6 +99,7 @@ CXX=clang++ -std=gnu++11
# clang-specific follows
CLANGGTEQ12 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 12)
CLANGGTEQ14 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 14)
CLANGGTEQ21 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 21)
ifeq "$(CLANGGTEQ12)" "1"
CFLAGS+=-Wimplicit-fallthrough
endif
@@ -109,6 +111,9 @@ else
# older versions complain about things newer ones don't without this
CFLAGS+=-Wno-missing-field-initializers
endif
ifeq "$(CLANGGTEQ21)" "1"
CFLAGS+=-Wno-deprecated-octal-literals
endif
# none
endif # clang-specific ends here
@@ -230,6 +235,20 @@ ifeq "$(C23)" "1"
HAVECSTD=c2x
endif
ifeq "$(c2x)" "1"
HAVECSTD=c2x
endif
ifeq "$(C2X)" "1"
HAVECSTD=c2x
endif
ifeq "$(c2y)" "1"
HAVECSTD=c2y
endif
ifeq "$(C2Y)" "1"
HAVECSTD=c2y
endif
ifneq "$(HAVECSTD)" ""
CSTD = -std=$(HAVECSTD)
endif

View File

@@ -57,14 +57,14 @@ dospkg: dodata dosfonts $(GAMEBIN) $(TARGETPFX)recover.exe ../dat/nhtiles.bmp
cp ../sys/share/NetHack.cnf $(TARGETPFX)pkg/NETHACK.CNF
cp ../sys/msdos/sysconf $(TARGETPFX)pkg/SYSCONF
cp ../doc/nethack.txt $(TARGETPFX)pkg/NETHACK.TXT
cp $(DOSFONT)/ter-u16b.psf $(TARGETPFX)pkg/TER-U16B.PSF
cp $(DOSFONT)/ter-u16v.psf $(TARGETPFX)pkg/TER-U16V.PSF
cp $(DOSFONT)/ter-u18b.psf $(TARGETPFX)pkg/TER-U18B.PSF
cp $(DOSFONT)/ter-u20b.psf $(TARGETPFX)pkg/TER-U20B.PSF
cp $(DOSFONT)/ter-u22b.psf $(TARGETPFX)pkg/TER-U22B.PSF
cp $(DOSFONT)/ter-u24b.psf $(TARGETPFX)pkg/TER-U24B.PSF
cp $(DOSFONT)/ter-u28b.psf $(TARGETPFX)pkg/TER-U28B.PSF
cp $(DOSFONT)/ter-u32b.psf $(TARGETPFX)pkg/TER-U32B.PSF
-cp $(DOSFONT)/ter-u16b.psf $(TARGETPFX)pkg/TER-U16B.PSF
-cp $(DOSFONT)/ter-u16v.psf $(TARGETPFX)pkg/TER-U16V.PSF
-cp $(DOSFONT)/ter-u18b.psf $(TARGETPFX)pkg/TER-U18B.PSF
-cp $(DOSFONT)/ter-u20b.psf $(TARGETPFX)pkg/TER-U20B.PSF
-cp $(DOSFONT)/ter-u22b.psf $(TARGETPFX)pkg/TER-U22B.PSF
-cp $(DOSFONT)/ter-u24b.psf $(TARGETPFX)pkg/TER-U24B.PSF
-cp $(DOSFONT)/ter-u28b.psf $(TARGETPFX)pkg/TER-U28B.PSF
-cp $(DOSFONT)/ter-u32b.psf $(TARGETPFX)pkg/TER-U32B.PSF
cp ../lib/djgpp/cwsdpmi/bin/CWSDPMI.EXE $(TARGETPFX)pkg/CWSDPMI.EXE
( if [ -f ../lib/djgpp/target/bin/symify.exe ]; then \
cp ../lib/djgpp/target/bin/symify.exe $(TARGETPFX)pkg/SYMIFY.EXE; \
@@ -229,6 +229,113 @@ mipspkg: dodata $(GAMEBIN) $(TARGETPFX)recover
@echo MIPS package zip file $(TARGETPFX)nh370mips.zip
endif # CROSS_TO_MIPS
ifdef CROSS_TO_AMIGA
$(TARGETPFX)amidos.o : ../sys/amiga/amidos.c $(HACK_H)
$(TARGETPFX)amigst.o : ../sys/amiga/amigst.c $(HACK_H)
$(TARGETPFX)amirip.o : ../sys/amiga/amirip.c $(HACK_H)
$(TARGETPFX)amistack.o : ../sys/amiga/amistack.c $(HACK_H)
$(TARGETPFX)amitty.o : ../sys/amiga/amitty.c $(HACK_H)
$(TARGETPFX)amiwind.o : ../sys/amiga/amiwind.c \
../sys/amiga/amimenu.c $(HACK_H)
$(TARGETPFX)winami.o : ../sys/amiga/winami.c $(HACK_H)
$(TARGETPFX)winchar.o : ../sys/amiga/winchar.c tile.c $(HACK_H)
$(TARGETPFX)winfuncs.o : ../sys/amiga/winfuncs.c $(HACK_H)
$(TARGETPFX)winkey.o : ../sys/amiga/winkey.c $(HACK_H)
$(TARGETPFX)winamenu.o : ../sys/amiga/winamenu.c $(HACK_H)
$(TARGETPFX)winreq.o : ../sys/amiga/winreq.c \
../sys/amiga/colorwin.c \
../sys/amiga/clipwin.c $(HACK_H)
$(TARGETPFX)winstr.o : ../sys/amiga/winstr.c $(HACK_H)
$(GAMEBIN) : $(HOBJ) $(LUACROSSLIB)
$(TARGET_LINK) $(TARGET_LFLAGS) -o $(GAMEBIN) \
$(HOBJ) $(WINLIB) $(TARGET_LIBS)
#
# Host-side IFF tile conversion tools (run on Linux, produce Amiga IFF files)
#
AMISRC = ../sys/amiga
$(TARGETPFX)xpm2iff_host: $(AMISRC)/xpm2iff_host.c
$(CC) $(CFLAGS) -o $@ $<
$(TARGETPFX)tomb.iff: $(AMISRC)/grave16.xpm $(TARGETPFX)xpm2iff_host
$(TARGETPFX)xpm2iff_host $(AMISRC)/grave16.xpm $@
$(TARGETPFX)bmp2iff_host: $(AMISRC)/bmp2iff_host.c
$(CC) $(CFLAGS) -o $@ $<
$(TARGETPFX)tiles16.iff: ../dat/nhtiles.bmp $(TARGETPFX)bmp2iff_host
$(TARGETPFX)bmp2iff_host -planes 4 ../dat/nhtiles.bmp $@
$(TARGETPFX)tiles32.iff: ../dat/nhtiles.bmp $(TARGETPFX)bmp2iff_host
$(TARGETPFX)bmp2iff_host -planes 5 ../dat/nhtiles.bmp $@
AMITILES = $(TARGETPFX)tiles16.iff $(TARGETPFX)tiles32.iff $(TARGETPFX)tomb.iff
AMIREGEX_URL = https://github.com/garyhouston/regex.git
AMIREGEX_SRCDIR = $(AMISRC)/regex
.PHONY: fetch-regex amigapkg amitiles
fetch-regex:
@DSTDIR=sys/amiga/regex; \
if [ ! -d src ]; then DSTDIR=../$$DSTDIR; fi; \
if [ -f $$DSTDIR/regcomp.c ]; then \
echo "BSD regex already present"; \
else \
echo "Fetching BSD regex from $(AMIREGEX_URL)"; \
tmpdir=$$(mktemp -d) && \
git clone --depth 1 $(AMIREGEX_URL) $$tmpdir && \
cd $$tmpdir && \
sh ./mkh -p regcomp.c > regcomp.ih && \
sh ./mkh -p engine.c > engine.ih && \
sh ./mkh -p regexec.c > regexec.ih && \
sh ./mkh -p regerror.c > regerror.ih && \
sh ./mkh -i _REGEX_H_ regex2.h regcomp.c \
regexec.c regerror.c regfree.c > regex.h && \
cd - > /dev/null && \
mkdir -p $$DSTDIR && \
for f in regcomp.c regexec.c regerror.c regfree.c \
engine.c regex.h regex2.h cclass.h cname.h \
utils.h regcomp.ih engine.ih regexec.ih \
regerror.ih \
COPYRIGHT; do \
cp $$tmpdir/$$f $$DSTDIR/; \
done && \
rm -rf $$tmpdir && \
echo "BSD regex installed in $$DSTDIR"; \
fi
amitiles: $(AMITILES)
UUDECODE = ../util/uudecode
../util/uudecode: ../sys/share/uudecode.c
$(CC) $(CFLAGS) -o $@ $<
amigapkg: $(AMITILES) ../util/uudecode
mkdir -p $(TARGETPFX)pkg/tiles $(TARGETPFX)pkg/hack
cp $(GAMEBIN) $(TARGETPFX)pkg/nethack
cp ../dat/nhdat $(TARGETPFX)pkg/nhdat
cp ../dat/license $(TARGETPFX)pkg/license
cp ../dat/symbols $(TARGETPFX)pkg/symbols
cp $(TARGETPFX)tiles16.iff $(TARGETPFX)pkg/tiles/tiles16.iff
cp $(TARGETPFX)tiles32.iff $(TARGETPFX)pkg/tiles/tiles32.iff
cp $(TARGETPFX)tomb.iff $(TARGETPFX)pkg/tomb.iff
cp ../sys/msdos/sysconf $(TARGETPFX)pkg/sysconf
cp ../doc/nethack.txt $(TARGETPFX)pkg/nethack.txt
( cd $(TARGETPFX)pkg && ../../../util/uudecode ../../../sys/amiga/amifont8.uu && mv 8 hack/8 )
( cd $(TARGETPFX)pkg && ../../../util/uudecode ../../../sys/amiga/amifont.uu )
cp $(AMISRC)/nethack.cnf $(TARGETPFX)pkg/nethack.cnf
-( cd $(TARGETPFX)pkg && test -f ../../../sys/amiga/dflticon.uu && \
../../../util/uudecode ../../../sys/amiga/dflticon.uu )
-( cd $(TARGETPFX)pkg && test -f ../../../sys/amiga/NHinfo.uu && \
../../../util/uudecode ../../../sys/amiga/NHinfo.uu )
-( cd $(TARGETPFX)pkg && test -f ../../../sys/amiga/NewGame.uu && \
../../../util/uudecode ../../../sys/amiga/NewGame.uu )
-( cd $(TARGETPFX)pkg && test -f ../../../sys/amiga/HackWB.uu && \
../../../util/uudecode ../../../sys/amiga/HackWB.uu )
touch $(TARGETPFX)pkg/record
( cd $(TARGETPFX)pkg && zip -9r ../NH370AMI.ZIP * )
@echo amiga package zip file $(TARGETPFX)NH370AMI.ZIP
endif # CROSS_TO_AMIGA
ifdef CROSS_SHARED
# shared file dependencies
$(TARGETPFX)pcmain.o : ../sys/share/pcmain.c $(HACK_H)

View File

@@ -38,6 +38,16 @@ override TARGETPFX = $(TARGETDIR)/
override TARGET_LIBS=
endif
ifdef CROSS_TO_AMIGA
CROSS=1
BUILD_TARGET_LUA=1
CROSS_SHARED=1
override TARGET = amiga
override TARGETDIR=../targets/$(TARGET)
override TARGETPFX = $(TARGETDIR)/
override TARGET_LIBS=
endif
ifdef CROSS
override PREGAME=
override BUILDMORE=

View File

@@ -7,9 +7,9 @@
ifdef BUILD_TARGET_LUA
#===============-=================================================
# LUA library
# Source from http://www.lua.org/ftp/lua-5.4.6.tar.gz
# Source from http://www.lua.org/ftp/lua-5.4.8.tar.gz
#=================================================================
LUA_VERSION ?=5.4.6
LUA_VERSION ?=5.4.8
LUATOP ?= ../lib/lua-$(LUA_VERSION)
LUASRCDIR ?= $(LUATOP)/src
LUAOBJFILES1 = $(TARGETPFX)lapi.o $(TARGETPFX)lauxlib.o \
@@ -119,7 +119,7 @@ ifdef CROSS_TO_MSDOS
# 2. Then
# make CROSS_TO_MSDOS=1 WANT_WIN_TTY=1 WANT_WIN_CURSES=1 all
#
# Source from http://www.lua.org/ftp/lua-5.4.6.tar.gz
# Source from http://www.lua.org/ftp/lua-5.4.8.tar.gz
#=================================================================
CFLAGS += -DCROSSCOMPILE
@@ -188,6 +188,7 @@ MSDOS_TARGET_CXXFLAGS = -c -O $(DBGFLAGS) -I../include -I../sys/msdos -I../win/s
PDCINCL += -I$(PDCPORT)
PDC_TARGET_CFLAGS = $(MSDOS_TARGET_CFLAGS) -Wno-unused-parameter \
-Wno-missing-prototypes
ifndef SKIP_FONTS_IN_CI
FONTVER = terminus-font-4.49.1
FONTTOP = ../lib/$(FONTVER)
DOSFONT = ../sys/msdos/fonts
@@ -195,6 +196,9 @@ FONTTARGETS = $(DOSFONT)/ter-u16b.psf $(DOSFONT)/ter-u16v.psf \
$(DOSFONT)/ter-u18b.psf $(DOSFONT)/ter-u20b.psf \
$(DOSFONT)/ter-u22b.psf $(DOSFONT)/ter-u24b.psf \
$(DOSFONT)/ter-u28b.psf $(DOSFONT)/ter-u32b.psf
else
FONTTARGETS=
endif
LUABIN = ../lib/lua-$(LUA_VERSION)/src/lua
LUA_TARGET_CFLAGS = $(MSDOS_TARGET_CFLAGS)
override TARGET_CFLAGS = $(MSDOS_TARGET_CFLAGS) $(MSDOS_PEDANTIC)
@@ -275,7 +279,7 @@ EMCC_LFLAGS += -s ALLOW_TABLE_GROWTH
EMCC_LFLAGS += -s ASYNCIFY -s ASYNCIFY_IMPORTS='["local_callback"]'
EMCC_LFLAGS += -O3
EMCC_LFLAGS += -s MODULARIZE
EMCC_LFLAGS += -s EXPORTED_FUNCTIONS='["_main", "_shim_graphics_set_callback", "_display_inventory", "_malloc"]'
EMCC_LFLAGS += -s EXPORTED_FUNCTIONS='["_main", "_shim_graphics_set_callback", "_repopulate_perminvent", "_malloc"]'
EMCC_LFLAGS += -s EXPORTED_RUNTIME_METHODS='["cwrap", "ccall", "addFunction", \
"removeFunction", "UTF8ToString", "stringToUTF8", "getValue", \
"setValue", "ENV", "FS", "IDBFS"]'
@@ -456,6 +460,97 @@ NCURSES_PLATFORM=MIPS
endif # CROSS_TO_MIPS
#=================================================================
#=================================================================
ifdef CROSS_TO_AMIGA
#===============-=================================================
# AmigaOS m68k cross-compile recipe
#===============-=================================================
# Uses an Amiga M68K cross-compiler on linux or macOS.
#
# Cross-compiler: https://franke.ms/git/bebbo/amiga-gcc
# Install to /opt/amiga, then:
# sys/unix/setup.sh sys/unix/hints/linux.370
# make fetch-lua
# make CROSS_TO_AMIGA=1 fetch-regex
# make CROSS_TO_AMIGA=1 all
# make CROSS_TO_AMIGA=1 package
#=================================================================
CFLAGS += -DCROSSCOMPILE
#
# Override the build tools and some obj files to
# reflect the amiga-gcc cross-compiler.
#
TOOLTOP = /opt/amiga/bin
TOOLARCH = -m68000
override REGEXOBJ = $(TARGETPFX)posixregex.o
AMIREGEXOBJ = $(TARGETPFX)regcomp.o $(TARGETPFX)regexec.o \
$(TARGETPFX)regerror.o $(TARGETPFX)regfree.o
override TARGET_CC = $(TOOLTOP)/m68k-amigaos-gcc
override TARGET_CXX = $(TOOLTOP)/m68k-amigaos-c++
override TARGET_AR = $(TOOLTOP)/m68k-amigaos-ar
override TARGET_STUBEDIT=
override TARGET_CFLAGS = -c -O2 -noixemul $(TOOLARCH) \
-include sys/types.h \
-I../include \
-I../sys/amiga -I../win/share \
$(LUAINCL) -DAMIGA -DNOTTYGRAPHICS -DNO_TERMS -DNO_SIGNAL \
-DTILES_IN_GLYPHMAP $(PDCURSESDEF) \
-DCROSSCOMPILE -DCROSSCOMPILE_TARGET -DCROSS_TO_AMIGA \
-DAMIGA_VERSION_STRING=\""VER: NetHack 3.7.0"\"
override TARGET_CXXFLAGS = $(TARGET_CFLAGS)
LUA_TARGET_CFLAGS = $(TARGET_CFLAGS)
ifeq "$(REGEXOBJ)" "$(TARGETPFX)cppregex.o"
override TARGET_LINK = $(TARGET_CXX)
else
override TARGET_LINK = $(TARGET_CC)
endif
override TARGET_LFLAGS= $(TOOLARCH) -noixemul -Wl,--allow-multiple-definition
override TARGET_LIBS += $(LIBLM)
VARDATND += nhtiles.bmp
override SYSSRC = ../sys/amiga/amidos.c ../sys/amiga/amigst.c \
../sys/amiga/amimenu.c ../sys/amiga/amirip.c \
../sys/amiga/amistack.c ../sys/amiga/amitty.c \
../sys/amiga/amiwind.c ../sys/amiga/clipwin.c \
../sys/amiga/colorwin.c \
../sys/amiga/winami.c ../sys/amiga/winchar.c \
../sys/amiga/winfuncs.c ../sys/amiga/winkey.c \
../sys/amiga/winamenu.c ../sys/amiga/winreq.c \
../sys/amiga/winstr.c ../sys/share/pcmain.c \
../win/share/bmptiles.c ../win/share/giftiles.c \
../win/share/tileset.c
override SYSOBJ = $(TARGETPFX)amidos.o $(TARGETPFX)amigst.o \
$(TARGETPFX)amirip.o $(TARGETPFX)amistack.o \
$(TARGETPFX)amitty.o $(TARGETPFX)amiwind.o \
$(TARGETPFX)winami.o $(TARGETPFX)winchar.o \
$(TARGETPFX)winfuncs.o $(TARGETPFX)winkey.o \
$(TARGETPFX)winamenu.o $(TARGETPFX)winreq.o \
$(TARGETPFX)winstr.o $(TARGETPFX)pcmain.o \
$(TARGETPFX)bmptiles.o $(TARGETPFX)giftiles.o \
$(TARGETPFX)tileset.o \
$(AMIREGEXOBJ)
override WINLIB=
override LUALIB=
override LUALIBS=
override TOPLUALIB=
override DLLIB=
override WINOBJ=
override GAMEBIN = $(TARGETPFX)nethack
override PACKAGE = amigapkg
override PREGAME += mkdir -p $(TARGETDIR) ;
override CLEANMORE += rm -r $(TARGETDIR) ;
#
# Rule for files in sys/amiga
$(TARGETPFX)%.o : ../sys/amiga/%.c
$(TARGET_CC) $(TARGET_CFLAGS) -o$@ $<
# Rule for BSD regex in sys/amiga/regex
$(TARGETPFX)%.o : ../sys/amiga/regex/%.c
$(TARGET_CC) $(TARGET_CFLAGS) -I../sys/amiga/regex -o$@ $<
endif # CROSS_TO_AMIGA
#=================================================================
ifdef WANT_WIN_CURSES
ifdef BUILD_PDCURSES
# Rules for PDCurses files

View File

@@ -70,34 +70,38 @@ NROFF = mandoc
MAN2TXTPRE = -T ascii
MAN2TXTPOST= | col -b
else
#detection of groff
NROFFISGROFF := $(shell echo `nroff --version | grep "GNU groff version"`)
#
# Detect groff.
NROFFISGROFF := $(shell echo `nroff --version | grep -c 'GNU.*groff.*version'`)
#$(info NROFFISGROFF=$(NROFFISGROFF))
ifneq "$(NROFFISGROFF)" ""
# get the version of groff and flag if it is gt or eq to 1.23
GROFFGE123 := $(shell expr `echo $(NROFFISGROFF) | cut -f2 -d.` \>= 23)
# or less than 1.24
GROFFLT124 := $(shell expr `echo $(NROFFISGROFF) | cut -f2 -d.` \< 24)
# -Wtab -Wrange are for the sake of tmac.n.
NROFF_FLAGS := -wall -Wtab -Wrange
ifneq "$(GROFFLT124)" ""
NROFF_FLAGS += -Wel -Wscale
endif
endif # NROFFISGROFF
ifneq "$(NROFFISGROFF)" "0"
# Gather groff's minor version number (register `.y`).
GROFFMINORVERSION := $(shell printf '.tm \\n[.y]\n' | nroff 2>&1)
#$(info GROFFMINORVERSION=$(GROFFMINORVERSION))
# Silence warnings produced by tmac.n, which NetHack does not modify.
NROFF_FLAGS := -wall -Wrange -Wscale -Wtab
# groff <= 1.23 also supported an "el" warning category that was buggy.
GROFFLE123 := $(shell expr $(GROFFMINORVERSION) \<= 23)
#$(info GROFFLE123=$(GROFFLE123))
ifeq "$(GROFFLE123)" "1"
NROFF_FLAGS += -Wel
endif # end groff less than 1.23
endif # end NROFFISGROFF
# $(info NROFF_FLAGS=$(NROFF_FLAGS))
ifneq "$(NROFFISGROFF)" "" # It's groff
# add the -Tascii flag used by groff
MAN2TXTPRE += -Tascii
ifneq "$(GROFFGE123)" "" # It's groff 1.23 or greater
#$(info GROFFGE123=$(GROFFGE123))
# nroff in groff 1.23 supports the -P option to pass arguments to the
# output driver. -cbou are flags to grotty(1).
GROFFGE123 := $(shell expr $(GROFFMINORVERSION) \>= 23)
#$(info GROFFGE123=$(GROFFGE123))
ifeq "$(GROFFGE123)" "1"
MAN2TXTPRE += -P -cbou
MAN2TXTPOST=
else
MAN2TXTPRE += -c
# groff less than 1.23
endif
endif # end groff less than 1.23
endif # end groff-specific
endif # not USE_MANDOC

View File

@@ -15,7 +15,7 @@
# - WINOBJ0
#---
# User selections could be specified as combinations of any of the following:
# WIN_WANT_TTY=1, WIN_WANT_CURSES=1, WIN_WANT_QT=1, WIN_WANT_X11=1
# WANT_WIN_TTY=1, WANT_WIN_CURSES=1, WANT_WIN_QT=1, WANT_WIN_X11=1
# The selections will all be linked into the same binary.
#
# Assuming you have the prerequisite packages mentioned above, you can

View File

@@ -0,0 +1,33 @@
#------------------------------------------------------------------------------
# NetHack 3.7 response.370 $NHDT-Date: 1668359835 2022/11/13 17:17:15 $ $NHDT-Branch: NetHack-3.7 $
ifeq "$(RESP)" "1"
USE_RESPONSEFILE=1
endif
ifeq "$(resp)" "1"
USE_RESPONSEFILE=1
endif
ifeq "$(RESPONSE)" "1"
USE_RESPONSEFILE=1
endif
ifeq "$(response)" "1"
USE_RESPONSEFILE=1
endif
ifeq "$(USE_RESPONSEFILE)" "1"
RESPONSEFILES=create_responsefiles
CXXFLAGS = $(CCXXFLAGS) -I. -I$(QTDIR)/include $(QTCXXFLAGS)
CC_COMPILER_SWITCHES := $(subst \,\\,$(CFLAGS))
CC_COMPILER_SWITCHES := $(subst ",\",$(CC_COMPILER_SWITCHES))
CXX_COMPILER_SWITCHES := $(subst \,\\,$(CXXFLAGS))
CXX_COMPILER_SWITCHES := $(subst ",\",$(CXX_COMPILER_SWITCHES))
CC_RESPONSEFILE=../src/nethack_cc.rsp
CXX_RESPONSEFILE=../src/nethack_cxx.rsp
CFLAGS=@$(CC_RESPONSEFILE)
CXXFLAGS=@$(CXX_RESPONSEFILE)
CLEAN_CC_RESPONSEFILE=rm -f $(CC_RESPONSEFILE);
CLEAN_CXX_RESPONSEFILE=rm -f $(CXX_RESPONSEFILE);
endif
#end of response.370
#------------------------------------------------------------------------------

View File

@@ -390,13 +390,15 @@ endif #?WANT_SOURCE_INSTALL
INSTDIR=$(HACKDIR)
VARDIR = $(HACKDIR)
ifneq "$(CCISCLANG)" ""
# gdb may not be installed if clang is chosen compiler so the game
# won't start in that case due to a sysconf error. Comment out
# relevant lines in sysconf.
POSTINSTALL+= sed -i -e 's;^GDBPATH=/usr/bin/gdb;\#GDBPATH=/usr/bin/gdb;' \
ifdef MAKEFILE_TOP
TESTGDBPATH=/usr/bin/gdb
POSTINSTALL+= test -f $(TESTGDBPATH) || \
sed -i -e 's;^GDBPATH=/usr/bin/gdb;\#GDBPATH=/usr/bin/gdb;' \
-e 's;PANICTRACE_GDB=1;PANICTRACE_GDB=0;' $(INSTDIR)/sysconf;
endif
POSTUPDATE+= test -f $(TESTGDBPATH) || \
sed -i -e 's;^GDBPATH=/usr/bin/gdb;\#GDBPATH=/usr/bin/gdb;' \
-e 's;PANICTRACE_GDB=1;PANICTRACE_GDB=0;' $(INSTDIR)/sysconf;
endif #MAKEFILE_TOP
ifeq '$(USE_NONOSTATICFN)' '1'
CFLAGS += -DNONOSTATICFN
@@ -448,6 +450,10 @@ MANDIR=/usr/share/man/man6
#-INCLUDE multisnd2-pre.370
#
#
#-INCLUDE response.370
#
#-POST
#

View File

@@ -281,12 +281,12 @@ WINLIB += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig \
pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --libs)
endif # WANT_WIN_QT5
ifdef WANT_WIN_QT6
QTCXXFLAGS += -std=c++17 -I $(QTDIR)/include -I $(QTDIR)/include/QtCore \
-I $(QTDIR)/include/QtMultimedia
QTCXXFLAGS += $(sort $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig \
pkg-config Qt6Gui Qt6Widgets Qt6Multimedia --cflags))
MOC = moc
MOCPATH = $(QTDIR)/share/qt/libexec/moc
WINLIB += -F $(QTDIR)/Frameworks -framework QtCore -framework QtGui \
-framework QtWidgets -framework QtMultimedia
WINLIB += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig \
pkg-config Qt6Gui Qt6Widgets Qt6Multimedia --libs)
endif # WANT_WIN_QT6
VARDATND0 += nhtiles.bmp rip.xpm nhsplash.xpm
# XXX if /Developer/qt exists and QTDIR not set, use that
@@ -461,6 +461,9 @@ SYSCONFENSURE = (if ! test -f $(INSTDIR)/sysconf ; then \
#
#-INCLUDE multisnd2-pre.370
#
#
#-INCLUDE response.370
#
ifdef MAKEFILE_TOP
.PHONY: bundle

View File

@@ -26,17 +26,11 @@ extern struct passwd *getpwuid(int);
#endif
extern struct passwd *getpwnam(const char *);
#ifdef CHDIR
static void chdirx(const char *, boolean);
void chdirx(const char *, boolean);
#endif /* CHDIR */
static boolean whoami(void);
static char *lopt(char *, int, const char *, const char *, int *, char ***);
boolean whoami(void);
static void process_options(int, char **);
static void consume_arg(int, int *, char ***);
static void consume_two_args(int, int *, char ***);
static void early_options(int *, char ***, char **);
ATTRNORETURN static void opt_terminate(void) NORETURN;
ATTRNORETURN static void opt_usage(const char *) NORETURN;
ATTRNORETURN static void scores_only(int, char **, const char *) NORETURN;
#ifdef SND_LIB_INTEGRATED
uint32_t soundlibchoice = soundlib_nosound;
#endif
@@ -128,12 +122,14 @@ main(int argc, char *argv[])
if (!dir)
dir = nh_getenv("HACKDIR");
#endif /* CHDIR */
program_state.early_options = 1;
#ifdef ENHANCED_SYMBOLS
if (argcheck(argc, argv, ARG_DUMPGLYPHIDS) == 2)
exit(EXIT_SUCCESS);
#endif
/* handle -dalthackdir, -s <score stuff>, --version, --showpaths */
early_options(&argc, &argv, &dir);
program_state.early_options = 0;
#ifdef CHDIR
/*
* Change directories before we initialize the window system so
@@ -325,93 +321,6 @@ main(int argc, char *argv[])
return 0;
}
static char ArgVal_novalue[] = "[nothing]"; /* note: not 'const' */
enum cmdlinearg {
ArgValRequired = 0, ArgValOptional = 1,
ArgValDisallowed = 2, ArgVal_mask = (1 | 2),
ArgNamOneLetter = 4, ArgNam_mask = 4,
ArgErrSilent = 0, ArgErrComplain = 8, ArgErr_mask = 8
};
/* approximate 'getopt_long()' for one option; all the comments refer to
"-windowtype" but the code isn't specific to that */
static char *
lopt(
char *arg, /* command line token; beginning matches 'optname' */
int lflags, /* cmdlinearg | errorhandling */
const char *optname, /* option's name; "-windowtype" in examples below */
const char *origarg, /* 'arg' might have had a dash prefix removed */
int *argc_p, /* argc that can have changes passed to caller */
char ***argv_p) /* argv[] ditto */
{
int argc = *argc_p;
char **argv = *argv_p;
char *p, *nextarg = (argc > 1 && argv[1][0] != '-') ? argv[1] : 0;
int l, opttype = (lflags & ArgVal_mask);
boolean oneletterok = ((lflags & ArgNam_mask) == ArgNamOneLetter),
complain = ((lflags & ArgErr_mask) == ArgErrComplain);
/* first letter must match */
if (arg[1] != optname[1]) {
loptbail:
if (complain)
config_error_add("Unknown option: %.60s", origarg);
return (char *) 0;
loptnotallowed:
if (complain)
config_error_add("Value not allowed: %.60s", origarg);
return (char *) 0;
loptrequired:
if (complain)
config_error_add("Missing required value: %.60s", origarg);
return (char *) 0;
}
if ((p = strchr(arg, '=')) == 0)
p = strchr(arg, ':');
if (p && opttype == ArgValDisallowed)
goto loptnotallowed;
l = (int) (p ? (long) (p - arg) : (long) strlen(arg));
if ((l > 2 || oneletterok) && !strncmp(arg, optname, l)) {
/* "-windowtype[=foo]" */
if (p)
++p; /* past '=' or ':' */
else if (opttype == ArgValRequired)
p = eos(arg); /* we have "-w[indowtype]" w/o "=foo"
* so we'll take foo from next element */
else
return ArgVal_novalue;
} else if (oneletterok) {
/* "-w..." but not "-w[indowtype[=foo]]" */
if (!p) {
p = &arg[2]; /* past 'w' of "-wfoo" */
#if 0 /* -x:value could work but is not supported (callers don't expect it) */
} else if (p == arg + 2) {
++p; /* past ':' of "-w:foo" */
#endif
} else {
/* "-w...=foo" but not "-w[indowtype]=foo" */
goto loptbail;
}
} else {
goto loptbail;
}
if (!p || !*p) {
/* "-w[indowtype]" w/o '='/':' if there is a next element, use
it for "foo"; if not, supply a non-Null bogus value */
if (nextarg && (opttype == ArgValRequired
|| opttype == ArgValOptional))
p = nextarg, --(*argc_p), ++(*argv_p);
else if (opttype == ArgValRequired)
goto loptrequired;
else
p = ArgVal_novalue; /* there is no next element */
}
return p;
}
/* caveat: argv elements might be arbitrarily long */
static void
process_options(int argc, char *argv[])
@@ -573,272 +482,8 @@ process_options(int argc, char *argv[])
return;
}
/* move argv[ndx] to end of argv[] array, then reduce argc to hide it;
prevents process_options() from encountering it after early_options()
has processed it; elements get reordered but all remain intact */
static void
consume_arg(int ndx, int *ac_p, char ***av_p)
{
char *gone, **av = *av_p;
int i, ac = *ac_p;
/* "-one -two -three -four" -> "-two -three -four -one" */
if (ac > 2) {
gone = av[ndx];
for (i = ndx + 1; i < ac; ++i)
av[i - 1] = av[i];
av[ac - 1] = gone;
}
--(*ac_p);
}
/* consume two tokens for '-argname value' w/o '=' or ':' */
static void
consume_two_args(int ndx, int *ac_p, char ***av_p)
{
/* when consuming "-two arg" from "-two arg -three -four",
the *ac_p manipulation results in "-three -four -two arg"
rather than the "-three -four arg -two" that would happen
with just two ordinary consume_arg() calls */
consume_arg(ndx, ac_p, av_p);
++(*ac_p); /* bring the final slot back into view */
consume_arg(ndx, ac_p, av_p);
--(*ac_p); /* take away restored slot */
}
/* process some command line arguments before loading options */
static void
early_options(int *argc_p, char ***argv_p, char **hackdir_p)
{
char **argv, *arg, *origarg;
int argc, oldargc, ndx = 0, consumed = 0;
config_error_init(FALSE, "command line", FALSE);
/* treat "nethack ?" as a request for usage info; due to shell
processing, player likely has to use "nethack \?" or "nethack '?'"
[won't work if used as "nethack -dpath ?" or "nethack -d path ?"] */
if (*argc_p > 1 && !strcmp((*argv_p)[1], "?"))
opt_usage(*hackdir_p); /* doesn't return */
/*
* Both *argc_p and *argv_p account for the program name as (*argv_p)[0];
* local argc and argv impicitly discard that (by starting 'ndx' at 1).
* argcheck() doesn't mind, prscore() (via scores_only()) does (for the
* number of args it gets passed, not for the value of argv[0]).
*/
for (ndx = 1; ndx < *argc_p; ndx += (consumed ? 0 : 1)) {
consumed = 0;
argc = *argc_p - ndx;
argv = *argv_p + ndx;
arg = origarg = argv[0];
/* skip any args intended for deferred options */
if (*arg != '-')
continue;
/* allow second dash if arg name is longer than one character */
if (arg[0] == '-' && arg[1] == '-' && arg[2] != '\0'
&& (arg[3] != '\0' && arg[3] != '=' && arg[3] != ':'))
++arg;
switch (arg[1]) { /* char after leading dash */
case 'b':
#ifdef CRASHREPORT
// --bidshow
if (argcheck(argc, argv, ARG_BIDSHOW) == 2){
opt_terminate();
/*NOTREACHED*/
}
#endif
break;
case 'd':
if (argcheck(argc, argv, ARG_DEBUG) == 1) {
consume_arg(ndx, argc_p, argv_p), consumed = 1;
#ifndef NODUMPENUMS
} else if (argcheck(argc, argv, ARG_DUMPENUMS) == 2) {
opt_terminate();
/*NOTREACHED*/
#endif
} else if (argcheck(argc, argv, ARG_DUMPMONGEN) == 2) {
opt_terminate();
/*NOTREACHED*/
} else if (argcheck(argc, argv, ARG_DUMPWEIGHTS) == 2) {
opt_terminate();
/*NOTREACHED*/
} else {
#ifdef CHDIR
oldargc = argc;
arg = lopt(arg,
(ArgValRequired | ArgNamOneLetter | ArgErrSilent),
"-directory", origarg, &argc, &argv);
if (!arg)
error("Flag -d must be followed by a directory name.");
if (*arg != 'e') { /* avoid matching -decgraphics or -debug */
*hackdir_p = arg;
if (oldargc == argc)
consume_arg(ndx, argc_p, argv_p), consumed = 1;
else
consume_two_args(ndx, argc_p, argv_p), consumed = 2;
}
#endif /* CHDIR */
}
break;
case 'h':
case '?':
if (lopt(arg, ArgValDisallowed, "-help", origarg, &argc, &argv)
|| lopt(arg, ArgValDisallowed | ArgNamOneLetter, "-?",
origarg, &argc, &argv))
opt_usage(*hackdir_p); /* doesn't return */
break;
case 'n':
oldargc = argc;
if (!strcmp(arg, "-no-nethackrc")) /* no abbreviation allowed */
arg = nhStr("/dev/null");
else
arg = lopt(arg, (ArgValRequired | ArgErrComplain),
"-nethackrc", origarg, &argc, &argv);
if (arg) {
gc.cmdline_rcfile = dupstr(arg);
if (oldargc == argc)
consume_arg(ndx, argc_p, argv_p), consumed = 1;
else
consume_two_args(ndx, argc_p, argv_p), consumed = 2;
}
break;
case 's':
if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) {
gd.deferred_showpaths = TRUE;
gd.deferred_showpaths_dir = *hackdir_p;
config_error_done();
return;
}
/* check for "-s" request to show scores */
if (lopt(arg, ((ArgValDisallowed | ArgErrComplain)
/* only accept one-letter if there is just one
dash; reject "--s" because prscore() via
scores_only() doesn't understand it */
| ((origarg[1] != '-') ? ArgNamOneLetter : 0)),
/* [ought to omit val-disallowed and accept
--scores=foo since -s foo and -sfoo are
allowed, but -s form can take more than one
space-separated argument and --scores=foo
isn't suited for that] */
"-scores", origarg, &argc, &argv)) {
/* at this point, argv[0] contains "-scores" or a leading
substring of it; prscore() (via scores_only()) expects
that to be in argv[1] so we adjust the pointer to make
that be the case; if there are any non-early args waiting
to be passed along to process_options(), the resulting
argv[0] will be one of those rather than the program
name but prscore() doesn't care */
scores_only(argc + 1, argv - 1, *hackdir_p);
/*NOTREACHED*/
}
break;
case 'u':
if (lopt(arg, ArgValDisallowed, "-usage", origarg, &argc, &argv))
opt_usage(*hackdir_p);
break;
case 'v':
if (argcheck(argc, argv, ARG_VERSION) == 2) {
opt_terminate();
/*NOTREACHED*/
}
break;
case 'w': /* windowtype: "-wfoo" or "-w[indowtype]=foo"
* or "-w[indowtype]:foo" or "-w[indowtype] foo" */
arg = lopt(arg,
(ArgValRequired | ArgNamOneLetter | ArgErrComplain),
"-windowtype", origarg, &argc, &argv);
if (gc.cmdline_windowsys)
free((genericptr_t) gc.cmdline_windowsys);
gc.cmdline_windowsys = arg ? dupstr(arg) : NULL;
break;
default:
break;
}
}
/* empty or "N errors on command line" */
config_error_done();
return;
}
/* for command-line options that perform some immediate action and then
terminate the program without starting play, like 'nethack --version'
or 'nethack -s Zelda'; do some cleanup before that termination */
ATTRNORETURN static void
opt_terminate(void)
{
config_error_done(); /* free memory allocated by config_error_init() */
nh_terminate(EXIT_SUCCESS);
/*NOTREACHED*/
}
ATTRNORETURN static void
opt_usage(const char *hackdir)
{
#ifdef CHDIR
chdirx(hackdir, TRUE);
#else
nhUse(hackdir);
#endif
dlb_init();
genl_display_file(USAGEHELP, TRUE);
opt_terminate();
}
/* show the sysconf file name, playground directory, run-time configuration
file name, dumplog file name if applicable, and some other things */
ATTRNORETURN void
after_opt_showpaths(const char *dir)
{
#ifdef CHDIR
chdirx(dir, FALSE);
#else
nhUse(dir);
#endif
opt_terminate();
/*NOTREACHED*/
}
/* handle "-s <score options> [character-names]" to show all the entries
in the high scores file ('record') belonging to particular characters;
nethack will end after doing so without starting play */
ATTRNORETURN static void
scores_only(int argc, char **argv, const char *dir)
{
/* do this now rather than waiting for final termination, in case there
is an error summary coming */
config_error_done();
#ifdef CHDIR
chdirx(dir, FALSE);
#else
nhUse(dir);
#endif
#ifdef SYSCF
iflags.initoptions_noterminate = TRUE;
initoptions(); /* sysconf options affect whether panictrace is enabled */
iflags.initoptions_noterminate = FALSE;
#endif
#ifdef PANICTRACE
ARGV0 = gh.hname; /* save for possible stack trace */
#ifndef NO_SIGNAL
panictrace_setsignals(TRUE);
#endif
#endif
(void) whoami(); /* set up default plname[] */
prscore(argc, argv);
nh_terminate(EXIT_SUCCESS); /* bypass opt_terminate() */
/*NOTREACHED*/
}
#ifdef CHDIR
static void
void
chdirx(const char *dir, boolean wr)
{
if (dir /* User specified directory? */
@@ -905,7 +550,7 @@ chdirx(const char *dir, boolean wr)
#endif /* CHDIR */
/* returns True iff we set plname[] to username which contains a hyphen */
static boolean
boolean
whoami(void)
{
/*

View File

@@ -76,7 +76,7 @@
used if symbols are set up to run them. Or if you have them but do not
have symbols set up, you may edit spec_lev.com to have it run them.
If neither of those situations applies, spec_lev.com will default to
copying pre-genearated versions of the appropriate files (dgn_lex.c,
copying pre-generated versions of the appropriate files (dgn_lex.c,
lev_lex.c, dgn_yacc.c, lev_yacc.c, dgn_comp.h, and lev_comp.h) from
[.sys.share] into [.util]*.c and [.include]*.h.

View File

@@ -16,7 +16,7 @@ Last tested with VSI C x86-64 V7.5-009 (GEM 50XBR) on OpenVMS x86_64 V9.2-2.
[.dat] -- data files
[.doc] -- documentation files
[.include] -- C header files
[.lib.lua546] -- Lua distribution from https://www.lua.org/
[.lib.lua548] -- Lua distribution from https://www.lua.org/
[.src] -- primary source files
[.sys] -- parent for [.sys.*]
[.sys.share] -- files shared by several ports, including VMS

View File

@@ -149,9 +149,9 @@ HACK_H = $(SRC)hack.h-t
HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \
botl.c calendar.c cfgfiles.c cmd.c coloratt.c dbridge.c decl.c detect.c \
dig.c display.c dlb.c do.c do_name.c do_wear.c dog.c dogmove.c dokick.c \
dothrow.c drawing.c dungeon.c eat.c end.c engrave.c exper.c \
dothrow.c drawing.c dungeon.c earlyarg.c eat.c end.c engrave.c exper.c \
explode.c extralev.c files.c fountain.c getpos.c glyphs.c hack.c \
hacklib.c insight.c invent.c light.c lock.c \
hacklib.c iactions.c insight.c invent.c light.c lock.c \
mail.c makemon.c mcastu.c mhitm.c mhitu.c minion.c \
mklev.c mkmap.c mkmaze.c mkobj.c mkroom.c mon.c mondata.c \
monmove.c monst.c mplayer.c mthrowu.c muse.c music.c o_init.c \
@@ -198,9 +198,9 @@ HOBJ1 = allmain.obj,alloc.obj,apply.obj,artifact.obj,attrib.obj, \
coloratt.obj,dbridge.obj,decl.obj,detect.obj,dig.obj,display.obj, \
dlb.obj,do.obj,do_name.obj,do_wear.obj
HOBJ2 = dog.obj,dogmove.obj,dokick.obj,dothrow.obj,drawing.obj, \
dungeon.obj,eat.obj,end.obj,engrave.obj,exper.obj,explode.obj, \
dungeon.obj,earlyarg.obj,eat.obj,end.obj,engrave.obj,exper.obj,explode.obj, \
extralev.obj,files.obj,fountain.obj,getpos.obj,glyphs.obj,hack.obj, \
hacklib.obj,insight.obj,invent.obj
hacklib.obj,iactions.obj,insight.obj,invent.obj
HOBJ3 = light.obj,lock.obj,mail.obj,makemon.obj,mcastu.obj, \
mhitm.obj,mhitu.obj,minion.obj,mklev.obj,mkmap.obj,mkmaze.obj, \
mkobj.obj,mkroom.obj,mon.obj,mondata.obj,monmove.obj
@@ -519,6 +519,7 @@ dokick.obj : dokick.c $(HACK_H)
dothrow.obj : dothrow.c $(HACK_H)
drawing.obj : drawing.c $(HACK_H) $(INC)tcap.h
dungeon.obj : dungeon.c $(HACK_H) $(INC)dgn_file.h $(INC)dlb.h
earlyarg.obj : earlyarg.c $(HACK_H)
eat.obj : eat.c $(HACK_H)
end.obj : end.c $(HACK_H) $(INC)dlb.h
engrave.obj : engrave.c $(HACK_H)
@@ -529,6 +530,7 @@ files.obj : files.c $(HACK_H) $(INC)dlb.h $(INC)wintty.h #zlib.h
fountain.obj : fountain.c $(HACK_H)
hack.obj : hack.c $(HACK_H)
hacklib.obj : hacklib.c $(HACK_H)
iactions.obj : iactions.c $(HACK_H)
insight.obj : insight.c $(HACK_H)
invent.obj : invent.c $(HACK_H)
light.obj : light.c $(HACK_H)

View File

@@ -24,9 +24,9 @@ WINSHIM=[-.win.shim]
WINCHAIN=[-.win.chain]
# Lua location relative to src
LUAVER=546
LUADOTVER=5.4.6
LUAUNDERVER=5_4_6
LUAVER=548
LUADOTVER=5.4.8
LUAUNDERVER=5_4_8
LUAINC=[-.lib.lua.lua$(LUAVER).src]
LUALIB=[-.lib.lua]lua$(LUAVER).olb
LUASRCDIR =[-.lib.lua.lua$(LUAVER).src]

View File

@@ -25,9 +25,9 @@ WINSHIM=[-.win.shim]
WINCHAIN=[-.win.chain]
# Lua location relative to src
LUAVER=546
LUADOTVER=5.4.6
LUAUNDERVER=5_4_6
LUAVER=548
LUADOTVER=5.4.8
LUAUNDERVER=5_4_8
LUAINC=[-.lib.lua.lua$(LUAVER).src]
LUALIB=[-.lib.lua]lua$(LUAVER).olb
LUASRCDIR =[-.lib.lua.lua$(LUAVER).src]

View File

@@ -35,9 +35,9 @@ WINSHIM=[-.win.shim]
WINCHAIN=[-.win.chain]
# Lua
LUAVER=546
LUADOTVER=5.4.6
LUAUNDERVER=5_4_6
LUAVER=548
LUADOTVER=5.4.8
LUAUNDERVER=5_4_8
# Lua location relative to src
LUAINC=[-.lib.lua.lua$(LUAVER).src]
LUALIB=[-.lib.lua]lua$(LUAVER).olb
@@ -117,10 +117,10 @@ HACK_H = $(addsuffix .h, $(addprefix $(INCL), $(CONFIGBASEH) $(HACKBASEH)))
HACKFILES := allmain alloc apply artifact attrib ball bones botl \
calendar cfgfiles cmd coloratt dbridge decl detect \
dig display dlb do do_name do_wear dog dogmove dokick \
dothrow drawing dungeon eat end engrave exper explode extralev \
files fountain getpos glyphs hack hacklib insight invent isaac64 \
light lock mail makemon mcastu mdlib mhitm mhitu minion mklev \
mkmap mkmaze mkobj mkroom mon \
dothrow drawing dungeon earlyarg eat end engrave exper explode \
extralev files fountain getpos glyphs hack hacklib iactions \
insight invent isaac64 light lock mail makemon mcastu mdlib mhitm \
mhitu minion mklev mkmap mkmaze mkobj mkroom mon \
mondata monmove monst mplayer mthrowu muse music \
nhlua nhlsel nhlobj objnam o_init objects \
options pager pickup pline polyself potion pray \
@@ -735,6 +735,7 @@ $(TARGETPFX)getpos.obj: getpos.c $(HACK_H)
$(TARGETPFX)glyphs.obj: glyphs.c $(HACK_H)
$(TARGETPFX)hack.obj: hack.c $(HACK_H)
$(TARGETPFX)hacklib.obj: hacklib.c $(HACK_H)
$(TARGETPFX)iactions.obj: iactions.c $(HACK_H)
$(TARGETPFX)insight.obj: insight.c $(HACK_H)
$(TARGETPFX)invent.obj: invent.c $(HACK_H)
$(TARGETPFX)isaac64.obj: isaac64.c $(CONFIG_H) $(INCL)isaac64.h

View File

@@ -54,9 +54,9 @@ WINSHIM=[.win.shim]
WINCHAIN=[.win.chain]
# Lua macros
LUAVER=546
LUADOTVER=5.4.6
LUAUNDERVER=5_4_6
LUAVER=548
LUADOTVER=5.4.8
LUAUNDERVER=5_4_8
LUAINC=[.lib.lua.lua$(LUAVER).src]
LUALIB=[.lib.lua]lua$(LUAVER).olb
LUASRCDIR =[.lib.lua.lua$(LUAVER).src]

View File

@@ -30,9 +30,9 @@ WINSHIM=[-.win.shim]
WINCHAIN=[-.win.chain]
# Lua location relative to here
LUAVER=546
LUADOTVER=5.4.6
LUAUNDERVER=5_4_6
LUAVER=548
LUADOTVER=5.4.8
LUAUNDERVER=5_4_8
LUAINC=[-.lib.lua.lua$(LUAVER).src]
LUALIB=[-.lib.lua]lua$(LUAVER).olb
LUASRCDIR =[-.lib.lua.lua$(LUAVER).src]

View File

@@ -28,9 +28,9 @@ $ ! one, use "" in the earlier one's position, such as
$ ! $ @[-.sys.vms]vmsbuild "" "" "" "" "TTY+CURSES"
$ !
$ ! Lua Version
$ luaver = "546"
$ luadotver = "5.4.6"
$ luaunderver = "5_4_6"
$ luaver = "548"
$ luadotver = "5.4.8"
$ luaunderver = "5_4_8"
$
$ decc_dflt = f$trnlnm("DECC$CC_DEFAULT")
$ j = (decc_dflt.nes."") .and. 1
@@ -425,7 +425,7 @@ $ c_list = "allmain,apply,artifact,attrib,ball,bones,botl,calendar,cmd" -
+ ",do_wear,dog,dogmove,dokick,dungeon,eat,end,engrave,exper,explode" -
+ ",extralev,files,fountain,getpos,glyphs"
$ gosub compile_list
$ c_list = "hack,hacklib,insight,invent,light,lock,mail,makemon" -
$ c_list = "hack,hacklib,iactions,insight,invent,light,lock,mail,makemon" -
+ ",mcastu,mdlib,mhitm,mhitu,minion,mklev,mkmap,mkmaze" -
+ ",mkobj,mkroom,mon,mondata,monmove,mplayer,mthrowu,muse" -
+ ",music"
@@ -453,7 +453,7 @@ $ gosub compile_list
$ milestone "<linking...>"
$ link /EXECUTABLE=nethack.exe vmsmain.obj,date.obj-
+[-.src]nethack.olb/library -
+sys$disk:[-.lib.lua]lua546.olb/library
+sys$disk:[-.lib.lua]lua548.olb/library
$ milestone "NetHack"
$ if c_opt.eq.o_LINK then goto done !"LINK" only
$special:

View File

@@ -5,6 +5,6 @@ sysconf NHSUBST
*.rc NHSUBST
*.bat NHSUBST
*.def NH_header=no
* NH_filestag=(file%s_for_Windows_7/8.x/10/11_version)
* NH_filestag=(file%s_for_Windows_10/11_version)
..files NH_filegenerated=nethack.ico
nethack.ico NH_filesgentag=(file%s_generated_by_uudecode_at_compile_time)

View File

@@ -104,7 +104,7 @@ USE_LUADLL = Y
WANT_LUAC = N
ifndef LUA_VERSION
LUAVER=5.4.6
LUAVER=5.4.8
else
LUAVER=$(LUA_VERSION)
endif
@@ -299,6 +299,18 @@ USE_DLB = Y
#==========================================
#==========================================
ifeq "$(MSYSTEM)" "MINGW32"
arch = x86
else
arch = x64
endif
MACH := $(shell echo $$PROCESSOR_IDENTIFIER | cut -f1 -d ' ')
MACH := $(strip $(MACH))
# Print the detected architecture (for debugging)
#$(info Detected Architecture:$(MACH).)
ifeq "$(MACH)" "ARMv8"
arch=arm64
endif
ifdef CI_COMPILER
cc = gcc -c
cxx = g++ -c
@@ -311,16 +323,17 @@ ld = gcc
endif
ifeq "$(MSYSTEM)" "MINGW32"
rc = windres --target=pe-i386
else # MINGW64
else # MINGW64 or arm64
ifeq "$(arch)" "arm64"
#rc = windres --target=pe-arm64
rc = windres
else
rc = windres --target=pe-x86-64
endif
ifeq "$(MSYSTEM)" "MINGW32"
arch = x86
else # MINGW64
arch = x64
endif
#
# Handle user settings
#
@@ -380,7 +393,7 @@ CLEAN_DIR = $(GAMEDIR) $(OBJ)
#=================================================================
# LUA library
# Source from http://www.lua.org/ftp/lua-5.4.6.tar.gz
# Source from http://www.lua.org/ftp/lua-5.4.8.tar.gz
#=================================================================
OLUA = $(O)lua
@@ -414,8 +427,15 @@ $(U)lua.exe: $(OLUA)/lua.o $(LUALIB)
$(LUADLL): $(ULUADLL)
cp $< $@
ifeq "$(arch)" "arm64"
lparam=-Wl,--export-all-symbols
else
lparam=-Wl,--export-all-symbols -Wl,--add-stdcall-alias
endif
$(ULUADLL) $(LUAIMP): $(LUAOBJS) | $(OLUA)
$(ld) $(LDFLAGS) -fPIC -shared -Wl,--export-all-symbols -Wl,--add-stdcall-alias \
$(ld) $(LDFLAGS) -fPIC -shared $(lparam) \
-Wl,--out-implib=$(LUAIMP) $^ -o$(ULUADLL)
$(LUASTATIC): $(LUAOBJS) | $(OLUA)
@@ -455,7 +475,7 @@ CLEAN_FILE += $(NHLUAH)
LUALIST = air Arc-fila Arc-filb Arc-goal Arc-loca Arc-strt \
asmodeus astral baalz Bar-fila Bar-filb Bar-goal \
Bar-loca Bar-strt bigrm-1 bigrm-10 bigrm-11 bigrm-2 \
bigrm-12 \
bigrm-12 bigrm-13 \
bigrm-3 bigrm-4 bigrm-5 bigrm-6 bigrm-7 bigrm-8 \
bigrm-9 castle Cav-fila Cav-filb Cav-goal Cav-loca \
Cav-strt dungeon earth fakewiz1 fakewiz2 fire \
@@ -774,6 +794,7 @@ HACK_H = $(CONFIG_H) ../include/align.h ../include/artilist.h \
../include/decl.h ../include/defsym.h ../include/display.h \
../include/dungeon.h ../include/engrave.h ../include/flag.h \
../include/hack.h ../include/lint.h ../include/mextra.h \
../include/mcastu.h \
../include/mkroom.h ../include/monattk.h ../include/mondata.h \
../include/monflag.h ../include/monst.h ../include/monsters.h \
../include/nhlua.h ../include/obj.h ../include/objclass.h \
@@ -1045,8 +1066,8 @@ fetchpdcurses:
git submodule update ../submodules/$(PDCURSES) ; fi
# git submodule update --remote ../submodules/$(PDCURSES) ; fi
else # GIT_AVAILABLE no
CURLLUASRC=http://www.lua.org/ftp/lua-5.4.6.tar.gz
CURLLUADST=lua-5.4.6.tar.gz
CURLLUASRC=http://www.lua.org/ftp/lua-5.4.8.tar.gz
CURLLUADST=lua-5.4.8.tar.gz
CURLPDCSRC=https://github.com/Bill-Gray/PDCursesMod/archive/refs/tags/v4.5.1.zip
CURLPDCDST=$(PDCURSES).zip
@@ -1211,21 +1232,21 @@ COREOBJS = $(addsuffix .o, allmain alloc apply artifact attrib ball bones botl \
calendar cfgfiles cmd coloratt cppregex \
dbridge decl detect dig display dlb do do_name do_wear \
dog dogmove dokick dothrow drawing dungeon \
eat end engrave exper explode extralev files fountain \
getpos glyphs hack insight invent isaac64 light lock \
earlyarg eat end engrave exper explode extralev files fountain \
getpos glyphs hack iactions insight invent isaac64 light lock \
mail makemon mcastu mdlib mhitm mhitu minion mklev mkmap mkmaze mkobj mkroom \
mon mondata monmove monst mplayer mthrowu muse music \
nhlobj nhlsel nhlua windsound o_init objects objnam options \
pager pickup pline polyself potion pray priest quest questpgr \
random read rect region report restore rip rnd role rumors \
safeproc save sfbase sfstruct shk shknam sit selvar sounds sp_lev \
save sfbase sfstruct shk shknam sit selvar sounds sp_lev \
spell stairs steal steed strutil \
symbols sys teleport timeout topten track trap u_init uhitm utf8map \
vault version vision weapon were wield windmain windows windsys wizard \
wizcmds worm worn write zap $(SOUNDLIBOBJS))
CFLAGSW = $(CFLAGS) $(CFLAGSXTRA) $(SOUNDLIBINCL) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DSAFEPROCS -DNOTTYGRAPHICS $(SOUNDLIBDEFS)
CPPFLAGSW = $(CFLAGS) $(CPPFLAGSXTRA) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DSAFEPROCS -DNOTTYGRAPHICS $(SOUNDLIBDEFS)
CFLAGSW = $(CFLAGS) $(CFLAGSXTRA) $(SOUNDLIBINCL) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DNOTTYGRAPHICS $(SOUNDLIBDEFS)
CPPFLAGSW = $(CFLAGS) $(CPPFLAGSXTRA) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DNOTTYGRAPHICS $(SOUNDLIBDEFS)
ONHW = $(O)nethackw
NHWONLY = $(addsuffix .o, mhaskyn mhdlg mhfont mhinput mhmain mhmap mhmenu \
@@ -1327,8 +1348,8 @@ CLEAN_FILE += $(NHWTARGETS) $(NHWOBJS) $(NHWRES) $(BMPS) $(WAV)
#==========================================
# nethack
#==========================================
CFLAGSNH = $(CFLAGSU) $(CFLAGSXTRA) $(SOUNDLIBINCL) -DNO_TILE_C -DSAFEPROCS -D_LIB -DWIN32CON $(SOUNDLIBDEFS)
CPPFLAGSNH = $(CFLAGSU) $(CPPFLAGSXTRA) -DNO_TILE_C -DSAFEPROCS -D_LIB -DWIN32CON $(SOUNDLIBDEFS)
CFLAGSNH = $(CFLAGSU) $(CFLAGSXTRA) $(SOUNDLIBINCL) -DNO_TILE_C -D_LIB -DWIN32CON $(SOUNDLIBDEFS)
CPPFLAGSNH = $(CFLAGSU) $(CPPFLAGSXTRA) -DNO_TILE_C -D_LIB -DWIN32CON $(SOUNDLIBDEFS)
ONH = $(O)nethack
@@ -1357,7 +1378,16 @@ $(ONH)/%.o: $(SRC)/%.c $(NHLUAH) | $(ONH)
#==========================================
# package
#==========================================
ifeq "$(arch)" "x64"
TARGET_CPU = x64
else
ifeq "$(arch)" "arm64"
TARGET_CPU = arm64
else
TARGET_CPU = x86
endif
endif
NHV=370
PKGFILES = nethackrc.template Guidebook.txt license NetHack.exe NetHack.txt \
NetHackW.exe opthelp nhdat370 record symbols sysconf.template $(notdir $(LUADLL))

File diff suppressed because it is too large Load Diff

View File

@@ -30,7 +30,7 @@ Prerequisite Requirements:
+----------+ +------+ +----+ +----+
| | | | | | | |
| | | | | | | |
lua-5.4.6 pdcursesmod share windows tty win32 lua pdcursesmod
lua-5.4.8 pdcursesmod share windows tty win32 lua pdcursesmod
|
vs
|

View File

@@ -2,8 +2,8 @@ Building NetHack using the Visual Studio nmake from the command line
Prerequisite Requirements:
o Visual Studio Community Edition
A copy of Microsoft Visual Studio Community Edition needs to
o Visual Studio Community
A copy of Microsoft Visual Studio Community needs to
be installed on your machine. See:
https://visualstudio.microsoft.com/vs/community/
o Lua
@@ -43,7 +43,7 @@ You can use one of the following build environments:
+----------+ +------+ +----+ +----+
| | | | | | | |
| | | | | | | |
lua-5.4.6 pdcursesmod share windows tty win32 lua pdcursesmod
lua-5.4.8 pdcursesmod share windows tty win32 lua pdcursesmod
|
vs
|
@@ -54,7 +54,7 @@ You can use one of the following build environments:
/-----------------------------------------------------------\
| Building From the Command Line Using nmake from one of the |
| Visual Studio Community Editions |
| Visual Studio Community versions |
\-----------------------------------------------------------/
Building
@@ -62,7 +62,7 @@ Building
Two different versions of NetHack will be built for Windows from the
command line using the Makefile approach:
A tty port utilizing the Win32 Console I/O subsystem Console,
and a curses interface in an executabled called NetHack.exe.
and a curses interface in an executable called NetHack.exe.
NetHack
A Win32 native port built on the Windows API Graphical NetHack,
and graphical curses in an executable called NetHackW.exe.

View File

@@ -2,9 +2,33 @@ Building NetHack using the Visual Studio IDE
Prerequisite Requirements:
o Visual Studio Community Edition
A copy of Microsoft Visual Studio Community Edition needs to
be installed on your machine. See:
o Visual Studio Community
A copy of a version of Microsoft Visual Studio Community needs to
be installed on your machine. Visual Studio Community can be either
the version for Windows 11 x64 for use on machines with
Intel/AMD64 processors, or the version for Windows 11 ARM64 for
use on machines with ARM64 processors (Snapdragon).
You can opt to build for a target x64, or for a target ARM64
on either the x64 version of Visual Studio, or on the ARM64
version. Versions of Visual Studio, since Visual Studio 26,
are able to compile for the native host platform and
cross-compile to the other target platform.
If you want to selectively cross-compile for both x64 and ARM64
target types, ensure that the necessary Individual Components for
both types of target builds are selected (checked-off) in the
Visual Studio Installer Individual Components dialog:
Under Compilers, build tools, and runtimes:
o MSVC Build Tools for ARM64/ARM64EC (Latest)
o MSVC Build Tools for x64/x86 (Latest)
You can use the Visual Studio Installer "Modify" button
to add missing Individual Components after installation,
if needed.
See:
https://visualstudio.microsoft.com/vs/community/
o Lua
NetHack 3.7 for Windows requires 3rd party Lua source that is not part
@@ -44,7 +68,7 @@ versions:
+----------+ +------+ +----+ +----+
| | | | | | | |
| | | | | | | |
lua-5.4.6 pdcursesmod share windows tty win32 lua pdcursesmod
lua-5.4.8 pdcursesmod share windows tty win32 lua pdcursesmod
|
vs
|
@@ -54,10 +78,10 @@ versions:
/-----------------------------------------------------------\
| Building And Running Using Visual Studio 2019, 2022 |
| Building And Running Using Visual Studio Community |
\-----------------------------------------------------------/
When using Visual Studio Community Edition, load the provided solution
When using a version of Visual Studio Community, load the provided solution
file within the IDE, build the solution.
The Visual Studio NetHack solution file can be found here:
@@ -66,7 +90,15 @@ The Visual Studio NetHack solution file can be found here:
The steps are:
1. Launch the IDE.
2. Open the appropriate solution file in sys\windows\vs\NetHack.sln.
3. Select the build configuration you wish to use (Release, Debug, etc.).
3. Select the build platform and configuration that you wish
to target (x64 or ARM64, and Release or Debug).
(Note: If you want to target an ARM64 build from an x64 machine,
or target an x64 build from an ARM64 machine, you need to
first complete the build for the native machine type target.
That's necessary to ensure that host-native versions of
uudecode.exe, makedefs.exe, tilemap.exe, tile2bmp.exe and
dlb.exe tools are available for execution during the build
steps that rely on those tools.)
4. From the build menu, select build solution.
5. Type F5 to start debugging.

View File

@@ -98,22 +98,22 @@ cell_t undefined_cell = { CONSOLE_UNDEFINED_CHARACTER,
CONSOLE_UNDEFINED_ATTRIBUTE };
#else /* VIRTUAL_TERMINAL_SEQUENCES */
cell_t clear_cell = {
{ CONSOLE_CLEAR_CHARACTER, 0, 0, 0, 0, 0, 0 },
{ CONSOLE_CLEAR_CHARACTER, 0, 0, 0, 0, 0, 0 },
CONSOLE_CLEAR_CHARACTER, /* wcharacter */
0, /* attr */
0L, /* color24 */
0, /* color256idx */
"\x1b[0m", /* bkcolorseq */
0 /* colorseq */
0, /* attr */
0L, /* color24 */
0, /* color256idx */
"\x1b[0m", /* bkcolorseq */
0 /* colorseq */
};
cell_t undefined_cell = {
{ CONSOLE_UNDEFINED_CHARACTER, 0, 0, 0, 0, 0, 0 },
{ CONSOLE_UNDEFINED_CHARACTER, 0, 0, 0, 0, 0, 0 },
CONSOLE_UNDEFINED_CHARACTER, /* wcharacter */
0, /* attr */
0L, /* color24 */
0, /* color256idx */
(const char *) 0, /* bkcolorseq */
(const char *) 0 /* colorseq */
0, /* attr */
0L, /* color24 */
0, /* color256idx */
(const char *) 0, /* bkcolorseq */
(const char *) 0 /* colorseq */
};
#if 0
static const uint8 empty_utf8str[MAX_UTF8_SEQUENCE] = { 0 };
@@ -156,7 +156,6 @@ static boolean check_font_widths(void);
#endif
static void set_known_good_console_font(void);
static void restore_original_console_font(void);
extern void safe_routines(void);
void tty_ibmgraphics_fixup(void);
#ifdef VIRTUAL_TERMINAL_SEQUENCES
extern void (*ibmgraphics_mode_callback)(void); /* symbols.c */
@@ -763,7 +762,7 @@ emit_stop_inverse(void)
#define tcfmtstr256 "\x1b[38;5;%ldm"
#else
#define tcfmtstr24bit "\x1b[38:2:%ld:%ld:%ldm"
#define tcfmtstr256 "\x1b[38:5:%dm"
#define tcfmtstr256 "\x1b[38:5:%ldm"
#endif
void
@@ -771,7 +770,8 @@ emit_start_256color(int u256coloridx)
{
DWORD unused;
static char tcolorbuf[QBUFSZ];
Snprintf(tcolorbuf, sizeof tcolorbuf, tcfmtstr256, u256coloridx);
Snprintf(tcolorbuf, sizeof tcolorbuf, tcfmtstr256,
(long) u256coloridx);
WriteConsoleA(console.hConOut, (LPCSTR) tcolorbuf,
(int) strlen(tcolorbuf), &unused, NULL);
}
@@ -783,9 +783,9 @@ emit_start_24bitcolor(long color24bit)
static char tcolorbuf[QBUFSZ];
uint32 mcolor = COLORVAL(color24bit);
Snprintf(tcolorbuf, sizeof tcolorbuf, tcfmtstr24bit,
((mcolor >> 16) & 0xFF), /* red */
((mcolor >> 8) & 0xFF), /* green */
((mcolor >> 0) & 0xFF)); /* blue */
(long) ((mcolor >> 16) & 0xFF), /* red */
(long) ((mcolor >> 8) & 0xFF), /* green */
(long) ((mcolor >> 0) & 0xFF)); /* blue */
WriteConsoleA(console.hConOut, (LPCSTR) tcolorbuf,
(int) strlen(tcolorbuf), &unused, NULL);
}
@@ -870,7 +870,8 @@ back_buffer_flip(void)
do_anything |= do_wide_content;
} else {
#endif
if (strcmp((const char *) back->utf8str,
if (back->utf8str && front->utf8str
&& strcmp((const char *) back->utf8str,
(const char *) front->utf8str))
do_anything |= do_utf8_content;
#ifdef UTF8_FROM_CORE
@@ -1145,7 +1146,7 @@ CtrlHandler(DWORD ctrltype)
case CTRL_BREAK_EVENT:
term_clear_screen();
FALLTHROUGH;
/* FALLTHRU */
/* FALLTHRU */
case CTRL_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
@@ -1184,17 +1185,18 @@ consoletty_open(int mode UNUSED)
really_move_cursor();
nhUse(debugvar);
}
extern void set_emergency_io(void);
void
consoletty_exit(void)
{
/* go back to using the safe routines */
safe_routines();
free_custom_colors();
free((genericptr_t) console.front_buffer);
free((genericptr_t) console.back_buffer);
console.front_buffer = console.back_buffer = 0;
free((genericptr_t) console.localestr);
free((genericptr_t) console.orig_localestr);
set_emergency_io();
}
int
@@ -1307,8 +1309,8 @@ really_move_cursor(void)
oldtitle[39] = '\0';
}
Snprintf(newtitle, sizeof newtitle,
"%-55s tty=(%02d,%02d) consoletty=(%02d,%02d)",
oldtitle,
"%-55s tty=(%02d,%02d) consoletty=(%02d,%02d)",
oldtitle,
ttyDisplay->curx, ttyDisplay->cury,
console.cursor.X, console.cursor.Y);
(void) SetConsoleTitle(newtitle);
@@ -1493,7 +1495,7 @@ console_g_putch(int in_ch)
#else /* VIRTUAL_TERMINAL_SEQUENCES */
ccount = 0;
WCHAR wch[2];
boolean usemap = (ch >= 0 && ch < SIZE(console.cpMap));
boolean usemap = (ch >= 0 && ((int) ch < SIZE(console.cpMap)));
#endif /* VIRTUAL_TERMINAL_SEQUENCES */
set_console_cursor(ttyDisplay->curx, ttyDisplay->cury);
@@ -2543,11 +2545,18 @@ void early_raw_print(const char *s)
*
*/
DISABLE_WARNING_CONDEXPR_IS_CONSTANT
void nethack_enter_consoletty(void)
{
int width;
#ifdef VIRTUAL_TERMINAL_SEQUENCES
char buf[BUFSZ], *bp, *localestr;
BOOL apisuccess;
// DWORD unused;
// int i = 0;
#endif /* VIRTUAL_TERMINAL_SEQUENCES */
#if 0
/* set up state needed by early_raw_print() */
@@ -2561,13 +2570,41 @@ void nethack_enter_consoletty(void)
GetWindowLong(console.hWnd, GWL_STYLE)
& ~WS_MAXIMIZEBOX & ~WS_SIZEBOX);
#endif
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
/* srWindow identifies the visible area; dwSize identifies the buffer
*/
width = csbi.srWindow.Right - csbi.srWindow.Left + 1;
#ifdef DEBUG
if (NH_DEVEL_STATUS != NH_STATUS_RELEASED)
fprintf(stdout, "width = %d\n", width);
#endif
}
console.hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
nhassert(console.hConOut != NULL); // NOTE: this assert will not print
GetConsoleScreenBufferInfo(console.hConOut, &console.orig_csbi);
//COORD screencheck = GetLargestConsoleWindowSize(console.hConOut);
GetConsoleMode(console.hConOut, &console.orig_out_cmode);
console.out_cmode = console.orig_out_cmode;
console.out_cmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(console.hConOut, console.out_cmode);
#if 0
/* tests */
WriteConsoleA(console.hConOut, "\033[8;;133t",9, &unused, NULL);
for (i = 0; i < 13; ++i) {
WriteConsoleA(console.hConOut, "0123456789", 10, &unused, NULL);
}
WriteConsoleA(console.hConOut, "\033[3;133ftest", 12, &unused, NULL);
GetConsoleScreenBufferInfo(console.hConOut, &console.orig_csbi);
/* Testing of widths != COLNO has not turned up any problems. Need
* to do a bit more testing and then we are likely to enable having
* console width match window width.
*/
#endif
#if 0
console.width = console.orig_csbi.srWindow.Right -
console.orig_csbi.srWindow.Left + 1;
@@ -2589,19 +2626,19 @@ void nethack_enter_consoletty(void)
/* clear the entire console buffer */
int size = console.orig_csbi.dwSize.X * console.orig_csbi.dwSize.Y;
DWORD unused;
set_console_cursor(0, 0);
FillConsoleOutputAttribute(
console.hConOut, CONSOLE_CLEAR_ATTRIBUTE,
size, console.cursor, &unused);
//int size = console.orig_csbi.dwSize.X * console.orig_csbi.dwSize.Y;
//DWORD unused;
//set_console_cursor(0, 0);
// FillConsoleOutputAttribute(
// console.hConOut, CONSOLE_CLEAR_ATTRIBUTE,
// size, console.cursor, &unused);
FillConsoleOutputCharacter(
console.hConOut, CONSOLE_CLEAR_CHARACTER,
size, console.cursor, &unused);
// FillConsoleOutputCharacter(
// console.hConOut, CONSOLE_CLEAR_CHARACTER,
// size, console.cursor, &unused);
set_console_cursor(1, 0);
SetConsoleCursorPosition(console.hConOut, console.cursor);
//set_console_cursor(1, 0);
//SetConsoleCursorPosition(console.hConOut, console.cursor);
/* At this point early_raw_print will work */
@@ -2744,6 +2781,9 @@ void nethack_enter_consoletty(void)
console.is_ready = TRUE;
nhUse(apisuccess);
}
RESTORE_WARNING_CONDEXPR_IS_CONSTANT
#endif /* TTY_GRAPHICS */
/* this is used as a printf() replacement when the window
@@ -2756,7 +2796,7 @@ VA_DECL(const char *, fmt)
VA_START(fmt);
VA_INIT(fmt, const char *);
(void) vsnprintf(buf, sizeof buf, fmt, VA_ARGS);
if (redirect_stdout)
if (redirect_stdout || program_state.early_options)
fprintf(stdout, "%s", buf);
else {
#ifdef TTY_GRAPHICS

View File

@@ -2,7 +2,7 @@
if not exist lib\* mkdir lib
if [%1] == [lua] (
set LUA_VERSION=5.4.6
set LUA_VERSION=5.4.8
set LUASRC=../lib/lua
set CURLLUASRC=http://www.lua.org/ftp/lua-%LUA_VERSION%.tar.gz
set CURLLUADST=lua-%LUA_VERSION%.tar.gz

View File

@@ -6,12 +6,12 @@ fi
if [ $1 == "lua" ]; then
if [ -z "$LUA_VERSION" ]; then
export LUA_VERSION=5.4.6
export LUA_VERSION=5.4.8
export LUASRC=../lib/lua
fi
export CURLLUASRC=http://www.lua.org/ftp/lua-5.4.6.tar.gz
export CURLLUADST=lua-5.4.6.tar.gz
export CURLLUASRC=http://www.lua.org/ftp/lua-5.4.8.tar.gz
export CURLLUADST=lua-5.4.8.tar.gz
if [ ! -f lib/lua.h ] ;then
cd lib

View File

@@ -57,6 +57,12 @@ OPTIONS=!autopickup
# Set the default boulder symbol to '0'
OPTIONS=boulder:0
# Disable the prompt for a tutorial
#OPTIONS=!tutorial
# Disable game tips
#OPTIONS=!tips
# Highlight menu lines with different colors. You need to define the colors
# with MENUCOLOR lines.
# Toggle menucolor use on or off

View File

@@ -1,2 +1,2 @@
* NH_filestag=(file%s_for_Visual_Studio_2019_or_2022_Community_Edition_builds)
* NH_filestag=(file%s_for_Visual_Studio_Community_builds)
..files !NH_filegenerated

View File

@@ -9,7 +9,7 @@ NHV=$(NETHACK_VERSION:.=)
NHV=$(NHV:"=)
# The version of Lua we want
LUA_VERSION=5.4.6
LUA_VERSION=5.4.8
CURLLUASRC=https://www.lua.org/ftp/lua-$(LUA_VERSION).tar.gz
CURLLUADST=lua-$(LUA_VERSION).tar.gz
@@ -33,7 +33,7 @@ SUBMDIR=$(ROOTDIR)\$(SUBMSDIR)
default: fetchall
fetchall: libdir fetch-Lua fetch-pdcurses ..\..\..\..\include\nhlua.h
fetchall: libdir fetch-Lua fetch-pdcurses
fetch-lua: fetch-actual-Lua
@@ -56,14 +56,6 @@ fetch-pdcurses:
cd ..\sys\windows\vs\fetchprereq
@echo $(PDCDIST) has been fetched into $(LIBDIR)\$(PDCDIST)
..\..\..\..\include\nhlua.h:
@echo /* nhlua.h - generated by Makefile from fetchprereq.nmake */ > $@
@echo #include "lua.h" >> $@
@echo ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN; >> $@
@echo #include "lualib.h" >> $@
@echo #include "lauxlib.h" >> $@
@echo /*nhlua.h*/ >> $@
libdir:
@if not exist $(LIBDIR)\*.* echo creating directory $(LIB:\=/)
@if not exist $(LIBDIR)\*.* mkdir $(LIBDIR)

View File

@@ -1,10 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -39,10 +47,18 @@
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>

View File

@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
# Visual Studio Version 18
VisualStudioVersion = 18.0.11205.157
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetHackW", "NetHackW\NetHackW.vcxproj", "{CEC5D360-8804-454F-8591-002184C23499}"
ProjectSection(ProjectDependencies) = postProject
@@ -12,6 +12,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetHackW", "NetHackW\NetHac
{63F9B82B-F589-4082-ABE5-D4F0682050AB} = {63F9B82B-F589-4082-ABE5-D4F0682050AB}
{642BC75D-ABAF-403E-8224-7C725FD4CB42} = {642BC75D-ABAF-403E-8224-7C725FD4CB42}
{93F10526-209E-41D7-BBEA-775787876895} = {93F10526-209E-41D7-BBEA-775787876895}
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}
EndProjectSection
EndProject
@@ -26,7 +27,7 @@ EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makedefs", "makedefs\makedefs.vcxproj", "{BA3DD34C-04B7-40D0-B373-9329AA9E8945}"
ProjectSection(ProjectDependencies) = postProject
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}
{503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67}
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recover", "recover\recover.vcxproj", "{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}"
@@ -41,26 +42,28 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tile2bmp", "tile2bmp\tile2b
ProjectSection(ProjectDependencies) = postProject
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}
{503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67}
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tilemap", "tilemap\tilemap.vcxproj", "{93F10526-209E-41D7-BBEA-775787876895}"
ProjectSection(ProjectDependencies) = postProject
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}
{503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67}
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uudecode", "uudecode\uudecode.vcxproj", "{63F9B82B-F589-4082-ABE5-D4F0682050AB}"
ProjectSection(ProjectDependencies) = postProject
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}
{503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67}
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetHack", "NetHack\NetHack.vcxproj", "{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}"
ProjectSection(ProjectDependencies) = postProject
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} = {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3} = {096FD6BB-256A-4E68-9B09-2ACA7C606FF3}
{503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67}
{63F9B82B-F589-4082-ABE5-D4F0682050AB} = {63F9B82B-F589-4082-ABE5-D4F0682050AB}
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B} = {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}
EndProjectSection
@@ -83,6 +86,8 @@ EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hacklib", "hacklib\hacklib.vcxproj", "{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}"
ProjectSection(ProjectDependencies) = postProject
{503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67}
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fetchprereq", "FetchPrereq\fetchprereq.vcxproj", "{503AE687-C33A-45ED-93AA-83967E176D67}"
@@ -98,6 +103,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "package", "package\package.
{63F9B82B-F589-4082-ABE5-D4F0682050AB} = {63F9B82B-F589-4082-ABE5-D4F0682050AB}
{642BC75D-ABAF-403E-8224-7C725FD4CB42} = {642BC75D-ABAF-403E-8224-7C725FD4CB42}
{93F10526-209E-41D7-BBEA-775787876895} = {93F10526-209E-41D7-BBEA-775787876895}
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5} = {A3B1A65E-4B65-4B67-ADF1-0E38567013A5}
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}
{BA3DD34C-04B7-40D0-B373-9329AA9E8945} = {BA3DD34C-04B7-40D0-B373-9329AA9E8945}
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B} = {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}
{CEC5D360-8804-454F-8591-002184C23499} = {CEC5D360-8804-454F-8591-002184C23499}
@@ -108,126 +115,202 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lualib", "lualib\lualib.vcx
{503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nhlua_h", "nhlua_h\nhlua_h.vcxproj", "{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}"
ProjectSection(ProjectDependencies) = postProject
{503AE687-C33A-45ED-93AA-83967E176D67} = {503AE687-C33A-45ED-93AA-83967E176D67}
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037} = {B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Release|ARM64 = Release|ARM64
Release|Win32 = Release|Win32
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CEC5D360-8804-454F-8591-002184C23499}.Debug|ARM64.ActiveCfg = Debug|ARM64
{CEC5D360-8804-454F-8591-002184C23499}.Debug|ARM64.Build.0 = Debug|ARM64
{CEC5D360-8804-454F-8591-002184C23499}.Debug|Win32.ActiveCfg = Debug|Win32
{CEC5D360-8804-454F-8591-002184C23499}.Debug|Win32.Build.0 = Debug|Win32
{CEC5D360-8804-454F-8591-002184C23499}.Debug|x64.ActiveCfg = Debug|x64
{CEC5D360-8804-454F-8591-002184C23499}.Debug|x64.Build.0 = Debug|x64
{CEC5D360-8804-454F-8591-002184C23499}.Release|ARM64.ActiveCfg = Release|ARM64
{CEC5D360-8804-454F-8591-002184C23499}.Release|ARM64.Build.0 = Release|ARM64
{CEC5D360-8804-454F-8591-002184C23499}.Release|Win32.ActiveCfg = Release|Win32
{CEC5D360-8804-454F-8591-002184C23499}.Release|Win32.Build.0 = Release|Win32
{CEC5D360-8804-454F-8591-002184C23499}.Release|x64.ActiveCfg = Release|x64
{CEC5D360-8804-454F-8591-002184C23499}.Release|x64.Build.0 = Release|x64
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|ARM64.ActiveCfg = Debug|ARM64
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|ARM64.Build.0 = Debug|ARM64
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|Win32.ActiveCfg = Debug|Win32
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|Win32.Build.0 = Debug|Win32
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|x64.ActiveCfg = Debug|x64
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Debug|x64.Build.0 = Debug|x64
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|ARM64.ActiveCfg = Release|ARM64
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|ARM64.Build.0 = Release|ARM64
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|Win32.ActiveCfg = Release|Win32
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|Win32.Build.0 = Release|Win32
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|x64.ActiveCfg = Release|x64
{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}.Release|x64.Build.0 = Release|x64
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|ARM64.ActiveCfg = Debug|ARM64
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|ARM64.Build.0 = Debug|ARM64
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|Win32.ActiveCfg = Debug|Win32
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|Win32.Build.0 = Debug|Win32
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|x64.ActiveCfg = Debug|x64
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Debug|x64.Build.0 = Debug|x64
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|ARM64.ActiveCfg = Release|ARM64
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|ARM64.Build.0 = Release|ARM64
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|Win32.ActiveCfg = Release|Win32
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|Win32.Build.0 = Release|Win32
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|x64.ActiveCfg = Release|x64
{BA3DD34C-04B7-40D0-B373-9329AA9E8945}.Release|x64.Build.0 = Release|x64
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|ARM64.ActiveCfg = Debug|ARM64
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|ARM64.Build.0 = Debug|ARM64
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|Win32.ActiveCfg = Debug|Win32
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|Win32.Build.0 = Debug|Win32
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|x64.ActiveCfg = Debug|x64
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Debug|x64.Build.0 = Debug|x64
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|ARM64.ActiveCfg = Release|ARM64
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|ARM64.Build.0 = Release|ARM64
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|Win32.ActiveCfg = Release|Win32
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|Win32.Build.0 = Release|Win32
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|x64.ActiveCfg = Release|x64
{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}.Release|x64.Build.0 = Release|x64
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|ARM64.ActiveCfg = Debug|ARM64
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|ARM64.Build.0 = Debug|ARM64
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|Win32.ActiveCfg = Debug|Win32
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|Win32.Build.0 = Debug|Win32
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|x64.ActiveCfg = Debug|x64
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Debug|x64.Build.0 = Debug|x64
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|ARM64.ActiveCfg = Release|ARM64
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|ARM64.Build.0 = Release|ARM64
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|Win32.ActiveCfg = Release|Win32
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|Win32.Build.0 = Release|Win32
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|x64.ActiveCfg = Release|x64
{642BC75D-ABAF-403E-8224-7C725FD4CB42}.Release|x64.Build.0 = Release|x64
{93F10526-209E-41D7-BBEA-775787876895}.Debug|ARM64.ActiveCfg = Debug|ARM64
{93F10526-209E-41D7-BBEA-775787876895}.Debug|ARM64.Build.0 = Debug|ARM64
{93F10526-209E-41D7-BBEA-775787876895}.Debug|Win32.ActiveCfg = Debug|Win32
{93F10526-209E-41D7-BBEA-775787876895}.Debug|Win32.Build.0 = Debug|Win32
{93F10526-209E-41D7-BBEA-775787876895}.Debug|x64.ActiveCfg = Debug|x64
{93F10526-209E-41D7-BBEA-775787876895}.Debug|x64.Build.0 = Debug|x64
{93F10526-209E-41D7-BBEA-775787876895}.Release|ARM64.ActiveCfg = Release|ARM64
{93F10526-209E-41D7-BBEA-775787876895}.Release|ARM64.Build.0 = Release|ARM64
{93F10526-209E-41D7-BBEA-775787876895}.Release|Win32.ActiveCfg = Release|Win32
{93F10526-209E-41D7-BBEA-775787876895}.Release|Win32.Build.0 = Release|Win32
{93F10526-209E-41D7-BBEA-775787876895}.Release|x64.ActiveCfg = Release|x64
{93F10526-209E-41D7-BBEA-775787876895}.Release|x64.Build.0 = Release|x64
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|ARM64.ActiveCfg = Debug|ARM64
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|ARM64.Build.0 = Debug|ARM64
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|Win32.ActiveCfg = Debug|Win32
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|Win32.Build.0 = Debug|Win32
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|x64.ActiveCfg = Debug|x64
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Debug|x64.Build.0 = Debug|x64
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|ARM64.ActiveCfg = Release|ARM64
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|ARM64.Build.0 = Release|ARM64
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|Win32.ActiveCfg = Release|Win32
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|Win32.Build.0 = Release|Win32
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|x64.ActiveCfg = Release|x64
{63F9B82B-F589-4082-ABE5-D4F0682050AB}.Release|x64.Build.0 = Release|x64
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|ARM64.ActiveCfg = Debug|ARM64
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|ARM64.Build.0 = Debug|ARM64
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|Win32.ActiveCfg = Debug|Win32
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|Win32.Build.0 = Debug|Win32
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|x64.ActiveCfg = Debug|x64
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Debug|x64.Build.0 = Debug|x64
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|ARM64.ActiveCfg = Release|ARM64
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|ARM64.Build.0 = Release|ARM64
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|Win32.ActiveCfg = Release|Win32
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|Win32.Build.0 = Release|Win32
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|x64.ActiveCfg = Release|x64
{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}.Release|x64.Build.0 = Release|x64
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|ARM64.ActiveCfg = Debug|ARM64
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|ARM64.Build.0 = Debug|ARM64
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|Win32.ActiveCfg = Debug|Win32
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|Win32.Build.0 = Debug|Win32
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|x64.ActiveCfg = Debug|x64
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Debug|x64.Build.0 = Debug|x64
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|ARM64.ActiveCfg = Release|ARM64
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|ARM64.Build.0 = Release|ARM64
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|Win32.ActiveCfg = Release|Win32
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|Win32.Build.0 = Release|Win32
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|x64.ActiveCfg = Release|x64
{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|x64.Build.0 = Release|x64
{1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|ARM64.ActiveCfg = Debug|ARM64
{1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|ARM64.Build.0 = Debug|ARM64
{1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|Win32.ActiveCfg = Debug|Win32
{1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|Win32.Build.0 = Debug|Win32
{1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|x64.ActiveCfg = Debug|x64
{1693F852-A207-4348-8223-222C2A7FEEEB}.Debug|x64.Build.0 = Debug|x64
{1693F852-A207-4348-8223-222C2A7FEEEB}.Release|ARM64.ActiveCfg = Release|ARM64
{1693F852-A207-4348-8223-222C2A7FEEEB}.Release|ARM64.Build.0 = Release|ARM64
{1693F852-A207-4348-8223-222C2A7FEEEB}.Release|Win32.ActiveCfg = Release|Win32
{1693F852-A207-4348-8223-222C2A7FEEEB}.Release|Win32.Build.0 = Release|Win32
{1693F852-A207-4348-8223-222C2A7FEEEB}.Release|x64.ActiveCfg = Release|x64
{1693F852-A207-4348-8223-222C2A7FEEEB}.Release|x64.Build.0 = Release|x64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|ARM64.ActiveCfg = Debug|ARM64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|ARM64.Build.0 = Debug|ARM64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|Win32.ActiveCfg = Debug|Win32
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|Win32.Build.0 = Debug|Win32
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x64.ActiveCfg = Debug|x64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x64.Build.0 = Debug|x64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|ARM64.ActiveCfg = Release|ARM64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|ARM64.Build.0 = Release|ARM64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|Win32.ActiveCfg = Release|Win32
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|Win32.Build.0 = Release|Win32
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x64.ActiveCfg = Release|x64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x64.Build.0 = Release|x64
{503AE687-C33A-45ED-93AA-83967E176D67}.Debug|ARM64.ActiveCfg = Debug|ARM64
{503AE687-C33A-45ED-93AA-83967E176D67}.Debug|ARM64.Build.0 = Debug|ARM64
{503AE687-C33A-45ED-93AA-83967E176D67}.Debug|Win32.ActiveCfg = Debug|Win32
{503AE687-C33A-45ED-93AA-83967E176D67}.Debug|Win32.Build.0 = Debug|Win32
{503AE687-C33A-45ED-93AA-83967E176D67}.Debug|x64.ActiveCfg = Debug|x64
{503AE687-C33A-45ED-93AA-83967E176D67}.Debug|x64.Build.0 = Debug|x64
{503AE687-C33A-45ED-93AA-83967E176D67}.Release|ARM64.ActiveCfg = Release|ARM64
{503AE687-C33A-45ED-93AA-83967E176D67}.Release|ARM64.Build.0 = Release|ARM64
{503AE687-C33A-45ED-93AA-83967E176D67}.Release|Win32.ActiveCfg = Release|Win32
{503AE687-C33A-45ED-93AA-83967E176D67}.Release|Win32.Build.0 = Release|Win32
{503AE687-C33A-45ED-93AA-83967E176D67}.Release|x64.ActiveCfg = Release|x64
{503AE687-C33A-45ED-93AA-83967E176D67}.Release|x64.Build.0 = Release|x64
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|ARM64.ActiveCfg = Debug|ARM64
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|ARM64.Build.0 = Debug|ARM64
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|Win32.ActiveCfg = Debug|Win32
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|Win32.Build.0 = Debug|Win32
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|x64.ActiveCfg = Debug|x64
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Debug|x64.Build.0 = Debug|x64
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|ARM64.ActiveCfg = Release|ARM64
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|ARM64.Build.0 = Release|ARM64
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|Win32.ActiveCfg = Release|Win32
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|Win32.Build.0 = Release|Win32
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|x64.ActiveCfg = Release|x64
{0B53AF9B-E1A4-478B-9246-43A39E8B4027}.Release|x64.Build.0 = Release|x64
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|ARM64.ActiveCfg = Debug|ARM64
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|ARM64.Build.0 = Debug|ARM64
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|Win32.ActiveCfg = Debug|Win32
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|Win32.Build.0 = Debug|Win32
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|x64.ActiveCfg = Debug|x64
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Debug|x64.Build.0 = Debug|x64
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|ARM64.ActiveCfg = Release|ARM64
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|ARM64.Build.0 = Release|ARM64
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|Win32.ActiveCfg = Release|Win32
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|Win32.Build.0 = Release|Win32
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|x64.ActiveCfg = Release|x64
{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}.Release|x64.Build.0 = Release|x64
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|ARM64.ActiveCfg = Debug|ARM64
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|ARM64.Build.0 = Debug|ARM64
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|Win32.ActiveCfg = Debug|Win32
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|Win32.Build.0 = Debug|Win32
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|x64.ActiveCfg = Debug|x64
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Debug|x64.Build.0 = Debug|x64
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|ARM64.ActiveCfg = Release|ARM64
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|ARM64.Build.0 = Release|ARM64
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|Win32.ActiveCfg = Release|Win32
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|Win32.Build.0 = Release|Win32
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|x64.ActiveCfg = Release|x64
{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -1,13 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\config.props" />
<Import Project="..\dirs.props" />
<PropertyGroup Label="Globals">
<ProjectGuid>{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>NetHack</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="..\default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -15,6 +9,38 @@
<Import Project="..\console.props" />
<Import Project="..\common.props" />
<Import Project="..\files.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{609BC774-C6F8-4B2B-AA7D-5B3D0EA95751}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>NetHack</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<PropertyGroup>
<OutDir>$(BinDir)</OutDir>
</PropertyGroup>
@@ -41,20 +67,21 @@
<ItemDefinitionGroup>
<ClCompile>
<AdditionalOptions>/Gs /Oi- /w44774 /w45262 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4100;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Platform)'=='ARM64'">4100;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Platform)'!='ARM64'">4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<Optimization>Disabled</Optimization>
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard_C>stdclatest</LanguageStandard_C>
</ClCompile>
<Link>
<AdditionalDependencies>hacklib.lib;lualib.lib;kernel32.lib;dbghelp.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;winmm.lib;Winmm.lib;UserEnv.lib;bcrypt.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ResourceCompile>
<AdditionalIncludeDirectories>$(SndWavDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(SndWavDir);$(SysWindDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
@@ -86,6 +113,7 @@
<ClCompile Include="$(SrcDir)do_wear.c" />
<ClCompile Include="$(SrcDir)drawing.c" />
<ClCompile Include="$(SrcDir)dungeon.c" />
<ClCompile Include="$(SrcDir)earlyarg.c" />
<ClCompile Include="$(SrcDir)eat.c" />
<ClCompile Include="$(SrcDir)end.c" />
<ClCompile Include="$(SrcDir)engrave.c" />
@@ -98,6 +126,7 @@
<ClCompile Include="$(SrcDir)glyphs.c" />
<ClCompile Include="$(SrcDir)hack.c" />
<ClCompile Include="$(SrcDir)insight.c" />
<ClCompile Include="$(SrcDir)iactions.c" />
<ClCompile Include="$(SrcDir)invent.c" />
<ClCompile Include="$(SrcDir)isaac64.c" />
<ClCompile Include="$(SrcDir)light.c" />
@@ -189,7 +218,6 @@
<ClCompile Include="$(SysWindDir)windmain.c" />
<ClCompile Include="$(SysWindDir)windsys.c" />
<ClCompile Include="$(SndWindDir)windsound.c" />
<ClCompile Include="$(WinShareDir)safeproc.c" />
<ClCompile Include="$(WinTtyDir)getline.c" />
<ClCompile Include="$(WinTtyDir)topl.c" />
<ClCompile Include="$(WinTtyDir)wintty.c" />
@@ -231,6 +259,7 @@
<ClInclude Include="$(IncDir)isaac64.h" />
<ClInclude Include="$(IncDir)lint.h" />
<ClInclude Include="$(IncDir)load_img.h" />
<ClInclude Include="$(IncDir)mcastu.h" />
<ClInclude Include="$(IncDir)mextra.h" />
<ClInclude Include="$(IncDir)mfndpos.h" />
<ClInclude Include="$(IncDir)mkroom.h" />

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros">
<VERSION_MAJOR>3</VERSION_MAJOR>
@@ -8,7 +8,7 @@
<NETHACK_VERSION>$(VERSION_MAJOR).$(VERSION_MINOR).$(PATCHLEVEL)</NETHACK_VERSION>
<LUA_MAJOR_VERSION>5</LUA_MAJOR_VERSION>
<LUA_MINOR_VERSION>4</LUA_MINOR_VERSION>
<LUA_PATCH_LEVEL>6></LUA_PATCH_LEVEL>
<LUA_PATCH_LEVEL>8></LUA_PATCH_LEVEL>
<LUA_VERSION>$(LUA_MAJOR_VERSION).$(LUA_MINOR_VERSION).$(LUA_PATCH_LEVEL)</LUA_VERSION>
<FMODROOT>$(ROOTDIR)lib\fmod\api\core\</FMODROOT>
<FMODLIBBASENAME>fmod_vc.lib</FMODLIBBASENAME>

View File

@@ -1,6 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\config.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{CEC5D360-8804-454F-8591-002184C23499}</ProjectGuid>
<RootNamespace>NetHackW</RootNamespace>
@@ -42,18 +68,26 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<RunCodeAnalysis>false</RunCodeAnalysis>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<RunCodeAnalysis>false</RunCodeAnalysis>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<RunCodeAnalysis>false</RunCodeAnalysis>
<EnableMicrosoftCodeAnalysis>false</EnableMicrosoftCodeAnalysis>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<RunCodeAnalysis>false</RunCodeAnalysis>
<EnableMicrosoftCodeAnalysis>false</EnableMicrosoftCodeAnalysis>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalOptions>/Gs /Oi- /w44774 /w45262 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4100;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Platform)'=='ARM64'">4100;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Platform)'!='ARM64'">4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<Optimization>Disabled</Optimization>
<OmitFramePointers>true</OmitFramePointers>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;SAFEPROCS;NOTTYGRAPHICS;SND_LIB_WINDSOUND;USER_SOUNDS;HAS_STDINT_H;PDC_WIDE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;NOTTYGRAPHICS;SND_LIB_WINDSOUND;USER_SOUNDS;SND_SOUNDEFFECTS_AUTOMAP;HAS_STDINT_H;HAS_INTTYPES_H;PDC_WIDE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142' And '$(Configuration)|$(Platform)'=='Debug|Win32'">stdclatest</LanguageStandard_C>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142' And '$(Configuration)|$(Platform)'=='Release|Win32'">stdclatest</LanguageStandard_C>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142' And '$(Configuration)|$(Platform)'=='Debug|x64'">stdclatest</LanguageStandard_C>
@@ -62,10 +96,7 @@
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0409</Culture>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SndWavDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SndWavDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SndWavDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SndWavDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(SndWavDir);$(SysWindDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -104,6 +135,7 @@
<ClCompile Include="$(SrcDir)do_wear.c" />
<ClCompile Include="$(SrcDir)drawing.c" />
<ClCompile Include="$(SrcDir)dungeon.c" />
<ClCompile Include="$(SrcDir)earlyarg.c" />
<ClCompile Include="$(SrcDir)eat.c" />
<ClCompile Include="$(SrcDir)end.c" />
<ClCompile Include="$(SrcDir)engrave.c" />
@@ -115,6 +147,7 @@
<ClCompile Include="$(SrcDir)getpos.c" />
<ClCompile Include="$(SrcDir)glyphs.c" />
<ClCompile Include="$(SrcDir)hack.c" />
<ClCompile Include="$(SrcDir)iactions.c" />
<ClCompile Include="$(SrcDir)invent.c" />
<ClCompile Include="$(SrcDir)insight.c" />
<ClCompile Include="$(SrcDir)isaac64.c" />
@@ -144,7 +177,9 @@
<ClCompile Include="$(SrcDir)nhlsel.c" />
<ClCompile Include="$(SrcDir)nhlua.c">
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4100;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">4100;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|x64'">4100;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">4100;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
</ClCompile>
<ClCompile Include="$(SrcDir)objects.c" />
<ClCompile Include="$(SrcDir)objnam.c" />
@@ -215,7 +250,9 @@
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(WinCursDir)curswins.c" />
<ClCompile Condition="Exists('$(FMODINCDIR)\fmod.h') And Exists('$(FMODLIBLIB)') And Exists('$(FMODLIBDLL)')" Include="$(FMODSRC)">
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4100;4201;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">4100;4201;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|x64'">4100;4201;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">4100;4201;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">4100;4201;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">4100;4201;4244;4245;4310;4706;4820</DisableSpecificWarnings>
</ClCompile>
@@ -226,7 +263,6 @@
<ClCompile Include="$(SysWindDir)windsys.c" />
<ClCompile Include="$(SysWindDir)win10.c" />
<ClCompile Include="$(SndWindDir)windsound.c" />
<ClCompile Include="$(WinShareDir)safeproc.c" />
<ClCompile Include="$(WinWin32Dir)mhaskyn.c" />
<ClCompile Include="$(WinWin32Dir)mhdlg.c" />
<ClCompile Include="$(WinWin32Dir)mhfont.c" />
@@ -291,6 +327,7 @@
<ClInclude Include="$(IncDir)lint.h" />
<ClInclude Include="$(IncDir)load_img.h" />
<ClInclude Include="$(IncDir)mail.h" />
<ClInclude Include="$(IncDir)mcastu.h" />
<ClInclude Include="$(IncDir)mextra.h" />
<ClInclude Include="$(IncDir)mfndpos.h" />
<ClInclude Include="$(IncDir)micro.h" />

View File

@@ -1,7 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\dirs.props" />
<Import Project="..\config.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{BAA70D0F-3EC7-4D10-91F0-974F1F49308B}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
@@ -34,7 +60,9 @@
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\pdcurses\insch.c" />
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\pdcurses\insstr.c">
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|x64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\pdcurses\kernel.c" />
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\pdcurses\keyname.c" />
@@ -56,11 +84,15 @@
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\pdcurses\window.c" />
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\wincon\pdcclip.c">
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|x64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\wincon\pdcdisp.c">
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|x64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\wincon\pdcgetsc.c" />
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\wincon\pdckbd.c" />
@@ -100,6 +132,12 @@
<PreprocessorDefinitions>_DEBUG;_LIB;PDC_RGB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_LIB;PDC_RGB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
@@ -124,5 +162,17 @@
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_LIB;PDC_RGB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

View File

@@ -2,6 +2,32 @@
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\dirs.props" />
<Import Project="..\config.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{1693F852-A207-4348-8223-222C2A7FEEEB}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
@@ -34,7 +60,9 @@
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\pdcurses\insch.c" />
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\pdcurses\insstr.c">
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|x64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">4996;4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\pdcurses\kernel.c" />
<ClCompile Condition="Exists('$(PDCURSES)')" Include="$(PDCURSES)\pdcurses\keyname.c" />
@@ -94,6 +122,12 @@
<PreprocessorDefinitions>_DEBUG;_LIB;PDC_WIDE;PDC_RGB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_LIB;PDC_WIDE;PDC_RGB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
@@ -118,5 +152,17 @@
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_LIB;PDC_WIDE;PDC_RGB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<LUA_VERSION>5.4.6</LUA_VERSION>
<LUA_VERSION>5.4.8</LUA_VERSION>
<RootDir>$(MSBuildProjectDirectory)\..\..\..\..\</RootDir>
<BinDir>$(RootDir)binary\$(Configuration)\$(Platform)\</BinDir>
<ObjDir>$(ProjectDir)obj\$(Configuration)\$(Platform)\$(TargetName)\</ObjDir>
@@ -31,6 +31,7 @@
<LuaDir>$(LibDir)lua-$(LUA_VERSION)\src\</LuaDir>
<SftagsDir>$(RootDir)\sys\windows\vs\sftags\</SftagsDir>
<SfctoolDir>$(RootDir)\sys\windows\vs\sfctool\</SfctoolDir>
<PackageBin>$(RootDir)binary\$(Configuration)\$(Platform)</PackageBin>
</PropertyGroup>
<PropertyGroup Condition="'$(PDCURSESMOD)'=='' AND Exists('$(LibDir)pdcursesmod\curses.h')">
<PDCURSESMOD>$(LibDir)pdcursesmod\</PDCURSESMOD>
@@ -40,4 +41,32 @@
<PDCURSESMOD>$(SubmodulesDir)pdcursesmod\</PDCURSESMOD>
<PDCURSES>$(PDCURSESMOD)</PDCURSES>
</PropertyGroup>
<PropertyGroup>
<HostTools></HostTools>
<Host>$(Platform)</Host>
</PropertyGroup>
<PropertyGroup Condition="'$(PROCESSOR_ARCHITECTURE)'=='ARM64'AND '$(Platform)'=='x86'">
<HostTools>..\ARM64\</HostTools>
<Host>arm64</Host>
</PropertyGroup>
<PropertyGroup Condition="'$(PROCESSOR_ARCHITECTURE)'=='ARM64'AND '$(Platform)'=='x64'">
<HostTools>..\ARM64\</HostTools>
<Host>arm64</Host>
</PropertyGroup>
<PropertyGroup Condition="'$(PROCESSOR_ARCHITECTURE)'=='ARM64'AND '$(Platform)'=='ARM64'">
<HostTools>..\ARM64\</HostTools>
<Host>arm64</Host>
</PropertyGroup>
<PropertyGroup Condition="'$(PROCESSOR_ARCHITECTURE)'=='AMD64'AND '$(Platform)'=='x86'">
<HostTools>..\x64\</HostTools>
<Host>x64</Host>
</PropertyGroup>
<PropertyGroup Condition="'$(PROCESSOR_ARCHITECTURE)'=='AMD64'AND '$(Platform)'=='x64'">
<HostTools>..\x64\</HostTools>
<Host>x64</Host>
</PropertyGroup>
<PropertyGroup Condition="'$(PROCESSOR_ARCHITECTURE)'=='AMD64'AND '$(Platform)'=='ARM64'">
<HostTools>..\x64\</HostTools>
<Host>x64</Host>
</PropertyGroup>
</Project>

View File

@@ -2,12 +2,12 @@
<Import Project="..\dirs.props"/>
<Import Project="$(vsDir)files.props"/>
<Target Name="Build"
Inputs="$(ToolsDir)dlb.exe;@(DlbList);$(SysWindDir)porthelp"
Inputs="$(ToolsDir)$(HostTools)dlb.exe;@(DlbList);$(SysWindDir)porthelp"
Outputs="$(BinDir)nhdat$(VERSION_MAJOR)$(VERSION_MINOR)$(PATCHLEVEL)">
<MakeDir Directories="$(BinDir)"/>
<Copy SourceFiles="$(SysWindDir)porthelp" DestinationFolder="$(DatDir)"/>
<WriteLinesToFile File="$(DatDir)dlb.lst" Lines="@(DlbList->'%(filename)%(extension)')" Overwrite="true"/>
<Exec Command="&quot;$(ToolsDir)dlb.exe&quot; cIf dlb.lst &quot;$(BinDir)\nhdat&quot;" WorkingDirectory="$(DatDir)"/>
<Exec Command="&quot;$(ToolsDir)$(HostTools)dlb.exe&quot; cIf dlb.lst &quot;$(BinDir)\nhdat&quot;" WorkingDirectory="$(DatDir)"/>
<Delete Files="$(DatDir)porthelp"/>
</Target>
<Target Name="Clean">

View File

@@ -2,6 +2,32 @@
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\dirs.props" />
<Import Project="..\config.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}</ProjectGuid>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
@@ -15,19 +41,25 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<Import Project="..\console.props" />
<Import Project="..\common.props" />
<Import Project="..\files.props" />
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(SysShareDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142' And '$(Configuration)|$(Platform)'=='Debug|Win32'">stdclatest</LanguageStandard_C>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142' And '$(Configuration)|$(Platform)'=='Release|Win32'">stdclatest</LanguageStandard_C>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142' And '$(Configuration)|$(Platform)'=='Debug|x64'">stdclatest</LanguageStandard_C>
@@ -35,7 +67,9 @@
</ClCompile>
<Link>
<AdditionalLibraryDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Link>
<AdditionalLibraryDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -47,7 +81,9 @@
</Link>
<Link>
<AdditionalLibraryDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Release|x64'">hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@@ -68,4 +104,4 @@
<Target Name="AfterRebuild">
<MSBuild Projects="afterdlb.proj" Targets="Build" Properties="Configuration=$(Configuration)" />
</Target>
</Project>
</Project>

View File

@@ -1,10 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -39,10 +47,18 @@
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -67,5 +83,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@@ -33,6 +33,7 @@
<Luafiles Include = "bigrm-10.lua"/>
<Luafiles Include = "bigrm-11.lua"/>
<Luafiles Include = "bigrm-12.lua"/>
<Luafiles Include = "bigrm-13.lua"/>
<Luafiles Include = "bigrm-2.lua"/>
<Luafiles Include = "bigrm-3.lua"/>
<Luafiles Include = "bigrm-4.lua"/>

View File

@@ -6,11 +6,25 @@
<Import Project="..\common.props" />
<Import Project="..\files.props" />
<Import Project="..\NetHackProperties.props" />
<PropertyGroup Label="Globals">
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}</ProjectGuid>
<RootNamespace>hacklib</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -43,13 +57,6 @@
<ClInclude Include="$(IncDir)tradstdc.h" />
<ClInclude Include="$(IncDir)windconf.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}</ProjectGuid>
<RootNamespace>hacklib</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
@@ -67,13 +74,24 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v145</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v145</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
@@ -91,20 +109,26 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142'">stdclatest</LanguageStandard_C>
<AdditionalOptions>/w45262 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ClCompile>
<Link>
<SubSystem>
</SubSystem>
@@ -117,7 +141,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142'">stdclatest</LanguageStandard_C>
@@ -135,7 +159,23 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142'">stdclatest</LanguageStandard_C>
<AdditionalOptions>/w45262 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>
</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142'">stdclatest</LanguageStandard_C>
@@ -153,7 +193,27 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142'">stdclatest</LanguageStandard_C>
<AdditionalOptions>/w45262 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>
</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142'">stdclatest</LanguageStandard_C>
@@ -168,15 +228,6 @@
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Target Name="GenerateHeader" BeforeTargets="ClCompile" Outputs="$(IncDir)\nhlua.h">
<Message Text="Generating $(IncDir)nhlua.h" />
<Exec Command="echo /* nhlua.h - generated by hacklib.vcxproj ClCompile */ &gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo #include %22lua.h%22 &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN; &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo #include %22lualib.h%22 &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo #include %22lauxlib.h%22 &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo /*nhlua.h*/ &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
</Target>
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@@ -6,11 +6,25 @@
<Import Project="..\common.props" />
<Import Project="..\files.props" />
<Import Project="..\NetHackProperties.props" />
<PropertyGroup Label="Globals">
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}</ProjectGuid>
<RootNamespace>lualib</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -26,12 +40,12 @@
</ItemGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalOptions>/Gs /Oi- /w44774 /w45262 %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/Gs /w44774 /w45262 %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4100;4244;4245;4310;4706;4820;4324</DisableSpecificWarnings>
<Optimization>Disabled</Optimization>
<OmitFramePointers>true</OmitFramePointers>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;SAFEPROCS;NOTTYGRAPHICS;SND_LIB_WINDSOUND;USER_SOUNDS;HAS_STDINT_H;PDC_WIDE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>TILES;_WINDOWS;DLB;MSWIN_GRAPHICS;SAFEPROCS;NOTTYGRAPHICS;SND_LIB_WINDSOUND;USER_SOUNDS;HAS_STDINT_H;HAS_INTTYPES_H;PDC_WIDE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard_C>stdclatest</LanguageStandard_C>
</ClCompile>
</ItemDefinitionGroup>
@@ -69,39 +83,29 @@
<ClCompile Include="$(LuaDir)lvm.c" />
<ClCompile Include="$(LuaDir)lzio.c" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{B6B3CC8A-75FD-479C-AB1C-D80FFF0F5037}</ProjectGuid>
<RootNamespace>lualib</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<PropertyGroup Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<PlatformToolset>v145</PlatformToolset>
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<PlatformToolset>v145</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -117,15 +121,21 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Gs /Oi- /w44774 %(AdditionalOptions)</AdditionalOptions>
@@ -142,10 +152,11 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Gs /Oi- /w44774 %(AdditionalOptions)</AdditionalOptions>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>
@@ -159,7 +170,7 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Gs /Oi- /w44774 %(AdditionalOptions)</AdditionalOptions>
@@ -170,16 +181,52 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Gs /w44774 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>
</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Gs /Oi- /w44774 %(AdditionalOptions)</AdditionalOptions>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>
</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>false</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_LIB;WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/Gs /w44774 %(AdditionalOptions)</AdditionalOptions>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>
@@ -190,15 +237,6 @@
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Target Name="GenerateHeader" BeforeTargets="ClCompile" Outputs="$(IncDir)\nhlua.h">
<Message Text="Generating $(IncDir)nhlua.h" />
<Exec Command="echo /* nhlua.h - generated by lualib.vcxproj ClCompile */ &gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo #include %22lua.h%22 &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN; &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo #include %22lualib.h%22 &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo #include %22lauxlib.h%22 &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo /*nhlua.h*/ &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
</Target>
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@@ -2,12 +2,12 @@
<Import Project="..\dirs.props"/>
<Import Project="$(vsDir)files.props"/>
<Target Name="Build"
Inputs="$(ToolsDir)makedefs.exe"
Inputs="$(ToolsDir)$(HostTools)makedefs.exe"
Outputs="@(Defs)">
<Exec Command="&quot;$(ToolsDir)makedefs.exe&quot; -d" WorkingDirectory="$(DatDir)"/>
<Exec Command="&quot;$(ToolsDir)makedefs.exe&quot; -r" WorkingDirectory="$(DatDir)"/>
<Exec Command="&quot;$(ToolsDir)makedefs.exe&quot; -s" WorkingDirectory="$(DatDir)"/>
<Exec Command="&quot;$(ToolsDir)makedefs.exe&quot; -h" WorkingDirectory="$(DatDir)"/>
<Exec Command="&quot;$(ToolsDir)$(HostTools)makedefs.exe&quot; -d" WorkingDirectory="$(DatDir)"/>
<Exec Command="&quot;$(ToolsDir)$(HostTools)makedefs.exe&quot; -r" WorkingDirectory="$(DatDir)"/>
<Exec Command="&quot;$(ToolsDir)$(HostTools)makedefs.exe&quot; -s" WorkingDirectory="$(DatDir)"/>
<Exec Command="&quot;$(ToolsDir)$(HostTools)makedefs.exe&quot; -h" WorkingDirectory="$(DatDir)"/>
</Target>
<Target Name="Clean">
<Delete Files="@(Defs)"/>

View File

@@ -2,6 +2,32 @@
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\config.props" />
<Import Project="..\dirs.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{BA3DD34C-04B7-40D0-B373-9329AA9E8945}</ProjectGuid>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
@@ -15,19 +41,25 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<Import Project="..\console.props" />
<Import Project="..\common.props" />
<Import Project="..\files.props" />
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32CON;DLB;MSWIN_GRAPHICS;ENUM_PM;HAS_STDINT_H;HAS_INTTYPES_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142'">stdclatest</LanguageStandard_C>
<AdditionalOptions>/w45262 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
@@ -68,4 +100,4 @@
<Target Name="AfterRebuild">
<MSBuild Projects="aftermakedefs.proj" Targets="Build" Properties="Configuration=$(Configuration)" />
</Target>
</Project>
</Project>

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\dirs.props" />
<Import Project="..\config.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{A3B1A65E-4B65-4B67-ADF1-0E38567013A5}</ProjectGuid>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="..\default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="PropertySheets">
<Import Project="..\NetHackProperties.props" />
</ImportGroup>
<Import Project="..\console.props" />
<Import Project="..\common.props" />
<Import Project="..\files.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Target Name="GenerateHeader" BeforeTargets="ClCompile" Outputs="$(IncDir)\nhlua.h">
<Message Text="Generating $(IncDir)nhlua.h" />
<Exec Command="echo /* nhlua.h - generated by nhlua_h.vcxproj ClCompile */ &gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo #include %22lua.h%22 &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN; &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo #include %22lualib.h%22 &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo #include %22lauxlib.h%22 &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
<Exec Command="echo /*nhlua.h*/ &gt;&gt; nhlua.h" WorkingDirectory="$(IncDir)" />
</Target> <Target Name="AfterBuild">
</Target>
<Target Name="AfterClean">
</Target>
<Target Name="AfterRebuild">
</Target>
</Project>

View File

@@ -22,6 +22,7 @@ NHV=$(NHV:"=)
#SUBMSDIR=submodules # NetHack git submodules
PACKAGESDIR=vspackage # put in vspackage to distinguish
ROOTDIR=..\..\..\.. # root of NetHack tree relative to project file
PlatformFileName=$(lowercase $(PlatformShortName))
# Directories we might have to collect things from
#
@@ -41,6 +42,7 @@ X11 = $(ROOTDIR)\win\X11 # X11 support files
LIBDIR = $(ROOTDIR)\lib # libraries and external bits
SUBMDIR = $(ROOTDIR)\submodules # NetHack git submodules
SndWavDir = $(ROOTDIR)\sound\wav # sound files that get integrated
DocDir = $(ROOTDIR)\doc
# Directories we might place collected things
#
@@ -73,8 +75,8 @@ FILESTOZIP=$(VSBINDIR)\Guidebook.txt $(VSBINDIR)\license \
DBGSYMS = NetHack.PDB NetHackW.PDB
PDBTOZIP = ..\NetHack\symbols\$(Configuration)\$(Platform)\NetHack.PDB \
..\NetHackW\symbols\$(Configuration)\$(Platform)\NetHackW.PDB
MAINZIP = $(VSPACKAGEDIR)\nethack-$(NHV)-win-$(PlatformShortName).zip
DBGSYMZIP = $(VSPACKAGEDIR)\nethack-$(NHV)-win-$(PlatformShortName)-debugsymbols.zip
MAINZIP = $(VSPACKAGEDIR)\nethack-$(NHV)-win-$(PlatformFileName).zip
DBGSYMZIP = $(VSPACKAGEDIR)\nethack-$(NHV)-win-$(PlatformFileName)-debugsymbols.zip
packageall: packagezip
@@ -91,11 +93,11 @@ $(DBGSYMZIP): $(PDBTOZIP)
$(VSBINDIR)\license: $(BinDir)\license
copy /Y $(BinDir)\license $@
$(VSBINDIR)\Guidebook.txt: $(BinDir)\Guidebook.txt
copy /Y $(BinDir)\Guidebook.txt $@
copy /Y $(DocDir)\Guidebook.txt $@
$(VSBINDIR)\NetHack.exe: $(BinDir)\NetHack.exe
copy /Y $(BinDir)\NetHack.exe $@
$(VSBINDIR)\NetHack.txt: $(BinDir)\NetHack.txt
copy /Y $(BinDir)\NetHack.txt $@
copy /Y $(DocDir)\NetHack.txt $@
$(VSBINDIR)\NetHackW.exe: $(BinDir)\NetHackW.exe
copy /Y $(BinDir)\NetHackW.exe $@
$(VSBINDIR)\opthelp: $(BinDir)\opthelp

View File

@@ -1,10 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -40,10 +48,18 @@
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
<ConfigurationType>Makefile</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -54,9 +70,9 @@
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<NMakeBuildCommandLine>pushd $(vsDir)package %26%26 nmake -F package.nmake BinDir=&quot;$(BinDir)\&quot; Platform=&quot;$(Platform)&quot; PlatformShortName=&quot;$(PlatformShortName)&quot; Configuration=&quot;$(Configuration)&quot; NETHACK_VERSION=&quot;$(NETHACK_VERSION)&quot; %26%26 popd</NMakeBuildCommandLine>
<NMakeCleanCommandLine>pushd $(vsDir)package %26%26 nmake -F package.nmake clean %26%26 popd</NMakeCleanCommandLine>
<NMakeReBuildCommandLine>pushd $(vsDir)package %26%26 nmake -F package.nmake rebuild %26%26 popd</NMakeReBuildCommandLine>
<NMakeBuildCommandLine>pushd $(vsDir)package %26%26 nmake /NOLOGO -F package.nmake BinDir="$(BinDir)\" Platform="$(Platform)" PlatformShortName="$(PlatformShortName)" Configuration="$(Configuration)" NETHACK_VERSION="$(NETHACK_VERSION)" %26%26 popd</NMakeBuildCommandLine>
<NMakeCleanCommandLine>pushd $(vsDir)package %26%26 nmake /NOLOGO -F package.nmake clean %26%26 popd</NMakeCleanCommandLine>
<NMakeReBuildCommandLine>pushd $(vsDir)package %26%26 nmake /NOLOGO -F package.nmake rebuild %26%26 popd</NMakeReBuildCommandLine>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@@ -2,6 +2,32 @@
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\dirs.props" />
<Import Project="..\config.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{2F35F228-6733-4FE5-9B46-B3AA10D4BC2E}</ProjectGuid>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
@@ -19,7 +45,7 @@
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(IncDir);$(SysWindDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;MINIMAL_FOR_RECOVER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;HAS_INTTYPES_H;MINIMAL_FOR_RECOVER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard_C Condition="'$(DefaultPlatformToolset)'!='v142'">stdclatest</LanguageStandard_C>
<AdditionalOptions>/w45262 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
@@ -31,7 +57,7 @@
<ItemGroup>
<ClCompile Include="$(UtilDir)recover.c" />
<ClCompile Include="$(SrcDir)version.c">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;MINIMAL_FOR_RECOVER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">WIN32CON;DLB;MSWIN_GRAPHICS;HAS_STDINT_H;HAS_INTTYPES_H;MINIMAL_FOR_RECOVER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemGroup>
<ItemGroup>
@@ -53,4 +79,4 @@
<Target Name="AfterRebuild">
<MSBuild Projects="afterrecover.proj" Targets="Build" Properties="Configuration=$(Configuration)" />
</Target>
</Project>
</Project>

View File

@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35913.81
# Visual Studio Version 18
VisualStudioVersion = 18.0.11205.157 d18.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sfctool", "sfctool\sfctool.vcxproj", "{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}"
ProjectSection(ProjectDependencies) = postProject
@@ -20,40 +20,58 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hacklib", "hacklib\hacklib.
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|ARM64.ActiveCfg = Debug|ARM64
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|ARM64.Build.0 = Debug|ARM64
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|x64.ActiveCfg = Debug|x64
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|x64.Build.0 = Debug|x64
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|x86.ActiveCfg = Debug|Win32
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Debug|x86.Build.0 = Debug|Win32
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|ARM64.ActiveCfg = Release|ARM64
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|ARM64.Build.0 = Release|ARM64
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|x64.ActiveCfg = Release|x64
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|x64.Build.0 = Release|x64
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|x86.ActiveCfg = Release|Win32
{3BFA3C14-6DA2-4750-B1C6-028B9BCE825E}.Release|x86.Build.0 = Release|Win32
{628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|ARM64.ActiveCfg = Debug|ARM64
{628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|ARM64.Build.0 = Debug|ARM64
{628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|x64.ActiveCfg = Debug|x64
{628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|x64.Build.0 = Debug|x64
{628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|x86.ActiveCfg = Debug|Win32
{628C594A-7565-4366-9FCA-41DB67C6B615}.Debug|x86.Build.0 = Debug|Win32
{628C594A-7565-4366-9FCA-41DB67C6B615}.Release|ARM64.ActiveCfg = Release|ARM64
{628C594A-7565-4366-9FCA-41DB67C6B615}.Release|ARM64.Build.0 = Release|ARM64
{628C594A-7565-4366-9FCA-41DB67C6B615}.Release|x64.ActiveCfg = Release|x64
{628C594A-7565-4366-9FCA-41DB67C6B615}.Release|x64.Build.0 = Release|x64
{628C594A-7565-4366-9FCA-41DB67C6B615}.Release|x86.ActiveCfg = Release|Win32
{628C594A-7565-4366-9FCA-41DB67C6B615}.Release|x86.Build.0 = Release|Win32
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|ARM64.ActiveCfg = Debug|ARM64
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|ARM64.Build.0 = Debug|ARM64
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|x64.ActiveCfg = Debug|x64
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|x64.Build.0 = Debug|x64
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|x86.ActiveCfg = Debug|Win32
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Debug|x86.Build.0 = Debug|Win32
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|ARM64.ActiveCfg = Release|ARM64
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|ARM64.Build.0 = Release|ARM64
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|x64.ActiveCfg = Release|x64
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|x64.Build.0 = Release|x64
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|x86.ActiveCfg = Release|Win32
{AAE63AD3-8185-4E19-B6A3-13F4CB891AAD}.Release|x86.Build.0 = Release|Win32
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|ARM64.ActiveCfg = Debug|ARM64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|ARM64.Build.0 = Debug|ARM64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x64.ActiveCfg = Debug|x64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x64.Build.0 = Debug|x64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x86.ActiveCfg = Debug|Win32
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Debug|x86.Build.0 = Debug|Win32
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|ARM64.ActiveCfg = Release|ARM64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|ARM64.Build.0 = Release|ARM64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x64.ActiveCfg = Release|x64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x64.Build.0 = Release|x64
{096FD6BB-256A-4E68-9B09-2ACA7C606FF3}.Release|x86.ActiveCfg = Release|Win32

View File

@@ -11,10 +11,18 @@
<OutDir>$(BinDir)</OutDir>
</PropertyGroup>
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -95,6 +103,12 @@
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
@@ -102,6 +116,13 @@
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -116,14 +137,20 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<LanguageStandard_C>stdclatest</LanguageStandard_C>
<SDLCheck>true</SDLCheck>
@@ -139,7 +166,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<LanguageStandard_C>stdclatest</LanguageStandard_C>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -159,7 +186,23 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<LanguageStandard_C>stdclatest</LanguageStandard_C>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;userenv.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<LanguageStandard_C>stdclatest</LanguageStandard_C>
<SDLCheck>true</SDLCheck>
@@ -175,7 +218,27 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<LanguageStandard_C>stdclatest</LanguageStandard_C>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;userenv.lib;advapi32.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_NDEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<LanguageStandard_C>stdclatest</LanguageStandard_C>
<FunctionLevelLinking>true</FunctionLevelLinking>
@@ -195,4 +258,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@@ -8,10 +8,18 @@
<Import Project="..\common.props" />
<Import Project="..\files.props" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
@@ -55,6 +63,12 @@
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
@@ -62,6 +76,13 @@
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@@ -76,14 +97,20 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
@@ -91,14 +118,14 @@
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
@@ -110,14 +137,14 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
@@ -125,14 +152,29 @@
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SAFEPROCS;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
@@ -145,14 +187,34 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<ClCompile>
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWindDir);$(SysShareDir);$(WinShareDir);$(LuaDir);$(UtilDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;WIN32CON;NO_TILE_C;DLB;SND_LIB_WINDSOUND;USER_SOUNDS;_LIB;HAS_STDINT_H;HAS_INTTYPES_H;SFCTOOL;NOPANICTRACE;NOCRASHREPORT;NO_CHRONICLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(ToolsDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>hacklib.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<Target Name="AfterBuild">
<Target Name="AfterBuild">
<MSBuild Projects="aftersftags.proj" Targets="Build" Properties="Configuration=$(Configuration)" />
</Target>
<Target Name="AfterClean">

View File

@@ -2,9 +2,9 @@
<Import Project="..\dirs.props"/>
<Import Project="$(vsDir)files.props"/>
<Target Name="Build"
Inputs="$(ToolsDir)tile2bmp.exe;$(WinShareDir)monsters.txt;$(WinShareDir)objects.txt"
Inputs="$(ToolsDir)$(HostTools)tile2bmp.exe;$(WinShareDir)monsters.txt;$(WinShareDir)objects.txt"
Outputs="$(WinWin32Dir)tiles.bmp">
<Exec Command="&quot;$(ToolsDir)tile2bmp.exe&quot; tiles.bmp" WorkingDirectory="$(SrcDir)"/>
<Exec Command="&quot;$(ToolsDir)$(HostTools)tile2bmp.exe&quot; tiles.bmp" WorkingDirectory="$(SrcDir)"/>
<Move SourceFiles="$(SrcDir)tiles.bmp" DestinationFolder="$(WinWin32Dir)"/>
</Target>
<Target Name="Clean">

Some files were not shown because too many files have changed in this diff Show More