2021-01-15 20:07:39 +00:00
|
|
|
using System;
|
|
|
|
|
using System.Linq;
|
2026-06-21 09:37:54 +01:00
|
|
|
using float2 = Unity.Mathematics.float2;
|
|
|
|
|
using float3 = Unity.Mathematics.float3;
|
|
|
|
|
using int2 = Unity.Mathematics.int2;
|
2021-01-15 20:07:39 +00:00
|
|
|
|
2026-06-14 20:40:13 +01:00
|
|
|
public static class EntityConstructionBlueprintProjector
|
2021-01-15 20:07:39 +00:00
|
|
|
{
|
2026-06-14 20:40:13 +01:00
|
|
|
public static EntityConstructionBlueprint CaptureBlueprint(Entity entity)
|
2021-01-15 20:07:39 +00:00
|
|
|
{
|
2026-06-14 20:40:13 +01:00
|
|
|
EntityConstructionBlueprint blueprint;
|
2021-03-13 03:23:58 +00:00
|
|
|
if (entity is OrbitalEntity orbital)
|
2026-06-14 20:40:13 +01:00
|
|
|
blueprint = new OrbitalEntityConstructionBlueprint
|
2021-03-14 03:56:49 +00:00
|
|
|
{
|
2026-06-16 16:07:20 +01:00
|
|
|
OrbitKey = orbital.OrbitKey,
|
2021-05-02 20:59:45 +01:00
|
|
|
SecurityLevel = orbital.SecurityLevel,
|
|
|
|
|
SecurityRadius = orbital.SecurityRadius
|
2021-03-14 03:56:49 +00:00
|
|
|
};
|
|
|
|
|
else if (entity is Ship ship)
|
2026-06-14 20:40:13 +01:00
|
|
|
blueprint = new ShipConstructionBlueprint
|
2021-03-14 03:56:49 +00:00
|
|
|
{
|
2026-06-21 09:37:54 +01:00
|
|
|
Position = AetheriaMath.ToUnity(ship.CultPosition),
|
|
|
|
|
Direction = AetheriaMath.ToUnity(ship.CultDirection),
|
2021-03-15 11:40:46 +00:00
|
|
|
IsPlayerShip = ship.IsPlayerShip
|
2021-03-14 03:56:49 +00:00
|
|
|
};
|
2026-06-13 18:06:59 +01:00
|
|
|
else throw new ArgumentException("Attempted to capture an instance of abstract class Entity!");
|
2021-03-15 11:40:46 +00:00
|
|
|
|
2026-06-13 18:06:59 +01:00
|
|
|
blueprint.Settings = entity.Settings;
|
2021-01-15 20:07:39 +00:00
|
|
|
|
2026-06-13 18:06:59 +01:00
|
|
|
blueprint.Hull = entity.Hull;
|
|
|
|
|
blueprint.Name = entity.Name;
|
2026-06-16 10:01:02 +01:00
|
|
|
blueprint.FactionKey = entity.Faction?.FactionKey ?? "";
|
2026-06-13 18:06:59 +01:00
|
|
|
blueprint.Equipment = entity.Equipment.Select(e => (e.Position, e.EquippableItem)).ToArray();
|
|
|
|
|
blueprint.CargoBays = entity.CargoBays.Select(e => (e.Position, e.EquippableItem)).ToArray();
|
|
|
|
|
blueprint.DockingBays = entity.DockingBays.Select(e => (e.Position, e.EquippableItem)).ToArray();
|
|
|
|
|
blueprint.DockingBayAssignments = entity.DockingBays.Select(x => entity.Children.IndexOf(x.DockedShip)).ToArray();
|
|
|
|
|
blueprint.CargoContents = entity.CargoBays.Select(b => b.Cargo.Select(i => (i.Value, i.Key)).ToArray()).ToArray();
|
|
|
|
|
blueprint.DockingBayContents = entity.DockingBays.Select(b => b.Cargo.Select(i => (i.Value, i.Key)).ToArray()).ToArray();
|
|
|
|
|
blueprint.Children = entity.Children.Select(CaptureBlueprint).ToArray();
|
|
|
|
|
blueprint.WeaponGroups = entity.WeaponGroups.Select(wg => wg.items.Select(item => entity.Equipment.IndexOf(item)).ToArray()).ToArray();
|
|
|
|
|
return blueprint;
|
2021-01-15 20:07:39 +00:00
|
|
|
}
|
|
|
|
|
|
2026-06-21 09:37:54 +01:00
|
|
|
public static Entity InstantiateAuthoritativeFromBlueprint(ItemManager itemManager, Zone zone, EntityConstructionBlueprint blueprint)
|
|
|
|
|
{
|
|
|
|
|
return BuildFromBlueprint(itemManager, zone, blueprint, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Entity ProjectObservedFromBlueprint(ItemManager itemManager, Zone zone, EntityConstructionBlueprint blueprint)
|
|
|
|
|
{
|
|
|
|
|
return BuildFromBlueprint(itemManager, zone, blueprint, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Entity BuildFromBlueprint(ItemManager itemManager, Zone zone, EntityConstructionBlueprint blueprint, bool instantiate)
|
2021-03-13 03:23:58 +00:00
|
|
|
{
|
2026-06-13 18:06:59 +01:00
|
|
|
blueprint.Settings ??= itemManager.GameplaySettings.DefaultEntitySettings.Copy();
|
|
|
|
|
return blueprint switch
|
2021-03-13 03:23:58 +00:00
|
|
|
{
|
2026-06-21 09:37:54 +01:00
|
|
|
ShipConstructionBlueprint shipBlueprint => BuildFromBlueprint(itemManager, zone, shipBlueprint, instantiate),
|
|
|
|
|
OrbitalEntityConstructionBlueprint orbitalBlueprint => BuildFromBlueprint(itemManager, zone, orbitalBlueprint, instantiate),
|
2021-03-13 03:23:58 +00:00
|
|
|
_ => null
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-14 03:56:49 +00:00
|
|
|
|
2026-06-21 09:37:54 +01:00
|
|
|
private static Ship BuildFromBlueprint(ItemManager itemManager, Zone zone, ShipConstructionBlueprint blueprint, bool instantiate)
|
2021-01-15 20:07:39 +00:00
|
|
|
{
|
2021-03-15 11:40:46 +00:00
|
|
|
|
2026-06-13 18:06:59 +01:00
|
|
|
var entity = new Ship(itemManager, zone, instantiate ? (EquippableItem) itemManager.Instantiate(blueprint.Hull) : blueprint.Hull, blueprint.Settings);
|
|
|
|
|
Restore(itemManager, zone, blueprint, entity, instantiate);
|
2026-06-21 09:37:54 +01:00
|
|
|
entity.CultPosition = AetheriaMath.ToCult(blueprint.Position);
|
|
|
|
|
entity.CultDirection = AetheriaMath.ToCult(blueprint.Direction);
|
2026-06-13 18:06:59 +01:00
|
|
|
entity.IsPlayerShip = blueprint.IsPlayerShip;
|
2021-01-15 20:07:39 +00:00
|
|
|
return entity;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-21 09:37:54 +01:00
|
|
|
private static OrbitalEntity BuildFromBlueprint(ItemManager itemManager, Zone zone, OrbitalEntityConstructionBlueprint blueprint, bool instantiate)
|
2021-01-15 20:07:39 +00:00
|
|
|
{
|
2026-06-16 16:07:20 +01:00
|
|
|
var entity = new OrbitalEntity(itemManager, zone, instantiate ? (EquippableItem) itemManager.Instantiate(blueprint.Hull) : blueprint.Hull, blueprint.OrbitKey, blueprint.Settings);
|
2026-06-13 18:06:59 +01:00
|
|
|
Restore(itemManager, zone, blueprint, entity, instantiate);
|
|
|
|
|
entity.SecurityLevel = blueprint.SecurityLevel;
|
|
|
|
|
entity.SecurityRadius = blueprint.SecurityRadius;
|
|
|
|
|
if (blueprint.Story >= 0) entity.Story = zone.GalaxyZone.Locations[blueprint.Story];
|
2021-01-15 20:07:39 +00:00
|
|
|
return entity;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-14 20:40:13 +01:00
|
|
|
private static void Restore(ItemManager itemManager, Zone zone, EntityConstructionBlueprint blueprint, Entity entity, bool instantiate = false)
|
2021-01-15 20:07:39 +00:00
|
|
|
{
|
2026-06-13 18:06:59 +01:00
|
|
|
entity.Name = blueprint.Name;
|
2026-06-15 17:32:19 +01:00
|
|
|
entity.Faction = ResolveFaction(zone?.Galaxy, blueprint);
|
2026-06-13 18:06:59 +01:00
|
|
|
entity.Children = blueprint.Children.Select(c =>
|
2021-01-15 20:07:39 +00:00
|
|
|
{
|
2026-06-21 09:37:54 +01:00
|
|
|
var child = BuildFromBlueprint(itemManager, zone, c, instantiate);
|
2021-01-15 20:07:39 +00:00
|
|
|
child.Parent = entity;
|
2021-03-14 03:56:49 +00:00
|
|
|
return child;
|
2021-01-15 20:07:39 +00:00
|
|
|
}).ToList();
|
2026-06-13 18:06:59 +01:00
|
|
|
foreach (var (position, item) in blueprint.Equipment) entity.TryEquip(instantiate ? (EquippableItem) itemManager.Instantiate(item) : item, position);
|
|
|
|
|
foreach (var (position, item) in blueprint.CargoBays) entity.TryEquip(instantiate ? (EquippableItem) itemManager.Instantiate(item) : item, position);
|
|
|
|
|
foreach (var (position, item) in blueprint.DockingBays) entity.TryEquip(instantiate ? (EquippableItem) itemManager.Instantiate(item) : item, position);
|
2021-01-15 20:07:39 +00:00
|
|
|
|
2026-06-13 18:06:59 +01:00
|
|
|
for (var i = 0; i < blueprint.DockingBayAssignments.Length; i++)
|
2021-01-15 20:07:39 +00:00
|
|
|
{
|
2026-06-13 18:06:59 +01:00
|
|
|
if (blueprint.DockingBayAssignments[i] != -1)
|
|
|
|
|
entity.DockingBays[i].DockedShip = entity.Children[blueprint.DockingBayAssignments[i]] as Ship;
|
2021-01-15 20:07:39 +00:00
|
|
|
}
|
|
|
|
|
|
2026-06-13 18:06:59 +01:00
|
|
|
for (var bayIndex = 0; bayIndex < blueprint.CargoContents.Length; bayIndex++)
|
2021-02-26 19:01:47 +00:00
|
|
|
if(entity.CargoBays.Count >= bayIndex + 1)
|
2026-06-13 18:06:59 +01:00
|
|
|
foreach (var (position, item) in blueprint.CargoContents[bayIndex])
|
2021-02-26 19:01:47 +00:00
|
|
|
entity.CargoBays[bayIndex].TryStore(instantiate ? itemManager.Instantiate(item) : item, position);
|
2021-01-15 20:07:39 +00:00
|
|
|
|
2026-06-13 18:06:59 +01:00
|
|
|
for (var bayIndex = 0; bayIndex < blueprint.DockingBayContents.Length; bayIndex++)
|
2021-02-26 19:01:47 +00:00
|
|
|
if(entity.DockingBays.Count >= bayIndex + 1)
|
2026-06-13 18:06:59 +01:00
|
|
|
foreach (var (position, item) in blueprint.DockingBayContents[bayIndex])
|
2021-02-26 19:01:47 +00:00
|
|
|
entity.DockingBays[bayIndex].TryStore(instantiate ? itemManager.Instantiate(item) : item, position);
|
2021-01-15 20:07:39 +00:00
|
|
|
|
2026-06-13 18:06:59 +01:00
|
|
|
entity.WeaponGroups = blueprint.WeaponGroups.Select(itemIndices =>
|
2021-05-02 20:59:45 +01:00
|
|
|
{
|
|
|
|
|
var items = itemIndices.Select(i => entity.Equipment[i]);
|
|
|
|
|
return (items.Select(i => i.GetBehavior<Weapon>()).ToList(), items.ToList());
|
|
|
|
|
}).ToArray();
|
2021-01-15 20:07:39 +00:00
|
|
|
}
|
2026-06-15 17:32:19 +01:00
|
|
|
|
|
|
|
|
private static Faction ResolveFaction(Galaxy galaxy, EntityConstructionBlueprint blueprint)
|
|
|
|
|
{
|
|
|
|
|
return galaxy == null
|
|
|
|
|
? null
|
2026-06-16 10:01:02 +01:00
|
|
|
: galaxy.ResolveFactionByKey(blueprint.FactionKey);
|
2026-06-15 17:32:19 +01:00
|
|
|
}
|
2021-03-13 03:23:58 +00:00
|
|
|
}
|
|
|
|
|
|
2026-06-14 20:40:13 +01:00
|
|
|
public class ShipConstructionBlueprint : EntityConstructionBlueprint
|
2021-03-14 03:56:49 +00:00
|
|
|
{
|
2026-06-13 08:18:30 +01:00
|
|
|
public float3 Position;
|
|
|
|
|
public float2 Direction;
|
|
|
|
|
public bool IsPlayerShip;
|
2021-03-14 03:56:49 +00:00
|
|
|
}
|
2021-03-13 03:23:58 +00:00
|
|
|
|
2026-06-14 20:40:13 +01:00
|
|
|
public class OrbitalEntityConstructionBlueprint : EntityConstructionBlueprint
|
2021-03-13 03:23:58 +00:00
|
|
|
{
|
2026-06-16 16:07:20 +01:00
|
|
|
public string OrbitKey = "";
|
2026-06-13 08:18:30 +01:00
|
|
|
public int Story = -1;
|
|
|
|
|
public SecurityLevel SecurityLevel;
|
|
|
|
|
public float SecurityRadius;
|
2021-03-13 03:23:58 +00:00
|
|
|
}
|
|
|
|
|
|
2026-06-14 20:40:13 +01:00
|
|
|
public abstract class EntityConstructionBlueprint
|
2021-03-13 03:23:58 +00:00
|
|
|
{
|
2026-06-13 08:18:30 +01:00
|
|
|
public string Name;
|
|
|
|
|
public EquippableItem Hull;
|
|
|
|
|
public (int2 position, EquippableItem item)[] Equipment;
|
|
|
|
|
public (int2 position, EquippableItem item)[] CargoBays;
|
|
|
|
|
public (int2 position, EquippableItem item)[] DockingBays;
|
|
|
|
|
public int[] DockingBayAssignments;
|
|
|
|
|
public (int2 position, ItemInstance item)[][] CargoContents;
|
|
|
|
|
public (int2 position, ItemInstance item)[][] DockingBayContents;
|
2026-06-14 20:40:13 +01:00
|
|
|
public EntityConstructionBlueprint[] Children;
|
2026-06-13 08:18:30 +01:00
|
|
|
public EntitySettings Settings;
|
2026-06-15 17:32:19 +01:00
|
|
|
public string FactionKey;
|
2026-06-13 08:18:30 +01:00
|
|
|
public int[][] WeaponGroups;
|
2021-03-18 22:48:33 +00:00
|
|
|
|
2021-03-13 03:23:58 +00:00
|
|
|
private int _price;
|
2021-01-19 01:22:56 +00:00
|
|
|
|
|
|
|
|
public int Price(ItemManager itemManager)
|
|
|
|
|
{
|
2021-03-14 03:56:49 +00:00
|
|
|
if (_price != 0) return _price;
|
|
|
|
|
|
2026-06-14 05:56:41 +01:00
|
|
|
_price = itemManager.GetPrice(Hull);
|
2021-03-14 03:56:49 +00:00
|
|
|
|
|
|
|
|
foreach (var (_, item) in Equipment)
|
2021-01-19 01:22:56 +00:00
|
|
|
{
|
2026-06-14 05:56:41 +01:00
|
|
|
_price += itemManager.GetPrice(item);
|
2021-03-14 03:56:49 +00:00
|
|
|
}
|
|
|
|
|
foreach (var (_, item) in CargoBays)
|
|
|
|
|
{
|
2026-06-14 05:56:41 +01:00
|
|
|
_price += itemManager.GetPrice(item);
|
2021-03-14 03:56:49 +00:00
|
|
|
}
|
|
|
|
|
foreach (var (_, item) in DockingBays)
|
|
|
|
|
{
|
2026-06-14 05:56:41 +01:00
|
|
|
_price += itemManager.GetPrice(item);
|
2021-03-14 03:56:49 +00:00
|
|
|
}
|
2021-01-19 01:22:56 +00:00
|
|
|
|
2021-03-14 03:56:49 +00:00
|
|
|
foreach (var t in CargoContents)
|
|
|
|
|
{
|
|
|
|
|
foreach (var (_, item) in t)
|
2021-01-19 01:22:56 +00:00
|
|
|
{
|
2026-06-14 05:56:41 +01:00
|
|
|
_price += itemManager.GetPrice(item);
|
2021-01-19 01:22:56 +00:00
|
|
|
}
|
2021-03-14 03:56:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var t in DockingBayContents)
|
|
|
|
|
{
|
|
|
|
|
foreach (var (_, item) in t)
|
2021-01-19 01:22:56 +00:00
|
|
|
{
|
2026-06-14 05:56:41 +01:00
|
|
|
_price += itemManager.GetPrice(item);
|
2021-01-19 01:22:56 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _price;
|
|
|
|
|
}
|
2021-01-15 20:07:39 +00:00
|
|
|
}
|