Перейти к содержанию

Сообщения от Скрипты

В ответ пользователю }{0TT@6bI4
Аватар пользователя
3 года назад
}{0TT@6bI4
То есть у вас от 1 до k заменяются все существа при выполнении какого-то условия с удачей, а вы хотите, чтобы это происходило
а) Непоследовательно
б) Без повторений
в) Со всеми k элементами

Тогда нужен интересный алгоритм:
local used_indexes = {}
for i=1, k do
repeat N=random(k)+1
until not used_indexes[N]
used_indexes[N] = 1;
--Действия с существом с номером N (не k!!)
end

 

Кажется, у тебя тут какая-то ошибка - i никуда не передаётся. Или вместо i должно быть n? Попробовал в игре с твоим вариантом, у меня существа наспавнились в первых двух точках. Хорошо что у них фикс.спавн, иначе игра бы легла от лаггов 😆 

Чуть подправил, запустил ещё раз - теперь монстры-то спавнятся в разных точках, но всё ещё по списку, т.е. запускаю функцию во второй раз и она отспавнивает монстриков на тех же точках.

 

Да, и сразу доп.вопрос. У меня в функции есть такое условие:

local type = random( 3 ) + 1
if ( WR_luck < 3 ) and ( type == 4 ) then
type = random( 2 ) + 1
end

До того как занёс эти два условия в скобки, игра их игнорировала. Почему? Когда вообще нужно ставить скобки в условиях?

В ответ пользователю }{0TT@6bI4
Аватар пользователя
3 года назад
}{0TT@6bI4
Потому что hero не определена. Проверьте в консоли. В переменную hero записано nil, и очевидно, проверка IsHeroAlive возвращает ложь.
Как тогда определить hero? Я с переменными вообще не очень. 
В ответ пользователю BlueHeavenHero
Аватар пользователя
3 года назад
BlueHeavenHero
Как тогда определить hero? Я с переменными вообще не очень. 
local hero = "Duncan" - вот тебе и определение героя. Но лучше вначале скрипта прописать и без local, чтобы потом можно было в любой функции скрипта hero использовать.
Аватар пользователя
3 года назад
hero крайне популярное имя, лучше его делать локальным. А в глобальную переменную можно записать в начале скрипта аля MAIN_HERO = "Duncan", как это делали разрабы
В ответ пользователю Азгалор
Аватар пользователя
3 года назад
Азгалор

Кажется, у тебя тут какая-то ошибка - i никуда не передаётся. Или вместо i должно быть n? Попробовал в игре с твоим вариантом, у меня существа наспавнились в первых двух точках. Хорошо что у них фикс.спавн, иначе игра бы легла от лаггов 😆 

Чуть подправил, запустил ещё раз - теперь монстры-то спавнятся в разных точках, но всё ещё по списку, т.е. запускаю функцию во второй раз и она отспавнивает монстриков на тех же точках.

Всё, решил проблему. Прописал такое:
--Всякая всячина до этих строк
local n = random(length(creatures_positions))+1
local x = creatures_positions[n].x
local y = creatures_positions[n].y

--всякая всячина после этих строк, k заменено на n

И теперь рандом работает, существа спавнятся в случайных сохранённых координатах 😇 Всё же, огроменное спасибо за корректировку функции с сохранением координат, и помощью в функции респавна!

В ответ пользователю Азгалор
Аватар пользователя
3 года назад
Азгалор
local hero = "Duncan" - вот тебе и определение героя. Но лучше вначале скрипта прописать и без local, чтобы потом можно было в любой функции скрипта hero использовать.
Но, если в скрипте hero должен быть ЛЮБЫМ героем игрока? 
Аватар пользователя
3 года назад
Если ваша функция вызывается триггером региона, то в качестве принимаемых параметров укажите hero и вот тогда можете писать везде hero
В ответ пользователю Азгалор
Аватар пользователя
3 года назад
Азгалор
Всё, решил проблему. Прописал такое:
--Всякая всячина до этих строк
local n = random(length(creatures_positions))+1
local x = creatures_positions[n].x
local y = creatures_positions[n].y

--всякая всячина после этих строк, k заменено на n

И теперь рандом работает, существа спавнятся в случайных сохранённых координатах 😇 Всё же, огроменное спасибо за корректировку функции с сохранением координат, и помощью в функции респавна!


Всё-таки я ничего не понял из вашей задачи, ну да ладно. Мой код проходит все k существ (при этом i) не нужно и генерит случайный индекс k до тех пор, пока он есть в массиве индексов. Как только выходит — работает с существом со сгенерированным индексом k

Почему нужна такая проверка с циклом — потому что простой рандом (как у вас) может выдать повторяющиеся значения, а как я понял, так не должно быть. Возможно, неправильно понял.

И вообще, очень странно, что у вас такое не работает и генерит в двух местах. Я запустил холостые принты для k=100 и он нагенерил кучу значений, все разные (ну, я, впрочем, не скроллил все).
В ответ пользователю }{0TT@6bI4
Аватар пользователя
3 года назад
}{0TT@6bI4

Всё-таки я ничего не понял из вашей задачи, ну да ладно. Мой код проходит все k существ (при этом i) не нужно и генерит случайный индекс k до тех пор, пока он есть в массиве индексов. Как только выходит — работает с существом со сгенерированным индексом k

Почему нужна такая проверка с циклом — потому что простой рандом (как у вас) может выдать повторяющиеся значения, а как я понял, так не должно быть. Возможно, неправильно понял.

И вообще, очень странно, что у вас такое не работает и генерит в двух местах. Я запустил холостые принты для k=100 и он нагенерил кучу значений, все разные (ну, я, впрочем, не скроллил все).
Честно, я тем более не понял) Если бы понимал то не обращался бы за помощью 😅 В общем, вот такой финальный вариант этого скрипта на спавн, как раз вот дописал его и занялся уже другим делом(сохранение координат я больше не трогал):
function RespawnUnitsByLuck()
if ( GetDate(WEEK) == 2 ) and ( GetDate(DAY_OF_WEEK) == random(6) + 1 ) then
local WR_luck = GetHeroStat(WR, STAT_LUCK)
local respawns_types = { CREATURE_AIR_ELEMENTAL, CREATURE_PHOENIX, CREATURE_AIR_ELEMENTAL, CREATURE_PHOENIX }
local respawns_quantities = { 100 * diff, 10 * diff, 100 * diff, 4 * diff }
local respawns_mood = {3, 1, 3, 0}
local respawns_courage = {1, 2, 1, 0}
local respawns_num = 0
local previous_pos = {}
local respawns_id = 0

--Памятка по сложностям чтоб посчитать множители от сложностей: diff = 0.5(easy), 2(normal), 4(veteran), 6(heroic), 10(hardcore)
local CanRespawnUnitsByLuck = random(100) + ((10*(WR_luck+1)) * mod((WR_luck+1),diff))
if CanRespawnUnitsByLuck >= mod(70,(WR_luck+2)) + (60+diff) then
print("Рандом выдал число "..CanRespawnUnitsByLuck, ", которое выше или равно порогу. Респавним юнитов...")
elseif CanRespawnUnitsByLuck < mod(70,(WR_luck+2)) + (60+diff) then --( 50 + (10+diff) ) then
print("Рандом выдал число "..CanRespawnUnitsByLuck, ", которое ниже порога. Никого не спавним, выходим из функции...")
return
end

for i = 1, 20 + diff do
local n = random(length(creatures_positions))+1
local x = creatures_positions[n].x
local y = creatures_positions[n].y
local floor = 0;
local badpos = 0;

if IsObjectExists("m"..n) or IsObjectExists("respawns"..n) then
badpos = 1
end

if ( badpos == 0 ) and ( IsTilePassable( x, y, floor ) ) then
respawns_num = respawns_num + 1
if respawns_num == 20 + diff then
print("Наспавнено максимальное количество юнитов. Выходим из респавнера.")
return --если наспавнили больше 20+сложность юнитов то выходим, иначе дичайший переспавн
end

local type = random( 3 ) + 1
if ( WR_luck < 3 ) and ( type == 4 ) then
type = random( 2 ) + 1
end
if ( WR_luck >= 5 ) then
respawns_quantities = { 200 * diff, 4 * diff, 200 * diff, 4 * diff }
respawns_courage = {1, 0, 1, 0}
type = random( 2 ) + 2
end
local creaturetype = respawns_types[ type ]
local quantity = respawns_quantities[ type ]
local mood = respawns_mood[ type ]
local courage = respawns_courage[ type ]
local respawnsname = 'respawns' .. n;
CreateMonster( respawnsname, creaturetype, quantity, x, y, floor, mood, courage, random( 360 ) );
end;
end;
if respawns_num == 0 then
print("Ни одно существо не было заспавнено. Вероятно, все точки спавна заняты.")
else
print("Респавн завершен. Заспавнено существ: "..respawns_num)
end;
end;
end;
Аватар пользователя
3 года назад
Доброго времени  суток! Нужна помощь по скрипту. Создал я спецу для героя, чтобы если во время боя в его армии осталось меньше 30% существ, призывались Вестники Смерти в размере УровеньГероя*0.05. Но сомневаюсь, что это будет работать...
function Start()
if GetHeroName(GetAttackerHero())=="HafadNecro" then
side=ATTACKER
aside=DEFENDER
start_creatures=CountCreatures(side)
elseif GetHeroName(GetDefenderHero())=="HafadNecro" then
side=DEFENDER
aside=ATTACKER
start_creatures=CountCreatures(side)
end
end
function CountCreatures(_side)
local fc_count=0
for key, element in GetCreatures(_side) do
fc_count=fc_count+GetCreatureNumber(element)
end
return fc_count
end
function UnitDeath(unit)
sleep(4)
if intg(start_creatures*0.30)<=CountCreatures(side) then
for key, name in GetCreatures(aside) do
SummonCreature(side, CREATURE_WRAITH, 0.05*GetHeroLevel("HafadNecro"), 12, 2)
end;
end;
end;

Аватар пользователя
3 года назад
Интересно, как он у вас призовёт 0.05*8, т.е. 0.4 Баньши? Нужно либо ceil, либо floor добавить, иначе будет по нулям спавниться. В целом должно работать
Аватар пользователя
3 года назад
Да, число определенно выше должно быть. 0.3 * уровень героя хотя бы. Т.е. на 40-ом будет примерно 12 банши, что довольно мало, надо еще больше, наверное.

SummonCreature без координат исправно призывает в свободную случайную точку. 
В ответ пользователю AstralLein
Аватар пользователя
3 года назад
AstralLein
Да, число определенно выше должно быть. 0.3 * уровень героя хотя бы. Т.е. на 40-ом будет примерно 12 банши, что довольно мало, надо еще больше, наверное.

SummonCreature без координат исправно призывает в свободную случайную точку.
Поменяю на большее число.

Добавлено через 3 минуты
Возникла проблема! В кампании оригинальных героев, в пятой миссии, после того, как Годрик освободит Изабель, на замок нападет Аграил. Я решил сделать в своем сценарии такую же функцию, но диалоговая сцена проигрывается ДО того, как Витторио нападет на замок!
function ChristianAttack()
DeployReserveHero("Christian", 98, 108, 0)
sleep(10)
MoveHero("Christian", 126, 139, -1)
if IsHeroAlive("Hafad") then
if IsHeroAlive("Christian") then
if GetObjectOwner("castle") == PLAYER_2 then
SetObjectiveState("prim5", OBJECTIVE_FAILED, 1)
sleep(10)
loose()
else StartDialogScene("/DialogScenes/FallenKnight/S3/DialogScene.xdb#xpointer(/DialogScene)")
sleep(1)
SetObjectiveState("prim5", OBJECTIVE_COMPLETED, 1)
SetObjectiveState("prim6", OBJECTIVE_ACTIVE, 1)
end;
end;
end;
end;
В ответ пользователю BlueHeavenHero
Аватар пользователя
3 года назад
BlueHeavenHero
Возникла проблема! В кампании оригинальных героев, в пятой миссии, после того, как Годрик освободит Изабель, на замок нападет Аграил. Я решил сделать в своем сценарии такую же функцию, но диалоговая сцена проигрывается ДО того, как Витторио нападет на замок!
Потому что у тебя по условиям(else) если объект(город?) "castle" не принадлежит 2 игроку, то запускаем ролик.

Если тебе нужно чтобы он запускался после захвата города, то нужно дописать скрипт на захват города с активацией функции через OBJECT_CAPTURE_TRIGGER где мы чекнем что захватили и кто новый владелец, и вот там уже запустим ролик если город взял игрок, которому принадлежит нужный тебе герой. Как-то так:
function TownCaptured( oldowner, newowner )
if IsHeroAlive("Hafad") then
if IsHeroAlive("Christian") then
if ( newowner == GetObjectOwner("Christian") ) then
StartDialogScene("/DialogScenes/FallenKnight/S3/DialogScene.xdb#xpointer(/DialogScene)")
sleep(1)
SetObjectiveState("prim5", OBJECTIVE_COMPLETED, 1)
SetObjectiveState("prim6", OBJECTIVE_ACTIVE, 1)
elseif newowner == PLAYER_2 then
SetObjectiveState("prim5", OBJECTIVE_FAILED, 1)
sleep(10)
loose()
end
end
end
end

Trigger( OBJECT_CAPTURE_TRIGGER, "castle", "TownCaptured" );

Таким образом, после MoveHero из функции с респавном героя, условия и действия можно поубирать)

В ответ пользователю Азгалор
Аватар пользователя
3 года назад
Азгалор

Потому что у тебя по условиям(else) если объект(город?) "castle" не принадлежит 2 игроку, то запускаем ролик.

Если тебе нужно чтобы он запускался после захвата города, то нужно дописать скрипт на захват города с активацией функции через OBJECT_CAPTURE_TRIGGER где мы чекнем что захватили и кто новый владелец, и вот там уже запустим ролик если город взял игрок, которому принадлежит нужный тебе герой. Как-то так:
function TownCaptured( oldowner, newowner )
if IsHeroAlive("Hafad") then
if IsHeroAlive("Christian") then
if ( newowner == GetObjectOwner("Christian") ) then
StartDialogScene("/DialogScenes/FallenKnight/S3/DialogScene.xdb#xpointer(/DialogScene)")
sleep(1)
SetObjectiveState("prim5", OBJECTIVE_COMPLETED, 1)
SetObjectiveState("prim6", OBJECTIVE_ACTIVE, 1)
elseif newowner == PLAYER_2 then
SetObjectiveState("prim5", OBJECTIVE_FAILED, 1)
sleep(10)
loose()
end
end
end
end

Trigger( OBJECT_CAPTURE_TRIGGER, "castle", "TownCaptured" );

Таким образом, после MoveHero из функции с респавном героя, условия и действия можно поубирать)

Вы не совсем меня поняли. После захвата города игроком-человеком активируется задание удержать город. На карту ставится Витторио и начинает идти к нашему городу. Если мы победили Витторио, активируется ролик. Если же Витторио захватил город, мы проигрываем. 
Кстати, примерно такая же проблема возникла и с другой функцией - запускается кат-сцена, потом начинается битва, и ПОСЛЕ битвы вылазит текстовое сообщение. Но - запускается кат-сцена, и текстовое сообщение вылазит ДО битвы. Как это исправить? 

Статистика

Приветствуем новейшего участника: recijeb

Сейчас на сайте 6 пользователей 1366 гостей