1367 lines
33 KiB
Plaintext
Executable File
1367 lines
33 KiB
Plaintext
Executable File
--
|
|
-- File:: pipeline/util/IdeUtils.ms
|
|
-- Description:: Allows loading and editing of ide/ipl files in script
|
|
--
|
|
-- Author:: Greg Smith <greg.smith@rockstarnorth.com>
|
|
-- 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()
|
|
)
|