Там же написано, (х) ХАКЕД БЫ оЛЕГ Х, увы. Но навряд ли великая хака Олега зашла дальше замены текста в бинарнике, так что, найдись неиспорченная версия, не составит труда восстановить сообщения.
Вид для печати
Там же написано, (х) ХАКЕД БЫ оЛЕГ Х, увы. Но навряд ли великая хака Олега зашла дальше замены текста в бинарнике, так что, найдись неиспорченная версия, не составит труда восстановить сообщения.
о, а с "моим" шрифтом нормально работает
https://cdn.discordapp.com/attachmen...92/unknown.png
это я как-то пытался сделать шрифт 15ИЭ-00-013 по оригинальному дампу. В текстовых процессорах с ним проблем нет, а консоли нужен моноширинный... пробовал его через питоновский скрипт с гитхаба прогнать, он только флаг моноширинности поставил, но не сделал его по-настоящему моноширинным. Из-за этого в играх вроде сталкера глюки. По-обычному в консоли работать вроде можно. Кому интересно - могу дать .ttf
***
http://images.vfl.ru/ii/1619185522/0...34195981_m.png
http://images.vfl.ru/ii/1619185521/3...34195979_m.png
***
Это кратко ) На самом деле приключений была масса!!!
Надо помнить ещё - на ход по лестнице вверх расход ЭНЕРГИИ = -2
Предметы с заклятием в новом подземелье "очищаются", но могут изменить функционал
(такие как "ВП" или "Свисток").
Если в банке на счету 0 - никто вас не выпустит !!!
- - - Добавлено - - -
да и на вопрос "А дальше пойдёте?" ЕМНИП надо Y жать, а не D )))
А как выбрасывать барахло из рюкзака?
для подсказки жмите ХЭ ;-)
Я проверил в консольной версии всё выкидывается корректно, как и в оригинале (странно если бы было не так, правда?)
НЕ получиться выкинуть:
предметы с заклятьем, ПРИЗРАКА (он будет размножаться каждый раз если к нему приближаться или стоять рядом будет
копировать себя на свободное место в рюкзаке пока оно там есть - очистить только вызвав джина можно, джин за услуги забирает всё из рюкзака, перед вызовом всё съедаем, батареи заменяем, ну в общем понятно с этим...)
Есть момент "читерства" - но сильно влияет на вредность, а соотв. потребность в отдыхе будет расти !!! Когда встаёшь на # она потом превращается в стену ! или -, её не сходя с места можно взять, это можно использовать, когда есть риск быть замурованным ... потом эту стену просто выкидываешь и все дела...
- - - Добавлено - - -
перемещение вещей в рюкзаке требуется для использования одинаковых предметов,
допустим у тебя 2 доспеха, один с заклятьем, второй нет. Функция "Одеть доспехи" (или как оно там), работает на крайний предмет слево (начало массива рюкзака), то есть перемещая предметы ты можешь выбрать какие из двух доспех использовать...
Странное дело! Я был уверен, что у меня это не работает. А сейчас проверил заново и все оказывается в порядке. D + символ, обозначающий предмет и все ок. Видимо заездил себе голову, портируя.
Конечно же сохранилась. В хламничке у hobot-а диск dwkGAMES01.dsk.
Могу предложить подходящий случаю шрифт - https://github.com/nzeemin/robotron-dotmatrix-font
Но там нет виндовых шрифтов, только вебовские.
их вообще куча ;-) STALK.SAV, PIKNIK.GME, - и по размеру, и по текстовым сообщениям могут различаться +
версия для БК11М... есть исходник - в нём все текста можно поправить и пересобрать игру (это под другие платформы \ ОС), а уж в RT-11 можно исполняемый файл как хочешь мучить с помощью DESS
- - - Добавлено - - -Код:STALK .SAV 49P 13-Dec-1991
PIKNIK.SAV 50P 07-Mar-1989
едой запасся, побегу дальше ;-)
Код:ПОДЗЕМЕЛЬЕ 1
3 - - - - - - - - - - - - - - - РЕЙТИНГ 41
! ЭНЕРГИЯ 24
! !ОРУЖИЕ 0
!ЗАЩИТА 5
В БАНКЕ 120
!
! # - - - - ! !ВРЕДНОСТЬ 4
. . . . . . . ! !
. . . . . . . . . ! РЮКЗАК:
! ! . . ! . . ! . . . 5 < : ; : . .
! . . . . . . . ! . . ! . . . !
. ю . - - - . . - - - . . . !
. . . . . . . . . . .
! . . . . . . .
! . . М . . !
- - - - - - - - - - - - - - - - - -
БЕРЕМ
Мне кажется, ошибка в комментарии:
Но судя по использованиюКод:VAR6: integer; { новый X игрока }
VAR10: integer; { новый Y игрока }
VAR12: integer; { Позиция Y игрока (строка) }
VAR14: integer; { Позиция X игрока (столбец) }
а так жеКод:V11070:=@F[VAR4,VAR12,VAR14]; {L03644}
V33074:=@F2[VAR4,VAR12,VAR14]; {L03716}
V11072:=@F[VAR4,VAR6,VAR10]; {L04000}
V33076:=@F2[VAR4,VAR6,VAR10]; {L04052}
ну и по порядку перечисления, VAR6 - это новый Y, а VAR10 - новый X игрокаКод:VAR6:=VAR12+VAR16; { новый Y }
VAR10:=VAR14+VAR20; { новый X }
V11072:=@F[VAR4,VAR6,VAR10]; {L12552}
V33076:=@F2[VAR4,VAR6,VAR10]; {L12624}
Все-таки p2c это не то. Я набрался мужества и спортировал на труъ MT-Pascal для CP/M. Пришлось перепахать очень много, потому что у этого компилятора строгач с максимально допустимым размером процедуры (вот бы во всех компиляторах так было!) и еще кое чем.
Много менял, наверняка чего-то сломал. Текущий сорец в гисте.
Игра для Вектора-06ц (хотя наверное для любого CP/M + vt52 в принципе) тут.
Поиграл сам, конечно, но терпения зайти слишком далеко пока не набралось:
https://i.imgur.com/CZVjvHe.png
Внимательно следим за руками (или я чего то не понимаю?)
Это строки примерно с 419 по 423
Эти два цикла заканчиваются вот здесь (599-600):Код:while true do begin {L12254}
{ Начало игрового цикла }
V11070:=@F[VAR4,VAR12,VAR14]; {L12266}
V33074:=@F2[VAR4,VAR12,VAR14]; {L12340}
for VAR16:=-1 to 1 do begin {L12422}
for VAR20:=-1 to 1 do begin {L12462}
VAR6:=VAR12+VAR16; { новый Y }
VAR10:=VAR14+VAR20; { новый X }
А теперь смотрим внутрь (528-531):Код:end; { for VAR20 }
end; { for VAR16 }
Как минимум VAR16 мы похерили...Код:VAR16:=1;
while (V33122[VAR16] <> V11070^) and (VAR16 < 4) do
VAR16:=VAR16+1;
V33122[VAR16]:=' ';
Или я что то не помню про Паскаль?
Как бы да, походу бага.
Могу ещё про одно место сказать, которое всё время мне кажется подозрительным - в procedure L03362 странные условия по поводу текущего этажа и движения вверх/вниз - я думаю там тоже не всё хорошо.
Но тут уже - мы воссоздали как есть, "художник (автор) так видит". 8-)
- - - Updated - - -
А тем временем, я ещё начал делать JS-версию Сталкера.
https://pic.maxiol.com/thumbs2/16192...kjspreview.png
По поводу кнопок внизу - идея в том чтобы показывать набор команд, который доступен именно в данный момент. Но с сохранением управления с клавиатуры.
Для этой версии приходится разбивать логику на функции, внутри которых нет ожиданий по времени или ожидания ввода от пользователя.
Вот, какой есть https://pastebin.com/LuDivLth
Предположим, рюкзак полон и тут мы встречаем призрака... Пипец рюкзаку...Код:'@': begin {L17200}
WRITE('Призрак.');
VAR22:=RUKSEEK('.','.');
if VAR22 < 7 then
VAR30:=VAR30+1;
RUKSAK[VAR22]:='@';
end;
- - - Добавлено - - -
И? Внешний цикл будет рад смерти звери и запорченной переменной.
А как в Паскале оригинала работает процедура EXIT? Потому что во всех, что мне до сих пор попадались, EXIT выходит из процедуры, или завершает программу, если это main(). Смущает наличие EXIT, выполняющей по смыслу BREAK в районе поиска лестницы
Выход из объемлющего цикла.
Ну да, Exit в этом Паскале работает как Break для циклов. Break() же здесь это процедура, которая по смыслу работает как Flush, скидывает несохранённый буфер в файл.
Есть ли нормальный Exit/Return - не знаю, я не нашёл, поэтому сделал ассемблерной вставкой.
Не исключаю что Return всё-таки есть и просто мы не знаем его синтаксис.
https://ia800500.us.archive.org/4/it..._1.2_RT-11.pdf - я тут смотрю описание на этот Паскаль.
Есть ещё книга от ДВК, но это просто перевод.
В документации не описаны labels и Goto, но на них удалось подобрать работающий синтаксис.
Еще у меня сложилось впечатление, что во всем огромном массиве флагов, который так щедро зарезервирован 16-битными целыми, используются только биты 0,1,2,6,10 (три младших бита для особенностей предметов, 0100 флаг увиденного и 02000 для заклятья). Есть какие-то догадки о том, чем объясняется такая расточительность?
Думаю что ничем особенным, может быть запас на будущее.
Автор явно был отличный сценарист, но в то какой получается на выходе код он не заглядывал - иначе бы оптимизировал многие вещи, там есть моменты когда много раз одни и те же вычисления буквально в нескольких строчках. Утилиту "улучшения кода" IMP от этого Паскаля он тоже не применял. При компиляции Паскаль пишет количество свободных слов - там остаётся ещё значительный запас, т.е. автор не был ограничен по объёму, смог выразить всё что захотел.
А, ещё такой момент мог повлиять, что этот Паскаль не имеет втроенного типа под байт.
Ну да, и основной массив символьный, так что автор про него знал. Но если символьный требует написания все время CHR() и ORD() для битовых операций, например, то понятно почему могло захотеться просто махнуть рукой и взять 16-битный целый. Тем более, что влезло.
- - - Добавлено - - -
Кольцо безусловно становится проклятым после снятия. Наверное и так нет смысла его снимать, но странно.
VAR22 - типа новый этажКод:'U': begin { вызвать джинна }
if (not VAR46) <> false then begin
WRITE('Что, влип? ладно, попробую тебя перенести отсюда. только дороговато это встанет... Ты готов? ');
READCHAR(VAR53);
if VAR53 <> 'N' then begin
for VAR16:=1 to 5 do begin
IND[VAR16]:=IND[VAR16]-RANDOM(0,15);
end;
for VAR16:=1 to 6 do begin {L34504}
RUKSAK[VAR16]:='.';
end;
VAR12:=RANDOM(2,15);
VAR14:=RANDOM(2,31);
Но указатели ставим по старому (VAR4) этажуКод:VAR22:=RANDOM(0,8);
И только сейчас начинаем разбираться с новым?? Если что, то L03362 выставляет указатели только при перемещении между этажамиКод:V11070:=@F[VAR4,VAR12,VAR14];
V33074:=@F2[VAR4,VAR12,VAR14];
И кстати, наверное можно было сделать и так - VAR22:=RANDOM(0,VAR4);
Код:if VAR22 > VAR4 then
VAR22:=VAR4;
VAR4:=VAR22;
L03362('J'); { Обновить экран }
end;
end else
WRITELN('Джинн в отгуле');
end;
Да, это очевидная ошибка. Но она ни на что не влияет -- новые указатели никак не используются и будут прописаны правильными значениями в начале следующей итерации игрового цикла.
Можно. И это лучше соответствует идее. Но оригиналный код будет чаще телепортировать на текущий уровень подземелья, т.е. это изменяет игровую механику.
Всё зависит от RANDOM
- - - Добавлено - - -
VAR22 у нас не меняет только ленивый и в момент разборки с перемещающимся зверем оно вполне может быть 0 или 1. Как и VAR24. Так же вполне может оказаться, что Y или X координаты зверя совпадают с Y или X координатой игрока. И тогда в VAR22 или в VAR24 останутся старые 0 или 1.Код:for VAR16:=1 to 4 do begin {L36262}
if V33122[VAR16] <> ' ' then begin {L36322}
if (V33136[VAR16] <> VAR12) or (V33146[VAR16] <> VAR14) then begin {L36344}
И вот тут мы сажаем зверя по возможной координате с 0 или 1 - если сильно повезёт.Код:if VAR12 > V33136[VAR16] then {L36434}
VAR22:=V33136[VAR16]+1 {L36460}
else if VAR12 < V33136[VAR16] then {L36506}
VAR22:=V33136[VAR16]-1; {L36532}
if VAR14 > V33146[VAR16] then {L36554}
VAR24:=V33146[VAR16]+1 {L36600}
else if VAR14 < V33146[VAR16] then {L36626}
VAR24:=V33146[VAR16]-1; {L36652}
if (F[VAR4,VAR22,VAR24] in ['!','-']) and ((V33126[VAR16] and 6) = 4) then {L36674}
V33122[VAR16]:=' '
else begin
F[VAR4,V33136[VAR16],V33146[VAR16]]:='.';
CURSORTO(V33136[VAR16],V33146[VAR16]);
WRITE('.');
F[VAR4,VAR22,VAR24]:=V33122[VAR16];
CURSORTO(VAr22,VAR24);
WRITE(V33122[VAR16]);
F2[VAR4,VAR22,VAR24]:=V33126[VAR16];
После чего на следующем цикле перемещения он вполне может снести нам краевое ограждение. И у нас образуется дырка в стене за пределы игрового мира. Хороших блужданий в реальном мире :)Код:V33136[VAR16]:=VAR22;
V33146[VAR16]:=VAR24;
CURSORTO(18,0);
WRITE(CHR(33B),CHR(113B))
end;
end;
end;
end;
- - - Добавлено - - -
Вполне себе достижимый. И переставить не игрока, а убегающего зверя.Код:end else if (PROBE_FLAG_PTR^ and 6) = 2 then begin
{ Недостижимый код, см. выше }
{ Попытка переставить игрока на случайную соседнюю ячейку ??? }
TMP_Y:=RANDOM(1,3)-2+MAP_Y;
TMP_X:=RANDOM(1,3)-2+MAP_X;
А теперь вопрос знатокам - убегающий зверь виден на карте? После того как он сбежал из точки, куда встал игрок? Перерисовки зверя на новом положении я не вижу, но если сделать общую перерисовку, то он появляется...
- - - Добавлено - - -
В общем, от значительной части глобальных переменных избавился и основные косяки вроде вычистил
http://www.KpXX.Ru/Soft/Games/StalkerКод:Подземелье 1
0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Рейтинг 0
! @ . . . . . . . . . . . . . . . . . . . . . . . . . . . !Энергия 25
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !Оружие 0
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !Защита 0
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . !В банке 0
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !Вредность 1
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! Рюкзак:
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! ] ( < . . .
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Прогнивший пол провалился...З в е р ь !
да, иначе как его догонять? но - он замирает однажды и / или его надо подловить на диагоналях...
а если ты на него встал как он может быть виден? его жарить надо тогды "Ы"
то что зверь стены крушит - это не баг, а ФИЧА )))
Глобальные переменные зло!!! )))
- - - Добавлено - - -
будет Сталкер под RSX ? Надо бы тогда там правильные надписи вернуть - убрать трупы девушек и снусмумриков со спектрумами и в хэлпе опечатку поправить !!!
насколько я помню зверь ломает всё, но при попытке выйти туда игроком там будет стена всё равно,
выглядело вроде бы так (кирку / золотой шар не найдёшь, не проверишь)
-----
----ю---
- - - Добавлено - - -
бегающий зверь вообще всё ЕМНИП стирает - любые предметы под собой!!!