Добавление нового функционала с кнопкой обработки

Самостоятельная настройка параметров игры и создание модификаций.
Аватара пользователя
Artos
Frigate
Сообщения: 533

Добавление нового функционала с кнопкой обработки

Сообщение Artos » 31 янв 2018, 05:35

"коротенько, пошагово"
Инструкция по добавлению нового функционала с кнопкой обработки:
pic.png
pic.png (1.24 МБ) 18439 просмотров

Задача: Добавить в игру новый специальный модуль, позволяющий модернизировать "устаревшие" колониальные модули на планетах игрок.

1. Добавляем новую технологию:
1.1. В конец файла Tech_t.all (перед тегом [END]) дописываем секцию новой технологии с индексом "UPGRADE_COLONY":

Код: Выделить всё

[TECHNOLOGY] "UPGRADE_COLONY"
  Hidden
  Info "UPGRADE_COLONY_NAME"
  FullDescription "UPGRADE_COLONY_DESCR"
  NoTrade
  NoSteal
  // default  "Sha" "Ery" "Drill" "Gava" "Log" "Hum" "Mag" "Vag" "Urg" "Lum" "Pirates" "Bogovans"
  Parents
    "LSCCOLONY" 0

[END]

Технология будет сразу же доступна (0) всем расам после исследования ими "родительской" технологии "LSCCOLONY" (улучшеный колониальный модуль Mk.II). Технология скрыта в окне науки, не продается и недоступна для кражи.

1.2. Добавляем в конец файла LANG\Rus\tech_t.lng (перед тэгом [END]) строки имени и описания новой технологии:

Код: Выделить всё

"UPGRADE_COLONY_NAME" Lang "Модуль модернизации колониальных модулей"
"UPGRADE_COLONY_DESCR" Lang "Комплекс для модернизации или восстановления колониальных модулей до усовешенствованной модели Mk.II."

В файл LANG\Eng\tech_t.lng дописываем аналогичные строки с английской локализацией.

1.3. На базе новой технологии ("UPGRADE_COLONY") создаем новый специальный модуль "Colony base upgrade", для чего в файл EQUIP/Misc.all после секции [SPECIAL] "Colony base mod" добавляем секцию:

Код: Выделить всё

[SPECIAL] "Colony base upgrade"
  POWER_CONS  -30000
  WEIGHT  100000
  FOR_CLASS  Freighter
  MOVIE  "Items/LSCCOLONY.idx" BIG // используем "родительскую" анимацию
  PICTURE  "Items/LSCCOLONY_top.png" BIG // используем "родительскую" картинку
  ICON_OVER  "Items/Icons/repair_icon.png" // добавляем к картинке иконку ремонтного молоточка
  TECH  "UPGRADE_COLONY"
  CELLS_TYPE  Standard
  RES_REQ  Gravitonium 3 Reidium 1 Metals 7 Organics 10 Radioactives 1 Prod 3  END_REQ
  EVENT "UPGRADE_COLONY" // [!] see the handler in the file raca.a
    Icons "images/Icon/UPGRADE_COLONY.PNG" "images/Icon/UPGRADE_COLONY_SEL.PNG" "images/Icon/UPGRADE_COLONY_MO.PNG"
    MOTextID 2031 // line in the file UI.lng
    InfoLine 2032

Важно(!): Секция модуля содержит подсекцию:

Код: Выделить всё

  EVENT "UPGRADE_COLONY" // имя события (не обязательно совпадающее с именем технологии) которое в игре будет связано с этим модулем
    // иконки (путь и имена) для кнопки, которая будет доступна при наступлении события
    Icons "images/Icon/UPGRADE_COLONY.PNG" "images/Icon/UPGRADE_COLONY_SEL.PNG" "images/Icon/UPGRADE_COLONY_MO.PNG"
    MOTextID 2031 // индекс строки в файле LANG\Rus|Eng\UI.lng с текстом "около кнопки" при наведении мыши на кнопку.
    InfoLine 2032 // индекс строки в файле LANG\Rus|Eng\UI.lng с текстом добавляемым в описание оснащения корабля оборудованного данным модулем

1.4. В начало файлов LANG\Rus|Eng\UI.lng добавляем строки соответствующие локализации:

Код: Выделить всё

2032 Lang  "Модернизирует колониальные модули"
2031 Lang  "Модернизировать 'Колониальный модуль'"

Важно(!) индексы строк не должны превышать значение: 2048!

1.5. В папку Images\Icon\... кладем картинки для кнопки UPGRADE_COLONY(_MO|SEL).PNG

1.6. В исходные файлы ModKit'а пишем коды для обработчика события связанного с новым модулем:
Учитывая аналогию применения подобных модулей (Резонаторов Богованов) и не привязываясь к конкретной расе, выбираем место для регистрации события в файле race.a в phrase Init(...). В конец фразы добавляем строки:

Код: Выделить всё

    if (this.raceID==Player.raceID AND 0!=call UFGetTechHandle("UPGRADE_COLONY"))
      on event "CHECK ACTION AVAILABLE UPGRADE_COLONY" call CheckAvailableUpgradeColony(EventParmInt, EventParmInt1) lazy always
      on event "PERFORM ACTION UPGRADE_COLONY" call PerformUpgradeColony(EventParmInt, EventParmInt1) lazy always
    end if

Регистрация события обусловлена двумя условиями: раса должна быть расой игрока и в игре присутствует технология "UPGRADE_COLONY". Второе условие обеспечивает независимость полученного кода от подключенного мода, т.е. исключает необходимость перекомпилировать код, если мод был отключен/удален.
Первая строка регистрирует проверку доступности действия (CHECK ACTION AVAILABLE) нашего события (UPGRADE_COLONY) и назначает для этого фразу CheckAvailableUpgradeColony(...).
Вторая строка регистрирует для выполнения действия (PERFORM ACTION) нашего события (UPGRADE_COLONY) обработчик - фразу PerformUpgradeColony(...).
Соответственно обе фразы необходимо написать и чтобы они были доступны пространству кодов расы игрока. Самое подходящее место для обработчиков - использовать файл player.a, дописав необходимые фразы в конец файла.

Первый обработчик: Проверка доступности действия для нашего модуля. Если необходимые условия выполняются - появится кнопка для возможности выполнения действия нашим модулем.

Код: Выделить всё

phrase CheckAvailableUpgradeColony(FleetHandle, ShipHandle)
  call UFExchangeInt(0) // дефолтно: выполнение запрещено
  local StarHandle = call UFGetFleetHome(FleetHandle)
  local Num = call UFGetPlanetsNum(StarHandle)
  if (Num > 0) // кол-во планет у звезды (более 0)
    local PlanetHandle
    local i
    for (i=0, i<Num, i++) // цикл проверки каждой планеты
      PlanetHandle = call UFGetPlanet(StarHandle, i)
      if (0!=PlanetHandle AND call UFGetPlanetOwner(PlanetHandle)==Player.RaceID) // планета принадлежит игроку
        if (0==call UFGetECOPlanetBuildingCount(PlanetHandle, bldColonialComplexAdv) OR // нет модуля  Mk.II
            0!=call UFGetECOPlanetBuildingCount(PlanetHandle, bldColonialComplex)) // есть обычные колониальные модули
          call UFExchangeInt(1) // !!! разрешаем показать кнопку (выполнить действие)
          exit
        end if
      end if
    end for
  end if
end phrase

Второй обработчик выполняет действие которое должен выполнять модуль модернизации:

Код: Выделить всё

phrase PerformUpgradeColony(FleetHandle, ShipHandle)
  local StarHandle = call UFGetFleetHome(FleetHandle)
  local Num = call UFGetPlanetsNum(StarHandle)
  if (Num > 0) // кол-во планет у звезды (более 0)
    call UFInitPlanetSelectionPrompt() // инициируем сбор списка планет
    local PlanetHandle
    local j = 0 // счетчик планет
    local i
    for (i=0, i<Num, i++) // цикл проверки каждой планеты
      PlanetHandle = call UFGetPlanet(StarHandle, i)
      if (0!=PlanetHandle AND call UFGetPlanetOwner(PlanetHandle)==Player.RaceID)
        if ( 0==call UFGetECOPlanetBuildingCount(PlanetHandle, bldColonialComplexAdv) OR
             0!=call UFGetECOPlanetBuildingCount(PlanetHandle, bldColonialComplex) )
          call UFAddPlanetToSelectionPrompt(PlanetHandle) // добавляем в список
          j++
        end if
      end if
    end for
   
    if (j > 0) // есть доступные для апгрейда планеты
     // вызываем окно выбора планеты для апгрейда
      PlanetHandle = call UFExecutePlanetSelectionPrompt( L"Select the planet to upgrade", E1_UNDEFINED, E1_UNDEFINED)
      if (0!=PlanetHandle) // планета выбрана
        Num = call UFGetECOPlanetBuildingCount(PlanetHandle, bldColonialComplex) // кол-во обычных колон.модулей
        if (Num > 0) then call UFSetECOPlanetBuildingCount(PlanetHandle, bldColonialComplex, Num-1) // уменьшаем на -1
      // увеличиваем на +1 кол-во усовершенствованных колон.модулей
        call UFSetECOPlanetBuildingCount(PlanetHandle, bldColonialComplexAdv, call UFGetECOPlanetBuildingCount(PlanetHandle, bldColonialComplexAdv)+1)
        // выводим соот.сообщения в журнал игры и в окно
        local string txt = FORMAT( L"The planet %s - has been upgraded!", str(call UFGetPlanetName(PlanetHandle)))
        call UFPrintToJournalPlanet(journalPlanetLost, txt, PlanetHandle)
        call UFShowGlowingMessage(txt, fontExtraLarge)
        call UFSetGlowingMessageColor(0, 255, 0)
        call UFGlowingMessageBackground(Yes)
      end if
    end if
  end if
end phrase

1.7. Компилируем новые коды, при необходимости подправляем локализацию, и соотв.файлы добавляем в папку мода.

Ссылка на скачать "конструктор мода":
► Показать

Вернуться в «Настройка/модификации»