Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Arigato

Страницы: [1] 2 Далее
1
Эх, что-то всё заглохло... Неужели только в звуках загвоздка?
Нет, во времени загвоздка. Думаю, в августе вернусь к проекту. Но со звуками помощь реально пригодилась бы!

P.S. Я уже ассемблер 6502 и особенности архитектуры NES позабыл, придется все опять вспоминать  :lol:

2
Звук вторжения на 1:12
На 9:13 звуковой эффект отказа тайной полиции.
13:37 - побег на вертолете.

3
По части музыки - при необходимости, конечно, можем и ZX звезд-музыкантов привлечь - очень известных.
Наверное, вы неправильно поняли тему. Под ZX новых версий игры "Диктатор" не будет. Та, что в первом посте темы и так измененная и дополненная на базе оригинала.
Сейчас пишется ремейк этой игры под платформу NES (Денди), причем с достаточно серьезным расширением контента. И вот под NES музыка уже готова вся, простые звуки тоже перенесены из оригинала. А вот сложные звуковые эффекты лично я не знаю как переносить или хотя бы сделать некий аналог, путь даже и отдаленно похожий. Хотя уверен, что там нет ничего сложного, к примеру, звуки войны это звуки пулеметной очереди и взрывов. Такое на NES сделать не проблема. Проблема в том, что я не знаю как это сделать. Как вариант, если кто-то может помочь, то можно или создать оригинальные звуковые эффекты, или где-то надергать готовых, даже может из других игр. Если кто-то возьмется, то могу скинуть аудиозаписи этих звуковых эффектов из игры на ZX, чтобы можно было сотворить нечто подобное.

4
Есть ли какие то новости по части новых версий?
Новостей нет, было лето, период отпусков, потому проект был на это время заброшен. Но скоро вернусь к работе, на самом деле осталось не так много, основное уже сделано.

Может нужна какая то помощь?
Главная загвоздка на текущий момент - звуковое сопровождение. С музыкой своими силами разобрался, простые пикающие звуки тоже повторил один в один как в оригинале. А вот сложные звуковые эффекты (вроде озвучки войны и прочее) сам вряд ли потяну... Эти звуковые эффекты в оригинале написаны на Ассемблере, хотя сама игра на Бейсике.

5
Поэтому, если у тебя много данных для записи (более 1 фрейма по времени) то NMI отключают вместе с дисплеем (или можно в самом nmi вначале добавить 'флаг'),
Или можно разбить вывод на несколько кадров, если скорость неважна. Я так делаю, разбиваю информацию на части и вывожу порциями в разных кадрах.


6
LDA PPU_STATUS тоже нет никакого смысла каждый раз перед установкой адреса делать, это нужно только в 1 случае - если ты где-то записал только 1 раз в $2006 или $2005.
Ну по идеи чисто в теории такая ситуация может возникнуть, если между парой записей произойдет вызов nmi. Хотя это весьма странно, так как к этому моменту работу с PPU уже надо бы завершить. Но читал рекомендацию делать LDA PPU_STATUS, видимо, как раз на такой случай (вариант что просто в коде где-то забыли второй раз записать маловероятен, да и в принципе ошибочен). В общем убрал.

По поводу печати, то у меня две отдельные подпрограммы: одна устанавливает "курсор" в нужную клетку экрана, а другая выводит текст, перемещая курсор в конец строки (ну это автоматически происходит при обращении к PPUDATA). Это позволяет вызывать подпрограмму печати одну за другой, тогда текст будет выводиться дальше, за предыдущим. По логике это как в обычном BASIC командой PRINT происходит.

Например:

_GOTOXY #1, #11 ; это координаты курсора
_PRINT str_hello4 ; это вывод строки на экран
_PRINT16 game_hst ; тут вывод 16-битного числа
_PRINT_CHAR #'.' ; и символ "." в конце предложения

На экране это выглядит так:



При этом в _GOTOXY можно передавать не только числа (константы), но и регистры или переменные. Скажем: _GOTOXY #10, Y - установить курсор в строку с номером Y (регистр) в позицию 10.

Выбор экранов пока не сделал, в данный момент мне это не нужно. Может позже добавлю.

7
Для облегчения жизни написал подпрограмму, которая считает адрес по координатам (X, Y) экрана и устанавливает туда "курсор". Получилось громоздко:

; переместить курсор в позицию (X,Y)
; posx - #значение, переменнаЯ, регистры A, X
; posy - #значение, переменнаЯ, регистры A, Y
.macro _GOTOXY posx, posy
.local addr, px, py
; если оба параметра константы,
; то считаем адрес сразу без вызова процедуры
.if .xmatch (.left (1, {posx}), #) .and .xmatch (.left (1, {posy}), #)
LDA PPUSTATUS
px = .right (.tcount ({posx}) - 1, {posx})
py = .right (.tcount ({posy}) - 1, {posy})
addr = py * 32 + px + SCR_BASE
LDA #>addr
STA PPUADDR
; если старший и младший байты адреса совпадают, то втораЯ запись в A не нужна
.if .not >addr = <addr
LDA #<addr
.endif
STA PPUADDR
.else
.if .xmatch ({posx}, A)
TAX
.elseif .not .xmatch ({posx}, X)
LDX posx
.endif
; если posy константа, то считаем сразу Y * 32
.if .xmatch (.left (1, {posy}), #)
addr = .right (.tcount ({posy}) - 1, {posy}) * 32
_LD16 sreg, #addr
JSR gotoxy::offset
.else
.if .xmatch ({posy}, A)
TAY
.elseif .not .xmatch ({posy}, Y)
LDY posy
.endif
JSR gotoxy
.endif
.endif
.endmacro

; переместить курсор в позицию (X,Y)
; X - новер столбца 0-31, Y - номер строки 0-29
; addr = Y * 32 + X + SCR_BASE
.proc gotoxy

; Y * 32
TYA
_SHL A, 4 ; * 16
STA sreg
LDA #0
ROL A
ASL sreg ; * 32
ROL A
STA sreg + 1

offset:
; + X + SCR_BASE
TXA
ADC sreg
TAX
LDA #>SCR_BASE ; SCR_BASE = $2000
ADC sreg + 1

BIT PPUSTATUS
STA PPUADDR
STX PPUADDR

RTS
.endproc

Пример вызова:

_GOTOXY #3, #2
_PRINT str_hello0

То есть указываем координаты либо константами (с символом # в начале), либо переменная (то есть память), либо один из допустимых регистров. _PRINT печатает строку в установленную позицию курсора:

; вывод строки на экран
; str - строка
; offset - смещение (не обЯзательно): #значение, переменнаЯ, регистр
; Result: X - длина строки
.macro _PRINT str, offset
.ifnblank offset
_LDX offset
.else
LDX #0
.endif
:
LDA str,X
BEQ :+ ; конец строки
STA PPUDATA ; вывод очередного символа
INX
JMP :-
:
.endmacro

Макрос _GOTOXY пытается построить оптимальный код. Если переданы константы, то адрес сразу вычисляется и записывается уже готовое значение. Если же переданы переменные значения, то адрес считается программно в процедуре gotoxy.

В общем, как такое решение? Можно ли что-то улучшить или оптимизировать?

8
Там же нужен один BIT PPUDATA для возврата к цвету фона, а вторая запись в $2006 должна быть #$40.
Логично, что один. Видимо я там уже экспериментировал, потому что и один не возвращал фон в черный в эмуляторе Nintaco (NES). Самое интересное, что мне удалось изначально сделать черный фон в Nintaco (NES), потом что-то еще правил в коде, в итоге фон сбился, и я так и не смог восстановить исходную версию, где фон правильно отрабатывал...

Во втором, если писать $40, то рендер смещается на одно знакоместо вверх. Во всяком случае у меня такой был эффект.

о, что ждать 2 раза это никак не связано с инит кодом, просто вначале идёт проверка на вне vblank, а потом vblank.
В приведенном по ссылке коде сначала делают bit $2002 и утверждают, что он должен сбросить состояние, после чего ждут первый раз vblank, затем предлагают заняться разными манипуляциями с памятью (время есть) и ждут второй раз vblank.


9
Попробовал вариант с заменой палитры. По ссылке странно сказано - уложитесь в 21 цикл и при этом приведены шаги, которые никаким образом в 21 цикл не уложишь.

Получился следующий код (комментарии прямо в коде):


_GOTOXY #31, #25 ; установить курсор в позицию (31,25)
_PRINT_CHAR #$ff ; вывести символ $ff (он черный, но не фон)
LDA #200
STA _SPRITE_ADDR_Y(0) ; установить координату Y спрайта 0

@loop1:

; ждем столкновениЯ спрайта 0
@Sprite0:
BIT PPUSTATUS
BVS @Sprite0

; загружаю адрес палитры в регистры заранее
LDX #$3f ; старший адрес палитры
LDY #$0d ; младший адрес палитры
; восстанавливаю палитру длЯ всего экрана
STX PPUADDR
STY PPUADDR
LDA #$11 ; цвет фона текста длЯ всего экрана
STA PPUDATA
LDA #$29 ; цвет текста длЯ всего экрана
STA PPUDATA
LDA #$00
; ставим адрес на цвет фона
STX PPUADDR
STA PPUADDR
; сбрасываем адрес в ноль
STA PPUADDR
STA PPUADDR

@Sprite0b:
BIT PPUSTATUS ; эти такты тоже надо считать
BVC @Sprite0b ; ведь Sprite 0 hits уже случилсЯ

; отключаем рендеринг (в A у нас уже 0, см. выше)
STA PPUMASK
; менЯем палитру
STX PPUADDR ; старший адрес палитры (он уже в X)
STY PPUADDR ; младший адрес палитры (он уже в Y)
LDA #$27 ; цвет фона текста
STA PPUDATA ; устанавливаем цвет фона текста
LDA #$3d ; цвет текста
STA PPUDATA ; устанавливаем цвет текста
; пропускаю цвета, чтобы вернутьсЯ на цвет фона (иначе фон зальет этим цветом)
BIT PPUDATA
BIT PPUDATA
; возвращаем адрес на позицию экрана (тот знакомест, где у нас нулевой спрайт)
LDA #$23
STA PPUADDR
LDA #$3f
STA PPUADDR
; включаем рендеринг
LDA #%00011110
STA PPUMASK ; отключаем рендеринг (в A у нас уже 0, см. выше)

; сбрасываем прокрутку
; не знаю, нужно или нет, но в любом случае тут уже не надо спешить
LDA #$0
STA PPUSCROLL
STA PPUSCROLL
JMP @loop1

В эмуляторе FCEUX отработало идеально (внизу на оранжевом фоне серая надпись, это та же самая палитра, что и выше зеленая надпись на голубом фоне):


В VirtuaNES тоже все идеально. А вот в других эмуляторах начались проблемы.

Nintaco (NES):


Причем голубой фон как-то удалось побороть сдвигом в палитре на цвет фона, но потом я что-то еще менял, а позже уже не смог вернуть рабочий вариант. В любом случае полоса выше панели "КНОПКА" видна на черной фоне и постоянно дергается.

Mesen:


Такая же полоса и цвета уже не возвращаются на исходные.

Как видим, работа очень сильно зависит от эмулятора. Как оно будет на реальном железе - неизвестно (и проверить не на чем). Но даже если на железе оно бы заработало, все равно нынче надо ориентироваться и на эмуляторы, ведь большинство использует эмуляторы. И если мы применяем такие хаки, которые эмуляторы не понимают, то лучше так не делать.

Так что вернусь к варианту вывода надписи спрайтами...

10
Не хватает цветов. Но тогда проще будет надпись вывести спрайтами, тем самым один цвет из палитры освободив для других целей.

11
Возникла очередная проблема. Мне нужно для нескольких нижних строк экрана поменять палитру, то есть чтобы основной экран отрисовывался с одной палитрой, но низ уже с другой.

Пробую метод с нулевым спрайтом. Если менять набор тайлов, то практически работает, правда есть небольшой артефакт:

@loop:

; ждем столкновениЯ спрайта 0
@Sprite0:
BIT PPUSTATUS
BVS @Sprite0

LDA #%10010000
STA PPUCTRL
LDA #0
STA PPUSCROLL
STA PPUSCROLL

@Sprite0b:
BIT PPUSTATUS
BVC @Sprite0b

LDA #%10000000
STA PPUCTRL
LDA #0
STA PPUSCROLL
STA PPUSCROLL

JMP @loop



То, что нет осмысленной картинки, это так и должно быть, так как мне не нужен нулевой набор тайлов, просто сделал для проверки работоспособности метода. А артефакт, это первая строка пикселей в самом начале (верхняя слева) частично обрезается.

Ну да ладно, мне и не надо менять наборы тайлов, мне надо менять цвета. Тогда такой код:

@loop:

; ждем столкновениЯ спрайта 0
@Sprite0:
BIT PPUSTATUS
BVS @Sprite0

LDA PPUSTATUS
LDA #$3f
STA PPUADDR
LDA #$01
STA PPUADDR
LDA #$0f ; черный
STA PPUDATA
LDA #$3F
STA PPUADDR
LDA #$00
STA PPUADDR
STA PPUADDR
STA PPUADDR
STA PPUSCROLL
STA PPUSCROLL

@Sprite0b:
BIT PPUSTATUS
BVC @Sprite0b

LDA PPUSTATUS
LDA #$3f
STA PPUADDR
LDA #$01
STA PPUADDR
LDA #$01 ; синий
STA PPUDATA
LDA #$3F
STA PPUADDR
LDA #$00
STA PPUADDR
STA PPUADDR
STA PPUADDR
STA PPUSCROLL
STA PPUSCROLL
JMP @loop

И вот тут все намного хуже:



С одной стороны, цвет действительно поменялся (синий фон за текстом, так и задумано). С другой - этот текст "МЕСЯЦ 0" вообще не от сюда, он сверху экрана свалился вниз. Там внизу совсем другой текст должен быть, но экран куда-то съехал. Вот полный экран как выглядит:


"МЕСЯЦ 0" там внизу быть не должно, он вверху. А надпись, которая была внизу, вообще куда-то пропала.

И как это побороть?  :neznayu:

Добавлено позже:
Добавлю, что даже с отключенным экраном запись палитры нужно делать в VBlank
Я правильно понимаю, что не получится переключать палитру с помощью нулевого спрайта, чтобы у нас на экраны было как бы два набора палитр?

12
Да, сработало, скорость воспроизведения одинаковая без дублирования трека. Высота нот на Денди отличается, но можно на это не обращать внимание, не на столько оно и важно, если рядом не сравнивать воспроизведение на Денди и NTSC, то и не заметишь подвоха.

13
Можно сделать для PAL и NTSC, весить будет больше и нужно будет вставить небольшой код для определения NTSC/PAL/Dendy, к сожалению нет поддержки Dendy, а там звук отличается от PAL и NTSC.
Добавил поддержку PAL и NTSC, причем не только в музыке, но и везде, где есть задержки (ну то есть в PAL считает, что секунда это 50 кадров, а NTSC, что 60 кадров).
С музыкой может не совсем верно сделал, но решение такое. Имеется две версии треков, для PAL играет немного быстрее, в FamiStudio параметр BPM 108, а для NTSC - 90 (значение определил по пропорции). На слух музыка в NTSC, PAL и Dendy немного отличается, но скорость проигрывания теперь одинаковая. Думаю, это не принципиально.

Круто! Но всё же букву ё надо бы использовать... :neznayu: Не забудьте про неё.
Добавил Ё.

14
В общем вставил гимн из оригинальной игры, перенес его по нотам в FamiStudio, разнес на два канала, наложил кое-каких эффектов, вполне себе полифонически играет.

Кстати, что интересно, звуки из оригинального Спектрума если переносить по нотам, то на NES они ровным счетом ничем не отличаются. Например, добавил чередующийся звук (пик) при ожидании нажатия кнопки. Если запустить рядом Диктатор на Спектрум и в NES, то звуки неотличимы.

Пока что серьезно продвинуться не удалось, по сути день был убит на поиски решения со звуками. Да, еще кое-что добавил (например, вывод на экран 16-битных чисел), но это пока никак не заметно в игре.

Вариант с озвучкой прикрепил ниже.

15
Без звукового движка можно сделать, но там прямо 1 в 1 со спектрумовской пищалкой будет.
Пропищать аля Спектрум звуками из оригинальной игры и я могу, но на NES это никуда не годится.

Через FamiStudio удалось импортировать MIDI и проиграть его в игре. Гимн РФ и США нашел подходящего качества. А что делать с гимном Ритимбании не ясно. В игре это придуманный автором гимн или все же реально существующий? Можно взять какой-нибудь рандомный гимн в качестве гимна Ритимбании в крайнем случае. Вряд ли тут сидят музыканты, кто сможет из одноголосого гимна со Спектрума сделать что-то более-менее приятное слуху...

Добавлено позже:
будет ли действительно существовать смысл поддерживать NTSC
Изначально пишу под NTSC. Запустил в режиме PAL, музыка просто несколько медленнее проигрывается, во всяком случае в эмуляторе никаких особых проблем после смена региона не заметил.

16
там музыку можно из MIDI импортировать и эффекты сделать
Тут бы портировать музыку из оригинальной игры, там играет гимн Ритимбании и прочее подобное. Я максимум смогу по нотам это перенести, но качество музыки будет примерно как на Спектруме...

17
Если есть желающие помочь с музыкой и звуковыми эффектами, будет реально полезно!  :)

Сам я максимум что смогу сделать, это такую же пищалку, как и на Спектруме. Для NES подобная музыка вообще не катит...

Могу предоставить ноты из самой игры, то есть по ним можно написать основу и добавить каких-то эффектов, чтобы звучала не как пищалка по нотам.

Также в игре есть достаточно сложные звуковые эффекты, их могу предоставить в аудиофайле, чтобы сделать на NES что-то похожее. Тут не столько важно точно повторить эффекты, сколько передать саму суть.

18
Не совсем понимаю с этими адресами.
Эксперименты показали следующее:
  • Если переменная объявлена в .segment "ZEROPAGE" в этом же файле выше по коду или же в подключенных с помощью .include файлах выше по коду, то компилятор генерирует короткие команды доступа к памяти.
  • Если же переменная объявлена ниже по коду, либо мы к ней обращаемся из одного из инклудов, который стоял выше объявления переменной (по сути аналогично переменная получается объявлена ниже по коду), то компилятор генерирует длинные команды.

Вывод: важен порядок объявления, то есть и порядок инклудов, чтобы использование переменной всегда было ниже ее объявления, тогда будут короткие команды доступа к ZP.

19
Разрешение будет 256*240?
Крайние столбцы экрана нежелательно использовать, так как, в отличии от Спектрума, нет бордюра. То есть полезное горизонтальное разрешение ниже спектрумовского. По высоте тоже все 30 строк использовать не получится.
Экран с приветственным словом переделал, добавив отступы от краев экрана. Но пришлось текст перекомпоновать, так как в исходном варианте он не умещается в строки по 30 символов:


20
Эта надпись взята из оригинальной игры (русифицированной) - https://www.emu-land.net/forum/index.php/topic,88095.msg1562948.html#msg1562948
А потому переделывать ее не буду. Где возможно, надо передать дух оригинала.

21
Сочетание цветов фона и тона слишком кислотное.
Сделал палитру потемнее, теперь так:



Цвета еще сильно от эмулятора зависят:


Обводку сделать или букву перерисовать не получится, так как сейчас эта надпись весьма компактно легла на таблицу тайлов:



А любые изменения приводят к увеличению количества необходимый тайлов. В любом случае это не то, чем сейчас стоит озабочиваться.


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

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

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



23
Добавлю, что даже с отключенным экраном запись палитры нужно делать в VBlank
Понятно, почему у меня при смене экрана (и перезаписи палитры) появлялась полоса на экране типа вспышки. Переместил загрузку палитры в начало, артефакт исчез.

Добавлено позже:
В коде попадаются длинные записи как STA $0012 вместо STA $12.
Не совсем понимаю с этими адресами. Вот что показывает отладчик:



Вот это место в программе:



Определение pad1:


24
"cd /d
%~d1
cd "%~p1"
Можно заменить на cd /d "%~dp1" но суть от этого не изменится.

25
Добавлено стартовое меню выбора сложности. В оригинальной игре уровень сложности не настраивался, в варианте для NES будет три уровня, влияющие на баланс в игре:



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

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

26
Ну и код обновленного командного файла compilation_nes.cmd
Очередная доработка файла compilation_nes.cmd. Теперь в корневую папку проекта можно положить файл nes.cfg, данный конфиг будет использоваться компоновщиком вместо стандартного. Если файла конфига не будет в корневой папке проекта, то подключается стандартный конфиг nes из набора cc65.

Ну и код новой версии командного файла:

@echo off
setlocal enabledelayedexpansion
title Compilation NES

rem Переходим в папку с файлом
%~d1
cd "%~p1"
set ext=.asm

:next
rem Ищем файл .asm, имя которого совпадает с именем папки
set "dir=%CD%"
for %%n in (%dir:\= %) do set "file=%%n"
if "%file:~-1%"==":" (
rem Дошли до корневой папки диска, останавливаем поиск
cd "%~p1"
set "file=%~dpn1"
set "ext=%~x1"
goto compil
)
set "file=%dir%\%file%"
if not exist "%file%%ext%" (
rem Файл не найден, ищем дальше...
cd ..
goto next
)

:compil
rem Начинаем компиляцию проекта
echo Compilation: %file%%ext%

rem Удаляем старые файлы .nes и .o
if exist "%file%.nes" del /q "%file%.nes"
if exist "%file%.o" del /q "%file%.o"

rem Компилируем .asm файл
ca65 "%file%%ext%"
if errorlevel 1 goto error

rem Компонуем в .nes файл
if exist nes.cfg (
ld65 "%file%.o" -C nes.cfg -o "%file%.nes"
) else (
ld65 "%file%.o" -t nes -o "%file%.nes"
)
if errorlevel 1 goto error

rem Удаляем объектный файл
del /q "%file%.o"

rem Компиляция успешно выполнена
echo OK

rem Запускаем .nes файл в эмуляторе
"%file%.nes"
goto :EOF

:error
rem Сообщение об ошибке
echo ERROR
pause


27
Добавил графику и немного ее раскрасил:



Вот так это выглядит в эмуляторе 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, которая выводит на экран строку.

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


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

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

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

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

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

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

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



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



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

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


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

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

Итог:


Страницы: [1] 2 Далее