aboutsummaryrefslogtreecommitdiffhomepage
path: root/qml/pages/Game.qml
blob: cc13b84d1cd7fcd4879e7ea18376cd7641548cdb (plain) (blame)
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import QtQuick 2.2
import Sailfish.Silica 1.0
import org.nemomobile.configuration 1.0
import ".."

Page {
    // Get passed by previous page
    property int bits: 0
    property bool help: false

    id: page
    allowedOrientations: Orientation.Portrait

    SilicaFlickable {
        anchors.fill: parent
        contentHeight: root.height

        PullDownMenu {
            MenuItem {
                text: qsTr("Leaderboard")
                onClicked: pageStack.push(Qt.resolvedUrl("LeaderBoard.qml"))
            }
        }

        Column {
            property int bits: page.bits
            property bool help: page.help
            property var correct: new Array(bits)
            property var matrix: new Array(Math.pow(bits + 1, 2))
            property var start_time: 0

            id: root
            width: page.width
            height: page.height
            spacing: Theme.paddingLarge

            PageHeader {
                title: qsTr("Binary Fun")
            }

            function submit(start_time, end_time, difficulty, level) {
                var key = "RmMwQ0ptT1FlSkpIeEdzNDB3a1B5OVk1ZE8wYkRjSzI=";
                var xhr = new XMLHttpRequest();
                xhr.open("POST", "https://marvinborner.de/lead/binaryfun1/add", true);
                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
                var query = "writeKey=" + Qt.atob(key) + "&win=true&board=default&start_time=" + start_time
                        + "&end_time=" + end_time + "&difficulty=" + difficulty
                        + "&level=" + level + "&cheats=" + (root.help ? "true" : "false")
                        + "&name="+ username.value + "&mods=0" + "&time=" + (end_time - start_time);
                xhr.send(query);
            }

            function nearest(number) {
                if (number % (bits + 1) === 0) {
                    return number
                } else {
                    return number - (number % (bits + 1))
                }
            }

            function check(index) {
                root.matrix[index] ^= 1;
                var near = nearest(index);
                var current_score = parseInt(info_label.text.substr(0, info_label.text.indexOf('/')))

                if (Number(root.matrix.slice(near, near + bits).join("")).toString() === (root.matrix[near + bits] >>> 0).toString(2) && timer.running) {
                    correct[near / (bits + 1) - 1] = 1;
                    info_label.text = current_score + 1 + " / " + root.bits;
                } else {
                    if (correct[near / (bits + 1) - 1] === 1 && timer.running) {
                        info_label.text = current_score - 1 + " / " + root.bits;
                    }

                    correct[near / (bits + 1) - 1] = 0;
                }

                if (correct.filter(function(i) { return i === 1 }).length === bits) {
                    if (timer.running) { // aka still playing
                        var end_time = (new Date()).getTime();
                        info_label.text = "Yeeehaaw!";
                        timer_label.text = ((end_time - start_time) / 1000) + "s - " + qsTr("Not bad!");
                        timer.running = false;
                        new_game.visible = true;
                        submit(start_time, end_time, bits, root.matrix.join(","))
                    }
                }
            }

            Grid {
                property int row: 0

                id: grid
                anchors.bottom: page.bottom
                columns: root.bits + 1
                rows: root.bits + 1
                Repeater {
                    id: repeater
                    model: Math.pow(root.bits + 1, 2)
                    delegate: Bit {
                        bits: root.bits
                        index: modelData
                        width: page.width / (root.bits + 1)
                    }
                }
            }

            Label {
                id: info_label
                text: "0 / " + root.bits
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.bottom: page.bottom
            }

            Label {
                id: timer_label
                text: "0s"
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.bottom: page.bottom
            }

            Timer {
                id: timer
                interval: 1000
                running: true
                repeat: true
                onTriggered: {
                    if (root.start_time === 0)
                        root.start_time = (new Date()).getTime();
                    timer_label.text = parseInt(timer_label.text.substr(0, timer_label.text.indexOf('s'))) + 1 + "s";
                }
            }

            Button {
                id: new_game
                text: qsTr("Play again")
                visible: false
                anchors.horizontalCenter: parent.horizontalCenter
                onClicked: pageStack.replace(Qt.resolvedUrl("Game.qml"), {bits: root.bits})
            }
        }
    }

    ConfigurationValue {
        id: username
        key: "/com/binaryfun/username"
        defaultValue: "anon"
    }
}