Показано с 1 по 20 из 70

Тема: Уроки SDK. Поэтапно с начала.

Древовидный режим

  1. #2
    Урок 1. Основы работы с SDK, как добавить новую опцию игры.

    В этом уроке мы займемся созданием новой игровой опции, из тех, что можно выбирать при создании новой игры. Вроде “Raging Barbarians”, той что повышает активность варваров. Мы сделаем её аналог для животных, назовём “Animal World”, она будет увеличивать количество животных в начале игры.

    Первый шаг: Найти в папке Assets/XML/GameInfo/ файл CIV4GameOptionInfos.xml. Он то как раз и содержит список игровых опций. Работать нужно с версией из вашего мода разумеется.
    Примечание: Для работы с xml можно использовать XML Marker, но я все равно настоятельно порекомендую Notepad++, он куда удобнее.
    Находим в этом файле блок.
    Код:
    <GameOptionInfo>
                <Type>GAMEOPTION_RAGING_BARBARIANS</Type>
                <Description>TXT_KEY_GAME_OPTION_RAGING_BARBARIANS</Description>
                <Help>TXT_KEY_GAME_OPTION_RAGING_BARBARIANS_HELP</Help>
                <bDefault>0</bDefault>
                <bVisible>1</bVisible>
    </GameOptionInfo>
    И создаем его копию ниже, с сохранением всех тегов вроде > </. Изменяем в копии RAGING_BARBARIANS на ANIMAL_WORLD. Сохраняем файл.
    Пояснение:
    Код:
    <Type/> это собственно название опции для самой игры, оно нам и нужно прежде всего. 
    <Description/> это ссылка на текстовый файл с её названием, как мы его видим в игре. <Help/> это подсказка всплывающая при наведении на опцию курсора. 
    <bDefault> это включена ли опция по умолчанию.
    <bVisible/> это судя по названию видна ли она в меню создания игры.
    Предостережение: После изменения этого файла, пока мы не проведем все нужные изменения в самой игре, она перестанет запускаться.
    Шаг второй: Начинаем поиск этого названия в исходниках игры. Собственно это основа подавляющей части SDK изменений. Нужно найти в этих самых исходниках, как прописывается в игре тот или иной элемент и прописать по аналогии. Большая часть работы с новыми элементами, это обычная рутина. (Автоматизировать бы её.)
    Для этого в Notepad++ со всем открытыми исходными файлами начинаем поиск. Копируем в окно поиска GAMEOPTION_RAGING_BARBARIANS и нажимаем “Поиск во всех файлах”. Это к слову можно сделать и в Visual C++, просто в Notepad++ это опять же удобнее. Находим 8 результатов в разных файлах, но пока нам потребуются лишь три из них.
    Шаг третий: Открываем нужную строку файла CyEnumsInterface.cpp, это можно сделать через окно поиска внизу. Видим там следующую строку.
    .value("GAMEOPTION_RAGING_BARBARIANS", GAMEOPTION_RAGING_BARBARIANS)
    С полным сохранением синтаксиса делаем её копию в том же самом порядке, что делали в XML файле. После чего меняем.
    .value("GAMEOPTION_ANIMAL_WORLD", GAMEOPTION_ANIMAL_WORLD)
    Проверяем нет ли отличий от соседей, сохраняем файл. Теперь наша опция считывается из XML.
    Открываем CvEnums.h и под GAMEOPTION_RAGING_BARBARIANS, вписываем точно также с той же запятой GAMEOPTION_ANIMAL_WORLD. Сохраняем.
    Теперь наша опция доступна в самом проекте игры.
    Шаг четвертый. Вписывание в нужные функции. Самый пожалуй сложный и интересный этап работы с SDK, который требует думать и читать код. Ну и творческий заодно. Тут как раз и потребуются, хотя бы совсем элементарные, познания в программировании.
    Открываем файл CvGame.cpp и смотрим там упоминания наших варваров. Первые два результата поиска относятся к функции void CvGame::createBarbarianCities() которая, как это понятно из названия создает варварские города. Но у животных нет городов, во всяком случае если это не цель вашего мода, так что сразу переходим к следующим строкам, что в функции void CvGame::createBarbarianUnits().
    Код:
    	if (isOption(GAMEOPTION_RAGING_BARBARIANS))
    	{
    		iDivisor = std::max(1, (iDivisor / 2));
    	}
    Эта обычная проверка на “истинно”/”ложно”. Если опция включена, то некая переменная цифрового целочисленного типа iDivisor делится на 2, при этом std::max выбирает наибольшее между iDivisor и 1. Ведь iDivisor может оказаться равен 0, а на 0 как известно делить нельзя. Всегда помните об этом, и делайте проверки в будущем, что если планируете деление на переменную, смотрите, чтобы она не была равна нулю.
    По умолчанию iDivisor равен значению тайлов, указанному в CIV4HandicapInfo.xml на этот уровень сложности. В случае же если RAGING_BARBARIANS активна, он сам делится на 2. И вместо 40 незанятых тайлов на варвара в расчет идут уже 20.
    Нам нужно сделать тоже самое, но для животных. Поднимаемся вверх по тексту функции и находим там вызов другой функции, нужной нам, это createAnimals().
    Находим через поиск её содержание void CvGame::createAnimals(), вот это она. В случае с VS достаточно навести на неё курсор, чтобы узнать полное название её определения и двух щелчков, чтобы перейти на неё.
    Читаем код функции и узнаем, что iDivisor в ней не используется, и что нужно его сделать самим. Для этого в списке переменных, под названием функции объявляем int iDivisor;
    После чего, сразу перед определением числа нужных животных.

    Код:
    iNeededAnimals = ((pLoopArea->getNumUnownedTiles() / GC.getHandicapInfo(getHandicapType()).getUnownedTilesPerGameAnimal()) - pLoopArea->getUnitsPerPlayer(BARBARIAN_PLAYER));
    Переводим значение
    Код:
    GC.getHandicapInfo(getHandicapType()).getUnownedTilesPerGameAnimal() в iDivisor.
    iDivisor = GC.getHandicapInfo(getHandicapType()).getUnownedTilesPerGameAnimal();

    И заменяем выражение.
    Код:
    iNeededAnimals = ((pLoopArea->getNumUnownedTiles() /iDivisor) - pLoopArea->getUnitsPerPlayer(BARBARIAN_PLAYER));
    Теперь количество нужных животных изменяется в зависимости от введенной нами переменной.
    Осталось внедрить нашу опцию. Сразу между строками iDivisor = и iNeededAnimals = вставляем
    Код:
    if (isOption(GAMEOPTION_ANIMAL_WORLD))
    	{
    		iDivisor = std::max(1, (iDivisor / 2));
    	}
    Главное не запутаться со скобками. Не забудьте об этом.
    Должно получится примерно так.
    Код:
    iDivisor = GC.getHandicapInfo(getHandicapType()).getUnownedTilesPerGameAnimal();
    if (isOption(GAMEOPTION_ANIMAL_WORLD))
    	{
    		iDivisor = std::max(1, (iDivisor / 2));
    	}
    iNeededAnimals = ((pLoopArea->getNumUnownedTiles() /iDivisor) - pLoopArea->getUnitsPerPlayer(BARBARIAN_PLAYER));
    С поправкой на отступы разумеется.

    Шаг пятый: Компилируем, если выдает ошибки смотрим какие и проверяем свою внимательность. Как правило в таких случаях это банально опечатки, где {} не так поставили, где ; забыли, или наоборот.

    Запускаем игру. Если все сделано правильно, то при запуске должна появиться новая опция с названием. TXT_KEY_GAME_OPTION_ANIMAL_WORLD
    При её выборе количество животных будет увеличено вдвое. Но не более того, если хотите чего-то ещё, смотрите код функции и добавляете проверку опцию, где вам потребуется.
    Ах да, чтобы вместо TXT_KEY_GAME_OPTION_ANIMAL_WORLD у вам отображались нормальные слова вам потребуется создать текстовые записи в одном из файлов XML\Text\ Но об этом можно узнать в темах про редактирование XML.
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось Cansei; 25.08.2013 в 22:36.

Похожие темы

  1. Тайлы с ресами позначены с начала игры?
    от Taras_UA в разделе Civ5 - Игровые вопросы
    Ответов: 1
    Новое: 05.10.2010, 18:18
  2. Тактические уроки двух последних войн Ирака для общевойскового командира
    от Гость в разделе Разговоры обо всём, кроме Цивилизации
    Ответов: 2
    Новое: 18.03.2009, 16:57
  3. Уроки французского
    от BuDDaH в разделе Палаты команды Монархия MTDG2
    Ответов: 5
    Новое: 01.02.2007, 14:21
  4. Уроки C++
    от vpadlo в разделе Civ4 - Модная Цивилизация
    Ответов: 13
    Новое: 21.01.2007, 00:58
  5. Глючит 1.61 рус: с начала игры остается 10 ходов!
    от Mityay в разделе Civ4 - Технические вопросы
    Ответов: 1
    Новое: 17.07.2006, 13:51

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Рейтинг@Mail.ru

free counters