#include "fabula.hpp" std::vector> wzory = { // GK {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}, // Ślimak {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Sygnał TTL {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Okrąg {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1}, // Kwadrat {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ABACABA {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Paski {1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0}, // Puste pole {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; std::vector siatka = { // Możliwe stany pól siatki: // - 0 - niezamalowana, nie do zamalowania (zielony) // - 1 - niezamalowana, do zamalowania (złoty) // - 2 - zamalowana, nie do zamalowania (czerwony) // - 3 - zamalowana, do zamalowania (jasnozielony) // 1. bit mówi o tym, czy jest do zamalowania // 2. bit mówi o tym, czy jest zamalowana 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; void sprawdzPostepGry() { unsigned short zgodne_pola = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { // std::cout << "zgp: " << zgodne_pola << "\n"; unsigned short pole_w_siatce = siatka[10*i + (9 - j)]; bool pole_we_wzorach = wzory[biezacy_wzor][10*i + (9 - j)]; if (pole_w_siatce == 0 && pole_we_wzorach == 0) zgodne_pola++; else if (pole_w_siatce == 3 && pole_we_wzorach == 1) zgodne_pola++; else { // std::cout << "dla i=" << i << " j=" << j << " otrzymano p_w_s " << pole_w_siatce << " a spodziewano sie p_w_w: " << pole_we_wzorach << "\n"; return; } } } if (zgodne_pola == 100) { biezacy_wzor = (biezacy_wzor + 1) % (wzory.size() + 1); Foward = 45.0f; Sides = -45.0f; Rotation = 270.0f; nadpiszNowaSiatke(biezacy_wzor); } else { // std::cout << "zgodne_pola: " << zgodne_pola << "\n"; } } void ustalPozycjeGracza(GLfloat gracz_x, GLfloat gracz_z, short &grid_x, short &grid_z) { grid_x = static_cast(gracz_x) / 90; grid_z = static_cast(gracz_z) / 90; // zapobiega rysowaniu ze "spawna" if (gracz_x < 0 && gracz_x > -90) grid_x = -1; // ten przypadek dotyczy tylko noclipa if (gracz_z < 0 && gracz_z > -90) grid_z = -1; } void ustawSiatkeNaWzorNieNadpisujacPostepu() { for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { bool ma_byc_zamalowana = wzory[biezacy_wzor][10*i + (9 - j)]; if (ma_byc_zamalowana) siatka[10*i + (9 - j)] |= 1; else siatka[10*i + (9 - j)] = siatka[10*i + (9 - j)] - siatka[10*i + (9 - j)] % 2; } } } void nadpiszNowaSiatke(short nowy_wzor) { biezacy_wzor = nowy_wzor; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { siatka[10*i + (9 - j)] = static_cast(wzory[biezacy_wzor][10*i + (9 - j)]); } } } void tworzKratke(unsigned int grid_x, unsigned int grid_z, unsigned short grid_value) { // https://rgbcolorpicker.com/0-1 switch (grid_value) { case 0: // niezamalowana, nie do zamalowania (zielony) glColor3d(0.031, 0.51, 0.094); break; case 1: // niezamalowana, do zamalowania (złoty) glColor3d(0.7, 0.5, 0.259); break; case 2: // zamalowana, nie do zamalowania (czerwony) glColor3d(1, 0.122, 0); break; case 3: // zamalowana, do zamalowania (biały) glColor3d(1, 1, 1); break; } platforma(45.0f + grid_x * 90.0f, 0.0f, 45.0f + grid_z * 90.0f, 45.0f, 45.0f); } void tworzKratkiZSiatki() { for (int i = 0; i < 10; i++) { // Aby nie musieć rysować wzorów w odbiciu // lustrzanym, musimy tutaj przyjąć inną sekwencję // (dlatego rysujemy od prawej do lewej (9 do 0)) for (int j = 0; j < 10; j++) { tworzKratke(i, j, siatka[10*i + (9 - j)]); } } } void aktualizujBiezacaKratke(short grid_x, short grid_z) { if (grid_x < 0 || grid_z < 0) return; unsigned short poprzednia_wartosc = siatka[10*grid_x + (9 - grid_z)]; siatka[10*grid_x + (9 - grid_z)] |= 2; // zaznacz pole jako zamalowane unsigned short nowa_wartosc = siatka[10*grid_x + (9 - grid_z)]; // Jeżeli któreś z pól zostało zaktualizowane, sprawdź postęp gry if (poprzednia_wartosc != nowa_wartosc) { sprawdzPostepGry(); } }