Merge branch 'master' into ed-04-08-2025-upstream-sync

This commit is contained in:
Red
2025-08-04 13:38:49 +03:00
committed by GitHub
144 changed files with 17364 additions and 370055 deletions

View File

@@ -18,13 +18,13 @@ public sealed partial class FTLMapComponent : Component
/// What parallax to use for the background, immediately gets deffered to ParallaxComponent.
/// </summary>
[DataField]
public string Parallax = "CP14Ocean"; //CP14 parallax replacement
public string Parallax = "Sky"; //CP14 parallax replacement
/// <summary>
/// CP14 FTL map ambient color
/// </summary>
[DataField]
public Color AmbientColor = new(34, 90, 122);
public Color AmbientColor = new(47, 51, 54);
/// <summary>
/// Can FTL on this map only be done to beacons.

View File

@@ -1,74 +0,0 @@
using Content.Shared._CP14.Demiplane.Components;
using Content.Shared._CP14.DemiplaneTraveling;
using Content.Shared.DoAfter;
using Content.Shared.Interaction;
using Robust.Shared.Serialization;
namespace Content.Shared._CP14.Demiplane;
public abstract partial class CP14SharedDemiplaneSystem : EntitySystem
{
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14DemiplaneRiftOpenedComponent, InteractHandEvent>(OnDemiplanePasswayInteract);
SubscribeLocalEvent<CP14DemiplaneHintComponent, MapInitEvent>(OnDemiplaneHintMapInit);
}
private void OnDemiplaneHintMapInit(Entity<CP14DemiplaneHintComponent> ent, ref MapInitEvent args)
{
var query = EntityQueryEnumerator<CP14DemiplaneRiftOpenedComponent, TransformComponent>();
var xformHint = Transform(ent);
var hintPos = _transform.GetWorldPosition(xformHint);
while (query.MoveNext(out _, out _, out var xformRift))
{
if (xformRift.MapUid != xformHint.MapUid)
continue;
var riftPos = _transform.GetWorldPosition(xformRift);
//Calculate the rotation
Angle angle = new(riftPos - hintPos);
_transform.SetWorldRotation(ent, angle + Angle.FromDegrees(90));
break;
}
}
private void OnDemiplanePasswayInteract(Entity<CP14DemiplaneRiftOpenedComponent> passway, ref InteractHandEvent args)
{
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager,
args.User,
passway.Comp.DoAfter,
new CP14DemiplanPasswayUseDoAfter(),
args.Target,
args.Target)
{
BreakOnDamage = true,
BreakOnMove = true,
BreakOnHandChange = true,
NeedHand = true,
MovementThreshold = 0.2f,
});
}
public virtual bool TryTeleportIntoDemiplane(Entity<CP14DemiplaneComponent> demiplane, EntityUid? entity)
{
return true;
}
public virtual bool TryTeleportOutDemiplane(Entity<CP14DemiplaneComponent> demiplane, EntityUid? entity)
{
return true;
}
}
[Serializable, NetSerializable]
public sealed partial class CP14DemiplanPasswayUseDoAfter : SimpleDoAfterEvent
{
}

View File

@@ -1,38 +0,0 @@
using Robust.Shared.Audio;
namespace Content.Shared._CP14.Demiplane.Components;
/// <summary>
/// Designates this entity as holding a demiplane.
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
public sealed partial class CP14DemiplaneComponent : Component
{
/// <summary>
/// All entities in the real world that are connected to this demiplane
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public HashSet<EntityUid> ExitPoints = new();
/// <summary>
/// All entities in the demiplane in which the objects entered in the demiplane appear
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public HashSet<EntityUid> EntryPoints = new();
/// <summary>
/// The sound of entering a demiplane, played locally to the player who entered it.
/// Consider more as an intro sound “You have entered the demiplane. Good luck.”
/// </summary>
[DataField("arrivalSound")]
public SoundSpecifier ArrivalSound = new SoundCollectionSpecifier("CP14DemiplaneIntro");
/// <summary>
/// The sound of exiting the demiplane, played locally to the player who exited the demiplane.
/// Consider it more as an ending sound
/// </summary>
[DataField("departureSound")]
public SoundSpecifier DepartureSound = new SoundCollectionSpecifier("CP14DemiplaneIntro");
}

View File

@@ -1,18 +0,0 @@
namespace Content.Shared._CP14.Demiplane.Components;
/// <summary>
/// is automatically delete over time if there are no active stabilizers inside this demiplane.
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem)), AutoGenerateComponentPause]
public sealed partial class CP14DemiplaneDestroyWithoutStabilizationComponent : Component
{
/// <summary>
/// how many time after generation the demiplane cannot be destroyed.
/// </summary>
[DataField]
public TimeSpan ProtectedSpawnTime = TimeSpan.FromMinutes(1);
[DataField]
[AutoPausedField]
public TimeSpan EndProtectionTime = TimeSpan.Zero;
}

View File

@@ -1,22 +0,0 @@
using Content.Shared.Damage;
namespace Content.Shared._CP14.Demiplane.Components;
/// <summary>
/// When closing the demiplane, all entities with this component will be thrown out instead of being deleted.
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
public sealed partial class CP14DemiplaneForceExtractComponent : Component
{
[DataField]
public bool Enabled = true;
[DataField]
public DamageSpecifier ExtractDamage = new()
{
DamageDict = new()
{
{ "Blunt", 111 },
}
};
}

View File

@@ -1,11 +0,0 @@
namespace Content.Shared._CP14.Demiplane.Components;
using Demiplane;
/// <summary>
/// A very small and silly component that simply turns the entity toward the nearest demiplane rift
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
public sealed partial class CP14DemiplaneHintComponent : Component
{
}

View File

@@ -1,29 +0,0 @@
namespace Content.Shared._CP14.Demiplane.Components;
/// <summary>
/// An entity that is the link between the demiplane and the real world. Depending on whether it is in the real world or in the demiplane
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
public sealed partial class CP14DemiplaneRiftComponent : Component
{
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public EntityUid? Demiplane;
/// <summary>
/// Checks if the map on which this rift is initialized is a demiplane to automatically bind to it. QoL thing.
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public bool TryAutoLinkToMap = true;
/// <summary>
/// will this rift become one of the random entry or exit points of the demiplane
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public bool ActiveTeleport = true;
[DataField]
public bool DeleteAfterDisconnect = true;
}

View File

@@ -1,17 +0,0 @@
namespace Content.Shared._CP14.Demiplane.Components;
/// <summary>
/// Keeps the demiplanes from being destroyed while they're in it.
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
public sealed partial class CP14DemiplaneStabilizerComponent : Component
{
/// <summary>
/// must be a being and be alive to work as a stabilizer
/// </summary>
[DataField]
public bool RequireAlive = false;
[DataField]
public bool Enabled = true;
}

View File

@@ -1,38 +0,0 @@
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
namespace Content.Shared._CP14.Demiplane.Components;
/// <summary>
/// Destroy demiplane after time
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause, Access(typeof(CP14SharedDemiplaneSystem))]
public sealed partial class CP14DemiplaneTimedDestructionComponent : Component
{
[DataField]
public TimeSpan TimeToDestruction = TimeSpan.FromSeconds(240f);
[DataField, AutoPausedField]
public TimeSpan EndTime = TimeSpan.Zero;
/// <summary>
/// Countdown audio stream.
/// </summary>
[DataField, AutoNetworkedField]
public EntityUid? Stream = null;
/// <summary>
/// Sound that plays when the demiplane start to collapse.
/// </summary>
[DataField]
public SoundSpecifier Sound = new SoundCollectionSpecifier("ExpeditionEnd")
{
Params = AudioParams.Default.WithVolume(-5),
};
/// <summary>
/// Song selected on MapInit so we can predict the audio countdown properly.
/// </summary>
[DataField]
public SoundPathSpecifier? SelectedSong;
}

View File

@@ -1,12 +0,0 @@
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Demiplane.Prototypes;
/// <summary>
///
/// </summary>
[Prototype("cp14DemiplaneModifierCategory")]
public sealed partial class CP14DemiplaneModifierCategoryPrototype : IPrototype
{
[IdDataField] public string ID { get; } = default!;
}

View File

@@ -1,33 +0,0 @@
using Content.Shared.Destructible.Thresholds;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Demiplane.Prototypes;
/// <summary>
/// A prototype “Special Demiplane” that can appear on the demiplane map as the final room of a chain of demiplanes.
/// It is supposed to be used as a special demiplane with special modifiers, and mining resources and
/// equipment from here is the main task of adventurers
/// </summary>
[Prototype("cp14SpecialDemiplane")]
public sealed partial class CP14SpecialDemiplanePrototype : IPrototype
{
[IdDataField] public string ID { get; } = default!;
/// <summary>
/// The difficulty levels at which this location can be generated.
/// </summary>
[DataField(required: true)]
public MinMax Levels = new(1, 10);
/// <summary>
/// The location config that will be used to generate the demiplane. May be null, and if so, the location will be generated using the default way.
/// </summary>
[DataField]
public ProtoId<CP14DemiplaneLocationPrototype>? Location;
/// <summary>
/// Modifiers that will be automatically added to the demiplane when it is generated.
/// </summary>
[DataField]
public List<ProtoId<CP14DemiplaneModifierPrototype>> Modifiers = new();
}

View File

@@ -1,36 +0,0 @@
using System.Numerics;
using Content.Shared._CP14.Demiplane.Prototypes;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared._CP14.DemiplaneTraveling;
[Serializable, NetSerializable]
public enum CP14DemiplaneMapUiKey
{
Key,
}
[Serializable, NetSerializable]
public sealed class CP14DemiplaneMapUiState(Dictionary<Vector2i, CP14DemiplaneMapNode> nodes, HashSet<(Vector2i, Vector2i)>? edges = null) : BoundUserInterfaceState
{
public Dictionary<Vector2i, CP14DemiplaneMapNode> Nodes = nodes;
public HashSet<(Vector2i, Vector2i)> Edges = edges ?? new();
}
[Serializable, NetSerializable]
public sealed class CP14DemiplaneMapNode(int level, Vector2 uiPosition, bool start, ProtoId<CP14DemiplaneLocationPrototype>? locationConfig = null, List<ProtoId<CP14DemiplaneModifierPrototype>>? modifiers = null)
{
public int Level = level;
public int AdditionalLevel = 0;
public Vector2 UiPosition = uiPosition;
public bool Start = start;
public bool InFrontierZone = false;
public bool InUsing = false;
public bool Completed = start;
public ProtoId<CP14DemiplaneLocationPrototype>? LocationConfig = locationConfig;
public List<ProtoId<CP14DemiplaneModifierPrototype>> Modifiers = modifiers ?? new();
}

View File

@@ -1,30 +0,0 @@
using Content.Shared.Damage;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.DemiplaneTraveling;
/// <summary>
/// Component for opening demiplane map UI and interacting with StationDemiplaneMapComponent
/// </summary>
[RegisterComponent]
public sealed partial class CP14DemiplaneNavigationMapComponent : Component
{
/// <summary>
/// Extracting coordinates from the demiplane node will create this entity and synchronize its modifiers, location and other parameters.
/// </summary>
[DataField]
public EntProtoId KeyProto = "CP14BaseDemiplaneKey";
[DataField]
public SoundSpecifier EjectSound = new SoundPathSpecifier("/Audio/Magic/ethereal_exit.ogg");
[DataField]
public DamageSpecifier RevokeDamage = new()
{
DamageDict = new()
{
{ "Blunt", 100 },
},
};
}

View File

@@ -1,29 +0,0 @@
using Robust.Shared.Audio;
namespace Content.Shared._CP14.DemiplaneTraveling;
/// <summary>
/// teleports a certain number of entities between demiplanes with a delay
/// </summary>
[RegisterComponent, AutoGenerateComponentPause]
public sealed partial class CP14DemiplaneRadiusTimedPasswayComponent : Component
{
[DataField]
public int MaxEntities = 3;
[DataField]
public TimeSpan Delay = TimeSpan.FromSeconds(10f);
[DataField]
public float Radius = 3f;
[DataField]
[AutoPausedField]
public TimeSpan NextTimeTeleport = TimeSpan.Zero;
[DataField("arrivalSound")]
public SoundSpecifier ArrivalSound = new SoundPathSpecifier("/Audio/Effects/teleport_arrival.ogg");
[DataField("departureSound")]
public SoundSpecifier DepartureSound = new SoundPathSpecifier("/Audio/Effects/teleport_departure.ogg");
}

View File

@@ -1,25 +0,0 @@
using Robust.Shared.Audio;
namespace Content.Shared._CP14.DemiplaneTraveling;
/// <summary>
/// if located on an entity with a CP14DemiplanRiftComponent, allows users to move through that rift via an interaction with doAfter
/// </summary>
[RegisterComponent]
public sealed partial class CP14DemiplaneRiftOpenedComponent : Component
{
/// <summary>
/// The number of teleportations this teleporter can make before disappearing. Use the negative number to make infinite.
/// </summary>
[DataField]
public int MaxUse = -1;
[DataField]
public float DoAfter = 4f;
[DataField("arrivalSound")]
public SoundSpecifier ArrivalSound = new SoundPathSpecifier("/Audio/Effects/teleport_arrival.ogg");
[DataField("departureSound")]
public SoundSpecifier DepartureSound = new SoundPathSpecifier("/Audio/Effects/teleport_departure.ogg");
}

View File

@@ -1,29 +0,0 @@
using Robust.Shared.Audio;
namespace Content.Shared._CP14.DemiplaneTraveling;
/// <summary>
/// teleports a certain number of entities to coordinate with a delay
/// </summary>
[RegisterComponent, AutoGenerateComponentPause]
public sealed partial class CP14MonolithTimedPasswayComponent : Component
{
[DataField]
public int MaxEntities = 3;
[DataField]
public TimeSpan Delay = TimeSpan.FromSeconds(10f);
[DataField]
public float Radius = 3f;
[DataField]
[AutoPausedField]
public TimeSpan NextTimeTeleport = TimeSpan.Zero;
[DataField("arrivalSound")]
public SoundSpecifier ArrivalSound = new SoundPathSpecifier("/Audio/Effects/teleport_arrival.ogg");
[DataField("departureSound")]
public SoundSpecifier DepartureSound = new SoundPathSpecifier("/Audio/Effects/teleport_departure.ogg");
}

View File

@@ -1,47 +0,0 @@
using Robust.Shared.Serialization;
namespace Content.Shared._CP14.DemiplaneTraveling;
public abstract partial class CP14SharedStationDemiplaneMapSystem : EntitySystem
{
public static bool NodeInFronrierZone(Dictionary<Vector2i,CP14DemiplaneMapNode> nodes, HashSet<(Vector2i, Vector2i)> edges, Vector2i key)
{
if (!nodes.TryGetValue(key, out var node))
return false;
if (node.Completed || node.Start)
return false;
//return false if no finished or start nodes near
var near = new List<Vector2i>();
foreach (var edge in edges)
{
var node1 = nodes[edge.Item1];
var node2 = nodes[edge.Item2];
if (node1 != node && node2 != node)
continue;
if (node1.Completed || node1.Start || node2.Completed || node2.Start)
{
return true;
}
}
return false;
}
}
[Serializable, NetSerializable]
public sealed class CP14DemiplaneMapEjectMessage(Vector2i position) : BoundUserInterfaceMessage
{
public readonly Vector2i Position = position;
}
[Serializable, NetSerializable]
public sealed class CP14DemiplaneMapRevokeMessage(Vector2i position) : BoundUserInterfaceMessage
{
public readonly Vector2i Position = position;
}

View File

@@ -1,22 +0,0 @@
using Content.Shared.Destructible.Thresholds;
namespace Content.Shared._CP14.DemiplaneTraveling;
/// <summary>
/// A station component that stores information about the current map of demiplanes, their research status and relationships.
/// </summary>
[RegisterComponent]
public sealed partial class CP14StationDemiplaneMapComponent : Component
{
[DataField]
public Dictionary<Vector2i, CP14DemiplaneMapNode> Nodes = new();
[DataField]
public HashSet<(Vector2i, Vector2i)> Edges = new();
/// <summary>
/// Count of special rooms that can be generated in the demiplane map.
/// </summary>
[DataField]
public MinMax Specials = new(30, 30);
}

View File

@@ -19,6 +19,9 @@ public sealed partial class CP14SpellConsumeManaEffect : CP14SpellEffect
var targetEntity = args.Target.Value;
if (!entManager.HasComponent<CP14MagicEnergyContainerComponent>(targetEntity))
return;
var magicEnergy = entManager.System<SharedCP14MagicEnergySystem>();
//First - used object

View File

@@ -1,26 +0,0 @@
using Content.Shared._CP14.Demiplane;
using Content.Shared._CP14.Demiplane.Components;
namespace Content.Shared._CP14.MagicSpell.Spells;
public sealed partial class CP14SpellDemiplaneInfiltration : CP14SpellEffect
{
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
{
if (args.User is null)
return;
if (!entManager.TryGetComponent<CP14DemiplaneRiftComponent>(args.Target, out var rift))
return;
if (rift.Demiplane is null)
return;
if (!entManager.TryGetComponent<CP14DemiplaneComponent>(rift.Demiplane.Value, out var demiplane))
return;
var demiplaneSystem = entManager.System<CP14SharedDemiplaneSystem>();
demiplaneSystem.TryTeleportIntoDemiplane((rift.Demiplane.Value, demiplane), args.User.Value);
}
}

View File

@@ -4,7 +4,7 @@ using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.ModularCraft.Components;
/// <summary>
/// Adds all details to the item when initializing. This is useful for spawning modular items directly when mapping or as loot in demiplanes.
/// Adds all details to the item when initializing. This is useful for spawning modular items directly when mapping or as loot in dungeons
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedModularCraftSystem))]
public sealed partial class CP14ModularCraftAutoAssembleComponent : Component

View File

@@ -0,0 +1,19 @@
using Content.Shared.Maps;
using Content.Shared.Parallax.Biomes;
using Content.Shared.Tag;
using Robust.Shared.Prototypes;
namespace Content.Shared.Procedural.DungeonLayers;
[Virtual]
public partial class CP14BiomeDunGen : IDunGenLayer
{
[DataField(required: true)]
public ProtoId<BiomeTemplatePrototype> BiomeTemplate;
/// <summary>
/// creates a biome only on the specified tiles
/// </summary>
[DataField]
public HashSet<ProtoId<ContentTileDefinition>>? TileMask;
}

View File

@@ -0,0 +1,11 @@
using Content.Shared.Maps;
using Content.Shared.Parallax.Biomes;
using Content.Shared.Tag;
using Robust.Shared.Prototypes;
namespace Content.Shared.Procedural.DungeonLayers;
[Virtual]
public partial class CP14ReserveGrid : IDunGenLayer
{
}

View File

@@ -4,13 +4,13 @@ using Content.Shared.Tag;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Shared._CP14.Demiplane.Prototypes;
namespace Content.Shared._CP14.Procedural.Prototypes;
/// <summary>
/// procedural location template. The answer to the question “Where” as far as the combinatorics of the expedition is concerned.
/// procedural location template. The answer to the question “Where” as far as the combinatorics of the generation is concerned.
/// </summary>
[Prototype("cp14DemiplaneLocation")]
public sealed partial class CP14DemiplaneLocationPrototype : IPrototype
[Prototype("cp14Location")]
public sealed partial class CP14ProceduralLocationPrototype : IPrototype
{
[IdDataField] public string ID { get; } = default!;
@@ -18,13 +18,22 @@ public sealed partial class CP14DemiplaneLocationPrototype : IPrototype
/// The difficulty levels at which this location can be generated.
/// </summary>
[DataField]
public MinMax Levels = new(1, 10);
public MinMax Levels = new(0, 10);
[DataField(required: true)]
public ProtoId<DungeonConfigPrototype> LocationConfig;
/// <summary>
/// Components that will be automatically added to the demiplane when it is generated
/// This modifier will be added to all adjacent connected locations leading to this location.
/// </summary>
[DataField(required: true)]
public ProtoId<CP14ProceduralModifierPrototype> Connection;
[DataField]
public float GenerationProb = 1f;
/// <summary>
/// Components that will be automatically added to the location map when it is generated
/// </summary>
[DataField]
public ComponentRegistry Components = new();
@@ -34,13 +43,4 @@ public sealed partial class CP14DemiplaneLocationPrototype : IPrototype
/// </summary>
[DataField]
public List<ProtoId<TagPrototype>> Tags = new();
[DataField]
public LocId? Name;
[DataField]
public float ExamineProb = 0.75f;
[DataField]
public SpriteSpecifier? Icon = null;
}

View File

@@ -0,0 +1,12 @@
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Procedural.Prototypes;
/// <summary>
///
/// </summary>
[Prototype("cp14LocationModifierCategory")]
public sealed partial class CP14ProceduralModifierCategoryPrototype : IPrototype
{
[IdDataField] public string ID { get; } = default!;
}

View File

@@ -3,13 +3,13 @@ using Content.Shared.Procedural;
using Content.Shared.Tag;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Demiplane.Prototypes;
namespace Content.Shared._CP14.Procedural.Prototypes;
/// <summary>
/// Demiplane modifier prototype. The answer to the question “Which” in terms of the combinatorics of demiplane generation is
/// Location modifier prototype. The answer to the question “What's inside" from the point of view of the combinatorics of creating locations
/// </summary>
[Prototype("cp14DemiplaneModifier")]
public sealed partial class CP14DemiplaneModifierPrototype : IPrototype
[Prototype("cp14LocationModifier")]
public sealed partial class CP14ProceduralModifierPrototype : IPrototype
{
[IdDataField] public string ID { get; } = default!;
@@ -23,7 +23,7 @@ public sealed partial class CP14DemiplaneModifierPrototype : IPrototype
/// Each modifier belongs to specific categories. Used by the generator to determine what to generate
/// </summary>
[DataField]
public Dictionary<ProtoId<CP14DemiplaneModifierCategoryPrototype>, float> Categories = new();
public Dictionary<ProtoId<CP14ProceduralModifierCategoryPrototype>, float> Categories = new();
/// <summary>
/// How often can this modifier be generated? Determined by weight from all modifiers available for the location
@@ -40,10 +40,10 @@ public sealed partial class CP14DemiplaneModifierPrototype : IPrototype
public float GenerationProb = 1f;
/// <summary>
/// Can this modifier be generated multiple times within a single demiplane?
/// Can this modifier be generated multiple times within a single location?
/// </summary>
[DataField]
public bool Unique = true;
public bool Unique = false;
/// <summary>
/// Generation layers that will be added to the location generation after the main layers.
@@ -71,7 +71,4 @@ public sealed partial class CP14DemiplaneModifierPrototype : IPrototype
[DataField]
public LocId? Name;
[DataField]
public float ExamineProb = 0.75f;
}