Noova.pl blog Programmer is an organism that turns coffee into software.

17paź/092

How it’s made: Bank

Autor wiadomości matergames

Tak, trywialne, ale może i się przyda :P

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 :D

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ę :P
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 :P
To byłoby na tyle w dzisiejszym How It's made, zapraszam do następnego odcinka który ukarze się nie wiadomo kiedy :P
Jeśli gdzieś zrobiłem błąd to napiszcie w komentarzach :)

4paź/090

How it’s made: zapowiedź

Autor wiadomości matergames

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

23maj/091

Mini poradnik dla początkujących „twórców gier”

Autor wiadomości matergames

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
Zakres tematyczny: gry, php, programowanie, via www, web 1 Komentarz
23kwi/095

Problem polskiej sceny gier via www

Autor wiadomości matergames

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.

10kwi/090

Google i autologowanie – wersja poprawiona

Autor wiadomości matergames

Pamiętacie tamten wpis dotyczący autologowania bota googl'a?
Otóż okazało się, że to nie działa.
Chwilkę poszukałem, ponaprawiałem, poczekałem cierpliwie aż bot zaindeksuje ponownie stronę i już wiem czemu :)
Otóż host bota nie kończy się na google.com a na googlebot.com.
Czyli teraz cały kod to:

<?php
if(substr(gethostbyaddr($_SERVER['REMOTE_ADDR']), -13)=="googlebot.com"){
$_SESSION['nick']=="GoogleCrawler";  
//Czy jak tam logujecie sobie GoogleBota :P
}?>

I teraz (teoretycznie) działać :P
Ja już pozmieniałem w TGO i dam znać jak tylko google znowu utworzy kopię strony ;-)

4kwi/092

Tgo i zaproszenia

Autor wiadomości matergames

Postanowiłem dzisiaj włączyć rejestracje do BETY TGO - w końcu jest już bardzo dużo zrobione :P
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 :P Chociaż, jak na razie z innych kompów dostęp jest w miare szybki, no, pożyjemy - zobaczymy :)
Kody są jednorazowego użytku

17mar/090

Reflinki

Autor wiadomości matergames

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');
}
}
?>
Zakres tematyczny: gry, php, programowanie, via www, web Brak komentarzy
12mar/090

Na szybko: Bezpieczeństwo sesji

Autor wiadomości matergames

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

8mar/092

Antyflood na chacie

Autor wiadomości matergames

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.';
}
Zakres tematyczny: php, programowanie, via www, web 2 Komentarze
3mar/090

Google i autologowanie

Autor wiadomości matergames

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 :P ) 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 :P

Edit:
Wersja poprawiona parę postów dalej.

Zakres tematyczny: gry, php, programowanie, via www, web Brak komentarzy