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:
@@ -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
@@ -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.
|
||||||
Vendored
+134
@@ -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.
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user