public int WriteToSeg(BinaryData data, int offset, byte bankID) { uint lvlScriptLength; int bankAddr = Conversions.ToInteger(Conversions.ToUInteger(bankID) << 24); // Clear the old levelscript Levelscript.Clear(); // Clear Configuration Config.CustomObjectConfigs.Clear(); // Calculate space of Levelscript lvlScriptLength = (uint)CalcLevelscriptLength(); // Start Custom Objects data.Position = offset + lvlScriptLength; for (int i = 0, loopTo = Models.Count - 1; i <= loopTo; i++) { var obj = Models[i]; // Write Object Model obj.ModelBankOffset = Conversions.ToInteger(data.Position - offset); var sr = obj.Model.ToBinaryData(data, Conversions.ToInteger(data.Position), offset, bankAddr); data.RoundUpPosition(); // Write Model Offset & Length & Collision Offset data.Write(obj.ModelBankOffset); data.Write(Conversions.ToInteger(obj.Model.Fast3DBuffer.Length)); data.Write(sr.CollisionPointer == -1 ? -1 : sr.CollisionPointer & 0xFFFFFF); obj.CollisionPointer = sr.CollisionPointer; data.RoundUpPosition(); // Copy new Geopointer(s) obj.Geolayout.Geopointers.Clear(); obj.Geolayout.Geopointers.AddRange(sr.GeoPointers.ToArray()); // Write Geolayout obj.GeolayoutBankOffset = Conversions.ToInteger(data.Position - offset); obj.Geolayout.Write(data.BaseStream, Conversions.ToInteger(data.Position)); data.RoundUpPosition(0x30); // Add object config to object bank config Config.CustomObjectConfigs.Add(i, obj.Config); } // Set length of segmented data.RoundUpPosition(); int lastPosition = Conversions.ToInteger(data.Position); // Create Levelscript foreach (CustomModel obj in Models) { Levelscript.Add(new LevelscriptCommand($"22 08 00 {obj.ModelID.ToString("X")} {bankID.ToString("X")} {Conversion.Hex(obj.GeolayoutBankOffset >> 16 & 0xFF)} {Conversion.Hex(obj.GeolayoutBankOffset >> 8 & 0xFF)} {Conversion.Hex(obj.GeolayoutBankOffset & 0xFF)}")); } Levelscript.Add(new LevelscriptCommand("07 04 00 00")); Levelscript.Write(data, offset); NeedToSave = false; return(lastPosition - offset); }
public void Close() { foreach (var c in Levelscript) { c.Close(); } Levelscript.Clear(); foreach (var a in Areas) { a.Close(); } Areas.Clear(); Closed = true; }
public void ReadFromSeg(RomManager rommgr, SegmentedBank seg, ObjectModelConfig config) { Stream s; BinaryData data; Levelscript.Clear(); CurSeg = seg; s = seg.ReadDataIfNull(rommgr); data = new BinaryStreamData(s); // Get configuration Config = config; // Read Levelscript Levelscript.Read(rommgr, seg.BankAddress, LevelscriptCommandTypes.JumpBack, new Dictionary <byte, SegmentedBank>() { { seg.BankID, seg } }); // Parse Levelscript & Load Models for (int i = 0, loopTo = Levelscript.Count - 1; i <= loopTo; i++) { LevelscriptCommand cmd = (LevelscriptCommand)Levelscript[i]; switch (cmd.CommandType) { case LevelscriptCommandTypes.LoadPolygonWithGeo: var obj = new CustomModel() { Config = config.GetCustomObjectConfig(i) }; // Load Model ID & Geolayout Offset obj.ModelID = clLoadPolygonWithGeo.GetModelID(cmd); int geoAddr = clLoadPolygonWithGeo.GetSegAddress(cmd); obj.GeolayoutBankOffset = geoAddr & 0xFFFFFF; if (geoAddr >> 24 == seg.BankID) { // Load Model Offset & Length data.Position = obj.GeolayoutBankOffset - 0x10; obj.ModelBankOffset = data.ReadInt32(); int f3d_length = data.ReadInt32(); int colOffset = data.ReadInt32(); int colPointer = colOffset | seg.BankAddress; obj.CollisionPointer = colPointer; // Load Geolayout obj.Geolayout = new Geolayout.Geolayout(Geolayout.Geolayout.NewScriptCreationMode.None); obj.Geolayout.Read(rommgr, geoAddr); // Load Model obj.Model = new Model.ObjectModel(); obj.Model.FromBinaryData(data, 0, seg.BankAddress, obj.ModelBankOffset, f3d_length, obj.Geolayout.Geopointers.ToArray(), colPointer); // Add Object to list Models.Add(obj); } break; } } }