# Экономика, профиль и рейтинги: аудит исходника

Дата: 7 ноября 2026. Это факты локальных исходников, не план нашей реализации. Старый reference_data/addon_game_mode.lua и decoded GemTD 2.0 различаются; смешивать их цены и правила нельзя. Полные точные фрагменты, SHA исходников, zero-based UTF-8 byte offsets и one-based строки — в economy-stats-evidence.json; краткая машинная сводка — economy-stats.json.

## Перестановки и повторная пятёрка

**Общий счётчик «N бесплатных перестановок + докупить ещё» не подтверждён.** В найденном серверном Lua нет такого счётчика/покупки. Это не доказательство отсутствия во всех версиях: compiled Panorama не был ранее извлечён и в этой задаче не декодировался.

| Действие GemTD 2.0 | Золото по уровням1–4 | Что реально делает |
| --- | --- | --- |
| yixinghuanwei / Swap | 300 /225 /175 /150 **за каждый каст** | Два выбора, затем обмен местами; cooldown3s, range500. Конечного бесплатного лимита нет. |
| qingyi / Adja-Swap | 200 /140 /100 /80 | Меняет атакующую башню с первым обычным камнем в радиусе192; cooldown5s. |
| xuanfeng | 200 /125 /75 /50 | Циклически сдвигает подходящие объекты на восьми соседних позициях; cooldown5s. |
| huidaoguoqu | 600 /500 /400 /300 | Удаляет **текущую незавершённую** пятёрку и разрешает построить заново; game_status1, not-ready; cooldown10s. Это не перенос оставленной башни. |

Цены — KV2 строки5739,5844,6493,6555 + реальные handlers/CostGold: `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 311247, `D:CostGold`). Для Swap castle/race-owner проверки идут **после** списания. У qingyi race-проверка использует player_id, не объявленный локально; её работу надо сверить в runtime.

**Старая версия:** Swap стоил375/275/225/200, но возвращал цену при цели gemtd_stone — поэтому выбор обычного камня был бесплатным, без найденной квоты. В decoded версии этого возврата нет. `reference_data/addon_game_mode.lua:8111` (byte 326828, `L:gemtd_hero_yixinghuanwei`); `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 233733, `D:gemtd_hero_yixinghuanwei`).

item_hummer — пассивный индикатор отставания по строительным волнам в Race, ItemPurchasable0, initial charges0. Его ItemStockMax5 не подтверждает пять переносов. item_extend получает заряды из profile.extend_tool и вызывает отдельный pregame extend-flow; связь с пополнением перестановок не подтверждена.

## Магазин и валюты

**Подтверждены работающие серверные intents** gemtd_buy_hero/ability/effect/toy/courier/luckybox → /game/.../buy. Они передают GoodsId в backend. /game/goods/list отдаёт ассортимент. Числовых цен в ракушках/списаний/возвратов в локальном Lua нет. Покупки блокируются после is_game_really_started=true; этот флаг выставляет уже первая попытка gemtd_build_stone до части проверок позиции, а не только старт боя. `reference_data/gemtd2-source/decoded/scripts/vscripts/intents.lua:1` (byte 0, `I:module`); `reference_data/gemtd2-source/future-audit/economy-source/api.lua:1` (byte 0, `A:module`).

Профиль содержит shell/ice/candy; золото партии хранится отдельно. item_shell — **игрушка смены облика**, не выдача валюты. Прямой подтверждённый донат/top-up/payment handler в исследованных routes не найден. Старое «Click the + to get more shells» — только UI-текст.

Магазин **не следует описывать как чисто косметический**: профильные геройские способности/слоты влияют на игру. До трёх питомцев при pet_buff1 дают урон: сумма рангов1..12 → +2/5/8/12/16/20/24/29/34/39/44/50%; в Coop бонусы игроков складываются, в Race применяется бонус владельца. Местный cap слотов героя6, тогда как старый UI описывает max4. `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 115090, `D:GemTD:OnReceiveHeroInfo`); `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 316679, `D:GemTD:DamageFilter`).

Отдельные **внутриматчевые ItemCost в золоте**, не shell-цены: jingying750, fog500, huichun500, fly750, aojiao250, qianggong250, huabingxie500, qiongguidun500, mobang500, moshuhe1000. Их effect handlers существуют, OnItemPurchased синхронизирует race gold; точный ассортимент/stock видимого магазина без UI/runtime не утверждается.

## Статистика партии

- Золото изначально0, passive tick0. Coop/1p общий team_gold; Race — отдельный team_gold_race. CostGold проверяет баланс и списывает золото, не ракушки.
- Hero max level5, XP thresholds0/250/650/1200/1900. Базовые XP/золото за убитого по диапазонам волн5/10/15/20/25; в Coop milestone-волны10/20/30/40/50 используют300, в Race boss300. Elite множитель10; XP начисляется перед уменьшением награды>=100 вдвое для золота. Coop XP получают все активные герои, Race — владелец вражеского потока. Race за отставание на>=2 волны сначала делит базу награды пополам. Есть greed5% на x10 золота. Полные условия исключений — `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 190584, `D:GemTD:OnEntityKilled`).
- Нормальные вероятности пяти качеств по hero level:1 →100/0/0/0/0%;2 →80/20/0/0/0%;3 →60/30/10/0/0%;4 →40/30/20/10/0%;5 →10/30/30/20/10%. Молитвы меняют бросок; это таблица генерации, не сохранённая статистика. Шесть качеств не выпадают обычным броском. `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 66412, `D:init:_G.gem_gailv=`).
- DamageStat считает положительный переданный DamageFilter урон по entity башни с ceil каждого события; shared table в Coop, per-player в Race, обновление около1s. Сбрасывается по волнам. Это не подтверждение lifetime-урона/точной потериHP/удалённого overkill. `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 319272, `D:DamageStat`).
- MVP до волны50 — максимум урона среди существующих подходящих не-max башен: общий победитель в Coop, по игроку в Race; +1 tier, максимум10. Max-башни исключаются из следующих выборов. +10% урона за tier через фильтр; pet bonus добавляется отдельно. `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 324525, `D:EndRoundIfNoEnemyAlive`); `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 199234, `D:stat_mvp_race`).
- AddStat реально используется для kill/unkill; боссы/элита дают вес, поэтому kill score не всегда число тел. Постоянных счётчиков качеств, полученного золота, XP, MVP-истории и общего урона здесь не найдено.

## Рейтинги и сохранения

Coop передаёт PlayerIds/PlayerCount/Level/Kills/TimeCost/Seed/FinishedQuest/Towers/Gold/ExtraKill/MazeLength. Отправка разовая, is_cheat2 блокирует, send_lb и authenticated session обязательны. Race отправляет DeathStack/Duration/Wave/Seed/BadPlayers после гибели всех при >1 игроке и duration>180s; mmr_info приходит с сервера. Сортировка, MMR-формула, сезоны и награды — backend, локально не определены. Synthetic fallback rank100/total1000/shell0 нельзя принять за реальные награды/места. `reference_data/gemtd2-source/decoded/scripts/vscripts/match.lua:1` (byte 0, `M:module`).

Старые тексты описывают месячные сезоны, Coop best-kills отдельно1p–4p, Race5 placement matches, обновление10min, rank25..1, награды100/70/50/30/20/10 shells и crown дляtop100. Также:1 бесплатная luckybox в день, refresh магазина ежедневно, recycle1/4. **Это UI-only claims, не подтверждённые здесь текущим backend.** Evidence IDs TEXT:* перечислены в JSON.

Профиль действительно загружается по SteamID и session (/auth/game/login → /game/login) в NetTables; токен живёт в Lua-памяти. Hero-save/recycle/delete-ability/extend/CD-key имеют routes; фактическая долговременная запись происходит на backend. `reference_data/gemtd2-source/decoded/scripts/vscripts/session.lua:1` (byte 0, `S:module`); `reference_data/gemtd2-source/future-audit/economy-source/profile.lua:1` (byte 0, `P:module`).

OnSaveMaze сохраняет **occupancy gem_map**:37×37 Coop/1p или17×17 своего Race-квадранта, режим1p/2p/3p/4p/race. Это шаблон/guide лабиринта, не checkpoint боя с HP/золотом/XP/башнями. `reference_data/gemtd2-source/decoded/scripts/vscripts/addon_game_mode.lua:1` (byte 124345, `D:GemTD:OnSaveMaze`).

## Что ещё сверять

Целевую версию; общий бесплатный перенос и его refill, если он нужен; backend товарные цены/валюты/refunds/daily limits; реальный платёжный маршрут; календарь/правила/пороговые места/награды сезонов; постоянную схему статистики. Ничего из этого не следует выдумывать по словам «магазин», «FREE» или названию способности.
