Появилась идея сделать карту. Начал делать карту - тут же упёрся в триггеры В общем не буду размусоливать.
Старт -
Мне нужно как-то реализовать старт... думаю десяти игроков. После этого нужно каждого из них рандомно поделить на две фракции, но поровну (хотя это важно только сейчас для выравнивания баланса). После этого каждому из них нужно выдать рандомного стартового героя их фракции. У каждой фракции свои герои.
При старте карты выдаётся рандомный интерфейс расы. Как мне это победить? В зависимости от него, генерировать нужного юнита что ли?... а как тогда по фракциям делить
Это ещё не всё.
Дипломатия -
Игроки фракции "Империи" "находятся под пактом о ненападении" и имеют в своём клане компьютера нейтрала управляющего самой империей. Другая фракция "Демонов" враждуют между собой и с другой фракцией, и с компьютером, но могут стать нейтральными к другим "Демонам"

Даааа весело тебе будет с триггерами сидеть и разбираться. Но в целом все это реализуемо. Сложнее будет сбалансировать все это. Ты хочешь сделать одинаковое количество игроков во фракциях? А что будет, если из 10 игроков в игре будет 7? 3 в одну сторону и 4 в другую? При этом рандомно? Или 4 всегда должно быть на стороне где ффа а 3 на другой стороне?
Так-же раз ты выбираешь им расу в игре, то стандартный спавн, думаю, не подойдет, а значит тебе самому придется спавнить ратушу и работников вручную (может это и можно полуавтоматизировать. но тогда надо поразбираться в эту сторону, не делал мили такое).
У тебя получается очень много микро-задач и вопросов "а что если", и все это надо продумать.
Самое основное, что тебе нужно будет - это группа игроков. Через группы будешь выбирать и собирать игроков в разные фракции. Или даже массивы игроков, если тебе будет удобнее работать с ними (например чтобы выбрать каждого игрока в группе и выставить союз с каждым другим игроков в группе, или наоборот вражду).
Тебе нужно будет так-же использовать переменные, чтобы выбирать и работать с группами игроков.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
25
Даааа весело тебе будет с триггерами сидеть и разбираться. Но в целом все это реализуемо. Сложнее будет сбалансировать все это. Ты хочешь сделать одинаковое количество игроков во фракциях? А что будет, если из 10 игроков в игре будет 7? 3 в одну сторону и 4 в другую? При этом рандомно? Или 4 всегда должно быть на стороне где ффа а 3 на другой стороне?
Так-же раз ты выбираешь им расу в игре, то стандартный спавн, думаю, не подойдет, а значит тебе самому придется спавнить ратушу и работников вручную (может это и можно полуавтоматизировать. но тогда надо поразбираться в эту сторону, не делал мили такое).
У тебя получается очень много микро-задач и вопросов "а что если", и все это надо продумать.
Самое основное, что тебе нужно будет - это группа игроков. Через группы будешь выбирать и собирать игроков в разные фракции. Или даже массивы игроков, если тебе будет удобнее работать с ними (например чтобы выбрать каждого игрока в группе и выставить союз с каждым другим игроков в группе, или наоборот вражду).
Тебе нужно будет так-же использовать переменные, чтобы выбирать и работать с группами игроков.
Принятый ответ
25
Вот простой пример, где делим игроков рандомно на 2 равные команды (при нечетном кол-ве игроков в одной команде будет больше игроков на 1). Союзы и тд уже сам поставишь. С чем возникает проблема - с тем и задавай вопрос, в конкретном действии, которое не получается, а не "запилите полностью систему" :)
(прикрепил карту)
Загруженные файлы
Ответы (5)
2
(прикрепил карту)
Ай воот что меня парит. При старте карты же рандомно интерфейс расы выдаётся. Как мне это победить?
Хотя бы в зависимости от него генерировать нужного юнита что ли... Но как этот параметр отловить
25
Detektrius, по поводу расы ты уже определись, хочешь рандомить или какую игрок выбрал такую и выдать. А так - никак не изменить во время игры. Можешь залочить всем один интерфейс как стандарт.
2
konvan5,
У меня выставлены случайная раса у игроков и её нельзя изменить. Я хочу её отловить после инициализации и в зависимости от неё плясать
Нет способа отловить сгенерированную расу игрока?
25
Detektrius, а ну тогда это изи, в триггерах есть проверка на расу игрока
Загруженные файлы
2
Сложнее будет сбалансировать все это. Ты хочешь сделать одинаковое количество игроков во фракциях? А что будет, если из 10 игроков в игре будет 7? 3 в одну сторону и 4 в другую? При этом рандомно? Или 4 всегда должно быть на стороне где ффа а 3 на другой стороне?
Баланс - один игрок к одному. Вообще карта больше про каждый сам за себя, но не обычное мили. А фракции отличаются геймплеем
Карта не обычное сражение рас а больше "арпижьиеее" прокачку "мэйн хероя"

Ты хочешь сделать одинаковое количество игроков во фракциях?
А вот этот момент навёл на мысли... Как реализовать рандом выбор фракции но равное кол-во игроков в них... хз вообще
upd. увидел как ты сделал это. Но у меня игроки стартуют на карту как каждый сам за себя, а уже после инициализации их нужно раскидать по командам. Это сработает?
Ответы (1)
30
Как реализовать рандом выбор фракции но равное кол-во игроков в них... хз вообще
Математику в школе косил с ярым усердием?

Подсчёт игроков

Ну давай включим голову (это то место, которым обычное едят) и подумаем, какие у нас есть варианты двух команда для 10 игроков:
1 0x1
2 1x1
3 1x2
4 2x2
5 2x3
6 3x3
7 3x4
8 4x4
9 4x5
10 5x5
Как видно из таблицы, наблюдается проблема с нечётным количеством игроков. Её можно будет решить балансом, но это уже предмет другого вопросв.
Итак, первым делом пересчитаем всех играющих игроков и положим это значение в переменную:
integer PlayerCount;
Далее заведём переменные для количества игроков в командах:
integer FirstTeamCount;
integer SecondTeamCount;
Чтоб не лезть в дебри функций возпользуемся замечательным свойством типа integer - отбрасывание остатка при делении:
set FirstTeamCount = PlayerCount / 2
Посчитаем оставшихся игроков
set SecondTeamCount = PlayerCount - FirstTeamCount
Отобразим результаты в таблице:
PlayerCount FirstTeamCount SecondTeamCount Комманды
1 1 / 2 = 0 1 - 0 = 1 0x1
2 2 / 2 = 1 2 - 1 = 1 1x1
3 3 / 2 = 1 3 - 1 = 2 1x2
4 4 / 2 = 2 4 - 2 = 2 2x2
5 5 / 2 = 2 5 - 2 = 3 2x3
6 6 / 2 = 3 6 - 3 = 3 3x3
7 7 / 2 = 3 7 - 3 = 4 3x4
8 8 / 2 = 4 8 - 4 = 4 4x4
9 9 / 2 = 4 9 - 4 = 5 4x5
10 10 / 2 = 5 10 - 5 = 5 5x5

Перемешивание массива

Массивы у нас маленькие, так что проигнорируем оптимизацию памяти.
Так же проигнорируем нормальный нейминг, ибо при объяснении он нам будет мешать.
Заведём массивы содержашие номера игроков. Всегда старайтесь работать с примитивами.
integer array ALL // массив для всех игроков
integer array A // массив для первой комманды
integer array B // массив для второй комманды комманды
Заведём курсор для каждого массива. Для удобства используем их имя в нижнем регистре:
integer all = -1
integer a = -1
integer b = -1	
Почему не используется ноль вы поймёте позже.
Итак, для примера заполним массив ALL игроками
set all = all + 1 // 0
set ALL[all] = 3 // возьмём произвольные номера игроков
set all = all + 1 // 1
set ALL[all] = 5 
set all = all + 1 // 2
set ALL[all] = 7
set all = all + 1 // 3
set ALL[all] = 9
Итак, как видите у нас в массиве четыре игрока, тобишь курсор + 1 = количество элементов массива.
Теперь необходимо заполнить массивы комманд случайными игроками. Для этого существует простой алгоритм:
local integer r // заведём временную переменную для хранения случайного числа

loop
	set random = GetRandomInt(0, all) // Получаем случайный индекс массива ALL

	if a + 1 < FirstTeamCount then // если в первой комманде недостаточно игроков добавляем их туда
		set a = a + 1
		set A[a] = ALL[random]
	else // если первая комманда полная пихаем всех во вторую
		set b = b + 1
		set B[b] = ALL[random] 
	endif

	set ALL[random] = ALL[all] // Помещаем последний элемент массива на место случайного элемента
	set all = all - 1 // Двигаем курсор влево	
	exitwhen all < 0 // Выходим из цикла, если мы вышли за пределы массива
endloop
Теперь у вас есть два массива A и B заполненные индексами случайных игроков. На этом мои полномочия всё.
Ответы (7)
25
Detektrius, у тебя все игроки будут в 1 фракции ибо ты устанавливаешь ее до того, как выбираешь игрока.
25
Detektrius, для тестов временно сделай с условием, что выбранные игроки не только люди а и компы. И потести, кого куда и сколько закидывает с разным кол-вом игроков
25
Detektrius, кстати, зачем тебе в конце действие "выключить этот триггер"? :D
Это как помогает тебе решить задачу и зачем?
2
konvan5, на всякий случай, если событие каким то чудом пойдёт туда :)
25
Detektrius, у тебя событие - инициализация карты. То есть оно запуститься 1 раз за игру. Если в группе что-то пойдет не туда, ты ничего не изменишь, выключив триггер, ибо работа триггера продолжиться а на триггере будет просто флажок "выключен", что значит, что в следующий раз он не запуститься. Но он и так не запустится, ибо событие происходит 1 раз за всю игру, на старте, в инициализации :D
Это действие нужно чтобы не дать запуститься триггеру снова при событиях, которые запускают триггер много раз в течении всей игры, к примеру юнит получил урон, или событие каждые 2 секунды и тд.
Поэтому это действие тут бессмысленно и оно не остановит все последующие действия текущего триггера.
2
konvan5, Спасибо. Но это я и так в курсе.
Я там ошибся, заменил на "ничего не делать"
35
Detektrius Чтобы не плодить кучу ифов. Сделай базу данных тригерную. В массивы записывай типы юнитов и расы. А потом через цикл прогоняй.
Ответы (8)
2
PUVer,
А я умею? УВЫ я слишком туп для массивов
Хотя выглядит так что похоже мне это и нужно
25
Detektrius, массивы это очень удобная вещь для подобных систем... почитай, поразбирайся, что это такое... поможет и не раз.
2
konvan5, Что поможет вопросов нет... Вот только я уже треть жизни п... ытаюсь понять массивы и них...т не понял
2
konvan5, переменная с массив это просто переменная с индексами в которые можно положить ещё значения?
25
Detektrius, да, массив это переменная, в которую влезет много переменных. А получить или установить нужную переменную - через индекс (номер).
У тебя может быть хоть 1000 переменных в одном массиве с индексами от 0 до 999, но храниться будет все в одной переменной, что удобнее чем создавать 1000 переменных с разными названиями.
35
Detektrius, если по научному массив это вектор. Двумерный массив - матрица. Массив совокупность переменных с общим типом и именем, число в квадратных скобках - это индекс или номер перменной в массиве. Как применять?
Цикл от 1 до 10 по целой А
Если Массив [Целая А] = 0
Делать что-то.
Как бы так. Схематично объяснил.
Таким образом у нас во всём массиве триггер найдёт все переменные равные 0 и сделает при этом что-то.
30
УВЫ я слишком туп для массивов
Что мешает исправить эту ситуацию?
30
PUVer, если по научному, то вектор это направленный отрезок. А массив это выделенная область памяти. Я даже расписал как память выделяется.
2
Detektrius, если по научному массив это вектор. Двумерный массив - матрица. Массив совокупность переменных с общим типом и именем, число в квадратных скобках - это индекс или номер перменной в массиве. Как применять?
Цикл от 1 до 10 по целой А
Если Массив [Целая А] = 0
Делать что-то.
Как бы так. Схематично объяснил.
Таким образом у нас во всём массиве триггер найдёт все переменные равные 0 и сделает при этом что-то.
Ох йёёёшкар ола... сложна бл...
Ответы (2)
25
Detektrius, проще:
Переменная - это ящик. Ты можешь туда положить 3 апельсина и это будет одна переменная, хранящая 3 апельсина. Но чьи это апельсины?
Массив - это шкаф с пронумерованными полками от 0 до N. Ты можешь положить в 0 полку 3 апельсина, в 1 полку 2 апельсина, а в 5 полку 10 апельсинов. И все апельсины хранятся в одной переменной. мы можем сопоставить каждую полку чтобы она принадлежала своему хозяину: Паше, Маше, Даше, и тд. (куча данных в 1 переменной!)
Вот как проще представлять массивы :)
Загруженные файлы
23
Detektrius, таблица в Эксель это двумерный массив, с 1 столбик в ней это обычный массив, задача - записать цифру в строку, а потом позже найти строку и взять оттуда цифру
Собственно всё)
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.