SprPoP: README для игрока и экран Controls в две колонки

README, который едет НА ДИСК рядом с программой, в двух версиях: README.TXT
(английский) и README.RUS (русский).  Краткое описание, запуск, полная
раскладка управления, читы, файлы игры, чего не хватает против оригинала,
благодарности.

Русский обязан быть в CP866 — DSS и местные просмотрщики читают именно её,
UTF-8 показался бы кракозябрами.  Исходники лежат в dist/ как UTF-8 (чтобы
читались в репозитории), перекодировка и CRLF делаются правилом Makefile.
ПОРЯДОК В КОНВЕЙЕРЕ ВАЖЕН: sed ставит CRLF ДО iconv — BSD sed в UTF-8
локали отказывается работать с байтами CP866 («RE error: illegal byte
sequence»), а с валидным UTF-8 работает.  iconv БЕЗ -c намеренно: потеря
символа должна ломать сборку, а не молча портить текст.

ЭКРАН CONTROLS переписан в две колонки.  В одну раскладка больше не
помещалась: после фаз A-C клавиш стало вдвое больше, а по высоте есть
только 200 точек вместе с заголовком.  Слева игра (бег, лазание, бой),
справа служебное и читы; высота блока считается по ДЛИННОЙ колонке.
Строка «IN A FIGHT» — заголовок, а не клавиша: ниже неё те же стрелки и
Shift означают другое, и без разделителя список читался бы противоречиво.

Заодно экран перестал врать: там до сих пор висели P, I, U и F7/F8 —
клавиши, переназначенные ещё в фазе A.

Проверено в MAME: Backspace открывает меню, Settings -> Show key bindings
показывает обе колонки целиком.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-27 15:50:59 +03:00
parent 659071838d
commit 6cc8611d03
6 changed files with 620 additions and 32 deletions
+25 -4
View File
@@ -200,7 +200,11 @@ LVL_NUMS := 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
# три секунды. Четыре архива актёров, а не один: имена внутри наборов # три секунды. Четыре архива актёров, а не один: имена внутри наборов
# совпадают (g0.atl есть и у стража, и у скелета, и у Джафара), а константы # совпадают (g0.atl есть и у стража, и у скелета, и у Джафара), а константы
# индексов упаковщик делает из имени файла. # индексов упаковщик делает из имени файла.
DISK := BG/bg.arc BG/pop_tile.pal BG/pal_tile.pal \ # README для игрока идёт НА ДИСК рядом с программой. Русский обязан быть в
# CP866: DSS и любой местный просмотрщик читают именно её, UTF-8 покажется
# кракозябрами. Имена в 8.3: README.TXT и README.RUS.
DISK := README.TXT README.RUS \
BG/bg.arc BG/pop_tile.pal BG/pal_tile.pal \
KID/kid.arc KID/kid.pal KID/kid.ani \ KID/kid.arc KID/kid.pal KID/kid.ani \
GUARD/guard.arc SKEL/skel.arc VIZIER/vizier.arc SHADOW/shadow.arc \ GUARD/guard.arc SKEL/skel.arc VIZIER/vizier.arc SHADOW/shadow.arc \
SND/snd.arc \ SND/snd.arc \
@@ -409,6 +413,23 @@ $(PACKED)/LEVELS/res20$(1).bin: $(LVL_ORIG)/res20$(1).bin | check-orig
endef endef
$(foreach n,$(LVL_NUMS),$(eval $(call lvl_rule,$(n)))) $(foreach n,$(LVL_NUMS),$(eval $(call lvl_rule,$(n))))
# README: перевод строки CRLF (текст читают в DOS-подобной среде) и, для
# русского, перекодировка в CP866. iconv БЕЗ -c намеренно: потеря символа
# должна ломать сборку, а не молча портить текст (memory
# iconv_cp866_workflow; //TRANSLIT на macOS падает).
$(PACKED)/README.TXT: dist/README.txt
@mkdir -p $(dir $@)
@sed 's/$$/\r/' $< > $@
# ПОРЯДОК ВАЖЕН: CRLF ставится ДО перекодировки. BSD sed в UTF-8 локали
# отказывается работать с байтами CP866 («RE error: illegal byte sequence»),
# а с валидным UTF-8 — работает.
$(PACKED)/README.RUS: dist/README.ru.txt
@mkdir -p $(dir $@)
@sed 's/$$/\r/' $< | iconv -f UTF-8 -t CP866 > $@
resources-readme: $(PACKED)/README.TXT $(PACKED)/README.RUS
resources-bg: $(PACKED)/BG/bg.arc $(PACKED)/BG/pop_tile.pal $(PACKED)/BG/pal_tile.pal resources-bg: $(PACKED)/BG/bg.arc $(PACKED)/BG/pop_tile.pal $(PACKED)/BG/pal_tile.pal
resources-kid: $(PACKED)/KID/kid.arc $(PACKED)/KID/kid.pal $(PACKED)/KID/kid.ani resources-kid: $(PACKED)/KID/kid.arc $(PACKED)/KID/kid.pal $(PACKED)/KID/kid.ani
resources-actors: $(PACKED)/GUARD/guard.arc $(PACKED)/SKEL/skel.arc \ resources-actors: $(PACKED)/GUARD/guard.arc $(PACKED)/SKEL/skel.arc \
@@ -439,9 +460,9 @@ $(PACKED_FILES) $(GEN_H):
@echo "SprPoP: нет $@ — генерирую ресурсы" @echo "SprPoP: нет $@ — генерирую ресурсы"
@$(MAKE) GENERATE=1 $@ @$(MAKE) GENERATE=1 $@
RES_TARGETS := resources resources-bg resources-kid resources-actors \ RES_TARGETS := resources resources-readme resources-bg resources-kid \
resources-sound resources-music resources-font resources-title \ resources-actors resources-sound resources-music resources-font \
resources-pv resources-levels resources-title resources-pv resources-levels
$(RES_TARGETS): $(RES_TARGETS):
@$(MAKE) GENERATE=1 $@ @$(MAKE) GENERATE=1 $@
# Перегенерация ВСЕГО, не глядя на таймстемпы. # Перегенерация ВСЕГО, не глядя на таймстемпы.
@@ -0,0 +1,130 @@
===========================================================================
SprPoP -- Prince of Persia ¤«ï Sprinter Sp2000
===========================================================================
®àâ ¨£àë Prince of Persia „¦®à¤ ­  Œ¥å­¥à  (1989) ­  Sprinter Sp2000.
ƒà ä¨ª  ¢§ïâ  ¨§ VGA-¢¥àᨨ ¤«ï MS-DOS, ०¨¬ 320x256 á ¯ «¨âன ­  256
梥⮢; ¬ã§ëª  ¨ §¢ãª®¢ë¥ íä䥪âë - ®à¨£¨­ «ì­ë¥ ®æ¨ä஢ª¨, ¨£à îâáï ç¥à¥§
ª ­ « CBL. ‚ ¨£à¥ ¢á¥ ç¥âëà­ ¤æ âì ã஢­¥©, § áâ ¢ª , íªà ­ë ¨áâ®à¨¨,
¢áâ㯫¥­¨¥ á ¯à¨­æ¥áᮩ ¨ „¦ ä à®¬, 䨭 « ¨ â ¡«¨æ  ४®à¤®¢.
‡€“‘Š
---------------------------------------------------------------------------
ˆ§ ª®¬ ­¤­®© áâப¨ DSS, ­  ⮬ ¤¨áª¥, £¤¥ «¥¦¨â ¨£à :
sprpop
冷¬ á ¯à®£à ¬¬®© ¤®«¦­ë «¥¦ âì ¥ñ ª â «®£¨ á ¤ ­­ë¬¨:
BG\ â ©«ë ä®­  KID\ ¯à¨­æ
GUARD\ áâà ¦¨ SKEL\ ᪥«¥â
VIZIER\ „¦ ä à SHADOW\ ⥭ì
SND\ §¢ãª®¢ë¥ íä䥪âë MUS\ ¬ã§ëª 
FONT\ èà¨äâ TITLE\ § áâ ¢ª 
PV\ ¨áâ®à¨ï ¨ ¢áâ㯫¥­¨¥ LEVELS\ ç¥âëà­ ¤æ âì ã஢­¥©
¥§ ª ª®£®-­¨¡ã¤ì ª â «®£  ¨£à  ¢áñ à ¢­® § ¯ãáâ¨âáï, ­® â®, çâ® ¢ ­ñ¬
«¥¦ «®, ®ª ¦¥âáï ¡¥§§¢ãç­ë¬ ¨«¨ ­¥¢¨¤¨¬ë¬.
€‚‹…ˆ…
---------------------------------------------------------------------------
¥£ ¨ « § ­¨¥
‚«¥¢® / ‚¯à ¢® ¯®¢¥à­ãâìáï ¨«¨ ¡¥¦ âì
‚¢¥àå ¯à릮ª ¨«¨ ¯®¤âï­ãâìáï
‚­¨§ ¯à¨á¥áâì ¨«¨ á¯ãáâ¨âìáï
‚­¨§ + ‚«¥¢®/‚¯à ¢® ¯à릮ª ­  ¬¥áâ¥
Shift ¯®¤®¡à âì ¯à¥¤¬¥â
Shift + ‚«¥¢®/‚¯à ¢® ®áâ®à®¦­ë© è £
Home ¨«¨ ‚¢¥àå+‚«¥¢® ¯à릮ª ¢«¥¢®
PgUp ¨«¨ ‚¢¥àå+‚¯à ¢® ¯à릮ª ¢¯à ¢®
‚¢¥àå ­  ¡¥£ã ¯à릮ª á à §¡¥£ 
Shift ¢ ¯ ¤¥­¨¨ § æ¥¯¨âìáï §  ª à­¨§
®© ­  ¬¥ç å
‚«¥¢® / ‚¯à ¢® ­ áâ㯠âì ¨«¨ ®âáâ㯠âì
Shift 㤠à
‚¢¥àå § é¨â 
‚­¨§ ã¡à âì ¬¥ç
(Shift ¤®áâ ñâ ¥£® á­®¢ )
® 室㠨£àë
Backspace ¨«¨ Esc ¯ ã§  ¨ ¬¥­î
஡¥« ᪮«ìª® ®áâ «®áì ¢à¥¬¥­¨
T ¤¥à¦ âì â ©¬¥à ­  íªà ­¥
F6 ¡ëáâ஥ á®åà ­¥­¨¥
F9 ¡ëáâà ï § £à㧪 
Ctrl+A ­ ç âì ã஢¥­ì § ­®¢®
Ctrl+R ¢¥à­ãâìáï ª § áâ ¢ª¥
Ctrl+S §¢ãª ¢ª« / ¢ëª«
Ctrl+M ¬ã§ëª  ¢ª« / ¢ëª«
Ctrl+V ¯®ª § âì ¢¥àá¨î ᡮન
Ctrl+Q ¨«¨ F10 ¢ë室
F10 à ¡®â ¥â ¢¥§¤¥, ¢ ⮬ ç¨á«¥ ¢® ¢à¥¬ï § áâ ¢ª¨. ‹î¡ ï ¤àã£ ï ª« ¢¨è  ­ 
§ áâ ¢ª¥ ¨«¨ ­  íªà ­ å ¨áâ®à¨¨ ¯à®¯ã᪠¥â ¨å ¨ ­ ç¨­ ¥â ¨£àã.
—ˆ’›
---------------------------------------------------------------------------
—¨âë ®à¨£¨­ « ; ¢ í⮩ ᡮથ ®­¨ ¢ª«îç¥­ë ¯® 㬮«ç ­¨î. ‚몫îç¨âì ¬®¦­® ­ 
íªà ­¥ ­ áâ஥ª.
Shift+L á«¥¤ãî騩 ã஢¥­ì
+ / - ­  ¬¨­ãâã ¡®«ìè¥ / ¬¥­ìè¥
K 㡨âì áâà ¦ 
Shift+I ¯¥à¥¢¥à­ãâì íªà ­
Shift+W ¬¥¤«¥­­®¥ ¯ ¤¥­¨¥
Shift+S ¢¥à­ãâì ®¤­ã ¥¤¨­¨æã §¤®à®¢ìï
Shift+T ¯à¨¡ ¢¨âì §¤®à®¢ìï (¤® ¤¥áïâ¨)
[ / ] ¯®¤¢¨­ãâì ¯à¨­æ  ­  ¯¨ªá¥«ì
„¢ãå ç¨â®¢ ®à¨£¨­ «  ¯®ª  ­¥â: R (¢®áªà¥á¨âì ¯à¨­æ ) ¨ H / J / U / N ¢¬¥áâ¥
á Ctrl+B (¯®á¬®âà¥âì á®á¥¤­îî ª®¬­ âã).
Žâ« ¤®ç­ë¥ ª« ¢¨è¨ í⮣® ¯®àâ , ª®â®àëå ¢ ®à¨£¨­ «¥ ­¥â ¢®¢á¥. ‚ᥠ®­¨ ¯®¤
Ctrl, çâ®¡ë ­¥ § ­¨¬ âì ¯à®áâë¥ ¡ãª¢ë ¨§ à áª« ¤ª¨ ¢ëè¥.
Ctrl+I ¡¥áᬥà⨥: ¢ëª« / ¢ ¡®î / ¯®ç⨠¢® ¢áñ¬
Ctrl+P ०¨¬ ᪮à®áâ¨
Ctrl+F ®áâ ­®¢¨âì ª ¤à ¨ á­®¢  ¯ãáâ¨âì
Ctrl+D ®â« ¤®ç­ ï áâப : ã஢¥­ì, ª®¬­ â , ᪮à®áâì, §¢ãª
Ctrl++ / Ctrl+- ¯¥à¥©â¨ ¢ á«¥¤ãîéãî / ¯à¥¤ë¤ãéãî ª®¬­ âã ¯® ­®¬¥àã
”€‰‹›, ŠŽ’Ž›… ‘އ„€ð’ ˆƒ
---------------------------------------------------------------------------
POP.CFG ­ áâனª¨
POP.SAV ¡ëáâ஥ á®åà ­¥­¨¥, POP.BAK - ¯à¥¤ë¤ã饥
POP.HOF â ¡«¨æ  ४®à¤®¢
‚ᥠ®­¨ ¯®ï¢«ïîâáï à冷¬ á ¯à®£à ¬¬®©, ¨ «î¡®© ¬®¦­® 㤠«¨âì - ¨£à  ¯à®áâ®
­ ç­ñâ á® §­ ç¥­¨© ¯® 㬮«ç ­¨î.
—’Ž …™ð … ƒŽ’Ž‚Ž
---------------------------------------------------------------------------
‚ᥠç¥âëà­ ¤æ âì ã஢­¥© ¯à®©¤¥­ë. ®à⠯த®«¦ ¥â à §¢¨¢ âìáï, â ª çâ®
è¥à®å®¢ â®á⨠¥éñ ¢áâà¥ç îâáï; â¥, ® ª®â®àëå ¬ë §­ ¥¬, ¢¥¤ãâáï ¢ ᯨ᪥
¡ £®¢ ¯à®¥ªâ .
à®â¨¢ ®à¨£¨­ «  ­¥ 墠⠥â: ç¨â  R (¢®áªà¥á¨âì ¯à¨­æ ), ç¨â®¢ H / J / U / N
¨ Ctrl+B ¤«ï ®á¬®âà  á®á¥¤­¨å ª®¬­ â ¨ ª« ¢¨è¨ á­¨¬ª  íªà ­  (F12).
‹€ƒŽ„€Ž‘’ˆ
---------------------------------------------------------------------------
Prince of Persia ¯à¨¤ã¬ « ¨ ­ ¯¨á « „¦®à¤ ­ Œ¥å­¥à ¢ 1989 £®¤ã.
Œ¥å ­¨ª  í⮣® ¯®àâ  á¢¥àï« áì á SDLPoP (github.com/NagyD/SDLPoP) - íâ®
á ¬®¥ â®ç­®¥ ¯à®ç⥭¨¥ ⮣®, ª ª ¢¥¤ñâ á¥¡ï ®à¨£¨­ «ì­ë© ¤¢¨¦®ª. ƒà ä¨ª 
¢§ïâ  ¨§ ¢¥àᨨ ¤«ï MS-DOS, §¢ãª®¢ë¥ íä䥪âë - ¨§ ¥ñ ä ©«®¢ DIGISND, ¬ã§ëª 
- ¨§ § ¯¨á¥© á ã­¤â४  DOS-¢¥àᨨ.
‘ ¬ ¯®àâ ᮡ࠭ ­ è¨¬ ª®¬¯¨«ïâ®à®¬ sprinter-cc ­  ®á­®¢¥ SDCC ¤«ï Sprinter
Sp2000.
@@ -0,0 +1,134 @@
===========================================================================
SprPoP -- Prince of Persia for the Sprinter Sp2000
===========================================================================
A port of Jordan Mechner's Prince of Persia (1989) to the Sprinter Sp2000.
The graphics are the VGA ones from the MS-DOS release, in 320x256 with a
256-colour palette; the music and the sound effects are the digitised
originals, played through the CBL channel. All fourteen levels, the title
sequence, the story screens, the intro with the Princess and Jaffar, the
ending and the hall of fame are in.
RUNNING IT
---------------------------------------------------------------------------
From the DSS prompt, on the drive the game sits on:
sprpop
The game needs its data directories next to the program:
BG\ background tiles KID\ the prince
GUARD\ guards SKEL\ the skeleton
VIZIER\ Jaffar SHADOW\ the shadow
SND\ sound effects MUS\ music
FONT\ text font TITLE\ title screens
PV\ story and intro screens LEVELS\ the fourteen levels
If a directory is missing the game still starts, but whatever lived there
will be silent or invisible.
CONTROLS
---------------------------------------------------------------------------
Running and climbing
Left / Right turn, or run
Up jump, or climb up
Down crouch, or climb down
Down + Left/Right hop
Shift pick things up
Shift + Left/Right careful step
Home or Up+Left jump to the left
PgUp or Up+Right jump to the right
Up while running running jump
Shift while falling grab onto a ledge
Sword fighting
Left / Right advance or retreat
Shift strike
Up block
Down put the sword away
(Shift draws it again)
While the game runs
Backspace or Esc pause and open the menu
Space how much time is left
T keep the timer on screen
F6 quicksave
F9 quickload
Ctrl+A restart the level
Ctrl+R back to the title screen
Ctrl+S sound on / off
Ctrl+M music on / off
Ctrl+V show the build version
Ctrl+Q or F10 quit
F10 works everywhere, including the title sequence. Any other key during
the titles or the story screens skips straight into the game.
CHEATS
---------------------------------------------------------------------------
The cheats of the original, and they are on by default in this build. You
can turn them off on the Settings screen.
Shift+L go to the next level
+ / - one minute more / less
K kill the guard
Shift+I turn the screen upside down
Shift+W slow falling
Shift+S restore one hit point
Shift+T one more hit point (up to ten)
[ / ] nudge the prince one pixel
Two cheats of the original are NOT here yet: R (resurrect the prince) and
H / J / U / N with Ctrl+B (look at the neighbouring room).
Debug keys of this port, which the original has no equivalent for. They
all sit under Ctrl so that no plain letter is taken away from the layout
above.
Ctrl+I immortality: off / in combat / almost everything
Ctrl+P speed mode
Ctrl+F freeze the frame, and unfreeze it
Ctrl+D debug bar: level, room, speed, sound, timer
Ctrl++ / Ctrl+- jump to the next / previous room by number
FILES THE GAME WRITES
---------------------------------------------------------------------------
POP.CFG settings
POP.SAV quicksave, and POP.BAK the one before it
POP.HOF hall of fame
All of them appear next to the program, and all of them can be deleted --
the game will simply start from its defaults again.
WHAT IS NOT FINISHED
---------------------------------------------------------------------------
All fourteen levels have been played through. The port is still under
active development, so rough edges do turn up; the ones we know about are
tracked in the project's own bug list.
Missing against the original: the R cheat (resurrect the prince), the
H / J / U / N and Ctrl+B cheats for looking at neighbouring rooms, and the
screenshot key (F12).
CREDITS
---------------------------------------------------------------------------
Prince of Persia was created by Jordan Mechner in 1989.
The mechanics of this port were checked against SDLPoP
(github.com/NagyD/SDLPoP), which is the authoritative reading of how the
original engine behaves. The graphics come from the MS-DOS release, the
sound effects from its DIGISND files, and the music from recordings of the
DOS soundtrack.
The port itself is built with sprinter-cc, our SDCC-based toolchain for the
Sprinter Sp2000.
+130
View File
@@ -0,0 +1,130 @@
===========================================================================
SprPoP -- Prince of Persia для Sprinter Sp2000
===========================================================================
Порт игры Prince of Persia Джордана Мехнера (1989) на Sprinter Sp2000.
Графика взята из VGA-версии для MS-DOS, режим 320x256 с палитрой на 256
цветов; музыка и звуковые эффекты - оригинальные оцифровки, играются через
канал CBL. В игре все четырнадцать уровней, заставка, экраны истории,
вступление с принцессой и Джафаром, финал и таблица рекордов.
ЗАПУСК
---------------------------------------------------------------------------
Из командной строки DSS, на том диске, где лежит игра:
sprpop
Рядом с программой должны лежать её каталоги с данными:
BG\ тайлы фона KID\ принц
GUARD\ стражи SKEL\ скелет
VIZIER\ Джафар SHADOW\ тень
SND\ звуковые эффекты MUS\ музыка
FONT\ шрифт TITLE\ заставка
PV\ история и вступление LEVELS\ четырнадцать уровней
Без какого-нибудь каталога игра всё равно запустится, но то, что в нём
лежало, окажется беззвучным или невидимым.
УПРАВЛЕНИЕ
---------------------------------------------------------------------------
Бег и лазание
Влево / Вправо повернуться или бежать
Вверх прыжок или подтянуться
Вниз присесть или спуститься
Вниз + Влево/Вправо прыжок на месте
Shift подобрать предмет
Shift + Влево/Вправо осторожный шаг
Home или Вверх+Влево прыжок влево
PgUp или Вверх+Вправо прыжок вправо
Вверх на бегу прыжок с разбега
Shift в падении зацепиться за карниз
Бой на мечах
Влево / Вправо наступать или отступать
Shift удар
Вверх защита
Вниз убрать меч
(Shift достаёт его снова)
По ходу игры
Backspace или Esc пауза и меню
Пробел сколько осталось времени
T держать таймер на экране
F6 быстрое сохранение
F9 быстрая загрузка
Ctrl+A начать уровень заново
Ctrl+R вернуться к заставке
Ctrl+S звук вкл / выкл
Ctrl+M музыка вкл / выкл
Ctrl+V показать версию сборки
Ctrl+Q или F10 выход
F10 работает везде, в том числе во время заставки. Любая другая клавиша на
заставке или на экранах истории пропускает их и начинает игру.
ЧИТЫ
---------------------------------------------------------------------------
Читы оригинала; в этой сборке они включены по умолчанию. Выключить можно на
экране настроек.
Shift+L следующий уровень
+ / - на минуту больше / меньше
K убить стража
Shift+I перевернуть экран
Shift+W медленное падение
Shift+S вернуть одну единицу здоровья
Shift+T прибавить здоровья (до десяти)
[ / ] подвинуть принца на пиксель
Двух читов оригинала пока нет: R (воскресить принца) и H / J / U / N вместе
с Ctrl+B (посмотреть соседнюю комнату).
Отладочные клавиши этого порта, которых в оригинале нет вовсе. Все они под
Ctrl, чтобы не занимать простые буквы из раскладки выше.
Ctrl+I бессмертие: выкл / в бою / почти во всём
Ctrl+P режим скорости
Ctrl+F остановить кадр и снова пустить
Ctrl+D отладочная строка: уровень, комната, скорость, звук
Ctrl++ / Ctrl+- перейти в следующую / предыдущую комнату по номеру
ФАЙЛЫ, КОТОРЫЕ СОЗДАЁТ ИГРА
---------------------------------------------------------------------------
POP.CFG настройки
POP.SAV быстрое сохранение, POP.BAK - предыдущее
POP.HOF таблица рекордов
Все они появляются рядом с программой, и любой можно удалить - игра просто
начнёт со значений по умолчанию.
ЧТО ЕЩЁ НЕ ГОТОВО
---------------------------------------------------------------------------
Все четырнадцать уровней пройдены. Порт продолжает развиваться, так что
шероховатости ещё встречаются; те, о которых мы знаем, ведутся в списке
багов проекта.
Против оригинала не хватает: чита R (воскресить принца), читов H / J / U / N
и Ctrl+B для осмотра соседних комнат и клавиши снимка экрана (F12).
БЛАГОДАРНОСТИ
---------------------------------------------------------------------------
Prince of Persia придумал и написал Джордан Мехнер в 1989 году.
Механика этого порта сверялась с SDLPoP (github.com/NagyD/SDLPoP) - это
самое точное прочтение того, как ведёт себя оригинальный движок. Графика
взята из версии для MS-DOS, звуковые эффекты - из её файлов DIGISND, музыка
- из записей саундтрека DOS-версии.
Сам порт собран нашим компилятором sprinter-cc на основе SDCC для Sprinter
Sp2000.
+134
View File
@@ -0,0 +1,134 @@
===========================================================================
SprPoP -- Prince of Persia for the Sprinter Sp2000
===========================================================================
A port of Jordan Mechner's Prince of Persia (1989) to the Sprinter Sp2000.
The graphics are the VGA ones from the MS-DOS release, in 320x256 with a
256-colour palette; the music and the sound effects are the digitised
originals, played through the CBL channel. All fourteen levels, the title
sequence, the story screens, the intro with the Princess and Jaffar, the
ending and the hall of fame are in.
RUNNING IT
---------------------------------------------------------------------------
From the DSS prompt, on the drive the game sits on:
sprpop
The game needs its data directories next to the program:
BG\ background tiles KID\ the prince
GUARD\ guards SKEL\ the skeleton
VIZIER\ Jaffar SHADOW\ the shadow
SND\ sound effects MUS\ music
FONT\ text font TITLE\ title screens
PV\ story and intro screens LEVELS\ the fourteen levels
If a directory is missing the game still starts, but whatever lived there
will be silent or invisible.
CONTROLS
---------------------------------------------------------------------------
Running and climbing
Left / Right turn, or run
Up jump, or climb up
Down crouch, or climb down
Down + Left/Right hop
Shift pick things up
Shift + Left/Right careful step
Home or Up+Left jump to the left
PgUp or Up+Right jump to the right
Up while running running jump
Shift while falling grab onto a ledge
Sword fighting
Left / Right advance or retreat
Shift strike
Up block
Down put the sword away
(Shift draws it again)
While the game runs
Backspace or Esc pause and open the menu
Space how much time is left
T keep the timer on screen
F6 quicksave
F9 quickload
Ctrl+A restart the level
Ctrl+R back to the title screen
Ctrl+S sound on / off
Ctrl+M music on / off
Ctrl+V show the build version
Ctrl+Q or F10 quit
F10 works everywhere, including the title sequence. Any other key during
the titles or the story screens skips straight into the game.
CHEATS
---------------------------------------------------------------------------
The cheats of the original, and they are on by default in this build. You
can turn them off on the Settings screen.
Shift+L go to the next level
+ / - one minute more / less
K kill the guard
Shift+I turn the screen upside down
Shift+W slow falling
Shift+S restore one hit point
Shift+T one more hit point (up to ten)
[ / ] nudge the prince one pixel
Two cheats of the original are NOT here yet: R (resurrect the prince) and
H / J / U / N with Ctrl+B (look at the neighbouring room).
Debug keys of this port, which the original has no equivalent for. They
all sit under Ctrl so that no plain letter is taken away from the layout
above.
Ctrl+I immortality: off / in combat / almost everything
Ctrl+P speed mode
Ctrl+F freeze the frame, and unfreeze it
Ctrl+D debug bar: level, room, speed, sound, timer
Ctrl++ / Ctrl+- jump to the next / previous room by number
FILES THE GAME WRITES
---------------------------------------------------------------------------
POP.CFG settings
POP.SAV quicksave, and POP.BAK the one before it
POP.HOF hall of fame
All of them appear next to the program, and all of them can be deleted --
the game will simply start from its defaults again.
WHAT IS NOT FINISHED
---------------------------------------------------------------------------
All fourteen levels have been played through. The port is still under
active development, so rough edges do turn up; the ones we know about are
tracked in the project's own bug list.
Missing against the original: the R cheat (resurrect the prince), the
H / J / U / N and Ctrl+B cheats for looking at neighbouring rooms, and the
screenshot key (F12).
CREDITS
---------------------------------------------------------------------------
Prince of Persia was created by Jordan Mechner in 1989.
The mechanics of this port were checked against SDLPoP
(github.com/NagyD/SDLPoP), which is the authoritative reading of how the
original engine behaves. The graphics come from the MS-DOS release, the
sound effects from its DIGISND files, and the music from recordings of the
DOS soundtrack.
The port itself is built with sprinter-cc, our SDCC-based toolchain for the
Sprinter Sp2000.
+67 -28
View File
@@ -90,13 +90,22 @@
#define SET_HEAD2 (SET_HEAD1 + 4 * SET_STEP + SET_HEAD_GAP) #define SET_HEAD2 (SET_HEAD1 + 4 * SET_STEP + SET_HEAD_GAP)
#define SET_HEAD3 (SET_HEAD2 + 3 * SET_STEP + SET_HEAD_GAP) #define SET_HEAD3 (SET_HEAD2 + 3 * SET_STEP + SET_HEAD_GAP)
/* CONTROLS: число строк зависит от того, включены ли читы, поэтому верх /* CONTROLS — ДВЕ КОЛОНКИ. В одну колонку раскладка уже не помещалась:
* блока считается в рантайме. */ * после приведения клавиш к keys.txt (docs/keys_plan.md) их стало вдвое
#define CTRL_TITLE_GAP 20 * больше, а по высоте есть только 200 точек на всё вместе с заголовком.
#define CTRL_N_BASE 7 /* общие клавиши */ *
#define CTRL_N_CHEAT 5 /* дополнительные строки читов */ * Слева — игра (бег, лазание, бой), справа — служебное и читы. Число строк
#define CTRL_COL_KEY 45 * в колонках разное и зависит от того, включены ли читы, поэтому высота
#define CTRL_COL_DESC 145 * блока считается в рантайме по ДЛИННОЙ колонке. */
#define CTRL_TITLE_GAP 18
#define CTRL_N_LEFT 10 /* игровые клавиши */
#define CTRL_N_SYS 7 /* служебные */
#define CTRL_N_CHEAT 5 /* читы: показываются, только если включены */
#define CTRL_L_KEY 6
#define CTRL_L_DESC 62
#define CTRL_R_KEY 164
#define CTRL_R_DESC 220
#define CTRL_STEP 13
/* ABOUT = ровно тот же текст, что на стартовом Sprinter screen, минус /* ABOUT = ровно тот же текст, что на стартовом Sprinter screen, минус
* строка про клавиши. ABOUT_H — и высота блока, и смещение ПОСЛЕДНЕЙ * строка про клавиши. ABOUT_H — и высота блока, и смещение ПОСЛЕДНЕЙ
@@ -317,39 +326,69 @@ static void settings_draw(uint8_t sel)
/* Две колонки «клавиша — что делает». Первые CTRL_N_BASE строк общие, за /* Две колонки «клавиша — что делает». Первые CTRL_N_BASE строк общие, за
* ними идут читовые: их показываем, только когда читы включены. */ * ними идут читовые: их показываем, только когда читы включены. */
static const char * const ctrl_key[CTRL_N_BASE + CTRL_N_CHEAT] = { /* ЛЕВАЯ КОЛОНКА — игра. Строка «IN A FIGHT» здесь заголовок, а не клавиша:
"ARROWS", "SHIFT", "ESC", "F6 / F9", "CTRL+S", "CTRL+M", "P", * ниже неё те же стрелки и Shift означают уже другое, и без разделителя
"K", "I", "SHIFT+L", "U", "F7 / F8" * список читался бы как противоречивый. */
static const char * const ctrl_l_key[CTRL_N_LEFT] = {
"ARROWS", "UP", "DOWN", "SHIFT", "SH+ARROWS", "HOME PGUP",
"IN A FIGHT", "SHIFT", "UP", "DOWN"
};
static const char * const ctrl_l_desc[CTRL_N_LEFT] = {
"RUN / TURN", "JUMP, CLIMB", "CROUCH", "PICK UP", "CAREFUL STEP",
"JUMP L / R",
"", "STRIKE", "BLOCK", "SHEATHE"
}; };
static const char * const ctrl_desc[CTRL_N_BASE + CTRL_N_CHEAT] = { /* ПРАВАЯ КОЛОНКА — служебное, ниже читы. */
"MOVE / JUMP", "ACTION", "PAUSE MENU", "SAVE / LOAD", "SOUND", "MUSIC", static const char * const ctrl_r_key[CTRL_N_SYS + 1 + CTRL_N_CHEAT] = {
"SPEED", "BACKSPACE", "SPACE", "T", "F6 / F9", "CTRL+A", "CTRL+S M", "CTRL+Q F10",
"KILL GUARD", "IMMORTAL", "NEXT LEVEL", "FLIP SCREEN", "TIME - / +" "CHEATS",
"SHIFT+L", "K", "+ / -", "SHIFT+I", "SHIFT+S T"
}; };
static const char * const ctrl_r_desc[CTRL_N_SYS + 1 + CTRL_N_CHEAT] = {
"MENU", "TIME LEFT", "SHOW TIMER", "SAVE / LOAD", "RESTART LVL",
"SOUND / MUSIC", "QUIT",
"",
"NEXT LEVEL", "KILL GUARD", "TIME + / -", "FLIP SCREEN", "HEAL / MAX HP"
};
/* Одна строка колонки: слева клавиша, справа что она делает. Пустое
* описание — значит строка была заголовком секции, и клавишу мы печатаем
* как есть, без второго столбца. */
static void ctrl_row(int kx, int dx, int y, const char *key, const char *desc)
{
pop_text_draw_mapped(POP_TEXT_SMALL, kx, y, key);
if (desc[0]) pop_text_draw_mapped(POP_TEXT_SMALL, dx, y, desc);
}
static void controls_draw(void) static void controls_draw(void)
{ {
uint8_t back = ui_begin(); uint8_t back = ui_begin();
/* С выключенными читами вместо пяти строк идёт одна пояснительная — /* С выключенными читами правая колонка короче: вместо пяти строк идёт
* список короче, и блок обязан центрироваться по ФАКТИЧЕСКОЙ высоте. */ * одна пояснительная. Блок центрируется по ДЛИННОЙ из двух колонок. */
uint8_t cheats = pop_settings.cheats_enabled; uint8_t cheats = pop_settings.cheats_enabled;
uint8_t rows = (uint8_t)(cheats ? CTRL_N_BASE + CTRL_N_CHEAT uint8_t rright = (uint8_t)(cheats ? CTRL_N_SYS + 1 + CTRL_N_CHEAT
: CTRL_N_BASE + 1); : CTRL_N_SYS + 1);
uint8_t rows = (uint8_t)(rright > CTRL_N_LEFT ? rright : CTRL_N_LEFT);
uint8_t i; uint8_t i;
int top = UI_CENTER_TOP(POP_FONT_BIG_ASCENT + CTRL_TITLE_GAP + int top = UI_CENTER_TOP(POP_FONT_BIG_ASCENT + CTRL_TITLE_GAP +
(int)(rows - 1) * SET_STEP); (int)(rows - 1) * CTRL_STEP);
int y = top + POP_FONT_BIG_ASCENT; int y0 = top + POP_FONT_BIG_ASCENT;
int y;
pop_text_map(); pop_text_map();
pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, y, "CONTROLS"); pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, y0, "CONTROLS");
y += CTRL_TITLE_GAP; y = y0 + CTRL_TITLE_GAP;
for (i = 0; i < rows; i++) { for (i = 0; i < CTRL_N_LEFT; i++, y += CTRL_STEP)
const char *key = ctrl_key[i], *desc = ctrl_desc[i]; ctrl_row(CTRL_L_KEY, CTRL_L_DESC, y, ctrl_l_key[i], ctrl_l_desc[i]);
if (!cheats && i == CTRL_N_BASE) { key = "CHEATS"; desc = "DISABLED"; } y = y0 + CTRL_TITLE_GAP;
pop_text_draw_mapped(POP_TEXT_SMALL, CTRL_COL_KEY, y, key); for (i = 0; i < rright; i++, y += CTRL_STEP) {
pop_text_draw_mapped(POP_TEXT_SMALL, CTRL_COL_DESC, y, desc); const char *key = ctrl_r_key[i], *desc = ctrl_r_desc[i];
y += SET_STEP;
/* Заголовок секции читов: с выключенными читами он же и объясняет,
* почему список ниже пуст. */
if (i == CTRL_N_SYS && !cheats) desc = "DISABLED";
ctrl_row(CTRL_R_KEY, CTRL_R_DESC, y, key, desc);
} }
pop_text_unmap(); pop_text_unmap();
ui_end(back); ui_end(back);