Собственно, вопрос, как бы глупо ни звучал, но такой. Как реализовать случайных героев на карте? Подскажите, пожалуйста, триггерную реализацию (может, уже готовую) для случайных героев. У меня есть пример, но в нем баг - можно нанимать любое количество героев бесплатно. Хотелось бы без этого глюка. Почему не на джассе - т.к. на карте много гуи-объектов и неясно, как все будет взаимодействовать друг с другом (а я не знаю джасс, так что в случае чего не смогу разобраться с ошибками).
Также скажу, что героев более 24 стандартных.

Steal nerves, так у него есть в триггерах и база, и счётчик, но не работает обнуление лимита. Если же делать просто замену героя через Replace (на патче 1.26а), то лимит на второго героя теряется, сразу надо строить Замок. То есть, например, есть Ратуша, нанимаю героя и заменяю его после найма на случайного, следующего героя позволяет нанять только при Замке, минуя Крепость.

EHP_Sequence, может что-то не усмотрел в триггере, там куча переменных задействована, может какая-то задействована до того, как значение получает, ну или что-то вроде того.
Попробуй использовать эту систему:
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
27
вам нужно чтобы никто не мог его выбрать (точнее не выпадала дважды)? тогда нужен другой подход - логическая массивная переменная b на каждого героя. Если приобретаешь, ставишь true
раскрыть
  1. если нужно чтобы тип героя дважды не распространялся среди всех игроков
достаточно узнать какой тип, и поставить true
поможет цикл
n - номер игрока
k - счетчик героев
a=false - логическая (это переменная для цикла, будет говорить, что вы приобрели героя)
loop
	exitwhen a //условия выхода из цикла, сразу же выходит из цикла если нашли свободного героя
	
	set r = GetRandomInteger(1,25)
	if not b[r] then //если тип не занят
		set a = true
		//Создать героя с TypeHero[r]
		set b[r] = true
	endif
endloop

  1. если нужно чтобы тип героя дважды не распространялся у игрока
b[1-25] - для красного (0)
b[26-50] - для синего (1)
b[51-100] - для сине-зеленого (2)
поможет цикл
n - номер игрока
k - счетчик героев
a=false - логическая (это переменная для цикла, будет говорить, что вы приобрели героя)
loop
	exitwhen a //условия выхода из цикла, сразу же выходит из цикла если нашли свободного героя
	
	set r1 = GetRandomInteger(1,25)
	set r2 = (n*25) + r1
	if not b[r2] then //если тип не занят
		set a = true
		//Создать героя с TypeHero[r1]
		set b[r2] = true
	endif
endloop
24
Steal nerves, вот только вместо перебора всего массива лучше хранить кол-во доступных героев, делать одну случайную выборку из массива, уменьшать кол-во доступных на 1, а выбраную ячейку менять местами с последней. Иначе есть риск очень долго нарываться на занятые ячейки, вплоть до прерывания потока по лимиту операций (сам в это вляпывался когда начинал, очень неприятно потом искать причину по которой иногда героев отказывается спавнить на ровном месте).
43
А не проще сделать тупо поочередную покупку, и при покупке удалять уже купленных героев? В выборе рандома перебрать максимальное значение, так к примеру было 24 перса, выбрали скажем паладина, который 22, делаем перерасчет уже на 23 и 22 перс будет 23, скажем так заполнение пустых ячеек.
26
EHP_Sequence, пришёл домой и посмотрел. Наверное, проблема в патче 1.30.2, он ведь тестовый. Там похоже не работает корректно обнуление лимита. Он должен обнулять наём случайного героя после найма, но не делает этого, как ты описываешь.
Вряд ли это поможет, но кто его знает, попробуй на jass прописать действия с лимитом. Для этого замени их на Custom Script, где пропиши, например, вместо такого действия Limit training of First Random Hero to 0 for Pnum такой custom script:
call SetPlayerTechMaxAllowed(udg_Pnum, '_равкод_', 0)
Равкод First Random Hero можешь увидеть в Редакторе объектов, нажав Ctrl+D.
27
при старте карты (заполняем базу данных, вбиваете типы):
//стандартный неизменчивый список
set TypeHero[0] = "Паладин"
set TypeHero[1] = ....
set TypeHero[2] = ....

//второй список (этот список будет изменяться, кол-во свободных героев становится меньше)
set TypeHero2[0] = "Паладин"
set TypeHero2[1] = ....
set TypeHero2[2] = ....

set MaxHero = 2
когда будете приобретать рандом героя, перезапись списка
set r = GetRandomInteger(0,MaxHero)
Создать героя TypeHero2[r]

set i = 0 //счетчик цикла
set a = 0 //счетчик свободных героев
loop
	exitwhen i > 2 //у меня макс число героев в станд списке = 2 (0,1,2)
	if TypeHero2[r] == TypeHero[i] then //надо найти номер типа i из станд списка
		set b[i] = true //записываем что занят
	endif
	if not b[i] then //если не занят
		set TypeHero2[a] = TypeHero[i] //перезапись типа
		set a = a + 1
	endif
	set i =i+1
endif
set MaxHero = a
26
Steal nerves, так у него есть в триггерах и база, и счётчик, но не работает обнуление лимита. Если же делать просто замену героя через Replace (на патче 1.26а), то лимит на второго героя теряется, сразу надо строить Замок. То есть, например, есть Ратуша, нанимаю героя и заменяю его после найма на случайного, следующего героя позволяет нанять только при Замке, минуя Крепость.

EHP_Sequence, может что-то не усмотрел в триггере, там куча переменных задействована, может какая-то задействована до того, как значение получает, ну или что-то вроде того.
Попробуй использовать эту систему:
Загруженные файлы
Принятый ответ
8
Steal nerves:
когда будете приобретать рандом героя, перезапись списка
set r = GetRandomInteger(0,MaxHero)
Создать героя TypeHero2[r]

set i = 0 //счетчик цикла
set a = 0 //счетчик свободных героев
loop
	exitwhen i > 2 //у меня макс число героев в станд списке = 2 (0,1,2)
	if TypeHero2[r] == TypeHero[i] then //надо найти номер типа i из станд списка
		set b[i] = true //записываем что занят
	endif
	if not b[i] then //если не занят
		set TypeHero2[a] = TypeHero[i] //перезапись типа
		set a = a + 1
	endif
	set i =i+1
endif
set MaxHero = a
Зачем делать эти лишние действия с подсчетом занятых и не занятых юнитов перезаписывая весь массив каждый раз заново, если можно сделать так:
set r = GetRandomInteger(0,MaxHero)
Создать героя TypeHero2[r]

set TypeHero2[r] = TypeHero2[MaxHero]
set TypeHero2[MaxHero] = null
set MaxHero = MaxHero - 1
27
8gabriel8, ну тогда с 3 даймиками.
pAxsIs,+++ иногда бывает нужно порядок не нарушать. У меня такое было. здесь как бы необязательно соблюдать, все таки рандом
12
8gabriel8:
Steal nerves, так у него есть в триггерах и база, и счётчик, но не работает обнуление лимита. Если же делать просто замену героя через Replace (на патче 1.26а), то лимит на второго героя теряется, сразу надо строить Замок. То есть, например, есть Ратуша, нанимаю героя и заменяю его после найма на случайного, следующего героя позволяет нанять только при Замке, минуя Крепость.

EHP_Sequence, может что-то не усмотрел в триггере, там куча переменных задействована, может какая-то задействована до того, как значение получает, ну или что-то вроде того.
Попробуй использовать эту систему:
Спасибо, эта реализация наиболее близка к тому, что нужно. Но у меня не получается адекватно перенести ее на свою карту и я не понимаю, как сделать так, чтобы был доступен новый герой (25-й по счету) среди случайных.
Хмм, все равно первого героя можно нанять 100 раз.
А, сорри, разобрался. Просто при импорте эти "first random hero" перемешались, но я исправил. Теперь героев нельзя нанять 100 раз.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.