JurassicParkTrespasser/jp2_pc/Tools/MAXScript/SndMatUpdate.ms
2018-01-01 23:07:24 +01:00

195 lines
5.8 KiB
Plaintext

fn IsMaster CName =
(
local DashPos = -1
for i = 1 to CName.count do
if CName[i] == "-" do
DashPos = i
if DashPos == -1 then
return false
else
(
if (substring CName (DashPos) 3) == "-00" then
return true
else
return false
)
)
Utility SoundMatUpdate "Sound Material Update"
(
-- debug mode
local debug = true
checkbox WarningsOnly "Warnings Only"
button ExportSelection "Export Selection" width:140
button ImportSelection "Import Selection" width:140
label status1
on ExportSelection pressed do
(
sel = selection as array
sc = sel.count
SoundData = #()
-- gather the sound material info from the objects...
status1.text = "Gathering Info...."
for o in sel do
(
if heapfree < 2000000 do if heapsize < 64000000 do heapsize += 2000000
if (isMaster o.name) and (o.name[1] != "!") do
(
if debug do (format "Master object detected...%\n" o.name)
CBuffer = getUserPropBuffer o
if (CIndex = findString CBuffer "SoundMaterial") != undefined do
(
if debug do (format "Has a sound Material\n")
-- we have a sound prop
-- get the sound property
cnt = 0
for j = (CIndex) to CBuffer.count do
(
if CBuffer[j] == "\"" do
(
for k = (j+1) to CBuffer.count do
(
if CBuffer[k] == "\"" do
(
SoundMaterial = substring CBuffer (j+1) cnt
if debug do (format "SoundMaterial = %\n" SoundMaterial)
append SoundData #(o.name, SoundMaterial)
)
cnt += 1
)
)
)
)
)
)
status1.text = "Writing data to file...."
if SoundData.count > 0 then
(
format "SoundData Count:%\n" SoundData.count
if (f = createFile (getSaveFileName())) != undefined then
(
format "; Exported: %\n" localtime to:f
for i = 1 to SoundData.count do
(
format "%:%\n" SoundData[i][1] SoundData[i][2]
format "%:%\n" SoundData[i][1] SoundData[i][2] to:f
)
close f
) else (
MessageBox "FOO"
)
) else (
if debug do format "no sound materials found\n"
)
status1.text = ""
)
on ImportSelection pressed do
(
if (fName = getOpenFileName()) != undefined do
(
status1.text = "Reading File..."
ObjData = #()
f = openFile fName
warn = false
while not eof f do
(
cLine = readLine f
if CLine[1] != ";" do
(
index = 0
for i = 1 to cLine.count do
(
-- find the colon
if CLine[i] == ":" do
(
index = i
Exit
)
)
if index != 0 then
(
ObjectName = substring CLine 1 (index - 1)
SoundMaterialName = substring CLine (index + 1) (CLine.count - index)
append ObjData #(ObjectName, SoundMaterialName)
) else (
format "WARNING: could not read SoundMaterial from file... line \"%\"\n" cLine
warn = true
)
)
)
close f
status1.text = "Updating Sound Materials"
ProgressStart "Updating Sound Materials..."
inv = (1.0 / ObjData.count) * 100
sel = #()
for o in selection do
if (IsMaster o.name) do append sel o
for i = 1 to ObjData.count do
(
if heapfree < 2000000 do
(
format "heapFree is below 2 megs...%:%\n" i heapfree
if heapsize < 64000000 do
(
format "heapSize is below 64 megs...%:%\n" i heapsize
heapsize += 2000000
)
)
progressUpdate (i * inv)
CName = ObjData[i][1]
foundObject = false
for o in sel do
(
if (o.name == CName) do
(
foundObject = true
CBuffer = getUserPropBuffer o
-- find the start if the line
StartIndex = -1
EndIndex = -1
if (CIndex = FindString CBuffer "SoundMaterial") != undefined then
(
for j = CIndex to 1 by -1 do
(
if CBuffer[j] == "\n" do
(
StartIndex = j+1
Exit
)
)
-- find the end of the line
for j = CIndex to CBuffer.count do
(
if CBuffer[j] == "\r" and CBuffer[j+1] == "\r" and CBuffer[j+2] == "\n" do
(
EndIndex = j-1
Exit
)
)
if StartIndex != -1 and EndIndex != -1 then
(
CBuffer = Replace CBuffer StartIndex (EndIndex - StartIndex + 1) ("string SoundMaterial = \"" + ObjData[i][2] + "\";")
setUserPropBuffer o CBuffer
if WarningsOnly.checked == false do format "Successfully UPDATED a better sound material for %\n" o.name
) else (
format "WARNING: could not update sound material info for object: %\n" o.name
warn = true
)
) else (
setUserPropBuffer o ((getUserPropBuffer o) + "\r\r\ns SoundMaterial = \"" + ObjData[i][2] + "\";\r\r\n")
if WarningsOnly.checked == false do format "Successfully ADDED quite possibly the best sound material for %\n" o.name
)
)
)
if foundObject == false do (format "WARNING: Could not find object \"%\" in the selection...\n" CName)
)
ProgressEnd()
status1.text = ""
if warn do (MessageBox "Warning! Check the Listener Window")
)
)
)