public void AddObjectGeolayoutScript(byte modelID, Geolayoutscript script)
 {
     dicGeolayoutScripts.Add(modelID, script);
     AddScriptNode(
         (int)modelID,
         $"{TextFromValue(modelID, charCount:3)} ({TextFromValue(script.FirstOrDefault()?.RomAddress ?? 0)})",
         nGeolayoutScripts.Text + modelID.ToString(),
         nGeolayoutScripts);
 }
Exemple #2
0
        public void Read(RomManager rommgr, int segAddress)
        {
            if (!Closed)
            {
                Close();
            }
            Closed = false;
            Geolayoutscript.Clear();
            Geopointers.Clear();
            GeopointerOffsets.Clear();
            Geolayoutscript = new Geolayoutscript();
            Geolayoutscript.Read(rommgr, segAddress);

            var ToRemove     = new List <GeolayoutCommand>();
            int cIndex       = 0;
            var curMdlScale  = System.Numerics.Vector3.One;
            var curMdlOffset = System.Numerics.Vector3.Zero;

            foreach (GeolayoutCommand fec in Geolayoutscript)
            {
                var c          = fec;
                var switchExpr = c.CommandType;

                switch (switchExpr)
                {
                case GeolayoutCommandTypes.CameraPreset:
                    CameraPreset = (CameraPresets)cgCameraPreset.GetCameraPreset(ref c);
                    break;

                case GeolayoutCommandTypes.x18:
                    var switchExpr1 = (uint)cgx18.GetAsmPointer(ref c);
                    switch (switchExpr1)
                    {
                    case 0x802761D0:
                    {
                        EnvironmentEffect = (EnvironmentEffects)cgx18.GetParam1(ref c);
                        break;
                    }
                    }

                    break;

                case GeolayoutCommandTypes.LoadDisplaylist:
                    if (Geopointers.Count == 0)
                    {
                        IndexForGeopointers = cIndex;
                    }
                    Geopointers.Add(new Geopointer(cgLoadDisplayList.GetDrawingLayer(ref c), cgLoadDisplayList.GetSegGeopointer(ref c), curMdlScale, curMdlOffset));
                    break;
                }

                cIndex += 1;
            }

            // Remove Geopointercommands
            RemoveOldGeopointerCommands();
        }
        public void AddAreaGeolayoutScript(byte areaID, Geolayoutscript script)
        {
            int id = areaID * -1;

            dicGeolayoutScripts.Add(id, script);
            AddScriptNode(
                id,
                $"Area {TextFromValue(areaID)} ({TextFromValue(script.FirstOrDefault()?.RomAddress ?? 0)})",
                nGeolayoutScripts.Text + id.ToString(),
                nGeolayoutScripts);
        }
Exemple #4
0
        public void Write(Stream s, int StartOffset)
        {
            NewGeoOffset = StartOffset;
            var commandsToRemove    = new List <GeolayoutCommand>();
            int tIndexForGeoPointer = IndexForGeopointers;

            // Einstellungen übernehmen
            int currentPosition = 0;

            foreach (GeolayoutCommand fec in Geolayoutscript)
            {
                var c          = fec;
                var switchExpr = c.CommandType;

                switch (switchExpr)
                {
                case GeolayoutCommandTypes.CameraPreset:
                    cgCameraPreset.SetCameraPreset(ref c, Conversions.ToByte(CameraPreset));
                    break;

                case GeolayoutCommandTypes.x18:
                    var switchExpr1 = cgx18.GetAsmPointer(ref c);
                    switch ((GeoAsmPointer)switchExpr1)
                    {
                    case GeoAsmPointer.EnvironmentEffect:
                    {
                        cgx18.SetParam1(ref c, (ushort)EnvironmentEffect);
                        break;
                    }
                    }

                    break;
                }

                currentPosition += (int)c.Length;
                // If Not IndexForGeopointersFound Then IndexForGeopointers += 1
            }

            // Insert Geopointers
            foreach (Geopointer g in Geopointers)
            {
                var tcommand = new GeolayoutCommand(new byte[] { 0x15, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 });
                cgLoadDisplayList.SetDrawingLayer(ref tcommand, g.Layer);
                cgLoadDisplayList.SetSegGeopointer(ref tcommand, g.SegPointer);
                Geolayoutscript.Insert(tIndexForGeoPointer, tcommand);
                tIndexForGeoPointer += 1;
            }

            // Write Geolayout to ROM
            Geolayoutscript.Write(s, StartOffset);

            // Remove Geopointercommands again
            RemoveOldGeopointerCommands();
        }
Exemple #5
0
        private void RemoveOldGeopointerCommands()
        {
            var ToRemove = new List <GeolayoutCommand>();

            foreach (GeolayoutCommand c in Geolayoutscript)
            {
                if (c.CommandType == GeolayoutCommandTypes.LoadDisplaylist)
                {
                    ToRemove.Add(c);
                }
            }

            foreach (GeolayoutCommand cmd in ToRemove)
            {
                Geolayoutscript.Remove(cmd);
                cmd.Close();
            }
        }