Fastbar
Powrót do strony głównej
Trzymaj pliki na gmclan.org!
Game Maker w pytaniach i odpowiedziach!
Polska dokumentacja
Tabela wyników ligi 24
Pobierz GM
Akademia GMCLANu
Kategorie bazy artykułów
Artykuły -> Game Maker -> Kursy dla początkujących
Treść artykułu
O stringach słów kilka
autor: Jakim (25.03.07)
Początek

Dzisiaj się zajmiemy stringami, czyli inaczej - łańcuchami znaków, mówiąc prościej - tekstem. Na początek podam przykład zmiennej typu string:

gml:
zmienna1="To jest tekst";


Łańcuchy można również otwierać i zamykać apostrofami:

gml:
zmienna1='To jest tekst';


Do każdej takiej zmiennej możemy dopisywać kolejne wiadomości:

gml:
zmienna1='To jest ';
zmienna1+='tekst';


...co w rezultacie da "To jest tekst". Trzeba pamiętać, że nie można mieszać zmiennych typów string i real:

gml:
zmienna1='Życia: ';
zmienna1+=lives;


Jak możemy się domyślać, w trakcie gry wyskoczy nam komunikat o błędzie. Na szczęście istnieje obejście - każdą zmienną liczbową można bezproblemowo zamienić na ciąg znaków. Służy do tego funkcja string(val), gdzie val to zmienna typu real. Jak ją wykorzystać do powyższego przykładu?

gml:
zmienna1='Życia: ';
zmienna1+=string(lives);


O, tak. Teraz jest w porządku. Przy funkcji string(val) możemy zamiast val podstawiać mniej lub bardziej skomplikowane działania.

gml:
zmienna1=string((15+liczba1*liczba2)/4);


Komendą przeciwną do string(val), tj. zamieniającą ciąg znaków na wartość liczbową, jest real(string):

gml:
string1="20";
real(string1);


Możemy także sprawdzić, czy dana zmienna jest zmienną liczbową/tekstową. Używamy do tego is_real(zmienna) lub is_string(zmienna).

gml:
zmienna1="20";
zmienna2=is_real(zmienna1);


Jeśli warunek zostanie spełniony, zmienna1 przyjmie wartość 1 (true). W powyższym skrypcie otrzymamy 0 (false), gdyż zmienna1 mimo wszystko jest stringiem.

Wbudowane zmienne

Dobrze, mniej więcej zaznajomiliśmy się z podstawami. Wyobraźmy sobie, że chcemy zrobić okienko, w którym gracz może sobie wpisywać tekst. Domyślną, wbudowaną zmienną, w której znajdują się wszystkie znaki wpisywane przez gracza, jest keyboard_string. Najprostszym sposobem jest rysowanie tekstu za pomocą funkcji draw_text(x,y,string). Poniższy skrypt umieszczamy w DRAW:

gml:
draw_text(x,y,keyboard_string);


Oczywiście za x i y podstawiamy własne wartości.

Poza keyboard_string istnieją jeszcze inne wbudowane zmienne. Są to:

keyboard_key - zawiera numer ASCII (keycode) aktualnie wciskanego klawisza (real).
keyboard_lastchar - zawiera znak ostatnio naciśniętego klawisza (string).
keyboard_lastkey - j/w, jednak zamiast znaku mamy tu numer ASCII (real).

Co zostało wciśnięte?

Teraz zajmiemy się podstawowymi funkcjami sprawdzającymi, czy dany klawisz nie został wciśnięty. Możemy sprawdzić, czy jakiś konkretny przycisk jest obecnie wciskany - keyboard_check(key), gdzie key to numer ASCII danego klawisza (wygodniej jest korzystać ze stałych zaczynających się od vk_ - przykładowo stała vk_enter przypisana jest klawiszowi ENTER):

gml:
if keyboard_check(vk_right)
{x+=1;}


Kod ten będzie przesuwać obiekt o jeden piksel w prawo, jeśli tylko będzie wciskana strzałka w prawo.

UWAGA: Lista klawiszy znajduje się w dokumentacji.

Drugą z kolei funkcją jest keyboard_check_pressed(key). Różni się ona od poprzedniej tylko tym, iż wykonuje daną akcję tylko raz przy zapętlonym zdarzeniu:

gml:
if keyboard_check_pressed(vk_right)
{x+=32;}


Za każdym razem, gdy wciśniemy strzałkę w prawo, obiekt przesuwać się będzie jednorazowo o 32 piksele w prawo.

Jest jeszcze ostatnia funkcja, mianowicie keyboard_check_released(key). Działa jak powyższa, z tą jednak różnicą, że wykonuje warunek, jeśli dany klawisz puszczamy. Przykład użycia:

gml:
if keyboard_check_released(vk_escape)
{game_end();}


Powyższy skrypt zakończy grę, gdy puścimy klawisz ESCAPE.

Jest jeszcze jedna funkcja, funkcja dość rzadko używana - keyboard_check_direct(key), która działa jak keyboard_check(key). Jest jednak mała, drobna różnica: warunki zbudowane na keyboard_check_direct(key) działają również, gdy zminimalizujemy naszą grę/program.

Zastanówmy się jednak, co zrobić, gdy chcemy stworzyć warunek, który sprawdzałby, czy został wciśnięty klawisz, dajmy na to, A. Nie możemy wpisać pod key po prostu A, gdyż Game Maker potraktuje to jako zmienną. Z pomocą idzie nam
ord(str) - funkcja zwracająca numer ASCII literki:

gml:
if keyboard_check_pressed(ord('Q'))
{game_end();}


Odwrotnością tej funkcji jest chr(val), która zamienia keycode na znak (string).

gml:
zmienna1=65;
zmienna2=chr(zmienna1);


Zmienna2 zamieni się w string "A".

UWAGA: Przy funkcji ord(str) należy używać wyłącznie wielkich liter.

Głupi Num Lock!

Możemy również sprawdzać, czy aktywny jest Num Lock. Robi się to za pomocą keyboard_get_numlock(). Można także z poziomu programu włączyć Num Lock - służy do tego keyboard_set_numlock(on), gdzie za on podstawia się true (1; włączone) lub false (0; wyłączone). Przykład użycia:

gml:
keyboard_set_numlock(1-keyboard_get_numlock());


Przełącza (toggle) Num Lock z włączonego na wyłączony i vice versa.

Ciekawą funkcją oferowaną przez Game Maker jest możliwość "symulowania" wciśnięcia jakiegoś klawisza: keyboard_key_press(key) (wciśnięcie klawisza) oraz keyboard_key_release(key) (puszczenie).

Powyższe funkcje te jednak są rzadko używane w grach. Praktyczniejsze zastosowanie mają w programach.

Chowaj się

W Game Makerze możemy manipulować schowkiem. Pobieranie tekstu ze schowka staje się proste:

gml:
tekst=clipboard_get_text();


Można także wykonać odwrotną operację - przenieść tekst ze zmiennej do schowka:

gml:
clipboard_set_text(tekst);


GML pozwala także sprawdzić, czy w schowku znajduje się tekst: clipboard_has_text():

gml:
if clipboard_has_text()=1
{tekst="Schowek jest pełny.";}
else
{tekst="Schowek jest pusty.";}


Change my... string?

Same stringi można w Game Makerze zmieniać i modyfikować. Tym zajmiemy się za chwilę; teraz będzie sprawdzać nasze "łańcuchy". Najpierw sprawdźmy, jak długa jest nasza zmienna. Do tego służy string_length(str), gdzie str to oczywiście nasza zmienna. Przykładowo:

gml:
zmienna1="Ala ma kota.";
zmienna2=string_length(zmienna1);


Otrzymamy wynik 12, gdyż tyle znaków zawiera zmienna1. Z kolei do sprawdzania, czy w danym ciągu znaków znajduje się jakiś wyraz/literka, używa się funkcji string_count(substr,str), gdzie substr to szukany wyraz, a str - przeszukiwana zmienna. Wynikiem będzie liczba znalezionych fraz - jeśli nie ma takowej ani jednej - oczywiście zmienna będzie wynosić 0.
gml:
zmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_count("Ala",zmienna1);


Wynik, jak łatwo się domyślić, będzie wynosić 2 - tyle razy właśnie w zmiennej1 pojawił się wyraz "Ala". Co teraz? Chcemy wiedzieć, jaka literka kryje się wybranym miejscu naszego ciągu. Używamy do tego string_char_at(str,index) - index to pozycja w tekście:

gml:
zmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_char_at(zmienna1,6);


Już wyjaśniam. Szukaliśmy znaku kryjącego się na szóstym miejscu (stąd notabene 6). Co otrzymamy? Proste - znak "a". Podobną w działaniu jest funkcja string_pos(substr,str). Zwraca ona pozycję szukanego ciągu (substr) w całej zmiennej (str. Jeśli szukana fraza się powtarza, Game Maker bierze pod uwagę pierwszy znaleziony wyraz, jeśli nie występuje w ogóle - zwraca 0.

gml:
zmienna1="To_jest_przykładowy_tekst.";
zmienna2=string_pos("_",zmienna1);


Mimo iż znak "_" występuje więcej niż raz, zmienna2 będzie mieć wartość 3 - jest to pozycja pierwszego z kolei znaku "_".

Sprawdzanie mamy za sobą. Zajmijmy się modyfikacją [COLOR=blue]stringów[/KOLOR]. Za pomocą kilku funkcji możemy manipulować wielkością tekstu:

- string_lower(str) - zamienia w zmiennej tekstowej str wszystkie litery na małe.
- string_upper(str) - zamienia w zmiennej tekstowej str wszystkie litery na duże.

Przykładowo:

gml:
zmienna1="TO jest JAKIŚ tekst";
zmienna2=string_lower(zmienna1);
zmienna3=string_upper(zmienna1);


Uzyskamy przy zmiennej2 "to jest jakiś tekst", a przy zmiennej3 - "TO JEST JAKIŚ TEKST". Oprócz zmiany wielkości można także pozbawiać zmienne np. liter/cyfr:

- string_letters(str) - usuwa z ciągu str wszystkie znaki oprócz liter.
- string_digits(str) - usuwa z ciągu wszystkie znaki oprócz cyfr.
- string_lettersdigits(str) - usuwa z ciągu wszystkie znaki oprócz liter i cyfr.

Są to bardzo proste w użyciu funkcje:

gml:
zmienna1="ABCDE_>!@_12345";
zmienna2=string_letters(zmienna1);
zmienna3=string_digits(zmienna1);
zmienna4=string_lettersdigits(zmienna1);


Zmienna2 zawierać będzie "ABCDE" (spacje również są usuwane), zmienna3 - "12345", a ostatnia zmienna - "ABCDE12345".

UWAGA: Polskie znaki diaktryczne nie są traktowane jako litery.

Hm, a co teraz? Zostały nam funkcje, które pozwalają nam kopiować/zamieniać/wstawiać/usuwać fragmenty stringów - czyli rzeczy bardzo ważne i przydatne.

Pierwszą funkcją jest string_copy(str,index,count) - pozwala ona "wybrać" fragment zmiennej str o początku index i długości count.

gml:
zmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_copy(zmienna1,14,3);


Otrzymamy "Ala", ponieważ literka "A", czyli początek, znajduje się na wybranej przez nas czternastej pozycji (stąd 14), a długość wynosi 3.

Kolejną funkcją jest string_delete(str,index,count). Działa identycznie jak poprzednia, lecz nie kopiuje, a usuwa tekst ze zmiennej.

gml:
zmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_delete(zmienna1,13,4);


Usunęliśmy fragment od pozycji 13 i długości 4. Zostało nam: "Ala ma kota. lubi go.".

Możemy nie tylko kopiować i usuwać dane ze zmiennej. Za pomocą string_insert(substr,str,index) da się wstawiać w wybrane miejsce (index) wstawić inny string.

gml:
zmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_insert("bardzo ",zmienna1,18);


Wyniku "Ala ma kota. Ala bardzo lubi go." raczej nie muszę tłumaczyć.

Game Maker oferuje także możliwość zamieniania wybranych ciągów na inne; wszystko to za pomocą string_replace(str,substr,newstr) - gdzie substr to szukana fraza, a newstr - jej zamiennik. I, standardowo, przykładzik:

gml:
zmienna1="Ala ma kota. Ala lubi go.";
zmienna2=string_replace(zmienna1,"Ala","Jaś");


A cóż to? Otrzymaliśmy "Jaś ma kota. Ala lubi go.". Dlaczego? Funkcja string_replace(str,substr,newstr) zamienia pierwszy z brzegu wyraz. Do zmiany wszystkich fraz w jednym ciągu używa się funkcji string_replace_all(str,substr,newstr). Przy użyciu tej metody uzyskamy "Jaś ma kota. Jaś lubi go.".

Została jeszcze ostatnia funkcja string_repeat(str,count), która najzwyczajniej powtarza nam dany ciąg count razy:

gml:
zmienna1="Ala ma kota. ";
zmienna2=string_repeat(zmienna1,2);


Wynik: "Ala ma kota. Ala ma kota. ."

Others

Jest masa innych funkcji, które operują łańcuchami. Są to na przykład wiadomości w okienkach (zaczynające się od message_). Przydatną funkcją, która pozwala graczowi wpisać ciąg znaków, jest get_string. Również przy zapisywaniu/odczytywaniu korzystamy (get_save_filename/get_open_filename) ze stringów.

Przy operowaniu plikami w Game Makerze często korzystamy z tych oto zmiennych:

- working_directory - inaczej katalog z grą.
- temp_directory - windowsowy folder tymczasowy.

Każdy string da się bezpośrednio w aplikacji przetworzyć na skrypt GML - to wszystko za pomocą execute_string(str):

gml:
zmienna1="instance_create(x,y,obj1);"
execute_string(zmienna1);


Zakończenie

Oczywiście stringi to nie tylko teksty w grze. To także m.in. ścieżki do plików, wartości wyciągnięte z plików *.ini czy ciągi wzięte z plików tekstowych. Łańcuchy znaków są tak wszechobecne w Game Makerze, że nie sposób opisać wszystkich funkcji mniej lub bardziej z nimi związanych.

Pozdrawiam, Jakim.
głosów: 11 | ocena: 8.73 oceń zasób | dodał: Jakim
Komentarze
stron: 1

1


av

Marek.S (15:59, 25.03.2007)

Super artykuł szkoda że nie dałeś go z miesiąc temu jak się z tym męczyłem

av

Zychu (16:41, 25.03.2007)

no moze byc ale takie to wszystko pogmatwane ;P

av

spyro (22:44, 25.03.2007)

Wow, na prawdę niezły artykuł xD W sam raz dla początkujących - pozwoli im dokonać tego pierwszego razu ze stringami

av

Marmot (23:22, 25.03.2007)

Kiedy artykuł "O figach słów kilka"?

av

Matthew (15:49, 27.03.2007)

Znalazłem błąd:
"Jeśli warunek zostanie spełniony, zmienna1 przyjmie wartość 1 (true). W powyższym skrypcie otrzymamy 0 (false), gdyż zmienna1 mimo wszystko jest stringiem." zmienna2 przyjmie wartość 1 (true).

av

sephiroth12 (11:16, 28.03.2007)

Nie ma tam błędu
zmienna1="20";
zmienna1 ma wartość "20" a nie 20 to string

stron: 1

1



Dodaj komentarz:
Treść:
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Użytkownicy on-line
16 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 16, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
MaxGaming (3:18, 23.04.18):
Niekoniecznie dla reklamodawcy, ale w dużym uproszczeniu średnia wyjdzie taka sama(nie biorąc pod uwagę targetu właściciela serwisu/aplikacji, ale to już problem reklamodawcy i właściciela nośnika tych reklam).
MaxGaming (3:16, 23.04.18):
Ale dlaczego miałoby się równać? Myślę że to lepsze rozwiązanie niż stałe zużycie niezależnie od tego jaki ktoś ma komputer. Procentowe zużycie wydaje mi się dużo bardziej sprawiedliwe niż stałe dla każdego urządzenia
Wojo (10:29, 20.04.18):
Jeśli chodzi o reklamy to odpowiadają mi takie co są na gmclanie teraz niż zamienianie połowy gmclanu na reklamę podpasek czy czegoś podobnego
Wojo (10:27, 20.04.18):
Tylko, że 10% zużycia słabego komputera nie równa się 10% zużyciu dobrego komputera
Wojo (10:27, 20.04.18):
Tylko, że 10% zużycia kom
MaxGaming (1:00, 20.04.18):
Wiesz wirusy też są mimo tego że nie powinny, ale jakoś radzimy sobie z tym
MaxGaming (1:00, 20.04.18):
Mi mniej przeszkadza kopanie bitcoinów w tle niż npnatarczywe reklamy. Wolałbym natomiast aby takie strony mogły się do tego przyznać i nie były linczowane
MaxGaming (0:59, 20.04.18):
przeciwko oszustą byłby fakt braku ograniczeń. Strona musiałaby tylko informować, a czy wkorzysta 90% to jej sprawa. BYleby użytkownik wiedział sam na co się pisze
MaxGaming (0:58, 20.04.18):
Ale o to chodzi z procentami. Dzięki temu nawet jak mamy wolny komputer odczujemy tak samo. Co do innego prawa. Na każdej stronie jakoś jest informacja np. o plikach cookies. Dałoby to sięogarnąć, tym bardziej gdyby powstałą organizacja sprawdzająca takie informacje i byłaby np na jej stronie lista nieuczuciwych stron które należy unikać. Możnaby wprowadzić także w przeglądarkach żeby takie strony nie otwierały się, albo wymagały wyraźnego potwierdzenia użytkownika. Myślę że głównym argumentem
Wojo (23:08, 19.04.18):
tak samo bodajże w szwecji partia piratów chciała założyć własne małe państwo gdzie piractwo byłoby legalne dzięki czemu niektóre strony mogłyby obejść prawo w taki lub inny sposób
Wojo (23:06, 19.04.18):
a żeby mieć jakiś faktyczny zysk z takich koparek bitcoinów to musiałbyś je ustawić na jakiejś popularnej stronie bo np na takim gmclanie zbyt wiele nie wydobędziesz
Wojo (23:05, 19.04.18):
Ale to brzmi abstrakcyjnie Stronę zawsze można założyć w innym państwie gdzie takie prawo nie obowiązuje, 10% mocy obliczeniowej komputera przecież się różni w zależności od tego jak mocny mamy komputer
MaxGaming (21:08, 19.04.18):
Według mnie jeśliby ustanowić prawnie że strona która twierdzi że pobierze np. 10% mocy obliczeniowej naszego komputera na prawdę musi tyle pobierać pod groźbą kary to np kopanie bitcoin w tle jest fajną alternatywą dla reklam
Wojo (10:33, 19.04.18):
Jak dla mnie to sprytne rozwiązanie ktoś wymyślił
I am vader (0:53, 19.04.18):
Nie pamietam jak ten program sie nazywal ale za jaja bym powiesil skurczybyka ktory to zrobil.
I am vader (0:52, 19.04.18):
Odmowilem, nic wielkiego, ale potem przed pobraniem programu kazano mi kopac conajmniej jakastam chwile, tu juz sie podniosly czerwone flagi. Wiec sprawdzilem ten program pod katem wirusow i okazalo sie ze wygenerowane exeki instaluja koparki na kompach uzytkownikow.
I am vader (0:52, 19.04.18):
Znalazlem taki program ktory zamienia pliki bat w exe poniewaz powody, ale na stronie zostalem zapytany czy uzycze komputera na mineowanie kryptowalut podczas przegladania strony zeby wspomoc tworce.
I am Lord (23:59, 18.04.18):
może flash coś dodaje?
Wojo (23:06, 18.04.18):
Nawet pobrałem sobie ADW cleanera i nic nie wykrył
Wojo (22:38, 18.04.18):
No ale co mi po tym, że ktoś ma ip z Gdańska i jest zainteresowany zabawkami dla psów co jest bezużytecznymi danymi nawet dla hakera
Wojo (22:36, 18.04.18):
W sumie jak tak siedzę i się zastanawiam to może wydobyć pliki cookies, przechwycić naciśnięte klawisze
Wojo (22:33, 18.04.18):
Ale co ma śledzić? Lokalizację na podstawie ip? Bo nie rozumiem za bardzo
PsichiX (21:38, 18.04.18):
mowie o skrypcie js-agent.newrelic.com, ktory rozpoznawany jest jako narzedzie sledzace.
PsichiX (21:36, 18.04.18):
prowo?
Wojo (19:40, 18.04.18):
To tak zwane "prowo", które było nieudolną próbą "prowo" yxa
I am Lord (16:59, 18.04.18):
Aż tak ci się zacina to?
Wojo (16:11, 18.04.18):
Pół biedy ze śledzeniem ale denerwuje mnie kopanie BitCoinów przez ten link Nie ma to jak napychać portfel komuś kogo nie znam
I am Lord (0:04, 18.04.18):
Nic o tym nie wiem, a co to za skrypt?
PsichiX (23:56, 17.04.18):
a ten skrypt śledzący to Ty wrzucałeś, czy twórcy scratcha są na tyle ułomni, że coś takiego od siebie dodają? ;>
I am Lord (22:56, 17.04.18):
gnysek (9:35, 12.04.18):
No ja raz miałem nieważną z winy sekretariatu i też chyba musiałem 10zł zapłacić.
Wojo (12:34, 11.04.18):
A wszyscy co chcieli rzucić gimnazjum to po prostu strzelali kible do oporu i ich przenosili do ohp
Wojo (12:08, 11.04.18):
Nie mam jak się zapytać gdyż nie posiadam żadnych znajomych
Gibki Kaktus (10:15, 11.04.18):
To powiedz, że ich popierdoliło xD
MaxGaming (19:39, 10.04.18):
Ustawowa opłata za duplikat to właśnie 9zl. Przeczytajcie jeszcze raz o czym ja mówię :/
Gibki Kaktus (17:11, 10.04.18):
Ja jak zgubiłem to płaciłem 9 czy tam 10 zł xD
MaxGaming (23:07, 9.04.18):
Opłata 9zł to co innego, Nie bardzo, bo kolega z innej szkoły miał podobne doświadczenia...
Chell (22:59, 9.04.18):
albo uisc oplate, jeszcze nie slyszalem o darmowych duplikatach dokumentow
Ignatus (22:20, 9.04.18):
Chyba po prostu Cię nie lubią i robią sobie jaja.Przysłuchaj się przy drzwiach od sekretariatu czy nie kwiczą ze śmiechu zaraz po Twoim wyjsciu
MaxGaming (21:29, 9.04.18):
Szukam na necie i nigdzie nie widzę że jest taki przepis. I wątpie że jeśli jest to muszą to być drogie i nie czytane przez nikogo anonse. Wie ktoś coś?
MaxGaming (21:28, 9.04.18):
Ma ktoś pojęcie na jakiej podstawie szkoła może ode mnie żądać płatnego(i to słono jak za taką usługę) ogłoszenia w anonsach jeśli zgubiłem legitymacje? Twierdzą że nie mogą mi wyrobić nowej bez potwierdzenia zamieszczenia ogłoszenia w anonsach i uiszczenia opłaty...
Wojo (21:11, 9.04.18):
Nie ogarnalem ze jest tylko 48h ,myslalem ze z tydzien ;p
Ignatus (21:04, 7.04.18):
Nie ogarnalem ze jest tylko 24h ,myslalem ze z tydzien ;p
I am vader (19:00, 7.04.18):
Troche pozno zaalarmowales
Ignatus (18:25, 7.04.18):
Nieważne już ,zabrakło kilku głosów,przepadło
Ignatus (16:36, 7.04.18):
Moja żona robi charytatywnie lalki dla chorych i niepełnosprawnych dzieci.Mogę prosić o "wykop" ? www.wykop.pl/li...epelnosprawnych
PsichiX (0:04, 6.04.18):
uuu, antyleniwizm!
I am Lord (23:43, 5.04.18):
Ale kierowniczka widziała że sam ładuję to mu da popalić
I am Lord (23:42, 5.04.18):
zacząłem ładować przed 22 i gość miał mi pomóc a dał nogę
Ankieta
» Jakie kursy najchętniej widziałbyś na stronie ?
GM Studio
GM Studio 2
Godot
Construct

GMCLAN to serwis o programie Game Maker i nie tylko.
Copyright © 2002-2018. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus (ranmus.pl), © 2017-2018 {=|=} fable_inside();

[ Czas generowania strony: 0.04196 sekund ] [ Liczba zapytań MySQL: 13 ]