Добрый день, Картоделам Старкрафта 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 - наработка шифрования строк, которую можно использовать для шифровки названий секций, ключей и значения банка, в целях защиты от взлома
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.