Приклад використання аспекту: Мережеві NPC для автономних світових ігор

Uncle Bogdan
6 min readJan 30, 2024

--

Завдяки програмуванню Aspect ми додали повністю мережевих NPC в мережеві ігри! У цьому ігровому світі гравці можуть реєструвати свої акаунти як автоматизовані NPC-гравці, які беруть участь у битвах з іншими реальними гравцями на основі алгоритмів!

На зображенні нижче показано гру, де гравець керує персонажем 209, а гравець 24 є повністю мережевим NPC, який б’ється разом з реальними гравцями у світі Royale.

У цій статті ми надамо огляд того, як Аспекти (модулі) на Artela можуть створювати унікальні можливості для мережевих ігор, які ніколи раніше не були можливими!

Функції для повністю мережевих ігор

Після безпосередньої роботи з розробниками мережевих ігор над потенційними можливостями, що стали можливими завдяки програмуванню Aspect, давайте почнемо з висвітлення двох функцій, що привертають найбільшу увагу: виклик “точно вчасно” та високопродуктивні обчислення wasm.

Вчасні дзвінки

JIT (Just-in-time) Calla — це здатність Aspects динамічно ініціювати виклики смарт-контрактів у віртуальній машині, наприклад, EVM, під час виконання транзакції в ланцюжку, що дозволяє вставляти процеси, що діють негайно, під час виконання транзакцій в ланцюжку.

JIT-виклики забезпечують автоматизоване виконання в ланцюжку для смарт-контрактів, дозволяючи контрактам динамічно вирішувати, чи виконувати додаткові процеси в режимі реального часу.

Як показано на малюнку нижче, транзакція викликає смарт-контракт на виконання, Аспект запускається на виконання в “точках з’єднання” як до, так і після цього виконання. Потім Aspect динамічно підписує транзакцію після виконання виклику контракту; ця транзакція буде виконана безпосередньо перед наступним викликом. Оскільки немає приватних ключів для підписання транзакцій в ланцюжку, JIT Call ініціює транзакцію через базовий модуль AA Wallet.

У мережевих іграх ця функція дозволяє повністю автоматизувати ігрові контракти, автоматично виконуючи системні завдання!

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

Унікальність Аспектів в Артелі полягає в тому, що реалізація вищеописаного сценарію не вимагає модифікації ігрового контракту — Аспект може динамічно визначати операції гравця та зміни інших об’єктів до і після виконання ігрового контракту, а потім ініціювати JIT-виклики для управління цими автоматизованими об’єктами. Аспекти можуть навіть поєднуватися з агентами штучного інтелекту, дозволяючи персонажам продовжувати рости автоматично, коли гравець перебуває в офлайні.

Високопродуктивна віртуальна машина WASM

Якщо мережева гра розроблена навколо персистентного світу, то найбільшою зміною є кількість обчислень, необхідних для ланцюжка. Наприклад, якщо в ігровому світі є тисяча гравців, і кожен гравець автоматично оновлює дані про зростання в кожному блоці, віртуальна машина (EVM) повинна виконати розрахунок даних про зростання гравця 1000 разів, що створює непрактичне навантаження.

На Artela аспекти виконуються у віртуальній машині WASM, а смарт-контракти — у віртуальній машині on-chain (EVM). Ефективність виконання віртуальної машини WASM щонайменше на 1–2 порядки вища, ніж у EVM. При правильній розробці для повного використання можливостей виконання Aspect WASM, Aspect на Artela може виконувати пакетні обчислення і оновлення без порушення ігрового процесу або швидкості транзакцій, дозволяючи постійному світу в ланцюжку періодично оновлюватися автоматично!

Реальний кейс: підтримка NPC для Royale

Маючи ці ідеї на увазі, давайте розглянемо їх на реальному прикладі!

Вперше ця ідея прийшла до мене, коли я хотів зіграти в Рояль, але через те, що я жив у часовому поясі з меншою кількістю гравців, мені довелося чекати в лобі більше години. Поточна реалізація Royale вимагає, щоб гравці створювали кімнати і чекали, поки ці кімнати будуть заселені іншими гравцями, перш ніж гра може розпочатися.

Отже… ми співпрацювали з BladeDAO, щоб інтегрувати Aspect в Royale, онлайн PvP-гру, і використовували JIT Calls, щоб автоматизовані NPC могли безпосередньо взаємодіяти з гравцями.

Тож ідея полягала в тому, щоб додати до Royale групу персонажів NPC, навіть якщо жоден гравець не зайде в кімнату, гра почнеться одразу після того, як я створю кімнату — і гравці можуть приєднуватися динамічно, замінюючи NPC. У наведеному нижче прикладі я і NPC — персонажі гравців Royale, обидва під управлінням гаманців, з однаковими атрибутами персонажів — з тією лише різницею, що один з нас управляється Аспектом, а я — своїм власним EoA. Тому я можу битися в будь-який час і в будь-якому місці, не чекаючи, поки гравці приєднаються до моєї кімнати — і при цьому залишатися повністю на зв’язку.

Аспектний дизайн

Давайте подивимося, як був розроблений наведений вище приклад використання Aspect. Це дуже простий приклад, і його можна підсумувати двома основними процесами:

  1. Зареєструвати гравця

Зареєструйте гаманець в Аспекті як гравця, що контролюється Аспектом, і Аспект буде автоматично виставляти JIT-колл для цих гаманців на основі алгоритмів.

2. Точка приєднання в передконтрактному виклику

Кожна транзакція, що викликає контракт Royale, запускає Аспект до того, як контракт буде виконано. Якщо ця транзакція викликає метод переміщення гравця, вона буде використовувати зареєстрованого гравця для ініціювання виклику переміщення, контролюючи переміщення NPC.

<tx:call move>
|
| _ _ _ _ _ _ _ _ _ _ _
| | |
|--pre_contract_call--> | JIT Aspect | <------- <tx:register player>
| | |
| _ _ _ _ _ _ _ _ _ _ _
| |
v |
----------------- | <tx:call move>
| | |
| Royale |<-------------
| contract |
| |
-----------------

Знаряддя праці

Основний метод цього Аспекту полягає в наступному: цей код показує логіку виконання точки з’єднання.

Аспект оцінить дані виклику цього контрактного виклику, розбираючи метод поточного виклику. Якщо значення методу move(uint8) має хеш-значення, то він перейде до отримання sysPlayers та ініціює виклик переміщення this.doMove(sysPlayers[i], input);.

tsxCopy code
preContractCall(input: PreContractCallInput): void {

let calldata = uint8ArrayToHex(input.call!.data);
let method = this.parseCallMethod(calldata);

// if method is 'move(uint8)'
if (method == "0x70e87aaf") {
let currentCaller = uint8ArrayToHex(input.call!.from);
let sysPlayers = this.getSysPlayersList();
let isSysPlayer = sysPlayers.includes(this.rmPrefix(currentCaller).toLowerCase());

// if player moves, sys players also move just-in-time
if (!isSysPlayer) {
// do jit-call
for (let i = 0; i < sysPlayers.length; ++i) {
this.doMove(sysPlayers[i], input);
}
} else {
// if sys player moves, do nothing in Aspect and pass the join point
return;
}
}
}

У методі doMove Аспект ініціює JIT-виклик, спочатку випадковим чином вибравши напрямок руху, а потім побудувавши дані виклику.

Використовуючи JitCallBuilder для створення запиту JIT Call, JIT Call ініціюється через sys.hostApi.evmCall.jitCall(request). Це синхронний запит; він повернеться після завершення цього виклику, після того, як персонаж переміститься в ігровому контракті Royale.

tsxCopy code
doMove(sysPlayer: string, input: PreContractCallInput): void {
// init jit call
let direction = this.getRandomDirection(input);

let moveCalldata = ethereum.abiEncode('move', [
ethereum.Number.fromU8(direction, 8)
]);

// Construct a JIT request (similar to the user operation defined in EIP-4337)
let request = JitCallBuilder.simple(hexToUint8Array(sysPlayer),
input.call!.to,
hexToUint8Array(moveCalldata)
).build();

// Submit the JIT call
let response = sys.hostApi.evmCall.jitCall(request);

// Verify successful submission of the call
sys.require(response.success, `Failed to submit the JIT call: ${sysPlayer}, err: ${response.errorMsg}, ret: ${uint8ArrayToString(response.ret)}`);
}

Більше, ніж NPC

Як би просто це не звучало, описаний вище Aspect є повним процесом — від ідеї, дизайну до реалізації повністю мережевої гри з підтримкою мережевих NPC. Те, що НІКОЛИ не було можливим раніше.

Аспекти можуть не тільки привнести автоматизацію та високопродуктивні обчислення в мережеві ігри, але й композиційність в AW! У наведеному вище прикладі Royale процес додавання NPC не змінив ігровий контракт Royale, а це означає, що NPC і персонаж гравця фактично є одним і тим же типом гравця з “точки зору” гри.

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

Ознайомтеся з цим прикладом за посиланням: JIT Royale.

Якщо ви зацікавлені у створенні наступного покоління мережевих ігор разом з Artela (а якщо ви все ще читаєте цю статтю, то ви точно зацікавлені), приєднуйтесь до нашого Порталу розробників, Discord, X та пишіть нам на info@artela.network. Ми з нетерпінням чекаємо на співпрацю з вами!

--

--