Files
abysmal-isle/Scripts/Services/Astronomy/AstronomySystem.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

264 lines
8.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using Server.Items;
namespace Server.Engines.Astronomy
{
public enum TimeCoordinate
{
FiveToEight,
NineToEleven,
Midnight,
OneToFour,
Day
}
public static class AstronomySystem
{
public static bool Enabled = Core.EJ;
public static string FilePath = Path.Combine("Saves/Misc", "Astronomy.bin");
public static readonly int MaxConstellations = 1000;
public static readonly int MaxRA = 24; // zero based 0 - 24, 1 per increment
public static readonly double MaxDEC = 90; // zero based 0 - 90, 0.2 per increment
// testing only. THis needs to be deleted prior to going live.
//public static TimeCoordinate ForceTimeCoordinate { get { return PersonalTelescope.ForceTimeCoordinate; } }
public static int LoadedConstellations { get; set; }
public static List<ConstellationInfo> Constellations { get; set; }
public static List<Tuple<int, int>> InterstellarObjects { get; set; }
public static List<int> DiscoveredConstellations { get; set; }
public static void Configure()
{
if (Enabled)
{
EventSink.WorldSave += OnSave;
EventSink.WorldLoad += OnLoad;
Constellations = new List<ConstellationInfo>();
InterstellarObjects = new List<Tuple<int, int>>();
DiscoveredConstellations = new List<int>();
// comets
for (int i = 0x68D; i <= 0x693; i++)
{
InterstellarObjects.Add(new Tuple<int, int>(i, 1158514));
}
// felucca
for (int i = 0x69F; i <= 0x6A6; i++)
{
InterstellarObjects.Add(new Tuple<int, int>(i, 1158734));
}
// trammel
for (int i = 0x6A7; i <= 0x6AE; i++)
{
InterstellarObjects.Add(new Tuple<int, int>(i, 1158735));
}
// galaxy
for (int i = 0x6AF; i <= 0x6BC; i++)
{
InterstellarObjects.Add(new Tuple<int, int>(i, 1158736));
}
// planet
for (int i = 0x6BD; i <= 0x6CD; i++)
{
InterstellarObjects.Add(new Tuple<int, int>(i, 1158737));
}
}
}
public static void Initialize()
{
if (Enabled && LoadedConstellations < MaxConstellations)
{
CreateConstellations(MaxConstellations - LoadedConstellations);
}
}
private static void CreateConstellations(int amount)
{
var next = TimeCoordinate.FiveToEight;
if (LoadedConstellations > 0)
{
if (Constellations.Where(c => c.TimeCoordinate == TimeCoordinate.FiveToEight).Count() > Constellations.Where(c => c.TimeCoordinate == TimeCoordinate.NineToEleven).Count())
next = TimeCoordinate.NineToEleven;
else if (Constellations.Where(c => c.TimeCoordinate == TimeCoordinate.NineToEleven).Count() > Constellations.Where(c => c.TimeCoordinate == TimeCoordinate.Midnight).Count())
next = TimeCoordinate.Midnight;
else if (Constellations.Where(c => c.TimeCoordinate == TimeCoordinate.Midnight).Count() > Constellations.Where(c => c.TimeCoordinate == TimeCoordinate.OneToFour).Count())
next = TimeCoordinate.OneToFour;
}
for (int i = 0; i < amount; i++)
{
int ra = 0;
double dec = 0.0;
do
{
ra = Utility.RandomMinMax(0, MaxRA);
dec = Utility.RandomMinMax(0, (int)MaxDEC) + Utility.RandomList(.2, .4, .6, .8, .0);
}
while (CheckExists(next, ra, dec));
var info = new ConstellationInfo(next, ra, dec, ConstellationInfo.RandomStarPositions());
Constellations.Add(info);
info.Identifier = Constellations.Count - 1;
switch (next)
{
case TimeCoordinate.FiveToEight: next = TimeCoordinate.NineToEleven; break;
case TimeCoordinate.NineToEleven: next = TimeCoordinate.Midnight; break;
case TimeCoordinate.Midnight: next = TimeCoordinate.OneToFour; break;
case TimeCoordinate.OneToFour: next = TimeCoordinate.FiveToEight; break;
}
}
}
public static void ResetConstellations()
{
ColUtility.Free(Constellations);
LoadedConstellations = 0;
CreateConstellations(MaxConstellations);
Console.WriteLine("Reset Constellations!");
}
public static ConstellationInfo GetConstellation(int id)
{
return Constellations.FirstOrDefault(info => info.Identifier == id);
}
public static ConstellationInfo GetConstellation(TimeCoordinate p, int ra, double dec)
{
return Constellations.FirstOrDefault(c => c.TimeCoordinate == p && c.CoordRA == ra && c.CoordDEC == dec);
}
private static bool CheckExists(TimeCoordinate p, int ra, double dec)
{
return Constellations.Any(c => c.TimeCoordinate == p && c.CoordRA == ra && c.CoordDEC == dec);
}
public static bool CheckNameExists(string name)
{
return Constellations.Any(c => !String.IsNullOrEmpty(c.Name) && c.Name.ToLower() == name.ToLower());
}
public static TimeCoordinate GetTimeCoordinate(IEntity e)
{
int minutes, hours, totalMinutes;
Clock.GetTime(e.Map, e.X, e.Y, out hours, out minutes, out totalMinutes);
if (hours >= 17 && hours < 21)
{
return TimeCoordinate.FiveToEight;
}
if (hours >= 21 && hours < 24)
{
return TimeCoordinate.NineToEleven;
}
if ((hours >= 24 && hours < 1) || hours == 0)
{
return TimeCoordinate.Midnight;
}
if (hours >= 1 && hours <= 4)
{
return TimeCoordinate.OneToFour;
}
return TimeCoordinate.Day;
}
public static int RandomSkyImage(Mobile m)
{
return RandomSkyImage(GetTimeCoordinate(m));
}
public static int RandomSkyImage(TimeCoordinate TimeCoordinate)
{
switch (TimeCoordinate)
{
default: return 0x67E;
case TimeCoordinate.FiveToEight: return 0x67F;
case TimeCoordinate.NineToEleven: return Utility.RandomMinMax(0x680, 0x682);
case TimeCoordinate.Midnight: return 0x686;
case TimeCoordinate.OneToFour: return Utility.RandomMinMax(0x683, 0x685);
}
}
public static Tuple<int, int> GetRandomInterstellarObject()
{
return InterstellarObjects[Utility.Random(InterstellarObjects.Count)];
}
public static int TimeCoordinateLocalization(TimeCoordinate TimeCoordinate)
{
switch (TimeCoordinate)
{
default:
case TimeCoordinate.FiveToEight: return 1158506;
case TimeCoordinate.NineToEleven: return 1158507;
case TimeCoordinate.Midnight: return 1158508;
case TimeCoordinate.OneToFour: return 1158509;
}
}
public static void AddDiscovery(ConstellationInfo info)
{
if (!DiscoveredConstellations.Contains(info.Identifier))
{
DiscoveredConstellations.Add(info.Identifier);
}
}
public static void OnSave(WorldSaveEventArgs e)
{
Persistence.Serialize(
FilePath,
writer =>
{
writer.Write(0);
writer.Write(Constellations.Count);
foreach (var info in Constellations)
{
info.Serialize(writer);
}
});
}
public static void OnLoad()
{
Persistence.Deserialize(
FilePath,
reader =>
{
reader.ReadInt();
LoadedConstellations = reader.ReadInt();
for (int i = 0; i < LoadedConstellations; i++)
{
Constellations.Add(new ConstellationInfo(reader));
}
});
}
}
}