// ====================================================================== // // 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); } } // ======================================================================