Add krakensbane

This commit is contained in:
Yuki Kitagawa 2024-10-31 22:46:27 +08:00
parent dfb439bac7
commit a8ba625bfa

51
src/Craft/Krakensbane.cs Normal file
View File

@ -0,0 +1,51 @@
using System.Diagnostics;
using Godot;
namespace Quadratic.Carto.Craft;
/// <summary>
/// Krakensbane manages the position of its direct descendants, to ensure the
/// focused vessel is not too far from the origin.
/// </summary>
/// <remarks>
/// The name Krakensbane is a legacy of the original KSP module which does the
/// same thing, i.e. preventing floating point errors from causing the vessel
/// to be thrown into deep space.
/// </remarks>
public sealed partial class Krakensbane : Node3D
{
Node3D? focusedVessel = null;
const float maxDistance = 500.0f;
public override void _PhysicsProcess(double delta)
{
Debug.Assert(
focusedVessel == null || focusedVessel.GetParent() == this,
"Focused vessel must be a direct descendant of Krakensbane"
);
if (focusedVessel == null)
{
return;
}
var vesselPosition = focusedVessel.Transform.Origin;
var vesselDistance = vesselPosition.Length();
if (vesselDistance > maxDistance)
{
// Reset the vessel's position to the origin
// TODO: save the total offset; we don't yet have a double-precision vector3
var applyTransform = Transform3D.Identity.Translated(-vesselPosition);
int n_children = GetChildCount();
for (int i = 0; i < n_children; i++)
{
var child = GetChild<Node3D>(i);
child.Transform = applyTransform * child.Transform;
}
GD.Print($"Resetting position; delta = {-vesselPosition}");
}
}
}