Econ dude основи створення ігор - рандом, рандомний Лут і скрині
Сьогодні ми з вами розберемо механізми лута і рандома в іграх. Продовжуємо курс - основи створення ігор.
Як працює рандом (випадкова генерація чисел) в іграх (і в програмах взагалі) і як зробити такі потрібні для RPG речі як відкриття скринь з випадковими речами.

Що таке Лут і рандом
Почнемо трохи здалеку. Loot і random, ясна річ, англійські слова.
Лут (Loot) - це нагорода, можна перевести як - трофеї. Зазвичай випадає з мобів, дається за проходження рівня або за виконання квесту.
Рандом (Random) - всі ми знаємо що таке, це випадковість. Рандомний числа, рандомний події і т.д. Ці слова вже давно в лексиконі багатьох.
Існує-ли випадковість?
Тепер давайте зробимо ще один відступ щодо ймовірності та рандома взагалі. Раніше вважалося, що випадковості взагалі не існує. Просто ми не розуміємо як щось відбувається і тому не можемо пояснити чому, умовно кажучи, випало решко або Шахтарськ.
Вважалося, що по суті справи падіння монети на одну зі сторін передбачити неможливо тільки тому, що людина не може точно розрахувати позицію монети в руці під час кидання, силу кидка і всі інші речі.
Тут насправді дуже серйозно доведеться піти в філософію, якщо ми почнемо розбирати це питання, але, що цікаво. Хоча з 19-го століття теорія ймовірності довела, що випадковості таки випадкові, в іграх і програмуванні все програми, які відповідають за генерацію випадкових чисел, дуже навіть підкоряються цілком певним законам.
Запустіть гру в game maker і пропишіть там генерацію випадкового числа, від 0 до 10. Потім запустіть її ще раз, у вас випаде то-же число якщо всі умови абсолютно рівні. Забавно як віртуальний світ абсолютно передбачуваний, а всі елементи непередбачуваності дуже навіть можна розібрати і зрозуміти що буде далі.
Ви, напевно, знаєте чи чули про таке поняття як game seed - ігрове зерно. Чули? Будь Як. Це є навіть в Minecraft. Навіщо воно потрібно? А в тому-то і сіль, що вся генерація світу буде прив'язана до конкретного зерну, і якщо знати лише одне це число - зерно, то ви можете повністю відтворити весь автосгенерірованний світ один в один!
Чи не дивно? Згенерованого мільйон різних блоків, а якщо забивати зерно = 5, завжди світ буде тим-же самим. Тому що справа не в генерації кожного конкретного блоку, вона не випадкова, а справа тільки в одному числі - загальної генерації світу. Коротше, конкретно пояснити складно, але загальний принцип я думав я доніс.
Псевдорандом
Давайте ще простіше. Будь-яке випадкове число, яке видає програма random (10) - нєфіг не випадково. Є дуже чіткий алгоритм його генерації. А це означає, що знаючи алгоритм, можна видавати завжди один результат. Якщо вам цікаві всі ці моменти, Ви повинні зайти в вікіпідію. Наприклад - випадкова величина.
Давайте згадаємо таке поняття з Доти як псевдорандом. Це означає - створення видимості рандома. Припустимо, шанс кріта = 10%. Але ми знаємо, що теоретично у нас може бути поспіль 10, 30 або навіть 10000 ударів без кріта. Є ймовірність що так буде.
Загальна ймовірність падає з кількістю спроб і падає сильно, проте чисто теоретично це можливо. Таким чином рандом, як ви можете знати і з World of Tanks - це дивна і не дуже чесна штука. Не просто так придумали Корейська і Белоукраінскій рандом.
Для подолання цього в деяких іграх придумують якийсь псевдорандом. Це коли наприклад у шансі кріта 10%, при невипадання кріта, шанс на його випадання підвищується. Здається маренням, та й до речі це нечесно, але з іншого боку, а хіба чесно якщо з 100 атак крит в 10% так і не випаде? А таке може бути.
Добре, це все була просто якась невелика теоретична база, мізки розім'яти, так би мовити. Тепер давайте приступимо до конкретного коду і подивимося як зробити скрині з рандомних лутом.
Як зробити скриню з рандомних лутом в грі (game maker studio)
Знову-ж, в якості бази я буду використовувати гру Lonely Dude. Зробив я ось що:

Нові скриньки - зліва
Смужка хіпів там не обов'язкова, вона просто показує коли він відкриється. По суті справи коли герой поруч (або його стосується), герой б'є скриню і забирає хіпи. Хіпи закінчуються - скриня відкривається.
Забули як робити смужку хіпів? Вам сюди:
- Як зробити хелсбар? Смужка хіпів в game maker
Ну особисто я так робив, способи можуть бути різні. Можна і відразу його відкрити, при торканні, але невелике очікування може бути не приємно гравцям.

Все прописав в новому об'єкті - скриня
open = 300 Просто локальна змінна, може бути будь-яка, хоч hp. В даному випадку, якщо віднімати 1 в тик, то скриня відкриється через 10 секунд.
Тут я насправді зробив без знищення, хоча випадання предметів можна було-б запхати і ось сюди.
Ось тут у нас все і лежить.

Ось код скрині з випадковим лутом:
if distance_to_object (o_hero)<5 then open-=1
if open = 0
effect_create_above (ef_ring, x, y, 1, c_red)
loot = irandom (4)
if loot = 0 instance_create (x, y, o_gold)
if loot = 1 instance_create (x, y, o_grenade)
if loot = 2 instance_create (x, y, o_shotgun)
if loot = 3 instance_create (x, y, o_ammo_4_1)
if loot = 4 instance_create (x, y, o_hp_1)
instance_destroy ()
> Взагалі, все просто. Тут ще є один стандартний ефект game maker. ну а так.
if distance_to_object (o_hero)<5 then open-=1 Это один из способов отнимать у сундука "жизни", просто если рядом с ним есть герой.
Спосіб рідко де використовується, зазвичай роблю колізію і пишуть все це там, можете зробити як завгодно. Просто при колізії потрібно затискати кнопку (йти в бік скрині), а ось так він просто відкриється через 10 секунд якщо ми поруч і все.
Основне я наробили жирним, все що нам потрібно це функція:
irandom (n) Це візьме число (n) у випадковому диапозоне. Напишемо там 10, візьме від 0 до 10, випадкове. Не забувайте що бере тут від 0.
Якщо просто напишемо random - то там будуть в тому числі і не округлені числа, не цілі. Часто цього нам не треба.
Раніше я писав round (random (n)) - щоб якраз округляти, але немає потрібні так перекручуватися.
Досить використовуватися irandom (n)
Далі просто створює приз, предмет або що хочете при кожному варіанті.
Тут 5 варіантів, шанс випадання кожного 20%.
Ще одне питання, а як зробити наприклад шанс випадання лута допустимо 5%, при тому що може випасти лише 1 тип лута. Наприклад - супер меч або щось ще круте.
Це у мене записано при смерті ворогів, записано ось так:

Ось тут вже трохи по іншому:
if random (100)> 99 then instance_create (x, y, o_gold) // 1%
if random (100)> 95 then instance_create (x, y, o_ammo_1) // 5% Знову-ж, "then" тут писати не обов'язково. Ось як-то так я раніше робив все Рандома.
Тут кидаємо кубик від 0 до 100, при випаданні числа більше 99 (95), навіть включаючи не цілі, ви створюємо наш Лут. І це все написано при смерті ворога.