Автор Тема: [ZX Spectrum] Диктатор (политическая стратегия) - расширение контента  (Прочитано 2727 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
Диктатор 2.0

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

За основу была взята русифицированная версия оригинальной игры "Диктатор", причем прямиком с магнитофонной кассеты. Надо так понимать, что русифицировал ее Н. Родионов, но копирайт не сохранился. Были исправлены баги игры, добавлены всевозможные улучшения и существенно расширен контент.

Изменения:
1. Добавлен выбор сложности игры (Легко, Нормально, Сложно). Нормально - как и было раньше.
2. Переработан движок, в результате чего добавление новых квестов стало проще.
3. Расширен контент более чем в два раза.
4. Новый блок решений - внешняя политика.
5. Исправлена серия ошибок оригинальной игры.
6. Можно получать ежемесячные доходы, а не только расходы (в оригинале доходы обнуляются).
7. Улучшения в интерфейсе.

Скриншоты:

В архиве из вложения образы для эмулятора.

Вариант сборки вместе с эмулятором (не требует отдельной установки эмулятора для игры, запустить start.cmd): https://yadi.sk/d/K1peCZ_MezSzo

Если эмулятор ZXMAK2 не запускается, то решение тут:

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2461
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Эх, я в детстве постоянно в неё рубился. Одна из самых моих любимых игр... Вот бы кто её на NES запилил...

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5144
    • Просмотр профиля
Вот бы кто её на NES запилил
С исходным кодом это не должно быть проблемой, особенно, если писать на C. Каркас для вывода графики, а остальное адаптация логики. Только мало у кого будет желание.
UPD: Я так понял здесь Basic, программа Arigato показала какой-то код. Это бы сначала перевести на нормальный язык под современный компьютер. Впрочем, уже делали ремейк под C#: https://github.com/sfvicente/Dictator (логика погрязла под кучей абстракций) и C: https://github.com/kastian/Dictator (https://lowres.inutilis.com/programs/?lccpost=zXjafzcY90).
« Последнее редактирование: 13 Май 2023, 03:44:10 от Sharpnull »

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
Да, Dictator написан практически полностью на BASIC, за исключением некоторых визуальных эффектов, которые записаны в машинных кодах. Но на эмуляторе ZX Spectrum игра отлично играется, перевод ее под NES разве что немного подтянет графику. Но так как игра квестово-текстовая, то это не столь принципиальное улучшение, графики там по минимуму.

Оффлайн g00db0y

  • Пользователь
  • Сообщений: 20
    • Просмотр профиля
За основу была взята русифицированная версия оригинальной игры "Диктатор", причем прямиком с магнитофонной кассеты. Надо так понимать, что русифицировал ее Н. Родионов, но копирайт не сохранился


Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
g00db0y, а можно образ этой версии игры? Так как у меня стартовый экран отличался, возможно, и перевод другой.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5144
    • Просмотр профиля
На счёт ремейка на C (https://github.com/kastian/Dictator), там только вывод текста через ncurses, поэтому нет графики и звука. Смог скомпилировать через MSYS2 под Windows после некоторых изменений. После включения предупреждений компилятора обнаружил ошибку в assasination.c:
(ARMY->status == PEASANTS->status == LANDOWNERS->status == 'A')     /* If all ritumbans people dislike you */Это одно из условий проигрыша и оно всегда false (т. е. уже не влияет). Человек пытался разом проверить состояние, но нужно:
((ARMY->status == 'A') && (PEASANTS->status == 'A') && (LANDOWNERS->status == 'A'))Там всё равно код разгребать, например, везде int, не понятно сколько достаточно - 16 бит или 32.
« Последнее редактирование: 13 Май 2023, 22:52:02 от Sharpnull »

Оффлайн Lunar Laser

  • Пользователь
  • Сообщений: 82
    • Просмотр профиля
Эх, я в детстве постоянно в неё рубился. Одна из самых моих любимых игр... Вот бы кто её на NES запилил...

А существует ли какой-нибудь кросс-компилятор Бейсика на PC для NES?

Добавлено позже:
А то вопрос шире, чем портирование одной игры.

На Спектруме на Бейсике можно найти и другие экономические стратегии, которые можно (?) портировать.
« Последнее редактирование: 22 Май 2023, 04:16:14 от Lunar Laser »

Оффлайн SPOT

  • Пользователь
  • Сообщений: 574
    • Просмотр профиля
На самой NES есть BASIC))

Оффлайн Lunar Laser

  • Пользователь
  • Сообщений: 82
    • Просмотр профиля
На самой NES есть BASIC))

Есть вопросы по функционалу Бейсика, который есть для Famicom. Но это отдельная тема.

Вопрос про кросс-компилятор всё равно остаётся первичным.

Добавлено позже:
Есть кросс-компилятор для различных 8-битных компьютеров от Commodore, называется "XC=BASIC".

К нему пару-тройку лет назад хотели прикрутить поддержку NES. Хотели, но вроде не прикрутили.
« Последнее редактирование: 22 Май 2023, 14:37:36 от Lunar Laser »

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
На самой NES есть BASIC))
Интересный Бейсик. В свое время писал на нем программы в версии для Сюбора, там два Бейсика: G-BASIC, который подходит для игр и F-BASIC для вычислений. В G-BASIC кое-какие игрушки удавалось запрограммировать, но там все очень медленно работает и наборы тайлов фиксированы. А на F-BASIC делал программы для научных расчетов, когда под рукой других инструментов не было.

Оффлайн Lunar Laser

  • Пользователь
  • Сообщений: 82
    • Просмотр профиля
Интересный Бейсик. В свое время писал на нем программы в версии для Сюбора, там два Бейсика: G-BASIC, который подходит для игр и F-BASIC для вычислений. В G-BASIC кое-какие игрушки удавалось запрограммировать, но там все очень медленно работает и наборы тайлов фиксированы. А на F-BASIC делал программы для научных расчетов, когда под рукой других инструментов не было.

Я так понимаю, там не переопределить базовый набор тайлов и спрайтов и шрифты тоже не добавить. Наверняка отводится мало памяти на код. PEEK и POKE там ведь тоже нет?

Итого, проблематично портировать туда экономические стратегии со Спектрума, разве что с сильно изменённым визуалом, собранным из базового набора тайлов, и с урезанным функционалом (а он и на Спектруме не обширен - лишнего нет), из-за малого объёма RAM.

Не, кросс-компилятор нужен, чтобы не париться о мелочах.

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
Я так понимаю, там не переопределить базовый набор тайлов и спрайтов и шрифты тоже не добавить. Наверняка отводится мало памяти на код. PEEK и POKE там ведь тоже нет?
Да, тайлы зашиты в ПЗУ. PEEK и POKE, на сколько помню, нет. Памяти под Бейски вроде бы 4 Кб было, но могу ошибаться. Это значит на картридже стояло расширенное ОЗУ, ведь еще можно было нарисовать один экран и его выводить программно.

Итого, проблематично портировать туда экономические стратегии со Спектрума
Решил в качестве практики переделать Dictator под NES. Писать буду на Ассемблере. Перенес шрифт в формат для NES:


Русские буквы выдрал из самого русифицированного Диктатора, а английские из ПЗУ Спектрума, только утолщил их, чтобы имели полужирное начертание, как и русские.

Еще много свободного места для графики, да и некоторые символа в русском и английском вариантах имеют общее начертание, то есть при необходимости можно эти места использовать для графики, тем более что Ассемблер позволяет делать перекодировку символов, то есть не важно, как они размещены в таблице тайлов, в редакторе текст можно писать в ASCII, а Ассемблер сам перекодирует.

Вопрос, как лучше переносить игру, максимально сохраняя стиль оригинала или улучшать графику и прочее?
« Последнее редактирование: 25 Май 2023, 13:35:51 от Arigato »

Оффлайн Lunar Laser

  • Пользователь
  • Сообщений: 82
    • Просмотр профиля
Вопрос, как лучше переносить игру, максимально сохраняя стиль оригинала или улучшать графику и прочее?

Ну, я не знаю. И вообще я думал больше в сторону не Dictator, а целого ряда других подобных игр. И в сторону поиска кросс-компилятора Бейсика, ибо в ассемблерах почти не шарю.

По графике Dictator не мне рассуждать, лучше найти NES-художника (на форуме вроде были) и посоветоваться с ним, с его вИдением.

Можно для начала портануть не Dictator, а "Королевство Зерна" из первого тома "Как написать игру для ZX Spectrum". Только там вроде есть ошибки в исходнике.

Попытаться прикрутить к этому "Королевству" симпатичную "средневеково-фэнтезийную" графику, определиться с визуальным стилем для таких игр в версии для NES, а дальше плясать уже от этого.

Добавлено позже:
Можно даже сделать "Королевство" расширенным не только графически.

Добавлено позже:
UPD: Я так понял здесь Basic, программа Arigato показала какой-то код. Это бы сначала перевести на нормальный язык под современный компьютер.

Я знаю, что ты уже опытный программист.
Имея бэкграунд, изучить Spectrum Basic у тебя займёт дней 6. Ещё дней через 8 - 12 сможешь разбирать исходники игр, написанных на Бейсике. Скачай книгу "Как написать игру для ZX Spectrum", первый том (Бейсик), издательство Питер.

Понятно, что для людей, ранее не сталкивавшихся с программированием, освоение этой книги и разбор исходников потребуют куда больше времени. Хотя она доступна для начинающих. В конце книги есть довольно нормальный справочник по операторам Spectrum Basic.





Добавлено позже:


Только юзай Бейсик для ZX Spectrum 128 и выше.

На ZX Spectrum 48 прикол с безумием организации спекрумовской клавиатуры. На 48-ом Бейсике можно писать только на реальном 48-ом Спектруме, видя перед собой эту самую клавиатуру. Впрочем, многие эмуляторы (например, Fuse) содержат подсказки по этой клавиатуре.
« Последнее редактирование: 23 Май 2023, 20:40:03 от Lunar Laser »

Оффлайн blackoff

  • Пользователь
  • Сообщений: 8451
  • Пол: Мужской
    • Просмотр профиля
изучить Spectrum Basic у тебя займёт дней 6. Ещё дней через 8 - 12 сможешь разбирать исходники игр, написанных на Бейсике. Скачай книгу "Как написать игру для ZX Spectrum", первый том (Бейсик), издательство Питер.
а в перерывах может учить латынь ...

Оффлайн lupus

  • Пользователь
  • Сообщений: 3828
  • Пол: Мужской
  • man with no face
    • ВКонтакте
    • Просмотр профиля
а в перерывах может учить латынь ...
Так-то её в некоторых вузах ещё учат )

Оффлайн Lunar Laser

  • Пользователь
  • Сообщений: 82
    • Просмотр профиля
а в перерывах может учить латынь ...

Да ну, книжка реально не сложная для взрослого человека, уже являющегося кодером. Это она в детстве заумью казалась и осваивалась кусками.

Я её году в 2015 или в 2016 за пару месяцев освоил, не являясь программистом. Проработав и разобравшись в большинстве исходников.

А я и тогда, и сейчас, далёк от звания "программист". А вот программисту вполне по силам освоить её за 8 - 12 дней.

Понятно, что для человека, для кого это станет первой "компьютерной книжкой", понадобится полгода и больше.

Добавлено позже:
А вот во втором томе (Ассемблер) вполне можно застрять всерьёз.

Оффлайн blackoff

  • Пользователь
  • Сообщений: 8451
  • Пол: Мужской
    • Просмотр профиля
Это она в детстве заумью казалась и осваивалась кусками.
я кодил на спеке в 90х ,восстанавливал игры пришедшие к нам битом виде ,возвращал музыку выдирая ее из демок ,перепаковывал ,адаптировал многоуровневые ленточные игры к дисководу ,читы ,было интересно,но все это было в машинном коде ,я даже загрузчики в коде делал
1 строка 0\1 rem потом машинный код ,2 строка запуск кода после rem в 1 строке ,прочитано было много ...  ,а игры на бейсике и тогда были примитивны и тормозные ,ща хз кому это нужно  ,имхо "на любителя"... о спеке ,как о первом компе имею только теплые воспоминания ,иногда бегаю в boulder dash на psp ...
А вот программисту вполне по силам освоить её за 8 - 12 дней.для кого это станет первой "компьютерной книжкой",понадобится полгода и больше.
я конечно не знаю интересы Sharpnull, но думаю он потратит время на что то более перспективное чем "мертвый язык" ,хотя хз ...

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
некоторые символа в русском и английском вариантах имеют общее начертание, то есть при необходимости можно эти места использовать для графики, тем более что Ассемблер позволяет делать перекодировку символов
Немного привел в порядок таблицу символов, сдвинул диапазон ASCII в начало таблицы, чтобы пробел занимал нулевую позицию, ну и дальше в порядке ASCII. Русские буквы, которые визуально ничем не отличаются от английских (типа А, М, Р и прочие) удалил совсем. Малую русскую букву "я" поместил на место символа ` (это который на кнопке с буквой Ё). Тут сыграла роль ошибка компилятора ca65, он букву "я" (с кодом 255) воспринимает как конец файла, а потому буква "я" не может присутствовать в исходнике нигде, ни в строке, ни даже в комментарии, иначе компиляция крашется. То есть если мы хотим вывести текст с буквой "я", надо в коде писать что-то такое:

hello: .byte "Привет`, Мир!", $ff
Здесь $ff использую как признак конца строки. Сначала думал использовать 0, как принято в Си и с точки зрения программирования это удобнее, но на коде 0 у нас завязан пробел.

Вывод такой строки имеет следующий вид:



Набор тайлов на текущий момент следующий:



Пустые клетки - место для будущей графики. Если его не хватит, то можно убрать некоторые символы, вроде @& и прочие, которые в игре вряд ли используются.

Чтобы поставить в соответствие коды символов из тайлов с ASCII из редактора кода, сделал такую перекодировку:


Вывод на экран всех символов:

hello:
.byte "!", '"', "#$%&'()*+,-./0123456789:;<=>?@"
.byte "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`"
.byte "abcdefghijklmnopqrstuvwxyz{|}~", $5f
.byte "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
.byte "абвгдежзийклмнопрстуфхцчшщъыьэю`", $ff

Итог:

« Последнее редактирование: 25 Май 2023, 13:35:28 от Arigato »

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4480
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
Русские буквы, которые визуально ничем не отличаются от английских (типа А, М, Р и прочие) удалил совсем.
А что насчёт "К"? Также, не вижу "Ёё". Ну и в игре действительно нужны "ЪЬ"?

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
В оригинале русская К отличается от английской, так что пока оставил. Если не будет хватать места под графику, то можно будет такие буквы тоже исключить.
Ё не нужна, она не используется.
Ъ Ь знаки, естественно, нужны, они точно будут в текстах.
Потенциальные кандидаты на исключение: [ ] { } | \ ^ & @ ~ © - 11 символов.
Оптимизация букв: К, к, с (малая русская с в оригинале отличается от английской, но их можно объединить), З (можно использовать цифру 3), Ч (цифра 4), Ь (английская b) - еще 6 символов.
В крайнем случае английский алфавит можно урезать до минимума, так как игра на 99% выводит только русский текст.

Но пока с графикой нет определенности. Либо брать графику из оригинала, но она для NES сильно примитивная, либо рисовать свою новую графику. Если брать оригинальную, то для нее места точно хватит.

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2461
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
А можно сперва нарисовать оригинальную, а потом если что улучшить? Если что я готов порисовать новую, времени полно...

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
А можно сперва нарисовать оригинальную, а потом если что улучшить?
Ну скорее всего по такому пути и придется идти. Графику добавить не проблема, главное каркас игры создать.

Вообще в подобной игре спрайты не особо нужны, ну или их будет совсем по минимуму. А потому можно обе таблицы тайлов использовать для фоновой графики, продублировав ту часть, где буквы. И в нужный момент включать вывод из первой или второй таблицы в зависимости от того, что именно хотим в данный момент нарисовать. В итоге под графику куча свободного места.
« Последнее редактирование: 25 Май 2023, 14:50:50 от Arigato »

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2461
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Графика в формате NES. Не знаю много ли там её ещё :neznayu:

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
Добавил графику и немного ее раскрасил:



Вот так это выглядит в эмуляторе NES:



Для вывода всего этого безобразия написал отдельные процедуры и макросы к ним. В итоге файл main.asm, который все это выводит на экран, выглядит достаточно просто и понятно:

.segment "CODE"

.proc main

_COLOR 0

_GOTOXY #9, #12
_PRINT hello1

_GOTOXY #9, #14
_PRINT hello2

_GOTOXY #8, #4
_PRINT peasant
_GOTOXY #8, #5
_PRINT peasant + 5

_GOTOXY #14, #4
_PRINT landlord
_GOTOXY #14, #5
_PRINT landlord + 5

_COLOR 2

_GOTOXY #26, #4
_PRINT dollar
_GOTOXY #26, #5
_PRINT dollar + 4
_GOTOXY #26, #6
_PRINT dollar + 8

_COLOR 1

_GOTOXY #20, #4
_PRINT army
_GOTOXY #20, #5
_PRINT army + 5

_GOTOXY #2, #4
_PRINT police
_GOTOXY #2, #5
_PRINT police + 4

_VBLANK
_SCROLL 0, 0
_SCREEN_ON

@loop:
JMP @loop

.endproc

.segment "RODATA"
hello1: .byte "Hello, World!", $ff
hello2: .byte "Привет, Мир!", $ff
police:
.byte $c3, $c4, $c5, $ff
.byte $d3, $d4, $d5, $ff
peasant:
.byte $a3, $a4, $a5, $a6, $ff
.byte $b3, $b4, $b5, $b6, $ff
landlord:
.byte $a7, $a8, $a9, $aa, $ff
.byte $b7, $b8, $b9, $ba, $ff
army:
.byte $ab, $ac, $ad, $ae, $ff
.byte $bb, $bc, $bd, $be, $ff
dollar:
.byte $a0, $a1, $a2, $ff
.byte $b0, $b1, $b2, $ff
.byte $c0, $c1, $c2, $ff

Макрос _COLOR для выбора палитры пока что не работает, палитры не переключаются. Буду позже с этим разбираться, как его прикрутить к процедуре print, которая выводит на экран строку.

Добавлено позже:
Стартовый экран готов:

« Последнее редактирование: 25 Май 2023, 21:13:18 от Arigato »

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
Добавлено стартовое меню выбора сложности. В оригинальной игре уровень сложности не настраивался, в варианте для NES будет три уровня, влияющие на баланс в игре:



Ну и главное, что процедура выбора элемента меню универсальная. Она же будет использоваться в игре для диалога с пользователем. Пока не решил как лучше сделать вопрос, где требуется два ответа: да / нет. Либо также выбирать указателем, либо кнопками: B - нет, A - да. В оригинале на ZX клавиша D означала да, а любая другая - нет.

Текущий вариант прикрепил к сообщению.

Оффлайн Guyver(X.B.M.)

  • Пользователь
  • Сообщений: 2461
  • Пол: Мужской
  • Уничтожим Кронос!
    • Facebook
    • Twitter
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Кнопками будет плохо, можно ошибиться. Я в своей игре сделал кнопками, а потом заменил на курсор.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5144
    • Просмотр профиля
Arigato, не тестируйте в мусорном VirtuaNES, используйте Mesen. В коде попадаются длинные записи как STA $0012 вместо STA $12. Для заглушки IRQ можно поставить адрес (метку) конца NMI, где и так RTI. Незачем постоянно делать PHP/PLP. Информацию лучше не располагать на краю экрана (8 пикселей слева и справа), хотя это видно для большинства телевизоров, но не всегда (https://www.nesdev.org/wiki/Overscan#For_game_developers) и это не красиво. В теме по 6502 уже написал, что нужно записывать палитру в VBlank всегда чтобы не было артефактов (UPD: вы уже сделали), а как недавно узнал лучше ещё после этого сделать так: https://www.nesdev.org/wiki/PPU_registers#Palette_corruption. Чтение контроллера без поддержки порта расширения Famicom и лишняя инструкция, хотя код почти как из https://www.nesdev.org/wiki/Controller_reading_code, вот так лучше:

Оффлайн Lunar Laser

  • Пользователь
  • Сообщений: 82
    • Просмотр профиля
Добавлено стартовое меню выбора сложности

Сочетание цветов фона и тона слишком кислотное.

Обведите буквы чёрной обводкой в пиксель толщиной. ИМХО, будет лучше смотреться.


Добавлено позже:
Дизайн верхней части буквы "К" делает визуально слишком большим промежуток между "К" и "Т".

Оффлайн Arigato

  • Пользователь
  • Сообщений: 47
    • Просмотр профиля
В коде попадаются длинные записи как STA $0012 вместо STA $12.
У меня везде вроде бы обращение по меткам идет, то есть сам компилятор должен подставлять адрес. Но надо код еще раз просмотреть. Сегодня выявил несколько ошибок, связанных с тем, что еще не привык каждый раз начинать числа с решетки #.

Информацию лучше не располагать на краю экрана (8 пикселей слева и справа)
Я заметил, что впритык к краю экрана выглядит не очень, а в режиме PAL вообще чуть-чуть (пару пикселей) обрезается. Проблему тут в том, что в ZX Spectrum ширина экрана такая же, но там есть бордюр, который эту проблему решает. Придется текст переписывать, чтобы уменьшить его ширину.

Чтение контроллера без поддержки порта расширения Famicom и лишняя инструкция
Если уж гнаться за каждой инструкцией, тогда чтение контроллера лучше не выносить в подпрограмму, а вставить прямо в NMI, чтобы избежать лишнего вызова и возврата.