Уже полтора дня борюсь с тем, что юниты что-то не строят, но суть не в этом. Расследования привели меня к тому, что функция попросту не доходит к концу (о чем свидетельствует отчет "Вхожу в билд" и отсутствие "Выхожу из билда". Что самое интересное, на старте игры пару раз функция таки доходит до конца, но лишь пару раз. Гляньте свежим взглядом, может допустил что на ровном месте.
Если что, Reforged.
По центру код прям ооочень одноорбразный, так что на кол-во не пугайтесь, там просто первым случай с "Ратуша" проверить можно.
Подозрения вызывают лоады их хеш таблицы - могут они как-то мешать? А если они пусты, в значении которое загружаю?
По центру код прям ооочень одноорбразный, так что на кол-во не пугайтесь, там просто первым случай с "Ратуша" проверить можно.
Подозрения вызывают лоады их хеш таблицы - могут они как-то мешать? А если они пусты, в значении которое загружаю?
UPD: пораспихал отчеты по функции, перестает их присылать после пары иф с лоадами ( где-то от 3 Казарма )
function TryBuild takes nothing returns nothing
local real x
local real y
local integer w = 0
local integer b = 0
local location l = null
local location p = null
local rect r
local unit u = TryBuild_u
local integer HaveOrder = 0
local integer pi = GetPlayerId(GetOwningPlayer(u))
local integer i = 1
local integer array a //Колво выбоорки в 0 и шанс случая в остальном
call DisplayTimedTextFromPlayer(Player(0),0,0,4, "Вхожу в билд")
call GroupAddUnit( udg_Ai_buildersT[pi], u )
call GroupRemoveUnit( udg_Ai_builders[pi], u )
call GroupRemoveUnit( udg_Ai_harvest[pi], u )
//Что строить
set b = 1
set p = GetUnitLoc(u)
//Если в воде для ферфи - то строй верфь c 75%)
if IsTerrainPathableBJ(p,PATHING_TYPE_WALKABILITY ) == false and IsTerrainPathableBJ(p,PATHING_TYPE_FLOATABILITY ) == false then
set i = GetRandomInt(1,4)
set b = 0
if i <= 3 then
set HaveOrder = 1
loop
exitwhen b== 5
set b = b+1
set r = RectFromCenterSizeBJ(p,200*b,200*b)
set l = GetRandomLocInRect(r)
call RemoveRect(r)
if IsTerrainPathableBJ(l,PATHING_TYPE_WALKABILITY ) == false and IsTerrainPathableBJ(l,PATHING_TYPE_FLOATABILITY ) == false then
call IssueBuildOrderByIdLocBJ(u,'h011',l)
set b = 5
endif
call RemoveLocation(l)
endloop
endif
endif
call RemoveLocation(l)
//Попытка что-то строить
set p = GetUnitLoc(u)
set r = RectFromCenterSizeBJ(p, 3500, 3500)
set l = GetRandomLocInRect(r)
call RemoveLocation(p)
call RemoveRect(r)
set x = GetLocationX(l)
set y = GetLocationY(l)
call RemoveLocation(l)
set a[0] = 1 //Кол-во вариантов со старта
set a[1] = 'h05Y' // 1 Ферма
// Доп варианыт при условиях
// 2 Ратуша
if LoadInteger(AiData,pi,'h05U') < 4 then
set i = 2 //мошь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h05U'
set b=b+1
exitwhen b==i
endloop
endif
// 3 Казарма
if LoadInteger(AiData,pi,'h05Z') < 10 then
set i = 5 //мошь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h05Z'
set b=b+1
exitwhen b==i
endloop
endif
// 4 Башня
if LoadInteger(AiData,pi,'h063')*2 < LoadInteger(AiData,pi,'h05Y') then
set i = 1 //мошь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h063'
set b=b+1
exitwhen b==i
endloop
endif
// 5 Лесопилка
if LoadInteger(AiData,pi,'h062') < 5 then
set i = 2 //мошь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h062'
set b=b+1
exitwhen b==i
endloop
endif
// 6 Кузница
if LoadInteger(AiData,pi,'h060') < 6 then
set i = 2 //мошь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h060'
set b=b+1
exitwhen b==i
endloop
endif
// 7 Алтарь
if LoadInteger(AiData,pi,'h05X') < 3 then
set i = 2 //мошь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h05X'
set b=b+1
exitwhen b==i
endloop
endif
if (LoadInteger(AiData,pi,'h05V') > 1 or LoadInteger(AiData,pi,'h05W') > 1) and LoadInteger(AiData,pi,'h064') < 10 then
set i = 5 //мошь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h064'
set b=b+1
exitwhen b==i
endloop
endif
// 9 Храм
if (LoadInteger(AiData,pi,'h05V') > 1 or LoadInteger(AiData,pi,'h05W') > 1) and LoadInteger(AiData,pi,'h061') < 15 then
set i = 4 //мошь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h061'
set b=b+1
exitwhen b==i
endloop
endif
// 10 Церковь
if LoadInteger(AiData,pi,'h05W') > 1 and LoadInteger(AiData,pi,'h068') < 15 then
set i = 6 //мошь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h068'
set b=b+1
exitwhen b==i
endloop
endif
set i = GetRandomInt(1,a[0])
call IssueBuildOrderById( u, a[i], x, y )
call RemoveRect(r)
set r = null
call RemoveLocation(p)
set p = null
call RemoveLocation(l)
set l = null
call RemoveLocation(udg_LocalPoint)
call DisplayTimedTextFromPlayer(Player(0),0,0,4, "Выхожу из Билда")
return
endfunction
Принятый ответ
Так, причина найдена
4 Башня
if LoadInteger( AiData, pi, 'h063' ) * 2 < LoadInteger( AiData, pi, 'h05Y' ) then
set i = 1 мошь выбора
set b = 1
4 Башня
if LoadInteger( AiData, pi, 'h063' ) * 2 < LoadInteger( AiData, pi, 'h05Y' ) then
set i = 1 мошь выбора
set b = 1
Так как подобных вариантов много, пришел к выводу, что виновато умножение. Как и почему, сказать, к сожалению, не могу, но без него функция работает и доходит до конца.
UPD, ошибка оказалась банальная, теперь уже точно - цикл зацикливается, так как только тут единичка на и, а b перемахивает условие выхода. Вывод - внимательность наше все.
if LoadInteger(AiData,pi,'h063')*2 < LoadInteger(AiData,pi,'h05Y') then
set i = 1 мощь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h063'
set b=b+1
exitwhen b==i
endloop
endif
set i = 1 мощь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h063'
set b=b+1
exitwhen b==i
endloop
endif
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
4 Башня
if LoadInteger( AiData, pi, 'h063' ) * 2 < LoadInteger( AiData, pi, 'h05Y' ) then
set i = 1 мошь выбора
set b = 1
set i = 1 мощь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h063'
set b=b+1
exitwhen b==i
endloop
endif