dofile "utils.lua"; dofile "battlefield.lua"; dofile "items.lua"; global { tutorial_pen = false; tutorial_paper = false; tutorial_pen_looked = false; tutorial_paper_looked = false; tutorial_paper_written = false; }; pl = player { nam = 'player'; var { hp = 10; }; }; pencil = obj { nam = 'Карандаш'; dsc = 'Еще в этой комнате есть карандаш. Чтобы взять его, нажмите на подсвеченную {ссылку}.'; tak = function(s) tutorial_pen = true; return 'Вы берете карандаш. Обратите внимание, что описание комнаты исчезло. Чтобы увидеть его снова -- нажмите на ее заголовок. '; end; inv = function(s) tutorial_pen_looked = true; return [[Хороший остро-заточенный карандаш. ]]; end; }; paper = obj { nam = 'Лист бумаги'; dsc = 'А рядом с карандашом лежит {лист бумаги}. Его тоже можно взять. '; tak = function(s) tutorial_paper = true; return 'Вы берете лист бумаги. Обратите внимание, что описание комнаты исчезло. Чтобы увидеть его снова -- нажмите на ее заголовок. '; end; inv = function(s) tutorial_paper_looked = true; pr [[На листе бумаги написано следующее: "Отлично, теперь вы знаете, как осматривать предметы. Теперь попробуйте дописать что-то карандашом на этом листе бумаги. Для этого нажмите на карандаш, а потом нажмите на лист бумаги". ]]; if tutorial_paper_written then path('Налево'):enable(); path('Направо'):enable(); pn [[На листе бумаги дописано: "Также, в комнатах могут присутствовать переходы. Они используются для того, чтобы перемещаться из комнаты в комнату. Сейчас в комнате, где вы находитесь появились два перехода: "Налево" и "Направо". Используйте любой из них, чтобы продолжить. ]]; end; end; used = function(s, o) if o == pencil then tutorial_paper_written = true; return [[Вы дописываете несколько слов. Осмотрите бумагу еще раз, чтобы их прочитать. ]]; end; end; }; main = room { nam = 'Добро пожаловать!'; dsc = function(s) pr [[Этот раздел кратко познакомит вас с тем, как играть в Пробуждение и другие игры на движке Instead. ^Игра состоит из комнат, у каждой из которых есть название, описание и описание находящихся в ней объектов. ^Это тоже комната. Она называется "Добро пожаловать!", описание ее вы сейчас читаете. ]]; if tutorial_pen and not tutorial_pen_looked then pr [[^Вы взяли карандаш. Он появился у вас в инвентаре. Нажмите на него дважды, чтобы рассмотреть его повнимательнее. ]]; end; if tutorial_paper then pr [[^Вы взяли лист бумаги. Он появился у вас в инвентаре. Нажмите на него дважды, чтобы узнать, что делать дальше. ]]; end; end; obj = { pencil; paper; }; way = { vroom('Налево', 'tutorial_2'):disable(); vroom('Направо', 'tutorial_2'):disable(); }; } key = obj { nam = 'Ключ'; dsc = 'На сундуке лежит {ключ}.'; inv = 'Ключ от сундука. '; tak = 'Вы берете ключ. Попробуйте открыть им сундук. Щелкните сперва на ключ, затем на сундук. '; }; chest = obj { var { open = false; empty = false; }; nam = 'Сундук'; dsc = 'В углу комнаты стоит старый {сундук}.'; act = function(s) if s.open then if s.empty then return 'Сундук пуст. Если вы съели малиновый пирог -- вы можете покинуть комнату. Если нет -- съешьте его, нажав два раза на предмет в инвентаре. '; else s.empty = true; take(pie); return 'Вы забираете из сундука малиновый пирог. Он очень свежий и аппетитно пахнет. Съешьте его, нажав два раза на предмет в инвентаре. '; end; end; return 'Сундук заперт. Чтобы открыть его -- возьмите ключ и используйте его на сундуке. Щелкните сначала на ключ в инвентаре, затем на сундук. ' end; used = function(s, o) if o == key then s.open = true; remove(key, pl); return 'Вы открыли сундук. Теперь щелкните на него еще раз, чтобы взять малиновый пирог. '; end; end; }; pie = obj { nam = 'Малиновый пирог'; inv = function(s) path('Продолжить'):enable(); remove('pie', pl); return 'Вы съедаете малиновый пирог. Очень вкусно. Теперь можно идти дальше. '; end; }; tutorial_2 = room { nam = 'Еще одна комната'; entered = function(s) remove('pencil', pl); remove('paper', pl); end; dsc = 'В этой комнате вы научитесь еще нескольким действиям с предметами. Вот несколько ключевых моментов: ^1. Когда вы дважды щелкаете на предмете вы используете те предметы, которые можно использовать. Другие предметы при таком же действии вы просто осмотрите. ^2. Предмет можно использовать не только на другие предметы в инвентаре, но и на предметы в комнате. '; obj = { 'chest'; 'key'; }; way = { kh_vroom('Продолжить', 'combat_intro'):disable(); }; }; combat_intro = room { nam = 'Подготовка к бою'; pic = 'images/battle_bg_cave.png;images/stones.png@96,96;images/player.png@96,192;images/king_crab.png@96,0'; dsc = [[Бой -- одна из механик, с которой вам придется столкнуться в Пробуждении. На рисунке выше вы видите, как выглядит основной экран боя. Поле боя разделено на 49 (7x7) клеток, в каждой из которых может быть персонаж (игрок, союзник или противник -- здесь игрок изображен фигуркой в скафандре), враг (здесь это краб) или препятствие (груда камней в центре). Во время боя вы можете использовать обычный способ взаимодействия с объектами (через инвентарь и описание) или вы можете щелкать на клетки поля боя. При первом щелчке, в клетке, куда вы нажмете, появится иконка доступного действия(если вы можете что-то сделать с этой клеткой). Вот список иконок и действий, которые они означают: ^]] .. img('images/hit_cursor.png') .. [[ -- атака в ближнем бою. ^]] .. img('images/shoot_cursor.png') .. [[ -- атака в дальнем бою. ^]] .. img('images/walk_cursor.png') .. [[ -- передвижение. ^]] .. img('images/wait_cursor.png') .. [[ -- пропуск хода. ^Сейчас попробуйте отыграть пробный бой против краба. Обратите внимание, что у вас в инвентаре появился револьвер -- вы можете использовать его как оружие против краба. Не бойтесь, это учебный краб, он не нанесет вам вреда. В реальном бою всегда следите за здоровьем персонажа. ]]; entered = function(s) take('item_colt'); end; way = { kh_vroom('В бой', 'combat'); }; }; king_crab = combatant { nam = "king_crab"; disp = "краб"; disp2 = "краба"; disp3 = "крабу"; var { x = 4; y = 1; hp = 6; }; pic = "images/king_crab.png"; shootHit = "Вы стреляете в краба и попадаете в него. "; shootMiss = "Вы стреляете в краба, но не попадаете в него. "; shootKill = "Вы стреляете в краба и он умирает. "; handHit = "Вы ударяете краба. "; handKill = "Вы ударяет краба, убивая его. "; handFar = "Слишком далеко. "; enemy = true; state = function(s) if s.hp == 6 then return ""; elseif s.hp >= 5 then return "Он легко ранен. "; elseif s.hp >= 3 then return "Он ранен. "; else return "Он тяжело ранен. "; end; end; dsc = function(s) if (s.hp > 0) then return "{Краб} готов к бою. "; else return false; end; end; make_turn = function(s) local enemies = { }; for item=1,#here().obj do local obj = here().obj[item]; if (obj.ally and obj.hp > 0) then local p = here():getWalkDistance(s.x, s.y, obj.x, obj.y); if (p) then table.insert(enemies, { o = obj, p = p }); end; end; end; table.sort(enemies, function(a, b) return (a.p.l < b.p.l); end); local enemy = enemies[1]; local path = here():getWalkDistance(s.x, s.y, here().plX, here().plY); if (not enemy or path and enemy.p.l > path.l ) then enemy = pl; else path = enemy.p; enemy = enemy.o; end; if (not enemy or not path) then pr("Краб ждет. "); return; end; -- AI Order: -- If has spear and enemy is close - hit with spear -- walk towards nearest enemy -- If enemy close - hit with claws if (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then enemy.hp = enemy.hp - 0; pr("Краб бьет вас и попадает. Но поскольку краб учебный, урона он не наносит. "); return; end; s.x = path.p[2][1]; s.y = path.p[2][2]; pr("Краб идет к вам. "); end; }; combat = battlefield { nam = "Бой"; var { plX = 4; plY = 7; }; map = { {2,0,0,0,0,0,2}; {2,0,0,0,0,0,2}; {2,0,0,0,0,0,2}; {2,0,0,1,0,0,2}; {2,0,0,0,0,0,2}; {2,0,0,0,0,0,2}; {2,0,0,0,0,0,2}; }; bcg_pic = 'images/battle_bg_cave.png'; win = "win"; lose = "game_over"; obstacle = "images/stones.png"; obj = { "king_crab"; }; }; win = room { nam = 'Поздравляем!'; dsc = [[Теперь вы знаете как играть в Пробуждение. Удачи в прохождении игры!]]; obj = { obj { nam = 'Закончить обучение'; dsc = '{Закончить обучение}'; act = function(s) gamefile('main.lua', true); end; }; }; };