То есть тут без кавых он распознает как стринг? Или это тока ко 2 случаю? Интересно...
Да, распознаёт.
Dyrman
13 лет назад
А в startThread можно как-нибудь задать изменяемое имя функции(она не любит кавых)? Например:
for i,e in mass startThread(oops_..i.._F) end;
Выше всего лишь образец)
Добавлено через 4 минуты RedHeavenHero
Да, распознаёт.
Отлично. Попробуем поиздеваться. Спасибо.
Добавлено через 4 минуты А составной индекс возможен? Или псевдоним? Типа обращаешься по двум разным стринговым именам, а получаешь одно и то же значение.
1) Перестройка городов на старте игры. Для чего: ИРМГ генерирует некрасивые карты, а стандартный ГСК генерирует все города только 2 уровня с построенной таверной. Нужно: - первому игроку стартовый город 4 уровня (скажем, форт, таверна и жилище-1); - всем последующим игрокам стартовый город 4 уровня плюс, вероятно, дополнительная постройка (жилище-2) - до 5 уровня, шанс зависит от номера игрока и равен 100% для последнего игрока - все нейтральные города получают 6 уровень (скажем, форт-цитадель, жилище-1,2,3) Проблема: - Как перебрать города, существующие на карте, если их имена заранее неизвестны? Придётся ли перебирать все существующие имена городов, прописанные в ресурсах игры на предмет их наличия на карте?
2) Забор хода у героев при встрече или после боя. Для чего: запрет цепочек, лимит боёв. Нужно: - Забирать у героя 50% полного хода после сыгранной битвы (как в Disciples 2), если остаток хода героя меньше - забирать весь остаток хода. В идеале забирать только в том случае, если нейтралы не были отпущены без боя. - При встрече дружественных героев выравнивать их остаток хода по минимуму (т.е. устанавливать остаток хода обоих героев равным наименьшему остатку хода среди них). При посещении героем гарнизонов шахт обнулять его ход (в идеале - только гарнизонов, чтобы ход не терялся при захвате шахты) - запрет шахтерских цепочек. Проблемы: - Как отследить факт проведения битвы (что-то типа триггера)? - Как отследить факт встречи героев или посещения гарнизона?
Ment
13 лет назад
Придётся ли перебирать все существующие имена городов, прописанные в ресурсах игры на предмет их наличия на карте?
Нет, там проще. Мне надо быть дома, чтобы написать. Возможно, Dyrman или RedHaven успеют раньше меня, а нет -- тогда я напишу. По второму: есть триггер на соприкосновение. Хотя вешать триггеры на всех героев, наверное, не очень, но другого пути я не вижу.
Warrior777
13 лет назад
ПОМОГИТЕ:smile45: Есть карта, есть скрипт:
function obj() while 1 do local heroes = {}; local m = 0; local h = 0; local count = 0; heroes = GetPlayerHeroes(PLAYER_1); --for m, h in heroes do h = "Muscip"; if HasArtefact(h, 36) then count = count + 1; end; if HasArtefact(h, 37) then count = count + 1; end; if HasArtefact(h, 38) then count = count + 1; end; if HasArtefact(h, 39) then count = count + 1; end; if HasArtefact(h, 40) then count = count + 1; end; if HasArtefact(h, 41) then count = count + 1; end; if HasArtefact(h, 42) then count = count + 1; end; if HasArtefact(h, 43) then count = count + 1; end; end; local sl = GetPlayerHeroes(PLAYER_1); local res if count == 8 then print("Player 1 has all artifacts"); SetObjectiveState("obj", OBJECTIVE_COMPLETED); Win (); break; end; sleep(5); end; end;
startThread (obj);
Немножко подкорректировал его:
function obj() while 1 do local heroes = {}; local o = 0; local h = 0; local count = 0; heroes = GetPlayerHeroes(PLAYER_1); --for o, h in heroes do h = "Muscip"; if HasArtefact(h, 36) then count = count + 1; end; if HasArtefact(h, 37) then count = count + 1; end; if HasArtefact(h, 38) then count = count + 1; end; if HasArtefact(h, 39) then count = count + 1; end; if HasArtefact(h, 40) then count = count + 1; end; if HasArtefact(h, 41) then count = count + 1; end; if HasArtefact(h, 42) then count = count + 1; end; if HasArtefact(h, 43) then count = count + 1; end; end; o = "obj" local sl = GetPlayerHeroes(PLAYER_1); if count == 1 then print("Player 1 has 1/8 artifacts"); SetObjectiveProgress(o, 1); end; if count == 2 then print("Player 1 has 2/8 artifacts"); SetObjectiveProgress(o, 2); end; if count == 3 then print("Player 1 has 3/8 artifacts"); SetObjectiveProgress(o, 3); end; if count == 4 then print("Player 1 has 4/8 artifacts"); SetObjectiveProgress(o, 4); end; if count == 5 then print("Player 1 has 5/8 artifacts"); SetObjectiveProgress(o, 5); end; if count == 6 then print("Player 1 has 6/8 artifacts"); SetObjectiveProgress(o, 6); end; if count == 7 then print("Player 1 has 7/8 artifacts"); SetObjectiveProgress(o, 7); end; if count == 8 then print("Player 1 has all artifacts"); SetObjectiveState(o, OBJECTIVE_COMPLETED); Win (); break; end; sleep(5); end; end;
startThread (obj);
И скрипт перестал работать. Консоль пишет что-то вроде этого: (Script) ERROR: no loop break ... ... (не помню:( что то писалось про 72 строку.)
function obj() local old = 0 while 1 do local count = 0 for i=36,43 do count = count + (HasArtefact("Muscip", i) or 0) end if count == 8 then print("Player 1 has all artifacts") SetObjectiveState("obj", OBJECTIVE_COMPLETED) Win() break end if count ~= old then print("Player 1 has "..count.."/8 artifacts") SetObjectiveProgress("obj", count) old = count end sleep(5) end end
startThread (obj)
Добавлено через 4 минуты
Как перебрать города, существующие на карте, если их имена заранее неизвестны? Придётся ли перебирать все существующие имена городов, прописанные в ресурсах игры на предмет их наличия на карте?
GetObjectNamesByType('TOWN') вернёт массив с именами всех городов на карте.
Должно. Там нет ничего навороченного, чего бы не было в 1.6.
Добавлено через 5 минут
Проблемы: - Как отследить факт проведения битвы (что-то типа триггера)? - Как отследить факт встречи героев или посещения гарнизона?
1. GetLastSavedCombatIndex() вернёт количество проведённых битв на текущей карте. 2. С помощью триггера (16), как и сказал Ment. Отследить прикосновение героя к гарнизону практически невозможно.