Добрый день, Картоделам Старкрафта 2! Сегодня мы поговорим о важной функции в редакторе StarCraft II — банках данных. Они позволяют сохранять данные между разными матчами и картами, что особенно полезно для создания сложных сюжетных кампаний и улучшения игрового опыта.
Немного теории
Банки данных предназначены для сохранения данных между разными матчами карты, и даже между разными картами выпущенными от одного и того же автора.
С их помощью становится возможным создания полноценных сюжетных кампаний с увеличением прогресса по мере прохождения пользовательской кампании. Также можно реализовать систему сохранения прокачки персонажей, чтобы после перезапуска игроку не приходилось начинать с начала, и прочее.
Что такое банки данных?
Банки данных — это специальные файлы, которые хранят информацию, важную для игры. Они могут содержать данные о прогрессе пользователя, прокачке персонажей, статистике и многом другом. В формате это XML-файлы с расширением .SC2Bank, которые создаются на компьютере игрока.
Файлы банков данных обычно хранятся по следующим путям:
для карт с серверов игры:
C:\Users\User\Documents\StarCraft II\Accounts\460981574\<user_handle>\Banks\<author_handle>
для локальных карт:
C:\Users\User\\Documents\StarCraft II\Banks
Устройство банк файлов
Это по своей сути xml-файлы состоящие из нескольких, заранее определенных тегов и атрибутов, по которым игра обращается для получения запрашиваемых картой, данных.
Вот пример простейшего банка данных
Банк хранящий данных о количестве побед и поражений игрока, а также сколько убил юнитов
<?xml version="1.0" encoding="utf-8"?>
<Bank version="1">
<Section name="Stats">
<Key name="Kills">
<Value int="9"/>
</Key>
<Key name="Victories">
<Value int="3"/>
</Key>
<Key name="Defeats">
<Value int="1"/>
</Key>
</Section>
</Bank>
В этом примере у нас есть одна секция (Stats), в которой хранятся три ключа: Kills, Victories и Defeats. Каждый ключ имеет своё значение, которое можно изменять в зависимости от потребностей.
Из примера видно что банк данных в основном состоит из секций и ключей.
Каждая секция может иметь неограниченное количество ключей
Каждая секция может иметь неограниченное количество ключей
Создание банка
Для его создания вам в редакторе нужно добавить информацию о предзагрузке вашего банка. Это можно сделать в верхней вкладке Map/Mod - Preload Info, после чего у вас появится примерно такое окно
Здесь вам надо
- Добавить новое значение в разделе Banks (Зелёный "+" в левой верхней части окна)
- Дать название вашему банку данных Исключительно на английском языке и без пробелов
- Указать, для какого игрока создать банк данных (Если нужно сохранять данных для каждого игрока, оставляйте All Players)
- OK
В ранних версиях редактора StarCraft II предзагрузка данных осуществлялась через действие "Preload Bank" внутри триггеров. Однако этот метод устарел и больше не используется в современных модификациях. Сегодня его применение считается некорректным и даже нежелательным, так как он может вызвать нестабильность в игре.
Открытие банка через триггеры
Предзагрузка — это только первый шаг. Чтобы ваши триггеры могли полноценно работать с банком и получать к нему доступ, его нужно открыть.
Для этого используйте действие Open Bank в триггерах. Это действие позволяет вашему банку стать доступным для всех триггеров в игре.
Важно Банк необходимо открывать для каждого игрока отдельно. Это связано с тем, что банк создается на компьютере каждого пользователя, и его нужно открывать для каждого из них.
Рекомендуется открывать банк подобным образом
Открытие банка
Initialization
Events
Game -Map initialization
Local Variables
Conditions
Actions
Player Group -Pick each player in (All players) and do (Actions)
Actions
Bank -Open bank "BankName" for player (Picked player)
Variable -Set Player[(Picked player)].Bank = (Last opened bank)
Здесь в триггере инициализации, циклически перебирается каждый игрок.
Обратите внимание, что в данной рекомендации используется "Запись" (Record) Player являющаяся массивом на 15 (максимальное количество игроков), и в которой есть переменная типа Bank.
Для каждого игрока открывается банк, который присваивается в соответствующую переменную банка текущего игрока.
Получение данных из банка
Для получения данных из банка существует множество разных функций (и да именно функций, а не действий)
Функция | Описание |
---|---|
Load Boolean Value | Возвращает логическое значение, содержащееся в выбранном банке по указанному ключу указанной секции. |
Load Integer Value | Возвращает числовое значение, содержащееся в выбранном банке по указанному ключу указанной секции. |
Load Point Value | Возвращает точку содержащуюся в выбранном банке по указанному ключу указанной секции. |
Load Real Value | Возвращает действительное значение, содержащееся в выбранном банке по указанному ключу указанной секции. |
Load String Value | Возвращает строковое значение, содержащееся в выбранном банке по указанному ключу указанной секции. |
Load Text Value | Возвращает текстовое значение, содержащееся в выбранном банке по указанному ключу указанной секции. |
Имейте ввиду, что эти данные в банке, сами по себе не несут никакой информации, это просто числа, строки, и прочие. Всё зависит от того, как вы их будете использовать в самой карте.
Например, в ключе Minerals секции Stats записано число 150.
Что нужно сделать чтобы эти 150, стало минералами игрока?
В необходимый вам момент времени (от нужного события), вам нужно в какую-то переменную подходящего типа данных (в данном случае с ресурсами лучше использовать Real) установить значение из банка с помощью функции Load Real Value.
Код Триггера
Initialization
Events
Game -Map initialization
Local Variables
Conditions
Actions
Player Group -Pick each player in (All players) and do (Actions)
Actions
Bank -Open bank "BankName" for player (Picked player)
Variable -Set Player[(Picked player)].Bank = (Last opened bank)
General -Wait 0.5 Real Time seconds
-------
Variable -Set Saved Minerals = (Load "Minerals" of section "Stats" from bank Player[1].Bank as real value)
Player -Modify player 1 Minerals: Set To Saved Minerals
Сохранение данных в банк
Хорошо, с получением данных разобрались. Но для того чтобы из банка что-то получить, нужно сначала туда что-то сохранить.
За это отвечают уже действия, причем очень похожие как и функции получения данных из банка, только начинаются с Store, а не Load
Действие | Описание |
---|---|
Store Boolean | Сохраняет логическое значение в указанном банке данных. |
Store Integer | Сохраняет числовое значение в указанном банке данных. |
Store Point | Сохраняет позицию указанной точки в указанном банке данных. |
Store Real | Сохраняет действительное значение в указанном банке данных. |
Store String | Сохраняет строковое значение в указанном банке данных. |
Store Text | Сохраняет текстовое значение в указанном банке данных. |
Store Unit | Сохраняет указанную боевую единицу в указанном банке данных. Для восстановления боевой единицы из банка, необходимо использовать действие Restore Unit |
Параметры секции и ключа определяют, где хранится значение в файле банка данных, и должны использоваться для последующей загрузки значения.
ВАЖНО После сохранения значения необходимо сохранить банк данных, иначе значение не будет существовать для последующей загрузки.
ПРИМЕЧАНИЕ: После сохранения банка, он остается по-прежнему открытым, и НЕ требуется его повторное открытие
Код
Store Value
Events
UI -Player Any Player presses S key Down with shift Allow, control Require, alt Allow
Local Variables
Conditions
Actions
Bank -Store real 150.0 as "Minerals" of section "Stats" in bank Player[(Triggering player)].Bank
Bank -Save bank Player[(Triggering player)].Bank
Полезные ссылки
- ScEncrypt - наработка шифрования строк, которую можно использовать для шифровки названий секций, ключей и значения банка, в целях защиты от взлома