How it’s made: Bank
Tak, trywialne, ale może i się przyda
Sugestie mile widziane ^_^
A więc - pisanie banku w grze.
Dodajemy sobie pole bank oraz bank_time do tabeli z graczami.
bank będzie przechowywał gotówkę gracza a bank_time ostatni update odsetek (zakładamy, że gracz dostaje 3% swojej gotówki co 24h)
///Przy okazji - muszę przepisać od nowa system banku w TGO, bo jest tak stary, że pisany wręcz tragicznie
Zaczynamy!
if(empty($p['bank_time'])){ //$p to tablica z pobranymi danymi gracza mysql_query("UPDATE `players` SET `bank_time` = UNIX_TIMESTAMP() WHERE `id`='$p[id]'"); } if($p['bank']!=0){ //Jeśli gracz ma coś w banku if(time()-$p['bank_time']=86400){ //Jeśli ostatni update był ponad 24h temu $p['bank'] += floor((time()-$p['bank_time'])/86400)*0.03*$p['bank']; //Obliczamy ile kasy w banku ma teraz gracz mysql_query("UPDATE `players` SET `bank` = '$p[bank]', `bank_time` = UNIX_TIMESTAMP() WHERE `id`='$p[id]'"); } }
Mam nadzieję, że się nigdzie nie pomyliłem, ja to z palca piszę ![]()
Czyli mamy już odsetki, teraz zajmiemy się wyjmowaniem i deponowaniem pieniędzy.
Przelewy są opcjonalne i nie będę ich teraz brał pod uwagę, warto zaznaczyć jednak, żeby zrobić limit lvl od którego można robić przelewy,jeśli gracz dostaje pieniądze na start.
Dlaczego?
Ano, bo pozakłada sobie 10 kont, z każdego po dajmy na to 150$ prześle i już ma 1500$ dodatkowo
Wstawiamy sobie dwa formularze - action=POST, sposób w jaki przekażecie typ operacji nie jest zbytnio ważny, może to być ukryte pole, a może to być tylko jeden formularz ale za to z radio buttonem do wyboru akcji - to już zostawiam wam.
Ja opiszę na przykładzie ukrytego pola w formularzu o nazwie op - 0 będzie oznaczało wypłatę o 1 wpłatę
if($_POST['op']==0 && $_POST['cash']){ //Jeśli formularz został wysłany $cash = (int) $_POST['cash']; //Filtrujcie wszystkie zmienne pochodzące od gracza, tyle to za mało. //To jest tylko mini-poradnik, więc nie robię wszystkiego za was :D if($cash0 && $p['bank']=$cash){ //Sprawdzamy, czy taką kwotę da się wypłacić mysql_query("UPDATE `players` SET `bank`= `bank` - $cash,`kasa`=`kasa`+$cash WHERE `id`='$p[id]'"); } } if($_POST['op']==1 && $_POST['cash']){ //Jeśli formularz został wysłany $cash = (int) $_POST['cash']; //Filtrujcie wszystkie zmienne pochodzące od gracza, tyle to za mało. //To jest tylko mini-poradnik, więc nie robię wszystkiego za was :D if($cash0 && $p['kasa']=$cash){ //Sprawdzamy, czy taką kwotę da się wypłacić mysql_query("UPDATE `players` SET `kasa`= `kasa` - $cash,`bank`=`bank`+$cash WHERE `id`='$p[id]'"); } }
Wszelkie informacje o gracza o pomyślnym lub też nie wykonaniu operacji pozostawiam wam, gdyż to nie wymaga specjalnych umiejętności ![]()
To byłoby na tyle w dzisiejszym How It's made, zapraszam do następnego odcinka który ukarze się nie wiadomo kiedy ![]()
Jeśli gdzieś zrobiłem błąd to napiszcie w komentarzach
How it’s made: zapowiedź
Oto, wszem i wobec zapowiadam nową serię wpisów na blogu, gdzie będę krok po kroku (może nie jak dla totalnego laika) wyjaśniał jak niektóre rzeczy w TGO są zrobione i jak napisać taki skrypt ![]()
Jeszcze nie wiem, czy będzie to regularnie w jakieś dni, dzisiaj tylko zapowiedź bo i z Rytra wracałem i się z Kasyx'em na mieście widziałem i jeszcze muszę na jutro jedną rzecz napisać, także czasu mam mało ;p
Zanim założysz projekt gry…
Wszyscy mają jakieś marzenia (no większość, ale uogólniając...). Jedni marzą o locie w kosmos, inni o o szybkim samochodzie. Dziś chciałem się skupić na marzeniach związanych z tworzeniem gier. Skupię się na grach via www, ale problem można uogólnić do każdego rodzaju takich produkcji. Sam doskonale wiem jak świetną rzeczą jest założyć projekt występować w nim jako szef wszystkich szefów. To jest szczyt marzeń z kategorii tworzenia gier, nic więc dziwnego, że większość twórców od razu chce zostać tym wymarzonym administratorem.
No i tu powstaje problem... Ogromna ilość gier (a najczęściej projektów, które KIEDYŚ miałyby spłodzić grę) pada w trybie prawie natychmiastowym. Dlaczego? Czasem drobne problemy przeróżnej natury powodują, że twórcy się cała zabawa po prostu nudzi. No to jest skrajnie żałosne i niestety dla takich ludzi nie przewiduję ratunku. Jedyna nadzieja, że nie wrócą oni na arenę gier via www w przyszłości. Ale o zgrozo zdarzają się i tacy, co okresowo próbują swoich sił cały czas "padając" na tym samym lub podobnym błędzie. No cóż, pozostawię to bez komentarza.
Przejdźmy lepiej do meritum sprawy i postawmy sobie pytanie: Czy powinienem założyć projekt gry?
Każdy, kto zakłada grę ma na nią pomysł. Ale to na pewno nie wystarczy! I zapamiętajcie sobie, że pomysł gry jeszcze nie czyni. Jest on fundamentem gry, ale to stanowczo za mało. Po pierwsze ważny jest fakt, jak dobry jest ten pomysł. Jeśli ma to być kolejne The Crims, Ogame czy Vallheru... Darujcie sobie. Naprawdę nie ma sensu. Te gry mają już swoje hity i musielibyście zrobić coś naprawdę dobrego, aby się wybić. A jeśli macie umiejętności, które Wam to umożliwią to raczej idźcie w coś nowego. Szkoda zmarnowanej energii.
Więc co jest najważnijesze, jeśli nie pomysł? Autorytet, z wszelkimi sekretami kryjącymi się pod tym słowem. Jeśli chcecie być administratorem projektu, Wasi ludzie muszą Was szanować i innej opcji nie ma. To jest kolejny problem wielu projektów: gry zakłada byle kto, bez najmniejszego doświadczenia. Nie tędy droga! Takie projekty już na wstępie skazane są na porażkę. Projekt to nic innego jak zarządzanie pewną grupą ludzi. To tak samo, jakby każdy zakładał sobie państwo i był samozwańczym królem. To nie ma głębszego sensu. Przywódca musi mieć w sobie to coś co ciągnie za nim ludzi i zachęca do działania. Jak zbudować ten autorytet? Są dwie drogi:
- pieniądze - jak płacisz teamowi, to jesteś szanowany i ludzie chętnie za Tobą pójdą, bo mają z tego oczywiste korzyści. Tu nawet nie ma co dyskutować. Jak masz kasę, to zrobisz wszystko i kupisz (prawie) wszystkich. Brzmi to brutalnie no ale tak to już jest.
- wiedza i doświadczenie - te prawie zawsze idą w parze. Według mnie są o wiele silniejszym autorytetem bo wzbudzają jednocześnie szacunek do administratora. Przy tworzeniu gier tą wiedzą będzie oczywiście bardzo dobra znajomość php, natomiast doświadczeniem inne projekty, które zakończyły się sukcesem (skrajną głupotą jest sie chwalić, że miało się 100 gier i każda padła! Liczą się tylko sukcesy!). Taki autorytet zapewnia bezpieczeństwo. Team wtedy wie, że ma nad sobą osobę kompetentną, na której można polegać.
I to jest właśnie istota problemu! Jak chcesz założyć grę to zastanów się najpierw nad sobą i odpowiedz na pytanie: czy ja się do tego nadaję? Czy mam wiedzę, doświadczenie albo kasę? Jeśli uzyskasz odpowiedź twierdzącą to jesteś na dobrej drodze aby stworzyć dobry projekt.
Jeśli jednak nie... To zaciągnij się do innych projektów, których jest od groma. Tam zyskasz potrzebną wiedzę i doświadczenie. Zobaczysz jak robią to inni i nauczysz się kilku przydatnych technik. Nie od razu Rzym zbudowano, więc idź do przodu małymi i systematycznymi krokami a nim się obejrzysz to sam będziesz na czele projektu, który to być może odmieni nasze spojrzenie na gry via www.
Pozdrawiam
Kasyx
Mini poradnik dla początkujących „twórców gier”
To zrozumiałe, że wiele osób chce zrobić własną grę via www i nie ma w tym nic złego.
(Na wstępie jeszcze radze przeczytać wpis nt. problemu polskiej sceny tegóż to typu gier, na tym blogu) .
Nie jest to how-to, ilustrujące krok po kroku proces tworzenia gry, ale generalne wytyczne dla ludzi, którzy chcą się tą dziedziną zajmować.
Zanim jeszcze zabierzemy się do nauki czegokolwiek, warto zadać sobie pytanie czy naprawdę to jest to co chcemy robić? Czy nie jest to tylko zachcianka? Słomiany zapał i gry via www to złe połączenie..
Musicie wbić sobie do głowy, że stworzenie gry, w którą grać będą nie tylko znajomi, nie polega na postawieniu gotowego silnika i jaraniu się super-pro-uber kontem admina.
Dobrze, wiemy już, że bez nauki html,css,php i ewentualnie js ani rusz.
Ale zanim do tego przejdziemy, zastanówcie się, czy znacie język polski.
Nie, nie żartuję.
Jeśli podczas tworzenia gry napotkacie problem, a na forum napiszecie "nie ciaua mi gra, pomuszcie!!!" to raczej nikt wam nie pomoże.
Tak samo, gracze wchodzący na główną stronę i widzący same błędy ortograficzne, stylistyczne i gramatyczne, raczej niezbyt chętnie zarejestrują się w waszej grze.
Nie wymagam umiejętności pisania 500 stronnicowych esejów, sam też czasem zrobię jakiś błąd, ale nie 3 byki w 2 wyrazach..
Skoro umiemy już się wysławiać, możemy iść dalej
Teraz pytanie - kupujemy książkę, czy czytamy kursy.
Powiem tak - nt. kursów mam nieco mieszane odczucia, sam uczyłem się z książki niemniej jednak, osobom które niezbyt mogą w danym momencie wydać 100zł na np. świetną moim zdaniem książkę Helionu "PHP5 i MYSQL - Biblia" (o tym, że komuś nie chce się czytac 1000 stron, nie chcę nawet slyszeć, lenistwo to największy problem młodych twórców gier) polecam temat na mmocenter i oczywiście manuala
Jeśli np. nie wiemy, co dana funkcja robi, warto zajrzeć na powyższą stronę
Jest tam też FAQ i właściwie wszystko co byście chcieli wiedzieć, bez php.net czasami ani rusz
Oczywiście, zanim php to html i css.
Tutaj to uczyłem się sam, już nawet nie pamiętam jak, ale z dobrych kursów jest ten.
I na koniec kilka małych porad co do pisania w php
- Wcięcia - łatwiej będzie Ci potem czytać kod
- Normalne nazwy zmiennych - nie trzeba potem szukać w całym kodzie co zmienna $xd przechowuje
- Porządek w plikach - folder "dupa" może i wydać się sensowny teraz, ale za pare tygodni będziesz przeglądał w nim pliki, żeby dojść do tego, co on tam w ogóle robi
Problem polskiej sceny gier via www
Uwaga: Będzie trochę o kotletach, książkach i jak zwykle parę moich herezji
Od jakiegoś czasu obserwuje sobie co dzieje się na polskiej scenie gier via www.
Generalnie (pomijając projekty typu Lunaroth, w których autorzy naprawdę wprowadzają coś nowego, a ostatnio w ogóle tworzą własny silnik) to dużo gier opiera się na starych, zabugowanych, dziurawych skryptach typu Vallheru,Ugamela czy XNova.
Tgo i zaproszenia
Postanowiłem dzisiaj włączyć rejestracje do BETY TGO - w końcu jest już bardzo dużo zrobione
A więc - żeby się zarejestrować trzeba zdobyć od osoby już zarejestrowanej kod zaproszenia, który trzeba wpisać potem przy rejestracji.
A tak dla próby wygenerowałem 6 3 kodów, które oddaje w wasze (mam nadzieję dobre) ręce..
6061b15e703b219d8cc874dfac34e9f0 75fda2ffeca7675a5902c5487d97a165 9d2f97d4f1ffe1e35db49103dc76ce86
Zaznaczam, że dalej jest to beta i że stoi u mnie, na localu, także nie oczekujcie super-mega-hiper-ekstra prędkości
Chociaż, jak na razie z innych kompów dostęp jest w miare szybki, no, pożyjemy - zobaczymy
Kody są jednorazowego użytku
Reflinki
W wielu grach występują tzw. "reflinki" - ktoś kliknie na specjalny link to któryś gracz dostaje jakieśtam niewielkie bonusy typu 5$/ileśtam szacunku itp.
Przy czym warto ustawić aby dany gracz mógł otrzymać tylko raz na 24h profity od danej osoby.
To zabieramy się do roboty ![]()
Tworzymy sobie taką tabelę w bazie:
CREATE TABLE `ref` ( `kiedy` int(11) NOT NULL, `ip` varchar(15) NOT NULL, `user` varchar(20) NOT NULL )
Kiedy - to pole odpowiada za czas (time()) - czyli kiedy dana osoba weszła na ten link
Ip - IP delikwenta
User - nick/można oczywiście użyć id usera na którego konto wpłyneły profity
<?php //Po odpowiednim przefiltrowaniu pobieramy dane gracza z bazy if($istnieje==0){ echo('Taki gracz nie istnieje!'); $blad++; } if($_SESSION["logged"]==TRUE){ if($info[0]==$_SESSION["login"]){ echo('Nie mozesz atakowac samego siebie!'); $blad++; } } if($blad==0){ $p = time() - 86400; //Czasami w ten sposób można oszukać proxy, ale tylko czasami.. if ($_SERVER['HTTP_X_FORWARDED_FOR']) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];} else { $ip = $_SERVER['REMOTE_ADDR']; } //Sprawdzamy czy z takiego IP ktoś w ciągu ostatnich 24 godzin wchodził na reflinka tej osoby if($byl==0){ $now = time(); mysql_query("INSERT INTO ref VALUES ('$now','$_SERVER[REMOTE_ADDR]','$info[0]')"); //Wyświetlamy informacje do usera, mówiącą co właśnie się stało echo('{nick gracza} sprzatnął/eła Cię i w dodatku zgarnął/eła 50 dolarów!'); $kasa = $info[1] + 50; mysql_query("UPDATE players SET kasa=$kasa WHERE nick='$info[0]'"); }else{echo($info[0].' załatwił cie w ciagu ostatnich 24 godzin. Tym razem da Ci spokój'); } } ?>
Na szybko: Bezpieczeństwo sesji
Na szybko, bo jeszcze muszę coś dla TGO zrobić - inaczej czuje że albo Oliwier albo ktoś inny by mnie zadźgał ^^
A więc dzisiaj pomówimy o małym skrypcie który (przynajmniej trochę) zwiększy bezpieczeństwo od strony użyszkodników.
Zaczynajmy
if (!isset($_SESSION['start'])){ session_regenerate_id(); $_SESSION['start'] = true; $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; } if($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR']){ session_regenerate_id(); unset($_SESSION["logged"], $_SESSION["nick"]); }<br />
Kod już pewnie wiecie gdzie wkleić
A więc pora na małe objaśnienie - jeśli zmienna sesyjna "start" nie ma wartości true, to ustalamy nowe ID dla sesji i przydzielamy odpowiednie wartości.
Potem sprawdzamy czy IP zapisane w sesji zgadza się z tym z którego wchodzi user - jak nie, to ustalamy nowe ID sesji i wylogowywujemy delikwenta.
Zapobiegnie to tzw. "session hijacking" (zdzielcie mnie jeśli coś tutaj namieszałem).
Można dodać autowylogowywanie jeśli user nie był aktywny od powiedzmy 10 minut - to przynajmniej w pewnym stopniu powinno rozwiązać problem userów, którzy korzystając z kafejki nie wylogowywują się.
Oczywiście (a właściwie niestety) żadne skrypty nie zastąpią mózgu, także warto gdzieś na stronie umieścić mały tekst o bezpieczeństwie konta itp. - nawet jeśli szanse, że ktoś go przeczyta są znikome
Antyflood na chacie
Witam.
Dość ważą rzeczą jest zabezpieczenie swojego systemu chatu/shoutboxa jakimś skryptem, który by zapobiegał floodowaniu.
Można by zrobić tabelę w bazie z zapisywanym ostatnim czasem wpisu z danego konta i jeśli różnica obecnego czasu a tamtego jest mniejsza niż 30sekund blokować wysłanie wiadomości, jednak to niezbyt mi sie podoba.
Zdecydowałem się na sesje (co prawda gracz może się wylogować i zalogować ponownie, wtedy wszystkie dane sesyjne są niszczone, ale komu by się to chciało).
To do roboty
Podczas wysyłania wiadomości robimy tak:
if(time() - $_SESSION['last_msg']30){ echo 'Odczekaj 30 sekund przed wysłaniem wiadomości'; }else{ $_SESSION['last_msg'] = time(); //Tutaj reszta kodu odpowiedzialna za wysyłanie wiadomości }
Nie było to trudne.
Ja w TGO jeszcze zastosowałem sprawdzanie:
$last_user_msg = mysql_fetch_array(mysql_query("SELECT `tresc` FROM `tabela_z_chatem` WHERE `nick`='$zmienna_z_nickiem' ORDER BY `id` DESC LIMIT 0, 1")); if(trim($msg)==$last_user_msg[0]){ echo 'Nie spamuj.'; }
Google i autologowanie
Nie od dziś wiadomo, że im więcej stron bot googl'a zaindeksuje tym lepiej. Niestety, w wielu grach tzw. layout zewnętrzny jest dość skromny i obejmuję nie wiele ponad rejestracje i regulamin, rzadko ranking..
O ile z botem googla do reklam adsense nie ma problemu, bo można kazać mu się zalogować, to niestety z zwykłym spiderem zrobić tak nie możemy.
Podczas rozmowy ze znajomym programistą (z tego miejsca chciałbym serdecznie pozdrowić Kayen'a
) wpadłem na pomysł autologowania bota googl'a.
Można by zrobić listę IP tegoż bota, ale przeszukiwanie takiej tablicy nie jest zbytnio fajne..
Można też rozpoznawać bota po UA string, ale ten z kolei każdy user może sobie zmienić..
Ale za to host bota google jest zawsze w postaci crawl-IP.googlebot.com.
To bierzmy się do roboty ;P
if(substr(gethostbyaddr($_SERVER['REMOTE_ADDR']), -11)==".google.com"){ logujemy(); }
Kod umieszczamy najlepiej w jakimś pliku includowanym na początku, u mnie to core.php
Pierwsza linijka to ucięcie 11 znaków z hosta i sprawdzenie czy otrzymany string to ".google.com".
Potem zwyczajnie logujemy bota na jakieś stworzone do tego celu konto i voila
Ten sposób jakoś znacznie nie powinien obciążać serwera, a raczej jest to dobry sposób na sprawdzenie czy na stronie jest bot googl'a.
Można też analogicznie pobawić się z botami yahoo czy innych wyszukiwarek, ale to zostawiam wam
Edit:
Wersja poprawiona parę postów dalej.