2026-08-10 14:57:50 +01:00
|
|
|
|
using System;
|
2021-01-25 05:53:36 +00:00
|
|
|
|
using System.Collections;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using TMPro;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using UnityEngine.UI;
|
2026-09-14 17:39:12 +02:00
|
|
|
|
using CultMath;
|
2021-03-05 14:31:18 +00:00
|
|
|
|
using UnityEngine.Serialization;
|
2026-09-14 17:39:12 +02:00
|
|
|
|
using static CultMath.math;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
|
|
|
|
|
|
public class SchematicDisplay : MonoBehaviour
|
|
|
|
|
|
{
|
2021-01-05 02:56:17 +00:00
|
|
|
|
public GameSettings Settings;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
public Prototype ListElementPrototype;
|
|
|
|
|
|
|
2021-03-04 03:58:46 +00:00
|
|
|
|
public Color HeaderElementEnabledColor;
|
|
|
|
|
|
public Color HeaderElementDisabledColor;
|
|
|
|
|
|
|
2021-03-07 01:10:31 +00:00
|
|
|
|
public GameObject OverrideIcon;
|
|
|
|
|
|
public float OverrideIconBlinkSpeed;
|
2021-03-06 01:04:26 +00:00
|
|
|
|
public GameObject ShieldIcon;
|
2021-03-04 03:58:46 +00:00
|
|
|
|
public Image HeatsinkBackground;
|
|
|
|
|
|
|
2020-12-31 19:53:16 +00:00
|
|
|
|
public TextMeshProUGUI EnergyLabel;
|
|
|
|
|
|
public TextMeshProUGUI CockpitTemperatureLabel;
|
|
|
|
|
|
public TextMeshProUGUI RadiatorTemperatureLabel;
|
2021-04-14 03:29:14 +01:00
|
|
|
|
public TextMeshProUGUI HeatStorageTemperatureLabel;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
public TextMeshProUGUI CargoTemperatureLabel;
|
|
|
|
|
|
public TextMeshProUGUI VisibilityLabel;
|
|
|
|
|
|
public TextMeshProUGUI HullDurabilityLabel;
|
2021-01-11 02:56:37 +00:00
|
|
|
|
public TextMeshProUGUI DistanceLabel;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
|
2021-03-21 01:55:25 +00:00
|
|
|
|
public RectTransform SensorCooldownFill;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
public RectTransform EnergyFill;
|
|
|
|
|
|
public RectTransform HullDurabilityFill;
|
|
|
|
|
|
public RectTransform HeatstrokeMeterFill;
|
2021-04-10 01:47:16 +01:00
|
|
|
|
public RectTransform HypothermiaMeterFill;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
public RectTransform HeatstrokeLimitFill;
|
|
|
|
|
|
|
2021-01-11 02:56:37 +00:00
|
|
|
|
private Entity _entity;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
private EquippableItem _hull;
|
|
|
|
|
|
private Radiator[] _radiators;
|
|
|
|
|
|
private Cockpit _cockpit;
|
|
|
|
|
|
private Reactor _reactor;
|
|
|
|
|
|
private Capacitor[] _capacitors;
|
2021-03-05 14:31:18 +00:00
|
|
|
|
private HeatStorage[] _heatStorages;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
private EquippedCargoBay[] _cargoBays;
|
|
|
|
|
|
private SchematicDisplayItem[] _schematicItems;
|
|
|
|
|
|
|
2021-01-11 02:56:37 +00:00
|
|
|
|
private bool _enemy;
|
|
|
|
|
|
private Entity _player;
|
|
|
|
|
|
|
2020-12-31 19:53:16 +00:00
|
|
|
|
public SchematicDisplayItem[] SchematicItems
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return _schematicItems; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public class SchematicDisplayItem
|
|
|
|
|
|
{
|
2026-10-13 18:17:14 +02:00
|
|
|
|
// The true item: the selection mark's key and, on the player's own ship, the live gear. Never classifies an enemy row.
|
2020-12-31 19:53:16 +00:00
|
|
|
|
public EquippedItem Item;
|
2026-10-13 18:17:14 +02:00
|
|
|
|
// The class the row shows: the claim the player's book holds for an enemy row, the item's own data on the player's ship.
|
|
|
|
|
|
public EquippableItemData Claimed;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
public SchematicListElement ListElement;
|
|
|
|
|
|
public IProgressBehavior Cooldown;
|
2021-01-25 05:53:36 +00:00
|
|
|
|
// public ItemUsage ItemUsage;
|
|
|
|
|
|
public Weapon Weapon;
|
2020-12-31 19:53:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2021-01-11 02:56:37 +00:00
|
|
|
|
public void ShowShip(Entity entity, Entity player = null)
|
2020-12-31 19:53:16 +00:00
|
|
|
|
{
|
2021-01-11 02:56:37 +00:00
|
|
|
|
_enemy = player != null;
|
|
|
|
|
|
_player = player;
|
2026-10-13 07:13:55 +02:00
|
|
|
|
ReturnRows();
|
2021-01-11 02:56:37 +00:00
|
|
|
|
|
|
|
|
|
|
_entity = entity;
|
2026-10-13 07:13:55 +02:00
|
|
|
|
if (VisibilityLabel)
|
|
|
|
|
|
VisibilityLabel.gameObject.SetActive(!_enemy);
|
2021-01-11 02:56:37 +00:00
|
|
|
|
if (!_enemy)
|
|
|
|
|
|
{
|
|
|
|
|
|
_cockpit = entity.GetBehavior<Cockpit>();
|
|
|
|
|
|
_reactor = entity.GetBehavior<Reactor>();
|
|
|
|
|
|
_capacitors = entity.GetBehaviors<Capacitor>().ToArray();
|
|
|
|
|
|
|
|
|
|
|
|
_radiators = entity.GetBehaviors<Radiator>().ToArray();
|
|
|
|
|
|
if (_radiators.Length == 0)
|
|
|
|
|
|
RadiatorTemperatureLabel.text = "N/A";
|
|
|
|
|
|
|
2021-03-05 14:31:18 +00:00
|
|
|
|
_heatStorages = entity.GetBehaviors<HeatStorage>().ToArray();
|
|
|
|
|
|
if (_heatStorages.Length == 0)
|
|
|
|
|
|
HeatStorageTemperatureLabel.text = "N/A";
|
2021-01-11 02:56:37 +00:00
|
|
|
|
|
|
|
|
|
|
_cargoBays = entity.CargoBays.ToArray();
|
|
|
|
|
|
if (_cargoBays.Length == 0)
|
|
|
|
|
|
CargoTemperatureLabel.text = "N/A";
|
|
|
|
|
|
}
|
2020-12-31 19:53:16 +00:00
|
|
|
|
|
2026-10-13 18:17:14 +02:00
|
|
|
|
BuildRows(WeaponRows());
|
2026-10-13 07:13:55 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static bool IsWeapon(EquippedItem item) => item.Behaviors.Any(b => b.Data is WeaponData);
|
|
|
|
|
|
|
2026-10-13 18:17:14 +02:00
|
|
|
|
// An enemy schematic lists what `_player` believes the ship's weapons are: the weapon reveals of the player's book on
|
|
|
|
|
|
// it (Entity.RevealedWeapons), in book order (ruling reveal-ends-on-perception), each shown as the class it claimed
|
|
|
|
|
|
// (aetheria-ew, classify-from-belief), never the ship's live gear. The player's own schematic is its equipment, each
|
|
|
|
|
|
// row its own data; there is nothing to doubt about your own ship.
|
|
|
|
|
|
private IEnumerable<(EquippedItem Item, EquippableItemData Claimed)> WeaponRows() =>
|
|
|
|
|
|
_enemy
|
|
|
|
|
|
? _player.RevealedWeapons(_entity).Select(r => (r.Item, r.Claimed))
|
|
|
|
|
|
: _entity.Equipment.Where(IsWeapon).Select(item => (item, item.Data));
|
2026-10-13 07:13:55 +02:00
|
|
|
|
|
|
|
|
|
|
private void ReturnRows()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_schematicItems == null) return;
|
|
|
|
|
|
foreach (var item in _schematicItems)
|
|
|
|
|
|
item.ListElement.GetComponent<Prototype>().ReturnToPool();
|
|
|
|
|
|
_schematicItems = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-13 18:17:14 +02:00
|
|
|
|
private void BuildRows(IEnumerable<(EquippedItem Item, EquippableItemData Claimed)> rows)
|
2026-10-13 07:13:55 +02:00
|
|
|
|
{
|
2026-10-13 18:17:14 +02:00
|
|
|
|
_schematicItems = rows
|
2020-12-31 19:53:16 +00:00
|
|
|
|
.Select(x => new SchematicDisplayItem
|
|
|
|
|
|
{
|
2026-10-13 18:17:14 +02:00
|
|
|
|
Item = x.Item,
|
|
|
|
|
|
Claimed = x.Claimed,
|
2020-12-31 19:53:16 +00:00
|
|
|
|
ListElement = ListElementPrototype.Instantiate<SchematicListElement>(),
|
2026-10-13 18:17:14 +02:00
|
|
|
|
Cooldown = _enemy ? null : (IProgressBehavior) x.Item.Behaviors.FirstOrDefault(b=> b is IProgressBehavior),
|
2021-01-25 05:53:36 +00:00
|
|
|
|
// ItemUsage = _enemy ? null : (ItemUsage) x.Behaviors.FirstOrDefault(b=> b is ItemUsage),
|
2026-10-13 18:17:14 +02:00
|
|
|
|
Weapon = _enemy ? null : (Weapon) x.Item.Behaviors.FirstOrDefault(b=>b is Weapon)
|
2020-12-31 19:53:16 +00:00
|
|
|
|
})
|
|
|
|
|
|
.ToArray();
|
|
|
|
|
|
foreach (var x in _schematicItems)
|
|
|
|
|
|
{
|
2026-10-13 18:17:14 +02:00
|
|
|
|
if(x.Claimed is WeaponItemData weaponItemData)
|
2026-08-10 14:57:50 +01:00
|
|
|
|
x.ListElement.ShowWeapon(weaponItemData);
|
2021-03-20 04:20:17 +00:00
|
|
|
|
//x.ListElement.Label.text = x.Item.EquippableItem.Name;
|
2021-01-11 02:56:37 +00:00
|
|
|
|
if (!_enemy)
|
|
|
|
|
|
{
|
Replace the Database Tools with the Studio and cut Unity over
Cut 8b. The Unity project compiles with 0 errors in 6000.3.24f1 batchmode.
Packages: manifest.json pins org.gamecult.cultlib at cultlib-unity-v1.0.57
and org.gamecult.caching.unity at caching-unity-v1.2.0, next to the 8a
CultMath tag. Aetheria.Shared.Unity references GameCult.CultLib and keeps
noEngineReferences.
The Database Tools (Assets/Scripts/CultCache/Editor) are deleted in this
commit, alongside their five ported drawers in
Assets/Scripts/Editor/CultCacheDrawers.cs, each an
[CultInspectorDrawer] ICultInspectorDrawer:
- InspectableType: popup of the attribute type's [Union] member names,
writing the string.
- InspectableColor: float3 and float4 through ColorField.
- InspectableAnimationCurve: float4[] and BezierCurve through CurveField.
- InspectableTemperature: Kelvin, Celsius and Fahrenheit fields over one
value.
- InspectableSchematicShape: size and cell toggles. The old drawer also
drew the item's schematic texture and tinted hull hardpoints, which need
the parent document. The tagged Studio hands a drawer only the value, so
those wait on the Studio exposing the open record.
Unity call sites:
- ActionGameManager opens the catalog through AetheriaStores; Cut 10 adds
the run and player stores.
- Refs resolve through ItemManager.GetData or Get(ref); orbit, planet and
belt maps key by CultRecordKey; identity is compared by reference or key.
- The PlayerSettings.msgpack reader and writer, which Cut 10 deletes, pass
CultDocumentMessagePackSerialization.OptionsFor, since the embedded run
reaches CultMath values and refs. Keyboard layouts need no resolver and
keep MessagePack's defaults until Cut 10.
- The input map uses the nested action to binding shape.
- PropertiesPanel reads CultInspectorRangeAttribute.
- NameTools loses its legacy name-file writer.
- Slime compares serialized settings instead of the deleted SHA1 helper.
- FieldDriver drops InspectorHeader.
- .gitignore covers the test project's build output.
Builds: Aetheria.Shared, AetherDb, Aetheria.Shared.Tests (6/6), Unity
batchmode (0 errors).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 19:15:20 +02:00
|
|
|
|
x.ListElement.InfiniteAmmoIcon.gameObject.SetActive(!x.Weapon.WeaponData.AmmoType.IsSet());
|
|
|
|
|
|
x.ListElement.AmmoLabel.gameObject.SetActive(x.Weapon.WeaponData.AmmoType.IsSet());
|
2020-12-31 19:53:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Update()
|
|
|
|
|
|
{
|
2021-01-11 02:56:37 +00:00
|
|
|
|
if (_entity != null)
|
2020-12-31 19:53:16 +00:00
|
|
|
|
{
|
2021-01-11 02:56:37 +00:00
|
|
|
|
if (!_enemy)
|
2020-12-31 19:53:16 +00:00
|
|
|
|
{
|
2026-08-10 14:57:50 +01:00
|
|
|
|
OverrideIcon.SetActive(_entity.OverrideShutdown && cos(Time.time * OverrideIconBlinkSpeed) > 0);
|
|
|
|
|
|
ShieldIcon.SetActive(_entity.Shield!=null && _entity.Shield.Item.Active.Value);
|
|
|
|
|
|
if (_radiators.Length == 1)
|
|
|
|
|
|
RadiatorTemperatureLabel.text = $"{((int)(_radiators[0].RadiatorTemperature - 273.15f)).ToString()}°C";
|
|
|
|
|
|
else if (_radiators.Length > 1)
|
2021-01-11 02:56:37 +00:00
|
|
|
|
RadiatorTemperatureLabel.text =
|
2026-08-10 14:57:50 +01:00
|
|
|
|
$"{((int)(_radiators.Min(r => r.RadiatorTemperature) - 273.15f)).ToString()}-" +
|
|
|
|
|
|
$"{((int)(_radiators.Max(r => r.RadiatorTemperature) - 273.15f)).ToString()}°C";
|
|
|
|
|
|
HeatsinkBackground.color = _entity.HeatsinksEnabled ? HeaderElementEnabledColor : HeaderElementDisabledColor;
|
2021-01-11 02:56:37 +00:00
|
|
|
|
|
2021-03-05 14:31:18 +00:00
|
|
|
|
if (_heatStorages.Length == 1)
|
2026-08-10 14:57:50 +01:00
|
|
|
|
HeatStorageTemperatureLabel.text = $"{((int)(_heatStorages[0].Item.Temperature - 273.15f)).ToString()}°C";
|
2021-03-05 14:31:18 +00:00
|
|
|
|
else if (_heatStorages.Length > 1)
|
|
|
|
|
|
HeatStorageTemperatureLabel.text =
|
2026-08-10 14:57:50 +01:00
|
|
|
|
$"{((int)(_heatStorages.Min(r => r.Item.Temperature) - 273.15f)).ToString()}-" +
|
|
|
|
|
|
$"{((int)(_heatStorages.Max(r => r.Item.Temperature) - 273.15f)).ToString()}°C";
|
2021-01-11 02:56:37 +00:00
|
|
|
|
|
|
|
|
|
|
if (_cargoBays.Length == 1)
|
2026-08-10 14:57:50 +01:00
|
|
|
|
CargoTemperatureLabel.text = $"{((int)(_cargoBays[0].Temperature - 273.15f)).ToString()}°C";
|
2021-01-11 02:56:37 +00:00
|
|
|
|
else if (_cargoBays.Length > 1)
|
|
|
|
|
|
CargoTemperatureLabel.text =
|
2026-08-10 14:57:50 +01:00
|
|
|
|
$"{((int)(_cargoBays.Min(r => r.Temperature) - 273.15f)).ToString()}-" +
|
|
|
|
|
|
$"{((int)(_cargoBays.Max(r => r.Temperature) - 273.15f)).ToString()}°C";
|
2021-01-11 02:56:37 +00:00
|
|
|
|
|
2021-03-10 09:18:07 +00:00
|
|
|
|
if(_cockpit != null)
|
|
|
|
|
|
{
|
2026-08-10 14:57:50 +01:00
|
|
|
|
CockpitTemperatureLabel.text = $"{((int) (_cockpit.Item.Temperature - 273.15f)).ToString()}°C";
|
2021-01-11 02:56:37 +00:00
|
|
|
|
|
2026-08-10 14:57:50 +01:00
|
|
|
|
HeatstrokeMeterFill.anchorMax = new Vector2(_entity.Heatstroke, 1);
|
|
|
|
|
|
HypothermiaMeterFill.anchorMax = new Vector2(_entity.Hypothermia, 1);
|
|
|
|
|
|
HeatstrokeLimitFill.anchorMax = new Vector2(unlerp(Settings.GameplaySettings.HypothermiaTemperature, Settings.GameplaySettings.HeatstrokeTemperature, _cockpit.Item.Temperature), 1);
|
2021-03-10 09:18:07 +00:00
|
|
|
|
}
|
2021-01-11 02:56:37 +00:00
|
|
|
|
|
2026-08-10 14:57:50 +01:00
|
|
|
|
SensorCooldownFill.anchorMax = new Vector2(_entity.Sensor?.Cooldown ?? 0, 1);
|
2021-03-21 01:55:25 +00:00
|
|
|
|
|
2026-08-10 14:57:50 +01:00
|
|
|
|
if (_capacitors.Length == 0)
|
2021-01-11 02:56:37 +00:00
|
|
|
|
{
|
|
|
|
|
|
EnergyFill.anchorMax = Vector2.up;
|
2026-08-10 14:57:50 +01:00
|
|
|
|
EnergyLabel.text = ActionGameManager.PlayerSettings.Format(_reactor.Draw);
|
2021-01-11 02:56:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2026-08-10 14:57:50 +01:00
|
|
|
|
var charge = _capacitors.Sum(x => x.Charge);
|
|
|
|
|
|
var maxCharge = _capacitors.Sum(x => x.Capacity);
|
|
|
|
|
|
EnergyFill.anchorMax = new Vector2(charge / maxCharge, 1);
|
|
|
|
|
|
EnergyLabel.text = $"{((int)charge).ToString()}/{((int)maxCharge).ToString()} + ({((int)_reactor.Draw).ToString()})";
|
2021-01-11 02:56:37 +00:00
|
|
|
|
}
|
2020-12-31 19:53:16 +00:00
|
|
|
|
}
|
2021-05-07 19:51:23 +01:00
|
|
|
|
// else
|
|
|
|
|
|
// {
|
|
|
|
|
|
// DistanceLabel.text = $"{(int)length(_entity.Position - _player.Position)}";
|
|
|
|
|
|
// }
|
2020-12-31 19:53:16 +00:00
|
|
|
|
|
2026-10-13 07:13:55 +02:00
|
|
|
|
// A reveal gained or ended after selection changes the rows with no event to hook: rebuild when the
|
|
|
|
|
|
// revealed weapon set differs from the rows' items.
|
2026-10-13 18:17:14 +02:00
|
|
|
|
if (_enemy && !WeaponRows().SequenceEqual(_schematicItems.Select(x => (x.Item, x.Claimed))))
|
2026-10-13 07:13:55 +02:00
|
|
|
|
{
|
|
|
|
|
|
ReturnRows();
|
2026-10-13 18:17:14 +02:00
|
|
|
|
BuildRows(WeaponRows());
|
2026-10-13 07:13:55 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-09-19 13:02:54 +02:00
|
|
|
|
// Cut 2 (docs/fire-control-cut.md): marks whichever row is the player's current aim point.
|
|
|
|
|
|
// Re-checked every frame (not just on ShowShip) because ResolvedTargetItem can drop on its own
|
|
|
|
|
|
// as info decays, with no event to hook.
|
|
|
|
|
|
if (_enemy && _schematicItems != null)
|
|
|
|
|
|
foreach (var x in _schematicItems)
|
|
|
|
|
|
x.ListElement.SetSelected(x.Item == _player.ResolvedTargetItem);
|
|
|
|
|
|
|
2026-10-13 07:13:55 +02:00
|
|
|
|
if(VisibilityLabel && !_enemy)
|
2026-08-10 14:57:50 +01:00
|
|
|
|
VisibilityLabel.text = ((int)_entity.Visibility).ToString();
|
2021-01-11 02:56:37 +00:00
|
|
|
|
|
2026-08-10 14:57:50 +01:00
|
|
|
|
if(HullDurabilityFill)
|
2021-05-07 19:51:23 +01:00
|
|
|
|
{
|
2026-08-10 14:57:50 +01:00
|
|
|
|
_hull = _entity.Hull;
|
|
|
|
|
|
var hullData = _entity.ItemManager.GetData(_hull);
|
|
|
|
|
|
var dur = _hull.Durability / hullData.Durability;
|
|
|
|
|
|
HullDurabilityFill.anchorMax = new Vector2(dur, 1);
|
|
|
|
|
|
HullDurabilityLabel.text = $"{ActionGameManager.PlayerSettings.Format(dur * 100)}%";
|
2021-05-07 19:51:23 +01:00
|
|
|
|
}
|
2021-01-11 02:56:37 +00:00
|
|
|
|
|
2020-12-31 19:53:16 +00:00
|
|
|
|
foreach (var x in _schematicItems)
|
|
|
|
|
|
{
|
2021-01-11 02:56:37 +00:00
|
|
|
|
if (!_enemy)
|
2020-12-31 19:53:16 +00:00
|
|
|
|
{
|
2026-08-10 14:57:50 +01:00
|
|
|
|
var itemData = _entity.ItemManager.GetData(x.Item.EquippableItem);
|
|
|
|
|
|
x.ListElement.HeatFill.anchorMax = new Vector2(unlerp(itemData.MinimumTemperature, itemData.MaximumTemperature, x.Item.Temperature), 0);
|
2021-01-11 02:56:37 +00:00
|
|
|
|
if (x.Cooldown != null)
|
|
|
|
|
|
x.ListElement.CooldownFill.anchorMax = new Vector2(x.Cooldown.Progress, 1);
|
2026-08-10 14:57:50 +01:00
|
|
|
|
x.ListElement.DurabilityLabel.text = $"{(int)(x.Item.EquippableItem.Durability / itemData.Durability * 100)}%";
|
Replace the Database Tools with the Studio and cut Unity over
Cut 8b. The Unity project compiles with 0 errors in 6000.3.24f1 batchmode.
Packages: manifest.json pins org.gamecult.cultlib at cultlib-unity-v1.0.57
and org.gamecult.caching.unity at caching-unity-v1.2.0, next to the 8a
CultMath tag. Aetheria.Shared.Unity references GameCult.CultLib and keeps
noEngineReferences.
The Database Tools (Assets/Scripts/CultCache/Editor) are deleted in this
commit, alongside their five ported drawers in
Assets/Scripts/Editor/CultCacheDrawers.cs, each an
[CultInspectorDrawer] ICultInspectorDrawer:
- InspectableType: popup of the attribute type's [Union] member names,
writing the string.
- InspectableColor: float3 and float4 through ColorField.
- InspectableAnimationCurve: float4[] and BezierCurve through CurveField.
- InspectableTemperature: Kelvin, Celsius and Fahrenheit fields over one
value.
- InspectableSchematicShape: size and cell toggles. The old drawer also
drew the item's schematic texture and tinted hull hardpoints, which need
the parent document. The tagged Studio hands a drawer only the value, so
those wait on the Studio exposing the open record.
Unity call sites:
- ActionGameManager opens the catalog through AetheriaStores; Cut 10 adds
the run and player stores.
- Refs resolve through ItemManager.GetData or Get(ref); orbit, planet and
belt maps key by CultRecordKey; identity is compared by reference or key.
- The PlayerSettings.msgpack reader and writer, which Cut 10 deletes, pass
CultDocumentMessagePackSerialization.OptionsFor, since the embedded run
reaches CultMath values and refs. Keyboard layouts need no resolver and
keep MessagePack's defaults until Cut 10.
- The input map uses the nested action to binding shape.
- PropertiesPanel reads CultInspectorRangeAttribute.
- NameTools loses its legacy name-file writer.
- Slime compares serialized settings instead of the deleted SHA1 helper.
- FieldDriver drops InspectorHeader.
- .gitignore covers the test project's build output.
Builds: Aetheria.Shared, AetherDb, Aetheria.Shared.Tests (6/6), Unity
batchmode (0 errors).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 19:15:20 +02:00
|
|
|
|
if (x.Weapon.WeaponData.AmmoType.IsSet())
|
2021-01-11 02:56:37 +00:00
|
|
|
|
{
|
2026-08-10 14:57:50 +01:00
|
|
|
|
if(x.Weapon.WeaponData.MagazineSize > 1)
|
2021-01-25 05:53:36 +00:00
|
|
|
|
x.ListElement.AmmoLabel.text = x.Weapon.Ammo.ToString();
|
|
|
|
|
|
else
|
Replace the Database Tools with the Studio and cut Unity over
Cut 8b. The Unity project compiles with 0 errors in 6000.3.24f1 batchmode.
Packages: manifest.json pins org.gamecult.cultlib at cultlib-unity-v1.0.57
and org.gamecult.caching.unity at caching-unity-v1.2.0, next to the 8a
CultMath tag. Aetheria.Shared.Unity references GameCult.CultLib and keeps
noEngineReferences.
The Database Tools (Assets/Scripts/CultCache/Editor) are deleted in this
commit, alongside their five ported drawers in
Assets/Scripts/Editor/CultCacheDrawers.cs, each an
[CultInspectorDrawer] ICultInspectorDrawer:
- InspectableType: popup of the attribute type's [Union] member names,
writing the string.
- InspectableColor: float3 and float4 through ColorField.
- InspectableAnimationCurve: float4[] and BezierCurve through CurveField.
- InspectableTemperature: Kelvin, Celsius and Fahrenheit fields over one
value.
- InspectableSchematicShape: size and cell toggles. The old drawer also
drew the item's schematic texture and tinted hull hardpoints, which need
the parent document. The tagged Studio hands a drawer only the value, so
those wait on the Studio exposing the open record.
Unity call sites:
- ActionGameManager opens the catalog through AetheriaStores; Cut 10 adds
the run and player stores.
- Refs resolve through ItemManager.GetData or Get(ref); orbit, planet and
belt maps key by CultRecordKey; identity is compared by reference or key.
- The PlayerSettings.msgpack reader and writer, which Cut 10 deletes, pass
CultDocumentMessagePackSerialization.OptionsFor, since the embedded run
reaches CultMath values and refs. Keyboard layouts need no resolver and
keep MessagePack's defaults until Cut 10.
- The input map uses the nested action to binding shape.
- PropertiesPanel reads CultInspectorRangeAttribute.
- NameTools loses its legacy name-file writer.
- Slime compares serialized settings instead of the deleted SHA1 helper.
- FieldDriver drops InspectorHeader.
- .gitignore covers the test project's build output.
Builds: Aetheria.Shared, AetherDb, Aetheria.Shared.Tests (6/6), Unity
batchmode (0 errors).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 19:15:20 +02:00
|
|
|
|
x.ListElement.AmmoLabel.text = _entity.CountItemsInCargo(x.Weapon.WeaponData.AmmoType.Key).ToString();
|
2021-01-11 02:56:37 +00:00
|
|
|
|
}
|
2020-12-31 19:53:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-13 18:17:14 +02:00
|
|
|
|
// The range label: the live range on the player's own ship, the claimed design's rated range on an enemy row
|
|
|
|
|
|
// (ew-claim-weapon-measure-ruled; the observer never sees a target weapon's quality, wear or power).
|
|
|
|
|
|
if (x.ListElement.RangeLabel)
|
2020-12-31 19:53:16 +00:00
|
|
|
|
{
|
2026-10-13 18:17:14 +02:00
|
|
|
|
var range = _enemy ? x.Claimed.Behaviors.OfType<WeaponData>().First().RatedRange : x.Weapon.Range;
|
|
|
|
|
|
x.ListElement.RangeLabel.text = ((int) range).ToString();
|
2020-12-31 19:53:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|