diff --git a/Assets/Scripts/App/BuildingWindow.cs b/Assets/Scripts/App/BuildingWindow.cs index 34bd2fd..d3b327b 100644 --- a/Assets/Scripts/App/BuildingWindow.cs +++ b/Assets/Scripts/App/BuildingWindow.cs @@ -641,21 +641,21 @@ public static class BuildingWindow live.Add(() => { if (t != null) UIKit.SetBar(bar, t.Progress); }); Live(card, () => t != null ? "Осталось " + GameData.FormatTime(t.SecondsLeft) : "Готово", 24, UIKit.Theme.Text); - int perGem = Mathf.Max(1, EconomyConfig.Load().construction.secondsPerGem); - Func gems = () => t != null ? Mathf.Max(1, Mathf.CeilToInt((float)t.SecondsLeft / perGem)) : 0; + // Ускорение -- за золото (06.11, ТЕСТ: EconomyConfig.construction.secondsPerGold) + Func gold = () => t != null ? EconomyConfig.SpeedUpGold(t.SecondsLeft) : 0; var speed = UIKit.Button(card, "", UIKit.Theme.Blue, () => { if (t == null) return; - int price = gems(); - if (!GameServices.TryGet(out IEconomy e) || !e.TrySpend(ResourceType.Gems, price)) + int price = gold(); + if (!GameServices.TryGet(out IEconomy e) || !e.TrySpend(ResourceType.Gold, price)) { - UIKit.Toast($"Нужно {price} кристаллов"); + UIKit.Toast($"Нужно {price} золота"); return; } t.Complete(); // окно перестроит OnBuildCompleted }, -1, 80, 26); - live.Add(() => { if (t != null) UIKit.SetButton(speed, $"Ускорить за {gems()} кристаллов", true); }); - UIKit.SetButton(speed, $"Ускорить за {gems()} кристаллов", true); + live.Add(() => { if (t != null) UIKit.SetButton(speed, $"Ускорить за {gold()} золота", true); }); + UIKit.SetButton(speed, $"Ускорить за {gold()} золота", true); } // ---------------- Перенос (решения 04.11: сноса нет) ---------------- diff --git a/Assets/Scripts/App/EconomyConfig.cs b/Assets/Scripts/App/EconomyConfig.cs index d3f0894..f42f317 100644 --- a/Assets/Scripts/App/EconomyConfig.cs +++ b/Assets/Scripts/App/EconomyConfig.cs @@ -161,8 +161,11 @@ public class EconomyConfig : ScriptableObject public int[] upgradeSecondsToLevel = { 60, 120, 300, 600, 1200, 1800, 3600, 5400, 7200 }; [Tooltip("Ратуша строится дольше остальных: множитель времени улучшения. ТЕСТ")] public float townHallTimeMultiplier = 2f; - [Tooltip("Ускорение: секунд стройки за 1 кристалл. ТЕСТ")] + [Tooltip("Устарело (06.11): ускорение теперь за золото -- secondsPerGold")] public int secondsPerGem = 30; + [Tooltip("Ускорение стройки, улучшения и обучения войск -- за золото (06.11; регламент валют: золото -- основной ресурс " + + "построек и улучшений, синие кристаллы на ускорения не тратятся): секунд за 1 золото. ТЕСТ")] + public int secondsPerGold = 10; // Сноса зданий нет (решение 04.11): только бесплатный перенос } @@ -351,6 +354,13 @@ public class EconomyConfig : ScriptableObject } } + // Цена ускорения в золоте: сколько осталось секунд -> золото (не меньше 1). Стройка, улучшение и обучение войск + public static int SpeedUpGold(double secondsLeft) + { + int perGold = Mathf.Max(1, Load().construction.secondsPerGold); + return Mathf.Max(1, Mathf.CeilToInt((float)(secondsLeft / perGold))); + } + // ---------------- Хранилище синих кристаллов (регламент валют 05.11, разд. 8; правила -- CrystalStorage) ---------------- // Правила с купленной ступенью (её хранит Экономика: ResourceManager.CrystalStorageLevel, секция "economy") diff --git a/Assets/Scripts/Meta/Core/GameProgress.cs b/Assets/Scripts/Meta/Core/GameProgress.cs index 15e39f7..0f90f31 100644 --- a/Assets/Scripts/Meta/Core/GameProgress.cs +++ b/Assets/Scripts/Meta/Core/GameProgress.cs @@ -811,14 +811,14 @@ public class GameProgress : MonoBehaviour var queue = Training; if (queue.Count == 0) return 0; double secs = TrainingSecondsLeft(queue[queue.Count - 1]); - return Mathf.Max(1, Mathf.CeilToInt((float)secs / 30f)); // 1 кристалл за 30 сек + return EconomyConfig.SpeedUpGold(secs); // за золото (06.11, ТЕСТ; было 1 кристалл за 30 с) } } public void SpeedUpTraining() { if (Training.Count == 0) return; - if (!Pay(new[] { new RewardItem(ResourceType.Gems, SpeedUpCost) })) return; + if (!Pay(new[] { new RewardItem(ResourceType.Gold, SpeedUpCost) })) return; Army.FinishAllTraining(GameClock.UnixNowMs); } diff --git a/Assets/Scripts/Meta/Panels/TroopsPanel.cs b/Assets/Scripts/Meta/Panels/TroopsPanel.cs index 2362030..6ff7349 100644 --- a/Assets/Scripts/Meta/Panels/TroopsPanel.cs +++ b/Assets/Scripts/Meta/Panels/TroopsPanel.cs @@ -4,7 +4,7 @@ using UnityEngine.UI; using TMPro; // ВОЙСКА: армия, очередь обучения (идёт и когда игра закрыта), найм воинов за ресурсы, -// ускорение за кристаллы. Найм -- карточки войск в ряд (листаются вбок): иконка, сила, цена, +// ускорение за золото. Найм -- карточки войск в ряд (листаются вбок): иконка, сила, цена, // против кого силён и слаб (из правил боя). Новые типы войск открывают уровни Ратуши и Казарм. public class TroopsPanel : BasePanel { @@ -293,6 +293,6 @@ public class TroopsPanel : BasePanel queueTimes[i].text = GameData.FormatTime(GP.TrainingSecondsLeft(o)); } if (speedUp != null && training.Count > 0) - UIKit.SetButton(speedUp, "Ускорить всё за " + GP.SpeedUpCost + " кристаллов", true); + UIKit.SetButton(speedUp, "Ускорить всё за " + GP.SpeedUpCost + " золота", true); } } diff --git a/Docs/Modules/Economy.md b/Docs/Modules/Economy.md index 0c150b3..71c7eec 100644 --- a/Docs/Modules/Economy.md +++ b/Docs/Modules/Economy.md @@ -100,11 +100,12 @@ Всё ТЕСТ. Без кристаллов теперь: задания (основные и ежедневные), награды за вход (было 50 и 200), письмо-приветствие (было 100), подарок за уровень (было 10 × уровень), арена (было 5), этапы боя (было 25 на каждом 5-м), бесплатный сундук (было 15). Вместо них — золото и ресурсы. - **Хранилище — платное расширение (разд. 8 регламента валют, ответ 06.11, п. 1).** Старт 50; ступени (ТЕСТ): Ратуша 3 — 75 (2000 золота, 1500 дерева, 1500 камня), Ратуша 5 — 100 (4000 / 3000 / 3000 + 1000 металла), Ратуша 7 — 150 (7000 / 5000 / 5000 / 2000), Ратуша 9 — 200 (10000 / 8000 / 8000 / 4000). Ратуша только разрешает ступень, покупается в окне Ратуши («Хранилище синих кристаллов» → «Расширить до N»). Цена списывается один раз, всё или ничего. Правила — `Modules/Economy/Rules/CrystalStorage.cs`, тесты — `CrystalStorageTests`; числа — `EconomyConfig` → «Склады и лимиты» → `crystalCap`, `crystalExpansions`. Купленная ступень сохраняется в секции `"economy"` (`crystalStorageLevel`; в старом сохранении её нет — 0), вместимость по ней считается заново. +- **Ускорения — за золото** (06.11, решение Саши, ТЕСТ): стройка, улучшение и обучение войск — 1 золото за 10 секунд (`EconomyConfig` → «Стройка» → `secondsPerGold`, `EconomyConfig.SpeedUpGold`); было 1 синий кристалл за 30 секунд. Подтвердить у руководителя валюту и курс. - **Магазин — за золото** (пакеты дерева, камня, еды, железа: 600 / 700 / 600 / 900 золота, ТЕСТ). Убраны пакеты за 50–80 кристаллов, «Мешок золота», обмен золота на кристаллы, «Горсть» (500) и «Сундук» (3000) кристаллов. **Ещё не сделано:** недельный PvE-предел 6 с заменой излишка золотом; редкий PvE-торговец (30 000 / 60 000 золота, не больше 2 за 7 суток); Кристальная шахта (до двух, 3 за 7 реальных суток, пауза при полном хранилище); космо-кристаллы; торговля и военная добыча — этап мультиплеера. -**Открыто:** окончательные цены расширения хранилища, компенсация за кристалл сверх недельного предела, уровень Ратуши для второй шахты, ускорения за кристаллы (обучение — 1 кристалл за 30 с, стройка) — в регламенте среди трат не названы. +**Открыто:** окончательные цены расширения хранилища, компенсация за кристалл сверх недельного предела, уровень Ратуши для второй шахты. ## Таблица баланса `EconomyConfig` @@ -127,6 +128,7 @@ | Дата | Кто | Что | | --- | --- | --- | +| 06.11.2026 | Claude (Саша) | Ускорения стройки, улучшения и обучения войск — за золото: 1 золото за 10 с (`secondsPerGold`, ТЕСТ), было 1 кристалл за 30 с. | | 06.11.2026 | Claude (Саша) | Хранилище синих кристаллов: платное расширение 50 → 75 / 100 / 150 / 200 на Ратуше 3 / 5 / 7 / 9 в окне Ратуши (`CrystalStorage`, `EconomyConfig.crystalExpansions`, `ResourceManager.CrystalStorageLevel` в сохранении, 5 тестов). Вместимость кристаллов больше не константа 50. | | 06.11.2026 | Claude (Саша) | Регламент валют 05.11, разд. 2 и 5.1: синие кристаллы только за верхнюю ступень недельного события (1) и каждый 10-й этап боя (1); задания, вход, письма, уровень, арена, сундук — золото и ресурсы; магазин за золото, убраны пакеты за кристаллы, обмен золота на кристаллы, «Горсть» и «Сундук». | | 05.11.2026 | Claude (Саша) | Регламент синих кристаллов, пп. 1 и 3: кристаллы не начисляются сверх 50 и не теряются — награды заданий ждут (не больше 2), остальные — письмом «Кристаллы ждут места», из письма забирается сколько помещается (`CrystalRewards`, `GameProgress.Grant/ClaimQuest/ClaimMail`, 6 тестов). Задания — 1–2 кристалла вместо 20–250, ежедневные — без кристаллов. |