Note that I added a check for the area from G3A. I dunno if there's any other mods adding areas to the worldmap which doesn't use AR****.are, but I'll add them if needed. I stronly recommend everyone wanting to add areas to use AR****.are, to avoid hassle. (Curse you, G3!)
I can't be bothered to explain every little detail in it now. It's fairly well commented, so all the other tp2-ninjas will understand what I'm doing, and the rest can ask and I will answer.
// Append mastarea.2da with the new area
APPEND ~MASTAREA.2da~ ~ARSC#A Â value~
COPY_EXISTING ~worldmap.wmp~ ~override~
 // Read offsets and stuff.
 READ_LONG  0x30 "area_num"
 READ_LONG  0x34 "area_off"
 READ_LONG  0x38 "link_off"
 READ_LONG  0x3c "link_num"
 READ_LONG  0xc "map_off"
 SET "entry"    = ("%map_off%" + 0xb8)
 SET "outer_check" = 0
 SET "inner_check" = 0
 SET "num_ent"   = 0
 // New offsets
 WRITE_LONG 0x30 ("%area_num%" + 1)
 WRITE_LONG 0x38 ("%link_off%" + 0xf0)
 WRITE_LONG 0x3c ("%link_num%" + 4)
 // Add area to worldmap
 INSERT_BYTES  ("%area_off%" +     (0xf0 * "%area_num%")) 0xf0
  WRITE_ASCII ("%area_off%" +     (0xf0 * "%area_num%")) ~ARSC#A~ // AR-name
  WRITE_ASCII ("%area_off%" + 0x08 + (0xf0 * "%area_num%")) ~ARSC#A~ // AR-name
  WRITE_ASCII ("%area_off%" + 0x10 + (0xf0 * "%area_num%")) ~ARSC#A~ // AR-name
  WRITE_LONG  ("%area_off%" + 0x34 + (0xf0 * "%area_num%")) 27 // Map icon
  WRITE_LONG  ("%area_off%" + 0x38 + (0xf0 * "%area_num%")) 1063 // X coordinate
  WRITE_LONG  ("%area_off%" + 0x3C + (0xf0 * "%area_num%")) 39 // Y coordinate
  SAY     ("%area_off%" + 0x40 + (0xf0 * "%area_num%")) ~SConrad's area~ // Name of the area
  SAY     ("%area_off%" + 0x44 + (0xf0 * "%area_num%")) #-1 // Description
  // Now, we add four area links, all from east
  WRITE_SHORT ("%area_off%" + 0x50 + (0xf0 * "%area_num%")) ("%link_num%" + 4) // First N link
  WRITE_SHORT ("%area_off%" + 0x58 + (0xf0 * "%area_num%")) ("%link_num%" + 4) // First W link
  WRITE_SHORT ("%area_off%" + 0x60 + (0xf0 * "%area_num%")) ("%link_num%" + 4) // First S link
  WRITE_SHORT ("%area_off%" + 0x68 + (0xf0 * "%area_num%")) ("%link_num%") // First E link
  WRITE_SHORT ("%area_off%" + 0x6c + (0xf0 * "%area_num%")) 4 // Number of links from E
 // Add links from Umar Hills to the new area
 // We'll start by fixing the offsets
 WHILE ("%outer_check%" = 0) BEGIN
  READ_ASCII ("%entry%" + 0x8) "area" (2)
  READ_ASCII ("%entry%" + 0x8) "spec_area" (6)
  WHILE (("%spec_area%" STRING_COMPARE_CASE "AR1100" = 0) AND ("%inner_check%" = 0)) BEGIN
   READ_SHORT  ("%entry%" + 0x50)             "nlink"
   READ_SHORT  ("%entry%" + 0x50 + 0x4)          "#nlink"
   WRITE_SHORT ("%entry%" + 0x50 + 0x4)          ("%#nlink%" + 1)
   READ_SHORT  ("%entry%" + 0x50 + 0x8)          "wlink"
   WRITE_SHORT ("%entry%" + 0x50 + 0x8)          ("%wlink%" + 3)
   READ_SHORT  ("%entry%" + 0x50 + 0x8)          "wlink"
   READ_SHORT  ("%entry%" + 0x50 + 0x8 + 0x4)       "#wlink"
   WRITE_SHORT ("%entry%" + 0x50 + 0x8 + 0x4)       ("%#wlink%" + 1)
   READ_SHORT  ("%entry%" + 0x50 + 0x8 + 0x8)       "slink"
   WRITE_SHORT ("%entry%" + 0x50 + 0x8 + 0x8)       ("%slink%" + 2)
   READ_SHORT  ("%entry%" + 0x50 + 0x8 + 0x8)       "slink"
   READ_SHORT  ("%entry%" + 0x50 + 0x8 + 0x8 + 0x4)    "#slink"
   WRITE_SHORT ("%entry%" + 0x50 + 0x8 + 0x8 + 0x4)    ("%#slink%" + 1)
   READ_SHORT  ("%entry%" + 0x50 + 0x8 + 0x8 + 0x8)    "elink"
   WRITE_SHORT ("%entry%" + 0x50 + 0x8 + 0x8 + 0x8)    ("%elink%" + 1)
   READ_SHORT  ("%entry%" + 0x50 + 0x8 + 0x8 + 0x8)    "elink"
   READ_SHORT  ("%entry%" + 0x50 + 0x8 + 0x8 + 0x8 + 0x4) "#elink"
   WRITE_SHORT ("%entry%" + 0x50 + 0x8 + 0x8 + 0x8 + 0x4) ("%#elink%" + 1)
   SET "inner_check" = 1
  END
  PATCH_IF (("%area%" STRING_COMPARE_CASE "AR" = 0) OR ("%area%" STRING_COMPARE_CASE "G3" = 0)) BEGIN
   SET "num_ent" = ("%num_ent%" + 1)
  END ELSE
  PATCH_IF (("%area%" STRING_COMPARE_CASE "AR" != 0) AND ("%area%" STRING_COMPARE_CASE "G3" != 0)) BEGIN
   SET "outer_check" = 1
  END
  SET "entry" = ("%entry%" + 0xf0)
 END
 // Re-read offsets
 READ_LONG  0x30 "area_num"
 READ_LONG  0x38 "link_off"
 // Add link to ARSC#A
 INSERT_BYTES  ("%link_off%" - 0x01 + (0xd8 * "%nlink%")) 0xd8
  WRITE_LONG  ("%link_off%"     + (0xd8 * "%nlink%")) ("%area_num%" - 1) // Add the last entry
  WRITE_ASCII ("%link_off%" + 0x04 + (0xd8 * "%nlink%")) ~ARSC#E~ // Entrance
  WRITE_LONG  ("%link_off%" + 0x28 + (0xd8 * "%nlink%")) 4 // Unknown
  // If you want to add random encounters, travelling time, do so here
 // Add link to ARSC#A
 INSERT_BYTES  ("%link_off%" - 0x01 + (0xd8 * "%wlink%")) 0xd8
  WRITE_LONG  ("%link_off%"     + (0xd8 * "%wlink%")) ("%area_num%" - 1) // Add the last entry
  WRITE_ASCII ("%link_off%" + 0x04 + (0xd8 * "%wlink%")) ~ARSC#E~ // Entrance
  WRITE_LONG  ("%link_off%" + 0x28 + (0xd8 * "%wlink%")) 4 // Unknown
  // If you want to add random encounters, travelling time, do so here
 // Add link to ARSC#A
 INSERT_BYTES  ("%link_off%" - 0x01 + (0xd8 * "%slink%")) 0xd8
  WRITE_LONG  ("%link_off%"     + (0xd8 * "%slink%")) ("%area_num%" - 1) // Add the last entry
  WRITE_ASCII ("%link_off%" + 0x04 + (0xd8 * "%slink%")) ~ARSC#A~ // Entrance
  WRITE_LONG  ("%link_off%" + 0x28 + (0xd8 * "%slink%")) 4 // Unknown
  // If you want to add random encounters, travelling time, do so here
 // Add link to ARSC#A
 INSERT_BYTES  ("%link_off%" - 0x01 + (0xd8 * "%elink%")) 0xd8
  WRITE_LONG  ("%link_off%"     + (0xd8 * "%elink%")) ("%area_num%" - 1) // Add the last entry
  WRITE_ASCII ("%link_off%" + 0x04 + (0xd8 * "%elink%")) ~ARSC#E~ // Entrance
  WRITE_LONG  ("%link_off%" + 0x28 + (0xd8 * "%elink%")) 4 // Unknown
  // If you want to add random encounters, travelling time, do so here
 // Check which link is largest
 PATCH_IF (("%nlink%" > "%wlink%") AND ("%nlink%" > "%slink%") AND ("%nlink%" > "%elink%")) BEGIN
  SET "link" = "%nlink%"
 END
 PATCH_IF (("%wlink%" > "%nlink%") AND ("%wlink%" > "%slink%") AND ("%wlink%" > "%elink%")) BEGIN
  SET "link" = "%wlink%"
 END
 PATCH_IF (("%slink%" > "%wlink%") AND ("%slink%" > "%nlink%") AND ("%slink%" > "%elink%")) BEGIN
  SET "link" = "%slink%"
 END
 PATCH_IF (("%elink%" > "%wlink%") AND ("%elink%" > "%slink%") AND ("%elink%" > "%nlink%")) BEGIN
  SET "link" = "%elink%"
 END Â
 // Correct ALL other links after elink
 // New variables
 SET "entry"    = ("%map_off%" + 0xb8)
 SET "outer_c"    = 0
 // Let's WHILE a bit and search for area-links
 WHILE ("%outer_c%" = 0) BEGIN
  READ_ASCII ("%entry%" + 0x8) "area" (2)
  PATCH_IF (("%area%" STRING_COMPARE_CASE "AR" = 0) OR ("%area%" STRING_COMPARE_CASE "G3" = 0)) BEGIN
   READ_SHORT ("%entry%" + 0x50)          "nlink"
   READ_SHORT ("%entry%" + 0x50 + 0x8)       "wlink"
   READ_SHORT ("%entry%" + 0x50 + 0x8 + 0x8)    "slink"
   READ_SHORT ("%entry%" + 0x50 + 0x8 + 0x8 + 0x8) "elink"
   // And if they are larger, let's patch 'em
   PATCH_IF ("%nlink%" > "%link%") BEGIN
    WRITE_SHORT ("%entry%" + 0x50) ("%nlink%" + 4)
   END
   PATCH_IF ("%wlink%" > "%link%") BEGIN
    WRITE_SHORT ("%entry%" + 0x50 + 0x8) ("%wlink%" + 4)
   END
   PATCH_IF ("%slink%" > "%link%") BEGIN
    WRITE_SHORT ("%entry%" + 0x50 + 0x8 + 0x8) ("%slink%" + 4)
   END
   PATCH_IF ("%elink%" > "%link%") BEGIN
    WRITE_SHORT ("%entry%" + 0x50 + 0x8 + 0x8 + 0x8) ("%elink%" + 4)
   END
  END ELSE
  PATCH_IF (("%area%" STRING_COMPARE_CASE "AR" != 0) AND ("%area%" STRING_COMPARE_CASE "G3" != 0)) BEGIN
   SET "outer_c" = 1
  END
  SET "entry" = ("%entry%" + 0xf0)
 END
 // Add four new links from the new area
 // Re-read offsets
 READ_LONG  0x38 "link_off"
 READ_LONG  0x3c "link_num"
 // New offset
 WRITE_LONG 0x3c ("%link_num%" + 4)
 // Add link to City Gates
 INSERT_BYTES  ("%link_off%" - 0x01 + (0xd8 * "%link_num%")) 0xd8
  WRITE_LONG  ("%link_off%"     + (0xd8 * "%link_num%")) 11 // City Gates
  WRITE_ASCII ("%link_off%" + 0x04 + (0xd8 * "%link_num%")) ~ExitNE~ // Entrance
  WRITE_LONG  ("%link_off%" + 0x28 + (0xd8 * "%link_num%")) 4 // Unknown
  // If you want to add random encounters, travelling time, do so here
 // Add link to Umar Hills
 INSERT_BYTES  ("%link_off%" - 0x01 + (0xd8 * "%link_num%")) 0xd8
  WRITE_LONG  ("%link_off%"     + (0xd8 * "%link_num%")) 7 // Umar Hills
  WRITE_ASCII ("%link_off%" + 0x04 + (0xd8 * "%link_num%")) ~ExitNW~ // Entrance
  WRITE_LONG  ("%link_off%" + 0x28 + (0xd8 * "%link_num%")) 4 // Unknown
  // If you want to add random encounters, travelling time, do so here
 // Add link to Trademeet
 INSERT_BYTES  ("%link_off%" - 0x01 + (0xd8 * "%link_num%")) 0xd8
  WRITE_LONG  ("%link_off%"     + (0xd8 * "%link_num%")) 14 // Trademeet
  WRITE_ASCII ("%link_off%" + 0x04 + (0xd8 * "%link_num%")) ~ExitNW~ // Entrance
  WRITE_LONG  ("%link_off%" + 0x28 + (0xd8 * "%link_num%")) 4 // Unknown
  // If you want to add random encounters, travelling time, do so here
 // Add link to de'Arnise Hold
 INSERT_BYTES  ("%link_off%" - 0x01 + (0xd8 * "%link_num%")) 0xd8
  WRITE_LONG  ("%link_off%"     + (0xd8 * "%link_num%")) 9 // de'Arnise
  WRITE_ASCII ("%link_off%" + 0x04 + (0xd8 * "%link_num%")) ~ExitSE~ // Entrance
  WRITE_LONG  ("%link_off%" + 0x28 + (0xd8 * "%link_num%")) 4 // Unknown
  // If you want to add random encounters, travelling time, do so here
BUT_ONLY_IF_IT_CHANGES
EDIT: Updating S_C_C to != 0 instead of = 1.
Edited by SConrad, 22 April 2005 - 10:00 AM.











