示例#1
0
        public void PrintZoneInfo(ZoneStatus zoneStatus, PlayerStatus status, ZoneTypers zoneTypers)
        {
            // Print zone info.
            var zone = Data.Data.GetZone(status.Zone.ZoneId);

            _output.WriteLine(new string('-', HalfWidth));
            _output.WriteLine(zone.Name);
            _output.WriteLine();

            PrintWrapped(zone.Description);
            _output.WriteLine($"{new string(' ', HalfWidth + SeparatorWidth)}{new string('-', HalfWidth)}");

            var exits = zone.ZoneExits
                        .Select(id => Data.Data.GetPassZone(id))
                        .Select(z => new
            {
                PassZoneId  = z.PassZoneId,
                Name        = z.ForwardPassage.Name,
                Description = z.ForwardPassage.Description,
                Distance    = z.ForwardPassage.Distance
            });

            var entrances = zone.ZoneEntrances
                            .Select(id => Data.Data.GetPassZone(id))
                            .Select(z => new
            {
                PassZoneId  = z.PassZoneId,
                Name        = z.BackwardPassage.Name,
                Description = z.BackwardPassage.Description,
                Distance    = z.BackwardPassage.Distance
            });

            var ways = exits.Concat(entrances).OrderBy(z => z.Name);

            foreach (var way in ways)
            {
                var lines = WrapText(way.Description, HalfWidth);

                var isFirstLine = true;
                foreach (var line in lines)
                {
                    if (isFirstLine)
                    {
                        _output.Write($"{line.PadRight(HalfWidth)}{new string(' ', SeparatorWidth)}{way.Name}   ");
                        _output.Write(zoneTypers.GetZoneTyper(way.PassZoneId));
                        _output.WriteLine();
                    }
                    else
                    {
                        _output.WriteLine(line);
                    }

                    isFirstLine = false;
                }

                _output.WriteLine($"{new string(' ', HalfWidth + SeparatorWidth)}{new string('-', HalfWidth)}");
            }

            _output.WriteLine(new string('-', HalfWidth));
            _output.WriteLine();

            foreach (var neighbor in zoneStatus.Neighbors)
            {
                var isInBattle = neighbor.IsInBattle ? "B " : string.Empty;
                var isDead     = neighbor.IsDead ? "D " : string.Empty;
                _output.WriteLine($"{isDead}{isInBattle}{neighbor.Name}");
            }

            _output.WriteLine(new string('_', Width));
            _output.WriteLine();

            _output.Write($"Attack   ");
            _output.WriteLine(zoneTypers.AttackTyper);
        }
示例#2
0
 public void SetZone(ZoneTypers zoneTypers)
 {
     Reset(zoneTypers);
     ZoneTypers = zoneTypers;
 }
示例#3
0
        private void Update()
        {
            lock (_lock)
            {
                Console.Clear();

                if (_status == null)
                {
                    _printer.PrintLoadingScreen();
                    return;
                }

                _printer.PrintNotifications(_notifications);

                // Battle priority is higher than alerts.
                if (_status.BattleStatus != null)
                {
                    if (_typers.BattleTypers == null)
                    {
                        var battleTypers = new BattleTypers(this, _status.BattleStatus.SkillIds, _status.BattleStatus.BattleNeighbors.Concat(new[] { _status.BattleStatus.Player }).Select(p => p.PlayerId));
                        _typers.SetBattle(battleTypers);
                    }

                    _printer.PrintBattleStatus(_status.BattleStatus, _typers.BattleTypers);
                    return;
                }

                _printer.PrintPlayerStatus(_status.PlayerStatus);

                if (_typers.AlertTypers == null && _alerts.Any())
                {
                    _currentAlert = _alerts.Dequeue();
                    var alertTypers = new AlertTypers(this);
                    _typers.OpenAlert(alertTypers);
                }

                if (_typers.AlertTypers != null)
                {
                    _printer.PrintAlert(_currentAlert, _typers.AlertTypers);
                    return;
                }

                if (_isPlayerSelecting)
                {
                    var battleEligibleNeighbors = _status.ZoneStatus.Neighbors
                                                  .Where(n => !n.IsInBattle && !n.IsDead);

                    if (_typers.PlayerSelectionTypers == null)
                    {
                        var playerSelectionTypers = new PlayerSelectionTypers(this, battleEligibleNeighbors.Select(n => n.PlayerId));
                        _typers.SetPlayerSelection(playerSelectionTypers);
                    }

                    if (_selectedPlayers != null) // Typer is done.
                    {
                        _connection.Send(new StartBattleCommand
                        {
                            ParticipantsExceptMeIds = _selectedPlayers
                        });

                        _selectedPlayers   = null;
                        _isPlayerSelecting = false;
                        return;
                    }

                    _printer.PrintPlayerSelectionStatus(battleEligibleNeighbors, _typers.PlayerSelectionTypers);
                    return;
                }

                if (_status.PlayerStatus.PassZone != null)
                {
                    if (_typers.PassZoneTypers == null)
                    {
                        var passZoneTypers = new PassZoneTypers(this, _status.PlayerStatus.PassZone);
                        _typers.SetPassZone(passZoneTypers);
                        _previousDirection = _status.PlayerStatus.PassZone.Direction;
                    }

                    if (_previousDirection != _status.PlayerStatus.PassZone.Direction)
                    {
                        // Update for new direction and distance.
                        var passZoneTypers = new PassZoneTypers(this, _status.PlayerStatus.PassZone); // Can't flip direction. Need to recreate because need smaller/bigger text for reverse direction.
                        _typers.SetPassZone(passZoneTypers);
                        _previousDirection = _status.PlayerStatus.PassZone.Direction;
                    }

                    _printer.PrintPassingStatus(_status.PassZoneStatus, _status.PlayerStatus.PassZone, _typers.PassZoneTypers);
                    return;
                }

                var zone = Data.Data.GetZone(_status.PlayerStatus.Zone.ZoneId);

                if (_typers.ZoneTypers == null)
                {
                    var zoneTypers = new ZoneTypers(this, zone.ZoneExits.Concat(zone.ZoneEntrances));
                    _typers.SetZone(zoneTypers);
                }

                _printer.PrintZoneInfo(_status.ZoneStatus, _status.PlayerStatus, _typers.ZoneTypers);
            }
        }