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 есть и у стража, и у скелета, и у Джафара), а константы
|
||||
# индексов упаковщик делает из имени файла.
|
||||
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 \
|
||||
GUARD/guard.arc SKEL/skel.arc VIZIER/vizier.arc SHADOW/shadow.arc \
|
||||
SND/snd.arc \
|
||||
@@ -409,6 +413,23 @@ $(PACKED)/LEVELS/res20$(1).bin: $(LVL_ORIG)/res20$(1).bin | check-orig
|
||||
endef
|
||||
$(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-kid: $(PACKED)/KID/kid.arc $(PACKED)/KID/kid.pal $(PACKED)/KID/kid.ani
|
||||
resources-actors: $(PACKED)/GUARD/guard.arc $(PACKED)/SKEL/skel.arc \
|
||||
@@ -439,9 +460,9 @@ $(PACKED_FILES) $(GEN_H):
|
||||
@echo "SprPoP: нет $@ — генерирую ресурсы"
|
||||
@$(MAKE) GENERATE=1 $@
|
||||
|
||||
RES_TARGETS := resources resources-bg resources-kid resources-actors \
|
||||
resources-sound resources-music resources-font resources-title \
|
||||
resources-pv resources-levels
|
||||
RES_TARGETS := resources resources-readme resources-bg resources-kid \
|
||||
resources-actors resources-sound resources-music resources-font \
|
||||
resources-title resources-pv resources-levels
|
||||
$(RES_TARGETS):
|
||||
@$(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_HEAD3 (SET_HEAD2 + 3 * SET_STEP + SET_HEAD_GAP)
|
||||
|
||||
/* CONTROLS: число строк зависит от того, включены ли читы, поэтому верх
|
||||
* блока считается в рантайме. */
|
||||
#define CTRL_TITLE_GAP 20
|
||||
#define CTRL_N_BASE 7 /* общие клавиши */
|
||||
#define CTRL_N_CHEAT 5 /* дополнительные строки читов */
|
||||
#define CTRL_COL_KEY 45
|
||||
#define CTRL_COL_DESC 145
|
||||
/* CONTROLS — ДВЕ КОЛОНКИ. В одну колонку раскладка уже не помещалась:
|
||||
* после приведения клавиш к keys.txt (docs/keys_plan.md) их стало вдвое
|
||||
* больше, а по высоте есть только 200 точек на всё вместе с заголовком.
|
||||
*
|
||||
* Слева — игра (бег, лазание, бой), справа — служебное и читы. Число строк
|
||||
* в колонках разное и зависит от того, включены ли читы, поэтому высота
|
||||
* блока считается в рантайме по ДЛИННОЙ колонке. */
|
||||
#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_H — и высота блока, и смещение ПОСЛЕДНЕЙ
|
||||
@@ -317,39 +326,69 @@ static void settings_draw(uint8_t sel)
|
||||
|
||||
/* Две колонки «клавиша — что делает». Первые CTRL_N_BASE строк общие, за
|
||||
* ними идут читовые: их показываем, только когда читы включены. */
|
||||
static const char * const ctrl_key[CTRL_N_BASE + CTRL_N_CHEAT] = {
|
||||
"ARROWS", "SHIFT", "ESC", "F6 / F9", "CTRL+S", "CTRL+M", "P",
|
||||
"K", "I", "SHIFT+L", "U", "F7 / F8"
|
||||
/* ЛЕВАЯ КОЛОНКА — игра. Строка «IN A FIGHT» здесь заголовок, а не клавиша:
|
||||
* ниже неё те же стрелки и Shift означают уже другое, и без разделителя
|
||||
* список читался бы как противоречивый. */
|
||||
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",
|
||||
"SPEED",
|
||||
"KILL GUARD", "IMMORTAL", "NEXT LEVEL", "FLIP SCREEN", "TIME - / +"
|
||||
/* ПРАВАЯ КОЛОНКА — служебное, ниже читы. */
|
||||
static const char * const ctrl_r_key[CTRL_N_SYS + 1 + CTRL_N_CHEAT] = {
|
||||
"BACKSPACE", "SPACE", "T", "F6 / F9", "CTRL+A", "CTRL+S M", "CTRL+Q F10",
|
||||
"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)
|
||||
{
|
||||
uint8_t back = ui_begin();
|
||||
/* С выключенными читами вместо пяти строк идёт одна пояснительная —
|
||||
* список короче, и блок обязан центрироваться по ФАКТИЧЕСКОЙ высоте. */
|
||||
/* С выключенными читами правая колонка короче: вместо пяти строк идёт
|
||||
* одна пояснительная. Блок центрируется по ДЛИННОЙ из двух колонок. */
|
||||
uint8_t cheats = pop_settings.cheats_enabled;
|
||||
uint8_t rows = (uint8_t)(cheats ? CTRL_N_BASE + CTRL_N_CHEAT
|
||||
: CTRL_N_BASE + 1);
|
||||
uint8_t rright = (uint8_t)(cheats ? CTRL_N_SYS + 1 + CTRL_N_CHEAT
|
||||
: CTRL_N_SYS + 1);
|
||||
uint8_t rows = (uint8_t)(rright > CTRL_N_LEFT ? rright : CTRL_N_LEFT);
|
||||
uint8_t i;
|
||||
int top = UI_CENTER_TOP(POP_FONT_BIG_ASCENT + CTRL_TITLE_GAP +
|
||||
(int)(rows - 1) * SET_STEP);
|
||||
int y = top + POP_FONT_BIG_ASCENT;
|
||||
(int)(rows - 1) * CTRL_STEP);
|
||||
int y0 = top + POP_FONT_BIG_ASCENT;
|
||||
int y;
|
||||
|
||||
pop_text_map();
|
||||
pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, y, "CONTROLS");
|
||||
y += CTRL_TITLE_GAP;
|
||||
for (i = 0; i < rows; i++) {
|
||||
const char *key = ctrl_key[i], *desc = ctrl_desc[i];
|
||||
if (!cheats && i == CTRL_N_BASE) { key = "CHEATS"; desc = "DISABLED"; }
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, CTRL_COL_KEY, y, key);
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, CTRL_COL_DESC, y, desc);
|
||||
y += SET_STEP;
|
||||
pop_text_center_mapped(POP_TEXT_BIG, GFX_WIDTH / 2, y0, "CONTROLS");
|
||||
y = y0 + CTRL_TITLE_GAP;
|
||||
for (i = 0; i < CTRL_N_LEFT; i++, y += CTRL_STEP)
|
||||
ctrl_row(CTRL_L_KEY, CTRL_L_DESC, y, ctrl_l_key[i], ctrl_l_desc[i]);
|
||||
y = y0 + CTRL_TITLE_GAP;
|
||||
for (i = 0; i < rright; i++, y += CTRL_STEP) {
|
||||
const char *key = ctrl_r_key[i], *desc = ctrl_r_desc[i];
|
||||
|
||||
/* Заголовок секции читов: с выключенными читами он же и объясняет,
|
||||
* почему список ниже пуст. */
|
||||
if (i == CTRL_N_SYS && !cheats) desc = "DISABLED";
|
||||
ctrl_row(CTRL_R_KEY, CTRL_R_DESC, y, key, desc);
|
||||
}
|
||||
pop_text_unmap();
|
||||
ui_end(back);
|
||||
|
||||
Reference in New Issue
Block a user