protected void AddAssociations(IEnumerable <Association> associations)
        {
            foreach (var aso in associations)
            {
                var        allNodes     = Layout.AllNodes.ToList();
                NodeLayout memberEndNL  = null;
                NodeLayout memberEnd1NL = null;

                foreach (var n in allNodes)
                {
                    var namedNode = (MetaDslx.Languages.Uml.Model.NamedElement)n.NodeObject;
                    if (string.Equals(namedNode.Name, aso.MemberEnd[0].Type.Name))
                    {
                        memberEndNL = Layout.FindNodeLayout(namedNode);
                    }
                    else if (string.Equals(namedNode.Name, aso.MemberEnd[1].Type.Name))
                    {
                        memberEnd1NL = Layout.FindNodeLayout(namedNode);
                    }
                }

                if (memberEndNL != null && memberEnd1NL != null)
                {
                    var e = Layout.AddEdge(memberEndNL.NodeObject, memberEnd1NL.NodeObject, memberEndNL.NodeObject.ToString() + "-" + memberEnd1NL.NodeObject.ToString());
                }
            }
        }
        protected void AddIncludes(IEnumerable <Include> includes)
        {
            foreach (var inc in includes)
            {
                var allNodes = Layout.AllNodes.ToList();

                NodeLayout includingNL = null;
                NodeLayout additionNL  = null;

                foreach (var n in allNodes)
                {
                    var namedNode = (MetaDslx.Languages.Uml.Model.NamedElement)n.NodeObject;
                    if (string.Equals(namedNode.Name, inc.IncludingCase.Name))
                    {
                        includingNL = Layout.FindNodeLayout(namedNode);
                    }
                    else if (string.Equals(namedNode.Name, inc.Addition.Name))
                    {
                        additionNL = Layout.FindNodeLayout(namedNode);
                    }
                }

                if (includingNL != null && additionNL != null)
                {
                    var e = Layout.AddEdge(additionNL.NodeObject, includingNL.NodeObject, additionNL.NodeObject.ToString() + "--|>" + includingNL.NodeObject.ToString());
                }
            }
        }
        protected void AddDependecies(IEnumerable <Dependency> dependencies)
        {
            foreach (var dep in dependencies)
            {
                var allNodes = Layout.AllNodes.ToList();

                NodeLayout clientNL   = null;
                NodeLayout supplierNL = null;

                foreach (var n in allNodes)
                {
                    var namedNode = (MetaDslx.Languages.Uml.Model.NamedElement)n.NodeObject;
                    if (string.Equals(namedNode.Name, dep.Client.FirstOrDefault().Name))
                    {
                        clientNL = Layout.FindNodeLayout(namedNode);
                    }
                    else if (string.Equals(namedNode.Name, dep.Supplier.FirstOrDefault().Name))
                    {
                        supplierNL = Layout.FindNodeLayout(namedNode);
                    }
                }

                if (clientNL != null && supplierNL != null)
                {
                    var e = Layout.AddEdge(clientNL.NodeObject, supplierNL.NodeObject, clientNL.NodeObject.ToString() + "-->" + supplierNL.NodeObject.ToString());
                }
            }
        }
        protected void AddInterfaceRealizations(IEnumerable <InterfaceRealization> interfaceRealizations)
        {
            foreach (var intrf in interfaceRealizations)
            {
                var allNodes = Layout.AllNodes.ToList();
                Layout.FindNodeLayout(intrf.Supplier.FirstOrDefault().Name);
                NodeLayout clientNL   = null;
                NodeLayout supplierNL = null;

                foreach (var n in allNodes)
                {
                    var namedNode = (MetaDslx.Languages.Uml.Model.NamedElement)n.NodeObject;
                    if (string.Equals(namedNode.Name, intrf.Client.FirstOrDefault().Name))
                    {
                        clientNL = Layout.FindNodeLayout(namedNode);
                    }
                    else if (string.Equals(namedNode.Name, intrf.Supplier.FirstOrDefault().Name))
                    {
                        supplierNL = Layout.FindNodeLayout(namedNode);
                    }
                }

                if (clientNL != null && supplierNL != null)
                {
                    var e = Layout.AddEdge(clientNL.NodeObject, supplierNL.NodeObject, clientNL.NodeObject.ToString() + "--|>" + supplierNL.NodeObject.ToString());
                }
            }
        }
 void Render(XmlWriter writer, NodeLayout <Graph <TNode, TTransition> .Transition> node)
 {
     writer.WriteStartElement("g");
     WriteTranslationAttribute(writer, node.Location.X, node.Location.Y);
     RenderCore(node.Data, writer, node.Size);
     writer.WriteEndElement();
 }
        protected void AddExtends(IEnumerable <Extend> extends)
        {
            foreach (var ext in extends)
            {
                var allNodes = Layout.AllNodes.ToList();

                NodeLayout extendCaseNL = null;
                NodeLayout extensionNL  = null;

                foreach (var n in allNodes)
                {
                    var namedNode = (MetaDslx.Languages.Uml.Model.NamedElement)n.NodeObject;
                    if (string.Equals(namedNode.Name, ext.ExtendedCase.Name))
                    {
                        extendCaseNL = Layout.FindNodeLayout(namedNode);
                    }
                    else if (string.Equals(namedNode.Name, ext.Extension.Name))
                    {
                        extensionNL = Layout.FindNodeLayout(namedNode);
                    }
                }

                if (extendCaseNL != null && extensionNL != null)
                {
                    var e = Layout.AddEdge(extensionNL.NodeObject, extendCaseNL.NodeObject, extensionNL.NodeObject.ToString() + "--|>" + extendCaseNL.NodeObject.ToString());
                }
            }
        }
 protected void AddGeneralizations(IEnumerable <Generalization> generalizations)
 {
     foreach (var gen in generalizations)
     {
         var        allnodes = Layout.AllNodes.ToList();
         NodeLayout specNL   = null;
         NodeLayout genNL    = null;
         foreach (var n in allnodes)
         {
             var namedNode = (MetaDslx.Languages.Uml.Model.NamedElement)n.NodeObject;
             if (string.Equals(namedNode.Name, gen.Specific.Name))
             {
                 specNL = Layout.FindNodeLayout(namedNode);
             }
             else if (string.Equals(namedNode.Name, gen.General.Name))
             {
                 genNL = Layout.FindNodeLayout(namedNode);
             }
         }
         //if (specObject == null) { Layout.AddNode(gen.Specific.Name); specObject = Layout.FindNodeLayout(gen.Specific.Name); }
         //if (genObject == null) { Layout.AddNode(gen.General.Name); genObject = Layout.FindNodeLayout(gen.General.Name); }
         if (specNL != null && genNL != null)
         {
             var e = Layout.AddEdge(specNL.NodeObject, genNL.NodeObject, specNL.NodeObject.ToString() + "-|>" + genNL.NodeObject.ToString());
         }
     }
 }
        // TODO: we should interpret the shape/style/color attributes ...
        public void Draw(NodeLayout layoutState)
        {
            var style = myPresentation.GetPropertySetFor <NodeStyle>().Get(Owner.Id);
            var label = myPresentation.GetPropertySetFor <Caption>().Get(Owner.Id);

            Visual = new DrawingVisual();
            var dc = Visual.RenderOpen();

            if (style.Shape.Equals("rectangle", StringComparison.OrdinalIgnoreCase))
            {
                var rect = layoutState.GetBoundingBox();

                dc.DrawRectangle(style.FillColor, new Pen(style.BorderColor, 0.016), rect);
            }
            else
            {
                dc.DrawEllipse(style.FillColor, new Pen(style.BorderColor, 0.016), layoutState.Center, layoutState.Width, layoutState.Height);
            }

            var tx = new FormattedText(label.DisplayText,
                                       CultureInfo.InvariantCulture,
                                       FlowDirection.LeftToRight,
                                       myFont,
                                       layoutState.Height * 0.7, Brushes.Black);

            dc.DrawText(tx, new Point(layoutState.Center.X - tx.Width / 2, layoutState.Center.Y - tx.Height / 2));

            dc.Close();

            Visual.SetValue(GraphItemProperty, Owner);
        }
Beispiel #9
0
    public static void GenerateWorld(bool teamplay, bool cluster_water, bool nat_starts, List <PlayerData> picks, NodeLayout layout)
    {
        m_num_players   = picks.Count;
        m_nations       = picks;
        m_nat_starts    = nat_starts;
        m_teamplay      = teamplay;
        m_cluster_water = cluster_water;
        m_layout        = layout;

        generate_nodes();
        generate_connections();
        calculate_triangles();
        generate_caprings();
        generate_seas();
        generate_lakes();
        assign_water_terrain();

        List <Node>       valid      = m_nodes.Where(x => !x.HasNation && !x.IsAssignedTerrain && !x.ProvinceData.IsWater).ToList();
        List <Connection> valid_conn = m_connections.Where(x => !x.IsCap && !x.IsInsideCapRing && !x.IsTouchingSea).ToList();

        if (!m_nat_starts)
        {
            valid = m_nodes.Where(x => !x.ProvinceData.IsWater).ToList();
        }

        generate_swamps(valid);
        generate_misc(valid);
        generate_rivers(valid_conn);
        generate_cliffs(valid_conn);
        generate_roads(valid_conn);
        generate_farms(valid);
        generate_sized(valid);
        generate_thrones();
        cleanup_connections();
    }
Beispiel #10
0
    public void OnGenerate()
    {
        if (ElementManager.s_element_manager.GeneratedObjects.Any())
        {
            ElementManager.s_element_manager.WipeGeneratedObjects();
        }

        List <PlayerData> picks = new List <PlayerData>();

        foreach (GameObject obj in m_content)
        {
            NationPicker np  = obj.GetComponent <NationPicker>();
            string       str = np.NationName;

            NationData data = AllNationData.AllNations.FirstOrDefault(x => x.Name == str);
            PlayerData pd   = new PlayerData(data, np.TeamNum);

            if (data == null || (picks.Any(x => x.NationData.Name == data.Name) && !m_generic_starts))
            {
                GetComponent <AudioSource>().PlayOneShot(DenyAudio);
                return;
            }

            picks.Add(pd);
        }

        m_nations = picks;

        GetComponent <AudioSource>().PlayOneShot(AcceptAudio);
        NodeLayout layout = m_layouts.Layouts.FirstOrDefault(x => x.Name == LayoutDropdown.options[LayoutDropdown.value].text && x.NumPlayers == m_player_count);

        MoveCameraForGeneration(layout);
        Resources.UnloadUnusedAssets();
        StartCoroutine(perform_async(() => do_generate(layout), true));
    }
Beispiel #11
0
 internal bool OnDrawNode(NodeLayout nodeLayout, DrawingContext drawingContext)
 {
     if (DrawNode != null)
     {
         DrawNode(this, new DrawNodeEventArgs(nodeLayout, drawingContext));
         return(true);
     }
     return(false);
 }
Beispiel #12
0
    void MoveCameraForGeneration(NodeLayout layout)
    {
        var main_cam = Camera.main;
        var p        = main_cam.transform.position;

        p.x = layout.X;
        p.y = layout.Y * 0.5f;
        main_cam.transform.position = p;
    }
        public NodeLayout ReadNodeLayout(string nodeId)
        {
            var layout = new NodeLayout(nodeId);

            layout.Center = ReadPoint();
            layout.Width  = myReader.ReadDouble() / 2;
            layout.Height = myReader.ReadDouble() / 2;

            return(layout);
        }
    public TransitionOutPoint(EditorStateNode node, NodeLayout layout, TransitionRequest requestType, float buttonSize = 5f)
    {
        this.layout     = layout;
        this.Node       = node ?? throw new ArgumentNullException(nameof(node));
        Transition      = null;
        Type            = requestType;
        this.buttonSize = buttonSize;
        var info = Type.GetInfo();

        toolTip = info != null ? info.DisplayName : Type.GetType().Name;
    }
Beispiel #15
0
    static void create_team_nodes(NodeLayout nl, List <PlayerData> nats)
    {
        for (int x = 0; x < nl.X; x++) // create all nodes first
        {
            for (int y = 0; y < nl.Y; y++)
            {
                Node node = new Node(x, y, new ProvinceData());

                if ((x == 0 && y == 0) || (x == nl.X - 1 && y == nl.Y - 1))
                {
                    node.SetWrapCorner(true);
                }

                m_nodes.Add(node);
            }
        }

        List <SpawnPoint> spawns = new List <SpawnPoint>();

        spawns.AddRange(nl.Spawns.Where(x => x.SpawnType == SpawnType.PLAYER));
        spawns = spawns.OrderBy(x => x.Y).ThenBy(x => x.X).ToList();

        while (nats.Any())
        {
            PlayerData pd = nats[0];

            List <PlayerData> all = new List <PlayerData>();
            all.AddRange(nats.Where(x => x.TeamNum == pd.TeamNum));

            nats.RemoveAll(x => x.TeamNum == pd.TeamNum);

            SpawnPoint        anchor  = spawns[0];
            List <SpawnPoint> ordered = spawns.OrderBy(x => x.DistanceTo(anchor)).ToList();

            int i = 0;

            foreach (PlayerData p in all)
            {
                SpawnPoint s = ordered[i];
                spawns.Remove(s);

                Node n = m_nodes.FirstOrDefault(x => x.X == s.X && x.Y == s.Y);
                n.SetPlayerInfo(p, new ProvinceData(p.NationData.CapTerrain));
                n.SetAssignedTerrain(true);

                m_starts.Add(n);

                i++;
            }
        }
    }
Beispiel #16
0
        private void DrawNode(NodeLayout node)
        {
            if (_nodeContents.TryGetValue(node, out var nodeContent))
            {
                if (node.IsSubGraph)
                {
                    nodeContent.Arrange(new Rect(node.Left, node.Top, node.Width, node.Height));

                    nodeContent.Width  = node.Width;
                    nodeContent.Height = node.Height;
                }
                nodeContent.SetValue(FrameworkElement.TagProperty, node);
                _view._hostCanvas.Children.Add(nodeContent);
                nodeContent.MouseMove  += NodeContent_MouseMove;
                nodeContent.MouseLeave += NodeContent_MouseLeave;
            }
            else
            {
                var            visual         = new DrawingVisual();
                DrawingContext drawingContext = visual.RenderOpen();
                if (!_view.OnDrawNode(node, drawingContext))
                {
                    Rect rect = new Rect(new Point(node.Position.X - node.Size.X / 2, node.Position.Y - node.Size.Y / 2), new Size(node.Size.X, node.Size.Y));

                    drawingContext.DrawRectangle(brushes[brushCounter], node.IsSubGraph ? EdgeTemplate.DefaultPen : null, rect);

                    ++brushCounter;
                    if (brushCounter >= brushes.Length)
                    {
                        brushCounter = 0;
                    }
                }
                drawingContext.Close();
                visual.SetValue(FrameworkElement.TagProperty, node);
                _visuals.Children.Add(visual);
            }

            if (node.IsSubGraph)
            {
                foreach (var childNode in node.Nodes)
                {
                    this.DrawNode(childNode);
                }
            }
        }
Beispiel #17
0
    public void CalcAdjacent(List <Connection> conns, NodeLayout nl)
    {
        if (Diagonal)
        {
            List <Node> diags = Node1.ConnectedNodes.Where(x => Node2.ConnectedNodes.Contains(x)).ToList();
            diags.Add(Node1);
            diags.Add(Node2);

            Adjacent = conns.Where(x => diags.Contains(x.Node1) && diags.Contains(x.Node2) && x != this).ToList();
        }
        else
        {
            List <Node> diags = Node1.ConnectedNodes.Where(x => Node2.ConnectedNodes.Contains(x)).ToList();
            diags.Add(Node1);
            diags.Add(Node2);

            Adjacent = conns.Where(x => diags.Contains(x.Node1) && diags.Contains(x.Node2) && x.Diagonal && x != this).ToList();
        }
    }
Beispiel #18
0
    IEnumerator do_generate(NodeLayout layout) // pipeline for initial generation of all nodes and stuff
    {
        foreach (GameObject obj in HideableButtons)
        {
            obj.SetActive(false);
        }

        if (layout == null)
        {
            layout = m_layouts.Layouts.FirstOrDefault(x => x.NumPlayers == m_player_count);
        }

        m_season = Season.SUMMER;

        // create the conceptual nodes and connections first
        WorldGenerator.GenerateWorld(m_teamplay, m_cluster_water, NatStarts.isOn, m_nations, layout);
        List <Connection> conns = WorldGenerator.GetConnections();
        List <Node>       nodes = WorldGenerator.GetNodes();

        // generate the unity objects using the conceptual nodes
        ElementManager mgr = GetComponent <ElementManager>();

        // position and resize the cameras
        Vector3 campos = new Vector3(layout.X * 0.5f * mgr.X - mgr.X, layout.Y * 0.5f * mgr.Y - mgr.Y, -10);

        CaptureCamera.transform.position = campos;

        float ortho = (mgr.Y * layout.Y * 100) / 100f / 2f;

        CaptureCamera.orthographicSize = ortho;

        yield return(StartCoroutine(mgr.GenerateElements(nodes, conns, layout)));

        ProvinceManager.s_province_manager.SetLayout(layout);
        ConnectionManager.s_connection_manager.SetLayout(layout);
        Camera.main.transform.position = campos + new Vector3(500f, 0f, 0f);

        foreach (GameObject obj in HideableButtons)
        {
            obj.SetActive(true);
        }
    }
        private XamDataTree CreateXamDataTree()
        {
            XamDataTree MyTree = new XamDataTree();

            ExperimentNode experiment1 = new ExperimentNode("Experiment1");

            CompoundsGroupNode compoundsGroup = new CompoundsGroupNode("CompoundsGroup1");

            ClusterNode cluster = new ClusterNode("Cluster1");

            cluster.AddChild(new ExperimentNode("Experiment2"));

            ExperimentNode experiment3 = new ExperimentNode("Experiment3");

            experiment3.HoverText = "My experiment";
            experiment3.AddChild(new CompoundsGroupNode("CompoundsGroup2"));
            experiment3.AddChild(new CompoundsGroupNode("CompoundsGroup3"));

            cluster.AddChild(experiment3);

            experiment1.AddChild(compoundsGroup);
            experiment1.AddChild(cluster);

            MyTree.ItemsSource = new ObservableCollection <IDataNode> {
                experiment1
            };

            NodeLayout mylayout = new NodeLayout();

            mylayout.Key               = "NodeLayout1";
            mylayout.TargetTypeName    = "IDataNode";
            mylayout.DisplayMemberPath = "Name";
            MyTree.GlobalNodeLayouts.Add(mylayout);

            return(MyTree);
        }
Beispiel #20
0
    public IEnumerator GenerateElements(List <ProvinceMarker> provs, List <ConnectionMarker> conns, NodeLayout layout, float x, float y)
    {
        setup_cam(x, y);

        return(m_art.Generate(provs, conns, layout));// todo: allow the user to pick which art style?
    }
Beispiel #21
0
 public void RegenerateElements(List <ProvinceMarker> provs, List <ConnectionMarker> conns, NodeLayout layout) // totally regen these provinces and their connections
 {
     m_art.Regenerate(provs, conns, layout);
 }
Beispiel #22
0
		public NodeEditorViewModel(NodeLayout nodeLayout)
		{
			NodeLayout = nodeLayout;
		}
Beispiel #23
0
    public static void GenerateText(string mapname, NodeLayout layout, ElementManager mgr, List<PlayerData> nations, Vector2 mins, Vector2 maxs, List<ProvinceMarker> provs, bool teamplay, int[] province_ids)
    {
        string data_folder = Application.dataPath;
        string folder = data_folder + "/Export/";
        string path = folder + mapname + ".map";

        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }

        if (File.Exists(path))
        {
            File.Delete(path);
        }

        int x = Mathf.RoundToInt(layout.X * mgr.X * 100);
        int y = Mathf.RoundToInt(layout.Y * mgr.Y * 100);

        provs = provs.Where(p => !p.IsDummy).ToList();
        provs = provs.OrderBy(p => p.ProvinceNumber).ToList();

        using (FileStream fs = File.Create(path))
        {
            var dom_col_r = (int)(GenerationManager.s_generation_manager.OverlayColor.r * 255f);
            var dom_col_g = (int)(GenerationManager.s_generation_manager.OverlayColor.g * 255f);
            var dom_col_b = (int)(GenerationManager.s_generation_manager.OverlayColor.b * 255f);
            var dom_col_a = (int)(GenerationManager.s_generation_manager.OverlayColor.a * 255f);

            string map_stats = string.Format("Player count: {0}, Throne count: {1}, Province count: {2}", layout.NumPlayers, layout.NumThrones, layout.TotalProvinces);

            write(fs, "-- Basic Map Information");
            write(fs, "#dom2title " + mapname);
            write(fs, "#imagefile " + mapname + ".tga");
            write(fs, "#winterimagefile " + mapname + "_winter.tga");
            write(fs, "#mapsize " + x + " " + y);
            write(fs, "#wraparound");
            write(fs, "#maptextcol 0.2 0.0 0.0 1.0");
            write(fs, $"#mapdomcol {dom_col_r} {dom_col_g} {dom_col_b} {dom_col_a}");
            write(fs, "#description \"[Generated by MapNuke]  " + map_stats + "\"");

            write(fs, "\n-- Start Location Data");

            foreach (PlayerData d in nations)
            {
                if (d.NationData.ID > -1)
                {
                    write(fs, "#allowedplayer " + d.NationData.ID);
                }
            }

            foreach (ProvinceMarker m in provs)
            {
                if (m.Node.HasNation)
                {
                    if (m.Node.Nation.NationData.ID == -1)
                    {
                        if (teamplay)
                        {
                            write(fs, "#teamstart " + m.ProvinceNumber + " " + m.Node.Nation.TeamNum);
                        }
                        else
                        {
                            write(fs, "#start " + m.ProvinceNumber);
                        }
                    }
                    else
                    {
                        write(fs, "#specstart " + m.Node.Nation.NationData.ID + " " + m.ProvinceNumber);
                    }
                }
            }

            write(fs, "\n-- Terrain Data");

            foreach (ProvinceMarker m in provs)
            {
                Terrain terr = m.Node.ProvinceData.Terrain;

                if (GeneratorSettings.s_generator_settings.UseClassicMountains && !terr.IsFlagSet(Terrain.MOUNTAINS) && mountain_count(m) >= 1f)
                {
                    terr |= Terrain.MOUNTAINS;
                }

                if (m.Node.Connections.Any(c => c.ConnectionType == ConnectionType.RIVER || c.ConnectionType == ConnectionType.SHALLOWRIVER))
                {
                    terr |= Terrain.FRESHWATER;
                }

                if (m.Node.HasNation)
                {
                    terr |= Terrain.START;
                }

                write(fs, "#terrain " + m.ProvinceNumber + " " + (int)terr);
            }

            write(fs, "\n-- Province Neighbour Data");

            foreach (ProvinceMarker m in provs)
            {
                foreach (Connection c in m.Node.Connections)
                {
                    write(fs, "#neighbour " + c.Node1.ID + " " + c.Node2.ID);

                    if (c.ConnectionType != ConnectionType.STANDARD && c.ConnectionType != ConnectionType.SHALLOWRIVER)
                    {
                        write(fs, "#neighbourspec " + c.Node1.ID + " " + c.Node2.ID + " " + (int)c.ConnectionType);
                    }
                }
            }

            write(fs, "\n-- Province Border Data");

            {
                int cur = 0;
                for (int cur_y = 0; cur_y < y; ++cur_y)
                {
                    int cur_id = 0;
                    int cur_px = 0;
                    int cur_x = 0;
                    for (; cur_x < x; ++cur_x)
                    {
                        int nex_id = province_ids[cur];
                        if (nex_id != cur_id)
                        {
                            if (cur_id != 0)
                            {
                                write(fs, "#pb " + (cur_x - cur_px) + " " + cur_y + " " + cur_px + " " + cur_id);
                            }
                            cur_px = 0;
                        }
                        cur_id = nex_id;
                        cur_px++;
                        cur++;
                    }
                    if (cur_id != 0) write(fs, "#pb " + (cur_x - cur_px) + " " + cur_y + " " + cur_px + " " + cur_id);
                }
            }

            fs.Close();
        }
    }
 public void SetLayout(NodeLayout layout)
 {
     m_layout = layout;
 }
 public NodeEditorViewModel(NodeLayout nodeLayout)
 {
     NodeLayout = nodeLayout;
 }
Beispiel #26
0
 private void Drop(ElementNode elementNode, Point point)
 {
     var element = elementNode;
     var elementLocation = new NodeLayout { LeftOffset = point.X, TopOffset = point.Y, NodeId = element.Id };
     NodeLayouts.Add(elementLocation);
 }
Beispiel #27
0
 public abstract void Regenerate(List <ProvinceMarker> provs, List <ConnectionMarker> conns, NodeLayout layout);
Beispiel #28
0
 public abstract IEnumerator Generate(List <ProvinceMarker> provs, List <ConnectionMarker> conns, NodeLayout layout);
Beispiel #29
0
    public override void Regenerate(List <ProvinceMarker> provs, List <ConnectionMarker> conns, NodeLayout layout)
    {
        List <GameObject>       result = new List <GameObject>();
        List <ConnectionMarker> linked = new List <ConnectionMarker>();

        foreach (ConnectionMarker m in conns)
        {
            if (m.LinkedConnection != null)
            {
                linked.Add(m.LinkedConnection);
            }
        }

        conns.AddRange(linked);

        foreach (ConnectionMarker m in m_all_conns)
        {
            m.ClearTriangles();
        }

        calc_triangles(m_all_conns, layout);

        foreach (ConnectionMarker cm in conns)
        {
            cm.CreatePolyBorder();
            cm.ClearWrapMeshes();
            cm.RecalculatePoly();
        }

        foreach (ProvinceMarker pm in provs)
        {
            pm.UpdateLabel();
            pm.RecalculatePoly();
            pm.ConstructPoly();
            pm.ClearWrapMeshes();
            result.AddRange(pm.CreateWrapMeshes()); // also create connection wrap meshes
        }

        List <ProvinceMarker> bad = provs.Where(x => x.NeedsRegen).ToList();
        List <ProvinceMarker> add = new List <ProvinceMarker>();

        if (bad.Any())
        {
            Debug.LogError(bad.Count + " provinces have invalid PolyBorders. Regenerating additional provinces.");

            foreach (ProvinceMarker b in bad)
            {
                foreach (ProvinceMarker adj in b.ConnectedProvinces)
                {
                    if (provs.Contains(adj))
                    {
                        continue;
                    }

                    if (adj.IsDummy)
                    {
                        add.AddRange(adj.LinkedProvinces);

                        if (adj.LinkedProvinces[0].LinkedProvinces.Count > 1)
                        {
                            foreach (ProvinceMarker link in adj.LinkedProvinces[0].LinkedProvinces) // 3 dummies
                            {
                                add.AddRange(adj.ConnectedProvinces);
                            }
                        }
                        else
                        {
                            add.AddRange(adj.LinkedProvinces[0].ConnectedProvinces);
                        }
                    }
                    else
                    {
                        add.Add(adj);

                        if (adj.LinkedProvinces != null && adj.LinkedProvinces.Any())
                        {
                            foreach (ProvinceMarker link in adj.LinkedProvinces)
                            {
                                add.AddRange(link.ConnectedProvinces);
                            }
                        }
                    }

                    if (!add.Contains(adj))
                    {
                        add.Add(adj);
                    }
                }

                if (b.LinkedProvinces != null && b.LinkedProvinces.Any())
                {
                    foreach (ProvinceMarker link in b.LinkedProvinces)
                    {
                        add.AddRange(link.ConnectedProvinces);
                    }
                }
            }

            foreach (ProvinceMarker pm in add)
            {
                foreach (ConnectionMarker m in pm.Connections)
                {
                    if (!conns.Contains(m) && ((provs.Contains(m.Prov1) || add.Contains(m.Prov1)) && (provs.Contains(m.Prov2) || add.Contains(m.Prov2))))
                    {
                        conns.Add(m);
                    }
                }
            }

            foreach (ConnectionMarker cm in conns)
            {
                cm.CreatePolyBorder();
                cm.ClearWrapMeshes();
                cm.RecalculatePoly();
            }

            foreach (ProvinceMarker pm in add)
            {
                pm.UpdateLabel();
                pm.RecalculatePoly();
                pm.ConstructPoly();
                pm.ClearWrapMeshes();
                result.AddRange(pm.CreateWrapMeshes()); // also create connection wrap meshes
            }

            foreach (ProvinceMarker pm in provs)
            {
                pm.UpdateLabel();
                pm.RecalculatePoly();
                pm.ConstructPoly();
                pm.ClearWrapMeshes();
                result.AddRange(pm.CreateWrapMeshes()); // also create connection wrap meshes
            }
        }

        foreach (ConnectionMarker cm in conns)
        {
            m_all_sprites.AddRange(cm.PlaceSprites());
        }

        foreach (ProvinceMarker pm in provs)
        {
            foreach (var unused in pm.CalculateSpritePoints())
            {
            }
            m_all_sprites.AddRange(pm.PlaceSprites());
        }

        List <SpriteMarker> all = new List <SpriteMarker>();

        foreach (SpriteMarker m in m_all_sprites)
        {
            if (m != null && m.gameObject != null)
            {
                all.Add(m);
                result.Add(m.gameObject);
            }
        }

        m_all_sprites = all;

        ElementManager.s_element_manager.AddGeneratedObjects(result);
        CaptureCam.s_capture_cam.Render();
    }
Beispiel #30
0
    /// <summary>
    /// Every diagonal connection forms a triangle with its adjacent connections, we want to compute the center of these triangles.
    /// Some trickery has to be done to account for the wrapping connections.
    /// </summary>
    void calc_triangles(List <ConnectionMarker> conns, NodeLayout layout)
    {
        foreach (ConnectionMarker c in conns)
        {
            List <ConnectionMarker> adj = get_adjacent(conns, c);

            if (adj.Count == 4)
            {
                if (c.IsEdge)
                {
                    if (c.Dummy.Node.X == 0 && c.Dummy.Node.Y == 0)
                    {
                        ConnectionMarker upper = adj.FirstOrDefault(x => x.Connection.Pos.y == 0f);
                        ConnectionMarker right = adj.FirstOrDefault(x => x.Connection.Pos.x == 0f);
                        ConnectionMarker lower = adj.FirstOrDefault(x => x != right && x != upper && x.Connection.Pos.x == c.Connection.Pos.x);
                        ConnectionMarker left  = adj.FirstOrDefault(x => x != right && x != upper && x != lower);

                        Vector3 upperpos    = upper.transform.position;
                        Vector3 rightpos    = right.transform.position;
                        Vector3 upperoffset = Vector3.zero;
                        Vector3 rightoffset = Vector3.zero;
                        bool    is_upper    = false;
                        bool    is_right    = false;

                        if (Vector3.Distance(upperpos, c.transform.position) > 4f)
                        {
                            upperoffset = new Vector3(0f, c.DummyOffset.y);
                            upperpos   += upperoffset;
                            is_upper    = true;
                        }

                        if (Vector3.Distance(rightpos, c.transform.position) > 4f)
                        {
                            rightoffset = new Vector3(c.DummyOffset.x, 0f);
                            rightpos   += rightoffset;
                            is_right    = true;
                        }

                        if (unique_nodes(c, lower, left) == 3)
                        {
                            Vector3 mid1 = (c.transform.position + lower.transform.position + left.transform.position) / 3;
                            Vector3 mid2 = (c.transform.position + upperpos + rightpos) / 3;

                            c.AddTriangleCenter(mid1);
                            lower.AddTriangleCenter(mid1);
                            left.AddTriangleCenter(mid1);

                            c.AddTriangleCenter(mid2);

                            if (is_upper)
                            {
                                upper.AddTriangleCenter(mid2 - upperoffset);
                            }
                            else
                            {
                                upper.AddTriangleCenter(mid2);
                            }

                            if (is_right)
                            {
                                right.AddTriangleCenter(mid2 - rightoffset);
                            }
                            else
                            {
                                right.AddTriangleCenter(mid2);
                            }
                        }
                        else
                        {
                            Vector3 mid1 = (c.transform.position + lower.transform.position + rightpos) / 3;
                            Vector3 mid2 = (c.transform.position + upperpos + left.transform.position) / 3;

                            c.AddTriangleCenter(mid1);
                            lower.AddTriangleCenter(mid1);

                            if (is_right)
                            {
                                right.AddTriangleCenter(mid1 - rightoffset);
                            }
                            else
                            {
                                right.AddTriangleCenter(mid1);
                            }

                            c.AddTriangleCenter(mid2);
                            left.AddTriangleCenter(mid2);

                            if (is_upper)
                            {
                                upper.AddTriangleCenter(mid2 - upperoffset);
                            }
                            else
                            {
                                upper.AddTriangleCenter(mid2);
                            }
                        }
                    }
                    else
                    {
                        ConnectionMarker upper = adj.FirstOrDefault(x => x.Connection.Pos.y == c.Connection.Pos.y + 0.5f || c.Connection.Pos.y == 0f);
                        ConnectionMarker lower = adj.FirstOrDefault(x => x.Connection.Pos.y != c.Connection.Pos.y && x != upper);
                        ConnectionMarker right = adj.FirstOrDefault(x => x.Connection.Pos.x == c.Connection.Pos.x + 0.5f || c.Connection.Pos.x == 0f);
                        ConnectionMarker left  = adj.FirstOrDefault(x => x.Connection.Pos.x != c.Connection.Pos.x && x != right);

                        Vector3 upperpos    = upper.transform.position;
                        Vector3 rightpos    = right.transform.position;
                        Vector3 upperoffset = Vector3.zero;
                        Vector3 rightoffset = Vector3.zero;
                        bool    is_upper    = false;
                        bool    is_right    = false;

                        if (Vector3.Distance(upperpos, c.transform.position) > 4f)
                        {
                            upperoffset = c.DummyOffset;
                            upperpos   += upperoffset;
                            is_upper    = true;
                        }

                        if (Vector3.Distance(rightpos, c.transform.position) > 4f)
                        {
                            rightoffset = c.DummyOffset;
                            rightpos   += rightoffset;
                            is_right    = true;
                        }

                        if (unique_nodes(c, lower, left) == 3)
                        {
                            Vector3 mid1 = (c.transform.position + lower.transform.position + left.transform.position) / 3;
                            Vector3 mid2 = (c.transform.position + upperpos + rightpos) / 3;

                            c.AddTriangleCenter(mid1);
                            lower.AddTriangleCenter(mid1);
                            left.AddTriangleCenter(mid1);

                            c.AddTriangleCenter(mid2);

                            if (is_upper)
                            {
                                upper.AddTriangleCenter(mid2 - upperoffset);
                            }
                            else
                            {
                                upper.AddTriangleCenter(mid2);
                            }

                            if (is_right)
                            {
                                right.AddTriangleCenter(mid2 - rightoffset);
                            }
                            else
                            {
                                right.AddTriangleCenter(mid2);
                            }
                        }
                        else
                        {
                            Vector3 mid1 = (c.transform.position + lower.transform.position + rightpos) / 3;
                            Vector3 mid2 = (c.transform.position + upperpos + left.transform.position) / 3;

                            c.AddTriangleCenter(mid1);
                            lower.AddTriangleCenter(mid1);

                            if (is_right)
                            {
                                right.AddTriangleCenter(mid1 - rightoffset);
                            }
                            else
                            {
                                right.AddTriangleCenter(mid1);
                            }

                            c.AddTriangleCenter(mid2);
                            left.AddTriangleCenter(mid2);

                            if (is_upper)
                            {
                                upper.AddTriangleCenter(mid2 - upperoffset);
                            }
                            else
                            {
                                upper.AddTriangleCenter(mid2);
                            }
                        }
                    }
                }
                else
                {
                    ConnectionMarker anchor = adj[0];
                    ConnectionMarker other  = null;
                    adj.Remove(anchor);

                    foreach (ConnectionMarker c2 in adj)
                    {
                        if (unique_nodes(c, c2, anchor) == 3)
                        {
                            other = c2;

                            Vector3 mid = (c.transform.position + c2.transform.position + anchor.transform.position) / 3;
                            c.AddTriangleCenter(mid);
                            c2.AddTriangleCenter(mid);
                            anchor.AddTriangleCenter(mid);
                            break;
                        }
                    }

                    adj.Remove(other);

                    anchor = adj[0];
                    ConnectionMarker c3 = adj[1];

                    Vector3 mid2 = (c.transform.position + c3.transform.position + anchor.transform.position) / 3;
                    c.AddTriangleCenter(mid2);
                    c3.AddTriangleCenter(mid2);
                    anchor.AddTriangleCenter(mid2);
                }
            }
        }
    }
Beispiel #31
0
    public override IEnumerator Generate(List <ProvinceMarker> provs, List <ConnectionMarker> conns, NodeLayout layout)
    {
        List <GameObject> result = new List <GameObject>();

        m_all_conns = conns;
        m_all_provs = provs;

        calc_triangles(conns, layout);

        foreach (ConnectionMarker cm in conns)
        {
            cm.CreatePolyBorder();
            cm.ClearWrapMeshes();
            cm.RecalculatePoly();
            if (Util.ShouldYield())
            {
                yield return(null);
            }
        }

        foreach (ProvinceMarker pm in provs)
        {
            pm.UpdateLabel();
            pm.RecalculatePoly();
            pm.ConstructPoly();
            pm.ClearWrapMeshes();
            result.AddRange(pm.CreateWrapMeshes());
            if (Util.ShouldYield())
            {
                yield return(null);
            }
        }

        m_all_sprites = new List <SpriteMarker>();

        foreach (ConnectionMarker cm in conns)
        {
            m_all_sprites.AddRange(cm.PlaceSprites());
            if (Util.ShouldYield())
            {
                yield return(null);
            }
        }

        foreach (ProvinceMarker pm in provs)
        {
            foreach (var x in pm.CalculateSpritePoints())
            {
                yield return(x);
            }
            m_all_sprites.AddRange(pm.PlaceSprites());
            if (Util.ShouldYield())
            {
                yield return(null);
            }
        }

        foreach (SpriteMarker m in m_all_sprites)
        {
            result.Add(m.gameObject);
            if (Util.ShouldYield())
            {
                yield return(null);
            }
        }

        ElementManager.s_element_manager.AddGeneratedObjects(result);
        CaptureCam.s_capture_cam.Render();
    }
Beispiel #32
0
    static void create_basic_nodes(NodeLayout nl, List <PlayerData> nats, List <PlayerData> water)
    {
        for (int x = 0; x < nl.X; x++) // create all nodes first
        {
            for (int y = 0; y < nl.Y; y++)
            {
                Node node = new Node(x, y, new ProvinceData());

                if ((x == 0 && y == 0) || (x == nl.X - 1 && y == nl.Y - 1))
                {
                    node.SetWrapCorner(true);
                }

                m_nodes.Add(node);

                if (nl.HasSpawn(x, y, SpawnType.PLAYER))
                {
                    node.ProvinceData.AddTerrainFlag(Terrain.START);
                    m_starts.Add(node);
                }
            }
        }

        if (m_cluster_water) // put water nations close together if the user has this option ticked
        {
            List <Node> starts = m_nodes.Where(x => x.ProvinceData.Terrain.IsFlagSet(Terrain.START)).ToList();

            Node        start = starts.GetRandom();
            List <Node> nodes = get_closest_nodes(start);

            foreach (PlayerData d in water)
            {
                Node n = nodes[0];
                nodes.Remove(n);
                starts.Remove(n);

                n.SetPlayerInfo(d, new ProvinceData(d.NationData.CapTerrain));
                n.SetAssignedTerrain(true);
            }

            foreach (PlayerData d in nats)
            {
                Node n = starts.GetRandom();
                starts.Remove(n);

                n.SetPlayerInfo(d, new ProvinceData(d.NationData.CapTerrain));
                n.SetAssignedTerrain(true);
            }
        }
        else
        {
            nats.AddRange(water);

            foreach (Node n in m_nodes.Where(x => x.ProvinceData.Terrain.IsFlagSet(Terrain.START)))
            {
                PlayerData d = nats.GetRandom();
                nats.Remove(d);

                n.SetPlayerInfo(d, new ProvinceData(d.NationData.CapTerrain));
                n.SetAssignedTerrain(true);
            }
        }
    }
Beispiel #33
0
 private void Drop(ChannelNode channelNode, Point point)
 {
     var channel = channelNode;
     var channelLocation = new NodeLayout { LeftOffset = point.X, TopOffset = point.Y, NodeId = channel.Id };
     NodeLayouts.Add(channelLocation);
 }