unit Beginz;

interface

uses
  SysUtils, loadz, extctrls;

var
  Punkt, PunktHr, PunktCl : byte;
  MenuHr : boolean;
  IsSleep: boolean = true;

type
  aString = string[255];

procedure FstScreen(PointsCount: integer);
procedure FstDialog;
function Menu: boolean;
procedure Help;



implementation

uses
  MyCRT, NewUnit1, Forms, graphics, classes;

const
  HelpStringsCount = 49;

Var
    HelpStrings: array [1..HelpStringsCount] of String =
    (
      '-==[ CyberShock v.0.99 PreRelease ]==-',
      '',
      '',
      'Клавиши управления: ',
      '  ' + KEY_UP + ' - Вперед',
      '  ' + KEY_DOWN + ' - Назад',
      '  ' + KEY_LEFT + ' - Влево',
      '  ' + KEY_RIGHT + ' - Вправо',
      '  ' + KEY_LEFTUP + ' - Влево-вверх',
      '  ' + KEY_LEFTDOWN + ' - Влево-вниз',
      '  ' + KEY_RIGHTUP + ' - Вправо-вверх',
      '  ' + KEY_RIGHTDOWN + ' - Вправо-вниз',
      '  ' + KEY_USE + ' - Использовать',
      '  ' + KEY_READ + ' - Прочитать',
      '  ' + KEY_ATTACK + ' - Выстрел',
      '  ' + KEY_RELOAD + ' - Перезаряжить оружие',
      '  ' + KEY_UNLOAD + ' - Разрядить оружие',
      '  ' + KEY_CHARACTER + ' - Меню характеристик героя',
      '  ' + KEY_NOW + ' - Список оружия и брони на герое',
      '  ' + KEY_DIG + ' - Копать (при наличии лопаты)',
      '  ' + KEY_SLEEP + ' - Заснуть',
      '  ' + KEY_MISS + ' - Пропустить ход',
      '  ' + KEY_TIME + ' - Узнать текущее игровое время',
      '  ' + KEY_LEVELUP + ' - Распределить свободные очки опыта (при наличии)',
      '  ' + KEY_CLOSE + ' - Закрыть дверь',
      '  ' + KEY_INV_DROP + ' - Бросить вещь (в меню инвентаря)',
      '  ' + KEY_INV_STRENGTH_DROP + ' - Швырнуть вещь (в меню инвентаря)',
      '  ' + KEY_INV_HELP + ' - Информация о предмете (в меню инвентаря)',
      '  ' + KEY_SAVE + ' - Сохранить игру',
      '  ' + KEY_LOAD + ' - Загрузить игру',
      '  ' + KEY_EXIT + ' - При возможности выход на главную локацию',
      '  ' + KEY_INFRARED + ' - Надеть инфракрасные очки (если есть)',
      '  ' + KEY_HACK + ' - Попытаться взломать кодовую дверь',
      '  ' + KEY_PASS_INPUT + ' - Ввести пароль (во время взлома двери)',
      '  ' + KEY_INVENTORY + ' - просмотр инвентаря',
      '  ' + KEY_NEUTRALIZE_TRAP + ' - попытаться нейтрализовать обнаруженную ловушку',
      '  ' + KEY_PRISON_DOWN + ' - спуститься на уровень вниз в подземелье',
      '  (или в локацию с главной карты))',
      '  ' + KEY_PRISON_UP + ' - подняться на уровень вверх в подземелье',
      '  (или выйти на главную карту при возможности)',
      '  ' + KEY_LAST_MESSAGES + ' - 47 последних сообщений игры',
      '  ' + KEY_LOOKMODE + ' - вкл\выкл режим исследователя',
      '  ' + KEY_SCREENSHOT_HTML + ' - сделать скриншот игры в формате HTML',
      '  BackSpace - сделать скриншот игры в формате TXT',
      '  ' + KEY_HELP + ' - показать экран помощи',
      '  ' + KEY_SUICIDE + '(в режиме разведки) - дать боту команду на самоубийство',
      ''
    );

procedure FstDialog;
Begin
  ClrScr;
  TextColor(LightGray);
  GotoXY(1, 1);
  WriteLn(' Глухие, далекие звуки становились все более ясными, словно кто-то вынул из ушей вату. Сознание');
  WriteLn('возвращалось к нему не спеша, осторожно, словно испуганный зверек, выверяя каждый шаг перед собой.');
  WriteLn('Он почувствовал, что лежит на чем-то твердом. Осторожно пошарил правой ладонью под собой.');
  WriteLn(' "Доски. Это деревянный пол".');
  WriteLn(' Абсолютную тишину вокруг нарушал только мерный гул электрогенератора за окном.');
  WriteLn(' "Где я?"');
  ReadKey;
  WriteLn(' Человек открыл глаза. Скудный свет подвешенной под потолком лампочки ослепил его, человек застонал');
  WriteLn('и прикрыл лицо ладонями.');
  WriteLn(' Из того, что попалось ему на глаза, человек понял, что лежит в каком-то доме. Слабый ветерок');
  WriteLn('колыхал выцветшие и ободранные занавески, за ними можно было разглядеть силуэт вдребезги');
  WriteLn('разбитого окна. Осколками был усеян весь пол и подоконник.');
  WriteLn(' "Что здесь произошло?"');
  ReadKey;
  WriteLn(' Человек попытался приподняться. Ладони уперлись в пол, он почувствовал какую-то липкую холодную');
  WriteLn('субстанцию под левой рукой. Инстинктивно одернул руку, поднес ее к лицу. Темно-красный цвет не');
  WriteLn('оставлял ни малейших сомнений. В глазах человека потемнело, он уставился на ладонь, вертя ее перед');
  WriteLn('глазами.');
  WriteLn(' "Кровь. Здесь целая лужа крови!"');
  ReadKey;
  WriteLn(' Сердце забилось с удвоенной скоростью. Человек предпринял еще одну попытку встать и оглядеть');
  WriteLn('комнату.');
  WriteLn(' Резкая боль пронзило все его тело, а от увиденного похолодела спина. Кровью была залита вся');
  WriteLn('комната, багровые разводы покрывали пол и стены. По углам в самых незадачливых позах лежали тела,');
  WriteLn('в открытых глазах некоторых застыла гримаса ужаса. Взгляд человека в панике метался от одного');
  WriteLn('неподвижного лица к другому. То, что память даже не собиралась проливать хоть какой-то свет на');
  WriteLn('произошедшее, играло только на руку липкому страху, который медленно, но верно пробирался в душу.');
  WriteLn(' "Надо просто успокоиться и сосредоточиться. Здесь была какая-то стычка... На многих телах есть');
  WriteLn('пулевые ранения, значит, не обошлось без перестрелки. Но все убитые в одной и той же военной');
  WriteLn('форме... Больше похоже на бойню".');
  ReadKey;
  WriteLn(' Человек вытянул перед собой руки.');
  WriteLn(' "Точно такая же форма. Нашивка с разинувшей пасть змеей на локте, как и у всех остальных. Вторая');
  WriteLn('нашивка с надписью "' + data.name + '" на груди. Звучит подозрительно знакомо... Кажется, это мое имя".');
  WriteLn(' Человек опустил глаза. Чуть повыше его правого бедра ткань была разорвана и пропитана кровью.');
  WriteLn(' "Кем бы ни были убийцы, они явно проделали все в спешке. Стреляли наугад, никаких контрольных');
  WriteLn('в голову, никаких проверок на то, остался ли еще кто-то в живых".');
  ReadKey;
  WriteLn('');
  WriteLn(' Гулкий удар по целому окошку в дальнем конце комнаты оторвал его от размышлений и мигом вернул в');
  WriteLn('реальный мир. Гнилое, покрытое струпьями лицо бросило взгляд немигающих глаз в его сторону. Не');
  WriteLn('шевелясь, ходячий мертвец и ' + data.name + ' несколько секунд смотрели друг на друга. Наконец мертвецу');
  WriteLn('это надоело. Прорычав что-то нечленораздельное, он оторвался от окна и с кряхтением отправился дальше.');
  WriteLn('Превозмогая боль, ' + data.name + ' поднялся на ноги.');
  WriteLn(' "Я не один в округе. Пора выбираться отсюда".');
  Readkey;
end;

procedure ClearHelp;
var
  i, j: byte;
begin
  for j := 3 to RESOLUTION_Y - 15 do
    for i := (RESOLUTION_X div 2) + 1 to RESOLUTION_X - 1 do
      PutSymbol(i, j, black, ' ');
end;

procedure WriteHelp(num: integer);
var
  s, aWord: string;
  i, len: integer;
  cx, cy: integer;
begin
  ClearHelp;
  case num of
    0: s := 'Выберите характеристики, которые хотите улучшить. Нажмите Esc, чтобы пропустить процесс и распределить очки позже.';
    1: s := 'Физическая характеристика героя. Влияет на силу удара и максимальный переносимый вес.';
    2: s := 'Влияет на мастерство торговли, торговцы охотнее делают скидки при покупке и добавляют золота сверху при продаже. Также повышает шансы не испортить оружие при установке улучшения.';
    3: s := 'Влияет на количество золота, которое находит игрок, понемногу повышает все характеристики.';
    4: s := 'Влияет на уровень максимального здоровья и на то, как быстро герой будет уставать.';
    5: s := 'Повышает шансы удачной установки улучшений на оружие, обнаружения ловушек.';
    6: s := 'Повышает шансы обнаружения и устранения ловушек.';
    7: s := 'Имеют ли хоть какое-то значение боевые характеристики персонажа, если он промахивается через раз? Меткий персонаж не допустит такого.';
    8: s := 'Способность персонажа безболезненно переносить раны.';
    9: s := 'Совершенствуясь во владении оружием, персонаж наносит более сильные удары, реже промахивается.';
    10: s := 'Сопротивляемость персонажа слепоте, глухоте, контузии, болезни и прочим подобным неприятностям.';
  end;
  cx := wherex;
  cy := wherey;
  gotoxy(RESOLUTION_X div 2 + 2, 3);
  TextColor(White);
  i := 1;
  len := Length(s);
  while (i < len) do
  begin
    while (i <= len) and (s[i] = ' ') do
      inc(i);
    aWord := '';
    while (s[i] <> ' ') and (i <= len) do
    begin
      aWord := aWord + s[i];
      inc(i);
    end;
    if (wherex + Length(aWord) < RESOLUTION_X - 1) then
      write(aWord)
    else
    begin
      gotoxy(RESOLUTION_X div 2 + 2, wherey + 1);
      write(aWord);
    end;
    write(' ');
  end;
  gotoxy((RESOLUTION_X div 2) + 2, RESOLUTION_Y + 4);
  TextColor(LightRed);
  write(STR_YOUR_POINTS + inttostr(data.expoints));
  gotoxy(cx, cy);
end;

procedure WriteStatus;
var
  cx, cy: integer;
begin
  TextColor(White);
  cx := wherex;
  cy := wherey;
  GotoXY(3, RESOLUTION_Y + 3);
  write(STR_YOUR_HEALTH + inttostr(data.max_health));
  While (wherex < (RESOLUTION_X div 2) - 1) do
    write(' ');
  GotoXY(3, wherey + 1);
  write(STR_MAX_WEIGHT + Weight(data.maxweight) + STR_KG);
  While (wherex < (RESOLUTION_X div 2) - 1) do
      write(' ');
  GotoXY(cx, cy);
end;

procedure WriteSkill(num: integer; ShowHelp: boolean = true);
begin
  case num of
    1: write(STR_SKILL_STRENGTH);
    2: write(STR_SKILL_INTELLECT);
    3: write(STR_SKILL_LUCK);
    4: write(STR_SKILL_STAMINA);
    5: write(STR_SKILL_ATTENTION);
    6: write(STR_SKILL_AGILITY);
    7: write(STR_SKILL_ACCURACY);
    8: write(STR_SKILL_PROTECT);
    9: write(STR_SKILL_WEAPON);
    10: write(STR_SKILL_RESISTANCE);
  end;
  while (wherex < (RESOLUTION_X div 2) - 4) do
    write('.');
  write(' ');
  case num of
    1: write(IntToStr(data.strength));
    2: write(IntToStr(data.intellect));
    3: write(IntToStr(data.Luck));
    4: write(IntToStr(data.Stamina));
    5: write(IntToStr(data.Attention));
    6: write(IntToStr(data.Agility));
    7: write(IntToStr(data.Accuracy));
    8: write(IntToStr(data.Protect_base));
    9: write(IntToStr(data.Weapon));
    10: write(IntToStr(data.Resistance));
  end;
  while (wherex < (RESOLUTION_X div 2) - 1) do
    write(' ');
  if (ShowHelp) then
    WriteHelp(num);
end;

procedure aSkill(num: integer; IsActive: boolean);
var
  cx, cy: byte;
begin
  cx := wherex;
  cy := wherey;
  gotoxy(3, 2 + num);
  if (IsActive) then
    TextColor(LightRed)
  else
    TextColor(White);
  WriteSkill(num, IsActive);
  GotoXY(cx, cy);
end;

procedure IncSkill(num: integer);
begin
  if (data.expoints <= 0) then
    exit;
  case num of
    1:
    begin
      inc(data.strength);
      inc(data.maxweight, INC_MAXWEIGTH);
      WriteStatus;
    end;
    2: inc(data.Intellect);
    3: inc(data.Luck);
    4:
    begin
      inc(data.Stamina);
      inc(data.max_health, INC_MAXHEALTH);
      WriteStatus;
    end;
    5: inc(data.Attention);
    6: inc(data.Agility);
    7: inc(data.Accuracy);
    8: inc(data.Protect_base);
    9: inc(data.Weapon);
    10: inc(data.Resistance);
  end;
  dec(data.expoints);
end;

procedure DecSkill(num: integer);
begin
  case num of
    1:
      if (data.strength > 0) then
      begin
        dec(data.strength);
        dec(data.maxweight, INC_MAXWEIGTH);
        inc(data.expoints);
        WriteStatus;
      end;
    2:
      if (data.intellect > 0) then
      begin
        dec(data.intellect);
        inc(data.expoints);
      end;
    3:
      if (data.Luck > 0) then
      begin
        dec(data.Luck);
        inc(data.expoints);
      end;
    4:
      if (data.Stamina > 0) then
      begin
        dec(data.Stamina);
        dec(data.max_health, INC_MAXHEALTH);
        inc(data.expoints);
        WriteStatus;
      end;
    5:
      if (data.Attention > 0) then
      begin
        dec(data.Attention);
        inc(data.expoints);
      end;
    6:
      if (data.Agility > 0) then
      begin
        dec(data.Agility);
        inc(data.expoints);
      end;
    7:
      if (data.Accuracy > 0) then
      begin
        dec(data.Accuracy);
        inc(data.expoints);
      end;
    8:
      if (data.Protect_base > 0) then
      begin
        dec(data.Protect_base);
        inc(data.expoints);
      end;
    9:
      if (data.Weapon > 0) then
      begin
        dec(data.Weapon);
        inc(data.expoints);
      end;
    10:
      if (data.Resistance > 0) then
      begin
        dec(data.Resistance);
        inc(data.expoints);
      end;
  end;
end;

procedure SkillMenu(Count: integer);
var
  i: integer;
begin
  for i := 1 to Count do
  begin
    GotoXY(3, 3 + i - 1);
    WriteSkill(i, false);
  end;
  WriteStatus;
end;

procedure FstScreen(PointsCount: integer);
var
  active: integer;
  c: char;
  i, j: integer;
begin
  Clrscr;
  TextColor(White);
  Ramka(White, 1);
  data.expoints := PointsCount;
  for j := 1 to RESOLUTION_Y + HUDSIZE - 1 do
    WriteChrXY((RESOLUTION_X div 2), j, '|');
  WriteChrXY((RESOLUTION_X div 2), 1, '+');
  WriteChrXY((RESOLUTION_X div 2), RESOLUTION_Y + HUDSIZE - 1, '+');
  i := (RESOLUTION_X - Length(STR_PRESS_ESCAPE)) div 2;
  TextColor(LightGray);
  GotoXY(i, RESOLUTION_Y + HUDSIZE);
  write(STR_PRESS_ESCAPE);
  TextColor(White);
  SkillMenu(SKILL_COUNT);
  WriteSkill(0);
  active := 1;
  repeat
    aSkill(active, true);
    c := readkey;
    case c of
      KEY_UP:
      begin
        aSkill(active, false);
        if (active > 1) then
          dec(active)
        else
          active := SKILL_COUNT;
      end;
      KEY_DOWN:
      begin
        aSkill(active, false);
        if (active = SKILL_COUNT) then
          active := 1
        else
          inc(active);
      end;
      KEY_RIGHT:
        IncSkill(active);
      KEY_LEFT:
        DecSkill(active);
    end;
  until (c in ['s', 'S']);
end;

procedure WriteMenu;
var
  i, j, k: integer;
  cx, cy: integer;
begin
  TextColor(Brown);
  i := 0;
  for j := 1 to MenuItemsCount do
    if Length(STR_MENUARR[j]) > i then
      i := Length(STR_MENUARR[j]);
  i := i + 8;
  GoToXY((RESOLUTION_X - i) div 2, ((RESOLUTION_Y + HUDSIZE - MenuItemsCount) div 2) - 2);
  cx := WhereX;
  cy := WhereY;
  Write('+');
  DrawSymbol(WhereX - 1, WhereY + MenuItemsCount + 3, '+', Brown);
  for j := 2 to i - 1 do
  begin
    Write('=');
    DrawSymbol(WhereX - 1, WhereY + MenuItemsCount + 3, '=', Brown);
  end;
  Write('+');
  DrawSymbol(WhereX - 1, WhereY + MenuItemsCount + 3, '+', Brown);
  GoToXY(cx, cy + 1);
  Write('|');
  for i := 2 to j - 1 do
    Write(' ');
  Write('|');
  GoToXY(cx, cy + 2);
  Write('|');
  for k := 2 to j - 1 do
    Write(' ');
  Write('|');
  for j := 1 to MenuItemsCount do
  begin
    GoToXY(cx, cy + j + 2);
    Write('|');
    for k := 2 to i - 1 do
      Write(' ');
    Write('|');
    GoToXY((RESOLUTION_X - Length(STR_MENUARR[j])) div 2, cy + j + 1);
    TextColor(LightGray);
    Write(STR_MENUARR[j]);
    TextColor(Brown);
  end;
end;

procedure WriteActive;
begin
  GoToXY(((RESOLUTION_X - Length(STR_MENUARR[punkt])) div 2) - 2, ((RESOLUTION_Y + HUDSIZE - MenuItemsCount - 3) div 2) + punkt);
  TextColor(White);
  Write('[ ' + STR_MENUARR[punkt] + ' ]');
end;

Procedure ClearScreen;
var
  i, j: integer;
begin
  for j := 2 to RESOLUTION_Y do
    for i := 2 to RESOLUTION_X - 1 do
      PutSymbol(i, j, Black, ' ');
end;

procedure help;
var
  StartString: integer;
  i: integer;
  c: char;
begin
  StartString := 0;
  TextColor(White);
  ClearScreen;
  repeat
    if StartString > 0 then
      PutSymbol(3, 1, LightBlue, chr(30))
    else
      PutSymbol(3, 1, brown, '=');
    if (StartString + RESOLUTION_Y - 3) < Length(HelpStrings) then
      PutSymbol(3, RESOLUTION_Y + HUDSIZE, LightBlue, chr(31))
    else
      PutSymbol(3, RESOLUTION_Y + HUDSIZE, brown, '=');
    TextColor(White);
    for i := 1 to RESOLUTION_Y - 4 do
    begin
      if (i + StartString < HelpStringsCount) then
      begin
        gotoxy(3, i + 2);
        write(HelpStrings[i + StartString]);
      end;
    end;
    c := readkey;
    if (c = KEY_UP) then
    begin
      if (StartString > 0) then
        dec(StartString);
    end
    else if (c = KEY_DOWN) then
    begin
      if (StartString + RESOLUTION_Y - 3) < HelpStringsCount then
        inc(StartString);
    end;
  until ((c = KEY_ESCAPE) or (c = KEY_RETURN));
end;

procedure Credits;
var
  i, col: integer;
begin
  for i := 1 to CreditsCount do
  begin
    if pos(':', STR_CREDITSARR[i]) = 0 then
      col := LightGray
    else
      col := White;
    GoToXY((RESOLUTION_X - Length(STR_CREDITSARR[i])) div 2, (RESOLUTION_Y + HUDSIZE - CreditsCount) div 2 + i);
    if ((i = 1) or (i = CreditsCount)) then
      GoToXY(WhereX + 1, WhereY);
    if ((i = 1) or (i = CreditsCount)) then
      col := Brown
    else
    begin
      TextColor(Brown);
      Write('|');
    end;
    TextColor(col);
    Write(STR_CREDITSARR[i]);
    if ((i < CreditsCount) and (i > 1)) then
    begin
      TextColor(Brown);
      Write('|');
    end;
  end;
  ReadKey;
end;

procedure MyClrScr;
var
  i, j: integer;
begin
  Form1.Image1.Canvas.Rectangle(9, 12, Form1.Image1.Width - 19, Form1.Image1.Height - 20);
  for i := 2 to RESOLUTION_Y + HUDSIZE - 2 do
    for j := 2 to RESOLUTION_X - 1 do
      MyCrt.screen[i, j] := ' ';
  GoToXY(2, 2);
end;

procedure Sleep(i: Cardinal);
var
  j: integer;
begin
  if IsSleep then
  begin
    j := i div 50;
    for j := j downto 1 do
    begin
      SysUtils.Sleep(50);
      if KeyPressed then
      begin
        IsSleep := false;
        exit;
      end;
      Application.ProcessMessages;
    end;
  end;
end;

procedure Print(s: string);
var
  i, len: integer;
begin
  i := 1;
  len := Length(s);
  while ((WhereX < RESOLUTION_X) and (i <= len)) do
  begin
    write(s[i]);
    inc(i);
  end;
  if IsSleep then
    RepaintScreen;
end;

procedure Println(s: string);
begin
  Print(s);
  GoToXY(2, WhereY + 1);
end;

procedure MainInput(s: string);
var
  i, len: integer;
begin
  TextColor(White);
  len := Length(s);
  for i := 1 to len do
  begin
    print(s[i]);
    Sleep(Random(300) + 100);
  end;
  GoToXY(2, WhereY + 1);
  TextColor(LightGray);
end;

procedure WriteLogo(x, y: integer);
const
  logo: array[1..14] of string =
  (
    '+=============================================+',
    '[                                             ]',
    '[  $$$$$$$$$$   $$$        $$      $$$$$$$$$  ]',
    '[  |$$$$$$$$|   $$$$       $$     $$$$$$$$    ]',
    '[      $$       $$ $$      $$    $$$          ]',
    '[      $$       $$  $$     $$    $$           ]',
    '[      $$       $$   $$    $$    $$           ]',
    '[      $$       $$    $$   $$    $$           ]',
    '[      $$       $$     $$  $$    $$           ]',
    '[      $$       $$      $$ $$    $$$          ]',
    '[  |$$$$$$$$|   $$       $$$$     $$$$$$$$    ]',
    '[  $$$$$$$$$$   $$        $$$      $$$$$$$$$  ]',
    '[                                             ]',
    '+=============================================+'
  );
var
  i, j: integer;
begin
  for i := 1 to 14 do
  begin
    GoToXY(x, y + i - 1);
    for j := 1 to Length(logo[i]) do
      write(logo[i][j]);
  end;
end;

procedure Intro;
const
  HASHARR = '0123456789ABCDEF';
  SYMBOLS = 'QWERTYUIOPLKJHGFDSAZXCVBNM1234567890qwertyuioplkjhgfdsazxcvbnm';
var
  i, x, len: integer;
  s: string;
begin
  MyClrScr;
  TextColor(DarkGray);
  WriteLogo(51, 3);
  TextColor(LightGray);
  GoToXY(2, 2);
  if IsSleep then
    RepaintScreen;
  s := '';
  i := Random(8) + 5;
  for i := i downto 1 do
    s := s + '*';
  Sleep(500);
  PrintLn('Welcome to INC mainframe, dear Guest!');
  Sleep(500);
  Print('Please type your login: ');
  Sleep(2000);
  MainInput('myreality2064');
  Print('Please type your password: ');
  Sleep(1500);
  MainInput(s);
  Sleep(300);
  TextColor(LightRed);
  PrintLn('Error during login procedure: invalid password');
  Sleep(500);
  TextColor(LightGray);
  Print('Please type your login: ');
  Sleep(2500);
  x := WhereX + 5;
  MainInput('myrea');
  GoToXY(x, WhereY - 1);
  if IsSleep then
  begin
    for i := 1 to 5 do
    begin
      GoToXY(WhereX - 1, WhereY);
      write(' ');
      GoToXY(WhereX - 1, WhereY);
      RepaintScreen;
      Sleep(150);
    end;
  end
  else
  begin
    GoToXY(WhereX - 5, WhereY);
    print('     ');
  end;
  Sleep(300);
  MainInput('guest');
  Print('Please type your password: ');
  Sleep(500);
  MainInput('*****');
  Sleep(300);
  TextColor(LightGreen);
  Println('Login succesful!');
  TextColor(LightGray);
  Print('Guest: /home/ > ');
  Sleep(1000);
  MainInput('cd ..');
  Sleep(100);
  Println('ERROR: You don`t have permission');
  Sleep(150);
  Print('Guest: /home/ > ');
  Sleep(2000);
  MainInput('ls');
  Sleep(100);
  Println('List of files in /home/');
  Println('  ..');
  Println('  accessories/');
  Println('  bin/');
  Println('  config/');
  Println('  console/');
  Println('  public/');
  Println('  temp/');
  Println('  work/');
  Println('  .config');
  Println('  .console');
  Println('  history_5327376.log');
  Print('Guest: /home/ > ');
  Sleep(3500);
  MainInput('cd public/mail/inbox/mailfiles');
  Print('Guest: /home/public/mail/inbox/mailfiles/ > ');
  Sleep(1000);
  MainInput('ls');
  Println('List of files in /home/public/mail/inbox/mailfiles/');
  Println('  ..');
  Println('  Advert.proj');
  Println('  MySexyPhoto.jpg');
  Println('  Shedule.lst');
  Print('Guest: /home/public/mail/inbox/mailfiles/ > ');
  Sleep(2500);
  MainInput('rename "MySexyPhoto.jpg" "AntiVir"');
  Print('Guest: /home/public/mail/inbox/mailfiles/ > ');
  Sleep(500);
  MainInput('start AntiVir');
  Sleep(700);
  Println('INC OS eXploit coded by NEME$iS');
  Sleep(150);
  Print('Started successfully. Input user login: ');
  Sleep(2000);
  MainInput('myreality2064');
  Print('Searching for password hash: ');
  for i := 1 to Random(7) + 7 do
  begin
    Print('.');
    Sleep(300);
  end;
  Println(' Found!');
  s := '';
  for i := 1 to 32 do
    s := s + HASHARR[Random(Length(HASHARR)) + 1];
  Println(s);
  Sleep(100);
  Print('Guest: /home/public/mail/inbox/mailfiles/ > ');
  Sleep(1500);
  MainInput('start AntiVir \brute');
  Sleep(700);
  Println('INC OS eXploit coded by NEME$iS');
  Sleep(150);
  Println('Integrated bruteforcer started.');
  Print('Input hash value: ');
  Sleep(1000);
  MainInput(s);
  len := Length(SYMBOLS);
  for i := 1 to Random(100) + 100 do
  begin
    GoToXY(2, WhereY);
    s := '';
    for x := 1 to Random(10) + 5 do
      s := s + SYMBOLS[1 + Random(len)];
    while Length(s) <= 15 do
      s := s + ' ';
    Print('Working in progress... Checking ' + s);
    Sleep(50);
    if not IsSleep then
      break;
  end;
  Sleep(500);
  PrintLn('');
  Println(s + ': correct password!');
  Print('Guest: /home/public/mail/inbox/mailfiles/ > ');
  Sleep(2000);
  MainInput('logout');
  Println('');
  Sleep(500);
  PrintLn('Welcome to INC mainframe, dear Guest!');
  Sleep(500);
  Print('Please type your login: ');
  Sleep(1000);
  MainInput('myreality2064');
  Sleep(150);
  Print('Please type your password: ');
  Sleep(300);
  for i := 1 to Length(s) do
    if (s[i] <> ' ') then
      s[i] := '*'
    else
    begin
      s := Copy(s, 1, i);
      break;
    end;
  MainInput(s);
  Sleep(300);
  TextColor(LightGreen);
  Println('Login succesful!');
  TextColor(LightGray);
  Print('INC Admin: /home/ > ');
  Sleep(1500);
  MainInput('cd ..');
  Print('INC Admin: /users/ > ');
  Sleep(500);
  MainInput('cd ..');
  Print('INC Admin: / > ');
  Sleep(1000);
  MainInput('ls');
  Println('List of files in /');
  Println('  games/');
  Println('  logs/');
  Println('  users/');
  Print('INC Admin: / > ');
  Sleep(1500);
  MainInput('cd games/cybershock');
  Print('INC Admin: /games/cybershock/ > ');
  Sleep(500);
  MainInput('start CyberShock.exe');
  Sleep(500);
end;

function menu: boolean;
Var
  C : char;
begin
  TextColor(White);
  punkt := 1;
  ClrScr;
  Ramka(Brown);
  Intro;
  CopyScreen;
  repeat
    repeat
      WriteMenu;
      WriteActive;
      c := readkey;
      if c = KEY_UP then
        dec(punkt);
      if c = KEY_DOWN then
        inc(punkt);
      if punkt < 1 then
        punkt := 5
      else if punkt > 5 then
        punkt := 1;
    until (c = KEY_RETURN) or (c = KEY_ESCAPE);
    if c = KEY_ESCAPE then halt
    else
    begin
      case punkt of
        1:
        begin
          data.name := Input(STR_INPUT_NAME, 10);
          if (data.name = '') then
            PasteScreen
          else
          begin
            if (GetSaveFolder <> '') then
            begin
              clrscr;
              textcolor(lightred);
              write(STR_QUESTION_ALL_DATA_WILL_BE_DELETED);
              repeat
                c := readkey;
              until (c = 'n') or (c = 'y') or (c = KEY_RETURN) or (c = KEY_ESCAPE);
              if (c = 'y') or (c = KEY_RETURN) then
              begin
                menu := false;
                DeleteSaveGame;
                exit;
              end
              else
                PasteScreen;
            end
            else
            begin
              menu := false;
              DeleteSaveGame;
              exit;
            end;
          end;
        end;
        2:
        begin
          data.name := Input(STR_INPUT_NAME_2, 10);
          if (data.name <> '') then
          begin
            if (GetSaveFolder <> '') then
            begin
              menu := true;
              exit;
            end
            else
            begin
              Error(STR_CANT_FIND_NAME + data.name);
              PasteScreen;
            end;
          end
          else
            PasteScreen;
        end;
        3:
        begin
          MyClrScr;
          help;
          PasteScreen;
        end;
        4:
        Begin
          credits;
          PasteScreen;
        end;
      end;
    end;
  until punkt = 5;
  menu := false;
  halt;
end;

end.
