Changeset - 2b0b0271ccb0
[Not reviewed]
default
0 1 0
silverwing - 7 years ago 2017-09-09 09:15:17

fix: dice game
1 file changed with 5 insertions and 1 deletions:
0 comments (0 inline, 0 general)
london_dice.lua
Show inline comments
 
dice_game = room {
 
    var {
 
        player_pts = 0;
 
        current_pts = 0;
 
        enemy_pts = 0;
 
        first = false;
 
        state = 0;
 
    };
 
    nosave = true;
 
    noautosave = true;
 
    forcedsc = 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";
 
    };
 
    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;
 
        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;
 
        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(20);
 
            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;
 
@@ -110,51 +114,51 @@ dg_roll = obj {
 
    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;
 
};
 

	
 
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", "Игра в кости", [[Человек довольно потирает руки и прячет в карман ваши деньги: "В следующий раз вам повезет. Может сыграем еще?"]], function()
 
dice_game_lose = cutscene("dice_game_lose", "Игра в кости", [[Человек довольно потирает руки и прячет в карман ваши деньги: "В следующий раз вам повезет. Может сыграем еще?"]], "port_street", function()
 
    pl.money = pl.money - dice_game.stake;
 
end);
 
\ No newline at end of file
0 comments (0 inline, 0 general)