]> granicus.if.org Git - nethack/commitdiff
Windows Store support for NetHack 3.6.
authorBart House <bart@barthouse.com>
Wed, 30 Oct 2019 04:28:39 +0000 (21:28 -0700)
committerBart House <bart@barthouse.com>
Wed, 30 Oct 2019 04:28:39 +0000 (21:28 -0700)
66 files changed:
doc/Guidebook.tex
include/extern.h
include/ntconf.h
src/files.c
sys/winnt/windmain.c
sys/winnt/winnt.c
win/win32/mhsplash.c
win/win32/mswproc.c
win/win32/vs2017/.gitignore
win/win32/vs2017/Images/BadgeLogo.scale-100.png [new file with mode: 0644]
win/win32/vs2017/Images/BadgeLogo.scale-125.png [new file with mode: 0644]
win/win32/vs2017/Images/BadgeLogo.scale-150.png [new file with mode: 0644]
win/win32/vs2017/Images/BadgeLogo.scale-200.png [new file with mode: 0644]
win/win32/vs2017/Images/BadgeLogo.scale-400.png [new file with mode: 0644]
win/win32/vs2017/Images/LargeTile.scale-100.png [new file with mode: 0644]
win/win32/vs2017/Images/LargeTile.scale-125.png [new file with mode: 0644]
win/win32/vs2017/Images/LargeTile.scale-150.png [new file with mode: 0644]
win/win32/vs2017/Images/LargeTile.scale-200.png [new file with mode: 0644]
win/win32/vs2017/Images/LargeTile.scale-400.png [new file with mode: 0644]
win/win32/vs2017/Images/LockScreenLogo.scale-200.png [new file with mode: 0644]
win/win32/vs2017/Images/SmallTile.scale-100.png [new file with mode: 0644]
win/win32/vs2017/Images/SmallTile.scale-125.png [new file with mode: 0644]
win/win32/vs2017/Images/SmallTile.scale-150.png [new file with mode: 0644]
win/win32/vs2017/Images/SmallTile.scale-200.png [new file with mode: 0644]
win/win32/vs2017/Images/SmallTile.scale-400.png [new file with mode: 0644]
win/win32/vs2017/Images/SplashScreen.scale-100.png [new file with mode: 0644]
win/win32/vs2017/Images/SplashScreen.scale-125.png [new file with mode: 0644]
win/win32/vs2017/Images/SplashScreen.scale-150.png [new file with mode: 0644]
win/win32/vs2017/Images/SplashScreen.scale-200.png [new file with mode: 0644]
win/win32/vs2017/Images/SplashScreen.scale-400.png [new file with mode: 0644]
win/win32/vs2017/Images/Square150x150Logo.scale-100.png [new file with mode: 0644]
win/win32/vs2017/Images/Square150x150Logo.scale-125.png [new file with mode: 0644]
win/win32/vs2017/Images/Square150x150Logo.scale-150.png [new file with mode: 0644]
win/win32/vs2017/Images/Square150x150Logo.scale-200.png [new file with mode: 0644]
win/win32/vs2017/Images/Square150x150Logo.scale-400.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-16.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-256.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-32.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-48.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.scale-100.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.scale-125.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.scale-150.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.scale-200.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.scale-400.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.targetsize-16.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.targetsize-24.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.targetsize-24_altform-unplated.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.targetsize-256.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.targetsize-32.png [new file with mode: 0644]
win/win32/vs2017/Images/Square44x44Logo.targetsize-48.png [new file with mode: 0644]
win/win32/vs2017/Images/StoreLogo.backup.png [new file with mode: 0644]
win/win32/vs2017/Images/StoreLogo.scale-100.png [new file with mode: 0644]
win/win32/vs2017/Images/StoreLogo.scale-125.png [new file with mode: 0644]
win/win32/vs2017/Images/StoreLogo.scale-150.png [new file with mode: 0644]
win/win32/vs2017/Images/StoreLogo.scale-200.png [new file with mode: 0644]
win/win32/vs2017/Images/StoreLogo.scale-400.png [new file with mode: 0644]
win/win32/vs2017/Images/Wide310x150Logo.scale-100.png [new file with mode: 0644]
win/win32/vs2017/Images/Wide310x150Logo.scale-125.png [new file with mode: 0644]
win/win32/vs2017/Images/Wide310x150Logo.scale-150.png [new file with mode: 0644]
win/win32/vs2017/Images/Wide310x150Logo.scale-200.png [new file with mode: 0644]
win/win32/vs2017/Images/Wide310x150Logo.scale-400.png [new file with mode: 0644]
win/win32/vs2017/NetHack.sln
win/win32/vs2017/NetHackPackage.appxmanifest [new file with mode: 0644]
win/win32/vs2017/NetHackPackage.wapproj [new file with mode: 0644]
win/win32/vs2017/Package.StoreAssociation.xml [new file with mode: 0644]
win/win32/vs2017/ScreenShot.PNG [new file with mode: 0644]

index 75a67551df3cf1fa233684b4e78bc422ce8bb6cd..4b9357e52880b55296f8b51299245a6812b3c667 100644 (file)
@@ -2866,13 +2866,22 @@ for system administrators.
 \subsection*{Using a configuration file}
 
 %.pg
-The default name of the configuration file varies on different
-operating systems. On MS-DOS and Windows, it is \mbox{``defaults.nh''} in
+The default name and location of the configuration file varies on different
+operating systems. If you manually installed on MS-DOS and Windows,
+it is \mbox{``defaults.nh''} in
 the same folder as \mbox{{\it nethack.exe\/}} or \mbox{{\it nethackW.exe\/}}.
+If you installed using the Microsoft Store, it is \mbox{``defaults.nh''} in
+the folder \mbox{{``\%USERPROFILE\%\textbackslash NetHack''}}.
 On Unix, Linux and Mac OS X it is \mbox{``.nethackrc''} in the user's home
 directory. The file may not exist, but it is a normal ASCII text file and
 can be created with any text editor.
 
+%.pg
+If you installed using the Microsoft Store, you will find that we provide
+a starting template for you to use to create your \mbox{``defaults.nh''}
+configuration file.  It is \mbox{``defaults.tmp''} also in the folder
+\mbox{{``\%USERPROFILE\%\textbackslash NetHack''}}.
+
 %.pg
 Any line in the configuration file starting with `{\tt \#}' is treated as a comment.
 Empty lines are ignored.
index 6dc781e1d16efc452d5dd72345f90952ea7cbee1..50d25cc1e725d94108d9f241b4d6fefff503d4d0 100644 (file)
@@ -1825,6 +1825,8 @@ E int NDECL(dohistory);
 E void FDECL(chdirx, (char *, BOOLEAN_P));
 #endif /* CHDIR */
 E boolean NDECL(authorize_wizard_mode);
+E boolean NDECL(is_desktop_bridge_application);
+
 #endif /* MICRO || WIN32 */
 
 /* ### pcsys.c ### */
index eb106090f8b40ba19bc9dd6c268a997d3df509af..c38770e176b840d5150f6a855e27740ab5dc3fa6 100644 (file)
@@ -285,4 +285,5 @@ extern void FDECL(nhassert_failed, (const char * exp, const char * file,
 #define nethack_enter(argc, argv) nethack_enter_winnt()
 extern void FDECL(nethack_exit, (int)) NORETURN;
 extern boolean FDECL(file_exists, (const char *));
+extern boolean FDECL(file_newer, (const char *, const char *));
 #endif /* NTCONF_H */
index 41382c1ce629323eb3d587c1c7039bc14a2d4efc..7228cd7e8097fb7712df94978854bf8aca921f61 100644 (file)
@@ -944,7 +944,7 @@ boolean regularize_it;
 
         /* Obtain the name of the logged on user and incorporate
          * it into the name. */
-        Sprintf(fnamebuf, "%s-%s", get_username(0), plname);
+        Sprintf(fnamebuf, "%s", plname);
         if (regularize_it)
             ++legal; /* skip '*' wildcard character */
         (void) fname_encode(legal, '%', fnamebuf, encodedfnamebuf, BUFSZ);
@@ -1138,6 +1138,10 @@ get_saved_games()
     {
         char *foundfile;
         const char *fq_save;
+        const char *fq_new_save;
+        const char *fq_old_save;
+        char **files = 0;
+        int i;
 
         Strcpy(plname, "*");
         set_savefile_name(FALSE);
@@ -1153,20 +1157,44 @@ get_saved_games()
                 ++n;
             } while (findnext());
         }
+
         if (n > 0) {
-            result = (char **) alloc((n + 1) * sizeof(char *)); /* at most */
-            (void) memset((genericptr_t) result, 0, (n + 1) * sizeof(char *));
+            files = (char **) alloc((n + 1) * sizeof(char *)); /* at most */
+            (void) memset((genericptr_t) files, 0, (n + 1) * sizeof(char *));
             if (findfirst((char *) fq_save)) {
-                j = n = 0;
+                i = 0;
                 do {
-                    char *r;
-                    r = plname_from_file(foundfile);
-                    if (r)
-                        result[j++] = r;
-                    ++n;
+                    files[i++] = strdup(foundfile);
                 } while (findnext());
             }
         }
+
+        if (n > 0) {
+            result = (char **) alloc((n + 1) * sizeof(char *)); /* at most */
+            (void) memset((genericptr_t) result, 0, (n + 1) * sizeof(char *));
+            for(i = 0; i < n; i++) {
+                char *r;
+                r = plname_from_file(files[i]);
+
+                if (r) {
+
+                    /* rename file if it is not named as expected */
+                    Strcpy(plname, r);
+                    set_savefile_name(FALSE);
+                    fq_new_save = fqname(SAVEF, SAVEPREFIX, 0);
+                    fq_old_save = fqname(files[i], SAVEPREFIX, 1);
+
+                    if(strcmp(fq_old_save, fq_new_save) != 0 &&
+                        !file_exists(fq_new_save))
+                        rename(fq_old_save, fq_new_save);
+
+                    result[j++] = r;
+                }
+            }
+        }
+
+        free_saved_games(files);
+
     }
 #endif
 #if defined(UNIX) && defined(QT_GRAPHICS)
@@ -3169,6 +3197,7 @@ fopen_sym_file()
     FILE *fp;
 
     fp = fopen_datafile(SYMBOLS, "r", HACKPREFIX);
+
     return fp;
 }
 
index b2bb18e7946f1746de9c48741c748cdaf847161b..14734900b17fc70e88597a0086c7c8ab41ac2fde 100644 (file)
@@ -8,8 +8,11 @@
 #include "hack.h"
 #include "dlb.h"
 #include <ctype.h>
+#include <stdlib.h>
 #include <sys\stat.h>
 #include <errno.h>
+#include <appmodel.h>
+#include <ShlObj.h>
 
 #if 0
 #include "wintty.h"
@@ -22,7 +25,7 @@
 #define E extern
 static void FDECL(process_options, (int argc, char **argv));
 static void NDECL(nhusage);
-static char *FDECL(exepath, (char *));
+static char *NDECL(get_executable_path);
 char *NDECL(exename);
 boolean NDECL(fakeconsole);
 void NDECL(freefakeconsole);
@@ -50,7 +53,6 @@ extern int NDECL(windows_console_custom_nhgetch);
 void NDECL(safe_routines);
 
 char orgdir[PATHLEN];
-char *dir;
 boolean getreturn_enabled;
 extern int redirect_stdout;       /* from sys/share/pcsys.c */
 extern int GUILaunched;
@@ -67,6 +69,279 @@ static struct stat hbuf;
 
 extern char orgdir[];
 
+boolean
+is_desktop_bridge_application()
+{
+    UINT32 length = 0;
+    LONG rc = GetCurrentPackageFullName(&length, NULL);
+
+    return (rc == ERROR_INSUFFICIENT_BUFFER);
+}
+
+void
+get_known_folder_path(
+    const KNOWNFOLDERID * folder_id,
+    char * path
+    , size_t path_size)
+{
+    PWSTR wide_path;
+    if (FAILED(SHGetKnownFolderPath(folder_id, 0, NULL, &wide_path)))
+        error("Unable to get known folder path");
+
+    size_t converted;
+    errno_t err;
+
+    err = wcstombs_s(&converted, path, path_size, wide_path, path_size - 1);
+
+    CoTaskMemFree(wide_path);
+
+    if (err != 0) error("Failed folder path string conversion");
+}
+
+void
+create_directory(const char * path)
+{
+    HRESULT hr = CreateDirectoryA(path, NULL);
+
+    if (FAILED(hr) && hr != ERROR_ALREADY_EXISTS)
+        error("Unable to create directory '%s'", path);
+}
+
+void
+build_known_folder_path(
+    const KNOWNFOLDERID * folder_id,
+    char * path,
+    size_t path_size)
+{
+    get_known_folder_path(folder_id, path, path_size);
+    strcat(path, "\\NetHack\\");
+    create_directory(path);
+    strcat(path, "3.6\\");
+    create_directory(path);
+}
+
+void
+build_environment_path(
+    const char * env_str,
+    const char * folder,
+    char * path,
+    size_t path_size)
+{
+    path[0] = '\0';
+
+    const char * root_path = nh_getenv(env_str);
+
+    if (root_path == NULL) return;
+
+    strcpy_s(path, path_size, root_path);
+
+    char * colon = index(path, ';');
+    if (colon != NULL) path[0] = '\0';
+
+    if (strlen(path) == 0) return;
+
+    append_slash(path);
+
+    if (folder != NULL) {
+        strcat_s(path, path_size, folder);
+        strcat_s(path, path_size, "\\");
+    }
+}
+
+boolean
+folder_file_exists(const char * folder, const char * file_name)
+{
+    char path[MAX_PATH];
+
+    if (folder[0] == '\0') return FALSE;
+
+    strcpy(path, folder);
+    strcat(path, file_name);
+    return file_exists(path);
+}
+
+/*
+ * Rules for setting prefix locations
+ *
+ * COMMON_NETHACK_PATH = %COMMONPROGRAMFILES%\NetHack\3.6\
+ * PROFILE_PATH = %SystemDrive%\Users\%USERNAME%\
+ *
+ * NETHACK_PROFILE_PATH = PROFILE_PATH\NetHack\3.6\
+ * NETHACK_PER_USER_DATA_PATH = PROFILE_PATH\AppData\Local\NetHack\3.6\
+ * NETHACK_GLOBAL_DATA_PATH = %SystemDrive%\ProgramData\NetHack\3.6\
+ * EXECUTABLE_PATH = path to where .exe lives
+ *
+ * HACKPREFIX:
+ *   - use environment variable NETHACKDIR if variable is defined
+ *   - otherwise use environment variable HACKDIR if variable is defined
+ *   - otherwise if store install use NETHACK_PROFILE_PATH
+ *   - otherwise if manual install use EXECUTABLE_PATH
+ *
+ * LEVELPREFIX, SAVEPREFIX:
+ *   - if store install use NETHACK_PER_USER_DATA_PATH
+ *   - if manual install use HACKPREFIX
+ *
+ * BONESPREFIX, SCOREPREFIX, LOCKPREFIX:
+ *   - if store install use NETHACK_GLOBAL_DATA_PATH
+ *   - if manual install use HACKPREFIX
+ *
+ * DATAPREFIX
+ *   - if store install use EXECUTABLE_PATH
+ *   - if manual install use HACKPREFIX
+ *
+ * SYSCONFPREFIX
+ *   - use COMMON_NETHACK_PATH if sysconf present
+ *   - otherwise use HACKPREFIX
+ *
+ * CONFIGPREFIX
+ *    - if manual install use PROFILE_PATH
+ *    - if store install use NETHACK_PROFILE_PATH
+ */
+
+void
+set_default_prefix_locations(const char *programPath)
+{
+    char *envp = NULL;
+    char *sptr = NULL;
+
+    static char hack_path[MAX_PATH];
+    static char executable_path[MAX_PATH];
+    static char nethack_profile_path[MAX_PATH];
+    static char nethack_per_user_data_path[MAX_PATH];
+    static char nethack_global_data_path[MAX_PATH];
+    static char sysconf_path[MAX_PATH];
+
+    strcpy(executable_path, get_executable_path());
+    append_slash(executable_path);
+
+    build_environment_path("NETHACKDIR", NULL, hack_path, sizeof(hack_path));
+
+    if (hack_path[0] == '\0')
+        build_environment_path("HACKDIR", NULL, hack_path, sizeof(hack_path));
+
+    build_known_folder_path(&FOLDERID_Profile, nethack_profile_path,
+        sizeof(nethack_profile_path));
+
+    build_known_folder_path(&FOLDERID_LocalAppData,
+        nethack_per_user_data_path, sizeof(nethack_per_user_data_path));
+
+    build_known_folder_path(&FOLDERID_ProgramData,
+        nethack_global_data_path, sizeof(nethack_global_data_path));
+
+    if (hack_path[0] == '\0')
+        strcpy(hack_path, nethack_profile_path);
+
+    fqn_prefix[LEVELPREFIX] = nethack_per_user_data_path;
+    fqn_prefix[SAVEPREFIX] = nethack_per_user_data_path;
+    fqn_prefix[BONESPREFIX] = nethack_global_data_path;
+    fqn_prefix[DATAPREFIX] = executable_path;
+    fqn_prefix[SCOREPREFIX] = nethack_global_data_path;
+    fqn_prefix[LOCKPREFIX] = nethack_global_data_path;
+    fqn_prefix[CONFIGPREFIX] = nethack_profile_path;
+
+    fqn_prefix[HACKPREFIX] = hack_path;
+    fqn_prefix[TROUBLEPREFIX] = hack_path;
+
+    build_environment_path("COMMONPROGRAMFILES", "NetHack\\3.6", sysconf_path,
+        sizeof(sysconf_path));
+
+    if(!folder_file_exists(sysconf_path, SYSCF_FILE))
+        strcpy(sysconf_path, hack_path);
+
+    fqn_prefix[SYSCONFPREFIX] = sysconf_path;
+
+}
+
+/* copy file if destination does not exist */
+void
+copy_file(
+    const char * dst_folder,
+    const char * dst_name,
+    const char * src_folder,
+    const char * src_name)
+{
+    char dst_path[MAX_PATH];
+    strcpy(dst_path, dst_folder);
+    strcat(dst_path, dst_name);
+
+    char src_path[MAX_PATH];
+    strcpy(src_path, src_folder);
+    strcat(src_path, src_name);
+
+    if(!file_exists(src_path))
+        error("Unable to copy file '%s' as it does not exist", src_path);
+
+    if(file_exists(dst_path))
+        return;
+
+    BOOL success = CopyFileA(src_path, dst_path, TRUE);
+    if(!success) error("Failed to copy '%s' to '%s'", src_path, dst_path);
+}
+
+/* update file copying if it does not exist or src is newer then dst */
+void
+update_file(
+    const char * dst_folder,
+    const char * dst_name,
+    const char * src_folder,
+    const char * src_name)
+{
+    char dst_path[MAX_PATH];
+    strcpy(dst_path, dst_folder);
+    strcat(dst_path, dst_name);
+
+    char src_path[MAX_PATH];
+    strcpy(src_path, src_folder);
+    strcat(src_path, src_name);
+
+    if(!file_exists(src_path))
+        error("Unable to copy file '%s' as it does not exist", src_path);
+
+    if (!file_newer(src_path, dst_path))
+        return;
+
+    BOOL success = CopyFileA(src_path, dst_path, FALSE);
+    if(!success) error("Failed to update '%s' to '%s'", src_path, dst_path);
+
+}
+
+void copy_config_content()
+{
+    /* Keep templates up to date */
+    update_file(fqn_prefix[CONFIGPREFIX], "defaults.tmp",
+        fqn_prefix[DATAPREFIX], "defaults.nh");
+    update_file(fqn_prefix[SYSCONFPREFIX], "sysconf.tmp",
+        fqn_prefix[DATAPREFIX], SYSCF_FILE);
+
+    /* If the required early game file does not exist, copy it */
+    copy_file(fqn_prefix[CONFIGPREFIX], "defaults.nh",
+        fqn_prefix[DATAPREFIX], "defaults.nh");
+    copy_file(fqn_prefix[SYSCONFPREFIX], SYSCF_FILE,
+        fqn_prefix[DATAPREFIX], SYSCF_FILE);
+
+    /* If a required game file does not exist, copy it */
+    /* TODO: Can't HACKDIR be changed during option parsing
+       causing us to perhaps be checking options against the wrong
+       symbols file? */
+    copy_file(fqn_prefix[HACKPREFIX], SYMBOLS,
+        fqn_prefix[DATAPREFIX], SYMBOLS);
+}
+
+void
+copy_hack_content()
+{
+    /* Keep Guidebook and opthelp up to date */
+    update_file(fqn_prefix[HACKPREFIX], "Guidebook.txt",
+        fqn_prefix[DATAPREFIX], "Guidebook.txt");
+    update_file(fqn_prefix[HACKPREFIX], "opthelp",
+        fqn_prefix[DATAPREFIX], "opthelp");
+
+    /* Keep templates up to date */
+    update_file(fqn_prefix[HACKPREFIX], "symbols.tmp",
+        fqn_prefix[DATAPREFIX], "symbols");
+
+}
+
 /*
  * __MINGW32__ Note
  * If the graphics version is built, we don't need a main; it is skipped
@@ -120,110 +395,25 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
 #endif
 
     hname = "NetHack"; /* used for syntax messages */
+
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
     /* Save current directory and make sure it gets restored when
      * the game is exited.
      */
     if (getcwd(orgdir, sizeof orgdir) == (char *) 0)
         error("NetHack: current directory path too long");
-    dir = nh_getenv("NETHACKDIR");
-    if (dir == (char *) 0)
-        dir = nh_getenv("HACKDIR");
-    if (dir == (char *) 0)
-        dir = exepath(argv[0]);
-#ifdef _MSC_VER
-    if (IsDebuggerPresent()) {
-        static char exepath[_MAX_PATH];
-        /* check if we're running under the debugger so we can get to the right folder anyway */
-        if (dir != (char *)0) {
-            char *top = (char *)0;
-
-            if (strlen(dir) < (_MAX_PATH - 1))
-                strcpy(exepath, dir);
-            top = strstr(exepath, "\\build\\.\\Debug");
-            if (!top) top = strstr(exepath, "\\build\\.\\Release");
-            if (top) {
-                *top = '\0';
-                if (strlen(exepath) < (_MAX_PATH - (strlen("\\binary\\") + 1))) {
-                    Strcat(exepath, "\\binary\\");
-                    if (strlen(exepath) < (PATHLEN - 1)) {
-                        dir = exepath;
-                    }
-                }
-            }
-        }
-    }
 #endif
-    if (dir != (char *)0) {
-        int prefcnt;
-        int fd;
-        boolean have_syscf = FALSE;
-
-        (void) strncpy(hackdir, dir, PATHLEN - 1);
-        hackdir[PATHLEN - 1] = '\0';
-        fqn_prefix[0] = (char *) alloc(strlen(hackdir) + 2);
-        Strcpy(fqn_prefix[0], hackdir);
-        append_slash(fqn_prefix[0]);
-        for (prefcnt = 1; prefcnt < PREFIX_COUNT; prefcnt++)
-             fqn_prefix[prefcnt] = fqn_prefix[0];
-        /* sysconf should be searched for in this location */
-        envp = nh_getenv("COMMONPROGRAMFILES");
-        if (envp) {
-            if ((sptr = index(envp, ';')) != 0)
-                *sptr = '\0';
-            if (strlen(envp) > 0) {
-                fqn_prefix[SYSCONFPREFIX] =
-                    (char *) alloc(strlen(envp) + 10);
-                Strcpy(fqn_prefix[SYSCONFPREFIX], envp);
-                append_slash(fqn_prefix[SYSCONFPREFIX]);
-                Strcat(fqn_prefix[SYSCONFPREFIX], "NetHack\\");
-            }
-        }
 
-        /* okay so we have the overriding and definitive locaton
-        for sysconf, but only in the event that there is not a 
-        sysconf file there (for whatever reason), check a secondary
-        location rather than abort. */
-
-        /* Is there a SYSCF_FILE there? */
-        fd = open(fqname(SYSCF_FILE, SYSCONFPREFIX, 0), O_RDONLY);
-        if (fd >= 0) {
-            /* readable */
-            close(fd);
-            have_syscf = TRUE;
-        }
+    set_default_prefix_locations(argv[0]);
 
-        if (!have_syscf) {
-            /* No SYSCF_FILE where there should be one, and
-               without an installer, a user may not be able
-               to place one there. So, let's try somewhere else... */
-             fqn_prefix[SYSCONFPREFIX] = fqn_prefix[0];
-
-            /* Is there a SYSCF_FILE there? */
-            fd = open(fqname(SYSCF_FILE, SYSCONFPREFIX, 0), O_RDONLY);
-            if (fd >= 0) {
-                /* readable */
-                close(fd);
-                have_syscf = TRUE;
-            }
-        }
+#if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
+    chdir(fqn_prefix[HACKPREFIX]);
+#endif
 
-        /* user's home directory should default to this - unless
-         * overridden */
-        envp = nh_getenv("USERPROFILE");
-        if (envp) {
-            if ((sptr = index(envp, ';')) != 0)
-                *sptr = '\0';
-            if (strlen(envp) > 0) {
-                fqn_prefix[CONFIGPREFIX] =
-                    (char *) alloc(strlen(envp) + 2);
-                Strcpy(fqn_prefix[CONFIGPREFIX], envp);
-                append_slash(fqn_prefix[CONFIGPREFIX]);
-            }
-        }
-    }
-    if (GUILaunched || IsDebuggerPresent()) {
+    copy_config_content();
+
+    if (GUILaunched || IsDebuggerPresent())
         getreturn_enabled = TRUE;
-    }
 
     check_recordfile((char *) 0);
     iflags.windowtype_deferred = TRUE;
@@ -233,10 +423,11 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
                    failbuf);
         nethack_exit(EXIT_FAILURE);
     }
-    if (!hackdir[0])
-        Strcpy(hackdir, orgdir);
+
     process_options(argc, argv);
-    
+
+    copy_hack_content();
+
 /*
  * It seems you really want to play.
  */
@@ -294,7 +485,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/
     iflags.renameallowed = FALSE;
     /* Obtain the name of the logged on user and incorporate
      * it into the name. */
-    Sprintf(fnamebuf, "%s-%s", get_username(0), plname);
+    Sprintf(fnamebuf, "%s", plname);
     (void) fname_encode(
         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-.", '%',
         fnamebuf, encodedfnamebuf, BUFSZ);
@@ -401,7 +592,7 @@ char *argv[];
              */
             argc--;
             argv++;
-            dir = argv[0] + 2;
+            const char * dir = argv[0] + 2;
             if (*dir == '=' || *dir == ':')
                 dir++;
             if (!*dir && argc > 1) {
@@ -664,33 +855,28 @@ void freefakeconsole()
 }
 #endif
 
-#define EXEPATHBUFSZ 256
-char exepathbuf[EXEPATHBUFSZ];
-
 char *
-exepath(str)
-char *str;
+get_executable_path()
 {
-    char *tmp, *tmp2;
-    int bsize;
+    static char path_buffer[MAX_PATH];
 
-    if (!str)
-        return (char *) 0;
-    bsize = EXEPATHBUFSZ;
-    tmp = exepathbuf;
 #ifdef UNICODE
     {
         TCHAR wbuf[BUFSZ];
         GetModuleFileName((HANDLE) 0, wbuf, BUFSZ);
-        WideCharToMultiByte(CP_ACP, 0, wbuf, -1, tmp, bsize, NULL, NULL);
+        WideCharToMultiByte(CP_ACP, 0, wbuf, -1, path_buffer, sizeof(path_buffer), NULL, NULL);
     }
 #else
-    *(tmp + GetModuleFileName((HANDLE) 0, tmp, bsize)) = '\0';
+    DWORD length = GetModuleFileName((HANDLE) 0, path_buffer, MAX_PATH);
+    if (length == ERROR_INSUFFICIENT_BUFFER) error("Unable to get module name");
+    path_buffer[length] = '\0';
 #endif
-    tmp2 = strrchr(tmp, PATH_SEPARATOR);
-    if (tmp2)
-        *tmp2 = '\0';
-    return tmp;
+
+    char  * seperator = strrchr(path_buffer, PATH_SEPARATOR);
+    if (seperator)
+        *seperator = '\0';
+
+    return path_buffer;
 }
 
 /*ARGSUSED*/
@@ -943,4 +1129,28 @@ const char *path;
     return TRUE;
 }
 
+/* 
+  file_newer returns TRUE if the file at a_path is newer then the file
+  at b_path.  If a_path does not exist, it returns FALSE.  If b_path
+  does not exist, it returns TRUE.
+ */
+boolean
+file_newer(a_path, b_path)
+const char * a_path;
+const char * b_path;
+{
+    struct stat a_sb;
+    struct stat b_sb;
+
+    if (stat(a_path, &a_sb))
+        return FALSE;
+
+    if (stat(b_path, &b_sb))
+        return TRUE;
+
+    if(difftime(a_sb.st_mtime, b_sb.st_mtime) < 0)
+        return TRUE;
+    return FALSE;
+}
+
 /*windmain.c*/
index f6a9aa79138adc4753830903ebad5b4d6472438a..37edbbcbfea15ca3b56302f5a15faead51e4afff 100644 (file)
@@ -188,15 +188,21 @@ get_username(lan_username_size)
 int *lan_username_size;
 {
     static TCHAR username_buffer[BUFSZ];
-    unsigned int status;
     DWORD i = BUFSZ - 1;
 
-    /* i gets updated with actual size */
-    status = GetUserName(username_buffer, &i);
-    if (status)
-        username_buffer[i] = '\0';
-    else
-        Strcpy(username_buffer, "NetHack");
+    Strcpy(username_buffer, "NetHack");
+
+    /* Our privacy policy for the windows store version of nethack makes
+     * a promise about not collecting any personally identifiable information.
+     * Do not allow getting user name if we being run from windows store
+     * version of nethack.  In 3.7, we should remove use of username.
+     */
+    if (!is_desktop_bridge_application()) {
+        /* i gets updated with actual size */
+        if (GetUserName(username_buffer, &i))
+            username_buffer[i] = '\0';
+    }
+
     if (lan_username_size)
         *lan_username_size = strlen(username_buffer);
     return username_buffer;
index 0271c8081fa23732b800d530f6fe624b6ef7157b..8dcfd1b398ab0b340444047cee4049cd33689386 100644 (file)
@@ -170,6 +170,7 @@ mswin_display_splash_window(BOOL show_ver)
             FILE *nf;
 
             iflags.news = 0; /* prevent newgame() from re-displaying news */
+            /* BUG: this relies on current working directory */
             nf = fopen(NEWS, "r");
             if (nf != NULL) {
                 char line[LLEN + 1];
index b637c463f749f480db1cb719301e90d8a12ecc1a..38b4b0b29f75163c1fe4e0d6cb855b818a1e8cfb 100644 (file)
@@ -142,6 +142,7 @@ mswin_init_nhwindows(int *argc, char **argv)
 # ifdef _DEBUG
     if (showdebug(NHTRACE_LOG) && !_s_debugfp) {
         /* truncate trace file */
+        /* BUG: this relies on current working directory */
         _s_debugfp = fopen(NHTRACE_LOG, "w");
     }
 # endif
index f87237325de8852f805edaa23c5c3ee3384b732b..c4775b3c5d3e0a63bcc2a5b3ccd563b1452d0ce0 100644 (file)
@@ -2,3 +2,11 @@
 *.db-shm
 *.db-wal
 paniclog
+_pkginfo.txt
+AppPackages
+BundleArtifacts
+report.xml
+*.cer
+*.appxbundle
+NetHackPackage_StoreKey.pfx
+NetHackPackage_TemporaryKey.pfx
diff --git a/win/win32/vs2017/Images/BadgeLogo.scale-100.png b/win/win32/vs2017/Images/BadgeLogo.scale-100.png
new file mode 100644 (file)
index 0000000..0c1dff1
Binary files /dev/null and b/win/win32/vs2017/Images/BadgeLogo.scale-100.png differ
diff --git a/win/win32/vs2017/Images/BadgeLogo.scale-125.png b/win/win32/vs2017/Images/BadgeLogo.scale-125.png
new file mode 100644 (file)
index 0000000..45aa777
Binary files /dev/null and b/win/win32/vs2017/Images/BadgeLogo.scale-125.png differ
diff --git a/win/win32/vs2017/Images/BadgeLogo.scale-150.png b/win/win32/vs2017/Images/BadgeLogo.scale-150.png
new file mode 100644 (file)
index 0000000..6a911cb
Binary files /dev/null and b/win/win32/vs2017/Images/BadgeLogo.scale-150.png differ
diff --git a/win/win32/vs2017/Images/BadgeLogo.scale-200.png b/win/win32/vs2017/Images/BadgeLogo.scale-200.png
new file mode 100644 (file)
index 0000000..21e20fb
Binary files /dev/null and b/win/win32/vs2017/Images/BadgeLogo.scale-200.png differ
diff --git a/win/win32/vs2017/Images/BadgeLogo.scale-400.png b/win/win32/vs2017/Images/BadgeLogo.scale-400.png
new file mode 100644 (file)
index 0000000..10fdb8f
Binary files /dev/null and b/win/win32/vs2017/Images/BadgeLogo.scale-400.png differ
diff --git a/win/win32/vs2017/Images/LargeTile.scale-100.png b/win/win32/vs2017/Images/LargeTile.scale-100.png
new file mode 100644 (file)
index 0000000..2c00fc9
Binary files /dev/null and b/win/win32/vs2017/Images/LargeTile.scale-100.png differ
diff --git a/win/win32/vs2017/Images/LargeTile.scale-125.png b/win/win32/vs2017/Images/LargeTile.scale-125.png
new file mode 100644 (file)
index 0000000..fb1ba8d
Binary files /dev/null and b/win/win32/vs2017/Images/LargeTile.scale-125.png differ
diff --git a/win/win32/vs2017/Images/LargeTile.scale-150.png b/win/win32/vs2017/Images/LargeTile.scale-150.png
new file mode 100644 (file)
index 0000000..f3ccd11
Binary files /dev/null and b/win/win32/vs2017/Images/LargeTile.scale-150.png differ
diff --git a/win/win32/vs2017/Images/LargeTile.scale-200.png b/win/win32/vs2017/Images/LargeTile.scale-200.png
new file mode 100644 (file)
index 0000000..0c40a8a
Binary files /dev/null and b/win/win32/vs2017/Images/LargeTile.scale-200.png differ
diff --git a/win/win32/vs2017/Images/LargeTile.scale-400.png b/win/win32/vs2017/Images/LargeTile.scale-400.png
new file mode 100644 (file)
index 0000000..5c11c50
Binary files /dev/null and b/win/win32/vs2017/Images/LargeTile.scale-400.png differ
diff --git a/win/win32/vs2017/Images/LockScreenLogo.scale-200.png b/win/win32/vs2017/Images/LockScreenLogo.scale-200.png
new file mode 100644 (file)
index 0000000..735f57a
Binary files /dev/null and b/win/win32/vs2017/Images/LockScreenLogo.scale-200.png differ
diff --git a/win/win32/vs2017/Images/SmallTile.scale-100.png b/win/win32/vs2017/Images/SmallTile.scale-100.png
new file mode 100644 (file)
index 0000000..f7e719d
Binary files /dev/null and b/win/win32/vs2017/Images/SmallTile.scale-100.png differ
diff --git a/win/win32/vs2017/Images/SmallTile.scale-125.png b/win/win32/vs2017/Images/SmallTile.scale-125.png
new file mode 100644 (file)
index 0000000..e5aa2ea
Binary files /dev/null and b/win/win32/vs2017/Images/SmallTile.scale-125.png differ
diff --git a/win/win32/vs2017/Images/SmallTile.scale-150.png b/win/win32/vs2017/Images/SmallTile.scale-150.png
new file mode 100644 (file)
index 0000000..57d16d6
Binary files /dev/null and b/win/win32/vs2017/Images/SmallTile.scale-150.png differ
diff --git a/win/win32/vs2017/Images/SmallTile.scale-200.png b/win/win32/vs2017/Images/SmallTile.scale-200.png
new file mode 100644 (file)
index 0000000..5e5e0ec
Binary files /dev/null and b/win/win32/vs2017/Images/SmallTile.scale-200.png differ
diff --git a/win/win32/vs2017/Images/SmallTile.scale-400.png b/win/win32/vs2017/Images/SmallTile.scale-400.png
new file mode 100644 (file)
index 0000000..3ed4e69
Binary files /dev/null and b/win/win32/vs2017/Images/SmallTile.scale-400.png differ
diff --git a/win/win32/vs2017/Images/SplashScreen.scale-100.png b/win/win32/vs2017/Images/SplashScreen.scale-100.png
new file mode 100644 (file)
index 0000000..d4bab84
Binary files /dev/null and b/win/win32/vs2017/Images/SplashScreen.scale-100.png differ
diff --git a/win/win32/vs2017/Images/SplashScreen.scale-125.png b/win/win32/vs2017/Images/SplashScreen.scale-125.png
new file mode 100644 (file)
index 0000000..d97a15f
Binary files /dev/null and b/win/win32/vs2017/Images/SplashScreen.scale-125.png differ
diff --git a/win/win32/vs2017/Images/SplashScreen.scale-150.png b/win/win32/vs2017/Images/SplashScreen.scale-150.png
new file mode 100644 (file)
index 0000000..2ce132a
Binary files /dev/null and b/win/win32/vs2017/Images/SplashScreen.scale-150.png differ
diff --git a/win/win32/vs2017/Images/SplashScreen.scale-200.png b/win/win32/vs2017/Images/SplashScreen.scale-200.png
new file mode 100644 (file)
index 0000000..cbffd4a
Binary files /dev/null and b/win/win32/vs2017/Images/SplashScreen.scale-200.png differ
diff --git a/win/win32/vs2017/Images/SplashScreen.scale-400.png b/win/win32/vs2017/Images/SplashScreen.scale-400.png
new file mode 100644 (file)
index 0000000..05424b3
Binary files /dev/null and b/win/win32/vs2017/Images/SplashScreen.scale-400.png differ
diff --git a/win/win32/vs2017/Images/Square150x150Logo.scale-100.png b/win/win32/vs2017/Images/Square150x150Logo.scale-100.png
new file mode 100644 (file)
index 0000000..7785062
Binary files /dev/null and b/win/win32/vs2017/Images/Square150x150Logo.scale-100.png differ
diff --git a/win/win32/vs2017/Images/Square150x150Logo.scale-125.png b/win/win32/vs2017/Images/Square150x150Logo.scale-125.png
new file mode 100644 (file)
index 0000000..6c62559
Binary files /dev/null and b/win/win32/vs2017/Images/Square150x150Logo.scale-125.png differ
diff --git a/win/win32/vs2017/Images/Square150x150Logo.scale-150.png b/win/win32/vs2017/Images/Square150x150Logo.scale-150.png
new file mode 100644 (file)
index 0000000..d0471de
Binary files /dev/null and b/win/win32/vs2017/Images/Square150x150Logo.scale-150.png differ
diff --git a/win/win32/vs2017/Images/Square150x150Logo.scale-200.png b/win/win32/vs2017/Images/Square150x150Logo.scale-200.png
new file mode 100644 (file)
index 0000000..105037a
Binary files /dev/null and b/win/win32/vs2017/Images/Square150x150Logo.scale-200.png differ
diff --git a/win/win32/vs2017/Images/Square150x150Logo.scale-400.png b/win/win32/vs2017/Images/Square150x150Logo.scale-400.png
new file mode 100644 (file)
index 0000000..3b5c714
Binary files /dev/null and b/win/win32/vs2017/Images/Square150x150Logo.scale-400.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-16.png b/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-16.png
new file mode 100644 (file)
index 0000000..c37bb56
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-16.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-256.png b/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-256.png
new file mode 100644 (file)
index 0000000..c5a031e
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-256.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-32.png b/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-32.png
new file mode 100644 (file)
index 0000000..33651c0
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-32.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-48.png b/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-48.png
new file mode 100644 (file)
index 0000000..3be7763
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.altform-unplated_targetsize-48.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.scale-100.png b/win/win32/vs2017/Images/Square44x44Logo.scale-100.png
new file mode 100644 (file)
index 0000000..b0b2e6c
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.scale-100.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.scale-125.png b/win/win32/vs2017/Images/Square44x44Logo.scale-125.png
new file mode 100644 (file)
index 0000000..7497e63
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.scale-125.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.scale-150.png b/win/win32/vs2017/Images/Square44x44Logo.scale-150.png
new file mode 100644 (file)
index 0000000..d8291fe
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.scale-150.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.scale-200.png b/win/win32/vs2017/Images/Square44x44Logo.scale-200.png
new file mode 100644 (file)
index 0000000..aa5dce3
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.scale-200.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.scale-400.png b/win/win32/vs2017/Images/Square44x44Logo.scale-400.png
new file mode 100644 (file)
index 0000000..ec0fa86
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.scale-400.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.targetsize-16.png b/win/win32/vs2017/Images/Square44x44Logo.targetsize-16.png
new file mode 100644 (file)
index 0000000..c2f20ed
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.targetsize-16.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.targetsize-24.png b/win/win32/vs2017/Images/Square44x44Logo.targetsize-24.png
new file mode 100644 (file)
index 0000000..87a34d0
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.targetsize-24.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.targetsize-24_altform-unplated.png b/win/win32/vs2017/Images/Square44x44Logo.targetsize-24_altform-unplated.png
new file mode 100644 (file)
index 0000000..1e2c785
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.targetsize-256.png b/win/win32/vs2017/Images/Square44x44Logo.targetsize-256.png
new file mode 100644 (file)
index 0000000..d7793c8
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.targetsize-256.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.targetsize-32.png b/win/win32/vs2017/Images/Square44x44Logo.targetsize-32.png
new file mode 100644 (file)
index 0000000..089f363
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.targetsize-32.png differ
diff --git a/win/win32/vs2017/Images/Square44x44Logo.targetsize-48.png b/win/win32/vs2017/Images/Square44x44Logo.targetsize-48.png
new file mode 100644 (file)
index 0000000..fcd6b9b
Binary files /dev/null and b/win/win32/vs2017/Images/Square44x44Logo.targetsize-48.png differ
diff --git a/win/win32/vs2017/Images/StoreLogo.backup.png b/win/win32/vs2017/Images/StoreLogo.backup.png
new file mode 100644 (file)
index 0000000..a90d0b6
Binary files /dev/null and b/win/win32/vs2017/Images/StoreLogo.backup.png differ
diff --git a/win/win32/vs2017/Images/StoreLogo.scale-100.png b/win/win32/vs2017/Images/StoreLogo.scale-100.png
new file mode 100644 (file)
index 0000000..7eda4fa
Binary files /dev/null and b/win/win32/vs2017/Images/StoreLogo.scale-100.png differ
diff --git a/win/win32/vs2017/Images/StoreLogo.scale-125.png b/win/win32/vs2017/Images/StoreLogo.scale-125.png
new file mode 100644 (file)
index 0000000..c1a3b87
Binary files /dev/null and b/win/win32/vs2017/Images/StoreLogo.scale-125.png differ
diff --git a/win/win32/vs2017/Images/StoreLogo.scale-150.png b/win/win32/vs2017/Images/StoreLogo.scale-150.png
new file mode 100644 (file)
index 0000000..09163a1
Binary files /dev/null and b/win/win32/vs2017/Images/StoreLogo.scale-150.png differ
diff --git a/win/win32/vs2017/Images/StoreLogo.scale-200.png b/win/win32/vs2017/Images/StoreLogo.scale-200.png
new file mode 100644 (file)
index 0000000..854fafb
Binary files /dev/null and b/win/win32/vs2017/Images/StoreLogo.scale-200.png differ
diff --git a/win/win32/vs2017/Images/StoreLogo.scale-400.png b/win/win32/vs2017/Images/StoreLogo.scale-400.png
new file mode 100644 (file)
index 0000000..9d41761
Binary files /dev/null and b/win/win32/vs2017/Images/StoreLogo.scale-400.png differ
diff --git a/win/win32/vs2017/Images/Wide310x150Logo.scale-100.png b/win/win32/vs2017/Images/Wide310x150Logo.scale-100.png
new file mode 100644 (file)
index 0000000..3a29f09
Binary files /dev/null and b/win/win32/vs2017/Images/Wide310x150Logo.scale-100.png differ
diff --git a/win/win32/vs2017/Images/Wide310x150Logo.scale-125.png b/win/win32/vs2017/Images/Wide310x150Logo.scale-125.png
new file mode 100644 (file)
index 0000000..5bde118
Binary files /dev/null and b/win/win32/vs2017/Images/Wide310x150Logo.scale-125.png differ
diff --git a/win/win32/vs2017/Images/Wide310x150Logo.scale-150.png b/win/win32/vs2017/Images/Wide310x150Logo.scale-150.png
new file mode 100644 (file)
index 0000000..8f35b96
Binary files /dev/null and b/win/win32/vs2017/Images/Wide310x150Logo.scale-150.png differ
diff --git a/win/win32/vs2017/Images/Wide310x150Logo.scale-200.png b/win/win32/vs2017/Images/Wide310x150Logo.scale-200.png
new file mode 100644 (file)
index 0000000..a0be94e
Binary files /dev/null and b/win/win32/vs2017/Images/Wide310x150Logo.scale-200.png differ
diff --git a/win/win32/vs2017/Images/Wide310x150Logo.scale-400.png b/win/win32/vs2017/Images/Wide310x150Logo.scale-400.png
new file mode 100644 (file)
index 0000000..cbffd4a
Binary files /dev/null and b/win/win32/vs2017/Images/Wide310x150Logo.scale-400.png differ
index 172bb7293d0d87739be22bfcab3e2e9d1fb6940c..0d5df6b8960f202a5fcc17df81193198339dc860 100644 (file)
@@ -10,7 +10,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetHackW", "NetHackW.vcxpro
                {9DD9C52E-E8C9-4533-BD22-83C055C0AABA} = {9DD9C52E-E8C9-4533-BD22-83C055C0AABA}\r
                {BA3DD34C-04B7-40D0-B373-9329AA9E8945} = {BA3DD34C-04B7-40D0-B373-9329AA9E8945}\r
                {642BC75D-ABAF-403E-8224-7C725FD4CB42} = {642BC75D-ABAF-403E-8224-7C725FD4CB42}\r
-               {6813477F-64B6-4B97-B230-438D0D233385} = {6813477F-64B6-4B97-B230-438D0D233385}\r
                {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC} = {0303A585-3F83-4BB7-AF6B-1E12C8FB54AC}\r
                {8A3F81C7-2968-49A8-86BF-2669412AD7DE} = {8A3F81C7-2968-49A8-86BF-2669412AD7DE}\r
        EndProjectSection\r
@@ -85,6 +84,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
                NetHackProperties.props = NetHackProperties.props\r
        EndProjectSection\r
 EndProject\r
+Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "NetHackPackage", "NetHackPackage.wapproj", "{6838EC9D-F25D-4779-9CD7-2EDB61E49429}"\r
+EndProject\r
 Global\r
        GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
                Debug|Win32 = Debug|Win32\r
@@ -205,6 +206,18 @@ Global
                {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|Win32.Build.0 = Release|Win32\r
                {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|x64.ActiveCfg = Release|x64\r
                {BAA70D0F-3EC7-4D10-91F0-974F1F49308B}.Release|x64.Build.0 = Release|x64\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Debug|Win32.Deploy.0 = Debug|Win32\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Debug|x64.Build.0 = Debug|x64\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Debug|x64.Deploy.0 = Debug|x64\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Release|Win32.Build.0 = Release|Win32\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Release|Win32.Deploy.0 = Release|Win32\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Release|x64.ActiveCfg = Release|x64\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Release|x64.Build.0 = Release|x64\r
+               {6838EC9D-F25D-4779-9CD7-2EDB61E49429}.Release|x64.Deploy.0 = Release|x64\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r
diff --git a/win/win32/vs2017/NetHackPackage.appxmanifest b/win/win32/vs2017/NetHackPackage.appxmanifest
new file mode 100644 (file)
index 0000000..da4928c
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp rescap">
+  <Identity Name="30485NetHackDevTeam.NetHack3.6" Publisher="CN=8BDC628A-FAAA-4EBA-8B5B-EB61BA93BA1F" Version="363.0.19.0" />
+  <Properties>
+    <DisplayName>NetHack 3.6</DisplayName>
+    <PublisherDisplayName>NetHack DevTeam</PublisherDisplayName>
+    <Logo>Images\StoreLogo.png</Logo>
+  </Properties>
+  <Dependencies>
+    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
+    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
+  </Dependencies>
+  <Resources>
+    <Resource Language="x-generate" />
+  </Resources>
+  <Applications>
+    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$">
+      <uap:VisualElements DisplayName="NetHack 3.6" Description="NetHack 3.6" BackgroundColor="transparent" Square150x150Logo="Images\Square150x150Logo.png" Square44x44Logo="Images\Square44x44Logo.png">
+        <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" Square310x310Logo="Images\LargeTile.png" Square71x71Logo="Images\SmallTile.png">
+        </uap:DefaultTile>
+        <uap:SplashScreen Image="Images\SplashScreen.png" />
+      </uap:VisualElements>
+    </Application>
+  </Applications>
+  <Capabilities>
+    <Capability Name="internetClient" />
+    <rescap:Capability Name="runFullTrust" />
+  </Capabilities>
+</Package>
\ No newline at end of file
diff --git a/win/win32/vs2017/NetHackPackage.wapproj b/win/win32/vs2017/NetHackPackage.wapproj
new file mode 100644 (file)
index 0000000..daf3091
--- /dev/null
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0'">
+    <VisualStudioVersion>15.0</VisualStudioVersion>
+  </PropertyGroup>
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</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>
+    <WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
+  </PropertyGroup>
+  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
+  <Import Project="NetHackProperties.props" />
+  <Import Project="dirs.props" />
+  <PropertyGroup>
+    <OutDir>$(BinDir)</OutDir>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ProjectGuid>6838ec9d-f25d-4779-9cd7-2edb61e49429</ProjectGuid>
+    <TargetPlatformVersion>10.0.17763.0</TargetPlatformVersion>
+    <TargetPlatformMinVersion>10.0.15063.0</TargetPlatformMinVersion>
+    <DefaultLanguage>en-US</DefaultLanguage>
+    <PackageCertificateKeyFile>NetHackPackage_StoreKey.pfx</PackageCertificateKeyFile>
+    <EntryPointProjectUniqueName>NetHackW.vcxproj</EntryPointProjectUniqueName>
+    <PackageCertificateThumbprint>19591BE8832D6EFED75019EACE7C4CA42ABC90D4</PackageCertificateThumbprint>
+    <GenerateAppInstallerFile>False</GenerateAppInstallerFile>
+    <AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>
+    <AppxBundlePlatforms>x86</AppxBundlePlatforms>
+    <AppInstallerUpdateFrequency>1</AppInstallerUpdateFrequency>
+    <AppInstallerCheckForUpdateFrequency>OnApplicationRun</AppInstallerCheckForUpdateFrequency>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <AppxBundle>Always</AppxBundle>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <AppxBundle>Always</AppxBundle>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <AppxBundle>Always</AppxBundle>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <AppxBundle>Always</AppxBundle>
+  </PropertyGroup>
+  <ItemGroup>
+    <AppxManifest Include="NetHackPackage.appxmanifest">
+      <SubType>Designer</SubType>
+    </AppxManifest>
+    <None Include="NetHackPackage_TemporaryKey.pfx" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Images\BadgeLogo.scale-100.png" />
+    <Content Include="Images\BadgeLogo.scale-125.png" />
+    <Content Include="Images\BadgeLogo.scale-150.png" />
+    <Content Include="Images\BadgeLogo.scale-200.png" />
+    <Content Include="Images\BadgeLogo.scale-400.png" />
+    <Content Include="Images\LargeTile.scale-100.png" />
+    <Content Include="Images\LargeTile.scale-125.png" />
+    <Content Include="Images\LargeTile.scale-150.png" />
+    <Content Include="Images\LargeTile.scale-200.png" />
+    <Content Include="Images\LargeTile.scale-400.png" />
+    <Content Include="Images\LockScreenLogo.scale-200.png" />
+    <Content Include="Images\SmallTile.scale-100.png" />
+    <Content Include="Images\SmallTile.scale-125.png" />
+    <Content Include="Images\SmallTile.scale-150.png" />
+    <Content Include="Images\SmallTile.scale-200.png" />
+    <Content Include="Images\SmallTile.scale-400.png" />
+    <Content Include="Images\SplashScreen.scale-100.png" />
+    <Content Include="Images\SplashScreen.scale-125.png" />
+    <Content Include="Images\SplashScreen.scale-150.png" />
+    <Content Include="Images\SplashScreen.scale-200.png" />
+    <Content Include="Images\SplashScreen.scale-400.png" />
+    <Content Include="Images\Square150x150Logo.scale-100.png" />
+    <Content Include="Images\Square150x150Logo.scale-125.png" />
+    <Content Include="Images\Square150x150Logo.scale-150.png" />
+    <Content Include="Images\Square150x150Logo.scale-200.png" />
+    <Content Include="Images\Square150x150Logo.scale-400.png" />
+    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-16.png" />
+    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-256.png" />
+    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-32.png" />
+    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-48.png" />
+    <Content Include="Images\Square44x44Logo.scale-100.png" />
+    <Content Include="Images\Square44x44Logo.scale-125.png" />
+    <Content Include="Images\Square44x44Logo.scale-150.png" />
+    <Content Include="Images\Square44x44Logo.scale-200.png" />
+    <Content Include="Images\Square44x44Logo.scale-400.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-16.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-24.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-256.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-32.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-48.png" />
+    <Content Include="Images\StoreLogo.scale-100.png" />
+    <Content Include="Images\StoreLogo.scale-125.png" />
+    <Content Include="Images\StoreLogo.scale-150.png" />
+    <Content Include="Images\StoreLogo.scale-200.png" />
+    <Content Include="Images\StoreLogo.scale-400.png" />
+    <Content Include="Images\Wide310x150Logo.scale-100.png" />
+    <Content Include="Images\Wide310x150Logo.scale-125.png" />
+    <Content Include="Images\Wide310x150Logo.scale-150.png" />
+    <Content Include="Images\Wide310x150Logo.scale-200.png" />
+    <Content Include="$(BinDir)defaults.nh">
+      <Link>NetHackW\defaults.nh</Link>
+    </Content>
+    <Content Include="$(BinDir)Guidebook.txt">
+      <Link>NetHackW\Guidebook.txt</Link>
+    </Content>
+    <Content Include="$(BinDir)license">
+      <Link>NetHackW\license</Link>
+    </Content>
+    <Content Include="$(BinDir)nhdat$(VERSION_MAJOR)$(VERSION_MINOR)$(PATCHLEVEL)">
+      <Link>NetHackW\nhdat$(VERSION_MAJOR)$(VERSION_MINOR)$(PATCHLEVEL)</Link>
+    </Content>
+    <Content Include="$(BinDir)opthelp">
+      <Link>NetHackW\opthelp</Link>
+    </Content>
+    <Content Include="$(BinDir)symbols">
+      <Link>NetHackW\symbols</Link>
+    </Content>
+    <Content Include="$(BinDir)sysconf">
+      <Link>NetHackW\sysconf</Link>
+    </Content>
+    <Content Include="Images\Wide310x150Logo.scale-400.png" />
+    <None Include="NetHackPackage_StoreKey.pfx" />
+    <None Include="Package.StoreAssociation.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="NetHackW.vcxproj" />
+  </ItemGroup>
+  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
+</Project>
\ No newline at end of file
diff --git a/win/win32/vs2017/Package.StoreAssociation.xml b/win/win32/vs2017/Package.StoreAssociation.xml
new file mode 100644 (file)
index 0000000..1200895
--- /dev/null
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="utf-8"?>
+<StoreAssociation xmlns="http://schemas.microsoft.com/appx/2010/storeassociation">
+  <Publisher>CN=8BDC628A-FAAA-4EBA-8B5B-EB61BA93BA1F</Publisher>
+  <PublisherDisplayName>NetHack DevTeam</PublisherDisplayName>
+  <DeveloperAccountType>AAD</DeveloperAccountType>
+  <GeneratePackageHash>http://www.w3.org/2001/04/xmlenc#sha256</GeneratePackageHash>
+  <SupportedLocales>
+    <Language Code="af" InMinimumRequirementSet="true" />
+    <Language Code="af-za" InMinimumRequirementSet="true" />
+    <Language Code="am" InMinimumRequirementSet="true" />
+    <Language Code="am-et" InMinimumRequirementSet="true" />
+    <Language Code="ar" InMinimumRequirementSet="true" />
+    <Language Code="ar-ae" InMinimumRequirementSet="true" />
+    <Language Code="ar-bh" InMinimumRequirementSet="true" />
+    <Language Code="ar-dz" InMinimumRequirementSet="true" />
+    <Language Code="ar-eg" InMinimumRequirementSet="true" />
+    <Language Code="ar-iq" InMinimumRequirementSet="true" />
+    <Language Code="ar-jo" InMinimumRequirementSet="true" />
+    <Language Code="ar-kw" InMinimumRequirementSet="true" />
+    <Language Code="ar-lb" InMinimumRequirementSet="true" />
+    <Language Code="ar-ly" InMinimumRequirementSet="true" />
+    <Language Code="ar-ma" InMinimumRequirementSet="true" />
+    <Language Code="ar-om" InMinimumRequirementSet="true" />
+    <Language Code="ar-qa" InMinimumRequirementSet="true" />
+    <Language Code="ar-sa" InMinimumRequirementSet="true" />
+    <Language Code="ar-sy" InMinimumRequirementSet="true" />
+    <Language Code="ar-tn" InMinimumRequirementSet="true" />
+    <Language Code="ar-ye" InMinimumRequirementSet="true" />
+    <Language Code="as" InMinimumRequirementSet="true" />
+    <Language Code="as-in" InMinimumRequirementSet="true" />
+    <Language Code="az" InMinimumRequirementSet="true" />
+    <Language Code="az-arab" InMinimumRequirementSet="true" />
+    <Language Code="az-arab-az" InMinimumRequirementSet="true" />
+    <Language Code="az-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="az-cyrl-az" InMinimumRequirementSet="true" />
+    <Language Code="az-latn" InMinimumRequirementSet="true" />
+    <Language Code="az-latn-az" InMinimumRequirementSet="true" />
+    <Language Code="be" InMinimumRequirementSet="true" />
+    <Language Code="be-by" InMinimumRequirementSet="true" />
+    <Language Code="bg" InMinimumRequirementSet="true" />
+    <Language Code="bg-bg" InMinimumRequirementSet="true" />
+    <Language Code="bn" InMinimumRequirementSet="true" />
+    <Language Code="bn-bd" InMinimumRequirementSet="true" />
+    <Language Code="bn-in" InMinimumRequirementSet="true" />
+    <Language Code="bs" InMinimumRequirementSet="true" />
+    <Language Code="bs-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="bs-cyrl-ba" InMinimumRequirementSet="true" />
+    <Language Code="bs-latn" InMinimumRequirementSet="true" />
+    <Language Code="bs-latn-ba" InMinimumRequirementSet="true" />
+    <Language Code="ca" InMinimumRequirementSet="true" />
+    <Language Code="ca-es" InMinimumRequirementSet="true" />
+    <Language Code="ca-es-valencia" InMinimumRequirementSet="true" />
+    <Language Code="chr-cher" InMinimumRequirementSet="true" />
+    <Language Code="chr-cher-us" InMinimumRequirementSet="true" />
+    <Language Code="chr-latn" InMinimumRequirementSet="true" />
+    <Language Code="cs" InMinimumRequirementSet="true" />
+    <Language Code="cs-cz" InMinimumRequirementSet="true" />
+    <Language Code="cy" InMinimumRequirementSet="true" />
+    <Language Code="cy-gb" InMinimumRequirementSet="true" />
+    <Language Code="da" InMinimumRequirementSet="true" />
+    <Language Code="da-dk" InMinimumRequirementSet="true" />
+    <Language Code="de" InMinimumRequirementSet="true" />
+    <Language Code="de-at" InMinimumRequirementSet="true" />
+    <Language Code="de-ch" InMinimumRequirementSet="true" />
+    <Language Code="de-de" InMinimumRequirementSet="true" />
+    <Language Code="de-li" InMinimumRequirementSet="true" />
+    <Language Code="de-lu" InMinimumRequirementSet="true" />
+    <Language Code="el" InMinimumRequirementSet="true" />
+    <Language Code="el-gr" InMinimumRequirementSet="true" />
+    <Language Code="en" InMinimumRequirementSet="true" />
+    <Language Code="en-011" InMinimumRequirementSet="true" />
+    <Language Code="en-014" InMinimumRequirementSet="true" />
+    <Language Code="en-018" InMinimumRequirementSet="true" />
+    <Language Code="en-021" InMinimumRequirementSet="true" />
+    <Language Code="en-029" InMinimumRequirementSet="true" />
+    <Language Code="en-053" InMinimumRequirementSet="true" />
+    <Language Code="en-au" InMinimumRequirementSet="true" />
+    <Language Code="en-bz" InMinimumRequirementSet="true" />
+    <Language Code="en-ca" InMinimumRequirementSet="true" />
+    <Language Code="en-gb" InMinimumRequirementSet="true" />
+    <Language Code="en-hk" InMinimumRequirementSet="true" />
+    <Language Code="en-id" InMinimumRequirementSet="true" />
+    <Language Code="en-ie" InMinimumRequirementSet="true" />
+    <Language Code="en-in" InMinimumRequirementSet="true" />
+    <Language Code="en-jm" InMinimumRequirementSet="true" />
+    <Language Code="en-kz" InMinimumRequirementSet="true" />
+    <Language Code="en-mt" InMinimumRequirementSet="true" />
+    <Language Code="en-my" InMinimumRequirementSet="true" />
+    <Language Code="en-nz" InMinimumRequirementSet="true" />
+    <Language Code="en-ph" InMinimumRequirementSet="true" />
+    <Language Code="en-pk" InMinimumRequirementSet="true" />
+    <Language Code="en-sg" InMinimumRequirementSet="true" />
+    <Language Code="en-tt" InMinimumRequirementSet="true" />
+    <Language Code="en-us" InMinimumRequirementSet="true" />
+    <Language Code="en-vn" InMinimumRequirementSet="true" />
+    <Language Code="en-za" InMinimumRequirementSet="true" />
+    <Language Code="en-zw" InMinimumRequirementSet="true" />
+    <Language Code="es" InMinimumRequirementSet="true" />
+    <Language Code="es-019" InMinimumRequirementSet="true" />
+    <Language Code="es-419" InMinimumRequirementSet="true" />
+    <Language Code="es-ar" InMinimumRequirementSet="true" />
+    <Language Code="es-bo" InMinimumRequirementSet="true" />
+    <Language Code="es-cl" InMinimumRequirementSet="true" />
+    <Language Code="es-co" InMinimumRequirementSet="true" />
+    <Language Code="es-cr" InMinimumRequirementSet="true" />
+    <Language Code="es-do" InMinimumRequirementSet="true" />
+    <Language Code="es-ec" InMinimumRequirementSet="true" />
+    <Language Code="es-es" InMinimumRequirementSet="true" />
+    <Language Code="es-gt" InMinimumRequirementSet="true" />
+    <Language Code="es-hn" InMinimumRequirementSet="true" />
+    <Language Code="es-mx" InMinimumRequirementSet="true" />
+    <Language Code="es-ni" InMinimumRequirementSet="true" />
+    <Language Code="es-pa" InMinimumRequirementSet="true" />
+    <Language Code="es-pe" InMinimumRequirementSet="true" />
+    <Language Code="es-pr" InMinimumRequirementSet="true" />
+    <Language Code="es-py" InMinimumRequirementSet="true" />
+    <Language Code="es-sv" InMinimumRequirementSet="true" />
+    <Language Code="es-us" InMinimumRequirementSet="true" />
+    <Language Code="es-uy" InMinimumRequirementSet="true" />
+    <Language Code="es-ve" InMinimumRequirementSet="true" />
+    <Language Code="et" InMinimumRequirementSet="true" />
+    <Language Code="et-ee" InMinimumRequirementSet="true" />
+    <Language Code="eu" InMinimumRequirementSet="true" />
+    <Language Code="eu-es" InMinimumRequirementSet="true" />
+    <Language Code="fa" InMinimumRequirementSet="true" />
+    <Language Code="fa-ir" InMinimumRequirementSet="true" />
+    <Language Code="fi" InMinimumRequirementSet="true" />
+    <Language Code="fi-fi" InMinimumRequirementSet="true" />
+    <Language Code="fil" InMinimumRequirementSet="true" />
+    <Language Code="fil-latn" InMinimumRequirementSet="true" />
+    <Language Code="fil-ph" InMinimumRequirementSet="true" />
+    <Language Code="fr" InMinimumRequirementSet="true" />
+    <Language Code="fr-011" InMinimumRequirementSet="true" />
+    <Language Code="fr-015" InMinimumRequirementSet="true" />
+    <Language Code="fr-021" InMinimumRequirementSet="true" />
+    <Language Code="fr-029" InMinimumRequirementSet="true" />
+    <Language Code="fr-155" InMinimumRequirementSet="true" />
+    <Language Code="fr-be" InMinimumRequirementSet="true" />
+    <Language Code="fr-ca" InMinimumRequirementSet="true" />
+    <Language Code="fr-cd" InMinimumRequirementSet="true" />
+    <Language Code="fr-ch" InMinimumRequirementSet="true" />
+    <Language Code="fr-ci" InMinimumRequirementSet="true" />
+    <Language Code="fr-cm" InMinimumRequirementSet="true" />
+    <Language Code="fr-fr" InMinimumRequirementSet="true" />
+    <Language Code="fr-ht" InMinimumRequirementSet="true" />
+    <Language Code="fr-lu" InMinimumRequirementSet="true" />
+    <Language Code="fr-ma" InMinimumRequirementSet="true" />
+    <Language Code="fr-mc" InMinimumRequirementSet="true" />
+    <Language Code="fr-ml" InMinimumRequirementSet="true" />
+    <Language Code="fr-re" InMinimumRequirementSet="true" />
+    <Language Code="frc-latn" InMinimumRequirementSet="true" />
+    <Language Code="frp-latn" InMinimumRequirementSet="true" />
+    <Language Code="ga" InMinimumRequirementSet="true" />
+    <Language Code="ga-ie" InMinimumRequirementSet="true" />
+    <Language Code="gd-gb" InMinimumRequirementSet="true" />
+    <Language Code="gd-latn" InMinimumRequirementSet="true" />
+    <Language Code="gl" InMinimumRequirementSet="true" />
+    <Language Code="gl-es" InMinimumRequirementSet="true" />
+    <Language Code="gu" InMinimumRequirementSet="true" />
+    <Language Code="gu-in" InMinimumRequirementSet="true" />
+    <Language Code="ha" InMinimumRequirementSet="true" />
+    <Language Code="ha-latn" InMinimumRequirementSet="true" />
+    <Language Code="ha-latn-ng" InMinimumRequirementSet="true" />
+    <Language Code="he" InMinimumRequirementSet="true" />
+    <Language Code="he-il" InMinimumRequirementSet="true" />
+    <Language Code="hi" InMinimumRequirementSet="true" />
+    <Language Code="hi-in" InMinimumRequirementSet="true" />
+    <Language Code="hr" InMinimumRequirementSet="true" />
+    <Language Code="hr-ba" InMinimumRequirementSet="true" />
+    <Language Code="hr-hr" InMinimumRequirementSet="true" />
+    <Language Code="hu" InMinimumRequirementSet="true" />
+    <Language Code="hu-hu" InMinimumRequirementSet="true" />
+    <Language Code="hy" InMinimumRequirementSet="true" />
+    <Language Code="hy-am" InMinimumRequirementSet="true" />
+    <Language Code="id" InMinimumRequirementSet="true" />
+    <Language Code="id-id" InMinimumRequirementSet="true" />
+    <Language Code="ig-latn" InMinimumRequirementSet="true" />
+    <Language Code="ig-ng" InMinimumRequirementSet="true" />
+    <Language Code="is" InMinimumRequirementSet="true" />
+    <Language Code="is-is" InMinimumRequirementSet="true" />
+    <Language Code="it" InMinimumRequirementSet="true" />
+    <Language Code="it-ch" InMinimumRequirementSet="true" />
+    <Language Code="it-it" InMinimumRequirementSet="true" />
+    <Language Code="iu-cans" InMinimumRequirementSet="true" />
+    <Language Code="iu-latn" InMinimumRequirementSet="true" />
+    <Language Code="iu-latn-ca" InMinimumRequirementSet="true" />
+    <Language Code="ja" InMinimumRequirementSet="true" />
+    <Language Code="ja-jp" InMinimumRequirementSet="true" />
+    <Language Code="ka" InMinimumRequirementSet="true" />
+    <Language Code="ka-ge" InMinimumRequirementSet="true" />
+    <Language Code="kk" InMinimumRequirementSet="true" />
+    <Language Code="kk-kz" InMinimumRequirementSet="true" />
+    <Language Code="km" InMinimumRequirementSet="true" />
+    <Language Code="km-kh" InMinimumRequirementSet="true" />
+    <Language Code="kn" InMinimumRequirementSet="true" />
+    <Language Code="kn-in" InMinimumRequirementSet="true" />
+    <Language Code="ko" InMinimumRequirementSet="true" />
+    <Language Code="ko-kr" InMinimumRequirementSet="true" />
+    <Language Code="kok" InMinimumRequirementSet="true" />
+    <Language Code="kok-in" InMinimumRequirementSet="true" />
+    <Language Code="ku-arab" InMinimumRequirementSet="true" />
+    <Language Code="ku-arab-iq" InMinimumRequirementSet="true" />
+    <Language Code="ky-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="ky-kg" InMinimumRequirementSet="true" />
+    <Language Code="lb" InMinimumRequirementSet="true" />
+    <Language Code="lb-lu" InMinimumRequirementSet="true" />
+    <Language Code="lo" InMinimumRequirementSet="true" />
+    <Language Code="lo-la" InMinimumRequirementSet="true" />
+    <Language Code="lt" InMinimumRequirementSet="true" />
+    <Language Code="lt-lt" InMinimumRequirementSet="true" />
+    <Language Code="lv" InMinimumRequirementSet="true" />
+    <Language Code="lv-lv" InMinimumRequirementSet="true" />
+    <Language Code="mi" InMinimumRequirementSet="true" />
+    <Language Code="mi-latn" InMinimumRequirementSet="true" />
+    <Language Code="mi-nz" InMinimumRequirementSet="true" />
+    <Language Code="mk" InMinimumRequirementSet="true" />
+    <Language Code="mk-mk" InMinimumRequirementSet="true" />
+    <Language Code="ml" InMinimumRequirementSet="true" />
+    <Language Code="ml-in" InMinimumRequirementSet="true" />
+    <Language Code="mn-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="mn-mn" InMinimumRequirementSet="true" />
+    <Language Code="mn-mong" InMinimumRequirementSet="true" />
+    <Language Code="mn-phag" InMinimumRequirementSet="true" />
+    <Language Code="mr" InMinimumRequirementSet="true" />
+    <Language Code="mr-in" InMinimumRequirementSet="true" />
+    <Language Code="ms" InMinimumRequirementSet="true" />
+    <Language Code="ms-bn" InMinimumRequirementSet="true" />
+    <Language Code="ms-my" InMinimumRequirementSet="true" />
+    <Language Code="mt" InMinimumRequirementSet="true" />
+    <Language Code="mt-mt" InMinimumRequirementSet="true" />
+    <Language Code="nb" InMinimumRequirementSet="true" />
+    <Language Code="nb-no" InMinimumRequirementSet="true" />
+    <Language Code="ne" InMinimumRequirementSet="true" />
+    <Language Code="ne-np" InMinimumRequirementSet="true" />
+    <Language Code="nl" InMinimumRequirementSet="true" />
+    <Language Code="nl-be" InMinimumRequirementSet="true" />
+    <Language Code="nl-nl" InMinimumRequirementSet="true" />
+    <Language Code="nn" InMinimumRequirementSet="true" />
+    <Language Code="nn-no" InMinimumRequirementSet="true" />
+    <Language Code="no" InMinimumRequirementSet="true" />
+    <Language Code="no-no" InMinimumRequirementSet="true" />
+    <Language Code="nso" InMinimumRequirementSet="true" />
+    <Language Code="nso-za" InMinimumRequirementSet="true" />
+    <Language Code="om" InMinimumRequirementSet="false" />
+    <Language Code="om-et" InMinimumRequirementSet="false" />
+    <Language Code="or" InMinimumRequirementSet="true" />
+    <Language Code="or-in" InMinimumRequirementSet="true" />
+    <Language Code="pa" InMinimumRequirementSet="true" />
+    <Language Code="pa-arab" InMinimumRequirementSet="true" />
+    <Language Code="pa-arab-pk" InMinimumRequirementSet="true" />
+    <Language Code="pa-deva" InMinimumRequirementSet="true" />
+    <Language Code="pa-in" InMinimumRequirementSet="true" />
+    <Language Code="pl" InMinimumRequirementSet="true" />
+    <Language Code="pl-pl" InMinimumRequirementSet="true" />
+    <Language Code="prs" InMinimumRequirementSet="true" />
+    <Language Code="prs-af" InMinimumRequirementSet="true" />
+    <Language Code="prs-arab" InMinimumRequirementSet="true" />
+    <Language Code="pt" InMinimumRequirementSet="true" />
+    <Language Code="pt-br" InMinimumRequirementSet="true" />
+    <Language Code="pt-pt" InMinimumRequirementSet="true" />
+    <Language Code="quc-latn" InMinimumRequirementSet="true" />
+    <Language Code="qut-gt" InMinimumRequirementSet="true" />
+    <Language Code="qut-latn" InMinimumRequirementSet="true" />
+    <Language Code="quz" InMinimumRequirementSet="true" />
+    <Language Code="quz-bo" InMinimumRequirementSet="true" />
+    <Language Code="quz-ec" InMinimumRequirementSet="true" />
+    <Language Code="quz-pe" InMinimumRequirementSet="true" />
+    <Language Code="ro" InMinimumRequirementSet="true" />
+    <Language Code="ro-ro" InMinimumRequirementSet="true" />
+    <Language Code="ru" InMinimumRequirementSet="true" />
+    <Language Code="ru-ru" InMinimumRequirementSet="true" />
+    <Language Code="rw" InMinimumRequirementSet="true" />
+    <Language Code="rw-rw" InMinimumRequirementSet="true" />
+    <Language Code="sd-arab" InMinimumRequirementSet="true" />
+    <Language Code="sd-arab-pk" InMinimumRequirementSet="true" />
+    <Language Code="sd-deva" InMinimumRequirementSet="true" />
+    <Language Code="si" InMinimumRequirementSet="true" />
+    <Language Code="si-lk" InMinimumRequirementSet="true" />
+    <Language Code="sk" InMinimumRequirementSet="true" />
+    <Language Code="sk-sk" InMinimumRequirementSet="true" />
+    <Language Code="sl" InMinimumRequirementSet="true" />
+    <Language Code="sl-si" InMinimumRequirementSet="true" />
+    <Language Code="sq" InMinimumRequirementSet="true" />
+    <Language Code="sq-al" InMinimumRequirementSet="true" />
+    <Language Code="sr" InMinimumRequirementSet="true" />
+    <Language Code="sr-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="sr-cyrl-ba" InMinimumRequirementSet="true" />
+    <Language Code="sr-cyrl-cs" InMinimumRequirementSet="true" />
+    <Language Code="sr-cyrl-me" InMinimumRequirementSet="true" />
+    <Language Code="sr-cyrl-rs" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn-ba" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn-cs" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn-me" InMinimumRequirementSet="true" />
+    <Language Code="sr-latn-rs" InMinimumRequirementSet="true" />
+    <Language Code="sv" InMinimumRequirementSet="true" />
+    <Language Code="sv-fi" InMinimumRequirementSet="true" />
+    <Language Code="sv-se" InMinimumRequirementSet="true" />
+    <Language Code="sw" InMinimumRequirementSet="true" />
+    <Language Code="sw-ke" InMinimumRequirementSet="true" />
+    <Language Code="ta" InMinimumRequirementSet="true" />
+    <Language Code="ta-in" InMinimumRequirementSet="true" />
+    <Language Code="te" InMinimumRequirementSet="true" />
+    <Language Code="te-in" InMinimumRequirementSet="true" />
+    <Language Code="tg-arab" InMinimumRequirementSet="true" />
+    <Language Code="tg-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="tg-cyrl-tj" InMinimumRequirementSet="true" />
+    <Language Code="tg-latn" InMinimumRequirementSet="true" />
+    <Language Code="th" InMinimumRequirementSet="true" />
+    <Language Code="th-th" InMinimumRequirementSet="true" />
+    <Language Code="ti" InMinimumRequirementSet="true" />
+    <Language Code="ti-et" InMinimumRequirementSet="true" />
+    <Language Code="tk-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="tk-cyrl-tr" InMinimumRequirementSet="true" />
+    <Language Code="tk-latn" InMinimumRequirementSet="true" />
+    <Language Code="tk-latn-tr" InMinimumRequirementSet="true" />
+    <Language Code="tk-tm" InMinimumRequirementSet="true" />
+    <Language Code="tn" InMinimumRequirementSet="true" />
+    <Language Code="tn-bw" InMinimumRequirementSet="true" />
+    <Language Code="tn-za" InMinimumRequirementSet="true" />
+    <Language Code="tr" InMinimumRequirementSet="true" />
+    <Language Code="tr-tr" InMinimumRequirementSet="true" />
+    <Language Code="tt-arab" InMinimumRequirementSet="true" />
+    <Language Code="tt-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="tt-latn" InMinimumRequirementSet="true" />
+    <Language Code="tt-ru" InMinimumRequirementSet="true" />
+    <Language Code="ug-arab" InMinimumRequirementSet="true" />
+    <Language Code="ug-cn" InMinimumRequirementSet="true" />
+    <Language Code="ug-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="ug-latn" InMinimumRequirementSet="true" />
+    <Language Code="uk" InMinimumRequirementSet="true" />
+    <Language Code="uk-ua" InMinimumRequirementSet="true" />
+    <Language Code="ur" InMinimumRequirementSet="true" />
+    <Language Code="ur-pk" InMinimumRequirementSet="true" />
+    <Language Code="uz" InMinimumRequirementSet="true" />
+    <Language Code="uz-cyrl" InMinimumRequirementSet="true" />
+    <Language Code="uz-latn" InMinimumRequirementSet="true" />
+    <Language Code="uz-latn-uz" InMinimumRequirementSet="true" />
+    <Language Code="vi" InMinimumRequirementSet="true" />
+    <Language Code="vi-vn" InMinimumRequirementSet="true" />
+    <Language Code="wo" InMinimumRequirementSet="true" />
+    <Language Code="wo-sn" InMinimumRequirementSet="true" />
+    <Language Code="xh" InMinimumRequirementSet="true" />
+    <Language Code="xh-za" InMinimumRequirementSet="true" />
+    <Language Code="yo-latn" InMinimumRequirementSet="true" />
+    <Language Code="yo-ng" InMinimumRequirementSet="true" />
+    <Language Code="zh" InMinimumRequirementSet="true" />
+    <Language Code="zh-cn" InMinimumRequirementSet="true" />
+    <Language Code="zh-hans" InMinimumRequirementSet="true" />
+    <Language Code="zh-hans-cn" InMinimumRequirementSet="true" />
+    <Language Code="zh-hans-sg" InMinimumRequirementSet="true" />
+    <Language Code="zh-hant" InMinimumRequirementSet="true" />
+    <Language Code="zh-hant-hk" InMinimumRequirementSet="true" />
+    <Language Code="zh-hant-mo" InMinimumRequirementSet="true" />
+    <Language Code="zh-hant-tw" InMinimumRequirementSet="true" />
+    <Language Code="zh-hk" InMinimumRequirementSet="true" />
+    <Language Code="zh-mo" InMinimumRequirementSet="true" />
+    <Language Code="zh-sg" InMinimumRequirementSet="true" />
+    <Language Code="zh-tw" InMinimumRequirementSet="true" />
+    <Language Code="zu" InMinimumRequirementSet="true" />
+    <Language Code="zu-za" InMinimumRequirementSet="true" />
+  </SupportedLocales>
+  <ProductReservedInfo>
+    <MainPackageIdentityName>30485NetHackDevTeam.NetHack3.6</MainPackageIdentityName>
+    <ReservedNames>
+      <ReservedName>NetHack 3.6</ReservedName>
+    </ReservedNames>
+  </ProductReservedInfo>
+  <AccountPackageIdentityNames>
+    <MainPackageIdentityName>30485NetHackDevTeam.NetHackBeta</MainPackageIdentityName>
+  </AccountPackageIdentityNames>
+  <PackageInfoList LandingUrl="https://developer.microsoft.com/dashboard/Application?appId=9PJ7BFSRP8M5" />
+</StoreAssociation>
\ No newline at end of file
diff --git a/win/win32/vs2017/ScreenShot.PNG b/win/win32/vs2017/ScreenShot.PNG
new file mode 100644 (file)
index 0000000..36d9f98
Binary files /dev/null and b/win/win32/vs2017/ScreenShot.PNG differ