Sidebar

Очень сложный(наверное) алгоритм рандомизации

-BlackHawk-

EVOPLAY IS BACK
29.04.11
252
29
0
0
Moscow
Очень сложный(наверное) алгоритм рандомизации

Итак, представим что у меня есть 48 различных картинок.
Среди этих 48 картинок существует примерно 20 картинок в единичном экземпляре а остальные 28 повторяются только 1 раз(т.е. двойной экземпляр). При этом среди 20 картинок в единичном экземпляре существует еще 10 единичных VIP-картинок.

Далее, представим что у меня есть 10 телевизоров, среди которых есть один VIP-телевизор. И я хочу чтобы при активации моего триггера происходил такой алгоритм:
- в первом телевизоре отображается рандомная картинка из 48 оставшихся
- во втором телевизоре отображается рандомная картинка из 47 оставшихся, при этом, она не должна повторяться с первой!
- в третьем телевизоре отображается рандомная картинка из 46 оставшихся, при этом, она не должна повторяться с первой и второй!
...и так далее до десятого телевизора.
- в десятом, VIP-телевизоре, может отобразиться только одна из 10 VIP-картинок, при этом она, конечно же, не должна повторяться с теми, которые уже могли появиться на предыдущих 9 телевизорах. То есть, должна быть реальна ситуация, когда на всех 9 обычных телевизорах появились VIP-картинки.

Затем, у меня есть возможность один раз активировать второй свой триггер для каждого телевизора.
Его алгоритм должен быть следующим(тут у меня 2 варианта):

I вариант:
- На каждом телевизоре, кроме VIP, я могу нажать, например, на красную кнопку, и после нажатия картинка на этом телевизоре должна смениться на любую из оставшихся 28-38 картинок, так как 10 картинок уже были использованы в первом триггере и еще максимум 10 могут быть использованы. На VIP-телевизоре же кнопка должна выполнять ту же функцию, но выбирать только из оставшихся VIP-картинок(мог ошибиться в подсчетах на единичку, хочется спать, извиняйте :roll: )

II вариант:
- На каждом телевизоре я могу нажать, например, на красную кнопку, и таким образом отметить все телевизоры,
картинки на которых я хочу поменять. Затем нажать, например, на оранжевую кнопку(она одна) и после этого все картинки на отмеченных телевизорах сменятся на те, которые еще не были использованы.

Второй вариант кажется мне более геморным, возможно, я ошибаюсь.

Я подготовил специальную тестовую карту, на которой я буду пытаться воплотить сей алгоритм в жизнь. Карта будет прикреплена ниже(сделана в CS:GO SDK, но, по-моему, там ничего страшного не случится, если открыть ее через Source SDK). Можете не пытаться запустить карту, она создана для того, чтобы вам был наглядно понятен мой алгоритм. Увидеть его в действии пока что не получится.

Теперь перейду к вариантам реализации этого алгоритма в SDK. Распишу по пунктам:

1. С помощью logic_auto и OnMapSpawn проводим 9 раз событие PickRandom в главном logic_case(case1).
2. В этом logic_case(case1) делаем Output'ы: OnCase1, OnCase2, Oncase3 и ставим TargetEntity img_case[1,2,3], передавая им значение: PickRandomShuffle, а также добавляем к счетчикам math_counter[1,2,3] по единичке(об этом ниже)
3. В каждом из трех logic_case(img_case[1,2,3]) добавляем 16-событий OnCase1,2,3...16.
4. Каждое из событий отвечает за появление картинки, переключая ее из невидимого состояния в видимое с помощью func_wall_toggle(img1_[1,2...48]).
5. Создаем 48 картинок, условно даем им статус func_wall_toggle.
6. Создаем 9 телевизоров, условно даем им статус func_wall.

В итоге получается, что при запуске карты мы выберем 9 картинок, повторяться они не смогут никак(кроме тех, которые в двойном экземпляре) и потом нам нужно как-то эти картинки поместить на место телевизоров. Если же делать картинки через func_wall_toggle на месте телевизоров, то это нужно 48*9 = 400+, по сути, одинаковых func_wall_toggle.
Так вот я уверен, что есть путь проще, но мне нужна помощь с размещением этих картинок.

Не забывайте, что у нас еще должна быть возможность поменять максимум 1 раз каждую из картинок на еще неиспользованную. Тут в дело первыми вступают счетчики math_counter[1,2,3]. Они отслеживают сколько картинок из img_case[1,2,3] было уже использовано. Таким образом, каждый из этих logic_case может активироваться максимум 16 раз(16 картинок) и если каждый пронумерованный math_counter при достижении числа 16(напомню, мы прибавляем по единичке за каждое срабатывание img_case[1,2,3]) будет уничтожать тот или иной img_case[1,2,3], то картинки никак не смогут повториться.

Продолжая тему смены картинки на другую, я предложу свой алгоритм ниже(этого пока нет на тестовой карте):
1. Создаем еще 9 штук logic_case и нумеруем их.
2. Создаем 9 кнопок рядом с каждым телевизором и также нумеруем их.
3. Пусть, при нажатии на кнопку #2 мы передадим событие PickRandom в case1.
4. Также, при нажатии на кнопку #2 мы удалим с televisor2 картинку, которая там была до нажатия.

Таким образом, мы снова выберем неиспользованную картинку и остается лишь вопрос: как ее запихнуть на место televisor2?

VIP-картинки и VIP-телевизор я пока что не трогаю, алгоритм их размещения теоретически не должен сильно отличаться от предыдущих, а расписывать его тут отдельно мне не очень хочется.
На карте-примере я VIP-телек воткнул просто чтобы не забыть про него c:

Ну, вроде ничего не забыл и все грамотно объяснил.
Если есть вопросы по алгоритму - спрашивайте.

Надеюсь на помощь очень грамотных мапперов!
 

Вкладення

Останнє редагування:

Cavador

New member
08.12.07
1 366
13
0
-BlackHawk- сказав(ла):
Так вот я уверен, что есть путь проще, но мне нужна помощь с размещением этих картинок.

Надеюсь на помощь очень грамотных мапперов!
ну и шарада однако...
да, вероятно анимимрованная текстура - с выбором нужных фреймов гораздо проще, я так часы с циферблатом делал.

2 %)

Post automatically merged:

как реализовать механизм исключения я никогда не задумывался. может создание обьектов логики с исключениями где массив поиска рандома происходит только среди "включеных" вариантов.

Post automatically merged:

а тестового исходника в тексте таки нету
 
Останнє редагування:

-BlackHawk-

EVOPLAY IS BACK
29.04.11
252
29
0
0
Moscow
Cavador сказав(ла):
ну и шарада однако...
да, вероятно анимимрованная текстура - с выбором нужных фреймов гораздо проще, я так часы с циферблатом делал.
Нужен пример :c


Cavador сказав(ла):
Post automatically merged:

а тестового исходника в тексте таки нету
Уууупс, исправил!
 

-BlackHawk-

EVOPLAY IS BACK
29.04.11
252
29
0
0
Moscow
Cavador сказав(ла):
Посмотрел примеры какие-то, уяснил только то, что в .vmt файле моей текстуры надо что-то дописать/прописать и только после этого эта энтитя будет нормально работать.

У меня тут возникла другая идея, а можно ли func_wall_toggle, скажем, телепортировать на место телевизоров?
Просто не знаю, какой из этих вариантов проще реализовать будет.

upd:
Нашел еще в одном туторе вот такую фразу и не могу догнать что в этой строке имеется в виду:
-In this case there's a func_button that switches its own texture via an env_texturetoggle, but it's also possible to let a func_button switch a texture on an external entity such as a func_wall via an env_texturetoggle.
Если что вот линк на этот тутор.
 
Останнє редагування:

Cavador

New member
08.12.07
1 366
13
0
2 -BlackHawk-:
надо скомпилировать ее как анимированную текстуру, перед этим написав vmt и сохранив картинки, точно не помню но что то вроде картинка000.vtf картинка001.vtf картинка002.vtf

что то типа " в данном случае это фак баттон переключать текстера с помощью енв текстуретоггле но так возможно дать фак баттон переключать текстуру на внешней ентити такой как фак_валл с помошью текстуретоггле" да ерунда какая то типа можно не только на фак баттоне размещать текстуру, есть еще и наши туторы во всякмо случше были... .
 

-BlackHawk-

EVOPLAY IS BACK
29.04.11
252
29
0
0
Moscow
Так, ну вроде разобрался. Анимированную текстуру создал, с env_texturetoggle подключил и все более-менее работает.
Есть еще один вопрос: каким образом можно передать текстуру с телевизора на какое-нибудь другое место на карте? Или же проще: как переместить func_wall в другую точку на карте(через info_teleport_destination, например)?

И еще один вопрос, если я помощью условного logic_case1 спровоцирую событие, скажем OnCase02, в logic_case2, то если я потом с помощью logic_case3 передам событие PickRandomShuffle в logic_case2, то он же никак не сможет выбрать событие OnCase2? Ну точнее не сможет выбрать до тех пор, пока не переберет таким вот shuffl'ом все оставшиеся case'ы?
 
Останнє редагування:

Cavador

New member
08.12.07
1 366
13
0
2 -BlackHawk-:
1:через settextureindex в texturetoggle :bigsmile:

2: мне кажется, что изначально проблема в том, что в ладжик кейс 16 вариантов, и выбрать рандомный можно среди этих 16 вариантов, а как ты писал у тебя 48 картинок и еще половина пробудблирована, что получается 48/2 = 24
24(1картинка) + 24*2(дуюлированная) = 72 варианта если правильно посчтал) + 10 вип мы помним, но трогать не будем, вторая проблема если бы - у нас был БЫ кейс на 72 варианта ну или допустим те же 48 ( без дублирования половины вариантов) то в этом кейсе на 48 вариантов выбор идет всегда между 48 вариантами, там вроде нет функции исключения, то есть если мы выбрали из 48 кнопок, то нам нужен следущий кейс на n-1, или функция которая проверит был ли выбран этот вариант и запустит в этом случае механизм по новой. Надеюсь понятно, что картинки выбираются все равно по порядку - 1,2,3.. 9
можно впринципе просчитать все 48*48~>1600 вариантов, и выдавать случайную комбинацию через решето лоджик кейсов,.
но мне кажется такие вещи пишуться отдельным плагином, потому, что движок игры не сильно заточен под использования сотен ентить.
 

Game Server

Доноры Красавчики

Користувачі онлайн

Немає користувачів онлайн.