Главная » Статьи » Картостроение » Триггеры

Создание Save\Load системы

Скачать урок можно тут

Содержание.

1. Основы Save\Load кодов.
2. Как работают альфа-числа.
3. Инициализация системы.
4. Создание -save триггера.
5. Создание -load триггера.
6. Дополнительные возможности.
7. F.A.Q. по статье.
1. Основы Save\Load кодов.
Любая карта WarCraft III, которая требует от игроков довольно длительной игры, чаще всего содержит специальный -save\-load код. Даже в некоторых AoS и TD есть такая система, которая позволяет переносить характеристики героя из одной игры в другую. Сейчас подобные системы могут быть весьма мощными и сложными. Надеюсь, что после прочтения этой статьи у вас будет общее представление о том, как такие системки создаются.

Такие коды обычно созданы триггерными системами. Большинство из них включает в себя всего 2-3 триггера. Я разбиваю систему на 3 триггера, чтобы удобно поменять что-либо, если это понадобится. Придётся пожертвовать небольшим объёмом памяти ради этого.

Три использованных мной триггера имеют довольно простую категоризацию - инициализация, сохранение и загрузка. Триггер инициализации задаёт значения переменных, загружает основные альфа-числа и делает поверхностные операции, результаты которые затем весьма помогут при создании двух других триггеров.
Триггер сохранения собирает информацию, затем конвертируя её в текст.
Триггер загрузки проверяет -save-код, конвертируя его обратно в информацию, содержавшуюся в нём.

Вся система, о которой пойдёт речь здесь, базирована на простой идее. Изменить размер системы счисления на более высокий, сконвертировать по нему данные и показать игроку код. Обратная операция позволяет получить информацию в другой игре. Основной инструмент для всего этого - система альфа-чисел.
2. Как работают альфа-числа.
Эти числа являются ядром -save\-load систем. Именно поэтому нам важно знать о том, что это такое и как они работают.
В любом компьютере есть две системы счисления - бинарная (двоичная) и десятичная. В бинарной системе есть всего два числа - 0 и 1, в десятичной же их 10 (01234567890). Альфа-номера для данных систем счисления - 2 и 10 соответственно. Десятичная система намного компактнее двоичной. К примеру, число 32 в десятичной системе требует всего 2 слота для хранения, а в бинарной оно потребует 100000 слотов. Или же, если вы создали числовую систему больше 32 чисел, она даст вам всего один символ для хранения этого номера.
Почти во всей статье я буду использовать простую 36-символьную систему альфа-чисел. При помощи 36 чисел можно сжать множество больших номеров в несколько символов, сохраняя много места.

Как же вы будете читать подобные номера? Вся система номеров начинается числом 0 и заканчивается числом 35. Вам нужно умножать и делить, чтобы из меньшего символа получить больший. В этой системе счисления 36 = 10 в десятичной. Т.к. это чило больше максимального числа 35, добавляется ещё символ слева. Согласно этому 1236 = 100 в десятичной. К примеру, если вы будете считать от 34 до 37, то это будет выглядеть так:

34 = 0Y
35 = 0Z
36 = 10
37 = 11

Теперь о том, как конвертировать из системы альфа-чисел в десятичную и обратно.
Вам нужно уметь двигаться вперёд и назад между этими системами. Здесь нашими друзьями станут алгебра и циклы.
Сначала выберите своё число в десятичной системе. Я взял 123456. Сконвертируем его в нашу 36-числовую систему.
Когда мы конвертируем из одной системы в другую, если идём от меньшего к большему, мы делим. Если же мы идём от большего к меньшему, то мы умножаем. Обычное правило пальца. Для того, чтобы сохранить, мы всегда будем делить (зачем нам использовать меньше 10 символов в коде?), а для загрузки - умножать. Зампоните это.
Так как 123456 больше 10, а мы используем 36-числовую систему, мы будем делить. Запомните ещё кое-что - операции с целочисленными в триггерах WarCraft III лимитированы. Нам по любому нужны будут переменные, с которыми мы будем проводить действия - +, -, х, /.

-------- Slot1=36 --------
-------- Slot2=1296 --------
-------- Slot3=46656 --------
-------- Slot4=1679616 --------
-------- Slot5=60466176 --------

Теперь мы должны начать с наименьшего числа, которое мы можем подставить в системе. Допустим, это некоторое значение золота игрока, которое по умолчанию не может быть больше, чем 1000000. Поэтому мы будем использовать 4-х символьную систему. (36х36х36х36=1.6 миллиона).
В первую очередь мы разделим его на максимальный слот символа минус 1. Т.е. мы будем делить на 36х36х36 или 36^3 = 46656.
123456/46656 = 2.26... (Мы будем использовать обычные целочисленные для всего этого, поэтому просто отбрасываем десятую часть, не учитывая никакого округления). => 2.
Теперь мы знаем, что наш первый символ - 2. Целевое число в нашей системе и есть 2.
Теперь получим остаток. Потом я расскажу, как мы его получили в коде, но для этого числа остатком является 30144.
Опустимся вниз на одну степень. Получим 36х36 = 1296. Разделим наш остаток на 1296 и получим результат. 30144 / 1296 = 23.59... или просто 23, что и конвертируется в N.
Получим наш остаток снова и разделим его на 36. Получим 336 / 36 = 9.33... или просто 9. Что является 9 в нашей системе.
Наше число - 2N9C. Неплохо бы его уменьшить.

Теперь нам нужно сконвертировать это обратно в десятичное число. Теперь, конечно же, мы будем умножать. Мы начнём слева, а закончим справа.
Чтобы сделать это, мы возьмём степень числа 36 для каждого слота альфа-числа, затем умножим его на позицию символа и прибавим результаты для всех слотов. Получим:

2### => 2 x 36^3 => 2 X 46656 = 93312
#N## => 23 x 36^2 = 23 X 1296 = 29808
##9# => 9 X 36^1 = 9 X 36 = 324
###C => 12 X 36^0 = 12 X 1 = 12
-----------------------------------------
123456

Теперь мы знаем, как конвертировать числа из одной системы в другую.
3. Инициализация системы.
Это вся предварительная работа наших триггеров. Как я упоминал ранее, кто-то любит включать это в Save\Load триггеры непосредственно, однако я считаю, что намного лучше вынести это всё в отдельный триггер.
Ниже я привожу пример триггера инициализации, который управляет системой в моём примере. После этого блока я распишу вам его по частям.


Этот триггер можно запустить и при инициализации карты, но лично я не доверяю WC3 загружать это при инициализации. Вы можете сделать, как я - запустить триггер по прошествии 0.10 секунд, а на это время занять чем-нибудь игроков (проиграть ролик, показать инструкции и.т.д.)



Первый блок триггера в основном состоит из комментариев, лучше всегда заранее рассчитать числа, чтобы вы знали, сколько нужно слотов.
SaveLoadCharacterSet - переменная типа "строка", которая хранит вашу систему чисел. Убедитесь в том, что вы не ставили пробелов между символами и, для этого примера, дефисов и символов нижнего регистра. Помните, что игроку этот код придётся вводить. Не каждый умеет быстро печатать.



Эта часть триггера создаёт шифровальную систему. Сейчас нам нужно знать только то, что она существует. Подробнее я расскажу позже.



Эта часть строит вашу систему счисления. Мы не можем заставить компьютер считать от 0 до Z, поэтому нужно дать ему считать путём, который он уже знает - десятичной системой. Мы сделаем это путём присвоения каждому символу индекса в массиве (SaveLoadCharacterNumbers[]). Как, наверное, вы уже заметили, индекс массива начинается с 0 и заканчивается 35, а не с 1 до 36. Таким образом можно использовать 0, без него наша система не будет такой же.



Этот отрывок кода - установка базовых значений сохраняемых объектов. Заметьте - предметы и герои находятся в массиве. Это делается с целью конвертации этих объектов в числа, а также значительного сжатия размера информации.
В конце каждой секции есть переменная ...Slots. Это целочисленная, которая хранит, сколько слотов хранит каждый объект. Вы можете её изменить, но помните то, что мы вычисляли ещё в самом начале триггера.



Этот код требуется для цикла в Save\Load коде, но я его здесь не использовал. Исходя из этого, он не используется. НО этот код может сказать, что и где в коде сохраняется.



Этот код не обязателен, но позволяет сделать систему безопаснее. Если игрок попытается загрузиться второй раз, то данный код запретит вторичную загрузку.
Категория: Триггеры | Добавил: Indeoo (12.05.2010) | Автор: Создание Save\Load системы
Просмотров: 1996 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]