Wlad писал(а):
- портирование
Представляю вашему вниманию, коллеги, результат моей давней задумки, когда-то начатой и не доведённой до конца... А теперь завершённой.
Преамбула. Когда-то я загорелся идеей портировать под
А2 игру
DOOM Нашёл в сети порт
Delphi DOOM и начал его портировать. Написал тогда для этой цели небольшой
PascalPreprocessor, который переводил все ключевые слова в капсы, менял некоторые типы... паскалевские крышечки в
POINTER TO, например и т.д. и тому подобное.
Но передо мной встала во весь рост большая проблема. Юнитов в паскалевском исходнике
>80 штук и все они тесно друг друга используют. Т.е. не проблема код подправить в почти аналогичный код на Активном Обероне, а
попрописывать везде квалифицированный импорт это уже огромная проблема.
И мне пришла идея скинуть весь код юнитов в один здоровенный юнит, тогда квалифицированный импорт просто не надо будет прописывать.
Вот, и начал я тогда писать этот инструмент. И сейчас закончил
При объединении объединяются соответствующие секции: интерфейсная, реализации, инициализации и финализации каждого модуля. Что-бы всё объединить в правильном порядке применена топологическая сортировка.
В таком объединённом юните конечно возникает другая проблема - конфликты имён в реализационной части. Но как я и предполагал, таких конфликтов будет не слишком много. В проекте
Delphi DOOM оказалось всего 12 таких конфликтов.
Я их все задокументировал (на инглиш). Какие-то лучше править в исходных юнитах, какие-то в конечном результате:
Цитата:
Implementation parts conflicts:
Fix in original units:
* BACKUPTICS constant in d_net and i_net units. Solution: BACKUPTICS -> I_NET_BACKUPTICS in i_net unit
* finished variable in wi_stuff and i_system units. Solution: finished -> i_system_finished in i_system unit
* MAXSPECIALCROSS constant in p_enemy and p_map units. Solution: constant in p_enemy just not used, remove it
* NUMSPRITES enum and numsprites variable in info_h and r_things units respectively. Solution: numsprites -> r_things_numsprites in r_things and r_data units
* mousex and mousey variables in m_menu and g_game units. Solution: mousex -> g_game_mousex and mousey -> g_game_mousey in g_game unit
* anims variable in p_spec and wi_stuff units. Solution: anims -> wi_stuff_anims in wi_stuff unit
* BG constant and bg variable in hu_lib and wi_stuff units respectively. Solution: BG constant just not used, remove it
* plr variable in hu_stuff and am_map units. Solution: plr -> hu_stuff_plr in hu_stuff unit
* messages enum in m_menu unit conflicts with standard messages unit name. Solution: messages -> enum_messages in m_menu unit
* WindowProc function in i_midi and i_main units. Solution: WindowProc -> i_midi_WindowProc in i_midi unit
* y variable in m_menu rename to m_menu_y
* close function rename to closefile function in d_delphi, d_main, i_music, m_menu, m_misc and z_zone units
Fix in combined unit:
* SAVESTRINGSIZE constant in g_game and m_menu units. Solution: both constants are equal, just leave one of it that will be declared earlier in combined unit
Потом обработать этот комбинированный код тем первоначальным препроцессором и глядишь, скоро думец под А2 будет
Прилагаю файлы оригинального порта, утилиту и конечный результат. Код так же залит в Oberon Community репозиторий.
Замечания, пожелания, планы... что портировать в первую очередь?