Author Topic: Xanadu II Translation Development Blog  (Read 22473 times)

elmer

  • Hero Member
  • *****
  • Posts: 2148
Xanadu II Translation Development Blog
« on: August 31, 2015, 04:50:09 AM »




This game is a beast!   ](*,)

Just in case I get hit by a bus, I'll try to document some of my hacking progress here.

Who knows, someone might even find this stuff interesting!  :roll:

-----------------------------

The data on the CD is split into a lot of separate "files" at fixed locations.

It looks like there's a simple structure to each "file" block.

-----------------------------


// Xanadu II META_BLOCK data file structure.
//
// The number of DATA_CHUNKS in a META_BLOCK is simply the 1st-offset / 4.
//
// DATA_B = 1 byte of data
// ZERO_B = 1 byte of zero
//

META_BLOCK = HEAD_CHUNK { DATA_CHUNK } ;

HEAD_CHUNK =
{
  DATA_B (* Byte offset to DATA_CHUNK from start of file : lo-byte   *)
  DATA_B (* Byte offset to DATA_CHUNK from start of file : hi-byte   *)
  DATA_B (* Bank offset to DATA_CHUNK from start of file : 8KB banks *)
  ZERO_B
} ;

DATA_CHUNK =
  DATA_B       (* PAYLOAD length in bytes + 1 : lo-byte *)
  DATA_B       (* PAYLOAD length in bytes + 1 : hi-byte *)
  PAYLOAD
  ;

// If 1st byte of PAYLOAD is $00 then data is compressed in NEW_FORMAT, else in OLD-FORMAT.

PAYLOAD = { DATA_B } ; (* Repeated for length of PAYLOAD *)

// Xanadu II Data Search v0.0.1 Sep  1 2015
//
// Processing File "../cd/02 Kaze no Densetsu Xanadu II (J).iso".
//
//   META_BLOCK at 0x0000d800, end 0x000155e8,  16 DATA_CHUNKs,   2 new format.
// * META_BLOCK at 0x00019800, end 0x0001d19c,  11 DATA_CHUNKs,   1 new format.
// * META_BLOCK at 0x0003b800, end 0x00045d4f,  26 DATA_CHUNKs,  13 new format.
//   META_BLOCK at 0x0004b800, end 0x00053fa4,  12 DATA_CHUNKs,   0 new format.
// * META_BLOCK at 0x00057800, end 0x0005fde6,  12 DATA_CHUNKs,   0 new format.
//   META_BLOCK at 0x0006b800, end 0x00088699,  68 DATA_CHUNKs,  39 new format.
//   META_BLOCK at 0x0009b800, end 0x000b2f4d,  89 DATA_CHUNKs,  45 new format.
//   META_BLOCK at 0x000bb800, end 0x000d76c9,  61 DATA_CHUNKs,  34 new format.
//   META_BLOCK at 0x000db800, end 0x000f0299,  55 DATA_CHUNKs,  30 new format.
//   META_BLOCK at 0x000fb800, end 0x0011b721,  81 DATA_CHUNKs,  56 new format.
//   META_BLOCK at 0x0011b800, end 0x0013078f,  51 DATA_CHUNKs,  26 new format.
//   META_BLOCK at 0x0013b800, end 0x00154d51,  63 DATA_CHUNKs,  42 new format.
//   META_BLOCK at 0x0015b800, end 0x001796d5,  70 DATA_CHUNKs,  51 new format.
//   META_BLOCK at 0x0017b800, end 0x00199535,  70 DATA_CHUNKs,  51 new format.
//   META_BLOCK at 0x0019b800, end 0x001b3118,  66 DATA_CHUNKs,  47 new format.
//   META_BLOCK at 0x001bb800, end 0x001c95a4,  34 DATA_CHUNKs,  21 new format.
//   META_BLOCK at 0x001db800, end 0x001ec8a5,  40 DATA_CHUNKs,  23 new format.
//   META_BLOCK at 0x001fb800, end 0x002125cd,  69 DATA_CHUNKs,  44 new format.
//   META_BLOCK at 0x0021b800, end 0x0022a504,  32 DATA_CHUNKs,  18 new format.
//   META_BLOCK at 0x0023b800, end 0x0025b3f4,  80 DATA_CHUNKs,  57 new format.
//   META_BLOCK at 0x0025b800, end 0x0026f2fd,  55 DATA_CHUNKs,  38 new format.
//   META_BLOCK at 0x0027b800, end 0x00289115,  30 DATA_CHUNKs,  17 new format.
//   META_BLOCK at 0x0029b800, end 0x002bb629, 140 DATA_CHUNKs, 120 new format.
//   META_BLOCK at 0x002bb800, end 0x002d8457, 109 DATA_CHUNKs,  62 new format.
//   META_BLOCK at 0x002db800, end 0x002ec373,  55 DATA_CHUNKs,  37 new format.
//   META_BLOCK at 0x002fb800, end 0x0030b140,  37 DATA_CHUNKs,  21 new format.
//   META_BLOCK at 0x0031b800, end 0x00334b7f,  57 DATA_CHUNKs,  36 new format.
//   META_BLOCK at 0x0033b800, end 0x0034f39b,  42 DATA_CHUNKs,  29 new format.
//   META_BLOCK at 0x0035b800, end 0x0036f703,  45 DATA_CHUNKs,  29 new format.
//   META_BLOCK at 0x0037b800, end 0x00396346,  75 DATA_CHUNKs,  58 new format.
//   META_BLOCK at 0x0039b800, end 0x003b8d6f,  72 DATA_CHUNKs,  54 new format.
//   META_BLOCK at 0x003bb800, end 0x003cf3ab,  43 DATA_CHUNKs,  27 new format.
//   META_BLOCK at 0x003db800, end 0x003e6baa,  27 DATA_CHUNKs,  14 new format.
// * META_BLOCK at 0x003e7800, end 0x003f298e,  27 DATA_CHUNKs,  14 new format.
//   META_BLOCK at 0x003fb800, end 0x0041b5a3,  81 DATA_CHUNKs,  56 new format.
//   META_BLOCK at 0x0041b800, end 0x0043b465,  86 DATA_CHUNKs,  58 new format.
//   META_BLOCK at 0x0043b800, end 0x0045adbe,  78 DATA_CHUNKs,  55 new format.
//   META_BLOCK at 0x0045b800, end 0x004705ef,  57 DATA_CHUNKs,  40 new format.
//   META_BLOCK at 0x0047b800, end 0x00488d75,  30 DATA_CHUNKs,  17 new format.
//   META_BLOCK at 0x0049b800, end 0x004b4fad,  84 DATA_CHUNKs,  67 new format.
//   META_BLOCK at 0x004bb800, end 0x004c8c82,  38 DATA_CHUNKs,  25 new format.
//   META_BLOCK at 0x004db800, end 0x004f40f3,  68 DATA_CHUNKs,  55 new format.
//   META_BLOCK at 0x004fb800, end 0x00514032,  60 DATA_CHUNKs,  43 new format.
//   META_BLOCK at 0x0051b800, end 0x0053296f,  52 DATA_CHUNKs,  30 new format.
//   META_BLOCK at 0x0053b800, end 0x00555c48,  69 DATA_CHUNKs,  45 new format.
//   META_BLOCK at 0x0055b800, end 0x0057a4b5,  88 DATA_CHUNKs,  65 new format.
//   META_BLOCK at 0x0057b800, end 0x0059743e, 128 DATA_CHUNKs, 109 new format.
//   META_BLOCK at 0x0059b800, end 0x005b375a,  66 DATA_CHUNKs,  46 new format.
//   META_BLOCK at 0x005bb800, end 0x005daa5b, 118 DATA_CHUNKs, 100 new format.
//   META_BLOCK at 0x005db800, end 0x005edc13,  38 DATA_CHUNKs,  21 new format.
//   META_BLOCK at 0x005fb800, end 0x0060e0c0,  40 DATA_CHUNKs,  23 new format.
//   META_BLOCK at 0x0061b800, end 0x0062df12,  40 DATA_CHUNKs,  21 new format.
//   META_BLOCK at 0x0063b800, end 0x006574ae,  78 DATA_CHUNKs,  55 new format.
//   META_BLOCK at 0x0065b800, end 0x00670a45,  48 DATA_CHUNKs,  32 new format.
//   META_BLOCK at 0x0067b800, end 0x00691c97,  44 DATA_CHUNKs,  27 new format.
//   META_BLOCK at 0x0069b800, end 0x006bb03d, 109 DATA_CHUNKs,  94 new format.
//   META_BLOCK at 0x006bb800, end 0x006d1e0c,  46 DATA_CHUNKs,  27 new format.
//   META_BLOCK at 0x006db800, end 0x006eda86,  39 DATA_CHUNKs,  22 new format.
//   META_BLOCK at 0x006fb800, end 0x00708c05,  29 DATA_CHUNKs,  15 new format.
//   META_BLOCK at 0x0071b800, end 0x00736a93,  76 DATA_CHUNKs,  53 new format.
//   META_BLOCK at 0x0073b800, end 0x0074e9b4,  45 DATA_CHUNKs,  29 new format.
//   META_BLOCK at 0x0075b800, end 0x00771d9b,  44 DATA_CHUNKs,  27 new format.
//   META_BLOCK at 0x0077b800, end 0x0079943b,  97 DATA_CHUNKs,  77 new format.
//   META_BLOCK at 0x0079b800, end 0x007b9d69,  86 DATA_CHUNKs,  66 new format.
//   META_BLOCK at 0x007bb800, end 0x007c6d66,  27 DATA_CHUNKs,  13 new format.
// * META_BLOCK at 0x007c7800, end 0x007d2ab5,  27 DATA_CHUNKs,  13 new format.
//   META_BLOCK at 0x007db800, end 0x007e6735,  27 DATA_CHUNKs,  13 new format.
// * META_BLOCK at 0x007e7800, end 0x007f2735,  27 DATA_CHUNKs,  13 new format.
//   META_BLOCK at 0x007fb800, end 0x00816028,  78 DATA_CHUNKs,  54 new format.
//   META_BLOCK at 0x0081b800, end 0x0082dc75,  45 DATA_CHUNKs,  26 new format.
//   META_BLOCK at 0x0083b800, end 0x0085839a,  65 DATA_CHUNKs,  40 new format.
//   META_BLOCK at 0x0085b800, end 0x0086bcf6,  38 DATA_CHUNKs,  22 new format.
//   META_BLOCK at 0x0087b800, end 0x0089a955, 124 DATA_CHUNKs, 106 new format.
//   META_BLOCK at 0x0089b800, end 0x008ad7f8,  52 DATA_CHUNKs,  31 new format.
//   META_BLOCK at 0x00921800, end 0x009294e1,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x00981800, end 0x00988e8c,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x009a1800, end 0x009a9032,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x009b9800, end 0x009c0c7c,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x009d1800, end 0x009d74bd,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x009e9800, end 0x009f1a39,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x00a01800, end 0x00a09687,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x00a19800, end 0x00a20a4d,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x00a31800, end 0x00a38b30,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x00a49800, end 0x00a51de7,  11 DATA_CHUNKs,   5 new format.
//   META_BLOCK at 0x00a61800, end 0x00a70dff,  29 DATA_CHUNKs,  14 new format.
//   META_BLOCK at 0x00a7d800, end 0x00a8a394,  28 DATA_CHUNKs,  13 new format.
//   META_BLOCK at 0x00a99800, end 0x00aa9fd9,  29 DATA_CHUNKs,  14 new format.
//   META_BLOCK at 0x00ab5800, end 0x00ac3197,  28 DATA_CHUNKs,  15 new format.
//   META_BLOCK at 0x00ad1800, end 0x00ae2ae6,  41 DATA_CHUNKs,  16 new format.
//   META_BLOCK at 0x00aed800, end 0x00aff421,  32 DATA_CHUNKs,  15 new format.
//   META_BLOCK at 0x00b09800, end 0x00b19ef9,  30 DATA_CHUNKs,  14 new format.
//   META_BLOCK at 0x00b25800, end 0x00b36efa,  32 DATA_CHUNKs,  15 new format.
//   META_BLOCK at 0x00b41800, end 0x00b4f5a9,  29 DATA_CHUNKs,  15 new format.
//   META_BLOCK at 0x00b5d800, end 0x00b6a379,  27 DATA_CHUNKs,  14 new format.
//   META_BLOCK at 0x00b79800, end 0x00b8cf39,  47 DATA_CHUNKs,  14 new format.
//   META_BLOCK at 0x00b95800, end 0x00ba7dec,  31 DATA_CHUNKs,  13 new format.
//   META_BLOCK at 0x00bb1800, end 0x00bc35c4,  45 DATA_CHUNKs,  18 new format.
//   META_BLOCK at 0x00bcd800, end 0x00be06eb,  50 DATA_CHUNKs,  48 new format.
//   META_BLOCK at 0x00c0b800, end 0x00c413e8, 181 DATA_CHUNKs, 180 new format.
//   META_BLOCK at 0x00c41800, end 0x00c50e3a,  18 DATA_CHUNKs,  17 new format.
//   META_BLOCK at 0x00c53800, end 0x00c6081a,  19 DATA_CHUNKs,   0 new format.
//   META_BLOCK at 0x00c6b800, end 0x00c735e8,  16 DATA_CHUNKs,   2 new format.
//   META_BLOCK at 0x00c8b800, end 0x00c98042,  21 DATA_CHUNKs,   0 new format.
// * META_BLOCK at 0x00ca3800, end 0x00cab5e8,  16 DATA_CHUNKs,   2 new format.
//   META_BLOCK at 0x00cc3800, end 0x00cf4460,  57 DATA_CHUNKs,   0 new format.
//   META_BLOCK at 0x00cfb800, end 0x00d0e34e,  33 DATA_CHUNKs,   0 new format.
// * META_BLOCK at 0x00d13800, end 0x00d1b5e8,  16 DATA_CHUNKs,   2 new format.
//   META_BLOCK at 0x00d33800, end 0x00d4d13c,  50 DATA_CHUNKs,   0 new format.
//   META_BLOCK at 0x00d6b800, end 0x00d8598b,  35 DATA_CHUNKs,   0 new format.
//   META_BLOCK at 0x00da3800, end 0x00db84c2,  36 DATA_CHUNKs,   0 new format.
// * META_BLOCK at 0x00dbb800, end 0x00dc35e8,  16 DATA_CHUNKs,   2 new format.
//   META_BLOCK at 0x00ddb800, end 0x00df4bcd,  30 DATA_CHUNKs,   0 new format.
//   META_BLOCK at 0x00e13800, end 0x00e47dfe,  70 DATA_CHUNKs,   0 new format.
//   META_BLOCK at 0x00e4b800, end 0x00e6e49f,  64 DATA_CHUNKs,   0 new format.
//   META_BLOCK at 0x00e83800, end 0x00ea1a16,  34 DATA_CHUNKs,   0 new format.
// * META_BLOCK at 0x00ea7000, end 0x00eaede8,  16 DATA_CHUNKs,   2 new format.
// * META_BLOCK at 0x00eb3000, end 0x00eb699c,  11 DATA_CHUNKs,   1 new format.

« Last Edit: September 28, 2015, 07:16:15 AM by elmer »

elmer

  • Hero Member
  • *****
  • Posts: 2148
Re: Xanadu II Translation Development Blog
« Reply #1 on: August 31, 2015, 09:42:02 AM »

//
// Xanadu II OLD_FORMAT for PAYLOAD.
//
// Simple compressed data, just a stream of "command" and "parameter"
// bytes.
//
// I suspect that this is used for graphics data.
//

Command $00     (+0) : STOP ... All Done, end of PAYLOAD!
     params          : -

Command $01-$1f (+0) : Copy ($01..$1f) bytes from file to output
     params          : -

Command $20-$3f (+1) : Copy ($0000..$1fff) bytes from file to output
     params          : count-lo

Command $40-$4f (+1) : Fill ($00..$0f + 4) bytes with value
     params          : value

Command $50-$5f (+2) : Fill ($0000..$0fff + 4) bytes with value
     params          : count-lo, value

Command $60-$7f (+0) : Copy ($01..$1f, or 256) more bytes from earlier
     params          : -

Command $80-$9f (+1) : Copy 4 bytes from earlier in output (offset $0000-$1fff)
     params          : offset-lo

Command $a0-$bf (+1) : Copy 5 bytes from earlier in output (offset $0000-$1fff)
     params          : offset-lo

Command $c0-$df (+1) : Copy 6 bytes from earlier in output (offset $0000-$1fff)
     params          : offset-lo

Command $e0-$ff (+1) : Copy 7 bytes from earlier in output (offset $0000-$1fff)
     params          : offset-lo


-----------------------------

Now this was an interesting find if you were wanting to hack newer Falcom titles, but it doesn't work with Xanadu 2 data.

http://www.pokanchan.jp/dokuwiki/software/falcnvrt/start
« Last Edit: September 01, 2015, 09:14:59 AM by elmer »

elmer

  • Hero Member
  • *****
  • Posts: 2148
Re: Xanadu II Translation Development Blog
« Reply #2 on: September 01, 2015, 12:03:19 PM »
Here's the "C" decompression code for the NEW_FORMAT.

It is easier to show the code than to figure out how to explain it!  :wink:

I've been using another variation on this same basic concept for about 25 years, now. It is simple to code, fast, and gives pretty decent compression (usually beating LZ4).

///
// DecompressNewFalcom() - Decompress a block in Falcom's Xanadu II NEW_FORMAT.
//
// This is basically the next step beyond a traditional 4/12 LZSS format.
//
// If you analyze the length/offset pairs and run them through Huffman
// compression you figure out that you can improve the compression by
// using variable bit-oriented encodings for the "length" and "offset".
//
// Falcom are using one of the many variants on that scheme with interleaved
// bit-oriented and byte-oriented "command" and "data" values.
//

uint8_t * pByteStream;
unsigned   uBitBuffer;
unsigned   uBufferLen;

//

unsigned ReadByte ( void )
{
   return *pByteStream++;
}

//

unsigned ReadBit ( void )
{
   if (uBufferLen == 0)
   {
      uBitBuffer  = ReadByte();
      uBitBuffer += ReadByte() << 8;
      uBufferLen  = 16;
   }

   unsigned uBit = uBitBuffer & 1;

   uBitBuffer >>= 1;
   uBufferLen  -= 1;

   return uBit;
}

//

unsigned ReadBits ( unsigned uCount )
{
   unsigned uValue = 0;

   while (uCount--)
   {
      uValue = (uValue << 1) + ReadBit();
   }

   return uValue;
}

//

unsigned ReadLength ( void )
{
   if (ReadBit() != 0) return 2;
   if (ReadBit() != 0) return 3;
   if (ReadBit() != 0) return 4;
   if (ReadBit() != 0) return 5;
   if (ReadBit() != 0)
   {
      return ReadBits(3) + 6;
   }
   else
   {
      return ReadByte() + 14;
   }
}

//

uint8_t * DecompressNewFalcom ( uint8_t * pInput, uint8_t * pOutput, uint8_t * pInputEnd )
{
   uint8_t * pWindow;
   unsigned   uOffset;
   unsigned   uLength;
   unsigned  uFlag;
   uint8_t   uByte;

   pByteStream = ++pInput; // Skip leading zero.

   uBitBuffer = ReadByte();
   uBufferLen = 8;

   for (;;)
   {
      // Sanity Check!

      if (pByteStream > pInputEnd)
      {
         printf( "The compressed data is corrupt!\n" );
         break;
      }

      // Is this a BYTE?

      if (ReadBit() == 0)
      {
         // Immediate byte
   
         *pOutput++ = ReadByte();

         continue;
      }

      // Get LZSS window offset.

      if (ReadBit() == 0)
      {
         // Get 8-bit offset (always COPY).

         uOffset = ReadByte();
      }
      else
      {
         // Get 13-bit offset.

         uOffset = ReadBits( 5 );
         uOffset = (uOffset * 256) + ReadByte();

         // uOffset = 0 : END
         // uOffset = 1 : FILL (i.e. RLE)
         // uOffset > 1 : COPY (i.e. LZSS)

         if (uOffset == 0) break;

         if (uOffset == 1)
         {
            // FILL (RLE)

            uFlag   = ReadBit();
            uLength = ReadBits( 4 );

            if (uFlag != 0)
            {
               uLength = (uLength * 256) + ReadByte();
            }

            uLength = uLength + 14;

            uByte = ReadByte();

            while (uLength--)
            {
               *pOutput++ = uByte;
            }

            continue;
         }
      }

      // COPY (LZSS)

      pWindow = pOutput - uOffset;
      uLength = ReadLength();

      while (uLength--)
      {
         *pOutput++ = *pWindow++;
      }

      continue;
   }

   return pOutput;
}
« Last Edit: September 01, 2015, 04:04:24 PM by elmer »

elmer

  • Hero Member
  • *****
  • Posts: 2148
Re: Xanadu II Translation Development Blog
« Reply #3 on: September 04, 2015, 06:34:04 AM »
The game seems to use a fairly static memory mapping ...

$2000-$3fff Zero-Page, Stack, Fixed code segment (file handling, decompression, font drawing, etc)
$4000-$9fff Overlay code (Main Menu, Game, etc)
$a000-$bfff Streamed chunks (HuC6280 code with-or-without script language data)
$c000-$dfff General switched-bank for decompressing/uploading graphics to VRAM
$e000-$ffff CD BIOS


All game text (that I've seen, so far) is within script-language "strings".

The scripting language is pretty sophisticated, and they seem to have been nice enough to try to keep it located at the end of overlays/streamed-chunks ... but all the addresses are hard-coded, so scripts could actually be anywhere.

The PC for the scripting language is in zero-page at $37,$38 (or $3a,$3b in Xanadu I).

Unfortunately, they were a bit "undisciplined" in how/where they set the script-pc so it's an unholy mess to be sure where scripts are referenced.

Each code overlay contains it's own version of the script interpreter, with functions to modify the script-pc in different places (and potentially with different byte-codes for the actual scripting language).

The streamed-chunks either modify the script-pc directly, or call functions in the overlay to do it for them (the locations of which depend upon which overlay the script-chunk is used by).

There appear to be 570 different streamed-chunks in the game, of which only 236 actually contain script-language (as so may contain text).

That probably just means that I've not identified all of the many functions that set the script-pc, yet!

[EDIT]

That's definitely the case ... I'm currently able to detect "script" in 534 out of the 570 streamed-chunks. Getting better!
« Last Edit: September 08, 2015, 09:39:57 AM by elmer »

SamIAm

  • Hero Member
  • *****
  • Posts: 1835
Re: Xanadu II Translation Development Blog
« Reply #4 on: September 08, 2015, 02:30:56 PM »
This is all music to my ears. :)

Bonknuts

  • Hero Member
  • *****
  • Posts: 3292
Re: Xanadu II Translation Development Blog
« Reply #5 on: September 11, 2015, 07:05:17 AM »
Impressive work :D

 So the game keeps the blocks/files for that area/level compressed, and then on call decompresses them into memory and provides a pointer for the routine for access it? When I was looking over Xanadu I, it had this style of setup.

elmer

  • Hero Member
  • *****
  • Posts: 2148
Re: Xanadu II Translation Development Blog
« Reply #6 on: September 11, 2015, 08:06:01 AM »
So the game keeps the blocks/files for that area/level compressed, and then on call decompresses them into memory and provides a pointer for the routine for access it? When I was looking over Xanadu I, it had this style of setup.

Yep, major code overlays get loaded at $4000-$9fff, but it looks like complete META_BLOCKs often get loaded into the rest of SCD RAM and then decompressed as needed.

The decompression code lives in permanent memory $2000-$3fff, and maps the 2 8KB banks from the META_BLOCK  into $8000-$9fff & $a000-$bfff, and then decompresses the 8KB DATA_CHUNK into a buffer at $c000-$dfff. It then restores $8000-$bffff back to their original banks (i.e. the game overlay code).

That decompressed data is then either uploaded from $c000 to VRAM, or mapped back into $a000 and used as "script".

From what I can see, Xanadu 1 uses the same META_BLOCK format, the same DATA_CHUNK format (with everything in old-style compression), the same memory layout, and the same scripting language (with a few less commands).

It looks like the big change between the two was that Xanadu 2 also allows META_BLOCKs to be "streamed" from CD into SCD RAM as needed allowing for much more expansive and detailed graphics in the levels.

So ... once Xanadu 2 is hacked, Xanadu 1 should be pretty easy. It would be really stupid not to do it after all the work that's going to go into Xanadu 2.  :wink:
« Last Edit: September 11, 2015, 08:09:09 AM by elmer »

Necromancer

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 21335
Re: Xanadu II Translation Development Blog
« Reply #7 on: September 11, 2015, 08:18:19 AM »
So ... once Xanadu 2 is hacked, Xanadu 1 should be pretty easy. It would be really stupid not to do it after all the work that's going to go into Xanadu 2.  :wink:

My pants are tight!
U.S. Collection: 97% complete    155/159 titles

esteban

  • Hero Member
  • *****
  • Posts: 24063
Re: Xanadu II Translation Development Blog
« Reply #8 on: September 11, 2015, 09:25:48 AM »
Xanadu.

XanaDeux.

Awesome.
  |    | 

Bonknuts

  • Hero Member
  • *****
  • Posts: 3292
Re: Xanadu II Translation Development Blog
« Reply #9 on: September 11, 2015, 11:04:36 AM »
My pants are tight!
.. but that's ok. (Beastie Boys reference?)

esteban

  • Hero Member
  • *****
  • Posts: 24063
Re: Xanadu II Translation Development Blog
« Reply #10 on: September 11, 2015, 11:11:36 AM »

My pants are tight!
.. but that's ok. (Beastie Boys reference?)

Close... One Direction
  |    | 

Necromancer

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 21335
Re: Xanadu II Translation Development Blog
« Reply #11 on: September 11, 2015, 11:18:10 AM »
.. but that's ok. (Beastie Boys reference?)

David Cross reference -
  (at 1:33)
U.S. Collection: 97% complete    155/159 titles

Bonknuts

  • Hero Member
  • *****
  • Posts: 3292
Re: Xanadu II Translation Development Blog
« Reply #12 on: September 11, 2015, 12:33:05 PM »
Xanandu 1 might be easier for testing, because the levels/areas are isolated (IIRC you can't go back). So you could do a linear progression of the game (translation/testing/etc).

elmer

  • Hero Member
  • *****
  • Posts: 2148
Re: Xanadu II Translation Development Blog
« Reply #13 on: September 11, 2015, 01:53:39 PM »
Xanandu 1 might be easier for testing, because the levels/areas are isolated (IIRC you can't go back). So you could do a linear progression of the game (translation/testing/etc).

Honestly ... this one is going to be an unpleasant slog. There are too many hard-coded script addresses in the code, the script and in various unidentified tables to make it anything else.

I'd rather get the "nastier" game out of the way first. It's easier to approach the steep hill at the start of a project than at the end.

That's unless I can just keep everything in it's current location and just add new "overflow" strings at the end of the existing "script" data. That would make the whole thing much easier.

I won't know that for a while, yet.

Definitely Xanadu 2 first ... but we can always hold back the release until Xanadu 1 is done, if that'll make people happier!  :wink:

It's not a matter of "figuring" things out anymore ... that's already been done. It's a really well written little scripting language. But it was obviously built around having a linker fix up the addresses. Coming at things "post-mortem", 20+ years later, we've lost a lot of original information.

It can still be done ... but it's going to be a little bit "fragile" and probably involve a lot of debugging.

That's not much fun.  :(

SamIAm

  • Hero Member
  • *****
  • Posts: 1835
Re: Xanadu II Translation Development Blog
« Reply #14 on: September 11, 2015, 05:27:22 PM »
Quote
Xanandu 1 might be easier for testing, because the levels/areas are isolated (IIRC you can't go back). So you could do a linear progression of the game (translation/testing/etc).

You can't go back in Xanadu II, either, if you mean what I think you mean. It's just that there are two chapters that take place in the same town. I think all the NPCs say different things, too.

Xanadu I should be a little easier because each chapter loads once, and that's it. Xanadu II loads different things as you move around each chapter.

But the script is already done for Xanadu II (at least, it's ready to go in for play-testing) so it's definitely the easier one to start with for me.  :P

If elmer gets the Xanadu I script extracted...that will be spectacular, because I've always wanted to translate that particular script, and I know it will be super-helpful to people who want to play the game.