Пример #1
0
        private void MatchBoundarySizeToMapSize(EncounterLayerData encounterLayerData)
        {
            EncounterBoundaryChunkGameLogic encounterBoundaryChunk = encounterLayerData.GetComponentInChildren <EncounterBoundaryChunkGameLogic>();

            if (encounterBoundaryChunk != null)
            {
                Main.Logger.Log($"[MaximiseBoundarySize.SetBoundarySizeToMedium] Setting Boundary Size to Maximum Map Size");
                List <RectHolder>          encounterBoundaryRectList         = new List <RectHolder>();
                EncounterObjectGameLogic[] childEncounterObjectGameLogicList = encounterBoundaryChunk.childEncounterObjectGameLogicList;

                float mapBorderSize = 50f;
                float mapSize       = 2048f;
                int   mapSide       = (int)(mapSize - mapBorderSize);

                for (int i = 0; i < childEncounterObjectGameLogicList.Length; i++)
                {
                    EncounterBoundaryRectGameLogic encounterBoundaryRectGameLogic = childEncounterObjectGameLogicList[i] as EncounterBoundaryRectGameLogic;

                    if (encounterBoundaryRectGameLogic != null)
                    {
                        encounterBoundaryRectGameLogic.width              = (int)mapSide;
                        encounterBoundaryRectGameLogic.height             = (int)mapSide;
                        encounterBoundaryRectGameLogic.transform.position = new Vector3(-25, encounterBoundaryRectGameLogic.transform.position.y, 25);
                        encounterLayerData.CalculateEncounterBoundary();
                    }
                    else
                    {
                        Main.Logger.Log($"[MaximiseBoundarySize] This encounter has no boundary to maximise.");
                    }
                }
            }
        }
Пример #2
0
        private void BuildBoundary()
        {
            EncounterBoundaryRectGameLogic boundaryLogic = BoundaryFactory.CreateEncounterBoundary(this.parent, this.name, Guid.NewGuid().ToString(), this.width, this.length);

            if (this.position != null)
            {
                SetPosition(boundaryLogic.gameObject, this.position);
            }
        }
Пример #3
0
        public Vector3 GetRandomPositionWithinBounds()
        {
            EncounterBoundaryChunkGameLogic chunkBoundary = MissionControl.Instance.EncounterLayerGameObject.GetComponentInChildren <EncounterBoundaryChunkGameLogic>();
            EncounterBoundaryRectGameLogic  boundaryLogic = chunkBoundary.GetComponentInChildren <EncounterBoundaryRectGameLogic>();
            Rect boundaryRec = chunkBoundary.GetEncounterBoundaryRectBounds();

            Vector3 randomRecPosition = boundaryRec.GetRandomPosition();

            return(randomRecPosition.GetClosestHexLerpedPointOnGrid());
        }
        private void SetBoundarySizeToMedium(EncounterLayerData encounterLayerData, float size)
        {
            EncounterBoundaryChunkGameLogic encounterBoundaryChunk = encounterLayerData.GetComponentInChildren <EncounterBoundaryChunkGameLogic>();

            if (encounterBoundaryChunk != null)
            {
                Main.Logger.Log($"[MaximiseBoundarySize.SetBoundarySizeToMedium] Increasing Boundary Size by '{size * 100}%'");
                List <RectHolder>          encounterBoundaryRectList         = new List <RectHolder>();
                EncounterObjectGameLogic[] childEncounterObjectGameLogicList = encounterBoundaryChunk.childEncounterObjectGameLogicList;

                float mapBorderSize = 50f;
                float mapSize       = 2048f;
                int   mapSide       = (int)(mapSize - mapBorderSize);

                for (int i = 0; i < childEncounterObjectGameLogicList.Length; i++)
                {
                    EncounterBoundaryRectGameLogic encounterBoundaryRectGameLogic = childEncounterObjectGameLogicList[i] as EncounterBoundaryRectGameLogic;

                    int mediumSize     = (int)(encounterBoundaryRectGameLogic.width * (1f + size));
                    int movementFactor = (int)(encounterBoundaryRectGameLogic.width * size);

                    int mediumXSize = mediumSize;
                    int mediumZSize = mediumSize;

                    if (mediumSize > mapSide)
                    {
                        Main.Logger.Log($"[MaximiseBoundarySize.SetBoundarySizeToMedium] Medium size would be greater than map size. Using map size.'");
                        MatchBoundarySizeToMapSize(encounterLayerData);
                    }
                    else
                    {
                        if (encounterBoundaryRectGameLogic != null)
                        {
                            Vector3 position = encounterBoundaryRectGameLogic.transform.position;

                            Main.Logger.Log($"[MaximiseBoundarySize.SetBoundarySizeToMedium] Boundary [X,Z] is [{position.x}, {position.z}]");

                            float xPosition = position.x - movementFactor;
                            float zPosition = position.z + movementFactor;

                            encounterBoundaryRectGameLogic.width  = (int)mediumSize;
                            encounterBoundaryRectGameLogic.height = (int)mediumSize;

                            encounterBoundaryRectGameLogic.transform.position = new Vector3(xPosition, encounterBoundaryRectGameLogic.transform.position.y, zPosition);
                            encounterLayerData.CalculateEncounterBoundary();
                        }
                        else
                        {
                            Main.Logger.Log($"[MaximiseBoundarySize] This encounter has no boundary to maximise.");
                        }
                    }
                }
            }
        }
Пример #5
0
        public static EncounterBoundaryRectGameLogic CreateEncounterBoundary(GameObject parent, string name, string guid, int width, int length)
        {
            GameObject boundaryGameObject = CreateGameObject(parent, name);

            EncounterBoundaryRectGameLogic boundaryRectGameLogic = boundaryGameObject.AddComponent <EncounterBoundaryRectGameLogic>();

            boundaryRectGameLogic.encounterObjectGuid = guid;
            boundaryRectGameLogic.width  = width;
            boundaryRectGameLogic.height = length;

            return(boundaryRectGameLogic);
        }
Пример #6
0
    public static Vector3 GetRandomPositionWithinBounds(Vector3 target, float maxDistance)
    {
        GameObject chunkBoundaryRect = MissionControl.MissionControl.Instance.EncounterLayerGameObject.transform.Find("Chunk_EncounterBoundary").gameObject;
        GameObject boundary          = chunkBoundaryRect.transform.Find("EncounterBoundaryRect").gameObject;
        EncounterBoundaryChunkGameLogic chunkBoundary = chunkBoundaryRect.GetComponent <EncounterBoundaryChunkGameLogic>();
        EncounterBoundaryRectGameLogic  boundaryLogic = boundary.GetComponent <EncounterBoundaryRectGameLogic>();
        Rect boundaryRec = chunkBoundary.GetEncounterBoundaryRectBounds();

        Vector3 randomRecPosition = boundaryRec.GetRandomPositionFromTarget(target, maxDistance);

        return(randomRecPosition.GetClosestHexLerpedPointOnGrid());
    }
        public Vector3 GetRandomPositionWithinBounds()
        {
            MissionControl EncounterManager  = MissionControl.Instance;
            GameObject     chunkBoundaryRect = EncounterManager.EncounterLayerGameObject.transform.Find("Chunk_EncounterBoundary").gameObject;
            GameObject     boundary          = chunkBoundaryRect.transform.Find("EncounterBoundaryRect").gameObject;
            EncounterBoundaryChunkGameLogic chunkBoundary = chunkBoundaryRect.GetComponent <EncounterBoundaryChunkGameLogic>();
            EncounterBoundaryRectGameLogic  boundaryLogic = boundary.GetComponent <EncounterBoundaryRectGameLogic>();
            Rect boundaryRec = chunkBoundary.GetEncounterBoundaryRectBounds();

            Vector3 randomRecPosition = boundaryRec.GetRandomPosition();

            return(randomRecPosition.GetClosestHexLerpedPointOnGrid());
        }
Пример #8
0
        private void EnableBoundary()
        {
            GameObject chunkBoundaryRect = activeEncounter.transform.Find("Chunk_EncounterBoundary").gameObject;
            GameObject boundary          = chunkBoundaryRect.transform.Find("EncounterBoundaryRect").gameObject;
            EncounterBoundaryChunkGameLogic chunkBoundaryLogic = chunkBoundaryRect.GetComponent <EncounterBoundaryChunkGameLogic>();
            EncounterBoundaryRectGameLogic  boundaryLogic      = boundary.GetComponent <EncounterBoundaryRectGameLogic>();
            Rect boundaryRec = chunkBoundaryLogic.GetEncounterBoundaryRectBounds();

            GameObject placeholderPoint = GameObject.CreatePrimitive(PrimitiveType.Cube);

            placeholderPoint.name                 = "BoundaryGizmo";
            placeholderPoint.transform.parent     = boundary.transform;
            placeholderPoint.transform.position   = boundary.transform.position;
            placeholderPoint.transform.localScale = new Vector3(boundaryRec.width, boundaryRec.height, boundaryRec.height);

            placeholderPoint.GetComponent <Renderer>().sharedMaterial = boundaryMaterial;

            boundaryRepresemtation = placeholderPoint;
        }
Пример #9
0
        private void EnableBoundary()
        {
            GameObject chunkBoundaryRect = GetBoundaryChunk().gameObject;
            GameObject boundary          = chunkBoundaryRect.transform.Find("EncounterBoundaryRect").gameObject;
            EncounterBoundaryChunkGameLogic chunkBoundaryLogic = chunkBoundaryRect.GetComponent <EncounterBoundaryChunkGameLogic>();
            EncounterBoundaryRectGameLogic  boundaryLogic      = boundary.GetComponent <EncounterBoundaryRectGameLogic>();

            Rect boundaryRec    = boundaryLogic.GetRect();
            Rect usableBoundary = boundaryRec.GenerateUsableBoundary();

            GameObject placeholderPoint = GameObject.CreatePrimitive(PrimitiveType.Cube);

            placeholderPoint.name             = "BoundaryGizmo";
            placeholderPoint.transform.parent = boundary.transform;

            Vector3 centre = (Vector3)ReflectionHelper.GetPrivateField(boundaryLogic, "rectCenter");

            placeholderPoint.transform.position   = new Vector3(centre.x + ((boundaryRec.width - usableBoundary.width) / 2f), centre.y, centre.z - ((boundaryRec.height - usableBoundary.height) / 2f));
            placeholderPoint.transform.localScale = new Vector3(usableBoundary.width, boundaryRec.height, usableBoundary.height);

            placeholderPoint.GetComponent <Renderer>().sharedMaterial = boundaryMaterial;

            boundaryRepresentation = placeholderPoint;
        }
        public override void Run(RunPayload payload)
        {
            if (!GetObjectReferences())
            {
                return;
            }

            SaveSpawnPositions(lance);
            Main.Logger.Log($"[SpawnLanceAtEdgeOfBoundary] Attemping for '{lance.name}'. Attempt: '{AttemptCount}/{AttemptCountMax}' and Edge Check: '{EdgeCheckCount}/{EdgeCheckMax}'");
            AttemptCount++;

            Init();

            CombatGameState combatState                   = UnityGameInstance.BattleTechGame.Combat;
            MissionControl  EncounterManager              = MissionControl.Instance;
            GameObject      chunkBoundaryRect             = EncounterManager.EncounterLayerGameObject.transform.Find("Chunk_EncounterBoundary").gameObject;
            GameObject      boundary                      = chunkBoundaryRect.transform.Find("EncounterBoundaryRect").gameObject;
            EncounterBoundaryChunkGameLogic chunkBoundary = chunkBoundaryRect.GetComponent <EncounterBoundaryChunkGameLogic>();
            EncounterBoundaryRectGameLogic  boundaryLogic = boundary.GetComponent <EncounterBoundaryRectGameLogic>();
            Rect             boundaryRec                  = chunkBoundary.GetEncounterBoundaryRectBounds();
            Rect             usableBounds                 = boundaryRec.GenerateUsableBoundary();
            RectEdgePosition xzEdge = usableBounds.CalculateRandomXZEdge(boundary.transform.position, edge);

            Vector3 lancePosition    = lance.transform.position.GetClosestHexLerpedPointOnGrid();
            Vector3 newSpawnPosition = new Vector3(xzEdge.Position.x, lancePosition.y, xzEdge.Position.z);

            newSpawnPosition         = GetClosestValidPathFindingHex(lance, newSpawnPosition, $"NewSpawnPosition.{lance.name}", IsLancePlayerLance(lanceKey) ? orientationTarget.transform.position : Vector3.zero, 2);
            lance.transform.position = newSpawnPosition;

            Main.LogDebug($"[SpawnLanceAtEdgeBoundary] Attempting to spawn lance at point on lerped grid '{newSpawnPosition}'");

            if (useOrientationTarget)
            {
                RotateToTarget(lance, orientationTarget);
            }

            if (!useMiniumDistance || IsWithinBoundedDistanceOfTarget(newSpawnPosition, validOrientationTargetPosition, minimumDistance))
            {
                List <GameObject> invalidLanceSpawns = GetInvalidLanceMemberSpawns(lance, validOrientationTargetPosition);

                if (invalidLanceSpawns.Count > 0)
                {
                    if (AttemptCount > AttemptCountMax) // Attempt to spawn on the selected edge. If it's not possible, select another edge
                    {
                        edge = RectExtensions.RectEdge.ANY;
                        if (EdgeCheckCount >= EdgeCheckMax)
                        {
                            HandleFallback(payload, this.lanceKey, this.orientationTargetKey);
                            return;
                        }
                    }

                    if (invalidLanceSpawns.Count <= 2)
                    {
                        Main.Logger.Log($"[SpawnLanceAtEdgeOfBoundary] Fitting invalid lance member spawns");
                        foreach (GameObject invalidSpawn in invalidLanceSpawns)
                        {
                            SpawnLanceMember(invalidSpawn, lance.transform.position);
                        }

                        Main.Logger.Log("[SpawnLanceAtEdgeOfBoundary] Lance spawn complete");
                    }
                    else
                    {
                        CheckAttempts();
                        Run(payload);
                    }
                }
                else
                {
                    CorrectLanceMemberSpawns(lance);
                    Main.Logger.Log("[SpawnLanceAtEdgeOfBoundary] Lance spawn complete");
                }
            }
            else
            {
                CheckAttempts();
                Main.LogDebug("[SpawnLanceAtEdgeOfBoundary] Spawn is too close to the target. Selecting a new spawn.");
                edge = xzEdge.Edge;
                Run(payload);
            }
        }
Пример #11
0
        private void SetBoundarySizeToCustom(EncounterLayerData encounterLayerData, float size)
        {
            EncounterBoundaryChunkGameLogic encounterBoundaryChunk = encounterLayerData.GetComponentInChildren <EncounterBoundaryChunkGameLogic>();

            if (encounterBoundaryChunk != null)
            {
                Main.Logger.Log($"[MaximiseBoundarySize.SetBoundarySizeToCustom] Increasing Boundary Size by '{size * 100}%'");
                List <RectHolder>          encounterBoundaryRectList         = new List <RectHolder>();
                EncounterObjectGameLogic[] childEncounterObjectGameLogicList = encounterBoundaryChunk.childEncounterObjectGameLogicList;

                float mapBorderSize = 50f;
                float mapSize       = 2048f;
                int   mapSide       = (int)(mapSize - mapBorderSize);

                for (int i = 0; i < childEncounterObjectGameLogicList.Length; i++)
                {
                    EncounterBoundaryRectGameLogic encounterBoundaryRectGameLogic = childEncounterObjectGameLogicList[i] as EncounterBoundaryRectGameLogic;

                    int xSizeFactor     = (int)(encounterBoundaryRectGameLogic.width * (1f + size));
                    int zSizeFactor     = (int)(encounterBoundaryRectGameLogic.height * (1f + size));
                    int xMovementFactor = (int)(encounterBoundaryRectGameLogic.width * size);
                    int zMovementFactor = (int)(encounterBoundaryRectGameLogic.height * size);

                    if (xSizeFactor > mapSide)
                    {
                        Main.Logger.Log($"[MaximiseBoundarySize.SetBoundarySizeToCustom] Custom size would be greater than map size. Using map size.'");
                        MatchBoundarySizeToMapSize(encounterLayerData);
                    }
                    else
                    {
                        if (encounterBoundaryRectGameLogic != null)
                        {
                            Vector3 position = encounterBoundaryRectGameLogic.transform.position;

                            Main.Logger.Log($"[MaximiseBoundarySize.SetBoundarySizeToCustom] Boundary [X,Z] originally was [{position.x}, {position.z}]");

                            float xPosition = 0;
                            if (position.x > 0)
                            {
                                xPosition = position.x - (xMovementFactor / 2f);
                                if (xPosition < 0)
                                {
                                    xPosition = 0;
                                }
                            }
                            else if (position.x < 0)
                            {
                                xPosition = position.x + (xMovementFactor / 2f);
                                if (xPosition > 0)
                                {
                                    xPosition = 0;
                                }
                            }

                            float zPosition = 0;
                            if (position.z > 0)
                            {
                                zPosition = position.z - (zMovementFactor / 2f);
                                if (zPosition < 0)
                                {
                                    zPosition = 0;
                                }
                            }
                            else if (position.z < 0)
                            {
                                zPosition = position.z + (zMovementFactor / 2f);
                                if (zPosition > 0)
                                {
                                    zPosition = 0;
                                }
                            }

                            encounterBoundaryRectGameLogic.width  = (int)xSizeFactor;
                            encounterBoundaryRectGameLogic.height = (int)zSizeFactor;

                            encounterBoundaryRectGameLogic.transform.position = new Vector3(xPosition, encounterBoundaryRectGameLogic.transform.position.y, zPosition);

                            Main.Logger.Log($"[MaximiseBoundarySize.SetBoundarySizeToCustom] Boundary [X,Z] is now [{xPosition}, {zPosition}]");

                            encounterLayerData.CalculateEncounterBoundary();
                        }
                        else
                        {
                            Main.Logger.Log($"[MaximiseBoundarySize] This encounter has no boundary to maximise.");
                        }
                    }
                }
            }
        }