Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Converts EA MAP v0/v1 format into text form.
- # Known games where format is used:
- # Need for Speed II
- # Need for Speed III: Hot Pursuit
- # SSX
- import os
- import struct
- import sys
- import glob
- def convert(fname):
- name,ext=os.path.splitext(fname)
- f=open(fname,"rb")
- f2=open(name+".TXT","w")
- magic=f.read(4)
- if magic!=b"PFDx": raise Exception("Wrong header magic in %s" % (f.name))
- version,introNode,numNodes,numEvents,b1,b2,b3,numSections=struct.unpack("8B",f.read(8))
- if version > 1: raise Exception("Unsupported version %d in %s" % (version,f.name))
- f2.write("Intro node - %d\n" % (introNode+1))
- f2.write("\n")
- f2.write("//"+"-"*72+"\n")
- f2.write("// Nodes\n")
- f2.write("//"+"-"*72+"\n")
- for i in range(numNodes):
- section,numBranches,dummy=struct.unpack(">BBH",f.read(4))
- branches=list()
- for j in range(numBranches):
- branches.append(struct.unpack("BBB",f.read(3)))
- f.seek((8-numBranches)*0x03,1)
- f2.write("Node %d\n" % (i+1))
- f2.write("{\n")
- f2.write("\tSection %d\n" % (section))
- f2.write("\tBranches\n")
- f2.write("\t{\n")
- for branch in branches:
- minVal,maxVal,nextNode=branch
- f2.write("\t\tControl %d-%d -> %d\n" % (minVal,maxVal,nextNode+1))
- f2.write("\t}\n")
- f2.write("}\n")
- f2.write("\n")
- f2.write("//"+"-"*72+"\n")
- f2.write("// Events\n")
- f2.write("//"+"-"*72+"\n")
- for i in range(numSections):
- events=f.read(numEvents)
- f2.write("Section %d\n" % i)
- f2.write("{\n")
- for j in range(numEvents):
- f2.write("\tEvent %d -> %d\n" % (j,events[j]+1))
- f2.write("}\n")
- f.close()
- f2.close()
- if __name__ == "__main__":
- if len(sys.argv)<2:
- print("Usage: ea_maptotext.py <files> (wildcards accepted)")
- sys.exit()
- for arg in sys.argv[1:]:
- files=glob.glob(arg)
- for fname in files:
- if not fname.upper().endswith(".MAP") and not fname.upper().endswith(".MPF"):
- continue
- if not os.path.isfile(fname):
- continue
- convert(fname)
Add Comment
Please, Sign In to add comment