Files
MVP1/Assets/Scripts/Meta/World/WorldData.cs
T

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;
}