summaryrefslogtreecommitdiff
path: root/tui/tui.py
blob: 7d8f56579e750214f5125ca45cff76a30654a619 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
""" tui/tui.py - runko käyttöliittymälle """
# pylint: disable = multiple-imports
from .static import Action
from .kbd import Kbd, NoKbd
from .ansi_draw import AnsiDraw, SuppressDraw


class Tui():
    """ Tui - Luokka käyttäjän interaktiota varten """
    # pylint: disable = unused-argument
    def __init__(self, **opts):
        self.bot = opts['bot'] if 'bot' in opts else None
        self.autoplay = opts['autoplay'] if 'autoplay' in opts else False
        self.interact = opts['interact'] if 'interact' in opts else True
        self.suppress = opts['suppress'] if 'suppress' in opts else False
        self.height = opts['height'] if 'height' in opts else 15

        # jos ei oo bottia pitää olla interaktiivinen
        if self.bot is None:
            self.autoplay = False
            self.interact = True
            self.suppress = False

        # jos ei mitään näytetä ei voi olla interaktiivinen
        self.interact = False if self.suppress else self.interact

        # automaattipeli pitää olla päällä jos ei interaktiivinen
        self.autoplay = self.autoplay if self.interact else True

        if self.interact:
            self.kbd = Kbd()
        else:
            self.kbd = NoKbd()

        if self.suppress:
            self.draw = SuppressDraw()
        else:
            self.draw = AnsiDraw(height=self.height)

    def matrix_selector(self, matrix, x, y):
        """ valinta matriisita """

        # automaattipeli avaa botin vinkit heti
        if self.autoplay:
            action, x, y = self.bot.hint(matrix, x, y)
            if action != Action.NOOP:
                self.draw.matrix(matrix, -1, -1)
                return Action.OPEN if action==Action.SAFE else action, x, y


        # ilman näppiskäsittelijää voidaan lopettaa
        if not self.interact:
            return Action.QUIT, 0, 0

        w, h = len(matrix), len(matrix[0])
        while True:
            self.draw.matrix(matrix, x, y)
            action, x, y = self.kbd.read_matrix_action(w, h, x, y)
            match action:
                case Action.QUIT:
                    return (action, x, y)
                case Action.OPEN | Action.FLAG | Action.BOMB | Action.SAFE:
                    if matrix[x][y] >= 10:
                        return (action, x, y)
                case Action.HINT:
                    if self.bot is not None:
                        return self.bot.hint(matrix, x, y)

    def game_over(self, matrix, x, y):
        """ tehtävät kun kuolee """
        self.draw.matrix(matrix, x, y)
        self.draw.status_line(
            "K  " if self.suppress else "Peli ohitse! Kuolit!"
        )
        self.kbd.read_action()

    def game_win(self, matrix, x, y):
        """ tehtävät kun voittaa """
        self.draw.matrix(matrix, x, y)
        self.draw.status_line(
            "V  " if self.suppress else "Peli ohitse! Voitit!"
        )
        self.kbd.read_action()

    def game_end(self, matrix):
        """ tehtävät ihan pelin lopuksi """
        if self.interact:
            self.draw.matrix(matrix, -1, -1)
            self.draw.status_line("Kiitos!             ")