PDA

View Full Version : Скрипты ai (папка data::ai)


Дрон01
10-06-2005, 12:44 PM
Пролог: "Машина должна работать, человек - думать" (с)International Business Machines
Этот трид, как вы уже, наверное, догадались, посвящен скриптингу AI, я его моддер; язык Lua (см. соседнюю темку). Итак, открываем папку ai. Что мы видим в этой папке? Праильно, файлы. Для тех, кто знает английский хоть чуть-чуть, листинг многих функций в этих файлах не представит труда т.к. имена функций выбраны осмысленно. Пока кратко о самих файлах.
1)Defailt.lua --Файл, исполняемый по умолчанию и, кстати, самый главный, запрос к нему выполняется в игре каждую секунду (у разных степеней сложности этот интервал варьируется по-разному). Подключение различных файлов как хидерных(т.е. главная программа имеет право брать из них функции) имеет вид "dofilepath(path)", вы его в начале многих скриптовых файлов будете видеть.
2)Cpubuild.lua --подключается в default.lua и, в свою очередь, подключает некоторый другие (щас не вспомню, но это не суть важно). Файл предназначен для обеспечения ИИ системами постройки кораблей. Кроме того, определяет типы кораблей для каждой расы в отдельности - что у них считается Батлом, а что перехватчиком. Приставка k (например, kBattleCruiser, kCarrier). Обозначает единственный корабль.
3)Cpuresearch.lua --Исследования, которые проводит комп. Крайне важны функции DoUpgradeDemand()(апгрейды) и DoREsearchTechDemand()(технологии)
4)Cpubuildsubsystem.lua --постройка субсистем. Очень спорный файлик, у многих из-за него проблемы, но мне всё понятно, так что обращайтесь.
5)vaygr_upgrades.lua и hiigaran_upgrades.lua(не помню, правильно назвал?) --Апгрейды кораблей (не технологии, именно апгрейды, не путайте!)
6)cpumilitary.lua --Все военные действия ИИ обеспечиваются здесь.
Ну, вроде всё!
Нет, не всё!
7)classdef.lua --про самое главное и забыл. В этом файле описание типов всех кораблей, кто против чего силён и слаб. Данные используются почти во всех скриптах, приставка e(обозначает не один корабль, целый класс, тут не путайте с приставкой k!) (например, eBuilder, eAntiFighter)

Тут, по-моему, надо небольшое лирическое отступление. Дело в том, что для классов и конкретных значений в Lua, да и в Хоуме, используются разные функции. Например, для класса "eBuilder", можно увидеть такую функцию: "ShipDemandAddByClass(eBuilder)" - типичная классовая фукция. Для конкретных кораблей это выглядит, например, так: "ShipDemandAdd(kScout)". Пояснения по этим функция да и многим другим, будут даны позже.

Итак, дело начато. Хотелось бы, чтоб мне кто-нить помог, да если всё это самому, без руководств осваивать - ИМХО лучше будет запомнить что к чему. So, The Journey Begins...

Ещё есть идея сделать специальную версию ИИ для дебага. В стадии разработки. Выводит каждый шаг ИИ в текстовый файл.

Да, вот вам архивчик, в нём пофиксенный архив ИИ для многострадального EX MODa. Если кто не знает, что с ним делать, см. Тему "Наши моды". Повторяю, архивчик ПОФИКСЕННЫЙ! Все праблы устранены.

З.Ы. St@lker {Fox} хей! Кто там у нас хвастался ассемблером? Дафай, за луу берись :p :) !

stalker[fox]
10-29-2005, 10:04 AM
2Дрон01
Смотрел их скрипты... честно, я разочарован :( надо же так облажатся. Товаришч. я тебе вот что скажу... давай мыло, я те исходники AI первого хомки скину... вот там AI так AI... расписываю что он там и как, ибо долго долго копался в файликах :) итак:
00. полная рандомизация, в зависимости от установок "ползунков" в настройках.
01. сбор статиски об игроке(т.е. тебя им любимого :)).
02. подбор тактик и всего остального для каждого типа корабля на основе собранной статистики во время игры.
03. деление кораблей на отдельные группы в оптимальном сочитании защита/нападение.
04. возможность ведения командной игры с другим AI.
05. х.з. зачем, но так же сбор инфы о других AI и о том как они тебе или же ты им налил.
06. постоянное наблюдение за твоими действиями.
07. ресурсная война.
08. просчёт своих действий наперёд.
... перечислять можно ещё долго... там скриптов на 1,3 Метра в архиве по максимальному сжатию... в общем давай мыло :)

ЗЫ: Респект товарищу Страннику за ссылу на исходники хомки :)

Дрон01
10-30-2005, 04:25 AM
Ну так внедряй во второй!
мыло kairllur@mail.ru
И это...надо с ползунками в UI Хомы второй разобраться - может и там что-нибудь подобное введём ;)

stalker[fox]
10-30-2005, 01:19 PM
offtop:
2 Дрон01: выслал тебе на мылце архивчик :) сматри, наблюдай :) изучай))

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

Дрон01
11-07-2005, 04:40 AM
Идеи...тут смотреть и смотреть! обожди ещё погляжу, но что-то уже зреет...
кстати, насчёт как перевести. на домашнем сайте lua есть компиляторы-переводчики кода из одного языка в другой.
А ты кстати, чем занимаешься щас?

stalker[fox]
11-07-2005, 07:47 AM
я на данный момент сидю за компом и пялюсь в монитор в поисках знакомых букв! :D вооот)) а если совсем серьёзно то я щас занят написанием некоего подобия учебника для студентов родного универа по асьме... к тому же на той же асьме занимаюсь ярко выраженным геморроем типа обработчик мыши и клавы писякаю... точнее сказать я его уже написякал бякаю теперь эти функшены в дэлелельку :)

ГЫ)) вобщем неважно)) но факт остаётся фактом :) а фактически я сейчас с кое-каким народом разрабатываю новое ядро новой ОС... х.з. чё из этого получицЦа :) лиж бы не линух :D
ЗЫ: так что имхо ты меня зря пока редактором AI назначил... могу лишь вам в нём указывать на ваши же баги :) и объяснять чё и куда :) ибо занять :(

Сталк, я повыкусил здесь и ниже весь оффтоп, благо ты сам создал соответствующую ветвь ;)
Тут оно тяжело смотрится, да и отвлекает от основной темы дискуссии, а вот там можно и продолжить... :D
=T=

Ten
11-07-2005, 11:58 AM
St@lkeR, эт ты из РДНовских исходников первого хомы файлы с АИ выковыривал? Скажи, плз, какие именно. Там вроде каски были (kas), в сингле, по крайней мере (конечный автомат, который ведал, куда/как отправлять корабли в зависимости от действий игрока). Как устроен интеллект в мульти, я не знаю, но сбор статистики с соответствующим анализом точно есть. Хотя, с точки зрения игрока, АИ в ХВ2 сильнее, если в первом я в лучшие времена :rolleyes: разрывал всю семёрку (которая в союзе, все ползунки в max правом положении), то во втором больше двух не получалось (впрочем, не особо и стремился ;)).

stalker[fox]
11-07-2005, 05:51 PM
оффтоп не спорю, но всёже...
2Ten
ссыла с исходниками мертва... если хочешь, вышлю на мыльце полный эдишн, только мыло дай... и это, отошлю как карточку новую куплю... на этой инета всего ничего :)
ЗЫ: там порядка 78 метров исходников... кароче, в ихнем сетапе где-то около 20 :) так что, Ten, заводи мыло соответствующих размеров :)

Ten
11-08-2005, 09:40 AM
ссыла с исходниками мертва... если хочешь, вышлю на мыльце полный эдишн, только мыло дай... и это, отошлю как карточку новую куплю...Спасибо, но не надо, я себе эти исходники ещё год назад скачал - ссылка вполне рабочая, только что проверил. Я имел ввиду, какие именно файлы отвечают за ИИ (эти 17Мб разворачиваются в 76, пойди найди, где и что).

stalker[fox]
11-08-2005, 03:34 PM
2Ten
адресок как они у меня живуть:
c:\Program Files\Relic Developer's Network\Homeworld Source\src\Game\
файлики которые начинаются естессна с AI ;) :) ну и там глянешь какие директивой include подрубаются к ним... кароче почти вся папка Game :)

Хранитель
11-20-2013, 12:09 PM
так, Дрон давай рассказывай мне всё, буду руководство делать))) а то нельзя так чтобы ничо ничо не было на форуме про ИИ
З.Ы. и самому надо очень)))

Добавлено через 2 минуты
ууу... да вас тут никого нету... беда пичаль горе огорчение.. ну в общем напишите как зайдёте

Дрон01
11-24-2013, 01:29 PM
Ну вы, батенька, даёте.

Тишь да гладь на Верфях, позабыто всё.
Эти скрипты, которые я написал в 2005-м, были первым, что я вообще самостоятельно сделал на ниве программирования, от совершенства они далеки.

Но насколько я помню в паке с RDN (официальное SDK от Релика для HW2) был гайд по созданию своей расы - и в том числе ИИ для неё. Найдёте?

Хранитель
03-17-2014, 07:29 AM
1: function `oninit' at line 38 [string ""]
CPUPLAYER -- error in CPUPlayer: oninit() function was not found in CPU script -- FATAL EXIT --
помогите пожалуйста, что это значит?

Добавлено через 36 секунд
что за onint такой? что он делает?

Добавлено через 5 минут
охохо) только что нашел вашу папку с комментами) вот я слепошара) смпасибо) есть над чем работать)

Хранитель
03-20-2014, 07:36 AM
вот блин.. боюсь я не смогу один разобраться..

Добавлено через 7 часов 42 минуты
stack traceback:
1: function `dofilepath' [C]
2: main of string "" at line 9
parameter: attempt to call global `CpuBuild_Init' (a nil value)
stack traceback:
1: function `oninit' at line 38 [string ""]
CPUPLAYER -- error in CPUPlayer: oninit() function was not found in CPU script -- FATAL EXIT --
объясните чо он ноет а(( я вроде все как надо делал(
вот в cpubuild начало:
function CreateBuildDefinitions()
if s_race==Race_Hiigaran then
kCollector = HGN_RESOURCECOLLECTOR
kRefinery = HGN_RESOURCECONTROLLER
kScout = HGN_SCOUT
kInterceptor = HGN_INTERCEPTOR
kBomber = HGN_ATTACKBOMBER
kCarrier = HGN_CARRIER
kShipYard = HGN_SHIPYARD
kDestroyer = HGN_DESTROYER
kBattleCruiser = HGN_BATTLECRUISER
elseif s_race==Race_Vaygr then
kCollector = VGR_RESOURCECOLLECTOR
kRefinery = VGR_RESOURCECONTROLLER
kScout = VGR_SCOUT
kInterceptor = VGR_INTERCEPTOR
kBomber = VGR_BOMBER
kCarrier = VGR_CARRIER
kShipYard = VGR_SHIPYARD
kDestroyer = VGR_DESTROYER
kBattleCruiser = VGR_BATTLECRUISER
else
kCollector = TBR_RESOURCECOLLECTOR
kRefinery = TBR_RESOURCECONTROLLER
kScout = TBR_SCOUT
kInterceptor = TBR_INTERCEPTOR
kBomber = TBR_BOMBER
kCarrier = TBR_CARRIER
kShipYard = TBR_SHIPYARD
kDestroyer = TBR_DESTROYER
kBattleCruiser = TBR_BATTLECRUISER
end

end
вот начало cpubuildsubsystem :
function CpuBuildSS_Init()
if s_race==Race_Hiigaran then
CpuBuildSS_DefaultSubSystemDemandRules = DoSubSystemDemand_Hiigaran

elseif s_race==Race_Vaygr then
CpuBuildSS_DefaultSubSystemDemandRules = DoSubSystemDemand_Vaygr
else
CpuBuildSS_DefaultSubSystemDemandRules = DoSubSystemDemand_Tobari
end

sg_lastSpecialSubSysTime = 0
sg_specialSubSysDelayTime = (150 + Rand(100))
sg_retireCountCheck = 0
sg_buildBCHyperspace = 1
end
а вот начало в cpuresearch:
function CpuResearch_Init()
if s_race==Race_Hiigaran then
dofilepath("data:ai/hiigaran_upgrades.lua")
DoUpgradeDemand = DoUpgradeDemand_Hiigaran
DoResearchTechDemand = DoResearchTechDemand_Hiigaran
elseif s_race==Race_Vaygr then
dofilepath("data:ai/vaygr_upgrades.lua")
DoUpgradeDemand = DoUpgradeDemand_Vaygr
DoResearchTechDemand = DoResearchTechDemand_Vaygr
else
dofilepath("data:ai/tobari_upgrades.lua")
DoUpgradeDemand = DoUpgradeDemand_Tobari
DoResearchTechDemand = DoResearchTechDemand_Tobari
end

sg_lastUpgradeTime = gameTime()
sg_upgradeDelayTime = (180 + Rand(80))
cp_researchDemandRange = 0.5
if g_LOD==1 then
cp_researchDemandRange = 1
end

if g_LOD==0 then
cp_researchDemandRange = 2
end

if Override_ResearchInit then
Override_ResearchInit()
end

end

это tobari_upgrades.lua :
-- LuaDC version 0.9.20
-- 20.11.2013 14:58:48
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
aitrace("LOADING TOBARI UPGRADE INFO")
rt_mothership =
{}
rt_capital =
{}
rt_fighter =
{}
rt_corvette =
{}
rt_frigate =
{}
rt_platform =
{}
rt_collector =
{}

в класдефе я все прописал, ну чего этой ныте еще надо :( сам цпубюлд цпублюдсубсистем и цпуресерч я потом прописывать буду не думаю что это надо щас ( помогите плиз пож(

karak
03-20-2014, 10:14 PM
Хранитель, нашёл похожую тему (http://forums.relicnews.com/showthread.php?246875-Crash-on-AIInit) на форуме реликов, и там предлагают использовать полностью декомпилированную папку со скриптами (http://dl.dropbox.com/u/896078/DecompiledData.rar). А ещё от себя рекомендую пользоваться notepad++ или другим подобным редактором вместо стандартного блокнота. Попробуй, вдруг этот решит твою проблему.

Дрон01
03-20-2014, 11:16 PM
Гайды по работе со скриптами шли в комплекте к RDN! (http://www.fileplanet.com/137529/130000/fileinfo/Homeworld-2-RDN-Toolkit) Там же внутри как раз полностью декомпилированная папка с ai есть.

Я предупреждаю - не стоит пихать декомпилированные вручную файлы обратно в игру - от этого очень часто всё ломается.

Если хоть немного знаете английский, я думаю, разберётесь с архивом.

Пишите, что ещё непонятно, поможем.

Chimas
03-21-2014, 06:16 AM
The link KARAK provided are the decompiled files most of the modders use as a base for editing HW2. I noticed that many ppl use notepad++, but I use SCITE for editing LUA files.

Also, sometimes HW2.log (that is created using -luatrace parameter in the command line) warns you about the lack of ONINIT function although the function is there where it's supposed to be. Don't wahy it happens.

And eventually, if HW2.LOG doesn't tell you clearly why it is crashing, might be a recent edit inside a HOD file, so check for the last HOD files edited, there might be something missing in there.

Хранитель
03-21-2014, 11:08 AM
ого О_О, спасибо огромное, думаю поможет

Добавлено через 1 минуту
а интересно как самому ПОЛНОСТЬЮ декомпилировать, а?)

Дрон01
03-21-2014, 04:39 PM
Никак. Все декомпиляторы не могут восстановить исходный код в точности таким, каким он был. Затираются имена переменных, типы, классы, инлайнятся многие функции, оптимизируется прогонами код.

LuaDC вообще очень хороший декомпилятор, в 90% случаев получаешь то, что и было на входе. Но порою съедает таблицы и функции, на которые, по его мнению, нет ссылок.

А на INITы как раз и нет, поскольку их вызывает движок игры, а не другие LUA-файлы.

Хранитель
03-22-2014, 05:56 AM
Никак. Все декомпиляторы не могут восстановить исходный код в точности таким, каким он был. Затираются имена переменных, типы, классы, инлайнятся многие функции, оптимизируется прогонами код.

LuaDC вообще очень хороший декомпилятор, в 90% случаев получаешь то, что и было на входе. Но порою съедает таблицы и функции, на которые, по его мнению, нет ссылок.

А на INITы как раз и нет, поскольку их вызывает движок игры, а не другие LUA-файлы.

но ведь та папка полностью декомпилирована. значит как то это сделали.. вот я и спрашиваю как сделали..

Добавлено через 1 минуту
так. я намерен писать гайд по созданию ИИ. мне можно создать новую тему или прям тут писать?

Дрон01
03-22-2014, 10:31 AM
но ведь та папка полностью декомпилирована. значит как то это сделали.. вот я и спрашиваю как сделали..

Она не декомпилирована, это настоящие исходники, от разработчиков. Они ещё не были скомпилированы, чтобы их декомпилить нужно было)

Создавай тему.

Эту я создал, когда мне было 15 лет.

Хранитель
03-22-2014, 01:26 PM
Она не декомпилирована, это настоящие исходники, от разработчиков. Они ещё не были скомпилированы, чтобы их декомпилить нужно было)

Создавай тему.

Эту я создал, когда мне было 15 лет.

Окай :) ток я не сразу) я еще практику проведу и буду в ворде калякать :)

Добавлено через 3 часа 44 минуты
так.. проводил практику.. все написал.. игра запускается.. все ок,.. но моя расса ничо не строит.. как то странно.. не знаете с чем это могло бы быть связано? вроде все файлы обработал..

karak
03-22-2014, 11:09 PM
Хранитель, а у твоей расы вообще есть корабли? В смысле присутствуют ли все те корабли, что ты указал в папке ships со всеми необходимыми файлами, да и прописана ли сама раса в скриптах?

Хранитель
03-23-2014, 06:18 AM
karak, естественно я бы не взялся за ИИ, если бы сама раса у меня не получилась бы. я щас снму на фрапс всю свою работу и выложу на youtube

Хранитель
03-23-2014, 07:12 AM
эм. в общем не получилось записать.. фрапс почему то у меня перестал снимать рабочий стол... но я все прописал в race.lua в familylist.lua прописал в скриптах building and research tobari build.lua и research.lua корабли сделал. стартингфлит сделал. все в общем работает. я могу вполне нормально играть за мою рассу. все так как мне надо. но когда это ИИ, она просто стоит на месте... конечно ресурсы собирает, но почемуто ничего не строит.... хотя я думаю я все в ИИ прописал. вроде все файлики обработал.
класдеф показывать не буду. это глупо. с ним проблем нету 100%. так дальше. цпубюлд:
-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

aitrace("LOADING CPU BUILD")

dofilepath("data:ai/cpuresource.lua")
dofilepath("data:ai/cpubuildsubsystem.lua")

function CreateBuildDefinitions()
if (s_race == Race_Hiigaran) then
kCollector = HGN_RESOURCECOLLECTOR
kRefinery = HGN_RESOURCECONTROLLER
kScout = HGN_SCOUT
kInterceptor = HGN_INTERCEPTOR
kBomber = HGN_ATTACKBOMBER
kCarrier = HGN_CARRIER
kShipYard = HGN_SHIPYARD
kDestroyer = HGN_DESTROYER
kBattleCruiser = HGN_BATTLECRUISER
elseif (s_race == Race_Vaygr) then
kCollector = VGR_RESOURCECOLLECTOR
kRefinery = VGR_RESOURCECONTROLLER
kScout = VGR_SCOUT
kInterceptor = VGR_INTERCEPTOR
kBomber = VGR_BOMBER
kCarrier = VGR_CARRIER
kShipYard = VGR_SHIPYARD
kDestroyer = VGR_DESTROYER
kBattleCruiser = VGR_BATTLECRUISER
else
kCollector = TBR_RESOURCECOLLECTOR
kRefinery = TBR_RESOURCECONTROLLER
kScout = TBR_SCOUT
kInterceptor = TBR_INTERCEPTOR
kBomber = TBR_BOMBER
kCarrier = TBR_CARRIER
kShipYard = TBR_SHIPYARD
kDestroyer = TBR_DESTROYER
kBattleCruiser = TBR_BATTLECRUISER
end
end

function CpuBuild_PersonalityDemand()
if (s_race == Race_Hiigaran) then
sg_classPersonalityDemand[eFighter] = 0.5
sg_classPersonalityDemand[eCorvette] = 0.25
sg_classPersonalityDemand[eFrigate] = 0
elseif (s_race == Race_Vaygr) then
sg_classPersonalityDemand[eFighter] = 0.5
sg_classPersonalityDemand[eCorvette] = 0.5
sg_classPersonalityDemand[eFrigate] = 0.25
else
sg_classPersonalityDemand[eFighter] = 0.5
sg_classPersonalityDemand[eCorvette] = 0.5
sg_classPersonalityDemand[eFrigate] = 0.25
end
sg_classPersonalityDemand[ePlatform] = -0.5
if (Rand(100) < 10) then
sg_classPersonalityDemand[ePlatform] = 0
end
if (g_LOD >= 2) then
sg_classPersonalityDemand[ePlatform] = sg_classPersonalityDemand[ePlatform] - 3
end
aitrace("PersonalityDemand: Fi:"..sg_classPersonalityDemand[eFighter].." Co:"..sg_classPersonalityDemand[eCorvette].." Fr:"..sg_classPersonalityDemand[eFrigate])
end
это начало. первые две функции. остальное я посчитал ненужным прописывать. надеюсь это так. цпубюлдсистем:
-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

function CpuBuildSS_Init()
if (s_race == Race_Hiigaran) then
CpuBuildSS_DefaultSubSystemDemandRules = DoSubSystemDemand_Hiigaran
elseif (s_race == Race_Vaygr) then
CpuBuildSS_DefaultSubSystemDemandRules = DoSubSystemDemand_Vaygr
else
CpuBuildSS_DefaultSubSustemDemandRules = DoSubSystemDemand_Tobari
end
sg_lastSpecialSubSysTime = 0
sg_specialSubSysDelayTime = 150 + Rand(100)
sg_retireCountCheck = 0
sg_buildBCHyperspace = 1
end милитари не трогал. первая функция в ресерче :
function CpuResearch_Init()
if (s_race == Race_Hiigaran) then
dofilepath("data:ai/hiigaran_upgrades.lua")
DoUpgradeDemand = DoUpgradeDemand_Hiigaran
DoResearchTechDemand = DoResearchTechDemand_Hiigaran
elseif (s_race == Race_Vaygr) then
dofilepath("data:ai/vaygr_upgrades.lua")
DoUpgradeDemand = DoUpgradeDemand_Vaygr
DoResearchTechDemand = DoResearchTechDemand_Vaygr
else
dofilepath("data:ai/tobari_upgrades.lua")
DoUpgradeDemand = DoUpgradeDemand_Tobari
DoResearchTechDemand = DoResearchTechDemand_Tobari
end
sg_lastUpgradeTime = gameTime()
sg_upgradeDelayTime = 180 + Rand(80)
cp_researchDemandRange = 0.5
if (g_LOD == 1) then
cp_researchDemandRange = 1
end
if (g_LOD == 0) then
cp_researchDemandRange = 2
end
if (Override_ResearchInit) then
Override_ResearchInit()
end
в том же файле функция, которую я прописал, чтобы тобари исследовали технологии:
function DoResearchTechDemand_Tobari()
if (Util_CheckResearch(CORVETTETECH)) then
local corvdemand = ShipDemandMaxByClass(eCorvette)
if (corvdemand > 0) then
ResearchDemandSet(CORVETTETECH, corvdemand + 0.5)
end
end
if (Util_CheckResearch(ASSAULTCORVETTETECH)) then
local demand = ShipDemandGet(TBR_ASSAULTCORVETTE)
if (demand > 0) then
ResearchDemandSet(ASSAULTCORVETTETECH, demand)
end
end
if (Util_CheckResearch(SHIPYARDTECH)) then
local demand = ShipDemandGet(TBR_SHIPYARD)
if (demand > 0) then
ResearchDemandSet(SHIPYARDTECH, demand)
end
end
if (Util_CheckResearch(BATTLECRUISERTECH)) then
local demand = ShipDemandGet(TBR_BATTLECRUISER)
if (demand > 0) then
ResearchDemandSet(BATTLECRUISERTECH, demand)
end
end
if (Util_CheckResearch(DESTROYERTECH)) then
local demand = ShipDemandGet(TBR_DESTROYER)
if (demand > 0) then
ResearchDemandSet(DESTROYERTECH, demand)
end
end
if (Util_CheckResearch(BOMBERTCORVETTETECH)) then
local demand = ShipDemandGet(TBR_BOMBERCORVETTE)
if (demand > 0) then
ResearchDemandSet(BOMBERCORVETTETECH, demand)
end
end
if (Util_CheckResearch(FRIGATETECH)) then
local frigdemand = ShipDemandMaxByClass(eFrigate)
if (frigdemand > 0) then
ResearchDemandSet(FRIGATETECH, frigdemand + 0.5)
end
end
end
и последнее я сделал тобариапгрейдс. и он пустой...
-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

aitrace("LOADING TOBARI UPGRADE INFO")

rt_mothership = {}
rt_capital = {}
rt_fighter = {}
rt_corvette = {}
rt_frigate = {}
rt_platform = {}
rt_collector = {}

я думаю это все что я сделал и больше ничего не требуется.. но моя расса не строит корабли... почему то..

Добавлено через 5 часов 35 минут
О_О_О начал игру с компами, поставил себе союзника хиигару и два противника ваиигров. ваигры НЕ СТРОЯТ КАК И ТОБАРИ!!! ВТФ!!!! чтото странное!!!

karak
03-23-2014, 09:51 PM
Хранитель, трудно что-то сказать пока мы не увидим всех файлов.

Хранитель
03-24-2014, 06:22 AM
-- LuaDC version 0.9.20
-- 17.11.2013 12:40:31
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
NotPlayable = 0
Playable = 1
races =
{
{ "Invalid", "Invalid", "", "", 0, NotPlayable, "", },
{ "Hiigaran", "$1100", "hyperspace_gate", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 9.5, Playable, "HGN_", },
{ "Tobari", "Tobari", "hyperspace_gate_vgr", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 9.5, Playable, "TBR_", },
{ "Vaygr", "$1101", "hyperspace_gate_vgr", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 9.5, Playable, "VGR_", },
{ "Keeper", "$1102", "hyperspace_gate_kpr", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 12.5, NotPlayable, "KPR_", },
{ "Bentusi", "$1103", "hyperspace_gate_bentusi", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 18.5, NotPlayable, "BEN_", },
{ "GreatProgenitors", "Great Progenitors", "hyperspace_gate_kpr", "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", 9.5, NotPlayable, "PRG_", },
{ "Random", "$3226", "", "", 0, Playable, "", },
}

-- LuaDC version 0.9.20
-- 17.11.2013 13:24:01
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
buildFamily =
{
{
name = "Fighter_Hgn", },
{
name = "Corvette_Hgn", },
{
name = "Mover_Hgn", },
{
name = "Frigate_Hgn", },
{
name = "SuperCap_Hgn", },
{
name = "Shipyard_Hgn", },
{
name = "Battlecruiser_Hgn", },
{
name = "Flagship_Hgn", },
{
name = "Utility_Hgn", },
{
name = "Probe_Hgn", },
{
name = "Platform_Hgn", },
{
name = "SubSystem_Hgn", },
{
name = "SubSystemLarge_Hgn", },
{
name = "Fighter_Vgr", },
{
name = "Corvette_Vgr", },
{
name = "Frigate_Vgr", },
{
name = "SuperCap_Vgr", },
{
name = "Shipyard_Vgr", },
{
name = "Battlecruiser_Vgr", },
{
name = "Flagship_Vgr", },
{
name = "Utility_Vgr", },
{
name = "Probe_Vgr", },
{
name = "Platform_Vgr", },
{
name = "SubSystem_Vgr", },
{
name = "SubSystemLarge_Vgr", },
{
name = "NotBuildable", },
{
name = "Fighter_Tbr", },
{
name = "Corvette_Tbr", },
{
name = "Frigate_Tbr", },
{
name = "SuperCap_Tbr", },
{
name = "Shipyard_Tbr", },
{
name = "Battlecruiser_Tbr", },
{
name = "Flagship_Tbr", },
{
name = "Utility_Tbr", },
{
name = "Probe_Tbr", },
{
name = "SubSystem_Tbr", },
{
name = "SubSystemLarge_Tbr", },
{
name = "Platform_Tbr", },
{
name = "Fighter_Prg", },
{
name = "Corvette_Prg", },
{
name = "Mover_Prg", },
{
name = "Frigate_Prg", },
{
name = "SuperCap_Prg", },
{
name = "Shipyard_Prg", },
{
name = "Battlecruiser_Prg", },
{
name = "Flagship_Prg", },
{
name = "Utility_Prg", },
{
name = "Probe_Prg", },
{
name = "Platform_Prg", },
{
name = "SubSystem_Prg", },
{
name = "SubSystemLarge_Prg", },
}
displayFamily =
{
{
name = "Fighter",
stringParam = "$2100",
numParam = 1, },
{
name = "Corvette",
stringParam = "$2101",
numParam = 2, },
{
name = "Frigate",
stringParam = "$2102",
numParam = 3, },
{
name = "Capital",
stringParam = "$2103",
numParam = 4, },
{
name = "Flagship",
stringParam = "$2104",
numParam = 6, },
{
name = "Platform",
stringParam = "$2105",
numParam = 7, },
{
name = "Utility",
stringParam = "$2106",
numParam = 8, },
{
name = "SubSystemModule",
stringParam = "$2107",
numParam = 9, },
{
name = "SubSystemSensors",
stringParam = "$2108",
numParam = 10, },
{
name = "Munition",
stringParam = "$2109",
numParam = 11, },
{
name = "Megalith",
stringParam = "$2110",
numParam = 12, },
}
attackFamily =
{
{
name = "Fighter",
numParam = 1, },
{
name = "Corvette",
numParam = 1, },
{
name = "Frigate",
numParam = 1, },
{
name = "Utility",
numParam = 1, },
{
name = "Munition",
numParam = 1, },
{
name = "SmallCapitalShip",
numParam = 1, },
{
name = "BigCapitalShip",
numParam = 1, },
{
name = "Mothership",
numParam = 1, },
{
name = "Emplacement",
numParam = 1, },
{
name = "UnAttackable",
numParam = 0, },
{
name = "SubSystem",
numParam = 1, },
{
name = "Resource",
numParam = 1, },
{
name = "ResourceLarge",
numParam = 1, },
{
name = "Capturer",
numParam = 1, },
{
name = "Chimera",
numParam = 1, },
}
dockFamily =
{
{
name = "Mover", },
{
name = "Fighter", },
{
name = "Corvette", },
{
name = "Frigate", },
{
name = "Utility", },
{
name = "Controller", },
{
name = "Platform", },
{
name = "SuperCap", },
{
name = "BattleCruiser", },
{
name = "Transport", },
{
name = "Shipyard", },
{
name = "Flagship", },
{
name = "Resource", },
{
name = "Inhibitor", },
{
name = "LargeSalvage", },
{
name = "UltraCap", },
{
name = "CantDock", },
}
avoidanceFamily =
{
{
name = "None",
numParam = 0, },
{
name = "DontAvoid",
numParam = 1, },
{
name = "Strikecraft",
numParam = 2, },
{
name = "Utility",
numParam = 3, },
{
name = "Frigate",
numParam = 4, },
{
name = "SmallRock",
numParam = 5, },
{
name = "Capital",
numParam = 6, },
{
name = "SuperCap",
numParam = 7, },
{
name = "BattleCruiser",
numParam = 8, },
{
name = "MotherShip",
numParam = 9, },
{
name = "BigRock",
numParam = 10, },
{
name = "SuperPriority",
numParam = 11, },
}
collisionFamily =
{
{
name = "Small",
numParam = 0, },
{
name = "Big",
numParam = 1, },
{
name = "Unmoveable",
numParam = 2, },
}
autoFormationFamily =
{
{
name = "Fighter",
numParam = 0, },
{
name = "Corvette",
numParam = 1, },
{
name = "Frigate",
numParam = 2, },
{
name = "CapShip",
numParam = 3, },
{
name = "SuperCap",
numParam = 4, },
}
armourFamily =
{
{
name = "Unarmoured", },
{
name = "LightArmour", },
{
name = "MediumArmour", },
{
name = "HeavyArmour", },
{
name = "SubSystemArmour", },
{
name = "TurretArmour", },
{
name = "ResArmour", },
{
name = "MoverArmour", },
{
name = "PlanetKillerArmour", },
{
name = "MineArmour", },
{
name = "ChunkArmour", },
}
unitcapsFamily =
{
{
name = "Fighter",
numParam = 1,
stringParam = "$2113", },
{
name = "Corvette",
numParam = 10,
stringParam = "$2114", },
{
name = "Frigate",
numParam = 20,
stringParam = "$2115", },
{
name = "Capital",
numParam = 30,
stringParam = "$2116", },
{
name = "Platform",
numParam = 40,
stringParam = "$2117", },
{
name = "Utility",
numParam = 50,
stringParam = "$2118", },
{
name = "Mothership",
numParam = 60,
stringParam = "$2119", },
{
name = "DreadNaught",
numParam = 70,
stringParam = "$2120", },
{
name = "SPMovers",
numParam = 80,
stringParam = "$2121", },
{
name = "SinglePlayerMisc",
numParam = 90,
stringParam = "This should not be displayed", },
{
name = "CommStation",
numParam = 100,
stringParam = "This should not be displayed", },
}
unitcapsShipType =
{
{
name = "MinelayerCorvette",
numParam = 11,
stringParam = "$2135", },
{
name = "Mover",
numParam = 12,
stringParam = "$2121", },
{
name = "TorpedoFrigate",
numParam = 21,
stringParam = "$2122", },
{
name = "CaptureFrigate",
numParam = 22,
stringParam = "$2123", },
{
name = "DefenseFieldFrigate",
numParam = 23,
stringParam = "$2124", },
{
name = "Destroyer",
numParam = 31,
stringParam = "$2125", },
{
name = "Carrier",
numParam = 32,
stringParam = "$2126", },
{
name = "Battlecruiser",
numParam = 33,
stringParam = "$2127", },
{
name = "Shipyard",
numParam = 34,
stringParam = "$2128", },
{
name = "HyperspacePlatform",
numParam = 41,
stringParam = "$2129", },
{
name = "ResourceCollector",
numParam = 51,
stringParam = "$2130", },
{
name = "ResourceController",
numParam = 52,
stringParam = "$2131", },
{
name = "Probe",
numParam = 53,
stringParam = "$2132", },
{
name = "ECMProbe",
numParam = 54,
stringParam = "$2133", },
{
name = "ProximitySensor",
numParam = 55,
stringParam = "$2134", },
}

-- LuaDC version 0.9.20
-- 17.11.2013 14:33:19
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
PersistantData =
{
StrikeGroups = {},
Squadrons =
{
{
type = "Tbr_ResourceCollector",
subsystems = {},
shiphold = {},
name = "",
size = 1,
number = 6, },
{
type = "Tbr_Carrier",
subsystems = {},
shiphold = {},
name = "",
size = 1,
number = 1, },
},
Research = {}, }

Building and research Tobari:
-- LuaDC version 0.9.20
-- 08.02.2013 14:28:19
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
Ship = 0
SubSystem = 1
build =
{
{
Type = Ship,
ThingToBuild = "Tbr_Bomber",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 40,
DisplayedName = "Bomber",
Description = "Bomber", },
{
Type = Ship,
ThingToBuild = "Tbr_Probe",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 45,
DisplayedName = "Probe",
Description = "Probe", },
{
Type = Ship,
ThingToBuild = "tbr_lightmissilefrigate",
RequiredResearch = "FrigateTech",
RequiredShipSubSystems = "",
DisplayPriority = 50,
DisplayedName = "lightmissilefrigate",
Description = "lightmissilefrigate", },
{
Type = Ship,
ThingToBuild = "Tbr_AssaultCorvette",
RequiredResearch = "AssaultCorvetteTech",
RequiredShipSubSystems = "",
DisplayPriority = 55,
DisplayedName = "AssaultCorvette",
Description = "AssaultCorvette", },
{
Type = Ship,
ThingToBuild = "Tbr_BomberCorvette",
RequiredResearch = "BomberCorvetteTech",
RequiredShipSubSystems = "",
DisplayPriority = 60,
DisplayedName = "Corvette Bomber",
Description = "Corvette Bomber", },
{
Type = Ship,
ThingToBuild = "Tbr_IonTurret",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 65,
DisplayedName = "Ion Platform",
Description = "Ion Platform", },
{
Type = Ship,
ThingToBuild = "Tbr_Interceptor",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 70,
DisplayedName = "Interceptor",
Description = "Interceptor", },
{
Type = Ship,
ThingToBuild = "Tbr_Carrier",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 110,
DisplayedName = "Carrier",
Description = "Carrier", },
{
Type = Ship,
ThingToBuild = "Tbr_ResourceCollector",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 120,
DisplayedName = "Collector",
Description = "Collector", },
{
Type = Ship,
ThingToBuild = "Tbr_Destroyer",
RequiredResearch = "DestroyerTech",
RequiredShipSubSystems = "",
DisplayPriority = 125,
DisplayedName = "Destroyer",
Description = "Destroyer", },
{
Type = Ship,
ThingToBuild = "Tbr_Shipyard",
RequiredResearch = "ShipyardTech",
RequiredShipSubSystems = "",
DisplayPriority = 130,
DisplayedName = "Shipyard",
Description = "Shipyard", },
{
Type = Ship,
ThingToBuild = "Tbr_ResourceController",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 135,
DisplayedName = "Harvester",
Description = "Harvester", },
{
Type = Ship,
ThingToBuild = "Tbr_Battlecruiser",
RequiredResearch = "BattleCruiserTech",
RequiredShipSubSystems = "",
DisplayPriority = 140,
DisplayedName = "Cruiser",
Description = "Cruiser", },
{
Type = Ship,
ThingToBuild = "Tbr_Scout",
RequiredResearch = "",
RequiredShipSubSystems = "",
DisplayPriority = 145,
DisplayedName = "Scout",
Description = "Scout", },
}
дальше у мну комп тормозит =/ сек
-- LuaDC version 0.9.20
-- 22.03.2014 17:10:14
-- LuaDC by Age2uN
-- on error send source file (compiled lua) and this outputfile to Age2uN@gmx.net
--
Icon_Speed = "data:ui/newui/research/icons/speed.mres"
Icon_Health = "data:ui/newui/research/icons/health.mres"
Icon_Tech = "data:ui/newui/research/icons/tech.mres"
Icon_Ability = "data:ui/newui/research/icons/ability.mres"
Icon_Build = "data:ui/newui/research/icons/build.mres"
Modifier = 0
Ability = 1
AllShips = 0
Family = 1
Ship = 2
research =

{
{
Name = "CorvetteTech",
RequiredResearch = "",
RequiredSubSystems = "Research",
Cost = 1000,
Time = 100,
DisplayedName = "CorvetteTech",
DisplayPriority = 5,
Description = "CorvetteTech",
TargetType = Family,
TargetName = "Corvette",
Icon = Icon_Tech,
ShortDisplayedName = "CorvetteTech", },
{
Name = "DestroyerTech",
RequiredResearch = "",
RequiredSubSystems = "Research",
Cost = 2000,
Time = 150,
DisplayedName = "DestroyerTech",
DisplayPriority = 10,
Description = "DestroyerTech",
TargetType = Family,
TargetName = "Capital",
Icon = Icon_Tech,
ShortDisplayedName = "DestroyerTech", },
{
Name = "AssaultCorvetteTech",
RequiredResearch = "CorvetteTech",
RequiredSubSystems = "Research",
Cost = 2000,
Time = 100,
DisplayedName = "AssaultCorvetteTech",
DisplayPriority = 15,
Description = "AssaultCorvetteTech",
TargetType = Family,
TargetName = "Corvette",
Icon = Icon_Tech,
ShortDisplayedName = "AssaultCorvetteTech", },
{
Name = "BomberCorvetteTech",
RequiredResearch = "CorvetteTech",
RequiredSubSystems = "Research",
Cost = 2000,
Time = 150,
DisplayedName = "BomberCorvetteTech",
DisplayPriority = 20,
Description = "BomberCorvetteTech",
TargetType = Family,
TargetName = "Corvette",
Icon = Icon_Tech,
ShortDisplayedName = "BomberCorvetteTech", },
{
Name = "FrigateTech",
RequiredResearch = "",
RequiredSubSystems = "Research",
Cost = 2500,
Time = 250,
DisplayedName = "FrigateTech",
DisplayPriority = 25,
Description = "FrigateTech",
TargetType = Family,
TargetName = "Frigate",
Icon = Icon_Tech,
ShortDisplayedName = "FrigateTech", },
{
Name = "ShipyardTech",
RequiredResearch = "",
RequiredSubSystems = "Research",
Cost = 2500,
Time = 100,
DisplayedName = "ShipyardTech",
DisplayPriority = 30,
Description = "ShipyardTech",
TargetType = Family,
TargetName = "Capital",
Icon = Icon_Tech,
ShortDisplayedName = "ShipyardTech", },
{
Name = "BattleCruiserTech",
RequiredResearch = "",
RequiredSubSystems = "Research",
Cost = 3000,
Time = 200,
DisplayedName = "BattleCruiserTech",
DisplayPriority = 35,
Description = "BattleCruiserTech",
TargetType = Family,
TargetName = "Capital",
Icon = Icon_Tech,
ShortDisplayedName = "BattleCruiserTech", },
}

шипы выкладывать не буду =/ уж больно много . терь ИИ
-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

aitrace("CPU: CLASSDEF LOADED")

squadclass = {}

squadclass[eMotherShip] = {
HGN_MOTHERSHIP,
VGR_MOTHERSHIP,
VGR_MOTHERSHIP_MAKAAN}

squadclass[eCollector] = {
HGN_RESOURCECOLLECTOR,
TBR_RESOURCECOLLECTOR,
VGR_RESOURCECOLLECTOR}

squadclass[eScout] = {
HGN_SCOUT,
HGN_PROBE,
HGN_PROXIMITYSENSOR,
HGN_ECMPROBE,
VGR_SCOUT,
VGR_PROBE,
VGR_PROBE_PROX,
TBR_SCOUT,
TBR_PROBE,
VGR_PROBE_ECM}

squadclass[eRefinery] = {
HGN_RESOURCECONTROLLER,
TBR_RESOURCECONTROLLER,
VGR_RESOURCECONTROLLER}

squadclass[eBuilder] = {
HGN_MOTHERSHIP,
HGN_CARRIER,
HGN_SHIPYARD,
VGR_MOTHERSHIP,
VGR_MOTHERSHIP_MAKAAN,
VGR_CARRIER,
TBR_CARRIER,
TBR_SHIPYARD,
VGR_SHIPYARD}

squadclass[eDropOff] = {
HGN_MOTHERSHIP,
HGN_CARRIER,
HGN_SHIPYARD,
HGN_RESOURCECONTROLLER,
VGR_MOTHERSHIP,
VGR_MOTHERSHIP_MAKAAN,
VGR_CARRIER,
VGR_SHIPYARD,
TBR_RESOURCECONTROLLER,
TBR_CARRIER,
TBR_SHIPYARD,
VGR_RESOURCECONTROLLER}

squadclass[eSalvageDropOff] = {
HGN_MOTHERSHIP,
HGN_CARRIER,
HGN_SHIPYARD,
VGR_MOTHERSHIP,
VGR_MOTHERSHIP_MAKAAN,
VGR_CARRIER,
TBR_SHIPYARD,
TBR_CARRIER,
VGR_SHIPYARD}

squadclass[eFighter] = {
HGN_INTERCEPTOR,
HGN_ATTACKBOMBER,
HGN_ATTACKBOMBERELITE,
VGR_INTERCEPTOR,
VGR_BOMBER,
TBR_INTERCEPTOR,
TBR_BOMBER,
VGR_LANCEFIGHTER}

squadclass[eCorvette] = {
HGN_ASSAULTCORVETTE,
HGN_PULSARCORVETTE,
HGN_MINELAYERCORVETTE,
VGR_MISSILECORVETTE,
VGR_LASERCORVETTE,
VGR_MINELAYERCORVETTE,
TBR_ASSAULTCORVETTE,
TBR_BOMBERCORVETTE,
VGR_COMMANDCORVETTE}

squadclass[eFrigate] = {
HGN_ASSAULTFRIGATE,
HGN_DEFENSEFIELDFRIGATE,
HGN_IONCANNONFRIGATE,
HGN_MARINEFRIGATE,
HGN_MARINEFRIGATE_SOBAN,
HGN_TORPEDOFRIGATE,
HGN_TORPEDOFRIGATEELITE,
VGR_ASSAULTFRIGATE,
VGR_HEAVYMISSILEFRIGATE,
TBR_LIGHTMISSILEFRIGATE,
VGR_INFILTRATORFRIGATE}

squadclass[eCapture] = {
HGN_MARINEFRIGATE,
HGN_MARINEFRIGATE_SOBAN,
VGR_INFILTRATORFRIGATE}

squadclass[eShield] = {
HGN_DEFENSEFIELDFRIGATE}

squadclass[ePlatform] = {
HGN_GUNTURRET,
HGN_IONTURRET,
VGR_WEAPONPLATFORM_GUN,
VGR_WEAPONPLATFORM_MISSILE,
TBR_IONTURRET,
VGR_HYPERSPACE_PLATFORM}

squadclass[eAntiFighter] = {
HGN_INTERCEPTOR,
HGN_ASSAULTCORVETTE,
HGN_ASSAULTFRIGATE,
HGN_GUNTURRET,
VGR_INTERCEPTOR,
VGR_ASSAULTFRIGATE,
TBR_INTERCEPTOR,
TBR_LIGHTMISSILEFRIGATE,
TBR_ASSAULTCORVETTE,
VGR_WEAPONPLATFORM_GUN}

squadclass[eAntiCorvette] = {
HGN_PULSARCORVETTE,
HGN_TORPEDOFRIGATE,
HGN_TORPEDOFRIGATEELITE,
HGN_DESTROYER,
VGR_LANCEFIGHTER,
VGR_LAZERCORVETTE,
TBR_ASSAULTCORVETTE,
TBR_BOMBERCORVETTE,
TBR_BOMBER,
TBR_LIGHTMISSILEFRIGATE,
TBR_DESTROYER,
VGR_DESTROYER}

squadclass[eAntiFrigate] = {
HGN_IONTURRET,
HGN_ATTACKBOMBER,
HGN_ATTACKBOMBERELITE,
HGN_IONCANNONFRIGATE,
HGN_MARINEFRIGATE,
HGN_MARINEFRIGATE_SOBAN,
HGN_DEFENSEFIELDFRIGATE,
HGN_DESTROYER,
HGN_BATTLECRUISER,
VGR_BOMBER,
VGR_HEAVYMISSILEFRIGATE,
VGR_INFILTRATORFRIGATE,
VGR_DESTROYER,
VGR_BATTLECRUISER,
TBR_DESTROYER,
TBR_BATTLECRUISER,
TBR_BOMBER,
TBR_BOMBERCORVETTE,
VGR_WEAPONPLATFORM_MISSILE}

squadclass[eCapital] = {
HGN_CARRIER,
HGN_MOTHERSHIP,
HGN_SHIPYARD,
HGN_DESTROYER,
HGN_BATTLECRUISER,
HGN_DREADNAUGHT,
VGR_CARRIER,
VGR_MOTHERSHIP,
VGR_MOTHERSHIP_MAKAAN,
VGR_SHIPYARD,
VGR_DESTROYER,
TBR_DESTROYER,
TBR_BATTLECRUISER,
TBR_CARRIER,
TBR_SHIPYARD,
VGR_BATTLECRUISER}

squadclass[eNonThreat] = {
HGN_RESOURCECOLLECTOR,
VGR_RESOURCECOLLECTOR,
HGN_RESOURCECONTROLLER,
VGR_RESOURCECONTROLLER,
HGN_CARRIER,
HGN_MOTHERSHIP,
HGN_SHIPYARD,
VGR_CARRIER,
VGR_MOTHERSHIP,
VGR_MOTHERSHIP_MAKAAN,
VGR_SHIPYARD,
HGN_SCOUT,
HGN_PROBE,
HGN_PROXIMITYSENSOR,
HGN_ECMPROBE,
VGR_SCOUT,
VGR_PROBE,
VGR_PROBE_PROX,
VGR_PROBE_ECM,
TBR_PROBE,
TBR_SCOUT,
TBR_RESOURCECOLLECTOR,
TBR_RESOURCECONTROLLER,
VGR_HYPERSPACE_PLATFORM}

squadclass[eHyperspaceGate] = {
VGR_HYPERSPACE_PLATFORM}

squadclass[eSubSystemAttackers] = {
HGN_ATTACKBOMBER,
HGN_ATTACKBOMBERELITE,
TBR_BOMBER,
TBR_BOMBERCORVETTE,
VGR_BOMBER}

squadclass[eNonCriticalSubSys] = {
CLOAKGENERATOR,
FIRECONTROLTOWER,
HYPERSPACEINHIBITOR,
ADVANCEDARRAY,
CLOAKSENSOR}

squadclass[eGoodRepairAttackers] = {
HGN_INTERCEPTOR,
HGN_ASSAULTFRIGATE,
HGN_IONCANNONFRIGATE,
HGN_DESTROYER,
HGN_BATTLECRUISER,
VGR_INTERCEPTOR,
VGR_MISSILECORVETTE,
VGR_ASSAULTFRIGATE,
VGR_DESTROYER,
TBR_DESTROYER,
TBR_BATTLECRUISER,
TBR_INTERCEPTOR,
TBR_ASSAULTCORVETTE,
TBR_LIGHTMISSILEFRIGATE,
VGR_BATTLECRUISER}

eUselessShips = eMaxCount

eBattleCruiser = eMaxCount + 1

sg_maxClasses = eBattleCruiser + 1

squadclass[eUselessShips] = {
HGN_MINELAYERCORVETTE,
VGR_MINELAYERCORVETTE,
VGR_COMMANDCORVETTE}

squadclass[eBattleCruiser] = {
HGN_BATTLECRUISER,
TBR_BATTLECRUISER,
VGR_BATTLECRUISER}

function FastAddToClass(tbl, classid)
for a, b in tbl do
AddToClass(b, classid)
end
end

function ClassInitialize()
for i=0, sg_maxClasses do
if (squadclass[i]) then
FastAddToClass(squadclass[i], i)
end
end
AddClassName(eMotherShip, "Motherships")
AddClassName(eCollector, "Collectors")
AddClassName(eDropOff, "DropOffs")
AddClassName(eFighter, "Fighters")
AddClassName(eFrigate, "Frigates")
AddClassName(eCorvette, "Corvettes")
AddClassName(eCapital, "Capital")
AddClassName(eAntiFighter, "AntiFighter")
AddClassName(eAntiCorvette, "AntiCorvette")
AddClassName(eAntiFrigate, "AntiFrigate")
AddClassName(ePlatform, "Platform")
AddClassName(eRefinery, "Refinery")
AddClassName(eHyperspaceGate, "HypGates")
AddClassName(eShield, "Shields")
AddClassName(eCapture, "Capture")
AddClassName(eSubSystemAttackers, "SubSysKillas")
AddClassName(eBattleCruiser, "BattleCruiser")
end

-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

aitrace("LOADING CPU BUILD")

dofilepath("data:ai/cpuresource.lua")
dofilepath("data:ai/cpubuildsubsystem.lua")

function CreateBuildDefinitions()
if (s_race == Race_Hiigaran) then
kCollector = HGN_RESOURCECOLLECTOR
kRefinery = HGN_RESOURCECONTROLLER
kScout = HGN_SCOUT
kInterceptor = HGN_INTERCEPTOR
kBomber = HGN_ATTACKBOMBER
kCarrier = HGN_CARRIER
kShipYard = HGN_SHIPYARD
kDestroyer = HGN_DESTROYER
kBattleCruiser = HGN_BATTLECRUISER
elseif (s_race == Race_Vaygr) then
kCollector = VGR_RESOURCECOLLECTOR
kRefinery = VGR_RESOURCECONTROLLER
kScout = VGR_SCOUT
kInterceptor = VGR_INTERCEPTOR
kBomber = VGR_BOMBER
kCarrier = VGR_CARRIER
kShipYard = VGR_SHIPYARD
kDestroyer = VGR_DESTROYER
kBattleCruiser = VGR_BATTLECRUISER
else
kCollector = TBR_RESOURCECOLLECTOR
kRefinery = TBR_RESOURCECONTROLLER
kScout = TBR_SCOUT
kInterceptor = TBR_INTERCEPTOR
kBomber = TBR_BOMBER
kCarrier = TBR_CARRIER
kShipYard = TBR_SHIPYARD
kDestroyer = TBR_DESTROYER
kBattleCruiser = TBR_BATTLECRUISER
end
end

function CpuBuild_PersonalityDemand()
if (s_race == Race_Hiigaran) then
sg_classPersonalityDemand[eFighter] = 0.5
sg_classPersonalityDemand[eCorvette] = 0.25
sg_classPersonalityDemand[eFrigate] = 0
elseif (s_race == Race_Vaygr) then
sg_classPersonalityDemand[eFighter] = 0.5
sg_classPersonalityDemand[eCorvette] = 0.5
sg_classPersonalityDemand[eFrigate] = 0.25
else
sg_classPersonalityDemand[eFighter] = 0.5
sg_classPersonalityDemand[eCorvette] = 0.5
sg_classPersonalityDemand[eFrigate] = 0.25
end
sg_classPersonalityDemand[ePlatform] = -0.5
if (Rand(100) < 10) then
sg_classPersonalityDemand[ePlatform] = 0
end
if (g_LOD >= 2) then
sg_classPersonalityDemand[ePlatform] = sg_classPersonalityDemand[ePlatform] - 3
end
aitrace("PersonalityDemand: Fi:"..sg_classPersonalityDemand[eFighter].." Co:"..sg_classPersonalityDemand[eCorvette].." Fr:"..sg_classPersonalityDemand[eFrigate])
end

function CpuBuild_Init()
CreateBuildDefinitions()
CpuBuildSS_Init()
CpuResource_Init()
sg_resourceDemand = 1
sg_scoutDemand = 0
sg_militaryDemand = 1
sg_randScoutStartBuildTime = 30 + Rand(120)
sg_randFavorShipType = Rand(100)
sg_classPersonalityDemand = {}
CpuBuild_PersonalityDemand()
sg_subSystemOverflowDemand = 0
sg_subSystemDemand = 0
sg_shipDemand = 4
sg_militaryToBuildPerCollector = 0
if (g_LOD == 0) then
CpuBuild_DefaultShipDemandRules = CpuBuild_DefaultShipDemandRules_Easy
elseif (g_LOD == 1) then
CpuBuild_DefaultShipDemandRules = CpuBuild_DefaultShipDemandRules_Med
else
CpuBuild_DefaultShipDemandRules = CpuBuild_DefaultShipDemandRules_Hard
end
cp_shipDemandRange = 0.5
cp_subSystemDemandRange = 0.5
if (g_LOD == 1) then
cp_shipDemandRange = 1
cp_subSystemDemandRange = 1
end
if (g_LOD == 0) then
cp_shipDemandRange = 2
cp_subSystemDemandRange = 2
end
if (Override_BuildDemandInit) then
Override_BuildDemandInit()
end
kUnitCapId_Fighter = GetUnitCapFamilyId("Fighter")
kUnitCapId_Corvette = GetUnitCapFamilyId("Corvette")
kUnitCapId_Frigate = GetUnitCapFamilyId("Frigate")
end

function DetermineClassDemand()
for i = 0, eMaxCount do
if (sg_classPersonalityDemand[i] and sg_classPersonalityDemand[i] ~= 0) then
ShipDemandSetByClass(i, sg_classPersonalityDemand[i]);
end
end
ShipDemandSetByClass(eUselessShips, -10)
end

function DetermineAntiChassisDemand(enemyIndex)
local kFighterCounterScale = 3
local kCorvetteCounterScale = 1.5
local kFrigateCounterScale = 1
local AFiDemand = 0
local ACoDemand = 0
local AFrDemand = 0
local FiValue = PlayersMilitary_Fighter(enemyIndex, player_max)
local self_AFiValue = PlayersMilitary_AntiFighter(s_playerIndex, player_max)
local enemy_FiTotal = (FiValue - self_AFiValue) * kFighterCounterScale
if (enemy_FiTotal < 0) then
enemy_FiTotal = 0
end
local CoValue = PlayersMilitary_Corvette(enemyIndex, player_max)
local self_ACoValue = PlayersMilitary_AntiCorvette(s_playerIndex, player_max)
local enemy_CoTotal = (CoValue - self_ACoValue) * kCorvetteCounterScale
if (enemy_CoTotal < 0) then
enemy_CoTotal = 0
end
local MSfrig_correction = 0
if (s_militaryStrengthVersusTarget < 20) then
MSfrig_correction = 25
end
local FrValue = PlayersMilitary_Frigate(enemyIndex, player_max) - MSfrig_correction
local self_AFrValue = PlayersMilitary_AntiFrigate(s_playerIndex, player_max)
local enemy_FrTotal = (FrValue - self_AFrValue) * kFrigateCounterScale
if (enemy_FrTotal < 0) then
enemy_FrTotal = 0
end
local enemy_ChassisTotal = enemy_FiTotal + enemy_CoTotal + enemy_FrTotal
if (enemy_ChassisTotal > 0) then
if (enemy_FiTotal > 0) then
local FiTotalPercent = enemy_FiTotal * 100 / enemy_ChassisTotal
if (FiTotalPercent > 70) then
AFiDemand = AFiDemand + 3
elseif (FiTotalPercent > 35) then
AFiDemand = AFiDemand + 1.5
end
end
if (enemy_CoTotal > 0) then
local CoTotalPercent = enemy_CoTotal * 100 / enemy_ChassisTotal
if (CoTotalPercent > 70) then
ACoDemand = ACoDemand + 3
elseif (CoTotalPercent > 35) then
ACoDemand = ACoDemand + 1.5
end
end
if (enemy_FrTotal > 0) then
local FrTotalPercent = enemy_FrTotal * 100 / enemy_ChassisTotal
if (FrTotalPercent > 70) then
AFrDemand = AFrDemand + 3
elseif (FrTotalPercent > 35) then
AFrDemand = AFrDemand + 1.5
end
end
end
if (AFiDemand > 0) then
ShipDemandAddByClass(eAntiFighter, AFiDemand)
end
if (ACoDemand > 0) then
ShipDemandAddByClass(eAntiCorvette, ACoDemand)
end
if (AFrDemand > 0) then
ShipDemandAddByClass(eAntiFrigate, AFrDemand)
end
aitrace("AChDmd: AFi:"..AFiDemand.." ACo:"..ACoDemand.." AFr:"..AFrDemand)
end

function DetermineChassisDemand(enemyIndex)
local FiDemand = 0
local CoDemand = 0
local FrDemand = 0
local AFiValue = PlayersMilitary_AntiFighter(enemyIndex, player_max)
local ACoValue = PlayersMilitary_AntiCorvette(enemyIndex, player_max)
local AFrValue = PlayersMilitary_AntiFrigate(enemyIndex, player_max)
local ATotal = AFiValue + ACoValue + AFrValue
if (ATotal <= 0) then
return
end
if (AFiValue > 5) then
local AFiPercent = AFiValue * 100 / ATotal
if (AFiPercent > 70) then
FiDemand = FiDemand - 3
elseif (AFiPercent > 35) then
FiDemand = FiDemand - 1.5
end
end
if (ACoValue > 5) then
local ACoPercent = ACoValue * 100 / ATotal
if (ACoPercent > 70) then
CoDemand = CoDemand - 2
elseif (ACoPercent > 35) then
CoDemand = CoDemand - 1
end
end
if (AFrValue > 5) then
local AFrPercent = AFrValue * 100 / ATotal
if (AFrPercent > 70) then
FrDemand = FrDemand - 1.5
elseif (AFrPercent > 35) then
FrDemand = FrDemand - 0.5
end
end
ShipDemandAddByClass(eFighter, FiDemand)
ShipDemandAddByClass(eCorvette, CoDemand)
ShipDemandAddByClass(eFrigate, FrDemand)
aitrace("ChDmd: Fi:"..FiDemand.." Co:"..CoDemand.." Fr:"..FrDemand)
end

function DetermineDemandWithNoCounterInfo()
if (s_militaryPop < 5) then
aitrace("Dmd:Rand:"..sg_randFavorShipType)
if (s_race == Race_Hiigaran) then
if (sg_randFavorShipType < 55) then
ShipDemandAddByClass(eFighter, 1)
elseif (sg_randFavorShipType < 85) then
ShipDemandAddByClass(eCorvette, 1)
elseif (g_LOD < 2 and sg_randFavorShipType < 95) then
ShipDemandAddByClass(eFrigate, 1)
else
ShipDemandAdd(kDestroyer, 1)
end
else
if (sg_randFavorShipType < 45) then
ShipDemandAddByClass(eFighter, 1)
elseif (sg_randFavorShipType < 75) then
ShipDemandAddByClass(eCorvette, 1)
else
ShipDemandAddByClass(eFrigate, 1)
end
end
else
aitrace("Dmd:Asking for AntiFrigates")
ShipDemandAddByClass(eAntiFrigate, 1.5)
end
end

function DetermineCounterDemand()
if (s_enemyIndex ~= -1) then
local enemyMilitaryCount = PlayersMilitaryPopulation(s_enemyIndex, player_max)
if (enemyMilitaryCount >= 3) then
DetermineChassisDemand(s_enemyIndex)
DetermineAntiChassisDemand(s_enemyIndex)
return
end
end
DetermineDemandWithNoCounterInfo();
end

function DetermineSpecialDemand()
if (ShipDemandGet(kInterceptor) > 0 and NumSubSystems(FIGHTERPRODUCTION) > 0 and NumSquadrons(kInterceptor) < 3 and s_militaryPop < 10) then
ShipDemandAdd(kInterceptor, 0.5)
end
if (s_selfTotalValue > 120) then
local additionalFrigDemand = 0.5
if (s_race == Race_Hiigaran) then
local advresearchcount = NumSubSystems(ADVANCEDRESEARCH) + NumSubSystemsQ(ADVANCEDRESEARCH)
if (advresearchcount > 0) then
additionalFrigDemand = additionalFrigDemand + 0.25
end
end
ShipDemandAddByClass(eFrigate, additionalFrigDemand)
ShipDemandAddByClass(eFighter, -0.5)
end
local numSpecial = numQueueOfClass(eCapture) + numQueueOfClass(eShield)
local numFrigates = numQueueOfClass(eFrigate)
if (numFrigates == 0 or numSpecial / numFrigates > 0.4) then
ShipDemandAddByClass(eCapture, -10)
ShipDemandAddByClass(eShield, -10)
else
if (s_militaryPop < 5) then
ShipDemandAddByClass(eCapture, -4)
ShipDemandAddByClass(eShield, -4.5)
elseif (s_militaryPop < 10) then
ShipDemandAddByClass(eCapture, -2)
ShipDemandAddByClass(eShield, -2.5)
elseif (s_militaryPop < 15) then
ShipDemandAddByClass(eCapture, -1)
ShipDemandAddByClass(eShield, -1.5)
elseif (s_militaryPop > 30) then
ShipDemandAddByClass(eCapture, 1)
ShipDemandAddByClass(eShield, 1)
end
end
if (s_race == Race_Hiigaran) then
local torpedoDemand = -0.5
if (IsResearchDone(IMPROVEDTORPEDO) == 1 or s_militaryStrength > 40 or GetRU() > 2500) then
torpedoDemand = 0
end
ShipDemandAdd(HGN_TORPEDOFRIGATE, torpedoDemand)
end
local numRUs = GetRU()
if ((GetNumCollecting() > 9 or numRUs > 1500) and s_militaryPop > 8 and UnderAttackThreat() < -75) then
ShipDemandAdd(kBattleCruiser, 0.75)
ShipDemandAdd(kDestroyer, 0.25)
if (IsResearchDone(BATTLECRUISERIONWEAPONS) == 1) then
ShipDemandAdd(kBattleCruiser, 0.5)
end
end
local numEnemyBattleCruisers = PlayersUnitTypeCount(player_enemy, player_total, eBattleCruiser)
if (numEnemyBattleCruisers > 0) then
local ssKillaDemand = numEnemyBattleCruisers / 2
if (s_enemyIndex ~= -1) then
local targetEnemyCruisers = PlayersUnitTypeCount(s_enemyIndex, player_max, eBattleCruiser)
if (targetEnemyCruisers > 0) then
ssKillaDemand = ssKillaDemand + targetEnemyCruisers
end
end
ShipDemandAddByClass(eSubSystemAttackers, ssKillaDemand)
end
local numShipyards = NumSquadrons(kShipYard) + NumSquadronsQ(kShipYard)
if (numShipyards == 0 and UnderAttackThreat() < -75) then
local bcDemand = ShipDemandGet(kBattleCruiser)
if (bcDemand >= 0.5) then
ShipDemandAdd(kShipYard, bcDemand - 0.5)
end
end
if (s_militaryStrength > 25 * sg_moreEnemies) then
ShipDemandAddByClass(ePlatform, -2)
end
end

function CalculateMilitaryValueGoal(militaryTable, percentOfEnemy)
local curTime = gameTime()
local minMilitaryValue = 0
if (s_enemyTotalValue * percentOfEnemy > minMilitaryValue) then
minMilitaryValue = s_enemyTotalValue * percentOfEnemy
end
for k, v in militaryTable do
if (curTime < v[3]) then
if (minMilitaryValue < v[1]) then
minMilitaryValue = v[1]
end
if (minMilitaryValue > v[2]) then
minMilitaryValue = v[2]
end
break
end
end
return minMilitaryValue
end

function CpuBuild_DefaultShipDemandRules_Easy()
local valueTable = {
{80, 135, 8 * 60},
{120, 180, 15 * 60},
{160, 230, 20 * 60},
{220, 300, 30 * 60},
{270, 370, 45 * 60},
{350, 500, 60 * 60},
{500, 1000, 10000 * 60},}
local minMilitaryValue = CalculateMilitaryValueGoal(valueTable, 0.7)
aitrace("Aim:"..minMilitaryValue.." CurMil:"..s_selfTotalValue.." Enm:"..s_enemyTotalValue)
if (s_selfTotalValue < minMilitaryValue) then
DetermineClassDemand();
DetermineCounterDemand();
DetermineSpecialDemand();
end
DetermineScoutDemand();
DetermineBuilderClassDemand();
end

function CpuBuild_DefaultShipDemandRules_Med()
local valueTable = {
{120, 200, 8 * 60},
{160, 250, 15 * 60},
{220, 320, 20 * 60},
{280, 400, 30 * 60},
{320, 500, 45 * 60},
{500, 700, 60 * 60},
{700, 1200, 10000 * 60},}
local minMilitaryValue = CalculateMilitaryValueGoal(valueTable, 0.85)
aitrace("Aim:"..minMilitaryValue.." CurMil:"..s_selfTotalValue.." Enm:"..s_enemyTotalValue)
if (s_selfTotalValue < minMilitaryValue) then
DetermineClassDemand();
DetermineCounterDemand();
DetermineSpecialDemand();
end
DetermineScoutDemand();
DetermineBuilderClassDemand();
end

function CpuBuild_DefaultShipDemandRules_Hard()
DetermineClassDemand();
DetermineCounterDemand();
DetermineScoutDemand();
DetermineBuilderClassDemand();
DetermineSpecialDemand();
end

function CpuBuild_RemoveBuildItems()
RemoveStalledBuildItems()
end

function CpuBuild_Process()
ShipDemandClear()
CpuBuild_RemoveBuildItems()
if (Override_ShipDemand) then
Override_ShipDemand()
else
CpuBuild_DefaultShipDemandRules()
end
if (sg_resourceDemand > 0 or sg_militaryDemand <= 0) then
if (DoResourceBuild() == 1) then
sg_resourceDemand = 1 - sg_militaryToBuildPerCollector
return 1
end
end
if (sg_militaryDemand > 0) then
aitrace("**DoMilitaryBuild")
if (DoMilitaryBuild() == 1) then
if (sg_resourceDemand <= 0) then
sg_resourceDemand = sg_resourceDemand + 1
end
return 1
end
end
return 0
end

function DoMilitaryBuild()
local ssDemand = sg_subSystemDemand + sg_subSystemOverflowDemand + (Rand(3) - 1)
local shipId = FindHighDemandShip()
local highestPriority = HighestPriorityShip()
if (UnderAttackThreat() > -5 and shipId > 0 and highestPriority >= 0.5) then
ssDemand = 0
aitrace("Subsys demand reduced because we are under attack")
end
if (sg_shipDemand > ssDemand) then
if (shipId > 0) then
Build(shipId)
sg_subSystemOverflowDemand = sg_subSystemOverflowDemand + 1
return 1
end
end
if (sg_dosubsystems == 1 and CpuBuildSS_DoBuildSubSystem() == 1) then
return 1
end
return 0
end

function DetermineScoutDemand()
local curGameTime = gameTime()
if (UnderAttackThreat() < -10 and s_militaryPop > 0 and curGameTime > sg_randScoutStartBuildTime) then
local numEnemies = PlayersAlive(player_enemy)
local shipCount = numQueueOfClass(eScout)
local numScoutsDemanded = 1
if (numEnemies >= 2) then
numScoutsDemanded = 2
end
if (numEnemies > 2 and s_militaryPop > 7) then
numScoutsDemanded = 2 + ((s_militaryPop - 7) / 10)
end
if (shipCount < numScoutsDemanded) then
ShipDemandAddByClass(eScout, 3.5)
local scoutRand = Rand(100)
if (scoutRand > 30) then
ShipDemandAdd(kScout, 1.5)
end
sg_randScoutStartBuildTime = curGameTime + 50
end
end
end

function DetermineBuilderClassDemand()
local numBuilders = numQueueOfClass(eBuilder)
local numActiveBuilders = numActiveOfClass(s_playerIndex, eBuilder)
if (numBuilders > numActiveBuilders) then
ShipDemandAddByClass(eBuilder, -10);
return
end
if (g_LOD == 0 and numBuilders > 3) then
ShipDemandAddByClass(eBuilder, -10);
return
elseif (g_LOD == 1 and numBuilders > 4) then
ShipDemandAddByClass(eBuilder, -10);
return
end
if (s_militaryPop < 5 or (UnderAttack() == 1 and UnderAttackThreat() > -75)) then
ShipDemandAddByClass(eBuilder, -10);
return
end
local numRUs = GetRU()
if (GetNumCollecting() < 7 and numRUs < 15000) then
return
end
local numRUToBuildTable = {1000, 2000, 3500, 6500, 10000, 15000}
if (numBuilders > 5) then
numBuilders = 5
end
local RUsNeededToBuildBuilder = numRUToBuildTable[numBuilders + 1]
if (s_race == Race_Vaygr) then
RUsNeededToBuildBuilder = RUsNeededToBuildBuilder - 500
end
local dif = numRUs - RUsNeededToBuildBuilder
if (dif > 0) then
local ruPerShip = 2000
if (s_militaryStrength > 30) then
ruPerShip = 1000
end
local bonusDemand = (1 + (dif / ruPerShip))
ShipDemandAddByClass(eBuilder, bonusDemand);
end
if (dif < -2000) then
local penaltyDemand = dif / 2000
ShipDemandAddByClass(eBuilder, penaltyDemand);
end
local neededMilitaryValue = 30 + (numBuilders - 1) * 60
local militaryDifDemand = (s_selfTotalValue - neededMilitaryValue) / 30
if (militaryDifDemand < 0) then
ShipDemandAddByClass(eBuilder, militaryDifDemand);
end
return 0
end щас еще.. а то комп ща сгорит х_х
-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

function CpuBuildSS_Init()
if (s_race == Race_Hiigaran) then
CpuBuildSS_DefaultSubSystemDemandRules = DoSubSystemDemand_Hiigaran
elseif (s_race == Race_Vaygr) then
CpuBuildSS_DefaultSubSystemDemandRules = DoSubSystemDemand_Vaygr
else
CpuBuildSS_DefaultSubSustemDemandRules = DoSubSystemDemand_Tobari
end
sg_lastSpecialSubSysTime = 0
sg_specialSubSysDelayTime = 150 + Rand(100)
sg_retireCountCheck = 0
sg_buildBCHyperspace = 1
end

function CpuBuildSS_SpecialSubSystemDemand()
local curGameTime = gameTime()
local timeSinceLastSubSysDemand = curGameTime - sg_lastSpecialSubSysTime
if (s_selfTotalValue > 160 and s_militaryStrength > -5 and UnderAttackThreat() < -70 and (timeSinceLastSubSysDemand > sg_specialSubSysDelayTime or GetRU() > 3000)) then
local productionDemand = SubSystemDemandGet(FIGHTERPRODUCTION) +
SubSystemDemandGet(CORVETTEPRODUCTION) +
SubSystemDemandGet(FRIGATEPRODUCTION) +
SubSystemDemandGet(CAPSHIPPRODUCTION) +
SubSystemDemandGet(PLATFORMPRODUCTION) +
SubSystemDemandGet(RESEARCH) +
SubSystemDemandGet(ADVANCEDRESEARCH)
aitrace("SS:special demand:"..productionDemand)
if (productionDemand <= 1) then
local specialSubsystems = {HYPERSPACE, FIRECONTROLTOWER, HYPERSPACEINHIBITOR}
if (g_LOD < 2) then
specialSubsystems = {HYPERSPACE, CLOAKGENERATOR, FIRECONTROLTOWER, HYPERSPACEINHIBITOR, ADVANCEDARRAY, CLOAKSENSOR}
end
local minNumber = 10
local maxNumber = 0
for a, b in specialSubsystems do
local numberBuilt = NumSubSystems(b) + NumSubSystemsQ(b)
if (numberBuilt < minNumber) then
minNumber = numberBuilt
end
if (numberBuilt > maxNumber) then
maxNumber = numberBuilt
end
end
for a, b in specialSubsystems do
local numQueued = NumSubSystemsQ(b)
if (numQueued == 0) then
local numberBuilt = NumSubSystems(b) + numQueued
local demand = 1
if (minNumber < maxNumber) then
demand = demand * (1.0 - ((numberBuilt - minNumber) / (maxNumber - minNumber)))
end
SubSystemDemandAdd(b, demand)
end
end
sg_lastSpecialSubSysTime = curGameTime;
end
end
end

function CpuBuildSS_RetireVaygrProductionSubSystems()
local numCarriers = CarrierCount()
for i = 0, (numCarriers - 1) do
local carrier = CarrierAt(i)
local productionId = CarrierProductionSubSystem(carrier)
if (productionId ~= 0) then
local ssdemand = SubSystemDemandGet(productionId)
if (ssdemand < 0) then
sg_retireCountCheck = sg_retireCountCheck + 1
if (sg_retireCountCheck >= 2) then
aitrace("VaygrCarrierRetire: Dem:"..ssdemand.." Count:"..sg_retireCountCheck)
RetireSubSystem(carrier, productionId)
sg_retireCountCheck = 0
return
end
else
sg_retireCountCheck = 0
end
end
end
end

function std_minTuple(a, b, c)
local minsubs = a
if (b < minsubs) then
minsubs = b
end
if (c < minsubs) then
minsubs = c
end
return minsubs
end

function std_maxTuple(a, b, c)
local maxsubs = a
if (b > maxsubs) then
maxsubs = b
end
if (c > maxsubs) then
maxsubs = c
end
return maxsubs
end

function CpuBuildSS_ProcessEachBuildShip()
local bcount = BuildShipCount()
if (bcount == 0) then
return 0
end
if (s_totalProdSS == 0) then
return 0
end
aitrace("NumSS:Fi:"..s_numFiSystems.." Co:"..s_numCoSystems.." Fr:"..s_numFrSystems)
local currentFiDemand = SubSystemDemandGet(FIGHTERPRODUCTION)
local currentCoDemand = SubSystemDemandGet(CORVETTEPRODUCTION)
local currentFrDemand = SubSystemDemandGet(FRIGATEPRODUCTION)
local maxRealDemand = std_maxTuple(currentFiDemand, currentCoDemand, currentFrDemand)
local highestPrioritySSOverall = HighestPrioritySubSystem()
aitrace("SS:Fi:"..currentFiDemand.." Co:"..currentCoDemand.." Fr:"..currentFrDemand)
local minNumSameSubs = std_minTuple(s_numFiSystems, s_numCoSystems, s_numFrSystems)
local fiBuildOffset = ((s_numFiSystems-minNumSameSubs) / bcount) * 3
local coBuildOffset = ((s_numCoSystems-minNumSameSubs) / bcount) * 3
local frBuildOffset = ((s_numFrSystems-minNumSameSubs) / bcount) * 3
local bestProdSS = FIGHTERPRODUCTION
local maxDemand = currentFiDemand - fiBuildOffset
aitrace("Maxdemand:"..maxDemand.."MaxReal:"..maxRealDemand)
if ((currentCoDemand - coBuildOffset) > maxDemand) then
maxDemand = currentCoDemand - coBuildOffset
bestProdSS = CORVETTEPRODUCTION
end
if ((currentFrDemand - frBuildOffset) > maxDemand) then
maxDemand = currentFrDemand - frBuildOffset
bestProdSS = FRIGATEPRODUCTION
end
local economicValue = 0
local numCollecting = GetNumCollecting();
local numRU = GetRU()
if (UnderAttack() == 0 or UnderAttackThreat() < -100) then
if ((numRU > (2500 + bcount * 1000) and numCollecting > 8)) then
economicValue = 2
elseif ((numRU > (1000 + bcount * 500) and numCollecting > 6)) then
economicValue = 1
end
end
for i = 0, (bcount - 1) do
local buildShipId = BuildShipAt(i)
if (sg_buildBCHyperspace == 1 and BuildShipType(buildShipId) == kBattleCruiser) then
aitrace("BC:SS")
if (BuildShipHasSubSystem(buildShipId, HYPERSPACE) == 0 and UnderAttackThreat() < -5 and
BuildShipCanBuild(buildShipId, HYPERSPACE) == 1) then
aitrace("Build BC Hyperspace")
BuildSubSystemOnShip(buildShipId, HYPERSPACE)
return 1
end
end
if (highestPrioritySSOverall <= maxRealDemand and maxRealDemand >= 0) then
local hasFi = BuildShipHasSubSystem(buildShipId, FIGHTERPRODUCTION)
local hasCo = BuildShipHasSubSystem(buildShipId, CORVETTEPRODUCTION)
local hasFr = BuildShipHasSubSystem(buildShipId, FRIGATEPRODUCTION)
local sscount = hasFi + hasCo + hasFr
local allowBuild = 0
if (sscount > 0) then
if (sscount == 1 and economicValue > 0) then
allowBuild = 1
aitrace("Scount"..sscount.." Econ:"..economicValue)
elseif (sscount == 2 and economicValue > 1) then
allowBuild = 1
aitrace("Scount"..sscount.." Econ:"..economicValue)
else
local maxDemandOnShip = -1
if (hasFi == 1 and currentFiDemand > maxDemandOnShip) then
maxDemandOnShip = currentFiDemand
end
if (hasCo == 1 and currentCoDemand > maxDemandOnShip) then
maxDemandOnShip = currentCoDemand
end
if (hasFr == 1 and currentFrDemand > maxDemandOnShip) then
maxDemandOnShip = currentFrDemand
end
if (maxDemandOnShip < 0) then
allowBuild = 1
end
aitrace("S"..i.." FiD:"..currentFiDemand.." CoD:"..currentCoDemand.." FrD:"..currentFrDemand)
aitrace("S"..i.." Max:"..maxDemandOnShip)
end
else
allowBuild = 1
end
if (allowBuild == 1) then
if (BuildShipCanBuild(buildShipId, bestProdSS) == 1) then
aitrace("BuildSS in new func")
BuildSubSystemOnShip(buildShipId, bestProdSS)
return 1
end
end
end
end
SubSystemDemandSet(FIGHTERPRODUCTION, -1)
SubSystemDemandSet(CORVETTEPRODUCTION, -1)
SubSystemDemandSet(FRIGATEPRODUCTION, -1)
return 0
end

function CpuBuildSS_DoBuildSubSystem()
SubSystemDemandClear()
if (Override_SubSystemDemand) then
Override_SubSystemDemand()
else
CpuBuildSS_DefaultSubSystemDemandRules()
end
local subSystemId = FindHighDemandSubSystem()
sg_subSystemOverflowDemand = 0
if (s_race == Race_Vaygr) then
CpuBuildSS_RetireVaygrProductionSubSystems()
end
if (subSystemId > 0) then
if (CpuBuildSS_ProcessEachBuildShip() == 1) then
return 1
end
subSystemId = FindHighDemandSubSystem()
if (subSystemId > 0) then
BuildSubSystem(subSystemId)
end
return 1
end
return 0
end

function CpuBuildSS_DoSubSystemProductionDemand(ProductionSubSys, eClasstype, familyid)
local demand = ShipDemandMaxByClass(eClasstype)
local uc = GetUnitCapForFamily(familyid)
local ucMax = GetUnitCapMaxForFamily(familyid)
local ucLeft = ucMax - uc
if (ucLeft < 2) then
demand = demand - 3 + ucLeft
end
if (demand < 0) then
demand = -0.5
end
SubSystemDemandSet(ProductionSubSys, demand)
end

function CpuBuildSS_OtherMiscSubSystemDemand()
local demand = ShipDemandMaxByClass(eBuilder)
local capdemand = ShipDemandMaxByClass(eCapital)
if (capdemand > demand) then
demand = capdemand
end
if (demand > 0.5) then
SubSystemDemandSet(CAPSHIPPRODUCTION, demand - 0.5)
end
if (s_militaryStrength < -50 or g_LOD < 1 or GetRU() > 4000) then
local platformsubsCount = NumSubSystems(PLATFORMPRODUCTION) + NumSubSystemsQ(PLATFORMPRODUCTION)
demand = ShipDemandMaxByClass(ePlatform)
if (demand > 0.5) then
SubSystemDemandSet(PLATFORMPRODUCTION, demand - 1 - platformsubsCount)
end
end
local numShipyards = NumSquadrons(kShipYard)
if (numShipyards == 0) then
local SY_demand = ShipDemandGet(kShipYard)
if (SY_demand > 0 and NumSubSystemsQ(HYPERSPACE) == 0) then
local hypDemand = SY_demand - 0.5 - NumSubSystems(HYPERSPACE)
SubSystemDemandAdd(HYPERSPACE, hypDemand)
end
end
end

function DoSubSystemDemand_Hiigaran()
CpuBuildSS_DoSubSystemProductionDemand(FIGHTERPRODUCTION, eFighter, kUnitCapId_Fighter)
local researchcount = NumSubSystems(RESEARCH) + NumSubSystemsQ(RESEARCH)
local highestCorvetteDemand = ShipDemandMaxByClass(eCorvette)
local highestFrigateDemand = ShipDemandMaxByClass(eFrigate)
local researchdemand = highestCorvetteDemand
local capdemand = ShipDemandMaxByClass(eCapital)
if (highestFrigateDemand > researchdemand) then
researchdemand = highestFrigateDemand
elseif (capdemand > researchdemand) then
researchdemand = capdemand
end
if (researchcount == 0) then
SubSystemDemandSet(RESEARCH, researchdemand + 0.5)
else
CpuBuildSS_DoSubSystemProductionDemand(CORVETTEPRODUCTION, eCorvette, kUnitCapId_Corvette)
CpuBuildSS_DoSubSystemProductionDemand(FRIGATEPRODUCTION, eFrigate, kUnitCapId_Frigate)
local advresearchcount = NumSubSystems(ADVANCEDRESEARCH) + NumSubSystemsQ(ADVANCEDRESEARCH)
local doAdvResearch = 0
local advResDemand = researchdemand
if (s_numFrSystems > 0) then
researchdemand = researchdemand + 0.5
end
if (advresearchcount == 0 and researchdemand >= 0.5 and UnderAttackThreat() < -5 and (s_militaryPop > 8 or s_selfTotalValue > 150 or s_militaryStrength > 50)) then
SubSystemDemandSet(ADVANCEDRESEARCH, researchdemand-0.5)
end
end
CpuBuildSS_OtherMiscSubSystemDemand();
if (researchcount > 0 and s_totalProdSS > 0 and s_militaryPop > 8 and GetNumCollecting() > 8 and GetRU() > 800) then
CpuBuildSS_SpecialSubSystemDemand()
end
end

function DoSubSystemDemand_Vaygr()
CpuBuildSS_DoSubSystemProductionDemand(FIGHTERPRODUCTION, eFighter, kUnitCapId_Fighter)
local researchcount = NumSubSystems(RESEARCH) + NumSubSystemsQ(RESEARCH)
local highestCorvetteDemand = ShipDemandMaxByClass(eCorvette)
local highestFrigateDemand = ShipDemandMaxByClass(eFrigate)
local capdemand = ShipDemandMaxByClass(eCapital)
if (researchcount == 0) then
local researchdemand = highestCorvetteDemand
if (highestFrigateDemand > researchdemand) then
researchdemand = highestFrigateDemand
elseif (capdemand > researchdemand) then
researchdemand = capdemand
end
SubSystemDemandSet(RESEARCH, researchdemand + 1)
end
if (IsResearchDone(CORVETTETECH) == 1) then
CpuBuildSS_DoSubSystemProductionDemand(CORVETTEPRODUCTION, eCorvette, kUnitCapId_Corvette)
end
if (IsResearchDone(FRIGATETECH) == 1) then
CpuBuildSS_DoSubSystemProductionDemand(FRIGATEPRODUCTION, eFrigate, kUnitCapId_Frigate)
end
CpuBuildSS_OtherMiscSubSystemDemand();
if (researchcount > 0 and s_totalProdSS > 0 and s_militaryPop > 8 and GetNumCollecting() > 8 and GetRU() > 800) then
CpuBuildSS_SpecialSubSystemDemand()
end
end

-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

aitrace("LOADING CPU MILITARY")

function CpuMilitary_Init()
cp_attackPercent = 100
if (g_LOD == 0) then
cp_attackPercent = 50
end
cp_minSquadGroupSize = 5
cp_minSquadGroupValue = 200
cp_maxGroupSize = 14
cp_maxGroupValue = 200
cp_forceAttackGroupSize = 14
if (g_LOD == 1) then
cp_forceAttackGroupSize = 12
end
if (g_LOD == 0) then
cp_forceAttackGroupSize = 8
end
cp_initThreatModifier = 0.95
if (g_LOD == 0) then
cp_initThreatModifier = 0.5
elseif (g_LOD == 1) then
cp_initThreatModifier = 0.75
end
sg_moreEnemies = 0
sg_militaryRand = Rand(100)
if (Override_MilitaryInit) then
Override_MilitaryInit()
end
end

function CpuMilitary_Process()
local numEnemies = PlayersAlive(player_enemy)
local numAllies = PlayersAlive(player_ally)
sg_moreEnemies = numEnemies - numAllies
Logic_military_groupvars();
Logic_military_attackrules();
Logic_military_setattacktimer();
end

function Logic_military_groupvars()
cp_minSquadGroupSize = 4
cp_minSquadGroupValue = 150
if (sg_moreEnemies > 0 and s_selfTotalValue < s_enemyTotalValue * 2) then
cp_minSquadGroupSize = cp_minSquadGroupSize + 2
cp_minSquadGroupValue = cp_minSquadGroupValue + 75
else
if (s_militaryStrength > 120) then
cp_minSquadGroupSize = 3
cp_minSquadGroupValue = 120
end
end
end

function Logic_military_attackrules()
if (g_LOD == 0) then
if (gameTime() > 20 * 60 and s_militaryStrength > 0) then
cp_attackPercent = 100
end
if (s_selfTotalValue * 2 < s_enemyTotalValue and s_selfTotalValue > 150) then
cp_attackPercent = 0
aitrace("I'm Losing!! Go on defence")
end
end
end

function attack_now_timer()
aitrace("Script:calling attack_now_timer")
AttackNow();
Rule_Remove("attack_now_timer")
end

function Logic_military_setattacktimer()
local timedelay = 600
local wavedelay = 240 + sg_militaryRand * 0.6
if (g_LOD == 1) then
timedelay = 400
wavedelay = 160 + sg_militaryRand * 0.4
end
if (g_LOD >= 2) then
timedelay = 0
wavedelay = 45 + sg_militaryRand * 0.3
end
local gametime = gameTime()
if (gametime >= timedelay or HaveBeenAttacked() == 1) then
if (Rule_Exists("attack_now_timer") == 0) then
aitrace("Script: Attacktimer added")
Rule_AddInterval("attack_now_timer", wavedelay)
end
end
end
следующий заход =р

Хранитель
03-24-2014, 06:28 AM
-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

aitrace("LOADING CPU RESEARCH")

function CpuResearch_Init()
if (s_race == Race_Hiigaran) then
dofilepath("data:ai/hiigaran_upgrades.lua")
DoUpgradeDemand = DoUpgradeDemand_Hiigaran
DoResearchTechDemand = DoResearchTechDemand_Hiigaran
elseif (s_race == Race_Vaygr) then
dofilepath("data:ai/vaygr_upgrades.lua")
DoUpgradeDemand = DoUpgradeDemand_Vaygr
DoResearchTechDemand = DoResearchTechDemand_Vaygr
else
dofilepath("data:ai/tobari_upgrades.lua")
DoUpgradeDemand = DoUpgradeDemand_Tobari
DoResearchTechDemand = DoResearchTechDemand_Tobari
end
sg_lastUpgradeTime = gameTime()
sg_upgradeDelayTime = 180 + Rand(80)
cp_researchDemandRange = 0.5
if (g_LOD == 1) then
cp_researchDemandRange = 1
end
if (g_LOD == 0) then
cp_researchDemandRange = 2
end
if (Override_ResearchInit) then
Override_ResearchInit()
end
end

function CpuResearch_DefaultResearchDemandRules()
local threatlevel = UnderAttackThreat()
if (threatlevel > 100) then
return
end
DoResearchTechDemand()
local curGameTime = gameTime()
local timeSinceLastUpgrade = curGameTime - sg_lastUpgradeTime
local economicValue = 0
local numCollecting = GetNumCollecting();
local numRU = GetRU()
if ((numRU > 2500 and numCollecting > 9) or numRU > 10000) then
economicValue = 2
elseif ((numRU > 1500 and numCollecting > 7) or numRU > 6000) then
economicValue = 1
end
if (sg_doupgrades == 1 and threatlevel < -20 and s_militaryPop > 7 and economicValue > 0 and (timeSinceLastUpgrade > sg_upgradeDelayTime or economicValue > 1)) then
DoUpgradeDemand()
sg_lastUpgradeTime = gameTime();
end
end

function CpuResearch_Process()
if (GetNumCollecting() < sg_minNumCollectors and GetRU() < 2000) then
return 0
end
if (NumResearchSubSystems() == 0) then
return 0
end
if (IsResearchBusy() == 1) then
return 0
end
ResearchDemandClear()
if (Override_ResearchDemand) then
Override_ResearchDemand()
else
CpuResearch_DefaultResearchDemandRules()
end
local bestResearch = FindHighDemandResearch()
if (bestResearch ~= 0) then
Research(bestResearch)
return 1
end
return 0
end

function DoResearchTechDemand_Vaygr()
if (Util_CheckResearch(HYPERSPACEGATETECH)) then
local demand = ShipDemandGet(kShipYard)
if (demand > 0) then
ResearchDemandSet(HYPERSPACEGATETECH, demand + 0.5)
end
end
local numShipyards = NumSquadrons(kShipYard) + NumSquadronsQ(kShipYard)
if (numShipyards > 0 and Util_CheckResearch(BATTLECRUISERIONWEAPONS)) then
local battleCruiserDemand = ShipDemandGet(kBattleCruiser)
if (battleCruiserDemand > 0) then
ResearchDemandSet(BATTLECRUISERIONWEAPONS, battleCruiserDemand)
end
end
if (Util_CheckResearch(DESTROYERGUNS)) then
local demand = ShipDemandGet(VGR_DESTROYER)
if (demand > 0) then
ResearchDemandSet(DESTROYERGUNS, demand)
end
end
if (Util_CheckResearch(LANCEBEAMS)) then
local lancedemand = ShipDemandGet(VGR_LANCEFIGHTER)
if (lancedemand > 0) then
ResearchDemandSet(LANCEBEAMS, lancedemand + 0.5)
end
end
if (Util_CheckResearch(PLASMABOMBS)) then
local bomberdemand = ShipDemandGet(VGR_BOMBER)
if (bomberdemand > 0) then
ResearchDemandSet(PLASMABOMBS, bomberdemand + 1.0)
end
end
if (Util_CheckResearch(CORVETTELASER)) then
local laserdemand = ShipDemandGet(VGR_LASERCORVETTE)
if (laserdemand > 0) then
ResearchDemandSet(CORVETTELASER, laserdemand)
end
end
if (Util_CheckResearch(FRIGATEASSAULT)) then
local demand = ShipDemandGet(VGR_ASSAULTFRIGATE)
if (demand > 0) then
ResearchDemandSet(FRIGATEASSAULT, demand)
end
end
if (Util_CheckResearch(PLATFORMHEAVYMISSILES)) then
local demand = ShipDemandGet(VGR_WEAPONPLATFORM_MISSILE)
if (demand > 0) then
ResearchDemandSet(PLATFORMHEAVYMISSILES, demand)
end
end
if (Util_CheckResearch(BOMBERIMPROVEDBOMBS)) then
local numBombers = NumSquadrons(kBomber)
if (numBombers > 2) then
ResearchDemandSet(BOMBERIMPROVEDBOMBS, numBombers)
end
end
if (Util_CheckResearch(CORVETTETECH)) then
local corvdemand = ShipDemandMaxByClass(eCorvette)
if (corvdemand > 0) then
ResearchDemandSet(CORVETTETECH, corvdemand + 0.5)
end
end
if (Util_CheckResearch(FRIGATETECH)) then
local frigdemand = ShipDemandMaxByClass(eFrigate)
if (frigdemand > 0) then
ResearchDemandSet(FRIGATETECH, frigdemand + 0.5)
end
end
if (s_militaryPop > 15 and GetRU() > 750) then
if (Util_CheckResearch(CORVETTEGRAVITICATTRACTION)) then
local mineLayerDemand = ShipDemandGet(VGR_MINELAYERCORVETTE)
if (mineLayerDemand > 0) then
ResearchDemandSet(CORVETTEGRAVITICATTRACTION, mineLayerDemand)
end
end
if (Util_CheckResearch(CORVETTECOMMAND)) then
local commanddemand = ShipDemandGet(VGR_COMMANDCORVETTE)
if (commanddemand > 0) then
ResearchDemandSet(CORVETTECOMMAND, commanddemand)
end
end
if (Util_CheckResearch(FRIGATEINFILTRATIONTECH)) then
local demand = ShipDemandGet(VGR_INFILTRATORFRIGATE)
if (demand > 0) then
ResearchDemandSet(FRIGATEINFILTRATIONTECH, demand)
end
end
end
end

function DoResearchTechDemand_Tobari()
if (Util_CheckResearch(CORVETTETECH)) then
local corvdemand = ShipDemandMaxByClass(eCorvette)
if (corvdemand > 0) then
ResearchDemandSet(CORVETTETECH, corvdemand + 0.5)
end
end
if (Util_CheckResearch(ASSAULTCORVETTETECH)) then
local demand = ShipDemandGet(TBR_ASSAULTCORVETTE)
if (demand > 0) then
ResearchDemandSet(ASSAULTCORVETTETECH, demand)
end
end
if (Util_CheckResearch(SHIPYARDTECH)) then
local demand = ShipDemandGet(TBR_SHIPYARD)
if (demand > 0) then
ResearchDemandSet(SHIPYARDTECH, demand)
end
end
if (Util_CheckResearch(BATTLECRUISERTECH)) then
local demand = ShipDemandGet(TBR_BATTLECRUISER)
if (demand > 0) then
ResearchDemandSet(BATTLECRUISERTECH, demand)
end
end
if (Util_CheckResearch(DESTROYERTECH)) then
local demand = ShipDemandGet(TBR_DESTROYER)
if (demand > 0) then
ResearchDemandSet(DESTROYERTECH, demand)
end
end
if (Util_CheckResearch(BOMBERTCORVETTETECH)) then
local demand = ShipDemandGet(TBR_BOMBERCORVETTE)
if (demand > 0) then
ResearchDemandSet(BOMBERCORVETTETECH, demand)
end
end
if (Util_CheckResearch(FRIGATETECH)) then
local frigdemand = ShipDemandMaxByClass(eFrigate)
if (frigdemand > 0) then
ResearchDemandSet(FRIGATETECH, frigdemand + 0.5)
end
end
end

function Util_CheckResearch(researchId)
if (IsResearchDone(researchId) == 0 and IsResearchAvailable(researchId) == 1) then
return 1
end
return nil
end

function DoResearchTechDemand_Hiigaran()
local numShipyards = NumSquadrons(kShipYard) + NumSquadronsQ(kShipYard)
if (numShipyards > 0 and Util_CheckResearch(BATTLECRUISERIONWEAPONS)) then
local battleCruiserDemand = ShipDemandGet(kBattleCruiser)
if (battleCruiserDemand > 0) then
ResearchDemandSet(BATTLECRUISERIONWEAPONS, battleCruiserDemand)
end
end
if (Util_CheckResearch(PLATFORMIONWEAPONS)) then
local ionTurretDemand = ShipDemandGet(HGN_IONTURRET)
if (ionTurretDemand > 0) then
ResearchDemandSet(PLATFORMIONWEAPONS, ionTurretDemand)
end
end
if (Util_CheckResearch(DESTROYERTECH)) then
local destroyerDemand = ShipDemandGet(HGN_DESTROYER)
if (destroyerDemand > 0) then
ResearchDemandSet(DESTROYERTECH, destroyerDemand)
end
end
if (Util_CheckResearch(ATTACKBOMBERIMPROVEDBOMBS)) then
local numBombers = NumSquadrons(kBomber)
if (numBombers > 2) then
ResearchDemandSet(ATTACKBOMBERIMPROVEDBOMBS, numBombers)
end
end
if (Util_CheckResearch(IMPROVEDTORPEDO)) then
local numTorpedoFrigs = NumSquadrons(HGN_TORPEDOFRIGATE)
if (numTorpedoFrigs > 2) then
ResearchDemandSet(IMPROVEDTORPEDO, numTorpedoFrigs)
end
end
if (s_militaryPop > 15 and GetRU() > 750) then
if (Util_CheckResearch(DEFENSEFIELDFRIGATESHIELD)) then
local DFFDemand = ShipDemandGet(HGN_DEFENSEFIELDFRIGATE)
if (DFFDemand > 0) then
ResearchDemandSet(DEFENSEFIELDFRIGATESHIELD, DFFDemand)
end
end
if (Util_CheckResearch(ECMPROBE)) then
local ecmProbeDemand = ShipDemandGet(HGN_ECMPROBE)
if (ecmProbeDemand > 0) then
ResearchDemandSet(ECMPROBE, ecmProbeDemand)
end
end
if (Util_CheckResearch(GRAVITICATTRACTIONMINES)) then
local mineLayerDemand = ShipDemandGet(HGN_MINELAYERCORVETTE)
if (mineLayerDemand > 0) then
ResearchDemandSet(GRAVITICATTRACTIONMINES, mineLayerDemand)
end
end
end
end

function DoUpgradeDemand_Hiigaran()
if (s_militaryStrength > 10 or g_LOD == 0) then
inc_upgrade_demand(rt_mothership, 0.5 )
ResearchDemandAdd(MOTHERSHIPBUILDSPEEDUPGRADE1, 0.5)
local numPlatforms = numActiveOfClass(s_playerIndex, ePlatform)
if (numPlatforms > 1) then
local numGunTurret = NumSquadrons(HGN_GUNTURRET)
if (numGunTurret > 1) then
inc_upgrade_demand(rt_platform.gunturret, numGunTurret * 1)
end
local numIonTurret = NumSquadrons(HGN_IONTURRET)
if (numIonTurret > 1) then
inc_upgrade_demand(rt_platform.ionturret, numIonTurret * 1)
end
end
local numCollectors = NumSquadrons(kCollector)
if (numCollectors > 0) then
inc_upgrade_demand(rt_collector, numCollectors * .1)
end
local numRefinery = NumSquadrons(kRefinery)
if (numRefinery > 0) then
inc_upgrade_demand(rt_refinery, numRefinery * 1.5)
end
local numCarrier = NumSquadrons(kCarrier)
if (numCarrier > 0) then
inc_upgrade_demand(rt_carrier, numCarrier * 1)
ResearchDemandAdd(CARRIERBUILDSPEEDUPGRADE1, numCarrier * 1.25)
end
local numShipYards = NumSquadrons(kShipYard)
if (numShipYards > 0) then
inc_upgrade_demand(rt_shipyard, numShipYards * 1.5 )
ResearchDemandAdd(SHIPYARDBUILDSPEEDUPGRADE1, numShipYards * 1.75)
end
end
local numFighter = numActiveOfClass(s_playerIndex, eFighter)
if (numFighter > 1) then
local numInterceptors = NumSquadrons(kInterceptor)
if (numInterceptors > 1) then
inc_upgrade_demand(rt_fighter.interceptor, numInterceptors * 1)
end
local numBombers = NumSquadrons(kBomber)
if (numBombers > 1) then
inc_upgrade_demand(rt_fighter.bomber, numBombers * 1.5)
end
end
local numBattleCruiser = NumSquadrons(kBattleCruiser)
if (numBattleCruiser > 0) then
inc_upgrade_demand(rt_battlecruiser, numBattleCruiser * 2.5 )
end
local numDestroyers = NumSquadrons(kDestroyer)
if (numDestroyers > 0) then
inc_upgrade_demand(rt_destroyer, numDestroyers * 2 )
end
local numCorvette = numActiveOfClass(s_playerIndex, eCorvette)
if (numCorvette > 1) then
local numAssaultCorvette = NumSquadrons(HGN_ASSAULTCORVETTE)
if (numAssaultCorvette > 2) then
inc_upgrade_demand(rt_corvette.assault, numAssaultCorvette * 1.25)
end
local numPulsarCorvette = NumSquadrons(HGN_PULSARCORVETTE)
if (numPulsarCorvette > 2) then
inc_upgrade_demand(rt_corvette.pulsar, numPulsarCorvette * 1.25)
end
end
local numFrigate = numActiveOfClass(s_playerIndex, eFrigate)
if (numFrigate > 2) then
local numTorpedoFrigate = NumSquadrons(HGN_TORPEDOFRIGATE)
if (numTorpedoFrigate > 2) then
inc_upgrade_demand(rt_frigate.torpedo, numTorpedoFrigate * 1.5)
end
local numIonFrigate = NumSquadrons(HGN_IONCANNONFRIGATE)
if (numIonFrigate > 2) then
inc_upgrade_demand(rt_frigate.ioncannon, numIonFrigate * 1.5)
end
local numAssaultFrigate = NumSquadrons(HGN_ASSAULTFRIGATE)
if (numAssaultFrigate > 2) then
inc_upgrade_demand(rt_frigate.assault, numAssaultFrigate * 1.5)
end
end
end

function DoUpgradeDemand_Vaygr()
if (s_militaryStrength > 10 or g_LOD == 0) then
inc_upgrade_demand(rt_mothership, 0.5)
ResearchDemandAdd(MOTHERSHIPBUILDSPEEDUPGRADE1, 0.5)
local numCorvette = numActiveOfClass(s_playerIndex, eCorvette)
if (numCorvette > 2) then
inc_upgrade_demand(rt_corvette, numCorvette)
end
local numFrigate = numActiveOfClass(s_playerIndex, eFrigate)
if (numFrigate > 2) then
inc_upgrade_demand(rt_frigate, numFrigate * 1)
end
local numPlatforms = numActiveOfClass(s_playerIndex, ePlatform)
if (numPlatforms > 0) then
inc_upgrade_demand(rt_platform, numPlatforms * 1)
end
local numCapital = numActiveOfClass(s_playerIndex, eCapital)
if (numCapital > 1) then
inc_upgrade_demand(rt_capital, numCapital * 0.5)
end
local numCarrier = NumSquadrons(kCarrier)
if (numCarrier > 0) then
ResearchDemandAdd(CARRIERBUILDSPEEDUPGRADE1, numCarrier * 1.25)
end
local numShipYards = NumSquadrons(kShipYard)
if (numShipYards > 0) then
ResearchDemandAdd(SHIPYARDBUILDSPEEDUPGRADE1, numShipYards * 1.75)
end
end
end

function inc_research_demand(researchtype, val)
local typeis = typeid(researchtype);
if (typeis == LT_TABLE) then
for i, v in researchtype do
inc_research_demand(v, val);
end
else
if (Util_CheckResearch(researchtype)) then
ResearchDemandAdd(researchtype, val)
end
end
end

function inc_upgrade_demand(upgradetype, val)
inc_research_demand(upgradetype, val)
end

-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

aitrace("LOADING CPU RESOURCING")

function CpuResource_Init()
cpResourcersPerPath = 3.5
cpNumCollectorsPerLatchPoint = 2.0
cpMaxThreatAddedDistance = 6000
cpMinThreatAddedDistance = 12000
SetResourceDockFamily("Utility")
sg_minNumCollectors = 5
sg_maxNumCollectors = 30
if (Override_ResourceInit) then
Override_ResourceInit()
end
end

function CalcDesiredNumCollectors()
local baseCollectors = 8
local collectorsToMilitary = 0.8
if(g_LOD == 0) then
baseCollectors = 3
collectorsToMilitary = 0.6
elseif(g_LOD == 1) then
baseCollectors = 6
collectorsToMilitary = 0.7
elseif(g_LOD >= 2) then
baseCollectors = 8
collectorsToMilitary = 0.8
end
local maxCollectorsForMilitary = baseCollectors
if (s_militaryPop > 0) then
maxCollectorsForMilitary = maxCollectorsForMilitary + (s_militaryPop * collectorsToMilitary)
end
sg_desiredNumCollectors = GetActiveCollectorSlots() * cpNumCollectorsPerLatchPoint + 2
local numRU = GetRU()
if (numRU > 1000) then
sg_desiredNumCollectors = sg_desiredNumCollectors - ((numRU-1000) / 1000)
end
if (sg_desiredNumCollectors < baseCollectors) then
sg_desiredNumCollectors = baseCollectors
end
if(sg_desiredNumCollectors >= maxCollectorsForMilitary) then
sg_desiredNumCollectors = maxCollectorsForMilitary
end
local collectorsInSystem = numQueueOfClass( eCollector )
if(collectorsInSystem > 20) then
sg_militaryToBuildPerCollector = 4
elseif(collectorsInSystem > 16) then
sg_militaryToBuildPerCollector = 3
elseif(collectorsInSystem > 12) then
sg_militaryToBuildPerCollector = 2
elseif(collectorsInSystem > 9) then
sg_militaryToBuildPerCollector = 1
else
sg_militaryToBuildPerCollector = 0
end
local threatLevel = UnderAttackThreat();
if (threatLevel > 0) then
if(numRU > 1500) then
sg_desiredNumCollectors = 0
else
sg_militaryToBuildPerCollector = sg_militaryToBuildPerCollector + ((threatLevel / 50) + 1)
end
end
if (sg_desiredNumCollectors > sg_maxNumCollectors) then
sg_desiredNumCollectors = sg_maxNumCollectors
end
end

function DoResourceBuild()
CalcDesiredNumCollectors()
local numCollectors = numQueueOfClass( eCollector )
if (numCollectors < sg_desiredNumCollectors and CanBuild( kCollector ) == 1) then
aitrace("Build collector: desired:"..sg_desiredNumCollectors.." count:"..numCollectors)
Build( kCollector )
return 1
end
if(GetNumberOfIdleRefineries() <= 0) then
local numberOfActiveBlobs = GetActiveBlobCount()
local neededRefineries = 0
local neededSalvageDropOffs = 0
for activeIndex = 0 , (numberOfActiveBlobs-1) do
local blobIndex = GetActiveBlobAt(activeIndex)
local collectors = CollectorsAtBlob(blobIndex)
local refineryCapacity = CollectorCapacityOfRefineriesAtBlob(blobIndex)
if(collectors > refineryCapacity) then
if(IsSalvage(blobIndex) ~= 0) then
neededSalvageDropOffs = neededSalvageDropOffs + 1
else
neededRefineries = neededRefineries + 1
end
end
end
if (UnderAttackThreat() > -75) then
return 0
end
local numRefineriesQueued = numQueueOfClass( eDropOff )-numActiveOfClass( s_playerIndex, eDropOff )
if(neededRefineries > 0 and numRefineriesQueued == 0) then
ShipDemandAddByClass( eRefinery, neededRefineries )
end
local numSalDropsQueued = numQueueOfClass( eSalvageDropOff )-numActiveOfClass( s_playerIndex, eSalvageDropOff )
if(neededSalvageDropOffs > 0 and numSalDropsQueued == 0 and UnderAttackThreat() < -75) then
ShipDemandAddByClass( eSalvageDropOff, neededSalvageDropOffs )
end
end
return 0
end
-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

aitrace("DEFAULT CPU LOADED")

g_LOD = getLevelOfDifficulty()

dofilepath("data:ai/classdef.lua")
dofilepath("data:ai/cpubuild.lua")
dofilepath("data:ai/cpuresearch.lua")
dofilepath("data:ai/cpumilitary.lua")

old_aitrace = aitrace
rawset(globals(),"aitrace",nil)
aitrace = function() end

function oninit()
s_playerIndex = Player_Self()
s_race = getRace();
sg_dobuild = 1
sg_dosubsystems = 1
sg_doresearch = 1
sg_doupgrades = 1
sg_domilitary = 1
cp_processResource = 1
cp_processMilitary = 1
sg_lastSpendMoneyTime = gameTime()
sg_spendMoneyDelay = 0
if (g_LOD < 2) then
sg_spendMoneyDelay = 4
if (g_LOD < 1) then
sg_spendMoneyDelay = 8
end
end
ClassInitialize()
CpuBuild_Init()
CpuResearch_Init()
CpuMilitary_Init()
sg_kDemandResetValue = 4
if (s_race == Race_Vaygr) then
sg_kDemandResetValue = 2
end
if (Override_Init) then
Override_Init()
end
sg_reseachDemand = -sg_kDemandResetValue
Rule_AddInterval("doai", 2.0 )
end

function CalcOpenBuildChannels()
local numShipsBuildingShips = NumShipsBuildingShips()
local numShipsBuildingSubSystems = NumShipsBuildingSubSystems()
local numShipsBuilding = numShipsBuildingShips + numShipsBuildingSubSystems
local researchItem = IsResearchBusy()
local numItemsBuilding = numShipsBuilding + researchItem
local totalBuildShips = BuildShipCount() * 2
local numCollecting = GetNumCollecting()
local numRUs = GetRU()
sg_allowedBuildChannels = numCollecting / 5;
if (numRUs > 500) then
sg_allowedBuildChannels = sg_allowedBuildChannels + (numRUs-500) / 1000
end
s_numOpenBuildChannels = sg_allowedBuildChannels - numItemsBuilding
s_shipBuildQueuesFull = 0
if (totalBuildShips == numShipsBuilding) then
s_shipBuildQueuesFull = 1
end
if (s_numOpenBuildChannels <= -1.5) then
RemoveLeastNeededItem()
end
end

function CacheCurrentState()
s_numFiSystems = NumSubSystems(FIGHTERPRODUCTION) + NumSubSystemsQ(FIGHTERPRODUCTION)
s_numCoSystems = NumSubSystems(CORVETTEPRODUCTION) + NumSubSystemsQ(CORVETTEPRODUCTION)
s_numFrSystems = NumSubSystems(FRIGATEPRODUCTION) + NumSubSystemsQ(FRIGATEPRODUCTION)
s_totalProdSS = s_numFiSystems + s_numCoSystems + s_numFrSystems
s_militaryPop = PlayersMilitaryPopulation( s_playerIndex, player_total );
s_selfTotalValue = PlayersMilitary_Total( s_playerIndex, player_total );
s_enemyTotalValue = PlayersMilitary_Total( player_enemy, player_max );
s_militaryStrength = PlayersMilitary_Threat( player_enemy, player_min );
s_enemyIndex = GetChosenEnemy()
s_militaryStrengthVersusTarget = 0
if (s_enemyIndex ~= -1) then
s_militaryStrengthVersusTarget = PlayersMilitary_Threat( s_enemyIndex, player_max )
end
end

function SpendMoney()
if (s_numOpenBuildChannels > 0) then
local buildHasBeenDone = 0
if (sg_dobuild == 1 and s_shipBuildQueuesFull == 0 and sg_reseachDemand < 0) then
if (CpuBuild_Process() == 1) then
s_numOpenBuildChannels = s_numOpenBuildChannels-1
sg_reseachDemand = sg_reseachDemand + 1
buildHasBeenDone = 1
end
end
if (s_numOpenBuildChannels > 0) then
if (sg_doresearch == 1) then
local didResearch = CpuResearch_Process();
if (didResearch == 1) then
sg_reseachDemand = -sg_kDemandResetValue
else
if (sg_reseachDemand >= 0 and sg_dobuild == 1 and s_shipBuildQueuesFull == 0 and buildHasBeenDone == 0) then
CpuBuild_Process()
end
end
else
sg_reseachDemand = -sg_kDemandResetValue
end
end
end
end

function doai()
CacheCurrentState();
CalcOpenBuildChannels();
local curTime = gameTime()
local timeSinceLastSubSysDemand = curTime - sg_lastSpendMoneyTime
if (timeSinceLastSubSysDemand >= sg_spendMoneyDelay) then
SpendMoney()
sg_lastSpendMoneyTime = curTime
end
if (sg_domilitary == 1) then
CpuMilitary_Process();
end
end
ну хиигаран и ваигр апгрейдс не буду писать, напишу тобарьский

-- =============================================================================
-- Homeworld 2 Clean Data Resource Project
-- By S110
-- Version 1.0
-- 02/06/2010
-- Tools used: EditPad Lite, LuaDC version 0.9.19, and Cold Fusion LUA Decompiler v1.0.0
-- =============================================================================

aitrace("LOADING TOBARI UPGRADE INFO")

rt_mothership = {}
rt_capital = {}
rt_fighter = {}
rt_corvette = {}
rt_frigate = {}
rt_platform = {}
rt_collector = {}
а он почти пустой х_х

Добавлено через 42 секунды
вроде как все :)

Хранитель
03-24-2014, 06:39 AM
случайный пост х_х

karak
03-24-2014, 12:12 PM
Хранитель, да запаковал всё в архив и выложил бы. А проблема скорее всего в том, что ты занял слот вэйгра в race.lua. Все новые расы надо добавлять после рандомной, чтобы потом не было проблем.

Хранитель
03-24-2014, 06:35 PM
Хранитель, да запаковал всё в архив и выложил бы. А проблема скорее всего в том, что ты занял слот вэйгра в race.lua. Все новые расы надо добавлять после рандомной, чтобы потом не было проблем.

о, спасибо, я попробую :)

Добавлено через 15 часов 59 минут
даааа получилось :) ну все) в ближайшее время будет полный гайд :)

Добавлено через 26 часов 20 минут
эмм... заметил что они не исследуют.. теперь мне с этим надо разобраться...

karak
03-26-2014, 05:26 PM
эмм... заметил что они не исследуют.. теперь мне с этим надо разобраться...У тебя в cpuresearch.lua нет функции "function DoUpgradeDemand_tobari()". Попробуй сделать эту функцию для тобари.

Хранитель
03-29-2014, 04:07 PM
эм.. сори что уходил.. так.. я прописал но они все равно стоят... (

Добавлено через 38 секунд
вернее не исследуют а не стоят

karak
03-30-2014, 12:41 AM
я сделал тобариапгрейдс. и он пустой...
И он до сих пор пустой? Если да, то тогда понятно в чём твоя проблема.

Хранитель
04-01-2014, 08:54 AM
апгрейдов нет. зачем они. у меня технологии прописаны, а апгрейдов нет. мне надо чтобы они прописанные технологии изучали. ну например ща скажу, чтоб понятно было: есть допустим эсминец. и есть для него технология. вот я ее прописал и когда они исследуют ее они смогут строить эсминцы. а апгрейдов у меня нету.

Хранитель
04-21-2014, 10:20 AM
доразберусь после моего кризиса..........................

Хранитель
09-01-2014, 08:11 AM
Нет, вы конечно можете смело меня гнобить и оскорблять за мой уход, но возможно я вернулся:) Я просто все распечатаю тупо, напишу в большой текстовик всю проблему, со скринами и объяснениями, и может наконец то вы поймете в чем моя проблема. если, конечно, я сам не разберусь в ней.