CSM.Dev

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

Итак, представим что у меня есть 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:

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

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