mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-31 00:15:54 -04:00
267 lines
7.1 KiB
Plaintext
267 lines
7.1 KiB
Plaintext
// ======================================================================
|
|
//
|
|
// objvar_mangle.scriptlib
|
|
//
|
|
// Copyright 2003 Sony Online Entertainment
|
|
//
|
|
// ======================================================================
|
|
|
|
const int INTS_PER_SEGMENT = 80;
|
|
const int FLOATS_PER_SEGMENT = 40;
|
|
const int STRINGS_PER_SEGMENT = 10;
|
|
const int OBJIDS_PER_SEGMENT = 40;
|
|
|
|
// ======================================================================
|
|
|
|
int[] getMangledIntArrayObjVar(obj_id self, string varName)
|
|
{
|
|
if (hasObjVar(self, varName))
|
|
return getIntArrayObjVar(self, varName);
|
|
|
|
int count = getIntObjVar(self, varName + "_mangled.count");
|
|
if (count <= 0)
|
|
return null;
|
|
|
|
int[] values = new int[count];
|
|
|
|
int segment = 0;
|
|
int valuePos = 0;
|
|
|
|
while (valuePos < count)
|
|
{
|
|
int[] segmentValues = getIntArrayObjVar(self, varName + "_mangled.segment." + segment);
|
|
if (segmentValues == null)
|
|
break;
|
|
++segment;
|
|
for (int i = 0; i < segmentValues.length && valuePos < count; ++i)
|
|
values[valuePos++] = segmentValues[i];
|
|
}
|
|
|
|
if (valuePos != count)
|
|
return null;
|
|
|
|
return values;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
void setMangledIntArrayObjVar(obj_id self, string varName, int[] values)
|
|
{
|
|
removeObjVar(self, varName);
|
|
removeObjVar(self, varName + "_mangled.segment");
|
|
setObjVar(self, varName + "_mangled.count", values.length);
|
|
int pos, segment;
|
|
for (pos = 0, segment = 0; pos < values.length; pos += INTS_PER_SEGMENT, ++segment)
|
|
{
|
|
int segmentLength = values.length-pos;
|
|
if (segmentLength > INTS_PER_SEGMENT)
|
|
segmentLength = INTS_PER_SEGMENT;
|
|
int[] segmentValues = new int[segmentLength];
|
|
for (int i = 0; i < segmentLength; ++i)
|
|
segmentValues[i] = values[pos+i];
|
|
if(segmentValues.length > 0)
|
|
setObjVar(self, varName + "_mangled.segment." + segment, segmentValues);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
float[] getMangledFloatArrayObjVar(obj_id self, string varName)
|
|
{
|
|
if (hasObjVar(self, varName))
|
|
return getFloatArrayObjVar(self, varName);
|
|
|
|
int count = getIntObjVar(self, varName + "_mangled.count");
|
|
if (count <= 0)
|
|
return null;
|
|
|
|
float[] values = new float[count];
|
|
|
|
int segment = 0;
|
|
int valuePos = 0;
|
|
|
|
while (valuePos < count)
|
|
{
|
|
float[] segmentValues = getFloatArrayObjVar(self, varName + "_mangled.segment." + segment);
|
|
if (segmentValues == null)
|
|
break;
|
|
++segment;
|
|
for (int i = 0; i < segmentValues.length && valuePos < count; ++i)
|
|
values[valuePos++] = segmentValues[i];
|
|
}
|
|
|
|
if (valuePos != count)
|
|
return null;
|
|
|
|
return values;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
void setMangledFloatArrayObjVar(obj_id self, string varName, float[] values)
|
|
{
|
|
removeObjVar(self, varName);
|
|
removeObjVar(self, varName + "_mangled.segment");
|
|
setObjVar(self, varName + "_mangled.count", values.length);
|
|
int pos, segment;
|
|
for (pos = 0, segment = 0; pos < values.length; pos += FLOATS_PER_SEGMENT, ++segment)
|
|
{
|
|
int segmentLength = values.length-pos;
|
|
if (segmentLength > FLOATS_PER_SEGMENT)
|
|
segmentLength = FLOATS_PER_SEGMENT;
|
|
float[] segmentValues = new float[segmentLength];
|
|
for (int i = 0; i < segmentLength; ++i)
|
|
segmentValues[i] = values[pos+i];
|
|
if(segmentValues.length > 0)
|
|
setObjVar(self, varName + "_mangled.segment." + segment, segmentValues);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
string[] getMangledStringArrayObjVar(obj_id self, string varName)
|
|
{
|
|
if (hasObjVar(self, varName))
|
|
return getStringArrayObjVar(self, varName);
|
|
|
|
int count = getIntObjVar(self, varName + "_mangled.count");
|
|
|
|
if (count <= 0)
|
|
return null;
|
|
|
|
string[] values = new string[count];
|
|
|
|
int segment = 0;
|
|
int valuePos = 0;
|
|
|
|
while (valuePos < count)
|
|
{
|
|
string[] segmentValues = getStringArrayObjVar(self, varName + "_mangled.segment." + segment);
|
|
if (segmentValues == null)
|
|
break;
|
|
++segment;
|
|
for (int i = 0; i < segmentValues.length && valuePos < count; ++i)
|
|
values[valuePos++] = segmentValues[i];
|
|
}
|
|
|
|
if (valuePos != count)
|
|
return null;
|
|
|
|
return values;
|
|
}
|
|
|
|
|
|
string[] getBrokenMangledStringArrayObjVar(obj_id self, string varName)
|
|
{
|
|
if (hasObjVar(self, varName))
|
|
return getStringArrayObjVar(self, varName);
|
|
|
|
int count = getIntObjVar(self, varName + "_mangled.count");
|
|
if (count <= 0)
|
|
return null;
|
|
|
|
string[] values = new string[count];
|
|
|
|
int segment = 0;
|
|
int valuePos = 0;
|
|
|
|
while (valuePos < count)
|
|
{
|
|
string[] segmentValues = getStringArrayObjVar(self, varName + "_mangled.segment." + segment);
|
|
if (segmentValues == null)
|
|
break;
|
|
++segment;
|
|
for (int i = 0; i < segmentValues.length && valuePos < count; ++i)
|
|
values[valuePos++] = segmentValues[i];
|
|
}
|
|
|
|
if (valuePos !=count)
|
|
{
|
|
string[] strNewStrings = new string[valuePos];
|
|
for(int intI = 0; intI< valuePos; intI++)
|
|
{
|
|
strNewStrings[intI] = values[intI];
|
|
}
|
|
return strNewStrings;
|
|
}
|
|
return values;
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
void setMangledStringArrayObjVar(obj_id self, string varName, string[] values)
|
|
{
|
|
removeObjVar(self, varName);
|
|
removeObjVar(self, varName + "_mangled.segment");
|
|
setObjVar(self, varName + "_mangled.count", values.length);
|
|
int pos, segment;
|
|
for (pos = 0, segment = 0; pos < values.length; pos += STRINGS_PER_SEGMENT, ++segment)
|
|
{
|
|
int segmentLength = values.length-pos;
|
|
if (segmentLength > STRINGS_PER_SEGMENT)
|
|
segmentLength = STRINGS_PER_SEGMENT;
|
|
string[] segmentValues = new string[segmentLength];
|
|
for (int i = 0; i < segmentLength; ++i)
|
|
segmentValues[i] = values[pos+i];
|
|
if(segmentValues.length > 0)
|
|
setObjVar(self, varName + "_mangled.segment." + segment, segmentValues);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
obj_id[] getMangledObjIdArrayObjVar(obj_id self, string varName)
|
|
{
|
|
if (hasObjVar(self, varName))
|
|
return getObjIdArrayObjVar(self, varName);
|
|
|
|
int count = getIntObjVar(self, varName + "_mangled.count");
|
|
if (count <= 0)
|
|
return null;
|
|
|
|
obj_id[] values = new obj_id[count];
|
|
|
|
int segment = 0;
|
|
int valuePos = 0;
|
|
|
|
while (valuePos < count)
|
|
{
|
|
obj_id[] segmentValues = getObjIdArrayObjVar(self, varName + "_mangled.segment." + segment);
|
|
if (segmentValues == null)
|
|
break;
|
|
++segment;
|
|
for (int i = 0; i < segmentValues.length && valuePos < count; ++i)
|
|
values[valuePos++] = segmentValues[i];
|
|
}
|
|
|
|
if (valuePos != count)
|
|
return null;
|
|
|
|
return values;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
void setMangledObjIdArrayObjVar(obj_id self, string varName, obj_id[] values)
|
|
{
|
|
removeObjVar(self, varName);
|
|
removeObjVar(self, varName + "_mangled.segment");
|
|
setObjVar(self, varName + "_mangled.count", values.length);
|
|
int pos, segment;
|
|
for (pos = 0, segment = 0; pos < values.length; pos += OBJIDS_PER_SEGMENT, ++segment)
|
|
{
|
|
int segmentLength = values.length-pos;
|
|
if (segmentLength > OBJIDS_PER_SEGMENT)
|
|
segmentLength = OBJIDS_PER_SEGMENT;
|
|
obj_id[] segmentValues = new obj_id[segmentLength];
|
|
for (int i = 0; i < segmentLength; ++i)
|
|
segmentValues[i] = values[pos+i];
|
|
if(segmentValues.length > 0)
|
|
setObjVar(self, varName + "_mangled.segment." + segment, segmentValues);
|
|
}
|
|
}
|
|
|
|
// ======================================================================
|
|
|