/// <summary> /// Отрисовка городов на карте /// </summary> /// <param name="cityPosition">позиции городов</param> /// <param name="playerPosition">позиция игрока</param> public static void DrowCity(List <MainGameStructures.Position> cityPosition, MainGameStructures.Position playerPosition) { ClearMap(Map, CitySymble); for (int i = 0; i < cityPosition.Count; i++) { Map[MapSizeY / 2 - playerPosition.Y + cityPosition[i].Y, MapSizeX / 2 - playerPosition.X + cityPosition[i].X] = CitySymble; } }
/// <summary> /// Генерация монстра относительно позиции игрока на карте /// </summary> /// <param name="playerPosition">позиция игрока</param> /// <returns>позиция монстра</returns> public static MainGameStructures.Position EnemyGenerationPosition(MainGameStructures.Position playerPosition) { var enemyPosition = new MainGameStructures.Position { X = Program.Random.Next(playerPosition.X - Window.MapSizeX / 2, playerPosition.X + Window.MapSizeX / 2), Y = Program.Random.Next(playerPosition.Y - Window.MapSizeY / 2, playerPosition.Y + Window.MapSizeY / 2) }; return(enemyPosition); }
/// <summary> /// Генерация позиции клада /// </summary> /// <param name="playerPosition">Позиция игрока</param> /// <returns>Позиция клада</returns> public MainGameStructures.Position TreasureGenerationPosition(MainGameStructures.Position playerPosition) { var treasurePosition = new MainGameStructures.Position { X = Program.Random.Next(playerPosition.X - Window.MapSizeX / 3, playerPosition.X + Window.MapSizeX / 3), Y = Program.Random.Next(playerPosition.Y - Window.MapSizeY / 3, playerPosition.Y + Window.MapSizeY / 3) }; return(treasurePosition); }
/// <summary> /// Отрисовка кладов на карте /// </summary> /// <param name="treasurePosition">позиция клада</param> /// <param name="playerPosition">позиция игрока</param> /// <param name="moveX">сдвиг по оси Х относительно середины карты</param> /// <param name="moveY">сдвиг по оси У относительно середины карты</param> public static void DrowTreasure(MainGameStructures.Position treasurePosition, MainGameStructures.Position playerPosition, int moveX = 0, int moveY = 0) { ClearMap(Map, TreasureSymble); if (MapSizeY / 2 - playerPosition.Y + treasurePosition.Y + moveY >= 0 && MapSizeY / 2 - playerPosition.Y + treasurePosition.Y + moveY < MapSizeY && MapSizeX / 2 - playerPosition.X + treasurePosition.X + moveX >= 0 && MapSizeX / 2 - playerPosition.X + treasurePosition.X + moveX < MapSizeX) { Map[MapSizeY / 2 - playerPosition.Y + treasurePosition.Y + moveY, MapSizeX / 2 - playerPosition.X + treasurePosition.X + moveX] = TreasureSymble; } }
/// <summary> /// Отрисовка врагов на карте /// </summary> /// <param name="enemyPosition">позиция врагов</param> /// <param name="playerPosition">позиция игрока</param> /// <param name="moveX">сдвиг по оси Х относительно середины карты</param> /// <param name="moveY">сдвиг по оси У относительно середины карты</param> public static void DrowEnemy(MainGameStructures.Position enemyPosition, MainGameStructures.Position playerPosition, int moveX = 0, int moveY = 0) { ClearMap(Map, EnemySymble); if (MapSizeY / 2 - playerPosition.Y + enemyPosition.Y + moveY >= 0 && MapSizeY / 2 - playerPosition.Y + enemyPosition.Y + moveY < MapSizeY && MapSizeX / 2 - playerPosition.X + enemyPosition.X + moveX >= 0 && MapSizeX / 2 - playerPosition.X + enemyPosition.X + moveX < MapSizeX) { Map[MapSizeY / 2 - playerPosition.Y + enemyPosition.Y + moveY, MapSizeX / 2 - playerPosition.X + enemyPosition.X + moveX] = EnemySymble; } }
/// <summary> /// Города, которые находятся в зоне видимости /// </summary> /// <param name="playerPosition"> Позиция игрока </param> /// <returns> Лист с городами, которые нужно отобразить на карте </returns> public static List <MainGameStructures.Position> IsSityNear(MainGameStructures.Position playerPosition) { var cities = new List <MainGameStructures.Position>(); foreach (var t in Program.Cities) { if (Math.Abs(playerPosition.X - t.Position.X) <= Window.MapSizeX / 2 && Math.Abs(playerPosition.Y - t.Position.Y) <= Window.MapSizeY / 2) { cities.Add(t.Position); } } return(cities); }
/// <summary> /// Проверка столкновения игрока и монстров /// </summary> /// <param name="enemy">монстры</param> /// <param name="player">игрок</param> /// <param name="enemyPosition">позиция монстров</param> public static void CheckPlayer(List <Enemy> enemy, Player player, MainGameStructures.Position enemyPosition) { if (EnemyExist && enemyPosition.X == player.Position.X && enemyPosition.Y == player.Position.Y && !enemy[0].Mimicry) { Battle.GoBattle(player, enemy); Window.ClearMap(Window.Map, Window.EnemySymble); Enemy.EnemyExist = false; } else if (EnemyExist && IsEnemyNear(enemyPosition, player.Position) && enemy[0].Mimicry) { Battle.GoBattle(player, enemy); Window.ClearMap(Window.Map, Window.EnemySymble); Enemy.EnemyExist = false; } }
public City(string name, MainGameStructures.Position position) { RealCosts = new Dictionary <string, float>(); SetCost(); OneCoinCountHP = 2; this.Name = name; this.Position = position; Places.Add("Магазин для покупки брони"); Places.Add("Магазин для продажи брони"); Places.Add("Ремонт брони"); Places.Add("Лечебница"); Places.Add("Магазин мечей"); Places.Add("Библиотека"); Places.Add("Магазин луков"); Places.Add("Аптека"); Places.Add("Взять задание"); Places.Add("Получить награду за задание"); Places.Add("Оборонное снаряжение"); Tasks = new List <Task>(); }
/// <summary> /// Создание клада (позиции, монстров) /// </summary> /// <param name="player">Игрок</param> /// <param name="enemyPosition">Позиция монстро(для того, чтобы не было конфликтов с городами)</param> public Treasure(Player player, MainGameStructures.Position enemyPosition) { this.Position = TreasureGenerationPosition(player.Position); TreasureExist = true; bool exictPosition = false; do { exictPosition = false; foreach (var city in Program.Cities) { if (city.Position.X == this.Position.X && city.Position.Y == this.Position.Y) { this.Position = TreasureGenerationPosition(player.Position); exictPosition = true; break; } } if (enemyPosition.X == this.Position.X && enemyPosition.Y == this.Position.Y) { this.Position = TreasureGenerationPosition(player.Position); exictPosition = true; } } while (exictPosition); var rand = Program.Random.Next(0, 101 - (player.Level * (int)Math.Sqrt(player.Level) <= 100 ? player.Level * (int)Math.Sqrt(player.Level) : 1)); if (rand < 80) { this.IsEnemy = true; } else { this.IsEnemy = false; } this.enemy = CreateEnemyForTreasure(player.Level); }
// данный тип усреднен public Ranger(string name, MainGameStructures.Position position) : base(name, position) { this.BattleSkill = 0; this.MaxHealth = 220; this.MaxMana = 160; this.PowerAttack = 10; this.Type = PlayerType.Ranger; this.SwordSkill = 0.75f; this.BowSkill = 0.9f; this.MagicSkill = 0.8f; this.CurrentMana = this.MaxMana; this.CurrentHealth = this.MaxHealth; this.AddSword(Program.Swords[2]); this.Bow = Program.Bows[0]; this.AddArmor(Program.ArmorComplects[1]); }
// Волшебник имеет среднее здоровье и атаку, но зато у него много маны public Wizard(string name, MainGameStructures.Position position) : base(name, position) { this.BattleSkill = 0; this.MaxHealth = 200; this.MaxMana = 250; this.PowerAttack = 8; this.Type = PlayerType.Wizard; this.SwordSkill = 0.7f; this.BowSkill = 0.5f; this.MagicSkill = 0.9f; this.CurrentMana = this.MaxMana; this.CurrentHealth = this.MaxHealth; this.AddSword(Program.Swords[1]); this.TryOnProtection(Program.ProtectionThings[1]); this.Spells = new List <Spell> { Program.Spells[1] }; }
// У воина изначально более крепкое здоровье и сильная атака, но низкая мана public Warrior(string name, MainGameStructures.Position position) : base(name, position) { this.BattleSkill = 10; this.MaxHealth = 250; this.MaxMana = 80; this.PowerAttack = 10; this.Type = PlayerType.Warrior; this.SwordSkill = 0.8f; this.BowSkill = 0.4f; this.MagicSkill = 0.7f; this.CurrentHealth = this.MaxHealth; this.CurrentMana = this.MaxMana; this.AddSword(Program.Swords[0]); this.Spells.Add(Program.Spells[3]); this.AddArmor(Program.ArmorComplects[0]); this.TryOnProtection(Program.ProtectionThings[0]); }
// Базовые характеристики для любого типа public Player(string name, MainGameStructures.Position position) { this.Name = name; this.Position = position; this.Level = 1; this.MagicLevel = 1; this.Money = 200; this.NextLevelBorder = 150; this.Swords = new List <Sword>(); this.Armor = new ArmorComplect(); this.Spells = new List <Spell>(); this.Tasks = new List <Tuple <MainGameStructures.Position, Task> >(); this.MedicineKits = new List <MainGameStructures.MedicineKit>() { new MainGameStructures.MedicineKit { HpToAdd = 50 }, new MainGameStructures.MedicineKit { HpToAdd = 50 }, new MainGameStructures.MedicineKit { HpToAdd = 50 }, new MainGameStructures.MedicineKit { HpToAdd = 50 }, new MainGameStructures.MedicineKit { HpToAdd = 50 }, new MainGameStructures.MedicineKit { HpToAdd = 150 } }; this.IsLive = true; }
/// <summary> /// Можно ли создавать нового монтра (достаточно ли далеко отошли от предыдущего) /// </summary> /// <param name="lastPosition">предыдущая позиция</param> /// <param name="newPosition">текущая позиция</param> /// <returns>Можно ли генерировать</returns> public static bool MayNewEnemy(MainGameStructures.Position lastPosition, MainGameStructures.Position newPosition) { return((int)(Math.Sqrt((lastPosition.X - newPosition.X) * (lastPosition.X - newPosition.X) + (newPosition.Y - lastPosition.Y) * (newPosition.Y - lastPosition.Y))) > 15); }
/// <summary> /// Проверка того, находится ли игрок на клетке с кладом и начало боя, если игрока заметили монстры /// </summary> /// <param name="treasure"> Клад </param> /// <param name="moveX"> Сдвиг по оси Х относительно середины карты </param> /// <param name="moveY"> Сдвиг по оси У относительно середины карты </param> /// <param name="enemyPosition"> Позиция монстра (чтобы избежать столкновения монстров и кладов) </param> public void CheckAndCreateTreasure(ref Treasure treasure, int moveX, int moveY, MainGameStructures.Position enemyPosition) { treasure.CkeckPlayer(this); if (treasure.MayNewTreasure(Treasure.TheLastTreasurePosition, this.Position)) { treasure = new Treasure(this, enemyPosition); Window.DrowTreasure(treasure.Position, this.Position, moveX, moveY); Treasure.TheLastTreasurePosition = treasure.Position; } }
/// <summary> /// Создание монстров в зависимости от уровня игрока /// </summary> /// <param name="playerLevel">Уровень игрока</param> /// <param name="playerPosition">Позиция игрока</param> /// <returns>позиция монстров и лист с ними</returns> public static Tuple <MainGameStructures.Position, List <Enemy> > CreateEnemy(int playerLevel, MainGameStructures.Position playerPosition) { EnemyExist = true; var enemyPosition = EnemyGenerationPosition(playerPosition); bool exictPosition = false; do { exictPosition = false; foreach (var city in Program.Cities) { if (city.Position.X == enemyPosition.X && city.Position.Y == enemyPosition.Y) { enemyPosition = EnemyGenerationPosition(playerPosition); exictPosition = true; break; } } } while (exictPosition); /* То, какие виды монстров и с какой вероятностью будут попадаться, завит от уровня персонажа. Чем выше уровень, тем сильнее монстры. * На разных уровнях могут быть разные виды монстров. Также, чем больше уровень, тем выше вероятность выпадения дракона и смешанных монстров. */ int rand = Program.Random.Next(1 + LowerBorderEnemyGeneration - (2 * playerLevel < 50? 2 * playerLevel:50), 151 + SupremeBorderEnemyGeneration + (3 * playerLevel < 50 ? 3 * playerLevel : 50)); rand %= 400; if (rand < 1 + LowerBorderEnemyGeneration) { return(Tuple.Create(enemyPosition, EnemyMix.CreateEnemyMix(playerLevel))); } if (rand > 150 + SupremeBorderEnemyGeneration) { return(Tuple.Create(enemyPosition, EnemyDragon.CreateEnemyDragon(playerLevel))); } if (rand >= 1 && rand <= 50) { return(Tuple.Create(enemyPosition, EnemyWolf.CreateEnemyWolf(playerLevel))); } if (rand > 50 && rand <= 100) { return(Tuple.Create(enemyPosition, EnemyGoblin.CreateEnemyGoblin(playerLevel))); } if (rand > 100 && rand <= 150) { return(Tuple.Create(enemyPosition, EnemyBear.CreateEnemyBear(playerLevel))); } if (rand > 150 && rand <= 200) { return(Tuple.Create(enemyPosition, EnemyOrk.CreateEnemyOrk(playerLevel))); } if (rand > 200 && rand <= 220) { return(Tuple.Create(enemyPosition, EnemyTriton.CreateEnemyTriton(playerLevel))); } if (rand > 220 && rand <= 250) { return(Tuple.Create(enemyPosition, EnemyBandit.CreateEnemyBandit(playerLevel))); } if (rand > 250 && rand <= 300) { return(Tuple.Create(enemyPosition, EnemyGriffin.CreateGriffin(playerLevel))); } if (rand > 300 && rand <= 350) { return(Tuple.Create(enemyPosition, EnemyDarkKnight.CreateEnemyDarkKnight(playerLevel))); } return(Tuple.Create(enemyPosition, EnemyGolem.CreateEnemyGolem(playerLevel))); }
/// <summary> /// Проверка того, находится ли игрок в зоне поражения невидимых монстров /// </summary> /// <param name="enemyPosition">позиция монстров</param> /// <param name="playerPosition">позиция игрока</param> /// <returns>Находится ли игрок в зоне поражения</returns> public static bool IsEnemyNear(MainGameStructures.Position enemyPosition, MainGameStructures.Position playerPosition) { return(Math.Abs(enemyPosition.X - playerPosition.X) <= Window.MapSizeX / 4 && Math.Abs(enemyPosition.Y - playerPosition.Y) <= Window.MapSizeY / 4); }
/// <summary> /// Проверка того, можно ли создавать новых монстров /// </summary> /// <param name="lastPosition">Предыдущая позиция генерации клада</param> /// <param name="newPosition">Текущая позиция</param> /// <returns>Можно ли генерировать</returns> public bool MayNewTreasure(MainGameStructures.Position lastPosition, MainGameStructures.Position newPosition) { return((int)(Math.Sqrt((lastPosition.X - newPosition.X) * (lastPosition.X - newPosition.X) + (newPosition.Y - lastPosition.Y) * (newPosition.Y - lastPosition.Y))) > 30); }
// Находим расстояние между двумя позициями public static double GetDistance(MainGameStructures.Position first, MainGameStructures.Position second) => Math.Sqrt(Math.Pow(first.X - second.X, 2) + Math.Pow(first.Y - second.Y, 2));