Example #1
0
 public Map()
 {
     this.preloadRange = MapSettings.preloadRange;
     this.displayRange = new Rect(Vector2.zero, MapSettings.dispaySize);
     this.itemSize     = MapSettings.itemSize;
     factory           = new MapItemFactory();
     displayItems      = new Dictionary <Vector2Int, IMapItem>();
 }
Example #2
0
        private void ImproveMapData(VoronoiGraph voronoiMap, bool fix = false)
        {
            IFactory fact = new MapItemFactory();

            foreach (VoronoiEdge edge in voronoiMap.Edges)
            {
                if (fix)
                {
                    if (!newFix(edge))
                    {
                        continue;
                    }
                }

                Corner c1        = fact.CornerFactory(edge.VVertexA[0], edge.VVertexA[1]);
                Corner c2        = fact.CornerFactory(edge.VVertexB[0], edge.VVertexB[1]);
                Center cntrLeft  = fact.CenterFactory(edge.LeftData[0], edge.LeftData[1]);
                Center cntrRight = fact.CenterFactory(edge.RightData[0], edge.RightData[1]);

                c1.AddAdjacent(c2);
                c2.AddAdjacent(c1);

                cntrRight.AddCorner(c1);
                cntrRight.AddCorner(c2);

                cntrLeft.AddCorner(c1);
                cntrLeft.AddCorner(c2);

                Edge e = fact.EdgeFactory(c1, c2, cntrLeft, cntrRight);


                cntrLeft.AddBorder(e);
                cntrRight.AddBorder(e);

                cntrLeft.AddNeighbour(cntrRight);
                cntrRight.AddNeighbour(cntrLeft);

                c1.AddProtrudes(e);
                c2.AddProtrudes(e);
                c1.AddTouches(cntrLeft);
                c1.AddTouches(cntrRight);
                c2.AddTouches(cntrLeft);
                c2.AddTouches(cntrRight);
            }

            foreach (var c in App.AppMap.Centers)
            {
                c.Value.FixBorders();
                //c.SetEdgeAreas();
                c.Value.OrderCorners();
            }

            //IslandHandler.CreateIsland();
        }
Example #3
0
    public void FixBorders()
    {
        var ms = from p in Borders.SelectMany(x => x.Corners)
                 group p by p.Point
                 into grouped
                 select new { point = grouped.Key, count = grouped.Count() };

        var fpoint = ms.FirstOrDefault(x => x.count == 1);
        var spoint = ms.LastOrDefault(x => x.count == 1);

        if (fpoint != null & spoint != null)
        {
            Corner p1 = Corners.FirstOrDefault(x => x.Point == fpoint.point);
            Corner p2 = Corners.FirstOrDefault(x => x.Point == spoint.point);

            if (p1 == null || p2 == null)
            {
                return;
            }

            IFactory fact = new MapItemFactory();
            Edge     e    = fact.EdgeFactory(
                p1,
                p2,
                this, null);

            e.MapEdge = true;

            p1.Protrudes.Add(e);
            p2.Protrudes.Add(e);

            this.Border              = this.Ocean = this.Water = true;
            e.VoronoiStart.Border    = e.VoronoiEnd.Border = true;
            e.VoronoiStart.Elevation = e.VoronoiEnd.Elevation = 0.0d;

            this.Borders.Add(e);
        }
    }
Example #4
0
        private void ImproveMapData(VoronoiGraph voronoiMap, bool fix = false)
        {
            IFactory fact = new MapItemFactory();

            foreach (VoronoiEdge edge in voronoiMap.Edges)
            {
                if (fix)
                {
                    if (!newFix(edge))
                        continue;
                }

                Corner c1 = fact.CornerFactory(edge.VVertexA[0], edge.VVertexA[1]);
                Corner c2 = fact.CornerFactory(edge.VVertexB[0], edge.VVertexB[1]);
                Center cntrLeft = fact.CenterFactory(edge.LeftData[0], edge.LeftData[1]);
                Center cntrRight = fact.CenterFactory(edge.RightData[0], edge.RightData[1]);

                c1.AddAdjacent(c2);
                c2.AddAdjacent(c1);

                cntrRight.AddCorner(c1);
                cntrRight.AddCorner(c2);

                cntrLeft.AddCorner(c1);
                cntrLeft.AddCorner(c2);

                Edge e = fact.EdgeFactory(c1, c2, cntrLeft, cntrRight);

                cntrLeft.AddBorder(e);
                cntrRight.AddBorder(e);

                cntrLeft.AddNeighbour(cntrRight);
                cntrRight.AddNeighbour(cntrLeft);

                c1.AddProtrudes(e);
                c2.AddProtrudes(e);
                c1.AddTouches(cntrLeft);
                c1.AddTouches(cntrRight);
                c2.AddTouches(cntrLeft);
                c2.AddTouches(cntrRight);
            }

            foreach (var c in App.AppMap.Centers)
            {
                c.Value.FixBorders();
                //c.SetEdgeAreas();
                c.Value.OrderCorners();
            }

            //IslandHandler.CreateIsland();
        }
    /// <summary>
    /// Create the vector map from the voronoi information
    /// </summary>
    /// <param name="fix">If set to <c>true</c> fix.</param>
    static void CleanUpGraph(bool fix = false)
    {
        //initialize the factory
        IFactory fact = new MapItemFactory();

        //for all the edges, create corners and centers
        foreach (VoronoiEdge edge in WorldGen.voronoiMap.Edges)
        {
            if (fix)
            {
                if (!FixPoints(edge))
                {
                    continue;
                }
            }

            Corner c1        = fact.CornerFactory(edge.VVertexA[0], edge.VVertexA[1]);
            Corner c2        = fact.CornerFactory(edge.VVertexB[0], edge.VVertexB[1]);
            Center cntrLeft  = fact.CenterFactory(edge.LeftData[0], edge.LeftData[1]);
            Center cntrRight = fact.CenterFactory(edge.RightData[0], edge.RightData[1]);

            c1.AddAdjacent(c2);
            c2.AddAdjacent(c1);

            cntrRight.Corners.Add(c1);
            cntrRight.Corners.Add(c2);

            cntrLeft.Corners.Add(c1);
            cntrLeft.Corners.Add(c2);

            Edge e = fact.EdgeFactory(c1, c2, cntrLeft, cntrRight);


            cntrLeft.Borders.Add(e);
            cntrRight.Borders.Add(e);

            cntrLeft.Neighbours.Add(cntrRight);
            cntrRight.Neighbours.Add(cntrLeft);

            c1.AddProtrudes(e);
            c2.AddProtrudes(e);
            c1.AddTouches(cntrLeft);
            c1.AddTouches(cntrRight);
            c2.AddTouches(cntrLeft);
            c2.AddTouches(cntrRight);
        }


        foreach (Corner q in WorldGen.AppMap.Corners.Values)
        {
            if (!q.Border)
            {
                var point = new Vector2(0, 0);
                foreach (Center c in q.Touches)
                {
                    point.x += c.Point.x;
                    point.y += c.Point.y;
                }
                point.x = point.x / q.Touches.Count;
                point.y = point.y / q.Touches.Count;
                q.Point = point;
            }
        }

        //Once the vector grid is created, build the island from the datapoints
        WorldGen.IslandHandler.CreateIsland();
    }
Example #6
0
 public static MapItemFactory GetInstance()
 {
     return(instance ?? (instance = new MapItemFactory()));
 }
        private void ImproveMapData(VoronoiGraph voronoiMap, bool fix = false)
        {
            IFactory fact = new MapItemFactory();

            foreach (VoronoiEdge edge in voronoiMap.Edges)
            {
                if (fix)
                {
                    if (!FixPoints(edge))
                        continue;
                }

                Corner c1 = fact.CornerFactory(edge.VVertexA[0], edge.VVertexA[1]);
                Corner c2 = fact.CornerFactory(edge.VVertexB[0], edge.VVertexB[1]);
                Center cntrLeft = fact.CenterFactory(edge.LeftData[0], edge.LeftData[1]);
                Center cntrRight = fact.CenterFactory(edge.RightData[0], edge.RightData[1]);

                if(c1 == null || c2 == null)
                {

                }

                c1.AddAdjacent(c2);
                c2.AddAdjacent(c1);

                cntrRight.Corners.Add(c1);
                cntrRight.Corners.Add(c2);

                cntrLeft.Corners.Add(c1);
                cntrLeft.Corners.Add(c2);

                Edge e = fact.EdgeFactory(c1, c2, cntrLeft, cntrRight);

                cntrLeft.Borders.Add(e);
                cntrRight.Borders.Add(e);

                cntrLeft.Neighbours.Add(cntrRight);
                cntrRight.Neighbours.Add(cntrLeft);

                c1.AddProtrudes(e);
                c2.AddProtrudes(e);
                c1.AddTouches(cntrLeft);
                c1.AddTouches(cntrRight);
                c2.AddTouches(cntrLeft);
                c2.AddTouches(cntrRight);
            }

            foreach (Corner q in App.AppMap.Corners.Values)
            {
                if (!q.Border)
                {
                    var point = new Point(0, 0);
                    foreach (Center c in q.Touches)
                    {
                        point.X += c.Point.X;
                        point.Y += c.Point.Y;
                    }
                    point.X = point.X / q.Touches.Count;
                    point.Y = point.Y / q.Touches.Count;
                    q.Point = point;
                }
            }

            //foreach (var c in App.AppMap.Centers)
            //{
            //    c.Value.FixBorders();
            //    c.SetEdgeAreas();
            //    c.Value.OrderCorners();
            //}

            IslandHandler.CreateIsland();
        }
Example #8
0
        private void ImproveMapData(VoronoiGraph voronoiMap, bool fix = false)
        {
            IFactory fact = new MapItemFactory();

            foreach (VoronoiEdge edge in voronoiMap.Edges)
            {
                if (fix)
                {
                    if (!FixPoints(edge))
                    {
                        continue;
                    }
                }

                Corner c1        = fact.CornerFactory(edge.VVertexA[0], edge.VVertexA[1]);
                Corner c2        = fact.CornerFactory(edge.VVertexB[0], edge.VVertexB[1]);
                Center cntrLeft  = fact.CenterFactory(edge.LeftData[0], edge.LeftData[1]);
                Center cntrRight = fact.CenterFactory(edge.RightData[0], edge.RightData[1]);

                if (c1 == null || c2 == null)
                {
                }

                c1.AddAdjacent(c2);
                c2.AddAdjacent(c1);

                cntrRight.Corners.Add(c1);
                cntrRight.Corners.Add(c2);

                cntrLeft.Corners.Add(c1);
                cntrLeft.Corners.Add(c2);

                Edge e = fact.EdgeFactory(c1, c2, cntrLeft, cntrRight);


                cntrLeft.Borders.Add(e);
                cntrRight.Borders.Add(e);

                cntrLeft.Neighbours.Add(cntrRight);
                cntrRight.Neighbours.Add(cntrLeft);

                c1.AddProtrudes(e);
                c2.AddProtrudes(e);
                c1.AddTouches(cntrLeft);
                c1.AddTouches(cntrRight);
                c2.AddTouches(cntrLeft);
                c2.AddTouches(cntrRight);
            }

            foreach (Corner q in App.AppMap.Corners.Values)
            {
                if (!q.Border)
                {
                    var point = new Point(0, 0);
                    foreach (Center c in q.Touches)
                    {
                        point.X += c.Point.X;
                        point.Y += c.Point.Y;
                    }
                    point.X = point.X / q.Touches.Count;
                    point.Y = point.Y / q.Touches.Count;
                    q.Point = point;
                }
            }

            //foreach (var c in App.AppMap.Centers)
            //{
            //    c.Value.FixBorders();
            //    c.SetEdgeAreas();
            //    c.Value.OrderCorners();
            //}

            IslandHandler.CreateIsland();
        }
    /// <inheritdoc />
    /// Handle notifications from the application.
    public override void OnNotification(string pEvent, Object pTarget, params object[] pData)
    {
        switch (pEvent)
        {
        // Map Notifications Start
        case "map.onHoverStart":
        {
            app.model.CameraCanBeDragged = true;
            app.view.Map.SetFocused(true);
        }
        break;

        case "map.onHoverEnd":
        {
            // app.model.CameraCanBeDragged = false;
            app.view.Map.SetFocused(false);
        }
        break;

        case "map.onLeftClicked":
        {
            // Hide Details Panel and set selected item to null if camera is not on drag mode
            if (!app.model.CameraIsCurrentlyDragging)
            {
                app.view.DetailsPanel.HidePanel();
                app.model.SelectedItem = null;
            }
        }
        break;

        case "map.onRightClicked":
        {
            // If a soldier is currently selected
            if (app.model.SelectedItem.GetComponent <SoldierView>())
            {
                var calculatedPath = app.model.PathFinder.FindPath(new AStar.Point(
                                                                       (int)app.model.SelectedItem.GetComponent <RectTransform>().anchoredPosition.x,
                                                                       (int)app.model.SelectedItem.GetComponent <RectTransform>().anchoredPosition.y),
                                                                   new AStar.Point((int)Camera.main.ScreenToWorldPoint(Input.mousePosition).x,
                                                                                   (int)Camera.main.ScreenToWorldPoint(Input.mousePosition).y)
                                                                   );

                // If a path is calculated successfully
                if (calculatedPath != null)
                {
                    // Reverse the path
                    calculatedPath.Reverse();
                    // Remove start position (Unnecessary)
                    calculatedPath.RemoveAt(0);

                    // Start movement
                    app.model.SelectedItem.GetComponent <SoldierView>().StartMovementToDestination(calculatedPath);
                }
            }
        }
        break;
        // Map Notifications End


        // Construction Button Notifications Start
        case "button.onHoverStart":
        {
            ((ConstructionButtonView)pTarget).SetColor(Color.red);
        }
        break;

        case "button.onHoverEnd":
        {
            ((ConstructionButtonView)pTarget).SetColor(Color.white);
        }
        break;

        case "barracksButton.onClicked":
        {
            // Spawn new barracks building
            var newBuilding = MapItemFactory.GetInstance().CreateNewMapItem(app.model.BarracksBuilding);
            newBuilding.transform.SetParent(app.model.MapItemsContainer.transform, false);
            newBuilding.GetComponent <BarracksBuildingView>().SetID((int)pData[0]);
        }
        break;

        case "powerplantButton.onClicked":
        {
            // Spawn new powerplant building
            var newBuilding = MapItemFactory.GetInstance().CreateNewMapItem(app.model.PowerPlantBuilding);
            newBuilding.transform.SetParent(app.model.MapItemsContainer.transform, false);
            newBuilding.GetComponent <PowerPlantBuildingView>().SetID((int)pData[0]);
        }
        break;

        case "soldierButton.onClicked":
        {
            var newSoldier = MapItemFactory.GetInstance().CreateNewMapItem(app.model.SoldierMapItem);
            newSoldier.transform.SetParent(app.model.MapItemsContainer.transform, false);
            newSoldier.GetComponent <SoldierView>().SetID(app.model.SoldierID++);

            // If a barracks map item is still selected, spawn this new soldier near it on closest available tile. Otherwise, destroy it back.
            if ((BarracksBuildingView)app.model.SelectedItem)
            {
                var barracksPosition = app.model.SelectedItem.GetComponent <RectTransform>().anchoredPosition;
                // If we can't find a tile to spawn this soldier, destroy it back
                if (!newSoldier.GetComponent <SoldierView>().FindATileToSpawn(barracksPosition))
                {
                    Destroy(newSoldier);
                }
            }
            else
            {
                Destroy(newSoldier);
            }
        }
        break;
        // Construction Button Notifications End


        // Map Item Notifications Start
        case "building.onBuildModeStart":
        {
            // Hide UI
            app.view.ConstructionPanel.HidePanel();
            app.view.DetailsPanel.HidePanel();
        }
        break;

        case "building.onBuildModeEnd":
        {
            // Show UI
            app.view.ConstructionPanel.ShowPanel();
        }
        break;

        case "building.onCollisionWithAnotherBuildingStay":
        {
            // Give feedback to player by changing background color to red
            ((BuildingView)pTarget).SetBackgroundColor(new Color(0.5f, 0, 0, 0.5f));
        }
        break;

        case "building.onCollisionWithAnotherBuildingEnd":
        {
            // Give feedback to player by changing background color to white
            ((BuildingView)pTarget).SetBackgroundColor(new Color(1, 1, 1, 0.5f));
        }
        break;

        case "barracksBuilding.onClicked":
        {
            // Set details panel information from clicked map item
            app.view.DetailsPanel.SetDetails(EMapItem.Type.Barracks, (int)pData[0]);
            app.model.SelectedItem = (MapItemView)pTarget;
            app.model.DetailsPanelSoldierButton.SetActive(true);
            app.view.DetailsPanel.ShowPanel();
        }
        break;

        case "powerplantBuilding.onClicked":
        {
            // Set details panel information from clicked map item
            app.view.DetailsPanel.SetDetails(EMapItem.Type.PowerPlant, (int)pData[0]);
            app.model.SelectedItem = (MapItemView)pTarget;
            app.model.DetailsPanelSoldierButton.SetActive(false);
            app.view.DetailsPanel.ShowPanel();
        }
        break;

        case "soldierMapItem.onClicked":
        {
            // Set details panel information from clicked map item
            app.view.DetailsPanel.SetDetails(EMapItem.Type.Soldier, (int)pData[0]);
            app.model.SelectedItem = (MapItemView)pTarget;
            app.model.DetailsPanelSoldierButton.SetActive(false);
            app.view.DetailsPanel.ShowPanel();
        }
        break;
        // Map Item Notifications End


        // Panel Notifications Start
        case "panel.onHoverStart":
        {
            // If we're hovering the panel, do not pan the camera anymore
            app.model.CameraCanBeDragged = false;
        }
        break;

        case "panel.onAnimationPlaying":
        {
            // Keep animating the panel
            var rectTransform = ((PanelView)pTarget).GetComponent <RectTransform>();
            rectTransform.anchoredPosition =
                new Vector2(Mathf.Lerp(rectTransform.anchoredPosition.x, ((PanelView)pTarget).GetTargetX(), app.model.PanelAnimationSpeed * Time.deltaTime),
                            rectTransform.anchoredPosition.y);

            // Destination reached, stop animation
            if (Mathf.Abs(((PanelView)pTarget).GetTargetX() - rectTransform.anchoredPosition.x) < 0.1f)
            {
                rectTransform.anchoredPosition = new Vector2(((PanelView)pTarget).GetTargetX(), rectTransform.anchoredPosition.y);
                ((PanelView)pTarget).SetIsAnimationOngoing(false);
            }
        }
        break;

        // Move buttons in button pool up
        case "constructionPanel.scrollUp":
        {
            // Check if scrollUp is available (Check if upper button has id 0)
            foreach (var buttonView in app.model.ConstructionButtonPool
                     .GetComponentsInChildren <ConstructionButtonView>())
            {
                if (buttonView.GetID() == 0 && buttonView.GetComponent <RectTransform>().anchoredPosition.y ==
                    -app.view.ConstructionPanel.YSpacing)
                {
                    return;
                }
            }

            var contentRecTransform = app.model.ConstructionButtonPool.GetComponent <RectTransform>();
            var oldY = contentRecTransform.anchoredPosition.y;

            // Move each button down
            foreach (var buttonRectTransform in
                     app.model.ConstructionButtonPool.GetComponentsInChildren <RectTransform>())
            {
                buttonRectTransform.anchoredPosition = new Vector2(buttonRectTransform.anchoredPosition.x,
                                                                   buttonRectTransform.anchoredPosition.y - 5);

                // End of the panel reached, send it back to top (Object Pooling)
                if (buttonRectTransform.anchoredPosition.y <= oldY - app.view.ConstructionPanel.YOffset / 2)
                {
                    // Check if reused object is going to be out of ID range
                    if (buttonRectTransform.GetComponent <ConstructionButtonView>().GetID() -
                        app.view.ConstructionPanel.RowCount >= 0)
                    {
                        buttonRectTransform.anchoredPosition =
                            new Vector2(buttonRectTransform.anchoredPosition.x, 0);

                        // Roll back the id of the reused object
                        buttonRectTransform.GetComponent <ConstructionButtonView>().SetID(
                            buttonRectTransform.GetComponent <ConstructionButtonView>().GetID() -
                            app.view.ConstructionPanel.RowCount);
                    }
                }

                // Fix for content canvas self-movement
                contentRecTransform.anchoredPosition = new Vector2(contentRecTransform.anchoredPosition.x, oldY);
            }
        }
        break;

        // Move buttons in button pool down
        case "constructionPanel.scrollDown":
        {
            var contentRecTransform = app.model.ConstructionButtonPool.GetComponent <RectTransform>();
            var oldY = contentRecTransform.anchoredPosition.y;

            // Move each button up
            foreach (var buttonRectTransform in
                     app.model.ConstructionButtonPool.GetComponentsInChildren <RectTransform>())
            {
                buttonRectTransform.anchoredPosition = new Vector2(buttonRectTransform.anchoredPosition.x,
                                                                   buttonRectTransform.anchoredPosition.y + 5);

                // End of the panel reached, send it back to bottom (Object Pooling)
                if (buttonRectTransform.anchoredPosition.y >= 0)
                {
                    buttonRectTransform.anchoredPosition =
                        new Vector2(buttonRectTransform.anchoredPosition.x,
                                    contentRecTransform.anchoredPosition.y - app.view.ConstructionPanel.YOffset / 2);

                    // Advance the id of the reused object
                    buttonRectTransform.GetComponent <ConstructionButtonView>().SetID(
                        buttonRectTransform.GetComponent <ConstructionButtonView>().GetID() +
                        app.view.ConstructionPanel.RowCount);
                }

                // Fix for content canvas self-movement
                contentRecTransform.anchoredPosition = new Vector2(contentRecTransform.anchoredPosition.x, oldY);
            }
        }

        break;

        case "constructionPanel.start":
        {
            // Spawn buttons on construction panel

            for (var i = 0; i < app.view.ConstructionPanel.RowCount; i++)
            {
                // Put leftside barracks button, set id, set spacings and offset
                var obj = ButtonFactory.GetInstance().CreateNewButton(app.model.BarracksButton);
                obj.transform.SetParent(app.model.ConstructionButtonPool.transform, false);
                obj.GetComponent <BarracksButtonView>().SetID(app.model.BarracksID++);

                obj.transform.localPosition = new Vector3(
                    obj.transform.localPosition.x + app.view.ConstructionPanel.XOffset,
                    obj.transform.localPosition.y - app.view.ConstructionPanel.YOffset -
                    app.view.ConstructionPanel.YSpacing * i, obj.transform.localPosition.z);

                // Put rightside powerplant button, set id, set spacings and offset
                obj = ButtonFactory.GetInstance().CreateNewButton(app.model.PowerPlantButton);
                obj.transform.SetParent(app.model.ConstructionButtonPool.transform, false);
                obj.GetComponent <PowerPlantButtonView>().SetID(app.model.PowerPlantID++);
                obj.transform.localPosition = new Vector3(
                    obj.transform.localPosition.x + app.view.ConstructionPanel.XOffset +
                    app.view.ConstructionPanel.XSpacing,
                    obj.transform.localPosition.y - app.view.ConstructionPanel.YOffset -
                    app.view.ConstructionPanel.YSpacing * i, obj.transform.localPosition.z);
            }
        }
        break;

        case "detailsPanelView.onDetailsChanged":
        {
            // Variables in details panel changed, reflect changes to UI

            app.model.DetailsPanelText.text = app.view.DetailsPanel.GetDetailsText();

            switch (app.view.DetailsPanel.GetDetailsType())
            {
            case EMapItem.Type.Barracks:
                app.model.DetailsPanelBarracksSprite.SetActive(true);
                app.model.DetailsPanelPowerPlantSprite.SetActive(false);
                app.model.DetailsPanelSoldierSprite.SetActive(false);
                break;

            case EMapItem.Type.PowerPlant:
                app.model.DetailsPanelBarracksSprite.SetActive(false);
                app.model.DetailsPanelPowerPlantSprite.SetActive(true);
                app.model.DetailsPanelSoldierSprite.SetActive(false);
                break;

            case EMapItem.Type.Soldier:
                app.model.DetailsPanelBarracksSprite.SetActive(false);
                app.model.DetailsPanelPowerPlantSprite.SetActive(false);
                app.model.DetailsPanelSoldierSprite.SetActive(true);
                break;

            default:
                app.model.DetailsPanelBarracksSprite.SetActive(false);
                app.model.DetailsPanelBarracksSprite.SetActive(false);
                app.model.DetailsPanelSoldierSprite.SetActive(false);
                break;
            }
        }
        break;
        // Panel Notifications End

        default:
            // Do nothing
            break;
        }
    }