Nicknine

EA MAP to TXT

Apr 16th, 2020 (edited)
1,035
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.21 KB | None | 0 0
  1. # Converts EA MAP v0/v1 format into text form.
  2. # Known games where format is used:
  3. # Need for Speed II
  4. # Need for Speed III: Hot Pursuit
  5. # SSX
  6. import os
  7. import struct
  8. import sys
  9. import glob
  10.  
  11. def convert(fname):
  12.     name,ext=os.path.splitext(fname)
  13.     f=open(fname,"rb")
  14.     f2=open(name+".TXT","w")
  15.     magic=f.read(4)
  16.     if magic!=b"PFDx": raise Exception("Wrong header magic in %s" % (f.name))
  17.     version,introNode,numNodes,numEvents,b1,b2,b3,numSections=struct.unpack("8B",f.read(8))
  18.     if version > 1: raise Exception("Unsupported version %d in %s" % (version,f.name))
  19.  
  20.     f2.write("Intro node - %d\n" % (introNode+1))
  21.     f2.write("\n")
  22.  
  23.     f2.write("//"+"-"*72+"\n")
  24.     f2.write("// Nodes\n")
  25.     f2.write("//"+"-"*72+"\n")
  26.     for i in range(numNodes):
  27.         section,numBranches,dummy=struct.unpack(">BBH",f.read(4))
  28.         branches=list()
  29.         for j in range(numBranches):
  30.             branches.append(struct.unpack("BBB",f.read(3)))
  31.         f.seek((8-numBranches)*0x03,1)
  32.  
  33.         f2.write("Node %d\n" % (i+1))
  34.         f2.write("{\n")
  35.         f2.write("\tSection %d\n" % (section))
  36.         f2.write("\tBranches\n")
  37.         f2.write("\t{\n")
  38.         for branch in branches:
  39.             minVal,maxVal,nextNode=branch
  40.             f2.write("\t\tControl %d-%d -> %d\n" % (minVal,maxVal,nextNode+1))
  41.         f2.write("\t}\n")
  42.         f2.write("}\n")
  43.  
  44.     f2.write("\n")
  45.     f2.write("//"+"-"*72+"\n")
  46.     f2.write("// Events\n")
  47.     f2.write("//"+"-"*72+"\n")
  48.     for i in range(numSections):
  49.         events=f.read(numEvents)
  50.  
  51.         f2.write("Section %d\n" % i)
  52.         f2.write("{\n")
  53.         for j in range(numEvents):
  54.             f2.write("\tEvent %d -> %d\n" % (j,events[j]+1))
  55.         f2.write("}\n")
  56.  
  57.     f.close()
  58.     f2.close()
  59.  
  60. if __name__ == "__main__":
  61.     if len(sys.argv)<2:
  62.         print("Usage: ea_maptotext.py <files> (wildcards accepted)")
  63.         sys.exit()
  64.  
  65.     for arg in sys.argv[1:]:
  66.         files=glob.glob(arg)
  67.  
  68.         for fname in files:
  69.             if not fname.upper().endswith(".MAP") and not fname.upper().endswith(".MPF"):
  70.                 continue
  71.  
  72.             if not os.path.isfile(fname):
  73.                 continue
  74.  
  75.             convert(fname)
  76.  
Add Comment
Please, Sign In to add comment