diff --git a/tutorial.lua b/tutorial.lua new file mode 100644 --- /dev/null +++ b/tutorial.lua @@ -0,0 +1,276 @@ +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; + }; + }; +}; \ No newline at end of file