Files @ 4903144e08c5
Branch filter:

Location: games/Awakening/battlefield.lua - annotation

Silverwing
Lseryanotrr - Service tunnels 4 done
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
c1561bd81710
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
c1561bd81710
cf7c4cd40054
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
c1561bd81710
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
cf7c4cd40054
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
cf7c4cd40054
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
c1561bd81710
_kh.bf_calcDistance = function(x1, y1, x2, y2)
    return math.max(math.abs(x2 - x1), math.abs(y2 - y1));
end;

_kh.bf_calcDirection = function(x1, y1, x2, y2)
    -- 0 - close by, 1-8 - north to north-west clockwise, 9 - too far
    local dist = _kh.bf_calcDistance(x1,y1,x2,y2);
    if (dist == 0) then
        return 0;
    elseif (dist == 1) then
        if (x1 == x2 and y1 > y2) then
            return 1;
        elseif (x1 < x2 and y1 > y2) then
            return 2;
        elseif (x1 < x2 and y1 == y2) then
            return 3;
        elseif (x1 < x2 and y1 < y2) then
            return 4;
        elseif (x1 == x2 and y1 < y2) then
            return 5;
        elseif (x1 > x2 and y1 < y2) then
            return 6;
        elseif (x1 > x2 and y1 == y2) then
            return 7;
        elseif (x1 > x2 and y1 > y2) then
            return 8;
        end;
    else
        return 9;
    end;
end;

battlefield = function(tab)
    local make_turn = tab.make_turn;
    tab.check_walk = function(s)
        bf_north:enable();
        bf_northeast:enable();
        bf_east:enable();
        bf_southeast:enable();
        bf_south:enable();
        bf_southwest:enable();
        bf_west:enable();
        bf_northwest:enable();
        
        if (s.plY == 1) then
            bf_north:disable();
            bf_northeast:disable();
            bf_northwest:disable();
        elseif (s.plY == 5) then
            bf_south:disable();
            bf_southeast:disable();
            bf_southwest:disable();
        end;
        
        if (s.plX == 1) then
            bf_west:disable();
            bf_southwest:disable();
            bf_northwest:disable();
        elseif (s.plX == 5) then
            bf_east:disable();
            bf_southeast:disable();
            bf_northeast:disable();
        end;
    end;
    
    local entered = tab.entered;
    
    tab.entered = function(s)
        s:check_walk();
        if (type(entered) == 'function') then
            entered(s);
        else
            return entered;
        end;
    end;
    
    tab.onreload = function(s)
        here():make_turn();
    end;
    
    tab.make_turn = function(s)
        -- A bit peggish but works
        pl.x = s.plX;
        pl.y = s.plY;
        for i = 1, #s.obj do
            if (type(s.obj[i].make_turn) == 'function' and s.obj[i].hp > 0) then
                s.obj[i]:make_turn();
            end;
        end;
        
        if (make_turn) then
            make_turn(s);
        end;
        
        if (pl.hp <= 0) then
            print("lost");
            walk(s.lose);
        end;
        
        s:check_walk();
        
        for i = 1, #s.obj do
            if (s.obj[i].enemy and s.obj[i].hp > 0) then
                return;
            end;
        end;
        
        print("won");
        walk(s.win);
    end;
    
    tab.getDistance = _kh.bf_calcDistance;
    tab.getDirection = _kh.bf_calcDirection;
    
    if (not tab.obj) then
        tab.obj = {};
    end;
    
    if (not tab.pic) then
        tab.pic = function(s)
            local v = "images/battle_bcg.png;images/player.png@" .. tostring(s.plX * 32 - 32) .. "," .. tostring(s.plY * 32 - 32);
            for i = 1, #s.obj do
                if ((s.obj[i].hp) and (s.obj[i].hp > 0) and not(s.obj[i]:disabled()) and s.obj[i].pic and s.obj[i].x and s.obj[i].y) then
                    v = v .. ";" .. s.obj[i].pic .. "@" .. tostring(s.obj[i].x * 32 - 32) .. "," .. tostring(s.obj[i].y * 32 - 32);
                end;
            end;
            return v;
        end;
    end;
    
    table.insert(tab.obj, 'bf_north');
    table.insert(tab.obj, 'bf_northeast');
    table.insert(tab.obj, 'bf_east');
    table.insert(tab.obj, 'bf_southeast');
    table.insert(tab.obj, 'bf_south');
    table.insert(tab.obj, 'bf_southwest');
    table.insert(tab.obj, 'bf_west');
    table.insert(tab.obj, 'bf_northwest');
    table.insert(tab.obj, 'bf_wait');

    return room(tab);
end;

bf_north = obj {
    nam = "north",
    dsc = "{На север}",
    act = function(s)
        here().plY = here().plY - 1;
        p("Вы идете на север");
        here():make_turn();
    end;
};

bf_northeast = obj {
    nam = "northeast",
    dsc = "{На северо-восток}",
    act = function(s)
        here().plX = here().plX + 1;
        here().plY = here().plY - 1;
        p("Вы идете на северо-восток.");
        here():make_turn();
    end;
};

bf_east = obj {
    nam = "east",
    dsc = "{На восток}",
    act = function(s)
        here().plX = here().plX + 1;
        p("Вы идете на восток.");
        here():make_turn();
    end;
};

bf_southeast = obj {
    nam = "southeast",
    dsc = "{На юго-восток}",
    act = function(s)
        here().plX = here().plX + 1;
        here().plY = here().plY + 1;
        p("Вы идете на юго-восток.");
        here():make_turn();
    end;
};

bf_south = obj {
    nam = "south",
    dsc = "{На юг}",
    act = function(s)
        here().plY = here().plY + 1;
        p("Вы идете на юг.");
        here():make_turn();
    end;
};

bf_southwest = obj {
    nam = "southwest",
    dsc = "{На юго-запад}",
    act = function(s)
        here().plX = here().plX - 1;
        here().plY = here().plY + 1;
        p("Вы идете на юго-запад.");
        here():make_turn();
    end;
};

bf_west = obj {
    nam = "west",
    dsc = "{На запад}",
    act = function(s)
        here().plX = here().plX - 1;
        p("Вы идете на запад.");
        here():make_turn();
    end;
};

bf_northwest = obj {
    nam = "northwest",
    dsc = "{На северо-запад}",
    act = function(s)
        here().plX = here().plX - 1;
        here().plY = here().plY - 1;
        p("Вы идете на северо-запад.");
        here():make_turn();
    end;
};

bf_wait = obj {
    nam = "wait",
    dsc = "{Ждать}",
    act = function(s)
        p("Вы ждете");
        here():make_turn();
    end;
};

combatant = function(tab)
    tab.canshoot = function(s)
        local dist = here().getDistance(here().plX, here().plY, s.x, s.y);
        return dist < 4 and not tab.ally;
    end;
    
    tab.onthrust = function(s)
        local dist = here().getDistance(here().plX, here().plY, s.x, s.y);
        if (rnd(4) > dist) then
            tab.hp = tab.hp - 2;
            if (tab.hp > 0) then
                p(tab.thrustHit);
            else
                p(tab.thrustKill);
            end;
        else
            p(tab.thrustMiss);
        end;
        
        here():make_turn();
    end;
    tab.onshoot = function(s)
        local dist = here().getDistance(here().plX, here().plY, s.x, s.y);
        if (rnd(4) > dist) then
            if (dist == 0) then
                tab.hp = tab.hp - 2;
            end;
            
            tab.hp = tab.hp - 1;
            if (tab.hp > 0) then
                p(tab.shootHit);
            else
                p(tab.shootKill);
            end;
        else
            p(tab.shootMiss);
        end;
        
        here():make_turn();
    end;
    
    tab.canthrust = function(s)
        local dist = here().getDistance(here().plX, here().plY, s.x, s.y);
        return dist <= 1 and not tab.ally;
    end;
    
    tab.canhit = function(s)
        local dist = here().getDistance(here().plX, here().plY, s.x, s.y);
        return dist == 0 and not tab.ally;
    end;
    
    tab.onhit = function(s)
        local dist = here().getDistance(here().plX, here().plY, s.x, s.y);
        if (dist == 0) then
            tab.hp = tab.hp - 2;
            if (tab.hp > 0) then
                p(tab.wpnHit);
            else
                p(tab.wpnKill);
            end;
            
            here():make_turn();
        else
            p(tab.wpnFar);
        end;
    end;
    
    if (not tab.act) then
        tab.act = function(s)
            if tab.ally then
                return tab.nohit;
            end;
            
            local dist = here().getDistance(here().plX, here().plY, s.x, s.y);
            
            if (dist == 0) then
                tab.hp = tab.hp - 1;
                if (tab.hp > 0) then
                    p(tab.handHit);
                else
                    p(tab.handKill);
                end;
                
                here():make_turn();
            else
                p(tab.handFar);
            end;
        end;
    end;
    if (not tab.make_turn) then
        tab.make_turn = function(s)
        end;
    end;
    
    return obj(tab);
end;