Files @ 16044f7fdf9f
Branch filter:

Location: games/Awakening/london_dice.lua

Silverwing
0.10.5
dice_game = room {
    var {
        player_pts = 0;
        current_pts = 0;
        enemy_pts = 0;
        first = false;
        state = 0;
    };
    nosave = true;
    noautosave = true;
    forcedsc = true;
    hideinv = true;
    nam = "dice_game";
    disp = "Игра в кости";
    win = "dice_game_win";
    lose = "dice_game_lose";
    draw = "dice_game_draw";
    entered = function(s)
        s.player_pts = 0;
        s.enemy_pts = 0;
        s.current_pts = 0;
        s.state = 0;
        dg_pass:disable();
        dg_roll:enable();
    end;
    dsc = function(s)
        if s.state == 0 then
            return [[Определяем очередность ходов. Бросайте кость. ]];
        else
            return([[Очки:^Вы:]] .. s.player_pts .. [[^Соперник:]] .. s.enemy_pts .. [[^Текущий раунд:]] .. s.current_pts);
        end;
    end;
    obj = {
        "dg_roll";
        "dg_pass";
        "dg_lose";
    };
    player_turn = function(s)
        if s.turn and (s.player_pts >= 100 or s.enemy_pts >= 100) then
            timer:stop();
            game.timer = nil;
            if s.player_pts >= 100 and s.enemy_pts >= 100 then
                walk(s.draw);
            elseif s.player_pts >= 100 then
                walk(s.win);
            else
                walk(s.lose);
            end;
            return;
        end;
        s.state = 1;
        s.current_pts = 0;
        timer:stop();
        game.timer = nil;
        dg_roll:enable();
        dg_pass:enable();
    end;
    enemy_turn = function(s)
        if not s.turn and (s.player_pts >= 100 or s.enemy_pts >= 100) then
            timer:stop();
            game.timer = nil;
            if s.player_pts >= 100 and s.enemy_pts >= 100 then
                walk(s.draw);
            elseif s.player_pts >= 100 then
                walk(s.win);
            else
                walk(s.lose);
            end;
            return;
        end;
        s.state = 1;
        s.current_pts = 0;
        game.timer = s.make_enemy_turn;
        timer:set(2500);
        dg_roll:disable();
        dg_pass:disable();
    end;
    make_enemy_turn = function()
        local s = dice_game;
        local pl = rnd(6);
        pr [[Соперник бросает кости. ]];
        pr([[Результат броска: ]] .. tostring(pl) .. [[.^]]);
        if pl == 1 then
            pr [[Ваш соперник теряет ход. ]];
            s:player_turn();
        else
            s.current_pts = s.current_pts + pl;
            local r = rnd(10);
            if r == 1 then
                s.enemy_pts = s.enemy_pts + s.current_pts;
                pr [[Соперник передает вам ход. ]];
                s:player_turn();
            elseif r == 2 then
                pr [[Соперник продолжает игру. ]];
            elseif s.enemy_pts > s.player_pts then
                if s.enemy_pts + s.current_pts >= 100 then
                    s.enemy_pts = s.enemy_pts + s.current_pts;
                    pr [[Соперник передает вам ход. ]];
                    s:player_turn();
                else
                    pr [[Соперник продолжает игру. ]];
                end;
            else
                if s.enemy_pts + s.current_pts >= s.player_pts then
                    s.enemy_pts = s.enemy_pts + s.current_pts;
                    pr [[Соперник передает вам ход. ]];
                    s:player_turn();
                else
                    pr [[Соперник продолжает игру. ]];
                end;
            end;
        end;
    end;
};

dg_roll = obj {
    nam = "dg_roll";
    dsc = [[{Бросить кость. }^]];
    act = function(s)
        if dice_game.state == 0 then
            local pl = rnd(6);
            local en = rnd(6);
            pr([[У вас выпало ]] .. tostring(pl) .. [[ очков. У соперника -- ]] .. tostring(en) .. [[. ]]);
            if pl > en then
                pr [[Вы ходите первым. Бросайте кость. ]];
                dice_game.first = true;
                dice_game:player_turn();
            elseif pl < en then
                pr [[Ваш соперник ходит первым. ]];
                dice_game.first = false;
                dice_game:enemy_turn();
            else
                pr [[Результаты совпали. Повторите бросок. ]];
            end;
        else
            local pl = rnd(6);
            pr([[Результат броска: ]] .. tostring(pl) .. [[.^]]);
            if pl == 1 then
                pr [[Вы теряете набранные очки. ]];
                dice_game:enemy_turn();
            else
                dice_game.current_pts = dice_game.current_pts + pl;
            end;
        end;
    end;
};

dg_pass = obj {
    nam = "dg_pass";
    dsc = [[{Передать ход. }^]];
    act = function(s)
        dice_game.player_pts = dice_game.player_pts + dice_game.current_pts;
        dice_game.current_pts = 0;
        dice_game:enemy_turn();
        return [[]];
    end;
};

dg_lose = obj {
    nam = "dg_lose";
    dsc = [[{Сдаться (ставка будет потеряна). }^]];
    act = function(s)
        timer:stop();
        game.timer = nil;
        walk(dice_game_lose);
    end;
}

dice_game_draw = cutscene("dice_game_draw", "Игра в кости", [[Человек разводит руками: "Ничья. Сыграем еще раз?"]], "port_street");


dice_game_win = cutscene("dice_game_win", "Игра в кости", [[Человек вручает вам сумму выигрыша: "Поздравляю, вы выиграли! Сыграем еще?"]], "port_street", function()
    pl.money = pl.money + dice_game.stake;
end);

dice_game_lose = cutscene("dice_game_lose", "Игра в кости", [[Человек довольно потирает руки и прячет в карман ваши деньги: "В следующий раз вам повезет. Может сыграем еще?"]], "port_street", function()
    pl.money = pl.money - dice_game.stake;
end);