Beispiel #1
0
        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);
        }
Beispiel #2
0
 public void Close()
 {
     foreach (var c in Levelscript)
     {
         c.Close();
     }
     Levelscript.Clear();
     foreach (var a in Areas)
     {
         a.Close();
     }
     Areas.Clear();
     Closed = true;
 }
Beispiel #3
0
        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;
                }
            }
        }