<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kiro</title>
	<atom:link href="http://karkucik.pl/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://karkucik.pl</link>
	<description>karkucik.pl</description>
	<lastBuildDate>Thu, 15 Jul 2010 13:02:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Kurs Lua cz. III &#8211; operatory</title>
		<link>http://karkucik.pl/?p=222</link>
		<comments>http://karkucik.pl/?p=222#comments</comments>
		<pubDate>Thu, 15 Jul 2010 12:45:15 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[Kurs Lua]]></category>
		<category><![CDATA[Lua]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=222</guid>
		<description><![CDATA[Dodawanie, odejmowanie, dzielenie, mnożenie. To tylko kilka z wielu podstawowych operacji na zmiennych w programowaniu. Dzisiaj poznamy operatory arytmetyczne, relacji i logiczne. 1. Operatory arytmetyczne Operatory arytmetyczne służą krótko mówiąc do wykonywania działań znanych nam z matematyki, takich jak dodawanie, odejmowanie czy potęgowanie. Wyróżniamy: Podstawowe 4 operatory: &#8222;+&#8221;, &#8222;-&#8221;, &#8222;*&#8221;, &#8222;/&#8221;, służące do dodawania, odejmowania, [...]]]></description>
			<content:encoded><![CDATA[<p>Dodawanie, odejmowanie, dzielenie, mnożenie. To tylko kilka z wielu podstawowych operacji na zmiennych w programowaniu. Dzisiaj poznamy operatory arytmetyczne, relacji i logiczne.<span id="more-222"></span></p>
<p><strong>1. Operatory arytmetyczne</strong></p>
<p>Operatory arytmetyczne służą krótko mówiąc do wykonywania działań znanych nam z matematyki, takich jak dodawanie, odejmowanie czy potęgowanie. Wyróżniamy:</p>
<ul>
<li>Podstawowe 4 operatory: &#8222;+&#8221;, &#8222;-&#8221;, &#8222;*&#8221;, &#8222;/&#8221;, służące do dodawania, odejmowania, mnożenia i dzielenia oczywiście</li>
<li>Operator dzielenia modulo: &#8222;%&#8221;, służy do uzyskania reszty z dzielenia. Początkującym może się to wydać dziwne, ale uwierzcie mi na słowo, bardzo się przydaje :)</li>
<li>Tzw. unarny operator znaku liczby: &#8222;-&#8221;, zwróci nam liczbę przeciwną do argumentu</li>
<li>Operator potęgowania: &#8222;^&#8221;</li>
</ul>
<p>Mały przykład użycia:</p>
<pre class="brush:lua">a = 5
b = 6
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a%b)
print(-a)
print(a^b)</pre>
<p>Oczywiście możemy to sobie bez problemu przypisać do zmiennej.</p>
<p><strong>2. Operatory relacji</strong></p>
<p>Operatory relacji służą do porównywania zmiennych (czyli określania jakie zachodzą między nimi relacje). To także nic trudnego, każdy zna to z matematyki. Operatory relacji zwracają nam wartość logiczną, <strong><span style="color: #0000ff;">true </span></strong>jeśli relacja zachodzi, <strong><span style="color: #0000ff;">false </span></strong>jeśli nie.</p>
<ul>
<li> &#8222;&lt;&#8221;, &#8222;&lt;=&#8221;, &#8222;&gt;&#8221;, &#8222;&gt;=&#8221; &#8211; mniejszy, mniejszy lub równy, większy, większy lub równy</li>
<li>&#8222;==&#8221; &#8211; równy (<strong><span style="color: #0000ff;">true </span></strong>jeśli obie zmienne są identyczne)</li>
<li>&#8222;~=&#8221; &#8211; różny (<strong><span style="color: #0000ff;">true </span></strong>jeśli obie zmienne są <strong>różne</strong>)</li>
</ul>
<pre class="brush:lua">a = 5
b = 6
print(a&gt;b)
print(a=b)
print(a==b)
print(a~=b)
print("ala"&lt;"ola")</pre>
<p>Jak widać można porównywać też stringi, tu brana pod uwagę jest kolejność alfabetyczna (i niestety wielkość liter).</p>
<p><strong>3. Operatory logiczne</strong></p>
<p>Tym razem może być trochę trudniej, nie każdy miał już logikę w szkole, ale wydaje mi się że każdy da rade. Operatory logiczne służą do wykonywania działań na zmiennych logicznych (<em>boolean</em>), są bardzo istotne i trzeba je dogłębnie zrozumieć.</p>
<ul>
<li><strong><span style="color: #0000ff;">and </span></strong>- koniunkcja logiczna. And zwróci nam true tylko i tylko wtedy kiedy oba argumenty będą prawdziwe.</li>
<li><strong><span style="color: #0000ff;">or </span></strong>- alternatywa logiczna. Or zwróci nam true tylko i tylko wtedy kiedy <span style="text-decoration: underline;">co najmniej</span> jeden argument będzie prawdziwy</li>
<li><strong><span style="color: #0000ff;">not </span></strong>- negacja logiczna. Zwróci nam argument przeciwny (<span style="color: #0000ff;"><strong>true </strong></span>dla <strong><span style="color: #0000ff;">false </span></strong>i <strong><span style="color: #0000ff;">false </span></strong>dla <strong><span style="color: #0000ff;">true</span></strong>).</li>
</ul>
<p>Opisany przykład:</p>
<pre class="brush:lua">print("and:")
print(true and true) --oba argumenty prawdziwe
print(true and false) -- jeden argument fałszywy
print(false and true) -- jeden argument fałszywy
print(false and false) -- oba argumenty fałszywe
print("or:")
print(true or true) --oba argumenty prawdziwe
print(true or false) -- jeden argument fałszywy
print(false or true) -- jeden argument fałszywy
print(false or false) -- oba argumenty fałszywe
print("not:")
print(not true) -- nie prawda
print(not false) -- nie fałsz
print("Inne przyklady:")
print(true and (false or true))
print(false or (not true))
print(not (true and true))
print(((true or false) and not(true and false)) or false)</pre>
<p>Wiemy więc jak działają podstawowe operatory logiczne, jest to bardzo ważne i należy to zapamiętać.</p>
<p><span style="color: #0000ff;"><strong>and </strong></span>i <strong><span style="color: #0000ff;">or </span></strong>mają jeszcze jedną, dość specyficzną funkcję która przyda się w pewnej konstrukcji omawianej w następnym rozdziale. Mianowicie, jeśli użyjemy ich dla nie-logicznych zmiennych to:</p>
<ul>
<li><strong><span style="color: #0000ff;"> and </span></strong>- jeśli jeden z argumentów jest fałszywy (lub <strong><span style="color: #0000ff;">nil</span></strong>) to and zwróci <strong><span style="color: #0000ff;">false </span></strong>(lub <strong><span style="color: #0000ff;">nil</span></strong>), jeśli oba są fałszywe/<strong><span style="color: #0000ff;">nil </span></strong>lub prawdziwe/nie-<strong><span style="color: #0000ff;">nil</span></strong>, zostanie zwrócony drugu argument</li>
<li><strong><span style="color: #0000ff;">or </span></strong>- jeśli jeden z argumentów jest prawdziwy (<strong><span style="color: #0000ff;">true </span></strong>lub nie-<strong><span style="color: #0000ff;">nil</span></strong>) to or zwróci prawdziwy argument, jeśli oba są, zwróci pierwszy argument, jeśli wszystkie są fałszywe (lub <strong><span style="color: #0000ff;">nil</span></strong>) zwróci ostatni argument.</li>
</ul>
<p>Trochę to zagmatwane ale przykład powinien wszystko rozjaśnić:</p>
<pre class="brush:lua">print("and")
print(false and 4)
print(5 and nil)
print(4 and 5)
print(nil or false)
print("or")
print(false or 4)
print(3 or nil)
print(3 or 5)
print(nil or false)</pre>
<p>Polecam posiedzieć i przeanalizować to dobrze gdyż wielu moich znajomych widząc takie konstrukcje patrzy tylko w skrypt i mówi &#8222;WTF?&#8221; ;)</p>
<p><strong>4. Inne operatory</strong></p>
<p>Przedostatni operator który poznaliśmy już na poprzedniej lekcji, ale który dla zasady przedstawię to operator łączenia łańcuchów znaków. Dwa łańcuchy (nie koniecznie łańcuchy, jako że typ zmiennych ma małe znaczenie, możemy łączyć wszystko co da się przedstawić jako tekst) łączymy za pomocą dwóch kropek: &#8222;..&#8221;. Oczywiście przykład:</p>
<pre class="brush:lua">print("Ala".." ".."ma".." kota")
print("Ala ma ".. 5 .." kotow")
ile = 3
print("Policze do "..ile..".")
print(1 .. 2)
a = "Ola"
b = "Ali"
str = a.." nie lubi "..b
print(str)</pre>
<p>Ostatni natomiast operator (i trzeci już unarny) to operator długości: &#8222;#&#8221;. Możemy go użyć by sprawdzić długość stringa lub rozmiar tablicy (o tablicach będzie wkrótce). Użycie jest bardzo proste, wystarczy dopisać # przed łańcuch znaków lub zmienną go zawierającą, np: print(#&#8221;ala ma kota&#8221;)</p>
<p><strong>5. Wyjaśnienia</strong></p>
<p>W tekście posługiwałem się takimi pojęciami jak argument czy &#8222;zwróci&#8221;. Argument to w tym wypadku zmienna/wartość po prawej lub lewej stronie operatora (po prawej dla operatorów unarnych działających dla jednego argumentu takich jak <span style="color: #0000ff;"><strong>not</strong></span>, &#8222;#&#8221; czy &#8222;-&#8221;). Mówiąc że działanie nam coś zwróci, miałem na myśli oczywiście wynik. Pisząc &#8222;5 + 3&#8243; możemy przyjąć że ta instrukcja zwróci nam wynik tego działania, czyli 8.</p>
<div id="_mcePaste"><strong>6. Priorytety operatorów</strong></div>
<div>Z matematyki wiemy że pewne działania wykonujemy przed innymi, np. mnożenie przed dodawaniem. W Lua (jak w większości języków) działania nie są wykonywane od lewej do prawej, tylko w odpowiedniej kolejności zgodnej z priorytetem operatorów. Dzięki temu możemy mieć pewność że 2+2*2 wypisze nam 6.</div>
<div>Lista operatorów wg priorytetów, od najwyższego:</div>
<blockquote>
<div>
<div>^</div>
<div>not, #, &#8211; (unarny)</div>
<div>*, /, %</div>
<div>+, -</div>
<div>..</div>
<div>&lt;, &gt;, &lt;=, &gt;=, ~=, ==</div>
<div>and</div>
<div>or</div>
</div>
</blockquote>
<div>
<div><strong>7. Podsumowanie</strong></div>
<div>Dzisiaj nauczyliśmy się:</div>
<div>
<ul>
<li>Jakie mamy operatory arytmetyczne</li>
<li>Jakie mamy operatory relacji</li>
<li>Jakie mamy operatory logiczne</li>
<li>Jak łączyć stringi i sprawdzić ich długość</li>
<li>Jakie są priorytety operatorów</li>
</ul>
</div>
<div><strong>8. Ćwiczenia</strong></div>
<div>Dzisiaj pierwszy raz dam ćwiczenia które powinny być opanowane do perfekcji przed przejściem do kolejnej lekcji. Wiadomo że każdy by chciał się szybko nauczyć Lua, jednak bez pracy nie ma kołaczy ;)</div>
</div>
<div><em>a) Bez uruchamiania skryptu spróbuj przewidzieć co zostanie wypisane:</em></div>
<pre class="brush:lua">print(((5+5)*3)%3)
print(5^2+-2)
print(10%2 &lt; 2%10)
print(5*5 ~= 5^2)

print(false or (not true))
print(not(false or false))
print((true or false) and (false and (true and true)) or (not false or true))

x = 20%11
str = [[Ala
ma ]]..x.." kotow"
print((#str%3 == 0) and (#str%5 == 0))</pre>
<p><em>b) Korzystając z informacji z poprzedniej i dzisiejszej lekcji napisz kalkulator który pobierze od użytkownika 2 liczby i wypisze wszystkie działania na nich.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=222</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kurs Lua cz. II &#8211; zmienne</title>
		<link>http://karkucik.pl/?p=204</link>
		<comments>http://karkucik.pl/?p=204#comments</comments>
		<pubDate>Tue, 29 Jun 2010 16:43:14 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[Kurs Lua]]></category>
		<category><![CDATA[Lua]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=204</guid>
		<description><![CDATA[W naszych skryptach nie raz, nie dwa razy będziemy mieli potrzebę przechowania jakichś wartości, czy to liczb czy napisów, i korzystania z nich w różnych miejscach. Do tego właśnie posłużą nam zmienne. Zmienna to miejsce w pamięci w którym jest przechowywana jej wartość i do której można się odnieść przez jej identyfikator (nazwę). Lua jest językiem [...]]]></description>
			<content:encoded><![CDATA[<p>W naszych skryptach nie raz, nie dwa razy będziemy mieli potrzebę przechowania jakichś wartości, czy to liczb czy napisów, i korzystania z nich w różnych miejscach. Do tego właśnie posłużą nam zmienne. <span id="more-204"></span>Zmienna to miejsce w pamięci w którym jest przechowywana jej wartość i do której można się odnieść przez jej identyfikator (nazwę). Lua jest językiem z dynamicznym typowaniem, oznacza to że nie przypisuje na sztywno typu zmiennej. W praktyce oznacza to że możemy przykładowo potraktować zmienną liczbową jako tekst, i na odwrót (o ile jest to możliwe).</p>
<p><strong>1. Typy danych</strong></p>
<p>Mimo że Lua w większości przypadków średnio przywiązuje wagę do typu zmiennej to jednak trzeba je znać.<br />
Rozróżniamy 8 podstawowych typów danych:</p>
<ul>
<li> <em>nil</em> &#8211; typ posiadający tylko jedną wartość, <strong><span style="color: #0000ff;">nil</span></strong>. Oznacza tylko tyle że dana zmienna jest pusta, lub, jak kto woli, nie istnieje.</li>
<li><em>boolean </em>- typ logiczny, reprezentują go 2 wartości <strong><span style="color: #0000ff;">true </span></strong>(prawda) i <strong><span style="color: #0000ff;">false </span></strong>(fałsz).</li>
<li>number &#8211; jak sama nazwa wskazuje, typ liczbowy, zarówno dla liczb całkowitych jak i rzeczywistych. Liczby możemy podawać w różnych postaciach, dziesiętnej (<span style="color: #ff6600;">12431</span>, <span style="color: #ff6600;">3.12</span>), szesnastkowej (<span style="color: #ff6600;">0&#215;4134</span>), wykładniczej (<span style="color: #ff6600;">3.32e-2</span>, <span style="color: #ff6600;">2.2e10</span>, <span style="color: #ff6600;">10e+15</span>)</li>
<li><em>string </em>- a inaczej łańcuch znaków. String możemy zapisać na 3 sposoby:
<ol>
<li><span style="color: #ff0000;">&#8222;w cudzysłowu&#8221;</span></li>
<li><span style="color: #ff0000;">&#8216;w apostrofach&#8217;</span></li>
<li><span style="color: #ff0000;">[[i wielolinkjkowe stringi<br />
pomiędzy nawiasami kwadratowymi]] </span></li>
</ol>
</li>
<li><em>table </em>- tablice, pozwalają przechowywać wiele wartości pod jedną nazwą. Więcej o nich będzie w kolejnych częściach.</li>
<li><em>function </em>- funkcje, o nich też będzie później</li>
<li><em>userdata, thread </em>- kolejne typy które na razie nas nie interesują :)</li>
</ul>
<p><strong>2. Funkcja <span style="color: #0000ff;"><em>type()</em></span></strong></p>
<p><span style="color: #0000ff;"><em>type()</em></span> jest standardową funkcją pozwalającą sprawdzić typ zmiennej/wartości. Myślę że najlepiej zilustruje to przykład:</p>
<pre class="brush:lua">print(type(1))
print(type("Lancuch znakow"))
print(type(true))
print(type(nil))
print(type(type)) --funkcja to też typ!</pre>
<p>Polecam samodzielnie uruchomić i sprawdzić wynik.</p>
<p><strong>3. Użycie zmiennych</strong></p>
<p>No tak, już trzeci punkt a my jeszcze nie wiemy jak wygląda zmienna i jak jej używać. Więc do rzeczy: jedyne co musimy zrobić to zainicjalizować zmienną, a nie znaczy to nic innego jak przypisać do niej jakąś wartość używając znaku równości (=).<br />
Potem możemy ją np. wypisać. Kolejny raz zademonstruję to na przykładzie który polecam uruchomić:</p>
<pre class="brush:lua">a = 5 --przypisujemy do zmienej a wartość 5
b = "Jakis tekst" --przypisujemy do zmiennej b łańcuch "Jakis tekst"

print(a) --wypisujemy wartość zmiennej a
a = 10
print(a) --wypisujemy wartość zmiennej a

print(b) --wypisujemy wartość zmiennej b
print(c) --a co to?

print(type(a)) --wypisujemy TYP wartości zmiennej a
print(type(b)) --wypisujemy TYP wartości zmiennej b</pre>
<p>Wydaje mi się że nie trzeba tego tłumaczyć, wszystko sprowadza się do przypisania wartości do identyfikatora (nazwy) zmiennej. Jednak wkradła się pewna niejasność. Mianowicie, o co chodzi w print(c)? Przecież nie przypisaliśmy do żadnej wartości więc jak możemy ją wypisać? A no możemy, niezainicjalizowana zmienna nie ma wartości, a brak wartości, jak wiemy z poprzedniego akapitu oznaczany jest przez <strong><span style="color: #0000ff;">nil</span></strong>, i to właśnie zostanie mam wypisane.</p>
<p><strong>4. Interakcja z użytkownikiem</strong></p>
<p>No właśnie, a może by tak uczynić skrypt atrakcyjniejszym, pobrać dane od użytkownika i coś z nimi zrobić?;)<br />
Do wczytywania ze standardowego wejścia służy funkcja <em><span style="color: #0000ff;">io.read()</span></em>. Zwraca ona to, co napisze użytkownik. Oczywiście, wyjaśnienie na przykładzie do uruchomienia:</p>
<pre class="brush:lua">print("Jak sie nazywasz?")
imie = io.read() --przypisanie do zmiennej imie tekstu pobranego ze std. wejścia
print("Witaj "..imie.."!") --wypisanie imienia</pre>
<p>Co się dzieje? Pierwszej linii oczywiście nie trzeba tłumaczyć, gorzej z kolejnymi. W drugiej lini do zmiennej imie przypisujemy wartość którą zwróci nam funkcja io.read() (o funkcjach i wartościach- przezeń zwracanych będzie w kolejnych lekcjach). Funkcja ta zatrzymuje działanie skryptu do czasu gdy użytkownik nie wpisze tekstu (zakończonego znakiem nowej linii).  Trzecia linia wygląda znajomo&#8230; no prawie. Pojawiło się w niej coś nowego, mianowicie operator łączenia stringów: nic skomplikowanego, łączymy dwa stringi za pomocą &#8222;..&#8221;.</p>
<p><strong>5. Podsumowanie</strong></p>
<p>Po dzisiejszej lekcji wiemy już nieco więcej:</p>
<ul>
<li>Znamy podstawowe typy danych w Lua</li>
<li>Umiemy używać zmiennych (przypisywać wartości, wypisywać, sprawdzać typ)</li>
<li>Umiemy pobrać dane od użytkownika</li>
</ul>
<p>Polecam pobawić się tym żeby dokładnie przyswoić sobie informacje. Będą nam one potrzebne podczas przerabiania kolejnych części kursu.</p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=204</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kurs Lua cz. I &#8211; wprowadzenie</title>
		<link>http://karkucik.pl/?p=169</link>
		<comments>http://karkucik.pl/?p=169#comments</comments>
		<pubDate>Tue, 29 Jun 2010 11:58:55 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[Kurs Lua]]></category>
		<category><![CDATA[Lua]]></category>
		<category><![CDATA[Lua Programowanie Kurs]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=169</guid>
		<description><![CDATA[Lua &#8211; lekki język skryptowy który ostatnio zdobywa coraz większe zainteresowanie, głównie w gamedevie, używany w wielu grach,  serwerach gier czy programach. Wyróżnia się bardzo prostą składnią, podobną trochę do pascala i dosyć dużymi możliwościami. 1. Wstęp Więcej o Lua można się dowiedzieć na wikipedii, wydaje mi się, że jeśli ktoś tu trafił to nie trzeba mu [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="http://www.andreas-rozek.de/Lua/Lua-Logo_128x128.png" alt="Lua" width="128" height="128" /></p>
<blockquote><p>Lua &#8211; lekki język skryptowy który ostatnio zdobywa coraz większe zainteresowanie, głównie w gamedevie, używany w wielu grach,  serwerach <a href="http://en.wikipedia.org/wiki/Category:Lua-scripted_video_games" target="_blank">gier</a> czy <a href="http://en.wikipedia.org/wiki/Lua_(programming_language)#Applications" target="_blank">programach</a>. Wyróżnia się bardzo prostą składnią, podobną trochę do pascala i dosyć dużymi możliwościami.</p></blockquote>
<p><span id="more-169"></span></p>
<p><strong>1. Wstęp</strong></p>
<p>Więcej o Lua można się dowiedzieć na wikipedii, wydaje mi się, że jeśli ktoś tu trafił to nie trzeba mu przedstawiać tego języka. Przykładowy kod wygląda tak:</p>
<pre class="brush:lua">function silnia(n)
	if n &lt;= 1 then
		return 1
	else
		return n*silnia(n-1)
	end
end

for i=1,10 do
	print("Silnia z "..i..": "..silnia(i))
end</pre>
<p>Na wyjściu otrzymamy obliczoną silnię z liczb &lt;1,10&gt;:</p>
<blockquote>
<div id="_mcePaste">D:\&gt;lua silnia.lua</div>
<div id="_mcePaste">Silnia z 1: 1</div>
<div id="_mcePaste">Silnia z 2: 2</div>
<div id="_mcePaste">Silnia z 3: 6</div>
<div id="_mcePaste">Silnia z 4: 24</div>
<div id="_mcePaste">Silnia z 5: 120</div>
<div id="_mcePaste">Silnia z 6: 720</div>
<div id="_mcePaste">Silnia z 7: 5040</div>
<div id="_mcePaste">Silnia z 8: 40320</div>
<div id="_mcePaste">Silnia z 9: 362880</div>
<div id="_mcePaste">Silnia z 10: 3628800</div>
</blockquote>
<p>Ten kurs skierowany jest głównie do początkujących (i tych który po prostu wolą poczytać po polsku ;)), będę starał się wszystko dogłębnie i od podstaw tłumaczyć, tak aby nawet osoby które nie miały nigdy styczności z programowaniem załapały o co chodzi. Zaczynając na zmiennych, przez metatablice, a na Coroutines (nie mam zielonego pojęcia jak to się tłumaczy) kończąc.</p>
<p><strong>2. Wyposażenie</strong></p>
<p>Co nam będzie potrzebne do rozpoczęcia przygody z Lua? Na pewno interpreter Lua który posłuży nam do wykonania napisanego przez nas skryptu (Kompletny instalator dla Windows można ściągnąć <a href="http://code.google.com/p/luaforwindows/downloads/list" target="_blank">tutaj</a>, jeśli chodzi o Linuksa to każda dystrybucja ma Lua w repozytoriach). Przyda nam się także jakiś edytor tekstu który pokoloruje nam skrypt. Potrzebujący mogą porozglądać się za jakimś IDE  dla Lua (jest kilka bazujących na eclipse), mi osobiście wystarczy Notepad++. I to wszystko. Dodatkowo przydała by się podstawowa wiedza nt. poruszania się po katalogach w wierszy poleceń, jednak ufam że to nie jest nikomu obce :)</p>
<p><strong>3. Pierwszy program</strong></p>
<p>Wiele kursów języków skryptowych opiera się na &#8222;konsoli języka&#8221;, tzn. wpisujemy skrypt w konsoli a on jest na bieżąco wykonywany. Osobiście nie lubię tego podejścia więc wszystkie skrypty polecam pisać w pliku (jeśli jednak ktoś chce pisać w konsoli to wystarczy że w wierszu poleceń wpisze &#8222;lua&#8221;).</p>
<p>Pierwszym naszym programem będzie oczywiście klasyczny <em>Hello World.</em></p>
<pre class="brush:lua">--skrypt.lua
print("Hello World")</pre>
<p>Zapisujemy plik i odpalamy wpisując w wierszu poleceń <strong>lua <em>skrypt.lua. </em><span style="font-weight: normal;">Naszym oczom ukaże się piękny napis Hello World.<br />
Ok, przejdźmy dalej. Wiele tutaj do analizy nie ma, myślę że nie trzeba nikomu tłumaczyć co się dzieje. Funkcją print wypisujemy  podany w nawiasie tekst (jak się później okaże nie musi być to tekst), pierwsza linia jest ignorowana gdyż jest komentarzem. W lua mamy 2 typy komentarzy:</span></strong></p>
<pre class="brush:lua">-- jednoliniowy, kończy końcem linii

--[[wieloliniowy,
Którego mój blog, na chwilę obecną... nie koloruje jak trzeba
]]</pre>
<p>Komentarze są bardzo przydatne gdyż pomagają zorientować się w dużych, często skomplikowanych skryptach.</p>
<p><strong>4. Podsumowanie</strong></p>
<p>Jako że był to tylko wstęp, wiele się nie nauczyliśmy, zaopatrzyliśmy się jedynie w niezbędne narzędzia i uruchomiliśmy nasz pierwszy skrypt poznając przy tym funkcję print i komentarze. W następnej części zapoznamy się ze zmiennymi w lua.</p>
<p><em>Ps. To mój pierwszy większy kurs więc z góry przepraszam za styl i drobne pomyłki, które zapewne się zdarzą.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=169</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kiro&#8217;s Map Generator v0.2</title>
		<link>http://karkucik.pl/?p=118</link>
		<comments>http://karkucik.pl/?p=118#comments</comments>
		<pubDate>Tue, 02 Feb 2010 23:54:16 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Inne]]></category>
		<category><![CDATA[Kiro's Map Generator]]></category>
		<category><![CDATA[Open Tibia]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Generator]]></category>
		<category><![CDATA[Generowanie]]></category>
		<category><![CDATA[Kiro]]></category>
		<category><![CDATA[Kiro's]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[OTS]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Slot]]></category>
		<category><![CDATA[Sloty]]></category>
		<category><![CDATA[Sygnały]]></category>
		<category><![CDATA[Teren]]></category>
		<category><![CDATA[Wątki]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=118</guid>
		<description><![CDATA[Czyli moje zmagania z Qt i generowaniem terenu. Czym w ogóle jest KMG? Z nazwy można wywnioskować że generuje mapy, jednak po co? Do czego? Więc do rzeczy: KMG jest moim generatorem map do OTS napisanym w Qt, do prostego generowania terenu. Póki co pozwala stworzyć teren za pomocą 2 metod: 1. Tworzenie terenu na [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-119" title="Mars-128" src="http://karkucik.pl/wp-content/uploads/2010/02/Mars-128.png" alt="" width="128" height="128" />Czyli moje zmagania z Qt i generowaniem terenu. Czym w ogóle jest KMG? Z nazwy można wywnioskować że generuje mapy, jednak po co? Do czego? Więc do rzeczy:</p>
<p>KMG jest moim generatorem map do OTS napisanym w <a href="http://pl.wikipedia.org/wiki/Qt">Qt</a>, do prostego generowania terenu. Póki co pozwala stworzyć teren za pomocą 2 metod:</p>
<p><span id="more-118"></span></p>
<p><strong>1. Tworzenie terenu na podstawie bitmapy<br />
<span style="font-weight: normal;">Już nazwa sugeruje o co chodzi &#8211; wrzucamy obrazek, otrzymujemy gotowy teren. Jak? Bardzo prosto: mapa ma taki sam rozmiar jak obrazek (pixele -&gt; kratki), czy w danym miejscu ma być teren czy nie, decyduje prosty warunek <img src='http://s.wordpress.com/latex.php?latex=%5Cfrac%7BR%2BG%2BB%7D%7B3%7D%20%3C%20T&#038;bg=T&#038;fg=000000&#038;s=0' alt='\frac{R+G+B}{3} &lt; T' title='\frac{R+G+B}{3} &lt; T' class='latex' /> gdzie <img src='http://s.wordpress.com/latex.php?latex=T&#038;bg=T&#038;fg=000000&#038;s=0' alt='T' title='T' class='latex' /> to zmienna możliwa do zdefiniowania przez użytkownika a <img src='http://s.wordpress.com/latex.php?latex=R%20G%20B%20&#038;bg=T&#038;fg=000000&#038;s=0' alt='R G B ' title='R G B ' class='latex' /> to oczywiście składowe koloru. W uproszczeniu można powiedzieć że zamieniamy obrazek na czarno-biały i sprawdzamy czy jasność jest mniejsza od ustawionej granicy, jeśli tak to w tym miejscu będzie kratka z terenem, jeśli nie &#8211; nie będzie nic. Prawda że proste? I mamy np. coś takiego:</span></strong></p>
<p style="text-align: center;"><strong><span style="font-weight: normal;"><a href="http://karkucik.pl/wp-content/uploads/2010/02/9p9ah7msmczo9rnmmxj8.jpg"><img class="size-medium wp-image-133  aligncenter" title="RL Mapa?" src="http://karkucik.pl/wp-content/uploads/2010/02/9p9ah7msmczo9rnmmxj8-300x191.jpg" alt="" width="300" height="191" /></a><br />
</span></strong></p>
<p><strong>2. Generowanie terenu<br />
<span style="font-weight: normal;">Tutaj sprawa jest trochę bardziej złożona. Bo jak nie mając nic zrobić fajną, kanciastą wyspę? W poprzedniej wersji KMG robiłem to bazując na punktach wyznaczonych przez użytkownika, no ale to było `a fe`, ma być przecież automatyczne. No dobra, ale jak to zrobić? Na googlu nie znalazłem nic ciekawego więc pozostało mi opracować sposób samemu. Zrobiłem tak:<br />
</span></strong></p>
<ol>
<li> Dzielę powierzchnie mapy (o rozmiarach podanych przez użytkownika) na kratki (ilość także podana przez użytkownika)</li>
<li>W każdej kratce <span style="text-decoration: underline;">sąsiadującej z krawędzią</span> znajduje punkt o losowych współrzędnych i dodaję go do wektora, dajmy na to <em>punkty</em></li>
<li>Mam już <img src='http://s.wordpress.com/latex.php?latex=n&#038;bg=T&#038;fg=000000&#038;s=0' alt='n' title='n' class='latex' /> punktów (przy standardowych ustawieniach 12) które tworzą bazową obwódkę mojego terenu</li>
<li>Między każdą parą punktów dodaję jeszcze jeden czyli między <em>punkty[0]  i</em> <em>punkty[1], punkty[1] i punkty[2] &#8230; punkty[n-2] i punkty[n -1] </em>i na końcu między <em>punkty[n] i punkty[0]</em> w następujący sposób:<br />
- Znajduję środkowy punkt na odcinku <em>punkty[n-2],punkty[n-1]<br />
<span style="font-style: normal;"> &#8211; Przesuwam ten punkt prostopadle do odcinka o losową wartość z zakresu <img src='http://s.wordpress.com/latex.php?latex=%28-Z%2CZ%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='(-Z,Z)' title='(-Z,Z)' class='latex' /> gdzie <img src='http://s.wordpress.com/latex.php?latex=Z&#038;bg=T&#038;fg=000000&#038;s=0' alt='Z' title='Z' class='latex' /></span> </em>jest wartością zdefiniowaną przez użytkownika. Mam już punkt i dodaję go do wektora na odpowiedniej pozycji</li>
<li>Powtarzam punkt 4 zdefiniowaną przez użytkownika ilość razy</li>
<li>Łączę punkty liniami jednocześnie nanosząc je na mapę jako podłoże</li>
<li>Wypełniam mapę</li>
</ol>
<p>Chyba łatwe do pojęcia. Niestety działa dość chaotycznie, czasami generując tak fikuśne wynalazki że aż chce się wyłączyć program. Mówię o &#8222;krzyżowaniu się&#8221; punktów, powstaje wtedy tzw. nieestetyczna ósemka w której na dodatek wypełnianie nie działa. Póki co nie mam pojęcia co z tym fantem zrobić.</p>
<p><strong>Generowanie wody i wypełnianie<br />
<span style="font-weight: normal;">Najwolniejsza część. Wodę generuję najprostszym możliwym algorytmem (nic innego nie przychodzi mi do głowy a nie skupiałem się na tym) &#8211; po prostu iteruję po każdej klatce, jeśli jest pusta to sprawdzam czy w zasięgu &#8222;widzialności&#8221; jest jakaś nie pusta kratka. Jeśli jest wstawiam wodę, jeśli nie to lecimy do następnej. Proste, wolne ale działa ;d</span><br />
<span style="font-weight: normal;">Gorzej z wypełnianiem. Korzystam z rekurencyjnego <a href="http://pl.wikipedia.org/wiki/Rozrost_ziarna">algorytmu</a> zerżniętego z Wikipedii który potrafi się wysypać gdyż nie miałem czasu na szukanie i implementację niczego lepszego. Będę musiał nad tym posiedzieć. Jeśli ktoś ma jakieś pomysły odnośnie wypełniania czy generowania wody to chętnie skorzystam, zaoszczędzi mi to czasu.</span></strong></p>
<p><strong>Qt, wątki i&#8230;<br />
<span style="font-weight: normal;">&#8230;system slotów i sygnałów. Cały program pisałem w <a href="http://pl.wikipedia.org/wiki/Qt">Qt</a> którego jestem fanatykiem. Na początku bez użycia wątków, jednak podczas generowania (które czasem trwało kilka minut) program po prostu się wieszał. Postanowiłem wyrzucić właśnie generowanie do oddzielnego wątku. Przydało by się także jakoś zablokować program żeby użytkownik nie klikał sobie &#8222;generuj&#8221;, nie bawił się starą mapą, nie próbował zapisać, a przede wszystkim żeby było wiadomo że coś się dzieje. No nic, logiczne było wyświetlenie jakiegoś dialogu z progressbarem więc tak zrobiłem. Qt przychodzi nam tutaj z pomocą gdyż mamy gotową klasę QProgressDialog. Nic prostszego, tworze sobie dialog, nowy wątek, do funkcji generującej przekazuję wskaźnik na dialog aby mogła zmieniać postęp i dzia&#8230; nie działa. Dostaję piękny komunikat: &#8222;<em>Cannot send events to objects owned by a different thread&#8221;. </em>Okazuje się że QProcessDialog nie jest Thread-Safe i nie można wysyłać eventów (a setValue najwyraźniej nim jest) z wątków innych niż ten w którym obiekt został utworzony. No nic, idąc logiczną drogą próbuję stworzyć dialog już w wątku w którym generuję mapę. Gdzie tam, dowiaduje się że musi być stworzony w tym samym wątku co reszta GUI. No to Google w ruch i znajduję inne rozwiązanie tego problemu &#8211; Qtowski mechanizm slotów i sygnałów. W uproszczeniu mamy sloty (które poniekąd są funkcjami) i sygnały, które możemy łączyć. Gdy jakiś obiekt wyśle sygnał to odpala się każdy połączony do niego slot.<br />
W klasie w której generuję mapę (dziedziczącej po QThread) tworzę nowe potrzebne sygnały:<br />
</span></strong></p>
<pre class="brush:c++">signals:
    void valueChanged(int value);
    void resetProgress();
    void setLabelText(const QString &amp;text);</pre>
<p>Potem w głównej klasie łączę wszystko:</p>
<pre class="brush:c++">connect(generator,SIGNAL(valueChanged(int)),progressDialog,SLOT(setValue(int)));
connect(generator,SIGNAL(resetProgress()),progressDialog,SLOT(reset()));
connect(generator,SIGNAL(setLabelText(QString)),progressDialog,SLOT(setLabelText(QString)));</pre>
<p>I tyle. Teraz gdy z mojego wątku wyślę sygnał ( <em>emit valueChanged(i) </em>) trafi on do odpowiedniego slotu w progressDialogu który ładnie zmieni wartość. Na początku wydawało mi się trochę dziwne ale idzie się przyzwyczaić.</p>
<p><strong>Zapis<br />
<span style="font-weight: normal;">Zapisuję wszystko oczywiście w OTBM</span> </strong>(Open Tibia Binary Map). Miałem trochę technicznych problemów, ale to przez błąd w liczeniu i brak komentarzy (wyjątkowo dokuczliwe jest gdy kiedyś niby niepotrzebne komentarze mogły by nagle rozjaśnić ówcześnie oczywisty kod)  który już poprawiłem.</p>
<p>No i na tym koniec, na kolejną wersję będzie trzeba poczekać.<br />
Download: <a href="http://otsoft.pl/?frontpage=download&amp;p=286">http://otsoft.pl/?frontpage=download&amp;p=286<br />
</a>No i obiecane pozdro dla <a href="http://e-budyn.pl/">Budynia </a>:)</p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=118</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>No i się stało&#8230;</title>
		<link>http://karkucik.pl/?p=111</link>
		<comments>http://karkucik.pl/?p=111#comments</comments>
		<pubDate>Thu, 26 Nov 2009 21:47:20 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=111</guid>
		<description><![CDATA[EK upadło dwa dni temu. Myślę że nie ma co roztrząsać, tak wyszło. Ekipa zabiera się za kontynuację (czyt. robienie wszystkiego od nowa), ale osobiście nie pokładam w to większych nadziei więc nie będę się angażować. Mam więcej spraw na głowie niż siedzenie ponad rok na jednym projektem w którym ludzie nie umieją się dogadać. [...]]]></description>
			<content:encoded><![CDATA[<p>EK upadło dwa dni temu. Myślę że nie ma co roztrząsać, tak wyszło. Ekipa zabiera się za kontynuację (czyt. robienie wszystkiego od nowa), ale osobiście nie pokładam w to większych nadziei więc nie będę się angażować. Mam więcej spraw na głowie niż siedzenie ponad rok na jednym projektem w którym ludzie nie umieją się dogadać. Oczywiście zostaje w teamie, jako klepacz kodu.</p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=111</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Eternal Kingdoms &#8211; co i jak</title>
		<link>http://karkucik.pl/?p=103</link>
		<comments>http://karkucik.pl/?p=103#comments</comments>
		<pubDate>Sun, 22 Nov 2009 23:00:58 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[Open Tibia]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=103</guid>
		<description><![CDATA[No i po wielu zmianach terminu, wielu problemach, EK wystartowało. Wielu pyta co było przyczyną tych wszystkich problemów więc śpieszę z odpowiedzią. Naszym największym utrapieniem były i są nadal NPC. Folder ze skryptami to około 400 plików, z czego niestety rzadko który był sprawdzony. Po pierwszym starcie, w piątek trzynastego który okazał się niestety pechowym [...]]]></description>
			<content:encoded><![CDATA[<p>No i po wielu zmianach terminu, wielu problemach, EK wystartowało. Wielu pyta co było przyczyną tych wszystkich problemów więc śpieszę z odpowiedzią. Naszym największym utrapieniem były i są nadal NPC. Folder ze skryptami to około 400 plików, z czego niestety rzadko który był sprawdzony. Po pierwszym starcie, w piątek trzynastego który okazał się niestety pechowym dniem, wyszły na jaw wszystkie niedoróbki. Nie działał praktycznie żaden npc, mapa była tak dziurawa że 10% graczy przesiedziało czas w którym serwer był online pod ziemią (a dokładnie &#8222;w pustce&#8221;),  posypał się Account Maker, były problemy z konfiguracją serwera i na koniec atak <a href="http://pl.wikipedia.org/wiki/DoS">DoS</a>. Z pomocą wkroczył na szczęście Dulin, który zajął się serwerem.<span id="more-103"></span> Faktem jest że w ciągu 10 sekund od wpisania przezemnie magicznego &#8222;/openserwer&#8221; zalogowało się 70(sic!) osób, w ciągu następnych kilku minut 214 (tyle wynosi obecnie rekord). Niestety, przez błędy wynikające ze złego działania ACM i kilku skryptów musieliśmy serwer wyłączyć i zapowiedzieć konieczny restart postaci. Następna próba odbyła się w sobotę, kolejnego dnia. Jednak wcale nie było lepiej, nie pamiętam dobrze co poszło nie tak, zdecydowaliśmy się więc przełożyć start na kolejną sobotę (22.11). Wczoraj, też nie poszło najlepiej. Serwer w prawdzie nie ruszył, ale siedzieliśmy nad nim cały wieczór (podczas którego był kolejny (D)DoS), noc, niedzielny poranek i popołudnie. Dokładnie o 17.30, po kilku godzinach wysłuchiwania niemiłych tekstów na ventrilo, odpaliłem serw który chodzi do teraz. Sytuacja wygląda dużo lepiej, większość NPC działa, część jest poprawiana, nie ma problemów z pacc i profesjami, ataki zostały troszkę okrojone. Ogółem gracze są zadowoleni. Myślę że w ciągu tygodnia naprawimy wszystkie NPC i questy. Do tego też czasu Valker powinien wyrobić się z nowym ACM, o którego poprosiłem po tym jak zobaczyłem jak funkcjonuje obecny. Całe szczęście że się zgodził, mimo że niezbyt się lubiliśmy :) Co było powodem takiej porażki? Brak profesjonalizmu, ot co :). Większość naszych mapperów zrobiła ogromny kawał świata, mimo że nigdy nie mieli na komputerze silnika. Część skrypterów nie dość że pisała źle, to na dodatek na wyczucie, także nie sprawdzając prac. Największy błąd popełniłem ja, ufając że wszystko jest przetestowane i sprawne, i robiąc wszystko na ostatnią chwilę. Wszystkim czytelnikom po fachu odradzam takie założenia :)</p>
<p>Reasumując: nie wyszło najlepiej i to co miało być wielkim sukcesem okazało się &#8222;failstartem&#8221;, głównie z mojej, jako koordynatora, winy. Myślę jednak że się podniesiemy, i mimo że na start mamy &#8222;jedynie&#8221; 120 graczy, to ta ilość będzie wzrastać, mam nadzieję że przyczyni się do tego nasz patron: <a href="http://tibia.net.pl">Tibia.Net.pl</a>.</p>
<p>PS Dziś Tadziu próbował dodać EK do różnych OT list. Co ciekawe, na jednej z nich dostaliśmy od razu bana za plagiat, a drugiej za spoofing. Nie wiem jak oni to filtrują, jednak to dosyć dziwne. Zobaczymy co odpiszą na mejla.</p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=103</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BlogBack</title>
		<link>http://karkucik.pl/?p=101</link>
		<comments>http://karkucik.pl/?p=101#comments</comments>
		<pubDate>Tue, 17 Nov 2009 23:05:42 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=101</guid>
		<description><![CDATA[Po krótkiej nieobecności blog znowu Online, z nowym stylem :)]]></description>
			<content:encoded><![CDATA[<p>Po krótkiej nieobecności blog znowu Online, z nowym stylem :)</p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=101</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beta testy Eternal Kingdoms</title>
		<link>http://karkucik.pl/?p=98</link>
		<comments>http://karkucik.pl/?p=98#comments</comments>
		<pubDate>Tue, 14 Jul 2009 12:23:24 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=98</guid>
		<description><![CDATA[Kilka dni temu, po tygodniowym opóźnieniu ruszyły testy EK. I co? I chociaż mało kto przyzna mi rację, muszę powiedzieć że się pośpieszyliśmy. Mapa jest zawalona niedoróbkami i błędami, chyba prawdą jest że mapperzy nigdy nie testują swoich map&#8230; Na razie wpuściliśmy testerów tylko na rook, bo main od strony technicznej (od mapy też) jeszcze [...]]]></description>
			<content:encoded><![CDATA[<p>Kilka dni temu, po tygodniowym opóźnieniu ruszyły testy EK. I co? I chociaż mało kto przyzna mi rację, muszę powiedzieć że się pośpieszyliśmy. Mapa jest zawalona niedoróbkami i błędami, chyba prawdą jest że mapperzy nigdy nie testują swoich map&#8230; Na razie wpuściliśmy testerów tylko na rook, bo main od strony technicznej (od mapy też) jeszcze nie jest gotowy. Ogólnie wrażenia są dobre, było trochę problemów z niedziałającymi schodami, profesjami, npc (z nimi dalej jest problem) i paroma innymi drobiazgami. Myślę że gdzieś jutro będziemy mogli otworzyć main.</p>
<p>Screeny z bt można zobaczyć tutaj: <a href="http://forum.eternalkingdoms.pl/index.php?topic=437.0">http://forum.eternalkingdoms.pl/index.php?topic=437.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=98</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Konkurencja, ta uczciwa i ta troszkę mniej&#8230;</title>
		<link>http://karkucik.pl/?p=86</link>
		<comments>http://karkucik.pl/?p=86#comments</comments>
		<pubDate>Wed, 27 May 2009 12:54:19 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[Inne]]></category>
		<category><![CDATA[Open Tibia]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=86</guid>
		<description><![CDATA[Czym jest konkurencja? No dobra, to każdy może sobie na wikipedii sprawdzić. Chciałem postawić raczej pytanie: Gdzie kończy się konkurencja, a gdzie zaczynają się chamstwo i nieczyste praktyki godzące nie tylko w przeciwnika ale i w użytkowników? Jak tak ostatnio obserwuję nasz świat OTS to widzę 3 rodzaje praktyk mających na celu zniszczenie wrogiego serwisu/serwera. [...]]]></description>
			<content:encoded><![CDATA[<p>Czym jest konkurencja? No dobra, to każdy może sobie na wikipedii sprawdzić. Chciałem postawić raczej pytanie: Gdzie kończy się konkurencja, a gdzie zaczynają się chamstwo i nieczyste praktyki godzące nie tylko w przeciwnika ale i w użytkowników? Jak tak ostatnio obserwuję nasz świat OTS to widzę 3 rodzaje praktyk mających na celu zniszczenie wrogiego serwisu/serwera.</p>
<p><span id="more-86"></span></p>
<p><strong><span style="color: #ffffff;">1.</span></strong><strong> <span style="color: #ffffff;">Po trupach do celu</span></strong><strong> </strong>czyli otland vs. otfans:</p>
<p>Dwa wielkie (największe), wrogie sobie OTSerwisy. Nie wiem o co dokładnie poszło,  jak można wyczytać na różnych forach, ówczesny moderator otfans został wyrzucony, po czym stworzył własną stronę (otland), własną otslistę. Serwisy wzajemnie zaczęły się DDoSować, a jak to wpływa na płynność działania stron to wszyscy wiemy. Otland to także dom projektu The Forgotten Server, chyba najpopularniejszego obecnie serwera OTS bo używa go praktycznie każdy tworzący serwer pod tibią 8.2+. Ostatnio (w ramach świętej wojny), programiści TFSa dodali bajer który&#8230; nie pozwalał na pobranie informacji o serwerze przez otservlist.org co uniemożliwi dodanie go tam i poprawne działanie! Niezorientowanym uświadamiam, że to najpopularniejsza i najbardziej rozpoznawalna lista, każdy właściciel OTSa wrzuca tam info na samym początku. </p>
<p><span style="text-decoration: underline;">Podsumowanie:</span></p>
<p>I teraz zagadka, kto na tym ucierpi najbardziej? Ano, na początku użytkownicy, następnie otland a na samym końcu otservlist. Załamani &#8222;admini&#8221; otsów po prostu zmienią silnik (lub usuną ów kod) byleby tylko dostać się na najważniejszą listę. Otland zostanie posądzony o używanie nieczystych zagrywek, tfs straci wielu użytkowników, otservlista też, jednak szybko się z tego wyciągnie (na forach jest pełno porad jak obejść to zabezpieczenie).</p>
<p><strong><span style="color: #ffffff;">2.</span><span style="color: #ffffff;"><span style="color: #ffffff;"> </span>Oni są źli, to my jesteśmy ofiarą</span></strong><strong> </strong>,czyli layout otsoftu:</p>
<p>Świeża sprawa, dosłownie z wczoraj, kiedy to dowiedzieliśmy się że na tibia.org.pl  będzie nowy layout przy czym otsoft, który ma ten sam już od prawie roku, po prostu ich splagiatował. Mógłbym podać link do tematu, jednak wątpię że komuś będzie się chciało to wszystko czytać tak więc streszczę: Wczoraj na torgu pojawił się news z linkiem do odnowionej strony i bardzo ciekawym stwierdzeniem:</p>
<blockquote><p><em>2. Aby uniknąć niepotrzebnych komentarzy: Wiem, ze ten layout wykorzystuje już inna strona o tematyce okołotibijskiej, ale ja nie mam zamiaru bawić się w takie gierki. Layout kupiłem uczciwie, jako pierwszy (12.08.2008r) i nie ruszają mnie takie niby-plagiaty.</em></p></blockquote>
<p>Jakie są fakty? Otsoft działa z tym szablonem od 15 września ur. za to torg ma dopiero w planach go wprowadzić. W temacie na forum administrator wysnuł teorię o wykradnięciu przez ostoft <strong>planowanego zakupu szablonu przez torg </strong>(jeszcze w wakacje) z ich <strong>zamkniętego</strong> forum moderatorów. Na pytania &#8222;Jak&#8221;, &#8222;Po co&#8221;, &#8222;Czy są jakieś dowody&#8221; odpowiadał wymijająco, po prostu: on tak uważa i tak jest. Tymczasem jego kadra zmieszała Otsoft z błotem (o mnie też zahaczyli), również bez żadnych argumentów. Wszystkie próby wyjaśnienia sytuacji z naszej strony zostały przez nich olane.</p>
<p><span style="text-decoration: underline;">Podsumowanie:</span></p>
<p>Okrutny, lecz bardzo skuteczny sposób na pozbycie się <span style="text-decoration: underline;">drobnej</span> konkurencji. Torg skopiował pomysł na szablon, od dawna używany na otsofcie jednocześnie odwracając kota ogonem. Co pomyśli użytkownik nowego Torga zaglądając na otsoft? Na pewno nie będzie to nic świadczącego dobrze o tej &#8222;niszowej stronie która pragnie skopiować torg&#8221;.</p>
<p><strong><span style="color: #ffffff;">3. Bogaci na szczycie</span> </strong>czyli &#8222;zwab mnie pieniądzem&#8221;:</p>
<p>To chyba najuczciwszy z przykładów konkurencji wymienionych wyżej. I kolejny raz na przykładzie: server huntera.pl, ots xinna, wlaściciela otserv.pl, otservlist.org i PolskiOTS. Czym wabi użytkowników? Poza ogromną reklamą (co niczym złym nie jest) &#8211; nagrodami. Dokładnie chodzi o zapis &#8222;<strong><span style="font-weight: normal;"><em>Do rozdania mamy 150 pacców, 25 pendrivów firmy Kingston oraz nagrody pieniężne</em></span></strong><em>!</em>&#8222;. Razi jedynie fakt że jest to serwer przereklamowany, nie ma nic ciekawego, rl mapa, stages, nagrody i parę mniej znaczących zmian. Zwykły otsik dla dzieci z pełnym portfelem, dokładnie jak PolskiOTS.</p>
<p><span style="text-decoration: underline;">Podsumowanie:</span></p>
<p>Dobry sposób na reklamę i popularność, szkoda tylko że serwery posługujące się nim, są z reguły proste, niedopracowane i nastawione jedynie na zarobek.</p>
<p> </p>
<p>Oczywiście sposobów na przewyższenie konkurencji jest sporo, te 3 są w tym świecie najpopularniejsze. Szczerze mówiąc brakuje mi takiej czystej konkurencji, gdzie portale/serwery zamiast wrzucać sobie nawzazjem, niszczyć się, przekupiać graczy, po prostu zrobiłyby coś, co użytkowników przyciągnie. No cóż, oczywiście nie ma co na to liczyć :)</p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=86</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Eternal Kingdoms</title>
		<link>http://karkucik.pl/?p=84</link>
		<comments>http://karkucik.pl/?p=84#comments</comments>
		<pubDate>Thu, 07 May 2009 21:46:02 +0000</pubDate>
		<dc:creator>Kiro</dc:creator>
				<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://karkucik.pl/?p=84</guid>
		<description><![CDATA[Jak pisałem jakiś czas temu (taa, dosyć dawno ;/), Eternal World rozpadł się, połączyliśmy się z 4k, a ostatnio także z Transerią co znacznie przyśpieszyło prace. Szczerze mówiąc, jest szansa na skończenie projektu przed wakacjami. A zresztą, co ja będę pisał, macie zapowiedź: http://ifotos.pl/uploaded/118648.jpg]]></description>
			<content:encoded><![CDATA[<p>Jak pisałem jakiś czas temu (taa, dosyć dawno ;/), Eternal World rozpadł się, połączyliśmy się z 4k, a ostatnio także z Transerią co znacznie przyśpieszyło prace. Szczerze mówiąc, jest szansa na skończenie projektu przed wakacjami. A zresztą, co ja będę pisał, macie zapowiedź: <a href="http://ifotos.pl/uploaded/118648.jpg">http://ifotos.pl/uploaded/118648.jpg</a></p>
]]></content:encoded>
			<wfw:commentRss>http://karkucik.pl/?feed=rss2&amp;p=84</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
