Changeset - 581cfdd6a056
[Not reviewed]
default
0 0 1
silverwing - 4 years ago 2019-12-01 16:23:24

Tutorial added
1 file changed with 276 insertions and 0 deletions:
0 comments (0 inline, 0 general)
tutorial.lua
Show inline comments
 
new file 100644
 
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
0 comments (0 inline, 0 general)