Files @ 8419d4808de1
Branch filter:

Location: games/Awakening/tutorial.lua

Silverwing
fix: Radcliffe response on raybox
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;
        };
    };
};