109 lines
4.7 KiB
C#
109 lines
4.7 KiB
C#
using Sandbox.ModAPI.Ingame;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using VRage.Game.GUI.TextPanel;
|
|
using VRageMath;
|
|
|
|
namespace IngameScript
|
|
{
|
|
partial class Program
|
|
{
|
|
public class AirMonitorDisplay
|
|
{
|
|
private class ZoneRow
|
|
{
|
|
public AirZone Zone { get; private set; }
|
|
public MySprite Name { get; private set; }
|
|
public MySprite Level; // { get; private set; }
|
|
public MySprite Triggered { get; private set; }
|
|
|
|
public ZoneRow(RectangleF viewport, AirZone zone, float yPosition, float scale)
|
|
{
|
|
float xIncrement = viewport.Size.X / 3;
|
|
Zone = zone;
|
|
Name = new MySprite(SpriteType.TEXT, Zone.Name, new Vector2(0, yPosition) + viewport.Position, null, Color.White, "Debug", TextAlignment.LEFT, scale);
|
|
Level = new MySprite(SpriteType.TEXT, "----", new Vector2(xIncrement, yPosition) + viewport.Position, null, Color.White, "Debug", TextAlignment.LEFT, scale);
|
|
Triggered = new MySprite(SpriteType.TEXTURE, "Danger", new Vector2(xIncrement * 2, yPosition) + viewport.Position, new Vector2(32f, 32f), Color.White, null, TextAlignment.CENTER, 0f);
|
|
}
|
|
}
|
|
|
|
private IMyTextSurface _surface;
|
|
private List<MySprite> _staticSprites = new List<MySprite>();
|
|
private List<ZoneRow> _rows = new List<ZoneRow>();
|
|
private float _scale = 1f;
|
|
|
|
public AirMonitorDisplay(IMyTextSurface surface, List<AirZone> zones)
|
|
{
|
|
// Setup draw surface
|
|
_surface = surface;
|
|
_surface.ScriptBackgroundColor = new Color(0, 0, 0, 255);
|
|
_surface.ContentType = ContentType.SCRIPT;
|
|
_surface.Script = "";
|
|
buildSprites(zones);
|
|
}
|
|
|
|
public void Draw()
|
|
{
|
|
if (_surface.FontSize != _scale) {
|
|
_scale = _surface.FontSize;
|
|
|
|
// Is it worth it to save this list? Maybe, but we don't anticipate
|
|
// this changing often at all.
|
|
List<AirZone> zones = new List<AirZone>();
|
|
foreach (ZoneRow row in _rows) {
|
|
zones.Add(row.Zone);
|
|
}
|
|
buildSprites(zones);
|
|
}
|
|
|
|
MySpriteDrawFrame frame = _surface.DrawFrame();
|
|
|
|
foreach (MySprite sprite in _staticSprites)
|
|
{
|
|
frame.Add(sprite);
|
|
}
|
|
|
|
// for (int i=0; i < _rows.Count; i++)
|
|
foreach (ZoneRow row in _rows)
|
|
{
|
|
|
|
frame.Add(row.Name);
|
|
row.Level.Data = row.Zone.OxygenLevel.ToString("P2");
|
|
frame.Add(row.Level);
|
|
if (row.Zone.Triggered) frame.Add(row.Triggered);
|
|
}
|
|
frame.Dispose();
|
|
}
|
|
|
|
private void buildSprites(List<AirZone> zones)
|
|
{
|
|
RectangleF viewport = new RectangleF(
|
|
(_surface.TextureSize - _surface.SurfaceSize) / 2f,
|
|
_surface.SurfaceSize
|
|
);
|
|
|
|
// build static sprites
|
|
float yPosition = 0f;
|
|
float xIncrement = viewport.Size.X / 3;
|
|
// float scale = 500 / Math.Min(viewport.Size.X, viewport.Size.Y);
|
|
|
|
_staticSprites.Clear();
|
|
|
|
_staticSprites.Add(new MySprite(SpriteType.TEXT, "OXYGEN REPORT", new Vector2(viewport.Size.X / 2, yPosition) + viewport.Position, null, Color.White, "Debug", TextAlignment.CENTER, 1.25f * _scale)); // title
|
|
yPosition += 30f;
|
|
_staticSprites.Add(new MySprite(SpriteType.TEXT, "ZONE", new Vector2(0, yPosition) + viewport.Position, null, Color.Blue, "Debug", TextAlignment.LEFT, 1.2f * _scale)); // title
|
|
_staticSprites.Add(new MySprite(SpriteType.TEXT, "O2 LEVEL", new Vector2(xIncrement, yPosition) + viewport.Position, null, Color.Blue, "Debug", TextAlignment.LEFT, 1.2f * _scale)); // title
|
|
_staticSprites.Add(new MySprite(SpriteType.TEXT, "STATUS", new Vector2(xIncrement * 2, yPosition) + viewport.Position, null, Color.Blue, "Debug", TextAlignment.LEFT, 1.2f * _scale)); // title
|
|
yPosition += 30f;
|
|
|
|
// build dynamic sprites
|
|
_rows.Clear();
|
|
foreach (AirZone zone in zones)
|
|
{
|
|
_rows.Add(new ZoneRow(viewport, zone, yPosition, _scale));
|
|
yPosition += 30f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |