private void SaveAndApply(IBlockConfiguration block, IMyTextPanel textPanel, Action <IMyTextPanel> action)
 {
     if (!block.HasStyle)
     {
         SaveAndApply(block, textPanel, 0, action);
         block.SetStyle(nameof(IMyTextPanel.Enabled), textPanel.Enabled);
     }
 }
        private void SaveAndApply(IBlockConfiguration block, IMyRefinery refinery, Action <IMyRefinery> action)
        {
            if (!block.HasStyle)
            {
                block.SetStyle(nameof(IMyRefinery.Enabled), refinery.Enabled);
            }

            action(refinery);
        }
        private void SaveAndApply(IBlockConfiguration block, IMyAssembler assembler, Action <IMyAssembler> action)
        {
            if (!block.HasStyle)
            {
                block.SetStyle(nameof(IMyAssembler.Enabled), assembler.Enabled);
            }

            action(assembler);
        }
 private void Restore(IBlockConfiguration block, IMyLightingBlock lightingBlock)
 {
     lightingBlock.Enabled = block.GetBooleanStyle(nameof(IMyLightingBlock.Enabled), true);
     lightingBlock.BlinkIntervalSeconds = block.GetSingleStyle(nameof(IMyLightingBlock.BlinkIntervalSeconds));
     lightingBlock.BlinkLength          = block.GetSingleStyle(nameof(IMyLightingBlock.BlinkLength));
     lightingBlock.BlinkOffset          = block.GetSingleStyle(nameof(IMyLightingBlock.BlinkOffset));
     lightingBlock.Color     = block.GetColorStyle(nameof(IMyLightingBlock.Color), Colors.White);
     lightingBlock.Falloff   = block.GetSingleStyle(nameof(IMyLightingBlock.Falloff));
     lightingBlock.Intensity = block.GetSingleStyle(nameof(IMyLightingBlock.Intensity));
     lightingBlock.Radius    = block.GetSingleStyle(nameof(IMyLightingBlock.Radius));
 }
 private void Restore(IBlockConfiguration provider, IMyTextSurface surface, Int32 index)
 {
     surface.WriteText(provider.GetStringStyle($"Surface {index} Text"));
     surface.FontSize        = provider.GetSingleStyle($"Surface {index} {nameof(IMyTextSurface.FontSize)}", 1);
     surface.Font            = provider.GetStringStyle($"Surface {index} {nameof(IMyTextSurface.Font)}", "Debug");
     surface.Alignment       = provider.GetEnumStyle <TextAlignment>($"Surface {index} {nameof(IMyTextSurface.Alignment)}", TextAlignment.LEFT);
     surface.FontColor       = provider.GetColorStyle($"Surface {index} {nameof(IMyTextSurface.FontColor)}", Colors.White);
     surface.BackgroundColor = provider.GetColorStyle($"Surface {index} {nameof(IMyTextSurface.BackgroundColor)}", Colors.Black);
     surface.ContentType     = provider.GetEnumStyle <ContentType>($"Surface {index} {nameof(IMyTextSurface.ContentType)}", ContentType.NONE);
     surface.TextPadding     = provider.GetSingleStyle($"Surface {index} {nameof(IMyTextSurface.TextPadding)}", 10);
 }
        private void SaveAndApply(IBlockConfiguration block, IMySoundBlock soundBlock, Action <IMySoundBlock> action)
        {
            if (!block.HasStyle)
            {
                block.SetStyle(nameof(IMySoundBlock.Enabled), soundBlock.Enabled);
                block.SetStyle(nameof(IMySoundBlock.SelectedSound), soundBlock.SelectedSound);
                block.SetStyle(nameof(IMySoundBlock.Volume), soundBlock.Volume);
                block.SetStyle(nameof(IMySoundBlock.Range), soundBlock.Range);
                block.SetStyle(nameof(IMySoundBlock.LoopPeriod), soundBlock.LoopPeriod);
            }

            action(soundBlock);
        }
        private void SaveAndApply(IBlockConfiguration block, IMyWarhead warhead, Action <IMyWarhead> action)
        {
            if (block == null)
            {
                return;
            }

            if (!block.HasStyle)
            {
                block.SetStyle(nameof(IMyWarhead.IsArmed), warhead.IsArmed);
                block.SetStyle(nameof(IMyWarhead.DetonationTime), warhead.DetonationTime);
            }

            action(warhead);
        }
        private void Restore(IBlockConfiguration block, IMySoundBlock soundBlock)
        {
            soundBlock.Enabled = block.GetBooleanStyle(nameof(IMySoundBlock.Enabled), true);
            // TODO: Currently assuming that sound blocks are off by default.
            // https://support.keenswh.com/spaceengineers/general/topic/improvements-to-imysoundblock-interface
            var selectedSound = block.GetStringStyle(nameof(IMySoundBlock.SelectedSound));

            if (selectedSound != soundBlock.SelectedSound)
            {
                soundBlock.Stop();
                soundBlock.SelectedSound = selectedSound;
            }
            soundBlock.Volume     = block.GetSingleStyle(nameof(IMySoundBlock.Volume), 1);
            soundBlock.Range      = block.GetSingleStyle(nameof(IMySoundBlock.Range), 1);
            soundBlock.LoopPeriod = block.GetSingleStyle(nameof(IMySoundBlock.LoopPeriod));
        }
        private void SaveAndApply(IBlockConfiguration block, IMyLightingBlock lightingBlock, Action <IMyLightingBlock> action)
        {
            if (!block.HasStyle)
            {
                block.SetStyle(nameof(IMyLightingBlock.Enabled), lightingBlock.Enabled);
                block.SetStyle(nameof(IMyLightingBlock.BlinkIntervalSeconds), lightingBlock.BlinkIntervalSeconds);
                block.SetStyle(nameof(IMyLightingBlock.BlinkLength), lightingBlock.BlinkLength);
                block.SetStyle(nameof(IMyLightingBlock.BlinkOffset), lightingBlock.BlinkOffset);
                block.SetStyle(nameof(IMyLightingBlock.Color), lightingBlock.Color);
                block.SetStyle(nameof(IMyLightingBlock.Falloff), lightingBlock.Falloff);
                block.SetStyle(nameof(IMyLightingBlock.Intensity), lightingBlock.Intensity);
                block.SetStyle(nameof(IMyLightingBlock.Radius), lightingBlock.Radius);
            }

            action(lightingBlock);
        }
        private void SaveAndApply <T>(IBlockConfiguration provider, T surface, Int32 index, Action <T> action = null)
            where T : IMyTextSurface
        {
            if (!provider.HasStyle)
            {
                provider.SetStyle($"Surface {index} Text", surface.GetText());
                provider.SetStyle($"Surface {index} {nameof(IMyTextSurface.FontSize)}", surface.FontSize);
                provider.SetStyle($"Surface {index} {nameof(IMyTextSurface.Font)}", surface.Font);
                provider.SetStyle($"Surface {index} {nameof(IMyTextSurface.Alignment)}", surface.Alignment.ToString());
                provider.SetStyle($"Surface {index} {nameof(IMyTextSurface.FontColor)}", surface.FontColor);
                provider.SetStyle($"Surface {index} {nameof(IMyTextSurface.BackgroundColor)}", surface.BackgroundColor);
                provider.SetStyle($"Surface {index} {nameof(IMyTextSurface.ContentType)}", surface.ContentType.ToString());
                provider.SetStyle($"Surface {index} {nameof(IMyTextSurface.TextPadding)}", surface.TextPadding);
            }

            action?.Invoke(surface);
        }
        private void SaveAndApply(IBlockConfiguration block, IMyDoor door, Action <IMyDoor> action)
        {
            if (!block.HasStyle)
            {
                block.SetStyle(nameof(IMyDoor.Enabled), door.Enabled);

                switch (door.Status)
                {
                case DoorStatus.Open:
                case DoorStatus.Opening:
                    block.SetStyle("Open", true);
                    break;

                default:
                    block.SetStyle("Open", false);
                    break;
                }
            }

            action(door);
        }
 private void Restore(IBlockConfiguration block, IMyRefinery refinery)
 => refinery.Enabled = block.GetBooleanStyle(nameof(IMyRefinery.Enabled), true);
 private void Restore(IBlockConfiguration block, IMyAssembler assembler)
 => assembler.Enabled = block.GetBooleanStyle(nameof(IMyAssembler.Enabled), true);
 private void Restore(IBlockConfiguration block, IMyDoor door)
 => door.Enabled = block.GetBooleanStyle(nameof(IMyDoor.Enabled), true);
 private void Restore(IBlockConfiguration block, IMyTextPanel textPanel)
 {
     Restore(block, textPanel, 0);
     textPanel.Enabled = block.GetBooleanStyle(nameof(IMyTextPanel.Enabled), true);
 }
 private void Restore(IBlockConfiguration block, IMyWarhead warhead)
 {
     warhead.IsArmed        = block.GetBooleanStyle(nameof(IMyWarhead.IsArmed));
     warhead.DetonationTime = block.GetSingleStyle(nameof(IMyWarhead.DetonationTime), Countdown);
 }