Отключать стандартный бонус не нужно, проверка на наличие артефактов очень легкая, а вторая часть действительно выглядит очень сложной, хочешь написать, что лучше пока забыть об этом?
Сообщения от Скрипты
Привет! Кто-нибудь сталкивался с таким багом? У меня в боевом скрипте прописано, что герой кастует общее ускорение вначале каждого боя. Всё работает до тех пор, пока герой не оденет том магии света, после чего во время боя консоль жалуется что герой не может применить заклинание общее ускорение. Это вообще как-нибудь поправимо?
Возможно, что герою не хватало маны в момент теста с томом?
Возможно, что герою не хватало маны в момент теста с томом?
Добавлено через 18 минут
В общем, прописал выдачу маны на стадию подготовки, теперь работает даже если у героя 0 маны на перед боем
Я тут почти закончил делать карту, но столкнулся с проблемой сделать свой бонус для сета артефактов, а именно, я вообще не представляю как подобное делать. Задумка такая, если у героя будут артефакты: шлем некроманта, проклятое кольцо, кольцо сломленного духа и амулет некроманта, то:
Гарантирует герою, что в начале боя все существа в армии противника окажутся под действием заклинаний «Замедление», «Неудача», «Слабость» и «Проклятие». Эффект действует на протяжении 10 ходов.
Помогите пожалуйста
Если вы понимаете, как привязать выполнение боевого скрипта к героям, надевшим определённые арты, то остальное всё достаточно просто:
function Start()
for side=0,1 do
if GetHero(side) then
if GetHeroName(GetHeroSide()) then --Ваша проверка в бою на героя. Я рекомендую в скрипте карты приключений создавать глоб. переменную вида "hero".."_NecArtSet" в единицу при наличии сета (и в ноль при отсутствии) и тут писать вместо проверки имени проверку вида if GetGameVar(GetHeroName(GetHeroSide()).."_NecArtSet")+0==1 then
startThread(function(side)
combatSetPause(1)
SummonCreature(side, CREATURE_YETI, 1)
for n, unit in GetCreatures(side) do if GetCreatureType(unit)==CREATURE_YETI then local _helper = unit break; end; end
while not exist(_helper) do sleep() end
for n, spell in {SPELL_MASS_SLOW, ...} --Список масскастов
UnitCastGlobalSpell(_helper, spell)
end
removeUnit(_helper)
combatSetPause(nil)
)
end
end
end
endСкрипт написал без тестирований, поэтому адапатируйте и потестируйте, пожалуйста. Также вам понадобится заменить в характеристиках существа Neutrals/Yeti ману на ~200 и мастерство в школе так, чтобы держалось 10 ходов. Ну или с числом вызываемых поиграться
В целом, ничего особо сложного нет
function SaveCreaturePos(table, mob)
local x, y, z = GetObjectPosition(mob)
creature_coord_table[mob] = {x=x, y=y, floor=z}
end --Что-то такое
И в бою, и на карте приключений при спавне существа на занятую клетку оно заспавнится на ближайшую рядом.
В целом, ничего особо сложного нетfunction SaveCreaturePos(table, mob)
local x, y, z = GetObjectPosition(mob)
creature_coord_table[mob] = {x=x, y=y, floor=z}
end --Что-то такое
function SaveCoordinates( table )
local monster_list = {};
local k = 0;
for i=1,500 do
monster = "m"..i;
if IsObjectExists( monster ) then
k = k + 1;
monster_list[k] = monster;
local x, y, z = GetObjectPosition(monster_list[k])
creatures_positions[k] = {x=x, y=y, floor=z}
end;
end;
end;Потом в другой функции пытаюсь взять из этого списка рандомную позицию и поставить на неё существо, но игра выдаёт ошибку на пустые x, y, z. В другой функции взятие координат прописал так:
for k=1, length(creatures_positions) do
local x, y, z = random(length(creatures_positions[k]))
Во-вторых, очевидно неправильно пытаться в 3 ПЕРЕМЕННЫХ записать одно значение, которое возвращает РАНДОМ, в который передаётся ТАБЛИЦА. Это просто что-то с чем-то)
Только x=creatures_position[k].x, y=..., z = ...
Во-первых, можно не заморачиваться с именованием всех мобов, а использовать функцию GetObjectNamesByType("MONSTER")
Во-вторых, очевидно неправильно пытаться в 3 ПЕРЕМЕННЫХ записать одно значение, которое возвращает РАНДОМ, в который передаётся ТАБЛИЦА. Это просто что-то с чем-то)
Только x=creatures_position[k].x, y=..., z = ...
Короч, взял разрабовский скрипт респавна ботов из 3 карты кампании за Фриду владык севера, подредачил его под себя пользуясь ещё скриптом на спавн красных героев возле городов из последней карты с Фридой, получилось такое:
function SaveCoordinats( table )
local monster_list = {};
local k = 0;
for i=1,500 do
monster = "m"..i;
if IsObjectExists( monster ) then
k = k + 1;
monster_list[k] = monster;
creatures_positions[k] = GetObjectPosition(monster_list[k])
end;
end;
creatures_positions_list = length(creatures_positions)
end;
function RespawnUnitsByLuck()
-- if ( GetDate(WEEK) == 3 ) and ( GetDate(DAY_OF_WEEK) == random(6) + 1 ) then
local WR_luck = GetHeroStat(WR, STAT_LUCK)
local respawns_types = { CREATURE_AIR_ELEMENTAL, CREATURE_PHOENIX }
local respawns_quantities = { 100 * diff, 10 * diff }
local respawns_mood = {3, 0}
local respawns_courage = {1, 2}
local respawns_num = 20 + diff
local previous_pos = {}
local respawns_id = 0
local CanRespawnUnitsByLuck = random(100) + (10*(WR_luck+1)) * mod((WR_luck+1),diff)
if CanRespawnUnitsByLuck >= mod(70,(WR_luck+2)) + (60+diff) then --( 70 + (10+diff) ) then
print("Шанс ", CanRespawnUnitsByLuck ,". Респавним юнитов")
elseif CanRespawnUnitsByLuck < mod(70,(WR_luck+2)) + (60+diff) then --( 50 + (10+diff) ) then
print("Шанс ", CanRespawnUnitsByLuck ,". Никого не спавним")
return
end
if WR_luck >= 7 then
courage = {1, 0}
respawns_num = 20 * diff
respawns_quantities = { 200 * diff, 20 * diff }
end
for k=1, creatures_positions_list do
if ( IsTilePassable(creatures_positions[k][3]) ) then
local type = random( 1 ) + 1
if type == 2 and WR_luck < 3 then
type = 1
end
local creaturetype = respawns_types[ type ]
local quantity = respawns_quantities[ type ]
local mood = respawns_mood[ type ]
local courage = respawns_courage[ type ]
respawns_id = respawns_id + 1;
local respawnsname = 'respawns' .. respawns_id;
CreateMonster( respawnsname, creaturetype, quantity, creatures_positions[k][3], mood, courage, random( 360 ) );
end;
end;
-- end;
end;
Игра жалуется на "attempt to index a number value". У меня уже голова не варит как этот респавн допилить чтобы он заработал нормально 🙃 Изначальный, разрабовский вариант, работал, но у меня карта большая, много кустов, и каждую клетку маской заливать чтобы там не заспавнился бот - такое себе дело( Проще уж спавнить их на уже готовых монстриках, поэтому у меня для заполнения координат таковые уже имеются на карте.
И в проверке IsTilePassable нужно сначала в local x y z сохранить соответствующие элементы таблицы, а потом передать в IsTilePassable.
Ну и именно из-за этого ошибка "попытка индексировать число". Ведь creature[k] у вас не что иное, как чиселка
Сразу говорю, в чём точно ошибка. Когда вы записываете в crearure_positions[k] возврат функции GetObjectPosition, то у вас эоот катый элемент становится числом, а не таблицей из трёх элементов. Поэтому нужно опять: creature_positions[k][1], creature_positions[k][2], creature_positions[k][3] = GetObjectPosition(monster)
И в проверке IsTilePassable нужно сначала в local x y z сохранить соответствующие элементы таблицы, а потом передать в IsTilePassable.
Ну и именно из-за этого ошибка "попытка индексировать число". Ведь creature[k] у вас не что иное, как чиселка
Этот как-то не сработал, зато пошло дело с твоим предыдущим вариантом) Правда, пришлось еще кое-что подправить, а то у меня IsTilePassable жаловался на неверный 3 аргумент. В общем, всё работает, но правда имеющиеся точки под спавн идут не случайно из списка а строго по нему, что довольно печально. Как-бы мне это дело зарандомить чтобы всё не сломать?
Ещё такой вопрос. Есть у меня проверка на удачу(GetHeroStat(герой, STAT_LUCK)), и вот в консоли я заметил что даже если поставить герою 10, то она будет выдавать не выше 5. Т.е. если я в скрипте поставлю условие чтобы удача была выше 6, то тогда это условие всегда будет неверным?
а) Непоследовательно
б) Без повторений
в) Со всеми 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
function ChristianAttacked()
DeployReserveHero("Christian", 98, 108, 0)
sleep(1)
MoveHero("Christian", 126, 139, -1)
if IsHeroAlive(hero) and GetObjectOwner("castle") == PLAYER_1 then
StartDialogScene("/DialogScenes/FallenKnight/S3/DialogScene.xdb#xpointer(/DialogScene)")
sleep(1)
SetObjectiveState("prim6", OBJECTIVE_ACTIVE, 1)
else SetObjectiveState("prim5", OBJECTIVE_FAILED, 1)
loose()
end;
end;Вроде всё правильно, НО - функция ниже не работает! Всё остальное, включая else, работает отлично. В чём ошибка? Пути к ролику точно правильно прописал...
if IsHeroAlive(hero) and GetObjectOwner("castle") == PLAYER_1 then
StartDialogScene("/DialogScenes/FallenKnight/S3/DialogScene.xdb#xpointer(/DialogScene)")
sleep(1)
SetObjectiveState("prim6", OBJECTIVE_ACTIVE, 1)
Статистика
Сейчас на сайте 10 пользователей 1349 гостей
Посетители сегодня 32
- Валера 111
- Граф Орлов
- Джек
- Драккошка
- Дугал
- Злобный Ящур
- Небо
- Нэйко
- Саргон
- ALVYDAS
- Arandor
- AstralLein
- burymm
- Dark Jack
- dotahcxun
- elizbar1967
- fktifzobr@mail.ru
- Golvek
- Happy Life
- Heroist
- Hottler
- HwKeeper
- IchGViji
- kcfgogbfalgfl
- LifeForm
- Narron
- OrnsteinDragonslayer
- PingWing
- Ple-Sen
- Sir Syddan
- Siverfale
- Valery59