diff --git a/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml b/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml index a802605a7..595b40391 100644 --- a/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml +++ b/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml @@ -1243,9 +1243,7 @@ - - diff --git a/Assets/Materials/Orbit Curve.mat b/Assets/Materials/Orbit Curve.mat new file mode 100644 index 000000000..5912c2134 --- /dev/null +++ b/Assets/Materials/Orbit Curve.mat @@ -0,0 +1,98 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Orbit Curve + m_Shader: {fileID: 203, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 0 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 019f08636fbf0e743a83fb33922ea1d4, type: 3} + m_Scale: {x: 4, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _ColorMode: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0 + - _DstBlend: 0 + - _EmissionEnabled: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _InvFade: 1 + - _LightingEnabled: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _ColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} + - _TintColor: {r: 0.39760002, g: 0.4638667, b: 0.497, a: 1} diff --git a/Assets/Materials/Orbit Curve.mat.meta b/Assets/Materials/Orbit Curve.mat.meta new file mode 100644 index 000000000..3e4b30daa --- /dev/null +++ b/Assets/Materials/Orbit Curve.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6540f65a203d4c409d75342582efbd3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Sprites/Flat UI/line.png b/Assets/Resources/Sprites/Flat UI/line.png new file mode 100644 index 000000000..237cbb1f9 --- /dev/null +++ b/Assets/Resources/Sprites/Flat UI/line.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61b04ef10c113714880b245ec31591bc83e764d9386be68a0bfed919c7b6a4b7 +size 2021 diff --git a/Assets/Resources/Sprites/Flat UI/line.png.meta b/Assets/Resources/Sprites/Flat UI/line.png.meta new file mode 100644 index 000000000..71f7f5e02 --- /dev/null +++ b/Assets/Resources/Sprites/Flat UI/line.png.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 019f08636fbf0e743a83fb33922ea1d4 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 6caf356040dd1114691b02ee197c9eb6 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index 81fb9a72e..7e21f5e64 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -3413,6 +3413,7 @@ Transform: m_Children: - {fileID: 548600403} - {fileID: 1956833087} + - {fileID: 1718013116} m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -11180,6 +11181,7 @@ MonoBehaviour: type: 3} CorpMenuContinueButton: {fileID: 148866027} CorpNameInputField: {fileID: 896210412} + OrbitLineRenderer: {fileID: 1718013118} PrimaryTabGroup: {fileID: 143833105} GalaxyTabButton: {fileID: 646091942} ZoneTabButton: {fileID: 618245060} @@ -11215,6 +11217,7 @@ MonoBehaviour: ChildEntityDistance: 0.66 ChildEntityScale: 0.25 ChildEntityOffsetDegrees: 30 + OrbitCircleSegments: 128 --- !u!4 &1126386501 Transform: m_ObjectHideFlags: 0 @@ -16496,6 +16499,148 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1713239317} m_CullTransparentMesh: 0 +--- !u!1 &1718013115 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1718013116} + - component: {fileID: 1718013118} + - component: {fileID: 1718013117} + m_Layer: 0 + m_Name: OrbitCurve + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1718013116 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1718013115} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 435654367} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1718013117 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1718013115} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1281fe44325f9b548aa42dc331b17266, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!120 &1718013118 +LineRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1718013115} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f6540f65a203d4c409d75342582efbd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Positions: + - {x: -2, y: 1, z: 0} + - {x: -1.36923, y: 3.016669, z: 0} + - {x: -0.042671, y: 4.492466, z: 0} + - {x: 3.472713, y: 4.52563, z: 0} + - {x: 4.301812, y: 3.447801, z: 0} + m_Parameters: + serializedVersion: 3 + widthMultiplier: 1 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0.0066223145 + value: 0.06841591 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 0 + numCapVertices: 0 + alignment: 0 + textureMode: 1 + shadowBias: 0.5 + generateLightingData: 0 + m_UseWorldSpace: 1 + m_Loop: 1 --- !u!1 &1723832126 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/ServerShared/Agents/AgentController.cs b/Assets/Scripts/ServerShared/Agents/AgentController.cs deleted file mode 100644 index 0a67c0960..000000000 --- a/Assets/Scripts/ServerShared/Agents/AgentController.cs +++ /dev/null @@ -1,64 +0,0 @@ -// using System; -// using System.Collections; -// using System.Collections.Generic; -// using System.Linq; -// using static Unity.Mathematics.math; -// using Random = Unity.Mathematics.Random; -// -// public class AgentController -// { -// public Guid Entity { get; } -// public EntityAgent EntityAgent { get; } -// public GameContext Context { get; } -// public Guid Zone { get; set; } -// -// private Locomotion _locomotion; -// private VelocityMatch _velocityMatch; -// private Random _random = new Random((uint) (DateTime.Now.Ticks%uint.MaxValue)); -// private Guid _targetOrbit; -// -// public AgentController(GameContext context, Guid zone, Guid entity) -// { -// Entity = entity; -// Zone = zone; -// Context = context; -// EntityAgent = new EntityAgent(context, entity, zone, Guid.Empty); -// _locomotion = new Locomotion(context, entity); -// _velocityMatch = new VelocityMatch(context, entity); -// _velocityMatch.OnMatch += () => -// { -// EntityAgent.CurrentBehavior = _locomotion; -// RandomTarget(); -// }; -// EntityAgent.CurrentBehavior = _locomotion; -// RandomTarget(); -// } -// -// public void Update(float delta) -// { -// EntityAgent.Update(delta); -// // Context.Log( -// // $"Agent Mode: {EntityAgent.CurrentBehavior.GetType()} " + -// // $"Agent Distance: {distance} " + -// // $"Turnaround Distance: {_stoppingDistance + _turnaroundDistance} " + -// // $"Objective: {_objective.Key.ID.ToString().Substring(0, 8)}"); -// var entity = Context.Cache.Get(Entity); -// -// if (EntityAgent.CurrentBehavior == _locomotion) -// { -// var orbitData = Context.Cache.Get(_targetOrbit); -// _velocityMatch.TargetOrbit = _targetOrbit; -// var matchDistanceTime = _velocityMatch.MatchDistanceTime; -// _locomotion.Objective = Context.GetOrbitPosition(_targetOrbit) + Context.GetOrbitVelocity(_targetOrbit) * matchDistanceTime.y; -// var distance = length(_locomotion.Objective - entity.Position); -// if (distance < matchDistanceTime.x) -// EntityAgent.CurrentBehavior = _velocityMatch; -// } -// } -// -// private void RandomTarget() -// { -// var entities = Context.ZonePlanets[Zone]; -// _targetOrbit = Context.Cache.Get(entities[_random.NextInt(entities.Length)]).Orbit; -// } -// } diff --git a/Assets/Scripts/ServerShared/Agents/AgentController.cs.meta b/Assets/Scripts/ServerShared/Agents/AgentController.cs.meta deleted file mode 100644 index 34bd69e4b..000000000 --- a/Assets/Scripts/ServerShared/Agents/AgentController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ee1e3350676acb044bd87c1d76c535a4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Agents/EntityAgent.cs b/Assets/Scripts/ServerShared/Agents/EntityAgent.cs deleted file mode 100644 index 22b5c2f53..000000000 --- a/Assets/Scripts/ServerShared/Agents/EntityAgent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using JsonKnownTypes; -using MessagePack; -using Newtonsoft.Json; - -[MessagePackObject, - JsonObject(MemberSerialization.OptIn), JsonConverter(typeof(JsonKnownTypesConverter))] -public class EntityAgent -{ - [IgnoreMember] public AgentBehavior CurrentBehavior; - [IgnoreMember] public Guid Entity; - [IgnoreMember] public GameContext Context; - [JsonProperty("homeZone"), Key(0)] public Guid HomeZone; - [JsonProperty("homeColony"), Key(0)] public Guid HomeColony; - - public EntityAgent(GameContext context, Guid entity, Guid homeZone, Guid homeColony) - { - Entity = entity; - HomeZone = homeZone; - Context = context; - } - - public void Update(float delta) - { - CurrentBehavior?.Update(delta); - } -} diff --git a/Assets/Scripts/ServerShared/Agents/EntityAgent.cs.meta b/Assets/Scripts/ServerShared/Agents/EntityAgent.cs.meta deleted file mode 100644 index adaa4c787..000000000 --- a/Assets/Scripts/ServerShared/Agents/EntityAgent.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fdefbc1e15541d8448061e9d97e44648 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Agents/StationTowing.cs b/Assets/Scripts/ServerShared/Agents/StationTowing.cs index 5f3071b44..800b742c5 100644 --- a/Assets/Scripts/ServerShared/Agents/StationTowing.cs +++ b/Assets/Scripts/ServerShared/Agents/StationTowing.cs @@ -20,11 +20,11 @@ public class StationTowing : AgentTask [JsonProperty("orbitDistance"), Key(6)] public float OrbitDistance; - public StationTowing(Guid zone, Guid station, Guid orbitParent, float orbitDistance) - { - Zone = zone; - Station = station; - OrbitParent = orbitParent; - OrbitDistance = orbitDistance; - } + // public StationTowing(Guid zone, Guid station, Guid orbitParent, float orbitDistance) + // { + // Zone = zone; + // Station = station; + // OrbitParent = orbitParent; + // OrbitDistance = orbitDistance; + // } } diff --git a/Assets/Scripts/ServerShared/Behaviors/Behaviors.cs b/Assets/Scripts/ServerShared/Behaviors/Behaviors.cs index 3bbe25702..d4c1bbcc3 100644 --- a/Assets/Scripts/ServerShared/Behaviors/Behaviors.cs +++ b/Assets/Scripts/ServerShared/Behaviors/Behaviors.cs @@ -52,7 +52,7 @@ public interface IController bool Available { get; } TaskType TaskType { get; } Guid Zone { get; } - void AssignTask(Guid task, List path); + void AssignTask(Guid task); } [MessagePackObject, diff --git a/Assets/Scripts/ServerShared/Behaviors/Controller.cs b/Assets/Scripts/ServerShared/Behaviors/Controller.cs index 849a82fba..dd6e16d4a 100644 --- a/Assets/Scripts/ServerShared/Behaviors/Controller.cs +++ b/Assets/Scripts/ServerShared/Behaviors/Controller.cs @@ -3,6 +3,9 @@ using System.Collections; using System.Collections.Generic; using MessagePack; using Newtonsoft.Json; +using Unity.Mathematics; +using static Unity.Mathematics.math; +using float2 = Unity.Mathematics.float2; [Union(0, typeof(TowingControllerData))] public abstract class ControllerData : BehaviorData @@ -18,27 +21,171 @@ public abstract class ControllerData : BehaviorData [InspectableField, JsonProperty("tangentSensitivity"), Key(4)] public float TangentSensitivity = 4; + + [InspectableField, JsonProperty("targetDistance"), Key(5)] + public float TargetDistance = 10; } -// public abstract class Controller : IController -// { -// public abstract bool Available { get; } -// public abstract TaskType TaskType { get; } -// public Guid Zone { get; } -// -// private GameContext _context; -// private Entity _entity; -// private Guid _task; -// private List _path; -// -// public Controller(GameContext context, Entity entity) -// { -// -// } -// -// public void AssignTask(Guid task, List path) -// { -// _task = task; -// _path = path; -// } -// } +public abstract class ControllerBase : IBehavior, IController, IInitializableBehavior +{ + public Guid HomeEntity; + public bool Available => Task == Guid.Empty; + public abstract TaskType TaskType { get; } + public Guid Zone => _entity.Zone; + public BehaviorData Data => _controllerData; + + protected Locomotion Locomotion; + protected VelocityMatch VelocityMatch; + protected Func TargetPosition; + protected Func TargetVelocity; + protected bool MatchVelocity; + protected List Path; + protected Guid Task; + + private GameContext _context; + private Entity _entity; + private ControllerData _controllerData; + private MovementPhase _movementPhase; + private bool _moving; + private Action _onFinishMoving; + + public ControllerBase(GameContext context, ControllerData data, Entity entity) + { + _context = context; + _controllerData = data; + _entity = entity; + } + + public void Initialize() + { + Locomotion = new Locomotion(_context, _entity, _controllerData); + VelocityMatch = new VelocityMatch(_context, _entity, _controllerData); + + _context.CorporationControllers[_entity.Corporation].Add(this); + } + + public void AssignTask(Guid task) + { + Task = task; + _moving = false; + } + + public bool Update(float delta) + { + if (Available) + { + // No task is assigned and we're at home, do nothing! + if (_entity.Parent == HomeEntity) + return false; + + // No task is assigned, but we're not home, go home! + var homeEntity = _context.Cache.Get(HomeEntity); + if (!_moving) + { + if (Zone == homeEntity.Zone) MoveTo(homeEntity, true, () => + _context.SetParent(_entity, homeEntity)); + else MoveTo(homeEntity.Zone, () => MoveTo(homeEntity, true, () => + _context.SetParent(_entity, homeEntity))); + } + } + + if (_moving) + { + var distance = length(TargetPosition() - _entity.Position); + if (MatchVelocity) + { + VelocityMatch.TargetVelocity = TargetVelocity(); + if (_movementPhase == MovementPhase.Locomotion) + { + var matchDistanceTime = VelocityMatch.MatchDistanceTime; + Locomotion.Objective = TargetPosition() + TargetVelocity() * matchDistanceTime.y; + Locomotion.Update(delta); + + if (distance < matchDistanceTime.x) + { + _movementPhase = MovementPhase.Slowdown; + _context.Log($"Controller {_entity.Name} has entered slowdown phase."); + VelocityMatch.Clear(); + VelocityMatch.OnMatch += () => + { + _moving = false; + _onFinishMoving(); + }; + } + } + else + { + VelocityMatch.Update(delta); + } + } + else + { + Locomotion.Objective = TargetPosition(); + Locomotion.Update(delta); + if (distance < _controllerData.TargetDistance) + { + _moving = false; + _onFinishMoving(); + } + } + } + + return true; + } + + public void MoveTo(Entity entity, bool matchVelocity = true, Action onFinish = null) + { + TargetPosition = () => entity.Position; + TargetVelocity = () => entity.Velocity; + MatchVelocity = matchVelocity; + _movementPhase = MovementPhase.Locomotion; + _moving = true; + _onFinishMoving = onFinish; + } + + public void MoveTo(float2 position, bool matchVelocity = true, Action onFinish = null) + { + TargetPosition = () => position; + TargetVelocity = () => float2.zero; + MatchVelocity = matchVelocity; + _movementPhase = MovementPhase.Locomotion; + _moving = true; + _onFinishMoving = onFinish; + } + + public void MoveTo(Func position, Func velocity, Action onFinish = null) + { + TargetPosition = position; + TargetVelocity = velocity; + MatchVelocity = true; + _movementPhase = MovementPhase.Locomotion; + _moving = true; + _onFinishMoving = onFinish; + } + + public void MoveTo(Guid zone, Action onFinish = null) + { + var path = _context.FindPath(_context.GalaxyZones[Zone], _context.GalaxyZones[zone]); + + void OnNextZone() + { + path.RemoveAt(0); + if (path.Count > 0) + { + MoveTo(_context.WormholePosition(_entity.Zone, Path[0].ZoneID), false, OnNextZone); + } + else + { + onFinish?.Invoke(); + } + } + + OnNextZone(); + } +} + +public enum MovementPhase +{ + Locomotion, + Slowdown +} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/Behaviors/PatrolController.cs b/Assets/Scripts/ServerShared/Behaviors/PatrolController.cs index 9e38e87bc..1d834feae 100644 --- a/Assets/Scripts/ServerShared/Behaviors/PatrolController.cs +++ b/Assets/Scripts/ServerShared/Behaviors/PatrolController.cs @@ -9,9 +9,6 @@ using static Unity.Mathematics.math; [MessagePackObject, JsonObject(MemberSerialization.OptIn), EntityTypeRestriction(HullType.Ship), Order(-100)] public class PatrolControllerData : ControllerData { - [InspectableField, JsonProperty("targetDistance"), Key(5)] - public float TargetDistance = 10; - public override IBehavior CreateInstance(GameContext context, Entity entity, Gear item) { return new PatrolController(context, this, entity, item); @@ -58,7 +55,7 @@ public class PatrolController : IBehavior, IController, IInitializableBehavior return true; } - public void AssignTask(Guid task, List path) + public void AssignTask(Guid task) { throw new NotImplementedException(); } diff --git a/Assets/Scripts/ServerShared/Behaviors/TowingController.cs b/Assets/Scripts/ServerShared/Behaviors/TowingController.cs index d08b99ccd..c7e5dfbcb 100644 --- a/Assets/Scripts/ServerShared/Behaviors/TowingController.cs +++ b/Assets/Scripts/ServerShared/Behaviors/TowingController.cs @@ -16,156 +16,84 @@ public class TowingControllerData : ControllerData } } -public class TowingController : IBehavior, IPersistentBehavior, IController, IInitializableBehavior +public class TowingController : ControllerBase, IBehavior, IPersistentBehavior { - public TaskType TaskType => TaskType.Tow; - public bool Available => _towingTask != Guid.Empty; - public Guid Zone => _entity.Zone; + public override TaskType TaskType => TaskType.Tow; public BehaviorData Data => _data; private TowingControllerData _data; private GameContext _context; private Entity _entity; private Gear _item; - private Guid _towingTask; - private List _path; - private TowingPhase _towingPhase = TowingPhase.Pickup; - private MovementPhase _movementPhase = MovementPhase.Locomotion; - private Locomotion _locomotion; - private VelocityMatch _velocityMatch; + private bool _taskStarted; - public TowingController(GameContext context, TowingControllerData data, Entity entity, Gear item) + public TowingController(GameContext context, TowingControllerData data, Entity entity, Gear item) : base(context, data, entity) { _context = context; _data = data; _entity = entity; _item = item; } - - public void Initialize() + + public new bool Update(float delta) { - _locomotion = new Locomotion(_context, _entity, _data); - _velocityMatch = new VelocityMatch(_context, _entity, _data); - } - - public bool Update(float delta) - { - var towingTask = _context.Cache.Get(_towingTask); - if (towingTask == null) - return false; - - if (_path.Any()) + var towingTask = _context.Cache.Get(Task); + if (towingTask != null) { - _locomotion.Update(delta); + if(_entity.Parent!=Guid.Empty) + _context.RemoveParent(_entity); - if (length(_entity.Position - _locomotion.Objective) < _context.GlobalData.WarpDistance) + if (!_taskStarted) { - _context.Warp(_entity, _path[0].ZoneID); - _path.RemoveAt(0); - if(_path.Any()) - SetWormholeDestination(); - } - } - else - { - var destination = float2(0); - var velocity = float2(0); - if (_towingPhase == TowingPhase.Pickup) - { - destination = _context.ZoneEntities[_entity.Zone][towingTask.Station].Position; - velocity = _context.ZoneEntities[_entity.Zone][towingTask.Station].Velocity; - } - else - { - var orbitParent = _context.GetOrbitPosition(towingTask.OrbitParent); - var parentToUs = _entity.Position - orbitParent; - var nearestPointInOrbit = orbitParent + normalize(parentToUs) * towingTask.OrbitDistance; - destination = nearestPointInOrbit; - velocity = _context.GetOrbitVelocity(towingTask.OrbitParent); - } - - _velocityMatch.TargetVelocity = velocity; - if (_movementPhase == MovementPhase.Locomotion) - { - var matchDistanceTime = _velocityMatch.MatchDistanceTime; - _locomotion.Objective = destination + velocity * matchDistanceTime.y; - _locomotion.Update(delta); - - var distance = length(destination - _entity.Position); - if (distance < matchDistanceTime.x) + MoveTo(towingTask.Zone, () => { - _movementPhase = MovementPhase.Slowdown; - _velocityMatch.Clear(); - if (_towingPhase == TowingPhase.Pickup) - _velocityMatch.OnMatch += () => + _context.Log($"Towing Controller {_entity.Name} has entered pickup phase."); + MoveTo(_context.Cache.Get(towingTask.Station), true, () => + { + var target = _context.ZoneEntities[_entity.Zone][towingTask.Station] as OrbitalEntity; + _context.SetParent(target, _entity); + _context.Log($"Towing Controller {_entity.Name} has entered delivery phase."); + MoveTo(() => { - var target = _context.ZoneEntities[_entity.Zone][towingTask.Station]; - _context.SetParent(target, _entity); - _towingPhase = TowingPhase.Delivery; - _movementPhase = MovementPhase.Locomotion; - }; - else - _velocityMatch.OnMatch += () => + var orbitParent = _context.GetOrbitPosition(towingTask.OrbitParent); + var parentToUs = _entity.Position - orbitParent; + return orbitParent + normalize(parentToUs) * towingTask.OrbitDistance; + }, () => _context.GetOrbitVelocity(towingTask.OrbitParent), () => { - var target = _context.ZoneEntities[_entity.Zone][towingTask.Station] as OrbitalEntity; _context.RemoveParent(target); + _context.Log($"Towing Controller {_entity.Name} has delivered the target. Returning Home."); var orbit = _context.CreateOrbit(towingTask.OrbitParent, _entity.Position); target.OrbitData = orbit.ID; - }; - } - } - else - { - _velocityMatch.Update(delta); + + Task = Guid.Empty; + _taskStarted = false; + }); + }); + }); + _taskStarted = true; } } - return true; + return base.Update(delta); } public PersistentBehaviorData Store() { return new TowingControllerPersistence { - TowingTask = _towingTask + Task = Task }; } public void Restore(PersistentBehaviorData data) { var towingControllerPersistence = data as TowingControllerPersistence; - _towingTask = towingControllerPersistence.TowingTask; - } - - public void AssignTask(Guid task, List path) - { - _towingTask = task; - _path = path; - _path.RemoveAt(0); - if(_path.Any()) - SetWormholeDestination(); - } - - private void SetWormholeDestination() - { - _locomotion.Objective = _context.WormholePosition(_entity.Zone, _path[0].ZoneID); + Task = towingControllerPersistence.Task; } } public class TowingControllerPersistence : PersistentBehaviorData { - [JsonProperty("towingTask"), Key(0)] - public Guid TowingTask; -} - -public enum TowingPhase -{ - Pickup, - Delivery -} - -public enum MovementPhase -{ - Locomotion, - Slowdown + [JsonProperty("task"), Key(0)] + public Guid Task; } \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/Entity.cs b/Assets/Scripts/ServerShared/Entity.cs index ac210bc88..cab53fb2d 100644 --- a/Assets/Scripts/ServerShared/Entity.cs +++ b/Assets/Scripts/ServerShared/Entity.cs @@ -53,10 +53,11 @@ public abstract class Entity : DatabaseEntry, IMessagePackSerializationCallbackR } - public Entity(GameContext context, Guid hull, IEnumerable items, IEnumerable cargo, Guid zone) + public Entity(GameContext context, Guid hull, IEnumerable items, IEnumerable cargo, Guid zone, Guid corporation) { Context = context; Zone = zone; + Corporation = corporation; EquippedItems = items.ToList(); Cargo = cargo.ToList(); diff --git a/Assets/Scripts/ServerShared/GameContext.cs b/Assets/Scripts/ServerShared/GameContext.cs index 7627b1ab9..b509816ad 100644 --- a/Assets/Scripts/ServerShared/GameContext.cs +++ b/Assets/Scripts/ServerShared/GameContext.cs @@ -134,7 +134,7 @@ public class GameContext } } task.Reserved = true; - nearestController.AssignTask(task.ID, nearestControllerPath); + nearestController.AssignTask(task.ID); } } } @@ -257,7 +257,8 @@ public class GameContext var distance = length(delta); var period = OrbitalPeriod(distance); var phase = atan2(delta.y, delta.x) / (PI * 2); - var storedPhase = (float) frac(Time / -period * GlobalData.OrbitSpeedMultiplier - phase); + var currentPhase = frac(Time / -period * GlobalData.OrbitSpeedMultiplier); + var storedPhase = (float) frac(phase - currentPhase); var orbit = new OrbitData { @@ -644,7 +645,7 @@ public class GameContext if (hullData.HullType == HullType.Ship) { var entity = new Ship(this, hull.ID, gear.Select(g => g.ID), - cargo.Select(c => c.ID).Concat(simpleCargo.Select(c => c.ID)), zone) + cargo.Select(c => c.ID).Concat(simpleCargo.Select(c => c.ID)), zone, corporation) { Name = $"{loadoutData.Name} {Random.NextInt(1,255):X}" }; @@ -671,7 +672,7 @@ public class GameContext Cache.Add(orbit); var entity = new OrbitalEntity(this, hull.ID, gear.Select(g => g.ID), - cargo.Select(c => c.ID).Concat(simpleCargo.Select(c => c.ID)), orbit.ID, zone) + cargo.Select(c => c.ID).Concat(simpleCargo.Select(c => c.ID)), orbit.ID, zone, corporation) { Name = $"{loadoutData.Name} {Random.NextInt(1,255):X}", Temperature = 293 @@ -800,6 +801,7 @@ public class GameContext var parent = Cache.Get(child.Parent); parent.Children.Remove(child.ID); + parent.RecalculateMass(); child.Parent = Guid.Empty; } } \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/OrbitalEntity.cs b/Assets/Scripts/ServerShared/OrbitalEntity.cs index f4f9b41ae..01558c485 100644 --- a/Assets/Scripts/ServerShared/OrbitalEntity.cs +++ b/Assets/Scripts/ServerShared/OrbitalEntity.cs @@ -9,7 +9,7 @@ public class OrbitalEntity : Entity { public Guid OrbitData; - public OrbitalEntity(GameContext context, Guid hull, IEnumerable items, IEnumerable cargo, Guid orbit, Guid zone) : base(context, hull, items, cargo, zone) + public OrbitalEntity(GameContext context, Guid hull, IEnumerable items, IEnumerable cargo, Guid orbit, Guid zone, Guid corporation) : base(context, hull, items, cargo, zone, corporation) { OrbitData = orbit; } diff --git a/Assets/Scripts/ServerShared/Ship.cs b/Assets/Scripts/ServerShared/Ship.cs index 129e39b69..753f17ba5 100644 --- a/Assets/Scripts/ServerShared/Ship.cs +++ b/Assets/Scripts/ServerShared/Ship.cs @@ -19,7 +19,7 @@ public class Ship : Entity // [IgnoreMember] public Dictionary Contacts = new Dictionary(); // [IgnoreMember] public Targetable Target; - public Ship(GameContext context, Guid hull, IEnumerable items, IEnumerable cargo, Guid zone) : base(context, hull, items, cargo, zone) + public Ship(GameContext context, Guid hull, IEnumerable items, IEnumerable cargo, Guid zone, Guid corporation) : base(context, hull, items, cargo, zone, corporation) { } diff --git a/Assets/Scripts/StrategyGameManager.cs b/Assets/Scripts/StrategyGameManager.cs index 933069425..a963ae0b7 100644 --- a/Assets/Scripts/StrategyGameManager.cs +++ b/Assets/Scripts/StrategyGameManager.cs @@ -33,6 +33,7 @@ public class StrategyGameManager : MonoBehaviour public CorporationMenuItem CorpOptionPrefab; public TabButton CorpMenuContinueButton; public TMP_InputField CorpNameInputField; + public LineRenderer OrbitLineRenderer; [Section("Tab Links")] public TabGroup PrimaryTabGroup; @@ -71,6 +72,7 @@ public class StrategyGameManager : MonoBehaviour public float ChildEntityDistance = .66f; public float ChildEntityScale = .25f; public float ChildEntityOffsetDegrees = 30f; + public int OrbitCircleSegments = 128; private DatabaseCache _cache; private GameContext _context; @@ -97,6 +99,10 @@ public class StrategyGameManager : MonoBehaviour private Dictionary _corpOptionMap = new Dictionary(); private CorporationMenuItem _selectedParent; private Dictionary _childEntityPositions = new Dictionary(); + private bool _orbitSelectMode; + private Guid _selectedOrbit = Guid.Empty; + private Guid _selectedTowingTarget = Guid.Empty; + private float _orbitRadius; void Start() { @@ -183,7 +189,9 @@ public class StrategyGameManager : MonoBehaviour Parent = _corpOptionMap[_selectedParent] }; _cache.Add(newCorp); + _context.CorporationControllers[newCorp.ID] = new List(); player.Corporation = newCorp.ID; + _playerCorporation = newCorp.ID; GameMenuRoot.gameObject.SetActive(true); CorpMenuRoot.gameObject.SetActive(false); @@ -198,7 +206,12 @@ public class StrategyGameManager : MonoBehaviour entities.Add(_context.CreateEntity(_selectedZone, newCorp.ID, loadout.Key)); var colony = entities.First(e => e is OrbitalEntity); foreach (var ship in entities.Where(e => e is Ship)) + { + foreach (var controller in ship.GetBehaviors()) + controller.HomeEntity = colony.ID; + _context.SetParent(ship, colony); + } } }; } @@ -232,7 +245,7 @@ public class StrategyGameManager : MonoBehaviour foreach (var entry in zone.Contents) _cache.Add(entry); if(_currentTab==GalaxyTabButton && _selectedZone == zone.Zone.ID) - PopulatePropertiesPanel(_selectedZone); + Select(_selectedZone); if (_currentTab == ZoneTabButton && _populatedZone != zone.Zone.ID) PopulateZone(); }); @@ -256,7 +269,7 @@ public class StrategyGameManager : MonoBehaviour var zone = _cache.Get(_selectedZone); if (_populatedZone != _selectedZone && zone != null) PopulateZone(); - PopulatePropertiesPanel(_populatedZone); + Select(_populatedZone); Camera.transform.position = -Vector3.forward; if (zone != null) Camera.orthographicSize = zone.Radius * ZoneSizeScale; @@ -286,12 +299,36 @@ public class StrategyGameManager : MonoBehaviour else if (_currentTab == ZoneTabButton) { if (data.button == PointerEventData.InputButton.Left) - PopulatePropertiesPanel(_populatedZone); + { + if (_orbitSelectMode) + { + var playerCorp = _cache.Get(_playerCorporation); + var towingTask = new StationTowing + { + Context = _context, + OrbitDistance = _orbitRadius, + OrbitParent = _selectedOrbit, + Priority = 0, + Reserved = false, + Station = _selectedTowingTarget, + Zone = _populatedZone + }; + _cache.Add(towingTask); + playerCorp.Tasks.Add(towingTask.ID); + _orbitSelectMode = false; + OrbitLineRenderer.gameObject.SetActive(false); + } + else + Select(_populatedZone); + } else if (data.button == PointerEventData.InputButton.Right) ShowContextMenu(_populatedZone); } else if (_currentTab == TechTabButton) PopulateTechProperties(); }; + + OrbitLineRenderer.positionCount = OrbitCircleSegments; + OrbitLineRenderer.gameObject.SetActive(false); } private void PopulateGalaxyProperties() @@ -369,7 +406,7 @@ public class StrategyGameManager : MonoBehaviour childGameObject.GetComponent().OnClick += (collider, data) => { if (data.button == PointerEventData.InputButton.Left) - PopulatePropertiesPanel(child); + Select(child); else if (data.button == PointerEventData.InputButton.Right) ShowContextMenu(child); }; @@ -389,7 +426,7 @@ public class StrategyGameManager : MonoBehaviour zoneShip.Icon.GetComponent().OnClick += (collider, data) => { if (data.button == PointerEventData.InputButton.Left) - PopulatePropertiesPanel(ship.ID); + Select(ship.ID); else if (data.button == PointerEventData.InputButton.Right) ShowContextMenu(ship.ID); }; @@ -425,7 +462,7 @@ public class StrategyGameManager : MonoBehaviour zoneOrbital.Icon.GetComponent().OnClick += (collider, data) => { if (data.button == PointerEventData.InputButton.Left) - PopulatePropertiesPanel(orbital.ID); + Select(orbital.ID); else if (data.button == PointerEventData.InputButton.Right) ShowContextMenu(orbital.ID); }; @@ -446,6 +483,22 @@ public class StrategyGameManager : MonoBehaviour Destroy(_zoneOrbitals[orbital].gameObject); _zoneOrbitals.Remove(orbital); } + + if (_orbitSelectMode) + { + var center = _context.GetOrbitPosition(_selectedOrbit) * ZoneSizeScale; + var mousePos = Camera.ScreenToWorldPoint(Input.mousePosition); + var radius = length(float2(mousePos.x, mousePos.y) - center); + _orbitRadius = radius / ZoneSizeScale; + var positions = new Vector3[OrbitCircleSegments]; + for (int i = 0; i < OrbitCircleSegments; i++) + { + var deg = ((float) i) / OrbitCircleSegments * 2 * PI; + positions[i] = float3(float2(sin(deg), cos(deg)) * radius + center, 0); + } + OrbitLineRenderer.gameObject.SetActive(true); + OrbitLineRenderer.SetPositions(positions); + } } } @@ -500,6 +553,20 @@ public class StrategyGameManager : MonoBehaviour }); ContextMenu.AddOption("Test Option 3", () => Debug.Log("Test Option 3 Selected")); } + else if (targetObject is Ship ship) + { + + } + else if (targetObject is OrbitalEntity orbital) + { + ContextMenu.AddOption("Create Towing Task", () => + { + _selectedOrbit = Guid.Empty; + _selectedTowingTarget = orbital.ID; + _orbitSelectMode = true; + OrbitLineRenderer.gameObject.SetActive(true); + }); + } else { ContextMenu.gameObject.SetActive(false); @@ -508,28 +575,35 @@ public class StrategyGameManager : MonoBehaviour ContextMenu.Show(); } - void PopulatePropertiesPanel(Guid clickTarget) + void Select(Guid clickTarget) { var targetObject = _context.Cache.Get(clickTarget); if (targetObject is PlanetData planet) { - PropertiesPanel.Clear(); - PropertiesPanel.Title.text = planet.Name; - if(planet.Belt) - PropertiesPanel.AddSection("Asteroid Belt"); - else - PropertiesPanel.AddSection( - planet.Mass > _context.GlobalData.SunMass ? "Star" : - planet.Mass > _context.GlobalData.GasGiantMass ? "Gas Giant" : - planet.Mass > _context.GlobalData.PlanetMass ? "Planet" : - "Planetoid"); - PropertiesPanel.AddProperty("Mass", () => $"{planet.Mass}"); - PropertiesPanel.AddList("Resources", planet.Resources.Select(resource => + if (_orbitSelectMode) { - var itemData = _context.Cache.Get(resource.Key); - return new Tuple(itemData.Name, $"{resource.Value:0}"); - })); + _selectedOrbit = planet.Orbit; + } + else + { + PropertiesPanel.Clear(); + PropertiesPanel.Title.text = planet.Name; + if(planet.Belt) + PropertiesPanel.AddSection("Asteroid Belt"); + else + PropertiesPanel.AddSection( + planet.Mass > _context.GlobalData.SunMass ? "Star" : + planet.Mass > _context.GlobalData.GasGiantMass ? "Gas Giant" : + planet.Mass > _context.GlobalData.PlanetMass ? "Planet" : + "Planetoid"); + PropertiesPanel.AddProperty("Mass", () => $"{planet.Mass}"); + PropertiesPanel.AddList("Resources", planet.Resources.Select(resource => + { + var itemData = _context.Cache.Get(resource.Key); + return new Tuple(itemData.Name, $"{resource.Value:0}"); + })); + } } if (targetObject is Entity entity) @@ -599,7 +673,7 @@ public class StrategyGameManager : MonoBehaviour CultClient.Send(new ZoneRequestMessage{ZoneID = zone.ZoneID}); if (TestMode) { - PopulatePropertiesPanel(zone.ZoneID); + Select(zone.ZoneID); } _selectedZone = zone.ZoneID; _selectedGalaxyZone = instanceZone; @@ -700,7 +774,7 @@ public class StrategyGameManager : MonoBehaviour planetObject.Icon.GetComponent().OnClick += (collider, data) => { if (data.button == PointerEventData.InputButton.Left) - PopulatePropertiesPanel(planetData.ID); + Select(planetData.ID); else if (data.button == PointerEventData.InputButton.Right) ShowContextMenu(planetData.ID); }; @@ -714,7 +788,7 @@ public class StrategyGameManager : MonoBehaviour beltObject.GetComponent().OnClick += (_, data) => { if (data.button == PointerEventData.InputButton.Left) - PopulatePropertiesPanel(planetData.ID); + Select(planetData.ID); else if (data.button == PointerEventData.InputButton.Right) ShowContextMenu(planetData.ID); }; diff --git a/Economy.Shared.Unity.csproj b/Economy.Shared.Unity.csproj index e802f2137..dcf068551 100644 --- a/Economy.Shared.Unity.csproj +++ b/Economy.Shared.Unity.csproj @@ -62,9 +62,7 @@ - -