Работа с магазинами
В этом уроке мы будем учится работать с файлом "shopping.dat" и рассмотрим основные опкоды для работы с ним.
Привет, друзья! Наконец-то нашел время написать новый урок. На очереди у нас обзор опкодов для работы с файлом "shopping.dat". Прежде чем приступить к написанию скриптов по этой теме, сначала разберёмся с форматом данного файла, так как опкоды во многом зависят от данных, которые находятся внутри.
Внутри файла есть две основные секции (в начале идёт название "section"): prices и shops. В первой секции идёт описание товаров (предметов), а во второй — описание магазинов, в которых и будут эти товары.
Секция "prices"
Секция "prices" дополнительно разделена на типы, используя тоже ключевое слово "section". Эти типы группируют товары по определённому признаку. По умолчанию используются 6 типов: "CarMods", "Clothes", "Haircuts", "Tattoos", "Food" и "Weapons". Есть ещё 3 пустые секции, которые не используются в игре ("Furniture", "Gifts" и "Property").
Формат каждого типа отличается по своей структуре. Давайте разбираться с тем, что есть. Каждый тип гарантировано имеет 7 параметров:
Параметр | Количество | Описание |
---|---|---|
name | 1 | Идентификатор предмета |
nametag | 1 | GXT-имя предмета |
stats to change | 4 | На какие характеристики игрока будет влиять покупка (используется не всегда) |
price | 1 | Цена товара |
Идентификатор предмета — это уникальное имя. Его мы запомним, так как чуть ниже он будет упомянут. Отдельное внимание нужно обратить на характеристики. Они описаны четырьмя параметрами, но влиять можно только на два стата.
Характеристики описаны в следующей последовательности:
Вот таблица статов, которые можно использовать:
Характеристика | Описание |
---|---|
fat | Влияет на вес Карла |
health | Влияет на здоровье Карла |
calories | Влияет на вес и здоровье Карла |
stamina | Влияет на выносливость Карла |
respect | Влияет на уважение Карла |
sexy | Влияет на привлекательность Карла |
Значение стата указывается числом. Если покупка не влияет на характеристику, то используется 0. Если влияет, то положительное число будет увеличивать характеристику, а отрицательное — уменьшать (значения от -128 до 127). Если стат вообще не нужно использовать, то достаточно поставить символ - (вместо имени и значения). Пример:
× Примечание: Многие секции содержат статы для изменения, но в реальности только некторые из них действительно их изменяют. Остальные чисто декоративные и никак не реагируют при покупке.
Это основные параметры. Некоторые секции имеют в своём формате дополнительные параметры (extra; встречаются в секицях "тату", "причёски" и "одежда"). Они представлены в виде целых чисел или строк (в скрипте строки конвертируются в число алгоритмом CRC).
Секция "shops"
С товарами разобрались. Перейдём к магазинам. Структура этой секции проще. Она содержит в себе другие секции, которые описывают магазины. Общая структура такова:
Имя секции (NAME) — уникальный идентификатор. Это имя используется в одном из опкодов, поэтому запомним его. Далее "type" — это слово указывает, какие товары будут использованы из секции "prices". Имя типа совпадает с именем секции, которые я описывал ранее. Далее идут предметы (по одному на строку). После слова "item" пишется уникальный идентификатор предмета.
Практика
С теорией мы кое-как разобрались. Давайте теперь посмотрим на опкоды, которые используются для работы с файлом "shopping.dat". Сначала идёт загрузка цен и магазинов:
Обратите внимание, что названия опкодов неправильные (на момент написания статьи)! Опкод 075E загружает информацию о магазинах, а 075D — о ценах. Я не увидел разницы в порядке их загрузки. Рекомендую использовать именно представленный мной порядок, именно так их использовали разработчики.
Здесь: "ammun1" - имя (идентификатор) магазина "Weapons" - тип (группа) цен
Как только работа с магазинами завершена, нам нужно выгрузить из памяти эту информацию, используя опкод:
Иногда может быть полезно знать, данные какого магазина сейчас загружены в память. Для этого используем опкод:
Изначально я думал, что этот опкод получает имя интерьера, но оказалось совсем другое :)
Здесь: s$CURRENT_SHOP_ID - переменная, в которую будет записан ID (имя) загруженного магазина. Возвращает пустую строку, если ничего не загружено.
Давайте посмотрим, что можно сделать после загрузки! Первым на очереди станет опкод:
Он получает количество товаров, которые есть в магазине. В нашем случае туда будет записано число 16 (это по умолчанию). Запомним переменную $MAX_ITEMS_COUNT и идём дальше:
Этот опкод позволяет сохранить идентификатор предмета за указанным индексом. Не обращайте внимания на описание; "textureCRC_to" не соответствует действительности (надеюсь, что это скоро исправят).
Здесь: 0 - индекс $ITEM - сохраняется идентификатор предмета
Индекс — это номер в списке товаров в текущем магазине. Диапазон варьируется в зависимости от количества товаров. Максимальный индекс мы можем получить, отняв единицу от количества товаров (опкод 075F). Таким образом мы можем перебрать весь список товаров, используя этот код:
× Примечание: в этом уроке я использую цикл для рисования меню, но это делать не обязательно.
Дальше идут опкоды, которые позволяют извлечь информацию о предмете:
Опкод 0761 получает цену предмета, а 075F — GXT-ключ с названием товара. Давайте напишем небольшой скрипт, который будет выводить информацию о товаре:
Результат:
Неплохо! Давайте двигаться дальше. А тут нас ждут опкоды, связанные с модификаторами цен:
Опкод 08C8 устанавливает новую цену на выбранный товар, независимо от настроек в файле. Его можно использовать вне цикла; как только новая цена задана, она используется постоянно. Опкод 08C9, должно быть, сбрасывает цену по умолчанию, однако у меня никакой реакции не происходило (он встречается только в скрипте гардероба). Следует отметить, что новая цена не сохраняется навсегда. Как только мы используем опкод "087C", товары вновь будут иметь старые цены.
Далее рассмотрим опкод, который получает данные об экстра параметре:
Мы можем получить данные об экстра параметре в любой секции, даже если она не содержит экстр. Если параметра нет, то в переменную $EXTRA1 будет записано число 0.
Здесь: 0 - номер экстра параметра $EXTRA1 - переменная, в которую будет записано значение этого параметра
Максимальное количество экстр: 2 (значения 0 и 1 соответственно). Для типа "Weapons" нет таких параметров но, к моему удивлению, опкод достал данные об экстрах (при 0). Изначально я подумал, что это количество патронов, так как оно присутствует в секции, но результат был совсем другим: были числа, но они не соответствовали моим догадкам (ниже будет пример)!
Следующий опкод осуществляет покупку предмета:
Под "покупкой" имеется ввиду изьятие у игрока денег согласно цене; изменяет характеристики игрока, если секция позволяет это сделать; изменяет статистику игрока, обновляя данные о покупках. В случае с оружием игроку дают дополнительно оружие и патроны к нему.
× ВАЖНО: Необходимо убедиться, что модель купленого оружия загружена! Если этого не сделать, то при выстреле будет происходить вылет! Лучше загрузить все модели до загрузки магазинов и цен.
И последний опкод, который входит в "основную обойму":
Эта проверка возвращает "true" в том случае, если предмет был когда-либо куплен опкодом 0790. Информация о покупке хранится всегда; в сейв-файле (или main.scm, точно не скажу).
Давайте рассмотрим пример с выбором предмета и его покупкой:
Результат:
Похожим способом делается покупка для остальных магазинов. Это вся базовая информация, которая у меня есть.
Last updated