127 lines
5.9 KiB
C#
127 lines
5.9 KiB
C#
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<SettlementDef> Settlements = Build();
|
|
|
|
static List<SettlementDef> 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<SettlementDef> { 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<RewardItem> loot = new List<RewardItem>();
|
|
}
|
|
|
|
[Serializable]
|
|
public class BattleReport
|
|
{
|
|
public long ticks;
|
|
public string title;
|
|
public string text;
|
|
public bool win;
|
|
}
|