-- -- File:: pipeline/util/IdeUtils.ms -- Description:: Allows loading and editing of ide/ipl files in script -- -- Author:: Greg Smith -- Date:: 20/4/2004 -- ----------------------------------------------------------------------------- -- ChangeLog -- -- 26/06/2007 -- DHM -- GTA4 compatibility update -- Updated IDE loading to "GtaLoadIDEObjects" function -- Now correctly parses *some* of the IDE files. -- Added GtaLoadIDEFiles function and GTA_MapsRoot global path string -- IPL data loading not touched -- ------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------- -- Uses ----------------------------------------------------------------------------- filein "pipeline/util/Func.ms" filein "pipeline\\util\\string.ms" filein "pipeline\\util\\file.ms" ------------------------------------------------------------------------------------------- -- Structure Definitions ------------------------------------------------------------------------------------------- struct ideobjectclass ( --------------------------------------------------------------------------------------- -- Constants --------------------------------------------------------------------------------------- FLAG_LIGHTREFLECTION = 0x00000001, FLAG_DONTFADE = 0x00000002, FLAG_DRAWLAST = 0x00000004, FLAG_INSTANCED = 0x00000008, --FLAG_RESERVED1 = 0x00000010, FLAG_ISFIXED = 0x00000020, FLAG_NOZBUFFERWRITE = 0x00000040, FLAG_NOSHADOWS = 0x00000080, FLAG_ISGENERIC = 0x00000100, FLAG_HASANIM = 0x00000200, FLAG_HASUVANIM = 0x00000400, FLAG_SHADOWONLY = 0x00000800, FLAG_ISDAMAGEABLE = 0x00001000, FLAG_DONTCASTSHADOWS = 0x00002000, FLAG_CASTTEXSHADOWS = 0x00004000, FLAG_NOFLYERCOLLIDE = 0x00008000, --FLAG_RESERVED2 = 0x00010000, FLAG_ISDYNAMIC = 0x00020000, --FLAG_RESERVED3 = 0x00040000, --FLAG_RESEVRED4 = 0x00080000, --FLAG_RESERVED5 = 0x00100000, FLAG_NOBACKFACECULLING = 0x00200000, FLAG_DOESNOTPROVIDECOVER = 0x00400000, --FLAG_RESERVED6 = 0x00800000, FLAG_ISLADDER = 0x01000000, FLAG_ISFIREESCAPE = 0x02000000, FLAG_HASDOORPHYSICS = 0x04000000, FLAG_ISFIXEDFORNAV = 0x08000000, FLAG_NOPEDCOLLISION = 0x10000000, FLAG_AMBIENTMULTPLIER = 0x20000000, --------------------------------------------------------------------------------------- -- Properties --------------------------------------------------------------------------------------- name, -- Object Name (string) txd, -- TXD Name (string) loddist, -- LOD Distance (float) flags, -- Flags (bitfield) --------------------------------------------------------------------------------------- -- Methods --------------------------------------------------------------------------------------- -- Flag check status function hasFlag flag = ( return ( ( bit.and flags flag ) == flag ) ), -- Compare two ideObjectClass objects function cmp o1 o2 = ( if ( classof o1 != ideObjectClass ) then throw "o1 must be of type ideObjectClass" if ( classof o2 != ideObjectClass ) then throw "o2 must be of type ideObjectClass" if ( o1.name == o2.name ) then return 0 else if ( o1.name < o2.name ) then return -1 else return 1 ) ) struct iplobjectinst (id, name, areacode, px, py, pz, rx, ry, rz, rw, lodparent) ------------------------------------------------------------------------------------------- -- Global Data ------------------------------------------------------------------------------------------- global GTA_MapsRoot = "x:/gta/build/independent/data/maps/" ------------------------------------------------------------------------------------------- -- name: GtaLoadIDEObjects -- description: Load an IDE file adding object definitions to the loadList, -- ** Note not all objects nor data is parsed ** -- -- Reference: FileLoader.cpp : CFileLoader::LoadObject(const char* pLine) -- ------------------------------------------------------------------------------------------- fn GtaLoadIDEObjects filename loadList = ( ideFile = openfile filename mode:"rt" ideLine = readLine ideFile -- find the beginning of the objects while(eof ideFile == false) do ( if ideLine == "objs" then ( exit ) ideLine = readLine ideFile ) ideLine = readLine ideFile -- read the objects in while(eof ideFile == false) do ( if ideLine == "end" then ( exit ) ideTokens = filterstring ideLine ", " objName = RsLowercase(ideTokens[1]) objTXDName = RsLowercase(ideTokens[2]) objLODDist = ideTokens[3] as float objFlags = ideTokens[4] as integer newObjClass = ideobjectclass name:objName txd:objTXDName loddist:objLODDist flags:objFlags append loadList newObjClass ideLine = readLine ideFile ) -- time objects while(eof ideFile == false) do ( if ideLine == "tobj" then ( exit ) ideLine = readLine ideFile ) ideLine = readLine ideFile -- read the objects in while(eof ideFile == false) do ( if ideLine == "end" then ( exit ) ideTokens = filterstring ideLine ", " objName = RsLowercase(ideTokens[1]) objTXDName = RsLowercase(ideTokens[2]) objLODDist = ideTokens[3] as float objFlags = ideTokens[4] as integer newObjClass = ideobjectclass name:objName txd:objTXDName loddist:objLODDist flags:objFlags append loadList newObjClass ideLine = readLine ideFile ) -- anim objects while(eof ideFile == false) do ( if ideLine == "anim" then ( exit ) ideLine = readLine ideFile ) ideLine = readLine ideFile -- read the objects in while(eof ideFile == false) do ( if ideLine == "end" then ( exit ) ideTokens = filterstring ideLine ", " objName = RsLowercase(ideTokens[1]) objTXDName = RsLowercase(ideTokens[2]) -- Anim file name objLODDist = ideTokens[4] as float objFlags = ideTokens[5] as integer newObjClass = ideobjectclass name:objName txd:objTXDName loddist:objLODDist flags:objFlags append loadList newObjClass ideLine = readLine ideFile ) close ideFile ) ------------------------------------------------------------------------------------------- -- name: GtaLoadIDEFiles -- description: Load an IDE file adding object definitions to the ideObjectList -- Both object class name and TXD name are added -- -- IMPORTANT: ideObjectList returned is SORTED. This is required as it speeds -- up GtaFindIDEObject considerably. Peace out. ------------------------------------------------------------------------------------------- fn GtaLoadIDEFiles rootpath &ideFileList &ideObjectList = ( ideObjectList = #() ideFileList = #() ideFileList = RsFindFilesRecursive rootpath "*.ide" for f in ideFileList do ( GtaLoadIDEObjects f ideObjectList ) sort ideFileList qsort ideObjectList ideObjectClass.cmp ) ------------------------------------------------------------------------------------------- -- name: GtaFindIDEObject -- description: Find and return object definition based on name, given ideObjectList as -- filled in by GtaLoadIDEFiles / GtaLoadIDEObjects -- -- IMPORTANT: ideObjectList must be SORTED. GtaLoadIDEFiles does this :P -- so use it. ------------------------------------------------------------------------------------------- fn GtaFindIDEObject ideObjectList objName = ( local low = 1 local high = ideObjectList.count while ( low <= high ) do ( mid = (low+high) / 2 if ( ideObjectList[mid].name > RsLowercase(objName) ) then high = mid - 1 else if ( ideObjectList[mid].name < RsLowercase(objName) ) then low = mid + 1 else return ( ideObjectList[mid] ) ) return undefined ) ------------------------------------------------------------------------------------------- -- name: GtaFindIDEObjectL -- description: Find and return object definition based on name, given ideObjectList as -- filled in by GtaLoadIDEFiles / GtaLoadIDEObjects -- -- IMPORTANT: ideObjectList does not need to be sorted. This is a linear -- search and is much slower than GtaFindIDEObject above. ------------------------------------------------------------------------------------------- fn GtaFindIDEObjectL ideObjectList objName = ( local objnamel = ( RsLowercase objName ) for o in ideObjectList do ( if ( objnamel == o.name ) then return ( o ) ) -- Failed to find object definition, return undefined undefined ) ------------------------------------------------------------------------------------------- fn GtaLoadIPLObjectsNameOnly filename loadList = ( iplFile = openfile filename mode:"rt" iplLine = readLine iplFile -- find the beginning of the objects while(eof iplFile == false) do ( if iplLine == "inst" then ( exit ) iplLine = readLine iplFile ) -- read the objects in while(eof iplFile == false) do ( if iplLine == "end" then ( exit ) iplTokens = filterstring iplLine ", " append loadList iplTokens[1] iplLine = readLine iplFile ) close iplFile -- print loadList.count -- for iplentry in loadList do ( -- print iplentry -- ) ) fn GtaIsIDEListUsedInIPL ideEntries iplfilename = ( iplEntries = #() GtaLoadIPLObjectsNameOnly iplfilename iplEntries for ideEntry in ideEntries do ( if finditem iplEntries ideEntry != 0 then ( return true ) ) return false ) fn GtaFindIDEUsed idefilename = ( getiplexported = gta_streamdir + "\\*.ipl" iplfilenamelist = getfiles getiplexported ideEntries = #() GtaLoadIDEObjectsNameOnly idefilename ideEntries for iplfilename in iplfilenamelist do ( if GtaIsIDEListUsedInIPL ideEntries iplfilename == true then ( print (iplfilename + " uses " + idefilename) ) ) ) fn GtaFindObjectInIDENotUsed idefilename = ( getiplexported = gta_streamdir + "\\*.ipl" iplfilenamelist = getfiles getiplexported ideEntries = #() GtaLoadIDEObjectsJustObjectClasses idefilename ideEntries originalcount = ideEntries.count for iplfilename in iplfilenamelist do ( iplEntries = #() GtaLoadIPLObjectsNameOnly iplfilename iplEntries i = 1 while(i <= ideEntries.count) do ( ideEntry = (ideEntries[i].id as string) if finditem iplEntries ideEntry != 0 then ( deleteitem ideEntries i ) else ( i = i + 1 ) ) ) if ideEntries.count > 0 then ( print ((ideEntries.count as string) + " out of " + (originalcount as string) + " ide entries are not used") for ideEntry in ideEntries do ( print (ideEntry.name + " (" + (ideEntry.id as string) + ")") ) ) else ( print "all ide entries are used" ) ) fn GtaSyncIPLFiletoIDEArray iplfilename idearray = ( tempfilename = "c:\\temp.ipl" iplNewFile = openfile tempfilename mode:"w+" if iplNewFile == undefined then ( messagebox "couldnt open temporary file" return false ) iplFile = openfile iplfilename mode:"rt" iplLine = readLine iplFile -- find the beginning of the object instances while(eof iplFile == false) do ( if iplLine == "inst" then ( exit ) iplLine = readLine iplFile ) format "inst\n" to:iplNewFile -- go through each object instance iplLine = readLine iplFile while(eof iplFile == false) do ( if iplLine == "end" then ( exit ) ideTokens = filterstring iplLine ", " objId = ideTokens[1] as integer objName = GTAlowercase(ideTokens[2]) objAreacode = ideTokens[3] as integer objPx = ideTokens[4] objPy = ideTokens[5] objPz = ideTokens[6] objRx = ideTokens[7] objRy = ideTokens[8] objRz = ideTokens[9] objRw = ideTokens[10] objLodparent = ideTokens[11] as integer for ideobj in idearray do ( if ideobj.name == objName then ( objId = ideobj.id exit ) ) objName = GTAlowercase(ideTokens[2]) format "%, %, %, " objId objName objAreacode to:iplNewFile format "%, %, %, " objPx objPy objPz to:iplNewFile format "%, %, %, %, " objRx objRy objRz objRw to:iplNewFile format "%\n" objLodparent to:iplNewFile iplLine = readLine iplFile ) format "end\n" to:iplNewFile --write out the rest of the file while(eof iplFile == false) do ( try ( iplLine = readLine iplFile ) catch ( exit ) if iplLine == undefined then ( exit ) if iplLine.count == undefined then ( exit ) format "%\n" iplLine to:iplNewFile ) close iplFile close iplNewFile deletefile iplfilename retval = copyfile tempfilename iplfilename if retval == false then ( print ("couldnt copy over " + iplfilename) ) deletefile tempfilename return retval ) fn GtaSyncIPLFiletoIDE iplfilename idefilename = ( ideObjClasses = #() GtaLoadIDEObjectsJustObjectClasses idefilename ideObjClasses GtaSyncIPLFiletoIDEArray iplfilename ideObjClasses ) fn GtaSyncIPLDirectoryToIDE idefilename iplpath = ( iplpath = iplpath + "*.ipl" iplfilenames = getfiles iplpath ideObjClasses = #() GtaLoadIDEObjectsJustObjectClasses idefilename ideObjClasses -- sync each ipl in a directory with this ide file for iplfilename in iplfilenames do ( GtaSyncIPLFiletoIDEArray iplfilename ideObjClasses ) ) fn GtaSyncMakeCdImage streamdir imagename = ( return GtaMakeGenCDImage streamdir imagename local command = gta_bindir + "cdimagemaker " + imagename + " " command += streamdir + "\\*.dff " command += streamdir + "\\*.ifp " command += streamdir + "\\*.txd " command += streamdir + "\\*.col " command += streamdir + "\\*.ipl " print command rt = doscommand command if rt != 0 then ( return false ) return true ) fn GtaSyncIPLsToIDEName idefilename = ( idefilename = GTAlowercase(idefilename) ipllist = #() idefilelist = #() idedirlist = #() idenamelist = #() gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2_generic" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] append ipllist testfilename ) gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2_mapfiles" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] append ipllist testfilename ) gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2" gtaelement = getxmlelement gtaelement "ide" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) idepathelem = filterstring testfilename "\\" idepath = "" for i = 1 to (idepathelem.count - 1) do ( idepath = idepath + idepathelem[i] + "\\" ) append idedirlist idepath append idefilelist testfilename testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] append idenamelist testfilename ) for idefile in idefilelist do ( if idefilename == idefile then ( print idefile for iplitem in ipllist do ( streamdir = gta_streamdir + iplitem + "\\" GtaSyncIPLDirectoryToIDE idefile streamdir ) for idedir in idedirlist do ( GtaSyncIPLDirectoryToIDE idefile idedir ) ) ) for i = 1 to idedirlist.count do ( GtaSyncMakeCdImage (gta_streamdir + idenamelist[i] + "\\") (idedirlist[i] + idenamelist[i]) ) MakeFinalCd prompt:false ) fn GtaSyncIPLsToIDEs = ( ipllist = #() idefilelist = #() idedirlist = #() idenamelist = #() gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2_generic" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] append ipllist testfilename ) gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2_mapfiles" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] append ipllist testfilename ) gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2" gtaelement = getxmlelement gtaelement "ide" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) idepathelem = filterstring testfilename "\\" idepath = "" for i = 1 to (idepathelem.count - 1) do ( idepath = idepath + idepathelem[i] + "\\" ) append idedirlist idepath append idefilelist testfilename testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] append idenamelist testfilename ) for iplitem in ipllist do ( streamdir = gta_streamdir + iplitem + "\\" syncipltoide streamdir idefilelist ) for idedir in idedirlist do ( syncipltoide idedir idefilelist ) -- for i = 1 to idedirlist.count do ( -- GtaSyncMakeCdImage (gta_streamdir + idenamelist[i] + "\\") (idedirlist[i] + idenamelist[i]) -- ) -- MakeFinalCd() ) struct MapSection ( name, beforeStart, beforeEnd, afterStart, afterEnd) fn GtaSyncIPLsRebuildImages idelist = ( ipllist = #() idefilelist = #() idedirlist = #() idenamelist = #() ideallfilelist = #() idealldirlist = #() ideallnamelist = #() gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2" gtaelement = getxmlelement gtaelement "ide" for elems in gtaelement.entries do ( idefilename = GTAlowercase(elems.entries[1]) idepathelem = filterstring idefilename "\\" idepath = "" for i = 1 to (idepathelem.count - 1) do ( idepath = idepath + idepathelem[i] + "\\" ) testfilename = idefilename testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] found = false for ideentry in idelist do ( if ideentry == testfilename then ( found = true ) ) append idealldirlist idepath append ideallfilelist idefilename append ideallnamelist testfilename if found == true then ( append idedirlist idepath append idefilelist idefilename append idenamelist testfilename ) ) for i = 1 to idealldirlist.count do ( GtaSyncMakeCdImage (gta_streamdir + ideallnamelist[i] + "\\") (idealldirlist[i] + ideallnamelist[i]) ) MakeFinalCd() ) fn GtaSyncIPLsToIDEsListOnly idelist = ( ipllist = #() idefilelist = #() idedirlist = #() idenamelist = #() ideallfilelist = #() idealldirlist = #() ideallnamelist = #() idealluniquedirlist = #() gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2_generic" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] append ipllist testfilename ) gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2_mapfiles" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] append ipllist testfilename ) gtarootelement = ParseXmlFile (((getdir #maxroot) + "/plugcfg") + "\\gta3.xml") gtaelement = getxmlelement gtarootelement "gta" gtaelement = getxmlelement gtaelement "sa_ps2" gtaelement = getxmlelement gtaelement "ide" for elems in gtaelement.entries do ( idefilename = GTAlowercase(elems.entries[1]) idepathelem = filterstring idefilename "\\" idepath = "" for i = 1 to (idepathelem.count - 1) do ( idepath = idepath + idepathelem[i] + "\\" ) testfilename = idefilename testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] found = false for ideentry in idelist do ( if ideentry == testfilename then ( found = true ) ) append idealldirlist idepath append ideallfilelist idefilename append ideallnamelist testfilename idelowerpath = GTAlowercase(idepath) if finditem idealluniquedirlist idelowerpath == 0 then ( append idealluniquedirlist idelowerpath ) if found == true then ( append idedirlist idepath append idefilelist idefilename append idenamelist testfilename ) ) print "here" for idefile in idefilelist do ( print idefile ) for iplitem in ipllist do ( streamdir = gta_streamdir + iplitem + "\\" syncipltoide streamdir idefilelist ) for idedir in idealluniquedirlist do ( syncipltoide idedir idefilelist ) for i = 1 to idealldirlist.count do ( GtaSyncMakeCdImage (gta_streamdir + ideallnamelist[i] + "\\") (idealldirlist[i] + ideallnamelist[i]) ) MakeFinalCd() ) MainIdxCounter = 0 IdChangeList = #() IdChangeToList = #() fn GtaSyncIdeFileChunk ideNewFile ideFile section mapSect = ( ideLine = readLine ideFile while(eof ideFile == false) do ( if ideLine == section then ( exit ) format "%\n" ideLine to:ideNewFile ideLine = readLine ideFile ) format "%\n" section to:ideNewFile -- go through each object instance ideLine = readLine ideFile while(eof ideFile == false) do ( if ideLine == "end" then ( exit ) ideTokens = filterstring ideLine ", " objId = ideTokens[1] as integer objName = ideTokens[2] append IdChangeList objId objId = mapSect.afterStart + MainIdxCounter append IdChangeToList objId MainIdxCounter = MainIdxCounter + 1 if mapSect.afterEnd != -1 and objId > mapSect.afterEnd then ( print (objName + " is over end of new section " + (objId as string)) return false ) if section == "anim" then ( format "% ,%" objId objName to:ideNewFile for j = 3 to ideTokens.count do ( format " ,%" ideTokens[j] to:ideNewFile ) ) else ( format "%, %" objId objName to:ideNewFile for j = 3 to ideTokens.count do ( format ", %" ideTokens[j] to:ideNewFile ) ) format "\n" to:ideNewFile ideLine = readLine ideFile ) format "end\n" to:ideNewFile return true ) fn GtaSyncIdeFile2dfxChunk ideNewFile ideFile section mapSect = ( ideLine = readLine ideFile while(eof ideFile == false) do ( if ideLine == section then ( exit ) format "%\n" ideLine to:ideNewFile ideLine = readLine ideFile ) format "%\n" section to:ideNewFile -- go through each object instance ideLine = readLine ideFile while(eof ideFile == false) do ( if ideLine == "end" then ( exit ) ideTokens = filterstring ideLine ", " objId = ideTokens[1] as integer idxFound = finditem IdChangeList objId if idxFound == 0 then ( objId = objId - mapSect.beforeStart + mapSect.afterStart ) else ( objId = IdChangeToList[idxFound] ) if mapSect.afterEnd != -1 and objId > mapSect.afterEnd then ( print (objName + " is over end of new section " + (objId as string)) return false ) format "%" objId to:ideNewFile for j = 2 to ideTokens.count do ( format ", %" ideTokens[j] to:ideNewFile ) format "\n" to:ideNewFile ideLine = readLine ideFile ) format "end\n" to:ideNewFile return true ) fn GtaSyncIDEFileForSection ideFileName mapSect = ( tempfilename = "c:\\temp.ide" IdChangeList = #() IdChangeToList = #() ideNewFile = openfile tempfilename mode:"w+" if ideNewFile == undefined then ( messagebox "couldnt open temporary file" return false ) ideFile = openfile ideFileName mode:"rt" -- find the beginning of the object classes MainIdxCounter = 0 if GtaSyncIdeFileChunk ideNewFile ideFile "objs" mapSect == false then ( close ideFile close ideNewFile return false ) if GtaSyncIdeFileChunk ideNewFile ideFile "tobj" mapSect == false then ( close ideFile close ideNewFile return false ) if GtaSyncIdeFile2dfxChunk ideNewFile ideFile "2dfx" mapSect == false then ( close ideFile close ideNewFile return false ) if GtaSyncIdeFileChunk ideNewFile ideFile "anim" mapSect == false then ( close ideFile close ideNewFile return false ) --write out the rest of the file while(eof ideFile == false) do ( ideLine = readLine ideFile format "%\n" ideLine to:ideNewFile ) close ideFile close ideNewFile deletefile idefilename retval = copyfile tempfilename idefilename if retval == false then ( print ("couldnt copy over " + idefilename) ) deletefile tempfilename return retval ) fn GtaSyncExtractSection afterXML mapSect = ( mapSectCompare = mapSect.name + "." XMLElem = ParseXmlFile afterXML gtaelement = getxmlelement XMLElem "gta" gtaelement = getxmlelement gtaelement "sa_ps2" gtaelement = getxmlelement gtaelement "ide" for elems in gtaelement.entries do ( if findstring elems.entries[1] mapSectCompare != undefined then ( imgname = (filterstring elems.entries[1] ".")[1] + ".img" streamdir = gta_streamdir + mapSect.name + "\\" makedir streamdir cmdline = "del /Q " + streamdir + "*.*" print cmdline doscommand cmdline sysinfo.currentdir = streamdir cmdline = gta_bindir + "cdimageextract " + imgname + " *" print cmdline if doscommand cmdline != 0 then ( return false ) ) ) return true ) fn GtaSyncIDEForSection afterXML mapSect = ( mapSectCompare = mapSect.name + "." XMLElem = ParseXmlFile afterXML gtaelement = getxmlelement XMLElem "gta" gtaelement = getxmlelement gtaelement "sa_ps2" gtaelement = getxmlelement gtaelement "ide" for elems in gtaelement.entries do ( if findstring elems.entries[1] mapSectCompare != undefined then ( if GtaSyncIDEFileForSection elems.entries[1] mapSect == false then ( return false ) ) ) return true ) fn qsMapSectionBefores secA secB = ( if secA.beforeStart < secB.beforeStart then ( return -1 ) if secA.beforeStart > secB.beforeStart then ( return 1 ) return 0 ) fn qsMapSectionAfters secA secB = ( if secA.afterStart < secB.afterStart then ( return -1 ) if secA.afterStart > secB.afterStart then ( return 1 ) return 0 ) fn GtaSyncAllIpl beforeXML afterXML = ( beforeXMLElem = ParseXmlFile beforeXML afterXMLElem = ParseXmlFile afterXML mapSections = #() -- the before xml file gtaelement = getxmlelement beforeXMLElem "gta" gtaelement = getxmlelement gtaelement "sa_ps2_generic" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( mapSect = MapSection() testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] mapSect.name = testfilename idnumber = (filterstring elems.params[1] "\"")[2] as integer mapSect.beforeStart = idnumber mapSect.beforeEnd = -1 mapSect.afterStart = idnumber mapSect.afterEnd = -1 append mapSections mapSect ) gtaelement = getxmlelement beforeXMLElem "gta" gtaelement = getxmlelement gtaelement "sa_ps2_mapfiles" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( mapSect = MapSection() testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] mapSect.name = testfilename idnumber = (filterstring elems.params[1] "\"")[2] as integer mapSect.beforeStart = idnumber mapSect.beforeEnd = -1 mapSect.afterStart = idnumber mapSect.afterEnd = -1 append mapSections mapSect ) qsort mapSections qsMapSectionBefores for i = 2 to mapSections.count do ( mapSect = mapSections[i] mapSectBefore = mapSections[i - 1] mapSectBefore.beforeEnd = mapSect.beforeStart - 1 mapSectBefore.afterEnd = mapSect.afterStart - 1 ) -- the after xml file gtaelement = getxmlelement afterXMLElem "gta" gtaelement = getxmlelement gtaelement "sa_ps2_generic" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] j = -1 for i = 1 to mapSections.count do ( if mapSections[i].name == testfilename then ( j = i ) ) if j != -1 then ( idnumber = (filterstring elems.params[1] "\"")[2] as integer mapSections[j].afterStart = idnumber mapSections[j].afterEnd = -1 ) ) gtaelement = getxmlelement afterXMLElem "gta" gtaelement = getxmlelement gtaelement "sa_ps2_mapfiles" gtaelement = getxmlelement gtaelement "objects" for elems in gtaelement.entries do ( testfilename = GTAlowercase(elems.entries[1]) testfilename = filterstring testfilename "\\" testfilename = testfilename[testfilename.count] testfilename = filterstring testfilename "." testfilename = testfilename[1] j = -1 for i = 1 to mapSections.count do ( if mapSections[i].name == testfilename then ( j = i ) ) idnumber = (filterstring elems.params[1] "\"")[2] as integer if j != -1 then ( mapSections[j].afterStart = idnumber mapSections[j].afterEnd = -1 ) ) qsort mapSections qsMapSectionAfters for i = 2 to mapSections.count do ( mapSect = mapSections[i] mapSectBefore = mapSections[i - 1] mapSectBefore.afterEnd = mapSect.afterStart - 1 ) for i = 1 to mapSections.count do ( mapSect = mapSections[i] GtaSyncExtractSection afterXML mapSect ) found = undefined do ( found = false for i = 1 to mapSections.count do ( mapSect = mapSections[i] if (mapSect.beforeStart == mapSect.afterStart) and (mapSect.beforeEnd == mapSect.afterEnd) then ( deleteItem mapSections i found = true exit ) ) ) while(found) ideNameList = #() for i = 1 to mapSections.count do ( mapSect = mapSections[i] append ideNameList mapSect.name print ("sync ide: " + mapSect.name) print ("before start:" + (mapSect.beforeStart as string) + " end: " + (mapSect.beforeEnd as string)) print ("after start:" + (mapSect.afterStart as string) + " end: " + (mapSect.afterEnd as string)) if GtaSyncIDEForSection afterXML mapSect == false then ( print "failed to sync ide" return false ) ) GtaSyncIPLsToIDEsListOnly ideNameList -- GtaSyncIPLsToIDEs() )