示例#1
0
        private void AddToDo(SCOwArea currentArea, short areaId, SCRequirementsSet requirements)
        {
            var area = main.Overworld.Areas[areaId];

            if ((area.Tile & SCBitFlags.Ocean) > 0 && (currentArea.Tile & SCBitFlags.Ocean) == 0 && currentArea != shipDockArea)
            {
                return;
            }

            if (tunnels.TryGetValue(areaId, out var tlist))
            {
                foreach (var tunnel in tlist)
                {
                    var newRequirements = requirements?.Restrict(tunnel.Requirements);
                    todoset.Enqueue(new SCLogicAreaQueueEntry {
                        AreaId = tunnel.AreaId, Requirements = newRequirements
                    });
                }
            }

            if ((area.Tile & SCBitFlags.Bridge) > 0)
            {
                CrossBridge(currentArea, requirements, area);
            }
            else if ((area.Tile & SCBitFlags.Canal) > 0)
            {
                CrossCanal(currentArea, requirements, area);
            }
            else
            {
                todoset.Enqueue(new SCLogicAreaQueueEntry {
                    AreaId = areaId, Requirements = requirements
                });
            }
        }
示例#2
0
        private void CrossCanal(SCOwArea currentArea, SCRequirementsSet requirements, SCOwArea area)
        {
            if ((currentArea.Tile & SCBitFlags.Ocean) == 0)
            {
                foreach (var link in area.Links)
                {
                    var area2 = main.Overworld.Areas[link];

                    if ((area2.Tile & SCBitFlags.Ocean) == 0)
                    {
                        todoset.Enqueue(new SCLogicAreaQueueEntry {
                            AreaId = link, Requirements = requirements
                        });
                    }
                }
            }
            else
            {
                var newRequirements = requirements?.Restrict(SCRequirements.Canal);

                foreach (var link in area.Links)
                {
                    var area2 = main.Overworld.Areas[link];

                    if ((area2.Tile & SCBitFlags.Ocean) > 0)
                    {
                        todoset.Enqueue(new SCLogicAreaQueueEntry {
                            AreaId = link, Requirements = newRequirements
                        });
                    }
                }
            }
        }
示例#3
0
        private void CheckArea(short areaId, SCRequirementsSet flags)
        {
            var area = main.Overworld.Areas[areaId];

            var newFlags = flags.Restrict(area.Requirements);

            if (processedAreas.TryGetValue(areaId, out var logicArea))
            {
                if (logicArea.Requirements.Merge(newFlags))
                {
                    foreach (var link in area.Links)
                    {
                        AddToDo(area, link, newFlags);
                    }
                }
            }
            else
            {
                var newLogicArea = new SCLogicArea(areaId, area, newFlags);
                processedAreas.Add(areaId, newLogicArea);

                foreach (var link in area.Links)
                {
                    AddToDo(area, link, newFlags);
                }
            }
        }