S náhodností byly vždy problémy. My si s ní ale poradíme a hned si ukážeme dvě možnosti, jak vyrábět věci ovlivněné náhodou.
Varianta č. 1 - Laser
První možností, jak docílit náhodnosti, je použití entity, která sama podporuje náhodnost - laseru, konkrétně env_beamu. Využijeme jeho vlastnosti mířit do náhodně zvoleného cíle a vlastnosti ubírat hp. Vytvoříme cíle info_target a mezi tyto cíle a env_beam dáme button_targety, které se sepnou, pokud jimi projde paprsek. Jak to bude vypadat v praxi?
Řekněme že máme 9 beden na kterých chceme nechat otestovat náhodnost - chceme aby se náhodně rozbily. Vyrobíme tedy env_beam a nastavíme ho:
Name: beam
Start Entity: beam
Ending Entity: bcil
Damage / second: 1
Ještě se podíváme do Flags a zaškrtneme Toggle a Random Strike.
Přidáme multi_manager se jménem nahoda a vložíme do něj tyto hodnoty:
beam 0
beam#1 0.1
Je to kvůli tomu, aby se nám nerozbily všechny bedny najednou.
Nyní vytvoříme arch o 9 stěnách. Nastavíme jim správnou šířku, abychom vytvořili takovou obruč kolem našeho env_beamu. Vyrobený arch rozložíme na jednotlivé dílky přes Ungroup. Postupně ze všech po jednom uděláme button_target. Ke každému nastavíme jiný target, kterým bude jedna z devíti beden. Nakonec vytvoříme 9x info_target se jménem bcil, který bude vždy za button_targetem, aby se aktivoval jeho cíl. Teď stačí už jen vytvořit tlačítko nebo trigger, které bude spouštět celý mechanismus (bude aktivovat multi_manager nahoda).
Po stisknutí tlačítka se aktivuje multi_manager, který aktivuje a hned deaktivuje env_beam, který probleskne mezi sám sebou a jedním z devíti cílů. Protože beam ubírá hp, tak aktivuje button_target, který mu stojí v cestě. Button_target už jen rozbije příslušnou bednu.
Varianta č. 2 - Počítadlo
Další možností, jak docílit náhodnosti, je zapojit do skriptu hráče. Můžeme rozmístit po mapě spoustu triggerů, které budou měnit cíle, ale to by nebylo spolehlivé, takže si použijeme jeden trigger_multiple, který nám bude spínat "počítadlo" - sadu game_counterů, které budou postupně měnit cíle tlačítku, kterým budeme nakonec rozbíjet bedny. Bude to ale ještě o něco těžší, ale snad to nějak zvládneme.
Řekněme že máme dalších 9 beden co čekají na náhodné rozbití. Vytvoříme si trigger_multiple, který bude udávat "tik" celého skriptu. Dáme ho kolem tlačítka tak, aby každý, kdo bude chtít zmáčknout tlačítko, musel do něj vejít. Nastavíme mu Target na pocitadlo a Delay before reset na 0.05, ať není poznat, že to ve skutečnosti není náhodné.
Nyní vytvoříme 9x game_counter, nastavíme jim Limit Value na 9 a zaškrtneme ve Flags Reset on fire. Budeme jim nastavovat Name na gc1 až gc9 a Target na cht1 až cht9, takže první game_counter bude mít jméno gc1 a cíl cht1, druhý gc2 a cíl cht2, třetí gc3 a cht3, atd.
Dále vytvoříme 9x trigger_changetarget s Target na tlacitko. Name jim nastavíme cht1 až cht9. Do New Target přijdou jména jednotlivých beden.
Tím to ale nekončí - 8x (ano, osmkrát) vložíme game_counter_set s Name init. Target jim nastavíme na gc2 až gc9. Do New Value dáme 1 až 8. První game_counter_set pak bude mít target gc2 a new value 1, druhý gc3 a 2, třetí gc4 a 3, až do osmého gc9 a 8.
Aby toho nebylo málo, přidáme trigger_auto (trigger co se spustí pouze jednou a to při zapnutí mapy) s Target na init.
Něco nám tu ale pořád ještě schází - ano, ve správném skriptu by měl být multi_manager! Přidáme ho, nastavíme mu jméno na pocitadlo a nasázíme do něj hodnoty gc1 až gc9, všechny s prodlevou 0, tzn:
gc1 0
gc2 0
gc3 0
...
Teď už by to mělo být opravdu všechno, takže přidáme tlačítko se jménem tlacitko a máme hotovo!
Co se ale vlastně děje? Máme 9 game_counterů, každý se aktivuje když dosáhne hodnoty 9. Při startu mapy jim nastavíme pomocí game_counter_set určitý "offset", aby se spouštěly posupně. Trigger_multiple tedy spustí každých 0.05 sekundy přes multi_manager všechny game_countery, které mění přes trigget_changetarget cíl tlačítku. Pak už jen stačí zmáčknout tlačítko a ono rozbije tu bednu, kterou má zrovna v targetu.
Závěr
Jakou variantu tedy použít? Obě varianty mají určité výhody a nevýhody.
Výhody varianty "laser":
> Je jednodušší.
Výhody varianty "počítadlo":
> Skládá se převážně z point entit.
> Hodí se na změnu targetu jakékoli entitě, např. teleportu.
Nevýhody varianty "laser":
> Skládá se i z brushových entit.
> Pokud víte, kde se obruč z button_targetů nachází, můžete je aktivovat tím že je trefíte skrz zeď.
Nevýhody varianty "počítadlo":
> Je hodně těžká.
> Teoreticky by mohla způsobit lagy, protože každých 0.05 se spouší 10 entit, ale mělo by to být zanedbatelné.
S náhodností vždy byly a jsou problémy. Pro ty co měli problémy s tvorbou i pro všechny ostatní máme příkladovou mapu. |