Закрити старий гештальт. Як я почав робити гру, про яку мріяв ще у 90-х

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини про геймдев.

Це була середина 90-х. Я вчився в училищі... скажемо так, на професію, пов’язану із виробами з дерева. Як столяр, тільки краще. Подробиці, думаю, не потрібні і нецікаві.


В кабінеті інформатики в нас стояли Електроніка МС-0511 УКНЦ. Можливо в когось в 90-ті кабінет інформатики був оснащений IBM-сумісними комп’ютерами (кляті мажори), але це не про моє училище. Я вечорами йшов і грав в УКНЦ. І вивчав Бейсік-Вільнус, єдину мову програмування, яка була доступною на той час.

Програмування дійсно захопило мене, і я потроху переходив від простих задач до спроб створити свою гру. І обов’язково з графікою, як GARDEN, LAND3 чи Кіт-Рибалка.

Гра Land, сплагіачений Lode Runner

І тут мене спіткав облом. Засобами Бейсіка графіка малювалася надзвичайно довго. CIRCLE, LINE та DRAW навіть поодинці виконувалися нешвидко, а в простенькій сцені гри їх мало бути більше сотні!

(Мені подобалося робити програму, яка малює в центрі екрану круги все більшого і більшого радіуса. Це було схоже на торнадо).

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

Це було цікаво. Вивід в текстовому режимі набагато швидший, і саме так можна зробити свою гру! Коли я спитав вчителя інформатики, як це зробити, у відповідь він подивився втомленим поглядом і промовчав.

Але в Бейсіку була команда POKE! Вона дозволяла писати щось довільне у довільне місце пам’яті.

«Якщо шрифти є, значить вони десь у пам’яті!» — подумав я. І вирішив писати в різні місця пам’яті, доки шрифт не зміниться. Старанна дитина.

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

Через багато років я вирішив закрити цей гештальт. В мене був емулятор УКНЦ і сучасні засоби програмування, які мали б спростити задачу.

Першим я спробував зробити те, що мені прийшло в голову вже після поламки дисковода: вивести на екран бітову мапу пам’яті. Таким чином я відразу побачу, де саме зберігається шрифт, і це набагато легше того способу, яким я шукав шрифта в училищі.

Виправивши безліч документованих помилок і спіймавші ще деякі недокументовані я зрозумів: малювання бітової мапи засобами Бейсік-Вільнюс займе надто багато часу. Лише замалювати екрана через PSET займає більше години, якщо задіяні ще якісь операції.А це треба буде робити багато разів! Нє, я нє.

І я вирішив просто зберегти пам’ять у файл.

10 open «mmmm.txt» for output
15 REM відкрили файл для запису
20 a=0
25 REM адреса, з якою починаю читати пам’ять
50 print a
55 REM пишу, щоби було понятно, що прога не зависла, а працює
60 print# m=peek(a)
65 REM пишемо в файл те, що зчитали з пам’яті
70 a=a+1
75 REM тут все пінятно
80 goto 50
85 REM зациклили, бо все одно як дійде до кінця, так з помилкою відвалиться

Далі почався мій перший досвід на Пітоні: я зробив з дампа бітову мапу пам’яті.


І... не знайшов на ній літер.

Ок, гугл, з якої адреси в пам’яті знаходяться шрифти?

А замість вигляду шрифтів, виходить, я отримую нулі. Ось, тут, в червоній зоні мають бути літери, а їх нема.


Облом.

І тут мені прийшов до голови ПЛАН Б. Я багато разів бачив, як в УКНЦ якоюсь програмою міняли шрифти і сам навіть так робив. А що, коли той файл шрифту можна модифікувати?

І я написав програму, що переводить шрифтовий файл в графічний формат.


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


Я швидко написав програму на пітоні, яка розбирала шрифт на окремі літери у форматі PNG. Зі збиранням трохи забарився: пітон кодує строку в байти не один до одного, а беручи за основу якусь кодову сторінку. Основа UTF-8 додає зайві байти в неочікуваних місцях, а koi8-r чи ascii відвалюються з помилкою, якщо байта нема в кодовій сторінці.

Я вже збирався додавати пітонові нову кодову сторінку, але .encode(‘raw_unicode_escape’) спрацювало, як слід.

То не глюки, то тестові спрайти замість літер

Перше тестування відбулося успішно.

Це тест спрайтів.

А це як виглядала програма для тесту. (Перша строка була під номером 10, але я перейменував, щоби... а, вже не важливо).

Ну... все готово, аби починати робити гру «Стугна».

До речі, я спочатку хотів зробити клон гри «Марс». Але то було би цинізмом робити гру про бомбардування, коли росіяни бомблять українські міста, тому — «Стугна».

О, до речі, ви можете зробити донат, аби гра «Стугна» вийшла швидче і я точно її не закинув.

Способ донату раз: www.paypal.com/...​d_button_id=YSVG74K2BR3LA

Способ донату два: 4731 1856 2945 5376 (приват)
Способ донату три:
0×63d85EFB8FC4a1e7Eb4341F78e9471697a34B04B (Етеріум)

ypub6XcKHVT5RjVLfsMF3Gj3EuYLcEmyfqc1y68Vi45rgkAdS6Mvj7m5CpEzaeWQYxVaQFz6VetGnGJ1TreKyAMt5ytfnHATmHjrCwBMsSvfwLm (Біткоїн BIP49)

zpub6rSabA7zaR2pXAYMsdWfSzdqnCvRcTbWtCeiVSyk4kYWVCB9ymvdpsu8brTzYs9Vou6uF8UqEveZM9FtgrmttDaGecrtMCZLUfF1FwAGTnk (Біткоїн BIP84)

Ltub2ZoddKHBpN7Y3HSycBrVXf4xJJFijSC3E6jdJT93312Xgrj5jt9ZVj9EX9kmNVGzkRu2yMswKPYUGSMaCBm2DmmHxJBWhiYnSmPSQfqGAr9 (Лайткоїн)

👍ПодобаєтьсяСподобалось4
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Тоді ще тоді можна було писати на ASM маленькі швидкі підпрограми (робота з графікою або копіювання частин пам’яті) через Basic DATA/READ/POKE/USR а більшу частину коду — на Basic ... знову ж, не знаю щодо можливостей Вільнюс Basic. На УКНЦ PDP-11 подібний процесор, так що теж має бути цікаво.

Здається, ще був такий hint в Basic як використовувати керуючі коди (декілька backspace та LF) та конкатенацію/додавання за допомогою CHR при виводі «спрайту» замість додаткового locate. А ще, такий «спрайт» зберігали у строковій змінній. І тоді виходило щось на кшталт LOCATE X, Y: PRINT A$ ... не скажу точно тільки чи працює це на Basic УКНЦ.

це про грабувати каравани?

Підписатись на коментарі