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

Принятый ответ

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
12
5 лет назад
0
Я ещё скажу, что патч 1.30.2 (последний), вдруг это тоже влияет (у многих здесь другие патчи).
Steal nerves, спасибо, дома посмотрю.
Steal nerves:
у меня все работает, скидываю карту
а точняк, эта штука работает (прячет), если ты заказал. А когда цель (даймик) умирает, у тебя заново появляется. А ты его сразу убиваешь, поэтому и заказать можно дохера
Т.е. даммику надо дать москитов и не убивать после выхода?
0
27
5 лет назад
Отредактирован MpW
0
EHP_Sequence, ну ReplaceUnit (это удаление старого и создание нового юнита, там BJ-функцию раскрути).
Т.е. даммику надо дать москитов и не убивать после выхода?
я бы все равно бы их удалил бы. Но все равно, это надо счетчиком учитывать (спец триггером ловить заход героев на карту, и лимитировать это). Счетчиком проверяешь, если героев стало 2, лимит стал 1. Поскольку, еще ты можешь не только в алтаре, но и в нейтральном магазине нанять.
надо все продумать короче (там же есть события начинает тренинг +1, отменяет тренинг -1, завершает тренинг)

чего туплю. есть лимит на героев. делай даймиков героями. Удаляешь их. И создаешь нужных. Все.
0
3
5 лет назад
0
Я когда то давно делал подобную тему, но боты наотрез отказывались управлять рандомным героем не своей расы. Сейчас мне стало просто интересно: а мог ли я все-таки настроить это?
0
27
5 лет назад
Отредактирован MpW
0
вам нужно чтобы никто не мог его выбрать (точнее не выпадала дважды)? тогда нужен другой подход - логическая массивная переменная 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
2
24
5 лет назад
Отредактирован prog
2
Steal nerves, вот только вместо перебора всего массива лучше хранить кол-во доступных героев, делать одну случайную выборку из массива, уменьшать кол-во доступных на 1, а выбраную ячейку менять местами с последней. Иначе есть риск очень долго нарываться на занятые ячейки, вплоть до прерывания потока по лимиту операций (сам в это вляпывался когда начинал, очень неприятно потом искать причину по которой иногда героев отказывается спавнить на ровном месте).
1
48
5 лет назад
1
А не проще сделать тупо поочередную покупку, и при покупке удалять уже купленных героев? В выборе рандома перебрать максимальное значение, так к примеру было 24 перса, выбрали скажем паладина, который 22, делаем перерасчет уже на 23 и 22 перс будет 23, скажем так заполнение пустых ячеек.
0
27
5 лет назад
0
N7 Molot, хотел предложить это
0
26
5 лет назад
0
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.
0
27
5 лет назад
Отредактирован MpW
0
при старте карты (заполняем базу данных, вбиваете типы):
//стандартный неизменчивый список
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
0
26
5 лет назад
0
Steal nerves, так у него есть в триггерах и база, и счётчик, но не работает обнуление лимита. Если же делать просто замену героя через Replace (на патче 1.26а), то лимит на второго героя теряется, сразу надо строить Замок. То есть, например, есть Ратуша, нанимаю героя и заменяю его после найма на случайного, следующего героя позволяет нанять только при Замке, минуя Крепость.

EHP_Sequence, может что-то не усмотрел в триггере, там куча переменных задействована, может какая-то задействована до того, как значение получает, ну или что-то вроде того.
Попробуй использовать эту систему:
Загруженные файлы
Принятый ответ
4
8
5 лет назад
4
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
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.