+
+#if 1 /* ================================================================== */
+
+ else if (length >= 2106 &&
+ (src[1983] == 27 || /* encrypted (only EM I/II/III) */
+ src[1983] == 116 || /* unencrypted (usual case) */
+ src[1983] == 131)) /* unencrypted (rare case) */
+ {
+ /* ---------- this cave has V1, V2 or V3 file format ---------- */
+
+ boolean fix_copyright = FALSE;
+
+ /*
+ byte at position 1983 (0x07bf) is used as "magic byte":
+ - 27 (0x1b) => encrypted level (V3 only / Kingsoft original games)
+ - 116 (0x74) => unencrypted level (byte is corrected to 131 (0x83))
+ - 131 (0x83) => unencrypted level (happens only in very rare cases)
+ */
+
+ if (src[1983] == 27) /* (0x1b) -- after decryption: 116 (0x74) */
+ {
+ /* this is original (encrypted) Emerald Mine I, II or III level file */
+
+ int first_byte = src[0];
+ unsigned char code0 = 0x65;
+ unsigned char code1 = 0x11;
+
+ /* decode encrypted level data */
+ for (i = 0; i < 2106; i++)
+ {
+ src[i] ^= code0;
+ src[i] -= code1;
+
+ code0 = (code0 + 7) & 0xff;
+ }
+
+ src[1] = 131; /* needed for all Emerald Mine levels */
+
+ /* first byte is either 0xf1 (EM I and III) or 0xf5 (EM II) */
+ if (first_byte == 0xf5)
+ {
+ src[0] = 131; /* only needed for Emerald Mine II levels */
+
+ fix_copyright = TRUE;
+ }
+
+ /* ---------- this cave has V3 file format ---------- */
+ file_version = FILE_VERSION_EM_V3;
+ }
+ else if (filename_has_v1_format(filename))
+ {
+ /* ---------- this cave has V1 file format ---------- */
+ file_version = FILE_VERSION_EM_V1;
+ }
+ else
+ {
+ /* ---------- this cave has V2 file format ---------- */
+ file_version = FILE_VERSION_EM_V2;
+ }
+
+ /* remap elements to internal EMC level format */
+ for (i = 0; i < 2048; i++)
+ src[i] = remap_v4[src[i]];
+ for (i = 2048; i < 2084; i++)
+ src[i] = remap_v4eater[src[i] >= 28 ? 0 : src[i]];
+ for (i = 2112; i < 2148; i++)
+ src[i] = src[i - 64];
+
+ if (fix_copyright) /* fix "(c)" sign in Emerald Mine II levels */
+ {
+ for (i = 0; i < 2048; i++)
+ if (src[i] == 241)
+ src[i] = 254; /* replace 'Xdecor_1' with 'Xalpha_copyr' */
+ }
+ }
+ else
+ {
+ /* ---------- this cave has unknown file format ---------- */
+
+ /* if file has length of old-style level file, print (wrong) magic byte */
+ if (length < 2110)
+ Error(ERR_WARN, "unknown magic byte 0x%02x at position 0x%04x",
+ src[1983], 1983);
+
+ return FILE_VERSION_EM_UNKNOWN;
+ }
+
+#else /* ================================================================== */
+
+#if 0
+ else if (length >= 2106) /* !!! TEST ONLY: SHOW BROKEN LEVELS !!! */
+#else