using System; using System.Collections.Generic; using UnityEngine; // ГЛОБАЛЬНАЯ КАРТА: таблицы. Характеристики юнитов, поселения на карте, скорость походов. // Баланс правится здесь. Логика -- в WorldSystem.cs, отображение -- в WorldMapPanel.cs. // Боевые характеристики одного воина (индексы совпадают с GameData.Troops) public class UnitStats { public int hp; // здоровье public int attack; // урон за раунд public int defense; // снижает получаемый урон (каждая единица = -8%) public float speed; // скорость на карте (1 = обычная). Армия идёт со скоростью самого медленного public int carry; // сколько ресурсов уносит один воин public UnitStats(int hp, int attack, int defense, float speed, int carry) { this.hp = hp; this.attack = attack; this.defense = defense; this.speed = speed; this.carry = carry; } } // Поселение на карте public class SettlementDef { public string id; public string name; public Vector2 pos; // позиция на карте, 0..1 по ширине и высоте public bool isHome; // город игрока public int[] baseGarrison; // защитники на 1 уровне (по типам войск) public RewardItem[] baseLoot; // что можно унести на 1 уровне public float respawnMinutes; // через сколько поселение отстраивается после разграбления public Color color; public SettlementDef(string id, string name, float x, float y, Color color) { this.id = id; this.name = name; pos = new Vector2(x, y); this.color = color; } } public static class WorldData { // Индексы: 0 Пехота, 1 Лучники, 2 Кавалерия, 3 Осадные public static readonly UnitStats[] Units = { new UnitStats(hp: 10, attack: 3, defense: 3, speed: 1.0f, carry: 10), new UnitStats(hp: 7, attack: 5, defense: 1, speed: 1.0f, carry: 8), new UnitStats(hp: 14, attack: 6, defense: 2, speed: 1.6f, carry: 15), new UnitStats(hp: 20, attack: 12, defense: 1, speed: 0.6f, carry: 5), }; // Сколько секунд идёт армия со скоростью 1 через всю карту (расстояние 1.0). // Для тестов маленькое -- поход туда-обратно занимает около минуты-двух. public const float SecondsPerMapUnit = 90f; public const int MaxMarches = 2; // одновременно в походе public const int MaxRounds = 10; // раундов в бою, потом атакующий отступает public const float DefenderBonus = 0.1f; // защитники бьют на 10% сильнее (стены) public const float GarrisonRegenMinutes = 3f; // недобитый гарнизон восстанавливается public static readonly List Settlements = Build(); static List Build() { var home = new SettlementDef("home", "Ваш город", 0.18f, 0.5f, new Color(0.25f, 0.5f, 0.9f)); home.isHome = true; var bandits = new SettlementDef("bandits", "Деревня разбойников", 0.55f, 0.25f, new Color(0.75f, 0.55f, 0.25f)); bandits.baseGarrison = new[] { 8, 4, 0, 0 }; bandits.baseLoot = new[] { new RewardItem(ResourceType.Wood, 400), new RewardItem(ResourceType.Food, 400), new RewardItem(ResourceType.Gold, 150) }; bandits.respawnMinutes = 3f; var fortress = new SettlementDef("fortress", "Крепость варваров", 0.82f, 0.72f, new Color(0.75f, 0.25f, 0.25f)); fortress.baseGarrison = new[] { 25, 15, 8, 2 }; fortress.baseLoot = new[] { new RewardItem(ResourceType.Stone, 900), new RewardItem(ResourceType.Iron, 600), new RewardItem(ResourceType.Gold, 500), new RewardItem(ResourceType.Gems, 20) }; fortress.respawnMinutes = 10f; return new List { home, bandits, fortress }; } public static SettlementDef Get(string id) { return Settlements.Find(s => s.id == id); } public static SettlementDef Home { get { return Settlements[0]; } } // С каждым разграблением поселение отстраивается на уровень выше: больше защитников и добычи public static float LevelMultiplier(int level) { return 1f + 0.5f * (level - 1); } public static int UnitPower(int index) { return GameData.Troops[index].power; } } // --- Сохраняемое состояние (часть ProgressData) --- [Serializable] public class SettlementState { public string id; public int level = 1; public int[] garrison = new int[4]; // текущие защитники public long ruinedUntilTicks; // > сейчас -- поселение разграблено и пустует public long lastBattleTicks; public int timesRaided; } [Serializable] public class WorldMarch { public int id; public string targetId; public int[] units = new int[4]; // отправлено public int[] survivors = new int[4]; // вернутся домой public long startTicks; public long arriveTicks; public long returnTicks; public bool returning; public bool recalled; public float turnPoint = 1f; // где развернулись: 1 = у цели, меньше -- отозвали по дороге public List loot = new List(); } [Serializable] public class BattleReport { public long ticks; public string title; public string text; public bool win; }