Changeset - f9a4d0ae1256
[Not reviewed]
default
0 1 0
Silverwing - 7 years ago 2017-12-12 19:51:00

fix
1 file changed with 9 insertions and 0 deletions:
0 comments (0 inline, 0 general)
atlantis_dyp.lua
Show inline comments
 
@@ -1101,384 +1101,392 @@ dyp_temple_navigation = dlg {
 
            temple_found = true;
 
            move(submarine_leviathan, "iyh_far_from_entrance_foot");
 
            walk("iyh_far_from_entrance");
 
            return where(submarine_leviathan).view;
 
        end};
 
        {always=true, "[На юг, к ущелью]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_far_east");
 
            psub("dyp_temple_crevice_far_east");
 
            return where(submarine_leviathan).view;
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_center"};
 
        {always=true, "[На восток, к обелиску]", function()
 
            move(submarine_leviathan, "dyp_temple_north_west");
 
            psub("dyp_temple_north_west");
 
            return where(submarine_leviathan).view;
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
    };
 
};
 

	
 
dyp_temple_cave_entrance = room {
 
    nam = "dyp_temple_cave_entrance";
 
    disp = "Храм Дипатреанотра, пещера";
 
    dsc = [[Вы стоите у выхода из глубокой пещеры, расположенной неподалеку от храма Дипатреанотра. Перед вами длинный коридор, ведущий куда-то вглубь скалы. Вдалеке, в коридоре вы видите слабое свечение. ]];
 
    underwater = true;
 
    way = {
 
        kh_vroom("Выйти из пещеры", "dyp_temple_east");
 
        kh_vroom("Вглубь пещеры", "dyp_temple_cave_deep");
 
    };
 
};
 

	
 
dyp_temple_cave_deep = room {
 
    nam = "dyp_temple_cave_deep";
 
    disp = "Храм Дипатреанотра, пещера";
 
    dsc = [[Здесь коридор разветвляется на три. В конце каждого вы видите слабое свечение красного, зеленогои синего цветов. ]];
 
    underwater = true;
 
    way = {
 
        kh_vroom("К выходу из пещеры", "dyp_temple_cave_entrance");
 
        kh_vroom("В \"Красный\" коридор", "dyp_temple_cave_red");
 
        kh_vroom("В \"Зеленый\" коридор", "dyp_temple_cave_green");
 
        kh_vroom("В \"Синий\" коридор", "dyp_temple_cave_blue");
 
    };
 
};
 

	
 
dyp_temple_cave_red = room {
 
    nam = "dyp_temple_cave_red";
 
    disp = "Храм Дипатреанотра, пещера";
 
    dsc = [[Проход заканчивается массивной металлической дверью, совершенно гладкой. Вы не видите никакого способа открыть ее. ]];
 
    underwater = true;
 
    obj = {
 
        "dyp_temple_statue_red";
 
    };
 
    way = {
 
        kh_vroom("В главный коридор", "dyp_temple_cave_deep");
 
    };
 
};
 

	
 
dyp_temple_statue_red = obj {
 
    nam = "dyp_temple_statue_red";
 
    dsc = [[Рядом с дверью стоит древняя статуя навьяра. В правой руке статуя держит копье, в навершии которого ярко светится красный камень. На поясе статуи вы видите небольшое круглое {отверстие}. ]];
 
};
 

	
 
dyp_temple_cave_green = room {
 
    nam = "dyp_temple_cave_green";
 
    disp = "Храм Дипатреанотра, пещера";
 
    dsc = [[Проход заканчивается массивной металлической дверью, совершенно гладкой. Вы не видите никакого способа открыть ее. ]];
 
    underwater = true;
 
    obj = {
 
        "dyp_temple_statue_green";
 
    };
 
    way = {
 
        kh_vroom("В главный коридор", "dyp_temple_cave_deep");
 
    };
 
};
 

	
 
dyp_temple_statue_green = obj {
 
    nam = "dyp_temple_statue_green";
 
    dsc = [[Рядом с дверью стоит древняя статуя навьяра. В правой руке статуя держит копье, в навершии которого ярко светится зеленый камень. На поясе статуи вы видите небольшое круглое {отверстие}. ]];
 
};
 

	
 
dyp_temple_cave_blue = room {
 
    nam = "dyp_temple_cave_blue";
 
    disp = "Храм Дипатреанотра, пещера";
 
    dsc = [[Проход заканчивается массивной металлической дверью, совершенно гладкой. Вы не видите никакого способа открыть ее. ]];
 
    underwater = true;
 
    obj = {
 
        "dyp_temple_statue_blue";
 
    };
 
    way = {
 
        kh_vroom("В главный коридор", "dyp_temple_cave_deep");
 
    };
 
};
 

	
 
dyp_temple_statue_blue = obj {
 
    nam = "dyp_temple_statue_blue";
 
    dsc = [[Рядом с дверью стоит древняя статуя навьяра. В правой руке статуя держит копье, в навершии которого ярко светится синий камень. На поясе статуи вы видите небольшое круглое {отверстие}. ]];
 
};
 

	
 
dyp_crab_cave = labyrinth {
 
    var {
 
        position = "00";
 
        fight = false;
 
    };
 
    nam = "dyp_crab_cave";
 
    disp = "Пещера";
 
    dir1 = "На северо-запад";
 
    dir2 = "На северо-восток";
 
    dir3 = "На юго-запад";
 
    dir4 = "На юго-восток";
 
    ex = "Выйти";
 
    underwater = true;
 
    map = {
 
        ["00"] = {
 
            name = [[Вы стоите у входа в глубокую пещеру. Стены здесь неровные и извилистые, образую причудливые переплетения длинный коридоров. Кто знает, куда они приведут? На каменистом полу едва ли можно заметить какие-либо следы. ]];
 
            e1 = "10";
 
            e2 = "11";
 
        };
 
        ["10"] = {
 
            e1 = "20";
 
            e2 = "21";
 
            e4 = "00";
 
        };
 
        ["11"] = {
 
            e1 = "21";
 
            e2 = "22";
 
            e3 = "00";
 
        };
 
        ["20"] = {
 
            e1 = "30";
 
            e4 = "10";
 
        };
 
        ["21"] = {
 
            e1 = "31";
 
            e2 = "32";
 
            e3 = "10";
 
            e4 = "11";
 
        };
 
        ["22"] = {
 
            e2 = "33";
 
            e3 = "11";
 
        };
 
        ["30"] = {
 
            e1 = "40";
 
            e2 = "41";
 
            e4 = "20";
 
        };
 
        ["31"] = {
 
            e2 = "42";
 
            e4 = "21";
 
        };
 
        ["32"] = {
 
            e2 = "43";
 
            e3 = "21";
 
        };
 
        ["33"] = {
 
            e3 = "22";
 
        };
 
        ["40"] = {
 
            e2 = "50";
 
            e4 = "30";
 
        };
 
        ["41"] = {
 
            e3 = "30";
 
        };
 
        ["42"] = {
 
            e1 = "51";
 
            e3 = "31";
 
        };
 
        ["43"] = {
 
            e1 = "52";
 
            e3 = "32";
 
            enter = function(s)
 
                if not s.fight then
 
                    s.fight = true;
 
                    walk("dyp_crab_fight_intro");
 
                end;
 
            end;
 
        };
 
        ["50"] = {
 
            e3 = "40";
 
            enter = function(s)
 
                if (not exist(dyp_scepter_chest, s)) then
 
                    move(dyp_scepter_chest, s);
 
                end;
 
            end;
 
            exit = function(s)
 
                remove(dyp_scepter_chest, s);
 
            end;
 
        };
 
        ["51"] = {
 
            e4 = "42";
 
        };
 
        ["52"] = {
 
            e4 = "43";
 
            enter = function(s)
 
                if (not exist(dyp_dead_navjiarr, s)) then
 
                    move(dyp_dead_navjiarr, s);
 
                end;
 
            end;
 
            exit = function(s)
 
                remove(dyp_dead_navjiarr, s);
 
            end;
 
        };
 
    };
 
};
 

	
 
dyp_scepter_chest = obj {
 
    var {
 
        state = 0;
 
    };
 
    nam = "dyp_scepter_chest";
 
    dsc = function(s)
 
        if s.state == 0 then
 
            return [[В углу аккуратно поставлен небольшой {сундучок} с хитрым замком. Чтобы открыть его придется сперва разобраться, как он устроен. ]];
 
        else
 
            return [[В углу аккуратно поставлен небольшой {сундучок}. Сейчас он пуст. ]];
 
        end;
 
    end;
 
    act = function(s)
 
        if s.state == 1 then
 
            return [[Вам здесь больше ничего не нужно. ]];
 
        else
 
            walk("dyp_crab_cave_puzzle");
 
            return [[Вы присматриваетесь к замку. ]];
 
        end;
 
    end;
 
};
 

	
 
dyp_dead_navjiarr = obj {
 
    var {
 
        state = 0;
 
    }:
 
    nam = "dyp_dead_navjiarr";
 
    dsc = [[Рядом с вами лежит мертвый навьяр. Тело изуродовано могучими клешнями крабов, однако, судя по всему лежит здесь недавно. Рядом с трупом лежит его {сумка}. ]];
 
    act = function(s)
 
        if s.state == 0 then
 
            move(dyp_item_star_map, pl);
 
            move(dyp_item_aedienrr_notes, pl);
 
            return [[В сумке лежат две таблички: металлическая и обычная, каменная. Металлическая табличка сразу привлекает ваше внимание. Причудливые узоры схем никак не напоминают навьярские письмена, а символы нанесенные вокруг не говорят вам ровным счетом ни о чем. Стоит показать это Светловой, быть может она сможет что-то из этого извлечь. ]];
 
        end;
 
    end;
 
};
 

	
 
dyp_item_aedienrr_notes = obj {
 
    nam = "dyp_item_aedienrr_notes";
 
    disp = function(s)
 
        if language_known then
 
            return "Записи Аэдиенрра";
 
        else
 
            return "Каменная табличка";
 
        end;
 
    end;
 
    inv = function(s)
 
        if language_known then
 
            return "Надписи на каменной табличке рассказывают о последнем путешествии Аэдиенрра. Молодой навьяр разгадал схемы на карте небесных огней и предположил, что они ведут в пещеру в скале к северу от Дипатреанотра. Ориентирами служат каменные обелиски-предостережения и храм, расположенный к востоку от нее. Никто из Ираафаанотра не смогу рассказать ничего о храме, поэтому исследователю пришлось долго идти наугад. Последняя запись гласит, что он почти добрался до пещеры... ";
 
        else
 
            return "Вы не понимаете языка и надписи значат для вас не больше чем ряды вертикальных цветных полосок. ";
 
        end;
 
    end;
 
};
 

	
 
dyp_item_star_map = obj {
 
    nam = "dyp_item_star_map";
 
    disp = "Карта небесных огней";
 
    inv = [[Металлическая табличка, испещренная непонятными вам линиями и символами. Письмена напоминают навьярские лишь очень отдаленно и вы даже не предполагаете, что они могут значить. ]];
 
};
 

	
 
dyp_crab_fight_intro = cutscene("dyp_crab_fight_intro", "Пещера", [[Впереди, вы замечаете какое-то движение. Луч прожетора выхватывает огромные острые клешни гигантского краба, устремившегося к вам. Следом за ним вы видите множество крабов поменьше, также ползущих к вам на своих тонких острых ногах. ]], "dyp_crab_fight");
 

	
 
dyp_crab_fight_win = cutscene("dyp_crab_fight_win", "Пещера", [[Отбившись от крабов, вы остаетесь одни в темном лабиринте пещер. ]], "dyp_crab_cave");
 

	
 
dyp_cmbt_learr = combatant {
 
    nam = "dyp_cmbt_learr";
 
    disp2 = "Леарр";
 
    disp3 = "Леарр";
 
    x = 5;
 
    y = 7;
 
    pic = "images/learr.png";
 
    ally = "Я не буду атаковать союзника.";
 
    nohit = "Я не буду атаковать союзника.";
 
    noshoot = "Я не буду атаковать союзника.";
 
    hp = 10;
 
    hasSpear = true;
 
    make_turn = function(s)
 
        local enemies = {  };
 
        for item=1,#here().obj do
 
            local obj = here().obj[item];
 
            if (obj.enemy 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;
 
        if (#enemies == 0) then
 
            pn("Леарр ждет. ");
 
            return;
 
        end;
 
        table.sort(enemies, function(a, b)
 
            return (a.p.l < b.p.l);
 
        end);
 
        local enemy = enemies[1].o;
 
        local path = enemies[1].p;
 
        for i = 1,#enemies do
 
            print(enemies[i].p.l);
 
        end;
 
        -- AI Order:
 
        -- If has spear and enemy is far   - throw spear
 
        -- If has spear and enemy is close - hit with spear
 
        -- if spear is nearer than any enemy - walk towards spear
 
        -- walk towards nearest enemy
 
        -- If enemy close and enemy has spear - take spear from enemy
 
        -- If enemy close and enemy doesn't have spear - hit with claws
 

	
 
        if s.hasSpear then
 
            if (math.abs(s.x - enemy.x) + math.abs(s.y - enemy.y) <= 2 and here():canShoot(s.x,s.y, enemy.x, enemy.y)) then
 
                --50%
 
                if (rnd(2) > 1) then
 
                    enemy.hp = enemy.hp - 2;
 
                    pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. ");
 
                else
 
                    pn("Леарр бьет " .. enemy.disp2 .. " копьем, но промахивается. ");
 
                end;
 
                return;
 
            elseif  (math.abs(s.x - enemy.x) == 1 and math.abs(s.y - enemy.y) == 1) then
 
                --75%
 
                if (rnd(4) > 1) then
 
                    enemy.hp = enemy.hp - 2;
 
                    pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. ");
 
                else
 
                    pn("Леарр бьет " .. enemy.disp2 .. " копьем, но промахивается. ");
 
                end;
 
                return;
 
            elseif (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
 
                --100%
 
                enemy.hp = enemy.hp - 2;
 
                pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. ");
 
                return;
 
            end;
 
        else
 
            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 - 1;
 
                pn("Леарр бьет " .. enemy.disp2 .. " и попадает. ");
 
                return;
 
            end;
 
        end;
 
        
 
        s.x = path.p[2][1];
 
        s.y = path.p[2][2];
 
        pn("Леарр идет к " .. enemy.disp3 .. ". ");
 
    end;
 
    dsc = function(s)
 
        if (s.hp > 0) then
 
            return [[ {Леарр} готова к бою. ]];
 
        else
 
            return [[ {Леарр} без сознания. ]];
 
        end;
 
    end;
 
};
 

	
 
dyp_cmbt_wright = combatant {
 
    nam = "za_cmbt_wright";
 
    disp2 = "Райта";
 
    disp3 = "Райту";
 
    x = 5;
 
    y = 7;
 
    pic = "images/jack.png";
 
    ally = "Я не буду атаковать союзника.";
 
    nohit = "Я не буду атаковать союзника.";
 
    noshoot = "Я не буду атаковать союзника.";
 
    hp = 10;
 
    hasHarpoon = true;
 
    make_turn = function(s)
 
        local enemies = {  };
 
        for item=1,#here().obj do
 
@@ -1838,201 +1846,202 @@ dyp_king_crab = combatant {
 

	
 
        -- 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 - 2;
 
            pn("Краб бьет " .. enemy.disp2 .. " и попадает. ");
 
            return;
 
        end;
 

	
 
        print("fug2",path);
 
        s.x = path.p[2][1];
 
        s.y = path.p[2][2];
 
        pn("Краб идет к " .. enemy.disp3 .. ". ");
 
    end;
 
};
 

	
 
dyp_little_crab = function(nam, index, x, y) 
 
    return combatant {
 
        nam = nam;
 
        disp2 = "детеныша краба " .. tostring(index);
 
        disp3 = "детенышу краба " .. tostring(index);
 
        x = x;
 
        y = y;
 
        hp = 2;
 
        pic = "images/little_crab_".. index ..".png";
 
        shootHit = "Вы стреляете в детеныша краба и попадаете в него. ";
 
        shootMiss = "Вы стреляете в детеныша краба, но не попадаете в него. ";
 
        shootKill = "Вы стреляете в детеныша краба и он умирает. ";
 
        handHit = "Вы ударяете детеныша краба. ";
 
        handKill = "Вы ударяет детеныша краба, убивая его. ";
 
        handFar = "Слишком далеко. ";
 
        enemy = true;
 
        dsc = function(s)
 
            if (s.hp > 0) then
 
                return "{Детеныш краба " .. tostring(index).. "} готов к бою. ";
 
            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
 
                pn("Детеныш краба ".. tostring(index).. " ждет. ");
 
                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 - 1;
 
                pn("Детеныш краба ".. tostring(index).. " бьет " .. enemy.disp2 .. " и попадает. ");
 
                return;
 
            end;
 

	
 
            print("fug2",path);
 
            s.x = path.p[2][1];
 
            s.y = path.p[2][2];
 
            pn("Детеныш краба ".. tostring(index).. " идет к " .. enemy.disp3 .. ". ");
 
        end;
 
    };
 
end;
 

	
 
dyp_crab_fight = battlefield {
 
    nam = "Пещера";
 
    plX = 4;
 
    plY = 7;
 
    map = {
 
        {2,0,0,0,0,0,2};
 
        {2,0,0,0,0,0,2};
 
        {2,1,0,0,0,0,2};
 
        {2,0,0,1,0,1,2};
 
        {2,0,1,0,0,0,2};
 
        {2,0,0,0,0,1,2};
 
        {2,0,0,0,0,0,2};
 
    };
 
    win = "dyp_crab_cave_win";
 
    lose = "game_over_crab_cave";
 
    obstacle = "images/stones.png";
 
    underwater = true;
 
    entered = function(s)
 
        --TODO prepend player associate - anna, learr, walter or jack
 
        if (char_learr.follow) then
 
            table.insert(s.obj, 1, dyp_cmbt_learr);
 
            s.plX = 3;
 
        elseif (char_anna.follow) then
 
            table.insert(s.obj, 1, dyp_cmbt_anna);
 
            s.plX = 3;
 
        elseif (char_wright.follow) then
 
            table.insert(s.obj, 1, dyp_cmbt_wright);
 
            s.plX = 3;
 
        elseif (char_radcliffe.follow) then
 
            table.insert(s.obj, 1, dyp_cmbt_radcliffe);
 
            s.plX = 3;
 
        end;
 
    end;
 
    obj = {
 
        "dyp_king_crab";
 
        dyp_little_crab("dyp_little_crab_1", 1, 2, 1);
 
        dyp_little_crab("dyp_little_crab_2", 2, 3, 1);
 
        dyp_little_crab("dyp_little_crab_3", 3, 5, 1);
 
        dyp_little_crab("dyp_little_crab_4", 4, 6, 1);
 
        dyp_little_crab("dyp_little_crab_5", 5, 3, 2);
 
        dyp_little_crab("dyp_little_crab_6", 6, 4, 2);
 
        dyp_little_crab("dyp_little_crab_7", 7, 5, 2);
 
    };
 
};
 

	
 
dyp_crab_cave_puzzle = room {
 
    var {
 
        values = {
 
            0, 2, 1, 2, 5 ,4,
 
            1, 1, 2, 4, 0, 5,
 
            1, 3, 2, 4, 0, 3,
 
            0, 2, 0, 3, 5, 4,
 
            5, 0, 4, 1, 3, 3,
 
            3, 5, 5, 1, 4, 2
 
        };
 
        pressed = {
 
            nil,
 
            nil,
 
            nil,
 
            nil,
 
            nil,
 
            nil
 
        };
 
    };
 
    nam = "Пещера";
 
    pic = function(s)
 
        local p = "blank:180x180";
 
        for v = 1, #s.values do
 
            local tx = (v - 1) % 6;
 
            local ty = math.floor((v - 1) / 6);
 
            local lstate = '';
 
            if s.pressed[s.values[v] + 1] and s.pressed[s.values[v] + 1][1] == tx and s.pressed[s.values[v] + 1][2] == ty then
 
                lstate = 'p';
 
            end;
 
            p = p .. ';images/cavelock_' .. tostring(s.values[v]) .. lstate .. '.png@' .. tostring(tx * 30) .. ',' .. tostring(ty * 30);
 
        end;
 
        print(p);
 
        return p;
 
    end;
 
    click = function(s,x,y)
 
        local tx = math.floor(x / 30);
 
        local ty = math.floor(y / 30);
 
        local i = tx + ty * 6 + 1;
 
        local val = s.values[i];
 
        for p = 1, 6 do
 
            if s.pressed[p] and (s.pressed[p][1] == tx or s.pressed[p][2] == ty) then
 
                s.pressed[p] = nil;
 
            end;
 
        end;
 
        s.pressed[val + 1] = {tx, ty};
 
        for p = 1, 6 do
 
            if not s.pressed[p] then
 
                walkin(here());
 
                return;
 
            end;
 
        end;
 
        p("С легким скрежетом сундук открывается. Внутри вы обнаруживаете небольшой жезл с нанесенными цветными символами. Цвета определенно соответствуют навьярским словам, но что значат символы вам неведомо. ");
 
        dyp_scepter_chest.state = 1;
 
        put(dyp_item_wand, pl);
 
        walk(dyp_crab_cave);
 
    end;
 
    way = {
 
        kh_vroom("Отойти", "dyp_crab_cave");
 
    };
 
};
 

	
 
dyp_crab_cave_win = cutscene("dyp_crab_cave_win", "Пещера", [[Вы расправляетесь с выводком крабов, поселившихся в этой пещере. Чуть поодаль, вы видите тело навьяра, истерзанное этими монстрами. ]], "dyp_crab_cave");
 
\ No newline at end of file
0 comments (0 inline, 0 general)