Space Engineers Guide

Sistema de información Genérica [Bloque Programable] for Space Engineers

Sistema de información Genérica [Bloque Programable]

Overview

Pretendo desarrollar en forma de guía un sistema de información para cualquier tipo de nave, fácil de implementar y con comentarios acerca de la forma de desarrollar este sistema. [En construcción]

Preámbulo

El script que pretendo desarrollar y demostrar es un sistema sencillo y genérico para cualquier tipo de nave, para que el usuario pueda obtener información mediante los paneles LCD acerca del status general de los componentes y sistemas vitales, como oxígeno, energía, seguridad, integridad de los equipos funcionales, etc. La idea es que este sistema sea lo mas agnóstico al diseño de la nave o estación en donde se esté ejecutando, y además lo más fácil posible de instalar para los usuarios que no tienen conocimientos de programación.

El link del post original es el siguiente: [link]

Insisto en que esta guía está en construcción y va a ser editada con relativa frecuencia.

Edito: Esta es la primera actualización del script, cuando esté completo voy a crear la guía que explica cada sección del código y la información para aprender a escribir estos scripts.

Actualmente el sistema permite:

  • Mostrar la información general de las baterías.
  • Configurar a que porcentaje el sistema alertará sobre baterías bajas.
  • Alertar con cambio de colores en las luces, y mensaje en panel designado por el usuario.

Las próximas mejoras serán:

  • En cuanto a energía reducir la potencia máxima de los propulsores, y apagar algunos bloques
  • En cuanto a otras funciones, me gustaria programar módulos de seguridad, información de presurización y oxígeno, inventario, y algunas utilidades y funciones para usuarios más avanzados y programadores.

En próximas actualizaciones detallaré las próximas mejoras.

Código

List<IMyTerminalBlock> baterias = new List<IMyTerminalBlock>(); List<IMyTerminalBlock> paneles = new List<IMyTerminalBlock>(); List<IMyTerminalBlock> parlantes = new List<IMyTerminalBlock>(); const string NOMBRE_PANEL_GENERAL = “Panel Info”; //Colocar el nombre del o de los paneles de información general. const double BATERIA_BAJA = 10; //Porcentaje de batería con la que el sistema alertará sobre energía baja disponible. const string NOMBRE_PANEL_EMERGENCIA = “Panel Emergencia”; //Panel donde se alertará sobre asuntos críticos de la nave. const string NOMBRE_SOUND_BLOCK = “Parlante”; //Nombre del/los bloques de sonido que se requiera usar void Main(string argument) { var mensaje = “”; mensaje += StatusBaterias(); mensaje += InformacionGeneral(); EscribirEnPaneles(NOMBRE_PANEL_GENERAL, mensaje); } public string StatusBaterias() { Echo(“StatusBaterias -in”); var mensaje = “================Baterías================”; GridTerminalSystem.GetBlocksOfType<IMyBatteryBlock>(baterias); if (baterias.Count == 0) { mensaje += “nNo hay baterías, o el sistema no las reconoce.”; } else { double energiaActual = 0, maximaEnergia = 0, poderActual = 0; bool funcionando; for (var i = 0; i < baterias.Count; i++) //Información individual. { IMyBatteryBlock bateria = baterias as IMyBatteryBlock;

energiaActual += bateria.CurrentStoredPower;
maximaEnergia += bateria.MaxStoredPower;

funcionando = bateria.IsWorking;
var nombre = bateria.DisplayNameText;

//mensaje += string.Format(“n{0}: {1}”, nombre, funcionando ? “Ok” : “Apagado”);
//mensaje += string.Format(“nEnergía Almacenada actualmente: {0} MW”, bateria.CurrentStoredPower);
//mensaje += string.Format(“nCapacidad máxima: {0} MW”, bateria.MaxStoredPower);
//mensaje += string.Format(“nNivel de energía en las baterías: {0:F2}%”, 100d*(bateria.CurrentStoredPower/bateria.MaxStoredPower));
//mensaje += bateria.DetailedInfo;
}

mensaje += ” n================General Baterías================”;
double porcentaje = 100d*(energiaActual/maximaEnergia);
SeccionAdministracionBaterias(porcentaje);
mensaje += string.Format(“nNivel de energía en las baterías: {0:F2}%”, porcentaje);
}

Echo(“StatusBaterias -out”);
return mensaje;
}

public void SeccionAdministracionBaterias(double porcentaje)
{
if (porcentaje < BATERIA_BAJA)
{
var col = new Color(102, 0, 0);
var luces = SelectorLucesInteriores();

for (int i = 0; i < luces.Count; i++)
{
luces.SetValue(“Color”, col);
}

var msj = “Alerta!! La energía se está agotando! favor revisar status.nNivel de energía: ” +
porcentaje.ToString(“F”) + “%”;
EscribirEnPaneles(msj, NOMBRE_PANEL_EMERGENCIA, new Color(102, 0, 0));
//GridTerminalSystem.GetBlocksOfType<IMySoundBlock>(parlantes);

//for (int i = 0; parlantes.Count > i; i++)
//{
// if (parlantes.Name == NOMBRE_SOUND_BLOCK)
// {
// parlantes.GetActionWithName(“PlaySound”).Apply(parlantes);
// }
//}
}
else
{
Echo(“Porcentaje correcto”);
var luces = SelectorLucesInteriores();
for (int i = 0; i < luces.Count; i++)
{
if (luces.GetValue<Color>(“Color”) == new Color(102, 0, 0))
{
luces.SetValue(“Color”, new Color(255, 255, 255));
}
}
}
}

public string InformacionGeneral()
{
string mensaje;

mensaje = string.Format(“nn{0}”, DateTime.Now);
return mensaje;
}

public IList<IMyInteriorLight> SelectorLucesInteriores()
{
List<IMyTerminalBlock> lista = new List<IMyTerminalBlock>();
GridTerminalSystem.GetBlocksOfType<IMyInteriorLight>(lista);

List<IMyInteriorLight> luces = new List<IMyInteriorLight>();

for (int i = 0; i < lista.Count; i++)
{
var luz = lista as IMyInteriorLight;
luces.Add(luz);
}

return luces;
}

private void EscribirEnPaneles(string nombrePaneles, string mensaje)
{
GridTerminalSystem.GetBlocksOfType<IMyTextPanel>(paneles);
if (paneles.Count > 0)
{
for (int i = 0; i < paneles.Count; i++)
if (paneles.DisplayNameText == nombrePaneles)
{
var panel = paneles as IMyTextPanel;
if (panel == null)
{
throw new Exception(“ha ocurrido un problema al intentar obtener el panel ” + nombrePaneles);
}
else
{
panel.ShowPublicTextOnScreen();
panel.WritePublicText(mensaje);
}
}
}
else
{
throw new Exception(“No hay paneles con el nombre ” + nombrePaneles + ” para escribir el mensaje.”);
}
}

private void EscribirEnPaneles(string nombrePaneles, string mensaje, Color color)
{
GridTerminalSystem.GetBlocksOfType<IMyTextPanel>(paneles);
if (paneles.Count > 0)
{
for (int i = 0; i < paneles.Count; i++)
if (paneles.DisplayNameText == nombrePaneles)
{
var panel = paneles as IMyTextPanel;
if (panel == null)
{
throw new Exception(“Ha ocurrido un problema al intentar obtener el panel ” + nombrePaneles);
}
else
{
panel.SetValue(“FontColor”, color);
panel.WritePublicText(mensaje);
panel.ShowPublicTextOnScreen();
}
}
}
else
{
throw new Exception(“No hay paneles con el nombre ” + nombrePaneles + ” para escribir el mensaje.”);
}
}

SteamSolo.com